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