Merge pull request #13487 from ziglang/zld-dwarf-string

macho: misc DWARF parser fixes
This commit is contained in:
Jakub Konka
2022-11-09 06:53:24 +01:00
committed by Andrew Kelley
parent 4efb197f90
commit eb21b20949

View File

@@ -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;