X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FCodeGen%2FLexicalScopes.cpp;h=b621e3baee513ee37eb8d8343b53e65cbbc55540;hp=8bf69ff630800801ea8e132a52470531036b332b;hb=d661fde97104e060a5f0c62fae8d0e1f8012d0ea;hpb=99ccb1fae75d3d7296c11f1ec4a6eb5e1cbbe4d4 diff --git a/lib/CodeGen/LexicalScopes.cpp b/lib/CodeGen/LexicalScopes.cpp index 8bf69ff6308..b621e3baee5 100644 --- a/lib/CodeGen/LexicalScopes.cpp +++ b/lib/CodeGen/LexicalScopes.cpp @@ -137,6 +137,8 @@ LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) { /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If /// not available then create new lexical scope. LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) { + if (DL.isUnknown()) + return nullptr; MDNode *Scope = nullptr; MDNode *InlinedAt = nullptr; DL.getScopeAndInlinedAt(Scope, InlinedAt, MF->getFunction()->getContext()); @@ -172,9 +174,12 @@ LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) { std::make_tuple(Parent, DIDescriptor(Scope), nullptr, false)).first; - if (!Parent && DIDescriptor(Scope).isSubprogram() && - DISubprogram(Scope).describes(MF->getFunction())) + if (!Parent) { + assert(DIDescriptor(Scope).isSubprogram()); + assert(DISubprogram(Scope).describes(MF->getFunction())); + assert(!CurrentFnLexicalScope); CurrentFnLexicalScope = &I->second; + } return &I->second; } @@ -189,11 +194,10 @@ LexicalScope *LexicalScopes::getOrCreateInlinedScope(MDNode *ScopeNode, LexicalScope *Parent; DILexicalBlock Scope(ScopeNode); - if (Scope.isLexicalBlock()) { - DILexicalBlock PB(Scope.getContext()); - Parent = getOrCreateInlinedScope(PB, InlinedAt); - } else + if (Scope.isSubprogram()) Parent = getOrCreateLexicalScope(DebugLoc::getFromDILocation(InlinedAt)); + else + Parent = getOrCreateInlinedScope(Scope.getContext(), InlinedAt); // FIXME: Use forward_as_tuple instead of make_tuple, once MSVC2012 // compatibility is no longer required. @@ -211,21 +215,21 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) { DIDescriptor Scope(N); if (Scope.isLexicalBlockFile()) Scope = DILexicalBlockFile(Scope).getScope(); - auto I = AbstractScopeMap.find(N); + auto I = AbstractScopeMap.find(Scope); if (I != AbstractScopeMap.end()) return &I->second; LexicalScope *Parent = nullptr; if (Scope.isLexicalBlock()) { - DILexicalBlock DB(N); + DILexicalBlock DB(Scope); 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), + std::forward_as_tuple(Scope), + std::forward_as_tuple(Parent, Scope, nullptr, true)).first; - if (DIDescriptor(N).isSubprogram()) + if (Scope.isSubprogram()) AbstractScopesList.push_back(&I->second); return &I->second; } @@ -286,7 +290,7 @@ void LexicalScopes::assignInstructionRanges( /// have machine instructions that belong to lexical scope identified by /// DebugLoc. void LexicalScopes::getMachineBasicBlocks( - DebugLoc DL, SmallPtrSet &MBBs) { + DebugLoc DL, SmallPtrSetImpl &MBBs) { MBBs.clear(); LexicalScope *Scope = getOrCreateLexicalScope(DL); if (!Scope)