Commit f0df0acd70

Jakub Konka <kubkon@jakubkonka.com>
2024-08-15 10:33:30
x86_64: fix handling on externs in lower/emit
1 parent 0fd0b11
Changed files (2)
src
arch
src/arch/x86_64/Emit.zig
@@ -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");
src/arch/x86_64/Lower.zig
@@ -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];