aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp16
1 files changed, 16 insertions, 0 deletions
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<lbValue> c
lbValue deferred = lb_find_procedure_value_from_entity(p->module, deferred_entity);
+ bool by_ptr = false;
auto in_args = args;
Array<lbValue> 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<lbValue> 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);
}