diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-08-18 20:34:36 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-08-18 20:34:36 -0700 |
| commit | cee82c7ce4fb8beb39042f9dba16a1a391803fa4 (patch) | |
| tree | ea2a12b10b3742acc3f343a36bf14a8c34246776 /src/type.zig | |
| parent | b975f7a56fec9e0e7aca9832282bc772c743d731 (diff) | |
| download | zig-cee82c7ce4fb8beb39042f9dba16a1a391803fa4.tar.gz zig-cee82c7ce4fb8beb39042f9dba16a1a391803fa4.zip | |
improved ABI alignment/size for >= 128-bit integers
* riscv64: adjust alignment and size of 128-bit integers.
* take ofmt=c into account for ABI alignment of 128-bit integers and
structs.
* Type: make packed struct support intInfo
* fix f80 alignment for i386-windows-msvc
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/type.zig b/src/type.zig index fb2ca1e3fc..6a66fb9d70 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3019,7 +3019,7 @@ pub const Type = extern union { big_align = @maximum(big_align, field_align); // This logic is duplicated in Module.Struct.Field.alignment. - if (struct_obj.layout == .Extern) { + if (struct_obj.layout == .Extern or target.ofmt == .c) { if (field.ty.isAbiInt() and field.ty.intInfo(target).bits >= 128) { // The C ABI requires 128 bit integer fields of structs // to be 16-bytes aligned. @@ -3348,7 +3348,13 @@ pub const Type = extern union { .f128 => return AbiSizeAdvanced{ .scalar = 16 }, .f80 => switch (target.cpu.arch) { - .i386 => return AbiSizeAdvanced{ .scalar = 12 }, + .i386 => switch (target.os.tag) { + .windows => switch (target.abi) { + .msvc => return AbiSizeAdvanced{ .scalar = 16 }, + else => return AbiSizeAdvanced{ .scalar = 12 }, + }, + else => return AbiSizeAdvanced{ .scalar = 12 }, + }, .x86_64 => return AbiSizeAdvanced{ .scalar = 16 }, else => { var payload: Payload.Bits = .{ @@ -4559,6 +4565,12 @@ pub const Type = extern union { .vector => ty = ty.castTag(.vector).?.data.elem_type, + .@"struct" => { + const struct_obj = ty.castTag(.@"struct").?.data; + assert(struct_obj.layout == .Packed); + ty = struct_obj.backing_int_ty; + }, + else => unreachable, }; } |
