zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 08a00f0d1ce477c2c57072b9b0e27eb36a73092a (tree)
parent 835a1f7f0cfb6fdefdb7a6a3d3a6e04eafeb96d0
Author: Veikka Tuominen <git@vexu.eu>
Date:   Sun, 20 Nov 2022 00:15:03 +0200

llvm: use alignment of ABI return type when it differs from raw return type

This would previously cause miscompilations when the ABI type had
bigger alignment than the raw type.

Diffstat:
Msrc/codegen/llvm.zig | 2+-
Mtest/c_abi/main.zig | 2--
2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig @@ -4876,7 +4876,7 @@ pub const FuncGen = struct { // In this case the function return type is honoring the calling convention by having // a different LLVM type than the usual one. We solve this here at the callsite // by bitcasting a pointer to our canonical type, then loading it if necessary. - const alignment = return_type.abiAlignment(target); + const alignment = self.dg.object.target_data.abiAlignmentOfType(abi_ret_ty); const rp = self.buildAlloca(llvm_ret_ty, alignment); const ptr_abi_ty = abi_ret_ty.pointerType(0); const casted_ptr = self.builder.buildBitCast(rp, ptr_abi_ty, ""); diff --git a/test/c_abi/main.zig b/test/c_abi/main.zig @@ -917,8 +917,6 @@ test "CFF: C passes to Zig" { try expectOk(c_send_CFF()); } test "CFF: C returns to Zig" { - // segfault on aarch64 and mips - if (builtin.target.cpu.arch == .aarch64) return error.SkipZigTest; if (comptime builtin.cpu.arch.isMIPS()) return error.SkipZigTest; if (comptime builtin.cpu.arch.isPPC()) return error.SkipZigTest; if (comptime builtin.cpu.arch.isPPC64()) return error.SkipZigTest;