Commit 5fd53dc36f

Jakub Konka <kubkon@jakubkonka.com>
2024-08-12 17:40:41
x86_64: start converting away from .got.zig knowledge
1 parent d7c5fbc
Changed files (2)
src
src/arch/x86_64/CodeGen.zig
@@ -12311,25 +12311,33 @@ fn genCall(self: *Self, info: union(enum) {
                         const zo = elf_file.zigObjectPtr().?;
                         const sym_index = try zo.getOrCreateMetadataForNav(elf_file, func.owner_nav);
                         if (self.mod.pic) {
-                            const callee_reg: Register = switch (resolved_cc) {
-                                .SysV => callee: {
-                                    if (!fn_info.is_var_args) break :callee .rax;
-                                    const param_regs = abi.getCAbiIntParamRegs(resolved_cc);
-                                    break :callee if (call_info.gp_count < param_regs.len)
-                                        param_regs[call_info.gp_count]
-                                    else
-                                        .r10;
-                                },
-                                .Win64 => .rax,
-                                else => unreachable,
-                            };
-                            try self.genSetReg(
-                                callee_reg,
-                                Type.usize,
-                                .{ .load_symbol = .{ .sym = sym_index } },
-                                .{},
-                            );
-                            try self.asmRegister(.{ ._, .call }, callee_reg);
+                            // const callee_reg: Register = switch (resolved_cc) {
+                            //     .SysV => callee: {
+                            //         if (!fn_info.is_var_args) break :callee .rax;
+                            //         const param_regs = abi.getCAbiIntParamRegs(resolved_cc);
+                            //         break :callee if (call_info.gp_count < param_regs.len)
+                            //             param_regs[call_info.gp_count]
+                            //         else
+                            //             .r10;
+                            //     },
+                            //     .Win64 => .rax,
+                            //     else => unreachable,
+                            // };
+                            // TODO convert to near jump
+                            try self.asmMemory(.{ ._, .call }, .{
+                                .base = .{ .reloc = .{
+                                    .atom_index = try self.owner.getSymbolIndex(self),
+                                    .sym_index = sym_index,
+                                } },
+                                .mod = .{ .rm = .{ .size = .qword } },
+                            });
+                            // try self.genSetReg(
+                            //     callee_reg,
+                            //     Type.usize,
+                            //     .{ .load_symbol = .{ .sym = sym_index } },
+                            //     .{},
+                            // );
+                            // try self.asmRegister(.{ ._, .call }, callee_reg);
                         } else try self.asmMemory(.{ ._, .call }, .{
                             .base = .{ .reloc = .{
                                 .atom_index = try self.owner.getSymbolIndex(self),
@@ -14097,7 +14105,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
                     else
                         return self.fail("invalid modifier: '{s}'", .{modifier}),
                     .load_symbol => |sym_off| if (mem.eql(u8, modifier, "P"))
-                        .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .load_symbol = sym_off }) }
+                        .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_symbol = sym_off }) }
                     else
                         return self.fail("invalid modifier: '{s}'", .{modifier}),
                     else => return self.fail("invalid constraint: '{s}'", .{op_str}),
src/arch/x86_64/Lower.zig
@@ -398,6 +398,7 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
 
                         _ = lower.reloc(.{ .linker_reloc = sym });
                         break :op if (lower.pic) switch (mnemonic) {
+                            .call => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },
                             .lea => 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,