diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-04-30 23:40:59 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-04-30 23:40:59 +0000 |
commit | b5b0db911b4a0ec23cc71009c64da392e0ab4e85 (patch) | |
tree | fa809f3e5940333dd3b11f39aa9ebcf9d153bbc0 /lib/CodeGen | |
parent | 3589c24c088b5c31f7bd5c4a2817cefacae6920a (diff) |
LexicalScopes: use unique_ptr to own LexicalScope objects.
Ownership of abstract scopes coming soon.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207724 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/LexicalScopes.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/lib/CodeGen/LexicalScopes.cpp b/lib/CodeGen/LexicalScopes.cpp index f01dec28e52..8a7151dcf1f 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(LexicalScopeMap); DeleteContainerSeconds(AbstractScopeMap); InlinedLexicalScopeMap.clear(); AbstractScopesList.clear(); @@ -124,7 +123,8 @@ LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) { if (IA) return InlinedLexicalScopeMap.lookup(DebugLoc::getFromDILocation(IA)); - return LexicalScopeMap.lookup(Scope); + auto I = LexicalScopeMap.find(Scope); + return I != LexicalScopeMap.end() ? I->second.get() : nullptr; } /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If @@ -152,35 +152,35 @@ LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) { D = DIDescriptor(Scope); } - LexicalScope *WScope = LexicalScopeMap.lookup(Scope); - if (WScope) - return WScope; + auto IterBool = LexicalScopeMap.insert(std::make_pair(Scope, std::unique_ptr<LexicalScope>())); + auto &MapValue = *IterBool.first; + if (!IterBool.second) + return MapValue.second.get(); LexicalScope *Parent = nullptr; if (D.isLexicalBlock()) Parent = getOrCreateLexicalScope(DebugLoc::getFromDILexicalBlock(Scope)); - WScope = new LexicalScope(Parent, DIDescriptor(Scope), nullptr, false); - LexicalScopeMap.insert(std::make_pair(Scope, WScope)); + MapValue.second = make_unique<LexicalScope>(Parent, DIDescriptor(Scope), nullptr, false); if (!Parent && DIDescriptor(Scope).isSubprogram() && DISubprogram(Scope).describes(MF->getFunction())) - CurrentFnLexicalScope = WScope; + CurrentFnLexicalScope = MapValue.second.get(); - return WScope; + return MapValue.second.get(); } /// getOrCreateInlinedScope - Find or create an inlined lexical scope. LexicalScope *LexicalScopes::getOrCreateInlinedScope(MDNode *Scope, MDNode *InlinedAt) { - LexicalScope *InlinedScope = LexicalScopeMap.lookup(InlinedAt); - if (InlinedScope) - return InlinedScope; + auto IterBool = LexicalScopeMap.insert(std::make_pair(InlinedAt, std::unique_ptr<LexicalScope>())); + auto &MapValue = *IterBool.first; + if (!IterBool.second) + return MapValue.second.get(); DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt); - InlinedScope = new LexicalScope(getOrCreateLexicalScope(InlinedLoc), + MapValue.second = make_unique<LexicalScope>(getOrCreateLexicalScope(InlinedLoc), DIDescriptor(Scope), InlinedAt, false); - InlinedLexicalScopeMap[InlinedLoc] = InlinedScope; - LexicalScopeMap[InlinedAt] = InlinedScope; - return InlinedScope; + InlinedLexicalScopeMap[InlinedLoc] = MapValue.second.get(); + return MapValue.second.get(); } /// getOrCreateAbstractScope - Find or create an abstract lexical scope. |