aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-08-18 20:34:36 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-08-18 20:34:36 -0700
commitcee82c7ce4fb8beb39042f9dba16a1a391803fa4 (patch)
treeea2a12b10b3742acc3f343a36bf14a8c34246776 /src/type.zig
parentb975f7a56fec9e0e7aca9832282bc772c743d731 (diff)
downloadzig-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.zig16
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,
};
}