mirror of
https://github.com/ziglang/zig.git
synced 2026-02-06 14:37:04 +00:00
x86_64: fix handling on externs in lower/emit
This commit is contained in:
parent
0fd0b11bc4
commit
f0df0acd70
@ -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");
|
||||
|
||||
@ -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];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user