authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-29 02:07:52-04:00
committergravatar for xavierb@gmail.comXavier Bouchoux <xavierb@gmail.com> 2023-10-08 11:37:49+02:00
log6bb10c72712377fb38764a2df0c7abfebcebf3ad
treefb1dda827b507a56c513a033aec6456b2bde5fec
parent85315bb535a98cb08b4eb8bad6254ef3f5d9714f

llvm: fix load of packed struct that was initialized through pointers


1 files changed, 15 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+15-1
...@@ -10378,7 +10378,21 @@ pub const FuncGen = struct {...@@ -10378,7 +10378,21 @@ pub const FuncGen = struct {
10378 if (isByRef(elem_ty, mod)) {10378 if (isByRef(elem_ty, mod)) {
10379 return self.loadByRef(ptr, elem_ty, ptr_alignment, access_kind);10379 return self.loadByRef(ptr, elem_ty, ptr_alignment, access_kind);
10380 }10380 }
10381 return self.wip.load(access_kind, try o.lowerType(elem_ty), ptr, ptr_alignment, "");10381 const llvm_elem_ty = try o.lowerType(elem_ty);
10382 const llvm_load_ty = if (elem_ty.isAbiInt(mod))
10383 try o.builder.intType(@intCast(elem_ty.abiSize(mod) * 8))
10384 else
10385 llvm_elem_ty;
10386 const loaded = try self.wip.load(access_kind, llvm_load_ty, ptr, ptr_alignment, "");
10387 const shifted = if (llvm_elem_ty != llvm_load_ty and o.target.cpu.arch.endian() == .Big)
10388 try self.wip.bin(.lshr, loaded, try o.builder.intValue(
10389 llvm_load_ty,
10390 (elem_ty.abiSize(mod) - (std.math.divCeil(u64, elem_ty.bitSize(mod), 8) catch
10391 unreachable)) * 8,
10392 ), "")
10393 else
10394 loaded;
10395 return self.wip.conv(.unneeded, shifted, llvm_elem_ty, "");
10382 }10396 }
1038310397
10384 const containing_int_ty = try o.builder.intType(@intCast(info.packed_offset.host_size * 8));10398 const containing_int_ty = try o.builder.intType(@intCast(info.packed_offset.host_size * 8));