diff options
| author | gingerBill <bill@gingerbill.org> | 2021-11-19 15:43:13 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-11-19 15:43:13 +0000 |
| commit | daebaa8b5027731680037a12ad3e63936dc5aef2 (patch) | |
| tree | ee3ff30e30ce10e0f1de7ee5e79332900185abff /src/llvm_backend_stmt.cpp | |
| parent | 9320a31f4d67d74e13c0e7fc5cc9385e7c29896b (diff) | |
Fix #1319
Diffstat (limited to 'src/llvm_backend_stmt.cpp')
| -rw-r--r-- | src/llvm_backend_stmt.cpp | 9 |
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); } |