1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dalvik interpreter definitions.  These are internal to the interpreter.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This includes defines, types, function declarations, and inline functions
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that are common to all interpreter implementations.
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Functions and globals declared here are defined in Interp.c.
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
24375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_INTERP_DEFS_H_
25375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_INTERP_DEFS_H_
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
29342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee * Size of save area for callee-save FP regs, which are not automatically
30342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee * saved by interpreter main because it doesn't use them (but Jit'd code
31342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee * may). Save/restore routine is defined by target, and size should
32342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee * be >= max needed by any target.
33342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee */
34342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee#define JIT_CALLEE_SAVE_DOUBLE_COUNT 8
35342806dae77556290dfe0760e6fe3117d812c7baBill Buzbee
36ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
37ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
399f601a917c8878204482c37aec7005054b6776fabuzbee * Portable interpreter.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
419a3147c7412f4794434b4c2604aa2ba784867774buzbeeextern void dvmInterpretPortable(Thread* self);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "mterp" interpreter.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
469a3147c7412f4794434b4c2604aa2ba784867774buzbeeextern void dvmMterpStd(Thread* self);
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the "this" pointer from the current frame.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetThisPtr(const Method* method, const u4* fp);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that our tracked local references are valid.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmInterpCheckTrackedRefs(Thread* self, const Method* method,
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int debugTrackedRefStart);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Process switch statement.
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
62d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" s4 dvmInterpHandlePackedSwitch(const u2* switchData, s4 testVal);
63d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" s4 dvmInterpHandleSparseSwitch(const u2* switchData, s4 testVal);
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Process fill-array-data.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
68d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" bool dvmInterpHandleFillArrayData(ArrayObject* arrayObject,
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                  const u2* arrayData);
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find an interface method.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMethod* dvmInterpFindInterfaceMethod(ClassObject* thisClass, u4 methodIdx,
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const Method* method, DvmDex* methodClassDex);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
789a3147c7412f4794434b4c2604aa2ba784867774buzbee * Determine if the debugger or profiler is currently active.
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
809a3147c7412f4794434b4c2604aa2ba784867774buzbeestatic inline bool dvmDebuggerOrProfilerActive()
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
829a3147c7412f4794434b4c2604aa2ba784867774buzbee    return gDvm.debuggerActive || gDvm.activeProfilers != 0;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Determine if the jit, debugger or profiler is currently active.  Used when
88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * selecting which interpreter to switch to.
89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
905540f6e420ffab7bb0c39dc508bdc3a2e0d67507Bill Buzbeestatic inline bool dvmJitDebuggerOrProfilerActive()
91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{
92cb3081f675109049e63380170b60871e8275f9a8buzbee    return (gDvmJit.pProfTable != NULL) || dvmDebuggerOrProfilerActive();
93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng}
941a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng
951a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng/*
961a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng * Hide the translations and stick with the interpreter as long as one of the
971a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng * following conditions is true.
981a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng */
991a7b9d7703297358d6b2276dff02eaff6586a6fdBen Chengstatic inline bool dvmJitHideTranslation()
1001a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng{
1011a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng    return (gDvm.sumThreadSuspendCount != 0) ||
1021a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng           (gDvmJit.codeCacheFull == true) ||
1031a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng           (gDvmJit.pProfTable == NULL);
1041a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng}
1051a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng
106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1080c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen/*
1090c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * Construct an s4 from two consecutive half-words of switch data.
1100c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * This needs to check endianness because the DEX optimizer only swaps
1110c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * half-words in instruction stream.
1120c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen *
1130c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * "switchData" must be 32-bit aligned.
1140c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen */
1150c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#if __BYTE_ORDER == __LITTLE_ENDIAN
1160c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenstatic inline s4 s4FromSwitchData(const void* switchData) {
1170c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    return *(s4*) switchData;
1180c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen}
1190c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#else
1200c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenstatic inline s4 s4FromSwitchData(const void* switchData) {
1210c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    u2* data = switchData;
1220c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen    return data[0] | (((s4) data[1]) << 16);
1230c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen}
1240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif
1250c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen
126375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_INTERP_DEFS_H_
127