aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-07-22 11:58:50 -0700
committerGitHub <noreply@github.com>2022-07-22 11:58:50 -0700
commit5dd59a54238b63cb52bb91d3cf803cb0196abb64 (patch)
treef88c35f0ef45664dcfb5cc23fb8a7166eddf761f /src
parentd925d19cfcabd96fdc4459e11ecb85a4f42ec655 (diff)
parent5cd1ccf4b98a5018b166d7ee214a3686b3a5834d (diff)
downloadzig-5dd59a54238b63cb52bb91d3cf803cb0196abb64.tar.gz
zig-5dd59a54238b63cb52bb91d3cf803cb0196abb64.zip
Merge pull request #12191 from ziglang/underaligned-fields
LLVM: fix lowering of structs with underaligned fields
Diffstat (limited to 'src')
-rw-r--r--src/codegen/llvm.zig6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 9dc20755eb..6ebbd2aaf8 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -2680,11 +2680,15 @@ pub const DeclGen = struct {
comptime assert(struct_layout_version == 2);
var offset: u64 = 0;
var big_align: u32 = 0;
+ var any_underaligned_fields = false;
for (struct_obj.fields.values()) |field| {
if (field.is_comptime or !field.ty.hasRuntimeBitsIgnoreComptime()) continue;
const field_align = field.normalAlignment(target);
+ const field_ty_align = field.ty.abiAlignment(target);
+ any_underaligned_fields = any_underaligned_fields or
+ field_align < field_ty_align;
big_align = @maximum(big_align, field_align);
const prev_offset = offset;
offset = std.mem.alignForwardGeneric(u64, offset, field_align);
@@ -2712,7 +2716,7 @@ pub const DeclGen = struct {
llvm_struct_ty.structSetBody(
llvm_field_types.items.ptr,
@intCast(c_uint, llvm_field_types.items.len),
- .False,
+ llvm.Bool.fromBool(any_underaligned_fields),
);
return llvm_struct_ty;