authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-11-08 17:39:46+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-11-08 17:45:28+01:00
log9db63d4f1d394f54225b87b53665f76a2b99d312
tree3dc7450ed322d08f80560c768516924f174340fe
parent7145064efde75aaf4711671d1f5461ea56040815

macho: fix handling of DW_FORM_block* forms


1 files changed, 20 insertions(+), 4 deletions(-)

src/link/MachO/DwarfInfo.zig+20-4
...@@ -402,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -402,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
402 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),402 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),
403403
404 dwarf.FORM.addr => return cuh.address_size,404 dwarf.FORM.addr => return cuh.address_size,
405
406 dwarf.FORM.block1,
407 dwarf.FORM.block2,
408 dwarf.FORM.block4,
409 dwarf.FORM.block,
410 => {
411 const len: u64 = switch (form) {
412 dwarf.FORM.block1 => try reader.readIntLittle(u8),
413 dwarf.FORM.block2 => try reader.readIntLittle(u16),
414 dwarf.FORM.block4 => try reader.readIntLittle(u32),
415 dwarf.FORM.block => try leb.readULEB128(u64, reader),
416 else => unreachable,
417 };
418 var i: u64 = 0;
419 while (i < len) : (i += 1) {
420 _ = try reader.readByte();
421 }
422 return creader.bytes_read;
423 },
424
405 dwarf.FORM.exprloc => {425 dwarf.FORM.exprloc => {
406 const expr_len = try leb.readULEB128(u64, reader);426 const expr_len = try leb.readULEB128(u64, reader);
407 var i: u64 = 0;427 var i: u64 = 0;
...@@ -414,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -414,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
414434
415 dwarf.FORM.data1,435 dwarf.FORM.data1,
416 dwarf.FORM.ref1,436 dwarf.FORM.ref1,
417 dwarf.FORM.block1,
418 dwarf.FORM.flag,437 dwarf.FORM.flag,
419 => return @sizeOf(u8),438 => return @sizeOf(u8),
420439
421 dwarf.FORM.data2,440 dwarf.FORM.data2,
422 dwarf.FORM.ref2,441 dwarf.FORM.ref2,
423 dwarf.FORM.block2,
424 => return @sizeOf(u16),442 => return @sizeOf(u16),
425443
426 dwarf.FORM.data4,444 dwarf.FORM.data4,
427 dwarf.FORM.ref4,445 dwarf.FORM.ref4,
428 dwarf.FORM.block4,
429 => return @sizeOf(u32),446 => return @sizeOf(u32),
430447
431 dwarf.FORM.data8,448 dwarf.FORM.data8,
...@@ -435,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -435,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
435452
436 dwarf.FORM.udata,453 dwarf.FORM.udata,
437 dwarf.FORM.ref_udata,454 dwarf.FORM.ref_udata,
438 dwarf.FORM.block,
439 => {455 => {
440 _ = try leb.readULEB128(u64, reader);456 _ = try leb.readULEB128(u64, reader);
441 return math.cast(usize, creader.bytes_read) orelse error.Overflow;457 return math.cast(usize, creader.bytes_read) orelse error.Overflow;