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 "DebugLocStream.h" 19 #include "DwarfCompileUnit.h" 20 #include "DwarfExpression.h" 21 #include "DwarfFile.h" 22 #include "DwarfUnit.h" 23 #include "llvm/ADT/APInt.h" 24 #include "llvm/ADT/DenseMap.h" 25 #include "llvm/ADT/DenseSet.h" 26 #include "llvm/ADT/MapVector.h" 27 #include "llvm/ADT/STLExtras.h" 28 #include "llvm/ADT/SmallVector.h" 29 #include "llvm/ADT/StringRef.h" 30 #include "llvm/ADT/Triple.h" 31 #include "llvm/ADT/Twine.h" 32 #include "llvm/BinaryFormat/Dwarf.h" 33 #include "llvm/CodeGen/AccelTable.h" 34 #include "llvm/CodeGen/AsmPrinter.h" 35 #include "llvm/CodeGen/DIE.h" 36 #include "llvm/CodeGen/LexicalScopes.h" 37 #include "llvm/CodeGen/MachineBasicBlock.h" 38 #include "llvm/CodeGen/MachineFunction.h" 39 #include "llvm/CodeGen/MachineInstr.h" 40 #include "llvm/CodeGen/MachineModuleInfo.h" 41 #include "llvm/CodeGen/MachineOperand.h" 42 #include "llvm/CodeGen/TargetRegisterInfo.h" 43 #include "llvm/CodeGen/TargetSubtargetInfo.h" 44 #include "llvm/IR/Constants.h" 45 #include "llvm/IR/DebugInfoMetadata.h" 46 #include "llvm/IR/DebugLoc.h" 47 #include "llvm/IR/Function.h" 48 #include "llvm/IR/GlobalVariable.h" 49 #include "llvm/IR/Module.h" 50 #include "llvm/MC/MCAsmInfo.h" 51 #include "llvm/MC/MCContext.h" 52 #include "llvm/MC/MCDwarf.h" 53 #include "llvm/MC/MCSection.h" 54 #include "llvm/MC/MCStreamer.h" 55 #include "llvm/MC/MCSymbol.h" 56 #include "llvm/MC/MCTargetOptions.h" 57 #include "llvm/MC/MachineLocation.h" 58 #include "llvm/MC/SectionKind.h" 59 #include "llvm/Pass.h" 60 #include "llvm/Support/Casting.h" 61 #include "llvm/Support/CommandLine.h" 62 #include "llvm/Support/Debug.h" 63 #include "llvm/Support/ErrorHandling.h" 64 #include "llvm/Support/MD5.h" 65 #include "llvm/Support/MathExtras.h" 66 #include "llvm/Support/Timer.h" 67 #include "llvm/Support/raw_ostream.h" 68 #include "llvm/Target/TargetLoweringObjectFile.h" 69 #include "llvm/Target/TargetMachine.h" 70 #include "llvm/Target/TargetOptions.h" 71 #include <algorithm> 72 #include <cassert> 73 #include <cstddef> 74 #include <cstdint> 75 #include <iterator> 76 #include <string> 77 #include <utility> 78 #include <vector> 79 80 using namespace llvm; 81 82 #define DEBUG_TYPE "dwarfdebug" 83 84 static cl::opt<bool> 85 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden, 86 cl::desc("Disable debug info printing")); 87 88 static cl::opt<bool> UseDwarfRangesBaseAddressSpecifier( 89 "use-dwarf-ranges-base-address-specifier", cl::Hidden, 90 cl::desc("Use base address specifiers in debug_ranges"), cl::init(false)); 91 92 static cl::opt<bool> GenerateARangeSection("generate-arange-section", 93 cl::Hidden, 94 cl::desc("Generate dwarf aranges"), 95 cl::init(false)); 96 97 static cl::opt<bool> 98 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden, 99 cl::desc("Generate DWARF4 type units."), 100 cl::init(false)); 101 102 static cl::opt<bool> SplitDwarfCrossCuReferences( 103 "split-dwarf-cross-cu-references", cl::Hidden, 104 cl::desc("Enable cross-cu references in DWO files"), cl::init(false)); 105 106 enum DefaultOnOff { Default, Enable, Disable }; 107 108 static cl::opt<DefaultOnOff> UnknownLocations( 109 "use-unknown-locations", cl::Hidden, 110 cl::desc("Make an absence of debug location information explicit."), 111 cl::values(clEnumVal(Default, "At top of block or after label"), 112 clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")), 113 cl::init(Default)); 114 115 static cl::opt<AccelTableKind> AccelTables( 116 "accel-tables", cl::Hidden, cl::desc("Output dwarf accelerator tables."), 117 cl::values(clEnumValN(AccelTableKind::Default, "Default", 118 "Default for platform"), 119 clEnumValN(AccelTableKind::None, "Disable", "Disabled."), 120 clEnumValN(AccelTableKind::Apple, "Apple", "Apple"), 121 clEnumValN(AccelTableKind::Dwarf, "Dwarf", "DWARF")), 122 cl::init(AccelTableKind::Default)); 123 124 static cl::opt<DefaultOnOff> 125 DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden, 126 cl::desc("Use inlined strings rather than string section."), 127 cl::values(clEnumVal(Default, "Default for platform"), 128 clEnumVal(Enable, "Enabled"), 129 clEnumVal(Disable, "Disabled")), 130 cl::init(Default)); 131 132 static cl::opt<bool> 133 NoDwarfPubSections("no-dwarf-pub-sections", cl::Hidden, 134 cl::desc("Disable emission of DWARF pub sections."), 135 cl::init(false)); 136 137 static cl::opt<bool> 138 NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden, 139 cl::desc("Disable emission .debug_ranges section."), 140 cl::init(false)); 141 142 static cl::opt<DefaultOnOff> DwarfSectionsAsReferences( 143 "dwarf-sections-as-references", cl::Hidden, 144 cl::desc("Use sections+offset as references rather than labels."), 145 cl::values(clEnumVal(Default, "Default for platform"), 146 clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")), 147 cl::init(Default)); 148 149 enum LinkageNameOption { 150 DefaultLinkageNames, 151 AllLinkageNames, 152 AbstractLinkageNames 153 }; 154 155 static cl::opt<LinkageNameOption> 156 DwarfLinkageNames("dwarf-linkage-names", cl::Hidden, 157 cl::desc("Which DWARF linkage-name attributes to emit."), 158 cl::values(clEnumValN(DefaultLinkageNames, "Default", 159 "Default for platform"), 160 clEnumValN(AllLinkageNames, "All", "All"), 161 clEnumValN(AbstractLinkageNames, "Abstract", 162 "Abstract subprograms")), 163 cl::init(DefaultLinkageNames)); 164 165 static const char *const DWARFGroupName = "dwarf"; 166 static const char *const DWARFGroupDescription = "DWARF Emission"; 167 static const char *const DbgTimerName = "writer"; 168 static const char *const DbgTimerDescription = "DWARF Debug Writer"; 169 170 void DebugLocDwarfExpression::emitOp(uint8_t Op, const char *Comment) { 171 BS.EmitInt8( 172 Op, Comment ? Twine(Comment) + " " + dwarf::OperationEncodingString(Op) 173 : dwarf::OperationEncodingString(Op)); 174 } 175 176 void DebugLocDwarfExpression::emitSigned(int64_t Value) { 177 BS.EmitSLEB128(Value, Twine(Value)); 178 } 179 180 void DebugLocDwarfExpression::emitUnsigned(uint64_t Value) { 181 BS.EmitULEB128(Value, Twine(Value)); 182 } 183 184 bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI, 185 unsigned MachineReg) { 186 // This information is not available while emitting .debug_loc entries. 187 return false; 188 } 189 190 bool DbgVariable::isBlockByrefVariable() const { 191 assert(Var && "Invalid complex DbgVariable!"); 192 return Var->getType().resolve()->isBlockByrefStruct(); 193 } 194 195 const DIType *DbgVariable::getType() const { 196 DIType *Ty = Var->getType().resolve(); 197 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 198 // addresses instead. 199 if (Ty->isBlockByrefStruct()) { 200 /* Byref variables, in Blocks, are declared by the programmer as 201 "SomeType VarName;", but the compiler creates a 202 __Block_byref_x_VarName struct, and gives the variable VarName 203 either the struct, or a pointer to the struct, as its type. This 204 is necessary for various behind-the-scenes things the compiler 205 needs to do with by-reference variables in blocks. 206 207 However, as far as the original *programmer* is concerned, the 208 variable should still have type 'SomeType', as originally declared. 209 210 The following function dives into the __Block_byref_x_VarName 211 struct to find the original type of the variable. This will be 212 passed back to the code generating the type for the Debug 213 Information Entry for the variable 'VarName'. 'VarName' will then 214 have the original type 'SomeType' in its debug information. 215 216 The original type 'SomeType' will be the type of the field named 217 'VarName' inside the __Block_byref_x_VarName struct. 218 219 NOTE: In order for this to not completely fail on the debugger 220 side, the Debug Information Entry for the variable VarName needs to 221 have a DW_AT_location that tells the debugger how to unwind through 222 the pointers and __Block_byref_x_VarName struct to find the actual 223 value of the variable. The function addBlockByrefType does this. */ 224 DIType *subType = Ty; 225 uint16_t tag = Ty->getTag(); 226 227 if (tag == dwarf::DW_TAG_pointer_type) 228 subType = resolve(cast<DIDerivedType>(Ty)->getBaseType()); 229 230 auto Elements = cast<DICompositeType>(subType)->getElements(); 231 for (unsigned i = 0, N = Elements.size(); i < N; ++i) { 232 auto *DT = cast<DIDerivedType>(Elements[i]); 233 if (getName() == DT->getName()) 234 return resolve(DT->getBaseType()); 235 } 236 } 237 return Ty; 238 } 239 240 ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const { 241 if (FrameIndexExprs.size() == 1) 242 return FrameIndexExprs; 243 244 assert(llvm::all_of(FrameIndexExprs, 245 [](const FrameIndexExpr &A) { 246 return A.Expr->isFragment(); 247 }) && 248 "multiple FI expressions without DW_OP_LLVM_fragment"); 249 llvm::sort(FrameIndexExprs.begin(), FrameIndexExprs.end(), 250 [](const FrameIndexExpr &A, const FrameIndexExpr &B) -> bool { 251 return A.Expr->getFragmentInfo()->OffsetInBits < 252 B.Expr->getFragmentInfo()->OffsetInBits; 253 }); 254 255 return FrameIndexExprs; 256 } 257 258 void DbgVariable::addMMIEntry(const DbgVariable &V) { 259 assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry"); 260 assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry"); 261 assert(V.Var == Var && "conflicting variable"); 262 assert(V.IA == IA && "conflicting inlined-at location"); 263 264 assert(!FrameIndexExprs.empty() && "Expected an MMI entry"); 265 assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry"); 266 267 // FIXME: This logic should not be necessary anymore, as we now have proper 268 // deduplication. However, without it, we currently run into the assertion 269 // below, which means that we are likely dealing with broken input, i.e. two 270 // non-fragment entries for the same variable at different frame indices. 271 if (FrameIndexExprs.size()) { 272 auto *Expr = FrameIndexExprs.back().Expr; 273 if (!Expr || !Expr->isFragment()) 274 return; 275 } 276 277 for (const auto &FIE : V.FrameIndexExprs) 278 // Ignore duplicate entries. 279 if (llvm::none_of(FrameIndexExprs, [&](const FrameIndexExpr &Other) { 280 return FIE.FI == Other.FI && FIE.Expr == Other.Expr; 281 })) 282 FrameIndexExprs.push_back(FIE); 283 284 assert((FrameIndexExprs.size() == 1 || 285 llvm::all_of(FrameIndexExprs, 286 [](FrameIndexExpr &FIE) { 287 return FIE.Expr && FIE.Expr->isFragment(); 288 })) && 289 "conflicting locations for variable"); 290 } 291 292 static AccelTableKind computeAccelTableKind(unsigned DwarfVersion, 293 bool GenerateTypeUnits, 294 DebuggerKind Tuning, 295 const Triple &TT) { 296 // Honor an explicit request. 297 if (AccelTables != AccelTableKind::Default) 298 return AccelTables; 299 300 // Accelerator tables with type units are currently not supported. 301 if (GenerateTypeUnits) 302 return AccelTableKind::None; 303 304 // Accelerator tables get emitted if targetting DWARF v5 or LLDB. DWARF v5 305 // always implies debug_names. For lower standard versions we use apple 306 // accelerator tables on apple platforms and debug_names elsewhere. 307 if (DwarfVersion >= 5) 308 return AccelTableKind::Dwarf; 309 if (Tuning == DebuggerKind::LLDB) 310 return TT.isOSBinFormatMachO() ? AccelTableKind::Apple 311 : AccelTableKind::Dwarf; 312 return AccelTableKind::None; 313 } 314 315 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 316 : DebugHandlerBase(A), DebugLocs(A->OutStreamer->isVerboseAsm()), 317 InfoHolder(A, "info_string", DIEValueAllocator), 318 SkeletonHolder(A, "skel_string", DIEValueAllocator), 319 IsDarwin(A->TM.getTargetTriple().isOSDarwin()) { 320 const Triple &TT = Asm->TM.getTargetTriple(); 321 322 // Make sure we know our "debugger tuning." The target option takes 323 // precedence; fall back to triple-based defaults. 324 if (Asm->TM.Options.DebuggerTuning != DebuggerKind::Default) 325 DebuggerTuning = Asm->TM.Options.DebuggerTuning; 326 else if (IsDarwin) 327 DebuggerTuning = DebuggerKind::LLDB; 328 else if (TT.isPS4CPU()) 329 DebuggerTuning = DebuggerKind::SCE; 330 else 331 DebuggerTuning = DebuggerKind::GDB; 332 333 if (DwarfInlinedStrings == Default) 334 UseInlineStrings = TT.isNVPTX(); 335 else 336 UseInlineStrings = DwarfInlinedStrings == Enable; 337 338 UseLocSection = !TT.isNVPTX(); 339 340 HasAppleExtensionAttributes = tuneForLLDB(); 341 342 // Handle split DWARF. 343 HasSplitDwarf = !Asm->TM.Options.MCOptions.SplitDwarfFile.empty(); 344 345 // SCE defaults to linkage names only for abstract subprograms. 346 if (DwarfLinkageNames == DefaultLinkageNames) 347 UseAllLinkageNames = !tuneForSCE(); 348 else 349 UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames; 350 351 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion; 352 unsigned DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber 353 : MMI->getModule()->getDwarfVersion(); 354 // Use dwarf 4 by default if nothing is requested. For NVPTX, use dwarf 2. 355 DwarfVersion = 356 TT.isNVPTX() ? 2 : (DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION); 357 358 UsePubSections = !NoDwarfPubSections && !TT.isNVPTX(); 359 UseRangesSection = !NoDwarfRangesSection && !TT.isNVPTX(); 360 361 // Use sections as references. Force for NVPTX. 362 if (DwarfSectionsAsReferences == Default) 363 UseSectionsAsReferences = TT.isNVPTX(); 364 else 365 UseSectionsAsReferences = DwarfSectionsAsReferences == Enable; 366 367 GenerateTypeUnits = GenerateDwarfTypeUnits; 368 369 TheAccelTableKind = computeAccelTableKind( 370 DwarfVersion, GenerateTypeUnits, DebuggerTuning, A->TM.getTargetTriple()); 371 372 // Work around a GDB bug. GDB doesn't support the standard opcode; 373 // SCE doesn't support GNU's; LLDB prefers the standard opcode, which 374 // is defined as of DWARF 3. 375 // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented 376 // https://sourceware.org/bugzilla/show_bug.cgi?id=11616 377 UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3; 378 379 // GDB does not fully support the DWARF 4 representation for bitfields. 380 UseDWARF2Bitfields = (DwarfVersion < 4) || tuneForGDB(); 381 382 // The DWARF v5 string offsets table has - possibly shared - contributions 383 // from each compile and type unit each preceded by a header. The string 384 // offsets table used by the pre-DWARF v5 split-DWARF implementation uses 385 // a monolithic string offsets table without any header. 386 UseSegmentedStringOffsetsTable = DwarfVersion >= 5; 387 388 Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion); 389 } 390 391 // Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h. 392 DwarfDebug::~DwarfDebug() = default; 393 394 static bool isObjCClass(StringRef Name) { 395 return Name.startswith("+") || Name.startswith("-"); 396 } 397 398 static bool hasObjCCategory(StringRef Name) { 399 if (!isObjCClass(Name)) 400 return false; 401 402 return Name.find(") ") != StringRef::npos; 403 } 404 405 static void getObjCClassCategory(StringRef In, StringRef &Class, 406 StringRef &Category) { 407 if (!hasObjCCategory(In)) { 408 Class = In.slice(In.find('[') + 1, In.find(' ')); 409 Category = ""; 410 return; 411 } 412 413 Class = In.slice(In.find('[') + 1, In.find('(')); 414 Category = In.slice(In.find('[') + 1, In.find(' ')); 415 } 416 417 static StringRef getObjCMethodName(StringRef In) { 418 return In.slice(In.find(' ') + 1, In.find(']')); 419 } 420 421 // Add the various names to the Dwarf accelerator table names. 422 void DwarfDebug::addSubprogramNames(const DISubprogram *SP, DIE &Die) { 423 if (!SP->isDefinition()) 424 return; 425 426 if (SP->getName() != "") 427 addAccelName(SP->getName(), Die); 428 429 // If the linkage name is different than the name, go ahead and output that as 430 // well into the name table. Only do that if we are going to actually emit 431 // that name. 432 if (SP->getLinkageName() != "" && SP->getName() != SP->getLinkageName() && 433 (useAllLinkageNames() || InfoHolder.getAbstractSPDies().lookup(SP))) 434 addAccelName(SP->getLinkageName(), Die); 435 436 // If this is an Objective-C selector name add it to the ObjC accelerator 437 // too. 438 if (isObjCClass(SP->getName())) { 439 StringRef Class, Category; 440 getObjCClassCategory(SP->getName(), Class, Category); 441 addAccelObjC(Class, Die); 442 if (Category != "") 443 addAccelObjC(Category, Die); 444 // Also add the base method name to the name table. 445 addAccelName(getObjCMethodName(SP->getName()), Die); 446 } 447 } 448 449 /// Check whether we should create a DIE for the given Scope, return true 450 /// if we don't create a DIE (the corresponding DIE is null). 451 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) { 452 if (Scope->isAbstractScope()) 453 return false; 454 455 // We don't create a DIE if there is no Range. 456 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges(); 457 if (Ranges.empty()) 458 return true; 459 460 if (Ranges.size() > 1) 461 return false; 462 463 // We don't create a DIE if we have a single Range and the end label 464 // is null. 465 return !getLabelAfterInsn(Ranges.front().second); 466 } 467 468 template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) { 469 F(CU); 470 if (auto *SkelCU = CU.getSkeleton()) 471 if (CU.getCUNode()->getSplitDebugInlining()) 472 F(*SkelCU); 473 } 474 475 bool DwarfDebug::shareAcrossDWOCUs() const { 476 return SplitDwarfCrossCuReferences; 477 } 478 479 void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, 480 LexicalScope *Scope) { 481 assert(Scope && Scope->getScopeNode()); 482 assert(Scope->isAbstractScope()); 483 assert(!Scope->getInlinedAt()); 484 485 auto *SP = cast<DISubprogram>(Scope->getScopeNode()); 486 487 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram 488 // was inlined from another compile unit. 489 if (useSplitDwarf() && !shareAcrossDWOCUs() && !SP->getUnit()->getSplitDebugInlining()) 490 // Avoid building the original CU if it won't be used 491 SrcCU.constructAbstractSubprogramScopeDIE(Scope); 492 else { 493 auto &CU = getOrCreateDwarfCompileUnit(SP->getUnit()); 494 if (auto *SkelCU = CU.getSkeleton()) { 495 (shareAcrossDWOCUs() ? CU : SrcCU) 496 .constructAbstractSubprogramScopeDIE(Scope); 497 if (CU.getCUNode()->getSplitDebugInlining()) 498 SkelCU->constructAbstractSubprogramScopeDIE(Scope); 499 } else 500 CU.constructAbstractSubprogramScopeDIE(Scope); 501 } 502 } 503 504 void DwarfDebug::addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const { 505 if (!U.hasDwarfPubSections()) 506 return; 507 508 U.addFlag(D, dwarf::DW_AT_GNU_pubnames); 509 } 510 511 // Create new DwarfCompileUnit for the given metadata node with tag 512 // DW_TAG_compile_unit. 513 DwarfCompileUnit & 514 DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit) { 515 if (auto *CU = CUMap.lookup(DIUnit)) 516 return *CU; 517 StringRef FN = DIUnit->getFilename(); 518 CompilationDir = DIUnit->getDirectory(); 519 520 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>( 521 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder); 522 DwarfCompileUnit &NewCU = *OwnedUnit; 523 DIE &Die = NewCU.getUnitDie(); 524 InfoHolder.addUnit(std::move(OwnedUnit)); 525 if (useSplitDwarf()) { 526 NewCU.setSkeleton(constructSkeletonCU(NewCU)); 527 NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name, 528 Asm->TM.Options.MCOptions.SplitDwarfFile); 529 } 530 531 for (auto *IE : DIUnit->getImportedEntities()) 532 NewCU.addImportedEntity(IE); 533 534 // LTO with assembly output shares a single line table amongst multiple CUs. 535 // To avoid the compilation directory being ambiguous, let the line table 536 // explicitly describe the directory of all files, never relying on the 537 // compilation directory. 538 if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU) 539 Asm->OutStreamer->emitDwarfFile0Directive( 540 CompilationDir, FN, NewCU.getMD5AsBytes(DIUnit->getFile()), 541 DIUnit->getSource(), NewCU.getUniqueID()); 542 543 StringRef Producer = DIUnit->getProducer(); 544 StringRef Flags = DIUnit->getFlags(); 545 if (!Flags.empty()) { 546 std::string ProducerWithFlags = Producer.str() + " " + Flags.str(); 547 NewCU.addString(Die, dwarf::DW_AT_producer, ProducerWithFlags); 548 } else 549 NewCU.addString(Die, dwarf::DW_AT_producer, Producer); 550 551 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 552 DIUnit->getSourceLanguage()); 553 NewCU.addString(Die, dwarf::DW_AT_name, FN); 554 555 // Add DW_str_offsets_base to the unit DIE, except for split units. 556 if (useSegmentedStringOffsetsTable() && !useSplitDwarf()) 557 NewCU.addStringOffsetsStart(); 558 559 if (!useSplitDwarf()) { 560 NewCU.initStmtList(); 561 562 // If we're using split dwarf the compilation dir is going to be in the 563 // skeleton CU and so we don't need to duplicate it here. 564 if (!CompilationDir.empty()) 565 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 566 567 addGnuPubAttributes(NewCU, Die); 568 } 569 570 if (useAppleExtensionAttributes()) { 571 if (DIUnit->isOptimized()) 572 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized); 573 574 StringRef Flags = DIUnit->getFlags(); 575 if (!Flags.empty()) 576 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags); 577 578 if (unsigned RVer = DIUnit->getRuntimeVersion()) 579 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 580 dwarf::DW_FORM_data1, RVer); 581 } 582 583 if (useSplitDwarf()) 584 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoDWOSection()); 585 else 586 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection()); 587 588 if (DIUnit->getDWOId()) { 589 // This CU is either a clang module DWO or a skeleton CU. 590 NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 591 DIUnit->getDWOId()); 592 if (!DIUnit->getSplitDebugFilename().empty()) 593 // This is a prefabricated skeleton CU. 594 NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name, 595 DIUnit->getSplitDebugFilename()); 596 } 597 598 CUMap.insert({DIUnit, &NewCU}); 599 CUDieMap.insert({&Die, &NewCU}); 600 return NewCU; 601 } 602 603 void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU, 604 const DIImportedEntity *N) { 605 if (isa<DILocalScope>(N->getScope())) 606 return; 607 if (DIE *D = TheCU.getOrCreateContextDIE(N->getScope())) 608 D->addChild(TheCU.constructImportedEntityDIE(N)); 609 } 610 611 /// Sort and unique GVEs by comparing their fragment offset. 612 static SmallVectorImpl<DwarfCompileUnit::GlobalExpr> & 613 sortGlobalExprs(SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &GVEs) { 614 llvm::sort(GVEs.begin(), GVEs.end(), 615 [](DwarfCompileUnit::GlobalExpr A, 616 DwarfCompileUnit::GlobalExpr B) { 617 // Sort order: first null exprs, then exprs without fragment 618 // info, then sort by fragment offset in bits. 619 // FIXME: Come up with a more comprehensive comparator so 620 // the sorting isn't non-deterministic, and so the following 621 // std::unique call works correctly. 622 if (!A.Expr || !B.Expr) 623 return !!B.Expr; 624 auto FragmentA = A.Expr->getFragmentInfo(); 625 auto FragmentB = B.Expr->getFragmentInfo(); 626 if (!FragmentA || !FragmentB) 627 return !!FragmentB; 628 return FragmentA->OffsetInBits < FragmentB->OffsetInBits; 629 }); 630 GVEs.erase(std::unique(GVEs.begin(), GVEs.end(), 631 [](DwarfCompileUnit::GlobalExpr A, 632 DwarfCompileUnit::GlobalExpr B) { 633 return A.Expr == B.Expr; 634 }), 635 GVEs.end()); 636 return GVEs; 637 } 638 639 // Emit all Dwarf sections that should come prior to the content. Create 640 // global DIEs and emit initial debug info sections. This is invoked by 641 // the target AsmPrinter. 642 void DwarfDebug::beginModule() { 643 NamedRegionTimer T(DbgTimerName, DbgTimerDescription, DWARFGroupName, 644 DWARFGroupDescription, TimePassesIsEnabled); 645 if (DisableDebugInfoPrinting) 646 return; 647 648 const Module *M = MMI->getModule(); 649 650 unsigned NumDebugCUs = std::distance(M->debug_compile_units_begin(), 651 M->debug_compile_units_end()); 652 // Tell MMI whether we have debug info. 653 MMI->setDebugInfoAvailability(NumDebugCUs > 0); 654 SingleCU = NumDebugCUs == 1; 655 DenseMap<DIGlobalVariable *, SmallVector<DwarfCompileUnit::GlobalExpr, 1>> 656 GVMap; 657 for (const GlobalVariable &Global : M->globals()) { 658 SmallVector<DIGlobalVariableExpression *, 1> GVs; 659 Global.getDebugInfo(GVs); 660 for (auto *GVE : GVs) 661 GVMap[GVE->getVariable()].push_back({&Global, GVE->getExpression()}); 662 } 663 664 // Create the symbol that designates the start of the unit's contribution 665 // to the string offsets table. In a split DWARF scenario, only the skeleton 666 // unit has the DW_AT_str_offsets_base attribute (and hence needs the symbol). 667 if (useSegmentedStringOffsetsTable()) 668 (useSplitDwarf() ? SkeletonHolder : InfoHolder) 669 .setStringOffsetsStartSym(Asm->createTempSymbol("str_offsets_base")); 670 671 // Create the symbol that designates the start of the DWARF v5 range list 672 // table. It is located past the header and before the offsets table. 673 if (getDwarfVersion() >= 5) 674 (useSplitDwarf() ? SkeletonHolder : InfoHolder) 675 .setRnglistsTableBaseSym(Asm->createTempSymbol("rnglists_table_base")); 676 677 for (DICompileUnit *CUNode : M->debug_compile_units()) { 678 // FIXME: Move local imported entities into a list attached to the 679 // subprogram, then this search won't be needed and a 680 // getImportedEntities().empty() test should go below with the rest. 681 bool HasNonLocalImportedEntities = llvm::any_of( 682 CUNode->getImportedEntities(), [](const DIImportedEntity *IE) { 683 return !isa<DILocalScope>(IE->getScope()); 684 }); 685 686 if (!HasNonLocalImportedEntities && CUNode->getEnumTypes().empty() && 687 CUNode->getRetainedTypes().empty() && 688 CUNode->getGlobalVariables().empty() && CUNode->getMacros().empty()) 689 continue; 690 691 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(CUNode); 692 693 // Global Variables. 694 for (auto *GVE : CUNode->getGlobalVariables()) { 695 // Don't bother adding DIGlobalVariableExpressions listed in the CU if we 696 // already know about the variable and it isn't adding a constant 697 // expression. 698 auto &GVMapEntry = GVMap[GVE->getVariable()]; 699 auto *Expr = GVE->getExpression(); 700 if (!GVMapEntry.size() || (Expr && Expr->isConstant())) 701 GVMapEntry.push_back({nullptr, Expr}); 702 } 703 DenseSet<DIGlobalVariable *> Processed; 704 for (auto *GVE : CUNode->getGlobalVariables()) { 705 DIGlobalVariable *GV = GVE->getVariable(); 706 if (Processed.insert(GV).second) 707 CU.getOrCreateGlobalVariableDIE(GV, sortGlobalExprs(GVMap[GV])); 708 } 709 710 for (auto *Ty : CUNode->getEnumTypes()) { 711 // The enum types array by design contains pointers to 712 // MDNodes rather than DIRefs. Unique them here. 713 CU.getOrCreateTypeDIE(cast<DIType>(Ty)); 714 } 715 for (auto *Ty : CUNode->getRetainedTypes()) { 716 // The retained types array by design contains pointers to 717 // MDNodes rather than DIRefs. Unique them here. 718 if (DIType *RT = dyn_cast<DIType>(Ty)) 719 // There is no point in force-emitting a forward declaration. 720 CU.getOrCreateTypeDIE(RT); 721 } 722 // Emit imported_modules last so that the relevant context is already 723 // available. 724 for (auto *IE : CUNode->getImportedEntities()) 725 constructAndAddImportedEntityDIE(CU, IE); 726 } 727 } 728 729 void DwarfDebug::finishVariableDefinitions() { 730 for (const auto &Var : ConcreteVariables) { 731 DIE *VariableDie = Var->getDIE(); 732 assert(VariableDie); 733 // FIXME: Consider the time-space tradeoff of just storing the unit pointer 734 // in the ConcreteVariables list, rather than looking it up again here. 735 // DIE::getUnit isn't simple - it walks parent pointers, etc. 736 DwarfCompileUnit *Unit = CUDieMap.lookup(VariableDie->getUnitDie()); 737 assert(Unit); 738 Unit->finishVariableDefinition(*Var); 739 } 740 } 741 742 void DwarfDebug::finishSubprogramDefinitions() { 743 for (const DISubprogram *SP : ProcessedSPNodes) { 744 assert(SP->getUnit()->getEmissionKind() != DICompileUnit::NoDebug); 745 forBothCUs( 746 getOrCreateDwarfCompileUnit(SP->getUnit()), 747 [&](DwarfCompileUnit &CU) { CU.finishSubprogramDefinition(SP); }); 748 } 749 } 750 751 void DwarfDebug::finalizeModuleInfo() { 752 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 753 754 finishSubprogramDefinitions(); 755 756 finishVariableDefinitions(); 757 758 // Include the DWO file name in the hash if there's more than one CU. 759 // This handles ThinLTO's situation where imported CUs may very easily be 760 // duplicate with the same CU partially imported into another ThinLTO unit. 761 StringRef DWOName; 762 if (CUMap.size() > 1) 763 DWOName = Asm->TM.Options.MCOptions.SplitDwarfFile; 764 765 // Handle anything that needs to be done on a per-unit basis after 766 // all other generation. 767 for (const auto &P : CUMap) { 768 auto &TheCU = *P.second; 769 // Emit DW_AT_containing_type attribute to connect types with their 770 // vtable holding type. 771 TheCU.constructContainingTypeDIEs(); 772 773 // Add CU specific attributes if we need to add any. 774 // If we're splitting the dwarf out now that we've got the entire 775 // CU then add the dwo id to it. 776 auto *SkCU = TheCU.getSkeleton(); 777 if (useSplitDwarf()) { 778 // Emit a unique identifier for this CU. 779 uint64_t ID = 780 DIEHash(Asm).computeCUSignature(DWOName, TheCU.getUnitDie()); 781 if (getDwarfVersion() >= 5) { 782 TheCU.setDWOId(ID); 783 SkCU->setDWOId(ID); 784 } else { 785 TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 786 dwarf::DW_FORM_data8, ID); 787 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, 788 dwarf::DW_FORM_data8, ID); 789 } 790 // We don't keep track of which addresses are used in which CU so this 791 // is a bit pessimistic under LTO. 792 if (!AddrPool.isEmpty()) { 793 const MCSymbol *Sym = TLOF.getDwarfAddrSection()->getBeginSymbol(); 794 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base, 795 Sym, Sym); 796 } 797 if (getDwarfVersion() < 5 && !SkCU->getRangeLists().empty()) { 798 const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol(); 799 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base, 800 Sym, Sym); 801 } 802 } 803 804 // If we have code split among multiple sections or non-contiguous 805 // ranges of code then emit a DW_AT_ranges attribute on the unit that will 806 // remain in the .o file, otherwise add a DW_AT_low_pc. 807 // FIXME: We should use ranges allow reordering of code ala 808 // .subsections_via_symbols in mach-o. This would mean turning on 809 // ranges for all subprogram DIEs for mach-o. 810 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU; 811 if (unsigned NumRanges = TheCU.getRanges().size()) { 812 if (NumRanges > 1 && useRangesSection()) 813 // A DW_AT_low_pc attribute may also be specified in combination with 814 // DW_AT_ranges to specify the default base address for use in 815 // location lists (see Section 2.6.2) and range lists (see Section 816 // 2.17.3). 817 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); 818 else 819 U.setBaseAddress(TheCU.getRanges().front().getStart()); 820 U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges()); 821 } 822 823 if (getDwarfVersion() >= 5 && !useSplitDwarf() && 824 !U.getRangeLists().empty()) 825 U.addRnglistsBase(); 826 827 auto *CUNode = cast<DICompileUnit>(P.first); 828 // If compile Unit has macros, emit "DW_AT_macro_info" attribute. 829 if (CUNode->getMacros()) 830 U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_macro_info, 831 U.getMacroLabelBegin(), 832 TLOF.getDwarfMacinfoSection()->getBeginSymbol()); 833 } 834 835 // Emit all frontend-produced Skeleton CUs, i.e., Clang modules. 836 for (auto *CUNode : MMI->getModule()->debug_compile_units()) 837 if (CUNode->getDWOId()) 838 getOrCreateDwarfCompileUnit(CUNode); 839 840 // Compute DIE offsets and sizes. 841 InfoHolder.computeSizeAndOffsets(); 842 if (useSplitDwarf()) 843 SkeletonHolder.computeSizeAndOffsets(); 844 } 845 846 // Emit all Dwarf sections that should come after the content. 847 void DwarfDebug::endModule() { 848 assert(CurFn == nullptr); 849 assert(CurMI == nullptr); 850 851 // If we aren't actually generating debug info (check beginModule - 852 // conditionalized on !DisableDebugInfoPrinting and the presence of the 853 // llvm.dbg.cu metadata node) 854 if (!MMI->hasDebugInfo()) 855 return; 856 857 // Finalize the debug info for the module. 858 finalizeModuleInfo(); 859 860 emitDebugStr(); 861 862 if (useSplitDwarf()) 863 emitDebugLocDWO(); 864 else 865 // Emit info into a debug loc section. 866 emitDebugLoc(); 867 868 // Corresponding abbreviations into a abbrev section. 869 emitAbbreviations(); 870 871 // Emit all the DIEs into a debug info section. 872 emitDebugInfo(); 873 874 // Emit info into a debug aranges section. 875 if (GenerateARangeSection) 876 emitDebugARanges(); 877 878 // Emit info into a debug ranges section. 879 emitDebugRanges(); 880 881 // Emit info into a debug macinfo section. 882 emitDebugMacinfo(); 883 884 if (useSplitDwarf()) { 885 emitDebugStrDWO(); 886 emitDebugInfoDWO(); 887 emitDebugAbbrevDWO(); 888 emitDebugLineDWO(); 889 emitDebugAddr(); 890 } 891 892 // Emit info into the dwarf accelerator table sections. 893 switch (getAccelTableKind()) { 894 case AccelTableKind::Apple: 895 emitAccelNames(); 896 emitAccelObjC(); 897 emitAccelNamespaces(); 898 emitAccelTypes(); 899 break; 900 case AccelTableKind::Dwarf: 901 emitAccelDebugNames(); 902 break; 903 case AccelTableKind::None: 904 break; 905 case AccelTableKind::Default: 906 llvm_unreachable("Default should have already been resolved."); 907 } 908 909 // Emit the pubnames and pubtypes sections if requested. 910 emitDebugPubSections(); 911 912 // clean up. 913 // FIXME: AbstractVariables.clear(); 914 } 915 916 void DwarfDebug::ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV, 917 const MDNode *ScopeNode) { 918 const DILocalVariable *Cleansed = nullptr; 919 if (CU.getExistingAbstractVariable(IV, Cleansed)) 920 return; 921 922 CU.createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope( 923 cast<DILocalScope>(ScopeNode))); 924 } 925 926 void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU, 927 InlinedVariable IV, const MDNode *ScopeNode) { 928 const DILocalVariable *Cleansed = nullptr; 929 if (CU.getExistingAbstractVariable(IV, Cleansed)) 930 return; 931 932 if (LexicalScope *Scope = 933 LScopes.findAbstractScope(cast_or_null<DILocalScope>(ScopeNode))) 934 CU.createAbstractVariable(Cleansed, Scope); 935 } 936 937 // Collect variable information from side table maintained by MF. 938 void DwarfDebug::collectVariableInfoFromMFTable( 939 DwarfCompileUnit &TheCU, DenseSet<InlinedVariable> &Processed) { 940 SmallDenseMap<InlinedVariable, DbgVariable *> MFVars; 941 for (const auto &VI : Asm->MF->getVariableDbgInfo()) { 942 if (!VI.Var) 943 continue; 944 assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) && 945 "Expected inlined-at fields to agree"); 946 947 InlinedVariable Var(VI.Var, VI.Loc->getInlinedAt()); 948 Processed.insert(Var); 949 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc); 950 951 // If variable scope is not found then skip this variable. 952 if (!Scope) 953 continue; 954 955 ensureAbstractVariableIsCreatedIfScoped(TheCU, Var, Scope->getScopeNode()); 956 auto RegVar = llvm::make_unique<DbgVariable>(Var.first, Var.second); 957 RegVar->initializeMMI(VI.Expr, VI.Slot); 958 if (DbgVariable *DbgVar = MFVars.lookup(Var)) 959 DbgVar->addMMIEntry(*RegVar); 960 else if (InfoHolder.addScopeVariable(Scope, RegVar.get())) { 961 MFVars.insert({Var, RegVar.get()}); 962 ConcreteVariables.push_back(std::move(RegVar)); 963 } 964 } 965 } 966 967 // Get .debug_loc entry for the instruction range starting at MI. 968 static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) { 969 const DIExpression *Expr = MI->getDebugExpression(); 970 assert(MI->getNumOperands() == 4); 971 if (MI->getOperand(0).isReg()) { 972 auto RegOp = MI->getOperand(0); 973 auto Op1 = MI->getOperand(1); 974 // If the second operand is an immediate, this is a 975 // register-indirect address. 976 assert((!Op1.isImm() || (Op1.getImm() == 0)) && "unexpected offset"); 977 MachineLocation MLoc(RegOp.getReg(), Op1.isImm()); 978 return DebugLocEntry::Value(Expr, MLoc); 979 } 980 if (MI->getOperand(0).isImm()) 981 return DebugLocEntry::Value(Expr, MI->getOperand(0).getImm()); 982 if (MI->getOperand(0).isFPImm()) 983 return DebugLocEntry::Value(Expr, MI->getOperand(0).getFPImm()); 984 if (MI->getOperand(0).isCImm()) 985 return DebugLocEntry::Value(Expr, MI->getOperand(0).getCImm()); 986 987 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!"); 988 } 989 990 /// If this and Next are describing different fragments of the same 991 /// variable, merge them by appending Next's values to the current 992 /// list of values. 993 /// Return true if the merge was successful. 994 bool DebugLocEntry::MergeValues(const DebugLocEntry &Next) { 995 if (Begin == Next.Begin) { 996 auto *FirstExpr = cast<DIExpression>(Values[0].Expression); 997 auto *FirstNextExpr = cast<DIExpression>(Next.Values[0].Expression); 998 if (!FirstExpr->isFragment() || !FirstNextExpr->isFragment()) 999 return false; 1000 1001 // We can only merge entries if none of the fragments overlap any others. 1002 // In doing so, we can take advantage of the fact that both lists are 1003 // sorted. 1004 for (unsigned i = 0, j = 0; i < Values.size(); ++i) { 1005 for (; j < Next.Values.size(); ++j) { 1006 int res = cast<DIExpression>(Values[i].Expression)->fragmentCmp( 1007 cast<DIExpression>(Next.Values[j].Expression)); 1008 if (res == 0) // The two expressions overlap, we can't merge. 1009 return false; 1010 // Values[i] is entirely before Next.Values[j], 1011 // so go back to the next entry of Values. 1012 else if (res == -1) 1013 break; 1014 // Next.Values[j] is entirely before Values[i], so go on to the 1015 // next entry of Next.Values. 1016 } 1017 } 1018 1019 addValues(Next.Values); 1020 End = Next.End; 1021 return true; 1022 } 1023 return false; 1024 } 1025 1026 /// Build the location list for all DBG_VALUEs in the function that 1027 /// describe the same variable. If the ranges of several independent 1028 /// fragments of the same variable overlap partially, split them up and 1029 /// combine the ranges. The resulting DebugLocEntries are will have 1030 /// strict monotonically increasing begin addresses and will never 1031 /// overlap. 1032 // 1033 // Input: 1034 // 1035 // Ranges History [var, loc, fragment ofs size] 1036 // 0 | [x, (reg0, fragment 0, 32)] 1037 // 1 | | [x, (reg1, fragment 32, 32)] <- IsFragmentOfPrevEntry 1038 // 2 | | ... 1039 // 3 | [clobber reg0] 1040 // 4 [x, (mem, fragment 0, 64)] <- overlapping with both previous fragments of 1041 // x. 1042 // 1043 // Output: 1044 // 1045 // [0-1] [x, (reg0, fragment 0, 32)] 1046 // [1-3] [x, (reg0, fragment 0, 32), (reg1, fragment 32, 32)] 1047 // [3-4] [x, (reg1, fragment 32, 32)] 1048 // [4- ] [x, (mem, fragment 0, 64)] 1049 void 1050 DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, 1051 const DbgValueHistoryMap::InstrRanges &Ranges) { 1052 SmallVector<DebugLocEntry::Value, 4> OpenRanges; 1053 1054 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) { 1055 const MachineInstr *Begin = I->first; 1056 const MachineInstr *End = I->second; 1057 assert(Begin->isDebugValue() && "Invalid History entry"); 1058 1059 // Check if a variable is inaccessible in this range. 1060 if (Begin->getNumOperands() > 1 && 1061 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) { 1062 OpenRanges.clear(); 1063 continue; 1064 } 1065 1066 // If this fragment overlaps with any open ranges, truncate them. 1067 const DIExpression *DIExpr = Begin->getDebugExpression(); 1068 auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) { 1069 return DIExpr->fragmentsOverlap(R.getExpression()); 1070 }); 1071 OpenRanges.erase(Last, OpenRanges.end()); 1072 1073 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin); 1074 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!"); 1075 1076 const MCSymbol *EndLabel; 1077 if (End != nullptr) 1078 EndLabel = getLabelAfterInsn(End); 1079 else if (std::next(I) == Ranges.end()) 1080 EndLabel = Asm->getFunctionEnd(); 1081 else 1082 EndLabel = getLabelBeforeInsn(std::next(I)->first); 1083 assert(EndLabel && "Forgot label after instruction ending a range!"); 1084 1085 LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n"); 1086 1087 auto Value = getDebugLocValue(Begin); 1088 DebugLocEntry Loc(StartLabel, EndLabel, Value); 1089 bool couldMerge = false; 1090 1091 // If this is a fragment, it may belong to the current DebugLocEntry. 1092 if (DIExpr->isFragment()) { 1093 // Add this value to the list of open ranges. 1094 OpenRanges.push_back(Value); 1095 1096 // Attempt to add the fragment to the last entry. 1097 if (!DebugLoc.empty()) 1098 if (DebugLoc.back().MergeValues(Loc)) 1099 couldMerge = true; 1100 } 1101 1102 if (!couldMerge) { 1103 // Need to add a new DebugLocEntry. Add all values from still 1104 // valid non-overlapping fragments. 1105 if (OpenRanges.size()) 1106 Loc.addValues(OpenRanges); 1107 1108 DebugLoc.push_back(std::move(Loc)); 1109 } 1110 1111 // Attempt to coalesce the ranges of two otherwise identical 1112 // DebugLocEntries. 1113 auto CurEntry = DebugLoc.rbegin(); 1114 LLVM_DEBUG({ 1115 dbgs() << CurEntry->getValues().size() << " Values:\n"; 1116 for (auto &Value : CurEntry->getValues()) 1117 Value.dump(); 1118 dbgs() << "-----\n"; 1119 }); 1120 1121 auto PrevEntry = std::next(CurEntry); 1122 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry)) 1123 DebugLoc.pop_back(); 1124 } 1125 } 1126 1127 DbgVariable *DwarfDebug::createConcreteVariable(DwarfCompileUnit &TheCU, 1128 LexicalScope &Scope, 1129 InlinedVariable IV) { 1130 ensureAbstractVariableIsCreatedIfScoped(TheCU, IV, Scope.getScopeNode()); 1131 ConcreteVariables.push_back( 1132 llvm::make_unique<DbgVariable>(IV.first, IV.second)); 1133 InfoHolder.addScopeVariable(&Scope, ConcreteVariables.back().get()); 1134 return ConcreteVariables.back().get(); 1135 } 1136 1137 /// Determine whether a *singular* DBG_VALUE is valid for the entirety of its 1138 /// enclosing lexical scope. The check ensures there are no other instructions 1139 /// in the same lexical scope preceding the DBG_VALUE and that its range is 1140 /// either open or otherwise rolls off the end of the scope. 1141 static bool validThroughout(LexicalScopes &LScopes, 1142 const MachineInstr *DbgValue, 1143 const MachineInstr *RangeEnd) { 1144 assert(DbgValue->getDebugLoc() && "DBG_VALUE without a debug location"); 1145 auto MBB = DbgValue->getParent(); 1146 auto DL = DbgValue->getDebugLoc(); 1147 auto *LScope = LScopes.findLexicalScope(DL); 1148 // Scope doesn't exist; this is a dead DBG_VALUE. 1149 if (!LScope) 1150 return false; 1151 auto &LSRange = LScope->getRanges(); 1152 if (LSRange.size() == 0) 1153 return false; 1154 1155 // Determine if the DBG_VALUE is valid at the beginning of its lexical block. 1156 const MachineInstr *LScopeBegin = LSRange.front().first; 1157 // Early exit if the lexical scope begins outside of the current block. 1158 if (LScopeBegin->getParent() != MBB) 1159 return false; 1160 MachineBasicBlock::const_reverse_iterator Pred(DbgValue); 1161 for (++Pred; Pred != MBB->rend(); ++Pred) { 1162 if (Pred->getFlag(MachineInstr::FrameSetup)) 1163 break; 1164 auto PredDL = Pred->getDebugLoc(); 1165 if (!PredDL || Pred->isMetaInstruction()) 1166 continue; 1167 // Check whether the instruction preceding the DBG_VALUE is in the same 1168 // (sub)scope as the DBG_VALUE. 1169 if (DL->getScope() == PredDL->getScope()) 1170 return false; 1171 auto *PredScope = LScopes.findLexicalScope(PredDL); 1172 if (!PredScope || LScope->dominates(PredScope)) 1173 return false; 1174 } 1175 1176 // If the range of the DBG_VALUE is open-ended, report success. 1177 if (!RangeEnd) 1178 return true; 1179 1180 // Fail if there are instructions belonging to our scope in another block. 1181 const MachineInstr *LScopeEnd = LSRange.back().second; 1182 if (LScopeEnd->getParent() != MBB) 1183 return false; 1184 1185 // Single, constant DBG_VALUEs in the prologue are promoted to be live 1186 // throughout the function. This is a hack, presumably for DWARF v2 and not 1187 // necessarily correct. It would be much better to use a dbg.declare instead 1188 // if we know the constant is live throughout the scope. 1189 if (DbgValue->getOperand(0).isImm() && MBB->pred_empty()) 1190 return true; 1191 1192 return false; 1193 } 1194 1195 // Find variables for each lexical scope. 1196 void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, 1197 const DISubprogram *SP, 1198 DenseSet<InlinedVariable> &Processed) { 1199 // Grab the variable info that was squirreled away in the MMI side-table. 1200 collectVariableInfoFromMFTable(TheCU, Processed); 1201 1202 for (const auto &I : DbgValues) { 1203 InlinedVariable IV = I.first; 1204 if (Processed.count(IV)) 1205 continue; 1206 1207 // Instruction ranges, specifying where IV is accessible. 1208 const auto &Ranges = I.second; 1209 if (Ranges.empty()) 1210 continue; 1211 1212 LexicalScope *Scope = nullptr; 1213 if (const DILocation *IA = IV.second) 1214 Scope = LScopes.findInlinedScope(IV.first->getScope(), IA); 1215 else 1216 Scope = LScopes.findLexicalScope(IV.first->getScope()); 1217 // If variable scope is not found then skip this variable. 1218 if (!Scope) 1219 continue; 1220 1221 Processed.insert(IV); 1222 DbgVariable *RegVar = createConcreteVariable(TheCU, *Scope, IV); 1223 1224 const MachineInstr *MInsn = Ranges.front().first; 1225 assert(MInsn->isDebugValue() && "History must begin with debug value"); 1226 1227 // Check if there is a single DBG_VALUE, valid throughout the var's scope. 1228 if (Ranges.size() == 1 && 1229 validThroughout(LScopes, MInsn, Ranges.front().second)) { 1230 RegVar->initializeDbgValue(MInsn); 1231 continue; 1232 } 1233 // Do not emit location lists if .debug_loc secton is disabled. 1234 if (!useLocSection()) 1235 continue; 1236 1237 // Handle multiple DBG_VALUE instructions describing one variable. 1238 DebugLocStream::ListBuilder List(DebugLocs, TheCU, *Asm, *RegVar, *MInsn); 1239 1240 // Build the location list for this variable. 1241 SmallVector<DebugLocEntry, 8> Entries; 1242 buildLocationList(Entries, Ranges); 1243 1244 // If the variable has a DIBasicType, extract it. Basic types cannot have 1245 // unique identifiers, so don't bother resolving the type with the 1246 // identifier map. 1247 const DIBasicType *BT = dyn_cast<DIBasicType>( 1248 static_cast<const Metadata *>(IV.first->getType())); 1249 1250 // Finalize the entry by lowering it into a DWARF bytestream. 1251 for (auto &Entry : Entries) 1252 Entry.finalize(*Asm, List, BT); 1253 } 1254 1255 // Collect info for variables that were optimized out. 1256 for (const DINode *DN : SP->getRetainedNodes()) { 1257 if (auto *DV = dyn_cast<DILocalVariable>(DN)) { 1258 if (Processed.insert(InlinedVariable(DV, nullptr)).second) 1259 if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope())) 1260 createConcreteVariable(TheCU, *Scope, InlinedVariable(DV, nullptr)); 1261 } 1262 } 1263 } 1264 1265 // Process beginning of an instruction. 1266 void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1267 DebugHandlerBase::beginInstruction(MI); 1268 assert(CurMI); 1269 1270 const auto *SP = MI->getMF()->getFunction().getSubprogram(); 1271 if (!SP || SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug) 1272 return; 1273 1274 // Check if source location changes, but ignore DBG_VALUE and CFI locations. 1275 // If the instruction is part of the function frame setup code, do not emit 1276 // any line record, as there is no correspondence with any user code. 1277 if (MI->isMetaInstruction() || MI->getFlag(MachineInstr::FrameSetup)) 1278 return; 1279 const DebugLoc &DL = MI->getDebugLoc(); 1280 // When we emit a line-0 record, we don't update PrevInstLoc; so look at 1281 // the last line number actually emitted, to see if it was line 0. 1282 unsigned LastAsmLine = 1283 Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine(); 1284 1285 if (DL == PrevInstLoc) { 1286 // If we have an ongoing unspecified location, nothing to do here. 1287 if (!DL) 1288 return; 1289 // We have an explicit location, same as the previous location. 1290 // But we might be coming back to it after a line 0 record. 1291 if (LastAsmLine == 0 && DL.getLine() != 0) { 1292 // Reinstate the source location but not marked as a statement. 1293 const MDNode *Scope = DL.getScope(); 1294 recordSourceLine(DL.getLine(), DL.getCol(), Scope, /*Flags=*/0); 1295 } 1296 return; 1297 } 1298 1299 if (!DL) { 1300 // We have an unspecified location, which might want to be line 0. 1301 // If we have already emitted a line-0 record, don't repeat it. 1302 if (LastAsmLine == 0) 1303 return; 1304 // If user said Don't Do That, don't do that. 1305 if (UnknownLocations == Disable) 1306 return; 1307 // See if we have a reason to emit a line-0 record now. 1308 // Reasons to emit a line-0 record include: 1309 // - User asked for it (UnknownLocations). 1310 // - Instruction has a label, so it's referenced from somewhere else, 1311 // possibly debug information; we want it to have a source location. 1312 // - Instruction is at the top of a block; we don't want to inherit the 1313 // location from the physically previous (maybe unrelated) block. 1314 if (UnknownLocations == Enable || PrevLabel || 1315 (PrevInstBB && PrevInstBB != MI->getParent())) { 1316 // Preserve the file and column numbers, if we can, to save space in 1317 // the encoded line table. 1318 // Do not update PrevInstLoc, it remembers the last non-0 line. 1319 const MDNode *Scope = nullptr; 1320 unsigned Column = 0; 1321 if (PrevInstLoc) { 1322 Scope = PrevInstLoc.getScope(); 1323 Column = PrevInstLoc.getCol(); 1324 } 1325 recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0); 1326 } 1327 return; 1328 } 1329 1330 // We have an explicit location, different from the previous location. 1331 // Don't repeat a line-0 record, but otherwise emit the new location. 1332 // (The new location might be an explicit line 0, which we do emit.) 1333 if (PrevInstLoc && DL.getLine() == 0 && LastAsmLine == 0) 1334 return; 1335 unsigned Flags = 0; 1336 if (DL == PrologEndLoc) { 1337 Flags |= DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_IS_STMT; 1338 PrologEndLoc = DebugLoc(); 1339 } 1340 // If the line changed, we call that a new statement; unless we went to 1341 // line 0 and came back, in which case it is not a new statement. 1342 unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine; 1343 if (DL.getLine() && DL.getLine() != OldLine) 1344 Flags |= DWARF2_FLAG_IS_STMT; 1345 1346 const MDNode *Scope = DL.getScope(); 1347 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags); 1348 1349 // If we're not at line 0, remember this location. 1350 if (DL.getLine()) 1351 PrevInstLoc = DL; 1352 } 1353 1354 static DebugLoc findPrologueEndLoc(const MachineFunction *MF) { 1355 // First known non-DBG_VALUE and non-frame setup location marks 1356 // the beginning of the function body. 1357 for (const auto &MBB : *MF) 1358 for (const auto &MI : MBB) 1359 if (!MI.isMetaInstruction() && !MI.getFlag(MachineInstr::FrameSetup) && 1360 MI.getDebugLoc()) 1361 return MI.getDebugLoc(); 1362 return DebugLoc(); 1363 } 1364 1365 // Gather pre-function debug information. Assumes being called immediately 1366 // after the function entry point has been emitted. 1367 void DwarfDebug::beginFunctionImpl(const MachineFunction *MF) { 1368 CurFn = MF; 1369 1370 auto *SP = MF->getFunction().getSubprogram(); 1371 assert(LScopes.empty() || SP == LScopes.getCurrentFunctionScope()->getScopeNode()); 1372 if (SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug) 1373 return; 1374 1375 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(SP->getUnit()); 1376 1377 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function 1378 // belongs to so that we add to the correct per-cu line table in the 1379 // non-asm case. 1380 if (Asm->OutStreamer->hasRawTextSupport()) 1381 // Use a single line table if we are generating assembly. 1382 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0); 1383 else 1384 Asm->OutStreamer->getContext().setDwarfCompileUnitID(CU.getUniqueID()); 1385 1386 // Record beginning of function. 1387 PrologEndLoc = findPrologueEndLoc(MF); 1388 if (PrologEndLoc) { 1389 // We'd like to list the prologue as "not statements" but GDB behaves 1390 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing. 1391 auto *SP = PrologEndLoc->getInlinedAtScope()->getSubprogram(); 1392 recordSourceLine(SP->getScopeLine(), 0, SP, DWARF2_FLAG_IS_STMT); 1393 } 1394 } 1395 1396 void DwarfDebug::skippedNonDebugFunction() { 1397 // If we don't have a subprogram for this function then there will be a hole 1398 // in the range information. Keep note of this by setting the previously used 1399 // section to nullptr. 1400 PrevCU = nullptr; 1401 CurFn = nullptr; 1402 } 1403 1404 // Gather and emit post-function debug information. 1405 void DwarfDebug::endFunctionImpl(const MachineFunction *MF) { 1406 const DISubprogram *SP = MF->getFunction().getSubprogram(); 1407 1408 assert(CurFn == MF && 1409 "endFunction should be called with the same function as beginFunction"); 1410 1411 // Set DwarfDwarfCompileUnitID in MCContext to default value. 1412 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0); 1413 1414 LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); 1415 assert(!FnScope || SP == FnScope->getScopeNode()); 1416 DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit()); 1417 1418 DenseSet<InlinedVariable> ProcessedVars; 1419 collectVariableInfo(TheCU, SP, ProcessedVars); 1420 1421 // Add the range of this function to the list of ranges for the CU. 1422 TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd())); 1423 1424 // Under -gmlt, skip building the subprogram if there are no inlined 1425 // subroutines inside it. But with -fdebug-info-for-profiling, the subprogram 1426 // is still needed as we need its source location. 1427 if (!TheCU.getCUNode()->getDebugInfoForProfiling() && 1428 TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly && 1429 LScopes.getAbstractScopesList().empty() && !IsDarwin) { 1430 assert(InfoHolder.getScopeVariables().empty()); 1431 PrevLabel = nullptr; 1432 CurFn = nullptr; 1433 return; 1434 } 1435 1436 #ifndef NDEBUG 1437 size_t NumAbstractScopes = LScopes.getAbstractScopesList().size(); 1438 #endif 1439 // Construct abstract scopes. 1440 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) { 1441 auto *SP = cast<DISubprogram>(AScope->getScopeNode()); 1442 for (const DINode *DN : SP->getRetainedNodes()) { 1443 if (auto *DV = dyn_cast<DILocalVariable>(DN)) { 1444 // Collect info for variables that were optimized out. 1445 if (!ProcessedVars.insert(InlinedVariable(DV, nullptr)).second) 1446 continue; 1447 ensureAbstractVariableIsCreated(TheCU, InlinedVariable(DV, nullptr), 1448 DV->getScope()); 1449 assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes 1450 && "ensureAbstractVariableIsCreated inserted abstract scopes"); 1451 } 1452 } 1453 constructAbstractSubprogramScopeDIE(TheCU, AScope); 1454 } 1455 1456 ProcessedSPNodes.insert(SP); 1457 TheCU.constructSubprogramScopeDIE(SP, FnScope); 1458 if (auto *SkelCU = TheCU.getSkeleton()) 1459 if (!LScopes.getAbstractScopesList().empty() && 1460 TheCU.getCUNode()->getSplitDebugInlining()) 1461 SkelCU->constructSubprogramScopeDIE(SP, FnScope); 1462 1463 // Clear debug info 1464 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the 1465 // DbgVariables except those that are also in AbstractVariables (since they 1466 // can be used cross-function) 1467 InfoHolder.getScopeVariables().clear(); 1468 PrevLabel = nullptr; 1469 CurFn = nullptr; 1470 } 1471 1472 // Register a source line with debug info. Returns the unique label that was 1473 // emitted and which provides correspondence to the source line list. 1474 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S, 1475 unsigned Flags) { 1476 StringRef Fn; 1477 unsigned FileNo = 1; 1478 unsigned Discriminator = 0; 1479 if (auto *Scope = cast_or_null<DIScope>(S)) { 1480 Fn = Scope->getFilename(); 1481 if (Line != 0 && getDwarfVersion() >= 4) 1482 if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope)) 1483 Discriminator = LBF->getDiscriminator(); 1484 1485 unsigned CUID = Asm->OutStreamer->getContext().getDwarfCompileUnitID(); 1486 FileNo = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID]) 1487 .getOrCreateSourceID(Scope->getFile()); 1488 } 1489 Asm->OutStreamer->EmitDwarfLocDirective(FileNo, Line, Col, Flags, 0, 1490 Discriminator, Fn); 1491 } 1492 1493 //===----------------------------------------------------------------------===// 1494 // Emit Methods 1495 //===----------------------------------------------------------------------===// 1496 1497 // Emit the debug info section. 1498 void DwarfDebug::emitDebugInfo() { 1499 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1500 Holder.emitUnits(/* UseOffsets */ false); 1501 } 1502 1503 // Emit the abbreviation section. 1504 void DwarfDebug::emitAbbreviations() { 1505 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1506 1507 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection()); 1508 } 1509 1510 void DwarfDebug::emitStringOffsetsTableHeader() { 1511 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1512 Holder.getStringPool().emitStringOffsetsTableHeader( 1513 *Asm, Asm->getObjFileLowering().getDwarfStrOffSection(), 1514 Holder.getStringOffsetsStartSym()); 1515 } 1516 1517 template <typename AccelTableT> 1518 void DwarfDebug::emitAccel(AccelTableT &Accel, MCSection *Section, 1519 StringRef TableName) { 1520 Asm->OutStreamer->SwitchSection(Section); 1521 1522 // Emit the full data. 1523 emitAppleAccelTable(Asm, Accel, TableName, Section->getBeginSymbol()); 1524 } 1525 1526 void DwarfDebug::emitAccelDebugNames() { 1527 // Don't emit anything if we have no compilation units to index. 1528 if (getUnits().empty()) 1529 return; 1530 1531 Asm->OutStreamer->SwitchSection( 1532 Asm->getObjFileLowering().getDwarfDebugNamesSection()); 1533 emitDWARF5AccelTable(Asm, AccelDebugNames, *this, getUnits()); 1534 } 1535 1536 // Emit visible names into a hashed accelerator table section. 1537 void DwarfDebug::emitAccelNames() { 1538 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(), 1539 "Names"); 1540 } 1541 1542 // Emit objective C classes and categories into a hashed accelerator table 1543 // section. 1544 void DwarfDebug::emitAccelObjC() { 1545 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(), 1546 "ObjC"); 1547 } 1548 1549 // Emit namespace dies into a hashed accelerator table. 1550 void DwarfDebug::emitAccelNamespaces() { 1551 emitAccel(AccelNamespace, 1552 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(), 1553 "namespac"); 1554 } 1555 1556 // Emit type dies into a hashed accelerator table. 1557 void DwarfDebug::emitAccelTypes() { 1558 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(), 1559 "types"); 1560 } 1561 1562 // Public name handling. 1563 // The format for the various pubnames: 1564 // 1565 // dwarf pubnames - offset/name pairs where the offset is the offset into the CU 1566 // for the DIE that is named. 1567 // 1568 // gnu pubnames - offset/index value/name tuples where the offset is the offset 1569 // into the CU and the index value is computed according to the type of value 1570 // for the DIE that is named. 1571 // 1572 // For type units the offset is the offset of the skeleton DIE. For split dwarf 1573 // it's the offset within the debug_info/debug_types dwo section, however, the 1574 // reference in the pubname header doesn't change. 1575 1576 /// computeIndexValue - Compute the gdb index value for the DIE and CU. 1577 static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU, 1578 const DIE *Die) { 1579 // Entities that ended up only in a Type Unit reference the CU instead (since 1580 // the pub entry has offsets within the CU there's no real offset that can be 1581 // provided anyway). As it happens all such entities (namespaces and types, 1582 // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this turns out 1583 // not to be true it would be necessary to persist this information from the 1584 // point at which the entry is added to the index data structure - since by 1585 // the time the index is built from that, the original type/namespace DIE in a 1586 // type unit has already been destroyed so it can't be queried for properties 1587 // like tag, etc. 1588 if (Die->getTag() == dwarf::DW_TAG_compile_unit) 1589 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, 1590 dwarf::GIEL_EXTERNAL); 1591 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC; 1592 1593 // We could have a specification DIE that has our most of our knowledge, 1594 // look for that now. 1595 if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) { 1596 DIE &SpecDIE = SpecVal.getDIEEntry().getEntry(); 1597 if (SpecDIE.findAttribute(dwarf::DW_AT_external)) 1598 Linkage = dwarf::GIEL_EXTERNAL; 1599 } else if (Die->findAttribute(dwarf::DW_AT_external)) 1600 Linkage = dwarf::GIEL_EXTERNAL; 1601 1602 switch (Die->getTag()) { 1603 case dwarf::DW_TAG_class_type: 1604 case dwarf::DW_TAG_structure_type: 1605 case dwarf::DW_TAG_union_type: 1606 case dwarf::DW_TAG_enumeration_type: 1607 return dwarf::PubIndexEntryDescriptor( 1608 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus 1609 ? dwarf::GIEL_STATIC 1610 : dwarf::GIEL_EXTERNAL); 1611 case dwarf::DW_TAG_typedef: 1612 case dwarf::DW_TAG_base_type: 1613 case dwarf::DW_TAG_subrange_type: 1614 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC); 1615 case dwarf::DW_TAG_namespace: 1616 return dwarf::GIEK_TYPE; 1617 case dwarf::DW_TAG_subprogram: 1618 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage); 1619 case dwarf::DW_TAG_variable: 1620 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage); 1621 case dwarf::DW_TAG_enumerator: 1622 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, 1623 dwarf::GIEL_STATIC); 1624 default: 1625 return dwarf::GIEK_NONE; 1626 } 1627 } 1628 1629 /// emitDebugPubSections - Emit visible names and types into debug pubnames and 1630 /// pubtypes sections. 1631 void DwarfDebug::emitDebugPubSections() { 1632 for (const auto &NU : CUMap) { 1633 DwarfCompileUnit *TheU = NU.second; 1634 if (!TheU->hasDwarfPubSections()) 1635 continue; 1636 1637 bool GnuStyle = TheU->getCUNode()->getGnuPubnames(); 1638 1639 Asm->OutStreamer->SwitchSection( 1640 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection() 1641 : Asm->getObjFileLowering().getDwarfPubNamesSection()); 1642 emitDebugPubSection(GnuStyle, "Names", TheU, TheU->getGlobalNames()); 1643 1644 Asm->OutStreamer->SwitchSection( 1645 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection() 1646 : Asm->getObjFileLowering().getDwarfPubTypesSection()); 1647 emitDebugPubSection(GnuStyle, "Types", TheU, TheU->getGlobalTypes()); 1648 } 1649 } 1650 1651 void DwarfDebug::emitSectionReference(const DwarfCompileUnit &CU) { 1652 if (useSectionsAsReferences()) 1653 Asm->EmitDwarfOffset(CU.getSection()->getBeginSymbol(), 1654 CU.getDebugSectionOffset()); 1655 else 1656 Asm->emitDwarfSymbolReference(CU.getLabelBegin()); 1657 } 1658 1659 void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name, 1660 DwarfCompileUnit *TheU, 1661 const StringMap<const DIE *> &Globals) { 1662 if (auto *Skeleton = TheU->getSkeleton()) 1663 TheU = Skeleton; 1664 1665 // Emit the header. 1666 Asm->OutStreamer->AddComment("Length of Public " + Name + " Info"); 1667 MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin"); 1668 MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end"); 1669 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4); 1670 1671 Asm->OutStreamer->EmitLabel(BeginLabel); 1672 1673 Asm->OutStreamer->AddComment("DWARF Version"); 1674 Asm->emitInt16(dwarf::DW_PUBNAMES_VERSION); 1675 1676 Asm->OutStreamer->AddComment("Offset of Compilation Unit Info"); 1677 emitSectionReference(*TheU); 1678 1679 Asm->OutStreamer->AddComment("Compilation Unit Length"); 1680 Asm->emitInt32(TheU->getLength()); 1681 1682 // Emit the pubnames for this compilation unit. 1683 for (const auto &GI : Globals) { 1684 const char *Name = GI.getKeyData(); 1685 const DIE *Entity = GI.second; 1686 1687 Asm->OutStreamer->AddComment("DIE offset"); 1688 Asm->emitInt32(Entity->getOffset()); 1689 1690 if (GnuStyle) { 1691 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity); 1692 Asm->OutStreamer->AddComment( 1693 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " + 1694 dwarf::GDBIndexEntryLinkageString(Desc.Linkage)); 1695 Asm->emitInt8(Desc.toBits()); 1696 } 1697 1698 Asm->OutStreamer->AddComment("External Name"); 1699 Asm->OutStreamer->EmitBytes(StringRef(Name, GI.getKeyLength() + 1)); 1700 } 1701 1702 Asm->OutStreamer->AddComment("End Mark"); 1703 Asm->emitInt32(0); 1704 Asm->OutStreamer->EmitLabel(EndLabel); 1705 } 1706 1707 /// Emit null-terminated strings into a debug str section. 1708 void DwarfDebug::emitDebugStr() { 1709 MCSection *StringOffsetsSection = nullptr; 1710 if (useSegmentedStringOffsetsTable()) { 1711 emitStringOffsetsTableHeader(); 1712 StringOffsetsSection = Asm->getObjFileLowering().getDwarfStrOffSection(); 1713 } 1714 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 1715 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection(), 1716 StringOffsetsSection, /* UseRelativeOffsets = */ true); 1717 } 1718 1719 void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer, 1720 const DebugLocStream::Entry &Entry) { 1721 auto &&Comments = DebugLocs.getComments(Entry); 1722 auto Comment = Comments.begin(); 1723 auto End = Comments.end(); 1724 for (uint8_t Byte : DebugLocs.getBytes(Entry)) 1725 Streamer.EmitInt8(Byte, Comment != End ? *(Comment++) : ""); 1726 } 1727 1728 static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT, 1729 const DebugLocEntry::Value &Value, 1730 DwarfExpression &DwarfExpr) { 1731 auto *DIExpr = Value.getExpression(); 1732 DIExpressionCursor ExprCursor(DIExpr); 1733 DwarfExpr.addFragmentOffset(DIExpr); 1734 // Regular entry. 1735 if (Value.isInt()) { 1736 if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed || 1737 BT->getEncoding() == dwarf::DW_ATE_signed_char)) 1738 DwarfExpr.addSignedConstant(Value.getInt()); 1739 else 1740 DwarfExpr.addUnsignedConstant(Value.getInt()); 1741 } else if (Value.isLocation()) { 1742 MachineLocation Location = Value.getLoc(); 1743 if (Location.isIndirect()) 1744 DwarfExpr.setMemoryLocationKind(); 1745 DIExpressionCursor Cursor(DIExpr); 1746 const TargetRegisterInfo &TRI = *AP.MF->getSubtarget().getRegisterInfo(); 1747 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1748 return; 1749 return DwarfExpr.addExpression(std::move(Cursor)); 1750 } else if (Value.isConstantFP()) { 1751 APInt RawBytes = Value.getConstantFP()->getValueAPF().bitcastToAPInt(); 1752 DwarfExpr.addUnsignedConstant(RawBytes); 1753 } 1754 DwarfExpr.addExpression(std::move(ExprCursor)); 1755 } 1756 1757 void DebugLocEntry::finalize(const AsmPrinter &AP, 1758 DebugLocStream::ListBuilder &List, 1759 const DIBasicType *BT) { 1760 DebugLocStream::EntryBuilder Entry(List, Begin, End); 1761 BufferByteStreamer Streamer = Entry.getStreamer(); 1762 DebugLocDwarfExpression DwarfExpr(AP.getDwarfVersion(), Streamer); 1763 const DebugLocEntry::Value &Value = Values[0]; 1764 if (Value.isFragment()) { 1765 // Emit all fragments that belong to the same variable and range. 1766 assert(llvm::all_of(Values, [](DebugLocEntry::Value P) { 1767 return P.isFragment(); 1768 }) && "all values are expected to be fragments"); 1769 assert(std::is_sorted(Values.begin(), Values.end()) && 1770 "fragments are expected to be sorted"); 1771 1772 for (auto Fragment : Values) 1773 emitDebugLocValue(AP, BT, Fragment, DwarfExpr); 1774 1775 } else { 1776 assert(Values.size() == 1 && "only fragments may have >1 value"); 1777 emitDebugLocValue(AP, BT, Value, DwarfExpr); 1778 } 1779 DwarfExpr.finalize(); 1780 } 1781 1782 void DwarfDebug::emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry) { 1783 // Emit the size. 1784 Asm->OutStreamer->AddComment("Loc expr size"); 1785 Asm->emitInt16(DebugLocs.getBytes(Entry).size()); 1786 1787 // Emit the entry. 1788 APByteStreamer Streamer(*Asm); 1789 emitDebugLocEntry(Streamer, Entry); 1790 } 1791 1792 // Emit locations into the debug loc section. 1793 void DwarfDebug::emitDebugLoc() { 1794 if (DebugLocs.getLists().empty()) 1795 return; 1796 1797 // Start the dwarf loc section. 1798 Asm->OutStreamer->SwitchSection( 1799 Asm->getObjFileLowering().getDwarfLocSection()); 1800 unsigned char Size = Asm->MAI->getCodePointerSize(); 1801 for (const auto &List : DebugLocs.getLists()) { 1802 Asm->OutStreamer->EmitLabel(List.Label); 1803 const DwarfCompileUnit *CU = List.CU; 1804 for (const auto &Entry : DebugLocs.getEntries(List)) { 1805 // Set up the range. This range is relative to the entry point of the 1806 // compile unit. This is a hard coded 0 for low_pc when we're emitting 1807 // ranges, or the DW_AT_low_pc on the compile unit otherwise. 1808 if (auto *Base = CU->getBaseAddress()) { 1809 Asm->EmitLabelDifference(Entry.BeginSym, Base, Size); 1810 Asm->EmitLabelDifference(Entry.EndSym, Base, Size); 1811 } else { 1812 Asm->OutStreamer->EmitSymbolValue(Entry.BeginSym, Size); 1813 Asm->OutStreamer->EmitSymbolValue(Entry.EndSym, Size); 1814 } 1815 1816 emitDebugLocEntryLocation(Entry); 1817 } 1818 Asm->OutStreamer->EmitIntValue(0, Size); 1819 Asm->OutStreamer->EmitIntValue(0, Size); 1820 } 1821 } 1822 1823 void DwarfDebug::emitDebugLocDWO() { 1824 Asm->OutStreamer->SwitchSection( 1825 Asm->getObjFileLowering().getDwarfLocDWOSection()); 1826 for (const auto &List : DebugLocs.getLists()) { 1827 Asm->OutStreamer->EmitLabel(List.Label); 1828 for (const auto &Entry : DebugLocs.getEntries(List)) { 1829 // Just always use start_length for now - at least that's one address 1830 // rather than two. We could get fancier and try to, say, reuse an 1831 // address we know we've emitted elsewhere (the start of the function? 1832 // The start of the CU or CU subrange that encloses this range?) 1833 Asm->emitInt8(dwarf::DW_LLE_startx_length); 1834 unsigned idx = AddrPool.getIndex(Entry.BeginSym); 1835 Asm->EmitULEB128(idx); 1836 Asm->EmitLabelDifference(Entry.EndSym, Entry.BeginSym, 4); 1837 1838 emitDebugLocEntryLocation(Entry); 1839 } 1840 Asm->emitInt8(dwarf::DW_LLE_end_of_list); 1841 } 1842 } 1843 1844 struct ArangeSpan { 1845 const MCSymbol *Start, *End; 1846 }; 1847 1848 // Emit a debug aranges section, containing a CU lookup for any 1849 // address we can tie back to a CU. 1850 void DwarfDebug::emitDebugARanges() { 1851 // Provides a unique id per text section. 1852 MapVector<MCSection *, SmallVector<SymbolCU, 8>> SectionMap; 1853 1854 // Filter labels by section. 1855 for (const SymbolCU &SCU : ArangeLabels) { 1856 if (SCU.Sym->isInSection()) { 1857 // Make a note of this symbol and it's section. 1858 MCSection *Section = &SCU.Sym->getSection(); 1859 if (!Section->getKind().isMetadata()) 1860 SectionMap[Section].push_back(SCU); 1861 } else { 1862 // Some symbols (e.g. common/bss on mach-o) can have no section but still 1863 // appear in the output. This sucks as we rely on sections to build 1864 // arange spans. We can do it without, but it's icky. 1865 SectionMap[nullptr].push_back(SCU); 1866 } 1867 } 1868 1869 DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans; 1870 1871 for (auto &I : SectionMap) { 1872 MCSection *Section = I.first; 1873 SmallVector<SymbolCU, 8> &List = I.second; 1874 if (List.size() < 1) 1875 continue; 1876 1877 // If we have no section (e.g. common), just write out 1878 // individual spans for each symbol. 1879 if (!Section) { 1880 for (const SymbolCU &Cur : List) { 1881 ArangeSpan Span; 1882 Span.Start = Cur.Sym; 1883 Span.End = nullptr; 1884 assert(Cur.CU); 1885 Spans[Cur.CU].push_back(Span); 1886 } 1887 continue; 1888 } 1889 1890 // Sort the symbols by offset within the section. 1891 std::stable_sort( 1892 List.begin(), List.end(), [&](const SymbolCU &A, const SymbolCU &B) { 1893 unsigned IA = A.Sym ? Asm->OutStreamer->GetSymbolOrder(A.Sym) : 0; 1894 unsigned IB = B.Sym ? Asm->OutStreamer->GetSymbolOrder(B.Sym) : 0; 1895 1896 // Symbols with no order assigned should be placed at the end. 1897 // (e.g. section end labels) 1898 if (IA == 0) 1899 return false; 1900 if (IB == 0) 1901 return true; 1902 return IA < IB; 1903 }); 1904 1905 // Insert a final terminator. 1906 List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section))); 1907 1908 // Build spans between each label. 1909 const MCSymbol *StartSym = List[0].Sym; 1910 for (size_t n = 1, e = List.size(); n < e; n++) { 1911 const SymbolCU &Prev = List[n - 1]; 1912 const SymbolCU &Cur = List[n]; 1913 1914 // Try and build the longest span we can within the same CU. 1915 if (Cur.CU != Prev.CU) { 1916 ArangeSpan Span; 1917 Span.Start = StartSym; 1918 Span.End = Cur.Sym; 1919 assert(Prev.CU); 1920 Spans[Prev.CU].push_back(Span); 1921 StartSym = Cur.Sym; 1922 } 1923 } 1924 } 1925 1926 // Start the dwarf aranges section. 1927 Asm->OutStreamer->SwitchSection( 1928 Asm->getObjFileLowering().getDwarfARangesSection()); 1929 1930 unsigned PtrSize = Asm->MAI->getCodePointerSize(); 1931 1932 // Build a list of CUs used. 1933 std::vector<DwarfCompileUnit *> CUs; 1934 for (const auto &it : Spans) { 1935 DwarfCompileUnit *CU = it.first; 1936 CUs.push_back(CU); 1937 } 1938 1939 // Sort the CU list (again, to ensure consistent output order). 1940 llvm::sort(CUs.begin(), CUs.end(), 1941 [](const DwarfCompileUnit *A, const DwarfCompileUnit *B) { 1942 return A->getUniqueID() < B->getUniqueID(); 1943 }); 1944 1945 // Emit an arange table for each CU we used. 1946 for (DwarfCompileUnit *CU : CUs) { 1947 std::vector<ArangeSpan> &List = Spans[CU]; 1948 1949 // Describe the skeleton CU's offset and length, not the dwo file's. 1950 if (auto *Skel = CU->getSkeleton()) 1951 CU = Skel; 1952 1953 // Emit size of content not including length itself. 1954 unsigned ContentSize = 1955 sizeof(int16_t) + // DWARF ARange version number 1956 sizeof(int32_t) + // Offset of CU in the .debug_info section 1957 sizeof(int8_t) + // Pointer Size (in bytes) 1958 sizeof(int8_t); // Segment Size (in bytes) 1959 1960 unsigned TupleSize = PtrSize * 2; 1961 1962 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple. 1963 unsigned Padding = 1964 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize); 1965 1966 ContentSize += Padding; 1967 ContentSize += (List.size() + 1) * TupleSize; 1968 1969 // For each compile unit, write the list of spans it covers. 1970 Asm->OutStreamer->AddComment("Length of ARange Set"); 1971 Asm->emitInt32(ContentSize); 1972 Asm->OutStreamer->AddComment("DWARF Arange version number"); 1973 Asm->emitInt16(dwarf::DW_ARANGES_VERSION); 1974 Asm->OutStreamer->AddComment("Offset Into Debug Info Section"); 1975 emitSectionReference(*CU); 1976 Asm->OutStreamer->AddComment("Address Size (in bytes)"); 1977 Asm->emitInt8(PtrSize); 1978 Asm->OutStreamer->AddComment("Segment Size (in bytes)"); 1979 Asm->emitInt8(0); 1980 1981 Asm->OutStreamer->emitFill(Padding, 0xff); 1982 1983 for (const ArangeSpan &Span : List) { 1984 Asm->EmitLabelReference(Span.Start, PtrSize); 1985 1986 // Calculate the size as being from the span start to it's end. 1987 if (Span.End) { 1988 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize); 1989 } else { 1990 // For symbols without an end marker (e.g. common), we 1991 // write a single arange entry containing just that one symbol. 1992 uint64_t Size = SymSize[Span.Start]; 1993 if (Size == 0) 1994 Size = 1; 1995 1996 Asm->OutStreamer->EmitIntValue(Size, PtrSize); 1997 } 1998 } 1999 2000 Asm->OutStreamer->AddComment("ARange terminator"); 2001 Asm->OutStreamer->EmitIntValue(0, PtrSize); 2002 Asm->OutStreamer->EmitIntValue(0, PtrSize); 2003 } 2004 } 2005 2006 /// Emit a single range list. We handle both DWARF v5 and earlier. 2007 static void emitRangeList(AsmPrinter *Asm, DwarfCompileUnit *CU, 2008 const RangeSpanList &List) { 2009 2010 auto DwarfVersion = CU->getDwarfVersion(); 2011 // Emit our symbol so we can find the beginning of the range. 2012 Asm->OutStreamer->EmitLabel(List.getSym()); 2013 // Gather all the ranges that apply to the same section so they can share 2014 // a base address entry. 2015 MapVector<const MCSection *, std::vector<const RangeSpan *>> SectionRanges; 2016 // Size for our labels. 2017 auto Size = Asm->MAI->getCodePointerSize(); 2018 2019 for (const RangeSpan &Range : List.getRanges()) 2020 SectionRanges[&Range.getStart()->getSection()].push_back(&Range); 2021 2022 auto *CUBase = CU->getBaseAddress(); 2023 bool BaseIsSet = false; 2024 for (const auto &P : SectionRanges) { 2025 // Don't bother with a base address entry if there's only one range in 2026 // this section in this range list - for example ranges for a CU will 2027 // usually consist of single regions from each of many sections 2028 // (-ffunction-sections, or just C++ inline functions) except under LTO 2029 // or optnone where there may be holes in a single CU's section 2030 // contributions. 2031 auto *Base = CUBase; 2032 if (!Base && P.second.size() > 1 && 2033 (UseDwarfRangesBaseAddressSpecifier || DwarfVersion >= 5)) { 2034 BaseIsSet = true; 2035 // FIXME/use care: This may not be a useful base address if it's not 2036 // the lowest address/range in this object. 2037 Base = P.second.front()->getStart(); 2038 if (DwarfVersion >= 5) { 2039 Asm->OutStreamer->AddComment("DW_RLE_base_address"); 2040 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_base_address, 1); 2041 } else 2042 Asm->OutStreamer->EmitIntValue(-1, Size); 2043 Asm->OutStreamer->AddComment(" base address"); 2044 Asm->OutStreamer->EmitSymbolValue(Base, Size); 2045 } else if (BaseIsSet && DwarfVersion < 5) { 2046 BaseIsSet = false; 2047 assert(!Base); 2048 Asm->OutStreamer->EmitIntValue(-1, Size); 2049 Asm->OutStreamer->EmitIntValue(0, Size); 2050 } 2051 2052 for (const auto *RS : P.second) { 2053 const MCSymbol *Begin = RS->getStart(); 2054 const MCSymbol *End = RS->getEnd(); 2055 assert(Begin && "Range without a begin symbol?"); 2056 assert(End && "Range without an end symbol?"); 2057 if (Base) { 2058 if (DwarfVersion >= 5) { 2059 // Emit DW_RLE_offset_pair when we have a base. 2060 Asm->OutStreamer->AddComment("DW_RLE_offset_pair"); 2061 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_offset_pair, 1); 2062 Asm->OutStreamer->AddComment(" starting offset"); 2063 Asm->EmitLabelDifferenceAsULEB128(Begin, Base); 2064 Asm->OutStreamer->AddComment(" ending offset"); 2065 Asm->EmitLabelDifferenceAsULEB128(End, Base); 2066 } else { 2067 Asm->EmitLabelDifference(Begin, Base, Size); 2068 Asm->EmitLabelDifference(End, Base, Size); 2069 } 2070 } else if (DwarfVersion >= 5) { 2071 Asm->OutStreamer->AddComment("DW_RLE_start_length"); 2072 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_start_length, 1); 2073 Asm->OutStreamer->AddComment(" start"); 2074 Asm->OutStreamer->EmitSymbolValue(Begin, Size); 2075 Asm->OutStreamer->AddComment(" length"); 2076 Asm->EmitLabelDifferenceAsULEB128(End, Begin); 2077 } else { 2078 Asm->OutStreamer->EmitSymbolValue(Begin, Size); 2079 Asm->OutStreamer->EmitSymbolValue(End, Size); 2080 } 2081 } 2082 } 2083 if (DwarfVersion >= 5) { 2084 Asm->OutStreamer->AddComment("DW_RLE_end_of_list"); 2085 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_end_of_list, 1); 2086 } else { 2087 // Terminate the list with two 0 values. 2088 Asm->OutStreamer->EmitIntValue(0, Size); 2089 Asm->OutStreamer->EmitIntValue(0, Size); 2090 } 2091 } 2092 2093 // Emit the header of a DWARF 5 range list table. Returns the symbol that 2094 // designates the end of the table for the caller to emit when the table is 2095 // complete. 2096 static MCSymbol *emitRnglistsTableHeader(AsmPrinter *Asm, DwarfFile &Holder) { 2097 // The length is described by a starting label right after the length field 2098 // and an end label. 2099 MCSymbol *TableStart = Asm->createTempSymbol("debug_rnglist_table_start"); 2100 MCSymbol *TableEnd = Asm->createTempSymbol("debug_rnglist_table_end"); 2101 // Build the range table header, which starts with the length field. 2102 Asm->EmitLabelDifference(TableEnd, TableStart, 4); 2103 Asm->OutStreamer->EmitLabel(TableStart); 2104 // Version number (DWARF v5 and later). 2105 Asm->emitInt16(Asm->OutStreamer->getContext().getDwarfVersion()); 2106 // Address size. 2107 Asm->emitInt8(Asm->MAI->getCodePointerSize()); 2108 // Segment selector size. 2109 Asm->emitInt8(0); 2110 2111 MCSymbol *RnglistTableBaseSym = Holder.getRnglistsTableBaseSym(); 2112 2113 // FIXME: Generate the offsets table and use DW_FORM_rnglistx with the 2114 // DW_AT_ranges attribute. Until then set the number of offsets to 0. 2115 Asm->emitInt32(0); 2116 Asm->OutStreamer->EmitLabel(RnglistTableBaseSym); 2117 return TableEnd; 2118 } 2119 2120 /// Emit address ranges into the .debug_ranges section or into the DWARF v5 2121 /// .debug_rnglists section. 2122 void DwarfDebug::emitDebugRanges() { 2123 if (CUMap.empty()) 2124 return; 2125 2126 auto NoRangesPresent = [this]() { 2127 return llvm::all_of( 2128 CUMap, [](const decltype(CUMap)::const_iterator::value_type &Pair) { 2129 return Pair.second->getRangeLists().empty(); 2130 }); 2131 }; 2132 2133 if (!useRangesSection()) { 2134 assert(NoRangesPresent() && "No debug ranges expected."); 2135 return; 2136 } 2137 2138 if (NoRangesPresent()) 2139 return; 2140 2141 // Start the dwarf ranges section. 2142 MCSymbol *TableEnd = nullptr; 2143 if (getDwarfVersion() >= 5) { 2144 Asm->OutStreamer->SwitchSection( 2145 Asm->getObjFileLowering().getDwarfRnglistsSection()); 2146 TableEnd = emitRnglistsTableHeader(Asm, useSplitDwarf() ? SkeletonHolder 2147 : InfoHolder); 2148 } else 2149 Asm->OutStreamer->SwitchSection( 2150 Asm->getObjFileLowering().getDwarfRangesSection()); 2151 2152 // Grab the specific ranges for the compile units in the module. 2153 for (const auto &I : CUMap) { 2154 DwarfCompileUnit *TheCU = I.second; 2155 2156 if (auto *Skel = TheCU->getSkeleton()) 2157 TheCU = Skel; 2158 2159 // Iterate over the misc ranges for the compile units in the module. 2160 for (const RangeSpanList &List : TheCU->getRangeLists()) 2161 emitRangeList(Asm, TheCU, List); 2162 } 2163 2164 if (TableEnd) 2165 Asm->OutStreamer->EmitLabel(TableEnd); 2166 } 2167 2168 void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U) { 2169 for (auto *MN : Nodes) { 2170 if (auto *M = dyn_cast<DIMacro>(MN)) 2171 emitMacro(*M); 2172 else if (auto *F = dyn_cast<DIMacroFile>(MN)) 2173 emitMacroFile(*F, U); 2174 else 2175 llvm_unreachable("Unexpected DI type!"); 2176 } 2177 } 2178 2179 void DwarfDebug::emitMacro(DIMacro &M) { 2180 Asm->EmitULEB128(M.getMacinfoType()); 2181 Asm->EmitULEB128(M.getLine()); 2182 StringRef Name = M.getName(); 2183 StringRef Value = M.getValue(); 2184 Asm->OutStreamer->EmitBytes(Name); 2185 if (!Value.empty()) { 2186 // There should be one space between macro name and macro value. 2187 Asm->emitInt8(' '); 2188 Asm->OutStreamer->EmitBytes(Value); 2189 } 2190 Asm->emitInt8('\0'); 2191 } 2192 2193 void DwarfDebug::emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U) { 2194 assert(F.getMacinfoType() == dwarf::DW_MACINFO_start_file); 2195 Asm->EmitULEB128(dwarf::DW_MACINFO_start_file); 2196 Asm->EmitULEB128(F.getLine()); 2197 Asm->EmitULEB128(U.getOrCreateSourceID(F.getFile())); 2198 handleMacroNodes(F.getElements(), U); 2199 Asm->EmitULEB128(dwarf::DW_MACINFO_end_file); 2200 } 2201 2202 /// Emit macros into a debug macinfo section. 2203 void DwarfDebug::emitDebugMacinfo() { 2204 if (CUMap.empty()) 2205 return; 2206 2207 // Start the dwarf macinfo section. 2208 Asm->OutStreamer->SwitchSection( 2209 Asm->getObjFileLowering().getDwarfMacinfoSection()); 2210 2211 for (const auto &P : CUMap) { 2212 auto &TheCU = *P.second; 2213 auto *SkCU = TheCU.getSkeleton(); 2214 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU; 2215 auto *CUNode = cast<DICompileUnit>(P.first); 2216 DIMacroNodeArray Macros = CUNode->getMacros(); 2217 if (!Macros.empty()) { 2218 Asm->OutStreamer->EmitLabel(U.getMacroLabelBegin()); 2219 handleMacroNodes(Macros, U); 2220 } 2221 } 2222 Asm->OutStreamer->AddComment("End Of Macro List Mark"); 2223 Asm->emitInt8(0); 2224 } 2225 2226 // DWARF5 Experimental Separate Dwarf emitters. 2227 2228 void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die, 2229 std::unique_ptr<DwarfCompileUnit> NewU) { 2230 NewU->addString(Die, dwarf::DW_AT_GNU_dwo_name, 2231 Asm->TM.Options.MCOptions.SplitDwarfFile); 2232 2233 if (!CompilationDir.empty()) 2234 NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 2235 2236 addGnuPubAttributes(*NewU, Die); 2237 2238 SkeletonHolder.addUnit(std::move(NewU)); 2239 } 2240 2241 DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) { 2242 2243 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>( 2244 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder); 2245 DwarfCompileUnit &NewCU = *OwnedUnit; 2246 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection()); 2247 2248 NewCU.initStmtList(); 2249 2250 if (useSegmentedStringOffsetsTable()) 2251 NewCU.addStringOffsetsStart(); 2252 2253 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit)); 2254 2255 return NewCU; 2256 } 2257 2258 // Emit the .debug_info.dwo section for separated dwarf. This contains the 2259 // compile units that would normally be in debug_info. 2260 void DwarfDebug::emitDebugInfoDWO() { 2261 assert(useSplitDwarf() && "No split dwarf debug info?"); 2262 // Don't emit relocations into the dwo file. 2263 InfoHolder.emitUnits(/* UseOffsets */ true); 2264 } 2265 2266 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the 2267 // abbreviations for the .debug_info.dwo section. 2268 void DwarfDebug::emitDebugAbbrevDWO() { 2269 assert(useSplitDwarf() && "No split dwarf?"); 2270 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection()); 2271 } 2272 2273 void DwarfDebug::emitDebugLineDWO() { 2274 assert(useSplitDwarf() && "No split dwarf?"); 2275 SplitTypeUnitFileTable.Emit( 2276 *Asm->OutStreamer, MCDwarfLineTableParams(), 2277 Asm->getObjFileLowering().getDwarfLineDWOSection()); 2278 } 2279 2280 void DwarfDebug::emitStringOffsetsTableHeaderDWO() { 2281 assert(useSplitDwarf() && "No split dwarf?"); 2282 InfoHolder.getStringPool().emitStringOffsetsTableHeader( 2283 *Asm, Asm->getObjFileLowering().getDwarfStrOffDWOSection(), 2284 InfoHolder.getStringOffsetsStartSym()); 2285 } 2286 2287 // Emit the .debug_str.dwo section for separated dwarf. This contains the 2288 // string section and is identical in format to traditional .debug_str 2289 // sections. 2290 void DwarfDebug::emitDebugStrDWO() { 2291 if (useSegmentedStringOffsetsTable()) 2292 emitStringOffsetsTableHeaderDWO(); 2293 assert(useSplitDwarf() && "No split dwarf?"); 2294 MCSection *OffSec = Asm->getObjFileLowering().getDwarfStrOffDWOSection(); 2295 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(), 2296 OffSec, /* UseRelativeOffsets = */ false); 2297 } 2298 2299 // Emit DWO addresses. 2300 void DwarfDebug::emitDebugAddr() { 2301 assert(useSplitDwarf() && "No split dwarf?"); 2302 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection()); 2303 } 2304 2305 MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) { 2306 if (!useSplitDwarf()) 2307 return nullptr; 2308 const DICompileUnit *DIUnit = CU.getCUNode(); 2309 SplitTypeUnitFileTable.maybeSetRootFile( 2310 DIUnit->getDirectory(), DIUnit->getFilename(), 2311 CU.getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource()); 2312 return &SplitTypeUnitFileTable; 2313 } 2314 2315 uint64_t DwarfDebug::makeTypeSignature(StringRef Identifier) { 2316 MD5 Hash; 2317 Hash.update(Identifier); 2318 // ... take the least significant 8 bytes and return those. Our MD5 2319 // implementation always returns its results in little endian, so we actually 2320 // need the "high" word. 2321 MD5::MD5Result Result; 2322 Hash.final(Result); 2323 return Result.high(); 2324 } 2325 2326 void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU, 2327 StringRef Identifier, DIE &RefDie, 2328 const DICompositeType *CTy) { 2329 // Fast path if we're building some type units and one has already used the 2330 // address pool we know we're going to throw away all this work anyway, so 2331 // don't bother building dependent types. 2332 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed()) 2333 return; 2334 2335 auto Ins = TypeSignatures.insert(std::make_pair(CTy, 0)); 2336 if (!Ins.second) { 2337 CU.addDIETypeSignature(RefDie, Ins.first->second); 2338 return; 2339 } 2340 2341 bool TopLevelType = TypeUnitsUnderConstruction.empty(); 2342 AddrPool.resetUsedFlag(); 2343 2344 auto OwnedUnit = llvm::make_unique<DwarfTypeUnit>(CU, Asm, this, &InfoHolder, 2345 getDwoLineTable(CU)); 2346 DwarfTypeUnit &NewTU = *OwnedUnit; 2347 DIE &UnitDie = NewTU.getUnitDie(); 2348 TypeUnitsUnderConstruction.emplace_back(std::move(OwnedUnit), CTy); 2349 2350 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2, 2351 CU.getLanguage()); 2352 2353 uint64_t Signature = makeTypeSignature(Identifier); 2354 NewTU.setTypeSignature(Signature); 2355 Ins.first->second = Signature; 2356 2357 if (useSplitDwarf()) 2358 NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesDWOSection()); 2359 else { 2360 NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesSection(Signature)); 2361 // Non-split type units reuse the compile unit's line table. 2362 CU.applyStmtList(UnitDie); 2363 } 2364 2365 // Add DW_AT_str_offsets_base to the type unit DIE, but not for split type 2366 // units. 2367 if (useSegmentedStringOffsetsTable() && !useSplitDwarf()) 2368 NewTU.addStringOffsetsStart(); 2369 2370 NewTU.setType(NewTU.createTypeDIE(CTy)); 2371 2372 if (TopLevelType) { 2373 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction); 2374 TypeUnitsUnderConstruction.clear(); 2375 2376 // Types referencing entries in the address table cannot be placed in type 2377 // units. 2378 if (AddrPool.hasBeenUsed()) { 2379 2380 // Remove all the types built while building this type. 2381 // This is pessimistic as some of these types might not be dependent on 2382 // the type that used an address. 2383 for (const auto &TU : TypeUnitsToAdd) 2384 TypeSignatures.erase(TU.second); 2385 2386 // Construct this type in the CU directly. 2387 // This is inefficient because all the dependent types will be rebuilt 2388 // from scratch, including building them in type units, discovering that 2389 // they depend on addresses, throwing them out and rebuilding them. 2390 CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy)); 2391 return; 2392 } 2393 2394 // If the type wasn't dependent on fission addresses, finish adding the type 2395 // and all its dependent types. 2396 for (auto &TU : TypeUnitsToAdd) { 2397 InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get()); 2398 InfoHolder.emitUnit(TU.first.get(), useSplitDwarf()); 2399 } 2400 } 2401 CU.addDIETypeSignature(RefDie, Signature); 2402 } 2403 2404 // Add the Name along with its companion DIE to the appropriate accelerator 2405 // table (for AccelTableKind::Dwarf it's always AccelDebugNames, for 2406 // AccelTableKind::Apple, we use the table we got as an argument). If 2407 // accelerator tables are disabled, this function does nothing. 2408 template <typename DataT> 2409 void DwarfDebug::addAccelNameImpl(AccelTable<DataT> &AppleAccel, StringRef Name, 2410 const DIE &Die) { 2411 if (getAccelTableKind() == AccelTableKind::None) 2412 return; 2413 2414 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; 2415 DwarfStringPoolEntryRef Ref = 2416 Holder.getStringPool().getEntry(*Asm, Name); 2417 2418 switch (getAccelTableKind()) { 2419 case AccelTableKind::Apple: 2420 AppleAccel.addName(Ref, Die); 2421 break; 2422 case AccelTableKind::Dwarf: 2423 AccelDebugNames.addName(Ref, Die); 2424 break; 2425 case AccelTableKind::Default: 2426 llvm_unreachable("Default should have already been resolved."); 2427 case AccelTableKind::None: 2428 llvm_unreachable("None handled above"); 2429 } 2430 } 2431 2432 void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) { 2433 addAccelNameImpl(AccelNames, Name, Die); 2434 } 2435 2436 void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) { 2437 // ObjC names go only into the Apple accelerator tables. 2438 if (getAccelTableKind() == AccelTableKind::Apple) 2439 addAccelNameImpl(AccelObjC, Name, Die); 2440 } 2441 2442 void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) { 2443 addAccelNameImpl(AccelNamespace, Name, Die); 2444 } 2445 2446 void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) { 2447 addAccelNameImpl(AccelTypes, Name, Die); 2448 } 2449 2450 uint16_t DwarfDebug::getDwarfVersion() const { 2451 return Asm->OutStreamer->getContext().getDwarfVersion(); 2452 } 2453