Revert "Try simplifying LexicalScopes ownership again."

Speculatively reverting due to a suspicious failure on a Windows
buildbot.

This reverts commit 10c37a012ea11596d44cd9059fe09c959caf30c8.

llvm-svn: 208131
diff --git a/llvm/lib/CodeGen/LexicalScopes.cpp b/llvm/lib/CodeGen/LexicalScopes.cpp
index 89c9053..f01dec2 100644
--- a/llvm/lib/CodeGen/LexicalScopes.cpp
+++ b/llvm/lib/CodeGen/LexicalScopes.cpp
@@ -26,12 +26,15 @@
 
 #define DEBUG_TYPE "lexicalscopes"
 
+/// ~LexicalScopes - final cleanup after ourselves.
+LexicalScopes::~LexicalScopes() { reset(); }
+
 /// reset - Reset the instance so that it's prepared for another function.
 void LexicalScopes::reset() {
   MF = nullptr;
   CurrentFnLexicalScope = nullptr;
-  LexicalScopeMap.clear();
-  AbstractScopeMap.clear();
+  DeleteContainerSeconds(LexicalScopeMap);
+  DeleteContainerSeconds(AbstractScopeMap);
   InlinedLexicalScopeMap.clear();
   AbstractScopesList.clear();
 }
@@ -121,7 +124,7 @@
 
   if (IA)
     return InlinedLexicalScopeMap.lookup(DebugLoc::getFromDILocation(IA));
-  return findLexicalScope(Scope);
+  return LexicalScopeMap.lookup(Scope);
 }
 
 /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If
@@ -149,40 +152,35 @@
     D = DIDescriptor(Scope);
   }
 
-  auto I = LexicalScopeMap.find(Scope);
-  if (I != LexicalScopeMap.end())
-    return &I->second;
+  LexicalScope *WScope = LexicalScopeMap.lookup(Scope);
+  if (WScope)
+    return WScope;
 
   LexicalScope *Parent = nullptr;
   if (D.isLexicalBlock())
     Parent = getOrCreateLexicalScope(DebugLoc::getFromDILexicalBlock(Scope));
-  I = LexicalScopeMap.emplace(std::piecewise_construct,
-                              std::forward_as_tuple(Scope),
-                              std::forward_as_tuple(Parent, DIDescriptor(Scope),
-                                                    nullptr, false)).first;
-
+  WScope = new LexicalScope(Parent, DIDescriptor(Scope), nullptr, false);
+  LexicalScopeMap.insert(std::make_pair(Scope, WScope));
   if (!Parent && DIDescriptor(Scope).isSubprogram() &&
       DISubprogram(Scope).describes(MF->getFunction()))
-    CurrentFnLexicalScope = &I->second;
+    CurrentFnLexicalScope = WScope;
 
-  return &I->second;
+  return WScope;
 }
 
 /// getOrCreateInlinedScope - Find or create an inlined lexical scope.
 LexicalScope *LexicalScopes::getOrCreateInlinedScope(MDNode *Scope,
                                                      MDNode *InlinedAt) {
-  auto I = LexicalScopeMap.find(InlinedAt);
-  if (I != LexicalScopeMap.end())
-    return &I->second;
+  LexicalScope *InlinedScope = LexicalScopeMap.lookup(InlinedAt);
+  if (InlinedScope)
+    return InlinedScope;
 
   DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt);
-  I = LexicalScopeMap.emplace(std::piecewise_construct,
-                              std::forward_as_tuple(InlinedAt),
-                              std::forward_as_tuple(
-                                  getOrCreateLexicalScope(InlinedLoc),
-                                  DIDescriptor(Scope), InlinedAt, false)).first;
-  InlinedLexicalScopeMap[InlinedLoc] = &I->second;
-  return &I->second;
+  InlinedScope = new LexicalScope(getOrCreateLexicalScope(InlinedLoc),
+                                  DIDescriptor(Scope), InlinedAt, false);
+  InlinedLexicalScopeMap[InlinedLoc] = InlinedScope;
+  LexicalScopeMap[InlinedAt] = InlinedScope;
+  return InlinedScope;
 }
 
 /// getOrCreateAbstractScope - Find or create an abstract lexical scope.
@@ -192,9 +190,9 @@
   DIDescriptor Scope(N);
   if (Scope.isLexicalBlockFile())
     Scope = DILexicalBlockFile(Scope).getScope();
-  auto I = AbstractScopeMap.find(N);
-  if (I != AbstractScopeMap.end())
-    return &I->second;
+  LexicalScope *AScope = AbstractScopeMap.lookup(N);
+  if (AScope)
+    return AScope;
 
   LexicalScope *Parent = nullptr;
   if (Scope.isLexicalBlock()) {
@@ -202,13 +200,11 @@
     DIDescriptor ParentDesc = DB.getContext();
     Parent = getOrCreateAbstractScope(ParentDesc);
   }
-  I = AbstractScopeMap.emplace(std::piecewise_construct,
-                               std::forward_as_tuple(N),
-                               std::forward_as_tuple(Parent, DIDescriptor(N),
-                                                     nullptr, true)).first;
+  AScope = new LexicalScope(Parent, DIDescriptor(N), nullptr, true);
+  AbstractScopeMap[N] = AScope;
   if (DIDescriptor(N).isSubprogram())
-    AbstractScopesList.push_back(&I->second);
-  return &I->second;
+    AbstractScopesList.push_back(AScope);
+  return AScope;
 }
 
 /// constructScopeNest