LexicalScopes: Use unique_ptr to manage ownership of abstract LexicalScopes.
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 30 Apr 2014 23:46:27 +0000 (23:46 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 30 Apr 2014 23:46:27 +0000 (23:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207726 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LexicalScopes.h
lib/CodeGen/LexicalScopes.cpp

index 8ce280e35abb5e879c408e2284de9ea7a1021c31..f5561a1b120b358653dda8842afba5458c34bb66 100644 (file)
@@ -90,7 +90,8 @@ public:
 
   /// findAbstractScope - Find an abstract scope or return NULL.
   LexicalScope *findAbstractScope(const MDNode *N) {
-    return AbstractScopeMap.lookup(N);
+    auto I = AbstractScopeMap.find(N);
+    return I != AbstractScopeMap.end() ? I->second.get() : nullptr;
   }
 
   /// findInlinedScope - Find an inlined scope for the given DebugLoc or return
@@ -144,7 +145,7 @@ private:
 
   /// AbstractScopeMap - These scopes are  not included LexicalScopeMap.
   /// AbstractScopes owns its LexicalScope*s.
-  DenseMap<const MDNode *, LexicalScope *> AbstractScopeMap;
+  DenseMap<const MDNode *, std::unique_ptr<LexicalScope>> AbstractScopeMap;
 
   /// AbstractScopesList - Tracks abstract scopes constructed while processing
   /// a function.
index cdc2cb2cc56c2cc03a77c8e114dde001f771cad0..d4f3b70995bb55969e2f1ef23b842b97a356514c 100644 (file)
@@ -33,7 +33,6 @@ LexicalScopes::~LexicalScopes() { reset(); }
 void LexicalScopes::reset() {
   MF = nullptr;
   CurrentFnLexicalScope = nullptr;
-  DeleteContainerSeconds(AbstractScopeMap);
   InlinedLexicalScopeMap.clear();
   AbstractScopesList.clear();
 }
@@ -194,9 +193,11 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) {
   DIDescriptor Scope(N);
   if (Scope.isLexicalBlockFile())
     Scope = DILexicalBlockFile(Scope).getScope();
-  LexicalScope *AScope = AbstractScopeMap.lookup(N);
-  if (AScope)
-    return AScope;
+  auto IterBool = AbstractScopeMap.insert(
+      std::make_pair(N, std::unique_ptr<LexicalScope>()));
+  auto &MapEntry = *IterBool.first;
+  if (!IterBool.second)
+    return MapEntry.second.get();
 
   LexicalScope *Parent = nullptr;
   if (Scope.isLexicalBlock()) {
@@ -204,11 +205,11 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) {
     DIDescriptor ParentDesc = DB.getContext();
     Parent = getOrCreateAbstractScope(ParentDesc);
   }
-  AScope = new LexicalScope(Parent, DIDescriptor(N), nullptr, true);
-  AbstractScopeMap[N] = AScope;
+  MapEntry.second =
+      make_unique<LexicalScope>(Parent, DIDescriptor(N), nullptr, true);
   if (DIDescriptor(N).isSubprogram())
-    AbstractScopesList.push_back(AScope);
-  return AScope;
+    AbstractScopesList.push_back(MapEntry.second.get());
+  return MapEntry.second.get();
 }
 
 /// constructScopeNest