authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 14:13:59+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 17:55:01+01:00
logeaf08bfb849165ffbf68cd4e51531e393cc196f8
tree7a5301b2c985c2bad42d3e1c2b31e83880dd17b0
parentac936c0aba94c2cf5ff8537c1808445eacf38a15

macho: handle optional non-ptr types in DWARF


1 files changed, 37 insertions(+), 2 deletions(-)

src/link/MachO/DebugSymbols.zig+37-2
...@@ -1332,8 +1332,43 @@ fn addDbgInfoType(...@@ -1332,8 +1332,43 @@ fn addDbgInfoType(
1332 // DW.AT.name, DW.FORM.string1332 // DW.AT.name, DW.FORM.string
1333 try dbg_info_buffer.writer().print("{}\x00", .{ty});1333 try dbg_info_buffer.writer().print("{}\x00", .{ty});
1334 } else {1334 } else {
1335 log.debug("TODO implement .debug_info for type '{}'", .{ty});1335 // Non-pointer optionals are structs: struct { .maybe = *, .val = * }
1336 try dbg_info_buffer.append(abbrev_pad1);1336 var buf = try arena.create(Type.Payload.ElemType);
1337 const payload_ty = ty.optionalChild(buf);
1338 // DW.AT.structure_type
1339 try dbg_info_buffer.append(abbrev_struct_type);
1340 // DW.AT.byte_size, DW.FORM.sdata
1341 const abi_size = ty.abiSize(target);
1342 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
1343 // DW.AT.name, DW.FORM.string
1344 try dbg_info_buffer.writer().print("{}\x00", .{ty});
1345 // DW.AT.member
1346 try dbg_info_buffer.ensureUnusedCapacity(7);
1347 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
1348 // DW.AT.name, DW.FORM.string
1349 dbg_info_buffer.appendSliceAssumeCapacity("maybe");
1350 dbg_info_buffer.appendAssumeCapacity(0);
1351 // DW.AT.type, DW.FORM.ref4
1352 var index = dbg_info_buffer.items.len;
1353 try dbg_info_buffer.resize(index + 4);
1354 try relocs.append(.{ .ty = Type.bool, .reloc = @intCast(u32, index) });
1355 // DW.AT.data_member_location, DW.FORM.sdata
1356 try dbg_info_buffer.ensureUnusedCapacity(6);
1357 dbg_info_buffer.appendAssumeCapacity(0);
1358 // DW.AT.member
1359 dbg_info_buffer.appendAssumeCapacity(abbrev_struct_member);
1360 // DW.AT.name, DW.FORM.string
1361 dbg_info_buffer.appendSliceAssumeCapacity("val");
1362 dbg_info_buffer.appendAssumeCapacity(0);
1363 // DW.AT.type, DW.FORM.ref4
1364 index = dbg_info_buffer.items.len;
1365 try dbg_info_buffer.resize(index + 4);
1366 try relocs.append(.{ .ty = payload_ty, .reloc = @intCast(u32, index) });
1367 // DW.AT.data_member_location, DW.FORM.sdata
1368 const offset = abi_size - payload_ty.abiSize(target);
1369 try leb128.writeULEB128(dbg_info_buffer.writer(), offset);
1370 // DW.AT.structure_type delimit children
1371 try dbg_info_buffer.append(0);
1337 }1372 }
1338 },1373 },
1339 .Pointer => {1374 .Pointer => {