authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-10 09:08:52-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-10 10:38:30-04:00
log0ef3250c34a74eae650836e60fcf5f1b4990a2a2
tree5b0b5f1b5fdcdc7b1311b26a9e8fe80076631878
parente83607f52c82a2c0ca6887f947228cd447477651

x86_64: fix symbol bugs

Closes #23143

1 files changed, 12 insertions(+), 22 deletions(-)

src/arch/x86_64/CodeGen.zig+12-22
...@@ -100824,11 +100824,11 @@ const Temp = struct {...@@ -100824,11 +100824,11 @@ const Temp = struct {
100824 const new_temp_index = cg.next_temp_index;100824 const new_temp_index = cg.next_temp_index;
100825 cg.temp_type[@intFromEnum(new_temp_index)] = .usize;100825 cg.temp_type[@intFromEnum(new_temp_index)] = .usize;
100826 cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1);100826 cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1);
100827 switch (temp.tracking(cg).short) {100827 const mcv = temp.tracking(cg).short;
100828 else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),100828 switch (mcv) {
100829 else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
100829 .register => |reg| {100830 .register => |reg| {
100830 const new_reg =100831 const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100831 try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100832 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });100832 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
100833 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{100833 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
100834 .base = .{ .reg = reg.to64() },100834 .base = .{ .reg = reg.to64() },
...@@ -100836,33 +100836,22 @@ const Temp = struct {...@@ -100836,33 +100836,22 @@ const Temp = struct {
100836 });100836 });
100837 },100837 },
100838 .register_offset => |reg_off| {100838 .register_offset => |reg_off| {
100839 const new_reg =100839 const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100840 try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100841 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });100840 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
100842 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{100841 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
100843 .base = .{ .reg = reg_off.reg.to64() },100842 .base = .{ .reg = reg_off.reg.to64() },
100844 .mod = .{ .rm = .{ .disp = reg_off.off + off } },100843 .mod = .{ .rm = .{ .disp = reg_off.off + off } },
100845 });100844 });
100846 },100845 },
100846 .load_symbol, .load_frame => {
100847 const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100848 new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{ .reg = new_reg, .off = off } });
100849 try cg.genSetReg(new_reg, .usize, mcv, .{});
100850 },
100847 .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{100851 .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{
100848 .sym_index = sym_off.sym_index,100852 .sym_index = sym_off.sym_index,
100849 .off = sym_off.off + off,100853 .off = sym_off.off + off,
100850 } }),100854 } }),
100851 .load_frame => |frame_addr| {
100852 const new_reg =
100853 try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100854 new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{
100855 .reg = new_reg,
100856 .off = off,
100857 } });
100858 try cg.asmRegisterMemory(.{ ._, .mov }, new_reg.to64(), .{
100859 .base = .{ .frame = frame_addr.index },
100860 .mod = .{ .rm = .{
100861 .size = .qword,
100862 .disp = frame_addr.off,
100863 } },
100864 });
100865 },
100866 .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{100855 .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{
100867 .index = frame_addr.index,100856 .index = frame_addr.index,
100868 .off = frame_addr.off + off,100857 .off = frame_addr.off + off,
...@@ -101179,7 +101168,8 @@ const Temp = struct {...@@ -101179,7 +101168,8 @@ const Temp = struct {
101179 => return temp.toRegClass(true, .general_purpose, cg),101168 => return temp.toRegClass(true, .general_purpose, cg),
101180 .lea_symbol => |sym_off| {101169 .lea_symbol => |sym_off| {
101181 const off = sym_off.off;101170 const off = sym_off.off;
101182 if (off == 0) return false;101171 // hack around linker relocation bugs
101172 if (false and off == 0) return false;
101183 try temp.toOffset(-off, cg);101173 try temp.toOffset(-off, cg);
101184 while (try temp.toRegClass(true, .general_purpose, cg)) {}101174 while (try temp.toRegClass(true, .general_purpose, cg)) {}
101185 try temp.toOffset(off, cg);101175 try temp.toOffset(off, cg);