diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 5b26373278684..f9712c5b77e38 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -130,23 +130,6 @@ #pragma warning(disable:4312) // FIXME pointer cast to different size #endif -#define GENERATE_TRY_GET_CLASS_WITH_CACHE_DBG(shortname,name_space,name) \ -MonoClass* \ -mono_class_try_get_##shortname##_class (void) \ -{ \ - static volatile MonoClass *tmp_class; \ - static volatile gboolean inited; \ - MonoClass *klass = (MonoClass *)tmp_class; \ - mono_memory_barrier (); \ - if (!inited) { \ - klass = mono_class_try_load_from_name (mdbg_mono_defaults->corlib, name_space, name); \ - tmp_class = klass; \ - mono_memory_barrier (); \ - inited = TRUE; \ - } \ - return klass; \ -} - #ifndef MONO_HANDLE_TRACK_OWNER #define MONO_HANDLE_NEW_DBG(type, object) \ @@ -162,13 +145,13 @@ mono_class_try_get_##shortname##_class (void) \ static inline MonoType* mono_get_object_type_dbg (void) { - return m_class_get_byval_arg (mdbg_mono_defaults->object_class); + return m_class_get_byval_arg (mono_get_object_class ()); } static inline MonoType* mono_get_void_type_dbg (void) { - return m_class_get_byval_arg (mdbg_mono_defaults->void_class); + return m_class_get_byval_arg (mono_get_void_class ()); } typedef struct { @@ -420,8 +403,6 @@ static gint32 suspend_count; /* Whenever to buffer reply messages and send them together */ static gboolean buffer_replies; -MonoDefaults *mdbg_mono_defaults; - #ifndef TARGET_WASM #define GET_TLS_DATA_FROM_THREAD(thread) \ DebuggerTlsData *tls = NULL; \ @@ -532,7 +513,7 @@ static int handle_multiple_ss_requests (void); static void mono_dbg_debugger_agent_user_break (void); -static GENERATE_TRY_GET_CLASS_WITH_CACHE_DBG (fixed_buffer, "System.Runtime.CompilerServices", "FixedBufferAttribute") +static GENERATE_TRY_GET_CLASS_WITH_CACHE (fixed_buffer, "System.Runtime.CompilerServices", "FixedBufferAttribute") #ifndef DISABLE_SOCKET_TRANSPORT static void @@ -744,13 +725,11 @@ mono_debugger_is_disconnected (void) } static void -debugger_agent_init (MonoDefaults *mono_defaults) +debugger_agent_init (void) { if (!agent_config.enabled) return; - mdbg_mono_defaults = mono_defaults; - DebuggerEngineCallbacks cbs; memset (&cbs, 0, sizeof (cbs)); cbs.tls_get_restore_state = tls_get_restore_state; @@ -2498,7 +2477,7 @@ process_suspend (DebuggerTlsData *tls, MonoContext *ctx) g_assert (ji); /* Can't suspend in these methods */ method = jinfo_get_method (ji); - if (method->klass == mdbg_mono_defaults->string_class && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy"))) + if (method->klass == mono_get_string_class () && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy"))) return; save_thread_context (ctx); @@ -2945,7 +2924,7 @@ static gint32 isFixedSizeArray (MonoClassField *f) CattrNamedArg *arginfo; int num_named_args; - mono_reflection_create_custom_attr_data_args_noalloc (mdbg_mono_defaults->corlib, attr->ctor, attr->data, attr->data_size, + mono_reflection_create_custom_attr_data_args_noalloc (mono_get_corlib (), attr->ctor, attr->data, attr->data_size, &typed_args, &named_args, &num_named_args, &arginfo, error); if (!is_ok (error)) { ret = 0; @@ -3244,9 +3223,9 @@ dbg_path_get_basename (const char *filename) return g_strdup (&r[1]); } -static GENERATE_TRY_GET_CLASS_WITH_CACHE_DBG (hidden_klass, "System.Diagnostics", "DebuggerHiddenAttribute") -static GENERATE_TRY_GET_CLASS_WITH_CACHE_DBG (step_through_klass, "System.Diagnostics", "DebuggerStepThroughAttribute") -static GENERATE_TRY_GET_CLASS_WITH_CACHE_DBG (non_user_klass, "System.Diagnostics", "DebuggerNonUserCodeAttribute") +static GENERATE_TRY_GET_CLASS_WITH_CACHE (hidden_klass, "System.Diagnostics", "DebuggerHiddenAttribute") +static GENERATE_TRY_GET_CLASS_WITH_CACHE (step_through_klass, "System.Diagnostics", "DebuggerStepThroughAttribute") +static GENERATE_TRY_GET_CLASS_WITH_CACHE (non_user_klass, "System.Diagnostics", "DebuggerNonUserCodeAttribute") static void init_jit_info_dbg_attrs (MonoJitInfo *ji) @@ -3769,7 +3748,7 @@ runtime_initialized (MonoProfiler *prof) { process_profiler_event (EVENT_KIND_VM_START, mono_thread_current ()); if (CHECK_PROTOCOL_VERSION (2, 59)) - process_profiler_event (EVENT_KIND_ASSEMBLY_LOAD, (mdbg_mono_defaults->corlib->assembly)); + process_profiler_event (EVENT_KIND_ASSEMBLY_LOAD, (mono_get_corlib ()->assembly)); if (agent_config.defer) { ERROR_DECL (error); start_debugger_thread (error); @@ -4767,7 +4746,7 @@ static void debugger_agent_handle_exception (MonoException *exc, MonoContext *throw_ctx, MonoContext *catch_ctx, StackFrameInfo *catch_frame) { - if (catch_ctx == NULL && catch_frame == NULL && get_mini_debug_options ()->suspend_on_unhandled && mono_object_class (exc) != mdbg_mono_defaults->threadabortexception_class) { + if (catch_ctx == NULL && catch_frame == NULL && get_mini_debug_options ()->suspend_on_unhandled && mono_object_class (exc) != mono_get_defaults ()->threadabortexception_class) { mono_runtime_printf_err ("Unhandled exception, suspending..."); while (1) ; @@ -6529,7 +6508,7 @@ module_apply_changes (MonoImage *image, MonoArray *dmeta, MonoArray *dil, MonoAr static void buffer_add_cattr_arg (Buffer *buf, MonoType *t, MonoDomain *domain, MonoObject *val) { - if (val && val->vtable->klass == mdbg_mono_defaults->runtimetype_class) { + if (val && val->vtable->klass == mono_get_defaults ()->runtimetype_class) { /* Special case these so the client doesn't have to handle Type objects */ buffer_add_byte (buf, VALUE_TYPE_ID_TYPE); @@ -6734,7 +6713,7 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf) wait_for_suspend (); #ifdef TRY_MANAGED_SYSTEM_ENVIRONMENT_EXIT - env_class = mono_class_try_load_from_name (mdbg_mono_defaults->corlib, "System", "Environment"); + env_class = mono_class_try_load_from_name (mono_get_corlib (), "System", "Environment"); if (env_class) { ERROR_DECL (error); exit_method = mono_class_get_method_from_name_checked (env_class, "Exit", 1, 0, error); @@ -7115,7 +7094,7 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf) if (exc_class) { req->modifiers [i].data.exc_class = exc_class; - if (!mono_class_is_assignable_from_internal (mdbg_mono_defaults->exception_class, exc_class)) { + if (!mono_class_is_assignable_from_internal (mono_get_exception_class (), exc_class)) { g_free (req); return ERR_INVALID_ARGUMENT; } @@ -8729,19 +8708,19 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g g_error ("Could not load token due to %s", mono_error_get_message (error)); } - if (handle_class == mdbg_mono_defaults->typehandle_class) { + if (handle_class == mono_get_defaults ()->typehandle_class) { buffer_add_byte (buf, TOKEN_TYPE_TYPE); if (method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD) buffer_add_typeid (buf, domain, (MonoClass *) val); else buffer_add_typeid (buf, domain, mono_class_from_mono_type_internal ((MonoType*)val)); - } else if (handle_class == mdbg_mono_defaults->fieldhandle_class) { + } else if (handle_class == mono_get_defaults ()->fieldhandle_class) { buffer_add_byte (buf, TOKEN_TYPE_FIELD); buffer_add_fieldid (buf, domain, (MonoClassField *)val); - } else if (handle_class == mdbg_mono_defaults->methodhandle_class) { + } else if (handle_class == mono_get_defaults ()->methodhandle_class) { buffer_add_byte (buf, TOKEN_TYPE_METHOD); buffer_add_methodid (buf, domain, (MonoMethod *)val); - } else if (handle_class == mdbg_mono_defaults->string_class) { + } else if (handle_class == mono_get_string_class ()) { char *s; s = mono_string_to_utf8_checked_internal ((MonoString *)val, error); diff --git a/src/mono/mono/component/debugger-engine.c b/src/mono/mono/component/debugger-engine.c index e1040a861c84c..5083e3b68c819 100644 --- a/src/mono/mono/component/debugger-engine.c +++ b/src/mono/mono/component/debugger-engine.c @@ -812,7 +812,7 @@ mono_de_process_single_step (void *tls, gboolean from_signal) * Stopping in memset makes half-initialized vtypes visible. * Stopping in memcpy makes half-copied vtypes visible. */ - if (method->klass == mdbg_mono_defaults->string_class && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy"))) + if (method->klass == mono_get_string_class () && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy"))) goto exit; /* @@ -1719,7 +1719,7 @@ get_notify_debugger_of_wait_completion_method (void) if (notify_debugger_of_wait_completion_method_cache != NULL) return notify_debugger_of_wait_completion_method_cache; ERROR_DECL (error); - MonoClass* task_class = mono_class_load_from_name (mdbg_mono_defaults->corlib, "System.Threading.Tasks", "Task"); + MonoClass* task_class = mono_class_load_from_name (mono_get_corlib (), "System.Threading.Tasks", "Task"); GPtrArray* array = mono_class_get_methods_by_name (task_class, "NotifyDebuggerOfWaitCompletion", 0x24, 1, FALSE, error); mono_error_assert_ok (error); g_assert (array->len == 1); diff --git a/src/mono/mono/component/debugger-stub.c b/src/mono/mono/component/debugger-stub.c index 224f531f79648..4235a97eb5017 100644 --- a/src/mono/mono/component/debugger-stub.c +++ b/src/mono/mono/component/debugger-stub.c @@ -16,7 +16,7 @@ static void stub_debugger_parse_options (char *options); static void -stub_debugger_init (MonoDefaults *mono_defaults); +stub_debugger_init (void); static void stub_debugger_breakpoint_hit (void *sigctx); @@ -113,7 +113,7 @@ stub_debugger_parse_options (char *options) } static void -stub_debugger_init (MonoDefaults *mono_defaults) +stub_debugger_init (void) { } diff --git a/src/mono/mono/component/debugger.h b/src/mono/mono/component/debugger.h index a573750b1fa9f..633bfc492cc03 100644 --- a/src/mono/mono/component/debugger.h +++ b/src/mono/mono/component/debugger.h @@ -172,7 +172,7 @@ typedef struct _DebuggerTlsData DebuggerTlsData; typedef struct MonoComponentDebugger { MonoComponent component; - void (*init) (MonoDefaults *mono_defaults); + void (*init) (void); void (*user_break) (void); void (*parse_options) (char *options); void (*breakpoint_hit) (void *sigctx); @@ -199,8 +199,6 @@ typedef struct MonoComponentDebugger { } MonoComponentDebugger; -extern MonoDefaults *mdbg_mono_defaults; - #define DE_ERR_NONE 0 // WARNING WARNING WARNING // Error codes MUST match those of sdb for now diff --git a/src/mono/mono/component/mini-wasm-debugger.c b/src/mono/mono/component/mini-wasm-debugger.c index 0cfcd5cce9588..81a2011e1ef54 100644 --- a/src/mono/mono/component/mini-wasm-debugger.c +++ b/src/mono/mono/component/mini-wasm-debugger.c @@ -141,7 +141,7 @@ mono_wasm_enable_debugging_internal (int debug_level) } static void -mono_wasm_debugger_init (MonoDefaults *mono_defaults) +mono_wasm_debugger_init (void) { int debug_level = mono_wasm_get_debug_level(); mono_wasm_enable_debugging_internal (debug_level); @@ -149,8 +149,6 @@ mono_wasm_debugger_init (MonoDefaults *mono_defaults) if (!debugger_enabled) return; - mdbg_mono_defaults = mono_defaults; - DebuggerEngineCallbacks cbs = { .tls_get_restore_state = tls_get_restore_state, .try_process_suspend = try_process_suspend, @@ -433,7 +431,7 @@ mono_wasm_breakpoint_hit (void) } static void -mono_wasm_debugger_init (MonoDefaults *mono_defaults) +mono_wasm_debugger_init (void) { } diff --git a/src/mono/mono/metadata/class-internals.h b/src/mono/mono/metadata/class-internals.h index e553e64849ccc..01104274c1f3b 100644 --- a/src/mono/mono/metadata/class-internals.h +++ b/src/mono/mono/metadata/class-internals.h @@ -984,12 +984,29 @@ typedef struct { MonoClass *appcontext_class; } MonoDefaults; +/* If you need a MonoType, use one of the mono_get_*_type () functions in class-inlines.h */ +extern MonoDefaults mono_defaults; + +MONO_COMPONENT_API +MonoDefaults * +mono_get_defaults (void); + #define GENERATE_GET_CLASS_WITH_CACHE_DECL(shortname) \ MonoClass* mono_class_get_##shortname##_class (void); #define GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL(shortname) \ MonoClass* mono_class_try_get_##shortname##_class (void); +static inline MonoImage * +mono_class_generate_get_corlib_impl (void) +{ +#ifdef COMPILING_COMPONENT_DYNAMIC + return mono_get_corlib (); +#else + return mono_defaults.corlib; +#endif +} + // GENERATE_GET_CLASS_WITH_CACHE attempts mono_class_load_from_name whenever // its cache is null. i.e. potentially repeatedly, though it is expected to succeed // the first time. @@ -1001,7 +1018,7 @@ mono_class_get_##shortname##_class (void) \ static MonoClass *tmp_class; \ MonoClass *klass = tmp_class; \ if (!klass) { \ - klass = mono_class_load_from_name (mono_defaults.corlib, name_space, name); \ + klass = mono_class_load_from_name (mono_class_generate_get_corlib_impl (), name_space, name); \ mono_memory_barrier (); /* FIXME excessive? */ \ tmp_class = klass; \ } \ @@ -1023,7 +1040,7 @@ mono_class_try_get_##shortname##_class (void) \ MonoClass *klass = (MonoClass *)tmp_class; \ mono_memory_barrier (); \ if (!inited) { \ - klass = mono_class_try_load_from_name (mono_defaults.corlib, name_space, name); \ + klass = mono_class_try_load_from_name (mono_class_generate_get_corlib_impl (), name_space, name); \ tmp_class = klass; \ mono_memory_barrier (); \ inited = TRUE; \ @@ -1055,9 +1072,6 @@ GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL(handleref) GENERATE_GET_CLASS_WITH_CACHE_DECL (assembly_load_context) GENERATE_GET_CLASS_WITH_CACHE_DECL (native_library) -/* If you need a MonoType, use one of the mono_get_*_type () functions in class-inlines.h */ -extern MonoDefaults mono_defaults; - void mono_loader_init (void); diff --git a/src/mono/mono/metadata/loader.c b/src/mono/mono/metadata/loader.c index 7098bb527a4b3..e0ce3f575ae06 100644 --- a/src/mono/mono/metadata/loader.c +++ b/src/mono/mono/metadata/loader.c @@ -107,6 +107,12 @@ mono_loader_init () } } +MonoDefaults * +mono_get_defaults (void) +{ + return &mono_defaults; +} + void mono_global_loader_data_lock (void) { diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 5aa5426d4e4f3..78d588f38a435 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -4522,7 +4522,7 @@ mini_init (const char *filename, const char *runtime_version) if (default_opt & MONO_OPT_AOT) mono_aot_init (); - mono_component_debugger ()->init (&mono_defaults); + mono_component_debugger ()->init (); #ifdef MONO_ARCH_GSHARED_SUPPORTED mono_set_generic_sharing_supported (TRUE);