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 * Jit control 18 */ 19 #ifndef _DALVIK_INTERP_JIT 20 #define _DALVIK_INTERP_JIT 21 22 #include "InterpDefs.h" 23 #include "mterp/common/jit-config.h" 24 25 #define JIT_MAX_TRACE_LEN 100 26 27 #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 32 typedef struct ShadowHeap { 33 int addr; 34 int data; 35 } ShadowHeap; 36 37 typedef struct InstructionTrace { 38 int addr; 39 DecodedInstruction decInsn; 40 } InstructionTrace; 41 42 typedef struct ShadowSpace { 43 const u2* startPC; /* starting pc of jitted region */ 44 const void* fp; /* starting fp of jitted region */ 45 void* glue; /* starting glue of jitted region */ 46 SelfVerificationState jitExitState; /* exit point for JIT'ed code */ 47 SelfVerificationState selfVerificationState; /* current SV running state */ 48 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 */ 58 const Method* method; /* starting method of jitted region */ 59 } ShadowSpace; 60 61 /* 62 * Self verification functions. 63 */ 64 void* dvmSelfVerificationShadowSpaceAlloc(Thread* self); 65 void dvmSelfVerificationShadowSpaceFree(Thread* self); 66 void* dvmSelfVerificationSaveState(const u2* pc, const void* fp, 67 InterpState* interpState, 68 int targetTrace); 69 void* dvmSelfVerificationRestoreState(const u2* pc, const void* fp, 70 SelfVerificationState exitPoint); 71 #endif 72 73 /* 74 * JitTable hash function. 75 */ 76 77 static inline u4 dvmJitHashMask( const u2* p, u4 mask ) { 78 return ((((u4)p>>12)^(u4)p)>>1) & (mask); 79 } 80 81 static inline u4 dvmJitHash( const u2* p ) { 82 return dvmJitHashMask( p, gDvmJit.jitTableMask ); 83 } 84 85 /* 86 * Entries in the JIT's address lookup hash table. 87 * Fields which may be updated by multiple threads packed into a 88 * single 32-bit word to allow use of atomic update. 89 */ 90 91 typedef struct JitEntryInfo { 92 unsigned int traceConstruction:1; /* build underway? */ 93 unsigned int isMethodEntry:1; 94 unsigned int inlineCandidate:1; 95 unsigned int profileEnabled:1; 96 JitInstructionSetType instructionSet:4; 97 unsigned int unused:8; 98 u2 chain; /* Index of next in chain */ 99 } JitEntryInfo; 100 101 typedef union JitEntryInfoUnion { 102 JitEntryInfo info; 103 volatile int infoWord; 104 } JitEntryInfoUnion; 105 106 typedef struct JitEntry { 107 JitEntryInfoUnion u; 108 const u2* dPC; /* Dalvik code address */ 109 void* codeAddress; /* Code address of native translation */ 110 } JitEntry; 111 112 int dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState, 113 const ClassObject *callsiteClass, const Method* curMethod); 114 void* dvmJitGetCodeAddr(const u2* dPC); 115 bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState); 116 void dvmJitStopTranslationRequests(void); 117 void dvmJitStats(void); 118 bool dvmJitResizeJitTable(unsigned int size); 119 void dvmJitResetTable(void); 120 struct JitEntry *dvmFindJitEntry(const u2* pc); 121 s8 dvmJitd2l(double d); 122 s8 dvmJitf2l(float f); 123 void dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set); 124 void dvmJitAbortTraceSelect(InterpState* interpState); 125 126 #endif /*_DALVIK_INTERP_JIT*/ 127