[llvm] r195776 - DwarfDebug: Include type units in accelerator tables.

Eric Christopher echristo at gmail.com
Tue Nov 26 13:04:52 PST 2013


On Tue, Nov 26, 2013 at 11:14 AM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Tue Nov 26 13:14:34 2013
> New Revision: 195776
>
> URL: http://llvm.org/viewvc/llvm-project?rev=195776&view=rev
> Log:
> DwarfDebug: Include type units in accelerator tables.

As a note it's probably a good idea to say "pubnames/pubtypes" rather
than "accelerator" here because we've got tables that are called
"accelerator" tables as well and it's actually impossible to have type
units that are separated out into distinct sections in those
accelerator tables right now since the use data4 offsets in debug_info
as locations. (This should really be DW_FORM_sec_offset, but.. ).

This is why I'm proposing bringing the type units back into the
debug_info section at any rate.

All of this a random aside, but it's interesting information I think.

-eric

>
> Since type units aren't in the CUMap, use the DwarfUnits list to iterate
> over units for tasks such as accelerator table building.
>
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>     llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=195776&r1=195775&r2=195776&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Nov 26 13:14:34 2013
> @@ -1063,10 +1063,10 @@ void DwarfDebug::finalizeModuleInfo() {
>    computeInlinedDIEs();
>
>    // Handle anything that needs to be done on a per-cu basis.
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
> -                                                         CUE = CUMap.end();
> -       CUI != CUE; ++CUI) {
> -    CompileUnit *TheCU = CUI->second;
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
> +       I != E; ++I) {
> +    CompileUnit *TheCU = *I;
>      // Emit DW_AT_containing_type attribute to connect types with their
>      // vtable holding type.
>      TheCU->constructContainingTypeDIEs();
> @@ -1953,7 +1953,8 @@ void DwarfUnits::computeSizeAndOffsets()
>
>    // Iterate over each compile unit and set the size and offsets for each
>    // DIE within each compile unit. All offsets are CU relative.
> -  for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = CUs.begin(),
> +                                                      E = CUs.end();
>         I != E; ++I) {
>      (*I)->setDebugInfoOffset(SecOffset);
>
> @@ -2227,10 +2228,10 @@ void DwarfDebug::emitEndOfLineMatrix(uns
>  void DwarfDebug::emitAccelNames() {
>    DwarfAccelTable AT(
>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
> -                                                         E = CUMap.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
>         I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +    CompileUnit *TheCU = *I;
>      const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelNames();
>      for (StringMap<std::vector<const DIE *> >::const_iterator
>               GI = Names.begin(),
> @@ -2260,10 +2261,10 @@ void DwarfDebug::emitAccelNames() {
>  void DwarfDebug::emitAccelObjC() {
>    DwarfAccelTable AT(
>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
> -                                                         E = CUMap.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
>         I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +    CompileUnit *TheCU = *I;
>      const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelObjC();
>      for (StringMap<std::vector<const DIE *> >::const_iterator
>               GI = Names.begin(),
> @@ -2292,10 +2293,10 @@ void DwarfDebug::emitAccelObjC() {
>  void DwarfDebug::emitAccelNamespaces() {
>    DwarfAccelTable AT(
>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
> -                                                         E = CUMap.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
>         I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +    CompileUnit *TheCU = *I;
>      const StringMap<std::vector<const DIE *> > &Names =
>          TheCU->getAccelNamespace();
>      for (StringMap<std::vector<const DIE *> >::const_iterator
> @@ -2331,10 +2332,10 @@ void DwarfDebug::emitAccelTypes() {
>    Atoms.push_back(
>        DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1));
>    DwarfAccelTable AT(Atoms);
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
> -                                                         E = CUMap.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
>         I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +    CompileUnit *TheCU = *I;
>      const StringMap<std::vector<std::pair<const DIE *, unsigned> > > &Names =
>          TheCU->getAccelTypes();
>      for (StringMap<
> @@ -2428,9 +2429,10 @@ void DwarfDebug::emitDebugPubNames(bool
>        GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
>                 : Asm->getObjFileLowering().getDwarfPubNamesSection();
>
> -  typedef DenseMap<const MDNode *, CompileUnit *> CUMapType;
> -  for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
> +       I != E; ++I) {
> +    CompileUnit *TheCU = *I;
>      unsigned ID = TheCU->getUniqueID();
>
>      // Start the dwarf pubnames section.
> @@ -2496,10 +2498,10 @@ void DwarfDebug::emitDebugPubTypes(bool
>        GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
>                 : Asm->getObjFileLowering().getDwarfPubTypesSection();
>
> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
> -                                                         E = CUMap.end();
> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
> +                                                      E = getUnits().end();
>         I != E; ++I) {
> -    CompileUnit *TheCU = I->second;
> +    CompileUnit *TheCU = *I;
>      // Start the dwarf pubtypes section.
>      Asm->OutStreamer.SwitchSection(PSec);
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=195776&r1=195775&r2=195776&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Nov 26 13:14:34 2013
> @@ -258,6 +258,8 @@ public:
>
>    ~DwarfUnits();
>
> +  const SmallVectorImpl<CompileUnit *> &getUnits() { return CUs; }
> +
>    /// \brief Compute the size and offset of a DIE given an incoming Offset.
>    unsigned computeSizeAndOffset(DIE *Die, unsigned Offset);
>
> @@ -479,10 +481,12 @@ class DwarfDebug {
>    // Holder for the skeleton information.
>    DwarfUnits SkeletonHolder;
>
> -private:
> -
>    void addScopeVariable(LexicalScope *LS, DbgVariable *Var);
>
> +  const SmallVectorImpl<CompileUnit *> &getUnits() {
> +    return InfoHolder.getUnits();
> +  }
> +
>    /// \brief Find abstract variable associated with Var.
>    DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc);
>
>
> Modified: llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll?rev=195776&r1=195775&r2=195776&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll Tue Nov 26 13:14:34 2013
> @@ -91,11 +91,29 @@
>  ; CHECK: DW_TAG_structure_type
>  ; CHECK-NEXT: debug_str{{.*}}"wombat"
>
> -; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
> +; Use the unit size as a rough hash/identifier for the unit we're dealing with
> +; it happens to be unambiguous at the moment, but it's hardly ideal.
>  ; CHECK-LABEL: .debug_pubtypes contents:
> -; CHECK-NEXT: unit_offset = 0x00000000
> -; CHECK-NEXT: Offset
> -; CHECK-NEXT: {{^$}}
> +; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
> +; CHECK-NEXT: unit_size = 0x00000174
> +; CHECK-NEXT: Offset Name
> +; Type unit for 'bar'
> +; CHECK-NEXT: unit_size = 0x0000001f
> +; CHECK-NEXT: Offset Name
> +; CHECK-NEXT: "bar"
> +; CHECK-NEXT: unit_size = 0x00000059
> +; CHECK-NEXT: Offset Name
> +; CHECK-NEXT: "int"
> +; CHECK-NEXT: "echidna::capybara::mongoose::fluffy"
> +; CHECK-NEXT: unit_size = 0x0000002f
> +; CHECK-NEXT: Offset Name
> +; CHECK-NEXT: "walrus"
> +; CHECK-NEXT: unit_size = 0x0000003f
> +; CHECK-NEXT: Offset Name
> +; CHECK-NEXT: "int"
> +; CHECK-NEXT: unit_size = 0x00000036
> +; CHECK-NEXT: Offset Name
> +; CHECK-NEXT: "wombat"
>
>  %struct.bar = type { i8 }
>  %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list