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, ...) 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET(_target, ...) _target: 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_TARGET_END 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ugh */ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define STUB_HACK(x) 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Instruction framing. For a switch-oriented implementation this is 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * case/break, for a threaded implementation it's a goto label and an 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction fetch/computed goto. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Assumes the existence of "const u2* pc" and (for threaded operation) 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "u2 inst". 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef THREADED_INTERP 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define H(_op) &&op_##_op 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define HANDLE_OPCODE(_op) op_##_op: 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define FINISH(_offset) { \ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADJUST_PC(_offset); \ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project inst = FETCH(0); \ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_DEBUG_AND_PROF(); \ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CHECK_TRACKED_REFS(); \ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto *handlerTable[INST_INST(inst)]; \ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define HANDLE_OPCODE(_op) case _op: 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define FINISH(_offset) { ADJUST_PC(_offset); break; } 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define OP_END 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(WITH_TRACKREF_CHECKS) 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define CHECK_TRACKED_REFS() \ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmInterpCheckTrackedRefs(self, curMethod, debugTrackedRefStart) 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define CHECK_TRACKED_REFS() ((void)0) 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "goto" targets just turn into goto statements. The "arguments" are 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed through local variables. 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_exceptionThrown() goto exceptionThrown; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_returnFromMethod() goto returnFromMethod; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_invoke(_target, _methodCallRange) \ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project do { \ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project methodCallRange = _methodCallRange; \ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project goto _target; \ 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(false) 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* for this, the "args" are already in the locals */ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_invokeMethod(_methodCallRange, _methodToCall, _vsrc1, _vdst) goto invokeMethod; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_bail() goto bail; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_bail_switch() goto bail_switch; 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Periodically check for thread suspension. 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * While we're at it, see if a debugger has attached or the profiler has 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * started. If so, switch to a different "goto" table. 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define PERIODIC_CHECKS(_entryPoint, _pcadj) { \ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmCheckSuspendQuick(self); \ 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (NEED_INTERP_SWITCH(INTERP_TYPE)) { \ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADJUST_PC(_pcadj); \ 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project interpState->entryPoint = _entryPoint; \ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project LOGVV("threadid=%d: switch to %s ep=%d adj=%d\n", \ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project self->threadId, \ 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (interpState->nextMode == INTERP_STD) ? "STD" : "DBG", \ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (_entryPoint), (_pcadj)); \ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_bail_switch(); \ 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 88