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