Jit.h revision d82cebc13cf8ff110f2ad1a299782c9d1e8aada6
1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at 7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software 11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License. 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Jit control 18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#ifndef _DALVIK_INTERP_JIT 20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define _DALVIK_INTERP_JIT 21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "InterpDefs.h" 237b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "mterp/common/jit-config.h" 241efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 251efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng#define JIT_MAX_TRACE_LEN 100 261efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 2797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined (WITH_SELF_VERIFICATION) 2897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 2997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#define REG_SPACE 256 /* default size of shadow space */ 3097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#define HEAP_SPACE JIT_MAX_TRACE_LEN /* default size of heap space */ 3197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 3297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haotypedef struct ShadowHeap { 3397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int addr; 3497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int data; 3597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao} ShadowHeap; 3697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 3797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haotypedef struct InstructionTrace { 3897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int addr; 39bcdc1ded149faa8dec51778db4047cae0862027fBen Cheng DecodedInstruction decInsn; 4097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao} InstructionTrace; 4197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 4297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haotypedef struct ShadowSpace { 4397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const u2* startPC; /* starting pc of jitted region */ 449f601a917c8878204482c37aec7005054b6776fabuzbee u4* fp; /* starting fp of jitted region */ 459f601a917c8878204482c37aec7005054b6776fabuzbee const Method *method; 469f601a917c8878204482c37aec7005054b6776fabuzbee DvmDex* methodClassDex; 479f601a917c8878204482c37aec7005054b6776fabuzbee JValue retval; 489f601a917c8878204482c37aec7005054b6776fabuzbee const u1* interpStackEnd; 497a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState jitExitState; /* exit point for JIT'ed code */ 507a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState selfVerificationState; /* current SV running state */ 5197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const u2* endPC; /* ending pc of jitted region */ 5297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao void* shadowFP; /* pointer to fp in shadow space */ 5397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int* registerSpace; /* copy of register state */ 5497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int registerSpaceSize; /* current size of register space */ 5597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap heapSpace[HEAP_SPACE]; /* copy of heap space */ 5697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap* heapSpaceTail; /* tail pointer to heapSpace */ 5797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const void* endShadowFP; /* ending fp in shadow space */ 5897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */ 5997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int traceLength; /* counter for current trace length */ 6097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao} ShadowSpace; 6197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 6297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 6397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Self verification functions. 6497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 6597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid* dvmSelfVerificationShadowSpaceAlloc(Thread* self); 6697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid dvmSelfVerificationShadowSpaceFree(Thread* self); 679f601a917c8878204482c37aec7005054b6776fabuzbeevoid* dvmSelfVerificationSaveState(const u2* pc, u4* fp, 689f601a917c8878204482c37aec7005054b6776fabuzbee Thread* self, 699a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee int targetTrace); 709f601a917c8878204482c37aec7005054b6776fabuzbeevoid* dvmSelfVerificationRestoreState(const u2* pc, u4* fp, 719f601a917c8878204482c37aec7005054b6776fabuzbee SelfVerificationState exitPoint, 729f601a917c8878204482c37aec7005054b6776fabuzbee Thread *self); 7397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 7497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 76385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng * Offsets for metadata in the trace run array from the trace that ends with 77385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng * invoke instructions. 78385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng */ 79385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CLASS_DESC 1 80385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CLASS_LOADER 2 81385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng#define JIT_TRACE_CUR_METHOD 3 82385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng 83385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng/* 84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * JitTable hash function. 85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 862717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 872717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestatic inline u4 dvmJitHashMask( const u2* p, u4 mask ) { 882717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return ((((u4)p>>12)^(u4)p)>>1) & (mask); 892717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee} 902717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic inline u4 dvmJitHash( const u2* p ) { 922717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return dvmJitHashMask( p, gDvmJit.jitTableMask ); 93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 95ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 962e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * The width of the chain field in JitEntryInfo sets the upper 972e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * bound on the number of translations. Be careful if changing 982e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * the size of JitEntry struct - the Dalvik PC to JitEntry 992e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * hash functions have built-in knowledge of the size. 1002e152baec01433de9c63633ebc6f4adf1cea3a87buzbee */ 1012e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_ENTRY_CHAIN_WIDTH 2 1022e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_MAX_ENTRIES (1 << (JIT_ENTRY_CHAIN_WIDTH * 8)) 1032e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1042e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* 1052e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * The trace profiling counters are allocated in blocks and individual 1062e152baec01433de9c63633ebc6f4adf1cea3a87buzbee * counters must not move so long as any referencing trace exists. 1072e152baec01433de9c63633ebc6f4adf1cea3a87buzbee */ 1082e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_PROF_BLOCK_ENTRIES 1024 1092e152baec01433de9c63633ebc6f4adf1cea3a87buzbee#define JIT_PROF_BLOCK_BUCKETS (JIT_MAX_ENTRIES / JIT_PROF_BLOCK_ENTRIES) 1102e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1112e152baec01433de9c63633ebc6f4adf1cea3a87buzbeetypedef s4 JitTraceCounter_t; 1122e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1132e152baec01433de9c63633ebc6f4adf1cea3a87buzbeetypedef struct JitTraceProfCounters { 1142e152baec01433de9c63633ebc6f4adf1cea3a87buzbee unsigned int next; 1152e152baec01433de9c63633ebc6f4adf1cea3a87buzbee JitTraceCounter_t *buckets[JIT_PROF_BLOCK_BUCKETS]; 1162e152baec01433de9c63633ebc6f4adf1cea3a87buzbee} JitTraceProfCounters; 1172e152baec01433de9c63633ebc6f4adf1cea3a87buzbee 1182e152baec01433de9c63633ebc6f4adf1cea3a87buzbee/* 119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Entries in the JIT's address lookup hash table. 120716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Fields which may be updated by multiple threads packed into a 121716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * single 32-bit word to allow use of atomic update. 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 123716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 124716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef struct JitEntryInfo { 125716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int isMethodEntry:1; 126716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int inlineCandidate:1; 127716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int profileEnabled:1; 1281b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee JitInstructionSetType instructionSet:3; 1291b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee unsigned int profileOffset:5; 1301b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbee unsigned int unused:5; 131d726991ba52466cde88e37aba4de2395b62477faBill Buzbee u2 chain; /* Index of next in chain */ 132716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfo; 133716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 134716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef union JitEntryInfoUnion { 135716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitEntryInfo info; 136716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee volatile int infoWord; 137716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfoUnion; 138716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengtypedef struct JitEntry { 14060c24f436d603c564d5351a6f81821f12635733cBen Cheng JitEntryInfoUnion u; 14160c24f436d603c564d5351a6f81821f12635733cBen Cheng const u2* dPC; /* Dalvik code address */ 14260c24f436d603c564d5351a6f81821f12635733cBen Cheng void* codeAddress; /* Code address of native translation */ 143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} JitEntry; 144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1459f601a917c8878204482c37aec7005054b6776fabuzbeeint dvmCheckJit(const u2* pc, Thread* self, const ClassObject *callsiteClass, 1469f601a917c8878204482c37aec7005054b6776fabuzbee const Method* curMethod); 147cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Chengvoid* dvmJitGetTraceAddr(const u2* dPC); 148cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Chengvoid* dvmJitGetMethodAddr(const u2* dPC); 1499f601a917c8878204482c37aec7005054b6776fabuzbeebool dvmJitCheckTraceRequest(Thread* self); 1502717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStopTranslationRequests(void); 1512717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStats(void); 1522717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeebool dvmJitResizeJitTable(unsigned int size); 15360c24f436d603c564d5351a6f81821f12635733cBen Chengvoid dvmJitResetTable(void); 1541b3da59fff0c63770e10684e243a36f3d0218637Bill Buzbeestruct JitEntry *dvmJitFindEntry(const u2* pc, bool isMethodEntry); 15550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitd2l(double d); 15650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitf2l(float f); 1572e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set, 158cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng bool isMethodEntry, int profilePrefixSize); 1599f601a917c8878204482c37aec7005054b6776fabuzbeevoid dvmJitEndTraceSelect(Thread* self); 1602e152baec01433de9c63633ebc6f4adf1cea3a87buzbeeJitTraceCounter_t *dvmJitNextTraceCounter(void); 1612e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitTraceProfilingOff(void); 1622e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitTraceProfilingOn(void); 1632e152baec01433de9c63633ebc6f4adf1cea3a87buzbeevoid dvmJitChangeProfileMode(TraceProfilingModes newState); 164d82cebc13cf8ff110f2ad1a299782c9d1e8aada6buzbeevoid dvmJitDumpTraceDesc(JitTraceDescription *trace); 165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /*_DALVIK_INTERP_JIT*/ 167