aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-06 12:17:27 +0100
committergingerBill <bill@gingerbill.org>2020-04-06 12:17:27 +0100
commitd659e679fd934bd8e6e8b87aff30274ac52ceddf (patch)
treec5a9c9f273d3ca4d4720405a661c5654d41ade83 /src
parentae97c1111a0084e289a2b9e25038e8493ef923a1 (diff)
Fix `defer` after return for -llvm-api
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 42352fb2e..22ae6f601 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -3870,7 +3870,6 @@ void lb_build_stmt(lbProcedure *p, Ast *node) {
res = lb_emit_load(p, res);
}
- lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
if (p->type->Proc.return_by_pointer) {
if (res.value != nullptr) {
@@ -3878,6 +3877,9 @@ void lb_build_stmt(lbProcedure *p, Ast *node) {
} else {
lb_addr_store(p, p->return_ptr, lb_const_nil(p->module, p->type->Proc.abi_compat_result_type));
}
+
+ lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
+
LLVMBuildRetVoid(p->builder);
} else {
GB_ASSERT_MSG(res.value != nullptr, "%.*s", LIT(p->name));
@@ -3885,6 +3887,9 @@ void lb_build_stmt(lbProcedure *p, Ast *node) {
if (!are_types_identical(res.type, abi_rt)) {
res = lb_emit_transmute(p, res, abi_rt);
}
+
+ lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr);
+
LLVMBuildRet(p->builder, res.value);
}
case_end;