From 4904d441b87dfdc8fd3c5df88488a36528f025db Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Mon, 29 Apr 2024 14:52:48 +0200 Subject: [PATCH 01/12] Refactor mono_fixup_symbol_name --- src/mono/browser/runtime/runtime.c | 4 ++-- src/mono/mono/metadata/native-library.c | 31 +++++++++++++++++++++---- src/mono/mono/metadata/native-library.h | 2 +- src/mono/mono/mini/aot-compiler.c | 28 ++++------------------ src/mono/mono/mini/mini-llvm.c | 15 +----------- 5 files changed, 35 insertions(+), 45 deletions(-) diff --git a/src/mono/browser/runtime/runtime.c b/src/mono/browser/runtime/runtime.c index 8ddcdbce13863..9bcf2177d86a4 100644 --- a/src/mono/browser/runtime/runtime.c +++ b/src/mono/browser/runtime/runtime.c @@ -65,7 +65,7 @@ int mono_wasm_enable_gc = 1; /* Missing from public headers */ -char *mono_fixup_symbol_name (char *key); +char *mono_fixup_symbol_name (const char *prefix, const char *key, const char *suffix); void mono_icall_table_init (void); void mono_wasm_enable_debugging (int); void mono_ee_interp_init (const char *opts); @@ -214,7 +214,7 @@ get_native_to_interp (MonoMethod *method, void *extra_arg) assert (strlen (name) < 100); snprintf (key, sizeof(key), "%s_%s_%s", name, class_name, method_name); - char* fixedName = mono_fixup_symbol_name(key); + char* fixedName = mono_fixup_symbol_name("", key, ""); addr = wasm_dl_get_native_to_interp (fixedName, extra_arg); MONO_EXIT_GC_UNSAFE; return addr; diff --git a/src/mono/mono/metadata/native-library.c b/src/mono/mono/metadata/native-library.c index 142c467fdd0af..a9075bdeccf80 100644 --- a/src/mono/mono/metadata/native-library.c +++ b/src/mono/mono/metadata/native-library.c @@ -1223,11 +1223,32 @@ mono_loader_install_pinvoke_override (PInvokeOverrideFn override_fn) pinvoke_override = override_fn; } +static int mono_precompute_size (const char *key) +{ + int size = 1; // Null terminator + int len = (int)strlen (key); + for (int i = 0; i < len; ++i) { + unsigned char b = key[i]; + if ((b >= '0' && b <= '9') || + (b >= 'a' && b <= 'z') || + (b >= 'A' && b <= 'Z') || + b == '_' || b == '.' || b == '-' || b == '+' || b == '<' || b == '>') { + size++; + } + else { + size += 4; + } + } + return size; +} + // Keep synced with FixupSymbolName from src/tasks/Common/Utils.cs -char* mono_fixup_symbol_name (char *key) { - char* fixedName = malloc(256); +char* mono_fixup_symbol_name (const char *prefix, const char *key, const char *suffix) { + int size = mono_precompute_size (key) + strlen (prefix) + strlen (suffix); + char fixedName[size]; int sb_index = 0; int len = (int)strlen (key); + strcpy(fixedName, prefix); for (int i = 0; i < len; ++i) { unsigned char b = key[i]; @@ -1242,12 +1263,14 @@ char* mono_fixup_symbol_name (char *key) { } else { // Append the hexadecimal representation of b between underscores - sprintf(&fixedName[sb_index], "_%X_", b); + snprintf(&fixedName[sb_index], sizeof(fixedName) - sb_index - 1, "_%X_", b); sb_index += 4; // Move the index after the appended hexadecimal characters } } + strcpy(&fixedName[sb_index], suffix); + // Null-terminate the fixedName string - fixedName[sb_index] = '\0'; + fixedName[size-1] = '\0'; return fixedName; } diff --git a/src/mono/mono/metadata/native-library.h b/src/mono/mono/metadata/native-library.h index 8a0b0e20b9ec6..9a794a5bb8af7 100644 --- a/src/mono/mono/metadata/native-library.h +++ b/src/mono/mono/metadata/native-library.h @@ -36,6 +36,6 @@ void mono_loader_install_pinvoke_override (PInvokeOverrideFn override_fn); char * -mono_fixup_symbol_name (char *key); +mono_fixup_symbol_name (const char *prefix, const char *key, const char *suffix); #endif diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index 9aa0760231dd1..25db07c60ec65 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -12407,25 +12407,15 @@ emit_file_info (MonoAotCompile *acfg) init_aot_file_info (acfg, info); if (acfg->aot_opts.static_link) { - char symbol [MAX_SYMBOL_SIZE]; + char prefix [MAX_SYMBOL_SIZE]; /* * Emit a global symbol which can be passed by an embedding app to * mono_aot_register_module (). The symbol points to a pointer to the file info * structure. */ - sprintf (symbol, "%smono_aot_module_%s_info", acfg->user_symbol_prefix, acfg->image->assembly->aname.name); -#ifdef TARGET_WASM - acfg->static_linking_symbol = g_strdup (mono_fixup_symbol_name(symbol)); -#else - /* Get rid of characters which cannot occur in symbols */ - char *p = symbol; - for (p = symbol; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } - acfg->static_linking_symbol = g_strdup (symbol); -#endif + sprintf (prefix, "%smono_aot_module_", acfg->user_symbol_prefix); + acfg->static_linking_symbol = g_strdup (mono_fixup_symbol_name(prefix, acfg->image->assembly->aname.name, "_info")); } if (acfg->llvm) @@ -15122,17 +15112,7 @@ aot_assembly (MonoAssembly *ass, guint32 jit_opts, MonoAotOptions *aot_options) acfg->flags = (MonoAotFileFlags)(acfg->flags | MONO_AOT_FILE_FLAG_LLVM_ONLY); acfg->assembly_name_sym = g_strdup (get_assembly_prefix (acfg->image)); -#ifdef TARGET_WASM - acfg->global_prefix = g_strdup_printf ("mono_aot_%s", g_strdup(mono_fixup_symbol_name (acfg->assembly_name_sym))); -#else - char *p; - /* Get rid of characters which cannot occur in symbols */ - for (p = acfg->assembly_name_sym; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } - acfg->global_prefix = g_strdup_printf ("mono_aot_%s", acfg->assembly_name_sym); -#endif + acfg->global_prefix = mono_fixup_symbol_name("mono_aot_", acfg->assembly_name_sym, ""); acfg->plt_symbol = g_strdup_printf ("%s_plt", acfg->global_prefix); acfg->got_symbol = g_strdup_printf ("%s_got", acfg->global_prefix); if (acfg->llvm) { diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 0c0f4e0cb1f2e..382e9da42eef0 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -14542,22 +14542,9 @@ emit_aot_file_info (MonoLLVMModule *module) LLVMSetInitializer (info_var, LLVMConstNamedStruct (module->info_var_type, fields, nfields)); if (module->static_link) { - char *s; LLVMValueRef var; - s = g_strdup_printf ("mono_aot_module_%s_info", module->assembly->aname.name); -#ifdef TARGET_WASM - var = LLVMAddGlobal (module->lmodule, pointer_type (LLVMInt8Type ()), g_strdup (mono_fixup_symbol_name(s))); -#else - /* Get rid of characters which cannot occur in symbols */ - char *p = s; - for (p = s; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } - var = LLVMAddGlobal (module->lmodule, pointer_type (LLVMInt8Type ()), s); -#endif - g_free (s); + var = LLVMAddGlobal (module->lmodule, pointer_type (LLVMInt8Type ()), g_strdup (mono_fixup_symbol_name("mono_aot_module_", module->assembly->aname.name, "_info"))); LLVMSetInitializer (var, LLVMConstBitCast (LLVMGetNamedGlobal (module->lmodule, "mono_aot_file_info"), pointer_type (LLVMInt8Type ()))); LLVMSetLinkage (var, LLVMExternalLinkage); } From 7277c3f78cfb1b5d026a5db06c5112daac6c6ff2 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Mon, 29 Apr 2024 19:41:27 +0200 Subject: [PATCH 02/12] Apply @lambdageek's feedback --- src/mono/browser/runtime/runtime.c | 3 +- src/mono/mono/metadata/native-library.c | 60 ++++++++++++++----------- src/mono/mono/mini/aot-compiler.c | 6 +-- src/mono/mono/mini/mini-llvm.c | 5 ++- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/mono/browser/runtime/runtime.c b/src/mono/browser/runtime/runtime.c index 9bcf2177d86a4..436c3a2958632 100644 --- a/src/mono/browser/runtime/runtime.c +++ b/src/mono/browser/runtime/runtime.c @@ -214,8 +214,9 @@ get_native_to_interp (MonoMethod *method, void *extra_arg) assert (strlen (name) < 100); snprintf (key, sizeof(key), "%s_%s_%s", name, class_name, method_name); - char* fixedName = mono_fixup_symbol_name("", key, ""); + char *fixedName = mono_fixup_symbol_name ("", key, ""); addr = wasm_dl_get_native_to_interp (fixedName, extra_arg); + free (fixedName); MONO_EXIT_GC_UNSAFE; return addr; } diff --git a/src/mono/mono/metadata/native-library.c b/src/mono/mono/metadata/native-library.c index a9075bdeccf80..a22876215d433 100644 --- a/src/mono/mono/metadata/native-library.c +++ b/src/mono/mono/metadata/native-library.c @@ -1223,16 +1223,35 @@ mono_loader_install_pinvoke_override (PInvokeOverrideFn override_fn) pinvoke_override = override_fn; } +static gboolean +is_symbol_char_verbatim (unsigned char b) +{ + return ((b >= '0' && b <= '9') || (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z')); +} + +static gboolean +is_symbol_char_underscore (unsigned char c) +{ + switch (c) { + case '_': + case '.': + case '-': + case '+': + case '<': + case '>': + return TRUE; + default: + return FALSE; + } +} + static int mono_precompute_size (const char *key) { int size = 1; // Null terminator int len = (int)strlen (key); for (int i = 0; i < len; ++i) { unsigned char b = key[i]; - if ((b >= '0' && b <= '9') || - (b >= 'a' && b <= 'z') || - (b >= 'A' && b <= 'Z') || - b == '_' || b == '.' || b == '-' || b == '+' || b == '<' || b == '>') { + if (is_symbol_char_verbatim (b) || is_symbol_char_underscore (b)) { size++; } else { @@ -1245,32 +1264,21 @@ static int mono_precompute_size (const char *key) // Keep synced with FixupSymbolName from src/tasks/Common/Utils.cs char* mono_fixup_symbol_name (const char *prefix, const char *key, const char *suffix) { int size = mono_precompute_size (key) + strlen (prefix) + strlen (suffix); - char fixedName[size]; - int sb_index = 0; + GString *str = g_string_sized_new (size); int len = (int)strlen (key); - strcpy(fixedName, prefix); + g_string_append_printf (str, "%s", prefix); for (int i = 0; i < len; ++i) { unsigned char b = key[i]; - if ((b >= '0' && b <= '9') || - (b >= 'a' && b <= 'z') || - (b >= 'A' && b <= 'Z') || - (b == '_')) { - fixedName[sb_index++] = b; - } - else if (b == '.' || b == '-' || b == '+' || b == '<' || b == '>') { - fixedName[sb_index++] = '_'; - } - else { - // Append the hexadecimal representation of b between underscores - snprintf(&fixedName[sb_index], sizeof(fixedName) - sb_index - 1, "_%X_", b); - sb_index += 4; // Move the index after the appended hexadecimal characters + if (is_symbol_char_verbatim (b)) { + g_string_append_c (str, b); + } else if (is_symbol_char_underscore (b)) { + g_string_append_c (str, '_'); + } else { + // Append the hex representation of b between underscores + g_string_append_printf (str, "_%X_", b); } } - - strcpy(&fixedName[sb_index], suffix); - - // Null-terminate the fixedName string - fixedName[size-1] = '\0'; - return fixedName; + g_string_append_printf (str, "%s", suffix); + return g_string_free (str, FALSE); } diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index 25db07c60ec65..ce0a7e2c1258b 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -12414,8 +12414,8 @@ emit_file_info (MonoAotCompile *acfg) * mono_aot_register_module (). The symbol points to a pointer to the file info * structure. */ - sprintf (prefix, "%smono_aot_module_", acfg->user_symbol_prefix); - acfg->static_linking_symbol = g_strdup (mono_fixup_symbol_name(prefix, acfg->image->assembly->aname.name, "_info")); + snprintf (prefix, MAX_SYMBOL_SIZE, "%smono_aot_module_", acfg->user_symbol_prefix); + acfg->static_linking_symbol = mono_fixup_symbol_name (prefix, acfg->image->assembly->aname.name, "_info"); } if (acfg->llvm) @@ -15112,7 +15112,7 @@ aot_assembly (MonoAssembly *ass, guint32 jit_opts, MonoAotOptions *aot_options) acfg->flags = (MonoAotFileFlags)(acfg->flags | MONO_AOT_FILE_FLAG_LLVM_ONLY); acfg->assembly_name_sym = g_strdup (get_assembly_prefix (acfg->image)); - acfg->global_prefix = mono_fixup_symbol_name("mono_aot_", acfg->assembly_name_sym, ""); + acfg->global_prefix = mono_fixup_symbol_name ("mono_aot_", acfg->assembly_name_sym, ""); acfg->plt_symbol = g_strdup_printf ("%s_plt", acfg->global_prefix); acfg->got_symbol = g_strdup_printf ("%s_got", acfg->global_prefix); if (acfg->llvm) { diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 382e9da42eef0..650a5a775e670 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -14543,8 +14543,9 @@ emit_aot_file_info (MonoLLVMModule *module) if (module->static_link) { LLVMValueRef var; - - var = LLVMAddGlobal (module->lmodule, pointer_type (LLVMInt8Type ()), g_strdup (mono_fixup_symbol_name("mono_aot_module_", module->assembly->aname.name, "_info"))); + char *fixedName = mono_fixup_symbol_name ("mono_aot_module_", module->assembly->aname.name, "_info"); + var = LLVMAddGlobal (module->lmodule, pointer_type (LLVMInt8Type ()), fixedName); + free (fixedName); LLVMSetInitializer (var, LLVMConstBitCast (LLVMGetNamedGlobal (module->lmodule, "mono_aot_file_info"), pointer_type (LLVMInt8Type ()))); LLVMSetLinkage (var, LLVMExternalLinkage); } From 9116efe19570039837549fcfd5aa071d278be47a Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Mon, 29 Apr 2024 20:40:31 +0200 Subject: [PATCH 03/12] Fix compiler errors and free memory --- src/mono/mono/metadata/native-library.c | 12 ++++++------ src/mono/mono/mini/aot-compiler.c | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/mono/mono/metadata/native-library.c b/src/mono/mono/metadata/native-library.c index a22876215d433..4731b469d30cd 100644 --- a/src/mono/mono/metadata/native-library.c +++ b/src/mono/mono/metadata/native-library.c @@ -1247,9 +1247,9 @@ is_symbol_char_underscore (unsigned char c) static int mono_precompute_size (const char *key) { - int size = 1; // Null terminator - int len = (int)strlen (key); - for (int i = 0; i < len; ++i) { + size_t size = 1; // Null terminator + size_t len = (int)strlen (key); + for (size_t i = 0; i < len; ++i) { unsigned char b = key[i]; if (is_symbol_char_verbatim (b) || is_symbol_char_underscore (b)) { size++; @@ -1263,12 +1263,12 @@ static int mono_precompute_size (const char *key) // Keep synced with FixupSymbolName from src/tasks/Common/Utils.cs char* mono_fixup_symbol_name (const char *prefix, const char *key, const char *suffix) { - int size = mono_precompute_size (key) + strlen (prefix) + strlen (suffix); + size_t size = mono_precompute_size (key) + strlen (prefix) + strlen (suffix); GString *str = g_string_sized_new (size); - int len = (int)strlen (key); + size_t len = (int)strlen (key); g_string_append_printf (str, "%s", prefix); - for (int i = 0; i < len; ++i) { + for (size_t i = 0; i < len; ++i) { unsigned char b = key[i]; if (is_symbol_char_verbatim (b)) { g_string_append_c (str, b); diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index ce0a7e2c1258b..18b9e3567c13c 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -12422,6 +12422,9 @@ emit_file_info (MonoAotCompile *acfg) mono_llvm_emit_aot_file_info (info, acfg->has_jitted_code); else emit_aot_file_info (acfg, info); + + if (acfg->static_linking_symbol != NULL) + g_free (acfg->static_linking_symbol); } static void @@ -14284,6 +14287,7 @@ acfg_free (MonoAotCompile *acfg) g_free (acfg->static_linking_symbol); g_free (acfg->got_symbol); g_free (acfg->plt_symbol); + g_free (acfg->global_prefix); g_ptr_array_free (acfg->methods, TRUE); g_ptr_array_free (acfg->image_table, TRUE); g_ptr_array_free (acfg->globals, TRUE); From e68339a38b100b502f49b34dab1c52fb644043b1 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 30 Apr 2024 08:40:37 +0200 Subject: [PATCH 04/12] fix return type --- src/mono/mono/metadata/native-library.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/native-library.c b/src/mono/mono/metadata/native-library.c index 4731b469d30cd..6adb70bfda4d2 100644 --- a/src/mono/mono/metadata/native-library.c +++ b/src/mono/mono/metadata/native-library.c @@ -1245,7 +1245,7 @@ is_symbol_char_underscore (unsigned char c) } } -static int mono_precompute_size (const char *key) +static size_t mono_precompute_size (const char *key) { size_t size = 1; // Null terminator size_t len = (int)strlen (key); From 72732e84c313d6407a8248764043c886eb18aec6 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 30 Apr 2024 09:33:53 +0200 Subject: [PATCH 05/12] Fix iOS/tvOS failures --- src/tasks/AotCompilerTask/MonoAOTCompiler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs index 4e98e9271490b..2dc46b0c65a73 100644 --- a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs +++ b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs @@ -752,7 +752,7 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st if (CollectTrimmingEligibleMethods) { - string assemblyName = assemblyFilename.Replace(".", "_"); + string assemblyName = FixupSymbolName(assemblyFilename); string outputFileName = assemblyName + "_compiled_methods.txt"; string outputFilePath; if (string.IsNullOrEmpty(TrimmingEligibleMethodsOutputDirectory)) From d4dc940dd45edb1d8af8ad4a86125a515f890492 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 30 Apr 2024 10:43:33 +0200 Subject: [PATCH 06/12] Fix iOS/tvOS failure (checking) --- src/mono/mono/mini/mini-llvm.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 650a5a775e670..565299038510e 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -1986,15 +1986,16 @@ get_aotconst_name (MonoJumpInfoType type, gconstpointer data, int got_offset) case MONO_PATCH_INFO_METHOD_RGCTX: { MonoMethod *method = (MonoMethod*)data; char *typestr = ji_type_to_string_lower (type); - char *n = g_strdup (method->name); - len = strlen (n); - for (size_t i = 0; i < len; ++i) { - if (!isalnum (n [i])) - n [i] = '_'; - } - name = g_strdup_printf ("%s_%s_%d", typestr, n, got_offset); + char *fixedName = mono_fixup_symbol_name (typestr, method->name, ""); + // char *n = g_strdup (method->name); + // len = strlen (n); + // for (size_t i = 0; i < len; ++i) { + // if (!isalnum (n [i])) + // n [i] = '_'; + // } + name = g_strdup_printf ("%s_%d", fixedName, got_offset); g_free (typestr); - g_free (n); + g_free (fixedName); break; } default: { From d07470066a1bff99e0139713d72ff5a41dcaedbf Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 30 Apr 2024 10:59:28 +0200 Subject: [PATCH 07/12] Minor fix --- src/mono/mono/mini/mini-llvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 565299038510e..711acc209aca7 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -1960,7 +1960,7 @@ static char* get_aotconst_name (MonoJumpInfoType type, gconstpointer data, int got_offset) { char *name; - size_t len; + //size_t len; switch (type) { case MONO_PATCH_INFO_JIT_ICALL_ID: From ea29f0068ef10d1ef63c9106f5c507b8247a5e1d Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 30 Apr 2024 13:23:31 +0200 Subject: [PATCH 08/12] Revert changes --- src/mono/mono/mini/mini-llvm.c | 19 +++++++++---------- src/tasks/AotCompilerTask/MonoAOTCompiler.cs | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/mono/mono/mini/mini-llvm.c b/src/mono/mono/mini/mini-llvm.c index 711acc209aca7..650a5a775e670 100644 --- a/src/mono/mono/mini/mini-llvm.c +++ b/src/mono/mono/mini/mini-llvm.c @@ -1960,7 +1960,7 @@ static char* get_aotconst_name (MonoJumpInfoType type, gconstpointer data, int got_offset) { char *name; - //size_t len; + size_t len; switch (type) { case MONO_PATCH_INFO_JIT_ICALL_ID: @@ -1986,16 +1986,15 @@ get_aotconst_name (MonoJumpInfoType type, gconstpointer data, int got_offset) case MONO_PATCH_INFO_METHOD_RGCTX: { MonoMethod *method = (MonoMethod*)data; char *typestr = ji_type_to_string_lower (type); - char *fixedName = mono_fixup_symbol_name (typestr, method->name, ""); - // char *n = g_strdup (method->name); - // len = strlen (n); - // for (size_t i = 0; i < len; ++i) { - // if (!isalnum (n [i])) - // n [i] = '_'; - // } - name = g_strdup_printf ("%s_%d", fixedName, got_offset); + char *n = g_strdup (method->name); + len = strlen (n); + for (size_t i = 0; i < len; ++i) { + if (!isalnum (n [i])) + n [i] = '_'; + } + name = g_strdup_printf ("%s_%s_%d", typestr, n, got_offset); g_free (typestr); - g_free (fixedName); + g_free (n); break; } default: { diff --git a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs index 2dc46b0c65a73..4e98e9271490b 100644 --- a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs +++ b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs @@ -752,7 +752,7 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st if (CollectTrimmingEligibleMethods) { - string assemblyName = FixupSymbolName(assemblyFilename); + string assemblyName = assemblyFilename.Replace(".", "_"); string outputFileName = assemblyName + "_compiled_methods.txt"; string outputFilePath; if (string.IsNullOrEmpty(TrimmingEligibleMethodsOutputDirectory)) From 1b8c24b7848982ca496f482bf86644bcd88a96ed Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Mon, 6 May 2024 10:08:31 +0200 Subject: [PATCH 09/12] Fix symbol also in prefix --- src/mono/mono/mini/aot-compiler.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index 18b9e3567c13c..cc4e6172f6469 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -12407,24 +12407,21 @@ emit_file_info (MonoAotCompile *acfg) init_aot_file_info (acfg, info); if (acfg->aot_opts.static_link) { - char prefix [MAX_SYMBOL_SIZE]; + char symbol [MAX_SYMBOL_SIZE]; /* * Emit a global symbol which can be passed by an embedding app to * mono_aot_register_module (). The symbol points to a pointer to the file info * structure. */ - snprintf (prefix, MAX_SYMBOL_SIZE, "%smono_aot_module_", acfg->user_symbol_prefix); - acfg->static_linking_symbol = mono_fixup_symbol_name (prefix, acfg->image->assembly->aname.name, "_info"); + snprintf (symbol, MAX_SYMBOL_SIZE, "%smono_aot_module_%s", acfg->user_symbol_prefix, acfg->image->assembly->aname.name); + acfg->static_linking_symbol = mono_fixup_symbol_name ("", symbol, "_info"); } if (acfg->llvm) mono_llvm_emit_aot_file_info (info, acfg->has_jitted_code); else emit_aot_file_info (acfg, info); - - if (acfg->static_linking_symbol != NULL) - g_free (acfg->static_linking_symbol); } static void From 0122b5189051efb2c377f75709d51813f85ce2be Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Mon, 6 May 2024 14:25:29 +0200 Subject: [PATCH 10/12] Revert changes from aot_assembly --- src/mono/mono/mini/aot-compiler.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index cc4e6172f6469..a6cd4f8f6dfcf 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -15113,7 +15113,13 @@ aot_assembly (MonoAssembly *ass, guint32 jit_opts, MonoAotOptions *aot_options) acfg->flags = (MonoAotFileFlags)(acfg->flags | MONO_AOT_FILE_FLAG_LLVM_ONLY); acfg->assembly_name_sym = g_strdup (get_assembly_prefix (acfg->image)); - acfg->global_prefix = mono_fixup_symbol_name ("mono_aot_", acfg->assembly_name_sym, ""); + char *p; + /* Get rid of characters which cannot occur in symbols */ + for (p = acfg->assembly_name_sym; *p; ++p) { + if (!(isalnum (*p) || *p == '_')) + *p = '_'; + } + acfg->global_prefix = g_strdup_printf ("mono_aot_%s", acfg->assembly_name_sym); acfg->plt_symbol = g_strdup_printf ("%s_plt", acfg->global_prefix); acfg->got_symbol = g_strdup_printf ("%s_got", acfg->global_prefix); if (acfg->llvm) { From 9ee5b0873a8fd6701147db7892bef60e641baa69 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Tue, 7 May 2024 18:07:17 +0200 Subject: [PATCH 11/12] Apply mono_fixup_symbol_name for aot_assembly also --- src/mono/mono/mini/aot-compiler.c | 10 ++-------- src/tasks/AotCompilerTask/MonoAOTCompiler.cs | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index a6cd4f8f6dfcf..f206d2f5a635d 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -14284,7 +14284,7 @@ acfg_free (MonoAotCompile *acfg) g_free (acfg->static_linking_symbol); g_free (acfg->got_symbol); g_free (acfg->plt_symbol); - g_free (acfg->global_prefix); + g_free (acfg->assembly_name_sym); g_ptr_array_free (acfg->methods, TRUE); g_ptr_array_free (acfg->image_table, TRUE); g_ptr_array_free (acfg->globals, TRUE); @@ -15112,13 +15112,7 @@ aot_assembly (MonoAssembly *ass, guint32 jit_opts, MonoAotOptions *aot_options) if (acfg->aot_opts.llvm_only) acfg->flags = (MonoAotFileFlags)(acfg->flags | MONO_AOT_FILE_FLAG_LLVM_ONLY); - acfg->assembly_name_sym = g_strdup (get_assembly_prefix (acfg->image)); - char *p; - /* Get rid of characters which cannot occur in symbols */ - for (p = acfg->assembly_name_sym; *p; ++p) { - if (!(isalnum (*p) || *p == '_')) - *p = '_'; - } + acfg->assembly_name_sym = mono_fixup_symbol_name ("", get_assembly_prefix (acfg->image), ""); acfg->global_prefix = g_strdup_printf ("mono_aot_%s", acfg->assembly_name_sym); acfg->plt_symbol = g_strdup_printf ("%s_plt", acfg->global_prefix); acfg->got_symbol = g_strdup_printf ("%s_got", acfg->global_prefix); diff --git a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs index 4e98e9271490b..2dc46b0c65a73 100644 --- a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs +++ b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs @@ -752,7 +752,7 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st if (CollectTrimmingEligibleMethods) { - string assemblyName = assemblyFilename.Replace(".", "_"); + string assemblyName = FixupSymbolName(assemblyFilename); string outputFileName = assemblyName + "_compiled_methods.txt"; string outputFilePath; if (string.IsNullOrEmpty(TrimmingEligibleMethodsOutputDirectory)) From 805303d94eab4df9ab8609fbf5c3ddf463d785e3 Mon Sep 17 00:00:00 2001 From: Meri Khamoyan Date: Thu, 9 May 2024 09:20:15 +0200 Subject: [PATCH 12/12] free global_prefix --- src/mono/mono/mini/aot-compiler.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index f206d2f5a635d..65c99126e0004 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -14284,6 +14284,7 @@ acfg_free (MonoAotCompile *acfg) g_free (acfg->static_linking_symbol); g_free (acfg->got_symbol); g_free (acfg->plt_symbol); + g_free (acfg->global_prefix); g_free (acfg->assembly_name_sym); g_ptr_array_free (acfg->methods, TRUE); g_ptr_array_free (acfg->image_table, TRUE);