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 {
124124 .r_addend = -4,
125125 });
126126 } else {
127 const r_type: u32 = if (sym.flags.is_extern_ptr)
128 @intFromEnum(std.elf.R_X86_64.GOT32)
129 else if (sym.flags.is_tls)
127 const r_type: u32 = if (sym.flags.is_tls)
130128 @intFromEnum(std.elf.R_X86_64.TPOFF32)
131129 else
132130 @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)
397397 }
398398
399399 _ = lower.reloc(.{ .linker_reloc = sym });
400 break :op if (lower.pic) switch (mnemonic) {
401 .lea => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
400 if (lower.pic) switch (mnemonic) {
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 },
402405 .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
403406 else => unreachable,
404407 } else switch (mnemonic) {
......@@ -413,7 +416,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
413416 .base = .{ .reg = .ds },
414417 }) },
415418 else => unreachable,
416 };
419 }
417420 } else if (lower.bin_file.cast(.macho)) |macho_file| {
418421 const zo = macho_file.getZigObject().?;
419422 const macho_sym = zo.symbols.items[sym.sym_index];