authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-09-10 03:10:46-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-20 18:33:01-07:00
logcbbb67c5df46bc97f70f925772ce03eb11db5a1b
treeee390b31d5f60d9ccab8bd09fc9328c458e55fa4
parent0681bf06abfccdc3c215b712950f17e0bbeb95a0

x86_64: fix safety crashes in `storeRegs`


1 files changed, 16 insertions(+), 6 deletions(-)

src/arch/x86_64/CodeGen.zig+16-6
...@@ -187019,7 +187019,13 @@ const Temp = struct {...@@ -187019,7 +187019,13 @@ const Temp = struct {
187019 },187019 },
187020 .struct_type => {187020 .struct_type => {
187021 assert(src_regs.len - part_index == std.math.divCeil(u32, src_abi_size, 8) catch unreachable);187021 assert(src_regs.len - part_index == std.math.divCeil(u32, src_abi_size, 8) catch unreachable);
187022 break :part_ty .u64;187022 break :part_ty switch (src_abi_size) {
187023 0, 3, 5...7 => unreachable,
187024 1 => .u8,
187025 2 => .u16,
187026 4 => .u32,
187027 else => .u64,
187028 };
187023 },187029 },
187024 .tuple_type => |tuple_type| {187030 .tuple_type => |tuple_type| {
187025 assert(tuple_type.types.len == src_regs.len);187031 assert(tuple_type.types.len == src_regs.len);
...@@ -187028,10 +187034,6 @@ const Temp = struct {...@@ -187028,10 +187034,6 @@ const Temp = struct {
187028 };187034 };
187029 const part_size: u31 = @intCast(part_ty.abiSize(zcu));187035 const part_size: u31 = @intCast(part_ty.abiSize(zcu));
187030 const src_rc = src_reg.class();187036 const src_rc = src_reg.class();
187031 const part_bit_size = switch (src_rc) {
187032 else => 8 * part_size,
187033 .x87 => part_ty.bitSize(zcu),
187034 };
187035 if (src_rc == .x87 or std.math.isPowerOfTwo(part_size)) {187037 if (src_rc == .x87 or std.math.isPowerOfTwo(part_size)) {
187036 // hack around linker relocation bugs187038 // hack around linker relocation bugs
187037 switch (ptr.tracking(cg).short) {187039 switch (ptr.tracking(cg).short) {
...@@ -187040,7 +187042,15 @@ const Temp = struct {...@@ -187040,7 +187042,15 @@ const Temp = struct {
187040 }187042 }
187041 const strat = try cg.moveStrategy(part_ty, src_rc, false);187043 const strat = try cg.moveStrategy(part_ty, src_rc, false);
187042 try strat.write(cg, try ptr.tracking(cg).short.deref().mem(cg, .{187044 try strat.write(cg, try ptr.tracking(cg).short.deref().mem(cg, .{
187043 .size = .fromBitSize(part_bit_size),187045 .size = switch (src_rc) {
187046 else => .fromBitSize(8 * part_size),
187047 .x87 => switch (abi.classifySystemV(src_ty, zcu, cg.target, .other)[part_index]) {
187048 else => unreachable,
187049 .float => .dword,
187050 .float_combine, .sse => .qword,
187051 .x87 => .tbyte,
187052 },
187053 },
187044 .disp = part_disp,187054 .disp = part_disp,
187045 }), registerAlias(src_reg, part_size));187055 }), registerAlias(src_reg, part_size));
187046 } else {187056 } else {