blob: 6101f54ae4d8ca1807ba2347aee093fd7ff634c0 [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/*
86 * Entries in the JIT's address lookup hash table.
Bill Buzbee716f1202009-07-23 13:22:09 -070087 * Fields which may be updated by multiple threads packed into a
88 * single 32-bit word to allow use of atomic update.
Ben Chengba4fc8b2009-06-01 13:00:29 -070089 */
Bill Buzbee716f1202009-07-23 13:22:09 -070090
91typedef struct JitEntryInfo {
Bill Buzbeed7269912009-11-10 14:31:32 -080092 unsigned int traceConstruction:1; /* build underway? */
Bill Buzbee716f1202009-07-23 13:22:09 -070093 unsigned int isMethodEntry:1;
94 unsigned int inlineCandidate:1;
95 unsigned int profileEnabled:1;
96 JitInstructionSetType instructionSet:4;
97 unsigned int unused:8;
Bill Buzbeed7269912009-11-10 14:31:32 -080098 u2 chain; /* Index of next in chain */
Bill Buzbee716f1202009-07-23 13:22:09 -070099} JitEntryInfo;
100
101typedef union JitEntryInfoUnion {
102 JitEntryInfo info;
103 volatile int infoWord;
104} JitEntryInfoUnion;
105
Ben Chengba4fc8b2009-06-01 13:00:29 -0700106typedef struct JitEntry {
Ben Cheng60c24f42010-01-04 12:29:56 -0800107 JitEntryInfoUnion u;
108 const u2* dPC; /* Dalvik code address */
109 void* codeAddress; /* Code address of native translation */
Ben Chengba4fc8b2009-06-01 13:00:29 -0700110} JitEntry;
111
Ben Cheng7a2697d2010-06-07 13:44:23 -0700112int dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState,
113 const ClassObject *callsiteClass, const Method* curMethod);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700114void* dvmJitGetCodeAddr(const u2* dPC);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700115bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState);
Bill Buzbee27176222009-06-09 09:20:16 -0700116void dvmJitStopTranslationRequests(void);
117void dvmJitStats(void);
118bool dvmJitResizeJitTable(unsigned int size);
Ben Cheng60c24f42010-01-04 12:29:56 -0800119void dvmJitResetTable(void);
Bill Buzbee27176222009-06-09 09:20:16 -0700120struct JitEntry *dvmFindJitEntry(const u2* pc);
Bill Buzbee50a6bf22009-07-08 13:08:04 -0700121s8 dvmJitd2l(double d);
122s8 dvmJitf2l(float f);
Bill Buzbee716f1202009-07-23 13:22:09 -0700123void dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set);
Bill Buzbeed7269912009-11-10 14:31:32 -0800124void dvmJitAbortTraceSelect(InterpState* interpState);
Ben Chengba4fc8b2009-06-01 13:00:29 -0700125
126#endif /*_DALVIK_INTERP_JIT*/