<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Feb 1, 2022 at 3:45 PM Greg Clayton via Dwarf-Discuss <<a href="mailto:dwarf-discuss@lists.dwarfstd.org">dwarf-discuss@lists.dwarfstd.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;"><div>I am in the process if writing a tool that can add .debug_names to a file that contains DWARF but doesn’t have an accelerator table that is adequate for debuggers to use. I was trying to see some example implementations of the .debug_names section to see exactly what I should emit from this tool.</div><div><br></div><div>I have a question on the following section from the DWARF 5 specification: 6.1.1.4.7 Abbreviations Table. It contains "Table 6.1: Index attribute encodings” which shows the available attributes for the abbreviations that can be used for each index entry:</div><div><br></div><div>DW_IDX_compile_unit. // Index of CU</div><div>DW_IDX_type_unit  // Index of TU</div><div>DW_IDX_die_offset // Offset of DIE within CU or TU</div><div>DW_IDX_parent // Index of name table entry for parent</div><div>DW_IDX_type_hash // Hash of type declaration</div><div><br></div><div><br></div><div>My main question is what are the best practices for how producers should emit an entry for a specific DIE in this lookup table. One option is to specify both a CU index and a relative DIE offset:</div><div><br></div><div><span style="color:rgb(0,0,0)">DW_IDX_compile_unit + </span><font color="#000000"><span>DW_FORM_dataX form</span></font></div><div><font color="#000000"><span>DW_IDX_die_offset + DW_FORM_ref4</span></font></div><div><font color="#000000"><span><br></span></font></div><div><font color="#000000">“DW_FORM_ref4” is known to be a CU relative offset.</font></div><div><font color="#000000"><span><br></span></font></div><div><font color="#000000"><span>Or we can simply emit a single attribute for the die_offset using an absolute DIE offset reference?</span></font></div><div><font color="#000000"><span><br></span></font></div><div><font color="#000000">DW_IDX_die_offset + DW_FORM_ref_addr</font></div><div><br></div><div>There isn’t much written up in the DWARF spec about these attributes except that it seems to imply that DW_IDX_die_offset must also have a CU or TU since the comment says "<span style="color:rgb(0,0,0)">Offset of DIE within CU or TU</span><font color="#000000"><span>”</span></font></div><div><br></div><div><font color="#000000">I was looking at the output of dsymutil, a smart DWARF linker maintained by Apple, and it can emit .debug_names with an option, but it emits the following abbreviation, as seen by using “llvm-dwarfdump --debug-names”:</font></div><div><font color="#000000"><br></font></div><div><font color="#000000">    Abbreviation 0x16 {<br>      Tag: DW_TAG_typedef<br>      DW_IDX_die_offset: DW_FORM_ref4<br>    }<br><br></font></div><div><font color="#000000">And the in the Entry for each type, dsymutil only emits a DIE offset as a DW_FORM_ref4, which seems to imply it is an absolute offset:</font></div><div><font color="#000000"><br></font></div><div><font color="#000000">  Bucket 0 [<br>    Name 1 {<br>      Hash: 0x4D51C8E0<br>      String: 0x000010c4 "pthread_t"<br>      Entry @ 0x5a7 {<br>        Abbrev: 0x16<br>        Tag: DW_TAG_typedef<br>        DW_IDX_die_offset: 0x00002162<br>      }<br>    }<br>    Name 2 {<br>      Hash: 0x8FEC1B20<br>      String: 0x00000323 "long int"<br>      Entry @ 0x5ad {<br>        Abbrev: 0x24<br>        Tag: DW_TAG_base_type<br>        DW_IDX_die_offset: 0x00000920<br>      }<br>    }<br>  ]<br><br></font></div><div><font color="#000000"><br></font></div><div><font color="#000000">Should dsymutil be emitting both a CU index and a CU relative offset, or should it just switch over to using a DW_FORM_ref_addr as the encoding for the DIE?</font></div><div><font color="#000000"><br></font></div><div><div style="color:rgb(0,0,0)">Do any current compilers support emitting .debug_names when “-gdwarf-5” is produced?</div></div></div></blockquote><div><br>Clang does (if you pass -gpubnames in addition to -gdwarf-5). Looks like it only uses DW_FORM_ref4 as though they were absolute (not unit-relative) offsets. Looks like <a class="gmail_plusreply" id="plusReplyChip-0" href="mailto:pavel@labath.sk" tabindex="-1">@Pavel Labath</a> added this DWARFv5 .debug_names support in <a href="https://reviews.llvm.org/D43286">https://reviews.llvm.org/D43286</a> <br><br>Ah, looks like the implementation only adds IDX_compile_unit if there's more than one unit being produced: <a href="https://github.com/llvm/llvm-project/blob/d7dd7ad827a0a78314f3c9b55f4778a6059840f3/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp#L410">https://github.com/llvm/llvm-project/blob/d7dd7ad827a0a78314f3c9b55f4778a6059840f3/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp#L410</a><br><br>Ah, this is consistent with DWARFv5, page 141 (6.1.1.2 Structure of the Name Index):<br><br>"Compilation Unit (CU), a reference to an entry in the list of CUs. In a per-CU index, index entries without this attribute implicitly refer to the single CU."<br><br>So the ref4 is CU relative, even though there's no IDX_compile_unit attribute on these entries - because there's only one CU in the table, so there's an implicit value of IDX_compile_unit == 0.<br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;"><div><br></div><div><font color="#000000">Any clarification or pointers to other producers would be appreciated!</font></div><div><font color="#000000"><br></font></div><div><font color="#000000">Greg Clayton</font></div><div><font color="#000000"><br></font></div></div>_______________________________________________<br>
Dwarf-Discuss mailing list<br>
<a href="mailto:Dwarf-Discuss@lists.dwarfstd.org" target="_blank">Dwarf-Discuss@lists.dwarfstd.org</a><br>
<a href="http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org" rel="noreferrer" target="_blank">http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org</a><br>
</blockquote></div></div>