From dc55e885888a9d036dafea2036c1907306e69d14 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 15 Apr 2023 16:04:04 +0100 Subject: Add `@(deferred_*_by_ptr=)` --- src/llvm_backend_proc.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/llvm_backend_proc.cpp') diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 02748663b..93c480e7f 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1169,17 +1169,27 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c lbValue deferred = lb_find_procedure_value_from_entity(p->module, deferred_entity); + bool by_ptr = false; auto in_args = args; Array result_as_args = {}; switch (kind) { case DeferredProcedure_none: break; + case DeferredProcedure_in_by_ptr: + by_ptr = true; + /*fallthrough*/ case DeferredProcedure_in: result_as_args = array_clone(heap_allocator(), in_args); break; + case DeferredProcedure_out_by_ptr: + by_ptr = true; + /*fallthrough*/ case DeferredProcedure_out: result_as_args = lb_value_to_array(p, heap_allocator(), result); break; + case DeferredProcedure_in_out_by_ptr: + by_ptr = true; + /*fallthrough*/ case DeferredProcedure_in_out: { auto out_args = lb_value_to_array(p, heap_allocator(), result); @@ -1189,6 +1199,12 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } break; } + if (by_ptr) { + for_array(i, result_as_args) { + lbValue arg_ptr = lb_address_from_load_or_generate_local(p, result_as_args[i]); + result_as_args[i] = arg_ptr; + } + } lb_add_defer_proc(p, p->scope_index, deferred, result_as_args); } -- cgit v1.2.3