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 */
013 package org.jikesrvm.compilers.common;
014
015 import org.jikesrvm.ArchitectureSpecific.JNICompiler;
016 import org.jikesrvm.VM;
017 import org.jikesrvm.Callbacks;
018 import org.jikesrvm.classloader.NativeMethod;
019 import org.jikesrvm.classloader.NormalMethod;
020 import org.jikesrvm.classloader.TypeReference;
021 import org.jikesrvm.compilers.baseline.BaselineBootImageCompiler;
022
023 /**
024 * Abstract superclass to interface bootimage compiler to the rest of the VM.
025 * Individual compilers provide concrete implementations, one of which is
026 * instantiated by BootImageCompiler.init.
027 */
028 public abstract class BootImageCompiler {
029
030 protected static BootImageCompiler baseCompiler = new BaselineBootImageCompiler();
031 protected static BootImageCompiler optCompiler = VM.BuildForAdaptiveSystem ? new org.jikesrvm.compilers.opt.driver.OptimizingBootImageCompiler() : null;
032
033 protected static BootImageCompiler compiler = VM.BuildWithBaseBootImageCompiler ? baseCompiler : optCompiler;
034
035
036 /**
037 * Initialize boot image compiler.
038 * @param args command line arguments to the bootimage compiler
039 */
040 protected abstract void initCompiler(String[] args);
041
042 /**
043 * Compile a method with bytecodes.
044 * @param method the method to compile
045 * @return the compiled method
046 */
047 protected abstract CompiledMethod compileMethod(NormalMethod method, TypeReference[] params);
048
049 /**
050 * Initialize boot image compiler.
051 * @param args command line arguments to the bootimage compiler
052 */
053 public static void init(String[] args) {
054 try {
055 compiler.initCompiler(args);
056 if (VM.BuildForAdaptiveSystem && VM.BuildWithBaseBootImageCompiler) {
057 // We have to use the opt compiler to compile the org.jikesrvm.compiler.opt.OptSaveVolatile class,
058 // so if we're building a baseline compiled configuration that includes AOS, we also need to init
059 // the optimizing bootimage compiler so it can be invoked to compile this class.
060 optCompiler.initCompiler(args);
061 }
062 } catch (Throwable e) {
063 while (e != null) {
064 e.printStackTrace();
065 e = e.getCause();
066 }
067 }
068 }
069
070 public static CompiledMethod compile(NormalMethod method, TypeReference[] params) {
071 if (VM.BuildForAdaptiveSystem && VM.BuildWithBaseBootImageCompiler && method.getDeclaringClass().hasSaveVolatileAnnotation()) {
072 // Force opt compilation of SaveVolatile methods.
073 return optCompiler.compileMethod(method, params);
074 } else {
075 return compiler.compileMethod(method, params);
076 }
077 }
078
079 public static CompiledMethod compile(NormalMethod method) {
080 return compile(method, null);
081 }
082
083 /**
084 * Compile a native method.
085 * @param method the method to compile
086 * @return the compiled method
087 */
088 public static CompiledMethod compile(NativeMethod method) {
089 Callbacks.notifyMethodCompile(method, CompiledMethod.JNI);
090 return JNICompiler.compile(method);
091 }
092 }