authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-15 16:49:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-21 21:38:41-04:00
logecfb18286a5270943382effdf383bae4546b184f
treea0f2853e50a26ab2d7e98f92cde006ac66de022a
parent3cd3052d4d303dbae7d517fa40f6d171c957afdd

migrate make_ptr_const to new anonymous decl mechanism

Instead of creating Module.Decl objects, directly create InternPool pointer values using the anon_decl Addr encoding. The LLVM backend needed code to notice the alignment of the pointer and lower accordingly. The other backends likely need a similar change.

5 files changed, 18 insertions(+), 16 deletions(-)

src/Sema.zig+4-3
...@@ -3657,9 +3657,10 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro...@@ -3657,9 +3657,10 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro
3657 const elem_ty = ptr_info.child.toType();3657 const elem_ty = ptr_info.child.toType();
36583658
3659 if (try sema.resolveComptimeKnownAllocValue(block, alloc, null)) |val| {3659 if (try sema.resolveComptimeKnownAllocValue(block, alloc, null)) |val| {
3660 var anon_decl = try block.startAnonDecl();3660 const new_mut_ptr = Air.internedToRef((try mod.intern(.{ .ptr = .{
3661 defer anon_decl.deinit();3661 .ty = alloc_ty.toIntern(),
3662 const new_mut_ptr = try sema.analyzeDeclRef(try anon_decl.finish(elem_ty, val.toValue(), ptr_info.flags.alignment));3662 .addr = .{ .anon_decl = val },
3663 } })));
3663 return sema.makePtrConst(block, new_mut_ptr);3664 return sema.makePtrConst(block, new_mut_ptr);
3664 }3665 }
36653666
src/codegen/llvm.zig+5-1
...@@ -3049,6 +3049,7 @@ pub const Object = struct {...@@ -3049,6 +3049,7 @@ pub const Object = struct {
3049 o: *Object,3049 o: *Object,
3050 decl_val: InternPool.Index,3050 decl_val: InternPool.Index,
3051 llvm_addr_space: Builder.AddrSpace,3051 llvm_addr_space: Builder.AddrSpace,
3052 alignment: InternPool.Alignment,
3052 ) Error!Builder.Variable.Index {3053 ) Error!Builder.Variable.Index {
3053 // TODO: Add address space to the anon_decl_map3054 // TODO: Add address space to the anon_decl_map
3054 const gop = try o.anon_decl_map.getOrPut(o.gpa, decl_val);3055 const gop = try o.anon_decl_map.getOrPut(o.gpa, decl_val);
...@@ -3068,6 +3069,8 @@ pub const Object = struct {...@@ -3068,6 +3069,8 @@ pub const Object = struct {
3068 try variable_index.setInitializer(try o.lowerValue(decl_val), &o.builder);3069 try variable_index.setInitializer(try o.lowerValue(decl_val), &o.builder);
3069 variable_index.setLinkage(.internal, &o.builder);3070 variable_index.setLinkage(.internal, &o.builder);
3070 variable_index.setUnnamedAddr(.unnamed_addr, &o.builder);3071 variable_index.setUnnamedAddr(.unnamed_addr, &o.builder);
3072 if (alignment != .none)
3073 variable_index.setAlignment(alignment.toLlvm(), &o.builder);
3071 return variable_index;3074 return variable_index;
3072 }3075 }
30733076
...@@ -4415,7 +4418,8 @@ pub const Object = struct {...@@ -4415,7 +4418,8 @@ pub const Object = struct {
44154418
4416 const addr_space = target_util.defaultAddressSpace(target, .global_constant);4419 const addr_space = target_util.defaultAddressSpace(target, .global_constant);
4417 const llvm_addr_space = toLlvmAddressSpace(addr_space, target);4420 const llvm_addr_space = toLlvmAddressSpace(addr_space, target);
4418 const llvm_global = (try o.resolveGlobalAnonDecl(decl_val, llvm_addr_space)).ptrConst(&o.builder).global;4421 const alignment = ptr_ty.ptrAlignment(mod);
4422 const llvm_global = (try o.resolveGlobalAnonDecl(decl_val, llvm_addr_space, alignment)).ptrConst(&o.builder).global;
44194423
4420 const llvm_val = try o.builder.convConst(4424 const llvm_val = try o.builder.convConst(
4421 .unneeded,4425 .unneeded,
test/behavior.zig-1
...@@ -37,7 +37,6 @@ test {...@@ -37,7 +37,6 @@ test {
37 _ = @import("behavior/bugs/1500.zig");37 _ = @import("behavior/bugs/1500.zig");
38 _ = @import("behavior/bugs/1607.zig");38 _ = @import("behavior/bugs/1607.zig");
39 _ = @import("behavior/bugs/1735.zig");39 _ = @import("behavior/bugs/1735.zig");
40 _ = @import("behavior/bugs/1741.zig");
41 _ = @import("behavior/bugs/1851.zig");40 _ = @import("behavior/bugs/1851.zig");
42 _ = @import("behavior/bugs/1914.zig");41 _ = @import("behavior/bugs/1914.zig");
43 _ = @import("behavior/bugs/2006.zig");42 _ = @import("behavior/bugs/2006.zig");
test/behavior/align.zig+9
...@@ -15,6 +15,15 @@ test "global variable alignment" {...@@ -15,6 +15,15 @@ test "global variable alignment" {
15 }15 }
16}16}
1717
18test "large alignment of local constant" {
19 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
20 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
21 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky
22
23 const x: f32 align(128) = 12.34;
24 try std.testing.expect(@intFromPtr(&x) % 128 == 0);
25}
26
18test "slicing array of length 1 can not assume runtime index is always zero" {27test "slicing array of length 1 can not assume runtime index is always zero" {
19 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO28 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
20 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO29 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/bugs/1741.zig deleted-11
...@@ -1,11 +0,0 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4test "fixed" {
5 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky
8
9 const x: f32 align(128) = 12.34;
10 try std.testing.expect(@intFromPtr(&x) % 128 == 0);
11}