[llvm] r309354 - DebugInfo: Consider a CU containing only local imported entities to be 'empty'

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 27 20:06:26 PDT 2017


Author: dblaikie
Date: Thu Jul 27 20:06:25 2017
New Revision: 309354

URL: http://llvm.org/viewvc/llvm-project?rev=309354&view=rev
Log:
DebugInfo: Consider a CU containing only local imported entities to be 'empty'

This can come up in ThinLTO & wastes space & makes degenerate IR.

As per the added FIXME, ultimately, local imported entities should hang
off the function and that way the imported entity list on the CU can be
tested for emptiness like all the other CU lists.

(function-attached local imported entities are probably also the best
path forward for fixing how imported entities are handled both in
cross-module use (currently, while ThinLTO preserves the imported
entities, they would not get used at the imported inlined location -
only in the abstract origin that appears in the partial CU created by
the import (which isn't emitted under Fission due to cross-CU
limitations there)) and to reduce the number of points where imported
entities are emitted (they're currently emitted into every inlined
instance, concrete instance, and abstract origin - they should only go
in teh abstract origin if there is one, otherwise in the concrete
instance - but this requires lots of delayed handling and wiring up,
same as abstract variables & subprograms))

Modified:
    llvm/trunk/include/llvm/IR/Metadata.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
    llvm/trunk/test/DebugInfo/omit-empty.ll

Modified: llvm/trunk/include/llvm/IR/Metadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=309354&r1=309353&r2=309354&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Metadata.h (original)
+++ llvm/trunk/include/llvm/IR/Metadata.h Thu Jul 27 20:06:25 2017
@@ -1188,7 +1188,8 @@ void TempMDNodeDeleter::operator()(MDNod
 /// particular Metadata subclass.
 template <class T>
 class TypedMDOperandIterator
-    : std::iterator<std::input_iterator_tag, T *, std::ptrdiff_t, void, T *> {
+    : public std::iterator<std::input_iterator_tag, T *, std::ptrdiff_t, void,
+                           T *> {
   MDNode::op_iterator I = nullptr;
 
 public:

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=309354&r1=309353&r2=309354&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Jul 27 20:06:25 2017
@@ -428,6 +428,9 @@ DwarfDebug::getOrCreateDwarfCompileUnit(
                   Asm->TM.Options.MCOptions.SplitDwarfFile);
   }
 
+  for (auto *IE : DIUnit->getImportedEntities())
+    NewCU.addImportedEntity(IE);
+
   // LTO with assembly output shares a single line table amongst multiple CUs.
   // To avoid the compilation directory being ambiguous, let the line table
   // explicitly describe the directory of all files, never relying on the
@@ -522,14 +525,6 @@ sortGlobalExprs(SmallVectorImpl<DwarfCom
   return GVEs;
 }
 
-static bool isEmptyCU(DICompileUnit *CUNode) {
-  return CUNode->getEnumTypes().empty() &&
-         CUNode->getRetainedTypes().empty() &&
-         CUNode->getGlobalVariables().empty() &&
-         CUNode->getImportedEntities().empty() &&
-         CUNode->getMacros().empty();
-}
-
 // Emit all Dwarf sections that should come prior to the content. Create
 // global DIEs and emit initial debug info sections. This is invoked by
 // the target AsmPrinter.
@@ -556,12 +551,20 @@ void DwarfDebug::beginModule() {
   }
 
   for (DICompileUnit *CUNode : M->debug_compile_units()) {
-    if (isEmptyCU(CUNode))
+    // FIXME: Move local imported entities into a list attached to the
+    // subprogram, then this search won't be needed and a
+    // getImportedEntities().empty() test should go below with the rest.
+    bool HasNonLocalImportedEntities = llvm::any_of(
+        CUNode->getImportedEntities(), [](const DIImportedEntity *IE) {
+          return !isa<DILocalScope>(IE->getScope());
+        });
+
+    if (!HasNonLocalImportedEntities && CUNode->getEnumTypes().empty() &&
+        CUNode->getRetainedTypes().empty() &&
+        CUNode->getGlobalVariables().empty() && CUNode->getMacros().empty())
       continue;
 
     DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(CUNode);
-    for (auto *IE : CUNode->getImportedEntities())
-      CU.addImportedEntity(IE);
 
     // Global Variables.
     for (auto *GVE : CUNode->getGlobalVariables())

Modified: llvm/trunk/test/DebugInfo/omit-empty.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/omit-empty.ll?rev=309354&r1=309353&r2=309354&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/omit-empty.ll (original)
+++ llvm/trunk/test/DebugInfo/omit-empty.ll Thu Jul 27 20:06:25 2017
@@ -3,7 +3,7 @@
 
 ; CHECK-NOT: .debug_
 
-!llvm.dbg.cu = !{!0}
+!llvm.dbg.cu = !{!0, !5}
 !llvm.module.flags = !{!3, !4}
 
 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
@@ -11,3 +11,10 @@
 !2 = !{}
 !3 = !{i32 2, !"Dwarf Version", i32 4}
 !4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, imports: !6)
+!6 = !{!7}
+!7 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !8, entity: !8, file: !1, line: 3)
+!8 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", scope: !1, file: !1, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !5, variables: !2)
+!9 = !DISubroutineType(types: !10)
+!10 = !{null}
+!11 = !DINamespace(name: "ns", scope: null)




More information about the llvm-commits mailing list