Skip to content

Commit a3b765e

Browse files
authored
[mono] Move most runtime callbacks into the MonoRuntimeCallbacks structure. (#86080)
1 parent a1feb8a commit a3b765e

File tree

7 files changed

+57
-111
lines changed

7 files changed

+57
-111
lines changed

src/mono/mono/metadata/class-internals.h

-10
Original file line numberDiff line numberDiff line change
@@ -687,10 +687,6 @@ typedef struct {
687687

688688
extern MonoStats mono_stats;
689689

690-
typedef gboolean (*MonoGetCachedClassInfo) (MonoClass *klass, MonoCachedClassInfo *res);
691-
692-
typedef gboolean (*MonoGetClassFromName) (MonoImage *image, const char *name_space, const char *name, MonoClass **res);
693-
694690
static inline gboolean
695691
method_is_dynamic (MonoMethod *method)
696692
{
@@ -755,12 +751,6 @@ mono_lookup_dynamic_token (MonoImage *image, guint32 token, MonoGenericContext *
755751
gpointer
756752
mono_lookup_dynamic_token_class (MonoImage *image, guint32 token, gboolean check_token, MonoClass **handle_class, MonoGenericContext *context, MonoError *error);
757753

758-
void
759-
mono_install_get_cached_class_info (MonoGetCachedClassInfo func);
760-
761-
void
762-
mono_install_get_class_from_name (MonoGetClassFromName func);
763-
764754
MONO_PROFILER_API MonoGenericContext*
765755
mono_class_get_context (MonoClass *klass);
766756

src/mono/mono/metadata/class.c

+3-23
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,6 @@ MonoStats mono_stats;
5555
/* Statistics */
5656
extern gint32 mono_inflated_methods_size;
5757

58-
/* Function supplied by the runtime to find classes by name using information from the AOT file */
59-
static MonoGetClassFromName get_class_from_name = NULL;
60-
6158
static gboolean can_access_type (MonoClass *access_klass, MonoClass *member_klass);
6259

6360
static char* mono_assembly_name_from_token (MonoImage *image, guint32 type_token);
@@ -3317,8 +3314,8 @@ mono_class_from_name_checked_aux (MonoImage *image, const char* name_space, cons
33173314

33183315
/* FIXME: get_class_from_name () can't handle types in the EXPORTEDTYPE table */
33193316
// The AOT cache in get_class_from_name is case-sensitive, so don't bother with it for case-insensitive lookups
3320-
if (get_class_from_name && table_info_get_rows (&image->tables [MONO_TABLE_EXPORTEDTYPE]) == 0 && case_sensitive) {
3321-
gboolean res = get_class_from_name (image, name_space, name, &klass);
3317+
if (table_info_get_rows (&image->tables [MONO_TABLE_EXPORTEDTYPE]) == 0 && case_sensitive) {
3318+
gboolean res = mono_get_runtime_callbacks ()->get_class_from_name (image, name_space, name, &klass);
33223319
if (res) {
33233320
if (!klass) {
33243321
klass = search_modules (image, name_space, name, case_sensitive, error);
@@ -4798,27 +4795,10 @@ mono_lookup_dynamic_token_class (MonoImage *image, guint32 token, gboolean valid
47984795
return mono_reflection_lookup_dynamic_token (image, token, valid_token, handle_class, context, error);
47994796
}
48004797

4801-
static MonoGetCachedClassInfo get_cached_class_info = NULL;
4802-
4803-
void
4804-
mono_install_get_cached_class_info (MonoGetCachedClassInfo func)
4805-
{
4806-
get_cached_class_info = func;
4807-
}
4808-
48094798
gboolean
48104799
mono_class_get_cached_class_info (MonoClass *klass, MonoCachedClassInfo *res)
48114800
{
4812-
if (!get_cached_class_info)
4813-
return FALSE;
4814-
else
4815-
return get_cached_class_info (klass, res);
4816-
}
4817-
4818-
void
4819-
mono_install_get_class_from_name (MonoGetClassFromName func)
4820-
{
4821-
get_class_from_name = func;
4801+
return mono_get_runtime_callbacks ()->get_cached_class_info (klass, res);
48224802
}
48234803

48244804
/**

src/mono/mono/metadata/jit-info.c

+1-8
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
#include <mono/metadata/profiler-private.h>
4646
#include <mono/metadata/coree.h>
4747

48-
static MonoJitInfoFindInAot jit_info_find_in_aot_func = NULL;
4948
static MonoJitInfoTable * volatile jit_info_table;
5049
static MonoJitInfoTable * volatile aot_modules;
5150
static GSList *jit_info_free_queue;
@@ -327,7 +326,7 @@ mono_jit_info_table_find_internal (gpointer addr, gboolean try_aot, gboolean all
327326
table = (MonoJitInfoTable *)mono_get_hazardous_pointer ((gpointer volatile*)&aot_modules, hp, JIT_INFO_TABLE_HAZARD_INDEX);
328327
module_ji = jit_info_table_find (table, hp, (gint8*)addr);
329328
if (module_ji)
330-
ji = jit_info_find_in_aot_func (module_ji->d.image, addr);
329+
ji = mono_get_runtime_callbacks ()->find_jit_info_in_aot (module_ji->d.image, addr);
331330
if (hp)
332331
mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
333332
}
@@ -825,12 +824,6 @@ mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end)
825824
jit_info_unlock ();
826825
}
827826

828-
void
829-
mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func)
830-
{
831-
jit_info_find_in_aot_func = func;
832-
}
833-
834827
int
835828
mono_jit_info_size (MonoJitInfoFlags flags, int num_clauses, int num_holes)
836829
{

src/mono/mono/metadata/jit-info.h

-7
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,6 @@ mono_jit_info_get_thunk_info (MonoJitInfo *ji);
278278
MonoUnwindJitInfo*
279279
mono_jit_info_get_unwind_info (MonoJitInfo *ji);
280280

281-
/*
282-
* Installs a new function which is used to return a MonoJitInfo for a method inside
283-
* an AOT module.
284-
*/
285-
typedef MonoJitInfo *(*MonoJitInfoFindInAot) (MonoImage *image, gpointer addr);
286-
void mono_install_jit_info_find_in_aot (MonoJitInfoFindInAot func);
287-
288281
MONO_PROFILER_API MonoJitInfo* mono_jit_info_table_find_internal (gpointer addr, gboolean try_aot, gboolean allow_trampolines);
289282

290283
typedef void (*MonoJitInfoFunc) (MonoJitInfo *ji, gpointer user_data);

src/mono/mono/metadata/object-internals.h

+38-39
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,40 @@ TYPED_HANDLE_DECL (MonoDelegate);
666666

667667
typedef void (*InterpJitInfoFunc) (MonoJitInfo *ji, gpointer user_data);
668668

669+
#ifdef MONO_SMALL_CONFIG
670+
#define MONO_IMT_SIZE 9
671+
#else
672+
#define MONO_IMT_SIZE 19
673+
#endif
674+
675+
typedef union {
676+
int vtable_slot;
677+
gpointer target_code;
678+
} MonoImtItemValue;
679+
680+
typedef struct _MonoImtBuilderEntry {
681+
gpointer key;
682+
struct _MonoImtBuilderEntry *next;
683+
MonoImtItemValue value;
684+
int children;
685+
guint8 has_target_code : 1;
686+
} MonoImtBuilderEntry;
687+
688+
typedef struct _MonoIMTCheckItem MonoIMTCheckItem;
689+
690+
struct _MonoIMTCheckItem {
691+
gpointer key;
692+
int check_target_idx;
693+
MonoImtItemValue value;
694+
guint8 *jmp_code;
695+
guint8 *code_target;
696+
guint8 is_equals;
697+
guint8 compare_done;
698+
guint8 chunk_size;
699+
guint8 short_branch;
700+
guint8 has_target_code;
701+
};
702+
669703
/*
670704
* Callbacks supplied by the runtime and called by the modules in metadata/
671705
* This interface is easier to extend than adding a new function type +
@@ -704,6 +738,10 @@ typedef struct {
704738
MonoBoolean (*get_frame_info) (gint32 skip, MonoMethod **out_method,
705739
MonoDebugSourceLocation **out_location,
706740
gint32 *iloffset, gint32 *native_offset);
741+
gboolean (*get_cached_class_info) (MonoClass *klass, MonoCachedClassInfo *res);
742+
gboolean (*get_class_from_name) (MonoImage *image, const char *name_space, const char *name, MonoClass **res);
743+
gpointer (*build_imt_trampoline) (MonoVTable *vtable, MonoIMTCheckItem **imt_entries, int count, gpointer fail_trunk);
744+
MonoJitInfo *(*find_jit_info_in_aot) (MonoImage *image, gpointer addr);
707745
} MonoRuntimeCallbacks;
708746

709747
typedef gboolean (*MonoInternalStackWalk) (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data);
@@ -1579,45 +1617,6 @@ mono_nullable_box_handle (gpointer buf, MonoClass *klass, MonoError *error);
15791617
MonoObjectHandle
15801618
mono_new_null (void);
15811619

1582-
#ifdef MONO_SMALL_CONFIG
1583-
#define MONO_IMT_SIZE 9
1584-
#else
1585-
#define MONO_IMT_SIZE 19
1586-
#endif
1587-
1588-
typedef union {
1589-
int vtable_slot;
1590-
gpointer target_code;
1591-
} MonoImtItemValue;
1592-
1593-
typedef struct _MonoImtBuilderEntry {
1594-
gpointer key;
1595-
struct _MonoImtBuilderEntry *next;
1596-
MonoImtItemValue value;
1597-
int children;
1598-
guint8 has_target_code : 1;
1599-
} MonoImtBuilderEntry;
1600-
1601-
typedef struct _MonoIMTCheckItem MonoIMTCheckItem;
1602-
1603-
struct _MonoIMTCheckItem {
1604-
gpointer key;
1605-
int check_target_idx;
1606-
MonoImtItemValue value;
1607-
guint8 *jmp_code;
1608-
guint8 *code_target;
1609-
guint8 is_equals;
1610-
guint8 compare_done;
1611-
guint8 chunk_size;
1612-
guint8 short_branch;
1613-
guint8 has_target_code;
1614-
};
1615-
1616-
typedef gpointer (*MonoImtTrampolineBuilder) (MonoVTable *vtable, MonoIMTCheckItem **imt_entries, int count, gpointer fail_trunk);
1617-
1618-
void
1619-
mono_install_imt_trampoline_builder (MonoImtTrampolineBuilder func);
1620-
16211620
void
16221621
mono_set_always_build_imt_trampolines (gboolean value);
16231622

src/mono/mono/metadata/object.c

+3-10
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,6 @@ mono_release_type_locks (MonoInternalThread *thread)
701701
mono_type_initialization_unlock ();
702702
}
703703

704-
static MonoImtTrampolineBuilder imt_trampoline_builder;
705704
static gboolean always_build_imt_trampolines;
706705

707706
#if (MONO_IMT_SIZE > 32)
@@ -720,12 +719,6 @@ mono_get_runtime_callbacks (void)
720719
return &callbacks;
721720
}
722721

723-
void
724-
mono_install_imt_trampoline_builder (MonoImtTrampolineBuilder func)
725-
{
726-
imt_trampoline_builder = func;
727-
}
728-
729722
void
730723
mono_set_always_build_imt_trampolines (gboolean value)
731724
{
@@ -1480,7 +1473,7 @@ initialize_imt_slot (MonoVTable *vtable, MonoImtBuilderEntry *imt_builder_entry,
14801473
/* Collision, build the trampoline */
14811474
GPtrArray *imt_ir = imt_sort_slot_entries (imt_builder_entry);
14821475
gpointer result;
1483-
result = imt_trampoline_builder (vtable,
1476+
result = mono_get_runtime_callbacks ()->build_imt_trampoline (vtable,
14841477
(MonoIMTCheckItem**)imt_ir->pdata, imt_ir->len, fail_tramp);
14851478
for (guint i = 0; i < imt_ir->len; ++i)
14861479
g_free (g_ptr_array_index (imt_ir, i));
@@ -1829,8 +1822,8 @@ mono_method_add_generic_virtual_invocation (MonoVTable *vtable,
18291822

18301823
sorted = imt_sort_slot_entries (entries);
18311824

1832-
*vtable_slot = imt_trampoline_builder (vtable, (MonoIMTCheckItem**)sorted->pdata, sorted->len,
1833-
vtable_trampoline);
1825+
*vtable_slot = mono_get_runtime_callbacks ()->build_imt_trampoline (vtable, (MonoIMTCheckItem**)sorted->pdata, sorted->len,
1826+
vtable_trampoline);
18341827

18351828
while (entries) {
18361829
MonoImtBuilderEntry *next = entries->next;

src/mono/mono/mini/mini-runtime.c

+12-14
Original file line numberDiff line numberDiff line change
@@ -4557,7 +4557,7 @@ mini_init (const char *filename)
45574557
#if ENABLE_WEAK_ATTR
45584558
callbacks.get_weak_field_indexes = mono_aot_get_weak_field_indexes;
45594559
#endif
4560-
4560+
callbacks.find_jit_info_in_aot = mono_aot_find_jit_info;
45614561
callbacks.metadata_update_published = mini_invalidate_transformed_interp_methods;
45624562
callbacks.interp_jit_info_foreach = mini_interp_jit_info_foreach;
45634563
callbacks.interp_sufficient_stack = mini_interp_sufficient_stack;
@@ -4569,6 +4569,17 @@ mini_init (const char *filename)
45694569
callbacks.init_class = init_class;
45704570
callbacks.get_trace = mono_get_trace;
45714571
callbacks.get_frame_info = mono_get_frame_info;
4572+
callbacks.get_cached_class_info = mono_aot_get_cached_class_info;
4573+
callbacks.get_class_from_name = mono_aot_get_class_from_name;
4574+
4575+
if (mono_llvm_only) {
4576+
callbacks.build_imt_trampoline = mini_llvmonly_get_imt_trampoline;
4577+
mono_set_always_build_imt_trampolines (TRUE);
4578+
} else if (mono_aot_only) {
4579+
callbacks.build_imt_trampoline = mono_aot_get_imt_trampoline;
4580+
} else {
4581+
callbacks.build_imt_trampoline = mono_arch_build_imt_trampoline;
4582+
}
45724583

45734584
mono_install_callbacks (&callbacks);
45744585

@@ -4638,10 +4649,6 @@ mini_init (const char *filename)
46384649
#endif
46394650
mono_threads_install_cleanup (mini_thread_cleanup);
46404651

4641-
mono_install_get_cached_class_info (mono_aot_get_cached_class_info);
4642-
mono_install_get_class_from_name (mono_aot_get_class_from_name);
4643-
mono_install_jit_info_find_in_aot (mono_aot_find_jit_info);
4644-
46454652
mono_profiler_state.context_enable = mini_profiler_context_enable;
46464653
mono_profiler_state.context_get_this = mini_profiler_context_get_this;
46474654
mono_profiler_state.context_get_argument = mini_profiler_context_get_argument;
@@ -4690,15 +4697,6 @@ mini_init (const char *filename)
46904697
mono_marshal_use_aot_wrappers (TRUE);
46914698
}
46924699

4693-
if (mono_llvm_only) {
4694-
mono_install_imt_trampoline_builder (mini_llvmonly_get_imt_trampoline);
4695-
mono_set_always_build_imt_trampolines (TRUE);
4696-
} else if (mono_aot_only) {
4697-
mono_install_imt_trampoline_builder (mono_aot_get_imt_trampoline);
4698-
} else {
4699-
mono_install_imt_trampoline_builder (mono_arch_build_imt_trampoline);
4700-
}
4701-
47024700
/*Init arch tls information only after the metadata side is inited to make sure we see dynamic appdomain tls keys*/
47034701
mono_arch_finish_init ();
47044702

0 commit comments

Comments
 (0)