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