diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-11-09 06:53:24 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-09 06:53:24 +0100 |
| commit | a2e67173d14206fffe7a7f356493bdcd68c039d9 (patch) | |
| tree | e28a4d7e452c49b4ca0b1f0f5bce760f1c5e4e0e /src | |
| parent | a65ba6c85a6c01aecf28e39ba6717fea15757521 (diff) | |
| parent | 188ad31cf3516c6b9b04b8f4a13bd539f9db8803 (diff) | |
| download | zig-a2e67173d14206fffe7a7f356493bdcd68c039d9.tar.gz zig-a2e67173d14206fffe7a7f356493bdcd68c039d9.zip | |
Merge pull request #13487 from ziglang/zld-dwarf-string
macho: misc DWARF parser fixes
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO/DwarfInfo.zig | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/src/link/MachO/DwarfInfo.zig b/src/link/MachO/DwarfInfo.zig index 48c5782571..a8f44df5c3 100644 --- a/src/link/MachO/DwarfInfo.zig +++ b/src/link/MachO/DwarfInfo.zig @@ -257,13 +257,21 @@ pub const Attribute = struct { } pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 { - if (self.form != dwarf.FORM.strp) return null; const debug_info = self.getDebugInfo(ctx); - const off = if (cuh.is_64bit) - mem.readIntLittle(u64, debug_info[0..8]) - else - mem.readIntLittle(u32, debug_info[0..4]); - return ctx.getString(off); + + switch (self.form) { + dwarf.FORM.string => { + return mem.sliceTo(@ptrCast([*:0]const u8, debug_info.ptr), 0); + }, + dwarf.FORM.strp => { + const off = if (cuh.is_64bit) + mem.readIntLittle(u64, debug_info[0..8]) + else + mem.readIntLittle(u32, debug_info[0..4]); + return ctx.getString(off); + }, + else => return null, + } } pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 { @@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), dwarf.FORM.addr => return cuh.address_size, + + dwarf.FORM.block1, + dwarf.FORM.block2, + dwarf.FORM.block4, + dwarf.FORM.block, + => { + const len: u64 = switch (form) { + dwarf.FORM.block1 => try reader.readIntLittle(u8), + dwarf.FORM.block2 => try reader.readIntLittle(u16), + dwarf.FORM.block4 => try reader.readIntLittle(u32), + dwarf.FORM.block => try leb.readULEB128(u64, reader), + else => unreachable, + }; + var i: u64 = 0; + while (i < len) : (i += 1) { + _ = try reader.readByte(); + } + return math.cast(usize, creader.bytes_read) orelse error.Overflow; + }, + dwarf.FORM.exprloc => { const expr_len = try leb.readULEB128(u64, reader); var i: u64 = 0; @@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head 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, @@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head 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; @@ -440,8 +464,9 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head dwarf.FORM.string => { var count: usize = 0; - while (true) : (count += 1) { + while (true) { const byte = try reader.readByte(); + count += 1; if (byte == 0x0) break; } return count; |
