1 //===--- DebugInfo.cpp - Debug Information Helper Classes -----------------===// 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 the helper classes used to build and interpret debug 11 // information in LLVM IR form. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/IR/DebugInfo.h" 16 #include "LLVMContextImpl.h" 17 #include "llvm/ADT/STLExtras.h" 18 #include "llvm/ADT/SmallPtrSet.h" 19 #include "llvm/IR/Constants.h" 20 #include "llvm/IR/DIBuilder.h" 21 #include "llvm/IR/DerivedTypes.h" 22 #include "llvm/IR/GVMaterializer.h" 23 #include "llvm/IR/Instructions.h" 24 #include "llvm/IR/IntrinsicInst.h" 25 #include "llvm/IR/Intrinsics.h" 26 #include "llvm/IR/Module.h" 27 #include "llvm/IR/ValueHandle.h" 28 #include "llvm/Support/Debug.h" 29 #include "llvm/Support/Dwarf.h" 30 #include "llvm/Support/raw_ostream.h" 31 using namespace llvm; 32 using namespace llvm::dwarf; 33 34 DISubprogram *llvm::getDISubprogram(const MDNode *Scope) { 35 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope)) 36 return LocalScope->getSubprogram(); 37 return nullptr; 38 } 39 40 //===----------------------------------------------------------------------===// 41 // DebugInfoFinder implementations. 42 //===----------------------------------------------------------------------===// 43 44 void DebugInfoFinder::reset() { 45 CUs.clear(); 46 SPs.clear(); 47 GVs.clear(); 48 TYs.clear(); 49 Scopes.clear(); 50 NodesSeen.clear(); 51 } 52 53 void DebugInfoFinder::processModule(const Module &M) { 54 for (auto *CU : M.debug_compile_units()) { 55 addCompileUnit(CU); 56 for (auto *DIG : CU->getGlobalVariables()) { 57 if (addGlobalVariable(DIG)) { 58 processScope(DIG->getScope()); 59 processType(DIG->getType().resolve()); 60 } 61 } 62 for (auto *ET : CU->getEnumTypes()) 63 processType(ET); 64 for (auto *RT : CU->getRetainedTypes()) 65 if (auto *T = dyn_cast<DIType>(RT)) 66 processType(T); 67 else 68 processSubprogram(cast<DISubprogram>(RT)); 69 for (auto *Import : CU->getImportedEntities()) { 70 auto *Entity = Import->getEntity().resolve(); 71 if (auto *T = dyn_cast<DIType>(Entity)) 72 processType(T); 73 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) 74 processSubprogram(SP); 75 else if (auto *NS = dyn_cast<DINamespace>(Entity)) 76 processScope(NS->getScope()); 77 else if (auto *M = dyn_cast<DIModule>(Entity)) 78 processScope(M->getScope()); 79 } 80 } 81 for (auto &F : M.functions()) 82 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram())) 83 processSubprogram(SP); 84 } 85 86 void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) { 87 if (!Loc) 88 return; 89 processScope(Loc->getScope()); 90 processLocation(M, Loc->getInlinedAt()); 91 } 92 93 void DebugInfoFinder::processType(DIType *DT) { 94 if (!addType(DT)) 95 return; 96 processScope(DT->getScope().resolve()); 97 if (auto *ST = dyn_cast<DISubroutineType>(DT)) { 98 for (DITypeRef Ref : ST->getTypeArray()) 99 processType(Ref.resolve()); 100 return; 101 } 102 if (auto *DCT = dyn_cast<DICompositeType>(DT)) { 103 processType(DCT->getBaseType().resolve()); 104 for (Metadata *D : DCT->getElements()) { 105 if (auto *T = dyn_cast<DIType>(D)) 106 processType(T); 107 else if (auto *SP = dyn_cast<DISubprogram>(D)) 108 processSubprogram(SP); 109 } 110 return; 111 } 112 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) { 113 processType(DDT->getBaseType().resolve()); 114 } 115 } 116 117 void DebugInfoFinder::processScope(DIScope *Scope) { 118 if (!Scope) 119 return; 120 if (auto *Ty = dyn_cast<DIType>(Scope)) { 121 processType(Ty); 122 return; 123 } 124 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) { 125 addCompileUnit(CU); 126 return; 127 } 128 if (auto *SP = dyn_cast<DISubprogram>(Scope)) { 129 processSubprogram(SP); 130 return; 131 } 132 if (!addScope(Scope)) 133 return; 134 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) { 135 processScope(LB->getScope()); 136 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) { 137 processScope(NS->getScope()); 138 } else if (auto *M = dyn_cast<DIModule>(Scope)) { 139 processScope(M->getScope()); 140 } 141 } 142 143 void DebugInfoFinder::processSubprogram(DISubprogram *SP) { 144 if (!addSubprogram(SP)) 145 return; 146 processScope(SP->getScope().resolve()); 147 processType(SP->getType()); 148 for (auto *Element : SP->getTemplateParams()) { 149 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) { 150 processType(TType->getType().resolve()); 151 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) { 152 processType(TVal->getType().resolve()); 153 } 154 } 155 } 156 157 void DebugInfoFinder::processDeclare(const Module &M, 158 const DbgDeclareInst *DDI) { 159 auto *N = dyn_cast<MDNode>(DDI->getVariable()); 160 if (!N) 161 return; 162 163 auto *DV = dyn_cast<DILocalVariable>(N); 164 if (!DV) 165 return; 166 167 if (!NodesSeen.insert(DV).second) 168 return; 169 processScope(DV->getScope()); 170 processType(DV->getType().resolve()); 171 } 172 173 void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { 174 auto *N = dyn_cast<MDNode>(DVI->getVariable()); 175 if (!N) 176 return; 177 178 auto *DV = dyn_cast<DILocalVariable>(N); 179 if (!DV) 180 return; 181 182 if (!NodesSeen.insert(DV).second) 183 return; 184 processScope(DV->getScope()); 185 processType(DV->getType().resolve()); 186 } 187 188 bool DebugInfoFinder::addType(DIType *DT) { 189 if (!DT) 190 return false; 191 192 if (!NodesSeen.insert(DT).second) 193 return false; 194 195 TYs.push_back(const_cast<DIType *>(DT)); 196 return true; 197 } 198 199 bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) { 200 if (!CU) 201 return false; 202 if (!NodesSeen.insert(CU).second) 203 return false; 204 205 CUs.push_back(CU); 206 return true; 207 } 208 209 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable *DIG) { 210 if (!DIG) 211 return false; 212 213 if (!NodesSeen.insert(DIG).second) 214 return false; 215 216 GVs.push_back(DIG); 217 return true; 218 } 219 220 bool DebugInfoFinder::addSubprogram(DISubprogram *SP) { 221 if (!SP) 222 return false; 223 224 if (!NodesSeen.insert(SP).second) 225 return false; 226 227 SPs.push_back(SP); 228 return true; 229 } 230 231 bool DebugInfoFinder::addScope(DIScope *Scope) { 232 if (!Scope) 233 return false; 234 // FIXME: Ocaml binding generates a scope with no content, we treat it 235 // as null for now. 236 if (Scope->getNumOperands() == 0) 237 return false; 238 if (!NodesSeen.insert(Scope).second) 239 return false; 240 Scopes.push_back(Scope); 241 return true; 242 } 243 244 bool llvm::stripDebugInfo(Function &F) { 245 bool Changed = false; 246 if (F.getSubprogram()) { 247 Changed = true; 248 F.setSubprogram(nullptr); 249 } 250 251 for (BasicBlock &BB : F) { 252 for (auto II = BB.begin(), End = BB.end(); II != End;) { 253 Instruction &I = *II++; // We may delete the instruction, increment now. 254 if (isa<DbgInfoIntrinsic>(&I)) { 255 I.eraseFromParent(); 256 Changed = true; 257 continue; 258 } 259 if (I.getDebugLoc()) { 260 Changed = true; 261 I.setDebugLoc(DebugLoc()); 262 } 263 } 264 } 265 return Changed; 266 } 267 268 bool llvm::StripDebugInfo(Module &M) { 269 bool Changed = false; 270 271 for (Module::named_metadata_iterator NMI = M.named_metadata_begin(), 272 NME = M.named_metadata_end(); NMI != NME;) { 273 NamedMDNode *NMD = &*NMI; 274 ++NMI; 275 276 // We're stripping debug info, and without them, coverage information 277 // doesn't quite make sense. 278 if (NMD->getName().startswith("llvm.dbg.") || 279 NMD->getName() == "llvm.gcov") { 280 NMD->eraseFromParent(); 281 Changed = true; 282 } 283 } 284 285 for (Function &F : M) 286 Changed |= stripDebugInfo(F); 287 288 for (auto &GV : M.globals()) { 289 SmallVector<MDNode *, 1> MDs; 290 GV.getMetadata(LLVMContext::MD_dbg, MDs); 291 if (!MDs.empty()) { 292 GV.eraseMetadata(LLVMContext::MD_dbg); 293 Changed = true; 294 } 295 } 296 297 if (GVMaterializer *Materializer = M.getMaterializer()) 298 Materializer->setStripDebugInfo(); 299 300 return Changed; 301 } 302 303 namespace { 304 305 /// Helper class to downgrade -g metadata to -gline-tables-only metadata. 306 class DebugTypeInfoRemoval { 307 DenseMap<Metadata *, Metadata *> Replacements; 308 309 public: 310 /// The (void)() type. 311 MDNode *EmptySubroutineType; 312 313 private: 314 /// Remember what linkage name we originally had before stripping. If we end 315 /// up making two subprograms identical who originally had different linkage 316 /// names, then we need to make one of them distinct, to avoid them getting 317 /// uniqued. Maps the new node to the old linkage name. 318 DenseMap<DISubprogram *, StringRef> NewToLinkageName; 319 320 // TODO: Remember the distinct subprogram we created for a given linkage name, 321 // so that we can continue to unique whenever possible. Map <newly created 322 // node, old linkage name> to the first (possibly distinct) mdsubprogram 323 // created for that combination. This is not strictly needed for correctness, 324 // but can cut down on the number of MDNodes and let us diff cleanly with the 325 // output of -gline-tables-only. 326 327 public: 328 DebugTypeInfoRemoval(LLVMContext &C) 329 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0, 330 MDNode::get(C, {}))) {} 331 332 Metadata *map(Metadata *M) { 333 if (!M) 334 return nullptr; 335 auto Replacement = Replacements.find(M); 336 if (Replacement != Replacements.end()) 337 return Replacement->second; 338 339 return M; 340 } 341 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); } 342 343 /// Recursively remap N and all its referenced children. Does a DF post-order 344 /// traversal, so as to remap bottoms up. 345 void traverseAndRemap(MDNode *N) { traverse(N); } 346 347 private: 348 // Create a new DISubprogram, to replace the one given. 349 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) { 350 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile())); 351 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : ""; 352 DISubprogram *Declaration = nullptr; 353 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType())); 354 DITypeRef ContainingType(map(MDS->getContainingType())); 355 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit())); 356 auto Variables = nullptr; 357 auto TemplateParams = nullptr; 358 359 // Make a distinct DISubprogram, for situations that warrent it. 360 auto distinctMDSubprogram = [&]() { 361 return DISubprogram::getDistinct( 362 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName, 363 FileAndScope, MDS->getLine(), Type, MDS->isLocalToUnit(), 364 MDS->isDefinition(), MDS->getScopeLine(), ContainingType, 365 MDS->getVirtuality(), MDS->getVirtualIndex(), 366 MDS->getThisAdjustment(), MDS->getFlags(), MDS->isOptimized(), Unit, 367 TemplateParams, Declaration, Variables); 368 }; 369 370 if (MDS->isDistinct()) 371 return distinctMDSubprogram(); 372 373 auto *NewMDS = DISubprogram::get( 374 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName, 375 FileAndScope, MDS->getLine(), Type, MDS->isLocalToUnit(), 376 MDS->isDefinition(), MDS->getScopeLine(), ContainingType, 377 MDS->getVirtuality(), MDS->getVirtualIndex(), MDS->getThisAdjustment(), 378 MDS->getFlags(), MDS->isOptimized(), Unit, TemplateParams, Declaration, 379 Variables); 380 381 StringRef OldLinkageName = MDS->getLinkageName(); 382 383 // See if we need to make a distinct one. 384 auto OrigLinkage = NewToLinkageName.find(NewMDS); 385 if (OrigLinkage != NewToLinkageName.end()) { 386 if (OrigLinkage->second == OldLinkageName) 387 // We're good. 388 return NewMDS; 389 390 // Otherwise, need to make a distinct one. 391 // TODO: Query the map to see if we already have one. 392 return distinctMDSubprogram(); 393 } 394 395 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()}); 396 return NewMDS; 397 } 398 399 /// Create a new compile unit, to replace the one given 400 DICompileUnit *getReplacementCU(DICompileUnit *CU) { 401 // Drop skeleton CUs. 402 if (CU->getDWOId()) 403 return nullptr; 404 405 auto *File = cast_or_null<DIFile>(map(CU->getFile())); 406 MDTuple *EnumTypes = nullptr; 407 MDTuple *RetainedTypes = nullptr; 408 MDTuple *GlobalVariables = nullptr; 409 MDTuple *ImportedEntities = nullptr; 410 return DICompileUnit::getDistinct( 411 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(), 412 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(), 413 CU->getSplitDebugFilename(), DICompileUnit::LineTablesOnly, EnumTypes, 414 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(), 415 CU->getDWOId(), CU->getSplitDebugInlining()); 416 } 417 418 DILocation *getReplacementMDLocation(DILocation *MLD) { 419 auto *Scope = map(MLD->getScope()); 420 auto *InlinedAt = map(MLD->getInlinedAt()); 421 if (MLD->isDistinct()) 422 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(), 423 MLD->getColumn(), Scope, InlinedAt); 424 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(), 425 Scope, InlinedAt); 426 } 427 428 /// Create a new generic MDNode, to replace the one given 429 MDNode *getReplacementMDNode(MDNode *N) { 430 SmallVector<Metadata *, 8> Ops; 431 Ops.reserve(N->getNumOperands()); 432 for (auto &I : N->operands()) 433 if (I) 434 Ops.push_back(map(I)); 435 auto *Ret = MDNode::get(N->getContext(), Ops); 436 return Ret; 437 } 438 439 /// Attempt to re-map N to a newly created node. 440 void remap(MDNode *N) { 441 if (Replacements.count(N)) 442 return; 443 444 auto doRemap = [&](MDNode *N) -> MDNode * { 445 if (!N) 446 return nullptr; 447 if (auto *MDSub = dyn_cast<DISubprogram>(N)) { 448 remap(MDSub->getUnit()); 449 return getReplacementSubprogram(MDSub); 450 } 451 if (isa<DISubroutineType>(N)) 452 return EmptySubroutineType; 453 if (auto *CU = dyn_cast<DICompileUnit>(N)) 454 return getReplacementCU(CU); 455 if (isa<DIFile>(N)) 456 return N; 457 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N)) 458 // Remap to our referenced scope (recursively). 459 return mapNode(MDLB->getScope()); 460 if (auto *MLD = dyn_cast<DILocation>(N)) 461 return getReplacementMDLocation(MLD); 462 463 // Otherwise, if we see these, just drop them now. Not strictly necessary, 464 // but this speeds things up a little. 465 if (isa<DINode>(N)) 466 return nullptr; 467 468 return getReplacementMDNode(N); 469 }; 470 Replacements[N] = doRemap(N); 471 } 472 473 /// Do the remapping traversal. 474 void traverse(MDNode *); 475 }; 476 477 } // Anonymous namespace. 478 479 void DebugTypeInfoRemoval::traverse(MDNode *N) { 480 if (!N || Replacements.count(N)) 481 return; 482 483 // To avoid cycles, as well as for efficiency sake, we will sometimes prune 484 // parts of the graph. 485 auto prune = [](MDNode *Parent, MDNode *Child) { 486 if (auto *MDS = dyn_cast<DISubprogram>(Parent)) 487 return Child == MDS->getVariables().get(); 488 return false; 489 }; 490 491 SmallVector<MDNode *, 16> ToVisit; 492 DenseSet<MDNode *> Opened; 493 494 // Visit each node starting at N in post order, and map them. 495 ToVisit.push_back(N); 496 while (!ToVisit.empty()) { 497 auto *N = ToVisit.back(); 498 if (!Opened.insert(N).second) { 499 // Close it. 500 remap(N); 501 ToVisit.pop_back(); 502 continue; 503 } 504 for (auto &I : N->operands()) 505 if (auto *MDN = dyn_cast_or_null<MDNode>(I)) 506 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) && 507 !isa<DICompileUnit>(MDN)) 508 ToVisit.push_back(MDN); 509 } 510 } 511 512 bool llvm::stripNonLineTableDebugInfo(Module &M) { 513 bool Changed = false; 514 515 // First off, delete the debug intrinsics. 516 auto RemoveUses = [&](StringRef Name) { 517 if (auto *DbgVal = M.getFunction(Name)) { 518 while (!DbgVal->use_empty()) 519 cast<Instruction>(DbgVal->user_back())->eraseFromParent(); 520 DbgVal->eraseFromParent(); 521 Changed = true; 522 } 523 }; 524 RemoveUses("llvm.dbg.declare"); 525 RemoveUses("llvm.dbg.value"); 526 527 // Delete non-CU debug info named metadata nodes. 528 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end(); 529 NMI != NME;) { 530 NamedMDNode *NMD = &*NMI; 531 ++NMI; 532 // Specifically keep dbg.cu around. 533 if (NMD->getName() == "llvm.dbg.cu") 534 continue; 535 } 536 537 // Drop all dbg attachments from global variables. 538 for (auto &GV : M.globals()) 539 GV.eraseMetadata(LLVMContext::MD_dbg); 540 541 DebugTypeInfoRemoval Mapper(M.getContext()); 542 auto remap = [&](llvm::MDNode *Node) -> llvm::MDNode * { 543 if (!Node) 544 return nullptr; 545 Mapper.traverseAndRemap(Node); 546 auto *NewNode = Mapper.mapNode(Node); 547 Changed |= Node != NewNode; 548 Node = NewNode; 549 return NewNode; 550 }; 551 552 // Rewrite the DebugLocs to be equivalent to what 553 // -gline-tables-only would have created. 554 for (auto &F : M) { 555 if (auto *SP = F.getSubprogram()) { 556 Mapper.traverseAndRemap(SP); 557 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP)); 558 Changed |= SP != NewSP; 559 F.setSubprogram(NewSP); 560 } 561 for (auto &BB : F) { 562 for (auto &I : BB) { 563 if (I.getDebugLoc() == DebugLoc()) 564 continue; 565 566 // Make a replacement. 567 auto &DL = I.getDebugLoc(); 568 auto *Scope = DL.getScope(); 569 MDNode *InlinedAt = DL.getInlinedAt(); 570 Scope = remap(Scope); 571 InlinedAt = remap(InlinedAt); 572 I.setDebugLoc( 573 DebugLoc::get(DL.getLine(), DL.getCol(), Scope, InlinedAt)); 574 } 575 } 576 } 577 578 // Create a new llvm.dbg.cu, which is equivalent to the one 579 // -gline-tables-only would have created. 580 for (auto &NMD : M.getNamedMDList()) { 581 SmallVector<MDNode *, 8> Ops; 582 for (MDNode *Op : NMD.operands()) 583 Ops.push_back(remap(Op)); 584 585 if (!Changed) 586 continue; 587 588 NMD.clearOperands(); 589 for (auto *Op : Ops) 590 if (Op) 591 NMD.addOperand(Op); 592 } 593 return Changed; 594 } 595 596 unsigned llvm::getDebugMetadataVersionFromModule(const Module &M) { 597 if (auto *Val = mdconst::dyn_extract_or_null<ConstantInt>( 598 M.getModuleFlag("Debug Info Version"))) 599 return Val->getZExtValue(); 600 return 0; 601 } 602