From 2c1e955de7a8f31666c751ce4f69c47d4c1b822e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 20 Jul 2019 13:32:50 -0400 Subject: [PATCH] always give the type to byval attribute --- src/codegen.cpp | 2 +- src/zig_llvm.cpp | 10 ++++++++++ src/zig_llvm.h | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index d664a21ecc97bc7faa170f26629d43932caae017..2170da10ac2fb639faaba7a35a637bc008055b2e 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2216,7 +2216,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ assert(handle_is_ptr(ty)); switch (fn_walk->id) { case FnWalkIdAttrs: - addLLVMArgAttr(llvm_fn, fn_walk->data.attrs.gen_i, "byval"); + ZigLLVMAddByValAttr(llvm_fn, fn_walk->data.attrs.gen_i + 1, get_llvm_type(g, ty)); addLLVMArgAttrInt(llvm_fn, fn_walk->data.attrs.gen_i, "align", get_abi_alignment(g, ty)); // Byvalue parameters must not have address 0 addLLVMArgAttr(llvm_fn, fn_walk->data.attrs.gen_i, "nonnull"); diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index c033d7af9666544f25e2878833c1e1f1941d3d4d..b82d0c51bad5664f94ef5dd026be8d6e9ebe6727 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -723,6 +723,16 @@ void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state) { } } +void ZigLLVMAddByValAttr(LLVMValueRef fn_ref, unsigned ArgNo, LLVMTypeRef type_val) { + Function *func = unwrap(fn_ref); + const AttributeList attr_set = func->getAttributes(); + AttrBuilder attr_builder; + Type *llvm_type = unwrap(type_val); + attr_builder.addByValAttr(llvm_type); + const AttributeList new_attr_set = attr_set.addAttributes(func->getContext(), ArgNo, attr_builder); + func->setAttributes(new_attr_set); +} + void ZigLLVMAddFunctionAttr(LLVMValueRef fn_ref, const char *attr_name, const char *attr_value) { Function *func = unwrap(fn_ref); const AttributeList attr_set = func->getAttributes(); diff --git a/src/zig_llvm.h b/src/zig_llvm.h index 210f245efe63098f7087db7a0dd4c20d0834a12f..10b6d2436452c5b3d9b4a645aa187e2d0b5b479f 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -213,6 +213,7 @@ ZIG_EXTERN_C struct ZigLLVMDILocation *ZigLLVMGetDebugLoc(unsigned line, unsigne ZIG_EXTERN_C void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state); ZIG_EXTERN_C void ZigLLVMAddFunctionAttr(LLVMValueRef fn, const char *attr_name, const char *attr_value); +ZIG_EXTERN_C void ZigLLVMAddByValAttr(LLVMValueRef fn_ref, unsigned ArgNo, LLVMTypeRef type_val); ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn); ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv); -- 2.54.0