diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-10-23 16:29:08 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-10-23 21:53:36 +0200 |
| commit | 828735ac036abba77ffce2bf963c04f99f1687c8 (patch) | |
| tree | e4bd74b0b943773bd50ea6496cb11dc100bfd8e2 | |
| parent | 04472af328632d80ea9ea089cfd5de8fac6dd039 (diff) | |
| download | zig-828735ac036abba77ffce2bf963c04f99f1687c8.tar.gz zig-828735ac036abba77ffce2bf963c04f99f1687c8.zip | |
macho: handle majority of DW_FORM_ values for DWARF4 in the linker
| -rw-r--r-- | src/link/MachO/DwarfInfo.zig | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/src/link/MachO/DwarfInfo.zig b/src/link/MachO/DwarfInfo.zig index 0685b3fc99..48c5782571 100644 --- a/src/link/MachO/DwarfInfo.zig +++ b/src/link/MachO/DwarfInfo.zig @@ -63,7 +63,6 @@ pub fn genSubprogramLookupByName( while (try attr_it.next()) |attr| switch (attr.name) { dwarf.AT.name => if (attr.getString(self, compile_unit.cuh)) |str| { - log.warn("subprogram: {s}", .{str}); name = str; }, dwarf.AT.low_pc => { @@ -389,8 +388,11 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head const reader = creader.reader(); switch (form) { - dwarf.FORM.strp => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), - dwarf.FORM.sec_offset => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), + dwarf.FORM.strp, + dwarf.FORM.sec_offset, + dwarf.FORM.ref_addr, + => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), + dwarf.FORM.addr => return cuh.address_size, dwarf.FORM.exprloc => { const expr_len = try leb.readULEB128(u64, reader); @@ -402,29 +404,53 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head }, dwarf.FORM.flag_present => return 0, - dwarf.FORM.data1 => return @sizeOf(u8), - dwarf.FORM.data2 => return @sizeOf(u16), - dwarf.FORM.data4 => return @sizeOf(u32), - dwarf.FORM.data8 => return @sizeOf(u64), - dwarf.FORM.udata => { + dwarf.FORM.data1, + dwarf.FORM.ref1, + dwarf.FORM.block1, + dwarf.FORM.flag, + => return @sizeOf(u8), + + dwarf.FORM.data2, + dwarf.FORM.ref2, + dwarf.FORM.block2, + => return @sizeOf(u16), + + dwarf.FORM.data4, + dwarf.FORM.ref4, + dwarf.FORM.block4, + => return @sizeOf(u32), + + dwarf.FORM.data8, + dwarf.FORM.ref8, + dwarf.FORM.ref_sig8, + => return @sizeOf(u64), + + dwarf.FORM.udata, + dwarf.FORM.ref_udata, + dwarf.FORM.block, + => { _ = try leb.readULEB128(u64, reader); return math.cast(usize, creader.bytes_read) orelse error.Overflow; }, + dwarf.FORM.sdata => { _ = try leb.readILEB128(i64, reader); return math.cast(usize, creader.bytes_read) orelse error.Overflow; }, - dwarf.FORM.ref1 => return @sizeOf(u8), - dwarf.FORM.ref2 => return @sizeOf(u16), - dwarf.FORM.ref4 => return @sizeOf(u32), - dwarf.FORM.ref8 => return @sizeOf(u64), - dwarf.FORM.ref_udata => { - _ = try leb.readULEB128(u64, reader); - return math.cast(usize, creader.bytes_read) orelse error.Overflow; + dwarf.FORM.string => { + var count: usize = 0; + while (true) : (count += 1) { + const byte = try reader.readByte(); + if (byte == 0x0) break; + } + return count; }, - else => return error.ToDo, + else => { + log.err("unhandled DW_FORM_* value with identifier {x}", .{form}); + return error.UnhandledDwFormValue; + }, } } |
