Commit ab400ad624

Jacob G-W <jacoblevgw@gmail.com>
2022-01-07 04:47:27
Plan9: implement getDeclVAddr
1 parent 4d6849c
Changed files (2)
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;
+    }
+}
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,