aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_stmt.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-19 15:43:13 +0000
committergingerBill <bill@gingerbill.org>2021-11-19 15:43:13 +0000
commitdaebaa8b5027731680037a12ad3e63936dc5aef2 (patch)
treeee3ff30e30ce10e0f1de7ee5e79332900185abff /src/llvm_backend_stmt.cpp
parent9320a31f4d67d74e13c0e7fc5cc9385e7c29896b (diff)
Fix #1319
Diffstat (limited to 'src/llvm_backend_stmt.cpp')
-rw-r--r--src/llvm_backend_stmt.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index c2ff0dfe1..016e464b8 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -1485,7 +1485,14 @@ void lb_build_return_stmt_internal(lbProcedure *p, lbValue const &res) {
if (return_by_pointer) {
if (res.value != nullptr) {
- LLVMBuildStore(p->builder, res.value, p->return_ptr.addr.value);
+ LLVMValueRef res_val = res.value;
+ i64 sz = type_size_of(res.type);
+ if (LLVMIsALoadInst(res_val) && sz > build_context.word_size) {
+ lbValue ptr = lb_address_from_load_or_generate_local(p, res);
+ lb_mem_copy_non_overlapping(p, p->return_ptr.addr, ptr, lb_const_int(p->module, t_int, sz));
+ } else {
+ LLVMBuildStore(p->builder, res_val, p->return_ptr.addr.value);
+ }
} else {
LLVMBuildStore(p->builder, LLVMConstNull(p->abi_function_type->ret.type), p->return_ptr.addr.value);
}