1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===// 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 contains support for writing dwarf debug info into asm files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "DwarfDebug.h" 15 #include "ByteStreamer.h" 16 #include "DIEHash.h" 17 #include "DwarfCompileUnit.h" 18 #include "DwarfExpression.h" 19 #include "DwarfUnit.h" 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/Statistic.h" 22 #include "llvm/ADT/StringExtras.h" 23 #include "llvm/ADT/Triple.h" 24 #include "llvm/CodeGen/DIE.h" 25 #include "llvm/CodeGen/MachineFunction.h" 26 #include "llvm/CodeGen/MachineModuleInfo.h" 27 #include "llvm/IR/Constants.h" 28 #include "llvm/IR/DIBuilder.h" 29 #include "llvm/IR/DataLayout.h" 30 #include "llvm/IR/DebugInfo.h" 31 #include "llvm/IR/Instructions.h" 32 #include "llvm/IR/Module.h" 33 #include "llvm/IR/ValueHandle.h" 34 #include "llvm/MC/MCAsmInfo.h" 35 #include "llvm/MC/MCSection.h" 36 #include "llvm/MC/MCStreamer.h" 37 #include "llvm/MC/MCSymbol.h" 38 #include "llvm/Support/CommandLine.h" 39 #include "llvm/Support/Debug.h" 40 #include "llvm/Support/Dwarf.h" 41 #include "llvm/Support/Endian.h" 42 #include "llvm/Support/ErrorHandling.h" 43 #include "llvm/Support/FormattedStream.h" 44 #include "llvm/Support/LEB128.h" 45 #include "llvm/Support/MD5.h" 46 #include "llvm/Support/Path.h" 47 #include "llvm/Support/Timer.h" 48 #include "llvm/Target/TargetFrameLowering.h" 49 #include "llvm/Target/TargetLoweringObjectFile.h" 50 #include "llvm/Target/TargetMachine.h" 51 #include "llvm/Target/TargetOptions.h" 52 #include "llvm/Target/TargetRegisterInfo.h" 53 #include "llvm/Target/TargetSubtargetInfo.h" 54 using namespace llvm; 55 56 #define DEBUG_TYPE "dwarfdebug" 57 58 static cl::opt<bool> 59 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden, 60 cl::desc("Disable debug info printing")); 61 62 static cl::opt<bool> UnknownLocations( 63 "use-unknown-locations", cl::Hidden, 64 cl::desc("Make an absence of debug location information explicit."), 65 cl::init(false)); 66 67 static cl::opt<bool> 68 GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden, 69 cl::desc("Generate GNU-style pubnames and pubtypes"), 70 cl::init(false)); 71 72 static cl::opt<bool> GenerateARangeSection("generate-arange-section", 73 cl::Hidden, 74 cl::desc("Generate dwarf aranges"), 75 cl::init(false)); 76 77 namespace { 78 enum DefaultOnOff { Default, Enable, Disable }; 79 } 80 81 static cl::opt<DefaultOnOff> 82 DwarfAccelTables("dwarf-accel-tables", cl::Hidden, 83 cl::desc("Output prototype dwarf accelerator tables."), 84 cl::values(clEnumVal(Default, "Default for platform"), 85 clEnumVal(Enable, "Enabled"), 86 clEnumVal(Disable, "Disabled"), clEnumValEnd), 87 cl::init(Default)); 88 89 static cl::opt<DefaultOnOff> 90 SplitDwarf("split-dwarf", cl::Hidden, 91 cl::desc("Output DWARF5 split debug info."), 92 cl::values(clEnumVal(Default, "Default for platform"), 93 clEnumVal(Enable, "Enabled"), 94 clEnumVal(Disable, "Disabled"), clEnumValEnd), 95 cl::init(Default)); 96 97 static cl::opt<DefaultOnOff> 98 DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden, 99 cl::desc("Generate DWARF pubnames and pubtypes sections"), 100 cl::values(clEnumVal(Default, "Default for platform"), 101 clEnumVal(Enable, "Enabled"), 102 clEnumVal(Disable, "Disabled"), clEnumValEnd), 103 cl::init(Default)); 104 105 static const char *const DWARFGroupName = "DWARF Emission"; 106 static const char *const DbgTimerName = "DWARF Debug Writer"; 107 108 //===----------------------------------------------------------------------===// 109 110 /// resolve - Look in the DwarfDebug map for the MDNode that 111 /// corresponds to the reference. 112 template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const { 113 return DD->resolve(Ref); 114 } 115 116 bool DbgVariable::isBlockByrefVariable() const { 117 assert(Var.isVariable() && "Invalid complex DbgVariable!"); 118 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap()); 119 } 120 121 DIType DbgVariable::getType() const { 122 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap()); 123 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 124 // addresses instead. 125 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) { 126 /* Byref variables, in Blocks, are declared by the programmer as 127 "SomeType VarName;", but the compiler creates a 128 __Block_byref_x_VarName struct, and gives the variable VarName 129 either the struct, or a pointer to the struct, as its type. This 130 is necessary for various behind-the-scenes things the compiler 131 needs to do with by-reference variables in blocks. 132 133 However, as far as the original *programmer* is concerned, the 134 variable should still have type 'SomeType', as originally declared. 135 136 The following function dives into the __Block_byref_x_VarName 137 struct to find the original type of the variable. This will be 138 passed back to the code generating the type for the Debug 139 Information Entry for the variable 'VarName'. 'VarName' will then 140 have the original type 'SomeType' in its debug information. 141 142 The original type 'SomeType' will be the type of the field named 143 'VarName' inside the __Block_byref_x_VarName struct. 144 145 NOTE: In order for this to not completely fail on the debugger 146 side, the Debug Information Entry for the variable VarName needs to 147 have a DW_AT_location that tells the debugger how to unwind through 148 the pointers and __Block_byref_x_VarName struct to find the actual 149 value of the variable. The function addBlockByrefType does this. */ 150 DIType subType = Ty; 151 uint16_t tag = Ty.getTag(); 152 153 if (tag == dwarf::DW_TAG_pointer_type) 154 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom()); 155 156 DIArray Elements = DICompositeType(subType).getElements(); 157 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 158 DIDerivedType DT(Elements.getElement(i)); 159 if (getName() == DT.getName()) 160 return (resolve(DT.getTypeDerivedFrom())); 161 } 162 } 163 return Ty; 164 } 165 166 static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = { 167 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4), 168 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2), 169 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)}; 170 171 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 172 : Asm(A), MMI(Asm->MMI), PrevLabel(nullptr), GlobalRangeCount(0), 173 InfoHolder(A, *this, "info_string", DIEValueAllocator), 174 UsedNonDefaultText(false), 175 SkeletonHolder(A, *this, "skel_string", DIEValueAllocator), 176 IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()), 177 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, 178 dwarf::DW_FORM_data4)), 179 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, 180 dwarf::DW_FORM_data4)), 181 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, 182 dwarf::DW_FORM_data4)), 183 AccelTypes(TypeAtoms) { 184 185 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr; 186 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr; 187 DwarfLineSectionSym = nullptr; 188 DwarfAddrSectionSym = nullptr; 189 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr; 190 FunctionBeginSym = FunctionEndSym = nullptr; 191 CurFn = nullptr; 192 CurMI = nullptr; 193 194 // Turn on accelerator tables for Darwin by default, pubnames by 195 // default for non-Darwin, and handle split dwarf. 196 if (DwarfAccelTables == Default) 197 HasDwarfAccelTables = IsDarwin; 198 else 199 HasDwarfAccelTables = DwarfAccelTables == Enable; 200 201 if (SplitDwarf == Default) 202 HasSplitDwarf = false; 203 else 204 HasSplitDwarf = SplitDwarf == Enable; 205 206 if (DwarfPubSections == Default) 207 HasDwarfPubSections = !IsDarwin; 208 else 209 HasDwarfPubSections = DwarfPubSections == Enable; 210 211 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion; 212 DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber 213 : MMI->getModule()->getDwarfVersion(); 214 215 Asm->OutStreamer.getContext().setDwarfVersion(DwarfVersion); 216 217 { 218 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 219 beginModule(); 220 } 221 } 222 223 // Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h. 224 DwarfDebug::~DwarfDebug() { } 225 226 // Switch to the specified MCSection and emit an assembler 227 // temporary label to it if SymbolStem is specified. 228 static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section, 229 const char *SymbolStem = nullptr) { 230 Asm->OutStreamer.SwitchSection(Section); 231 if (!SymbolStem) 232 return nullptr; 233 234 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem); 235 Asm->OutStreamer.EmitLabel(TmpSym); 236 return TmpSym; 237 } 238 239 static bool isObjCClass(StringRef Name) { 240 return Name.startswith("+") || Name.startswith("-"); 241 } 242 243 static bool hasObjCCategory(StringRef Name) { 244 if (!isObjCClass(Name)) 245 return false; 246 247 return Name.find(") ") != StringRef::npos; 248 } 249 250 static void getObjCClassCategory(StringRef In, StringRef &Class, 251 StringRef &Category) { 252 if (!hasObjCCategory(In)) { 253 Class = In.slice(In.find('[') + 1, In.find(' ')); 254 Category = ""; 255 return; 256 } 257 258 Class = In.slice(In.find('[') + 1, In.find('(')); 259 Category = In.slice(In.find('[') + 1, In.find(' ')); 260 return; 261 } 262 263 static StringRef getObjCMethodName(StringRef In) { 264 return In.slice(In.find(' ') + 1, In.find(']')); 265 } 266 267 // Helper for sorting sections into a stable output order. 268 static bool SectionSort(const MCSection *A, const MCSection *B) { 269 std::string LA = (A ? A->getLabelBeginName() : ""); 270 std::string LB = (B ? B->getLabelBeginName() : ""); 271 return LA < LB; 272 } 273 274 // Add the various names to the Dwarf accelerator table names. 275 // TODO: Determine whether or not we should add names for programs 276 // that do not have a DW_AT_name or DW_AT_linkage_name field - this 277 // is only slightly different than the lookup of non-standard ObjC names. 278 void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) { 279 if (!SP.isDefinition()) 280 return; 281 addAccelName(SP.getName(), Die); 282 283 // If the linkage name is different than the name, go ahead and output 284 // that as well into the name table. 285 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName()) 286 addAccelName(SP.getLinkageName(), Die); 287 288 // If this is an Objective-C selector name add it to the ObjC accelerator 289 // too. 290 if (isObjCClass(SP.getName())) { 291 StringRef Class, Category; 292 getObjCClassCategory(SP.getName(), Class, Category); 293 addAccelObjC(Class, Die); 294 if (Category != "") 295 addAccelObjC(Category, Die); 296 // Also add the base method name to the name table. 297 addAccelName(getObjCMethodName(SP.getName()), Die); 298 } 299 } 300 301 /// isSubprogramContext - Return true if Context is either a subprogram 302 /// or another context nested inside a subprogram. 303 bool DwarfDebug::isSubprogramContext(const MDNode *Context) { 304 if (!Context) 305 return false; 306 DIDescriptor D(Context); 307 if (D.isSubprogram()) 308 return true; 309 if (D.isType()) 310 return isSubprogramContext(resolve(DIType(Context).getContext())); 311 return false; 312 } 313 314 /// Check whether we should create a DIE for the given Scope, return true 315 /// if we don't create a DIE (the corresponding DIE is null). 316 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) { 317 if (Scope->isAbstractScope()) 318 return false; 319 320 // We don't create a DIE if there is no Range. 321 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges(); 322 if (Ranges.empty()) 323 return true; 324 325 if (Ranges.size() > 1) 326 return false; 327 328 // We don't create a DIE if we have a single Range and the end label 329 // is null. 330 return !getLabelAfterInsn(Ranges.front().second); 331 } 332 333 template <typename Func> void forBothCUs(DwarfCompileUnit &CU, Func F) { 334 F(CU); 335 if (auto *SkelCU = CU.getSkeleton()) 336 F(*SkelCU); 337 } 338 339 void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) { 340 assert(Scope && Scope->getScopeNode()); 341 assert(Scope->isAbstractScope()); 342 assert(!Scope->getInlinedAt()); 343 344 const MDNode *SP = Scope->getScopeNode(); 345 346 ProcessedSPNodes.insert(SP); 347 348 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram 349 // was inlined from another compile unit. 350 auto &CU = SPMap[SP]; 351 forBothCUs(*CU, [&](DwarfCompileUnit &CU) { 352 CU.constructAbstractSubprogramScopeDIE(Scope); 353 }); 354 } 355 356 void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const { 357 if (!GenerateGnuPubSections) 358 return; 359 360 U.addFlag(D, dwarf::DW_AT_GNU_pubnames); 361 } 362 363 // Create new DwarfCompileUnit for the given metadata node with tag 364 // DW_TAG_compile_unit. 365 DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { 366 StringRef FN = DIUnit.getFilename(); 367 CompilationDir = DIUnit.getDirectory(); 368 369 auto OwnedUnit = make_unique<DwarfCompileUnit>( 370 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder); 371 DwarfCompileUnit &NewCU = *OwnedUnit; 372 DIE &Die = NewCU.getUnitDie(); 373 InfoHolder.addUnit(std::move(OwnedUnit)); 374 if (useSplitDwarf()) 375 NewCU.setSkeleton(constructSkeletonCU(NewCU)); 376 377 // LTO with assembly output shares a single line table amongst multiple CUs. 378 // To avoid the compilation directory being ambiguous, let the line table 379 // explicitly describe the directory of all files, never relying on the 380 // compilation directory. 381 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU) 382 Asm->OutStreamer.getContext().setMCLineTableCompilationDir( 383 NewCU.getUniqueID(), CompilationDir); 384 385 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); 386 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 387 DIUnit.getLanguage()); 388 NewCU.addString(Die, dwarf::DW_AT_name, FN); 389 390 if (!useSplitDwarf()) { 391 NewCU.initStmtList(DwarfLineSectionSym); 392 393 // If we're using split dwarf the compilation dir is going to be in the 394 // skeleton CU and so we don't need to duplicate it here. 395 if (!CompilationDir.empty()) 396 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 397 398 addGnuPubAttributes(NewCU, Die); 399 } 400 401 if (DIUnit.isOptimized()) 402 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized); 403 404 StringRef Flags = DIUnit.getFlags(); 405 if (!Flags.empty()) 406 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags); 407 408 if (unsigned RVer = DIUnit.getRunTimeVersion()) 409 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 410 dwarf::DW_FORM_data1, RVer); 411 412 if (useSplitDwarf()) 413 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(), 414 DwarfInfoDWOSectionSym); 415 else 416 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(), 417 DwarfInfoSectionSym); 418 419 CUMap.insert(std::make_pair(DIUnit, &NewCU)); 420 CUDieMap.insert(std::make_pair(&Die, &NewCU)); 421 return NewCU; 422 } 423 424 void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU, 425 const MDNode *N) { 426 DIImportedEntity Module(N); 427 assert(Module.Verify()); 428 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext())) 429 D->addChild(TheCU.constructImportedEntityDIE(Module)); 430 } 431 432 // Emit all Dwarf sections that should come prior to the content. Create 433 // global DIEs and emit initial debug info sections. This is invoked by 434 // the target AsmPrinter. 435 void DwarfDebug::beginModule() { 436 if (DisableDebugInfoPrinting) 437 return; 438 439 const Module *M = MMI->getModule(); 440 441 FunctionDIs = makeSubprogramMap(*M); 442 443 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu"); 444 if (!CU_Nodes) 445 return; 446 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes); 447 448 // Emit initial sections so we can reference labels later. 449 emitSectionLabels(); 450 451 SingleCU = CU_Nodes->getNumOperands() == 1; 452 453 for (MDNode *N : CU_Nodes->operands()) { 454 DICompileUnit CUNode(N); 455 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode); 456 DIArray ImportedEntities = CUNode.getImportedEntities(); 457 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) 458 ScopesWithImportedEntities.push_back(std::make_pair( 459 DIImportedEntity(ImportedEntities.getElement(i)).getContext(), 460 ImportedEntities.getElement(i))); 461 std::sort(ScopesWithImportedEntities.begin(), 462 ScopesWithImportedEntities.end(), less_first()); 463 DIArray GVs = CUNode.getGlobalVariables(); 464 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) 465 CU.getOrCreateGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i))); 466 DIArray SPs = CUNode.getSubprograms(); 467 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) 468 SPMap.insert(std::make_pair(SPs.getElement(i), &CU)); 469 DIArray EnumTypes = CUNode.getEnumTypes(); 470 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) { 471 DIType Ty(EnumTypes.getElement(i)); 472 // The enum types array by design contains pointers to 473 // MDNodes rather than DIRefs. Unique them here. 474 DIType UniqueTy(resolve(Ty.getRef())); 475 CU.getOrCreateTypeDIE(UniqueTy); 476 } 477 DIArray RetainedTypes = CUNode.getRetainedTypes(); 478 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) { 479 DIType Ty(RetainedTypes.getElement(i)); 480 // The retained types array by design contains pointers to 481 // MDNodes rather than DIRefs. Unique them here. 482 DIType UniqueTy(resolve(Ty.getRef())); 483 CU.getOrCreateTypeDIE(UniqueTy); 484 } 485 // Emit imported_modules last so that the relevant context is already 486 // available. 487 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) 488 constructAndAddImportedEntityDIE(CU, ImportedEntities.getElement(i)); 489 } 490 491 // Tell MMI that we have debug info. 492 MMI->setDebugInfoAvailability(true); 493 494 // Prime section data. 495 SectionMap[Asm->getObjFileLowering().getTextSection()]; 496 } 497 498 void DwarfDebug::finishVariableDefinitions() { 499 for (const auto &Var : ConcreteVariables) { 500 DIE *VariableDie = Var->getDIE(); 501 assert(VariableDie); 502 // FIXME: Consider the time-space tradeoff of just storing the unit pointer 503 // in the ConcreteVariables list, rather than looking it up again here. 504 // DIE::getUnit isn't simple - it walks parent pointers, etc. 505 DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit()); 506 assert(Unit); 507 DbgVariable *AbsVar = getExistingAbstractVariable(Var->getVariable()); 508 if (AbsVar && AbsVar->getDIE()) { 509 Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin, 510 *AbsVar->getDIE()); 511 } else 512 Unit->applyVariableAttributes(*Var, *VariableDie); 513 } 514 } 515 516 void DwarfDebug::finishSubprogramDefinitions() { 517 for (const auto &P : SPMap) 518 forBothCUs(*P.second, [&](DwarfCompileUnit &CU) { 519 CU.finishSubprogramDefinition(DISubprogram(P.first)); 520 }); 521 } 522 523 524 // Collect info for variables that were optimized out. 525 void DwarfDebug::collectDeadVariables() { 526 const Module *M = MMI->getModule(); 527 528 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) { 529 for (MDNode *N : CU_Nodes->operands()) { 530 DICompileUnit TheCU(N); 531 // Construct subprogram DIE and add variables DIEs. 532 DwarfCompileUnit *SPCU = 533 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU)); 534 assert(SPCU && "Unable to find Compile Unit!"); 535 DIArray Subprograms = TheCU.getSubprograms(); 536 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) { 537 DISubprogram SP(Subprograms.getElement(i)); 538 if (ProcessedSPNodes.count(SP) != 0) 539 continue; 540 SPCU->collectDeadVariables(SP); 541 } 542 } 543 } 544 } 545 546 void DwarfDebug::finalizeModuleInfo() { 547 finishSubprogramDefinitions(); 548 549 finishVariableDefinitions(); 550 551 // Collect info for variables that were optimized out. 552 collectDeadVariables(); 553 554 // Handle anything that needs to be done on a per-unit basis after 555 // all other generation. 556 for (const auto &P : CUMap) { 557 auto &TheCU = *P.second; 558 // Emit DW_AT_containing_type attribute to connect types with their 559 // vtable holding type. 560 TheCU.constructContainingTypeDIEs(); 561 562 // Add CU specific attributes if we need to add any. 563 // If we're splitting the dwarf out now that we've got the entire 564 // CU then add the dwo id to it. 565 auto *SkCU = TheCU.getSkeleton(); 566 if (useSplitDwarf()) { 567 // Emit a unique identifier for this CU. 568 uint64_t ID = DIEHash(Asm).computeCUSignature(TheCU.getUnitDie()); 569 TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 570 dwarf::DW_FORM_data8, ID); 571 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 572 dwarf::DW_FORM_data8, ID); 573 574 // We don't keep track of which addresses are used in which CU so this 575 // is a bit pessimistic under LTO. 576 if (!AddrPool.isEmpty()) 577 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base, 578 DwarfAddrSectionSym, DwarfAddrSectionSym); 579 if (!SkCU->getRangeLists().empty()) 580 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base, 581 DwarfDebugRangeSectionSym, 582 DwarfDebugRangeSectionSym); 583 } 584 585 // If we have code split among multiple sections or non-contiguous 586 // ranges of code then emit a DW_AT_ranges attribute on the unit that will 587 // remain in the .o file, otherwise add a DW_AT_low_pc. 588 // FIXME: We should use ranges allow reordering of code ala 589 // .subsections_via_symbols in mach-o. This would mean turning on 590 // ranges for all subprogram DIEs for mach-o. 591 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU; 592 if (unsigned NumRanges = TheCU.getRanges().size()) { 593 if (NumRanges > 1) 594 // A DW_AT_low_pc attribute may also be specified in combination with 595 // DW_AT_ranges to specify the default base address for use in 596 // location lists (see Section 2.6.2) and range lists (see Section 597 // 2.17.3). 598 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); 599 else 600 TheCU.setBaseAddress(TheCU.getRanges().front().getStart()); 601 U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges()); 602 } 603 } 604 605 // Compute DIE offsets and sizes. 606 InfoHolder.computeSizeAndOffsets(); 607 if (useSplitDwarf()) 608 SkeletonHolder.computeSizeAndOffsets(); 609 } 610 611 void DwarfDebug::endSections() { 612 // Filter labels by section. 613 for (const SymbolCU &SCU : ArangeLabels) { 614 if (SCU.Sym->isInSection()) { 615 // Make a note of this symbol and it's section. 616 const MCSection *Section = &SCU.Sym->getSection(); 617 if (!Section->getKind().isMetadata()) 618 SectionMap[Section].push_back(SCU); 619 } else { 620 // Some symbols (e.g. common/bss on mach-o) can have no section but still 621 // appear in the output. This sucks as we rely on sections to build 622 // arange spans. We can do it without, but it's icky. 623 SectionMap[nullptr].push_back(SCU); 624 } 625 } 626 627 // Build a list of sections used. 628 std::vector<const MCSection *> Sections; 629 for (const auto &it : SectionMap) { 630 const MCSection *Section = it.first; 631 Sections.push_back(Section); 632 } 633 634 // Sort the sections into order. 635 // This is only done to ensure consistent output order across different runs. 636 std::sort(Sections.begin(), Sections.end(), SectionSort); 637 638 // Add terminating symbols for each section. 639 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) { 640 const MCSection *Section = Sections[ID]; 641 MCSymbol *Sym = nullptr; 642 643 if (Section) { 644 // We can't call MCSection::getLabelEndName, as it's only safe to do so 645 // if we know the section name up-front. For user-created sections, the 646 // resulting label may not be valid to use as a label. (section names can 647 // use a greater set of characters on some systems) 648 Sym = Asm->GetTempSymbol("debug_end", ID); 649 Asm->OutStreamer.SwitchSection(Section); 650 Asm->OutStreamer.EmitLabel(Sym); 651 } 652 653 // Insert a final terminator. 654 SectionMap[Section].push_back(SymbolCU(nullptr, Sym)); 655 } 656 } 657 658 // Emit all Dwarf sections that should come after the content. 659 void DwarfDebug::endModule() { 660 assert(CurFn == nullptr); 661 assert(CurMI == nullptr); 662 663 // If we aren't actually generating debug info (check beginModule - 664 // conditionalized on !DisableDebugInfoPrinting and the presence of the 665 // llvm.dbg.cu metadata node) 666 if (!DwarfInfoSectionSym) 667 return; 668 669 // End any existing sections. 670 // TODO: Does this need to happen? 671 endSections(); 672 673 // Finalize the debug info for the module. 674 finalizeModuleInfo(); 675 676 emitDebugStr(); 677 678 // Emit all the DIEs into a debug info section. 679 emitDebugInfo(); 680 681 // Corresponding abbreviations into a abbrev section. 682 emitAbbreviations(); 683 684 // Emit info into a debug aranges section. 685 if (GenerateARangeSection) 686 emitDebugARanges(); 687 688 // Emit info into a debug ranges section. 689 emitDebugRanges(); 690 691 if (useSplitDwarf()) { 692 emitDebugStrDWO(); 693 emitDebugInfoDWO(); 694 emitDebugAbbrevDWO(); 695 emitDebugLineDWO(); 696 emitDebugLocDWO(); 697 // Emit DWO addresses. 698 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection()); 699 } else 700 // Emit info into a debug loc section. 701 emitDebugLoc(); 702 703 // Emit info into the dwarf accelerator table sections. 704 if (useDwarfAccelTables()) { 705 emitAccelNames(); 706 emitAccelObjC(); 707 emitAccelNamespaces(); 708 emitAccelTypes(); 709 } 710 711 // Emit the pubnames and pubtypes sections if requested. 712 if (HasDwarfPubSections) { 713 emitDebugPubNames(GenerateGnuPubSections); 714 emitDebugPubTypes(GenerateGnuPubSections); 715 } 716 717 // clean up. 718 SPMap.clear(); 719 AbstractVariables.clear(); 720 } 721 722 // Find abstract variable, if any, associated with Var. 723 DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV, 724 DIVariable &Cleansed) { 725 LLVMContext &Ctx = DV->getContext(); 726 // More then one inlined variable corresponds to one abstract variable. 727 // FIXME: This duplication of variables when inlining should probably be 728 // removed. It's done to allow each DIVariable to describe its location 729 // because the DebugLoc on the dbg.value/declare isn't accurate. We should 730 // make it accurate then remove this duplication/cleansing stuff. 731 Cleansed = cleanseInlinedVariable(DV, Ctx); 732 auto I = AbstractVariables.find(Cleansed); 733 if (I != AbstractVariables.end()) 734 return I->second.get(); 735 return nullptr; 736 } 737 738 DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) { 739 DIVariable Cleansed; 740 return getExistingAbstractVariable(DV, Cleansed); 741 } 742 743 void DwarfDebug::createAbstractVariable(const DIVariable &Var, 744 LexicalScope *Scope) { 745 auto AbsDbgVariable = make_unique<DbgVariable>(Var, DIExpression(), this); 746 InfoHolder.addScopeVariable(Scope, AbsDbgVariable.get()); 747 AbstractVariables[Var] = std::move(AbsDbgVariable); 748 } 749 750 void DwarfDebug::ensureAbstractVariableIsCreated(const DIVariable &DV, 751 const MDNode *ScopeNode) { 752 DIVariable Cleansed = DV; 753 if (getExistingAbstractVariable(DV, Cleansed)) 754 return; 755 756 createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(ScopeNode)); 757 } 758 759 void 760 DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV, 761 const MDNode *ScopeNode) { 762 DIVariable Cleansed = DV; 763 if (getExistingAbstractVariable(DV, Cleansed)) 764 return; 765 766 if (LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode)) 767 createAbstractVariable(Cleansed, Scope); 768 } 769 770 // Collect variable information from side table maintained by MMI. 771 void DwarfDebug::collectVariableInfoFromMMITable( 772 SmallPtrSetImpl<const MDNode *> &Processed) { 773 for (const auto &VI : MMI->getVariableDbgInfo()) { 774 if (!VI.Var) 775 continue; 776 Processed.insert(VI.Var); 777 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc); 778 779 // If variable scope is not found then skip this variable. 780 if (!Scope) 781 continue; 782 783 DIVariable DV(VI.Var); 784 DIExpression Expr(VI.Expr); 785 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); 786 auto RegVar = make_unique<DbgVariable>(DV, Expr, this, VI.Slot); 787 if (InfoHolder.addScopeVariable(Scope, RegVar.get())) 788 ConcreteVariables.push_back(std::move(RegVar)); 789 } 790 } 791 792 // Get .debug_loc entry for the instruction range starting at MI. 793 static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) { 794 const MDNode *Expr = MI->getDebugExpression(); 795 const MDNode *Var = MI->getDebugVariable(); 796 797 assert(MI->getNumOperands() == 4); 798 if (MI->getOperand(0).isReg()) { 799 MachineLocation MLoc; 800 // If the second operand is an immediate, this is a 801 // register-indirect address. 802 if (!MI->getOperand(1).isImm()) 803 MLoc.set(MI->getOperand(0).getReg()); 804 else 805 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); 806 return DebugLocEntry::Value(Var, Expr, MLoc); 807 } 808 if (MI->getOperand(0).isImm()) 809 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getImm()); 810 if (MI->getOperand(0).isFPImm()) 811 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getFPImm()); 812 if (MI->getOperand(0).isCImm()) 813 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getCImm()); 814 815 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!"); 816 } 817 818 /// Determine whether two variable pieces overlap. 819 static bool piecesOverlap(DIExpression P1, DIExpression P2) { 820 if (!P1.isBitPiece() || !P2.isBitPiece()) 821 return true; 822 unsigned l1 = P1.getBitPieceOffset(); 823 unsigned l2 = P2.getBitPieceOffset(); 824 unsigned r1 = l1 + P1.getBitPieceSize(); 825 unsigned r2 = l2 + P2.getBitPieceSize(); 826 // True where [l1,r1[ and [r1,r2[ overlap. 827 return (l1 < r2) && (l2 < r1); 828 } 829 830 /// Build the location list for all DBG_VALUEs in the function that 831 /// describe the same variable. If the ranges of several independent 832 /// pieces of the same variable overlap partially, split them up and 833 /// combine the ranges. The resulting DebugLocEntries are will have 834 /// strict monotonically increasing begin addresses and will never 835 /// overlap. 836 // 837 // Input: 838 // 839 // Ranges History [var, loc, piece ofs size] 840 // 0 | [x, (reg0, piece 0, 32)] 841 // 1 | | [x, (reg1, piece 32, 32)] <- IsPieceOfPrevEntry 842 // 2 | | ... 843 // 3 | [clobber reg0] 844 // 4 [x, (mem, piece 0, 64)] <- overlapping with both previous pieces of x. 845 // 846 // Output: 847 // 848 // [0-1] [x, (reg0, piece 0, 32)] 849 // [1-3] [x, (reg0, piece 0, 32), (reg1, piece 32, 32)] 850 // [3-4] [x, (reg1, piece 32, 32)] 851 // [4- ] [x, (mem, piece 0, 64)] 852 void 853 DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, 854 const DbgValueHistoryMap::InstrRanges &Ranges) { 855 SmallVector<DebugLocEntry::Value, 4> OpenRanges; 856 857 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) { 858 const MachineInstr *Begin = I->first; 859 const MachineInstr *End = I->second; 860 assert(Begin->isDebugValue() && "Invalid History entry"); 861 862 // Check if a variable is inaccessible in this range. 863 if (Begin->getNumOperands() > 1 && 864 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) { 865 OpenRanges.clear(); 866 continue; 867 } 868 869 // If this piece overlaps with any open ranges, truncate them. 870 DIExpression DIExpr = Begin->getDebugExpression(); 871 auto Last = std::remove_if(OpenRanges.begin(), OpenRanges.end(), 872 [&](DebugLocEntry::Value R) { 873 return piecesOverlap(DIExpr, R.getExpression()); 874 }); 875 OpenRanges.erase(Last, OpenRanges.end()); 876 877 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin); 878 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!"); 879 880 const MCSymbol *EndLabel; 881 if (End != nullptr) 882 EndLabel = getLabelAfterInsn(End); 883 else if (std::next(I) == Ranges.end()) 884 EndLabel = FunctionEndSym; 885 else 886 EndLabel = getLabelBeforeInsn(std::next(I)->first); 887 assert(EndLabel && "Forgot label after instruction ending a range!"); 888 889 DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n"); 890 891 auto Value = getDebugLocValue(Begin); 892 DebugLocEntry Loc(StartLabel, EndLabel, Value); 893 bool couldMerge = false; 894 895 // If this is a piece, it may belong to the current DebugLocEntry. 896 if (DIExpr.isBitPiece()) { 897 // Add this value to the list of open ranges. 898 OpenRanges.push_back(Value); 899 900 // Attempt to add the piece to the last entry. 901 if (!DebugLoc.empty()) 902 if (DebugLoc.back().MergeValues(Loc)) 903 couldMerge = true; 904 } 905 906 if (!couldMerge) { 907 // Need to add a new DebugLocEntry. Add all values from still 908 // valid non-overlapping pieces. 909 if (OpenRanges.size()) 910 Loc.addValues(OpenRanges); 911 912 DebugLoc.push_back(std::move(Loc)); 913 } 914 915 // Attempt to coalesce the ranges of two otherwise identical 916 // DebugLocEntries. 917 auto CurEntry = DebugLoc.rbegin(); 918 auto PrevEntry = std::next(CurEntry); 919 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry)) 920 DebugLoc.pop_back(); 921 922 DEBUG({ 923 dbgs() << CurEntry->getValues().size() << " Values:\n"; 924 for (auto Value : CurEntry->getValues()) { 925 Value.getVariable()->dump(); 926 Value.getExpression()->dump(); 927 } 928 dbgs() << "-----\n"; 929 }); 930 } 931 } 932 933 934 // Find variables for each lexical scope. 935 void 936 DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, DISubprogram SP, 937 SmallPtrSetImpl<const MDNode *> &Processed) { 938 // Grab the variable info that was squirreled away in the MMI side-table. 939 collectVariableInfoFromMMITable(Processed); 940 941 for (const auto &I : DbgValues) { 942 DIVariable DV(I.first); 943 if (Processed.count(DV)) 944 continue; 945 946 // Instruction ranges, specifying where DV is accessible. 947 const auto &Ranges = I.second; 948 if (Ranges.empty()) 949 continue; 950 951 LexicalScope *Scope = nullptr; 952 if (MDNode *IA = DV.getInlinedAt()) { 953 DebugLoc DL = DebugLoc::getFromDILocation(IA); 954 Scope = LScopes.findInlinedScope(DebugLoc::get( 955 DL.getLine(), DL.getCol(), DV.getContext(), IA)); 956 } else 957 Scope = LScopes.findLexicalScope(DV.getContext()); 958 // If variable scope is not found then skip this variable. 959 if (!Scope) 960 continue; 961 962 Processed.insert(DV); 963 const MachineInstr *MInsn = Ranges.front().first; 964 assert(MInsn->isDebugValue() && "History must begin with debug value"); 965 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); 966 ConcreteVariables.push_back(make_unique<DbgVariable>(MInsn, this)); 967 DbgVariable *RegVar = ConcreteVariables.back().get(); 968 InfoHolder.addScopeVariable(Scope, RegVar); 969 970 // Check if the first DBG_VALUE is valid for the rest of the function. 971 if (Ranges.size() == 1 && Ranges.front().second == nullptr) 972 continue; 973 974 // Handle multiple DBG_VALUE instructions describing one variable. 975 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 976 977 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1); 978 DebugLocList &LocList = DotDebugLocEntries.back(); 979 LocList.CU = &TheCU; 980 LocList.Label = 981 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1); 982 983 // Build the location list for this variable. 984 buildLocationList(LocList.List, Ranges); 985 } 986 987 // Collect info for variables that were optimized out. 988 DIArray Variables = SP.getVariables(); 989 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 990 DIVariable DV(Variables.getElement(i)); 991 assert(DV.isVariable()); 992 if (!Processed.insert(DV).second) 993 continue; 994 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) { 995 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); 996 DIExpression NoExpr; 997 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, NoExpr, this)); 998 InfoHolder.addScopeVariable(Scope, ConcreteVariables.back().get()); 999 } 1000 } 1001 } 1002 1003 // Return Label preceding the instruction. 1004 MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 1005 MCSymbol *Label = LabelsBeforeInsn.lookup(MI); 1006 assert(Label && "Didn't insert label before instruction"); 1007 return Label; 1008 } 1009 1010 // Return Label immediately following the instruction. 1011 MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 1012 return LabelsAfterInsn.lookup(MI); 1013 } 1014 1015 // Process beginning of an instruction. 1016 void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1017 assert(CurMI == nullptr); 1018 CurMI = MI; 1019 // Check if source location changes, but ignore DBG_VALUE locations. 1020 if (!MI->isDebugValue()) { 1021 DebugLoc DL = MI->getDebugLoc(); 1022 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) { 1023 unsigned Flags = 0; 1024 PrevInstLoc = DL; 1025 if (DL == PrologEndLoc) { 1026 Flags |= DWARF2_FLAG_PROLOGUE_END; 1027 PrologEndLoc = DebugLoc(); 1028 Flags |= DWARF2_FLAG_IS_STMT; 1029 } 1030 if (DL.getLine() != 1031 Asm->OutStreamer.getContext().getCurrentDwarfLoc().getLine()) 1032 Flags |= DWARF2_FLAG_IS_STMT; 1033 1034 if (!DL.isUnknown()) { 1035 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 1036 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags); 1037 } else 1038 recordSourceLine(0, 0, nullptr, 0); 1039 } 1040 } 1041 1042 // Insert labels where requested. 1043 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 1044 LabelsBeforeInsn.find(MI); 1045 1046 // No label needed. 1047 if (I == LabelsBeforeInsn.end()) 1048 return; 1049 1050 // Label already assigned. 1051 if (I->second) 1052 return; 1053 1054 if (!PrevLabel) { 1055 PrevLabel = MMI->getContext().CreateTempSymbol(); 1056 Asm->OutStreamer.EmitLabel(PrevLabel); 1057 } 1058 I->second = PrevLabel; 1059 } 1060 1061 // Process end of an instruction. 1062 void DwarfDebug::endInstruction() { 1063 assert(CurMI != nullptr); 1064 // Don't create a new label after DBG_VALUE instructions. 1065 // They don't generate code. 1066 if (!CurMI->isDebugValue()) 1067 PrevLabel = nullptr; 1068 1069 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 1070 LabelsAfterInsn.find(CurMI); 1071 CurMI = nullptr; 1072 1073 // No label needed. 1074 if (I == LabelsAfterInsn.end()) 1075 return; 1076 1077 // Label already assigned. 1078 if (I->second) 1079 return; 1080 1081 // We need a label after this instruction. 1082 if (!PrevLabel) { 1083 PrevLabel = MMI->getContext().CreateTempSymbol(); 1084 Asm->OutStreamer.EmitLabel(PrevLabel); 1085 } 1086 I->second = PrevLabel; 1087 } 1088 1089 // Each LexicalScope has first instruction and last instruction to mark 1090 // beginning and end of a scope respectively. Create an inverse map that list 1091 // scopes starts (and ends) with an instruction. One instruction may start (or 1092 // end) multiple scopes. Ignore scopes that are not reachable. 1093 void DwarfDebug::identifyScopeMarkers() { 1094 SmallVector<LexicalScope *, 4> WorkList; 1095 WorkList.push_back(LScopes.getCurrentFunctionScope()); 1096 while (!WorkList.empty()) { 1097 LexicalScope *S = WorkList.pop_back_val(); 1098 1099 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren(); 1100 if (!Children.empty()) 1101 WorkList.append(Children.begin(), Children.end()); 1102 1103 if (S->isAbstractScope()) 1104 continue; 1105 1106 for (const InsnRange &R : S->getRanges()) { 1107 assert(R.first && "InsnRange does not have first instruction!"); 1108 assert(R.second && "InsnRange does not have second instruction!"); 1109 requestLabelBeforeInsn(R.first); 1110 requestLabelAfterInsn(R.second); 1111 } 1112 } 1113 } 1114 1115 static DebugLoc findPrologueEndLoc(const MachineFunction *MF) { 1116 // First known non-DBG_VALUE and non-frame setup location marks 1117 // the beginning of the function body. 1118 for (const auto &MBB : *MF) 1119 for (const auto &MI : MBB) 1120 if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) && 1121 !MI.getDebugLoc().isUnknown()) { 1122 // Did the target forget to set the FrameSetup flag for CFI insns? 1123 assert(!MI.isCFIInstruction() && 1124 "First non-frame-setup instruction is a CFI instruction."); 1125 return MI.getDebugLoc(); 1126 } 1127 return DebugLoc(); 1128 } 1129 1130 // Gather pre-function debug information. Assumes being called immediately 1131 // after the function entry point has been emitted. 1132 void DwarfDebug::beginFunction(const MachineFunction *MF) { 1133 CurFn = MF; 1134 1135 // If there's no debug info for the function we're not going to do anything. 1136 if (!MMI->hasDebugInfo()) 1137 return; 1138 1139 auto DI = FunctionDIs.find(MF->getFunction()); 1140 if (DI == FunctionDIs.end()) 1141 return; 1142 1143 // Grab the lexical scopes for the function, if we don't have any of those 1144 // then we're not going to be able to do anything. 1145 LScopes.initialize(*MF); 1146 if (LScopes.empty()) 1147 return; 1148 1149 assert(DbgValues.empty() && "DbgValues map wasn't cleaned!"); 1150 1151 // Make sure that each lexical scope will have a begin/end label. 1152 identifyScopeMarkers(); 1153 1154 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function 1155 // belongs to so that we add to the correct per-cu line table in the 1156 // non-asm case. 1157 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1158 // FnScope->getScopeNode() and DI->second should represent the same function, 1159 // though they may not be the same MDNode due to inline functions merged in 1160 // LTO where the debug info metadata still differs (either due to distinct 1161 // written differences - two versions of a linkonce_odr function 1162 // written/copied into two separate files, or some sub-optimal metadata that 1163 // isn't structurally identical (see: file path/name info from clang, which 1164 // includes the directory of the cpp file being built, even when the file name 1165 // is absolute (such as an <> lookup header))) 1166 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1167 assert(TheCU && "Unable to find compile unit!"); 1168 if (Asm->OutStreamer.hasRawTextSupport()) 1169 // Use a single line table if we are generating assembly. 1170 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0); 1171 else 1172 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID()); 1173 1174 // Emit a label for the function so that we have a beginning address. 1175 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()); 1176 // Assumes in correct section after the entry point. 1177 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 1178 1179 // Calculate history for local variables. 1180 calculateDbgValueHistory(MF, Asm->TM.getSubtargetImpl()->getRegisterInfo(), 1181 DbgValues); 1182 1183 // Request labels for the full history. 1184 for (const auto &I : DbgValues) { 1185 const auto &Ranges = I.second; 1186 if (Ranges.empty()) 1187 continue; 1188 1189 // The first mention of a function argument gets the FunctionBeginSym 1190 // label, so arguments are visible when breaking at function entry. 1191 DIVariable DIVar(Ranges.front().first->getDebugVariable()); 1192 if (DIVar.isVariable() && DIVar.getTag() == dwarf::DW_TAG_arg_variable && 1193 getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) { 1194 LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym; 1195 if (Ranges.front().first->getDebugExpression().isBitPiece()) { 1196 // Mark all non-overlapping initial pieces. 1197 for (auto I = Ranges.begin(); I != Ranges.end(); ++I) { 1198 DIExpression Piece = I->first->getDebugExpression(); 1199 if (std::all_of(Ranges.begin(), I, 1200 [&](DbgValueHistoryMap::InstrRange Pred) { 1201 return !piecesOverlap(Piece, Pred.first->getDebugExpression()); 1202 })) 1203 LabelsBeforeInsn[I->first] = FunctionBeginSym; 1204 else 1205 break; 1206 } 1207 } 1208 } 1209 1210 for (const auto &Range : Ranges) { 1211 requestLabelBeforeInsn(Range.first); 1212 if (Range.second) 1213 requestLabelAfterInsn(Range.second); 1214 } 1215 } 1216 1217 PrevInstLoc = DebugLoc(); 1218 PrevLabel = FunctionBeginSym; 1219 1220 // Record beginning of function. 1221 PrologEndLoc = findPrologueEndLoc(MF); 1222 if (!PrologEndLoc.isUnknown()) { 1223 DebugLoc FnStartDL = 1224 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext()); 1225 1226 // We'd like to list the prologue as "not statements" but GDB behaves 1227 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing. 1228 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(), 1229 FnStartDL.getScope(MF->getFunction()->getContext()), 1230 DWARF2_FLAG_IS_STMT); 1231 } 1232 } 1233 1234 // Gather and emit post-function debug information. 1235 void DwarfDebug::endFunction(const MachineFunction *MF) { 1236 assert(CurFn == MF && 1237 "endFunction should be called with the same function as beginFunction"); 1238 1239 if (!MMI->hasDebugInfo() || LScopes.empty() || 1240 !FunctionDIs.count(MF->getFunction())) { 1241 // If we don't have a lexical scope for this function then there will 1242 // be a hole in the range information. Keep note of this by setting the 1243 // previously used section to nullptr. 1244 PrevCU = nullptr; 1245 CurFn = nullptr; 1246 return; 1247 } 1248 1249 // Define end label for subprogram. 1250 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()); 1251 // Assumes in correct section after the entry point. 1252 Asm->OutStreamer.EmitLabel(FunctionEndSym); 1253 1254 // Set DwarfDwarfCompileUnitID in MCContext to default value. 1255 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0); 1256 1257 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1258 DISubprogram SP(FnScope->getScopeNode()); 1259 DwarfCompileUnit &TheCU = *SPMap.lookup(SP); 1260 1261 SmallPtrSet<const MDNode *, 16> ProcessedVars; 1262 collectVariableInfo(TheCU, SP, ProcessedVars); 1263 1264 // Add the range of this function to the list of ranges for the CU. 1265 TheCU.addRange(RangeSpan(FunctionBeginSym, FunctionEndSym)); 1266 1267 // Under -gmlt, skip building the subprogram if there are no inlined 1268 // subroutines inside it. 1269 if (TheCU.getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly && 1270 LScopes.getAbstractScopesList().empty() && !IsDarwin) { 1271 assert(InfoHolder.getScopeVariables().empty()); 1272 assert(DbgValues.empty()); 1273 // FIXME: This wouldn't be true in LTO with a -g (with inlining) CU followed 1274 // by a -gmlt CU. Add a test and remove this assertion. 1275 assert(AbstractVariables.empty()); 1276 LabelsBeforeInsn.clear(); 1277 LabelsAfterInsn.clear(); 1278 PrevLabel = nullptr; 1279 CurFn = nullptr; 1280 return; 1281 } 1282 1283 #ifndef NDEBUG 1284 size_t NumAbstractScopes = LScopes.getAbstractScopesList().size(); 1285 #endif 1286 // Construct abstract scopes. 1287 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) { 1288 DISubprogram SP(AScope->getScopeNode()); 1289 assert(SP.isSubprogram()); 1290 // Collect info for variables that were optimized out. 1291 DIArray Variables = SP.getVariables(); 1292 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1293 DIVariable DV(Variables.getElement(i)); 1294 assert(DV && DV.isVariable()); 1295 if (!ProcessedVars.insert(DV).second) 1296 continue; 1297 ensureAbstractVariableIsCreated(DV, DV.getContext()); 1298 assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes 1299 && "ensureAbstractVariableIsCreated inserted abstract scopes"); 1300 } 1301 constructAbstractSubprogramScopeDIE(AScope); 1302 } 1303 1304 TheCU.constructSubprogramScopeDIE(FnScope); 1305 if (auto *SkelCU = TheCU.getSkeleton()) 1306 if (!LScopes.getAbstractScopesList().empty()) 1307 SkelCU->constructSubprogramScopeDIE(FnScope); 1308 1309 // Clear debug info 1310 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the 1311 // DbgVariables except those that are also in AbstractVariables (since they 1312 // can be used cross-function) 1313 InfoHolder.getScopeVariables().clear(); 1314 DbgValues.clear(); 1315 LabelsBeforeInsn.clear(); 1316 LabelsAfterInsn.clear(); 1317 PrevLabel = nullptr; 1318 CurFn = nullptr; 1319 } 1320 1321 // Register a source line with debug info. Returns the unique label that was 1322 // emitted and which provides correspondence to the source line list. 1323 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1324 unsigned Flags) { 1325 StringRef Fn; 1326 StringRef Dir; 1327 unsigned Src = 1; 1328 unsigned Discriminator = 0; 1329 if (DIScope Scope = DIScope(S)) { 1330 assert(Scope.isScope()); 1331 Fn = Scope.getFilename(); 1332 Dir = Scope.getDirectory(); 1333 if (Scope.isLexicalBlockFile()) 1334 Discriminator = DILexicalBlockFile(S).getDiscriminator(); 1335 1336 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID(); 1337 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID]) 1338 .getOrCreateSourceID(Fn, Dir); 1339 } 1340 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 1341 Discriminator, Fn); 1342 } 1343 1344 //===----------------------------------------------------------------------===// 1345 // Emit Methods 1346 //===----------------------------------------------------------------------===// 1347 1348 // Emit initial Dwarf sections with a label at the start of each one. 1349 void DwarfDebug::emitSectionLabels() { 1350 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1351 1352 // Dwarf sections base addresses. 1353 DwarfInfoSectionSym = 1354 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 1355 if (useSplitDwarf()) { 1356 DwarfInfoDWOSectionSym = 1357 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo"); 1358 DwarfTypesDWOSectionSym = 1359 emitSectionSym(Asm, TLOF.getDwarfTypesDWOSection(), "section_types_dwo"); 1360 } 1361 DwarfAbbrevSectionSym = 1362 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 1363 if (useSplitDwarf()) 1364 DwarfAbbrevDWOSectionSym = emitSectionSym( 1365 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo"); 1366 if (GenerateARangeSection) 1367 emitSectionSym(Asm, TLOF.getDwarfARangesSection()); 1368 1369 DwarfLineSectionSym = 1370 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 1371 if (GenerateGnuPubSections) { 1372 DwarfGnuPubNamesSectionSym = 1373 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection()); 1374 DwarfGnuPubTypesSectionSym = 1375 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection()); 1376 } else if (HasDwarfPubSections) { 1377 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection()); 1378 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 1379 } 1380 1381 DwarfStrSectionSym = 1382 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string"); 1383 if (useSplitDwarf()) { 1384 DwarfStrDWOSectionSym = 1385 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string"); 1386 DwarfAddrSectionSym = 1387 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec"); 1388 DwarfDebugLocSectionSym = 1389 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc"); 1390 } else 1391 DwarfDebugLocSectionSym = 1392 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc"); 1393 DwarfDebugRangeSectionSym = 1394 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range"); 1395 } 1396 1397 // Recursively emits a debug information entry. 1398 void DwarfDebug::emitDIE(DIE &Die) { 1399 // Get the abbreviation for this DIE. 1400 const DIEAbbrev &Abbrev = Die.getAbbrev(); 1401 1402 // Emit the code (index) for the abbreviation. 1403 if (Asm->isVerbose()) 1404 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) + 1405 "] 0x" + Twine::utohexstr(Die.getOffset()) + 1406 ":0x" + Twine::utohexstr(Die.getSize()) + " " + 1407 dwarf::TagString(Abbrev.getTag())); 1408 Asm->EmitULEB128(Abbrev.getNumber()); 1409 1410 const SmallVectorImpl<DIEValue *> &Values = Die.getValues(); 1411 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData(); 1412 1413 // Emit the DIE attribute values. 1414 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 1415 dwarf::Attribute Attr = AbbrevData[i].getAttribute(); 1416 dwarf::Form Form = AbbrevData[i].getForm(); 1417 assert(Form && "Too many attributes for DIE (check abbreviation)"); 1418 1419 if (Asm->isVerbose()) { 1420 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 1421 if (Attr == dwarf::DW_AT_accessibility) 1422 Asm->OutStreamer.AddComment(dwarf::AccessibilityString( 1423 cast<DIEInteger>(Values[i])->getValue())); 1424 } 1425 1426 // Emit an attribute using the defined form. 1427 Values[i]->EmitValue(Asm, Form); 1428 } 1429 1430 // Emit the DIE children if any. 1431 if (Abbrev.hasChildren()) { 1432 for (auto &Child : Die.getChildren()) 1433 emitDIE(*Child); 1434 1435 Asm->OutStreamer.AddComment("End Of Children Mark"); 1436 Asm->EmitInt8(0); 1437 } 1438 } 1439 1440 // Emit the debug info section. 1441 void DwarfDebug::emitDebugInfo() { 1442 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1443 1444 Holder.emitUnits(DwarfAbbrevSectionSym); 1445 } 1446 1447 // Emit the abbreviation section. 1448 void DwarfDebug::emitAbbreviations() { 1449 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1450 1451 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection()); 1452 } 1453 1454 // Emit the last address of the section and the end of the line matrix. 1455 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 1456 // Define last address of section. 1457 Asm->OutStreamer.AddComment("Extended Op"); 1458 Asm->EmitInt8(0); 1459 1460 Asm->OutStreamer.AddComment("Op size"); 1461 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1); 1462 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 1463 Asm->EmitInt8(dwarf::DW_LNE_set_address); 1464 1465 Asm->OutStreamer.AddComment("Section end label"); 1466 1467 Asm->OutStreamer.EmitSymbolValue( 1468 Asm->GetTempSymbol("section_end", SectionEnd), 1469 Asm->getDataLayout().getPointerSize()); 1470 1471 // Mark end of matrix. 1472 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 1473 Asm->EmitInt8(0); 1474 Asm->EmitInt8(1); 1475 Asm->EmitInt8(1); 1476 } 1477 1478 void DwarfDebug::emitAccel(DwarfAccelTable &Accel, const MCSection *Section, 1479 StringRef TableName, StringRef SymName) { 1480 Accel.FinalizeTable(Asm, TableName); 1481 Asm->OutStreamer.SwitchSection(Section); 1482 auto *SectionBegin = Asm->GetTempSymbol(SymName); 1483 Asm->OutStreamer.EmitLabel(SectionBegin); 1484 1485 // Emit the full data. 1486 Accel.Emit(Asm, SectionBegin, this, DwarfStrSectionSym); 1487 } 1488 1489 // Emit visible names into a hashed accelerator table section. 1490 void DwarfDebug::emitAccelNames() { 1491 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(), 1492 "Names", "names_begin"); 1493 } 1494 1495 // Emit objective C classes and categories into a hashed accelerator table 1496 // section. 1497 void DwarfDebug::emitAccelObjC() { 1498 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(), 1499 "ObjC", "objc_begin"); 1500 } 1501 1502 // Emit namespace dies into a hashed accelerator table. 1503 void DwarfDebug::emitAccelNamespaces() { 1504 emitAccel(AccelNamespace, 1505 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(), 1506 "namespac", "namespac_begin"); 1507 } 1508 1509 // Emit type dies into a hashed accelerator table. 1510 void DwarfDebug::emitAccelTypes() { 1511 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(), 1512 "types", "types_begin"); 1513 } 1514 1515 // Public name handling. 1516 // The format for the various pubnames: 1517 // 1518 // dwarf pubnames - offset/name pairs where the offset is the offset into the CU 1519 // for the DIE that is named. 1520 // 1521 // gnu pubnames - offset/index value/name tuples where the offset is the offset 1522 // into the CU and the index value is computed according to the type of value 1523 // for the DIE that is named. 1524 // 1525 // For type units the offset is the offset of the skeleton DIE. For split dwarf 1526 // it's the offset within the debug_info/debug_types dwo section, however, the 1527 // reference in the pubname header doesn't change. 1528 1529 /// computeIndexValue - Compute the gdb index value for the DIE and CU. 1530 static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU, 1531 const DIE *Die) { 1532 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC; 1533 1534 // We could have a specification DIE that has our most of our knowledge, 1535 // look for that now. 1536 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification); 1537 if (SpecVal) { 1538 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry(); 1539 if (SpecDIE.findAttribute(dwarf::DW_AT_external)) 1540 Linkage = dwarf::GIEL_EXTERNAL; 1541 } else if (Die->findAttribute(dwarf::DW_AT_external)) 1542 Linkage = dwarf::GIEL_EXTERNAL; 1543 1544 switch (Die->getTag()) { 1545 case dwarf::DW_TAG_class_type: 1546 case dwarf::DW_TAG_structure_type: 1547 case dwarf::DW_TAG_union_type: 1548 case dwarf::DW_TAG_enumeration_type: 1549 return dwarf::PubIndexEntryDescriptor( 1550 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus 1551 ? dwarf::GIEL_STATIC 1552 : dwarf::GIEL_EXTERNAL); 1553 case dwarf::DW_TAG_typedef: 1554 case dwarf::DW_TAG_base_type: 1555 case dwarf::DW_TAG_subrange_type: 1556 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC); 1557 case dwarf::DW_TAG_namespace: 1558 return dwarf::GIEK_TYPE; 1559 case dwarf::DW_TAG_subprogram: 1560 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage); 1561 case dwarf::DW_TAG_variable: 1562 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage); 1563 case dwarf::DW_TAG_enumerator: 1564 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, 1565 dwarf::GIEL_STATIC); 1566 default: 1567 return dwarf::GIEK_NONE; 1568 } 1569 } 1570 1571 /// emitDebugPubNames - Emit visible names into a debug pubnames section. 1572 /// 1573 void DwarfDebug::emitDebugPubNames(bool GnuStyle) { 1574 const MCSection *PSec = 1575 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection() 1576 : Asm->getObjFileLowering().getDwarfPubNamesSection(); 1577 1578 emitDebugPubSection(GnuStyle, PSec, "Names", 1579 &DwarfCompileUnit::getGlobalNames); 1580 } 1581 1582 void DwarfDebug::emitDebugPubSection( 1583 bool GnuStyle, const MCSection *PSec, StringRef Name, 1584 const StringMap<const DIE *> &(DwarfCompileUnit::*Accessor)() const) { 1585 for (const auto &NU : CUMap) { 1586 DwarfCompileUnit *TheU = NU.second; 1587 1588 const auto &Globals = (TheU->*Accessor)(); 1589 1590 if (Globals.empty()) 1591 continue; 1592 1593 if (auto *Skeleton = TheU->getSkeleton()) 1594 TheU = Skeleton; 1595 unsigned ID = TheU->getUniqueID(); 1596 1597 // Start the dwarf pubnames section. 1598 Asm->OutStreamer.SwitchSection(PSec); 1599 1600 // Emit the header. 1601 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info"); 1602 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID); 1603 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID); 1604 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4); 1605 1606 Asm->OutStreamer.EmitLabel(BeginLabel); 1607 1608 Asm->OutStreamer.AddComment("DWARF Version"); 1609 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION); 1610 1611 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 1612 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym()); 1613 1614 Asm->OutStreamer.AddComment("Compilation Unit Length"); 1615 Asm->EmitInt32(TheU->getLength()); 1616 1617 // Emit the pubnames for this compilation unit. 1618 for (const auto &GI : Globals) { 1619 const char *Name = GI.getKeyData(); 1620 const DIE *Entity = GI.second; 1621 1622 Asm->OutStreamer.AddComment("DIE offset"); 1623 Asm->EmitInt32(Entity->getOffset()); 1624 1625 if (GnuStyle) { 1626 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity); 1627 Asm->OutStreamer.AddComment( 1628 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " + 1629 dwarf::GDBIndexEntryLinkageString(Desc.Linkage)); 1630 Asm->EmitInt8(Desc.toBits()); 1631 } 1632 1633 Asm->OutStreamer.AddComment("External Name"); 1634 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1)); 1635 } 1636 1637 Asm->OutStreamer.AddComment("End Mark"); 1638 Asm->EmitInt32(0); 1639 Asm->OutStreamer.EmitLabel(EndLabel); 1640 } 1641 } 1642 1643 void DwarfDebug::emitDebugPubTypes(bool GnuStyle) { 1644 const MCSection *PSec = 1645 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection() 1646 : Asm->getObjFileLowering().getDwarfPubTypesSection(); 1647 1648 emitDebugPubSection(GnuStyle, PSec, "Types", 1649 &DwarfCompileUnit::getGlobalTypes); 1650 } 1651 1652 // Emit visible names into a debug str section. 1653 void DwarfDebug::emitDebugStr() { 1654 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1655 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection()); 1656 } 1657 1658 /// Emits an optimal (=sorted) sequence of DW_OP_pieces. 1659 void DwarfDebug::emitLocPieces(ByteStreamer &Streamer, 1660 const DITypeIdentifierMap &Map, 1661 ArrayRef<DebugLocEntry::Value> Values) { 1662 assert(std::all_of(Values.begin(), Values.end(), [](DebugLocEntry::Value P) { 1663 return P.isBitPiece(); 1664 }) && "all values are expected to be pieces"); 1665 assert(std::is_sorted(Values.begin(), Values.end()) && 1666 "pieces are expected to be sorted"); 1667 1668 unsigned Offset = 0; 1669 for (auto Piece : Values) { 1670 DIExpression Expr = Piece.getExpression(); 1671 unsigned PieceOffset = Expr.getBitPieceOffset(); 1672 unsigned PieceSize = Expr.getBitPieceSize(); 1673 assert(Offset <= PieceOffset && "overlapping or duplicate pieces"); 1674 if (Offset < PieceOffset) { 1675 // The DWARF spec seriously mandates pieces with no locations for gaps. 1676 Asm->EmitDwarfOpPiece(Streamer, PieceOffset-Offset); 1677 Offset += PieceOffset-Offset; 1678 } 1679 Offset += PieceSize; 1680 1681 #ifndef NDEBUG 1682 DIVariable Var = Piece.getVariable(); 1683 unsigned VarSize = Var.getSizeInBits(Map); 1684 assert(PieceSize+PieceOffset <= VarSize 1685 && "piece is larger than or outside of variable"); 1686 assert(PieceSize != VarSize 1687 && "piece covers entire variable"); 1688 #endif 1689 emitDebugLocValue(Streamer, Piece, PieceOffset); 1690 } 1691 } 1692 1693 1694 void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer, 1695 const DebugLocEntry &Entry) { 1696 const DebugLocEntry::Value Value = Entry.getValues()[0]; 1697 if (Value.isBitPiece()) 1698 // Emit all pieces that belong to the same variable and range. 1699 return emitLocPieces(Streamer, TypeIdentifierMap, Entry.getValues()); 1700 1701 assert(Entry.getValues().size() == 1 && "only pieces may have >1 value"); 1702 emitDebugLocValue(Streamer, Value); 1703 } 1704 1705 void DwarfDebug::emitDebugLocValue(ByteStreamer &Streamer, 1706 const DebugLocEntry::Value &Value, 1707 unsigned PieceOffsetInBits) { 1708 DIVariable DV = Value.getVariable(); 1709 DebugLocDwarfExpression DwarfExpr(*Asm, Streamer); 1710 1711 // Regular entry. 1712 if (Value.isInt()) { 1713 DIBasicType BTy(resolve(DV.getType())); 1714 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed || 1715 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) 1716 DwarfExpr.AddSignedConstant(Value.getInt()); 1717 else 1718 DwarfExpr.AddUnsignedConstant(Value.getInt()); 1719 } else if (Value.isLocation()) { 1720 MachineLocation Loc = Value.getLoc(); 1721 DIExpression Expr = Value.getExpression(); 1722 if (!Expr || (Expr.getNumElements() == 0)) 1723 // Regular entry. 1724 Asm->EmitDwarfRegOp(Streamer, Loc); 1725 else { 1726 // Complex address entry. 1727 if (Loc.getOffset()) { 1728 DwarfExpr.AddMachineRegIndirect(Loc.getReg(), Loc.getOffset()); 1729 DwarfExpr.AddExpression(Expr, PieceOffsetInBits); 1730 } else 1731 DwarfExpr.AddMachineRegExpression(Expr, Loc.getReg(), 1732 PieceOffsetInBits); 1733 } 1734 } 1735 // else ... ignore constant fp. There is not any good way to 1736 // to represent them here in dwarf. 1737 // FIXME: ^ 1738 } 1739 1740 void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) { 1741 Asm->OutStreamer.AddComment("Loc expr size"); 1742 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol(); 1743 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol(); 1744 Asm->EmitLabelDifference(end, begin, 2); 1745 Asm->OutStreamer.EmitLabel(begin); 1746 // Emit the entry. 1747 APByteStreamer Streamer(*Asm); 1748 emitDebugLocEntry(Streamer, Entry); 1749 // Close the range. 1750 Asm->OutStreamer.EmitLabel(end); 1751 } 1752 1753 // Emit locations into the debug loc section. 1754 void DwarfDebug::emitDebugLoc() { 1755 // Start the dwarf loc section. 1756 Asm->OutStreamer.SwitchSection( 1757 Asm->getObjFileLowering().getDwarfLocSection()); 1758 unsigned char Size = Asm->getDataLayout().getPointerSize(); 1759 for (const auto &DebugLoc : DotDebugLocEntries) { 1760 Asm->OutStreamer.EmitLabel(DebugLoc.Label); 1761 const DwarfCompileUnit *CU = DebugLoc.CU; 1762 for (const auto &Entry : DebugLoc.List) { 1763 // Set up the range. This range is relative to the entry point of the 1764 // compile unit. This is a hard coded 0 for low_pc when we're emitting 1765 // ranges, or the DW_AT_low_pc on the compile unit otherwise. 1766 if (auto *Base = CU->getBaseAddress()) { 1767 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size); 1768 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size); 1769 } else { 1770 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size); 1771 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size); 1772 } 1773 1774 emitDebugLocEntryLocation(Entry); 1775 } 1776 Asm->OutStreamer.EmitIntValue(0, Size); 1777 Asm->OutStreamer.EmitIntValue(0, Size); 1778 } 1779 } 1780 1781 void DwarfDebug::emitDebugLocDWO() { 1782 Asm->OutStreamer.SwitchSection( 1783 Asm->getObjFileLowering().getDwarfLocDWOSection()); 1784 for (const auto &DebugLoc : DotDebugLocEntries) { 1785 Asm->OutStreamer.EmitLabel(DebugLoc.Label); 1786 for (const auto &Entry : DebugLoc.List) { 1787 // Just always use start_length for now - at least that's one address 1788 // rather than two. We could get fancier and try to, say, reuse an 1789 // address we know we've emitted elsewhere (the start of the function? 1790 // The start of the CU or CU subrange that encloses this range?) 1791 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry); 1792 unsigned idx = AddrPool.getIndex(Entry.getBeginSym()); 1793 Asm->EmitULEB128(idx); 1794 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4); 1795 1796 emitDebugLocEntryLocation(Entry); 1797 } 1798 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry); 1799 } 1800 } 1801 1802 struct ArangeSpan { 1803 const MCSymbol *Start, *End; 1804 }; 1805 1806 // Emit a debug aranges section, containing a CU lookup for any 1807 // address we can tie back to a CU. 1808 void DwarfDebug::emitDebugARanges() { 1809 // Start the dwarf aranges section. 1810 Asm->OutStreamer.SwitchSection( 1811 Asm->getObjFileLowering().getDwarfARangesSection()); 1812 1813 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType; 1814 1815 SpansType Spans; 1816 1817 // Build a list of sections used. 1818 std::vector<const MCSection *> Sections; 1819 for (const auto &it : SectionMap) { 1820 const MCSection *Section = it.first; 1821 Sections.push_back(Section); 1822 } 1823 1824 // Sort the sections into order. 1825 // This is only done to ensure consistent output order across different runs. 1826 std::sort(Sections.begin(), Sections.end(), SectionSort); 1827 1828 // Build a set of address spans, sorted by CU. 1829 for (const MCSection *Section : Sections) { 1830 SmallVector<SymbolCU, 8> &List = SectionMap[Section]; 1831 if (List.size() < 2) 1832 continue; 1833 1834 // If we have no section (e.g. common), just write out 1835 // individual spans for each symbol. 1836 if (!Section) { 1837 for (const SymbolCU &Cur : List) { 1838 ArangeSpan Span; 1839 Span.Start = Cur.Sym; 1840 Span.End = nullptr; 1841 if (Cur.CU) 1842 Spans[Cur.CU].push_back(Span); 1843 } 1844 continue; 1845 } 1846 1847 // Sort the symbols by offset within the section. 1848 std::sort(List.begin(), List.end(), 1849 [&](const SymbolCU &A, const SymbolCU &B) { 1850 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0; 1851 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0; 1852 1853 // Symbols with no order assigned should be placed at the end. 1854 // (e.g. section end labels) 1855 if (IA == 0) 1856 return false; 1857 if (IB == 0) 1858 return true; 1859 return IA < IB; 1860 }); 1861 1862 // Build spans between each label. 1863 const MCSymbol *StartSym = List[0].Sym; 1864 for (size_t n = 1, e = List.size(); n < e; n++) { 1865 const SymbolCU &Prev = List[n - 1]; 1866 const SymbolCU &Cur = List[n]; 1867 1868 // Try and build the longest span we can within the same CU. 1869 if (Cur.CU != Prev.CU) { 1870 ArangeSpan Span; 1871 Span.Start = StartSym; 1872 Span.End = Cur.Sym; 1873 Spans[Prev.CU].push_back(Span); 1874 StartSym = Cur.Sym; 1875 } 1876 } 1877 } 1878 1879 unsigned PtrSize = Asm->getDataLayout().getPointerSize(); 1880 1881 // Build a list of CUs used. 1882 std::vector<DwarfCompileUnit *> CUs; 1883 for (const auto &it : Spans) { 1884 DwarfCompileUnit *CU = it.first; 1885 CUs.push_back(CU); 1886 } 1887 1888 // Sort the CU list (again, to ensure consistent output order). 1889 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) { 1890 return A->getUniqueID() < B->getUniqueID(); 1891 }); 1892 1893 // Emit an arange table for each CU we used. 1894 for (DwarfCompileUnit *CU : CUs) { 1895 std::vector<ArangeSpan> &List = Spans[CU]; 1896 1897 // Describe the skeleton CU's offset and length, not the dwo file's. 1898 if (auto *Skel = CU->getSkeleton()) 1899 CU = Skel; 1900 1901 // Emit size of content not including length itself. 1902 unsigned ContentSize = 1903 sizeof(int16_t) + // DWARF ARange version number 1904 sizeof(int32_t) + // Offset of CU in the .debug_info section 1905 sizeof(int8_t) + // Pointer Size (in bytes) 1906 sizeof(int8_t); // Segment Size (in bytes) 1907 1908 unsigned TupleSize = PtrSize * 2; 1909 1910 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple. 1911 unsigned Padding = 1912 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize); 1913 1914 ContentSize += Padding; 1915 ContentSize += (List.size() + 1) * TupleSize; 1916 1917 // For each compile unit, write the list of spans it covers. 1918 Asm->OutStreamer.AddComment("Length of ARange Set"); 1919 Asm->EmitInt32(ContentSize); 1920 Asm->OutStreamer.AddComment("DWARF Arange version number"); 1921 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION); 1922 Asm->OutStreamer.AddComment("Offset Into Debug Info Section"); 1923 Asm->EmitSectionOffset(CU->getLabelBegin(), CU->getSectionSym()); 1924 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 1925 Asm->EmitInt8(PtrSize); 1926 Asm->OutStreamer.AddComment("Segment Size (in bytes)"); 1927 Asm->EmitInt8(0); 1928 1929 Asm->OutStreamer.EmitFill(Padding, 0xff); 1930 1931 for (const ArangeSpan &Span : List) { 1932 Asm->EmitLabelReference(Span.Start, PtrSize); 1933 1934 // Calculate the size as being from the span start to it's end. 1935 if (Span.End) { 1936 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize); 1937 } else { 1938 // For symbols without an end marker (e.g. common), we 1939 // write a single arange entry containing just that one symbol. 1940 uint64_t Size = SymSize[Span.Start]; 1941 if (Size == 0) 1942 Size = 1; 1943 1944 Asm->OutStreamer.EmitIntValue(Size, PtrSize); 1945 } 1946 } 1947 1948 Asm->OutStreamer.AddComment("ARange terminator"); 1949 Asm->OutStreamer.EmitIntValue(0, PtrSize); 1950 Asm->OutStreamer.EmitIntValue(0, PtrSize); 1951 } 1952 } 1953 1954 // Emit visible names into a debug ranges section. 1955 void DwarfDebug::emitDebugRanges() { 1956 // Start the dwarf ranges section. 1957 Asm->OutStreamer.SwitchSection( 1958 Asm->getObjFileLowering().getDwarfRangesSection()); 1959 1960 // Size for our labels. 1961 unsigned char Size = Asm->getDataLayout().getPointerSize(); 1962 1963 // Grab the specific ranges for the compile units in the module. 1964 for (const auto &I : CUMap) { 1965 DwarfCompileUnit *TheCU = I.second; 1966 1967 if (auto *Skel = TheCU->getSkeleton()) 1968 TheCU = Skel; 1969 1970 // Iterate over the misc ranges for the compile units in the module. 1971 for (const RangeSpanList &List : TheCU->getRangeLists()) { 1972 // Emit our symbol so we can find the beginning of the range. 1973 Asm->OutStreamer.EmitLabel(List.getSym()); 1974 1975 for (const RangeSpan &Range : List.getRanges()) { 1976 const MCSymbol *Begin = Range.getStart(); 1977 const MCSymbol *End = Range.getEnd(); 1978 assert(Begin && "Range without a begin symbol?"); 1979 assert(End && "Range without an end symbol?"); 1980 if (auto *Base = TheCU->getBaseAddress()) { 1981 Asm->EmitLabelDifference(Begin, Base, Size); 1982 Asm->EmitLabelDifference(End, Base, Size); 1983 } else { 1984 Asm->OutStreamer.EmitSymbolValue(Begin, Size); 1985 Asm->OutStreamer.EmitSymbolValue(End, Size); 1986 } 1987 } 1988 1989 // And terminate the list with two 0 values. 1990 Asm->OutStreamer.EmitIntValue(0, Size); 1991 Asm->OutStreamer.EmitIntValue(0, Size); 1992 } 1993 } 1994 } 1995 1996 // DWARF5 Experimental Separate Dwarf emitters. 1997 1998 void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die, 1999 std::unique_ptr<DwarfUnit> NewU) { 2000 NewU->addString(Die, dwarf::DW_AT_GNU_dwo_name, 2001 U.getCUNode().getSplitDebugFilename()); 2002 2003 if (!CompilationDir.empty()) 2004 NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 2005 2006 addGnuPubAttributes(*NewU, Die); 2007 2008 SkeletonHolder.addUnit(std::move(NewU)); 2009 } 2010 2011 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list, 2012 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id, 2013 // DW_AT_addr_base, DW_AT_ranges_base. 2014 DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) { 2015 2016 auto OwnedUnit = make_unique<DwarfCompileUnit>( 2017 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder); 2018 DwarfCompileUnit &NewCU = *OwnedUnit; 2019 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(), 2020 DwarfInfoSectionSym); 2021 2022 NewCU.initStmtList(DwarfLineSectionSym); 2023 2024 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit)); 2025 2026 return NewCU; 2027 } 2028 2029 // Emit the .debug_info.dwo section for separated dwarf. This contains the 2030 // compile units that would normally be in debug_info. 2031 void DwarfDebug::emitDebugInfoDWO() { 2032 assert(useSplitDwarf() && "No split dwarf debug info?"); 2033 // Don't pass an abbrev symbol, using a constant zero instead so as not to 2034 // emit relocations into the dwo file. 2035 InfoHolder.emitUnits(/* AbbrevSymbol */ nullptr); 2036 } 2037 2038 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the 2039 // abbreviations for the .debug_info.dwo section. 2040 void DwarfDebug::emitDebugAbbrevDWO() { 2041 assert(useSplitDwarf() && "No split dwarf?"); 2042 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection()); 2043 } 2044 2045 void DwarfDebug::emitDebugLineDWO() { 2046 assert(useSplitDwarf() && "No split dwarf?"); 2047 Asm->OutStreamer.SwitchSection( 2048 Asm->getObjFileLowering().getDwarfLineDWOSection()); 2049 SplitTypeUnitFileTable.Emit(Asm->OutStreamer); 2050 } 2051 2052 // Emit the .debug_str.dwo section for separated dwarf. This contains the 2053 // string section and is identical in format to traditional .debug_str 2054 // sections. 2055 void DwarfDebug::emitDebugStrDWO() { 2056 assert(useSplitDwarf() && "No split dwarf?"); 2057 const MCSection *OffSec = 2058 Asm->getObjFileLowering().getDwarfStrOffDWOSection(); 2059 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(), 2060 OffSec); 2061 } 2062 2063 MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) { 2064 if (!useSplitDwarf()) 2065 return nullptr; 2066 if (SingleCU) 2067 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory()); 2068 return &SplitTypeUnitFileTable; 2069 } 2070 2071 static uint64_t makeTypeSignature(StringRef Identifier) { 2072 MD5 Hash; 2073 Hash.update(Identifier); 2074 // ... take the least significant 8 bytes and return those. Our MD5 2075 // implementation always returns its results in little endian, swap bytes 2076 // appropriately. 2077 MD5::MD5Result Result; 2078 Hash.final(Result); 2079 return *reinterpret_cast<support::ulittle64_t *>(Result + 8); 2080 } 2081 2082 void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, 2083 StringRef Identifier, DIE &RefDie, 2084 DICompositeType CTy) { 2085 // Fast path if we're building some type units and one has already used the 2086 // address pool we know we're going to throw away all this work anyway, so 2087 // don't bother building dependent types. 2088 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed()) 2089 return; 2090 2091 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy]; 2092 if (TU) { 2093 CU.addDIETypeSignature(RefDie, *TU); 2094 return; 2095 } 2096 2097 bool TopLevelType = TypeUnitsUnderConstruction.empty(); 2098 AddrPool.resetUsedFlag(); 2099 2100 auto OwnedUnit = make_unique<DwarfTypeUnit>( 2101 InfoHolder.getUnits().size() + TypeUnitsUnderConstruction.size(), CU, Asm, 2102 this, &InfoHolder, getDwoLineTable(CU)); 2103 DwarfTypeUnit &NewTU = *OwnedUnit; 2104 DIE &UnitDie = NewTU.getUnitDie(); 2105 TU = &NewTU; 2106 TypeUnitsUnderConstruction.push_back( 2107 std::make_pair(std::move(OwnedUnit), CTy)); 2108 2109 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 2110 CU.getLanguage()); 2111 2112 uint64_t Signature = makeTypeSignature(Identifier); 2113 NewTU.setTypeSignature(Signature); 2114 2115 if (useSplitDwarf()) 2116 NewTU.initSection(Asm->getObjFileLowering().getDwarfTypesDWOSection()); 2117 else { 2118 CU.applyStmtList(UnitDie); 2119 NewTU.initSection( 2120 Asm->getObjFileLowering().getDwarfTypesSection(Signature)); 2121 } 2122 2123 NewTU.setType(NewTU.createTypeDIE(CTy)); 2124 2125 if (TopLevelType) { 2126 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction); 2127 TypeUnitsUnderConstruction.clear(); 2128 2129 // Types referencing entries in the address table cannot be placed in type 2130 // units. 2131 if (AddrPool.hasBeenUsed()) { 2132 2133 // Remove all the types built while building this type. 2134 // This is pessimistic as some of these types might not be dependent on 2135 // the type that used an address. 2136 for (const auto &TU : TypeUnitsToAdd) 2137 DwarfTypeUnits.erase(TU.second); 2138 2139 // Construct this type in the CU directly. 2140 // This is inefficient because all the dependent types will be rebuilt 2141 // from scratch, including building them in type units, discovering that 2142 // they depend on addresses, throwing them out and rebuilding them. 2143 CU.constructTypeDIE(RefDie, CTy); 2144 return; 2145 } 2146 2147 // If the type wasn't dependent on fission addresses, finish adding the type 2148 // and all its dependent types. 2149 for (auto &TU : TypeUnitsToAdd) 2150 InfoHolder.addUnit(std::move(TU.first)); 2151 } 2152 CU.addDIETypeSignature(RefDie, NewTU); 2153 } 2154 2155 // Accelerator table mutators - add each name along with its companion 2156 // DIE to the proper table while ensuring that the name that we're going 2157 // to reference is in the string table. We do this since the names we 2158 // add may not only be identical to the names in the DIE. 2159 void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) { 2160 if (!useDwarfAccelTables()) 2161 return; 2162 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name), 2163 &Die); 2164 } 2165 2166 void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) { 2167 if (!useDwarfAccelTables()) 2168 return; 2169 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name), 2170 &Die); 2171 } 2172 2173 void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) { 2174 if (!useDwarfAccelTables()) 2175 return; 2176 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name), 2177 &Die); 2178 } 2179 2180 void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) { 2181 if (!useDwarfAccelTables()) 2182 return; 2183 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name), 2184 &Die); 2185 } 2186