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 {
100824100824 const new_temp_index = cg.next_temp_index;
100825100825 cg.temp_type[@intFromEnum(new_temp_index)] = .usize;
100826100826 cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1);
100827 switch (temp.tracking(cg).short) {
100828 else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
100827 const mcv = temp.tracking(cg).short;
100828 switch (mcv) {
100829 else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
100829100830 .register => |reg| {
100830 const new_reg =
100831 try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100831 const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100832100832 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
100833100833 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
100834100834 .base = .{ .reg = reg.to64() },
......@@ -100836,33 +100836,22 @@ const Temp = struct {
100836100836 });
100837100837 },
100838100838 .register_offset => |reg_off| {
100839 const new_reg =
100840 try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100839 const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
100841100840 new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
100842100841 try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
100843100842 .base = .{ .reg = reg_off.reg.to64() },
100844100843 .mod = .{ .rm = .{ .disp = reg_off.off + off } },
100845100844 });
100846100845 },
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 },
100847100851 .lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{
100848100852 .sym_index = sym_off.sym_index,
100849100853 .off = sym_off.off + off,
100850100854 } }),
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 },
100866100855 .lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{
100867100856 .index = frame_addr.index,
100868100857 .off = frame_addr.off + off,
......@@ -101179,7 +101168,8 @@ const Temp = struct {
101179101168 => return temp.toRegClass(true, .general_purpose, cg),
101180101169 .lea_symbol => |sym_off| {
101181101170 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;
101183101173 try temp.toOffset(-off, cg);
101184101174 while (try temp.toRegClass(true, .general_purpose, cg)) {}
101185101175 try temp.toOffset(off, cg);