mirror of
https://github.com/ziglang/zig.git
synced 2025-12-16 19:23:08 +00:00
x86_64: implement calling function references
This commit is contained in:
parent
57c38f6433
commit
904ffb41de
@ -7378,11 +7378,15 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
|||||||
// on linking.
|
// on linking.
|
||||||
const mod = self.bin_file.options.module.?;
|
const mod = self.bin_file.options.module.?;
|
||||||
if (self.air.value(callee)) |func_value| {
|
if (self.air.value(callee)) |func_value| {
|
||||||
if (func_value.castTag(.function)) |func_payload| {
|
if (if (func_value.castTag(.function)) |func_payload|
|
||||||
const func = func_payload.data;
|
func_payload.data.owner_decl
|
||||||
|
else if (func_value.castTag(.decl_ref)) |decl_ref_payload|
|
||||||
|
decl_ref_payload.data
|
||||||
|
else
|
||||||
|
null) |owner_decl|
|
||||||
|
{
|
||||||
if (self.bin_file.cast(link.File.Elf)) |elf_file| {
|
if (self.bin_file.cast(link.File.Elf)) |elf_file| {
|
||||||
const atom_index = try elf_file.getOrCreateAtomForDecl(func.owner_decl);
|
const atom_index = try elf_file.getOrCreateAtomForDecl(owner_decl);
|
||||||
const atom = elf_file.getAtom(atom_index);
|
const atom = elf_file.getAtom(atom_index);
|
||||||
_ = try atom.getOrCreateOffsetTableEntry(elf_file);
|
_ = try atom.getOrCreateOffsetTableEntry(elf_file);
|
||||||
const got_addr = atom.getOffsetTableAddress(elf_file);
|
const got_addr = atom.getOffsetTableAddress(elf_file);
|
||||||
@ -7391,17 +7395,17 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
|||||||
.disp = @intCast(i32, got_addr),
|
.disp = @intCast(i32, got_addr),
|
||||||
}));
|
}));
|
||||||
} else if (self.bin_file.cast(link.File.Coff)) |coff_file| {
|
} else if (self.bin_file.cast(link.File.Coff)) |coff_file| {
|
||||||
const atom = try coff_file.getOrCreateAtomForDecl(func.owner_decl);
|
const atom = try coff_file.getOrCreateAtomForDecl(owner_decl);
|
||||||
const sym_index = coff_file.getAtom(atom).getSymbolIndex().?;
|
const sym_index = coff_file.getAtom(atom).getSymbolIndex().?;
|
||||||
try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
|
try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
|
||||||
try self.asmRegister(.{ ._, .call }, .rax);
|
try self.asmRegister(.{ ._, .call }, .rax);
|
||||||
} else if (self.bin_file.cast(link.File.MachO)) |macho_file| {
|
} else if (self.bin_file.cast(link.File.MachO)) |macho_file| {
|
||||||
const atom = try macho_file.getOrCreateAtomForDecl(func.owner_decl);
|
const atom = try macho_file.getOrCreateAtomForDecl(owner_decl);
|
||||||
const sym_index = macho_file.getAtom(atom).getSymbolIndex().?;
|
const sym_index = macho_file.getAtom(atom).getSymbolIndex().?;
|
||||||
try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
|
try self.genSetReg(.rax, Type.usize, .{ .lea_got = sym_index });
|
||||||
try self.asmRegister(.{ ._, .call }, .rax);
|
try self.asmRegister(.{ ._, .call }, .rax);
|
||||||
} else if (self.bin_file.cast(link.File.Plan9)) |p9| {
|
} else if (self.bin_file.cast(link.File.Plan9)) |p9| {
|
||||||
const decl_block_index = try p9.seeDecl(func.owner_decl);
|
const decl_block_index = try p9.seeDecl(owner_decl);
|
||||||
const decl_block = p9.getDeclBlock(decl_block_index);
|
const decl_block = p9.getDeclBlock(decl_block_index);
|
||||||
const ptr_bits = self.target.cpu.arch.ptrBitWidth();
|
const ptr_bits = self.target.cpu.arch.ptrBitWidth();
|
||||||
const ptr_bytes: u64 = @divExact(ptr_bits, 8);
|
const ptr_bytes: u64 = @divExact(ptr_bits, 8);
|
||||||
|
|||||||
@ -14,7 +14,6 @@ fn f() i32 {
|
|||||||
test "don't emit an LLVM global for a const function when it's in an optional in a struct" {
|
test "don't emit an LLVM global for a const function when it's in an optional in a struct" {
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,6 @@ const Auto = struct {
|
|||||||
test {
|
test {
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||||
|
|
||||||
|
|||||||
@ -502,7 +502,6 @@ test "method call with optional pointer first param" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "using @ptrCast on function pointers" {
|
test "using @ptrCast on function pointers" {
|
||||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user