aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-03-10 09:08:52 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2025-03-10 10:38:30 -0400
commit0ef3250c34a74eae650836e60fcf5f1b4990a2a2 (patch)
tree5b0b5f1b5fdcdc7b1311b26a9e8fe80076631878 /src
parente83607f52c82a2c0ca6887f947228cd447477651 (diff)
downloadzig-0ef3250c34a74eae650836e60fcf5f1b4990a2a2.tar.gz
zig-0ef3250c34a74eae650836e60fcf5f1b4990a2a2.zip
x86_64: fix symbol bugs
Closes #23143
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig34
1 files changed, 12 insertions, 22 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 9141646e4d..2247aaeacf 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -100824,11 +100824,11 @@ const Temp = struct {
const new_temp_index = cg.next_temp_index;
cg.temp_type[@intFromEnum(new_temp_index)] = .usize;
cg.next_temp_index = @enumFromInt(@intFromEnum(new_temp_index) + 1);
- switch (temp.tracking(cg).short) {
- else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
+ const mcv = temp.tracking(cg).short;
+ switch (mcv) {
+ else => std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
.register => |reg| {
- const new_reg =
- try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
+ const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
.base = .{ .reg = reg.to64() },
@@ -100836,33 +100836,22 @@ const Temp = struct {
});
},
.register_offset => |reg_off| {
- const new_reg =
- try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
+ const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
new_temp_index.tracking(cg).* = .init(.{ .register = new_reg });
try cg.asmRegisterMemory(.{ ._, .lea }, new_reg.to64(), .{
.base = .{ .reg = reg_off.reg.to64() },
.mod = .{ .rm = .{ .disp = reg_off.off + off } },
});
},
+ .load_symbol, .load_frame => {
+ const new_reg = try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
+ new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{ .reg = new_reg, .off = off } });
+ try cg.genSetReg(new_reg, .usize, mcv, .{});
+ },
.lea_symbol => |sym_off| new_temp_index.tracking(cg).* = .init(.{ .lea_symbol = .{
.sym_index = sym_off.sym_index,
.off = sym_off.off + off,
} }),
- .load_frame => |frame_addr| {
- const new_reg =
- try cg.register_manager.allocReg(new_temp_index.toIndex(), abi.RegisterClass.gp);
- new_temp_index.tracking(cg).* = .init(.{ .register_offset = .{
- .reg = new_reg,
- .off = off,
- } });
- try cg.asmRegisterMemory(.{ ._, .mov }, new_reg.to64(), .{
- .base = .{ .frame = frame_addr.index },
- .mod = .{ .rm = .{
- .size = .qword,
- .disp = frame_addr.off,
- } },
- });
- },
.lea_frame => |frame_addr| new_temp_index.tracking(cg).* = .init(.{ .lea_frame = .{
.index = frame_addr.index,
.off = frame_addr.off + off,
@@ -101179,7 +101168,8 @@ const Temp = struct {
=> return temp.toRegClass(true, .general_purpose, cg),
.lea_symbol => |sym_off| {
const off = sym_off.off;
- if (off == 0) return false;
+ // hack around linker relocation bugs
+ if (false and off == 0) return false;
try temp.toOffset(-off, cg);
while (try temp.toRegClass(true, .general_purpose, cg)) {}
try temp.toOffset(off, cg);