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}