aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-11-08 17:39:46 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-11-08 17:45:28 +0100
commit9db63d4f1d394f54225b87b53665f76a2b99d312 (patch)
tree3dc7450ed322d08f80560c768516924f174340fe /src
parent7145064efde75aaf4711671d1f5461ea56040815 (diff)
downloadzig-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.zig24
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;