Jit.h revision 7a2697d327936e20ef5484f7819e2e4bf91c891f
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 */ 4497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const void* fp; /* starting fp of jitted region */ 45d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng void* glue; /* starting glue of jitted region */ 467a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState jitExitState; /* exit point for JIT'ed code */ 477a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng SelfVerificationState selfVerificationState; /* current SV running state */ 4897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const u2* endPC; /* ending pc of jitted region */ 4997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao void* shadowFP; /* pointer to fp in shadow space */ 5097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao InterpState interpState; /* copy of interpState */ 5197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int* registerSpace; /* copy of register state */ 5297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int registerSpaceSize; /* current size of register space */ 5397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap heapSpace[HEAP_SPACE]; /* copy of heap space */ 5497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao ShadowHeap* heapSpaceTail; /* tail pointer to heapSpace */ 5597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao const void* endShadowFP; /* ending fp in shadow space */ 5697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao InstructionTrace trace[JIT_MAX_TRACE_LEN]; /* opcode trace for debugging */ 5797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao int traceLength; /* counter for current trace length */ 58ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng const Method* method; /* starting method of jitted region */ 5997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao} ShadowSpace; 6097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 6197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/* 6297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Self verification functions. 6397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */ 6497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid* dvmSelfVerificationShadowSpaceAlloc(Thread* self); 6597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid dvmSelfVerificationShadowSpaceFree(Thread* self); 6697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid* dvmSelfVerificationSaveState(const u2* pc, const void* fp, 679a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee InterpState* interpState, 689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee int targetTrace); 6997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Haovoid* dvmSelfVerificationRestoreState(const u2* pc, const void* fp, 7097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao SelfVerificationState exitPoint); 7197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 7297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 73ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * JitTable hash function. 75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 762717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 772717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestatic inline u4 dvmJitHashMask( const u2* p, u4 mask ) { 782717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return ((((u4)p>>12)^(u4)p)>>1) & (mask); 792717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee} 802717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 81ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic inline u4 dvmJitHash( const u2* p ) { 822717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return dvmJitHashMask( p, gDvmJit.jitTableMask ); 83ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Entries in the JIT's address lookup hash table. 87716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Fields which may be updated by multiple threads packed into a 88716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * single 32-bit word to allow use of atomic update. 89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 90716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 91716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef struct JitEntryInfo { 92d726991ba52466cde88e37aba4de2395b62477faBill Buzbee unsigned int traceConstruction:1; /* build underway? */ 93716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int isMethodEntry:1; 94716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int inlineCandidate:1; 95716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int profileEnabled:1; 96716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitInstructionSetType instructionSet:4; 97716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int unused:8; 98d726991ba52466cde88e37aba4de2395b62477faBill Buzbee u2 chain; /* Index of next in chain */ 99716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfo; 100716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 101716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef union JitEntryInfoUnion { 102716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitEntryInfo info; 103716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee volatile int infoWord; 104716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfoUnion; 105716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengtypedef struct JitEntry { 10760c24f436d603c564d5351a6f81821f12635733cBen Cheng JitEntryInfoUnion u; 10860c24f436d603c564d5351a6f81821f12635733cBen Cheng const u2* dPC; /* Dalvik code address */ 10960c24f436d603c564d5351a6f81821f12635733cBen Cheng void* codeAddress; /* Code address of native translation */ 110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} JitEntry; 111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 1127a2697d327936e20ef5484f7819e2e4bf91c891fBen Chengint dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState, 1137a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng const ClassObject *callsiteClass, const Method* curMethod); 114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid* dvmJitGetCodeAddr(const u2* dPC); 115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengbool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState); 1162717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStopTranslationRequests(void); 1172717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStats(void); 1182717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeebool dvmJitResizeJitTable(unsigned int size); 11960c24f436d603c564d5351a6f81821f12635733cBen Chengvoid dvmJitResetTable(void); 1202717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestruct JitEntry *dvmFindJitEntry(const u2* pc); 12150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitd2l(double d); 12250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitf2l(float f); 123716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeevoid dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set); 124d726991ba52466cde88e37aba4de2395b62477faBill Buzbeevoid dvmJitAbortTraceSelect(InterpState* interpState); 125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /*_DALVIK_INTERP_JIT*/ 127