mirror of
https://github.com/ziglang/zig.git
synced 2026-02-14 05:20:34 +00:00
elf: init output merge sections in a separate step
This commit is contained in:
parent
0701646beb
commit
801c372098
@ -3308,7 +3308,7 @@ pub fn resolveMergeSections(self: *Elf) !void {
|
||||
for (self.objects.items) |index| {
|
||||
const file_ptr = self.file(index).?;
|
||||
if (!file_ptr.isAlive()) continue;
|
||||
file_ptr.object.initMergeSections(self) catch |err| switch (err) {
|
||||
file_ptr.object.initInputMergeSections(self) catch |err| switch (err) {
|
||||
error.MalformedObject => has_errors = true,
|
||||
else => |e| return e,
|
||||
};
|
||||
@ -3316,6 +3316,12 @@ pub fn resolveMergeSections(self: *Elf) !void {
|
||||
|
||||
if (has_errors) return error.FlushFailure;
|
||||
|
||||
for (self.objects.items) |index| {
|
||||
const file_ptr = self.file(index).?;
|
||||
if (!file_ptr.isAlive()) continue;
|
||||
try file_ptr.object.initOutputMergeSections(self);
|
||||
}
|
||||
|
||||
for (self.objects.items) |index| {
|
||||
const file_ptr = self.file(index).?;
|
||||
if (!file_ptr.isAlive()) continue;
|
||||
@ -3330,7 +3336,7 @@ pub fn resolveMergeSections(self: *Elf) !void {
|
||||
|
||||
pub fn finalizeMergeSections(self: *Elf) !void {
|
||||
for (self.merge_sections.items) |*msec| {
|
||||
try msec.finalize(self);
|
||||
try msec.finalize(self.base.comp.gpa);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -691,7 +691,7 @@ pub fn checkDuplicates(self: *Object, dupes: anytype, elf_file: *Elf) error{OutO
|
||||
}
|
||||
}
|
||||
|
||||
pub fn initMergeSections(self: *Object, elf_file: *Elf) !void {
|
||||
pub fn initInputMergeSections(self: *Object, elf_file: *Elf) !void {
|
||||
const gpa = elf_file.base.comp.gpa;
|
||||
|
||||
try self.input_merge_sections.ensureUnusedCapacity(gpa, self.shdrs.items.len);
|
||||
@ -709,8 +709,6 @@ pub fn initMergeSections(self: *Object, elf_file: *Elf) !void {
|
||||
const imsec_idx = try self.addInputMergeSection(gpa);
|
||||
const imsec = self.inputMergeSection(imsec_idx).?;
|
||||
self.input_merge_sections_indexes.items[shndx] = imsec_idx;
|
||||
|
||||
imsec.merge_section_index = try elf_file.getOrCreateMergeSection(atom_ptr.name(elf_file), shdr.sh_flags, shdr.sh_type);
|
||||
imsec.atom_index = atom_index;
|
||||
|
||||
const data = try self.codeDecompressAlloc(elf_file, atom_index);
|
||||
@ -769,6 +767,19 @@ pub fn initMergeSections(self: *Object, elf_file: *Elf) !void {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn initOutputMergeSections(self: *Object, elf_file: *Elf) !void {
|
||||
for (self.input_merge_sections_indexes.items) |index| {
|
||||
const imsec = self.inputMergeSection(index) orelse continue;
|
||||
const atom_ptr = self.atom(imsec.atom_index).?;
|
||||
const shdr = atom_ptr.inputShdr(elf_file);
|
||||
imsec.merge_section_index = try elf_file.getOrCreateMergeSection(
|
||||
atom_ptr.name(elf_file),
|
||||
shdr.sh_flags,
|
||||
shdr.sh_type,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) !void {
|
||||
const gpa = elf_file.base.comp.gpa;
|
||||
|
||||
|
||||
@ -60,9 +60,8 @@ pub const MergeSection = struct {
|
||||
|
||||
/// Finalizes the merge section and clears hash table.
|
||||
/// Sorts all owned subsections.
|
||||
pub fn finalize(msec: *MergeSection, elf_file: *Elf) !void {
|
||||
const gpa = elf_file.base.comp.gpa;
|
||||
try msec.finalized_subsections.ensureTotalCapacityPrecise(gpa, msec.subsections.items.len);
|
||||
pub fn finalize(msec: *MergeSection, allocator: Allocator) !void {
|
||||
try msec.finalized_subsections.ensureTotalCapacityPrecise(allocator, msec.subsections.items.len);
|
||||
|
||||
var it = msec.table.iterator();
|
||||
while (it.next()) |entry| {
|
||||
@ -70,7 +69,7 @@ pub const MergeSection = struct {
|
||||
if (!msub.alive) continue;
|
||||
msec.finalized_subsections.appendAssumeCapacity(entry.value_ptr.*);
|
||||
}
|
||||
msec.table.clearAndFree(gpa);
|
||||
msec.table.clearAndFree(allocator);
|
||||
|
||||
const sortFn = struct {
|
||||
pub fn sortFn(ctx: *MergeSection, lhs: MergeSubsection.Index, rhs: MergeSubsection.Index) bool {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user