Skip to content

Commit a00d913

Browse files
committed
wasm linker: fix crashes when parsing compiler_rt
1 parent f3d6cdc commit a00d913

File tree

10 files changed

+514
-369
lines changed

10 files changed

+514
-369
lines changed

src/link.zig

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,12 @@ pub const Diags = struct {
9797
err_msg.msg = try std.fmt.allocPrint(gpa, format, args);
9898
}
9999

100-
pub fn addNote(
101-
err: *ErrorWithNotes,
102-
comptime format: []const u8,
103-
args: anytype,
104-
) error{OutOfMemory}!void {
100+
pub fn addNote(err: *ErrorWithNotes, comptime format: []const u8, args: anytype) void {
105101
const gpa = err.diags.gpa;
102+
const msg = std.fmt.allocPrint(gpa, format, args) catch return err.diags.setAllocFailure();
106103
const err_msg = &err.diags.msgs.items[err.index];
107104
assert(err.note_slot < err_msg.notes.len);
108-
err_msg.notes[err.note_slot] = .{ .msg = try std.fmt.allocPrint(gpa, format, args) };
105+
err_msg.notes[err.note_slot] = .{ .msg = msg };
109106
err.note_slot += 1;
110107
}
111108
};

src/link/Elf.zig

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,7 +3392,7 @@ fn allocatePhdrTable(self: *Elf) error{OutOfMemory}!void {
33923392
// TODO verify `getMaxNumberOfPhdrs()` is accurate and convert this into no-op
33933393
var err = try diags.addErrorWithNotes(1);
33943394
try err.addMsg("fatal linker error: not enough space reserved for EHDR and PHDR table", .{});
3395-
try err.addNote("required 0x{x}, available 0x{x}", .{ needed_size, available_space });
3395+
err.addNote("required 0x{x}, available 0x{x}", .{ needed_size, available_space });
33963396
}
33973397

33983398
phdr_table_load.p_filesz = needed_size + ehsize;
@@ -4543,12 +4543,12 @@ fn reportUndefinedSymbols(self: *Elf, undefs: anytype) !void {
45434543
for (refs.items[0..nrefs]) |ref| {
45444544
const atom_ptr = self.atom(ref).?;
45454545
const file_ptr = atom_ptr.file(self).?;
4546-
try err.addNote("referenced by {s}:{s}", .{ file_ptr.fmtPath(), atom_ptr.name(self) });
4546+
err.addNote("referenced by {s}:{s}", .{ file_ptr.fmtPath(), atom_ptr.name(self) });
45474547
}
45484548

45494549
if (refs.items.len > max_notes) {
45504550
const remaining = refs.items.len - max_notes;
4551-
try err.addNote("referenced {d} more times", .{remaining});
4551+
err.addNote("referenced {d} more times", .{remaining});
45524552
}
45534553
}
45544554
}
@@ -4565,17 +4565,17 @@ fn reportDuplicates(self: *Elf, dupes: anytype) error{ HasDuplicates, OutOfMemor
45654565

45664566
var err = try diags.addErrorWithNotes(nnotes + 1);
45674567
try err.addMsg("duplicate symbol definition: {s}", .{sym.name(self)});
4568-
try err.addNote("defined by {}", .{sym.file(self).?.fmtPath()});
4568+
err.addNote("defined by {}", .{sym.file(self).?.fmtPath()});
45694569

45704570
var inote: usize = 0;
45714571
while (inote < @min(notes.items.len, max_notes)) : (inote += 1) {
45724572
const file_ptr = self.file(notes.items[inote]).?;
4573-
try err.addNote("defined by {}", .{file_ptr.fmtPath()});
4573+
err.addNote("defined by {}", .{file_ptr.fmtPath()});
45744574
}
45754575

45764576
if (notes.items.len > max_notes) {
45774577
const remaining = notes.items.len - max_notes;
4578-
try err.addNote("defined {d} more times", .{remaining});
4578+
err.addNote("defined {d} more times", .{remaining});
45794579
}
45804580
}
45814581

@@ -4599,7 +4599,7 @@ pub fn addFileError(
45994599
const diags = &self.base.comp.link_diags;
46004600
var err = try diags.addErrorWithNotes(1);
46014601
try err.addMsg(format, args);
4602-
try err.addNote("while parsing {}", .{self.file(file_index).?.fmtPath()});
4602+
err.addNote("while parsing {}", .{self.file(file_index).?.fmtPath()});
46034603
}
46044604

46054605
pub fn failFile(

src/link/Elf/Atom.zig

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ fn reportUnhandledRelocError(self: Atom, rel: elf.Elf64_Rela, elf_file: *Elf) Re
523523
relocation.fmtRelocType(rel.r_type(), elf_file.getTarget().cpu.arch),
524524
rel.r_offset,
525525
});
526-
try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
526+
err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
527527
return error.RelocFailure;
528528
}
529529

@@ -539,7 +539,7 @@ fn reportTextRelocError(
539539
rel.r_offset,
540540
symbol.name(elf_file),
541541
});
542-
try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
542+
err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
543543
return error.RelocFailure;
544544
}
545545

@@ -555,8 +555,8 @@ fn reportPicError(
555555
rel.r_offset,
556556
symbol.name(elf_file),
557557
});
558-
try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
559-
try err.addNote("recompile with -fPIC", .{});
558+
err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
559+
err.addNote("recompile with -fPIC", .{});
560560
return error.RelocFailure;
561561
}
562562

@@ -572,8 +572,8 @@ fn reportNoPicError(
572572
rel.r_offset,
573573
symbol.name(elf_file),
574574
});
575-
try err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
576-
try err.addNote("recompile with -fno-PIC", .{});
575+
err.addNote("in {}:{s}", .{ self.file(elf_file).?.fmtPath(), self.name(elf_file) });
576+
err.addNote("recompile with -fno-PIC", .{});
577577
return error.RelocFailure;
578578
}
579579

@@ -1187,7 +1187,7 @@ const x86_64 = struct {
11871187
x86_64.relaxGotPcTlsDesc(code[r_offset - 3 ..]) catch {
11881188
var err = try diags.addErrorWithNotes(1);
11891189
try err.addMsg("could not relax {s}", .{@tagName(r_type)});
1190-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1190+
err.addNote("in {}:{s} at offset 0x{x}", .{
11911191
atom.file(elf_file).?.fmtPath(),
11921192
atom.name(elf_file),
11931193
rel.r_offset,
@@ -1332,7 +1332,7 @@ const x86_64 = struct {
13321332
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
13331333
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
13341334
});
1335-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1335+
err.addNote("in {}:{s} at offset 0x{x}", .{
13361336
self.file(elf_file).?.fmtPath(),
13371337
self.name(elf_file),
13381338
rels[0].r_offset,
@@ -1388,7 +1388,7 @@ const x86_64 = struct {
13881388
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
13891389
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
13901390
});
1391-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1391+
err.addNote("in {}:{s} at offset 0x{x}", .{
13921392
self.file(elf_file).?.fmtPath(),
13931393
self.name(elf_file),
13941394
rels[0].r_offset,
@@ -1485,7 +1485,7 @@ const x86_64 = struct {
14851485
relocation.fmtRelocType(rels[0].r_type(), .x86_64),
14861486
relocation.fmtRelocType(rels[1].r_type(), .x86_64),
14871487
});
1488-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1488+
err.addNote("in {}:{s} at offset 0x{x}", .{
14891489
self.file(elf_file).?.fmtPath(),
14901490
self.name(elf_file),
14911491
rels[0].r_offset,
@@ -1672,7 +1672,7 @@ const aarch64 = struct {
16721672
// TODO: relax
16731673
var err = try diags.addErrorWithNotes(1);
16741674
try err.addMsg("TODO: relax ADR_GOT_PAGE", .{});
1675-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1675+
err.addNote("in {}:{s} at offset 0x{x}", .{
16761676
atom.file(elf_file).?.fmtPath(),
16771677
atom.name(elf_file),
16781678
r_offset,
@@ -1959,7 +1959,7 @@ const riscv = struct {
19591959
// TODO: implement searching forward
19601960
var err = try diags.addErrorWithNotes(1);
19611961
try err.addMsg("TODO: find HI20 paired reloc scanning forward", .{});
1962-
try err.addNote("in {}:{s} at offset 0x{x}", .{
1962+
err.addNote("in {}:{s} at offset 0x{x}", .{
19631963
atom.file(elf_file).?.fmtPath(),
19641964
atom.name(elf_file),
19651965
rel.r_offset,

src/link/Elf/Object.zig

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ pub fn initInputMergeSections(self: *Object, elf_file: *Elf) !void {
797797
if (!isNull(data[end .. end + sh_entsize])) {
798798
var err = try diags.addErrorWithNotes(1);
799799
try err.addMsg("string not null terminated", .{});
800-
try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
800+
err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
801801
return error.LinkFailure;
802802
}
803803
end += sh_entsize;
@@ -812,7 +812,7 @@ pub fn initInputMergeSections(self: *Object, elf_file: *Elf) !void {
812812
if (shdr.sh_size % sh_entsize != 0) {
813813
var err = try diags.addErrorWithNotes(1);
814814
try err.addMsg("size not a multiple of sh_entsize", .{});
815-
try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
815+
err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
816816
return error.LinkFailure;
817817
}
818818

@@ -889,8 +889,8 @@ pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) error{
889889
const res = imsec.findSubsection(@intCast(esym.st_value)) orelse {
890890
var err = try diags.addErrorWithNotes(2);
891891
try err.addMsg("invalid symbol value: {x}", .{esym.st_value});
892-
try err.addNote("for symbol {s}", .{sym.name(elf_file)});
893-
try err.addNote("in {}", .{self.fmtPath()});
892+
err.addNote("for symbol {s}", .{sym.name(elf_file)});
893+
err.addNote("in {}", .{self.fmtPath()});
894894
return error.LinkFailure;
895895
};
896896

@@ -915,7 +915,7 @@ pub fn resolveMergeSubsections(self: *Object, elf_file: *Elf) error{
915915
const res = imsec.findSubsection(@intCast(@as(i64, @intCast(esym.st_value)) + rel.r_addend)) orelse {
916916
var err = try diags.addErrorWithNotes(1);
917917
try err.addMsg("invalid relocation at offset 0x{x}", .{rel.r_offset});
918-
try err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
918+
err.addNote("in {}:{s}", .{ self.fmtPath(), atom_ptr.name(elf_file) });
919919
return error.LinkFailure;
920920
};
921921

src/link/Elf/eh_frame.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ fn reportInvalidReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela) !void {
611611
relocation.fmtRelocType(rel.r_type(), elf_file.getTarget().cpu.arch),
612612
rel.r_offset,
613613
});
614-
try err.addNote("in {}:.eh_frame", .{elf_file.file(rec.file_index).?.fmtPath()});
614+
err.addNote("in {}:.eh_frame", .{elf_file.file(rec.file_index).?.fmtPath()});
615615
return error.RelocFailure;
616616
}
617617

src/link/MachO.zig

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,21 +1572,21 @@ fn reportUndefs(self: *MachO) !void {
15721572
try err.addMsg("undefined symbol: {s}", .{undef_sym.getName(self)});
15731573

15741574
switch (notes) {
1575-
.force_undefined => try err.addNote("referenced with linker flag -u", .{}),
1576-
.entry => try err.addNote("referenced with linker flag -e", .{}),
1577-
.dyld_stub_binder, .objc_msgsend => try err.addNote("referenced implicitly", .{}),
1575+
.force_undefined => err.addNote("referenced with linker flag -u", .{}),
1576+
.entry => err.addNote("referenced with linker flag -e", .{}),
1577+
.dyld_stub_binder, .objc_msgsend => err.addNote("referenced implicitly", .{}),
15781578
.refs => |refs| {
15791579
var inote: usize = 0;
15801580
while (inote < @min(refs.items.len, max_notes)) : (inote += 1) {
15811581
const ref = refs.items[inote];
15821582
const file = self.getFile(ref.file).?;
15831583
const atom = ref.getAtom(self).?;
1584-
try err.addNote("referenced by {}:{s}", .{ file.fmtPath(), atom.getName(self) });
1584+
err.addNote("referenced by {}:{s}", .{ file.fmtPath(), atom.getName(self) });
15851585
}
15861586

15871587
if (refs.items.len > max_notes) {
15881588
const remaining = refs.items.len - max_notes;
1589-
try err.addNote("referenced {d} more times", .{remaining});
1589+
err.addNote("referenced {d} more times", .{remaining});
15901590
}
15911591
},
15921592
}
@@ -3473,8 +3473,8 @@ fn growSectionNonRelocatable(self: *MachO, sect_index: u8, needed_size: u64) !vo
34733473
seg_id,
34743474
seg.segName(),
34753475
});
3476-
try err.addNote("TODO: emit relocations to memory locations in self-hosted backends", .{});
3477-
try err.addNote("as a workaround, try increasing pre-allocated virtual memory of each segment", .{});
3476+
err.addNote("TODO: emit relocations to memory locations in self-hosted backends", .{});
3477+
err.addNote("as a workaround, try increasing pre-allocated virtual memory of each segment", .{});
34783478
}
34793479

34803480
seg.vmsize = needed_size;
@@ -3776,7 +3776,7 @@ pub fn reportParseError2(
37763776
const diags = &self.base.comp.link_diags;
37773777
var err = try diags.addErrorWithNotes(1);
37783778
try err.addMsg(format, args);
3779-
try err.addNote("while parsing {}", .{self.getFile(file_index).?.fmtPath()});
3779+
err.addNote("while parsing {}", .{self.getFile(file_index).?.fmtPath()});
37803780
}
37813781

37823782
fn reportMissingDependencyError(
@@ -3790,10 +3790,10 @@ fn reportMissingDependencyError(
37903790
const diags = &self.base.comp.link_diags;
37913791
var err = try diags.addErrorWithNotes(2 + checked_paths.len);
37923792
try err.addMsg(format, args);
3793-
try err.addNote("while resolving {s}", .{path});
3794-
try err.addNote("a dependency of {}", .{self.getFile(parent).?.fmtPath()});
3793+
err.addNote("while resolving {s}", .{path});
3794+
err.addNote("a dependency of {}", .{self.getFile(parent).?.fmtPath()});
37953795
for (checked_paths) |p| {
3796-
try err.addNote("tried {s}", .{p});
3796+
err.addNote("tried {s}", .{p});
37973797
}
37983798
}
37993799

@@ -3807,8 +3807,8 @@ fn reportDependencyError(
38073807
const diags = &self.base.comp.link_diags;
38083808
var err = try diags.addErrorWithNotes(2);
38093809
try err.addMsg(format, args);
3810-
try err.addNote("while parsing {s}", .{path});
3811-
try err.addNote("a dependency of {}", .{self.getFile(parent).?.fmtPath()});
3810+
err.addNote("while parsing {s}", .{path});
3811+
err.addNote("a dependency of {}", .{self.getFile(parent).?.fmtPath()});
38123812
}
38133813

38143814
fn reportDuplicates(self: *MachO) error{ HasDuplicates, OutOfMemory }!void {
@@ -3838,17 +3838,17 @@ fn reportDuplicates(self: *MachO) error{ HasDuplicates, OutOfMemory }!void {
38383838

38393839
var err = try diags.addErrorWithNotes(nnotes + 1);
38403840
try err.addMsg("duplicate symbol definition: {s}", .{sym.getName(self)});
3841-
try err.addNote("defined by {}", .{sym.getFile(self).?.fmtPath()});
3841+
err.addNote("defined by {}", .{sym.getFile(self).?.fmtPath()});
38423842

38433843
var inote: usize = 0;
38443844
while (inote < @min(notes.items.len, max_notes)) : (inote += 1) {
38453845
const file = self.getFile(notes.items[inote]).?;
3846-
try err.addNote("defined by {}", .{file.fmtPath()});
3846+
err.addNote("defined by {}", .{file.fmtPath()});
38473847
}
38483848

38493849
if (notes.items.len > max_notes) {
38503850
const remaining = notes.items.len - max_notes;
3851-
try err.addNote("defined {d} more times", .{remaining});
3851+
err.addNote("defined {d} more times", .{remaining});
38523852
}
38533853
}
38543854
return error.HasDuplicates;

src/link/MachO/Atom.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -909,8 +909,8 @@ const x86_64 = struct {
909909
rel.offset,
910910
rel.fmtPretty(.x86_64),
911911
});
912-
try err.addNote("expected .mov instruction but found .{s}", .{@tagName(x)});
913-
try err.addNote("while parsing {}", .{self.getFile(macho_file).fmtPath()});
912+
err.addNote("expected .mov instruction but found .{s}", .{@tagName(x)});
913+
err.addNote("while parsing {}", .{self.getFile(macho_file).fmtPath()});
914914
return error.RelaxFailUnexpectedInstruction;
915915
},
916916
}

0 commit comments

Comments
 (0)