diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index 4832a46accb4c33170019f1be354fa208baec830..da3b4678f282eccdd36b9f8e480e88391ad00f42 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -1386,7 +1386,7 @@ fn updateNavCode( .none => switch (mod.optimize_mode) { .Debug, .ReleaseSafe, .ReleaseFast => target_util.defaultFunctionAlignment(target), .ReleaseSmall => target_util.minFunctionAlignment(target), - }, + }.maxStrict(Type.fromInterned(nav.resolved.?.type).abiAlignment(zcu)), else => |a| a.maxStrict(target_util.minFunctionAlignment(target)), }; diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 46a5106046785aa1f1c9b0de8617d3b20b9ecebc..f7e7aa69fd375f57dfbf56ec0f4379e9e0f3bd0d 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -2863,7 +2863,7 @@ fn navMapIndex(elf: *Elf, zcu: *Zcu, nav_index: InternPool.Nav.Index) !Node.NavM .ReleaseFast, => target_util.defaultFunctionAlignment(target), .ReleaseSmall => min, - }, + }.maxStrict(Type.fromInterned(nav.resolved.?.type).abiAlignment(zcu)), }; }, else => switch (nav.resolved.?.@"align") { diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 0bc7195d3999f9a2cc04e9923a960bec79317b74..3ade0f6164d08e6e57c7f33ecbe9fed48b232b83 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -15,6 +15,15 @@ test "global variable alignment" { } } +test "large abi alignment of global" { + const S = struct { + var global: @This() = undefined; + x: u64 align(64), + }; + + try std.testing.expect(@ctz(@intFromPtr(&S.global)) >= 6); +} + test "large alignment of local constant" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; // flaky