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...@@ -3607,8 +3607,7 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.builtin.CallingConvention) union(enu
3607 else => false,3607 else => false,
3608 },3608 },
3609 .stage2_x86_64 => switch (cc) {3609 .stage2_x86_64 => switch (cc) {
3610 .x86_64_sysv, .x86_64_win => |opts| opts.incoming_stack_alignment == null,3610 .x86_64_sysv, .x86_64_win, .naked => true, // incoming stack alignment supported
3611 .naked => true,
3612 else => false,3611 else => false,
3613 },3612 },
3614 .stage2_aarch64 => switch (cc) {3613 .stage2_aarch64 => switch (cc) {
src/arch/x86_64/CodeGen.zig+16-9
...@@ -19326,12 +19326,12 @@ fn resolveCallingConventionValues(...@@ -19326,12 +19326,12 @@ fn resolveCallingConventionValues(
19326 result.return_value = InstTracking.init(.unreach);19326 result.return_value = InstTracking.init(.unreach);
19327 result.stack_align = .@"8";19327 result.stack_align = .@"8";
19328 },19328 },
19329 .x86_64_sysv, .x86_64_win => {19329 .x86_64_sysv, .x86_64_win => |cc_opts| {
19330 var ret_int_reg_i: u32 = 0;19330 var ret_int_reg_i: u32 = 0;
19331 var ret_sse_reg_i: u32 = 0;19331 var ret_sse_reg_i: u32 = 0;
19332 var param_int_reg_i: u32 = 0;19332 var param_int_reg_i: u32 = 0;
19333 var param_sse_reg_i: u32 = 0;19333 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
19336 switch (resolved_cc) {19336 switch (resolved_cc) {
19337 .x86_64_sysv => {},19337 .x86_64_sysv => {},
...@@ -19512,10 +19512,13 @@ fn resolveCallingConventionValues(...@@ -19512,10 +19512,13 @@ fn resolveCallingConventionValues(
19512 }19512 }
1951319513
19514 const param_size: u31 = @intCast(ty.abiSize(zcu));19514 const param_size: u31 = @intCast(ty.abiSize(zcu));
19515 const param_align: u31 =19515 const param_align = ty.abiAlignment(zcu).max(.@"8");
19516 @intCast(@max(ty.abiAlignment(zcu).toByteUnits().?, 8));19516 result.stack_byte_count = mem.alignForward(
19517 result.stack_byte_count =19517 u31,
19518 mem.alignForward(u31, result.stack_byte_count, param_align);19518 result.stack_byte_count,
19519 @intCast(param_align.toByteUnits().?),
19520 );
19521 result.stack_align = result.stack_align.max(param_align);
19519 arg.* = .{ .load_frame = .{19522 arg.* = .{ .load_frame = .{
19520 .index = stack_frame_base,19523 .index = stack_frame_base,
19521 .off = result.stack_byte_count,19524 .off = result.stack_byte_count,
...@@ -19557,9 +19560,13 @@ fn resolveCallingConventionValues(...@@ -19557,9 +19560,13 @@ fn resolveCallingConventionValues(
19557 continue;19560 continue;
19558 }19561 }
19559 const param_size: u31 = @intCast(ty.abiSize(zcu));19562 const param_size: u31 = @intCast(ty.abiSize(zcu));
19560 const param_align: u31 = @intCast(ty.abiAlignment(zcu).toByteUnits().?);19563 const param_align = ty.abiAlignment(zcu);
19561 result.stack_byte_count =19564 result.stack_byte_count = mem.alignForward(
19562 mem.alignForward(u31, result.stack_byte_count, param_align);19565 u31,
19566 result.stack_byte_count,
19567 @intCast(param_align.toByteUnits().?),
19568 );
19569 result.stack_align = result.stack_align.max(param_align);
19563 arg.* = .{ .load_frame = .{19570 arg.* = .{ .load_frame = .{
19564 .index = stack_frame_base,19571 .index = stack_frame_base,
19565 .off = result.stack_byte_count,19572 .off = result.stack_byte_count,
src/target.zig-16
...@@ -607,19 +607,3 @@ pub inline fn backendSupportsFeature(backend: std.builtin.CompilerBackend, compt...@@ -607,19 +607,3 @@ pub inline fn backendSupportsFeature(backend: std.builtin.CompilerBackend, compt
607 },607 },
608 };608 };
609}609}
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}