[mono] Actually make a copy of vtype arguments on wasm. (#52290)
authorZoltan Varga <vargaz@gmail.com>
Wed, 5 May 2021 19:54:24 +0000 (15:54 -0400)
committerGitHub <noreply@github.com>
Wed, 5 May 2021 19:54:24 +0000 (15:54 -0400)
Fixes https://github.com/dotnet/runtime/issues/50955.

src/mono/mono/mini/mini-llvm-cpp.cpp
src/mono/mono/mini/mini-llvm-cpp.h
src/mono/mono/mini/mini-llvm.c

index c1164db..1cbcec5 100644 (file)
@@ -520,6 +520,14 @@ mono_llvm_add_param_attr (LLVMValueRef param, AttrKind kind)
 }
 
 void
+mono_llvm_add_param_byval_attr (LLVMValueRef param, LLVMTypeRef type)
+{
+       Function *func = unwrap<Argument> (param)->getParent ();
+       int n = unwrap<Argument> (param)->getArgNo ();
+       func->addParamAttr (n, Attribute::getWithByValType (*unwrap (LLVMGetGlobalContext ()), unwrap (type)));
+}
+
+void
 mono_llvm_add_instr_attr (LLVMValueRef val, int index, AttrKind kind)
 {
        #if LLVM_API_VERSION >= 1100
@@ -529,6 +537,16 @@ mono_llvm_add_instr_attr (LLVMValueRef val, int index, AttrKind kind)
        #endif
 }
 
+void
+mono_llvm_add_instr_byval_attr (LLVMValueRef val, int index, LLVMTypeRef type)
+{
+#if LLVM_API_VERSION >= 1100
+       unwrap<CallBase> (val)->addAttribute (index, Attribute::getWithByValType (*unwrap (LLVMGetGlobalContext ()), unwrap (type)));
+#else
+       CallSite (unwrap<Instruction> (val)).addAttribute (index, Attribute::getWithByValType (*unwrap (LLVMGetGlobalContext ()), unwrap (type)));
+#endif
+}
+
 void*
 mono_llvm_create_di_builder (LLVMModuleRef module)
 {
index baa9044..27f5615 100644 (file)
@@ -157,8 +157,14 @@ void
 mono_llvm_add_param_attr (LLVMValueRef param, AttrKind kind);
 
 void
+mono_llvm_add_param_byval_attr (LLVMValueRef param, LLVMTypeRef type);
+
+void
 mono_llvm_add_instr_attr (LLVMValueRef val, int index, AttrKind kind);
 
+void
+mono_llvm_add_instr_byval_attr (LLVMValueRef val, int index, LLVMTypeRef type);
+
 #if defined(ENABLE_LLVM) && defined(HAVE_UNWIND_H)
 G_EXTERN_C _Unwind_Reason_Code mono_debug_personality (int a, _Unwind_Action b,
        uint64_t c, struct _Unwind_Exception *d, struct _Unwind_Context *e);
index d611861..7abb8b5 100644 (file)
@@ -4474,6 +4474,12 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
 
                if (ainfo && ainfo->storage == LLVMArgVtypeByVal)
                        mono_llvm_add_instr_attr (lcall, 1 + ainfo->pindex, LLVM_ATTR_BY_VAL);
+
+#ifdef TARGET_WASM
+               if (ainfo && ainfo->storage == LLVMArgVtypeByRef)
+                       /* This causes llvm to make a copy of the value which is what we need */
+                       mono_llvm_add_instr_byval_attr (lcall, 1 + ainfo->pindex, param_types [ainfo->pindex]);
+#endif
        }
 
        gboolean is_simd = MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type_internal (sig->ret));
@@ -11714,6 +11720,13 @@ emit_method_inner (EmitContext *ctx)
                        /* For OP_LDADDR */
                        cfg->args [i + sig->hasthis]->opcode = OP_VTARG_ADDR;
                }
+
+#ifdef TARGET_WASM
+               if (ainfo->storage == LLVMArgVtypeByRef) {
+                       /* This causes llvm to make a copy of the value which is what we need */
+                       mono_llvm_add_param_byval_attr (LLVMGetParam (method, pindex), LLVMTypeOf (LLVMGetParam (method, pindex)));
+               }
+#endif
        }
        g_free (names);