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