aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-11-09 06:53:24 +0100
committerGitHub <noreply@github.com>2022-11-09 06:53:24 +0100
commita2e67173d14206fffe7a7f356493bdcd68c039d9 (patch)
treee28a4d7e452c49b4ca0b1f0f5bce760f1c5e4e0e /src
parenta65ba6c85a6c01aecf28e39ba6717fea15757521 (diff)
parent188ad31cf3516c6b9b04b8f4a13bd539f9db8803 (diff)
downloadzig-a2e67173d14206fffe7a7f356493bdcd68c039d9.tar.gz
zig-a2e67173d14206fffe7a7f356493bdcd68c039d9.zip
Merge pull request #13487 from ziglang/zld-dwarf-string
macho: misc DWARF parser fixes
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO/DwarfInfo.zig47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/link/MachO/DwarfInfo.zig b/src/link/MachO/DwarfInfo.zig
index 48c5782571..a8f44df5c3 100644
--- a/src/link/MachO/DwarfInfo.zig
+++ b/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;