|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.jikesrvm.jni.ia32.JNICompiler
public abstract class JNICompiler
This class compiles the prolog and epilog for all code that makes the transition between Java and Native C for the 2 cases:
JNIFunctions
Nested Class Summary |
---|
Nested classes/interfaces inherited from interface org.jikesrvm.ia32.RegisterConstants |
---|
RegisterConstants.FloatingPointMachineRegister, RegisterConstants.FPR, RegisterConstants.GPR, RegisterConstants.MachineRegister, RegisterConstants.MM, RegisterConstants.XMM |
Field Summary | |
---|---|
private static Offset |
BP_ON_ENTRY_OFFSET
Location of a saved version of the field JNIEnvironment.basePointerOnEntryToNative |
(package private) static Offset |
EBP_SAVE_OFFSET
Location of non-volatile EBP register when saved to stack |
(package private) static Offset |
EBX_SAVE_OFFSET
Location of non-volatile EBX register when saved to stack |
(package private) static Offset |
EDI_SAVE_OFFSET
Location of non-volatile EDI register when saved to stack |
private static Offset |
JNI_ENV_OFFSET
Location of an extra copy of the RVMThread.jniEnv when saved to stack |
private static int |
jniExternalFunctionsFieldOffset
Offset of external functions field in JNIEnvironment |
static int |
SAVED_GPRS_FOR_JNI
The following is used in BaselineCompilerImpl to compute offset to first local. |
private static Offset |
SAVED_JAVA_FP_OFFSET
Stack frame location for saved JNIEnvironment.JNITopJavaFP that will be clobbered by a transition from Java to C. |
private JNIExceptionDeliverer |
unused
Dummy field to force compilation of the exception deliverer |
Fields inherited from interface org.jikesrvm.ia32.BaselineConstants |
---|
BRIDGE_FRAME_EXTRA_SIZE, FPU_SAVE_OFFSET, LG_WORDSIZE, S0, S1, SAVED_GPRS, SAVED_GPRS_FOR_SAVE_LS_REGISTERS, SP, STACKFRAME_FIRST_PARAMETER_OFFSET, STACKFRAME_REG_SAVE_OFFSET, T0, T0_int, T0_SAVE_OFFSET, T1, T1_int, T1_SAVE_OFFSET, TR, WORDSIZE, XMM_SAVE_OFFSET |
Fields inherited from interface org.jikesrvm.Constants |
---|
NOT_REACHED, REFLECTION_FPRS_BITS, REFLECTION_FPRS_MASK, REFLECTION_GPRS_BITS, REFLECTION_GPRS_MASK |
Fields inherited from interface org.jikesrvm.objectmodel.ThinLockConstants |
---|
TL_DEDICATED_U16_OFFSET, TL_DEDICATED_U16_SHIFT, TL_LOCK_COUNT_MASK, TL_LOCK_COUNT_SHIFT, TL_LOCK_COUNT_UNIT, TL_LOCK_ID_MASK, TL_LOCK_ID_SHIFT, TL_NUM_BITS_RC, TL_NUM_BITS_STAT, TL_NUM_BITS_TID, TL_STAT_BIASABLE, TL_STAT_FAT, TL_STAT_MASK, TL_STAT_SHIFT, TL_STAT_THIN, TL_THREAD_ID_MASK, TL_THREAD_ID_SHIFT, TL_UNLOCK_MASK |
Fields inherited from interface org.jikesrvm.objectmodel.TIBLayoutConstants |
---|
IMT_METHOD_SLOTS, NEEDS_DYNAMIC_LINK, TIB_ARRAY_ELEMENT_TIB_INDEX, TIB_DOES_IMPLEMENT_INDEX, TIB_FIRST_SPECIALIZED_METHOD_INDEX, TIB_FIRST_VIRTUAL_METHOD_INDEX, TIB_INTERFACE_DISPATCH_TABLE_INDEX, TIB_SUPERCLASS_IDS_INDEX, TIB_TYPE_INDEX |
Fields inherited from interface org.jikesrvm.HeapLayoutConstants |
---|
BAD_MAP_COMPRESSION, BOOT_IMAGE_CODE_END, BOOT_IMAGE_CODE_SIZE, BOOT_IMAGE_CODE_START, BOOT_IMAGE_DATA_END, BOOT_IMAGE_DATA_SIZE, BOOT_IMAGE_DATA_START, BOOT_IMAGE_END, BOOT_IMAGE_RMAP_END, BOOT_IMAGE_RMAP_START, MAX_BOOT_IMAGE_RMAP_SIZE, MAXIMUM_MAPPABLE |
Fields inherited from interface org.jikesrvm.ia32.ArchConstants |
---|
SSE2_BASE, SSE2_FULL |
Fields inherited from interface org.jikesrvm.ia32.RegisterConstants |
---|
ALL_FPRS, ALL_GPRS, EAX, EBP, EBX, ECX, EDI, EDX, ESI, ESP, FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7, INSTRUCTION_WIDTH, LG_INSTRUCTION_WIDTH, MM0, MM1, MM10, MM11, MM12, MM13, MM14, MM15, MM2, MM3, MM4, MM5, MM6, MM7, MM8, MM9, NATIVE_NONVOLATILE_FPRS, NATIVE_NONVOLATILE_GPRS, NATIVE_PARAMETER_FPRS, NATIVE_PARAMETER_GPRS, NATIVE_VOLATILE_FPRS, NATIVE_VOLATILE_GPRS, NONVOLATILE_FPRS, NONVOLATILE_GPRS, NUM_FPRS, NUM_GPRS, NUM_NONVOLATILE_FPRS, NUM_NONVOLATILE_GPRS, NUM_PARAMETER_FPRS, NUM_PARAMETER_GPRS, NUM_RETURN_FPRS, NUM_RETURN_GPRS, NUM_VOLATILE_FPRS, NUM_VOLATILE_GPRS, PARAMETER_FPRS, PARAMETER_GPRS, R0, R1, R10, R11, R12, R13, R14, R15, R2, R3, R4, R5, R6, R7, R8, R9, RETURN_FPRS, RETURN_GPRS, STACK_POINTER, THREAD_REGISTER, VOLATILE_FPRS, VOLATILE_GPRS, XMM0, XMM1, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9 |
Fields inherited from interface org.jikesrvm.ia32.TrapConstants |
---|
RVM_TRAP_BASE |
Constructor Summary | |
---|---|
JNICompiler()
|
Method Summary | |
---|---|
static CompiledMethod |
compile(NativeMethod method)
Compile a method to handle the Java to C transition and back Transitioning from Java to C then back: Set up stack frame and save non-volatile registers Set up jniEnv - set up a register to hold JNIEnv and store the Processor in the JNIEnv for easy access Move all native method arguments on to stack (NB at this point all non-volatile state is saved) Record the frame pointer of the last Java frame (this) in the jniEnv Call out to convert reference arguments to IDs Set processor as being "in native" Set up stack frame and registers for transition to C Call out to C Save result to stack Transition back from "in native" to "in Java", take care that the Processor isn't "blocked in native", ie other processors have decided to start a GC and we're not permitted to execute Java code whilst this occurs Convert a reference result (currently a JNI ref) into a true reference Release JNI refs Restore stack and place result in register |
static void |
generateEpilogForJNIMethod(Assembler asm,
RVMMethod method)
Handle the C to Java transition: JNI methods in JNIFunctions.java. |
static void |
generateGlueCodeForJNIMethod(Assembler asm,
NormalMethod method,
int methodID)
Handle the C to Java transition: JNI methods in JNIFunctions.java. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
private JNIExceptionDeliverer unused
private static final int jniExternalFunctionsFieldOffset
static final Offset EDI_SAVE_OFFSET
static final Offset EBX_SAVE_OFFSET
static final Offset EBP_SAVE_OFFSET
private static final Offset JNI_ENV_OFFSET
private static final Offset BP_ON_ENTRY_OFFSET
private static final Offset SAVED_JAVA_FP_OFFSET
public static final int SAVED_GPRS_FOR_JNI
Constructor Detail |
---|
public JNICompiler()
Method Detail |
---|
public static CompiledMethod compile(NativeMethod method)
public static void generateGlueCodeForJNIMethod(Assembler asm, NormalMethod method, int methodID)
NOTE: -We need THREAD_REGISTER to access Java environment; we can get it from the JNIEnv* (which is an interior pointer to the JNIEnvironment) -Unlike the powerPC scheme which has a special prolog preceding the normal Java prolog, the Intel scheme replaces the Java prolog completely with the special prolog Stack on entry Stack at end of prolog after call high memory high memory | | | | EBP -> |saved FP | |saved FP | | ... | | ... | | | | | |arg n-1 | |arg n-1 | native | ... | | ... | caller |arg 0 | JNIEnv* |arg 0 | JNIEnvironment ESP -> |return addr | |return addr | | | EBP -> |saved FP | outer most native frame pointer | | |methodID | normal MethodID for JNI function | | |saved JavaFP| offset to preceeding java frame | | |saved nonvol| to be used for nonvolatile storage | | | ... | including ebp on entry | | |arg 0 | copied in reverse order (JNIEnvironment) | | | ... | | | ESP -> |arg n-1 | | | | | normally compiled Java code continue | | | | | | | | | | | | low memory low memory
public static void generateEpilogForJNIMethod(Assembler asm, RVMMethod method)
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |