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