From ab400ad62406e5ed7660d01d7065dc14081b10f6 Mon Sep 17 00:00:00 2001 From: Jacob G-W Date: Thu, 6 Jan 2022 22:47:27 -0500 Subject: [PATCH] Plan9: implement getDeclVAddr --- src/link.zig | 2 +- src/link/Plan9.zig | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/link.zig b/src/link.zig index 422d86d4b3..92a80b20c2 100644 --- a/src/link.zig +++ b/src/link.zig @@ -643,7 +643,7 @@ pub const File = struct { .coff => return @fieldParentPtr(Coff, "base", base).getDeclVAddr(decl), .elf => return @fieldParentPtr(Elf, "base", base).getDeclVAddr(decl), .macho => return @fieldParentPtr(MachO, "base", base).getDeclVAddr(decl), - .plan9 => @panic("GET VADDR"), + .plan9 => return @fieldParentPtr(Plan9, "base", base).getDeclVAddr(decl), .c => unreachable, .wasm => unreachable, .spirv => unreachable, diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig index 4493ae4d5b..557d633361 100644 --- a/src/link/Plan9.zig +++ b/src/link/Plan9.zig @@ -740,3 +740,26 @@ pub fn allocateDeclIndexes(self: *Plan9, decl: *Module.Decl) !void { _ = self; _ = decl; } +pub fn getDeclVAddr(self: *Plan9, decl: *const Module.Decl) u64 { + if (decl.ty.zigTypeTag() == .Fn) { + var start = self.bases.text; + var it_file = self.fn_decl_table.iterator(); + while (it_file.next()) |fentry| { + var symidx_and_submap = fentry.value_ptr; + var submap_it = symidx_and_submap.functions.iterator(); + while (submap_it.next()) |entry| { + if (entry.key_ptr.* == decl) return start; + start += entry.value_ptr.code.len; + } + } + unreachable; + } else { + var start = self.bases.data + self.got_len * if (!self.sixtyfour_bit) @as(u32, 4) else 8; + var it = self.data_decl_table.iterator(); + while (it.next()) |kv| { + if (decl == kv.key_ptr.*) return start; + start += kv.value_ptr.len; + } + unreachable; + } +}