Skip to content

Commit e902c23

Browse files
authored
Merge pull request #23011 from alexrp/macho-cu-intcast
`link.MachO.UnwindInfo`: Handle `u24` overflow for CU records pointing to DWARF.
2 parents ad5515b + 466ce48 commit e902c23

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/link/MachO/UnwindInfo.zig

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,18 @@ pub fn generate(info: *UnwindInfo, macho_file: *MachO) !void {
6868
for (info.records.items) |ref| {
6969
const rec = ref.getUnwindRecord(macho_file);
7070
if (rec.getFde(macho_file)) |fde| {
71-
rec.enc.setDwarfSectionOffset(@intCast(fde.out_offset));
71+
// The unwinder will look for the DWARF entry starting at the hint,
72+
// assuming the hint points to a valid CFI record start. If it
73+
// fails to find the record, it proceeds in a linear search through
74+
// the contiguous CFI records from the hint until the end of the
75+
// section. Ideally, in the case where the offset is too large to
76+
// be encoded, we would instead encode the largest possible offset
77+
// to a valid CFI record, but since we don't keep track of that,
78+
// just encode zero -- the start of the section is always the start
79+
// of a CFI record.
80+
const hint = std.math.cast(u24, fde.out_offset) orelse 0;
81+
rec.enc.setDwarfSectionOffset(hint);
82+
7283
if (fde.getLsdaAtom(macho_file)) |lsda| {
7384
rec.lsda = lsda.atom_index;
7485
rec.lsda_offset = fde.lsda_offset;

0 commit comments

Comments
 (0)