X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-runtime.c;h=795bab9e41d319ebb23ec690c14ee6cf6c288980;hb=8e6b87f97ab115b7baeb81169839981aa2f8a205;hp=ba560b3b3b3a3ff96f07d0cd4b92288063d00342;hpb=42b099c71b7250dd4aa80d7f6721603461f38e96;p=mono.git diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index ba560b3b3b3..795bab9e41d 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -1,3 +1,4 @@ + /* * mini-runtime.c: Runtime code for the JIT * @@ -8,6 +9,7 @@ * Copyright 2002-2003 Ximian, Inc. * Copyright 2003-2010 Novell, Inc. * Copyright 2011-2015 Xamarin, Inc (http://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -81,6 +83,7 @@ #ifdef MONO_ARCH_LLVM_SUPPORTED #ifdef ENABLE_LLVM #include "mini-llvm-cpp.h" +#include "llvm-jit.h" #endif #endif @@ -1307,6 +1310,7 @@ mono_patch_info_hash (gconstpointer data) case MONO_PATCH_INFO_METHOD_JUMP: case MONO_PATCH_INFO_IMAGE: case MONO_PATCH_INFO_ICALL_ADDR: + case MONO_PATCH_INFO_ICALL_ADDR_CALL: case MONO_PATCH_INFO_FIELD: case MONO_PATCH_INFO_SFLDA: case MONO_PATCH_INFO_SEQ_POINT_INFO: @@ -1690,6 +1694,7 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, target = (mono_metadata_blob_heap (patch_info->data.token->image, patch_info->data.token->token) + 2); break; case MONO_PATCH_INFO_ICALL_ADDR: + case MONO_PATCH_INFO_ICALL_ADDR_CALL: /* run_cctors == 0 -> AOT */ if (patch_info->data.method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) { const char *exc_class; @@ -2004,7 +2009,9 @@ mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt, MonoError *er MonoVTable *vtable; mono_jit_stats.methods_lookups++; - vtable = mono_class_vtable (domain, method->klass); + vtable = mono_class_vtable_full (domain, method->klass, error); + if (!is_ok (error)) + return NULL; g_assert (vtable); if (!mono_runtime_class_init_full (vtable, error)) return NULL; @@ -2161,7 +2168,6 @@ mono_jit_free_method (MonoDomain *domain, MonoMethod *method) } g_slist_free (remove); } - mono_domain_unlock (domain); #ifdef MONO_ARCH_HAVE_INVALIDATE_METHOD @@ -2386,7 +2392,7 @@ create_runtime_invoke_info (MonoDomain *domain, MonoMethod *method, gpointer com if (!info->dyn_call_info) { if (mono_llvm_only) { -#ifndef ENABLE_GSHAREDVT +#ifndef MONO_ARCH_GSHAREDVT_SUPPORTED g_assert_not_reached (); #endif info->gsharedvt_invoke = TRUE; @@ -2498,7 +2504,7 @@ mono_llvmonly_runtime_invoke (MonoMethod *method, RuntimeInvokeInfo *info, void mono_error_set_exception_instance (error, (MonoException*) *exc); if (sig->ret->type != MONO_TYPE_VOID && info->ret_box_class) - return mono_value_box (domain, info->ret_box_class, retval); + return mono_value_box_checked (domain, info->ret_box_class, retval, error); else return *(MonoObject**)retval; } @@ -2673,7 +2679,7 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec mono_arch_finish_dyn_call (info->dyn_call_info, buf); if (info->ret_box_class) - return mono_value_box (domain, info->ret_box_class, retval); + return mono_value_box_checked (domain, info->ret_box_class, retval, error); else return *(MonoObject**)retval; } @@ -3059,13 +3065,13 @@ mono_jit_create_remoting_trampoline (MonoDomain *domain, MonoMethod *method, Mon } #endif -static void +static G_GNUC_UNUSED void no_imt_trampoline (void) { g_assert_not_reached (); } -static void +static G_GNUC_UNUSED void no_vcall_trampoline (void) { g_assert_not_reached (); @@ -3308,6 +3314,8 @@ mini_parse_debug_option (const char *option) mono_align_small_structs = TRUE; else if (!strcmp (option, "native-debugger-break")) debug_options.native_debugger_break = TRUE; + else if (!strcmp (option, "disable_omit_fp")) + debug_options.disable_omit_fp = TRUE; else return FALSE; @@ -3516,6 +3524,12 @@ runtime_invoke_info_free (gpointer value) g_free (info); } +static void +free_jit_callee_list (gpointer key, gpointer value, gpointer user_data) +{ + g_slist_free (value); +} + static void mini_free_jit_domain_info (MonoDomain *domain) { @@ -3546,6 +3560,10 @@ mini_free_jit_domain_info (MonoDomain *domain) mono_debugger_agent_free_domain_info (domain); if (info->gsharedvt_arg_tramp_hash) g_hash_table_destroy (info->gsharedvt_arg_tramp_hash); + if (info->llvm_jit_callees) { + g_hash_table_foreach (info->llvm_jit_callees, free_jit_callee_list, NULL); + g_hash_table_destroy (info->llvm_jit_callees); + } #ifdef ENABLE_LLVM mono_llvm_free_domain_info (domain); #endif @@ -4146,7 +4164,8 @@ print_jit_stats (void) void mini_cleanup (MonoDomain *domain) { - mono_runtime_shutdown_stat_profiler (); + if (mono_profiler_get_events () & MONO_PROFILE_STATISTICAL) + mono_runtime_shutdown_stat_profiler (); #ifndef DISABLE_COM cominterop_release_all_rcws (); @@ -4163,12 +4182,12 @@ mini_cleanup (MonoDomain *domain) /* This accesses metadata so needs to be called before runtime shutdown */ print_jit_stats (); - mono_profiler_shutdown (); - #ifndef MONO_CROSS_COMPILE mono_runtime_cleanup (domain); #endif + mono_profiler_shutdown (); + free_jit_tls_data ((MonoJitTlsData *)mono_native_tls_get_value (mono_jit_tls_id)); mono_icall_cleanup ();