| ... | @@ -1332,8 +1332,43 @@ fn addDbgInfoType( | ... | @@ -1332,8 +1332,43 @@ fn addDbgInfoType( |
| 1332 | // DW.AT.name, DW.FORM.string | 1332 | // 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 => { |