x86_64: fix handling on externs in lower/emit

This commit is contained in:
Jakub Konka 2024-08-15 10:33:30 +02:00
parent 0fd0b11bc4
commit f0df0acd70
2 changed files with 7 additions and 6 deletions

View File

@ -124,9 +124,7 @@ pub fn emitMir(emit: *Emit) Error!void {
.r_addend = -4,
});
} else {
const r_type: u32 = if (sym.flags.is_extern_ptr)
@intFromEnum(std.elf.R_X86_64.GOT32)
else if (sym.flags.is_tls)
const r_type: u32 = if (sym.flags.is_tls)
@intFromEnum(std.elf.R_X86_64.TPOFF32)
else
@intFromEnum(std.elf.R_X86_64.@"32");

View File

@ -397,8 +397,11 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
}
_ = lower.reloc(.{ .linker_reloc = sym });
break :op if (lower.pic) switch (mnemonic) {
.lea => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
if (lower.pic) switch (mnemonic) {
.lea => {
if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov;
break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) };
},
.mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
else => unreachable,
} else switch (mnemonic) {
@ -413,7 +416,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
.base = .{ .reg = .ds },
}) },
else => unreachable,
};
}
} else if (lower.bin_file.cast(.macho)) |macho_file| {
const zo = macho_file.getZigObject().?;
const macho_sym = zo.symbols.items[sym.sym_index];