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