blob: b7e0f4aa1d3c3f6b8034c379d039d55569c886b7 [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/*
17 * Jit control
18 */
19#ifndef _DALVIK_INTERP_JIT
20#define _DALVIK_INTERP_JIT
21
22#include "InterpDefs.h"
Ben Cheng7b133ef2010-02-04 16:15:59 -080023#include "mterp/common/jit-config.h"
Ben Cheng1efc9c52009-06-08 18:25:27 -070024
25#define JIT_MAX_TRACE_LEN 100
26
Jeff Hao97319a82009-08-12 16:57:15 -070027#if defined (WITH_SELF_VERIFICATION)
28
29#define REG_SPACE 256 /* default size of shadow space */
30#define HEAP_SPACE JIT_MAX_TRACE_LEN /* default size of heap space */
31
32typedef struct ShadowHeap {
33 int addr;
34 int data;
35} ShadowHeap;
36
37typedef struct InstructionTrace {
38 int addr;
Ben Chengbcdc1de2009-08-21 16:18:46 -070039 DecodedInstruction decInsn;
Jeff Hao97319a82009-08-12 16:57:15 -070040} InstructionTrace;
41
42typedef struct ShadowSpace {
43 const u2* startPC; /* starting pc of jitted region */
buzbee9f601a92011-02-11 17:48:20 -080044 u4* fp; /* starting fp of jitted region */
45 const Method *method;
46 DvmDex* methodClassDex;
47 JValue retval;
48 const u1* interpStackEnd;
Ben Cheng7a2697d2010-06-07 13:44:23 -070049 SelfVerificationState jitExitState; /* exit point for JIT'ed code */
50 SelfVerificationState selfVerificationState; /* current SV running state */
Jeff Hao97319a82009-08-12 16:57:15 -070051 const u2* endPC; /* ending pc of jitted region */
52 void* shadowFP; /* pointer to fp in shadow space */
Jeff Hao97319a82009-08-12 16:57:15 -070053 int* registerSpace; /* copy of register state */
54 int registerSpaceSize; /* current size of register space */
55 ShadowHeap heapSpace[HEAP_SPACE]; /* copy of heap space */
56 ShadowHeap* heapSpaceTail; /* tail pointer to heapSpace */
57 const void* endShadowFP; /* ending fp in shadow space */
58 InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */
59 int traceLength; /* counter for current trace length */
60} ShadowSpace;
61
62/*
63 * Self verification functions.
64 */
65void* dvmSelfVerificationShadowSpaceAlloc(Thread* self);
66void dvmSelfVerificationShadowSpaceFree(Thread* self);
buzbee9f601a92011-02-11 17:48:20 -080067void* dvmSelfVerificationSaveState(const u2* pc, u4* fp,
68 Thread* self,
Bill Buzbee9a8c75a2009-11-08 14:31:20 -080069 int targetTrace);
buzbee9f601a92011-02-11 17:48:20 -080070void* dvmSelfVerificationRestoreState(const u2* pc, u4* fp,
71 SelfVerificationState exitPoint,
72 Thread *self);
buzbee9a3147c2011-03-02 15:43:48 -080073void dvmCheckSelfVerification(const u2* pc, Thread* self);
Jeff Hao97319a82009-08-12 16:57:15 -070074#endif
75
Ben Chengba4fc8b2009-06-01 13:00:29 -070076/*
Ben Cheng385828e2011-03-04 16:48:33 -080077 * Offsets for metadata in the trace run array from the trace that ends with
78 * invoke instructions.
79 */
80#define JIT_TRACE_CLASS_DESC 1
81#define JIT_TRACE_CLASS_LOADER 2
82#define JIT_TRACE_CUR_METHOD 3
83
84/*
Ben Chengba4fc8b2009-06-01 13:00:29 -070085 * JitTable hash function.
86 */
Bill Buzbee27176222009-06-09 09:20:16 -070087
88static inline u4 dvmJitHashMask( const u2* p, u4 mask ) {
89 return ((((u4)p>>12)^(u4)p)>>1) & (mask);
Ben Chengba4fc8b2009-06-01 13:00:29 -070090}
91
Bill Buzbee27176222009-06-09 09:20:16 -070092static inline u4 dvmJitHash( const u2* p ) {
93 return dvmJitHashMask( p, gDvmJit.jitTableMask );
94}
95
Ben Chengba4fc8b2009-06-01 13:00:29 -070096/*
buzbee2e152ba2010-12-15 16:32:35 -080097 * The width of the chain field in JitEntryInfo sets the upper
98 * bound on the number of translations. Be careful if changing
99 * the size of JitEntry struct - the Dalvik PC to JitEntry
100 * hash functions have built-in knowledge of the size.
101 */
102#define JIT_ENTRY_CHAIN_WIDTH 2
103#define JIT_MAX_ENTRIES (1 << (JIT_ENTRY_CHAIN_WIDTH * 8))
104
105/*
106 * The trace profiling counters are allocated in blocks and individual
107 * counters must not move so long as any referencing trace exists.
108 */
109#define JIT_PROF_BLOCK_ENTRIES 1024
110#define JIT_PROF_BLOCK_BUCKETS (JIT_MAX_ENTRIES / JIT_PROF_BLOCK_ENTRIES)
111
112typedef s4 JitTraceCounter_t;
113
114typedef struct JitTraceProfCounters {
115 unsigned int next;
116 JitTraceCounter_t *buckets[JIT_PROF_BLOCK_BUCKETS];
117} JitTraceProfCounters;
118
119/*
Ben Chengba4fc8b2009-06-01 13:00:29 -0700120 * Entries in the JIT's address lookup hash table.
Bill Buzbee716f1202009-07-23 13:22:09 -0700121 * Fields which may be updated by multiple threads packed into a
122 * single 32-bit word to allow use of atomic update.
Ben Chengba4fc8b2009-06-01 13:00:29 -0700123 */
Bill Buzbee716f1202009-07-23 13:22:09 -0700124
125typedef struct JitEntryInfo {
Bill Buzbee716f1202009-07-23 13:22:09 -0700126 unsigned int isMethodEntry:1;
127 unsigned int inlineCandidate:1;
128 unsigned int profileEnabled:1;
Bill Buzbee1b3da592011-02-03 07:38:22 -0800129 JitInstructionSetType instructionSet:3;
130 unsigned int profileOffset:5;
131 unsigned int unused:5;
Bill Buzbeed7269912009-11-10 14:31:32 -0800132 u2 chain; /* Index of next in chain */
Bill Buzbee716f1202009-07-23 13:22:09 -0700133} JitEntryInfo;
134
135typedef union JitEntryInfoUnion {
136 JitEntryInfo info;
137 volatile int infoWord;
138} JitEntryInfoUnion;
139
Ben Chengba4fc8b2009-06-01 13:00:29 -0700140typedef struct JitEntry {
Ben Cheng60c24f42010-01-04 12:29:56 -0800141 JitEntryInfoUnion u;
142 const u2* dPC; /* Dalvik code address */
143 void* codeAddress; /* Code address of native translation */
Ben Chengba4fc8b2009-06-01 13:00:29 -0700144} JitEntry;
145
buzbee9a3147c2011-03-02 15:43:48 -0800146void dvmCheckJit(const u2* pc, Thread* self);
Ben Chengcfdeca32011-01-14 11:36:46 -0800147void* dvmJitGetTraceAddr(const u2* dPC);
148void* dvmJitGetMethodAddr(const u2* dPC);
buzbee9a3147c2011-03-02 15:43:48 -0800149void dvmJitCheckTraceRequest(Thread* self);
Bill Buzbee27176222009-06-09 09:20:16 -0700150void dvmJitStopTranslationRequests(void);
151void dvmJitStats(void);
152bool dvmJitResizeJitTable(unsigned int size);
Ben Cheng60c24f42010-01-04 12:29:56 -0800153void dvmJitResetTable(void);
Bill Buzbee1b3da592011-02-03 07:38:22 -0800154struct JitEntry *dvmJitFindEntry(const u2* pc, bool isMethodEntry);
Bill Buzbee50a6bf22009-07-08 13:08:04 -0700155s8 dvmJitd2l(double d);
156s8 dvmJitf2l(float f);
buzbee2e152ba2010-12-15 16:32:35 -0800157void dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set,
Ben Chengcfdeca32011-01-14 11:36:46 -0800158 bool isMethodEntry, int profilePrefixSize);
buzbee9a3147c2011-03-02 15:43:48 -0800159void dvmJitEndTraceSelect(Thread* self, const u2* dPC);
buzbee2e152ba2010-12-15 16:32:35 -0800160JitTraceCounter_t *dvmJitNextTraceCounter(void);
161void dvmJitTraceProfilingOff(void);
162void dvmJitTraceProfilingOn(void);
163void dvmJitChangeProfileMode(TraceProfilingModes newState);
buzbeed82cebc2011-03-14 12:25:24 -0700164void dvmJitDumpTraceDesc(JitTraceDescription *trace);
buzbee9a3147c2011-03-02 15:43:48 -0800165void dvmJitUpdateState(void);
166void dvmJitResumeTranslation(Thread* self, const u2* pc, const u4* fp);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700167
168#endif /*_DALVIK_INTERP_JIT*/