Skip to content

Commit

Permalink
[metadata] Use MonoDefaults from components without hacks (#63822)
Browse files Browse the repository at this point in the history
  • Loading branch information
lambdageek committed Jan 15, 2022
1 parent 692052e commit 386f871
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 56 deletions.
57 changes: 18 additions & 39 deletions src/mono/mono/component/debugger-agent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand All @@ -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 {
Expand Down Expand Up @@ -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; \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/mono/mono/component/debugger-engine.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/mono/mono/component/debugger-stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -113,7 +113,7 @@ stub_debugger_parse_options (char *options)
}

static void
stub_debugger_init (MonoDefaults *mono_defaults)
stub_debugger_init (void)
{
}

Expand Down
4 changes: 1 addition & 3 deletions src/mono/mono/component/debugger.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand Down
6 changes: 2 additions & 4 deletions src/mono/mono/component/mini-wasm-debugger.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,14 @@ 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);

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,
Expand Down Expand Up @@ -433,7 +431,7 @@ mono_wasm_breakpoint_hit (void)
}

static void
mono_wasm_debugger_init (MonoDefaults *mono_defaults)
mono_wasm_debugger_init (void)
{
}

Expand Down
24 changes: 19 additions & 5 deletions src/mono/mono/metadata/class-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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; \
} \
Expand All @@ -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; \
Expand Down Expand Up @@ -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);

Expand Down
6 changes: 6 additions & 0 deletions src/mono/mono/metadata/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@ mono_loader_init ()
}
}

MonoDefaults *
mono_get_defaults (void)
{
return &mono_defaults;
}

void
mono_global_loader_data_lock (void)
{
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/mini/mini-runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 386f871

Please sign in to comment.