diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-24 22:06:12 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-30 10:00:50 +0200 |
| commit | 494ae149e0a52c4afd71f6741379d4a7a9afe3f3 (patch) | |
| tree | 96d2ca5cd12b65bfd4c2811b510e80d69d1eb0b2 /src | |
| parent | 669f28594393e90e4d1aacd0d28f67ebe015b922 (diff) | |
| download | zig-494ae149e0a52c4afd71f6741379d4a7a9afe3f3.tar.gz zig-494ae149e0a52c4afd71f6741379d4a7a9afe3f3.zip | |
elf: skip storing comdat group signature globally
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Elf.zig | 34 | ||||
| -rw-r--r-- | src/link/Elf/Object.zig | 9 | ||||
| -rw-r--r-- | src/link/Elf/file.zig | 6 |
3 files changed, 42 insertions, 7 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig index d140b0a6e3..d8d62eba10 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -216,7 +216,7 @@ merge_subsections: std.ArrayListUnmanaged(MergeSubsection) = .{}, last_atom_and_free_list_table: LastAtomAndFreeListTable = .{}, comdat_groups_owners: std.ArrayListUnmanaged(ComdatGroupOwner) = .{}, -comdat_groups_table: std.AutoHashMapUnmanaged(u32, ComdatGroupOwner.Index) = .{}, +comdat_groups_table: std.ArrayHashMapUnmanaged(ComdatGroupKey, ComdatGroupOwner.Index, ComdatGroupContext, false) = .{}, /// Global string table used to provide quick access to global symbol resolvers /// such as `resolver` and `comdat_groups_table`. @@ -5742,10 +5742,9 @@ const GetOrCreateComdatGroupOwnerResult = struct { index: ComdatGroupOwner.Index, }; -pub fn getOrCreateComdatGroupOwner(self: *Elf, name: [:0]const u8) !GetOrCreateComdatGroupOwnerResult { +pub fn getOrCreateComdatGroupOwner(self: *Elf, key: ComdatGroupKey) !GetOrCreateComdatGroupOwnerResult { const gpa = self.base.comp.gpa; - const off = try self.strings.insert(gpa, name); - const gop = try self.comdat_groups_table.getOrPut(gpa, off); + const gop = try self.comdat_groups_table.getOrPutContext(gpa, key, .{ .elf_file = self }); if (!gop.found_existing) { const index: ComdatGroupOwner.Index = @intCast(self.comdat_groups_owners.items.len); const owner = try self.comdat_groups_owners.addOne(gpa); @@ -6244,6 +6243,33 @@ const default_entry_addr = 0x8000000; pub const base_tag: link.File.Tag = .elf; +const ComdatGroupKey = struct { + /// String table offset. + off: u32, + + /// File index. + file_index: File.Index, + + pub fn get(key: ComdatGroupKey, elf_file: *Elf) [:0]const u8 { + const file_ptr = elf_file.file(key.file_index).?; + return file_ptr.getString(key.off); + } +}; + +const ComdatGroupContext = struct { + elf_file: *Elf, + + pub fn eql(ctx: ComdatGroupContext, a: ComdatGroupKey, b: ComdatGroupKey, b_index: usize) bool { + _ = b_index; + const elf_file = ctx.elf_file; + return mem.eql(u8, a.get(elf_file), b.get(elf_file)); + } + + pub fn hash(ctx: ComdatGroupContext, a: ComdatGroupKey) u32 { + return std.array_hash_map.hashString(a.get(ctx.elf_file)); + } +}; + const ComdatGroupOwner = struct { file: File.Index = 0, diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index 08ad4e8378..649c6e0354 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -208,9 +208,9 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file: const group_signature = blk: { if (group_info_sym.st_name == 0 and group_info_sym.st_type() == elf.STT_SECTION) { const sym_shdr = shdrs[group_info_sym.st_shndx]; - break :blk self.getString(sym_shdr.sh_name); + break :blk sym_shdr.sh_name; } - break :blk self.getString(group_info_sym.st_name); + break :blk group_info_sym.st_name; }; const shndx = @as(u32, @intCast(i)); @@ -228,7 +228,10 @@ fn initAtoms(self: *Object, allocator: Allocator, handle: std.fs.File, elf_file: const group_start = @as(u32, @intCast(self.comdat_group_data.items.len)); try self.comdat_group_data.appendUnalignedSlice(allocator, group_members[1..]); - const gop = try elf_file.getOrCreateComdatGroupOwner(group_signature); + const gop = try elf_file.getOrCreateComdatGroupOwner(.{ + .off = group_signature, + .file_index = self.index, + }); const comdat_group_index = try self.addComdatGroup(allocator); const comdat_group = self.comdatGroup(comdat_group_index); comdat_group.* = .{ diff --git a/src/link/Elf/file.zig b/src/link/Elf/file.zig index 687013b04e..df2c59a0f2 100644 --- a/src/link/Elf/file.zig +++ b/src/link/Elf/file.zig @@ -157,6 +157,12 @@ pub const File = union(enum) { }; } + pub fn getString(file: File, off: u32) [:0]const u8 { + return switch (file) { + inline else => |x| x.getString(off), + }; + } + pub fn updateSymtabSize(file: File, elf_file: *Elf) !void { return switch (file) { inline else => |x| x.updateSymtabSize(elf_file), |
