diff options
| author | elusivePorpoise <95202750+elusivePorpoise@users.noreply.github.com> | 2022-10-11 02:20:30 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-11 02:20:30 -0700 |
| commit | 721486f875032047b13b1a3b5dda3201951e1d3a (patch) | |
| tree | 97def1f4a86eb267919b4a90862d33724e7964b6 /src/llvm_backend_proc.cpp | |
| parent | 8b06fd093518c01c896e4eb2bcb271a5bc593b7e (diff) | |
| parent | 29f2ecd2280106cb917ed2e2d5eb0be3448d3c5c (diff) | |
Merge branch 'odin-lang:master' into master
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 14 |
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; |