authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-15 10:33:30+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-15 10:33:30+02:00
logf0df0acd70637eddbec559df20e8ea11429c26ed
treeaa5b2141a354f004f972e1606be4f6aa719e021c
parent0fd0b11bc43a6053c68f649e1e1a1e23b995a266

x86_64: fix handling on externs in lower/emit


2 files changed, 7 insertions(+), 6 deletions(-)

src/arch/x86_64/Emit.zig+1-3
...@@ -124,9 +124,7 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -124,9 +124,7 @@ pub fn emitMir(emit: *Emit) Error!void {
124 .r_addend = -4,124 .r_addend = -4,
125 });125 });
126 } else {126 } else {
127 const r_type: u32 = if (sym.flags.is_extern_ptr)127 const r_type: u32 = if (sym.flags.is_tls)
128 @intFromEnum(std.elf.R_X86_64.GOT32)
129 else if (sym.flags.is_tls)
130 @intFromEnum(std.elf.R_X86_64.TPOFF32)128 @intFromEnum(std.elf.R_X86_64.TPOFF32)
131 else129 else
132 @intFromEnum(std.elf.R_X86_64.@"32");130 @intFromEnum(std.elf.R_X86_64.@"32");
src/arch/x86_64/Lower.zig+6-3
...@@ -397,8 +397,11 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)...@@ -397,8 +397,11 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
397 }397 }
398398
399 _ = lower.reloc(.{ .linker_reloc = sym });399 _ = lower.reloc(.{ .linker_reloc = sym });
400 break :op if (lower.pic) switch (mnemonic) {400 if (lower.pic) switch (mnemonic) {
401 .lea => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },401 .lea => {
402 if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov;
403 break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) };
404 },
402 .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },405 .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
403 else => unreachable,406 else => unreachable,
404 } else switch (mnemonic) {407 } else switch (mnemonic) {
...@@ -413,7 +416,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)...@@ -413,7 +416,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
413 .base = .{ .reg = .ds },416 .base = .{ .reg = .ds },
414 }) },417 }) },
415 else => unreachable,418 else => unreachable,
416 };419 }
417 } else if (lower.bin_file.cast(.macho)) |macho_file| {420 } else if (lower.bin_file.cast(.macho)) |macho_file| {
418 const zo = macho_file.getZigObject().?;421 const zo = macho_file.getZigObject().?;
419 const macho_sym = zo.symbols.items[sym.sym_index];422 const macho_sym = zo.symbols.items[sym.sym_index];