Compiler.h revision dca714364abf3111fc18c1ac49c2760392fb7c9b
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <Thread.h>
18#include <setjmp.h>
19
20#ifndef _DALVIK_VM_COMPILER
21#define _DALVIK_VM_COMPILER
22
23/*
24 * Uncomment the following to enable JIT signature breakpoint
25 * #define SIGNATURE_BREAKPOINT
26 */
27
28#define MAX_JIT_RUN_LEN                 64
29#define COMPILER_WORK_QUEUE_SIZE        100
30#define COMPILER_IC_PATCH_QUEUE_SIZE    64
31
32#define COMPILER_TRACED(X)
33#define COMPILER_TRACEE(X)
34#define COMPILER_TRACE_CHAINING(X)
35
36typedef enum JitInstructionSetType {
37    DALVIK_JIT_NONE = 0,
38    DALVIK_JIT_ARM,
39    DALVIK_JIT_THUMB,
40    DALVIK_JIT_THUMB2,
41    DALVIK_JIT_THUMB2EE,
42    DALVIK_JIT_X86
43} JitInstructionSetType;
44
45/* Description of a compiled trace. */
46typedef struct JitTranslationInfo {
47    void *codeAddress;
48    JitInstructionSetType instructionSet;
49    bool discardResult;         // Used for debugging divergence and IC patching
50    Thread *requestingThread;   // For debugging purpose
51} JitTranslationInfo;
52
53typedef enum WorkOrderKind {
54    kWorkOrderInvalid = 0,      // Should never see by the backend
55    kWorkOrderMethod = 1,       // Work is to compile a whole method
56    kWorkOrderTrace = 2,        // Work is to compile code fragment(s)
57    kWorkOrderTraceDebug = 3,   // Work is to compile/debug code fragment(s)
58} WorkOrderKind;
59
60typedef struct CompilerWorkOrder {
61    const u2* pc;
62    WorkOrderKind kind;
63    void* info;
64    JitTranslationInfo result;
65    jmp_buf *bailPtr;
66} CompilerWorkOrder;
67
68/* Chain cell for predicted method invocation */
69typedef struct PredictedChainingCell {
70    u4 branch;                  /* Branch to chained destination */
71    const ClassObject *clazz;   /* key #1 for prediction */
72    const Method *method;       /* key #2 to lookup native PC from dalvik PC */
73    u4 counter;                 /* counter to patch the chaining cell */
74} PredictedChainingCell;
75
76/* Work order for inline cache patching */
77typedef struct ICPatchWorkOrder {
78    PredictedChainingCell *cellAddr;    /* Address to be patched */
79    PredictedChainingCell cellContent;  /* content of the new cell */
80} ICPatchWorkOrder;
81
82typedef enum JitState {
83    kJitOff = 0,
84    kJitNormal = 1,            // Profiling in mterp or running native
85    kJitTSelectRequest = 2,    // Transition state - start trace selection
86    kJitTSelectRequestHot = 3, // Transition state - start hot trace selection
87    kJitTSelect = 4,           // Actively selecting trace in dbg interp
88    kJitTSelectAbort = 5,      // Something threw during selection - abort
89    kJitTSelectEnd = 6,        // Done with the trace - wrap it up
90    kJitSingleStep = 7,        // Single step interpretation
91    kJitSingleStepEnd = 8,     // Done with single step, return to mterp
92    kJitSelfVerification = 9,  // Self Verification Mode
93} JitState;
94
95#if defined(WITH_SELF_VERIFICATION)
96typedef enum SelfVerificationState {
97    kSVSIdle = 0,           // Idle
98    kSVSStart = 1,          // Shadow space set up, running compiled code
99    kSVSPunt = 2,           // Exiting compiled code by punting
100    kSVSSingleStep = 3,     // Exiting compiled code by single stepping
101    kSVSTraceSelectNoChain = 4,// Exiting compiled code by trace select no chain
102    kSVSTraceSelect = 5,    // Exiting compiled code by trace select
103    kSVSNormal = 6,         // Exiting compiled code normally
104    kSVSNoChain = 7,        // Exiting compiled code by no chain
105    kSVSBackwardBranch = 8, // Exiting compiled code with backward branch trace
106    kSVSDebugInterp = 9,    // Normal state restored, running debug interpreter
107} SelfVerificationState;
108#endif
109
110typedef enum JitHint {
111   kJitHintNone = 0,
112   kJitHintTaken = 1,         // Last inst in run was taken branch
113   kJitHintNotTaken = 2,      // Last inst in run was not taken branch
114   kJitHintNoBias = 3,        // Last inst in run was unbiased branch
115} jitHint;
116
117/*
118 * Element of a Jit trace description.  Describes a contiguous
119 * sequence of Dalvik byte codes, the last of which can be
120 * associated with a hint.
121 * Dalvik byte code
122 */
123typedef struct {
124    u2    startOffset;       // Starting offset for trace run
125    unsigned numInsts:8;     // Number of Byte codes in run
126    unsigned runEnd:1;       // Run ends with last byte code
127    jitHint  hint:7;         // Hint to apply to final code of run
128} JitCodeDesc;
129
130typedef union {
131    JitCodeDesc frag;
132    void*       hint;
133} JitTraceRun;
134
135/*
136 * Trace description as will appear in the translation cache.  Note
137 * flexible array at end, as these will be of variable size.  To
138 * conserve space in the translation cache, total length of JitTraceRun
139 * array must be recomputed via seqential scan if needed.
140 */
141typedef struct {
142    const Method* method;
143    JitTraceRun trace[];
144} JitTraceDescription;
145
146typedef struct CompilerMethodStats {
147    const Method *method;       // Used as hash entry signature
148    int dalvikSize;             // # of bytes for dalvik bytecodes
149    int compiledDalvikSize;     // # of compiled dalvik bytecodes
150    int nativeSize;             // # of bytes for produced native code
151} CompilerMethodStats;
152
153bool dvmCompilerSetupCodeCache(void);
154bool dvmCompilerArchInit(void);
155void dvmCompilerArchDump(void);
156bool dvmCompilerStartup(void);
157void dvmCompilerShutdown(void);
158bool dvmCompilerWorkEnqueue(const u2* pc, WorkOrderKind kind, void* info);
159void *dvmCheckCodeCache(void *method);
160bool dvmCompileMethod(const Method *method, JitTranslationInfo *info);
161bool dvmCompileTrace(JitTraceDescription *trace, int numMaxInsts,
162                     JitTranslationInfo *info, jmp_buf *bailPtr);
163void dvmCompilerDumpStats(void);
164void dvmCompilerDrainQueue(void);
165void dvmJitUnchainAll(void);
166void dvmCompilerSortAndPrintTraceProfiles(void);
167
168struct CompilationUnit;
169struct BasicBlock;
170struct SSARepresentation;
171struct GrowableList;
172struct JitEntry;
173
174void dvmInitializeSSAConversion(struct CompilationUnit *cUnit);
175int dvmConvertSSARegToDalvik(struct CompilationUnit *cUnit, int ssaReg);
176void dvmCompilerLoopOpt(struct CompilationUnit *cUnit);
177void dvmCompilerNonLoopAnalysis(struct CompilationUnit *cUnit);
178void dvmCompilerFindLiveIn(struct CompilationUnit *cUnit,
179                           struct BasicBlock *bb);
180void dvmCompilerDoSSAConversion(struct CompilationUnit *cUnit,
181                                struct BasicBlock *bb);
182void dvmCompilerDoConstantPropagation(struct CompilationUnit *cUnit,
183                                      struct BasicBlock *bb);
184void dvmCompilerFindInductionVariables(struct CompilationUnit *cUnit,
185                                       struct BasicBlock *bb);
186char *dvmCompilerGetDalvikDisassembly(DecodedInstruction *insn);
187char *dvmCompilerGetSSAString(struct CompilationUnit *cUnit,
188                              struct SSARepresentation *ssaRep);
189void dvmCompilerDataFlowAnalysisDispatcher(struct CompilationUnit *cUnit,
190                void (*func)(struct CompilationUnit *, struct BasicBlock *));
191void dvmCompilerStateRefresh(void);
192JitTraceDescription *dvmCopyTraceDescriptor(const u2 *pc,
193                                            const struct JitEntry *desc);
194#endif /* _DALVIK_VM_COMPILER */
195