diff options
Diffstat (limited to 'vm/compiler/Compiler.h')
-rw-r--r-- | vm/compiler/Compiler.h | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/vm/compiler/Compiler.h b/vm/compiler/Compiler.h index 6dd9cbd58..cd9d21bb3 100644 --- a/vm/compiler/Compiler.h +++ b/vm/compiler/Compiler.h @@ -45,15 +45,8 @@ #define COMPILER_TRACE_CHAINING(X) /* Macro to change the permissions applied to a chunk of the code cache */ -#if !defined(WITH_JIT_TUNING) #define PROTECT_CODE_CACHE_ATTRS (PROT_READ | PROT_EXEC) #define UNPROTECT_CODE_CACHE_ATTRS (PROT_READ | PROT_EXEC | PROT_WRITE) -#else -/* When doing JIT profiling always grant the write permission */ -#define PROTECT_CODE_CACHE_ATTRS (PROT_READ | PROT_EXEC | \ - (gDvmJit.profile ? PROT_WRITE : 0)) -#define UNPROTECT_CODE_CACHE_ATTRS (PROT_READ | PROT_EXEC | PROT_WRITE) -#endif /* Acquire the lock before removing PROT_WRITE from the specified mem region */ #define UNPROTECT_CODE_CACHE(addr, size) \ @@ -90,6 +83,7 @@ typedef enum JitInstructionSetType { typedef struct JitTranslationInfo { void *codeAddress; JitInstructionSetType instructionSet; + int profileCodeSize; bool discardResult; // Used for debugging divergence and IC patching bool methodCompilationAborted; // Cannot compile the whole method Thread *requestingThread; // For debugging purpose @@ -100,6 +94,7 @@ typedef enum WorkOrderKind { kWorkOrderMethod = 1, // Work is to compile a whole method kWorkOrderTrace = 2, // Work is to compile code fragment(s) kWorkOrderTraceDebug = 3, // Work is to compile/debug code fragment(s) + kWorkOrderProfileMode = 4, // Change profiling mode } WorkOrderKind; typedef struct CompilerWorkOrder { @@ -236,6 +231,15 @@ typedef enum JitOptimizationHints { #define JIT_OPT_NO_LOOP (1 << kJitOptNoLoop) +/* Customized node traversal orders for different needs */ +typedef enum DataFlowAnalysisMode { + kAllNodes = 0, // All nodes + kReachableNodes, // All reachable nodes + kPreOrderDFSTraversal, // Depth-First-Search / Pre-Order + kPostOrderDFSTraversal, // Depth-First-Search / Post-Order + kPostOrderDOMTraversal, // Dominator tree / Post-Order +} DataFlowAnalysisMode; + typedef struct CompilerMethodStats { const Method *method; // Used as hash entry signature int dalvikSize; // # of bytes for dalvik bytecodes @@ -262,8 +266,7 @@ CompilerMethodStats *dvmCompilerAnalyzeMethodBody(const Method *method, bool isCallee); bool dvmCompilerCanIncludeThisInstruction(const Method *method, const DecodedInstruction *insn); -bool dvmCompileMethod(struct CompilationUnit *cUnit, const Method *method, - JitTranslationInfo *info); +bool dvmCompileMethod(const Method *method); bool dvmCompileTrace(JitTraceDescription *trace, int numMaxInsts, JitTranslationInfo *info, jmp_buf *bailPtr, int optHints); void dvmCompilerDumpStats(void); @@ -273,22 +276,31 @@ void dvmCompilerSortAndPrintTraceProfiles(void); void dvmCompilerPerformSafePointChecks(void); void dvmCompilerInlineMIR(struct CompilationUnit *cUnit); void dvmInitializeSSAConversion(struct CompilationUnit *cUnit); -int dvmConvertSSARegToDalvik(struct CompilationUnit *cUnit, int ssaReg); +int dvmConvertSSARegToDalvik(const struct CompilationUnit *cUnit, int ssaReg); bool dvmCompilerLoopOpt(struct CompilationUnit *cUnit); void dvmCompilerNonLoopAnalysis(struct CompilationUnit *cUnit); -void dvmCompilerFindLiveIn(struct CompilationUnit *cUnit, - struct BasicBlock *bb); -void dvmCompilerDoSSAConversion(struct CompilationUnit *cUnit, +bool dvmCompilerFindLocalLiveIn(struct CompilationUnit *cUnit, + struct BasicBlock *bb); +bool dvmCompilerDoSSAConversion(struct CompilationUnit *cUnit, struct BasicBlock *bb); -void dvmCompilerDoConstantPropagation(struct CompilationUnit *cUnit, +bool dvmCompilerDoConstantPropagation(struct CompilationUnit *cUnit, struct BasicBlock *bb); -void dvmCompilerFindInductionVariables(struct CompilationUnit *cUnit, +bool dvmCompilerFindInductionVariables(struct CompilationUnit *cUnit, struct BasicBlock *bb); -char *dvmCompilerGetDalvikDisassembly(DecodedInstruction *insn, char *note); +/* Clear the visited flag for each BB */ +bool dvmCompilerClearVisitedFlag(struct CompilationUnit *cUnit, + struct BasicBlock *bb); +char *dvmCompilerGetDalvikDisassembly(const DecodedInstruction *insn, + char *note); +char *dvmCompilerFullDisassembler(const struct CompilationUnit *cUnit, + const struct MIR *mir); char *dvmCompilerGetSSAString(struct CompilationUnit *cUnit, struct SSARepresentation *ssaRep); void dvmCompilerDataFlowAnalysisDispatcher(struct CompilationUnit *cUnit, - void (*func)(struct CompilationUnit *, struct BasicBlock *)); + bool (*func)(struct CompilationUnit *, struct BasicBlock *), + DataFlowAnalysisMode dfaMode, + bool isIterative); +void dvmCompilerMethodSSATransformation(struct CompilationUnit *cUnit); void dvmCompilerStateRefresh(void); JitTraceDescription *dvmCopyTraceDescriptor(const u2 *pc, const struct JitEntry *desc); |