authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-10-17 09:06:56+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-10-19 19:46:07+01:00
log73f4c680054a1a4e067f0719676f61f175d81a13
treecc67d4aac2546d4459cad172e0b6eff15d394e14
parent387965a696e567357ca4729b41951e51592ef821
signaturelock-open Commit is signed but in an unrecognized format.

x86_64: handle incoming stack alignment


3 files changed, 17 insertions(+), 27 deletions(-)

src/Zcu.zig+1-2
......@@ -3607,8 +3607,7 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu
36073607 else => false,
36083608 },
36093609 .stage2_x86_64 => switch (cc) {
3610 .x86_64_sysv, .x86_64_win => |opts| opts.incoming_stack_alignment == null,
3611 .naked => true,
3610 .x86_64_sysv, .x86_64_win, .naked => true, // incoming stack alignment supported
36123611 else => false,
36133612 },
36143613 .stage2_aarch64 => switch (cc) {
src/arch/x86_64/CodeGen.zig+16-9
......@@ -19326,12 +19326,12 @@ fn resolveCallingConventionValues(
1932619326 result.return_value = InstTracking.init(.unreach);
1932719327 result.stack_align = .@"8";
1932819328 },
19329 .x86_64_sysv, .x86_64_win => {
19329 .x86_64_sysv, .x86_64_win => |cc_opts| {
1933019330 var ret_int_reg_i: u32 = 0;
1933119331 var ret_sse_reg_i: u32 = 0;
1933219332 var param_int_reg_i: u32 = 0;
1933319333 var param_sse_reg_i: u32 = 0;
19334 result.stack_align = .@"16";
19334 result.stack_align = .fromByteUnits(cc_opts.incoming_stack_alignment orelse 16);
1933519335
1933619336 switch (resolved_cc) {
1933719337 .x86_64_sysv => {},
......@@ -19512,10 +19512,13 @@ fn resolveCallingConventionValues(
1951219512 }
1951319513
1951419514 const param_size: u31 = @intCast(ty.abiSize(zcu));
19515 const param_align: u31 =
19516 @intCast(@max(ty.abiAlignment(zcu).toByteUnits().?, 8));
19517 result.stack_byte_count =
19518 mem.alignForward(u31, result.stack_byte_count, param_align);
19515 const param_align = ty.abiAlignment(zcu).max(.@"8");
19516 result.stack_byte_count = mem.alignForward(
19517 u31,
19518 result.stack_byte_count,
19519 @intCast(param_align.toByteUnits().?),
19520 );
19521 result.stack_align = result.stack_align.max(param_align);
1951919522 arg.* = .{ .load_frame = .{
1952019523 .index = stack_frame_base,
1952119524 .off = result.stack_byte_count,
......@@ -19557,9 +19560,13 @@ fn resolveCallingConventionValues(
1955719560 continue;
1955819561 }
1955919562 const param_size: u31 = @intCast(ty.abiSize(zcu));
19560 const param_align: u31 = @intCast(ty.abiAlignment(zcu).toByteUnits().?);
19561 result.stack_byte_count =
19562 mem.alignForward(u31, result.stack_byte_count, param_align);
19563 const param_align = ty.abiAlignment(zcu);
19564 result.stack_byte_count = mem.alignForward(
19565 u31,
19566 result.stack_byte_count,
19567 @intCast(param_align.toByteUnits().?),
19568 );
19569 result.stack_align = result.stack_align.max(param_align);
1956319570 arg.* = .{ .load_frame = .{
1956419571 .index = stack_frame_base,
1956519572 .off = result.stack_byte_count,
src/target.zig-16
......@@ -607,19 +607,3 @@ pub inline fn backendSupportsFeature(backend: std.builtin.CompilerBackend, compt
607607 },
608608 };
609609}
610
611pub fn stackAlignment(target: std.Target, cc: std.builtin.CallingConvention) u64 {
612 switch (cc) {
613 inline else => |payload| switch (@TypeOf(payload)) {
614 std.builtin.CallingConvention.CommonOptions,
615 std.builtin.CallingConvention.X86RegparmOptions,
616 std.builtin.CallingConvention.ArmInterruptOptions,
617 std.builtin.CallingConvention.MipsInterruptOptions,
618 std.builtin.CallingConvention.RiscvInterruptOptions,
619 => if (payload.incoming_stack_alignment) |a| return a,
620 void => {},
621 else => comptime unreachable,
622 },
623 }
624 return target.stackAlignment();
625}