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