Merge pull request #13487 from ziglang/zld-dwarf-string
macho: misc DWARF parser fixes
This commit is contained in:
committed by
Andrew Kelley
parent
4efb197f90
commit
eb21b20949
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user