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