| author | |
| committer | |
| log | ecfb18286a5270943382effdf383bae4546b184f |
| tree | a0f2853e50a26ab2d7e98f92cde006ac66de022a |
| parent | 3cd3052d4d303dbae7d517fa40f6d171c957afdd |
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(); |
| 3658 | 3658 | ||
| 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 | } |
| 3665 | 3666 |
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_map | 3054 | // 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 | } |
| 3073 | 3076 | ||
| ... | @@ -4415,7 +4418,8 @@ pub const Object = struct { | ... | @@ -4415,7 +4418,8 @@ pub const Object = struct { |
| 4415 | 4418 | ||
| 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; | ||
| 4419 | 4423 | ||
| 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 | } |
| 17 | 17 | ||
| 18 | test "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 | |||
| 18 | test "slicing array of length 1 can not assume runtime index is always zero" { | 27 | test "slicing array of length 1 can not assume runtime index is always zero" { |
| 19 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 28 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 20 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 29 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
test/behavior/bugs/1741.zig deleted-11| ... | @@ -1,11 +0,0 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = @import("builtin"); | ||
| 3 | |||
| 4 | test "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 | } | ||