blob: e86d548c6b5239c8575f1783b0d1903430791f11 [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 */
44 const void* fp; /* starting fp of jitted region */
Ben Chengd5adae12010-03-26 17:45:28 -070045 void* glue; /* starting glue of jitted region */
Ben Cheng7a2697d2010-06-07 13:44:23 -070046 SelfVerificationState jitExitState; /* exit point for JIT'ed code */
47 SelfVerificationState selfVerificationState; /* current SV running state */
Jeff Hao97319a82009-08-12 16:57:15 -070048 const u2* endPC; /* ending pc of jitted region */
49 void* shadowFP; /* pointer to fp in shadow space */
50 InterpState interpState; /* copy of interpState */
51 int* registerSpace; /* copy of register state */
52 int registerSpaceSize; /* current size of register space */
53 ShadowHeap heapSpace[HEAP_SPACE]; /* copy of heap space */
54 ShadowHeap* heapSpaceTail; /* tail pointer to heapSpace */
55 const void* endShadowFP; /* ending fp in shadow space */
56 InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */
57 int traceLength; /* counter for current trace length */
Ben Chengccd6c012009-10-15 14:52:45 -070058 const Method* method; /* starting method of jitted region */
Jeff Hao97319a82009-08-12 16:57:15 -070059} ShadowSpace;
60
61/*
62 * Self verification functions.
63 */
64void* dvmSelfVerificationShadowSpaceAlloc(Thread* self);
65void dvmSelfVerificationShadowSpaceFree(Thread* self);
66void* dvmSelfVerificationSaveState(const u2* pc, const void* fp,
Bill Buzbee9a8c75a2009-11-08 14:31:20 -080067 InterpState* interpState,
68 int targetTrace);
Jeff Hao97319a82009-08-12 16:57:15 -070069void* dvmSelfVerificationRestoreState(const u2* pc, const void* fp,
70 SelfVerificationState exitPoint);
71#endif
72
Ben Chengba4fc8b2009-06-01 13:00:29 -070073/*
74 * JitTable hash function.
75 */
Bill Buzbee27176222009-06-09 09:20:16 -070076
77static inline u4 dvmJitHashMask( const u2* p, u4 mask ) {
78 return ((((u4)p>>12)^(u4)p)>>1) & (mask);
Ben Chengba4fc8b2009-06-01 13:00:29 -070079}
80
Bill Buzbee27176222009-06-09 09:20:16 -070081static inline u4 dvmJitHash( const u2* p ) {
82 return dvmJitHashMask( p, gDvmJit.jitTableMask );
83}
84
Ben Chengba4fc8b2009-06-01 13:00:29 -070085/*
buzbee2e152ba2010-12-15 16:32:35 -080086 * The width of the chain field in JitEntryInfo sets the upper
87 * bound on the number of translations. Be careful if changing
88 * the size of JitEntry struct - the Dalvik PC to JitEntry
89 * hash functions have built-in knowledge of the size.
90 */
91#define JIT_ENTRY_CHAIN_WIDTH 2
92#define JIT_MAX_ENTRIES (1 << (JIT_ENTRY_CHAIN_WIDTH * 8))
93
94/*
95 * The trace profiling counters are allocated in blocks and individual
96 * counters must not move so long as any referencing trace exists.
97 */
98#define JIT_PROF_BLOCK_ENTRIES 1024
99#define JIT_PROF_BLOCK_BUCKETS (JIT_MAX_ENTRIES / JIT_PROF_BLOCK_ENTRIES)
100
101typedef s4 JitTraceCounter_t;
102
103typedef struct JitTraceProfCounters {
104 unsigned int next;
105 JitTraceCounter_t *buckets[JIT_PROF_BLOCK_BUCKETS];
106} JitTraceProfCounters;
107
108/*
Ben Chengba4fc8b2009-06-01 13:00:29 -0700109 * Entries in the JIT's address lookup hash table.
Bill Buzbee716f1202009-07-23 13:22:09 -0700110 * Fields which may be updated by multiple threads packed into a
111 * single 32-bit word to allow use of atomic update.
Ben Chengba4fc8b2009-06-01 13:00:29 -0700112 */
Bill Buzbee716f1202009-07-23 13:22:09 -0700113
114typedef struct JitEntryInfo {
Bill Buzbeed7269912009-11-10 14:31:32 -0800115 unsigned int traceConstruction:1; /* build underway? */
Bill Buzbee716f1202009-07-23 13:22:09 -0700116 unsigned int isMethodEntry:1;
117 unsigned int inlineCandidate:1;
118 unsigned int profileEnabled:1;
119 JitInstructionSetType instructionSet:4;
buzbee2e152ba2010-12-15 16:32:35 -0800120 unsigned int profileOffset:8;
Bill Buzbeed7269912009-11-10 14:31:32 -0800121 u2 chain; /* Index of next in chain */
Bill Buzbee716f1202009-07-23 13:22:09 -0700122} JitEntryInfo;
123
124typedef union JitEntryInfoUnion {
125 JitEntryInfo info;
126 volatile int infoWord;
127} JitEntryInfoUnion;
128
Ben Chengba4fc8b2009-06-01 13:00:29 -0700129typedef struct JitEntry {
Ben Cheng60c24f42010-01-04 12:29:56 -0800130 JitEntryInfoUnion u;
131 const u2* dPC; /* Dalvik code address */
132 void* codeAddress; /* Code address of native translation */
Ben Chengba4fc8b2009-06-01 13:00:29 -0700133} JitEntry;
134
Ben Cheng7a2697d2010-06-07 13:44:23 -0700135int dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState,
136 const ClassObject *callsiteClass, const Method* curMethod);
Ben Chengcfdeca32011-01-14 11:36:46 -0800137void* dvmJitGetTraceAddr(const u2* dPC);
138void* dvmJitGetMethodAddr(const u2* dPC);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700139bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState);
Bill Buzbee27176222009-06-09 09:20:16 -0700140void dvmJitStopTranslationRequests(void);
141void dvmJitStats(void);
142bool dvmJitResizeJitTable(unsigned int size);
Ben Cheng60c24f42010-01-04 12:29:56 -0800143void dvmJitResetTable(void);
Bill Buzbee27176222009-06-09 09:20:16 -0700144struct JitEntry *dvmFindJitEntry(const u2* pc);
Bill Buzbee50a6bf22009-07-08 13:08:04 -0700145s8 dvmJitd2l(double d);
146s8 dvmJitf2l(float f);
buzbee2e152ba2010-12-15 16:32:35 -0800147void dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set,
Ben Chengcfdeca32011-01-14 11:36:46 -0800148 bool isMethodEntry, int profilePrefixSize);
Bill Buzbeed7269912009-11-10 14:31:32 -0800149void dvmJitAbortTraceSelect(InterpState* interpState);
buzbee2e152ba2010-12-15 16:32:35 -0800150JitTraceCounter_t *dvmJitNextTraceCounter(void);
151void dvmJitTraceProfilingOff(void);
152void dvmJitTraceProfilingOn(void);
153void dvmJitChangeProfileMode(TraceProfilingModes newState);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700154
155#endif /*_DALVIK_INTERP_JIT*/