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