1 //===- LexicalScopes.cpp - Collecting lexical scope info ------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements LexicalScopes analysis. 11 // 12 // This pass collects lexical scope information and maps machine instructions 13 // to respective lexical scopes. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #include "llvm/CodeGen/LexicalScopes.h" 18 #include "llvm/CodeGen/MachineFunction.h" 19 #include "llvm/CodeGen/MachineInstr.h" 20 #include "llvm/IR/DebugInfo.h" 21 #include "llvm/IR/Function.h" 22 #include "llvm/Support/Debug.h" 23 #include "llvm/Support/ErrorHandling.h" 24 #include "llvm/Support/FormattedStream.h" 25 using namespace llvm; 26 27 #define DEBUG_TYPE "lexicalscopes" 28 29 /// reset - Reset the instance so that it's prepared for another function. 30 void LexicalScopes::reset() { 31 MF = nullptr; 32 CurrentFnLexicalScope = nullptr; 33 LexicalScopeMap.clear(); 34 AbstractScopeMap.clear(); 35 InlinedLexicalScopeMap.clear(); 36 AbstractScopesList.clear(); 37 } 38 39 /// initialize - Scan machine function and constuct lexical scope nest. 40 void LexicalScopes::initialize(const MachineFunction &Fn) { 41 reset(); 42 MF = &Fn; 43 SmallVector<InsnRange, 4> MIRanges; 44 DenseMap<const MachineInstr *, LexicalScope *> MI2ScopeMap; 45 extractLexicalScopes(MIRanges, MI2ScopeMap); 46 if (CurrentFnLexicalScope) { 47 constructScopeNest(CurrentFnLexicalScope); 48 assignInstructionRanges(MIRanges, MI2ScopeMap); 49 } 50 } 51 52 /// extractLexicalScopes - Extract instruction ranges for each lexical scopes 53 /// for the given machine function. 54 void LexicalScopes::extractLexicalScopes( 55 SmallVectorImpl<InsnRange> &MIRanges, 56 DenseMap<const MachineInstr *, LexicalScope *> &MI2ScopeMap) { 57 58 // Scan each instruction and create scopes. First build working set of scopes. 59 for (const auto &MBB : *MF) { 60 const MachineInstr *RangeBeginMI = nullptr; 61 const MachineInstr *PrevMI = nullptr; 62 DebugLoc PrevDL; 63 for (const auto &MInsn : MBB) { 64 // Check if instruction has valid location information. 65 const DebugLoc MIDL = MInsn.getDebugLoc(); 66 if (MIDL.isUnknown()) { 67 PrevMI = &MInsn; 68 continue; 69 } 70 71 // If scope has not changed then skip this instruction. 72 if (MIDL == PrevDL) { 73 PrevMI = &MInsn; 74 continue; 75 } 76 77 // Ignore DBG_VALUE. It does not contribute to any instruction in output. 78 if (MInsn.isDebugValue()) 79 continue; 80 81 if (RangeBeginMI) { 82 // If we have already seen a beginning of an instruction range and 83 // current instruction scope does not match scope of first instruction 84 // in this range then create a new instruction range. 85 InsnRange R(RangeBeginMI, PrevMI); 86 MI2ScopeMap[RangeBeginMI] = getOrCreateLexicalScope(PrevDL); 87 MIRanges.push_back(R); 88 } 89 90 // This is a beginning of a new instruction range. 91 RangeBeginMI = &MInsn; 92 93 // Reset previous markers. 94 PrevMI = &MInsn; 95 PrevDL = MIDL; 96 } 97 98 // Create last instruction range. 99 if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) { 100 InsnRange R(RangeBeginMI, PrevMI); 101 MIRanges.push_back(R); 102 MI2ScopeMap[RangeBeginMI] = getOrCreateLexicalScope(PrevDL); 103 } 104 } 105 } 106 107 /// findLexicalScope - Find lexical scope, either regular or inlined, for the 108 /// given DebugLoc. Return NULL if not found. 109 LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) { 110 MDNode *Scope = nullptr; 111 MDNode *IA = nullptr; 112 DL.getScopeAndInlinedAt(Scope, IA, MF->getFunction()->getContext()); 113 if (!Scope) 114 return nullptr; 115 116 // The scope that we were created with could have an extra file - which 117 // isn't what we care about in this case. 118 DIDescriptor D = DIDescriptor(Scope); 119 if (D.isLexicalBlockFile()) 120 Scope = DILexicalBlockFile(Scope).getScope(); 121 122 if (IA) { 123 auto I = InlinedLexicalScopeMap.find(std::make_pair(Scope, IA)); 124 return I != InlinedLexicalScopeMap.end() ? &I->second : nullptr; 125 } 126 return findLexicalScope(Scope); 127 } 128 129 /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If 130 /// not available then create new lexical scope. 131 LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) { 132 if (DL.isUnknown()) 133 return nullptr; 134 MDNode *Scope = nullptr; 135 MDNode *InlinedAt = nullptr; 136 DL.getScopeAndInlinedAt(Scope, InlinedAt, MF->getFunction()->getContext()); 137 138 if (InlinedAt) { 139 // Create an abstract scope for inlined function. 140 getOrCreateAbstractScope(Scope); 141 // Create an inlined scope for inlined function. 142 return getOrCreateInlinedScope(Scope, InlinedAt); 143 } 144 145 return getOrCreateRegularScope(Scope); 146 } 147 148 /// getOrCreateRegularScope - Find or create a regular lexical scope. 149 LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) { 150 DIDescriptor D = DIDescriptor(Scope); 151 if (D.isLexicalBlockFile()) { 152 Scope = DILexicalBlockFile(Scope).getScope(); 153 D = DIDescriptor(Scope); 154 } 155 156 auto I = LexicalScopeMap.find(Scope); 157 if (I != LexicalScopeMap.end()) 158 return &I->second; 159 160 LexicalScope *Parent = nullptr; 161 if (D.isLexicalBlock()) 162 Parent = getOrCreateLexicalScope(DebugLoc::getFromDILexicalBlock(Scope)); 163 I = LexicalScopeMap.emplace(std::piecewise_construct, 164 std::forward_as_tuple(Scope), 165 std::forward_as_tuple(Parent, DIDescriptor(Scope), 166 nullptr, false)).first; 167 168 if (!Parent) { 169 assert(DIDescriptor(Scope).isSubprogram()); 170 assert(DISubprogram(Scope).describes(MF->getFunction())); 171 assert(!CurrentFnLexicalScope); 172 CurrentFnLexicalScope = &I->second; 173 } 174 175 return &I->second; 176 } 177 178 /// getOrCreateInlinedScope - Find or create an inlined lexical scope. 179 LexicalScope *LexicalScopes::getOrCreateInlinedScope(MDNode *ScopeNode, 180 MDNode *InlinedAt) { 181 std::pair<const MDNode*, const MDNode*> P(ScopeNode, InlinedAt); 182 auto I = InlinedLexicalScopeMap.find(P); 183 if (I != InlinedLexicalScopeMap.end()) 184 return &I->second; 185 186 LexicalScope *Parent; 187 DILexicalBlock Scope(ScopeNode); 188 if (Scope.isSubprogram()) 189 Parent = getOrCreateLexicalScope(DebugLoc::getFromDILocation(InlinedAt)); 190 else 191 Parent = getOrCreateInlinedScope(Scope.getContext(), InlinedAt); 192 193 I = InlinedLexicalScopeMap.emplace(std::piecewise_construct, 194 std::forward_as_tuple(P), 195 std::forward_as_tuple(Parent, Scope, 196 InlinedAt, false)) 197 .first; 198 return &I->second; 199 } 200 201 /// getOrCreateAbstractScope - Find or create an abstract lexical scope. 202 LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) { 203 assert(N && "Invalid Scope encoding!"); 204 205 DIDescriptor Scope(N); 206 if (Scope.isLexicalBlockFile()) 207 Scope = DILexicalBlockFile(Scope).getScope(); 208 auto I = AbstractScopeMap.find(Scope); 209 if (I != AbstractScopeMap.end()) 210 return &I->second; 211 212 LexicalScope *Parent = nullptr; 213 if (Scope.isLexicalBlock()) { 214 DILexicalBlock DB(Scope); 215 DIDescriptor ParentDesc = DB.getContext(); 216 Parent = getOrCreateAbstractScope(ParentDesc); 217 } 218 I = AbstractScopeMap.emplace(std::piecewise_construct, 219 std::forward_as_tuple(Scope), 220 std::forward_as_tuple(Parent, Scope, 221 nullptr, true)).first; 222 if (Scope.isSubprogram()) 223 AbstractScopesList.push_back(&I->second); 224 return &I->second; 225 } 226 227 /// constructScopeNest 228 void LexicalScopes::constructScopeNest(LexicalScope *Scope) { 229 assert(Scope && "Unable to calculate scope dominance graph!"); 230 SmallVector<LexicalScope *, 4> WorkStack; 231 WorkStack.push_back(Scope); 232 unsigned Counter = 0; 233 while (!WorkStack.empty()) { 234 LexicalScope *WS = WorkStack.back(); 235 const SmallVectorImpl<LexicalScope *> &Children = WS->getChildren(); 236 bool visitedChildren = false; 237 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(), 238 SE = Children.end(); 239 SI != SE; ++SI) { 240 LexicalScope *ChildScope = *SI; 241 if (!ChildScope->getDFSOut()) { 242 WorkStack.push_back(ChildScope); 243 visitedChildren = true; 244 ChildScope->setDFSIn(++Counter); 245 break; 246 } 247 } 248 if (!visitedChildren) { 249 WorkStack.pop_back(); 250 WS->setDFSOut(++Counter); 251 } 252 } 253 } 254 255 /// assignInstructionRanges - Find ranges of instructions covered by each 256 /// lexical scope. 257 void LexicalScopes::assignInstructionRanges( 258 SmallVectorImpl<InsnRange> &MIRanges, 259 DenseMap<const MachineInstr *, LexicalScope *> &MI2ScopeMap) { 260 261 LexicalScope *PrevLexicalScope = nullptr; 262 for (SmallVectorImpl<InsnRange>::const_iterator RI = MIRanges.begin(), 263 RE = MIRanges.end(); 264 RI != RE; ++RI) { 265 const InsnRange &R = *RI; 266 LexicalScope *S = MI2ScopeMap.lookup(R.first); 267 assert(S && "Lost LexicalScope for a machine instruction!"); 268 if (PrevLexicalScope && !PrevLexicalScope->dominates(S)) 269 PrevLexicalScope->closeInsnRange(S); 270 S->openInsnRange(R.first); 271 S->extendInsnRange(R.second); 272 PrevLexicalScope = S; 273 } 274 275 if (PrevLexicalScope) 276 PrevLexicalScope->closeInsnRange(); 277 } 278 279 /// getMachineBasicBlocks - Populate given set using machine basic blocks which 280 /// have machine instructions that belong to lexical scope identified by 281 /// DebugLoc. 282 void LexicalScopes::getMachineBasicBlocks( 283 DebugLoc DL, SmallPtrSetImpl<const MachineBasicBlock *> &MBBs) { 284 MBBs.clear(); 285 LexicalScope *Scope = getOrCreateLexicalScope(DL); 286 if (!Scope) 287 return; 288 289 if (Scope == CurrentFnLexicalScope) { 290 for (const auto &MBB : *MF) 291 MBBs.insert(&MBB); 292 return; 293 } 294 295 SmallVectorImpl<InsnRange> &InsnRanges = Scope->getRanges(); 296 for (SmallVectorImpl<InsnRange>::iterator I = InsnRanges.begin(), 297 E = InsnRanges.end(); 298 I != E; ++I) { 299 InsnRange &R = *I; 300 MBBs.insert(R.first->getParent()); 301 } 302 } 303 304 /// dominates - Return true if DebugLoc's lexical scope dominates at least one 305 /// machine instruction's lexical scope in a given machine basic block. 306 bool LexicalScopes::dominates(DebugLoc DL, MachineBasicBlock *MBB) { 307 LexicalScope *Scope = getOrCreateLexicalScope(DL); 308 if (!Scope) 309 return false; 310 311 // Current function scope covers all basic blocks in the function. 312 if (Scope == CurrentFnLexicalScope && MBB->getParent() == MF) 313 return true; 314 315 bool Result = false; 316 for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E; 317 ++I) { 318 DebugLoc IDL = I->getDebugLoc(); 319 if (IDL.isUnknown()) 320 continue; 321 if (LexicalScope *IScope = getOrCreateLexicalScope(IDL)) 322 if (Scope->dominates(IScope)) 323 return true; 324 } 325 return Result; 326 } 327 328 /// dump - Print data structures. 329 void LexicalScope::dump(unsigned Indent) const { 330 #ifndef NDEBUG 331 raw_ostream &err = dbgs(); 332 err.indent(Indent); 333 err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n"; 334 const MDNode *N = Desc; 335 err.indent(Indent); 336 N->dump(); 337 if (AbstractScope) 338 err << std::string(Indent, ' ') << "Abstract Scope\n"; 339 340 if (!Children.empty()) 341 err << std::string(Indent + 2, ' ') << "Children ...\n"; 342 for (unsigned i = 0, e = Children.size(); i != e; ++i) 343 if (Children[i] != this) 344 Children[i]->dump(Indent + 2); 345 #endif 346 } 347