aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ir.cpp25
-rw-r--r--src/llvm_backend.cpp27
2 files changed, 51 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 04623f65f..1c2f8df37 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -10164,6 +10164,14 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
v = ir_build_expr(proc, rs->results[0]);
v = ir_emit_conv(proc, v, e->type);
}
+ if (proc->type->Proc.has_named_results) {
+ // NOTE(bill): store the named values before returning
+ if (e->token.string != "") {
+ irValue **found = map_get(&proc->module->values, hash_entity(e));
+ GB_ASSERT(found != nullptr);
+ ir_emit_store(proc, *found, v);
+ }
+ }
} else {
gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&proc->module->tmp_arena);
defer (gb_temp_arena_memory_end(tmp));
@@ -10196,6 +10204,23 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
GB_ASSERT(results.count == return_count);
+ if (proc->type->Proc.has_named_results) {
+ // NOTE(bill): store the named values before returning
+ for_array(i, tuple->variables) {
+ Entity *e = tuple->variables[i];
+ if (e->kind != Entity_Variable) {
+ continue;
+ }
+
+ if (e->token.string == "") {
+ continue;
+ }
+ irValue **found = map_get(&proc->module->values, hash_entity(e));
+ GB_ASSERT(found != nullptr);
+ ir_emit_store(proc, *found, results[i]);
+ }
+ }
+
Type *ret_type = proc->type->Proc.results;
// NOTE(bill): Doesn't need to be zero because it will be initialized in the loops
v = ir_add_local_generated(proc, ret_type, false);
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 09d7c78de..7b1da7a50 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -2434,7 +2434,6 @@ void lb_begin_procedure_body(lbProcedure *p) {
if (p->type->Proc.has_named_results) {
GB_ASSERT(p->type->Proc.result_count > 0);
TypeTuple *results = &p->type->Proc.results->Tuple;
- LLVMValueRef return_ptr = LLVMGetParam(p->value, 0);
isize result_index = 0;
@@ -4192,6 +4191,15 @@ void lb_build_stmt(lbProcedure *p, Ast *node) {
res = lb_build_expr(p, rs->results[0]);
res = lb_emit_conv(p, res, e->type);
}
+ if (p->type->Proc.has_named_results) {
+ // NOTE(bill): store the named values before returning
+ if (e->token.string != "") {
+ lbValue *found = map_get(&p->module->values, hash_entity(e));
+ GB_ASSERT(found != nullptr);
+ lb_emit_store(p, *found, res);
+ }
+ }
+
} else {
auto results = array_make<lbValue>(heap_allocator(), 0, return_count);
@@ -4221,6 +4229,23 @@ void lb_build_stmt(lbProcedure *p, Ast *node) {
GB_ASSERT(results.count == return_count);
+ if (p->type->Proc.has_named_results) {
+ // NOTE(bill): store the named values before returning
+ for_array(i, p->type->Proc.results->Tuple.variables) {
+ Entity *e = p->type->Proc.results->Tuple.variables[i];
+ if (e->kind != Entity_Variable) {
+ continue;
+ }
+
+ if (e->token.string == "") {
+ continue;
+ }
+ lbValue *found = map_get(&p->module->values, hash_entity(e));
+ GB_ASSERT(found != nullptr);
+ lb_emit_store(p, *found, results[i]);
+ }
+ }
+
Type *ret_type = p->type->Proc.results;
// NOTE(bill): Doesn't need to be zero because it will be initialized in the loops
res = lb_add_local_generated(p, ret_type, false).addr;