/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.adaptive.util;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.jikesrvm.VM;
import org.jikesrvm.adaptive.controller.Controller;
import org.jikesrvm.compilers.common.CompiledMethod;
import org.jikesrvm.compilers.opt.driver.CompilationPlan;
/**
* This class provides advice file used by compile replay experiments
* Right now this class is basically duplicate part of the AOSLogging
* class.
*/
public class AOSGenerator {
/*
* The output file stream, where all log messages will go
*/
private static PrintStream log;
/*
* Record that the AOS logging has been booted.
* Needed to allow fast exit from reporting to ensure
* that when no class is specified to be run but "-help" is specified,
* don't want null pointer exception to occur!
*/
private static boolean booted = false;
// variable used to avoid recursive calls
private static boolean recording = false;
/**
* Return whether AOS logging has booted.
* @return whether AOS logging has booted
*/
public static boolean booted() {
return booted;
}
/**
* Called from ControllerThread.run to initialize the logging subsystem
*/
public static void boot() {
VM.sysWriteln("AOS generation booted");
try {
log = new PrintStream(new FileOutputStream(Controller.options.COMPILATION_ADVICE_FILE_OUTPUT));
} catch (IOException e) {
VM.sysWriteln("IOException caught in AOSGenerator.java while trying to create and start log file.");
VM.sysWriteln("Please check for file permission problems");
}
booted = true;
recording = false;
}
////////////////////////////////////////////////////////////////
// Logging level 2
////////////////////////////////////////////////////////////////
/**
* This method logs the successful completion of an adaptively
* selected recompilation
* @param plan the Compilation plan being executed.
*/
public static void reCompilationWithOpt(CompilationPlan plan) {
if (!booted) return;
synchronized (log) {
log.println(plan.method.getDeclaringClass().getDescriptor() +
" " +
plan.method.getName() +
" " +
plan.method.getDescriptor() +
" 3 " +
/*it's always compiler*/
plan.options.getOptLevel());
}
}
public static void baseCompilationCompleted(CompiledMethod cm) {
if (recording || (!booted)) return;
synchronized (log) {
recording = true;
log.println(cm.getMethod().getDeclaringClass().getDescriptor() +
" " +
cm.getMethod().getName() +
" " +
cm.getMethod().getDescriptor() +
" " +
cm.getCompilerType() +
" " +
/*it's always baseline compiler*/
"-1");
recording = false;
}
}
}