authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-11-09 06:53:24+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-09 13:55:25-07:00
logeb21b20949c8760ab1d992d584c44ae320e91f80
tree1716cbc408d37aa7d9a1497c72c0776423fc4e60
parent4efb197f90f60efc253f242463538de573d54e72

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

macho: misc DWARF parser fixes

1 files changed, 36 insertions(+), 11 deletions(-)

src/link/MachO/DwarfInfo.zig+36-11
......@@ -257,13 +257,21 @@ pub const Attribute = struct {
257257 }
258258
259259 pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 {
260 if (self.form != dwarf.FORM.strp) return null;
261260 const debug_info = self.getDebugInfo(ctx);
262 const off = if (cuh.is_64bit)
263 mem.readIntLittle(u64, debug_info[0..8])
264 else
265 mem.readIntLittle(u32, debug_info[0..4]);
266 return ctx.getString(off);
261
262 switch (self.form) {
263 dwarf.FORM.string => {
264 return mem.sliceTo(@ptrCast([*:0]const u8, debug_info.ptr), 0);
265 },
266 dwarf.FORM.strp => {
267 const off = if (cuh.is_64bit)
268 mem.readIntLittle(u64, debug_info[0..8])
269 else
270 mem.readIntLittle(u32, debug_info[0..4]);
271 return ctx.getString(off);
272 },
273 else => return null,
274 }
267275 }
268276
269277 pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 {
......@@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
394402 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),
395403
396404 dwarf.FORM.addr => return cuh.address_size,
405
406 dwarf.FORM.block1,
407 dwarf.FORM.block2,
408 dwarf.FORM.block4,
409 dwarf.FORM.block,
410 => {
411 const len: u64 = switch (form) {
412 dwarf.FORM.block1 => try reader.readIntLittle(u8),
413 dwarf.FORM.block2 => try reader.readIntLittle(u16),
414 dwarf.FORM.block4 => try reader.readIntLittle(u32),
415 dwarf.FORM.block => try leb.readULEB128(u64, reader),
416 else => unreachable,
417 };
418 var i: u64 = 0;
419 while (i < len) : (i += 1) {
420 _ = try reader.readByte();
421 }
422 return math.cast(usize, creader.bytes_read) orelse error.Overflow;
423 },
424
397425 dwarf.FORM.exprloc => {
398426 const expr_len = try leb.readULEB128(u64, reader);
399427 var i: u64 = 0;
......@@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
406434
407435 dwarf.FORM.data1,
408436 dwarf.FORM.ref1,
409 dwarf.FORM.block1,
410437 dwarf.FORM.flag,
411438 => return @sizeOf(u8),
412439
413440 dwarf.FORM.data2,
414441 dwarf.FORM.ref2,
415 dwarf.FORM.block2,
416442 => return @sizeOf(u16),
417443
418444 dwarf.FORM.data4,
419445 dwarf.FORM.ref4,
420 dwarf.FORM.block4,
421446 => return @sizeOf(u32),
422447
423448 dwarf.FORM.data8,
......@@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
427452
428453 dwarf.FORM.udata,
429454 dwarf.FORM.ref_udata,
430 dwarf.FORM.block,
431455 => {
432456 _ = try leb.readULEB128(u64, reader);
433457 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
440464
441465 dwarf.FORM.string => {
442466 var count: usize = 0;
443 while (true) : (count += 1) {
467 while (true) {
444468 const byte = try reader.readByte();
469 count += 1;
445470 if (byte == 0x0) break;
446471 }
447472 return count;