Read only interp callbacks, option 4, without ordering sensitivity.
authorJay Krell <jaykrell@microsoft.com>
Tue, 11 Jun 2019 07:21:35 +0000 (00:21 -0700)
committerLarry Ewing <lewing@microsoft.com>
Fri, 14 Jun 2019 23:51:56 +0000 (18:51 -0500)
Commit migrated from https://github.com/mono/mono/commit/eafcbfd6eda561e5ba1d08330807841a5ad74807

src/mono/mono/mini/ee.h
src/mono/mono/mini/interp-stubs.c
src/mono/mono/mini/interp/interp.c
src/mono/mono/mini/mini-amd64.c
src/mono/mono/mini/mini-arm.c
src/mono/mono/mini/mini-arm64.c
src/mono/mono/mini/mini-runtime.c
src/mono/mono/mini/mini-runtime.h

index 07df68b..ec688e3 100644 (file)
@@ -26,37 +26,43 @@ struct _MonoInterpStackIter {
 
 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__ */
index 1ade7f3..002bb0d 100644 (file)
@@ -146,35 +146,56 @@ stub_delegate_ctor (MonoObjectHandle this_obj, MonoObjectHandle target, gpointer
        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);
 }
index ce38edb..6d4d98f 100644 (file)
@@ -2569,6 +2569,15 @@ interp_entry_from_trampoline (gpointer ccontext_untyped, gpointer rmethod_untype
        /* 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*
@@ -6674,6 +6683,13 @@ register_interp_stats (void)
        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)
 {
@@ -6689,38 +6705,7 @@ 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 ();
 }
index 8abb773..1e282f4 100644 (file)
@@ -1190,7 +1190,7 @@ void
 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;
 
@@ -1237,7 +1237,7 @@ mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
@@ -1276,7 +1276,7 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo
 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;
@@ -1316,7 +1316,7 @@ mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
index 8f1118c..153f481 100644 (file)
@@ -1677,7 +1677,7 @@ arg_set_val (CallContext *ccontext, ArgInfo *ainfo, gpointer src)
 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;
@@ -1719,7 +1719,7 @@ mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
@@ -1745,7 +1745,7 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo
 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;
@@ -1778,7 +1778,7 @@ mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
index 0dfafa3..53eee16 100644 (file)
@@ -1433,7 +1433,7 @@ arg_set_val (CallContext *ccontext, ArgInfo *ainfo, gpointer src)
 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;
@@ -1481,7 +1481,7 @@ mono_arch_set_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
@@ -1513,7 +1513,7 @@ mono_arch_set_native_call_context_ret (CallContext *ccontext, gpointer frame, Mo
 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;
@@ -1546,7 +1546,7 @@ mono_arch_get_native_call_context_args (CallContext *ccontext, gpointer frame, M
 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;
index f86f2ce..77ddc78 100644 (file)
@@ -4036,18 +4036,12 @@ mini_add_profiler_argument (const char *desc)
 }
 
 
-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;
index faf22b4..735b35f 100644 (file)
@@ -419,8 +419,12 @@ MONO_API int         mono_regression_test_step      (int verbose_level, const ch
 
 
 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;