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