authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-13 02:51:46-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log904ffb41de9caa3f8f99806518d719beef832b7c
tree6fb9290b96cdd1aad14cc631f237db56752652db
parent57c38f6433c8024d1946bcf1b5b7d0892fc751a7

x86_64: implement calling function references


4 files changed, 11 insertions(+), 10 deletions(-)

src/arch/x86_64/CodeGen.zig+11-7
......@@ -7378,11 +7378,15 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
73787378 // on linking.
73797379 const mod = self.bin_file.options.module.?;
73807380 if (self.air.value(callee)) |func_value| {
7381 if (func_value.castTag(.function)) |func_payload| {
7382 const func = func_payload.data;
7383
7381 if (if (func_value.castTag(.function)) |func_payload|
7382 func_payload.data.owner_decl
7383 else if (func_value.castTag(.decl_ref)) |decl_ref_payload|
7384 decl_ref_payload.data
7385 else
7386 null) |owner_decl|
7387 {
73847388 if (self.bin_file.cast(link.File.Elf)) |elf_file| {
7385 const atom_index = try elf_file.getOrCreateAtomForDecl(func.owner_decl);
7389 const atom_index = try elf_file.getOrCreateAtomForDecl(owner_decl);
73867390 const atom = elf_file.getAtom(atom_index);
73877391 _ = try atom.getOrCreateOffsetTableEntry(elf_file);
73887392 const got_addr = atom.getOffsetTableAddress(elf_file);
......@@ -7391,17 +7395,17 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
73917395 .disp = @intCast(i32, got_addr),
73927396 }));
73937397 } else if (self.bin_file.cast(link.File.Coff)) |coff_file| {
7394 const atom = try coff_file.getOrCreateAtomForDecl(func.owner_decl);
7398 const atom = try coff_file.getOrCreateAtomForDecl(owner_decl);
73957399 const sym_index = coff_file.getAtom(atom).getSymbolIndex().?;
73967400 try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
73977401 try self.asmRegister(.{ ._, .call }, .rax);
73987402 } else if (self.bin_file.cast(link.File.MachO)) |macho_file| {
7399 const atom = try macho_file.getOrCreateAtomForDecl(func.owner_decl);
7403 const atom = try macho_file.getOrCreateAtomForDecl(owner_decl);
74007404 const sym_index = macho_file.getAtom(atom).getSymbolIndex().?;
74017405 try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
74027406 try self.asmRegister(.{ ._, .call }, .rax);
74037407 } else if (self.bin_file.cast(link.File.Plan9)) |p9| {
7404 const decl_block_index = try p9.seeDecl(func.owner_decl);
7408 const decl_block_index = try p9.seeDecl(owner_decl);
74057409 const decl_block = p9.getDeclBlock(decl_block_index);
74067410 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
74077411 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
test/behavior/bugs/1277.zig-1
......@@ -14,7 +14,6 @@ fn f() i32 {
1414test "don't emit an LLVM global for a const function when it's in an optional in a struct" {
1515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1616 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1817 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1918 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2019
test/behavior/bugs/12801-2.zig-1
......@@ -16,7 +16,6 @@ const Auto = struct {
1616test {
1717 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1818 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
19 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2019 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2120 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2221
test/behavior/fn.zig-1
......@@ -502,7 +502,6 @@ test "method call with optional pointer first param" {
502502}
503503
504504test "using @ptrCast on function pointers" {
505 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
506505 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
507506 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
508507 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO