stubdefs.cpp revision 9a3147c7412f4794434b4c2604aa2ba784867774
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In the C mterp stubs, "goto" is a function call followed immediately 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by a return. 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET_DECL(_target, ...) \ 79f601a917c8878204482c37aec7005054b6776fabuzbee void dvmMterp_##_target(Thread* self, ## __VA_ARGS__); 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97520ee7ff226e12e06818561b15741d2575072e3buzbee/* (void)xxx to quiet unused variable compiler warnings. */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET(_target, ...) \ 119f601a917c8878204482c37aec7005054b6776fabuzbee void dvmMterp_##_target(Thread* self, ## __VA_ARGS__) { \ 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 ref, vsrc1, vsrc2, vdst; \ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 inst = FETCH(0); \ 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const Method* methodToCall; \ 157520ee7ff226e12e06818561b15741d2575072e3buzbee StackSaveArea* debugSaveArea; \ 167520ee7ff226e12e06818561b15741d2575072e3buzbee (void)ref; (void)vsrc1; (void)vsrc2; (void)vdst; (void)inst; \ 177520ee7ff226e12e06818561b15741d2575072e3buzbee (void)methodToCall; (void)debugSaveArea; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET_END } 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 229f601a917c8878204482c37aec7005054b6776fabuzbee * Redefine what used to be local variable accesses into Thread struct 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * references. (These are undefined down in "footer.c".) 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 259f601a917c8878204482c37aec7005054b6776fabuzbee#define retval self->retval 269f601a917c8878204482c37aec7005054b6776fabuzbee#define pc self->interpSave.pc 279f601a917c8878204482c37aec7005054b6776fabuzbee#define fp self->interpSave.fp 289f601a917c8878204482c37aec7005054b6776fabuzbee#define curMethod self->interpSave.method 299f601a917c8878204482c37aec7005054b6776fabuzbee#define methodClassDex self->interpSave.methodClassDex 309f601a917c8878204482c37aec7005054b6776fabuzbee#define debugTrackedRefStart self->interpSave.debugTrackedRefStart 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ugh */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define STUB_HACK(x) x 349a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT) 359a3147c7412f4794434b4c2604aa2ba784867774buzbee#define JIT_STUB_HACK(x) x 369a3147c7412f4794434b4c2604aa2ba784867774buzbee#else 379a3147c7412f4794434b4c2604aa2ba784867774buzbee#define JIT_STUB_HACK(x) 389a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Opcode handler framing macros. Here, each opcode is a separate function 439f601a917c8878204482c37aec7005054b6776fabuzbee * that takes a "self" argument and returns void. We can't declare 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * these "static" because they may be called from an assembly stub. 457520ee7ff226e12e06818561b15741d2575072e3buzbee * (void)xxx to quiet unused variable compiler warnings. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define HANDLE_OPCODE(_op) \ 489f601a917c8878204482c37aec7005054b6776fabuzbee void dvmMterp_##_op(Thread* self) { \ 496aed656b06aa274948bf5c5f8f65873814554c13Andy McFadden u4 ref; \ 506aed656b06aa274948bf5c5f8f65873814554c13Andy McFadden u2 vsrc1, vsrc2, vdst; \ 517520ee7ff226e12e06818561b15741d2575072e3buzbee u2 inst = FETCH(0); \ 527520ee7ff226e12e06818561b15741d2575072e3buzbee (void)ref; (void)vsrc1; (void)vsrc2; (void)vdst; (void)inst; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OP_END } 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Like the "portable" FINISH, but don't reload "inst", and return to caller 589a3147c7412f4794434b4c2604aa2ba784867774buzbee * when done. Further, debugger/profiler checks are handled 599a3147c7412f4794434b4c2604aa2ba784867774buzbee * before handler execution in mterp, so we don't do them here either. 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 619a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT) 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FINISH(_offset) { \ 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADJUST_PC(_offset); \ 649a3147c7412f4794434b4c2604aa2ba784867774buzbee if (self->interpBreak.ctl.subMode & kSubModeJitTraceBuild) { \ 659a3147c7412f4794434b4c2604aa2ba784867774buzbee dvmCheckJit(pc, self); \ 669a3147c7412f4794434b4c2604aa2ba784867774buzbee } \ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; \ 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 699a3147c7412f4794434b4c2604aa2ba784867774buzbee#else 709a3147c7412f4794434b4c2604aa2ba784867774buzbee#define FINISH(_offset) { \ 719a3147c7412f4794434b4c2604aa2ba784867774buzbee ADJUST_PC(_offset); \ 729a3147c7412f4794434b4c2604aa2ba784867774buzbee return; \ 739a3147c7412f4794434b4c2604aa2ba784867774buzbee } 749a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "goto label" statements turn into function calls followed by 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return statements. Some of the functions take arguments, which in the 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * portable interpreter are handled by assigning values to globals. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_exceptionThrown() \ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 859f601a917c8878204482c37aec7005054b6776fabuzbee dvmMterp_exceptionThrown(self); \ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; \ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_returnFromMethod() \ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 919f601a917c8878204482c37aec7005054b6776fabuzbee dvmMterp_returnFromMethod(self); \ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; \ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 956af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden#define GOTO_invoke(_target, _methodCallRange, _jumboFormat) \ 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 979f601a917c8878204482c37aec7005054b6776fabuzbee dvmMterp_##_target(self, _methodCallRange, _jumboFormat); \ 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; \ 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_invokeMethod(_methodCallRange, _methodToCall, _vsrc1, _vdst) \ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 1039f601a917c8878204482c37aec7005054b6776fabuzbee dvmMterp_invokeMethod(self, _methodCallRange, _methodToCall, \ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project _vsrc1, _vdst); \ 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; \ 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1099a3147c7412f4794434b4c2604aa2ba784867774buzbee * As a special case, "goto bail" turns into a longjmp. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_bail() \ 1129f601a917c8878204482c37aec7005054b6776fabuzbee dvmMterpStdBail(self, false); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Periodically check for thread suspension. 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * While we're at it, see if a debugger has attached or the profiler has 1189a3147c7412f4794434b4c2604aa2ba784867774buzbee * started. 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1209a3147c7412f4794434b4c2604aa2ba784867774buzbee#define PERIODIC_CHECKS(_pcadj) { \ 12199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project if (dvmCheckSuspendQuick(self)) { \ 12299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project EXPORT_PC(); /* need for precise GC */ \ 12399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project dvmCheckSuspendPending(self); \ 12499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project } \ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126