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