diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-11-08 17:39:46 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-11-08 17:45:28 +0100 |
| commit | 9db63d4f1d394f54225b87b53665f76a2b99d312 (patch) | |
| tree | 3dc7450ed322d08f80560c768516924f174340fe /src | |
| parent | 7145064efde75aaf4711671d1f5461ea56040815 (diff) | |
| download | zig-9db63d4f1d394f54225b87b53665f76a2b99d312.tar.gz zig-9db63d4f1d394f54225b87b53665f76a2b99d312.zip | |
macho: fix handling of DW_FORM_block* forms
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO/DwarfInfo.zig | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/link/MachO/DwarfInfo.zig b/src/link/MachO/DwarfInfo.zig index dad248f60e..3e822bb80c 100644 --- a/src/link/MachO/DwarfInfo.zig +++ b/src/link/MachO/DwarfInfo.zig @@ -402,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 creader.bytes_read; + }, + dwarf.FORM.exprloc => { const expr_len = try leb.readULEB128(u64, reader); var i: u64 = 0; @@ -414,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, @@ -435,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; |
