Plan9: implement getDeclVAddr

This commit is contained in:
Jacob G-W 2022-01-06 22:47:27 -05:00
parent 4d6849ceb8
commit ab400ad624
2 changed files with 24 additions and 1 deletions

View File

@ -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,

View File

@ -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;
}
}