authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-10 22:15:14+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-10 22:23:24+02:00
log5d6e49d0655b4523c249f1d62da9dc477f1c82af
treebe928aaf6669b7bee4b0ff64e417620db7e5a7eb
parent421b105d85507e6e3a98cfcf932ca6a8d14e2791

Elf/ZigObject: handle ref to an extern in getDeclVAddr

Prior to this change, we would unconditionally create a symbol and atom pair for a Decl that could point to an extern, in which case no atom can be created.

2 files changed, 25 insertions(+), 12 deletions(-)

src/link/Elf.zig+2-2
...@@ -478,9 +478,9 @@ pub fn deinit(self: *Elf) void {...@@ -478,9 +478,9 @@ pub fn deinit(self: *Elf) void {
478 self.comdat_group_sections.deinit(gpa);478 self.comdat_group_sections.deinit(gpa);
479}479}
480480
481pub fn getDeclVAddr(self: *Elf, _: Zcu.PerThread, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 {481pub fn getDeclVAddr(self: *Elf, pt: Zcu.PerThread, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 {
482 assert(self.llvm_object == null);482 assert(self.llvm_object == null);
483 return self.zigObjectPtr().?.getDeclVAddr(self, decl_index, reloc_info);483 return self.zigObjectPtr().?.getDeclVAddr(self, pt, decl_index, reloc_info);
484}484}
485485
486pub fn lowerAnonDecl(486pub fn lowerAnonDecl(
src/link/Elf/ZigObject.zig+23-10
...@@ -664,10 +664,22 @@ pub fn codeAlloc(self: *ZigObject, elf_file: *Elf, atom_index: Atom.Index) ![]u8...@@ -664,10 +664,22 @@ pub fn codeAlloc(self: *ZigObject, elf_file: *Elf, atom_index: Atom.Index) ![]u8
664pub fn getDeclVAddr(664pub fn getDeclVAddr(
665 self: *ZigObject,665 self: *ZigObject,
666 elf_file: *Elf,666 elf_file: *Elf,
667 pt: Zcu.PerThread,
667 decl_index: InternPool.DeclIndex,668 decl_index: InternPool.DeclIndex,
668 reloc_info: link.File.RelocInfo,669 reloc_info: link.File.RelocInfo,
669) !u64 {670) !u64 {
670 const this_sym_index = try self.getOrCreateMetadataForDecl(elf_file, decl_index);671 const zcu = pt.zcu;
672 const ip = &zcu.intern_pool;
673 const decl = zcu.declPtr(decl_index);
674 log.debug("getDeclVAddr {}({d})", .{ decl.fqn.fmt(ip), decl_index });
675 const this_sym_index = if (decl.isExtern(zcu)) blk: {
676 const name = decl.name.toSlice(ip);
677 const lib_name = if (decl.getOwnedExternFunc(zcu)) |ext_fn|
678 ext_fn.lib_name.toSlice(ip)
679 else
680 decl.getOwnedVariable(zcu).?.lib_name.toSlice(ip);
681 break :blk try self.getGlobalSymbol(elf_file, name, lib_name);
682 } else try self.getOrCreateMetadataForDecl(elf_file, decl_index);
671 const this_sym = self.symbol(this_sym_index);683 const this_sym = self.symbol(this_sym_index);
672 const vaddr = this_sym.address(.{}, elf_file);684 const vaddr = this_sym.address(.{}, elf_file);
673 const parent_atom = self.symbol(reloc_info.parent_atom_index).atom(elf_file).?;685 const parent_atom = self.symbol(reloc_info.parent_atom_index).atom(elf_file).?;
...@@ -810,10 +822,8 @@ fn freeDeclMetadata(self: *ZigObject, elf_file: *Elf, sym_index: Symbol.Index) v...@@ -810,10 +822,8 @@ fn freeDeclMetadata(self: *ZigObject, elf_file: *Elf, sym_index: Symbol.Index) v
810822
811pub fn freeDecl(self: *ZigObject, elf_file: *Elf, decl_index: InternPool.DeclIndex) void {823pub fn freeDecl(self: *ZigObject, elf_file: *Elf, decl_index: InternPool.DeclIndex) void {
812 const gpa = elf_file.base.comp.gpa;824 const gpa = elf_file.base.comp.gpa;
813 const mod = elf_file.base.comp.module.?;
814 const decl = mod.declPtr(decl_index);
815825
816 log.debug("freeDecl {*}", .{decl});826 log.debug("freeDecl ({d})", .{decl_index});
817827
818 if (self.decls.fetchRemove(decl_index)) |const_kv| {828 if (self.decls.fetchRemove(decl_index)) |const_kv| {
819 var kv = const_kv;829 var kv = const_kv;
...@@ -923,7 +933,7 @@ fn updateDeclCode(...@@ -923,7 +933,7 @@ fn updateDeclCode(
923 const ip = &mod.intern_pool;933 const ip = &mod.intern_pool;
924 const decl = mod.declPtr(decl_index);934 const decl = mod.declPtr(decl_index);
925935
926 log.debug("updateDeclCode {}{*}", .{ decl.fqn.fmt(ip), decl });936 log.debug("updateDeclCode {}({d})", .{ decl.fqn.fmt(ip), decl_index });
927937
928 const required_alignment = decl.getAlignment(pt).max(938 const required_alignment = decl.getAlignment(pt).max(
929 target_util.minFunctionAlignment(mod.getTarget()),939 target_util.minFunctionAlignment(mod.getTarget()),
...@@ -1023,7 +1033,7 @@ fn updateTlv(...@@ -1023,7 +1033,7 @@ fn updateTlv(
1023 const gpa = mod.gpa;1033 const gpa = mod.gpa;
1024 const decl = mod.declPtr(decl_index);1034 const decl = mod.declPtr(decl_index);
10251035
1026 log.debug("updateTlv {} ({*})", .{ decl.fqn.fmt(ip), decl });1036 log.debug("updateTlv {}({d})", .{ decl.fqn.fmt(ip), decl_index });
10271037
1028 const required_alignment = decl.getAlignment(pt);1038 const required_alignment = decl.getAlignment(pt);
10291039
...@@ -1077,11 +1087,14 @@ pub fn updateFunc(...@@ -1077,11 +1087,14 @@ pub fn updateFunc(
1077 defer tracy.end();1087 defer tracy.end();
10781088
1079 const mod = pt.zcu;1089 const mod = pt.zcu;
1090 const ip = &mod.intern_pool;
1080 const gpa = elf_file.base.comp.gpa;1091 const gpa = elf_file.base.comp.gpa;
1081 const func = mod.funcInfo(func_index);1092 const func = mod.funcInfo(func_index);
1082 const decl_index = func.owner_decl;1093 const decl_index = func.owner_decl;
1083 const decl = mod.declPtr(decl_index);1094 const decl = mod.declPtr(decl_index);
10841095
1096 log.debug("updateFunc {}({d})", .{ decl.fqn.fmt(ip), decl_index });
1097
1085 const sym_index = try self.getOrCreateMetadataForDecl(elf_file, decl_index);1098 const sym_index = try self.getOrCreateMetadataForDecl(elf_file, decl_index);
1086 self.freeUnnamedConsts(elf_file, decl_index);1099 self.freeUnnamedConsts(elf_file, decl_index);
1087 self.symbol(sym_index).atom(elf_file).?.freeRelocs(elf_file);1100 self.symbol(sym_index).atom(elf_file).?.freeRelocs(elf_file);
...@@ -1139,12 +1152,12 @@ pub fn updateDecl(...@@ -1139,12 +1152,12 @@ pub fn updateDecl(
1139 defer tracy.end();1152 defer tracy.end();
11401153
1141 const mod = pt.zcu;1154 const mod = pt.zcu;
1155 const ip = &mod.intern_pool;
1142 const decl = mod.declPtr(decl_index);1156 const decl = mod.declPtr(decl_index);
11431157
1144 if (decl.val.getExternFunc(mod)) |_| {1158 log.debug("updateDecl {}({d})", .{ decl.fqn.fmt(ip), decl_index });
1145 return;
1146 }
11471159
1160 if (decl.val.getExternFunc(mod)) |_| return;
1148 if (decl.isExtern(mod)) {1161 if (decl.isExtern(mod)) {
1149 // Extern variable gets a .got entry only.1162 // Extern variable gets a .got entry only.
1150 const variable = decl.getOwnedVariable(mod).?;1163 const variable = decl.getOwnedVariable(mod).?;
...@@ -1485,7 +1498,7 @@ pub fn updateDeclLineNumber(...@@ -1485,7 +1498,7 @@ pub fn updateDeclLineNumber(
14851498
1486 const decl = pt.zcu.declPtr(decl_index);1499 const decl = pt.zcu.declPtr(decl_index);
14871500
1488 log.debug("updateDeclLineNumber {}{*}", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl });1501 log.debug("updateDeclLineNumber {}({d})", .{ decl.fqn.fmt(&pt.zcu.intern_pool), decl_index });
14891502
1490 if (self.dwarf) |*dw| {1503 if (self.dwarf) |*dw| {
1491 try dw.updateDeclLineNumber(pt.zcu, decl_index);1504 try dw.updateDeclLineNumber(pt.zcu, decl_index);