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 const MDLocation *PrevDL = nullptr; 63 for (const auto &MInsn : MBB) { 64 // Check if instruction has valid location information. 65 const MDLocation *MIDL = MInsn.getDebugLoc(); 66 if (!MIDL) { 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) { 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(const MDLocation *DL) { 110 MDLocalScope *Scope = DL->getScope(); 111 if (!Scope) 112 return nullptr; 113 114 // The scope that we were created with could have an extra file - which 115 // isn't what we care about in this case. 116 if (auto *File = dyn_cast<MDLexicalBlockFile>(Scope)) 117 Scope = File->getScope(); 118 119 if (auto *IA = DL->getInlinedAt()) { 120 auto I = InlinedLexicalScopeMap.find(std::make_pair(Scope, IA)); 121 return I != InlinedLexicalScopeMap.end() ? &I->second : nullptr; 122 } 123 return findLexicalScope(Scope); 124 } 125 126 /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If 127 /// not available then create new lexical scope. 128 LexicalScope *LexicalScopes::getOrCreateLexicalScope(const MDLocalScope *Scope, 129 const MDLocation *IA) { 130 if (IA) { 131 // Create an abstract scope for inlined function. 132 getOrCreateAbstractScope(Scope); 133 // Create an inlined scope for inlined function. 134 return getOrCreateInlinedScope(Scope, IA); 135 } 136 137 return getOrCreateRegularScope(Scope); 138 } 139 140 /// getOrCreateRegularScope - Find or create a regular lexical scope. 141 LexicalScope * 142 LexicalScopes::getOrCreateRegularScope(const MDLocalScope *Scope) { 143 if (auto *File = dyn_cast<MDLexicalBlockFile>(Scope)) 144 Scope = File->getScope(); 145 146 auto I = LexicalScopeMap.find(Scope); 147 if (I != LexicalScopeMap.end()) 148 return &I->second; 149 150 // FIXME: Should the following dyn_cast be MDLexicalBlock? 151 LexicalScope *Parent = nullptr; 152 if (auto *Block = dyn_cast<MDLexicalBlockBase>(Scope)) 153 Parent = getOrCreateLexicalScope(Block->getScope()); 154 I = LexicalScopeMap.emplace(std::piecewise_construct, 155 std::forward_as_tuple(Scope), 156 std::forward_as_tuple(Parent, Scope, nullptr, 157 false)).first; 158 159 if (!Parent) { 160 assert( 161 DISubprogram(cast<MDSubprogram>(Scope)).describes(MF->getFunction())); 162 assert(!CurrentFnLexicalScope); 163 CurrentFnLexicalScope = &I->second; 164 } 165 166 return &I->second; 167 } 168 169 /// getOrCreateInlinedScope - Find or create an inlined lexical scope. 170 LexicalScope * 171 LexicalScopes::getOrCreateInlinedScope(const MDLocalScope *Scope, 172 const MDLocation *InlinedAt) { 173 std::pair<const MDLocalScope *, const MDLocation *> P(Scope, InlinedAt); 174 auto I = InlinedLexicalScopeMap.find(P); 175 if (I != InlinedLexicalScopeMap.end()) 176 return &I->second; 177 178 LexicalScope *Parent; 179 if (auto *Block = dyn_cast<MDLexicalBlockBase>(Scope)) 180 Parent = getOrCreateInlinedScope(Block->getScope(), InlinedAt); 181 else 182 Parent = getOrCreateLexicalScope(InlinedAt); 183 184 I = InlinedLexicalScopeMap.emplace(std::piecewise_construct, 185 std::forward_as_tuple(P), 186 std::forward_as_tuple(Parent, Scope, 187 InlinedAt, false)) 188 .first; 189 return &I->second; 190 } 191 192 /// getOrCreateAbstractScope - Find or create an abstract lexical scope. 193 LexicalScope * 194 LexicalScopes::getOrCreateAbstractScope(const MDLocalScope *Scope) { 195 assert(Scope && "Invalid Scope encoding!"); 196 197 if (auto *File = dyn_cast<MDLexicalBlockFile>(Scope)) 198 Scope = File->getScope(); 199 auto I = AbstractScopeMap.find(Scope); 200 if (I != AbstractScopeMap.end()) 201 return &I->second; 202 203 // FIXME: Should the following isa be MDLexicalBlock? 204 LexicalScope *Parent = nullptr; 205 if (auto *Block = dyn_cast<MDLexicalBlockBase>(Scope)) 206 Parent = getOrCreateAbstractScope(Block->getScope()); 207 208 I = AbstractScopeMap.emplace(std::piecewise_construct, 209 std::forward_as_tuple(Scope), 210 std::forward_as_tuple(Parent, Scope, 211 nullptr, true)).first; 212 if (isa<MDSubprogram>(Scope)) 213 AbstractScopesList.push_back(&I->second); 214 return &I->second; 215 } 216 217 /// constructScopeNest 218 void LexicalScopes::constructScopeNest(LexicalScope *Scope) { 219 assert(Scope && "Unable to calculate scope dominance graph!"); 220 SmallVector<LexicalScope *, 4> WorkStack; 221 WorkStack.push_back(Scope); 222 unsigned Counter = 0; 223 while (!WorkStack.empty()) { 224 LexicalScope *WS = WorkStack.back(); 225 const SmallVectorImpl<LexicalScope *> &Children = WS->getChildren(); 226 bool visitedChildren = false; 227 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(), 228 SE = Children.end(); 229 SI != SE; ++SI) { 230 LexicalScope *ChildScope = *SI; 231 if (!ChildScope->getDFSOut()) { 232 WorkStack.push_back(ChildScope); 233 visitedChildren = true; 234 ChildScope->setDFSIn(++Counter); 235 break; 236 } 237 } 238 if (!visitedChildren) { 239 WorkStack.pop_back(); 240 WS->setDFSOut(++Counter); 241 } 242 } 243 } 244 245 /// assignInstructionRanges - Find ranges of instructions covered by each 246 /// lexical scope. 247 void LexicalScopes::assignInstructionRanges( 248 SmallVectorImpl<InsnRange> &MIRanges, 249 DenseMap<const MachineInstr *, LexicalScope *> &MI2ScopeMap) { 250 251 LexicalScope *PrevLexicalScope = nullptr; 252 for (SmallVectorImpl<InsnRange>::const_iterator RI = MIRanges.begin(), 253 RE = MIRanges.end(); 254 RI != RE; ++RI) { 255 const InsnRange &R = *RI; 256 LexicalScope *S = MI2ScopeMap.lookup(R.first); 257 assert(S && "Lost LexicalScope for a machine instruction!"); 258 if (PrevLexicalScope && !PrevLexicalScope->dominates(S)) 259 PrevLexicalScope->closeInsnRange(S); 260 S->openInsnRange(R.first); 261 S->extendInsnRange(R.second); 262 PrevLexicalScope = S; 263 } 264 265 if (PrevLexicalScope) 266 PrevLexicalScope->closeInsnRange(); 267 } 268 269 /// getMachineBasicBlocks - Populate given set using machine basic blocks which 270 /// have machine instructions that belong to lexical scope identified by 271 /// DebugLoc. 272 void LexicalScopes::getMachineBasicBlocks( 273 const MDLocation *DL, SmallPtrSetImpl<const MachineBasicBlock *> &MBBs) { 274 MBBs.clear(); 275 LexicalScope *Scope = getOrCreateLexicalScope(DL); 276 if (!Scope) 277 return; 278 279 if (Scope == CurrentFnLexicalScope) { 280 for (const auto &MBB : *MF) 281 MBBs.insert(&MBB); 282 return; 283 } 284 285 SmallVectorImpl<InsnRange> &InsnRanges = Scope->getRanges(); 286 for (SmallVectorImpl<InsnRange>::iterator I = InsnRanges.begin(), 287 E = InsnRanges.end(); 288 I != E; ++I) { 289 InsnRange &R = *I; 290 MBBs.insert(R.first->getParent()); 291 } 292 } 293 294 /// dominates - Return true if DebugLoc's lexical scope dominates at least one 295 /// machine instruction's lexical scope in a given machine basic block. 296 bool LexicalScopes::dominates(const MDLocation *DL, MachineBasicBlock *MBB) { 297 LexicalScope *Scope = getOrCreateLexicalScope(DL); 298 if (!Scope) 299 return false; 300 301 // Current function scope covers all basic blocks in the function. 302 if (Scope == CurrentFnLexicalScope && MBB->getParent() == MF) 303 return true; 304 305 bool Result = false; 306 for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E; 307 ++I) { 308 if (const MDLocation *IDL = I->getDebugLoc()) 309 if (LexicalScope *IScope = getOrCreateLexicalScope(IDL)) 310 if (Scope->dominates(IScope)) 311 return true; 312 } 313 return Result; 314 } 315 316 /// dump - Print data structures. 317 void LexicalScope::dump(unsigned Indent) const { 318 #ifndef NDEBUG 319 raw_ostream &err = dbgs(); 320 err.indent(Indent); 321 err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n"; 322 const MDNode *N = Desc; 323 err.indent(Indent); 324 N->dump(); 325 if (AbstractScope) 326 err << std::string(Indent, ' ') << "Abstract Scope\n"; 327 328 if (!Children.empty()) 329 err << std::string(Indent + 2, ' ') << "Children ...\n"; 330 for (unsigned i = 0, e = Children.size(); i != e; ++i) 331 if (Children[i] != this) 332 Children[i]->dump(Indent + 2); 333 #endif 334 } 335