aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorelusivePorpoise <95202750+elusivePorpoise@users.noreply.github.com>2022-10-11 02:20:30 -0700
committerGitHub <noreply@github.com>2022-10-11 02:20:30 -0700
commit721486f875032047b13b1a3b5dda3201951e1d3a (patch)
tree97def1f4a86eb267919b4a90862d33724e7964b6 /src/llvm_backend_proc.cpp
parent8b06fd093518c01c896e4eb2bcb271a5bc593b7e (diff)
parent29f2ecd2280106cb917ed2e2d5eb0be3448d3c5c (diff)
Merge branch 'odin-lang:master' into master
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 56ffe3fe9..4d7896c8a 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -753,12 +753,16 @@ lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue return_ptr,
}
GB_ASSERT_MSG(lb_is_type_kind(fnp, LLVMFunctionTypeKind), "%s", LLVMPrintTypeToString(fnp));
+ lbFunctionType *ft = map_must_get(&p->module->function_type_map, base_type(value.type));
+
{
unsigned param_count = LLVMCountParamTypes(fnp);
GB_ASSERT(arg_count >= param_count);
LLVMTypeRef *param_types = gb_alloc_array(temporary_allocator(), LLVMTypeRef, param_count);
LLVMGetParamTypes(fnp, param_types);
+
+
for (unsigned i = 0; i < param_count; i++) {
LLVMTypeRef param_type = param_types[i];
LLVMTypeRef arg_type = LLVMTypeOf(args[i]);
@@ -776,10 +780,20 @@ lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue return_ptr,
LLVMValueRef ret = LLVMBuildCall2(p->builder, fnp, fn, args, arg_count, "");
+ LLVMAttributeIndex param_offset = LLVMAttributeIndex_FirstArgIndex;
if (return_ptr.value != nullptr) {
+ param_offset += 1;
+
LLVMAddCallSiteAttribute(ret, 1, lb_create_enum_attribute_with_type(p->module->ctx, "sret", LLVMTypeOf(args[0])));
}
+ for_array(i, ft->args) {
+ LLVMAttributeRef attribute = ft->args[i].attribute;
+ if (attribute != nullptr) {
+ LLVMAddCallSiteAttribute(ret, param_offset + cast(LLVMAttributeIndex)i, attribute);
+ }
+ }
+
switch (inlining) {
case ProcInlining_none:
break;