Commit 73f4c68005
Changed files (3)
src
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) {