diff options
Diffstat (limited to 'vm/compiler')
-rw-r--r-- | vm/compiler/Compiler.c | 16 | ||||
-rw-r--r-- | vm/compiler/Compiler.h | 23 | ||||
-rw-r--r-- | vm/compiler/Utility.c | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/ArchUtility.c | 20 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/ArmLIR.h | 20 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/CodegenCommon.c | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.c | 26 |
7 files changed, 63 insertions, 46 deletions
diff --git a/vm/compiler/Compiler.c b/vm/compiler/Compiler.c index efbe0a5fd..6cb1c775d 100644 --- a/vm/compiler/Compiler.c +++ b/vm/compiler/Compiler.c @@ -385,7 +385,11 @@ bool compilerThreadStartup(void) gDvmJit.jitTableEntriesUsed = 0; gDvmJit.compilerHighWater = COMPILER_WORK_QUEUE_SIZE - (COMPILER_WORK_QUEUE_SIZE/4); - gDvmJit.pProfTable = pJitProfTable; + /* + * If the VM is launched with wait-on-the-debugger, we will need to hide + * the profile table here + */ + gDvmJit.pProfTable = dvmDebuggerOrProfilerActive() ? NULL : pJitProfTable; gDvmJit.pProfTableCopy = pJitProfTable; dvmUnlockMutex(&gDvmJit.tableLock); @@ -708,6 +712,16 @@ void dvmCompilerStateRefresh() bool jitActivate; bool needUnchain = false; + /* + * The tableLock might not be initialized yet by the compiler thread if + * debugger is attached from the very beginning of the VM launch. If + * pProfTableCopy is NULL, the lock is not initialized yet and we don't + * need to refresh anything either. + */ + if (gDvmJit.pProfTableCopy == NULL) { + return; + } + dvmLockMutex(&gDvmJit.tableLock); jitActive = gDvmJit.pProfTable != NULL; jitActivate = !(gDvm.debuggerActive || (gDvm.activeProfilers > 0)); diff --git a/vm/compiler/Compiler.h b/vm/compiler/Compiler.h index 5b667355d..ba23d7df1 100644 --- a/vm/compiler/Compiler.h +++ b/vm/compiler/Compiler.h @@ -79,17 +79,20 @@ typedef struct ICPatchWorkOrder { PredictedChainingCell cellContent; /* content of the new cell */ } ICPatchWorkOrder; +/* States of the dbg interpreter when serving a JIT-related request */ typedef enum JitState { - kJitOff = 0, - kJitNormal = 1, // Profiling in mterp or running native - kJitTSelectRequest = 2, // Transition state - start trace selection - kJitTSelectRequestHot = 3, // Transition state - start hot trace selection - kJitTSelect = 4, // Actively selecting trace in dbg interp - kJitTSelectAbort = 5, // Something threw during selection - abort - kJitTSelectEnd = 6, // Done with the trace - wrap it up - kJitSingleStep = 7, // Single step interpretation - kJitSingleStepEnd = 8, // Done with single step, return to mterp - kJitSelfVerification = 9, // Self Verification Mode + /* Entering states in the debug interpreter */ + kJitNot = 0, // Non-JIT related reasons */ + kJitTSelectRequest = 1, // Request a trace (subject to filtering) + kJitTSelectRequestHot = 2, // Request a hot trace (bypass the filter) + kJitSelfVerification = 3, // Self Verification Mode + + /* Operational states in the debug interpreter */ + kJitTSelect = 4, // Actively selecting a trace + kJitTSelectEnd = 5, // Done with the trace - wrap it up + kJitSingleStep = 6, // Single step interpretation + kJitSingleStepEnd = 7, // Done with single step, ready return to mterp + kJitDone = 8, // Ready to leave the debug interpreter } JitState; #if defined(WITH_SELF_VERIFICATION) diff --git a/vm/compiler/Utility.c b/vm/compiler/Utility.c index 83caab745..b2654c407 100644 --- a/vm/compiler/Utility.c +++ b/vm/compiler/Utility.c @@ -76,7 +76,7 @@ retry: currentArena = newArena; numArenaBlocks++; if (numArenaBlocks > 10) - LOGD("Total arena pages for JIT: %d", numArenaBlocks); + LOGI("Total arena pages for JIT: %d", numArenaBlocks); goto retry; } return NULL; diff --git a/vm/compiler/codegen/arm/ArchUtility.c b/vm/compiler/codegen/arm/ArchUtility.c index 20b3f85a7..b0478f49c 100644 --- a/vm/compiler/codegen/arm/ArchUtility.c +++ b/vm/compiler/codegen/arm/ArchUtility.c @@ -257,41 +257,41 @@ void dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr) break; case kArmPseudoTargetLabel: break; - case ARM_PSEUDO_kChainingCellBackwardBranch: + case kArmPseudoChainingCellBackwardBranch: LOGD("-------- chaining cell (backward branch): 0x%04x\n", dest); break; - case ARM_PSEUDO_kChainingCellNormal: + case kArmPseudoChainingCellNormal: LOGD("-------- chaining cell (normal): 0x%04x\n", dest); break; - case ARM_PSEUDO_kChainingCellHot: + case kArmPseudoChainingCellHot: LOGD("-------- chaining cell (hot): 0x%04x\n", dest); break; - case ARM_PSEUDO_kChainingCellInvokePredicted: + case kArmPseudoChainingCellInvokePredicted: LOGD("-------- chaining cell (predicted)\n"); break; - case ARM_PSEUDO_kChainingCellInvokeSingleton: + case kArmPseudoChainingCellInvokeSingleton: LOGD("-------- chaining cell (invoke singleton): %s/%p\n", ((Method *)dest)->name, ((Method *)dest)->insns); break; - case ARM_PSEUDO_kEntryBlock: + case kArmPseudoEntryBlock: LOGD("-------- entry offset: 0x%04x\n", dest); break; - case ARM_PSEUDO_kDalvikByteCode_BOUNDARY: + case kArmPseudoDalvikByteCodeBoundary: LOGD("-------- dalvik offset: 0x%04x @ %s\n", dest, (char *) lir->operands[1]); break; - case ARM_PSEUDO_kExitBlock: + case kArmPseudoExitBlock: LOGD("-------- exit offset: 0x%04x\n", dest); break; case kArmPseudoPseudoAlign4: LOGD("%p (%04x): .align4\n", baseAddr + offset, offset); break; - case ARM_PSEUDO_kPCReconstruction_CELL: + case kArmPseudoPCReconstructionCell: LOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x\n", dest, lir->operands[1]); break; - case ARM_PSEUDO_kPCReconstruction_BLOCK_LABEL: + case kArmPseudoPCReconstructionBlockLabel: /* Do nothing */ break; case kArmPseudoEHBlockLabel: diff --git a/vm/compiler/codegen/arm/ArmLIR.h b/vm/compiler/codegen/arm/ArmLIR.h index e1073b604..f7704ade5 100644 --- a/vm/compiler/codegen/arm/ArmLIR.h +++ b/vm/compiler/codegen/arm/ArmLIR.h @@ -318,18 +318,18 @@ typedef enum ArmOpCode { kArmPseudoBarrier = -17, kArmPseudoExtended = -16, kArmPseudoSSARep = -15, - ARM_PSEUDO_kEntryBlock = -14, - ARM_PSEUDO_kExitBlock = -13, + kArmPseudoEntryBlock = -14, + kArmPseudoExitBlock = -13, kArmPseudoTargetLabel = -12, - ARM_PSEUDO_kChainingCellBackwardBranch = -11, - ARM_PSEUDO_kChainingCellHot = -10, - ARM_PSEUDO_kChainingCellInvokePredicted = -9, - ARM_PSEUDO_kChainingCellInvokeSingleton = -8, - ARM_PSEUDO_kChainingCellNormal = -7, - ARM_PSEUDO_kDalvikByteCode_BOUNDARY = -6, + kArmPseudoChainingCellBackwardBranch = -11, + kArmPseudoChainingCellHot = -10, + kArmPseudoChainingCellInvokePredicted = -9, + kArmPseudoChainingCellInvokeSingleton = -8, + kArmPseudoChainingCellNormal = -7, + kArmPseudoDalvikByteCodeBoundary = -6, kArmPseudoPseudoAlign4 = -5, - ARM_PSEUDO_kPCReconstruction_CELL = -4, - ARM_PSEUDO_kPCReconstruction_BLOCK_LABEL = -3, + kArmPseudoPCReconstructionCell = -4, + kArmPseudoPCReconstructionBlockLabel = -3, kArmPseudoEHBlockLabel = -2, kArmPseudoNormalBlockLabel = -1, /************************************************************************/ diff --git a/vm/compiler/codegen/arm/CodegenCommon.c b/vm/compiler/codegen/arm/CodegenCommon.c index 8f5c11da4..0cec99df8 100644 --- a/vm/compiler/codegen/arm/CodegenCommon.c +++ b/vm/compiler/codegen/arm/CodegenCommon.c @@ -370,7 +370,7 @@ extern ArmLIR *genCheckCommon(CompilationUnit *cUnit, int dOffset, if (pcrLabel == NULL) { int dPC = (int) (cUnit->method->insns + dOffset); pcrLabel = dvmCompilerNew(sizeof(ArmLIR), true); - pcrLabel->opCode = ARM_PSEUDO_kPCReconstruction_CELL; + pcrLabel->opCode = kArmPseudoPCReconstructionCell; pcrLabel->operands[0] = dPC; pcrLabel->operands[1] = dOffset; /* Insert the place holder to the growable list */ diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c index e3ac5bb04..695f18c1a 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -911,7 +911,7 @@ static void genReturnCommon(CompilationUnit *cUnit, MIR *mir) ArmLIR *branch = genUnconditionalBranch(cUnit, NULL); /* Set up the place holder to reconstruct this Dalvik PC */ ArmLIR *pcrLabel = dvmCompilerNew(sizeof(ArmLIR), true); - pcrLabel->opCode = ARM_PSEUDO_kPCReconstruction_CELL; + pcrLabel->opCode = kArmPseudoPCReconstructionCell; pcrLabel->operands[0] = dPC; pcrLabel->operands[1] = mir->offset; /* Insert the place holder to the growable list */ @@ -1148,7 +1148,7 @@ static void genInvokeVirtualCommon(CompilationUnit *cUnit, MIR *mir, if (pcrLabel == NULL) { int dPC = (int) (cUnit->method->insns + mir->offset); pcrLabel = dvmCompilerNew(sizeof(ArmLIR), true); - pcrLabel->opCode = ARM_PSEUDO_kPCReconstruction_CELL; + pcrLabel->opCode = kArmPseudoPCReconstructionCell; pcrLabel->operands[0] = dPC; pcrLabel->operands[1] = mir->offset; /* Insert the place holder to the growable list */ @@ -2811,7 +2811,7 @@ static bool handleFmt35c_3rc(CompilationUnit *cUnit, MIR *mir, BasicBlock *bb, if (pcrLabel == NULL) { int dPC = (int) (cUnit->method->insns + mir->offset); pcrLabel = dvmCompilerNew(sizeof(ArmLIR), true); - pcrLabel->opCode = ARM_PSEUDO_kPCReconstruction_CELL; + pcrLabel->opCode = kArmPseudoPCReconstructionCell; pcrLabel->operands[0] = dPC; pcrLabel->operands[1] = mir->offset; /* Insert the place holder to the growable list */ @@ -3487,7 +3487,7 @@ static void setupLoopEntryBlock(CompilationUnit *cUnit, BasicBlock *entry, { /* Set up the place holder to reconstruct this Dalvik PC */ ArmLIR *pcrLabel = dvmCompilerNew(sizeof(ArmLIR), true); - pcrLabel->opCode = ARM_PSEUDO_kPCReconstruction_CELL; + pcrLabel->opCode = kArmPseudoPCReconstructionCell; pcrLabel->operands[0] = (int) (cUnit->method->insns + entry->startOffset); pcrLabel->operands[1] = entry->startOffset; @@ -3598,7 +3598,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) } if (blockList[i]->blockType == kEntryBlock) { - labelList[i].opCode = ARM_PSEUDO_kEntryBlock; + labelList[i].opCode = kArmPseudoEntryBlock; if (blockList[i]->firstMIRInsn == NULL) { continue; } else { @@ -3606,7 +3606,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) &labelList[blockList[i]->fallThrough->id]); } } else if (blockList[i]->blockType == kExitBlock) { - labelList[i].opCode = ARM_PSEUDO_kExitBlock; + labelList[i].opCode = kArmPseudoExitBlock; goto gen_fallthrough; } else if (blockList[i]->blockType == kDalvikByteCode) { labelList[i].opCode = kArmPseudoNormalBlockLabel; @@ -3617,14 +3617,14 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) } else { switch (blockList[i]->blockType) { case kChainingCellNormal: - labelList[i].opCode = ARM_PSEUDO_kChainingCellNormal; + labelList[i].opCode = kArmPseudoChainingCellNormal; /* handle the codegen later */ dvmInsertGrowableList( &chainingListByType[kChainingCellNormal], (void *) i); break; case kChainingCellInvokeSingleton: labelList[i].opCode = - ARM_PSEUDO_kChainingCellInvokeSingleton; + kArmPseudoChainingCellInvokeSingleton; labelList[i].operands[0] = (int) blockList[i]->containingMethod; /* handle the codegen later */ @@ -3634,7 +3634,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) break; case kChainingCellInvokePredicted: labelList[i].opCode = - ARM_PSEUDO_kChainingCellInvokePredicted; + kArmPseudoChainingCellInvokePredicted; /* handle the codegen later */ dvmInsertGrowableList( &chainingListByType[kChainingCellInvokePredicted], @@ -3642,7 +3642,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) break; case kChainingCellHot: labelList[i].opCode = - ARM_PSEUDO_kChainingCellHot; + kArmPseudoChainingCellHot; /* handle the codegen later */ dvmInsertGrowableList( &chainingListByType[kChainingCellHot], @@ -3651,7 +3651,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) case kPCReconstruction: /* Make sure exception handling block is next */ labelList[i].opCode = - ARM_PSEUDO_kPCReconstruction_BLOCK_LABEL; + kArmPseudoPCReconstructionBlockLabel; assert (i == cUnit->numBlocks - 2); handlePCReconstruction(cUnit, &labelList[i+1]); break; @@ -3667,7 +3667,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) #if defined(WITH_SELF_VERIFICATION) || defined(WITH_JIT_TUNING) case kChainingCellBackwardBranch: labelList[i].opCode = - ARM_PSEUDO_kChainingCellBackwardBranch; + kArmPseudoChainingCellBackwardBranch; /* handle the codegen later */ dvmInsertGrowableList( &chainingListByType[kChainingCellBackwardBranch], @@ -3703,7 +3703,7 @@ void dvmCompilerMIR2LIR(CompilationUnit *cUnit) InstructionFormat dalvikFormat = dexGetInstrFormat(gDvm.instrFormat, dalvikOpCode); ArmLIR *boundaryLIR = - newLIR2(cUnit, ARM_PSEUDO_kDalvikByteCode_BOUNDARY, + newLIR2(cUnit, kArmPseudoDalvikByteCodeBoundary, mir->offset, (int) dvmCompilerGetDalvikDisassembly(&mir->dalvikInsn) ); |