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