001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013package org.jikesrvm.adaptive.util; 014 015import java.io.FileOutputStream; 016import java.io.IOException; 017import java.io.PrintStream; 018import org.jikesrvm.VM; 019import org.jikesrvm.adaptive.controller.Controller; 020import org.jikesrvm.compilers.common.CompiledMethod; 021import org.jikesrvm.compilers.opt.driver.CompilationPlan; 022 023/** 024 * This class provides advice file used by compile replay experiments 025 * Right now this class is basically duplicate part of the AOSLogging 026 * class. 027 */ 028public class AOSGenerator { 029 030 /* 031 * The output file stream, where all log messages will go 032 */ 033 private static PrintStream log; 034 035 /* 036 * Record that the AOS logging has been booted. 037 * Needed to allow fast exit from reporting to ensure 038 * that when no class is specified to be run but "-help" is specified, 039 * don't want null pointer exception to occur! 040 */ 041 private static boolean booted = false; 042 043 // variable used to avoid recursive calls 044 private static boolean recording = false; 045 046 /** 047 * Return whether AOS logging has booted. 048 * @return whether AOS logging has booted 049 */ 050 public static boolean booted() { 051 return booted; 052 } 053 054 /** 055 * Called from ControllerThread.run to initialize the logging subsystem 056 */ 057 public static void boot() { 058 VM.sysWrite("AOS generation booted\n"); 059 try { 060 log = new PrintStream(new FileOutputStream(Controller.options.COMPILATION_ADVICE_FILE_OUTPUT)); 061 } catch (IOException e) { 062 VM.sysWrite("IOException caught in AOSGenerator.java while trying to create and start log file.\n"); 063 VM.sysWrite("Please check for file permission problems\n"); 064 } 065 booted = true; 066 recording = false; 067 } 068 069 //////////////////////////////////////////////////////////////// 070 // Logging level 2 071 //////////////////////////////////////////////////////////////// 072 073 /** 074 * This method logs the successful completion of an adaptively 075 * selected recompilation 076 * @param plan the Compilation plan being executed. 077 */ 078 public static void reCompilationWithOpt(CompilationPlan plan) { 079 if (!booted) return; 080 synchronized (log) { 081 log.println(plan.method.getDeclaringClass().getDescriptor() + 082 " " + 083 plan.method.getName() + 084 " " + 085 plan.method.getDescriptor() + 086 " 3 " + 087 /*it's always compiler*/ 088 plan.options.getOptLevel()); 089 } 090 } 091 092 public static void baseCompilationCompleted(CompiledMethod cm) { 093 if (recording || (!booted)) return; 094 synchronized (log) { 095 recording = true; 096 log.println(cm.getMethod().getDeclaringClass().getDescriptor() + 097 " " + 098 cm.getMethod().getName() + 099 " " + 100 cm.getMethod().getDescriptor() + 101 " " + 102 cm.getCompilerType() + 103 " " + 104 /*it's always baseline compiler*/ 105 "-1"); 106 recording = false; 107 } 108 } 109}