[mono][aot] Fix --full-aot-interp support on amd64. (#52861)
authorZoltan Varga <vargaz@gmail.com>
Tue, 18 May 2021 11:19:51 +0000 (07:19 -0400)
committerGitHub <noreply@github.com>
Tue, 18 May 2021 11:19:51 +0000 (07:19 -0400)
We need to generate more trampolines since a lot of runtime code generates
trampolines even in --full-aot-interp mode.
Fixes https://github.com/dotnet/runtime/pull/52848.

src/mono/mono/mini/aot-compiler.c
src/mono/mono/mini/jit.h

index 6bb97b238be5bdb59233d65d96428bb80b2e457c..6fde9c65e3f192ac92c5e06f420ab13e0068f740 100644 (file)
@@ -13962,19 +13962,22 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options,
                        g_ptr_array_add (acfg->method_order,GUINT_TO_POINTER (method_index));
        }
 
-       acfg->num_trampolines [MONO_AOT_TRAMP_SPECIFIC] = mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.ntrampolines : 0;
+       if (mono_aot_mode_is_interp (&acfg->aot_opts) || mono_aot_mode_is_full (&acfg->aot_opts)) {
+               /* In interp mode, we don't need some trampolines, but this avoids having to add more conditionals at runtime */
+               acfg->num_trampolines [MONO_AOT_TRAMP_SPECIFIC] = acfg->aot_opts.ntrampolines;
 #ifdef MONO_ARCH_GSHARED_SUPPORTED
-       acfg->num_trampolines [MONO_AOT_TRAMP_STATIC_RGCTX] = mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.nrgctx_trampolines : 0;
+               acfg->num_trampolines [MONO_AOT_TRAMP_STATIC_RGCTX] = acfg->aot_opts.nrgctx_trampolines;
 #endif
-       acfg->num_trampolines [MONO_AOT_TRAMP_IMT] = mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.nimt_trampolines : 0;
+               acfg->num_trampolines [MONO_AOT_TRAMP_IMT] = acfg->aot_opts.nimt_trampolines;
 #ifdef MONO_ARCH_GSHAREDVT_SUPPORTED
-       if (acfg->jit_opts & MONO_OPT_GSHAREDVT)
-               acfg->num_trampolines [MONO_AOT_TRAMP_GSHAREDVT_ARG] = mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.ngsharedvt_arg_trampolines : 0;
+               if (acfg->jit_opts & MONO_OPT_GSHAREDVT)
+                       acfg->num_trampolines [MONO_AOT_TRAMP_GSHAREDVT_ARG] = acfg->aot_opts.ngsharedvt_arg_trampolines;
 #endif
 #ifdef MONO_ARCH_HAVE_FTNPTR_ARG_TRAMPOLINE
-       acfg->num_trampolines [MONO_AOT_TRAMP_FTNPTR_ARG] = mono_aot_mode_is_interp (&acfg->aot_opts) ? acfg->aot_opts.nftnptr_arg_trampolines : 0;
+               acfg->num_trampolines [MONO_AOT_TRAMP_FTNPTR_ARG] = acfg->aot_opts.nftnptr_arg_trampolines;
 #endif
-       acfg->num_trampolines [MONO_AOT_TRAMP_UNBOX_ARBITRARY] = mono_aot_mode_is_interp (&acfg->aot_opts) && mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.nunbox_arbitrary_trampolines : 0;
+               acfg->num_trampolines [MONO_AOT_TRAMP_UNBOX_ARBITRARY] = mono_aot_mode_is_interp (&acfg->aot_opts) && mono_aot_mode_is_full (&acfg->aot_opts) ? acfg->aot_opts.nunbox_arbitrary_trampolines : 0;
+       }
 
        acfg->temp_prefix = mono_img_writer_get_temp_label_prefix (NULL);
 
index 02639c95122de060e16bebf8fa6a75d3547e1923..7f7e46403efee9f65ad9a6bec5a9d421ed624901 100644 (file)
@@ -58,8 +58,10 @@ typedef enum {
        MONO_AOT_MODE_FULL,
        /* Same as full, but use only llvm compiled code */
        MONO_AOT_MODE_LLVMONLY,
-       /* Uses Interpreter, JIT is disabled and not allowed,
-        * equivalent to "--full-aot --interpreter" */
+       /*
+        * Use interpreter only, no native code is generated
+        * at runtime. Trampolines are loaded from corlib aot image.
+        */
        MONO_AOT_MODE_INTERP,
        /* Same as INTERP, but use only llvm compiled code */
        MONO_AOT_MODE_INTERP_LLVMONLY,