Revert "Recommitted r263424 "Supporting all entities declared in lexical scope in LLVM debug info." After fixing PR26942 (the fix is included in this commit)."

This reverts commit r264280.

This broke building Chromium for iOS. We'll upload a reproducer to the
PR soon.

llvm-svn: 264334
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index 2638c25..56856c7 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -114,16 +114,10 @@
 
   // Construct the context before querying for the existence of the DIE in
   // case such construction creates the DIE.
-  // For Local Scope, do not construct context DIE.
-  bool IsLocalScope = GVContext && isa<DILocalScope>(GVContext);
-  DIE *ContextDIE = IsLocalScope ? nullptr : getOrCreateContextDIE(GVContext);
-  assert(ContextDIE || IsLocalScope);
+  DIE *ContextDIE = getOrCreateContextDIE(GVContext);
 
-  // Create new global variable and add to map.
-  DIE *VariableDIE = IsLocalScope
-                         ? createDIE(GV->getTag(), GV)
-                         : &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
-
+  // Add to map.
+  DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
   DIScope *DeclContext;
   if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) {
     DeclContext = resolve(SDMDecl->getScope());
@@ -341,15 +335,23 @@
     if (DD->isLexicalScopeDIENull(Scope))
       return;
 
-    bool HasNonScopeChildren;
+    unsigned ChildScopeCount;
 
     // We create children here when we know the scope DIE is not going to be
     // null and the children will be added to the scope DIE.
-    createScopeChildrenDIE(Scope, Children, &HasNonScopeChildren);
+    createScopeChildrenDIE(Scope, Children, &ChildScopeCount);
+
+    // Skip imported directives in gmlt-like data.
+    if (!includeMinimalInlineScopes()) {
+      // There is no need to emit empty lexical block DIE.
+      for (const auto *IE : ImportedEntities[DS])
+        Children.push_back(
+            constructImportedEntityDIE(cast<DIImportedEntity>(IE)));
+    }
 
     // If there are only other scopes as children, put them directly in the
     // parent instead, as this scope would serve no purpose.
-    if (!HasNonScopeChildren) {
+    if (Children.size() == ChildScopeCount) {
       FinalChildren.insert(FinalChildren.end(),
                            std::make_move_iterator(Children.begin()),
                            std::make_move_iterator(Children.end()));
@@ -364,7 +366,6 @@
     ScopeDIE->addChild(std::move(I));
 
   FinalChildren.push_back(std::move(ScopeDIE));
-  addLocalScopeDieToLexicalScope(Scope, ScopeDIE);
 }
 
 DIE::value_iterator
@@ -557,37 +558,20 @@
 
 DIE *DwarfCompileUnit::createScopeChildrenDIE(LexicalScope *Scope,
                                               SmallVectorImpl<DIE *> &Children,
-                                              bool *HasNonScopeChildren) {
+                                              unsigned *ChildScopeCount) {
   DIE *ObjectPointer = nullptr;
-  bool HasLocalDclDie = false;
-  auto *DS = Scope->getScopeNode();
 
   for (DbgVariable *DV : DU->getScopeVariables().lookup(Scope))
     Children.push_back(constructVariableDIE(*DV, *Scope, ObjectPointer));
 
-  // Skip local declarations in gmlt-like data.
-  if (!includeMinimalInlineScopes()) {
-    for (const auto *DI : LocalDeclNodes[DS]) {
-      DIE *D = nullptr;
-      if (auto *IE = dyn_cast<DIImportedEntity>(DI))
-        D = getOrCreateImportedEntityDIE(IE);
-      else if (auto *GV = dyn_cast<DIGlobalVariable>(DI))
-        D = getOrCreateGlobalVariableDIE(GV);
-      else if (auto *RT = dyn_cast<DIType>(DI))
-        D = getOrCreateTypeDIE(RT);
-      else
-        llvm_unreachable("Unexpected DI node!");
-      addLocalDclDieToLexicalScope(Scope, D);
-      HasLocalDclDie = true;
-    }
-  }
-
-  if (HasNonScopeChildren)
-    *HasNonScopeChildren = !Children.empty() || HasLocalDclDie;
+  unsigned ChildCountWithoutScopes = Children.size();
 
   for (LexicalScope *LS : Scope->getChildren())
     constructScopeDIE(LS, Children);
 
+  if (ChildScopeCount)
+    *ChildScopeCount = Children.size() - ChildCountWithoutScopes;
+
   return ObjectPointer;
 }
 
@@ -629,8 +613,6 @@
   for (auto &I : Children)
     ScopeDIE.addChild(std::move(I));
 
-  addLocalScopeDieToLexicalScope(Scope, &ScopeDIE);
-
   return ObjectPointer;
 }
 
@@ -667,20 +649,10 @@
     addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
 }
 
-DIE *DwarfCompileUnit::getOrCreateImportedEntityDIE(
-    const DIImportedEntity *Module) {
-  if (DIE *Die = getDIE(Module))
-    return Die;
-
-  return constructImportedEntityDIE(Module);
-}
-
 DIE *DwarfCompileUnit::constructImportedEntityDIE(
     const DIImportedEntity *Module) {
-
-  assert(!getDIE(Module));
-
-  DIE *IMDie = createDIE(Module->getTag(), Module);
+  DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag());
+  insertDIE(Module, IMDie);
   DIE *EntityDie;
   auto *Entity = resolve(Module->getEntity());
   if (auto *NS = dyn_cast<DINamespace>(Entity))
@@ -707,46 +679,22 @@
 }
 
 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) {
-  if (DIE *D = getDIE(SP)) {
-    if (DIE *AbsSPDIE = DU->getAbstractSPDies().lookup(SP))
+  DIE *D = getDIE(SP);
+  if (DIE *AbsSPDIE = DU->getAbstractSPDies().lookup(SP)) {
+    if (D)
       // If this subprogram has an abstract definition, reference that
       addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
-    else
+  } else {
+    if (!D && !includeMinimalInlineScopes())
+      // Lazily construct the subprogram if we didn't see either concrete or
+      // inlined versions during codegen. (except in -gmlt ^ where we want
+      // to omit these entirely)
+      D = getOrCreateSubprogramDIE(SP);
+    if (D)
       // And attach the attributes
       applySubprogramAttributesToDefinition(SP, *D);
   }
 }
-
-void DwarfCompileUnit::finishLocalScopeDefinitions() {
-  for (const auto &I : getLSDieInfoMap()) {
-    auto LSInfo = I.second;
-    // Attach all local dcl DIEs to abstract local scope if available,
-    // otherwise attach it to concrete local scope.
-    DIE *LBDie =
-        LSInfo.AbstractLSDie ? LSInfo.AbstractLSDie : LSInfo.ConcreteLSDie;
-    assert(LBDie || LSInfo.LocalDclDies.empty());
-    for (auto &D : LSInfo.LocalDclDies)
-      LBDie->addChild(std::move(D));
-
-    if (isa<DISubprogram>(I.first))
-      // For function scope there is nothing else to do.
-      // "abstract_origin" dwarf attribute was added somewhere else.
-      continue;
-
-    if (LSInfo.AbstractLSDie) {
-      // Add "abstract_origin" dwarf attribute to concrete local scope pointing
-      // to the corresponding abstract local scope.
-      if (LSInfo.ConcreteLSDie)
-        addDIEEntry(*LSInfo.ConcreteLSDie, dwarf::DW_AT_abstract_origin,
-                    *LSInfo.AbstractLSDie);
-      // Add "abstract_origin" dwarf attribute to inline local scope pointing
-      // to the corresponding abstract local scope.
-      for (auto &L : LSInfo.InlineLSDies)
-        addDIEEntry(*L, dwarf::DW_AT_abstract_origin, *LSInfo.AbstractLSDie);
-    }
-  }
-}
-
 void DwarfCompileUnit::collectDeadVariables(const DISubprogram *SP) {
   assert(SP && "CU's subprogram list contains a non-subprogram");
   assert(SP->isDefinition() &&
@@ -757,7 +705,7 @@
 
   DIE *SPDIE = DU->getAbstractSPDies().lookup(SP);
   if (!SPDIE)
-    return;
+    SPDIE = getDIE(SP);
   assert(SPDIE);
   for (const DILocalVariable *DV : Variables) {
     DbgVariable NewVar(DV, /* IA */ nullptr, DD);
@@ -882,34 +830,6 @@
   addGlobalName(SP->getName(), SPDie, Context);
 }
 
-void DwarfCompileUnit::addLocalScopeDieToLexicalScope(LexicalScope *LS,
-                                                      DIE *D) {
-  const DILocalScope *Scope = LS->getScopeNode();
-  assert(!isa<DILexicalBlockFile>(Scope) && "Don't expect Lexical Block File!");
-  auto &LSInfo = getLSDieInfoMap()[Scope];
-  if (LS->isAbstractScope()) {
-    assert(!LSInfo.AbstractLSDie && "Adding abstract LS DIE twice.");
-    LSInfo.AbstractLSDie = D;
-    return;
-  }
-  if (LS->getInlinedAt()) {
-    assert(!LSInfo.InlineLSDies.count(D) && "Adding inline LS DIE twice.");
-    LSInfo.InlineLSDies.insert(D);
-    return;
-  }
-  assert(!LSInfo.ConcreteLSDie && "Adding cocncrete LS DIE twice.");
-  LSInfo.ConcreteLSDie = D;
-  return;
-}
-
-void DwarfCompileUnit::addLocalDclDieToLexicalScope(LexicalScope *LS, DIE *D) {
-  const DILocalScope *Scope = LS->getScopeNode();
-  assert(!isa<DILexicalBlockFile>(Scope) && "Don't expect Lexical Block File!");
-  auto &LSInfo = getLSDieInfoMap()[Scope];
-  LSInfo.LocalDclDies.insert(D);
-  return;
-}
-
 bool DwarfCompileUnit::isDwoUnit() const {
   return DD->useSplitDwarf() && Skeleton;
 }
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
index b47cbae..bacf87d 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
@@ -15,7 +15,6 @@
 #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
 
 #include "DwarfUnit.h"
-#include "llvm/ADT/SetVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/IR/DebugInfo.h"
 #include "llvm/Support/Dwarf.h"
@@ -49,10 +48,11 @@
   /// The start of the unit macro info within macro section.
   MCSymbol *MacroLabelBegin;
 
-  typedef llvm::SmallVector<const MDNode *, 8> LocalDeclNodeList;
-  typedef llvm::DenseMap<const MDNode *, LocalDeclNodeList> LocalScopesMap;
+  typedef llvm::SmallVector<const MDNode *, 8> ImportedEntityList;
+  typedef llvm::DenseMap<const MDNode *, ImportedEntityList>
+  ImportedEntityMap;
 
-  LocalScopesMap LocalDeclNodes;
+  ImportedEntityMap ImportedEntities;
 
   /// GlobalNames - A map of globally visible named entities for this unit.
   StringMap<const DIE *> GlobalNames;
@@ -71,15 +71,6 @@
   // ranges/locs.
   const MCSymbol *BaseAddress;
 
-  struct LocalScopeDieInfo {
-    DIE *ConcreteLSDie = nullptr;
-    DIE *AbstractLSDie = nullptr;
-    SetVector<DIE *> InlineLSDies;
-    SetVector<DIE *> LocalDclDies;
-  };
-  // Collection of local scope DIE info.
-  DenseMap<const MDNode *, LocalScopeDieInfo> LocalScopeDieInfoMap;
-
   /// \brief Construct a DIE for the given DbgVariable without initializing the
   /// DbgVariable's DIE reference.
   DIE *constructVariableDIEImpl(const DbgVariable &DV, bool Abstract);
@@ -126,16 +117,8 @@
 
   unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName) override;
 
-  void addLocalDeclNode(const DINode *DI, DILocalScope *Scope) {
-    // LocalDeclNodes maps local declaration DIEs to their parent DILocalScope.
-    // These local declaration entities will be processed when processing the
-    // lexical scopes collected by LexicalScopes component.
-    // DILexicalBlockFile is skipped by LexicalScopes and it collect its parent,
-    // which is of a DILexicalBlock. Thus, LocalDeclNodes must not map to
-    // DILexicalBlockFile but to its parent DILexicalBlock.
-    if (auto *File = dyn_cast<DILexicalBlockFile>(Scope))
-      Scope = File->getScope();
-    LocalDeclNodes[Scope].push_back(DI);
+  void addImportedEntity(const DIImportedEntity* IE) {
+    ImportedEntities[IE->getScope()].push_back(IE);
   }
 
   /// addRange - Add an address range to the list of ranges for this unit.
@@ -183,7 +166,7 @@
   /// A helper function to create children of a Scope DIE.
   DIE *createScopeChildrenDIE(LexicalScope *Scope,
                               SmallVectorImpl<DIE *> &Children,
-                              bool *HasNonScopeChildren = nullptr);
+                              unsigned *ChildScopeCount = nullptr);
 
   /// \brief Construct a DIE for this subprogram scope.
   void constructSubprogramScopeDIE(LexicalScope *Scope);
@@ -192,15 +175,11 @@
 
   void constructAbstractSubprogramScopeDIE(LexicalScope *Scope);
 
-  /// \brief Get or create import_module DIE.
-  DIE *getOrCreateImportedEntityDIE(const DIImportedEntity *Module);
   /// \brief Construct import_module DIE.
   DIE *constructImportedEntityDIE(const DIImportedEntity *Module);
 
   void finishSubprogramDefinition(const DISubprogram *SP);
 
-  void finishLocalScopeDefinitions();
-
   void collectDeadVariables(const DISubprogram *SP);
 
   /// Set the skeleton unit associated with this unit.
@@ -274,15 +253,6 @@
 
   void setBaseAddress(const MCSymbol *Base) { BaseAddress = Base; }
   const MCSymbol *getBaseAddress() const { return BaseAddress; }
-
-  DenseMap<const MDNode *, LocalScopeDieInfo> &getLSDieInfoMap() {
-    return LocalScopeDieInfoMap;
-  }
-
-  /// Add local scope DIE entry to lexical scope info.
-  void addLocalScopeDieToLexicalScope(LexicalScope *LS, DIE *D);
-  /// Add local declaration DIE entry to lexical scope info.
-  void addLocalDclDieToLexicalScope(LexicalScope *LS, DIE *D);
 };
 
 } // end llvm namespace
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 9829d0f..dc21583 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -458,16 +458,6 @@
     D->addChild(TheCU.constructImportedEntityDIE(N));
 }
 
-bool DwarfDebug::collectLocalScopedNode(DIScope *S, const DINode *N,
-                                        DwarfCompileUnit &CU) {
-  if (auto LS = dyn_cast_or_null<DILocalScope>(S)) {
-    getLocalScopes(LS->getSubprogram()).insert(LS);
-    CU.addLocalDeclNode(N, LS);
-    return true;
-  }
-  return false;
-}
-
 // 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.
@@ -487,9 +477,10 @@
   for (MDNode *N : CU_Nodes->operands()) {
     auto *CUNode = cast<DICompileUnit>(N);
     DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
+    for (auto *IE : CUNode->getImportedEntities())
+      CU.addImportedEntity(IE);
     for (auto *GV : CUNode->getGlobalVariables())
-      if (!collectLocalScopedNode(GV->getScope(), GV, CU))
-        CU.getOrCreateGlobalVariableDIE(GV);
+      CU.getOrCreateGlobalVariableDIE(GV);
     for (auto *SP : CUNode->getSubprograms())
       SPMap.insert(std::make_pair(SP, &CU));
     for (auto *Ty : CUNode->getEnumTypes()) {
@@ -501,17 +492,14 @@
       // The retained types array by design contains pointers to
       // MDNodes rather than DIRefs. Unique them here.
       DIType *RT = cast<DIType>(resolve(Ty->getRef()));
-      if (RT->isExternalTypeRef())
+      if (!RT->isExternalTypeRef())
         // There is no point in force-emitting a forward declaration.
-        continue;
-      if (!collectLocalScopedNode(resolve(Ty->getScope()), RT, CU))
         CU.getOrCreateTypeDIE(RT);
     }
     // Emit imported_modules last so that the relevant context is already
     // available.
     for (auto *IE : CUNode->getImportedEntities())
-      if (!collectLocalScopedNode(IE->getScope(), IE, CU))
-        constructAndAddImportedEntityDIE(CU, IE);
+      constructAndAddImportedEntityDIE(CU, IE);
   }
 
   // Tell MMI that we have debug info.
@@ -544,11 +532,6 @@
     });
 }
 
-void DwarfDebug::finishLocalScopeDefinitions() {
-  for (const auto &I : CUMap)
-    I.second->finishLocalScopeDefinitions();
-}
-
 // Collect info for variables that were optimized out.
 void DwarfDebug::collectDeadVariables() {
   const Module *M = MMI->getModule();
@@ -574,8 +557,6 @@
 
   finishSubprogramDefinitions();
 
-  finishLocalScopeDefinitions();
-
   finishVariableDefinitions();
 
   // Collect info for variables that were optimized out.
@@ -1186,9 +1167,6 @@
       assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
              && "ensureAbstractVariableIsCreated inserted abstract scopes");
     }
-    // Assure abstract local scope created for each one contains local DIEs.
-    for (const DILocalScope *LS : getLocalScopes(SP))
-      LScopes.getOrCreateAbstractScope(LS);
     constructAbstractSubprogramScopeDIE(AScope);
   }
 
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index 253fa18..f0859ec 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -211,10 +211,6 @@
   /// Size of each symbol emitted (for those symbols that have a specific size).
   DenseMap<const MCSymbol *, uint64_t> SymSize;
 
-  /// Holder for scopes containing local declaration DI nodes per DI function.
-  DenseMap<const DISubprogram *, SmallPtrSet<const DILocalScope *, 16>>
-      LocalScopesMap;
-
   /// Collection of abstract variables.
   DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables;
   SmallVector<std::unique_ptr<DbgVariable>, 64> ConcreteVariables;
@@ -331,8 +327,6 @@
 
   void finishSubprogramDefinitions();
 
-  void finishLocalScopeDefinitions();
-
   /// Finish off debug information after all functions have been
   /// processed.
   void finalizeModuleInfo();
@@ -431,11 +425,6 @@
   void constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
                                         const DIImportedEntity *N);
 
-  /// Collect MD Node located within local scope node.
-  /// Return true if node was collected, false otherwise.
-  bool collectLocalScopedNode(DIScope *S, const DINode *N,
-                              DwarfCompileUnit &CU);
-
   /// Register a source line with debug info. Returns the unique
   /// label that was emitted and which provides correspondence to the
   /// source line list.
@@ -578,12 +567,6 @@
   SmallPtrSet<const MDNode *, 16> &getProcessedSPNodes() {
     return ProcessedSPNodes;
   }
-
-  /// Return collection of function scopes that contains local declararion DIEs.
-  SmallPtrSet<const DILocalScope *, 16> &
-  getLocalScopes(const DISubprogram *SP) {
-    return LocalScopesMap[SP];
-  }
 };
 } // End of namespace llvm
 
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
index b2fe3c0..387921c 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
@@ -298,15 +298,10 @@
                Entry);
 }
 
-DIE *DwarfUnit::createDIE(unsigned Tag, const DINode *N) {
-  DIE *Die = DIE::get(DIEValueAllocator, (dwarf::Tag)Tag);
-  if (N)
-    insertDIE(N, Die);
-  return Die;
-}
-
 DIE &DwarfUnit::createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N) {
-  DIE &Die = Parent.addChild(createDIE(Tag, N));
+  DIE &Die = Parent.addChild(DIE::get(DIEValueAllocator, (dwarf::Tag)Tag));
+  if (N)
+    insertDIE(N, &Die);
   return Die;
 }
 
@@ -732,18 +727,15 @@
 
   // Construct the context before querying for the existence of the DIE in case
   // such construction creates the DIE.
-  // For Local Scope, do not construct context DIE.
   auto *Context = resolve(Ty->getScope());
-  bool IsLocalScope = Context && isa<DILocalScope>(Context);
-  DIE *ContextDIE = IsLocalScope ? nullptr : getOrCreateContextDIE(Context);
-  assert(ContextDIE || IsLocalScope);
+  DIE *ContextDIE = getOrCreateContextDIE(Context);
+  assert(ContextDIE);
 
   if (DIE *TyDIE = getDIE(Ty))
     return TyDIE;
 
-  // Create new type and add to map.
-  DIE &TyDIE = IsLocalScope ? *createDIE(Ty->getTag(), Ty)
-                            : createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
+  // Create new type.
+  DIE &TyDIE = createAndAddDIE(Ty->getTag(), *ContextDIE, Ty);
 
   updateAcceleratorTables(Context, Ty, TyDIE);
 
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
index a72e5a3..a79add6 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
@@ -298,9 +298,6 @@
   /// Construct function argument DIEs.
   void constructSubprogramArguments(DIE &Buffer, DITypeRefArray Args);
 
-  /// Create a DIE with the given Tag, and call insertDIE if MD is not null.
-  DIE *createDIE(unsigned Tag, const DINode *N = nullptr);
-
   /// Create a DIE with the given Tag, add the DIE to its parent, and
   /// call insertDIE if MD is not null.
   DIE &createAndAddDIE(unsigned Tag, DIE &Parent, const DINode *N = nullptr);