x86_64: handle incoming stack alignment

This commit is contained in:
mlugg
2024-10-17 09:06:56 +01:00
parent 387965a696
commit 73f4c68005
3 changed files with 17 additions and 27 deletions

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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();
}