org.jikesrvm.compilers.baseline
Class BaselineCompiler

java.lang.Object
  extended by org.jikesrvm.compilers.baseline.TemplateCompilerFramework
      extended by org.jikesrvm.compilers.baseline.BaselineCompiler
All Implemented Interfaces:
ArchitectureSpecific.StackframeLayoutConstants, BytecodeConstants, ClassLoaderConstants, StackframeLayoutConstants, SizeConstants
Direct Known Subclasses:
BaselineCompilerImpl

public abstract class BaselineCompiler
extends TemplateCompilerFramework

Baseline compiler - platform independent code. Platform dependent versions extend this class and define the host of abstract methods defined by TemplateCompilerFramework to complete the implementation of a baseline compiler for a particular target,


Field Summary
private static long codeGenNanos
           
protected  int edgeCounterIdx
          Next edge counter entry to allocate
private static long encodingNanos
           
private static long gcMapNanos
           
protected  byte[] localTypes
          The types that locals can take.
static BaselineOptions options
          Options used during base compiler execution
private static long osrSetupNanos
           
 
Fields inherited from class org.jikesrvm.compilers.baseline.TemplateCompilerFramework
asm, bcodes, biStart, bytecodeMap, compiledMethod, doesCheckStore, fullyBootedVM, isInterruptible, isUninterruptible, isUnpreemptible, klass, lockOffset, method, shouldPrint, stackHeights
 
Fields inherited from interface org.jikesrvm.classloader.BytecodeConstants
JBC_aaload, JBC_aastore, JBC_aconst_null, JBC_aload, JBC_aload_0, JBC_aload_1, JBC_aload_2, JBC_aload_3, JBC_anewarray, JBC_areturn, JBC_arraylength, JBC_astore, JBC_astore_0, JBC_astore_1, JBC_astore_2, JBC_astore_3, JBC_athrow, JBC_baload, JBC_bastore, JBC_bipush, JBC_caload, JBC_castore, JBC_checkcast, JBC_d2f, JBC_d2i, JBC_d2l, JBC_dadd, JBC_daload, JBC_dastore, JBC_dcmpg, JBC_dcmpl, JBC_dconst_0, JBC_dconst_1, JBC_ddiv, JBC_dload, JBC_dload_0, JBC_dload_1, JBC_dload_2, JBC_dload_3, JBC_dmul, JBC_dneg, JBC_drem, JBC_dreturn, JBC_dstore, JBC_dstore_0, JBC_dstore_1, JBC_dstore_2, JBC_dstore_3, JBC_dsub, JBC_dup, JBC_dup_x1, JBC_dup_x2, JBC_dup2, JBC_dup2_x1, JBC_dup2_x2, JBC_f2d, JBC_f2i, JBC_f2l, JBC_fadd, JBC_faload, JBC_fastore, JBC_fcmpg, JBC_fcmpl, JBC_fconst_0, JBC_fconst_1, JBC_fconst_2, JBC_fdiv, JBC_fload, JBC_fload_0, JBC_fload_1, JBC_fload_2, JBC_fload_3, JBC_fmul, JBC_fneg, JBC_frem, JBC_freturn, JBC_fstore, JBC_fstore_0, JBC_fstore_1, JBC_fstore_2, JBC_fstore_3, JBC_fsub, JBC_getfield, JBC_getstatic, JBC_goto, JBC_goto_w, JBC_i2d, JBC_i2f, JBC_i2l, JBC_iadd, JBC_iaload, JBC_iand, JBC_iastore, JBC_iconst_0, JBC_iconst_1, JBC_iconst_2, JBC_iconst_3, JBC_iconst_4, JBC_iconst_5, JBC_iconst_m1, JBC_idiv, JBC_if_acmpeq, JBC_if_acmpne, JBC_if_icmpeq, JBC_if_icmpge, JBC_if_icmpgt, JBC_if_icmple, JBC_if_icmplt, JBC_if_icmpne, JBC_ifeq, JBC_ifge, JBC_ifgt, JBC_ifle, JBC_iflt, JBC_ifne, JBC_ifnonnull, JBC_ifnull, JBC_iinc, JBC_iload, JBC_iload_0, JBC_iload_1, JBC_iload_2, JBC_iload_3, JBC_impdep1, JBC_impdep2, JBC_imul, JBC_ineg, JBC_instanceof, JBC_int2byte, JBC_int2char, JBC_int2short, JBC_invokeinterface, JBC_invokespecial, JBC_invokestatic, JBC_invokevirtual, JBC_ior, JBC_irem, JBC_ireturn, JBC_ishl, JBC_ishr, JBC_istore, JBC_istore_0, JBC_istore_1, JBC_istore_2, JBC_istore_3, JBC_isub, JBC_iushr, JBC_ixor, JBC_jsr, JBC_jsr_w, JBC_l2d, JBC_l2f, JBC_l2i, JBC_ladd, JBC_laload, JBC_land, JBC_lastore, JBC_lcmp, JBC_lconst_0, JBC_lconst_1, JBC_ldc, JBC_ldc_w, JBC_ldc2_w, JBC_ldiv, JBC_length, JBC_lload, JBC_lload_0, JBC_lload_1, JBC_lload_2, JBC_lload_3, JBC_lmul, JBC_lneg, JBC_lookupswitch, JBC_lor, JBC_lrem, JBC_lreturn, JBC_lshl, JBC_lshr, JBC_lstore, JBC_lstore_0, JBC_lstore_1, JBC_lstore_2, JBC_lstore_3, JBC_lsub, JBC_lushr, JBC_lxor, JBC_monitorenter, JBC_monitorexit, JBC_multianewarray, JBC_name, JBC_new, JBC_newarray, JBC_nop, JBC_pop, JBC_pop2, JBC_putfield, JBC_putstatic, JBC_ret, JBC_return, JBC_saload, JBC_sastore, JBC_sipush, JBC_swap, JBC_tableswitch, JBC_wide, JBC_xxxunusedxxx
 
Fields inherited from interface org.jikesrvm.classloader.ClassLoaderConstants
ACC_ABSTRACT, ACC_ANNOTATION, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, APPLICABLE_TO_CLASSES, APPLICABLE_TO_FIELDS, APPLICABLE_TO_METHODS, ArrayTypeCode, BooleanTypeCode, BRIDGE, ByteTypeCode, CharTypeCode, CLASS_INITIALIZED, CLASS_INITIALIZER_FAILED, CLASS_INITIALIZING, CLASS_INSTANTIATED, CLASS_LOADED, CLASS_RESOLVED, CLASS_VACANT, ClassTypeCode, CP_CLASS, CP_DOUBLE, CP_FLOAT, CP_INT, CP_LONG, CP_MEMBER, CP_STRING, CP_UTF, DoubleTypeCode, FloatTypeCode, IntTypeCode, LongTypeCode, ShortTypeCode, TAG_DOUBLE, TAG_FIELDREF, TAG_FLOAT, TAG_INT, TAG_INTERFACE_METHODREF, TAG_LONG, TAG_MEMBERNAME_AND_DESCRIPTOR, TAG_METHODREF, TAG_STRING, TAG_TYPEREF, TAG_UNUSED, TAG_UTF, VARARGS, VoidTypeCode
 
Fields inherited from interface org.jikesrvm.SizeConstants
BITS_IN_ADDRESS, BITS_IN_BOOLEAN, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_DOUBLE, BITS_IN_EXTENT, BITS_IN_FLOAT, BITS_IN_INT, BITS_IN_LONG, BITS_IN_OFFSET, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BOOLEAN, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_DOUBLE, BYTES_IN_EXTENT, BYTES_IN_FLOAT, BYTES_IN_INT, BYTES_IN_LONG, BYTES_IN_OFFSET, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BOOLEAN, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_DOUBLE, LOG_BITS_IN_EXTENT, LOG_BITS_IN_FLOAT, LOG_BITS_IN_INT, LOG_BITS_IN_LONG, LOG_BITS_IN_OFFSET, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_BOOLEAN, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_DOUBLE, LOG_BYTES_IN_EXTENT, LOG_BYTES_IN_FLOAT, LOG_BYTES_IN_INT, LOG_BYTES_IN_LONG, LOG_BYTES_IN_OFFSET, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD
 
Fields inherited from interface org.jikesrvm.ia32.StackframeLayoutConstants
BYTES_IN_STACKSLOT, FPU_STATE_SIZE, INVISIBLE_METHOD_ID, LOG_BYTES_IN_STACKSLOT, STACK_SIZE_BOOT, STACK_SIZE_COLLECTOR, STACK_SIZE_DLOPEN, STACK_SIZE_GCDISABLED, STACK_SIZE_GROW, STACK_SIZE_GUARD, STACK_SIZE_JNINATIVE_GROW, STACK_SIZE_MAX, STACK_SIZE_NORMAL, STACK_SIZE_SYSCALL, STACKFRAME_ALIGNMENT, STACKFRAME_BODY_OFFSET, STACKFRAME_FRAME_POINTER_OFFSET, STACKFRAME_HEADER_SIZE, STACKFRAME_METHOD_ID_OFFSET, STACKFRAME_RETURN_ADDRESS_OFFSET, STACKFRAME_SENTINEL_FP, XMM_STATE_SIZE
 
Constructor Summary
protected BaselineCompiler(BaselineCompiledMethod cm)
          Construct a BaselineCompilerImpl
 
Method Summary
protected  void compile()
          Top level driver for baseline compilation of a method.
static CompiledMethod compile(NormalMethod method)
          Compile the given method with the baseline compiler.
static void fullyBootedVM()
          Now that VM is fully booted, enable options such as PRINT_MACHINE_CODE that require a fully booted VM.
static void generateBaselineCompilerSubsystemReport(boolean explain)
          Generate a report of time spent in various phases of the baseline compiler.
protected  String getCompilerName()
           
protected  int getEdgeCounterIndex()
           
protected  Offset getEdgeCounterOffset()
           
protected abstract  void initializeCompiler()
           
static void initOptions()
          Clear out crud from bootimage writing
static void processCommandLineArg(String prefix, String arg)
          Process a command line argument
 
Methods inherited from class org.jikesrvm.compilers.baseline.TemplateCompilerFramework
checkTarget, emit_aaload, emit_aastore, emit_aconst_null, emit_aload, emit_areturn, emit_arraylength, emit_astore, emit_athrow, emit_baload, emit_bastore, emit_caload, emit_castore, emit_checkcast_final, emit_checkcast_resolvedClass, emit_checkcast_resolvedInterface, emit_checkcast, emit_d2f, emit_d2i, emit_d2l, emit_dadd, emit_daload, emit_dastore, emit_dcmpg, emit_dcmpl, emit_dconst_0, emit_dconst_1, emit_ddiv, emit_deferred_prologue, emit_dload, emit_dmul, emit_dneg, emit_drem, emit_dreturn, emit_dstore, emit_dsub, emit_dup_x1, emit_dup_x2, emit_dup, emit_dup2_x1, emit_dup2_x2, emit_dup2, emit_f2d, emit_f2i, emit_f2l, emit_fadd, emit_faload, emit_fastore, emit_fcmpg, emit_fcmpl, emit_fconst_0, emit_fconst_1, emit_fconst_2, emit_fdiv, emit_fload, emit_fmul, emit_fneg, emit_frem, emit_freturn, emit_fstore, emit_fsub, emit_goto, emit_i2b, emit_i2c, emit_i2d, emit_i2f, emit_i2l, emit_i2s, emit_iadd, emit_iaload, emit_iand, emit_iastore, emit_iconst, emit_idiv, emit_if_acmpeq, emit_if_acmpne, emit_if_icmpeq, emit_if_icmpge, emit_if_icmpgt, emit_if_icmple, emit_if_icmplt, emit_if_icmpne, emit_ifeq, emit_ifge, emit_ifgt, emit_ifle, emit_iflt, emit_ifne, emit_ifnonnull, emit_ifnull, emit_iinc, emit_iload, emit_imul, emit_ineg, emit_instanceof_final, emit_instanceof_resolvedClass, emit_instanceof_resolvedInterface, emit_instanceof, emit_invoke_compiledmethod, emit_invokeinterface, emit_ior, emit_irem, emit_ireturn, emit_ishl, emit_ishr, emit_istore, emit_isub, emit_iushr, emit_ixor, emit_jsr, emit_l2d, emit_l2f, emit_l2i, emit_ladd, emit_laload, emit_land, emit_lastore, emit_lcmp, emit_lconst, emit_ldc, emit_ldc2, emit_ldiv, emit_lload, emit_lmul, emit_lneg, emit_loadretaddrconst, emit_lookupswitch, emit_lor, emit_lrem, emit_lreturn, emit_lshl, emit_lshr, emit_lstore, emit_lsub, emit_lushr, emit_lxor, emit_Magic, emit_monitorenter, emit_monitorexit, emit_multianewarray, emit_pending_goto, emit_pop, emit_pop2, emit_prologue, emit_resolved_getfield, emit_resolved_getstatic, emit_resolved_invokespecial, emit_resolved_invokestatic, emit_resolved_invokevirtual, emit_resolved_new, emit_resolved_newarray, emit_resolved_putfield, emit_resolved_putstatic, emit_ret, emit_return, emit_saload, emit_sastore, emit_swap, emit_tableswitch, emit_threadSwitchTest, emit_unresolved_getfield, emit_unresolved_getstatic, emit_unresolved_invokespecial, emit_unresolved_invokestatic, emit_unresolved_invokevirtual, emit_unresolved_new, emit_unresolved_newarray, emit_unresolved_putfield, emit_unresolved_putstatic, ending_bytecode, forbiddenBytecode, forbiddenBytecode, genCode, getBytecodeMap, printEndHeader, printMethodMessage, printStartHeader, starting_bytecode
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

gcMapNanos

private static long gcMapNanos

osrSetupNanos

private static long osrSetupNanos

codeGenNanos

private static long codeGenNanos

encodingNanos

private static long encodingNanos

options

public static BaselineOptions options
Options used during base compiler execution


edgeCounterIdx

protected int edgeCounterIdx
Next edge counter entry to allocate


localTypes

protected final byte[] localTypes
The types that locals can take. There are two types of locals. First the parameters of the method, they only have one type Second, the other locals, numbers get reused when stack shrinks and grows again. Therefore, these can have more than one type assigned. The compiler can use this information to assign registers to locals See the BaselineCompilerImpl constructor.

Constructor Detail

BaselineCompiler

protected BaselineCompiler(BaselineCompiledMethod cm)
Construct a BaselineCompilerImpl

Method Detail

getEdgeCounterOffset

protected final Offset getEdgeCounterOffset()

getEdgeCounterIndex

protected final int getEdgeCounterIndex()

initOptions

public static void initOptions()
Clear out crud from bootimage writing


fullyBootedVM

public static void fullyBootedVM()
Now that VM is fully booted, enable options such as PRINT_MACHINE_CODE that require a fully booted VM.


processCommandLineArg

public static void processCommandLineArg(String prefix,
                                         String arg)
Process a command line argument

Parameters:
prefix -
arg - Command line argument with prefix stripped off

generateBaselineCompilerSubsystemReport

public static void generateBaselineCompilerSubsystemReport(boolean explain)
Generate a report of time spent in various phases of the baseline compiler.

NB: This method may be called in a context where class loading and/or GC cannot be allowed. Therefore we must use primitive sysWrites for output and avoid string appends and other allocations.

FIXME should this method be uninterruptible?

Parameters:
explain - Should an explanation of the metrics be generated?

compile

public static CompiledMethod compile(NormalMethod method)
Compile the given method with the baseline compiler.

Parameters:
method - the NormalMethod to compile.
Returns:
the generated CompiledMethod for said NormalMethod.

initializeCompiler

protected abstract void initializeCompiler()

compile

protected void compile()
Top level driver for baseline compilation of a method.


getCompilerName

protected String getCompilerName()
Specified by:
getCompilerName in class TemplateCompilerFramework