Skip to content

Commit 0ef3250

Browse files
committed
x86_64: fix symbol bugs
Closes #23143
1 parent e83607f commit 0ef3250

File tree

1 file changed

+12
-22
lines changed

1 file changed

+12
-22
lines changed

src/arch/x86_64/CodeGen.zig

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -100824,45 +100824,34 @@ 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() },
100835100835
.mod = .{ .rm = .{ .disp = off } },
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);

0 commit comments

Comments
 (0)