Commit eb21b20949

Jakub Konka <kubkon@jakubkonka.com>
2022-11-09 06:53:24
Merge pull request #13487 from ziglang/zld-dwarf-string
macho: misc DWARF parser fixes
1 parent 4efb197
Changed files (1)
src
link
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;