From ccad744d4a09d2435c66212ddff6ef52deef72d2 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 6 May 2014 21:07:17 +0000 Subject: [PATCH] Revert "Try simplifying LexicalScopes ownership again." Speculatively reverting due to a suspicious failure on a Windows buildbot. This reverts commit 10c37a012ea11596d44cd9059fe09c959caf30c8. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208131 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/LexicalScopes.h | 205 +++++++++++++-------------- lib/CodeGen/LexicalScopes.cpp | 60 ++++---- 2 files changed, 130 insertions(+), 135 deletions(-) diff --git a/include/llvm/CodeGen/LexicalScopes.h b/include/llvm/CodeGen/LexicalScopes.h index 31d40ff588c..d6468bd75c2 100644 --- a/include/llvm/CodeGen/LexicalScopes.h +++ b/include/llvm/CodeGen/LexicalScopes.h @@ -25,12 +25,12 @@ #include "llvm/IR/Metadata.h" #include "llvm/IR/ValueHandle.h" #include -#include namespace llvm { class MachineInstr; class MachineBasicBlock; class MachineFunction; +class LexicalScope; //===----------------------------------------------------------------------===// /// InsnRange - This is used to track range of instructions with identical @@ -38,97 +38,6 @@ class MachineFunction; /// typedef std::pair InsnRange; -//===----------------------------------------------------------------------===// -/// LexicalScope - This class is used to track scope information. -/// -class LexicalScope { - -public: - LexicalScope(LexicalScope *P, const MDNode *D, const MDNode *I, bool A) - : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(A), - LastInsn(nullptr), FirstInsn(nullptr), DFSIn(0), DFSOut(0) { - if (Parent) - Parent->addChild(this); - } - - // Accessors. - LexicalScope *getParent() const { return Parent; } - const MDNode *getDesc() const { return Desc; } - const MDNode *getInlinedAt() const { return InlinedAtLocation; } - const MDNode *getScopeNode() const { return Desc; } - bool isAbstractScope() const { return AbstractScope; } - SmallVectorImpl &getChildren() { return Children; } - SmallVectorImpl &getRanges() { return Ranges; } - - /// addChild - Add a child scope. - void addChild(LexicalScope *S) { Children.push_back(S); } - - /// openInsnRange - This scope covers instruction range starting from MI. - void openInsnRange(const MachineInstr *MI) { - if (!FirstInsn) - FirstInsn = MI; - - if (Parent) - Parent->openInsnRange(MI); - } - - /// extendInsnRange - Extend the current instruction range covered by - /// this scope. - void extendInsnRange(const MachineInstr *MI) { - assert(FirstInsn && "MI Range is not open!"); - LastInsn = MI; - if (Parent) - Parent->extendInsnRange(MI); - } - - /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected - /// until now. This is used when a new scope is encountered while walking - /// machine instructions. - void closeInsnRange(LexicalScope *NewScope = nullptr) { - assert(LastInsn && "Last insn missing!"); - Ranges.push_back(InsnRange(FirstInsn, LastInsn)); - FirstInsn = nullptr; - LastInsn = nullptr; - // If Parent dominates NewScope then do not close Parent's instruction - // range. - if (Parent && (!NewScope || !Parent->dominates(NewScope))) - Parent->closeInsnRange(NewScope); - } - - /// dominates - Return true if current scope dominates given lexical scope. - bool dominates(const LexicalScope *S) const { - if (S == this) - return true; - if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut()) - return true; - return false; - } - - // Depth First Search support to walk and manipulate LexicalScope hierarchy. - unsigned getDFSOut() const { return DFSOut; } - void setDFSOut(unsigned O) { DFSOut = O; } - unsigned getDFSIn() const { return DFSIn; } - void setDFSIn(unsigned I) { DFSIn = I; } - - /// dump - print lexical scope. - void dump(unsigned Indent = 0) const; - -private: - LexicalScope *Parent; // Parent to this scope. - AssertingVH Desc; // Debug info descriptor. - AssertingVH InlinedAtLocation; // Location at which this - // scope is inlined. - bool AbstractScope; // Abstract Scope - SmallVector Children; // Scopes defined in scope. - // Contents not owned. - SmallVector Ranges; - - const MachineInstr *LastInsn; // Last instruction of this scope. - const MachineInstr *FirstInsn; // First instruction of this scope. - unsigned DFSIn, DFSOut; // In & Out Depth use to determine - // scope nesting. -}; - //===----------------------------------------------------------------------===// /// LexicalScopes - This class provides interface to collect and use lexical /// scoping information from machine instruction. @@ -136,6 +45,7 @@ private: class LexicalScopes { public: LexicalScopes() : MF(nullptr), CurrentFnLexicalScope(nullptr) {} + ~LexicalScopes(); /// initialize - Scan machine function and constuct lexical scope nest, resets /// the instance if necessary. @@ -177,10 +87,9 @@ public: return AbstractScopesList; } - /// findAbstractScope - Find an abstract scope or return null. + /// findAbstractScope - Find an abstract scope or return NULL. LexicalScope *findAbstractScope(const MDNode *N) { - auto I = AbstractScopeMap.find(N); - return I != AbstractScopeMap.end() ? &I->second : nullptr; + return AbstractScopeMap.lookup(N); } /// findInlinedScope - Find an inlined scope for the given DebugLoc or return @@ -189,10 +98,9 @@ public: return InlinedLexicalScopeMap.lookup(DL); } - /// findLexicalScope - Find regular lexical scope or return null. + /// findLexicalScope - Find regular lexical scope or return NULL. LexicalScope *findLexicalScope(const MDNode *N) { - auto I = LexicalScopeMap.find(N); - return I != LexicalScopeMap.end() ? &I->second : nullptr; + return LexicalScopeMap.lookup(N); } /// dump - Print data structures to dbgs(). @@ -224,17 +132,17 @@ private: private: const MachineFunction *MF; - /// LexicalScopeMap - Tracks the scopes in the current function. - // Use an unordered_map to ensure value pointer validity over insertion. - std::unordered_map LexicalScopeMap; + /// LexicalScopeMap - Tracks the scopes in the current function. Owns the + /// contained LexicalScope*s. + DenseMap LexicalScopeMap; /// InlinedLexicalScopeMap - Tracks inlined function scopes in current /// function. DenseMap InlinedLexicalScopeMap; /// AbstractScopeMap - These scopes are not included LexicalScopeMap. - // Use an unordered_map to ensure value pointer validity over insertion. - std::unordered_map AbstractScopeMap; + /// AbstractScopes owns its LexicalScope*s. + DenseMap AbstractScopeMap; /// AbstractScopesList - Tracks abstract scopes constructed while processing /// a function. @@ -245,6 +153,97 @@ private: LexicalScope *CurrentFnLexicalScope; }; +//===----------------------------------------------------------------------===// +/// LexicalScope - This class is used to track scope information. +/// +class LexicalScope { + +public: + LexicalScope(LexicalScope *P, const MDNode *D, const MDNode *I, bool A) + : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(A), + LastInsn(nullptr), FirstInsn(nullptr), DFSIn(0), DFSOut(0) { + if (Parent) + Parent->addChild(this); + } + + // Accessors. + LexicalScope *getParent() const { return Parent; } + const MDNode *getDesc() const { return Desc; } + const MDNode *getInlinedAt() const { return InlinedAtLocation; } + const MDNode *getScopeNode() const { return Desc; } + bool isAbstractScope() const { return AbstractScope; } + SmallVectorImpl &getChildren() { return Children; } + SmallVectorImpl &getRanges() { return Ranges; } + + /// addChild - Add a child scope. + void addChild(LexicalScope *S) { Children.push_back(S); } + + /// openInsnRange - This scope covers instruction range starting from MI. + void openInsnRange(const MachineInstr *MI) { + if (!FirstInsn) + FirstInsn = MI; + + if (Parent) + Parent->openInsnRange(MI); + } + + /// extendInsnRange - Extend the current instruction range covered by + /// this scope. + void extendInsnRange(const MachineInstr *MI) { + assert(FirstInsn && "MI Range is not open!"); + LastInsn = MI; + if (Parent) + Parent->extendInsnRange(MI); + } + + /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected + /// until now. This is used when a new scope is encountered while walking + /// machine instructions. + void closeInsnRange(LexicalScope *NewScope = nullptr) { + assert(LastInsn && "Last insn missing!"); + Ranges.push_back(InsnRange(FirstInsn, LastInsn)); + FirstInsn = nullptr; + LastInsn = nullptr; + // If Parent dominates NewScope then do not close Parent's instruction + // range. + if (Parent && (!NewScope || !Parent->dominates(NewScope))) + Parent->closeInsnRange(NewScope); + } + + /// dominates - Return true if current scope dominates given lexical scope. + bool dominates(const LexicalScope *S) const { + if (S == this) + return true; + if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut()) + return true; + return false; + } + + // Depth First Search support to walk and manipulate LexicalScope hierarchy. + unsigned getDFSOut() const { return DFSOut; } + void setDFSOut(unsigned O) { DFSOut = O; } + unsigned getDFSIn() const { return DFSIn; } + void setDFSIn(unsigned I) { DFSIn = I; } + + /// dump - print lexical scope. + void dump(unsigned Indent = 0) const; + +private: + LexicalScope *Parent; // Parent to this scope. + AssertingVH Desc; // Debug info descriptor. + AssertingVH InlinedAtLocation; // Location at which this + // scope is inlined. + bool AbstractScope; // Abstract Scope + SmallVector Children; // Scopes defined in scope. + // Contents not owned. + SmallVector Ranges; + + const MachineInstr *LastInsn; // Last instruction of this scope. + const MachineInstr *FirstInsn; // First instruction of this scope. + unsigned DFSIn, DFSOut; // In & Out Depth use to determine + // scope nesting. +}; + } // end llvm namespace #endif diff --git a/lib/CodeGen/LexicalScopes.cpp b/lib/CodeGen/LexicalScopes.cpp index 89c90539f4a..f01dec28e52 100644 --- a/lib/CodeGen/LexicalScopes.cpp +++ b/lib/CodeGen/LexicalScopes.cpp @@ -26,12 +26,15 @@ using namespace llvm; #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 @@ LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) { 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 @@ LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) { 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 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) { 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 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) { 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 -- 2.34.1