authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-10-23 16:29:08+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-10-23 21:53:36+02:00
log828735ac036abba77ffce2bf963c04f99f1687c8
treee4bd74b0b943773bd50ea6496cb11dc100bfd8e2
parent04472af328632d80ea9ea089cfd5de8fac6dd039

macho: handle majority of DW_FORM_ values for DWARF4 in the linker


1 files changed, 42 insertions(+), 16 deletions(-)

src/link/MachO/DwarfInfo.zig+42-16
...@@ -63,7 +63,6 @@ pub fn genSubprogramLookupByName(...@@ -63,7 +63,6 @@ pub fn genSubprogramLookupByName(
6363
64 while (try attr_it.next()) |attr| switch (attr.name) {64 while (try attr_it.next()) |attr| switch (attr.name) {
65 dwarf.AT.name => if (attr.getString(self, compile_unit.cuh)) |str| {65 dwarf.AT.name => if (attr.getString(self, compile_unit.cuh)) |str| {
66 log.warn("subprogram: {s}", .{str});
67 name = str;66 name = str;
68 },67 },
69 dwarf.AT.low_pc => {68 dwarf.AT.low_pc => {
...@@ -389,8 +388,11 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -389,8 +388,11 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
389 const reader = creader.reader();388 const reader = creader.reader();
390389
391 switch (form) {390 switch (form) {
392 dwarf.FORM.strp => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),391 dwarf.FORM.strp,
393 dwarf.FORM.sec_offset => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),392 dwarf.FORM.sec_offset,
393 dwarf.FORM.ref_addr,
394 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),
395
394 dwarf.FORM.addr => return cuh.address_size,396 dwarf.FORM.addr => return cuh.address_size,
395 dwarf.FORM.exprloc => {397 dwarf.FORM.exprloc => {
396 const expr_len = try leb.readULEB128(u64, reader);398 const expr_len = try leb.readULEB128(u64, reader);
...@@ -402,29 +404,53 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -402,29 +404,53 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
402 },404 },
403 dwarf.FORM.flag_present => return 0,405 dwarf.FORM.flag_present => return 0,
404406
405 dwarf.FORM.data1 => return @sizeOf(u8),407 dwarf.FORM.data1,
406 dwarf.FORM.data2 => return @sizeOf(u16),408 dwarf.FORM.ref1,
407 dwarf.FORM.data4 => return @sizeOf(u32),409 dwarf.FORM.block1,
408 dwarf.FORM.data8 => return @sizeOf(u64),410 dwarf.FORM.flag,
409 dwarf.FORM.udata => {411 => return @sizeOf(u8),
412
413 dwarf.FORM.data2,
414 dwarf.FORM.ref2,
415 dwarf.FORM.block2,
416 => return @sizeOf(u16),
417
418 dwarf.FORM.data4,
419 dwarf.FORM.ref4,
420 dwarf.FORM.block4,
421 => return @sizeOf(u32),
422
423 dwarf.FORM.data8,
424 dwarf.FORM.ref8,
425 dwarf.FORM.ref_sig8,
426 => return @sizeOf(u64),
427
428 dwarf.FORM.udata,
429 dwarf.FORM.ref_udata,
430 dwarf.FORM.block,
431 => {
410 _ = try leb.readULEB128(u64, reader);432 _ = try leb.readULEB128(u64, reader);
411 return math.cast(usize, creader.bytes_read) orelse error.Overflow;433 return math.cast(usize, creader.bytes_read) orelse error.Overflow;
412 },434 },
435
413 dwarf.FORM.sdata => {436 dwarf.FORM.sdata => {
414 _ = try leb.readILEB128(i64, reader);437 _ = try leb.readILEB128(i64, reader);
415 return math.cast(usize, creader.bytes_read) orelse error.Overflow;438 return math.cast(usize, creader.bytes_read) orelse error.Overflow;
416 },439 },
417440
418 dwarf.FORM.ref1 => return @sizeOf(u8),441 dwarf.FORM.string => {
419 dwarf.FORM.ref2 => return @sizeOf(u16),442 var count: usize = 0;
420 dwarf.FORM.ref4 => return @sizeOf(u32),443 while (true) : (count += 1) {
421 dwarf.FORM.ref8 => return @sizeOf(u64),444 const byte = try reader.readByte();
422 dwarf.FORM.ref_udata => {445 if (byte == 0x0) break;
423 _ = try leb.readULEB128(u64, reader);446 }
424 return math.cast(usize, creader.bytes_read) orelse error.Overflow;447 return count;
425 },448 },
426449
427 else => return error.ToDo,450 else => {
451 log.err("unhandled DW_FORM_* value with identifier {x}", .{form});
452 return error.UnhandledDwFormValue;
453 },
428 }454 }
429}455}
430456