[llvmonly] Throw an ExecutionEngine exception with a helpful message when we try...
authormonojenkins <jo.shields+jenkins@xamarin.com>
Wed, 25 Mar 2020 04:39:42 +0000 (00:39 -0400)
committerGitHub <noreply@github.com>
Wed, 25 Mar 2020 04:39:42 +0000 (00:39 -0400)
<!--
Thank you for your Pull Request!

If you are new to contributing to Mono, please try to do your best at conforming to our coding guidelines http://www.mono-project.com/community/contributing/coding-guidelines/ but don't worry if you get something wrong. One of the project members will help you to get things landed.

Does your pull request fix any of the existing issues? Please use the following format: Fixes #issue-number
-->

Co-authored-by: vargaz <vargaz@users.noreply.github.com>
src/mono/mono/metadata/jit-icall-reg.h
src/mono/mono/mini/llvmonly-runtime.c
src/mono/mono/mini/llvmonly-runtime.h
src/mono/mono/mini/mini-llvm.c
src/mono/mono/mini/mini-runtime.c

index 92670dd..125c0b5 100644 (file)
@@ -139,7 +139,7 @@ MONO_JIT_ICALL (mini_llvmonly_resolve_generic_virtual_iface_call) \
 MONO_JIT_ICALL (mini_llvmonly_resolve_iface_call_gsharedvt) \
 MONO_JIT_ICALL (mini_llvmonly_resolve_vcall_gsharedvt) \
 MONO_JIT_ICALL (mini_llvmonly_throw_nullref_exception) \
-MONO_JIT_ICALL (mini_llvmonly_throw_missing_method_exception) \
+MONO_JIT_ICALL (mini_llvmonly_throw_aot_failed_exception) \
 MONO_JIT_ICALL (mono_amd64_resume_unwind)      \
 MONO_JIT_ICALL (mono_amd64_start_gsharedvt_call)       \
 MONO_JIT_ICALL (mono_amd64_throw_corlib_exception)     \
index 63fc11d..3104e29 100644 (file)
@@ -809,14 +809,11 @@ mini_llvmonly_throw_nullref_exception (void)
        mono_llvm_throw_corlib_exception (ex_token_index);
 }
 
-static GENERATE_GET_CLASS_WITH_CACHE (missing_method, "System", "MissingMethodException")
-
 void
-mini_llvmonly_throw_missing_method_exception (void)
+mini_llvmonly_throw_aot_failed_exception (const char *name)
 {
-       MonoClass *klass = mono_class_get_missing_method_class ();
-
-       guint32 ex_token_index = m_class_get_type_token (klass) - MONO_TOKEN_TYPE_DEF;
-
-       mono_llvm_throw_corlib_exception (ex_token_index);
+       char *msg = g_strdup_printf ("AOT Compilation failed for method '%s'.", name);
+       MonoException *ex = mono_get_exception_execution_engine (msg);
+       g_free (msg);
+       mono_llvm_throw_exception ((MonoObject*)ex);
 }
index eadc4c2..f939916 100644 (file)
@@ -33,6 +33,6 @@ G_EXTERN_C void mini_llvm_init_method          (MonoAotFileInfo *info, gpointer
 
 G_EXTERN_C void mini_llvmonly_throw_nullref_exception (void);
 
-G_EXTERN_C void mini_llvmonly_throw_missing_method_exception (void);
+G_EXTERN_C void mini_llvmonly_throw_aot_failed_exception (const char *name);
 
 #endif
index 77a7c1c..d2462d3 100644 (file)
@@ -9542,10 +9542,22 @@ after_codegen_1:
                ctx->builder = create_builder (ctx);
                LLVMPositionBuilderAtEnd (ctx->builder, ctx->inited_bb);
 
+               char *name = mono_method_get_full_name (cfg->method);
+               int len = strlen (name);
+
+               LLVMTypeRef type = LLVMArrayType (LLVMInt8Type (), len + 1);
+               LLVMValueRef name_var = LLVMAddGlobal (ctx->lmodule, type, "missing_method_name");
+               LLVMSetVisibility (name_var, LLVMHiddenVisibility);
+               LLVMSetLinkage (name_var, LLVMInternalLinkage);
+               LLVMSetInitializer (name_var, mono_llvm_create_constant_data_array ((guint8*)name, len + 1));
+               mono_llvm_set_is_constant (name_var);
+               g_free (name);
+
                if (!sig)
-                       sig = LLVMFunctionType0 (LLVMVoidType (), FALSE);
-               LLVMValueRef callee = get_callee (ctx, sig, MONO_PATCH_INFO_JIT_ICALL_ADDR, GUINT_TO_POINTER (MONO_JIT_ICALL_mini_llvmonly_throw_missing_method_exception));
-               LLVMBuildCall (ctx->builder, callee, NULL, 0, "");
+                       sig = LLVMFunctionType1 (LLVMVoidType (), ctx->module->ptr_type, FALSE);
+               LLVMValueRef callee = get_callee (ctx, sig, MONO_PATCH_INFO_JIT_ICALL_ADDR, GUINT_TO_POINTER (MONO_JIT_ICALL_mini_llvmonly_throw_aot_failed_exception));
+               LLVMValueRef args [] = { convert (ctx, name_var, ctx->module->ptr_type) };
+               LLVMBuildCall (ctx->builder, callee, args, 1, "");
                LLVMBuildUnreachable (ctx->builder);
        }
 
index d7c679e..0d30bd4 100644 (file)
@@ -4673,7 +4673,7 @@ register_icalls (void)
        register_icall (mini_llvmonly_init_delegate, mono_icall_sig_void_object, TRUE);
        register_icall (mini_llvmonly_init_delegate_virtual, mono_icall_sig_void_object_object_ptr, TRUE);
        register_icall (mini_llvmonly_throw_nullref_exception, mono_icall_sig_void, TRUE);
-       register_icall (mini_llvmonly_throw_missing_method_exception, mono_icall_sig_void, TRUE);
+       register_icall (mini_llvmonly_throw_aot_failed_exception, mono_icall_sig_void_ptr, TRUE);
 
        register_icall (mono_get_assembly_object, mono_icall_sig_object_ptr, TRUE);
        register_icall (mono_get_method_object, mono_icall_sig_object_ptr, TRUE);