diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-04-28 02:24:29 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-01 19:22:52 -0400 |
| commit | 50f96c2949bd7d396eaaf391ffd5fd55e59ebac1 (patch) | |
| tree | c5302677eecf012d7d83da4f3b51578767b87c0f | |
| parent | db76ae82607b941373064b05a348950802a21217 (diff) | |
| download | zig-50f96c2949bd7d396eaaf391ffd5fd55e59ebac1.tar.gz zig-50f96c2949bd7d396eaaf391ffd5fd55e59ebac1.zip | |
x86_64: fix stack realignment
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 7 | ||||
| -rw-r--r-- | test/behavior/align.zig | 5 |
2 files changed, 4 insertions, 8 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 915b36f267..955a0ba843 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -1673,15 +1673,16 @@ fn allocFrameIndex(self: *Self, alloc: FrameAlloc) !FrameIndex { const frame_allocs_slice = self.frame_allocs.slice(); const frame_size = frame_allocs_slice.items(.abi_size); const frame_align = frame_allocs_slice.items(.abi_align); + + const stack_frame_align = &frame_align[@enumToInt(FrameIndex.stack_frame)]; + stack_frame_align.* = @max(stack_frame_align.*, alloc.abi_align); + for (self.free_frame_indices.keys(), 0..) |frame_index, free_i| { const abi_size = frame_size[@enumToInt(frame_index)]; if (abi_size != alloc.abi_size) continue; const abi_align = &frame_align[@enumToInt(frame_index)]; abi_align.* = @max(abi_align.*, alloc.abi_align); - const stack_frame_align = &frame_align[@enumToInt(FrameIndex.stack_frame)]; - stack_frame_align.* = @max(stack_frame_align.*, alloc.abi_align); - _ = self.free_frame_indices.swapRemoveAt(free_i); return frame_index; } diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 7755cdaa7d..bfc9997dd2 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -282,7 +282,6 @@ fn give() anyerror!u128 { test "page aligned array on stack" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO @@ -491,10 +490,6 @@ test "read 128-bit field from default aligned struct in global memory" { } test "struct field explicit alignment" { - if (builtin.zig_backend == .stage2_x86_64) { - // Careful enabling this test, fails randomly. - return error.SkipZigTest; - } if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
