diff options
| author | Ben Cheng <bccheng@android.com> | 2011-03-04 16:48:33 -0800 |
|---|---|---|
| committer | Ben Cheng <bccheng@android.com> | 2011-03-10 10:52:21 -0800 |
| commit | 385828e36ea70effe9aa18a954d008b1f7dc1d63 (patch) | |
| tree | b5a05c6e76610d5b16d2fa613758756784697267 /vm/compiler/codegen/arm/CodegenDriver.c | |
| parent | c632e86945a77dc9e1fc99005fb99741c9f6cfa4 (diff) | |
Handle relocatable class objects in JIT'ed code.
1) Split the original literal pool into class object literals and
constants. Elements in the class object pool have to match the specicial
values perfectly (ie no +delta space optimizations) since they might be
relocated.
2) Implement dvmJitScanAllClassPointers(void (*callback)(void *))
which is the entry routine to report all memory locations in the code cache
that contain class objects (ie class object pool and predicted chaining
cells for virtual calls).
3) Major codegen changes on how/when the class object pool are populated
and how predicted chains are patched. Before this change the compiler
thread is always in the VM_WAIT state, which won't prevent GC from
running. Since the class object pointers captured by a worker thread
are no longer guaranteed to be stable at JIT time, change various
internal data structures to capture the class descriptor/loader
tuple instead. The conversion from descriptor/loader tuple to actual
class object pointers are only performed when the thread state is
RUNNING or at GC safe point.
4) Separate the class object installation phase out of the main
dvmCompilerAssembleLIR routine so that the impact to blocking GC
requests is minimal. Add new stats to report the potential block time.
For example:
Potential GC blocked by compiler: max 46 us / avg 25 us
5) Various cleanup in the trace structure walkup code. Modified the
verbose print routine to show the class descriptor in the class literal
pool. For example:
D/dalvikvm( 1450): -------- end of chaining cells (0x007c)
D/dalvikvm( 1450): 0x44020628 (00b4): .class
(Lcom/android/unit_tests/PerformanceTests$EmptyClass;)
D/dalvikvm( 1450): 0x4402062c (00b8): .word (0xaca8d1a5)
D/dalvikvm( 1450): 0x44020630 (00bc): .word (0x401abc02)
D/dalvikvm( 1450): End
Bug: 3482956
Change-Id: I2e736b00d63adc255c33067544606b8b96b72ffc
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.c')
| -rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c index cc81d1da8..55c06476f 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -1285,7 +1285,7 @@ static void genInvokeVirtualWholeMethod(CompilationUnit *cUnit, CallsiteInfo *callsiteInfo = mir->meta.callsiteInfo; dvmCompilerLockAllTemps(cUnit); - loadConstant(cUnit, r1, (int) callsiteInfo->clazz); + loadClassPointer(cUnit, r1, (int) callsiteInfo); loadWordDisp(cUnit, r0, offsetof(Object, clazz), r2); /* Branch to the slow path if classes are not equal */ @@ -3741,7 +3741,7 @@ static void handleNormalChainingCell(CompilationUnit *cUnit, offsetof(Thread, jitToInterpEntries.dvmJitToInterpNormal) >> 2); newLIR1(cUnit, kThumbBlxR, r0); - addWordData(cUnit, (int) (cUnit->method->insns + offset), true); + addWordData(cUnit, NULL, (int) (cUnit->method->insns + offset)); } /* @@ -3760,7 +3760,7 @@ static void handleHotChainingCell(CompilationUnit *cUnit, offsetof(Thread, jitToInterpEntries.dvmJitToInterpTraceSelect) >> 2); newLIR1(cUnit, kThumbBlxR, r0); - addWordData(cUnit, (int) (cUnit->method->insns + offset), true); + addWordData(cUnit, NULL, (int) (cUnit->method->insns + offset)); } /* Chaining cell for branches that branch back into the same basic block */ @@ -3781,7 +3781,7 @@ static void handleBackwardBranchChainingCell(CompilationUnit *cUnit, offsetof(Thread, jitToInterpEntries.dvmJitToInterpNormal) >> 2); #endif newLIR1(cUnit, kThumbBlxR, r0); - addWordData(cUnit, (int) (cUnit->method->insns + offset), true); + addWordData(cUnit, NULL, (int) (cUnit->method->insns + offset)); } /* Chaining cell for monomorphic method invocations. */ @@ -3797,7 +3797,7 @@ static void handleInvokeSingletonChainingCell(CompilationUnit *cUnit, offsetof(Thread, jitToInterpEntries.dvmJitToInterpTraceSelect) >> 2); newLIR1(cUnit, kThumbBlxR, r0); - addWordData(cUnit, (int) (callee->insns), true); + addWordData(cUnit, NULL, (int) (callee->insns)); } /* Chaining cell for monomorphic method invocations. */ @@ -3805,16 +3805,16 @@ static void handleInvokePredictedChainingCell(CompilationUnit *cUnit) { /* Should not be executed in the initial state */ - addWordData(cUnit, PREDICTED_CHAIN_BX_PAIR_INIT, true); + addWordData(cUnit, NULL, PREDICTED_CHAIN_BX_PAIR_INIT); /* To be filled: class */ - addWordData(cUnit, PREDICTED_CHAIN_CLAZZ_INIT, true); + addWordData(cUnit, NULL, PREDICTED_CHAIN_CLAZZ_INIT); /* To be filled: method */ - addWordData(cUnit, PREDICTED_CHAIN_METHOD_INIT, true); + addWordData(cUnit, NULL, PREDICTED_CHAIN_METHOD_INIT); /* * Rechain count. The initial value of 0 here will trigger chaining upon * the first invocation of this callsite. */ - addWordData(cUnit, PREDICTED_CHAIN_COUNTER_INIT, true); + addWordData(cUnit, NULL, PREDICTED_CHAIN_COUNTER_INIT); } /* Load the Dalvik PC into r0 and jump to the specified target */ @@ -4042,7 +4042,7 @@ static void genValidationForPredictedInline(CompilationUnit *cUnit, MIR *mir) rlThis = loadValue(cUnit, rlThis, kCoreReg); int regPredictedClass = dvmCompilerAllocTemp(cUnit); - loadConstant(cUnit, regPredictedClass, (int) callsiteInfo->clazz); + loadClassPointer(cUnit, regPredictedClass, (int) callsiteInfo); genNullCheck(cUnit, rlThis.sRegLow, rlThis.lowReg, mir->offset, NULL);/* null object? */ int regActualClass = dvmCompilerAllocTemp(cUnit); |
