From 475431927c124d1b02cdc6a20fba69665a8d29c3 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 18 Dec 2018 08:18:28 -0500 Subject: [PATCH] [jit] Call mono_register_jit_icall_full () in more places so most jit icalls can be called directly during AOT. (#12076) * [jit] Call mono_register_jit_icall_full () in more places so most jit icalls can be called directly during AOT. * Fix a c++-ism. * Fix a c++-ism. * Fix a c++-ism. --- mono/metadata/cominterop.c | 2 +- mono/metadata/marshal.c | 22 ++++++++++++++++++---- mono/mini/mini-runtime.c | 16 +++++++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/mono/metadata/cominterop.c b/mono/metadata/cominterop.c index 294d0f9f5b8..85eaf2e504e 100644 --- a/mono/metadata/cominterop.c +++ b/mono/metadata/cominterop.c @@ -91,7 +91,7 @@ register_icall (gpointer func, const char *name, const char *sigstr, gboolean sa { MonoMethodSignature *sig = mono_create_icall_signature (sigstr); - mono_register_jit_icall (func, name, sig, save); + mono_register_jit_icall_full (func, name, sig, save, name); } static mono_bstr diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 8e2ce9f11ee..6038b942358 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -124,6 +124,20 @@ get_method_image (MonoMethod *method) #ifdef __cplusplus template static void +register_dyn_icall (T func, const char *name, const char *sigstr, gboolean no_wrapper) +#else +static void +register_dyn_icall (gpointer func, const char *name, const char *sigstr, gboolean no_wrapper) +#endif +{ + MonoMethodSignature *sig = mono_create_icall_signature (sigstr); + + mono_register_jit_icall_full (func, name, sig, no_wrapper, NULL); +} + +#ifdef __cplusplus +template +static void register_icall (T func, const char *name, const char *sigstr, gboolean no_wrapper) #else static void @@ -132,7 +146,7 @@ register_icall (gpointer func, const char *name, const char *sigstr, gboolean no { MonoMethodSignature *sig = mono_create_icall_signature (sigstr); - mono_register_jit_icall (func, name, sig, no_wrapper); + mono_register_jit_icall_full (func, name, sig, no_wrapper, name); } #ifdef __cplusplus @@ -146,7 +160,7 @@ register_icall_no_wrapper (gpointer func, const char *name, const char *sigstr) { MonoMethodSignature *sig = mono_create_icall_signature (sigstr); - mono_register_jit_icall (func, name, sig, TRUE); + mono_register_jit_icall_full (func, name, sig, TRUE, name); } MonoMethodSignature* @@ -267,12 +281,12 @@ mono_marshal_init (void) register_icall (mono_marshal_free_array, "mono_marshal_free_array", "void ptr int32", FALSE); register_icall (mono_string_to_byvalstr, "mono_string_to_byvalstr", "void ptr ptr int32", FALSE); register_icall (mono_string_to_byvalwstr, "mono_string_to_byvalwstr", "void ptr ptr int32", FALSE); - register_icall (g_free, "g_free", "void ptr", FALSE); + register_dyn_icall (g_free, "g_free", "void ptr", FALSE); register_icall_no_wrapper (mono_object_isinst_icall, "mono_object_isinst_icall", "object object ptr"); register_icall (mono_struct_delete_old, "mono_struct_delete_old", "void ptr ptr", FALSE); register_icall (mono_delegate_begin_invoke, "mono_delegate_begin_invoke", "object object ptr", FALSE); register_icall (mono_delegate_end_invoke, "mono_delegate_end_invoke", "object object ptr", FALSE); - register_icall (mono_gc_wbarrier_generic_nostore_internal, "wb_generic_internal", "void ptr", FALSE); + register_dyn_icall (mono_gc_wbarrier_generic_nostore_internal, "wb_generic_internal", "void ptr", FALSE); register_icall (mono_gchandle_get_target_internal, "mono_gchandle_get_target_internal", "object int32", TRUE); register_icall (mono_marshal_isinst_with_cache, "mono_marshal_isinst_with_cache", "object object ptr ptr", FALSE); register_icall (mono_threads_enter_gc_safe_region_unbalanced, "mono_threads_enter_gc_safe_region_unbalanced", "ptr ptr", TRUE); diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index 5646e4a620a..04f32e43d88 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -721,7 +721,7 @@ register_icall (gpointer func, const char *name, const char *sigstr, gboolean av else sig = NULL; - mono_register_jit_icall_full (func, name, sig, avoid_wrapper, avoid_wrapper ? name : NULL); + mono_register_jit_icall_full (func, name, sig, avoid_wrapper, name); } #ifdef __cplusplus @@ -759,11 +759,21 @@ register_icall_with_wrapper (gpointer func, const char *name, const char *sigstr else sig = NULL; - mono_register_jit_icall_full (func, name, sig, FALSE, NULL); + mono_register_jit_icall_full (func, name, sig, FALSE, name); } +/* + * Register an icall where FUNC is dynamically generated or otherwise not + * possible to link to it using NAME during AOT. + */ +#ifdef __cplusplus +template +static void +register_dyn_icall (T func, const char *name, const char *sigstr, gboolean save) +#else static void register_dyn_icall (gpointer func, const char *name, const char *sigstr, gboolean save) +#endif { MonoMethodSignature *sig; @@ -4828,7 +4838,7 @@ register_icalls (void) register_icall (mono_fill_class_rgctx, "mono_fill_class_rgctx", "ptr ptr int", FALSE); register_icall (mono_fill_method_rgctx, "mono_fill_method_rgctx", "ptr ptr int", FALSE); - register_icall (mini_get_dbg_callbacks ()->user_break, "mono_debugger_agent_user_break", "void", FALSE); + register_dyn_icall (mini_get_dbg_callbacks ()->user_break, "mono_debugger_agent_user_break", "void", FALSE); register_icall (mono_aot_init_llvm_method, "mono_aot_init_llvm_method", "void ptr int", TRUE); register_icall (mono_aot_init_gshared_method_this, "mono_aot_init_gshared_method_this", "void ptr int object", TRUE); -- 2.11.4.GIT