aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_abi.cpp
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-07-01 00:50:10 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-07-01 00:50:10 +0200
commite3dde8caf808eba70f8ebdd9317f05aa75c3bb5a (patch)
treedb6d6fc625e7768b78000f0379661fc4c3bb5e18 /src/llvm_abi.cpp
parent5637ed9ecdd31929792c59a79d396d24b5bb0ee1 (diff)
make structs with multiple fields always return indirect in wasm c abi
Diffstat (limited to 'src/llvm_abi.cpp')
-rw-r--r--src/llvm_abi.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp
index 1f7a39447..375f1c86a 100644
--- a/src/llvm_abi.cpp
+++ b/src/llvm_abi.cpp
@@ -1378,14 +1378,14 @@ namespace lbAbiWasm {
} else if (lb_is_type_kind(return_type, LLVMStructTypeKind) || lb_is_type_kind(return_type, LLVMArrayTypeKind)) {
if (type_can_be_direct(return_type, ft->calling_convention)) {
return lb_arg_type_direct(return_type);
- }
-
- i64 sz = lb_sizeof(return_type);
- switch (sz) {
- case 1: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 8), nullptr, nullptr);
- case 2: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 16), nullptr, nullptr);
- case 4: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 32), nullptr, nullptr);
- case 8: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 64), nullptr, nullptr);
+ } else if (ft->calling_convention != ProcCC_CDecl) {
+ i64 sz = lb_sizeof(return_type);
+ switch (sz) {
+ case 1: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 8), nullptr, nullptr);
+ case 2: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 16), nullptr, nullptr);
+ case 4: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 32), nullptr, nullptr);
+ case 8: return lb_arg_type_direct(return_type, LLVMIntTypeInContext(c, 64), nullptr, nullptr);
+ }
}
LB_ABI_MODIFY_RETURN_IF_TUPLE_MACRO();