X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Faot-compiler.c;h=c2dd1b28eebe419ab43ba79e3b25c250012db779;hb=e64e3dbaca04061854aa9b3764fd415d6e7119a9;hp=fb372baa5e1b39852f89994e24211c5ea36fb2dd;hpb=f8a969aae9cce2ca78795dd29e97f347d129a82b;p=mono.git diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index fb372baa5e1..c2dd1b28eeb 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -56,7 +56,7 @@ #include #include #include -#include +#include #include #include "aot-compiler.h" @@ -3978,6 +3978,8 @@ add_wrappers (MonoAotCompile *acfg) add_method (acfg, m); if ((m = mono_gc_get_managed_allocator_by_type (i, MANAGED_ALLOCATOR_SLOW_PATH))) add_method (acfg, m); + if ((m = mono_gc_get_managed_allocator_by_type (i, MANAGED_ALLOCATOR_PROFILER))) + add_method (acfg, m); } /* write barriers */ @@ -5751,7 +5753,8 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint encode_value (patch_info->data.index, p, &p); break; case MONO_PATCH_INFO_INTERNAL_METHOD: - case MONO_PATCH_INFO_JIT_ICALL_ADDR: { + case MONO_PATCH_INFO_JIT_ICALL_ADDR: + case MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL: { guint32 len = strlen (patch_info->data.name); encode_value (len, p, &p); @@ -5817,6 +5820,8 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint break; case MONO_PATCH_INFO_INTERRUPTION_REQUEST_FLAG: break; + case MONO_PATCH_INFO_PROFILER_ALLOCATION_COUNT: + break; case MONO_PATCH_INFO_RGCTX_FETCH: case MONO_PATCH_INFO_RGCTX_SLOT_INDEX: { MonoJumpInfoRgctxEntry *entry = patch_info->data.rgctx_entry; @@ -6736,10 +6741,6 @@ emit_trampolines (MonoAotCompile *acfg) #ifdef DISABLE_REMOTING if (tramp_type == MONO_TRAMPOLINE_GENERIC_VIRTUAL_REMOTING) continue; -#endif -#ifndef MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD - if (tramp_type == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) - continue; #endif mono_arch_create_generic_trampoline ((MonoTrampolineType)tramp_type, &info, acfg->aot_opts.use_trampolines_page? 2: TRUE); emit_trampoline (acfg, acfg->got_offset, info); @@ -6820,18 +6821,13 @@ emit_trampolines (MonoAotCompile *acfg) } } -#ifdef MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD_AOT - mono_arch_create_handler_block_trampoline (&info, TRUE); - emit_trampoline (acfg, acfg->got_offset, info); -#endif - -#endif /* #ifdef MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES */ - if (mono_aot_mode_is_interp (&acfg->aot_opts)) { mono_arch_get_enter_icall_trampoline (&info); emit_trampoline (acfg, acfg->got_offset, info); } +#endif /* #ifdef MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES */ + /* Emit trampolines which are numerous */ /* @@ -11373,6 +11369,13 @@ add_preinit_got_slots (MonoAotCompile *acfg) get_got_offset (acfg, FALSE, ji); get_got_offset (acfg, TRUE, ji); + /* Called by native-to-managed wrappers on possibly unattached threads */ + ji = (MonoJumpInfo *)mono_mempool_alloc0 (acfg->mempool, sizeof (MonoJumpInfo)); + ji->type = MONO_PATCH_INFO_JIT_ICALL_ADDR_NOCALL; + ji->data.name = "mono_threads_attach_coop"; + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); + for (i = 0; i < sizeof (preinited_jit_icalls) / sizeof (char*); ++i) { ji = (MonoJumpInfo *)mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); ji->type = MONO_PATCH_INFO_INTERNAL_METHOD; @@ -11619,7 +11622,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) #ifdef ENABLE_LLVM if (acfg->llvm) { llvm_acfg = acfg; - mono_llvm_create_aot_module (acfg->image->assembly, acfg->global_prefix, TRUE, acfg->aot_opts.static_link, acfg->aot_opts.llvm_only); + mono_llvm_create_aot_module (acfg->image->assembly, acfg->global_prefix, acfg->nshared_got_entries, TRUE, acfg->aot_opts.static_link, acfg->aot_opts.llvm_only); } #endif @@ -11688,8 +11691,14 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->tmpfname = g_strdup_printf ("%s.s", acfg->image->name); acfg->fp = fopen (acfg->tmpfname, "w+"); } else { - int i = g_file_open_tmp ("mono_aot_XXXXXX", &acfg->tmpfname, NULL); - acfg->fp = fdopen (i, "w+"); + if (strcmp (acfg->aot_opts.temp_path, "") == 0) { + int i = g_file_open_tmp ("mono_aot_XXXXXX", &acfg->tmpfname, NULL); + acfg->fp = fdopen (i, "w+"); + } else { + acfg->tmpbasename = g_build_filename (acfg->aot_opts.temp_path, "temp", NULL); + acfg->tmpfname = g_strdup_printf ("%s.s", acfg->tmpbasename); + acfg->fp = fopen (acfg->tmpfname, "w+"); + } } if (acfg->fp == 0 && !acfg->aot_opts.llvm_only) { aot_printerrf (acfg, "Unable to open file '%s': %s\n", acfg->tmpfname, strerror (errno));