authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-10-17 12:37:00+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-10-19 18:30:33+01:00
log5be6c62845638e6983b98f2c0c59d3a31a865b65
tree68f8bf073ce9decd9a5d4b2fdbc90c8a1dfe8a61
parent8f183c8c185f43db596b6aac1983f97403503592
signature Commit is signed but in an unrecognized format.

Elf2: delete unused `.copied_global` nodes


1 files changed, 6 insertions(+), 19 deletions(-)

src/link/Elf2.zig+6-19
......@@ -308,9 +308,6 @@ const Node = union(enum) {
308308 /// emitted a copy relocation.
309309 ///
310310 /// TODO it would be better to emit these into `.bss` or `.bss.rel.ro`, once we support those.
311 ///
312 /// TODO: currently, the `elf.copied_globals` entry may not be there---this case exists because
313 /// `MappedFile` does not (yet?) support deleting nodes. See logic in `updateGlobalDynamic`.
314311 copied_global: Symbol.Global.Index,
315312 /// May contain relocations.
316313 nav: NavMapIndex,
......@@ -3335,10 +3332,8 @@ fn updateGlobalDynamic(elf: *Elf, orig_gsi: Symbol.Global.Index, force_apply_rel
33353332 } else {
33363333 if (elf.copied_globals.fetchSwapRemove(gsi)) |copied_global_kv| {
33373334 // We previously made a copy relocation, but now have deemed it unnecessary.
3335 try elf.deleteNode(copied_global_kv.value.node);
33383336 elf.shndx.rela_dyn.relaDeleteOne(elf, copied_global_kv.value.rela_index);
3339 // TODO: once `MappedFile` has a way to delete a node (so it can re-use the
3340 // space), we should delete `copied_global_kv.value.node`, which is an
3341 // "orphaned" `copied_global` node.
33423337 apply_relocs = true;
33433338 }
33443339 }
......@@ -3613,10 +3608,8 @@ fn deleteOwnedDynsym(elf: *Elf, gsi: Symbol.Global.Index) std.mem.Allocator.Erro
36133608
36143609 var apply_relocs: bool = false;
36153610 if (elf.copied_globals.fetchSwapRemove(gsi)) |copied_global_kv| {
3611 try elf.deleteNode(copied_global_kv.value.node);
36163612 elf.shndx.rela_dyn.relaDeleteOne(elf, copied_global_kv.value.rela_index);
3617 // TODO: once `MappedFile` has a way to delete a node (so it can re-use the
3618 // space), we should delete `copied_global_kv.value.node`, which is an
3619 // "orphaned" `copied_global` node.
36203613 apply_relocs = true;
36213614 }
36223615 if (elf.plt.getIndex(gsi)) |plt_index| {
......@@ -11444,11 +11437,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void
1144411437 });
1144511438 },
1144611439 .copied_global => |global_name| {
11447 const copied_global = elf.copied_globals.getPtr(global_name) orelse {
11448 // TODO: this node is orphaned, which is possible because `MappedFile` does not yet
11449 // support deleting nodes. See logic in `updateGlobalDynamic`.
11450 return;
11451 };
11440 const copied_global = elf.copied_globals.getPtr(global_name).?;
1145211441 assert(copied_global.node == ni);
1145311442
1145411443 const new_addr = elf.computeNodeVAddr(ni);
......@@ -13008,11 +12997,9 @@ pub fn addNodeAssumeCapacity(elf: *Elf, ni: MappedFile.Node.Index, node: Node) M
1300812997 return ni;
1300912998}
1301012999
13011fn deleteNode(elf: *Elf, node: *MappedFile.Node.Index.Optional) std.mem.Allocator.Error!void {
13012 const ni = node.unwrap().?;
13013 try ni.delete(elf.base.comp.gpa, &elf.mf);
13014 elf.nodes.set(@backingInt(ni), .deleted);
13015 node.* = .none;
13000fn deleteNode(elf: *Elf, node: MappedFile.Node.Index) std.mem.Allocator.Error!void {
13001 try node.delete(elf.base.comp.gpa, &elf.mf);
13002 elf.nodes.set(@backingInt(node), .deleted);
1301613003}
1301713004
1301813005/// If `sym` has a PLT entry, returns the address of that entry (specifically, the address which a