aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-06-29 00:06:12 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-06-29 00:23:19 -0400
commit43c98dc11567eeb38be041c7dad179c53156f3df (patch)
treec512dfb131f73104cc6d1f3ef8db048e6105af1b /src/Sema.zig
parent1a2468abfcd8b539193d943c1eefb71319cc7b88 (diff)
downloadzig-43c98dc11567eeb38be041c7dad179c53156f3df.tar.gz
zig-43c98dc11567eeb38be041c7dad179c53156f3df.zip
Revert "Merge pull request #15995 from mlugg/fix/union-field-ptr-align"
This reverts commit 40cf3f7ae5fbfb84b7af6b27e6296ee858b209ef, reversing changes made to d98147414d084bc41b00ba9c0be8c7b82ad4e76c.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig49
1 files changed, 7 insertions, 42 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index c1ec7d1f01..26da430166 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -25879,9 +25879,6 @@ fn structFieldPtrByIndex(
const target = mod.getTarget();
- const parent_align = struct_ptr_ty_info.flags.alignment.toByteUnitsOptional() orelse
- try sema.typeAbiAlignment(struct_ptr_ty_info.child.toType());
-
if (struct_obj.layout == .Packed) {
comptime assert(Type.packed_struct_layout_version == 2);
@@ -25903,6 +25900,8 @@ fn structFieldPtrByIndex(
ptr_ty_data.packed_offset.bit_offset += struct_ptr_ty_info.packed_offset.bit_offset;
}
+ const parent_align = struct_ptr_ty_info.flags.alignment.toByteUnitsOptional() orelse
+ struct_ptr_ty_info.child.toType().abiAlignment(mod);
ptr_ty_data.flags.alignment = Alignment.fromByteUnits(parent_align);
// If the field happens to be byte-aligned, simplify the pointer type.
@@ -25926,13 +25925,8 @@ fn structFieldPtrByIndex(
ptr_ty_data.packed_offset = .{ .host_size = 0, .bit_offset = 0 };
}
}
- } else if (struct_obj.layout == .Extern and field_index == 0) {
- // This is the first field in memory, so can inherit the struct alignment
- ptr_ty_data.flags.alignment = Alignment.fromByteUnits(parent_align);
} else {
- // Our alignment is capped at the field alignment
- const field_align = try sema.structFieldAlignment(field, struct_obj.layout);
- ptr_ty_data.flags.alignment = Alignment.fromByteUnits(@min(field_align, parent_align));
+ ptr_ty_data.flags.alignment = field.abi_align;
}
const ptr_field_ty = try mod.ptrType(ptr_ty_data);
@@ -26103,7 +26097,6 @@ fn unionFieldPtr(
assert(unresolved_union_ty.zigTypeTag(mod) == .Union);
const union_ptr_ty = sema.typeOf(union_ptr);
- const union_ptr_info = union_ptr_ty.ptrInfo(mod);
const union_ty = try sema.resolveTypeFields(unresolved_union_ty);
const union_obj = mod.typeToUnion(union_ty).?;
const field_index = try sema.unionFieldIndex(block, union_ty, field_name, field_name_src);
@@ -26111,16 +26104,10 @@ fn unionFieldPtr(
const ptr_field_ty = try mod.ptrType(.{
.child = field.ty.toIntern(),
.flags = .{
- .is_const = union_ptr_info.flags.is_const,
- .is_volatile = union_ptr_info.flags.is_volatile,
- .address_space = union_ptr_info.flags.address_space,
- .alignment = if (union_obj.layout == .Auto) blk: {
- const union_align = union_ptr_info.flags.alignment.toByteUnitsOptional() orelse try sema.typeAbiAlignment(union_ty);
- const field_align = try sema.unionFieldAlignment(field);
- break :blk InternPool.Alignment.fromByteUnits(@min(union_align, field_align));
- } else union_ptr_info.flags.alignment,
- },
- .packed_offset = union_ptr_info.packed_offset,
+ .is_const = !union_ptr_ty.ptrIsMutable(mod),
+ .is_volatile = union_ptr_ty.isVolatilePtr(mod),
+ .address_space = union_ptr_ty.ptrAddressSpace(mod),
+ },
});
const enum_field_index = @as(u32, @intCast(union_obj.tag_ty.enumFieldIndex(field_name, mod).?));
@@ -35987,28 +35974,6 @@ fn unionFieldAlignment(sema: *Sema, field: Module.Union.Field) !u32 {
field.abi_align.toByteUnitsOptional() orelse try sema.typeAbiAlignment(field.ty)));
}
-/// Keep implementation in sync with `Module.Struct.Field.alignment`.
-fn structFieldAlignment(sema: *Sema, field: Module.Struct.Field, layout: std.builtin.Type.ContainerLayout) !u32 {
- const mod = sema.mod;
- if (field.abi_align.toByteUnitsOptional()) |a| {
- assert(layout != .Packed);
- return @as(u32, @intCast(a));
- }
- switch (layout) {
- .Packed => return 0,
- .Auto => if (mod.getTarget().ofmt != .c) {
- return sema.typeAbiAlignment(field.ty);
- },
- .Extern => {},
- }
- // extern
- const ty_abi_align = try sema.typeAbiAlignment(field.ty);
- if (field.ty.isAbiInt(mod) and field.ty.intInfo(mod).bits >= 128) {
- return @max(ty_abi_align, 16);
- }
- return ty_abi_align;
-}
-
/// Synchronize logic with `Type.isFnOrHasRuntimeBits`.
pub fn fnHasRuntimeBits(sema: *Sema, ty: Type) CompileError!bool {
const mod = sema.mod;