From de0a3e0ab986f6ea9c73315a8405103a4e147bb8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 3 Feb 2023 15:07:44 +0000 Subject: Minor change to `byval` for readonly parameters --- src/llvm_backend_proc.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/llvm_backend_proc.cpp') diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 89a59de62..c1cbff048 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -538,6 +538,10 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { if (p->type->Proc.params != nullptr) { TypeTuple *params = &p->type->Proc.params->Tuple; + unsigned raw_input_parameters_count = LLVMCountParams(p->value); + p->raw_input_parameters = array_make(permanent_allocator(), raw_input_parameters_count); + LLVMGetParams(p->value, p->raw_input_parameters.data); + unsigned param_index = 0; for_array(i, params->variables) { Entity *e = params->variables[i]; @@ -1028,9 +1032,14 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } else if (arg->kind == lbArg_Indirect) { lbValue ptr = {}; if (arg->is_byval) { - if (is_odin_cc && are_types_identical(original_type, t_source_code_location)) { - ptr = lb_address_from_load_or_generate_local(p, x); - } else { + if (is_odin_cc) { + if (are_types_identical(original_type, t_source_code_location)) { + ptr = lb_address_from_load_or_generate_local(p, x); + } else { + ptr = lb_address_from_load_if_readonly_parameter(p, x); + } + } + if (ptr.value == nullptr) { ptr = lb_copy_value_to_ptr(p, x, original_type, arg->byval_alignment); } } else if (is_odin_cc) { -- cgit v1.2.3