diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-20 20:14:03 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-11-20 20:25:12 +0200 |
| commit | d968d9d10329234afc1d7743bb9981245695ca2b (patch) | |
| tree | f856364f1a31d9bb5615ddc1ed600a26949e7cca /src/zig_llvm.cpp | |
| parent | 9e276d32f3f8d980e4bf4c0a52df0fa97717aacb (diff) | |
| download | zig-d968d9d10329234afc1d7743bb9981245695ca2b.tar.gz zig-d968d9d10329234afc1d7743bb9981245695ca2b.zip | |
llvm: add attributes to the arguments of function pointer calls
Closes #13605
Diffstat (limited to 'src/zig_llvm.cpp')
| -rw-r--r-- | src/zig_llvm.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 7134df6a9c..c38e311f67 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -444,6 +444,15 @@ LLVMValueRef ZigLLVMBuildCall(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, return wrap(call_inst); } +void ZigLLVMAddAttributeAtIndex(LLVMValueRef Val, unsigned Idx, LLVMAttributeRef A) { + if (isa<Function>(unwrap(Val))) { + unwrap<Function>(Val)->addAttributeAtIndex(Idx, unwrap(A)); + } else { + unwrap<CallInst>(Val)->addAttributeAtIndex(Idx, unwrap(A)); + } +} + + LLVMValueRef ZigLLVMBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst, unsigned DstAlign, LLVMValueRef Src, unsigned SrcAlign, LLVMValueRef Size, bool isVolatile) { @@ -1065,12 +1074,21 @@ void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state) { } } -void ZigLLVMAddByValAttr(LLVMValueRef fn_ref, unsigned ArgNo, LLVMTypeRef type_val) { - Function *func = unwrap<Function>(fn_ref); - AttrBuilder attr_builder(func->getContext()); - Type *llvm_type = unwrap<Type>(type_val); - attr_builder.addByValAttr(llvm_type); - func->addParamAttrs(ArgNo, attr_builder); +void ZigLLVMAddByValAttr(LLVMValueRef Val, unsigned ArgNo, LLVMTypeRef type_val) { + if (isa<Function>(unwrap(Val))) { + Function *func = unwrap<Function>(Val); + AttrBuilder attr_builder(func->getContext()); + Type *llvm_type = unwrap<Type>(type_val); + attr_builder.addByValAttr(llvm_type); + func->addParamAttrs(ArgNo, attr_builder); + } else { + CallInst *call = unwrap<CallInst>(Val); + AttrBuilder attr_builder(call->getContext()); + Type *llvm_type = unwrap<Type>(type_val); + attr_builder.addByValAttr(llvm_type); + // NOTE: +1 here since index 0 refers to the return value + call->addAttributeAtIndex(ArgNo + 1, attr_builder.getAttribute(Attribute::ByVal)); + } } void ZigLLVMAddSretAttr(LLVMValueRef fn_ref, LLVMTypeRef type_val) { |
