authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-22 15:04:08-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-10-23 16:27:39-07:00
log989e782a012e273aec70d03dda7dfe05ecf94938
tree3f69fc2e432699d1e21b60d32e40f26daa0be6ca
parente0623df9f7bcd2f2cf55e11da535bcbd3455d64a

link.Elf.ZigObject.updateFunc: reduce data dependencies

Unfortunately it's not a complete solution, so a follow-up commit will need to do something more drastic like not do the linker task queue at the same time as codegen task queue. From that point, it is possible to do more work at the same time but that should be a separate branch. This one has gotten big enough.

4 files changed, 17 insertions(+), 23 deletions(-)

src/arch/riscv64/CodeGen.zig+2-2
......@@ -133,7 +133,7 @@ const Owner = union(enum) {
133133 switch (owner) {
134134 .nav_index => |nav_index| {
135135 const elf_file = func.bin_file.cast(.elf).?;
136 return elf_file.zigObjectPtr().?.getOrCreateMetadataForNav(elf_file, nav_index);
136 return elf_file.zigObjectPtr().?.getOrCreateMetadataForNav(pt.zcu, nav_index);
137137 },
138138 .lazy_sym => |lazy_sym| {
139139 const elf_file = func.bin_file.cast(.elf).?;
......@@ -5002,7 +5002,7 @@ fn genCall(
50025002 .func => |func_val| {
50035003 if (func.bin_file.cast(.elf)) |elf_file| {
50045004 const zo = elf_file.zigObjectPtr().?;
5005 const sym_index = try zo.getOrCreateMetadataForNav(elf_file, func_val.owner_nav);
5005 const sym_index = try zo.getOrCreateMetadataForNav(zcu, func_val.owner_nav);
50065006
50075007 if (func.mod.pic) {
50085008 return func.fail("TODO: genCall pic", .{});
src/arch/x86_64/CodeGen.zig+2-2
......@@ -126,7 +126,7 @@ const Owner = union(enum) {
126126 const pt = ctx.pt;
127127 switch (owner) {
128128 .nav_index => |nav_index| if (ctx.bin_file.cast(.elf)) |elf_file| {
129 return elf_file.zigObjectPtr().?.getOrCreateMetadataForNav(elf_file, nav_index);
129 return elf_file.zigObjectPtr().?.getOrCreateMetadataForNav(pt.zcu, nav_index);
130130 } else if (ctx.bin_file.cast(.macho)) |macho_file| {
131131 return macho_file.getZigObject().?.getOrCreateMetadataForNav(macho_file, nav_index);
132132 } else if (ctx.bin_file.cast(.coff)) |coff_file| {
......@@ -12605,7 +12605,7 @@ fn genCall(self: *Self, info: union(enum) {
1260512605 .func => |func| {
1260612606 if (self.bin_file.cast(.elf)) |elf_file| {
1260712607 const zo = elf_file.zigObjectPtr().?;
12608 const sym_index = try zo.getOrCreateMetadataForNav(elf_file, func.owner_nav);
12608 const sym_index = try zo.getOrCreateMetadataForNav(zcu, func.owner_nav);
1260912609 try self.asmImmediate(.{ ._, .call }, Immediate.rel(.{ .sym_index = sym_index }));
1261012610 } else if (self.bin_file.cast(.coff)) |coff_file| {
1261112611 const atom = try coff_file.getOrCreateAtomForNav(func.owner_nav);
src/codegen.zig+1-1
......@@ -866,7 +866,7 @@ fn genNavRef(
866866 zo.symbol(sym_index).flags.is_extern_ptr = true;
867867 return .{ .mcv = .{ .lea_symbol = sym_index } };
868868 }
869 const sym_index = try zo.getOrCreateMetadataForNav(elf_file, nav_index);
869 const sym_index = try zo.getOrCreateMetadataForNav(zcu, nav_index);
870870 if (!single_threaded and is_threadlocal) {
871871 return .{ .mcv = .{ .load_tlv = sym_index } };
872872 }
src/link/Elf/ZigObject.zig+12-18
......@@ -928,7 +928,7 @@ pub fn getNavVAddr(
928928 nav.name.toSlice(ip),
929929 @"extern".lib_name.toSlice(ip),
930930 ),
931 else => try self.getOrCreateMetadataForNav(elf_file, nav_index),
931 else => try self.getOrCreateMetadataForNav(zcu, nav_index),
932932 };
933933 const this_sym = self.symbol(this_sym_index);
934934 const vaddr = this_sym.address(.{}, elf_file);
......@@ -1102,21 +1102,15 @@ pub fn freeNav(self: *ZigObject, elf_file: *Elf, nav_index: InternPool.Nav.Index
11021102 }
11031103}
11041104
1105pub fn getOrCreateMetadataForNav(
1106 self: *ZigObject,
1107 elf_file: *Elf,
1108 nav_index: InternPool.Nav.Index,
1109) !Symbol.Index {
1110 const gpa = elf_file.base.comp.gpa;
1105pub fn getOrCreateMetadataForNav(self: *ZigObject, zcu: *Zcu, nav_index: InternPool.Nav.Index) !Symbol.Index {
1106 const gpa = zcu.gpa;
11111107 const gop = try self.navs.getOrPut(gpa, nav_index);
11121108 if (!gop.found_existing) {
1113 const any_non_single_threaded = elf_file.base.comp.config.any_non_single_threaded;
11141109 const symbol_index = try self.newSymbolWithAtom(gpa, 0);
1115 const zcu = elf_file.base.comp.zcu.?;
11161110 const nav_val = Value.fromInterned(zcu.intern_pool.getNav(nav_index).status.resolved.val);
11171111 const sym = self.symbol(symbol_index);
11181112 if (nav_val.getVariable(zcu)) |variable| {
1119 if (variable.is_threadlocal and any_non_single_threaded) {
1113 if (variable.is_threadlocal and zcu.comp.config.any_non_single_threaded) {
11201114 sym.flags.is_tls = true;
11211115 }
11221116 }
......@@ -1425,8 +1419,8 @@ pub fn updateFunc(
14251419
14261420 log.debug("updateFunc {}({d})", .{ ip.getNav(func.owner_nav).fqn.fmt(ip), func.owner_nav });
14271421
1428 const sym_index = try self.getOrCreateMetadataForNav(elf_file, func.owner_nav);
1429 self.symbol(sym_index).atom(elf_file).?.freeRelocs(self);
1422 const sym_index = try self.getOrCreateMetadataForNav(zcu, func.owner_nav);
1423 self.atom(self.symbol(sym_index).ref.index).?.freeRelocs(self);
14301424
14311425 var code_buffer = std.ArrayList(u8).init(gpa);
14321426 defer code_buffer.deinit();
......@@ -1460,12 +1454,12 @@ pub fn updateFunc(
14601454 ip.getNav(func.owner_nav).fqn.fmt(ip),
14611455 });
14621456 const old_rva, const old_alignment = blk: {
1463 const atom_ptr = self.symbol(sym_index).atom(elf_file).?;
1457 const atom_ptr = self.atom(self.symbol(sym_index).ref.index).?;
14641458 break :blk .{ atom_ptr.value, atom_ptr.alignment };
14651459 };
14661460 try self.updateNavCode(elf_file, pt, func.owner_nav, sym_index, shndx, code, elf.STT_FUNC);
14671461 const new_rva, const new_alignment = blk: {
1468 const atom_ptr = self.symbol(sym_index).atom(elf_file).?;
1462 const atom_ptr = self.atom(self.symbol(sym_index).ref.index).?;
14691463 break :blk .{ atom_ptr.value, atom_ptr.alignment };
14701464 };
14711465
......@@ -1477,7 +1471,7 @@ pub fn updateFunc(
14771471 .{
14781472 .index = sym_index,
14791473 .addr = @intCast(sym.address(.{}, elf_file)),
1480 .size = sym.atom(elf_file).?.size,
1474 .size = self.atom(sym.ref.index).?.size,
14811475 },
14821476 wip_nav,
14831477 );
......@@ -1500,7 +1494,7 @@ pub fn updateFunc(
15001494 });
15011495 defer gpa.free(name);
15021496 const osec = if (self.text_index) |sect_sym_index|
1503 self.symbol(sect_sym_index).atom(elf_file).?.output_section_index
1497 self.atom(self.symbol(sect_sym_index).ref.index).?.output_section_index
15041498 else osec: {
15051499 const osec = try elf_file.addSection(.{
15061500 .name = try elf_file.insertShString(".text"),
......@@ -1565,7 +1559,7 @@ pub fn updateNav(
15651559 };
15661560
15671561 if (nav_init != .none and Value.fromInterned(nav_init).typeOf(zcu).hasRuntimeBits(zcu)) {
1568 const sym_index = try self.getOrCreateMetadataForNav(elf_file, nav_index);
1562 const sym_index = try self.getOrCreateMetadataForNav(zcu, nav_index);
15691563 self.symbol(sym_index).atom(elf_file).?.freeRelocs(self);
15701564
15711565 var code_buffer = std.ArrayList(u8).init(zcu.gpa);
......@@ -1789,7 +1783,7 @@ pub fn updateExports(
17891783 const gpa = elf_file.base.comp.gpa;
17901784 const metadata = switch (exported) {
17911785 .nav => |nav| blk: {
1792 _ = try self.getOrCreateMetadataForNav(elf_file, nav);
1786 _ = try self.getOrCreateMetadataForNav(zcu, nav);
17931787 break :blk self.navs.getPtr(nav).?;
17941788 },
17951789 .uav => |uav| self.uavs.getPtr(uav) orelse blk: {