diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-04-30 23:46:27 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-04-30 23:46:27 +0000 |
commit | 21b719dfcf35a5d139d7eafaab0b3c2c7527ffa7 (patch) | |
tree | 67f4f0d0b33196c71429c9d6f1f22e5c64e5276e | |
parent | d7bee4451b908b060316fc535801d9d98af9e2b4 (diff) | |
download | llvm-21b719dfcf35a5d139d7eafaab0b3c2c7527ffa7.tar.gz llvm-21b719dfcf35a5d139d7eafaab0b3c2c7527ffa7.tar.bz2 llvm-21b719dfcf35a5d139d7eafaab0b3c2c7527ffa7.tar.xz |
LexicalScopes: Use unique_ptr to manage ownership of abstract LexicalScopes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207726 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/LexicalScopes.h | 5 | ||||
-rw-r--r-- | lib/CodeGen/LexicalScopes.cpp | 17 |
2 files changed, 12 insertions, 10 deletions
diff --git a/include/llvm/CodeGen/LexicalScopes.h b/include/llvm/CodeGen/LexicalScopes.h index 8ce280e35a..f5561a1b12 100644 --- a/include/llvm/CodeGen/LexicalScopes.h +++ b/include/llvm/CodeGen/LexicalScopes.h @@ -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. diff --git a/lib/CodeGen/LexicalScopes.cpp b/lib/CodeGen/LexicalScopes.cpp index cdc2cb2cc5..d4f3b70995 100644 --- a/lib/CodeGen/LexicalScopes.cpp +++ b/lib/CodeGen/LexicalScopes.cpp @@ -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 |