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 {...@@ -257,13 +257,21 @@ pub const Attribute = struct {
257 }257 }
258258
259 pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 {259 pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 {
260 if (self.form != dwarf.FORM.strp) return null;
261 const debug_info = self.getDebugInfo(ctx);260 const debug_info = self.getDebugInfo(ctx);
262 const off = if (cuh.is_64bit)261
263 mem.readIntLittle(u64, debug_info[0..8])262 switch (self.form) {
264 else263 dwarf.FORM.string => {
265 mem.readIntLittle(u32, debug_info[0..4]);264 return mem.sliceTo(@ptrCast([*:0]const u8, debug_info.ptr), 0);
266 return ctx.getString(off);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 }
267 }275 }
268276
269 pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 {277 pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 {
...@@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
394 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),402 => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32),
395403
396 dwarf.FORM.addr => return cuh.address_size,404 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
397 dwarf.FORM.exprloc => {425 dwarf.FORM.exprloc => {
398 const expr_len = try leb.readULEB128(u64, reader);426 const expr_len = try leb.readULEB128(u64, reader);
399 var i: u64 = 0;427 var i: u64 = 0;
...@@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
406434
407 dwarf.FORM.data1,435 dwarf.FORM.data1,
408 dwarf.FORM.ref1,436 dwarf.FORM.ref1,
409 dwarf.FORM.block1,
410 dwarf.FORM.flag,437 dwarf.FORM.flag,
411 => return @sizeOf(u8),438 => return @sizeOf(u8),
412439
413 dwarf.FORM.data2,440 dwarf.FORM.data2,
414 dwarf.FORM.ref2,441 dwarf.FORM.ref2,
415 dwarf.FORM.block2,
416 => return @sizeOf(u16),442 => return @sizeOf(u16),
417443
418 dwarf.FORM.data4,444 dwarf.FORM.data4,
419 dwarf.FORM.ref4,445 dwarf.FORM.ref4,
420 dwarf.FORM.block4,
421 => return @sizeOf(u32),446 => return @sizeOf(u32),
422447
423 dwarf.FORM.data8,448 dwarf.FORM.data8,
...@@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head...@@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
427452
428 dwarf.FORM.udata,453 dwarf.FORM.udata,
429 dwarf.FORM.ref_udata,454 dwarf.FORM.ref_udata,
430 dwarf.FORM.block,
431 => {455 => {
432 _ = try leb.readULEB128(u64, reader);456 _ = try leb.readULEB128(u64, reader);
433 return math.cast(usize, creader.bytes_read) orelse error.Overflow;457 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...@@ -440,8 +464,9 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head
440464
441 dwarf.FORM.string => {465 dwarf.FORM.string => {
442 var count: usize = 0;466 var count: usize = 0;
443 while (true) : (count += 1) {467 while (true) {
444 const byte = try reader.readByte();468 const byte = try reader.readByte();
469 count += 1;
445 if (byte == 0x0) break;470 if (byte == 0x0) break;
446 }471 }
447 return count;472 return count;