blob: e42d98696bd284754715467d9ec5c004724506b6 [file] [log] [blame]
Ben Chengba4fc8b2009-06-01 13:00:29 -07001/*
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
Ben Cheng33672452010-01-12 14:59:30 -080017#include <Thread.h>
Bill Buzbeefc519dc2010-03-06 23:30:57 -080018#include <setjmp.h>
Ben Cheng33672452010-01-12 14:59:30 -080019
Ben Chengba4fc8b2009-06-01 13:00:29 -070020#ifndef _DALVIK_VM_COMPILER
21#define _DALVIK_VM_COMPILER
22
Ben Chengdca71432010-03-16 16:04:11 -070023/*
24 * Uncomment the following to enable JIT signature breakpoint
25 * #define SIGNATURE_BREAKPOINT
26 */
27
Ben Chengba4fc8b2009-06-01 13:00:29 -070028#define MAX_JIT_RUN_LEN 64
29#define COMPILER_WORK_QUEUE_SIZE 100
Ben Chengc3b92b22010-01-26 16:46:15 -080030#define COMPILER_IC_PATCH_QUEUE_SIZE 64
Ben Chengba4fc8b2009-06-01 13:00:29 -070031
32#define COMPILER_TRACED(X)
33#define COMPILER_TRACEE(X)
34#define COMPILER_TRACE_CHAINING(X)
35
Bill Buzbee716f1202009-07-23 13:22:09 -070036typedef enum JitInstructionSetType {
37 DALVIK_JIT_NONE = 0,
38 DALVIK_JIT_ARM,
39 DALVIK_JIT_THUMB,
40 DALVIK_JIT_THUMB2,
Bill Buzbee9bc3df32009-07-30 10:52:29 -070041 DALVIK_JIT_THUMB2EE,
Bill Buzbee716f1202009-07-23 13:22:09 -070042 DALVIK_JIT_X86
43} JitInstructionSetType;
44
45/* Description of a compiled trace. */
46typedef struct JitTranslationInfo {
Ben Chengccd6c012009-10-15 14:52:45 -070047 void *codeAddress;
Bill Buzbee716f1202009-07-23 13:22:09 -070048 JitInstructionSetType instructionSet;
Ben Cheng60c24f42010-01-04 12:29:56 -080049 bool discardResult; // Used for debugging divergence and IC patching
Ben Cheng33672452010-01-12 14:59:30 -080050 Thread *requestingThread; // For debugging purpose
Bill Buzbee716f1202009-07-23 13:22:09 -070051} JitTranslationInfo;
52
Ben Chengba4fc8b2009-06-01 13:00:29 -070053typedef 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)
Ben Chengccd6c012009-10-15 14:52:45 -070057 kWorkOrderTraceDebug = 3, // Work is to compile/debug code fragment(s)
Ben Chengba4fc8b2009-06-01 13:00:29 -070058} WorkOrderKind;
59
60typedef struct CompilerWorkOrder {
61 const u2* pc;
62 WorkOrderKind kind;
63 void* info;
Bill Buzbee716f1202009-07-23 13:22:09 -070064 JitTranslationInfo result;
Bill Buzbeefc519dc2010-03-06 23:30:57 -080065 jmp_buf *bailPtr;
Ben Chengba4fc8b2009-06-01 13:00:29 -070066} CompilerWorkOrder;
67
Ben Chengc3b92b22010-01-26 16:46:15 -080068/* 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
Ben Chenga4973592010-03-31 11:59:18 -070082/* States of the dbg interpreter when serving a JIT-related request */
Ben Chengba4fc8b2009-06-01 13:00:29 -070083typedef enum JitState {
Ben Chenga4973592010-03-31 11:59:18 -070084 /* Entering states in the debug interpreter */
85 kJitNot = 0, // Non-JIT related reasons */
86 kJitTSelectRequest = 1, // Request a trace (subject to filtering)
87 kJitTSelectRequestHot = 2, // Request a hot trace (bypass the filter)
88 kJitSelfVerification = 3, // Self Verification Mode
89
90 /* Operational states in the debug interpreter */
91 kJitTSelect = 4, // Actively selecting a trace
92 kJitTSelectEnd = 5, // Done with the trace - wrap it up
93 kJitSingleStep = 6, // Single step interpretation
94 kJitSingleStepEnd = 7, // Done with single step, ready return to mterp
95 kJitDone = 8, // Ready to leave the debug interpreter
Ben Chengba4fc8b2009-06-01 13:00:29 -070096} JitState;
97
Jeff Hao97319a82009-08-12 16:57:15 -070098#if defined(WITH_SELF_VERIFICATION)
99typedef enum SelfVerificationState {
100 kSVSIdle = 0, // Idle
101 kSVSStart = 1, // Shadow space set up, running compiled code
102 kSVSPunt = 2, // Exiting compiled code by punting
103 kSVSSingleStep = 3, // Exiting compiled code by single stepping
Ben Cheng40094c12010-02-24 20:58:44 -0800104 kSVSTraceSelectNoChain = 4,// Exiting compiled code by trace select no chain
105 kSVSTraceSelect = 5, // Exiting compiled code by trace select
106 kSVSNormal = 6, // Exiting compiled code normally
107 kSVSNoChain = 7, // Exiting compiled code by no chain
108 kSVSBackwardBranch = 8, // Exiting compiled code with backward branch trace
109 kSVSDebugInterp = 9, // Normal state restored, running debug interpreter
Jeff Hao97319a82009-08-12 16:57:15 -0700110} SelfVerificationState;
111#endif
112
Ben Chengba4fc8b2009-06-01 13:00:29 -0700113typedef enum JitHint {
114 kJitHintNone = 0,
115 kJitHintTaken = 1, // Last inst in run was taken branch
116 kJitHintNotTaken = 2, // Last inst in run was not taken branch
117 kJitHintNoBias = 3, // Last inst in run was unbiased branch
118} jitHint;
119
120/*
121 * Element of a Jit trace description. Describes a contiguous
122 * sequence of Dalvik byte codes, the last of which can be
123 * associated with a hint.
124 * Dalvik byte code
125 */
126typedef struct {
127 u2 startOffset; // Starting offset for trace run
128 unsigned numInsts:8; // Number of Byte codes in run
129 unsigned runEnd:1; // Run ends with last byte code
130 jitHint hint:7; // Hint to apply to final code of run
131} JitCodeDesc;
132
133typedef union {
134 JitCodeDesc frag;
135 void* hint;
136} JitTraceRun;
137
138/*
139 * Trace description as will appear in the translation cache. Note
140 * flexible array at end, as these will be of variable size. To
141 * conserve space in the translation cache, total length of JitTraceRun
142 * array must be recomputed via seqential scan if needed.
143 */
144typedef struct {
145 const Method* method;
146 JitTraceRun trace[];
147} JitTraceDescription;
148
Ben Cheng8b258bf2009-06-24 17:27:07 -0700149typedef struct CompilerMethodStats {
150 const Method *method; // Used as hash entry signature
151 int dalvikSize; // # of bytes for dalvik bytecodes
152 int compiledDalvikSize; // # of compiled dalvik bytecodes
153 int nativeSize; // # of bytes for produced native code
154} CompilerMethodStats;
155
Ben Chengba4fc8b2009-06-01 13:00:29 -0700156bool dvmCompilerSetupCodeCache(void);
157bool dvmCompilerArchInit(void);
158void dvmCompilerArchDump(void);
159bool dvmCompilerStartup(void);
160void dvmCompilerShutdown(void);
161bool dvmCompilerWorkEnqueue(const u2* pc, WorkOrderKind kind, void* info);
162void *dvmCheckCodeCache(void *method);
Bill Buzbee716f1202009-07-23 13:22:09 -0700163bool dvmCompileMethod(const Method *method, JitTranslationInfo *info);
164bool dvmCompileTrace(JitTraceDescription *trace, int numMaxInsts,
Bill Buzbeefc519dc2010-03-06 23:30:57 -0800165 JitTranslationInfo *info, jmp_buf *bailPtr);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700166void dvmCompilerDumpStats(void);
167void dvmCompilerDrainQueue(void);
Bill Buzbee46cd5b62009-06-05 15:36:06 -0700168void dvmJitUnchainAll(void);
Bill Buzbee716f1202009-07-23 13:22:09 -0700169void dvmCompilerSortAndPrintTraceProfiles(void);
Carl Shapiro3f349af2010-02-25 15:47:08 -0800170void dvmCompilerPerformSafePointChecks(void);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700171
Ben Cheng4238ec22009-08-24 16:32:22 -0700172struct CompilationUnit;
173struct BasicBlock;
174struct SSARepresentation;
175struct GrowableList;
Ben Cheng88a0f972010-02-24 15:00:40 -0800176struct JitEntry;
Ben Cheng4238ec22009-08-24 16:32:22 -0700177
178void dvmInitializeSSAConversion(struct CompilationUnit *cUnit);
179int dvmConvertSSARegToDalvik(struct CompilationUnit *cUnit, int ssaReg);
180void dvmCompilerLoopOpt(struct CompilationUnit *cUnit);
181void dvmCompilerNonLoopAnalysis(struct CompilationUnit *cUnit);
182void dvmCompilerFindLiveIn(struct CompilationUnit *cUnit,
183 struct BasicBlock *bb);
184void dvmCompilerDoSSAConversion(struct CompilationUnit *cUnit,
185 struct BasicBlock *bb);
186void dvmCompilerDoConstantPropagation(struct CompilationUnit *cUnit,
187 struct BasicBlock *bb);
188void dvmCompilerFindInductionVariables(struct CompilationUnit *cUnit,
189 struct BasicBlock *bb);
Ben Chengccd6c012009-10-15 14:52:45 -0700190char *dvmCompilerGetDalvikDisassembly(DecodedInstruction *insn);
Ben Cheng4238ec22009-08-24 16:32:22 -0700191char *dvmCompilerGetSSAString(struct CompilationUnit *cUnit,
192 struct SSARepresentation *ssaRep);
193void dvmCompilerDataFlowAnalysisDispatcher(struct CompilationUnit *cUnit,
194 void (*func)(struct CompilationUnit *, struct BasicBlock *));
Bill Buzbee06bb8392010-01-31 18:53:15 -0800195void dvmCompilerStateRefresh(void);
Ben Cheng88a0f972010-02-24 15:00:40 -0800196JitTraceDescription *dvmCopyTraceDescriptor(const u2 *pc,
197 const struct JitEntry *desc);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700198#endif /* _DALVIK_VM_COMPILER */