diff --git a/src/Zcu.zig b/src/Zcu.zig index ae6105557b..c860e31d9f 100644 --- a/src/Zcu.zig +++ b/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) { diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 7adeae77f9..10260ea465 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/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, diff --git a/src/target.zig b/src/target.zig index 7a5c3387b6..7d30781f43 100644 --- a/src/target.zig +++ b/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(); -}