typedef gpointer MonoInterpFrameHandle;
-struct _MonoEECallbacks {
- void (*entry_from_trampoline) (gpointer ccontext, gpointer imethod);
- void (*to_native_trampoline) (gpointer addr, gpointer ccontext);
- gpointer (*create_method_pointer) (MonoMethod *method, gboolean compile, MonoError *error);
- MonoFtnDesc *(*create_method_pointer_llvmonly) (MonoMethod *method, gboolean unbox, MonoError *error);
- MonoObject* (*runtime_invoke) (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error);
- void (*init_delegate) (MonoDelegate *del, MonoError *error);
- void (*delegate_ctor) (MonoObjectHandle this_obj, MonoObjectHandle target, gpointer addr, MonoError *error);
- gpointer (*get_remoting_invoke) (MonoMethod *method, gpointer imethod, MonoError *error);
- void (*set_resume_state) (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip);
- gboolean (*run_finally) (StackFrameInfo *frame, int clause_index, gpointer handler_ip, gpointer handler_ip_end);
- gboolean (*run_filter) (StackFrameInfo *frame, MonoException *ex, int clause_index, gpointer handler_ip, gpointer handler_ip_end);
- void (*frame_iter_init) (MonoInterpStackIter *iter, gpointer interp_exit_data);
- gboolean (*frame_iter_next) (MonoInterpStackIter *iter, StackFrameInfo *frame);
- MonoJitInfo* (*find_jit_info) (MonoDomain *domain, MonoMethod *method);
- void (*set_breakpoint) (MonoJitInfo *jinfo, gpointer ip);
- void (*clear_breakpoint) (MonoJitInfo *jinfo, gpointer ip);
- MonoJitInfo* (*frame_get_jit_info) (MonoInterpFrameHandle frame);
- gpointer (*frame_get_ip) (MonoInterpFrameHandle frame);
- gpointer (*frame_get_arg) (MonoInterpFrameHandle frame, int pos);
- gpointer (*frame_get_local) (MonoInterpFrameHandle frame, int pos);
- gpointer (*frame_get_this) (MonoInterpFrameHandle frame);
- void (*frame_arg_to_data) (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data);
- void (*data_to_frame_arg) (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data);
- gpointer (*frame_arg_to_storage) (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index);
- void (*frame_arg_set_storage) (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer storage);
- MonoInterpFrameHandle (*frame_get_parent) (MonoInterpFrameHandle frame);
- void (*start_single_stepping) (void);
- void (*stop_single_stepping) (void);
-};
+#define MONO_EE_CALLBACKS \
+ MONO_EE_CALLBACK (void, entry_from_trampoline, (gpointer ccontext, gpointer imethod)) \
+ MONO_EE_CALLBACK (void, to_native_trampoline, (gpointer addr, gpointer ccontext)) \
+ MONO_EE_CALLBACK (gpointer, create_method_pointer, (MonoMethod *method, gboolean compile, MonoError *error)) \
+ MONO_EE_CALLBACK (MonoFtnDesc*, create_method_pointer_llvmonly, (MonoMethod *method, gboolean unbox, MonoError *error)) \
+ MONO_EE_CALLBACK (MonoObject*, runtime_invoke, (MonoMethod *method, void *obj, void **params, MonoObject **exc, MonoError *error)) \
+ MONO_EE_CALLBACK (void, init_delegate, (MonoDelegate *del, MonoError *error)) \
+ MONO_EE_CALLBACK (void, delegate_ctor, (MonoObjectHandle this_obj, MonoObjectHandle target, gpointer addr, MonoError *error)) \
+ MONO_EE_CALLBACK (gpointer, get_remoting_invoke, (MonoMethod *method, gpointer imethod, MonoError *error)) \
+ MONO_EE_CALLBACK (void, set_resume_state, (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip)) \
+ MONO_EE_CALLBACK (gboolean, run_finally, (StackFrameInfo *frame, int clause_index, gpointer handler_ip, gpointer handler_ip_end)) \
+ MONO_EE_CALLBACK (gboolean, run_filter, (StackFrameInfo *frame, MonoException *ex, int clause_index, gpointer handler_ip, gpointer handler_ip_end)) \
+ MONO_EE_CALLBACK (void, frame_iter_init, (MonoInterpStackIter *iter, gpointer interp_exit_data)) \
+ MONO_EE_CALLBACK (gboolean, frame_iter_next, (MonoInterpStackIter *iter, StackFrameInfo *frame)) \
+ MONO_EE_CALLBACK (MonoJitInfo*, find_jit_info, (MonoDomain *domain, MonoMethod *method)) \
+ MONO_EE_CALLBACK (void, set_breakpoint, (MonoJitInfo *jinfo, gpointer ip)) \
+ MONO_EE_CALLBACK (void, clear_breakpoint, (MonoJitInfo *jinfo, gpointer ip)) \
+ MONO_EE_CALLBACK (MonoJitInfo*, frame_get_jit_info, (MonoInterpFrameHandle frame)) \
+ MONO_EE_CALLBACK (gpointer, frame_get_ip, (MonoInterpFrameHandle frame)) \
+ MONO_EE_CALLBACK (gpointer, frame_get_arg, (MonoInterpFrameHandle frame, int pos)) \
+ MONO_EE_CALLBACK (gpointer, frame_get_local, (MonoInterpFrameHandle frame, int pos)) \
+ MONO_EE_CALLBACK (gpointer, frame_get_this, (MonoInterpFrameHandle frame)) \
+ MONO_EE_CALLBACK (void, frame_arg_to_data, (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data)) \
+ MONO_EE_CALLBACK (void, data_to_frame_arg, (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data)) \
+ MONO_EE_CALLBACK (gpointer, frame_arg_to_storage, (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index)) \
+ MONO_EE_CALLBACK (void, frame_arg_set_storage, (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer storage)) \
+ MONO_EE_CALLBACK (MonoInterpFrameHandle, frame_get_parent, (MonoInterpFrameHandle frame)) \
+ MONO_EE_CALLBACK (void, start_single_stepping, (void)) \
+ MONO_EE_CALLBACK (void, stop_single_stepping, (void)) \
+
+typedef struct _MonoEECallbacks {
+
+#undef MONO_EE_CALLBACK
+#define MONO_EE_CALLBACK(ret, name, sig) ret (*name) sig;
+
+ MONO_EE_CALLBACKS
-typedef struct _MonoEECallbacks MonoEECallbacks;
+} MonoEECallbacks;
#endif /* __MONO_EE_H__ */
g_assert_not_reached ();
}
+static void
+stub_entry_from_trampoline (gpointer ccontext, gpointer imethod)
+{
+ g_assert_not_reached ();
+}
+
+static void
+stub_to_native_trampoline (gpointer addr, gpointer ccontext)
+{
+ g_assert_not_reached ();
+}
+
+static void
+stub_frame_arg_to_data (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data)
+{
+g_assert_not_reached ();
+}
+
+static void
+stub_data_to_frame_arg (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer data)
+{
+ g_assert_not_reached ();
+}
+
+static gpointer
+stub_frame_arg_to_storage (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index)
+{
+ g_assert_not_reached ();
+ return NULL;
+}
+
+static void
+stub_frame_arg_set_storage (MonoInterpFrameHandle frame, MonoMethodSignature *sig, int index, gpointer storage)
+{
+ g_assert_not_reached ();
+}
+
+#undef MONO_EE_CALLBACK
+#define MONO_EE_CALLBACK(ret, name, sig) stub_ ## name,
+
+static const MonoEECallbacks mono_interp_stub_callbacks = {
+ MONO_EE_CALLBACKS
+};
+
void
mono_interp_stub_init (void)
{
- if (mini_get_interp_callbacks ()->create_method_pointer)
+ if (mini_get_interp_callbacks ())
/* already initialized */
return;
- MonoEECallbacks c;
- c.create_method_pointer = stub_create_method_pointer;
- c.create_method_pointer_llvmonly = stub_create_method_pointer_llvmonly;
- c.runtime_invoke = stub_runtime_invoke;
- c.init_delegate = stub_init_delegate;
- c.get_remoting_invoke = stub_get_remoting_invoke;
- c.set_resume_state = stub_set_resume_state;
- c.run_finally = stub_run_finally;
- c.run_filter = stub_run_filter;
- c.frame_iter_init = stub_frame_iter_init;
- c.frame_iter_next = stub_frame_iter_next;
- c.find_jit_info = stub_find_jit_info;
- c.set_breakpoint = stub_set_breakpoint;
- c.clear_breakpoint = stub_clear_breakpoint;
- c.frame_get_jit_info = stub_frame_get_jit_info;
- c.frame_get_ip = stub_frame_get_ip;
- c.frame_get_arg = stub_frame_get_arg;
- c.frame_get_local = stub_frame_get_local;
- c.frame_get_this = stub_frame_get_this;
- c.frame_get_parent = stub_frame_get_parent;
- c.start_single_stepping = stub_start_single_stepping;
- c.stop_single_stepping = stub_stop_single_stepping;
- c.delegate_ctor = stub_delegate_ctor;
- mini_install_interp_callbacks (&c);
+ mini_install_interp_callbacks (&mono_interp_stub_callbacks);
}
/* Write back the return value */
mono_arch_set_native_call_context_ret (ccontext, &frame, sig);
}
+
+#else
+
+static void
+interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untyped)
+{
+ g_assert_not_reached ();
+}
+
#endif /* MONO_ARCH_HAVE_INTERP_ENTRY_TRAMPOLINE */
static InterpMethod*
mono_counters_register ("Inline failures", MONO_COUNTER_INTERP | MONO_COUNTER_INT, &mono_interp_stats.inline_failures);
}
+#undef MONO_EE_CALLBACK
+#define MONO_EE_CALLBACK(ret, name, sig) interp_ ## name,
+
+static const MonoEECallbacks mono_interp_callbacks = {
+ MONO_EE_CALLBACKS
+};
+
void
mono_ee_interp_init (const char *opts)
{
mono_interp_opt &= ~INTERP_OPT_INLINE;
mono_interp_transform_init ();
- MonoEECallbacks c;
-#ifdef MONO_ARCH_HAVE_INTERP_ENTRY_TRAMPOLINE
- c.entry_from_trampoline = interp_entry_from_trampoline;
-#endif
- c.to_native_trampoline = interp_to_native_trampoline;
- c.create_method_pointer = interp_create_method_pointer;
- c.create_method_pointer_llvmonly = interp_create_method_pointer_llvmonly;
- c.runtime_invoke = interp_runtime_invoke;
- c.init_delegate = interp_init_delegate;
- c.delegate_ctor = interp_delegate_ctor;
- c.get_remoting_invoke = interp_get_remoting_invoke;
- c.set_resume_state = interp_set_resume_state;
- c.run_finally = interp_run_finally;
- c.run_filter = interp_run_filter;
- c.frame_iter_init = interp_frame_iter_init;
- c.frame_iter_next = interp_frame_iter_next;
- c.find_jit_info = interp_find_jit_info;
- c.set_breakpoint = interp_set_breakpoint;
- c.clear_breakpoint = interp_clear_breakpoint;
- c.frame_get_jit_info = interp_frame_get_jit_info;
- c.frame_get_ip = interp_frame_get_ip;
- c.frame_get_arg = interp_frame_get_arg;
- c.frame_get_local = interp_frame_get_local;
- c.frame_get_this = interp_frame_get_this;
- c.frame_get_parent = interp_frame_get_parent;
- c.frame_arg_to_data = interp_frame_arg_to_data;
- c.data_to_frame_arg = interp_data_to_frame_arg;
- c.frame_arg_to_storage = interp_frame_arg_to_storage;
- c.frame_arg_set_storage = interp_frame_arg_set_storage;
- c.start_single_stepping = interp_start_single_stepping;
- c.stop_single_stepping = interp_stop_single_stepping;
- mini_install_interp_callbacks (&c);
+ mini_install_interp_callbacks (&mono_interp_callbacks);
register_interp_stats ();
}
mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
CallInfo *cinfo = get_call_info (NULL, sig);
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
CallInfo *cinfo = get_call_info (NULL, sig);
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
ArgInfo *ainfo;
gpointer storage;
void
mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
CallInfo *cinfo = get_call_info (NULL, sig);
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
CallInfo *cinfo = get_call_info (NULL, sig);
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
ArgInfo *ainfo;
gpointer storage;
void
mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
CallInfo *cinfo = get_call_info (NULL, sig);
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
+ const MonoEECallbacks *interp_cb = mini_get_interp_callbacks ();
CallInfo *cinfo = get_call_info (NULL, sig);
gpointer storage;
ArgInfo *ainfo;
void
mono_arch_get_native_call_context_ret (CallContext *ccontext, gpointer frame, MonoMethodSignature *sig)
{
- MonoEECallbacks *interp_cb;
+ const MonoEECallbacks *interp_cb;
CallInfo *cinfo;
ArgInfo *ainfo;
gpointer storage;
}
-static MonoEECallbacks interp_cbs = {0};
+const MonoEECallbacks *mono_interp_callbacks_pointer;
void
-mini_install_interp_callbacks (MonoEECallbacks *cbs)
+mini_install_interp_callbacks (const MonoEECallbacks *cbs)
{
- memcpy (&interp_cbs, cbs, sizeof (MonoEECallbacks));
-}
-
-MonoEECallbacks *
-mini_get_interp_callbacks (void)
-{
- return &interp_cbs;
+ mono_interp_callbacks_pointer = cbs;
}
static MonoDebuggerCallbacks dbg_cbs;
void mono_interp_stub_init (void);
-void mini_install_interp_callbacks (MonoEECallbacks *cbs);
-MonoEECallbacks* mini_get_interp_callbacks (void);
+void mini_install_interp_callbacks (const MonoEECallbacks *cbs);
+
+extern const
+MonoEECallbacks* mono_interp_callbacks_pointer;
+
+#define mini_get_interp_callbacks() (mono_interp_callbacks_pointer)
typedef struct _MonoDebuggerCallbacks MonoDebuggerCallbacks;