Commit 73f4c68005

mlugg <mlugg@mlugg.co.uk>
2024-10-17 10:06:56
x86_64: handle incoming stack alignment
1 parent 387965a
Changed files (3)
src/arch/x86_64/CodeGen.zig
@@ -19326,12 +19326,12 @@ fn resolveCallingConventionValues(
             result.return_value = InstTracking.init(.unreach);
             result.stack_align = .@"8";
         },
-        .x86_64_sysv, .x86_64_win => {
+        .x86_64_sysv, .x86_64_win => |cc_opts| {
             var ret_int_reg_i: u32 = 0;
             var ret_sse_reg_i: u32 = 0;
             var param_int_reg_i: u32 = 0;
             var param_sse_reg_i: u32 = 0;
-            result.stack_align = .@"16";
+            result.stack_align = .fromByteUnits(cc_opts.incoming_stack_alignment orelse 16);
 
             switch (resolved_cc) {
                 .x86_64_sysv => {},
@@ -19512,10 +19512,13 @@ fn resolveCallingConventionValues(
                 }
 
                 const param_size: u31 = @intCast(ty.abiSize(zcu));
-                const param_align: u31 =
-                    @intCast(@max(ty.abiAlignment(zcu).toByteUnits().?, 8));
-                result.stack_byte_count =
-                    mem.alignForward(u31, result.stack_byte_count, param_align);
+                const param_align = ty.abiAlignment(zcu).max(.@"8");
+                result.stack_byte_count = mem.alignForward(
+                    u31,
+                    result.stack_byte_count,
+                    @intCast(param_align.toByteUnits().?),
+                );
+                result.stack_align = result.stack_align.max(param_align);
                 arg.* = .{ .load_frame = .{
                     .index = stack_frame_base,
                     .off = result.stack_byte_count,
@@ -19557,9 +19560,13 @@ fn resolveCallingConventionValues(
                     continue;
                 }
                 const param_size: u31 = @intCast(ty.abiSize(zcu));
-                const param_align: u31 = @intCast(ty.abiAlignment(zcu).toByteUnits().?);
-                result.stack_byte_count =
-                    mem.alignForward(u31, result.stack_byte_count, param_align);
+                const param_align = ty.abiAlignment(zcu);
+                result.stack_byte_count = mem.alignForward(
+                    u31,
+                    result.stack_byte_count,
+                    @intCast(param_align.toByteUnits().?),
+                );
+                result.stack_align = result.stack_align.max(param_align);
                 arg.* = .{ .load_frame = .{
                     .index = stack_frame_base,
                     .off = result.stack_byte_count,
src/target.zig
@@ -607,19 +607,3 @@ pub inline fn backendSupportsFeature(backend: std.builtin.CompilerBackend, compt
         },
     };
 }
-
-pub fn stackAlignment(target: std.Target, cc: std.builtin.CallingConvention) u64 {
-    switch (cc) {
-        inline else => |payload| switch (@TypeOf(payload)) {
-            std.builtin.CallingConvention.CommonOptions,
-            std.builtin.CallingConvention.X86RegparmOptions,
-            std.builtin.CallingConvention.ArmInterruptOptions,
-            std.builtin.CallingConvention.MipsInterruptOptions,
-            std.builtin.CallingConvention.RiscvInterruptOptions,
-            => if (payload.incoming_stack_alignment) |a| return a,
-            void => {},
-            else => comptime unreachable,
-        },
-    }
-    return target.stackAlignment();
-}
src/Zcu.zig
@@ -3607,8 +3607,7 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu
             else => false,
         },
         .stage2_x86_64 => switch (cc) {
-            .x86_64_sysv, .x86_64_win => |opts| opts.incoming_stack_alignment == null,
-            .naked => true,
+            .x86_64_sysv, .x86_64_win, .naked => true, // incoming stack alignment supported
             else => false,
         },
         .stage2_aarch64 => switch (cc) {