authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-11 21:48:52-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-12 18:13:24-07:00
log188902a710a64b08762d7731aab81cb695322184
tree177ba4a0edb07fe1751a749f8cc30d7f533e29f6
parentf16855b9d70c747423ee81f27d619694856d365b

Sema: introduce Type.ptrAlignmentAdvanced

I'm not sure why the other commits in this branch caused this fix to be necessary. Also, there seems to be more fixes necessary before tests will pass.

2 files changed, 29 insertions(+), 18 deletions(-)

src/Sema.zig+11-11
...@@ -17575,30 +17575,30 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -17575,30 +17575,30 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
17575 const operand_coerced = try sema.coerce(block, Type.usize, operand_res, operand_src);17575 const operand_coerced = try sema.coerce(block, Type.usize, operand_res, operand_src);
1757617576
17577 const type_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };17577 const type_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
17578 const type_res = try sema.resolveType(block, src, extra.lhs);17578 const ptr_ty = try sema.resolveType(block, src, extra.lhs);
17579 try sema.checkPtrType(block, type_src, type_res);17579 const elem_ty = ptr_ty.elemType2();
17580 try sema.resolveTypeLayout(block, src, type_res.elemType2());17580 try sema.checkPtrType(block, type_src, ptr_ty);
17581 const ptr_align = type_res.ptrAlignment(sema.mod.getTarget());
17582 const target = sema.mod.getTarget();17581 const target = sema.mod.getTarget();
17582 const ptr_align = try ptr_ty.ptrAlignmentAdvanced(target, sema.kit(block, src));
1758317583
17584 if (try sema.resolveDefinedValue(block, operand_src, operand_coerced)) |val| {17584 if (try sema.resolveDefinedValue(block, operand_src, operand_coerced)) |val| {
17585 const addr = val.toUnsignedInt(target);17585 const addr = val.toUnsignedInt(target);
17586 if (!type_res.isAllowzeroPtr() and addr == 0)17586 if (!ptr_ty.isAllowzeroPtr() and addr == 0)
17587 return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{type_res.fmt(sema.mod)});17587 return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(sema.mod)});
17588 if (addr != 0 and addr % ptr_align != 0)17588 if (addr != 0 and addr % ptr_align != 0)
17589 return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{type_res.fmt(sema.mod)});17589 return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(sema.mod)});
1759017590
17591 const val_payload = try sema.arena.create(Value.Payload.U64);17591 const val_payload = try sema.arena.create(Value.Payload.U64);
17592 val_payload.* = .{17592 val_payload.* = .{
17593 .base = .{ .tag = .int_u64 },17593 .base = .{ .tag = .int_u64 },
17594 .data = addr,17594 .data = addr,
17595 };17595 };
17596 return sema.addConstant(type_res, Value.initPayload(&val_payload.base));17596 return sema.addConstant(ptr_ty, Value.initPayload(&val_payload.base));
17597 }17597 }
1759817598
17599 try sema.requireRuntimeBlock(block, src, operand_src);17599 try sema.requireRuntimeBlock(block, src, operand_src);
17600 if (block.wantSafety() and try sema.typeHasRuntimeBits(block, sema.src, type_res.elemType2())) {17600 if (block.wantSafety() and try sema.typeHasRuntimeBits(block, sema.src, elem_ty)) {
17601 if (!type_res.isAllowzeroPtr()) {17601 if (!ptr_ty.isAllowzeroPtr()) {
17602 const is_non_zero = try block.addBinOp(.cmp_neq, operand_coerced, .zero_usize);17602 const is_non_zero = try block.addBinOp(.cmp_neq, operand_coerced, .zero_usize);
17603 try sema.addSafetyCheck(block, is_non_zero, .cast_to_null);17603 try sema.addSafetyCheck(block, is_non_zero, .cast_to_null);
17604 }17604 }
...@@ -17618,7 +17618,7 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -17618,7 +17618,7 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
17618 try sema.addSafetyCheck(block, is_aligned, .incorrect_alignment);17618 try sema.addSafetyCheck(block, is_aligned, .incorrect_alignment);
17619 }17619 }
17620 }17620 }
17621 return block.addBitCast(type_res, operand_coerced);17621 return block.addBitCast(ptr_ty, operand_coerced);
17622}17622}
1762317623
17624fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref {17624fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref {
src/type.zig+18-7
...@@ -2715,8 +2715,12 @@ pub const Type = extern union {...@@ -2715,8 +2715,12 @@ pub const Type = extern union {
2715 }2715 }
27162716
2717 /// Returns 0 if the pointer is naturally aligned and the element type is 0-bit.2717 /// Returns 0 if the pointer is naturally aligned and the element type is 0-bit.
2718 pub fn ptrAlignment(self: Type, target: Target) u32 {2718 pub fn ptrAlignment(ty: Type, target: Target) u32 {
2719 switch (self.tag()) {2719 return ptrAlignmentAdvanced(ty, target, null) catch unreachable;
2720 }
2721
2722 pub fn ptrAlignmentAdvanced(ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !u32 {
2723 switch (ty.tag()) {
2720 .single_const_pointer,2724 .single_const_pointer,
2721 .single_mut_pointer,2725 .single_mut_pointer,
2722 .many_const_pointer,2726 .many_const_pointer,
...@@ -2728,8 +2732,12 @@ pub const Type = extern union {...@@ -2728,8 +2732,12 @@ pub const Type = extern union {
2728 .optional_single_const_pointer,2732 .optional_single_const_pointer,
2729 .optional_single_mut_pointer,2733 .optional_single_mut_pointer,
2730 => {2734 => {
2731 const child_type = self.cast(Payload.ElemType).?.data;2735 const child_type = ty.cast(Payload.ElemType).?.data;
2732 return child_type.abiAlignment(target);2736 if (sema_kit) |sk| {
2737 const res = try child_type.abiAlignmentAdvanced(target, .{ .sema_kit = sk });
2738 return res.scalar;
2739 }
2740 return (child_type.abiAlignmentAdvanced(target, .eager) catch unreachable).scalar;
2733 },2741 },
27342742
2735 .manyptr_u8,2743 .manyptr_u8,
...@@ -2740,14 +2748,17 @@ pub const Type = extern union {...@@ -2740,14 +2748,17 @@ pub const Type = extern union {
2740 => return 1,2748 => return 1,
27412749
2742 .pointer => {2750 .pointer => {
2743 const ptr_info = self.castTag(.pointer).?.data;2751 const ptr_info = ty.castTag(.pointer).?.data;
2744 if (ptr_info.@"align" != 0) {2752 if (ptr_info.@"align" != 0) {
2745 return ptr_info.@"align";2753 return ptr_info.@"align";
2754 } else if (sema_kit) |sk| {
2755 const res = try ptr_info.pointee_type.abiAlignmentAdvanced(target, .{ .sema_kit = sk });
2756 return res.scalar;
2746 } else {2757 } else {
2747 return ptr_info.pointee_type.abiAlignment(target);2758 return (ptr_info.pointee_type.abiAlignmentAdvanced(target, .eager) catch unreachable).scalar;
2748 }2759 }
2749 },2760 },
2750 .optional => return self.castTag(.optional).?.data.ptrAlignment(target),2761 .optional => return ty.castTag(.optional).?.data.ptrAlignmentAdvanced(target, sema_kit),
27512762
2752 else => unreachable,2763 else => unreachable,
2753 }2764 }