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 #define DEBUG_TYPE "dwarfdebug" 15 #include "ByteStreamer.h" 16 #include "DwarfDebug.h" 17 #include "DIE.h" 18 #include "DIEHash.h" 19 #include "DwarfAccelTable.h" 20 #include "DwarfUnit.h" 21 #include "llvm/ADT/STLExtras.h" 22 #include "llvm/ADT/Statistic.h" 23 #include "llvm/ADT/StringExtras.h" 24 #include "llvm/ADT/Triple.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/ErrorHandling.h" 42 #include "llvm/Support/FormattedStream.h" 43 #include "llvm/Support/LEB128.h" 44 #include "llvm/Support/MD5.h" 45 #include "llvm/Support/Path.h" 46 #include "llvm/Support/Timer.h" 47 #include "llvm/Target/TargetFrameLowering.h" 48 #include "llvm/Target/TargetLoweringObjectFile.h" 49 #include "llvm/Target/TargetMachine.h" 50 #include "llvm/Target/TargetOptions.h" 51 #include "llvm/Target/TargetRegisterInfo.h" 52 using namespace llvm; 53 54 static cl::opt<bool> 55 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden, 56 cl::desc("Disable debug info printing")); 57 58 static cl::opt<bool> UnknownLocations( 59 "use-unknown-locations", cl::Hidden, 60 cl::desc("Make an absence of debug location information explicit."), 61 cl::init(false)); 62 63 static cl::opt<bool> 64 GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden, 65 cl::desc("Generate GNU-style pubnames and pubtypes"), 66 cl::init(false)); 67 68 static cl::opt<bool> GenerateARangeSection("generate-arange-section", 69 cl::Hidden, 70 cl::desc("Generate dwarf aranges"), 71 cl::init(false)); 72 73 namespace { 74 enum DefaultOnOff { Default, Enable, Disable }; 75 } 76 77 static cl::opt<DefaultOnOff> 78 DwarfAccelTables("dwarf-accel-tables", cl::Hidden, 79 cl::desc("Output prototype dwarf accelerator tables."), 80 cl::values(clEnumVal(Default, "Default for platform"), 81 clEnumVal(Enable, "Enabled"), 82 clEnumVal(Disable, "Disabled"), clEnumValEnd), 83 cl::init(Default)); 84 85 static cl::opt<DefaultOnOff> 86 SplitDwarf("split-dwarf", cl::Hidden, 87 cl::desc("Output DWARF5 split debug info."), 88 cl::values(clEnumVal(Default, "Default for platform"), 89 clEnumVal(Enable, "Enabled"), 90 clEnumVal(Disable, "Disabled"), clEnumValEnd), 91 cl::init(Default)); 92 93 static cl::opt<DefaultOnOff> 94 DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden, 95 cl::desc("Generate DWARF pubnames and pubtypes sections"), 96 cl::values(clEnumVal(Default, "Default for platform"), 97 clEnumVal(Enable, "Enabled"), 98 clEnumVal(Disable, "Disabled"), clEnumValEnd), 99 cl::init(Default)); 100 101 static cl::opt<unsigned> 102 DwarfVersionNumber("dwarf-version", cl::Hidden, 103 cl::desc("Generate DWARF for dwarf version."), cl::init(0)); 104 105 static const char *const DWARFGroupName = "DWARF Emission"; 106 static const char *const DbgTimerName = "DWARF Debug Writer"; 107 108 //===----------------------------------------------------------------------===// 109 110 namespace llvm { 111 112 /// resolve - Look in the DwarfDebug map for the MDNode that 113 /// corresponds to the reference. 114 template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const { 115 return DD->resolve(Ref); 116 } 117 118 bool DbgVariable::isBlockByrefVariable() const { 119 assert(Var.isVariable() && "Invalid complex DbgVariable!"); 120 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap()); 121 } 122 123 124 DIType DbgVariable::getType() const { 125 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap()); 126 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 127 // addresses instead. 128 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) { 129 /* Byref variables, in Blocks, are declared by the programmer as 130 "SomeType VarName;", but the compiler creates a 131 __Block_byref_x_VarName struct, and gives the variable VarName 132 either the struct, or a pointer to the struct, as its type. This 133 is necessary for various behind-the-scenes things the compiler 134 needs to do with by-reference variables in blocks. 135 136 However, as far as the original *programmer* is concerned, the 137 variable should still have type 'SomeType', as originally declared. 138 139 The following function dives into the __Block_byref_x_VarName 140 struct to find the original type of the variable. This will be 141 passed back to the code generating the type for the Debug 142 Information Entry for the variable 'VarName'. 'VarName' will then 143 have the original type 'SomeType' in its debug information. 144 145 The original type 'SomeType' will be the type of the field named 146 'VarName' inside the __Block_byref_x_VarName struct. 147 148 NOTE: In order for this to not completely fail on the debugger 149 side, the Debug Information Entry for the variable VarName needs to 150 have a DW_AT_location that tells the debugger how to unwind through 151 the pointers and __Block_byref_x_VarName struct to find the actual 152 value of the variable. The function addBlockByrefType does this. */ 153 DIType subType = Ty; 154 uint16_t tag = Ty.getTag(); 155 156 if (tag == dwarf::DW_TAG_pointer_type) 157 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom()); 158 159 DIArray Elements = DICompositeType(subType).getTypeArray(); 160 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 161 DIDerivedType DT(Elements.getElement(i)); 162 if (getName() == DT.getName()) 163 return (resolve(DT.getTypeDerivedFrom())); 164 } 165 } 166 return Ty; 167 } 168 169 } // end llvm namespace 170 171 /// Return Dwarf Version by checking module flags. 172 static unsigned getDwarfVersionFromModule(const Module *M) { 173 Value *Val = M->getModuleFlag("Dwarf Version"); 174 if (!Val) 175 return dwarf::DWARF_VERSION; 176 return cast<ConstantInt>(Val)->getZExtValue(); 177 } 178 179 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 180 : Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0), 181 InfoHolder(A, "info_string", DIEValueAllocator), 182 UsedNonDefaultText(false), 183 SkeletonHolder(A, "skel_string", DIEValueAllocator) { 184 185 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = 0; 186 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0; 187 DwarfAddrSectionSym = 0; 188 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0; 189 FunctionBeginSym = FunctionEndSym = 0; 190 CurFn = 0; 191 CurMI = 0; 192 193 // Turn on accelerator tables for Darwin by default, pubnames by 194 // default for non-Darwin, and handle split dwarf. 195 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin(); 196 197 if (DwarfAccelTables == Default) 198 HasDwarfAccelTables = IsDarwin; 199 else 200 HasDwarfAccelTables = DwarfAccelTables == Enable; 201 202 if (SplitDwarf == Default) 203 HasSplitDwarf = false; 204 else 205 HasSplitDwarf = SplitDwarf == Enable; 206 207 if (DwarfPubSections == Default) 208 HasDwarfPubSections = !IsDarwin; 209 else 210 HasDwarfPubSections = DwarfPubSections == Enable; 211 212 DwarfVersion = DwarfVersionNumber 213 ? DwarfVersionNumber 214 : getDwarfVersionFromModule(MMI->getModule()); 215 216 { 217 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 218 beginModule(); 219 } 220 } 221 222 // Switch to the specified MCSection and emit an assembler 223 // temporary label to it if SymbolStem is specified. 224 static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section, 225 const char *SymbolStem = 0) { 226 Asm->OutStreamer.SwitchSection(Section); 227 if (!SymbolStem) 228 return 0; 229 230 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem); 231 Asm->OutStreamer.EmitLabel(TmpSym); 232 return TmpSym; 233 } 234 235 DwarfFile::~DwarfFile() { 236 for (DwarfUnit *DU : CUs) 237 delete DU; 238 } 239 240 MCSymbol *DwarfFile::getStringPoolSym() { 241 return Asm->GetTempSymbol(StringPref); 242 } 243 244 MCSymbol *DwarfFile::getStringPoolEntry(StringRef Str) { 245 std::pair<MCSymbol *, unsigned> &Entry = 246 StringPool.GetOrCreateValue(Str).getValue(); 247 if (Entry.first) 248 return Entry.first; 249 250 Entry.second = NextStringPoolNumber++; 251 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second); 252 } 253 254 unsigned DwarfFile::getStringPoolIndex(StringRef Str) { 255 std::pair<MCSymbol *, unsigned> &Entry = 256 StringPool.GetOrCreateValue(Str).getValue(); 257 if (Entry.first) 258 return Entry.second; 259 260 Entry.second = NextStringPoolNumber++; 261 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second); 262 return Entry.second; 263 } 264 265 unsigned DwarfFile::getAddrPoolIndex(const MCSymbol *Sym, bool TLS) { 266 std::pair<AddrPool::iterator, bool> P = AddressPool.insert( 267 std::make_pair(Sym, AddressPoolEntry(NextAddrPoolNumber, TLS))); 268 if (P.second) 269 ++NextAddrPoolNumber; 270 return P.first->second.Number; 271 } 272 273 // Define a unique number for the abbreviation. 274 // 275 void DwarfFile::assignAbbrevNumber(DIEAbbrev &Abbrev) { 276 // Check the set for priors. 277 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev); 278 279 // If it's newly added. 280 if (InSet == &Abbrev) { 281 // Add to abbreviation list. 282 Abbreviations.push_back(&Abbrev); 283 284 // Assign the vector position + 1 as its number. 285 Abbrev.setNumber(Abbreviations.size()); 286 } else { 287 // Assign existing abbreviation number. 288 Abbrev.setNumber(InSet->getNumber()); 289 } 290 } 291 292 static bool isObjCClass(StringRef Name) { 293 return Name.startswith("+") || Name.startswith("-"); 294 } 295 296 static bool hasObjCCategory(StringRef Name) { 297 if (!isObjCClass(Name)) 298 return false; 299 300 return Name.find(") ") != StringRef::npos; 301 } 302 303 static void getObjCClassCategory(StringRef In, StringRef &Class, 304 StringRef &Category) { 305 if (!hasObjCCategory(In)) { 306 Class = In.slice(In.find('[') + 1, In.find(' ')); 307 Category = ""; 308 return; 309 } 310 311 Class = In.slice(In.find('[') + 1, In.find('(')); 312 Category = In.slice(In.find('[') + 1, In.find(' ')); 313 return; 314 } 315 316 static StringRef getObjCMethodName(StringRef In) { 317 return In.slice(In.find(' ') + 1, In.find(']')); 318 } 319 320 // Helper for sorting sections into a stable output order. 321 static bool SectionSort(const MCSection *A, const MCSection *B) { 322 std::string LA = (A ? A->getLabelBeginName() : ""); 323 std::string LB = (B ? B->getLabelBeginName() : ""); 324 return LA < LB; 325 } 326 327 // Add the various names to the Dwarf accelerator table names. 328 // TODO: Determine whether or not we should add names for programs 329 // that do not have a DW_AT_name or DW_AT_linkage_name field - this 330 // is only slightly different than the lookup of non-standard ObjC names. 331 static void addSubprogramNames(DwarfUnit *TheU, DISubprogram SP, DIE *Die) { 332 if (!SP.isDefinition()) 333 return; 334 TheU->addAccelName(SP.getName(), Die); 335 336 // If the linkage name is different than the name, go ahead and output 337 // that as well into the name table. 338 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName()) 339 TheU->addAccelName(SP.getLinkageName(), Die); 340 341 // If this is an Objective-C selector name add it to the ObjC accelerator 342 // too. 343 if (isObjCClass(SP.getName())) { 344 StringRef Class, Category; 345 getObjCClassCategory(SP.getName(), Class, Category); 346 TheU->addAccelObjC(Class, Die); 347 if (Category != "") 348 TheU->addAccelObjC(Category, Die); 349 // Also add the base method name to the name table. 350 TheU->addAccelName(getObjCMethodName(SP.getName()), Die); 351 } 352 } 353 354 /// isSubprogramContext - Return true if Context is either a subprogram 355 /// or another context nested inside a subprogram. 356 bool DwarfDebug::isSubprogramContext(const MDNode *Context) { 357 if (!Context) 358 return false; 359 DIDescriptor D(Context); 360 if (D.isSubprogram()) 361 return true; 362 if (D.isType()) 363 return isSubprogramContext(resolve(DIType(Context).getContext())); 364 return false; 365 } 366 367 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc 368 // and DW_AT_high_pc attributes. If there are global variables in this 369 // scope then create and insert DIEs for these variables. 370 DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit *SPCU, 371 DISubprogram SP) { 372 DIE *SPDie = SPCU->getDIE(SP); 373 374 assert(SPDie && "Unable to find subprogram DIE!"); 375 376 // If we're updating an abstract DIE, then we will be adding the children and 377 // object pointer later on. But what we don't want to do is process the 378 // concrete DIE twice. 379 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) { 380 // Pick up abstract subprogram DIE. 381 SPDie = 382 SPCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *SPCU->getUnitDie()); 383 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin, AbsSPDIE); 384 } else { 385 DISubprogram SPDecl = SP.getFunctionDeclaration(); 386 if (!SPDecl.isSubprogram()) { 387 // There is not any need to generate specification DIE for a function 388 // defined at compile unit level. If a function is defined inside another 389 // function then gdb prefers the definition at top level and but does not 390 // expect specification DIE in parent function. So avoid creating 391 // specification DIE for a function defined inside a function. 392 DIScope SPContext = resolve(SP.getContext()); 393 if (SP.isDefinition() && !SPContext.isCompileUnit() && 394 !SPContext.isFile() && !isSubprogramContext(SPContext)) { 395 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration); 396 397 // Add arguments. 398 DICompositeType SPTy = SP.getType(); 399 DIArray Args = SPTy.getTypeArray(); 400 uint16_t SPTag = SPTy.getTag(); 401 if (SPTag == dwarf::DW_TAG_subroutine_type) 402 SPCU->constructSubprogramArguments(*SPDie, Args); 403 DIE *SPDeclDie = SPDie; 404 SPDie = SPCU->createAndAddDIE(dwarf::DW_TAG_subprogram, 405 *SPCU->getUnitDie()); 406 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, SPDeclDie); 407 } 408 } 409 } 410 411 attachLowHighPC(SPCU, SPDie, FunctionBeginSym, FunctionEndSym); 412 413 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 414 MachineLocation Location(RI->getFrameRegister(*Asm->MF)); 415 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 416 417 // Add name to the name table, we do this here because we're guaranteed 418 // to have concrete versions of our DW_TAG_subprogram nodes. 419 addSubprogramNames(SPCU, SP, SPDie); 420 421 return SPDie; 422 } 423 424 /// Check whether we should create a DIE for the given Scope, return true 425 /// if we don't create a DIE (the corresponding DIE is null). 426 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) { 427 if (Scope->isAbstractScope()) 428 return false; 429 430 // We don't create a DIE if there is no Range. 431 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges(); 432 if (Ranges.empty()) 433 return true; 434 435 if (Ranges.size() > 1) 436 return false; 437 438 // We don't create a DIE if we have a single Range and the end label 439 // is null. 440 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(); 441 MCSymbol *End = getLabelAfterInsn(RI->second); 442 return !End; 443 } 444 445 static void addSectionLabel(AsmPrinter *Asm, DwarfUnit *U, DIE *D, 446 dwarf::Attribute A, const MCSymbol *L, 447 const MCSymbol *Sec) { 448 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 449 U->addSectionLabel(D, A, L); 450 else 451 U->addSectionDelta(D, A, L, Sec); 452 } 453 454 void DwarfDebug::addScopeRangeList(DwarfCompileUnit *TheCU, DIE *ScopeDIE, 455 const SmallVectorImpl<InsnRange> &Range) { 456 // Emit offset in .debug_range as a relocatable label. emitDIE will handle 457 // emitting it appropriately. 458 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++); 459 460 // Under fission, ranges are specified by constant offsets relative to the 461 // CU's DW_AT_GNU_ranges_base. 462 if (useSplitDwarf()) 463 TheCU->addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym, 464 DwarfDebugRangeSectionSym); 465 else 466 addSectionLabel(Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym, 467 DwarfDebugRangeSectionSym); 468 469 RangeSpanList List(RangeSym); 470 for (const InsnRange &R : Range) { 471 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second)); 472 List.addRange(std::move(Span)); 473 } 474 475 // Add the range list to the set of ranges to be emitted. 476 TheCU->addRangeList(std::move(List)); 477 } 478 479 // Construct new DW_TAG_lexical_block for this scope and attach 480 // DW_AT_low_pc/DW_AT_high_pc labels. 481 DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit *TheCU, 482 LexicalScope *Scope) { 483 if (isLexicalScopeDIENull(Scope)) 484 return 0; 485 486 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 487 if (Scope->isAbstractScope()) 488 return ScopeDIE; 489 490 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges(); 491 492 // If we have multiple ranges, emit them into the range section. 493 if (ScopeRanges.size() > 1) { 494 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges); 495 return ScopeDIE; 496 } 497 498 // Construct the address range for this DIE. 499 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin(); 500 MCSymbol *Start = getLabelBeforeInsn(RI->first); 501 MCSymbol *End = getLabelAfterInsn(RI->second); 502 assert(End && "End label should not be null!"); 503 504 assert(Start->isDefined() && "Invalid starting label for an inlined scope!"); 505 assert(End->isDefined() && "Invalid end label for an inlined scope!"); 506 507 attachLowHighPC(TheCU, ScopeDIE, Start, End); 508 509 return ScopeDIE; 510 } 511 512 // This scope represents inlined body of a function. Construct DIE to 513 // represent this concrete inlined copy of the function. 514 DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit *TheCU, 515 LexicalScope *Scope) { 516 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges(); 517 assert(!ScopeRanges.empty() && 518 "LexicalScope does not have instruction markers!"); 519 520 if (!Scope->getScopeNode()) 521 return NULL; 522 DIScope DS(Scope->getScopeNode()); 523 DISubprogram InlinedSP = getDISubprogram(DS); 524 DIE *OriginDIE = TheCU->getDIE(InlinedSP); 525 if (!OriginDIE) { 526 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram."); 527 return NULL; 528 } 529 530 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 531 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, OriginDIE); 532 533 // If we have multiple ranges, emit them into the range section. 534 if (ScopeRanges.size() > 1) 535 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges); 536 else { 537 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin(); 538 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first); 539 MCSymbol *EndLabel = getLabelAfterInsn(RI->second); 540 541 if (StartLabel == 0 || EndLabel == 0) 542 llvm_unreachable("Unexpected Start and End labels for an inlined scope!"); 543 544 assert(StartLabel->isDefined() && 545 "Invalid starting label for an inlined scope!"); 546 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!"); 547 548 attachLowHighPC(TheCU, ScopeDIE, StartLabel, EndLabel); 549 } 550 551 InlinedSubprogramDIEs.insert(OriginDIE); 552 553 // Add the call site information to the DIE. 554 DILocation DL(Scope->getInlinedAt()); 555 TheCU->addUInt( 556 ScopeDIE, dwarf::DW_AT_call_file, None, 557 TheCU->getOrCreateSourceID(DL.getFilename(), DL.getDirectory())); 558 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber()); 559 560 // Add name to the name table, we do this here because we're guaranteed 561 // to have concrete versions of our DW_TAG_inlined_subprogram nodes. 562 addSubprogramNames(TheCU, InlinedSP, ScopeDIE); 563 564 return ScopeDIE; 565 } 566 567 DIE *DwarfDebug::createScopeChildrenDIE(DwarfCompileUnit *TheCU, 568 LexicalScope *Scope, 569 SmallVectorImpl<DIE *> &Children) { 570 DIE *ObjectPointer = NULL; 571 572 // Collect arguments for current function. 573 if (LScopes.isCurrentFunctionScope(Scope)) { 574 for (DbgVariable *ArgDV : CurrentFnArguments) 575 if (ArgDV) 576 if (DIE *Arg = 577 TheCU->constructVariableDIE(*ArgDV, Scope->isAbstractScope())) { 578 Children.push_back(Arg); 579 if (ArgDV->isObjectPointer()) 580 ObjectPointer = Arg; 581 } 582 583 // If this is a variadic function, add an unspecified parameter. 584 DISubprogram SP(Scope->getScopeNode()); 585 DIArray FnArgs = SP.getType().getTypeArray(); 586 if (FnArgs.getElement(FnArgs.getNumElements() - 1) 587 .isUnspecifiedParameter()) { 588 DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters); 589 Children.push_back(Ellipsis); 590 } 591 } 592 593 // Collect lexical scope children first. 594 for (DbgVariable *DV : ScopeVariables.lookup(Scope)) 595 if (DIE *Variable = TheCU->constructVariableDIE(*DV, 596 Scope->isAbstractScope())) { 597 Children.push_back(Variable); 598 if (DV->isObjectPointer()) 599 ObjectPointer = Variable; 600 } 601 for (LexicalScope *LS : Scope->getChildren()) 602 if (DIE *Nested = constructScopeDIE(TheCU, LS)) 603 Children.push_back(Nested); 604 return ObjectPointer; 605 } 606 607 // Construct a DIE for this scope. 608 DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit *TheCU, 609 LexicalScope *Scope) { 610 if (!Scope || !Scope->getScopeNode()) 611 return NULL; 612 613 DIScope DS(Scope->getScopeNode()); 614 615 SmallVector<DIE *, 8> Children; 616 DIE *ObjectPointer = NULL; 617 bool ChildrenCreated = false; 618 619 // We try to create the scope DIE first, then the children DIEs. This will 620 // avoid creating un-used children then removing them later when we find out 621 // the scope DIE is null. 622 DIE *ScopeDIE = NULL; 623 if (Scope->getInlinedAt()) 624 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope); 625 else if (DS.isSubprogram()) { 626 ProcessedSPNodes.insert(DS); 627 if (Scope->isAbstractScope()) { 628 ScopeDIE = TheCU->getDIE(DS); 629 // Note down abstract DIE. 630 if (ScopeDIE) 631 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE)); 632 } else 633 ScopeDIE = updateSubprogramScopeDIE(TheCU, DISubprogram(DS)); 634 } else { 635 // Early exit when we know the scope DIE is going to be null. 636 if (isLexicalScopeDIENull(Scope)) 637 return NULL; 638 639 // We create children here when we know the scope DIE is not going to be 640 // null and the children will be added to the scope DIE. 641 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children); 642 ChildrenCreated = true; 643 644 // There is no need to emit empty lexical block DIE. 645 std::pair<ImportedEntityMap::const_iterator, 646 ImportedEntityMap::const_iterator> Range = 647 std::equal_range( 648 ScopesWithImportedEntities.begin(), 649 ScopesWithImportedEntities.end(), 650 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode *)0), 651 less_first()); 652 if (Children.empty() && Range.first == Range.second) 653 return NULL; 654 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope); 655 assert(ScopeDIE && "Scope DIE should not be null."); 656 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second; 657 ++i) 658 constructImportedEntityDIE(TheCU, i->second, ScopeDIE); 659 } 660 661 if (!ScopeDIE) { 662 assert(Children.empty() && 663 "We create children only when the scope DIE is not null."); 664 return NULL; 665 } 666 if (!ChildrenCreated) 667 // We create children when the scope DIE is not null. 668 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children); 669 670 // Add children 671 for (DIE *I : Children) 672 ScopeDIE->addChild(I); 673 674 if (DS.isSubprogram() && ObjectPointer != NULL) 675 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, ObjectPointer); 676 677 return ScopeDIE; 678 } 679 680 void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const { 681 if (!GenerateGnuPubSections) 682 return; 683 684 U->addFlag(D, dwarf::DW_AT_GNU_pubnames); 685 } 686 687 // Create new DwarfCompileUnit for the given metadata node with tag 688 // DW_TAG_compile_unit. 689 DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { 690 StringRef FN = DIUnit.getFilename(); 691 CompilationDir = DIUnit.getDirectory(); 692 693 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 694 DwarfCompileUnit *NewCU = new DwarfCompileUnit( 695 InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder); 696 InfoHolder.addUnit(NewCU); 697 698 // LTO with assembly output shares a single line table amongst multiple CUs. 699 // To avoid the compilation directory being ambiguous, let the line table 700 // explicitly describe the directory of all files, never relying on the 701 // compilation directory. 702 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU) 703 Asm->OutStreamer.getContext().setMCLineTableCompilationDir( 704 NewCU->getUniqueID(), CompilationDir); 705 706 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer()); 707 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 708 DIUnit.getLanguage()); 709 NewCU->addString(Die, dwarf::DW_AT_name, FN); 710 711 if (!useSplitDwarf()) { 712 NewCU->initStmtList(DwarfLineSectionSym); 713 714 // If we're using split dwarf the compilation dir is going to be in the 715 // skeleton CU and so we don't need to duplicate it here. 716 if (!CompilationDir.empty()) 717 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 718 719 addGnuPubAttributes(NewCU, Die); 720 } 721 722 if (DIUnit.isOptimized()) 723 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized); 724 725 StringRef Flags = DIUnit.getFlags(); 726 if (!Flags.empty()) 727 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags); 728 729 if (unsigned RVer = DIUnit.getRunTimeVersion()) 730 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 731 dwarf::DW_FORM_data1, RVer); 732 733 if (!FirstCU) 734 FirstCU = NewCU; 735 736 if (useSplitDwarf()) { 737 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(), 738 DwarfInfoDWOSectionSym); 739 NewCU->setSkeleton(constructSkeletonCU(NewCU)); 740 } else 741 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(), 742 DwarfInfoSectionSym); 743 744 CUMap.insert(std::make_pair(DIUnit, NewCU)); 745 CUDieMap.insert(std::make_pair(Die, NewCU)); 746 return NewCU; 747 } 748 749 // Construct subprogram DIE. 750 void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit *TheCU, 751 const MDNode *N) { 752 // FIXME: We should only call this routine once, however, during LTO if a 753 // program is defined in multiple CUs we could end up calling it out of 754 // beginModule as we walk the CUs. 755 756 DwarfCompileUnit *&CURef = SPMap[N]; 757 if (CURef) 758 return; 759 CURef = TheCU; 760 761 DISubprogram SP(N); 762 if (!SP.isDefinition()) 763 // This is a method declaration which will be handled while constructing 764 // class type. 765 return; 766 767 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP); 768 769 // Expose as a global name. 770 TheCU->addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext())); 771 } 772 773 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU, 774 const MDNode *N) { 775 DIImportedEntity Module(N); 776 assert(Module.Verify()); 777 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext())) 778 constructImportedEntityDIE(TheCU, Module, D); 779 } 780 781 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU, 782 const MDNode *N, DIE *Context) { 783 DIImportedEntity Module(N); 784 assert(Module.Verify()); 785 return constructImportedEntityDIE(TheCU, Module, Context); 786 } 787 788 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU, 789 const DIImportedEntity &Module, 790 DIE *Context) { 791 assert(Module.Verify() && 792 "Use one of the MDNode * overloads to handle invalid metadata"); 793 assert(Context && "Should always have a context for an imported_module"); 794 DIE *IMDie = TheCU->createAndAddDIE(Module.getTag(), *Context, Module); 795 DIE *EntityDie; 796 DIDescriptor Entity = resolve(Module.getEntity()); 797 if (Entity.isNameSpace()) 798 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity)); 799 else if (Entity.isSubprogram()) 800 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity)); 801 else if (Entity.isType()) 802 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity)); 803 else 804 EntityDie = TheCU->getDIE(Entity); 805 TheCU->addSourceLine(IMDie, Module.getLineNumber(), 806 Module.getContext().getFilename(), 807 Module.getContext().getDirectory()); 808 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, EntityDie); 809 StringRef Name = Module.getName(); 810 if (!Name.empty()) 811 TheCU->addString(IMDie, dwarf::DW_AT_name, Name); 812 } 813 814 // Emit all Dwarf sections that should come prior to the content. Create 815 // global DIEs and emit initial debug info sections. This is invoked by 816 // the target AsmPrinter. 817 void DwarfDebug::beginModule() { 818 if (DisableDebugInfoPrinting) 819 return; 820 821 const Module *M = MMI->getModule(); 822 823 // If module has named metadata anchors then use them, otherwise scan the 824 // module using debug info finder to collect debug info. 825 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu"); 826 if (!CU_Nodes) 827 return; 828 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes); 829 830 // Emit initial sections so we can reference labels later. 831 emitSectionLabels(); 832 833 SingleCU = CU_Nodes->getNumOperands() == 1; 834 835 for (MDNode *N : CU_Nodes->operands()) { 836 DICompileUnit CUNode(N); 837 DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode); 838 DIArray ImportedEntities = CUNode.getImportedEntities(); 839 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) 840 ScopesWithImportedEntities.push_back(std::make_pair( 841 DIImportedEntity(ImportedEntities.getElement(i)).getContext(), 842 ImportedEntities.getElement(i))); 843 std::sort(ScopesWithImportedEntities.begin(), 844 ScopesWithImportedEntities.end(), less_first()); 845 DIArray GVs = CUNode.getGlobalVariables(); 846 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) 847 CU->createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i))); 848 DIArray SPs = CUNode.getSubprograms(); 849 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) 850 constructSubprogramDIE(CU, SPs.getElement(i)); 851 DIArray EnumTypes = CUNode.getEnumTypes(); 852 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) 853 CU->getOrCreateTypeDIE(EnumTypes.getElement(i)); 854 DIArray RetainedTypes = CUNode.getRetainedTypes(); 855 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) { 856 DIType Ty(RetainedTypes.getElement(i)); 857 // The retained types array by design contains pointers to 858 // MDNodes rather than DIRefs. Unique them here. 859 DIType UniqueTy(resolve(Ty.getRef())); 860 CU->getOrCreateTypeDIE(UniqueTy); 861 } 862 // Emit imported_modules last so that the relevant context is already 863 // available. 864 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) 865 constructImportedEntityDIE(CU, ImportedEntities.getElement(i)); 866 } 867 868 // Tell MMI that we have debug info. 869 MMI->setDebugInfoAvailability(true); 870 871 // Prime section data. 872 SectionMap[Asm->getObjFileLowering().getTextSection()]; 873 } 874 875 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 876 void DwarfDebug::computeInlinedDIEs() { 877 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 878 for (DIE *ISP : InlinedSubprogramDIEs) 879 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); 880 881 for (const auto &AI : AbstractSPDies) { 882 DIE *ISP = AI.second; 883 if (InlinedSubprogramDIEs.count(ISP)) 884 continue; 885 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); 886 } 887 } 888 889 // Collect info for variables that were optimized out. 890 void DwarfDebug::collectDeadVariables() { 891 const Module *M = MMI->getModule(); 892 893 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) { 894 for (MDNode *N : CU_Nodes->operands()) { 895 DICompileUnit TheCU(N); 896 DIArray Subprograms = TheCU.getSubprograms(); 897 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) { 898 DISubprogram SP(Subprograms.getElement(i)); 899 if (ProcessedSPNodes.count(SP) != 0) 900 continue; 901 if (!SP.isSubprogram()) 902 continue; 903 if (!SP.isDefinition()) 904 continue; 905 DIArray Variables = SP.getVariables(); 906 if (Variables.getNumElements() == 0) 907 continue; 908 909 // Construct subprogram DIE and add variables DIEs. 910 DwarfCompileUnit *SPCU = 911 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU)); 912 assert(SPCU && "Unable to find Compile Unit!"); 913 // FIXME: See the comment in constructSubprogramDIE about duplicate 914 // subprogram DIEs. 915 constructSubprogramDIE(SPCU, SP); 916 DIE *SPDIE = SPCU->getDIE(SP); 917 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) { 918 DIVariable DV(Variables.getElement(vi)); 919 if (!DV.isVariable()) 920 continue; 921 DbgVariable NewVar(DV, NULL, this); 922 if (DIE *VariableDIE = SPCU->constructVariableDIE(NewVar, false)) 923 SPDIE->addChild(VariableDIE); 924 } 925 } 926 } 927 } 928 } 929 930 void DwarfDebug::finalizeModuleInfo() { 931 // Collect info for variables that were optimized out. 932 collectDeadVariables(); 933 934 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 935 computeInlinedDIEs(); 936 937 // Handle anything that needs to be done on a per-unit basis after 938 // all other generation. 939 for (DwarfUnit *TheU : getUnits()) { 940 // Emit DW_AT_containing_type attribute to connect types with their 941 // vtable holding type. 942 TheU->constructContainingTypeDIEs(); 943 944 // Add CU specific attributes if we need to add any. 945 if (TheU->getUnitDie()->getTag() == dwarf::DW_TAG_compile_unit) { 946 // If we're splitting the dwarf out now that we've got the entire 947 // CU then add the dwo id to it. 948 DwarfCompileUnit *SkCU = 949 static_cast<DwarfCompileUnit *>(TheU->getSkeleton()); 950 if (useSplitDwarf()) { 951 // Emit a unique identifier for this CU. 952 uint64_t ID = DIEHash(Asm).computeCUSignature(*TheU->getUnitDie()); 953 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 954 dwarf::DW_FORM_data8, ID); 955 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 956 dwarf::DW_FORM_data8, ID); 957 958 // We don't keep track of which addresses are used in which CU so this 959 // is a bit pessimistic under LTO. 960 if (!InfoHolder.getAddrPool()->empty()) 961 addSectionLabel(Asm, SkCU, SkCU->getUnitDie(), 962 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym, 963 DwarfAddrSectionSym); 964 if (!TheU->getRangeLists().empty()) 965 addSectionLabel(Asm, SkCU, SkCU->getUnitDie(), 966 dwarf::DW_AT_GNU_ranges_base, 967 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym); 968 } 969 970 // If we have code split among multiple sections or non-contiguous 971 // ranges of code then emit a DW_AT_ranges attribute on the unit that will 972 // remain in the .o file, otherwise add a DW_AT_low_pc. 973 // FIXME: We should use ranges allow reordering of code ala 974 // .subsections_via_symbols in mach-o. This would mean turning on 975 // ranges for all subprogram DIEs for mach-o. 976 DwarfCompileUnit *U = SkCU ? SkCU : static_cast<DwarfCompileUnit *>(TheU); 977 unsigned NumRanges = TheU->getRanges().size(); 978 if (NumRanges) { 979 if (NumRanges > 1) { 980 addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, 981 Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), 982 DwarfDebugRangeSectionSym); 983 984 // A DW_AT_low_pc attribute may also be specified in combination with 985 // DW_AT_ranges to specify the default base address for use in 986 // location lists (see Section 2.6.2) and range lists (see Section 987 // 2.17.3). 988 U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 989 0); 990 } else { 991 RangeSpan &Range = TheU->getRanges().back(); 992 U->addLocalLabelAddress(U->getUnitDie(), dwarf::DW_AT_low_pc, 993 Range.getStart()); 994 U->addLabelDelta(U->getUnitDie(), dwarf::DW_AT_high_pc, 995 Range.getEnd(), Range.getStart()); 996 } 997 } 998 } 999 } 1000 1001 // Compute DIE offsets and sizes. 1002 InfoHolder.computeSizeAndOffsets(); 1003 if (useSplitDwarf()) 1004 SkeletonHolder.computeSizeAndOffsets(); 1005 } 1006 1007 void DwarfDebug::endSections() { 1008 // Filter labels by section. 1009 for (const SymbolCU &SCU : ArangeLabels) { 1010 if (SCU.Sym->isInSection()) { 1011 // Make a note of this symbol and it's section. 1012 const MCSection *Section = &SCU.Sym->getSection(); 1013 if (!Section->getKind().isMetadata()) 1014 SectionMap[Section].push_back(SCU); 1015 } else { 1016 // Some symbols (e.g. common/bss on mach-o) can have no section but still 1017 // appear in the output. This sucks as we rely on sections to build 1018 // arange spans. We can do it without, but it's icky. 1019 SectionMap[NULL].push_back(SCU); 1020 } 1021 } 1022 1023 // Build a list of sections used. 1024 std::vector<const MCSection *> Sections; 1025 for (const auto &it : SectionMap) { 1026 const MCSection *Section = it.first; 1027 Sections.push_back(Section); 1028 } 1029 1030 // Sort the sections into order. 1031 // This is only done to ensure consistent output order across different runs. 1032 std::sort(Sections.begin(), Sections.end(), SectionSort); 1033 1034 // Add terminating symbols for each section. 1035 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) { 1036 const MCSection *Section = Sections[ID]; 1037 MCSymbol *Sym = NULL; 1038 1039 if (Section) { 1040 // We can't call MCSection::getLabelEndName, as it's only safe to do so 1041 // if we know the section name up-front. For user-created sections, the 1042 // resulting label may not be valid to use as a label. (section names can 1043 // use a greater set of characters on some systems) 1044 Sym = Asm->GetTempSymbol("debug_end", ID); 1045 Asm->OutStreamer.SwitchSection(Section); 1046 Asm->OutStreamer.EmitLabel(Sym); 1047 } 1048 1049 // Insert a final terminator. 1050 SectionMap[Section].push_back(SymbolCU(NULL, Sym)); 1051 } 1052 } 1053 1054 // Emit all Dwarf sections that should come after the content. 1055 void DwarfDebug::endModule() { 1056 assert(CurFn == 0); 1057 assert(CurMI == 0); 1058 1059 if (!FirstCU) 1060 return; 1061 1062 // End any existing sections. 1063 // TODO: Does this need to happen? 1064 endSections(); 1065 1066 // Finalize the debug info for the module. 1067 finalizeModuleInfo(); 1068 1069 emitDebugStr(); 1070 1071 // Emit all the DIEs into a debug info section. 1072 emitDebugInfo(); 1073 1074 // Corresponding abbreviations into a abbrev section. 1075 emitAbbreviations(); 1076 1077 // Emit info into a debug aranges section. 1078 if (GenerateARangeSection) 1079 emitDebugARanges(); 1080 1081 // Emit info into a debug ranges section. 1082 emitDebugRanges(); 1083 1084 if (useSplitDwarf()) { 1085 emitDebugStrDWO(); 1086 emitDebugInfoDWO(); 1087 emitDebugAbbrevDWO(); 1088 emitDebugLineDWO(); 1089 // Emit DWO addresses. 1090 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection()); 1091 emitDebugLocDWO(); 1092 } else 1093 // Emit info into a debug loc section. 1094 emitDebugLoc(); 1095 1096 // Emit info into the dwarf accelerator table sections. 1097 if (useDwarfAccelTables()) { 1098 emitAccelNames(); 1099 emitAccelObjC(); 1100 emitAccelNamespaces(); 1101 emitAccelTypes(); 1102 } 1103 1104 // Emit the pubnames and pubtypes sections if requested. 1105 if (HasDwarfPubSections) { 1106 emitDebugPubNames(GenerateGnuPubSections); 1107 emitDebugPubTypes(GenerateGnuPubSections); 1108 } 1109 1110 // clean up. 1111 SPMap.clear(); 1112 1113 // Reset these for the next Module if we have one. 1114 FirstCU = NULL; 1115 } 1116 1117 // Find abstract variable, if any, associated with Var. 1118 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV, 1119 DebugLoc ScopeLoc) { 1120 LLVMContext &Ctx = DV->getContext(); 1121 // More then one inlined variable corresponds to one abstract variable. 1122 DIVariable Var = cleanseInlinedVariable(DV, Ctx); 1123 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var); 1124 if (AbsDbgVariable) 1125 return AbsDbgVariable; 1126 1127 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx)); 1128 if (!Scope) 1129 return NULL; 1130 1131 AbsDbgVariable = new DbgVariable(Var, NULL, this); 1132 addScopeVariable(Scope, AbsDbgVariable); 1133 AbstractVariables[Var] = AbsDbgVariable; 1134 return AbsDbgVariable; 1135 } 1136 1137 // If Var is a current function argument then add it to CurrentFnArguments list. 1138 bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) { 1139 if (!LScopes.isCurrentFunctionScope(Scope)) 1140 return false; 1141 DIVariable DV = Var->getVariable(); 1142 if (DV.getTag() != dwarf::DW_TAG_arg_variable) 1143 return false; 1144 unsigned ArgNo = DV.getArgNumber(); 1145 if (ArgNo == 0) 1146 return false; 1147 1148 size_t Size = CurrentFnArguments.size(); 1149 if (Size == 0) 1150 CurrentFnArguments.resize(CurFn->getFunction()->arg_size()); 1151 // llvm::Function argument size is not good indicator of how many 1152 // arguments does the function have at source level. 1153 if (ArgNo > Size) 1154 CurrentFnArguments.resize(ArgNo * 2); 1155 CurrentFnArguments[ArgNo - 1] = Var; 1156 return true; 1157 } 1158 1159 // Collect variable information from side table maintained by MMI. 1160 void DwarfDebug::collectVariableInfoFromMMITable( 1161 SmallPtrSet<const MDNode *, 16> &Processed) { 1162 for (const auto &VI : MMI->getVariableDbgInfo()) { 1163 if (!VI.Var) 1164 continue; 1165 Processed.insert(VI.Var); 1166 DIVariable DV(VI.Var); 1167 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc); 1168 1169 // If variable scope is not found then skip this variable. 1170 if (Scope == 0) 1171 continue; 1172 1173 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc); 1174 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this); 1175 RegVar->setFrameIndex(VI.Slot); 1176 if (!addCurrentFnArgument(RegVar, Scope)) 1177 addScopeVariable(Scope, RegVar); 1178 if (AbsDbgVariable) 1179 AbsDbgVariable->setFrameIndex(VI.Slot); 1180 } 1181 } 1182 1183 // Return true if debug value, encoded by DBG_VALUE instruction, is in a 1184 // defined reg. 1185 static bool isDbgValueInDefinedReg(const MachineInstr *MI) { 1186 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 1187 return MI->getNumOperands() == 3 && MI->getOperand(0).isReg() && 1188 MI->getOperand(0).getReg() && 1189 (MI->getOperand(1).isImm() || 1190 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U)); 1191 } 1192 1193 // Get .debug_loc entry for the instruction range starting at MI. 1194 static DebugLocEntry getDebugLocEntry(AsmPrinter *Asm, 1195 const MCSymbol *FLabel, 1196 const MCSymbol *SLabel, 1197 const MachineInstr *MI, 1198 DwarfCompileUnit *Unit) { 1199 const MDNode *Var = MI->getDebugVariable(); 1200 1201 assert(MI->getNumOperands() == 3); 1202 if (MI->getOperand(0).isReg()) { 1203 MachineLocation MLoc; 1204 // If the second operand is an immediate, this is a 1205 // register-indirect address. 1206 if (!MI->getOperand(1).isImm()) 1207 MLoc.set(MI->getOperand(0).getReg()); 1208 else 1209 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); 1210 return DebugLocEntry(FLabel, SLabel, MLoc, Var, Unit); 1211 } 1212 if (MI->getOperand(0).isImm()) 1213 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm(), Var, Unit); 1214 if (MI->getOperand(0).isFPImm()) 1215 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm(), 1216 Var, Unit); 1217 if (MI->getOperand(0).isCImm()) 1218 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm(), 1219 Var, Unit); 1220 1221 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!"); 1222 } 1223 1224 // Find variables for each lexical scope. 1225 void 1226 DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) { 1227 1228 // Grab the variable info that was squirreled away in the MMI side-table. 1229 collectVariableInfoFromMMITable(Processed); 1230 1231 for (const MDNode *Var : UserVariables) { 1232 if (Processed.count(Var)) 1233 continue; 1234 1235 // History contains relevant DBG_VALUE instructions for Var and instructions 1236 // clobbering it. 1237 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var]; 1238 if (History.empty()) 1239 continue; 1240 const MachineInstr *MInsn = History.front(); 1241 1242 DIVariable DV(Var); 1243 LexicalScope *Scope = NULL; 1244 if (DV.getTag() == dwarf::DW_TAG_arg_variable && 1245 DISubprogram(DV.getContext()).describes(CurFn->getFunction())) 1246 Scope = LScopes.getCurrentFunctionScope(); 1247 else if (MDNode *IA = DV.getInlinedAt()) 1248 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA)); 1249 else 1250 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1))); 1251 // If variable scope is not found then skip this variable. 1252 if (!Scope) 1253 continue; 1254 1255 Processed.insert(DV); 1256 assert(MInsn->isDebugValue() && "History must begin with debug value"); 1257 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc()); 1258 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this); 1259 if (!addCurrentFnArgument(RegVar, Scope)) 1260 addScopeVariable(Scope, RegVar); 1261 if (AbsVar) 1262 AbsVar->setMInsn(MInsn); 1263 1264 // Simplify ranges that are fully coalesced. 1265 if (History.size() <= 1 || 1266 (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) { 1267 RegVar->setMInsn(MInsn); 1268 continue; 1269 } 1270 1271 // Handle multiple DBG_VALUE instructions describing one variable. 1272 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 1273 1274 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1); 1275 DebugLocList &LocList = DotDebugLocEntries.back(); 1276 LocList.Label = 1277 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1); 1278 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List; 1279 for (SmallVectorImpl<const MachineInstr *>::const_iterator 1280 HI = History.begin(), 1281 HE = History.end(); 1282 HI != HE; ++HI) { 1283 const MachineInstr *Begin = *HI; 1284 assert(Begin->isDebugValue() && "Invalid History entry"); 1285 1286 // Check if DBG_VALUE is truncating a range. 1287 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() && 1288 !Begin->getOperand(0).getReg()) 1289 continue; 1290 1291 // Compute the range for a register location. 1292 const MCSymbol *FLabel = getLabelBeforeInsn(Begin); 1293 const MCSymbol *SLabel = 0; 1294 1295 if (HI + 1 == HE) 1296 // If Begin is the last instruction in History then its value is valid 1297 // until the end of the function. 1298 SLabel = FunctionEndSym; 1299 else { 1300 const MachineInstr *End = HI[1]; 1301 DEBUG(dbgs() << "DotDebugLoc Pair:\n" 1302 << "\t" << *Begin << "\t" << *End << "\n"); 1303 if (End->isDebugValue()) 1304 SLabel = getLabelBeforeInsn(End); 1305 else { 1306 // End is a normal instruction clobbering the range. 1307 SLabel = getLabelAfterInsn(End); 1308 assert(SLabel && "Forgot label after clobber instruction"); 1309 ++HI; 1310 } 1311 } 1312 1313 // The value is valid until the next DBG_VALUE or clobber. 1314 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1315 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1316 DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU); 1317 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) 1318 DebugLoc.push_back(std::move(Loc)); 1319 } 1320 } 1321 1322 // Collect info for variables that were optimized out. 1323 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1324 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables(); 1325 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1326 DIVariable DV(Variables.getElement(i)); 1327 if (!DV || !DV.isVariable() || !Processed.insert(DV)) 1328 continue; 1329 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) 1330 addScopeVariable(Scope, new DbgVariable(DV, NULL, this)); 1331 } 1332 } 1333 1334 // Return Label preceding the instruction. 1335 MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 1336 MCSymbol *Label = LabelsBeforeInsn.lookup(MI); 1337 assert(Label && "Didn't insert label before instruction"); 1338 return Label; 1339 } 1340 1341 // Return Label immediately following the instruction. 1342 MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 1343 return LabelsAfterInsn.lookup(MI); 1344 } 1345 1346 // Process beginning of an instruction. 1347 void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1348 assert(CurMI == 0); 1349 CurMI = MI; 1350 // Check if source location changes, but ignore DBG_VALUE locations. 1351 if (!MI->isDebugValue()) { 1352 DebugLoc DL = MI->getDebugLoc(); 1353 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) { 1354 unsigned Flags = 0; 1355 PrevInstLoc = DL; 1356 if (DL == PrologEndLoc) { 1357 Flags |= DWARF2_FLAG_PROLOGUE_END; 1358 PrologEndLoc = DebugLoc(); 1359 } 1360 if (PrologEndLoc.isUnknown()) 1361 Flags |= DWARF2_FLAG_IS_STMT; 1362 1363 if (!DL.isUnknown()) { 1364 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 1365 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags); 1366 } else 1367 recordSourceLine(0, 0, 0, 0); 1368 } 1369 } 1370 1371 // Insert labels where requested. 1372 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 1373 LabelsBeforeInsn.find(MI); 1374 1375 // No label needed. 1376 if (I == LabelsBeforeInsn.end()) 1377 return; 1378 1379 // Label already assigned. 1380 if (I->second) 1381 return; 1382 1383 if (!PrevLabel) { 1384 PrevLabel = MMI->getContext().CreateTempSymbol(); 1385 Asm->OutStreamer.EmitLabel(PrevLabel); 1386 } 1387 I->second = PrevLabel; 1388 } 1389 1390 // Process end of an instruction. 1391 void DwarfDebug::endInstruction() { 1392 assert(CurMI != 0); 1393 // Don't create a new label after DBG_VALUE instructions. 1394 // They don't generate code. 1395 if (!CurMI->isDebugValue()) 1396 PrevLabel = 0; 1397 1398 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 1399 LabelsAfterInsn.find(CurMI); 1400 CurMI = 0; 1401 1402 // No label needed. 1403 if (I == LabelsAfterInsn.end()) 1404 return; 1405 1406 // Label already assigned. 1407 if (I->second) 1408 return; 1409 1410 // We need a label after this instruction. 1411 if (!PrevLabel) { 1412 PrevLabel = MMI->getContext().CreateTempSymbol(); 1413 Asm->OutStreamer.EmitLabel(PrevLabel); 1414 } 1415 I->second = PrevLabel; 1416 } 1417 1418 // Each LexicalScope has first instruction and last instruction to mark 1419 // beginning and end of a scope respectively. Create an inverse map that list 1420 // scopes starts (and ends) with an instruction. One instruction may start (or 1421 // end) multiple scopes. Ignore scopes that are not reachable. 1422 void DwarfDebug::identifyScopeMarkers() { 1423 SmallVector<LexicalScope *, 4> WorkList; 1424 WorkList.push_back(LScopes.getCurrentFunctionScope()); 1425 while (!WorkList.empty()) { 1426 LexicalScope *S = WorkList.pop_back_val(); 1427 1428 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren(); 1429 if (!Children.empty()) 1430 WorkList.append(Children.begin(), Children.end()); 1431 1432 if (S->isAbstractScope()) 1433 continue; 1434 1435 for (const InsnRange &R : S->getRanges()) { 1436 assert(R.first && "InsnRange does not have first instruction!"); 1437 assert(R.second && "InsnRange does not have second instruction!"); 1438 requestLabelBeforeInsn(R.first); 1439 requestLabelAfterInsn(R.second); 1440 } 1441 } 1442 } 1443 1444 // Gather pre-function debug information. Assumes being called immediately 1445 // after the function entry point has been emitted. 1446 void DwarfDebug::beginFunction(const MachineFunction *MF) { 1447 CurFn = MF; 1448 1449 // If there's no debug info for the function we're not going to do anything. 1450 if (!MMI->hasDebugInfo()) 1451 return; 1452 1453 // Grab the lexical scopes for the function, if we don't have any of those 1454 // then we're not going to be able to do anything. 1455 LScopes.initialize(*MF); 1456 if (LScopes.empty()) 1457 return; 1458 1459 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned"); 1460 1461 // Make sure that each lexical scope will have a begin/end label. 1462 identifyScopeMarkers(); 1463 1464 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function 1465 // belongs to so that we add to the correct per-cu line table in the 1466 // non-asm case. 1467 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1468 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1469 assert(TheCU && "Unable to find compile unit!"); 1470 if (Asm->OutStreamer.hasRawTextSupport()) 1471 // Use a single line table if we are generating assembly. 1472 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0); 1473 else 1474 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID()); 1475 1476 // Emit a label for the function so that we have a beginning address. 1477 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()); 1478 // Assumes in correct section after the entry point. 1479 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 1480 1481 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1482 // LiveUserVar - Map physreg numbers to the MDNode they contain. 1483 std::vector<const MDNode *> LiveUserVar(TRI->getNumRegs()); 1484 1485 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E; 1486 ++I) { 1487 bool AtBlockEntry = true; 1488 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1489 II != IE; ++II) { 1490 const MachineInstr *MI = II; 1491 1492 if (MI->isDebugValue()) { 1493 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!"); 1494 1495 // Keep track of user variables. 1496 const MDNode *Var = MI->getDebugVariable(); 1497 1498 // Variable is in a register, we need to check for clobbers. 1499 if (isDbgValueInDefinedReg(MI)) 1500 LiveUserVar[MI->getOperand(0).getReg()] = Var; 1501 1502 // Check the history of this variable. 1503 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var]; 1504 if (History.empty()) { 1505 UserVariables.push_back(Var); 1506 // The first mention of a function argument gets the FunctionBeginSym 1507 // label, so arguments are visible when breaking at function entry. 1508 DIVariable DV(Var); 1509 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable && 1510 getDISubprogram(DV.getContext()).describes(MF->getFunction())) 1511 LabelsBeforeInsn[MI] = FunctionBeginSym; 1512 } else { 1513 // We have seen this variable before. Try to coalesce DBG_VALUEs. 1514 const MachineInstr *Prev = History.back(); 1515 if (Prev->isDebugValue()) { 1516 // Coalesce identical entries at the end of History. 1517 if (History.size() >= 2 && 1518 Prev->isIdenticalTo(History[History.size() - 2])) { 1519 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n" 1520 << "\t" << *Prev << "\t" 1521 << *History[History.size() - 2] << "\n"); 1522 History.pop_back(); 1523 } 1524 1525 // Terminate old register assignments that don't reach MI; 1526 MachineFunction::const_iterator PrevMBB = Prev->getParent(); 1527 if (PrevMBB != I && (!AtBlockEntry || std::next(PrevMBB) != I) && 1528 isDbgValueInDefinedReg(Prev)) { 1529 // Previous register assignment needs to terminate at the end of 1530 // its basic block. 1531 MachineBasicBlock::const_iterator LastMI = 1532 PrevMBB->getLastNonDebugInstr(); 1533 if (LastMI == PrevMBB->end()) { 1534 // Drop DBG_VALUE for empty range. 1535 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n" 1536 << "\t" << *Prev << "\n"); 1537 History.pop_back(); 1538 } else if (std::next(PrevMBB) != PrevMBB->getParent()->end()) 1539 // Terminate after LastMI. 1540 History.push_back(LastMI); 1541 } 1542 } 1543 } 1544 History.push_back(MI); 1545 } else { 1546 // Not a DBG_VALUE instruction. 1547 if (!MI->isPosition()) 1548 AtBlockEntry = false; 1549 1550 // First known non-DBG_VALUE and non-frame setup location marks 1551 // the beginning of the function body. 1552 if (!MI->getFlag(MachineInstr::FrameSetup) && 1553 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())) 1554 PrologEndLoc = MI->getDebugLoc(); 1555 1556 // Check if the instruction clobbers any registers with debug vars. 1557 for (const MachineOperand &MO : MI->operands()) { 1558 if (!MO.isReg() || !MO.isDef() || !MO.getReg()) 1559 continue; 1560 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); 1561 ++AI) { 1562 unsigned Reg = *AI; 1563 const MDNode *Var = LiveUserVar[Reg]; 1564 if (!Var) 1565 continue; 1566 // Reg is now clobbered. 1567 LiveUserVar[Reg] = 0; 1568 1569 // Was MD last defined by a DBG_VALUE referring to Reg? 1570 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var); 1571 if (HistI == DbgValues.end()) 1572 continue; 1573 SmallVectorImpl<const MachineInstr *> &History = HistI->second; 1574 if (History.empty()) 1575 continue; 1576 const MachineInstr *Prev = History.back(); 1577 // Sanity-check: Register assignments are terminated at the end of 1578 // their block. 1579 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent()) 1580 continue; 1581 // Is the variable still in Reg? 1582 if (!isDbgValueInDefinedReg(Prev) || 1583 Prev->getOperand(0).getReg() != Reg) 1584 continue; 1585 // Var is clobbered. Make sure the next instruction gets a label. 1586 History.push_back(MI); 1587 } 1588 } 1589 } 1590 } 1591 } 1592 1593 for (auto &I : DbgValues) { 1594 SmallVectorImpl<const MachineInstr *> &History = I.second; 1595 if (History.empty()) 1596 continue; 1597 1598 // Make sure the final register assignments are terminated. 1599 const MachineInstr *Prev = History.back(); 1600 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) { 1601 const MachineBasicBlock *PrevMBB = Prev->getParent(); 1602 MachineBasicBlock::const_iterator LastMI = 1603 PrevMBB->getLastNonDebugInstr(); 1604 if (LastMI == PrevMBB->end()) 1605 // Drop DBG_VALUE for empty range. 1606 History.pop_back(); 1607 else if (PrevMBB != &PrevMBB->getParent()->back()) { 1608 // Terminate after LastMI. 1609 History.push_back(LastMI); 1610 } 1611 } 1612 // Request labels for the full history. 1613 for (const MachineInstr *MI : History) { 1614 if (MI->isDebugValue()) 1615 requestLabelBeforeInsn(MI); 1616 else 1617 requestLabelAfterInsn(MI); 1618 } 1619 } 1620 1621 PrevInstLoc = DebugLoc(); 1622 PrevLabel = FunctionBeginSym; 1623 1624 // Record beginning of function. 1625 if (!PrologEndLoc.isUnknown()) { 1626 DebugLoc FnStartDL = 1627 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext()); 1628 recordSourceLine( 1629 FnStartDL.getLine(), FnStartDL.getCol(), 1630 FnStartDL.getScope(MF->getFunction()->getContext()), 1631 // We'd like to list the prologue as "not statements" but GDB behaves 1632 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing. 1633 DWARF2_FLAG_IS_STMT); 1634 } 1635 } 1636 1637 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) { 1638 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS]; 1639 DIVariable DV = Var->getVariable(); 1640 // Variables with positive arg numbers are parameters. 1641 if (unsigned ArgNum = DV.getArgNumber()) { 1642 // Keep all parameters in order at the start of the variable list to ensure 1643 // function types are correct (no out-of-order parameters) 1644 // 1645 // This could be improved by only doing it for optimized builds (unoptimized 1646 // builds have the right order to begin with), searching from the back (this 1647 // would catch the unoptimized case quickly), or doing a binary search 1648 // rather than linear search. 1649 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin(); 1650 while (I != Vars.end()) { 1651 unsigned CurNum = (*I)->getVariable().getArgNumber(); 1652 // A local (non-parameter) variable has been found, insert immediately 1653 // before it. 1654 if (CurNum == 0) 1655 break; 1656 // A later indexed parameter has been found, insert immediately before it. 1657 if (CurNum > ArgNum) 1658 break; 1659 ++I; 1660 } 1661 Vars.insert(I, Var); 1662 return; 1663 } 1664 1665 Vars.push_back(Var); 1666 } 1667 1668 // Gather and emit post-function debug information. 1669 void DwarfDebug::endFunction(const MachineFunction *MF) { 1670 // Every beginFunction(MF) call should be followed by an endFunction(MF) call, 1671 // though the beginFunction may not be called at all. 1672 // We should handle both cases. 1673 if (CurFn == 0) 1674 CurFn = MF; 1675 else 1676 assert(CurFn == MF); 1677 assert(CurFn != 0); 1678 1679 if (!MMI->hasDebugInfo() || LScopes.empty()) { 1680 // If we don't have a lexical scope for this function then there will 1681 // be a hole in the range information. Keep note of this by setting the 1682 // previously used section to nullptr. 1683 PrevSection = nullptr; 1684 PrevCU = nullptr; 1685 CurFn = 0; 1686 return; 1687 } 1688 1689 // Define end label for subprogram. 1690 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()); 1691 // Assumes in correct section after the entry point. 1692 Asm->OutStreamer.EmitLabel(FunctionEndSym); 1693 1694 // Set DwarfDwarfCompileUnitID in MCContext to default value. 1695 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0); 1696 1697 SmallPtrSet<const MDNode *, 16> ProcessedVars; 1698 collectVariableInfo(ProcessedVars); 1699 1700 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1701 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); 1702 assert(TheCU && "Unable to find compile unit!"); 1703 1704 // Construct abstract scopes. 1705 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) { 1706 DISubprogram SP(AScope->getScopeNode()); 1707 if (SP.isSubprogram()) { 1708 // Collect info for variables that were optimized out. 1709 DIArray Variables = SP.getVariables(); 1710 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) { 1711 DIVariable DV(Variables.getElement(i)); 1712 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV)) 1713 continue; 1714 // Check that DbgVariable for DV wasn't created earlier, when 1715 // findAbstractVariable() was called for inlined instance of DV. 1716 LLVMContext &Ctx = DV->getContext(); 1717 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx); 1718 if (AbstractVariables.lookup(CleanDV)) 1719 continue; 1720 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext())) 1721 addScopeVariable(Scope, new DbgVariable(DV, NULL, this)); 1722 } 1723 } 1724 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0) 1725 constructScopeDIE(TheCU, AScope); 1726 } 1727 1728 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope); 1729 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn)) 1730 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr); 1731 1732 // Add the range of this function to the list of ranges for the CU. 1733 RangeSpan Span(FunctionBeginSym, FunctionEndSym); 1734 TheCU->addRange(std::move(Span)); 1735 PrevSection = Asm->getCurrentSection(); 1736 PrevCU = TheCU; 1737 1738 // Clear debug info 1739 for (auto &I : ScopeVariables) 1740 DeleteContainerPointers(I.second); 1741 ScopeVariables.clear(); 1742 DeleteContainerPointers(CurrentFnArguments); 1743 UserVariables.clear(); 1744 DbgValues.clear(); 1745 AbstractVariables.clear(); 1746 LabelsBeforeInsn.clear(); 1747 LabelsAfterInsn.clear(); 1748 PrevLabel = NULL; 1749 CurFn = 0; 1750 } 1751 1752 // Register a source line with debug info. Returns the unique label that was 1753 // emitted and which provides correspondence to the source line list. 1754 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1755 unsigned Flags) { 1756 StringRef Fn; 1757 StringRef Dir; 1758 unsigned Src = 1; 1759 unsigned Discriminator = 0; 1760 if (S) { 1761 DIDescriptor Scope(S); 1762 1763 if (Scope.isCompileUnit()) { 1764 DICompileUnit CU(S); 1765 Fn = CU.getFilename(); 1766 Dir = CU.getDirectory(); 1767 } else if (Scope.isFile()) { 1768 DIFile F(S); 1769 Fn = F.getFilename(); 1770 Dir = F.getDirectory(); 1771 } else if (Scope.isSubprogram()) { 1772 DISubprogram SP(S); 1773 Fn = SP.getFilename(); 1774 Dir = SP.getDirectory(); 1775 } else if (Scope.isLexicalBlockFile()) { 1776 DILexicalBlockFile DBF(S); 1777 Fn = DBF.getFilename(); 1778 Dir = DBF.getDirectory(); 1779 } else if (Scope.isLexicalBlock()) { 1780 DILexicalBlock DB(S); 1781 Fn = DB.getFilename(); 1782 Dir = DB.getDirectory(); 1783 Discriminator = DB.getDiscriminator(); 1784 } else 1785 llvm_unreachable("Unexpected scope info"); 1786 1787 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID(); 1788 Src = static_cast<DwarfCompileUnit *>(InfoHolder.getUnits()[CUID]) 1789 ->getOrCreateSourceID(Fn, Dir); 1790 } 1791 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 1792 Discriminator, Fn); 1793 } 1794 1795 //===----------------------------------------------------------------------===// 1796 // Emit Methods 1797 //===----------------------------------------------------------------------===// 1798 1799 // Compute the size and offset of a DIE. The offset is relative to start of the 1800 // CU. It returns the offset after laying out the DIE. 1801 unsigned DwarfFile::computeSizeAndOffset(DIE &Die, unsigned Offset) { 1802 // Record the abbreviation. 1803 assignAbbrevNumber(Die.getAbbrev()); 1804 1805 // Get the abbreviation for this DIE. 1806 const DIEAbbrev &Abbrev = Die.getAbbrev(); 1807 1808 // Set DIE offset 1809 Die.setOffset(Offset); 1810 1811 // Start the size with the size of abbreviation code. 1812 Offset += getULEB128Size(Die.getAbbrevNumber()); 1813 1814 const SmallVectorImpl<DIEValue *> &Values = Die.getValues(); 1815 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData(); 1816 1817 // Size the DIE attribute values. 1818 for (unsigned i = 0, N = Values.size(); i < N; ++i) 1819 // Size attribute value. 1820 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 1821 1822 // Get the children. 1823 const auto &Children = Die.getChildren(); 1824 1825 // Size the DIE children if any. 1826 if (!Children.empty()) { 1827 assert(Abbrev.hasChildren() && "Children flag not set"); 1828 1829 for (auto &Child : Children) 1830 Offset = computeSizeAndOffset(*Child, Offset); 1831 1832 // End of children marker. 1833 Offset += sizeof(int8_t); 1834 } 1835 1836 Die.setSize(Offset - Die.getOffset()); 1837 return Offset; 1838 } 1839 1840 // Compute the size and offset for each DIE. 1841 void DwarfFile::computeSizeAndOffsets() { 1842 // Offset from the first CU in the debug info section is 0 initially. 1843 unsigned SecOffset = 0; 1844 1845 // Iterate over each compile unit and set the size and offsets for each 1846 // DIE within each compile unit. All offsets are CU relative. 1847 for (DwarfUnit *TheU : CUs) { 1848 TheU->setDebugInfoOffset(SecOffset); 1849 1850 // CU-relative offset is reset to 0 here. 1851 unsigned Offset = sizeof(int32_t) + // Length of Unit Info 1852 TheU->getHeaderSize(); // Unit-specific headers 1853 1854 // EndOffset here is CU-relative, after laying out 1855 // all of the CU DIE. 1856 unsigned EndOffset = computeSizeAndOffset(*TheU->getUnitDie(), Offset); 1857 SecOffset += EndOffset; 1858 } 1859 } 1860 1861 // Emit initial Dwarf sections with a label at the start of each one. 1862 void DwarfDebug::emitSectionLabels() { 1863 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1864 1865 // Dwarf sections base addresses. 1866 DwarfInfoSectionSym = 1867 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 1868 if (useSplitDwarf()) 1869 DwarfInfoDWOSectionSym = 1870 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo"); 1871 DwarfAbbrevSectionSym = 1872 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 1873 if (useSplitDwarf()) 1874 DwarfAbbrevDWOSectionSym = emitSectionSym( 1875 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo"); 1876 if (GenerateARangeSection) 1877 emitSectionSym(Asm, TLOF.getDwarfARangesSection()); 1878 1879 DwarfLineSectionSym = 1880 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 1881 if (GenerateGnuPubSections) { 1882 DwarfGnuPubNamesSectionSym = 1883 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection()); 1884 DwarfGnuPubTypesSectionSym = 1885 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection()); 1886 } else if (HasDwarfPubSections) { 1887 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection()); 1888 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 1889 } 1890 1891 DwarfStrSectionSym = 1892 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string"); 1893 if (useSplitDwarf()) { 1894 DwarfStrDWOSectionSym = 1895 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string"); 1896 DwarfAddrSectionSym = 1897 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec"); 1898 DwarfDebugLocSectionSym = 1899 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc"); 1900 } else 1901 DwarfDebugLocSectionSym = 1902 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc"); 1903 DwarfDebugRangeSectionSym = 1904 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range"); 1905 } 1906 1907 // Recursively emits a debug information entry. 1908 void DwarfDebug::emitDIE(DIE &Die) { 1909 // Get the abbreviation for this DIE. 1910 const DIEAbbrev &Abbrev = Die.getAbbrev(); 1911 1912 // Emit the code (index) for the abbreviation. 1913 if (Asm->isVerbose()) 1914 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) + 1915 "] 0x" + Twine::utohexstr(Die.getOffset()) + 1916 ":0x" + Twine::utohexstr(Die.getSize()) + " " + 1917 dwarf::TagString(Abbrev.getTag())); 1918 Asm->EmitULEB128(Abbrev.getNumber()); 1919 1920 const SmallVectorImpl<DIEValue *> &Values = Die.getValues(); 1921 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData(); 1922 1923 // Emit the DIE attribute values. 1924 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 1925 dwarf::Attribute Attr = AbbrevData[i].getAttribute(); 1926 dwarf::Form Form = AbbrevData[i].getForm(); 1927 assert(Form && "Too many attributes for DIE (check abbreviation)"); 1928 1929 if (Asm->isVerbose()) { 1930 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 1931 if (Attr == dwarf::DW_AT_accessibility) 1932 Asm->OutStreamer.AddComment(dwarf::AccessibilityString( 1933 cast<DIEInteger>(Values[i])->getValue())); 1934 } 1935 1936 // Emit an attribute using the defined form. 1937 Values[i]->EmitValue(Asm, Form); 1938 } 1939 1940 // Emit the DIE children if any. 1941 if (Abbrev.hasChildren()) { 1942 for (auto &Child : Die.getChildren()) 1943 emitDIE(*Child); 1944 1945 Asm->OutStreamer.AddComment("End Of Children Mark"); 1946 Asm->EmitInt8(0); 1947 } 1948 } 1949 1950 // Emit the various dwarf units to the unit section USection with 1951 // the abbreviations going into ASection. 1952 void DwarfFile::emitUnits(DwarfDebug *DD, const MCSymbol *ASectionSym) { 1953 for (DwarfUnit *TheU : CUs) { 1954 DIE *Die = TheU->getUnitDie(); 1955 const MCSection *USection = TheU->getSection(); 1956 Asm->OutStreamer.SwitchSection(USection); 1957 1958 // Emit the compile units header. 1959 Asm->OutStreamer.EmitLabel(TheU->getLabelBegin()); 1960 1961 // Emit size of content not including length itself 1962 Asm->OutStreamer.AddComment("Length of Unit"); 1963 Asm->EmitInt32(TheU->getHeaderSize() + Die->getSize()); 1964 1965 TheU->emitHeader(ASectionSym); 1966 1967 DD->emitDIE(*Die); 1968 Asm->OutStreamer.EmitLabel(TheU->getLabelEnd()); 1969 } 1970 } 1971 1972 // Emit the debug info section. 1973 void DwarfDebug::emitDebugInfo() { 1974 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1975 1976 Holder.emitUnits(this, DwarfAbbrevSectionSym); 1977 } 1978 1979 // Emit the abbreviation section. 1980 void DwarfDebug::emitAbbreviations() { 1981 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1982 1983 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection()); 1984 } 1985 1986 void DwarfFile::emitAbbrevs(const MCSection *Section) { 1987 // Check to see if it is worth the effort. 1988 if (!Abbreviations.empty()) { 1989 // Start the debug abbrev section. 1990 Asm->OutStreamer.SwitchSection(Section); 1991 1992 // For each abbrevation. 1993 for (const DIEAbbrev *Abbrev : Abbreviations) { 1994 // Emit the abbrevations code (base 1 index.) 1995 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 1996 1997 // Emit the abbreviations data. 1998 Abbrev->Emit(Asm); 1999 } 2000 2001 // Mark end of abbreviations. 2002 Asm->EmitULEB128(0, "EOM(3)"); 2003 } 2004 } 2005 2006 // Emit the last address of the section and the end of the line matrix. 2007 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 2008 // Define last address of section. 2009 Asm->OutStreamer.AddComment("Extended Op"); 2010 Asm->EmitInt8(0); 2011 2012 Asm->OutStreamer.AddComment("Op size"); 2013 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1); 2014 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 2015 Asm->EmitInt8(dwarf::DW_LNE_set_address); 2016 2017 Asm->OutStreamer.AddComment("Section end label"); 2018 2019 Asm->OutStreamer.EmitSymbolValue( 2020 Asm->GetTempSymbol("section_end", SectionEnd), 2021 Asm->getDataLayout().getPointerSize()); 2022 2023 // Mark end of matrix. 2024 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 2025 Asm->EmitInt8(0); 2026 Asm->EmitInt8(1); 2027 Asm->EmitInt8(1); 2028 } 2029 2030 // Emit visible names into a hashed accelerator table section. 2031 void DwarfDebug::emitAccelNames() { 2032 DwarfAccelTable AT( 2033 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); 2034 for (DwarfUnit *TheU : getUnits()) { 2035 for (const auto &GI : TheU->getAccelNames()) { 2036 StringRef Name = GI.getKey(); 2037 for (const DIE *D : GI.second) 2038 AT.AddName(Name, D); 2039 } 2040 } 2041 2042 AT.FinalizeTable(Asm, "Names"); 2043 Asm->OutStreamer.SwitchSection( 2044 Asm->getObjFileLowering().getDwarfAccelNamesSection()); 2045 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin"); 2046 Asm->OutStreamer.EmitLabel(SectionBegin); 2047 2048 // Emit the full data. 2049 AT.Emit(Asm, SectionBegin, &InfoHolder); 2050 } 2051 2052 // Emit objective C classes and categories into a hashed accelerator table 2053 // section. 2054 void DwarfDebug::emitAccelObjC() { 2055 DwarfAccelTable AT( 2056 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); 2057 for (DwarfUnit *TheU : getUnits()) { 2058 for (const auto &GI : TheU->getAccelObjC()) { 2059 StringRef Name = GI.getKey(); 2060 for (const DIE *D : GI.second) 2061 AT.AddName(Name, D); 2062 } 2063 } 2064 2065 AT.FinalizeTable(Asm, "ObjC"); 2066 Asm->OutStreamer.SwitchSection( 2067 Asm->getObjFileLowering().getDwarfAccelObjCSection()); 2068 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin"); 2069 Asm->OutStreamer.EmitLabel(SectionBegin); 2070 2071 // Emit the full data. 2072 AT.Emit(Asm, SectionBegin, &InfoHolder); 2073 } 2074 2075 // Emit namespace dies into a hashed accelerator table. 2076 void DwarfDebug::emitAccelNamespaces() { 2077 DwarfAccelTable AT( 2078 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); 2079 for (DwarfUnit *TheU : getUnits()) { 2080 for (const auto &GI : TheU->getAccelNamespace()) { 2081 StringRef Name = GI.getKey(); 2082 for (const DIE *D : GI.second) 2083 AT.AddName(Name, D); 2084 } 2085 } 2086 2087 AT.FinalizeTable(Asm, "namespac"); 2088 Asm->OutStreamer.SwitchSection( 2089 Asm->getObjFileLowering().getDwarfAccelNamespaceSection()); 2090 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin"); 2091 Asm->OutStreamer.EmitLabel(SectionBegin); 2092 2093 // Emit the full data. 2094 AT.Emit(Asm, SectionBegin, &InfoHolder); 2095 } 2096 2097 // Emit type dies into a hashed accelerator table. 2098 void DwarfDebug::emitAccelTypes() { 2099 std::vector<DwarfAccelTable::Atom> Atoms; 2100 Atoms.push_back( 2101 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); 2102 Atoms.push_back( 2103 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2)); 2104 Atoms.push_back( 2105 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)); 2106 DwarfAccelTable AT(Atoms); 2107 for (DwarfUnit *TheU : getUnits()) { 2108 for (const auto &GI : TheU->getAccelTypes()) { 2109 StringRef Name = GI.getKey(); 2110 for (const auto &DI : GI.second) 2111 AT.AddName(Name, DI.first, DI.second); 2112 } 2113 } 2114 2115 AT.FinalizeTable(Asm, "types"); 2116 Asm->OutStreamer.SwitchSection( 2117 Asm->getObjFileLowering().getDwarfAccelTypesSection()); 2118 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin"); 2119 Asm->OutStreamer.EmitLabel(SectionBegin); 2120 2121 // Emit the full data. 2122 AT.Emit(Asm, SectionBegin, &InfoHolder); 2123 } 2124 2125 // Public name handling. 2126 // The format for the various pubnames: 2127 // 2128 // dwarf pubnames - offset/name pairs where the offset is the offset into the CU 2129 // for the DIE that is named. 2130 // 2131 // gnu pubnames - offset/index value/name tuples where the offset is the offset 2132 // into the CU and the index value is computed according to the type of value 2133 // for the DIE that is named. 2134 // 2135 // For type units the offset is the offset of the skeleton DIE. For split dwarf 2136 // it's the offset within the debug_info/debug_types dwo section, however, the 2137 // reference in the pubname header doesn't change. 2138 2139 /// computeIndexValue - Compute the gdb index value for the DIE and CU. 2140 static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU, 2141 const DIE *Die) { 2142 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC; 2143 2144 // We could have a specification DIE that has our most of our knowledge, 2145 // look for that now. 2146 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification); 2147 if (SpecVal) { 2148 DIE *SpecDIE = cast<DIEEntry>(SpecVal)->getEntry(); 2149 if (SpecDIE->findAttribute(dwarf::DW_AT_external)) 2150 Linkage = dwarf::GIEL_EXTERNAL; 2151 } else if (Die->findAttribute(dwarf::DW_AT_external)) 2152 Linkage = dwarf::GIEL_EXTERNAL; 2153 2154 switch (Die->getTag()) { 2155 case dwarf::DW_TAG_class_type: 2156 case dwarf::DW_TAG_structure_type: 2157 case dwarf::DW_TAG_union_type: 2158 case dwarf::DW_TAG_enumeration_type: 2159 return dwarf::PubIndexEntryDescriptor( 2160 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus 2161 ? dwarf::GIEL_STATIC 2162 : dwarf::GIEL_EXTERNAL); 2163 case dwarf::DW_TAG_typedef: 2164 case dwarf::DW_TAG_base_type: 2165 case dwarf::DW_TAG_subrange_type: 2166 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC); 2167 case dwarf::DW_TAG_namespace: 2168 return dwarf::GIEK_TYPE; 2169 case dwarf::DW_TAG_subprogram: 2170 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage); 2171 case dwarf::DW_TAG_constant: 2172 case dwarf::DW_TAG_variable: 2173 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage); 2174 case dwarf::DW_TAG_enumerator: 2175 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, 2176 dwarf::GIEL_STATIC); 2177 default: 2178 return dwarf::GIEK_NONE; 2179 } 2180 } 2181 2182 /// emitDebugPubNames - Emit visible names into a debug pubnames section. 2183 /// 2184 void DwarfDebug::emitDebugPubNames(bool GnuStyle) { 2185 const MCSection *PSec = 2186 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection() 2187 : Asm->getObjFileLowering().getDwarfPubNamesSection(); 2188 2189 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames); 2190 } 2191 2192 void DwarfDebug::emitDebugPubSection( 2193 bool GnuStyle, const MCSection *PSec, StringRef Name, 2194 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) { 2195 for (const auto &NU : CUMap) { 2196 DwarfCompileUnit *TheU = NU.second; 2197 2198 const auto &Globals = (TheU->*Accessor)(); 2199 2200 if (Globals.empty()) 2201 continue; 2202 2203 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton())) 2204 TheU = Skeleton; 2205 unsigned ID = TheU->getUniqueID(); 2206 2207 // Start the dwarf pubnames section. 2208 Asm->OutStreamer.SwitchSection(PSec); 2209 2210 // Emit the header. 2211 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info"); 2212 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID); 2213 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID); 2214 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4); 2215 2216 Asm->OutStreamer.EmitLabel(BeginLabel); 2217 2218 Asm->OutStreamer.AddComment("DWARF Version"); 2219 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION); 2220 2221 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 2222 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym()); 2223 2224 Asm->OutStreamer.AddComment("Compilation Unit Length"); 2225 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4); 2226 2227 // Emit the pubnames for this compilation unit. 2228 for (const auto &GI : Globals) { 2229 const char *Name = GI.getKeyData(); 2230 const DIE *Entity = GI.second; 2231 2232 Asm->OutStreamer.AddComment("DIE offset"); 2233 Asm->EmitInt32(Entity->getOffset()); 2234 2235 if (GnuStyle) { 2236 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity); 2237 Asm->OutStreamer.AddComment( 2238 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " + 2239 dwarf::GDBIndexEntryLinkageString(Desc.Linkage)); 2240 Asm->EmitInt8(Desc.toBits()); 2241 } 2242 2243 Asm->OutStreamer.AddComment("External Name"); 2244 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1)); 2245 } 2246 2247 Asm->OutStreamer.AddComment("End Mark"); 2248 Asm->EmitInt32(0); 2249 Asm->OutStreamer.EmitLabel(EndLabel); 2250 } 2251 } 2252 2253 void DwarfDebug::emitDebugPubTypes(bool GnuStyle) { 2254 const MCSection *PSec = 2255 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection() 2256 : Asm->getObjFileLowering().getDwarfPubTypesSection(); 2257 2258 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes); 2259 } 2260 2261 // Emit strings into a string section. 2262 void DwarfFile::emitStrings(const MCSection *StrSection, 2263 const MCSection *OffsetSection = NULL, 2264 const MCSymbol *StrSecSym = NULL) { 2265 2266 if (StringPool.empty()) 2267 return; 2268 2269 // Start the dwarf str section. 2270 Asm->OutStreamer.SwitchSection(StrSection); 2271 2272 // Get all of the string pool entries and put them in an array by their ID so 2273 // we can sort them. 2274 SmallVector<std::pair<unsigned, const StrPool::value_type *>, 64 > Entries; 2275 2276 for (const auto &I : StringPool) 2277 Entries.push_back(std::make_pair(I.second.second, &I)); 2278 2279 array_pod_sort(Entries.begin(), Entries.end()); 2280 2281 for (const auto &Entry : Entries) { 2282 // Emit a label for reference from debug information entries. 2283 Asm->OutStreamer.EmitLabel(Entry.second->getValue().first); 2284 2285 // Emit the string itself with a terminating null byte. 2286 Asm->OutStreamer.EmitBytes(StringRef(Entry.second->getKeyData(), 2287 Entry.second->getKeyLength() + 1)); 2288 } 2289 2290 // If we've got an offset section go ahead and emit that now as well. 2291 if (OffsetSection) { 2292 Asm->OutStreamer.SwitchSection(OffsetSection); 2293 unsigned offset = 0; 2294 unsigned size = 4; // FIXME: DWARF64 is 8. 2295 for (const auto &Entry : Entries) { 2296 Asm->OutStreamer.EmitIntValue(offset, size); 2297 offset += Entry.second->getKeyLength() + 1; 2298 } 2299 } 2300 } 2301 2302 // Emit addresses into the section given. 2303 void DwarfFile::emitAddresses(const MCSection *AddrSection) { 2304 2305 if (AddressPool.empty()) 2306 return; 2307 2308 // Start the dwarf addr section. 2309 Asm->OutStreamer.SwitchSection(AddrSection); 2310 2311 // Order the address pool entries by ID 2312 SmallVector<const MCExpr *, 64> Entries(AddressPool.size()); 2313 2314 for (const auto &I : AddressPool) 2315 Entries[I.second.Number] = 2316 I.second.TLS 2317 ? Asm->getObjFileLowering().getDebugThreadLocalSymbol(I.first) 2318 : MCSymbolRefExpr::Create(I.first, Asm->OutContext); 2319 2320 for (const MCExpr *Entry : Entries) 2321 Asm->OutStreamer.EmitValue(Entry, Asm->getDataLayout().getPointerSize()); 2322 } 2323 2324 // Emit visible names into a debug str section. 2325 void DwarfDebug::emitDebugStr() { 2326 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 2327 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection()); 2328 } 2329 2330 void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer, 2331 const DebugLocEntry &Entry) { 2332 DIVariable DV(Entry.getVariable()); 2333 if (Entry.isInt()) { 2334 DIBasicType BTy(resolve(DV.getType())); 2335 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed || 2336 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) { 2337 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts"); 2338 Streamer.EmitSLEB128(Entry.getInt()); 2339 } else { 2340 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu"); 2341 Streamer.EmitULEB128(Entry.getInt()); 2342 } 2343 } else if (Entry.isLocation()) { 2344 MachineLocation Loc = Entry.getLoc(); 2345 if (!DV.hasComplexAddress()) 2346 // Regular entry. 2347 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect()); 2348 else { 2349 // Complex address entry. 2350 unsigned N = DV.getNumAddrElements(); 2351 unsigned i = 0; 2352 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { 2353 if (Loc.getOffset()) { 2354 i = 2; 2355 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect()); 2356 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref"); 2357 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst"); 2358 Streamer.EmitSLEB128(DV.getAddrElement(1)); 2359 } else { 2360 // If first address element is OpPlus then emit 2361 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 2362 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1)); 2363 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect()); 2364 i = 2; 2365 } 2366 } else { 2367 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect()); 2368 } 2369 2370 // Emit remaining complex address elements. 2371 for (; i < N; ++i) { 2372 uint64_t Element = DV.getAddrElement(i); 2373 if (Element == DIBuilder::OpPlus) { 2374 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst"); 2375 Streamer.EmitULEB128(DV.getAddrElement(++i)); 2376 } else if (Element == DIBuilder::OpDeref) { 2377 if (!Loc.isReg()) 2378 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref"); 2379 } else 2380 llvm_unreachable("unknown Opcode found in complex address"); 2381 } 2382 } 2383 } 2384 // else ... ignore constant fp. There is not any good way to 2385 // to represent them here in dwarf. 2386 // FIXME: ^ 2387 } 2388 2389 void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) { 2390 Asm->OutStreamer.AddComment("Loc expr size"); 2391 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol(); 2392 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol(); 2393 Asm->EmitLabelDifference(end, begin, 2); 2394 Asm->OutStreamer.EmitLabel(begin); 2395 // Emit the entry. 2396 APByteStreamer Streamer(*Asm); 2397 emitDebugLocEntry(Streamer, Entry); 2398 // Close the range. 2399 Asm->OutStreamer.EmitLabel(end); 2400 } 2401 2402 // Emit locations into the debug loc section. 2403 void DwarfDebug::emitDebugLoc() { 2404 // Start the dwarf loc section. 2405 Asm->OutStreamer.SwitchSection( 2406 Asm->getObjFileLowering().getDwarfLocSection()); 2407 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2408 for (const auto &DebugLoc : DotDebugLocEntries) { 2409 Asm->OutStreamer.EmitLabel(DebugLoc.Label); 2410 for (const auto &Entry : DebugLoc.List) { 2411 // Set up the range. This range is relative to the entry point of the 2412 // compile unit. This is a hard coded 0 for low_pc when we're emitting 2413 // ranges, or the DW_AT_low_pc on the compile unit otherwise. 2414 const DwarfCompileUnit *CU = Entry.getCU(); 2415 if (CU->getRanges().size() == 1) { 2416 // Grab the begin symbol from the first range as our base. 2417 const MCSymbol *Base = CU->getRanges()[0].getStart(); 2418 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size); 2419 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size); 2420 } else { 2421 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size); 2422 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size); 2423 } 2424 2425 emitDebugLocEntryLocation(Entry); 2426 } 2427 Asm->OutStreamer.EmitIntValue(0, Size); 2428 Asm->OutStreamer.EmitIntValue(0, Size); 2429 } 2430 } 2431 2432 void DwarfDebug::emitDebugLocDWO() { 2433 Asm->OutStreamer.SwitchSection( 2434 Asm->getObjFileLowering().getDwarfLocDWOSection()); 2435 for (const auto &DebugLoc : DotDebugLocEntries) { 2436 Asm->OutStreamer.EmitLabel(DebugLoc.Label); 2437 for (const auto &Entry : DebugLoc.List) { 2438 // Just always use start_length for now - at least that's one address 2439 // rather than two. We could get fancier and try to, say, reuse an 2440 // address we know we've emitted elsewhere (the start of the function? 2441 // The start of the CU or CU subrange that encloses this range?) 2442 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry); 2443 unsigned idx = InfoHolder.getAddrPoolIndex(Entry.getBeginSym()); 2444 Asm->EmitULEB128(idx); 2445 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4); 2446 2447 emitDebugLocEntryLocation(Entry); 2448 } 2449 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry); 2450 } 2451 } 2452 2453 struct ArangeSpan { 2454 const MCSymbol *Start, *End; 2455 }; 2456 2457 // Emit a debug aranges section, containing a CU lookup for any 2458 // address we can tie back to a CU. 2459 void DwarfDebug::emitDebugARanges() { 2460 // Start the dwarf aranges section. 2461 Asm->OutStreamer.SwitchSection( 2462 Asm->getObjFileLowering().getDwarfARangesSection()); 2463 2464 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan> > SpansType; 2465 2466 SpansType Spans; 2467 2468 // Build a list of sections used. 2469 std::vector<const MCSection *> Sections; 2470 for (const auto &it : SectionMap) { 2471 const MCSection *Section = it.first; 2472 Sections.push_back(Section); 2473 } 2474 2475 // Sort the sections into order. 2476 // This is only done to ensure consistent output order across different runs. 2477 std::sort(Sections.begin(), Sections.end(), SectionSort); 2478 2479 // Build a set of address spans, sorted by CU. 2480 for (const MCSection *Section : Sections) { 2481 SmallVector<SymbolCU, 8> &List = SectionMap[Section]; 2482 if (List.size() < 2) 2483 continue; 2484 2485 // Sort the symbols by offset within the section. 2486 std::sort(List.begin(), List.end(), 2487 [&](const SymbolCU &A, const SymbolCU &B) { 2488 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0; 2489 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0; 2490 2491 // Symbols with no order assigned should be placed at the end. 2492 // (e.g. section end labels) 2493 if (IA == 0) 2494 return false; 2495 if (IB == 0) 2496 return true; 2497 return IA < IB; 2498 }); 2499 2500 // If we have no section (e.g. common), just write out 2501 // individual spans for each symbol. 2502 if (Section == NULL) { 2503 for (const SymbolCU &Cur : List) { 2504 ArangeSpan Span; 2505 Span.Start = Cur.Sym; 2506 Span.End = NULL; 2507 if (Cur.CU) 2508 Spans[Cur.CU].push_back(Span); 2509 } 2510 } else { 2511 // Build spans between each label. 2512 const MCSymbol *StartSym = List[0].Sym; 2513 for (size_t n = 1, e = List.size(); n < e; n++) { 2514 const SymbolCU &Prev = List[n - 1]; 2515 const SymbolCU &Cur = List[n]; 2516 2517 // Try and build the longest span we can within the same CU. 2518 if (Cur.CU != Prev.CU) { 2519 ArangeSpan Span; 2520 Span.Start = StartSym; 2521 Span.End = Cur.Sym; 2522 Spans[Prev.CU].push_back(Span); 2523 StartSym = Cur.Sym; 2524 } 2525 } 2526 } 2527 } 2528 2529 unsigned PtrSize = Asm->getDataLayout().getPointerSize(); 2530 2531 // Build a list of CUs used. 2532 std::vector<DwarfCompileUnit *> CUs; 2533 for (const auto &it : Spans) { 2534 DwarfCompileUnit *CU = it.first; 2535 CUs.push_back(CU); 2536 } 2537 2538 // Sort the CU list (again, to ensure consistent output order). 2539 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) { 2540 return A->getUniqueID() < B->getUniqueID(); 2541 }); 2542 2543 // Emit an arange table for each CU we used. 2544 for (DwarfCompileUnit *CU : CUs) { 2545 std::vector<ArangeSpan> &List = Spans[CU]; 2546 2547 // Emit size of content not including length itself. 2548 unsigned ContentSize = 2549 sizeof(int16_t) + // DWARF ARange version number 2550 sizeof(int32_t) + // Offset of CU in the .debug_info section 2551 sizeof(int8_t) + // Pointer Size (in bytes) 2552 sizeof(int8_t); // Segment Size (in bytes) 2553 2554 unsigned TupleSize = PtrSize * 2; 2555 2556 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple. 2557 unsigned Padding = 2558 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize); 2559 2560 ContentSize += Padding; 2561 ContentSize += (List.size() + 1) * TupleSize; 2562 2563 // For each compile unit, write the list of spans it covers. 2564 Asm->OutStreamer.AddComment("Length of ARange Set"); 2565 Asm->EmitInt32(ContentSize); 2566 Asm->OutStreamer.AddComment("DWARF Arange version number"); 2567 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION); 2568 Asm->OutStreamer.AddComment("Offset Into Debug Info Section"); 2569 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym()); 2570 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2571 Asm->EmitInt8(PtrSize); 2572 Asm->OutStreamer.AddComment("Segment Size (in bytes)"); 2573 Asm->EmitInt8(0); 2574 2575 Asm->OutStreamer.EmitFill(Padding, 0xff); 2576 2577 for (const ArangeSpan &Span : List) { 2578 Asm->EmitLabelReference(Span.Start, PtrSize); 2579 2580 // Calculate the size as being from the span start to it's end. 2581 if (Span.End) { 2582 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize); 2583 } else { 2584 // For symbols without an end marker (e.g. common), we 2585 // write a single arange entry containing just that one symbol. 2586 uint64_t Size = SymSize[Span.Start]; 2587 if (Size == 0) 2588 Size = 1; 2589 2590 Asm->OutStreamer.EmitIntValue(Size, PtrSize); 2591 } 2592 } 2593 2594 Asm->OutStreamer.AddComment("ARange terminator"); 2595 Asm->OutStreamer.EmitIntValue(0, PtrSize); 2596 Asm->OutStreamer.EmitIntValue(0, PtrSize); 2597 } 2598 } 2599 2600 // Emit visible names into a debug ranges section. 2601 void DwarfDebug::emitDebugRanges() { 2602 // Start the dwarf ranges section. 2603 Asm->OutStreamer.SwitchSection( 2604 Asm->getObjFileLowering().getDwarfRangesSection()); 2605 2606 // Size for our labels. 2607 unsigned char Size = Asm->getDataLayout().getPointerSize(); 2608 2609 // Grab the specific ranges for the compile units in the module. 2610 for (const auto &I : CUMap) { 2611 DwarfCompileUnit *TheCU = I.second; 2612 2613 // Emit a symbol so we can find the beginning of our ranges. 2614 Asm->OutStreamer.EmitLabel(TheCU->getLabelRange()); 2615 2616 // Iterate over the misc ranges for the compile units in the module. 2617 for (const RangeSpanList &List : TheCU->getRangeLists()) { 2618 // Emit our symbol so we can find the beginning of the range. 2619 Asm->OutStreamer.EmitLabel(List.getSym()); 2620 2621 for (const RangeSpan &Range : List.getRanges()) { 2622 const MCSymbol *Begin = Range.getStart(); 2623 const MCSymbol *End = Range.getEnd(); 2624 assert(Begin && "Range without a begin symbol?"); 2625 assert(End && "Range without an end symbol?"); 2626 Asm->OutStreamer.EmitSymbolValue(Begin, Size); 2627 Asm->OutStreamer.EmitSymbolValue(End, Size); 2628 } 2629 2630 // And terminate the list with two 0 values. 2631 Asm->OutStreamer.EmitIntValue(0, Size); 2632 Asm->OutStreamer.EmitIntValue(0, Size); 2633 } 2634 2635 // Now emit a range for the CU itself. 2636 if (TheCU->getRanges().size() > 1) { 2637 Asm->OutStreamer.EmitLabel( 2638 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID())); 2639 for (const RangeSpan &Range : TheCU->getRanges()) { 2640 const MCSymbol *Begin = Range.getStart(); 2641 const MCSymbol *End = Range.getEnd(); 2642 assert(Begin && "Range without a begin symbol?"); 2643 assert(End && "Range without an end symbol?"); 2644 Asm->OutStreamer.EmitSymbolValue(Begin, Size); 2645 Asm->OutStreamer.EmitSymbolValue(End, Size); 2646 } 2647 // And terminate the list with two 0 values. 2648 Asm->OutStreamer.EmitIntValue(0, Size); 2649 Asm->OutStreamer.EmitIntValue(0, Size); 2650 } 2651 } 2652 } 2653 2654 // DWARF5 Experimental Separate Dwarf emitters. 2655 2656 void DwarfDebug::initSkeletonUnit(const DwarfUnit *U, DIE *Die, 2657 DwarfUnit *NewU) { 2658 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, 2659 U->getCUNode().getSplitDebugFilename()); 2660 2661 if (!CompilationDir.empty()) 2662 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 2663 2664 addGnuPubAttributes(NewU, Die); 2665 2666 SkeletonHolder.addUnit(NewU); 2667 } 2668 2669 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list, 2670 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id, 2671 // DW_AT_addr_base, DW_AT_ranges_base. 2672 DwarfCompileUnit *DwarfDebug::constructSkeletonCU(const DwarfCompileUnit *CU) { 2673 2674 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 2675 DwarfCompileUnit *NewCU = new DwarfCompileUnit( 2676 CU->getUniqueID(), Die, CU->getCUNode(), Asm, this, &SkeletonHolder); 2677 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(), 2678 DwarfInfoSectionSym); 2679 2680 NewCU->initStmtList(DwarfLineSectionSym); 2681 2682 initSkeletonUnit(CU, Die, NewCU); 2683 2684 return NewCU; 2685 } 2686 2687 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name, 2688 // DW_AT_addr_base. 2689 DwarfTypeUnit *DwarfDebug::constructSkeletonTU(DwarfTypeUnit *TU) { 2690 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>( 2691 *SkeletonHolder.getUnits()[TU->getCU().getUniqueID()]); 2692 2693 DIE *Die = new DIE(dwarf::DW_TAG_type_unit); 2694 DwarfTypeUnit *NewTU = 2695 new DwarfTypeUnit(TU->getUniqueID(), Die, CU, Asm, this, &SkeletonHolder); 2696 NewTU->setTypeSignature(TU->getTypeSignature()); 2697 NewTU->setType(NULL); 2698 NewTU->initSection( 2699 Asm->getObjFileLowering().getDwarfTypesSection(TU->getTypeSignature())); 2700 2701 initSkeletonUnit(TU, Die, NewTU); 2702 return NewTU; 2703 } 2704 2705 // Emit the .debug_info.dwo section for separated dwarf. This contains the 2706 // compile units that would normally be in debug_info. 2707 void DwarfDebug::emitDebugInfoDWO() { 2708 assert(useSplitDwarf() && "No split dwarf debug info?"); 2709 // Don't pass an abbrev symbol, using a constant zero instead so as not to 2710 // emit relocations into the dwo file. 2711 InfoHolder.emitUnits(this, /* AbbrevSymbol */nullptr); 2712 } 2713 2714 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the 2715 // abbreviations for the .debug_info.dwo section. 2716 void DwarfDebug::emitDebugAbbrevDWO() { 2717 assert(useSplitDwarf() && "No split dwarf?"); 2718 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection()); 2719 } 2720 2721 void DwarfDebug::emitDebugLineDWO() { 2722 assert(useSplitDwarf() && "No split dwarf?"); 2723 Asm->OutStreamer.SwitchSection( 2724 Asm->getObjFileLowering().getDwarfLineDWOSection()); 2725 SplitTypeUnitFileTable.Emit(Asm->OutStreamer); 2726 } 2727 2728 // Emit the .debug_str.dwo section for separated dwarf. This contains the 2729 // string section and is identical in format to traditional .debug_str 2730 // sections. 2731 void DwarfDebug::emitDebugStrDWO() { 2732 assert(useSplitDwarf() && "No split dwarf?"); 2733 const MCSection *OffSec = 2734 Asm->getObjFileLowering().getDwarfStrOffDWOSection(); 2735 const MCSymbol *StrSym = DwarfStrSectionSym; 2736 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(), 2737 OffSec, StrSym); 2738 } 2739 2740 MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) { 2741 if (!useSplitDwarf()) 2742 return nullptr; 2743 if (SingleCU) 2744 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory()); 2745 return &SplitTypeUnitFileTable; 2746 } 2747 2748 void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, 2749 StringRef Identifier, DIE *RefDie, 2750 DICompositeType CTy) { 2751 // Flag the type unit reference as a declaration so that if it contains 2752 // members (implicit special members, static data member definitions, member 2753 // declarations for definitions in this CU, etc) consumers don't get confused 2754 // and think this is a full definition. 2755 CU.addFlag(RefDie, dwarf::DW_AT_declaration); 2756 2757 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy]; 2758 if (TU) { 2759 CU.addDIETypeSignature(RefDie, *TU); 2760 return; 2761 } 2762 2763 DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit); 2764 DwarfTypeUnit *NewTU = 2765 new DwarfTypeUnit(InfoHolder.getUnits().size(), UnitDie, CU, Asm, this, 2766 &InfoHolder, getDwoLineTable(CU)); 2767 TU = NewTU; 2768 InfoHolder.addUnit(NewTU); 2769 2770 NewTU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 2771 CU.getLanguage()); 2772 2773 MD5 Hash; 2774 Hash.update(Identifier); 2775 // ... take the least significant 8 bytes and return those. Our MD5 2776 // implementation always returns its results in little endian, swap bytes 2777 // appropriately. 2778 MD5::MD5Result Result; 2779 Hash.final(Result); 2780 uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8); 2781 NewTU->setTypeSignature(Signature); 2782 if (useSplitDwarf()) 2783 NewTU->setSkeleton(constructSkeletonTU(NewTU)); 2784 else 2785 CU.applyStmtList(*UnitDie); 2786 2787 NewTU->setType(NewTU->createTypeDIE(CTy)); 2788 2789 NewTU->initSection( 2790 useSplitDwarf() 2791 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature) 2792 : Asm->getObjFileLowering().getDwarfTypesSection(Signature)); 2793 2794 CU.addDIETypeSignature(RefDie, *NewTU); 2795 } 2796 2797 void DwarfDebug::attachLowHighPC(DwarfCompileUnit *Unit, DIE *D, 2798 MCSymbol *Begin, MCSymbol *End) { 2799 Unit->addLabelAddress(D, dwarf::DW_AT_low_pc, Begin); 2800 if (DwarfVersion < 4) 2801 Unit->addLabelAddress(D, dwarf::DW_AT_high_pc, End); 2802 else 2803 Unit->addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin); 2804 } 2805