From 1a6fef339498c62b8517876b2575d99446c318fc Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Mon, 18 Mar 2024 16:36:51 -0700 Subject: [PATCH 1/7] Optimize mono_metadata_decode_row_col_raw --- src/mono/mono/metadata/metadata-internals.h | 6 +++++ src/mono/mono/metadata/metadata.c | 28 ++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index 05934225cbd907..c441f097d7303b 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -234,6 +234,12 @@ struct _MonoTableInfo { * we only need 4, but 8 is aligned no shift required. */ guint32 size_bitfield; + + /* + * optimize out the loop in mono_metadata_decode_row_col_raw. + * 4 * 9 easily fits in a uint8 + */ + guint8 column_offsets[9]; }; #define REFERENCE_MISSING ((gpointer) -1) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index b432e7f07dc54d..94e714d2861600 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1003,6 +1003,21 @@ mono_metadata_table_bounds_check_slow (MonoImage *image, int table_index, int to return mono_metadata_update_table_bounds_check (image, table_index, token_index); } +static void +mono_metadata_compute_column_offsets (guint32 bitfield, guint8 column_offsets[9]) +{ + int offset = 0, c = mono_metadata_table_count (bitfield); + for (int i = 0; i < 9; i++) { + if (i >= c) { + column_offsets[i] = 0xFFu; + } else { + int size = mono_metadata_table_size (bitfield, i); + column_offsets[i] = (guint8)offset; + offset += size; + } + } +} + /** * mono_metadata_compute_table_bases: * \param meta metadata context to compute table values @@ -1022,6 +1037,7 @@ mono_metadata_compute_table_bases (MonoImage *meta) continue; table->row_size = mono_metadata_compute_size (meta, i, &table->size_bitfield); + mono_metadata_compute_column_offsets (table->size_bitfield, table->column_offsets); table->base = base; base += table_info_get_rows (table) * table->row_size; } @@ -1470,6 +1486,7 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) { const char *data; int n; + guint8 column_offset; guint32 bitfield = t->size_bitfield; @@ -1477,11 +1494,10 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) g_assert (col < mono_metadata_table_count (bitfield)); data = t->base + idx * t->row_size; - n = mono_metadata_table_size (bitfield, 0); - for (guint i = 0; i < col; ++i) { - data += n; - n = mono_metadata_table_size (bitfield, i + 1); - } + n = mono_metadata_table_size (bitfield, col); + column_offset = t->column_offsets [col]; + g_assert (column_offset < 0xFFu); + data += column_offset; switch (n) { case 1: return *data; @@ -6009,7 +6025,7 @@ signature_equiv_vararg (MonoMethodSignature *sig1, MonoMethodSignature *sig2, in if (sig1->hasthis != sig2->hasthis || sig1->sentinelpos != sig2->sentinelpos) return FALSE; - + int flag = MONO_TYPE_EQ_FLAGS_SIG_ONLY | (((equiv_flags & SIG_EQUIV_FLAG_IGNORE_CMODS) != 0) ? MONO_TYPE_EQ_FLAG_IGNORE_CMODS : 0); for (i = 0; i < sig1->sentinelpos; i++) { From 4ea8b0ee0fc92b08e9c5963be294d25194649b07 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Tue, 19 Mar 2024 08:57:53 -0700 Subject: [PATCH 2/7] Address PR feedback --- src/mono/mono/metadata/metadata-internals.h | 4 +++- src/mono/mono/metadata/metadata.c | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index c441f097d7303b..320291e6930ff2 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -217,6 +217,8 @@ typedef struct { guint32 size; } MonoStreamHeader; +#define MONO_TABLE_INFO_MAX_COLUMNS 9 + struct _MonoTableInfo { const char *base; guint rows_ : 24; /* don't access directly, use table_info_get_rows */ @@ -239,7 +241,7 @@ struct _MonoTableInfo { * optimize out the loop in mono_metadata_decode_row_col_raw. * 4 * 9 easily fits in a uint8 */ - guint8 column_offsets[9]; + guint8 column_offsets[MONO_TABLE_INFO_MAX_COLUMNS]; }; #define REFERENCE_MISSING ((gpointer) -1) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 94e714d2861600..be332c4abb0de9 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1004,10 +1004,10 @@ mono_metadata_table_bounds_check_slow (MonoImage *image, int table_index, int to } static void -mono_metadata_compute_column_offsets (guint32 bitfield, guint8 column_offsets[9]) +compute_column_offsets (guint32 bitfield, guint8 column_offsets[MONO_TABLE_INFO_MAX_COLUMNS]) { int offset = 0, c = mono_metadata_table_count (bitfield); - for (int i = 0; i < 9; i++) { + for (int i = 0; i < MONO_TABLE_INFO_MAX_COLUMNS; i++) { if (i >= c) { column_offsets[i] = 0xFFu; } else { @@ -1037,7 +1037,7 @@ mono_metadata_compute_table_bases (MonoImage *meta) continue; table->row_size = mono_metadata_compute_size (meta, i, &table->size_bitfield); - mono_metadata_compute_column_offsets (table->size_bitfield, table->column_offsets); + compute_column_offsets (table->size_bitfield, table->column_offsets); table->base = base; base += table_info_get_rows (table) * table->row_size; } From 629bc1b54cf499c712b9f37395d3c6c6e4ac502c Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Tue, 19 Mar 2024 13:47:10 -0700 Subject: [PATCH 3/7] Address PR feedback --- src/mono/mono/metadata/metadata.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index be332c4abb0de9..342424db2ed61d 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1007,14 +1007,11 @@ static void compute_column_offsets (guint32 bitfield, guint8 column_offsets[MONO_TABLE_INFO_MAX_COLUMNS]) { int offset = 0, c = mono_metadata_table_count (bitfield); - for (int i = 0; i < MONO_TABLE_INFO_MAX_COLUMNS; i++) { - if (i >= c) { - column_offsets[i] = 0xFFu; - } else { - int size = mono_metadata_table_size (bitfield, i); - column_offsets[i] = (guint8)offset; - offset += size; - } + memset(column_offsets, 0, MONO_TABLE_INFO_MAX_COLUMNS); + for (int i = 0; i < c; i++) { + int size = mono_metadata_table_size (bitfield, i); + column_offsets[i] = (guint8)offset; + offset += size; } } @@ -1488,16 +1485,10 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) int n; guint8 column_offset; - guint32 bitfield = t->size_bitfield; - g_assert (GINT_TO_UINT32(idx) < table_info_get_rows (t)); - g_assert (col < mono_metadata_table_count (bitfield)); - data = t->base + idx * t->row_size; - - n = mono_metadata_table_size (bitfield, col); - column_offset = t->column_offsets [col]; - g_assert (column_offset < 0xFFu); - data += column_offset; + g_assert (col < mono_metadata_table_count (t->size_bitfield)); + data = t->base + idx * t->row_size + t->column_offsets [col]; + n = mono_metadata_table_size (t->size_bitfield, col); switch (n) { case 1: return *data; From 294bc9ceae959967c4cf3ce30aa3e7fe532a778a Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 20 Mar 2024 09:51:04 -0700 Subject: [PATCH 4/7] Hoist load --- src/mono/mono/metadata/metadata.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 342424db2ed61d..7ac002f98bb863 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1484,11 +1484,12 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) const char *data; int n; guint8 column_offset; + guint32 bitfield = t->size_bitfield; g_assert (GINT_TO_UINT32(idx) < table_info_get_rows (t)); - g_assert (col < mono_metadata_table_count (t->size_bitfield)); + g_assert (col < mono_metadata_table_count (bitfield)); data = t->base + idx * t->row_size + t->column_offsets [col]; - n = mono_metadata_table_size (t->size_bitfield, col); + n = mono_metadata_table_size (bitfield, col); switch (n) { case 1: return *data; From 461f295a8489bdd0a50e50dde4382a40039468c3 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 20 Mar 2024 10:30:05 -0700 Subject: [PATCH 5/7] Fix build break --- src/mono/mono/metadata/metadata.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 7ac002f98bb863..8be31b75b86a4d 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1483,7 +1483,6 @@ mono_metadata_decode_row_col_raw (const MonoTableInfo *t, int idx, guint col) { const char *data; int n; - guint8 column_offset; guint32 bitfield = t->size_bitfield; g_assert (GINT_TO_UINT32(idx) < table_info_get_rows (t)); From 059f2945e58198fa4aba4c2c034798e8d8db8814 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 20 Mar 2024 13:09:55 -0700 Subject: [PATCH 6/7] Fix hot reload not updating column offsets --- src/mono/mono/component/hot_reload.c | 21 +++++++++++---------- src/mono/mono/metadata/metadata-internals.h | 1 + src/mono/mono/metadata/metadata.c | 14 +++++++------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/mono/mono/component/hot_reload.c b/src/mono/mono/component/hot_reload.c index 8d14eca731577c..85d1029e490dba 100644 --- a/src/mono/mono/component/hot_reload.c +++ b/src/mono/mono/component/hot_reload.c @@ -933,6 +933,7 @@ delta_info_initialize_mutants (const MonoImage *base, const BaselineInfo *base_i tbl->row_size = prev_table->row_size; tbl->size_bitfield = prev_table->size_bitfield; } + mono_metadata_compute_column_offsets (tbl); tbl->rows_ = rows; g_assert (tbl->rows_ > 0 && tbl->row_size != 0); @@ -1890,7 +1891,7 @@ apply_enclog_pass2 (Pass2Context *ctx, MonoImage *image_base, BaselineInfo *base gboolean is_addition = token_index-1 >= delta_info->count[token_table].prev_gen_rows ; *should_invalidate_transformed_code |= table_should_invalidate_transformed_code (token_table); - + mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_METADATA_UPDATE, "enclog i=%d: token=0x%08x (table=%s): %d:\t%s", i, log_token, mono_meta_table_name (token_table), func_code, (is_addition ? "ADD" : "UPDATE")); @@ -2934,7 +2935,7 @@ add_property_to_existing_class (MonoImage *image_base, BaselineInfo *base_info, parent_info->generation = generation; return prop; - + } MonoClassMetadataUpdateEvent * @@ -2962,7 +2963,7 @@ add_event_to_existing_class (MonoImage *image_base, BaselineInfo *base_info, uin parent_info->generation = generation; return evt; - + } @@ -3017,7 +3018,7 @@ add_semantic_method_to_existing_event (MonoImage *image_base, BaselineInfo *base g_assert (m_event_is_from_update (evt)); MonoMethod **dest = NULL; - + switch (semantics) { case METHOD_SEMANTIC_ADD_ON: dest = &evt->add; @@ -3425,7 +3426,7 @@ recompute_ginst_props (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, for (GSList *ptr = gtd_info->added_props; ptr; ptr = ptr->next) { MonoClassMetadataUpdateProperty *gtd_added_prop = (MonoClassMetadataUpdateProperty *)ptr->data; MonoClassMetadataUpdateProperty *added_prop = mono_class_new0 (ginst, MonoClassMetadataUpdateProperty, 1); - + added_prop->prop = gtd_added_prop->prop; added_prop->token = gtd_added_prop->token; @@ -3453,7 +3454,7 @@ recompute_ginst_events (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, for (GSList *ptr = gtd_info->added_events; ptr; ptr = ptr->next) { MonoClassMetadataUpdateEvent *gtd_added_event = (MonoClassMetadataUpdateEvent *)ptr->data; MonoClassMetadataUpdateEvent *added_event = mono_class_new0 (ginst, MonoClassMetadataUpdateEvent, 1); - + added_event->evt = gtd_added_event->evt; if (added_event->evt.add) @@ -3466,7 +3467,7 @@ recompute_ginst_events (MonoClass *ginst, MonoClassMetadataUpdateInfo *info, added_event->evt.raise = mono_class_inflate_generic_method_full_checked ( added_event->evt.raise, ginst, mono_class_get_context (ginst), error); mono_error_assert_ok (error); /*FIXME proper error handling*/ - + added_event->evt.parent = ginst; info->added_events = g_slist_prepend_mem_manager (m_class_get_mem_manager (ginst), info->added_events, (gpointer)added_event); @@ -3506,7 +3507,7 @@ recompute_ginst_update_info(MonoClass *ginst, MonoClass *gtd, MonoClassMetadataU { // if ginst has a `MonoClassMetadataUpdateInfo`, use it to start with, otherwise, allocate a new one MonoClassMetadataUpdateInfo *info = mono_class_get_or_add_metadata_update_info (ginst); - + if (!info) info = mono_class_new0 (ginst, MonoClassMetadataUpdateInfo, 1); @@ -3517,13 +3518,13 @@ recompute_ginst_update_info(MonoClass *ginst, MonoClass *gtd, MonoClassMetadataU recompute_ginst_events (ginst, info, gtd, gtd_info, error); mono_error_assert_ok (error); - + recompute_ginst_fields (ginst, info, gtd, gtd_info, error); mono_error_assert_ok (error); // finally, update the generation of the ginst info to the same one as the gtd info->generation = gtd_info->generation; - // we're done info is now up to date + // we're done info is now up to date } static MonoProperty * diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index 320291e6930ff2..116cf30655c780 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -896,6 +896,7 @@ mono_metadata_table_bounds_check (MonoImage *image, int table_index, int token_i MONO_COMPONENT_API const char * mono_meta_table_name (int table); void mono_metadata_compute_table_bases (MonoImage *meta); +void mono_metadata_compute_column_offsets (MonoTableInfo *table); gboolean mono_metadata_interfaces_from_typedef_full (MonoImage *image, diff --git a/src/mono/mono/metadata/metadata.c b/src/mono/mono/metadata/metadata.c index 8be31b75b86a4d..d005bfdb6b6b68 100644 --- a/src/mono/mono/metadata/metadata.c +++ b/src/mono/mono/metadata/metadata.c @@ -1003,14 +1003,14 @@ mono_metadata_table_bounds_check_slow (MonoImage *image, int table_index, int to return mono_metadata_update_table_bounds_check (image, table_index, token_index); } -static void -compute_column_offsets (guint32 bitfield, guint8 column_offsets[MONO_TABLE_INFO_MAX_COLUMNS]) +void +mono_metadata_compute_column_offsets (MonoTableInfo *table) { - int offset = 0, c = mono_metadata_table_count (bitfield); - memset(column_offsets, 0, MONO_TABLE_INFO_MAX_COLUMNS); + int offset = 0, c = mono_metadata_table_count (table->size_bitfield); + memset(table->column_offsets, 0, MONO_TABLE_INFO_MAX_COLUMNS); for (int i = 0; i < c; i++) { - int size = mono_metadata_table_size (bitfield, i); - column_offsets[i] = (guint8)offset; + int size = mono_metadata_table_size (table->size_bitfield, i); + table->column_offsets[i] = (guint8)offset; offset += size; } } @@ -1034,7 +1034,7 @@ mono_metadata_compute_table_bases (MonoImage *meta) continue; table->row_size = mono_metadata_compute_size (meta, i, &table->size_bitfield); - compute_column_offsets (table->size_bitfield, table->column_offsets); + mono_metadata_compute_column_offsets (table); table->base = base; base += table_info_get_rows (table) * table->row_size; } From d3ef4c358bfcbf52b134188165c791e196703cd4 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 20 Mar 2024 18:08:13 -0700 Subject: [PATCH 7/7] Add missing component api attribute --- src/mono/mono/metadata/metadata-internals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index 116cf30655c780..67c6d1350473d1 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -896,6 +896,7 @@ mono_metadata_table_bounds_check (MonoImage *image, int table_index, int token_i MONO_COMPONENT_API const char * mono_meta_table_name (int table); void mono_metadata_compute_table_bases (MonoImage *meta); +MONO_COMPONENT_API void mono_metadata_compute_column_offsets (MonoTableInfo *table); gboolean