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