diff options
| author | gingerBill <bill@gingerbill.org> | 2022-10-31 00:25:53 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-10-31 00:25:53 +0000 |
| commit | c39ef1b25cc77f0179156430e45ef1d3c2028b7b (patch) | |
| tree | 9a10c20b969096e8e564b584495605a0d0dd6518 /src/llvm_backend_proc.cpp | |
| parent | 9da37ed394d866828cad91b83fe8674a5c3e5775 (diff) | |
Ad-hoc pass source code location directly by pointer without stack copy
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index ed7587bfd..a9de7b231 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -911,6 +911,9 @@ lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> const &args, auto processed_args = array_make<lbValue>(permanent_allocator(), 0, args.count); { + + bool is_odin_cc = is_calling_convention_odin(pt->Proc.calling_convention); + lbFunctionType *ft = lb_get_function_type(m, p, pt); bool return_by_pointer = ft->ret.kind == lbArg_Indirect; @@ -946,8 +949,12 @@ lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> const &args, } else if (arg->kind == lbArg_Indirect) { lbValue ptr = {}; if (arg->is_byval) { - ptr = lb_copy_value_to_ptr(p, x, original_type, arg->byval_alignment); - } else if (is_calling_convention_odin(pt->Proc.calling_convention)) { + if (is_odin_cc && are_types_identical(original_type, t_source_code_location)) { + ptr = lb_address_from_load_or_generate_local(p, x); + } else { + ptr = lb_copy_value_to_ptr(p, x, original_type, arg->byval_alignment); + } + } else if (is_odin_cc) { // NOTE(bill): Odin parameters are immutable so the original value can be passed if possible // i.e. `T const &` in C++ ptr = lb_address_from_load_or_generate_local(p, x); |