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