authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-11-09 06:53:24+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-11-09 06:53:24+01:00
loga2e67173d14206fffe7a7f356493bdcd68c039d9
treee28a4d7e452c49b4ca0b1f0f5bce760f1c5e4e0e
parenta65ba6c85a6c01aecf28e39ba6717fea15757521
parent188ad31cf3516c6b9b04b8f4a13bd539f9db8803
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

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;