1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains support for writing dwarf debug info into asm files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #define DEBUG_TYPE "dwarfdebug" 15 #include "DwarfDebug.h" 16 #include "DIE.h" 17 #include "DwarfCompileUnit.h" 18 #include "llvm/Constants.h" 19 #include "llvm/Module.h" 20 #include "llvm/Instructions.h" 21 #include "llvm/CodeGen/MachineFunction.h" 22 #include "llvm/CodeGen/MachineModuleInfo.h" 23 #include "llvm/MC/MCAsmInfo.h" 24 #include "llvm/MC/MCSection.h" 25 #include "llvm/MC/MCStreamer.h" 26 #include "llvm/MC/MCSymbol.h" 27 #include "llvm/Target/Mangler.h" 28 #include "llvm/Target/TargetData.h" 29 #include "llvm/Target/TargetFrameLowering.h" 30 #include "llvm/Target/TargetLoweringObjectFile.h" 31 #include "llvm/Target/TargetMachine.h" 32 #include "llvm/Target/TargetRegisterInfo.h" 33 #include "llvm/Target/TargetOptions.h" 34 #include "llvm/Analysis/DebugInfo.h" 35 #include "llvm/Analysis/DIBuilder.h" 36 #include "llvm/ADT/Statistic.h" 37 #include "llvm/ADT/STLExtras.h" 38 #include "llvm/ADT/StringExtras.h" 39 #include "llvm/Support/CommandLine.h" 40 #include "llvm/Support/Debug.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include "llvm/Support/ValueHandle.h" 43 #include "llvm/Support/FormattedStream.h" 44 #include "llvm/Support/Timer.h" 45 #include "llvm/Support/Path.h" 46 using namespace llvm; 47 48 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden, 49 cl::desc("Print DbgScope information for each machine instruction")); 50 51 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print", 52 cl::Hidden, 53 cl::desc("Disable debug info printing")); 54 55 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden, 56 cl::desc("Make an absence of debug location information explicit."), 57 cl::init(false)); 58 59 namespace { 60 const char *DWARFGroupName = "DWARF Emission"; 61 const char *DbgTimerName = "DWARF Debug Writer"; 62 } // end anonymous namespace 63 64 //===----------------------------------------------------------------------===// 65 66 /// Configuration values for initial hash set sizes (log2). 67 /// 68 static const unsigned InitAbbreviationsSetSize = 9; // log2(512) 69 70 namespace llvm { 71 72 DIType DbgVariable::getType() const { 73 DIType Ty = Var.getType(); 74 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 75 // addresses instead. 76 if (Var.isBlockByrefVariable()) { 77 /* Byref variables, in Blocks, are declared by the programmer as 78 "SomeType VarName;", but the compiler creates a 79 __Block_byref_x_VarName struct, and gives the variable VarName 80 either the struct, or a pointer to the struct, as its type. This 81 is necessary for various behind-the-scenes things the compiler 82 needs to do with by-reference variables in blocks. 83 84 However, as far as the original *programmer* is concerned, the 85 variable should still have type 'SomeType', as originally declared. 86 87 The following function dives into the __Block_byref_x_VarName 88 struct to find the original type of the variable. This will be 89 passed back to the code generating the type for the Debug 90 Information Entry for the variable 'VarName'. 'VarName' will then 91 have the original type 'SomeType' in its debug information. 92 93 The original type 'SomeType' will be the type of the field named 94 'VarName' inside the __Block_byref_x_VarName struct. 95 96 NOTE: In order for this to not completely fail on the debugger 97 side, the Debug Information Entry for the variable VarName needs to 98 have a DW_AT_location that tells the debugger how to unwind through 99 the pointers and __Block_byref_x_VarName struct to find the actual 100 value of the variable. The function addBlockByrefType does this. */ 101 DIType subType = Ty; 102 unsigned tag = Ty.getTag(); 103 104 if (tag == dwarf::DW_TAG_pointer_type) { 105 DIDerivedType DTy = DIDerivedType(Ty); 106 subType = DTy.getTypeDerivedFrom(); 107 } 108 109 DICompositeType blockStruct = DICompositeType(subType); 110 DIArray Elements = blockStruct.getTypeArray(); 111 112 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 113 DIDescriptor Element = Elements.getElement(i); 114 DIDerivedType DT = DIDerivedType(Element); 115 if (getName() == DT.getName()) 116 return (DT.getTypeDerivedFrom()); 117 } 118 return Ty; 119 } 120 return Ty; 121 } 122 123 //===----------------------------------------------------------------------===// 124 /// DbgRange - This is used to track range of instructions with identical 125 /// debug info scope. 126 /// 127 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange; 128 129 //===----------------------------------------------------------------------===// 130 /// DbgScope - This class is used to track scope information. 131 /// 132 class DbgScope { 133 DbgScope *Parent; // Parent to this scope. 134 DIDescriptor Desc; // Debug info descriptor for scope. 135 // Location at which this scope is inlined. 136 AssertingVH<const MDNode> InlinedAtLocation; 137 bool AbstractScope; // Abstract Scope 138 const MachineInstr *LastInsn; // Last instruction of this scope. 139 const MachineInstr *FirstInsn; // First instruction of this scope. 140 unsigned DFSIn, DFSOut; 141 // Scopes defined in scope. Contents not owned. 142 SmallVector<DbgScope *, 4> Scopes; 143 // Variables declared in scope. Contents owned. 144 SmallVector<DbgVariable *, 8> Variables; 145 SmallVector<DbgRange, 4> Ranges; 146 // Private state for dump() 147 mutable unsigned IndentLevel; 148 public: 149 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0) 150 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false), 151 LastInsn(0), FirstInsn(0), 152 DFSIn(0), DFSOut(0), IndentLevel(0) {} 153 virtual ~DbgScope(); 154 155 // Accessors. 156 DbgScope *getParent() const { return Parent; } 157 void setParent(DbgScope *P) { Parent = P; } 158 DIDescriptor getDesc() const { return Desc; } 159 const MDNode *getInlinedAt() const { return InlinedAtLocation; } 160 const MDNode *getScopeNode() const { return Desc; } 161 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; } 162 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; } 163 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; } 164 165 /// openInsnRange - This scope covers instruction range starting from MI. 166 void openInsnRange(const MachineInstr *MI) { 167 if (!FirstInsn) 168 FirstInsn = MI; 169 170 if (Parent) 171 Parent->openInsnRange(MI); 172 } 173 174 /// extendInsnRange - Extend the current instruction range covered by 175 /// this scope. 176 void extendInsnRange(const MachineInstr *MI) { 177 assert (FirstInsn && "MI Range is not open!"); 178 LastInsn = MI; 179 if (Parent) 180 Parent->extendInsnRange(MI); 181 } 182 183 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected 184 /// until now. This is used when a new scope is encountered while walking 185 /// machine instructions. 186 void closeInsnRange(DbgScope *NewScope = NULL) { 187 assert (LastInsn && "Last insn missing!"); 188 Ranges.push_back(DbgRange(FirstInsn, LastInsn)); 189 FirstInsn = NULL; 190 LastInsn = NULL; 191 // If Parent dominates NewScope then do not close Parent's instruction 192 // range. 193 if (Parent && (!NewScope || !Parent->dominates(NewScope))) 194 Parent->closeInsnRange(NewScope); 195 } 196 197 void setAbstractScope() { AbstractScope = true; } 198 bool isAbstractScope() const { return AbstractScope; } 199 200 // Depth First Search support to walk and mainpluate DbgScope hierarchy. 201 unsigned getDFSOut() const { return DFSOut; } 202 void setDFSOut(unsigned O) { DFSOut = O; } 203 unsigned getDFSIn() const { return DFSIn; } 204 void setDFSIn(unsigned I) { DFSIn = I; } 205 bool dominates(const DbgScope *S) { 206 if (S == this) 207 return true; 208 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut()) 209 return true; 210 return false; 211 } 212 213 /// addScope - Add a scope to the scope. 214 /// 215 void addScope(DbgScope *S) { Scopes.push_back(S); } 216 217 /// addVariable - Add a variable to the scope. 218 /// 219 void addVariable(DbgVariable *V) { Variables.push_back(V); } 220 221 #ifndef NDEBUG 222 void dump() const; 223 #endif 224 }; 225 226 } // end llvm namespace 227 228 #ifndef NDEBUG 229 void DbgScope::dump() const { 230 raw_ostream &err = dbgs(); 231 err.indent(IndentLevel); 232 const MDNode *N = Desc; 233 N->dump(); 234 if (AbstractScope) 235 err << "Abstract Scope\n"; 236 237 IndentLevel += 2; 238 if (!Scopes.empty()) 239 err << "Children ...\n"; 240 for (unsigned i = 0, e = Scopes.size(); i != e; ++i) 241 if (Scopes[i] != this) 242 Scopes[i]->dump(); 243 244 IndentLevel -= 2; 245 } 246 #endif 247 248 DbgScope::~DbgScope() { 249 for (unsigned j = 0, M = Variables.size(); j < M; ++j) 250 delete Variables[j]; 251 } 252 253 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 254 : Asm(A), MMI(Asm->MMI), FirstCU(0), 255 AbbreviationsSet(InitAbbreviationsSetSize), 256 CurrentFnDbgScope(0), PrevLabel(NULL) { 257 NextStringPoolNumber = 0; 258 259 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0; 260 DwarfStrSectionSym = TextSectionSym = 0; 261 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; 262 FunctionBeginSym = FunctionEndSym = 0; 263 { 264 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 265 beginModule(M); 266 } 267 } 268 DwarfDebug::~DwarfDebug() { 269 } 270 271 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) { 272 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str]; 273 if (Entry.first) return Entry.first; 274 275 Entry.second = NextStringPoolNumber++; 276 return Entry.first = Asm->GetTempSymbol("string", Entry.second); 277 } 278 279 280 /// assignAbbrevNumber - Define a unique number for the abbreviation. 281 /// 282 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) { 283 // Profile the node so that we can make it unique. 284 FoldingSetNodeID ID; 285 Abbrev.Profile(ID); 286 287 // Check the set for priors. 288 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev); 289 290 // If it's newly added. 291 if (InSet == &Abbrev) { 292 // Add to abbreviation list. 293 Abbreviations.push_back(&Abbrev); 294 295 // Assign the vector position + 1 as its number. 296 Abbrev.setNumber(Abbreviations.size()); 297 } else { 298 // Assign existing abbreviation number. 299 Abbrev.setNumber(InSet->getNumber()); 300 } 301 } 302 303 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm 304 /// printer to not emit usual symbol prefix before the symbol name is used then 305 /// return linkage name after skipping this special LLVM prefix. 306 static StringRef getRealLinkageName(StringRef LinkageName) { 307 char One = '\1'; 308 if (LinkageName.startswith(StringRef(&One, 1))) 309 return LinkageName.substr(1); 310 return LinkageName; 311 } 312 313 /// createSubprogramDIE - Create new DIE using SP. 314 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) { 315 CompileUnit *SPCU = getCompileUnit(SP); 316 DIE *SPDie = SPCU->getDIE(SP); 317 if (SPDie) 318 return SPDie; 319 320 SPDie = new DIE(dwarf::DW_TAG_subprogram); 321 322 // DW_TAG_inlined_subroutine may refer to this DIE. 323 SPCU->insertDIE(SP, SPDie); 324 325 // Add to context owner. 326 SPCU->addToContextOwner(SPDie, SP.getContext()); 327 328 // Add function template parameters. 329 SPCU->addTemplateParams(*SPDie, SP.getTemplateParams()); 330 331 StringRef LinkageName = SP.getLinkageName(); 332 if (!LinkageName.empty()) 333 SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 334 getRealLinkageName(LinkageName)); 335 336 // If this DIE is going to refer declaration info using AT_specification 337 // then there is no need to add other attributes. 338 if (SP.getFunctionDeclaration().isSubprogram()) 339 return SPDie; 340 341 // Constructors and operators for anonymous aggregates do not have names. 342 if (!SP.getName().empty()) 343 SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 344 SP.getName()); 345 346 SPCU->addSourceLine(SPDie, SP); 347 348 if (SP.isPrototyped()) 349 SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 350 351 // Add Return Type. 352 DICompositeType SPTy = SP.getType(); 353 DIArray Args = SPTy.getTypeArray(); 354 unsigned SPTag = SPTy.getTag(); 355 356 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type) 357 SPCU->addType(SPDie, SPTy); 358 else 359 SPCU->addType(SPDie, DIType(Args.getElement(0))); 360 361 unsigned VK = SP.getVirtuality(); 362 if (VK) { 363 SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK); 364 DIEBlock *Block = SPCU->getDIEBlock(); 365 SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 366 SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 367 SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 368 ContainingTypeMap.insert(std::make_pair(SPDie, 369 SP.getContainingType())); 370 } 371 372 if (!SP.isDefinition()) { 373 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 374 375 // Add arguments. Do not add arguments for subprogram definition. They will 376 // be handled while processing variables. 377 DICompositeType SPTy = SP.getType(); 378 DIArray Args = SPTy.getTypeArray(); 379 unsigned SPTag = SPTy.getTag(); 380 381 if (SPTag == dwarf::DW_TAG_subroutine_type) 382 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 383 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 384 DIType ATy = DIType(DIType(Args.getElement(i))); 385 SPCU->addType(Arg, ATy); 386 if (ATy.isArtificial()) 387 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 388 SPDie->addChild(Arg); 389 } 390 } 391 392 if (SP.isArtificial()) 393 SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 394 395 if (!SP.isLocalToUnit()) 396 SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 397 398 if (SP.isOptimized()) 399 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 400 401 if (unsigned isa = Asm->getISAEncoding()) { 402 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 403 } 404 405 return SPDie; 406 } 407 408 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) { 409 assert(N && "Invalid Scope encoding!"); 410 411 DbgScope *AScope = AbstractScopes.lookup(N); 412 if (AScope) 413 return AScope; 414 415 DbgScope *Parent = NULL; 416 417 DIDescriptor Scope(N); 418 if (Scope.isLexicalBlock()) { 419 DILexicalBlock DB(N); 420 DIDescriptor ParentDesc = DB.getContext(); 421 Parent = getOrCreateAbstractScope(ParentDesc); 422 } 423 424 AScope = new DbgScope(Parent, DIDescriptor(N), NULL); 425 426 if (Parent) 427 Parent->addScope(AScope); 428 AScope->setAbstractScope(); 429 AbstractScopes[N] = AScope; 430 if (DIDescriptor(N).isSubprogram()) 431 AbstractScopesList.push_back(AScope); 432 return AScope; 433 } 434 435 /// isSubprogramContext - Return true if Context is either a subprogram 436 /// or another context nested inside a subprogram. 437 static bool isSubprogramContext(const MDNode *Context) { 438 if (!Context) 439 return false; 440 DIDescriptor D(Context); 441 if (D.isSubprogram()) 442 return true; 443 if (D.isType()) 444 return isSubprogramContext(DIType(Context).getContext()); 445 return false; 446 } 447 448 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and 449 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 450 /// If there are global variables in this scope then create and insert 451 /// DIEs for these variables. 452 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) { 453 CompileUnit *SPCU = getCompileUnit(SPNode); 454 DIE *SPDie = SPCU->getDIE(SPNode); 455 456 assert(SPDie && "Unable to find subprogram DIE!"); 457 DISubprogram SP(SPNode); 458 459 DISubprogram SPDecl = SP.getFunctionDeclaration(); 460 if (SPDecl.isSubprogram()) 461 // Refer function declaration directly. 462 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 463 createSubprogramDIE(SPDecl)); 464 else { 465 // There is not any need to generate specification DIE for a function 466 // defined at compile unit level. If a function is defined inside another 467 // function then gdb prefers the definition at top level and but does not 468 // expect specification DIE in parent function. So avoid creating 469 // specification DIE for a function defined inside a function. 470 if (SP.isDefinition() && !SP.getContext().isCompileUnit() && 471 !SP.getContext().isFile() && 472 !isSubprogramContext(SP.getContext())) { 473 SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 474 475 // Add arguments. 476 DICompositeType SPTy = SP.getType(); 477 DIArray Args = SPTy.getTypeArray(); 478 unsigned SPTag = SPTy.getTag(); 479 if (SPTag == dwarf::DW_TAG_subroutine_type) 480 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 481 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 482 DIType ATy = DIType(DIType(Args.getElement(i))); 483 SPCU->addType(Arg, ATy); 484 if (ATy.isArtificial()) 485 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 486 SPDie->addChild(Arg); 487 } 488 DIE *SPDeclDie = SPDie; 489 SPDie = new DIE(dwarf::DW_TAG_subprogram); 490 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 491 SPDeclDie); 492 SPCU->addDie(SPDie); 493 } 494 } 495 // Pick up abstract subprogram DIE. 496 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) { 497 SPDie = new DIE(dwarf::DW_TAG_subprogram); 498 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin, 499 dwarf::DW_FORM_ref4, AbsSPDIE); 500 SPCU->addDie(SPDie); 501 } 502 503 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 504 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber())); 505 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 506 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber())); 507 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 508 MachineLocation Location(RI->getFrameRegister(*Asm->MF)); 509 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 510 511 return SPDie; 512 } 513 514 /// constructLexicalScope - Construct new DW_TAG_lexical_block 515 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 516 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) { 517 518 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 519 if (Scope->isAbstractScope()) 520 return ScopeDIE; 521 522 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges(); 523 if (Ranges.empty()) 524 return 0; 525 526 CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode()); 527 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(); 528 if (Ranges.size() > 1) { 529 // .debug_range section has not been laid out yet. Emit offset in 530 // .debug_range as a uint, size 4, for now. emitDIE will handle 531 // DW_AT_ranges appropriately. 532 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 533 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize()); 534 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(), 535 RE = Ranges.end(); RI != RE; ++RI) { 536 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 537 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second)); 538 } 539 DebugRangeSymbols.push_back(NULL); 540 DebugRangeSymbols.push_back(NULL); 541 return ScopeDIE; 542 } 543 544 const MCSymbol *Start = getLabelBeforeInsn(RI->first); 545 const MCSymbol *End = getLabelAfterInsn(RI->second); 546 547 if (End == 0) return 0; 548 549 assert(Start->isDefined() && "Invalid starting label for an inlined scope!"); 550 assert(End->isDefined() && "Invalid end label for an inlined scope!"); 551 552 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start); 553 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End); 554 555 return ScopeDIE; 556 } 557 558 /// constructInlinedScopeDIE - This scope represents inlined body of 559 /// a function. Construct DIE to represent this concrete inlined copy 560 /// of the function. 561 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) { 562 563 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges(); 564 assert (Ranges.empty() == false 565 && "DbgScope does not have instruction markers!"); 566 567 // FIXME : .debug_inlined section specification does not clearly state how 568 // to emit inlined scope that is split into multiple instruction ranges. 569 // For now, use first instruction range and emit low_pc/high_pc pair and 570 // corresponding .debug_inlined section entry for this pair. 571 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(); 572 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first); 573 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second); 574 575 if (StartLabel == 0 || EndLabel == 0) { 576 assert (0 && "Unexpected Start and End labels for a inlined scope!"); 577 return 0; 578 } 579 assert(StartLabel->isDefined() && 580 "Invalid starting label for an inlined scope!"); 581 assert(EndLabel->isDefined() && 582 "Invalid end label for an inlined scope!"); 583 584 if (!Scope->getScopeNode()) 585 return NULL; 586 DIScope DS(Scope->getScopeNode()); 587 DISubprogram InlinedSP = getDISubprogram(DS); 588 CompileUnit *TheCU = getCompileUnit(InlinedSP); 589 DIE *OriginDIE = TheCU->getDIE(InlinedSP); 590 if (!OriginDIE) { 591 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram."); 592 return NULL; 593 } 594 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 595 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 596 dwarf::DW_FORM_ref4, OriginDIE); 597 598 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel); 599 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel); 600 601 InlinedSubprogramDIEs.insert(OriginDIE); 602 603 // Track the start label for this inlined function. 604 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 605 I = InlineInfo.find(InlinedSP); 606 607 if (I == InlineInfo.end()) { 608 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, 609 ScopeDIE)); 610 InlinedSPNodes.push_back(InlinedSP); 611 } else 612 I->second.push_back(std::make_pair(StartLabel, ScopeDIE)); 613 614 DILocation DL(Scope->getInlinedAt()); 615 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID()); 616 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 617 618 return ScopeDIE; 619 } 620 621 622 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 623 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) { 624 StringRef Name = DV->getName(); 625 if (Name.empty()) 626 return NULL; 627 628 // Translate tag to proper Dwarf tag. The result variable is dropped for 629 // now. 630 unsigned Tag; 631 switch (DV->getTag()) { 632 case dwarf::DW_TAG_return_variable: 633 return NULL; 634 case dwarf::DW_TAG_arg_variable: 635 Tag = dwarf::DW_TAG_formal_parameter; 636 break; 637 case dwarf::DW_TAG_auto_variable: // fall thru 638 default: 639 Tag = dwarf::DW_TAG_variable; 640 break; 641 } 642 643 // Define variable debug information entry. 644 DIE *VariableDie = new DIE(Tag); 645 CompileUnit *VariableCU = getCompileUnit(DV->getVariable()); 646 DIE *AbsDIE = NULL; 647 DenseMap<const DbgVariable *, const DbgVariable *>::iterator 648 V2AVI = VarToAbstractVarMap.find(DV); 649 if (V2AVI != VarToAbstractVarMap.end()) 650 AbsDIE = V2AVI->second->getDIE(); 651 652 if (AbsDIE) 653 VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 654 dwarf::DW_FORM_ref4, AbsDIE); 655 else { 656 VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 657 Name); 658 VariableCU->addSourceLine(VariableDie, DV->getVariable()); 659 660 // Add variable type. 661 VariableCU->addType(VariableDie, DV->getType()); 662 } 663 664 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial()) 665 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial, 666 dwarf::DW_FORM_flag, 1); 667 else if (DIVariable(DV->getVariable()).isArtificial()) 668 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial, 669 dwarf::DW_FORM_flag, 1); 670 671 if (Scope->isAbstractScope()) { 672 DV->setDIE(VariableDie); 673 return VariableDie; 674 } 675 676 // Add variable address. 677 678 unsigned Offset = DV->getDotDebugLocOffset(); 679 if (Offset != ~0U) { 680 VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4, 681 Asm->GetTempSymbol("debug_loc", Offset)); 682 DV->setDIE(VariableDie); 683 UseDotDebugLocEntry.insert(VariableDie); 684 return VariableDie; 685 } 686 687 // Check if variable is described by a DBG_VALUE instruction. 688 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI = 689 DbgVariableToDbgInstMap.find(DV); 690 if (DVI != DbgVariableToDbgInstMap.end()) { 691 const MachineInstr *DVInsn = DVI->second; 692 bool updated = false; 693 // FIXME : Handle getNumOperands != 3 694 if (DVInsn->getNumOperands() == 3) { 695 if (DVInsn->getOperand(0).isReg()) { 696 const MachineOperand RegOp = DVInsn->getOperand(0); 697 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 698 if (DVInsn->getOperand(1).isImm() && 699 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) { 700 unsigned FrameReg = 0; 701 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 702 int Offset = 703 TFI->getFrameIndexReference(*Asm->MF, 704 DVInsn->getOperand(1).getImm(), 705 FrameReg); 706 MachineLocation Location(FrameReg, Offset); 707 VariableCU->addVariableAddress(DV, VariableDie, Location); 708 709 } else if (RegOp.getReg()) 710 VariableCU->addVariableAddress(DV, VariableDie, 711 MachineLocation(RegOp.getReg())); 712 updated = true; 713 } 714 else if (DVInsn->getOperand(0).isImm()) 715 updated = 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 751 void 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. 772 DIE *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 834 unsigned 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. 864 DIE *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. 879 void 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. 923 CompileUnit *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. 952 static 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) 970 static 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. 994 void 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. 1080 void 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. 1110 void 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 /// 1195 void 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 // Emit common frame information. 1265 emitCommonDebugFrame(); 1266 1267 // Emit function debug frame information 1268 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(), 1269 E = DebugFrames.end(); I != E; ++I) 1270 emitFunctionDebugFrame(*I); 1271 1272 // Compute DIE offsets and sizes. 1273 computeSizeAndOffsets(); 1274 1275 // Emit all the DIEs into a debug info section 1276 emitDebugInfo(); 1277 1278 // Corresponding abbreviations into a abbrev section. 1279 emitAbbreviations(); 1280 1281 // Emit info into a debug pubnames section. 1282 emitDebugPubNames(); 1283 1284 // Emit info into a debug pubtypes section. 1285 emitDebugPubTypes(); 1286 1287 // Emit info into a debug loc section. 1288 emitDebugLoc(); 1289 1290 // Emit info into a debug aranges section. 1291 EmitDebugARanges(); 1292 1293 // Emit info into a debug ranges section. 1294 emitDebugRanges(); 1295 1296 // Emit info into a debug macinfo section. 1297 emitDebugMacInfo(); 1298 1299 // Emit inline info. 1300 emitDebugInlineInfo(); 1301 1302 // Emit info into a debug str section. 1303 emitDebugStr(); 1304 1305 // clean up. 1306 DeleteContainerSeconds(DeadFnScopeMap); 1307 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 1308 E = CUMap.end(); I != E; ++I) 1309 delete I->second; 1310 FirstCU = NULL; // Reset for the next Module, if any. 1311 } 1312 1313 /// findAbstractVariable - Find abstract variable, if any, associated with Var. 1314 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, 1315 DebugLoc ScopeLoc) { 1316 1317 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var); 1318 if (AbsDbgVariable) 1319 return AbsDbgVariable; 1320 1321 LLVMContext &Ctx = Var->getContext(); 1322 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx)); 1323 if (!Scope) 1324 return NULL; 1325 1326 AbsDbgVariable = new DbgVariable(Var); 1327 Scope->addVariable(AbsDbgVariable); 1328 AbstractVariables[Var] = AbsDbgVariable; 1329 return AbsDbgVariable; 1330 } 1331 1332 /// addCurrentFnArgument - If Var is an current function argument that add 1333 /// it in CurrentFnArguments list. 1334 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF, 1335 DbgVariable *Var, DbgScope *Scope) { 1336 if (Scope != CurrentFnDbgScope) 1337 return false; 1338 DIVariable DV = Var->getVariable(); 1339 if (DV.getTag() != dwarf::DW_TAG_arg_variable) 1340 return false; 1341 unsigned ArgNo = DV.getArgNumber(); 1342 if (ArgNo == 0) 1343 return false; 1344 1345 size_t Size = CurrentFnArguments.size(); 1346 if (Size == 0) 1347 CurrentFnArguments.resize(MF->getFunction()->arg_size()); 1348 // llvm::Function argument size is not good indicator of how many 1349 // arguments does the function have at source level. 1350 if (ArgNo > Size) 1351 CurrentFnArguments.resize(ArgNo * 2); 1352 CurrentFnArguments[ArgNo - 1] = Var; 1353 return true; 1354 } 1355 1356 /// collectVariableInfoFromMMITable - Collect variable information from 1357 /// side table maintained by MMI. 1358 void 1359 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF, 1360 SmallPtrSet<const MDNode *, 16> &Processed) { 1361 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); 1362 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 1363 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 1364 VE = VMap.end(); VI != VE; ++VI) { 1365 const MDNode *Var = VI->first; 1366 if (!Var) continue; 1367 Processed.insert(Var); 1368 DIVariable DV(Var); 1369 const std::pair<unsigned, DebugLoc> &VP = VI->second; 1370 1371 DbgScope *Scope = 0; 1372 if (const MDNode *IA = VP.second.getInlinedAt(Ctx)) 1373 Scope = ConcreteScopes.lookup(IA); 1374 if (Scope == 0) 1375 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx)); 1376 1377 // If variable scope is not found then skip this variable. 1378 if (Scope == 0) 1379 continue; 1380 1381 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second); 1382 DbgVariable *RegVar = new DbgVariable(DV); 1383 recordVariableFrameIndex(RegVar, VP.first); 1384 if (!addCurrentFnArgument(MF, RegVar, Scope)) 1385 Scope->addVariable(RegVar); 1386 if (AbsDbgVariable) { 1387 recordVariableFrameIndex(AbsDbgVariable, VP.first); 1388 VarToAbstractVarMap[RegVar] = AbsDbgVariable; 1389 } 1390 } 1391 } 1392 1393 /// isDbgValueInDefinedReg - Return true if debug value, encoded by 1394 /// DBG_VALUE instruction, is in a defined reg. 1395 static bool isDbgValueInDefinedReg(const MachineInstr *MI) { 1396 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 1397 return MI->getNumOperands() == 3 && 1398 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() && 1399 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0; 1400 } 1401 1402 /// collectVariableInfo - Populate DbgScope entries with variables' info. 1403 void 1404 DwarfDebug::collectVariableInfo(const MachineFunction *MF, 1405 SmallPtrSet<const MDNode *, 16> &Processed) { 1406 1407 /// collection info from MMI table. 1408 collectVariableInfoFromMMITable(MF, Processed); 1409 1410 for (SmallVectorImpl<const MDNode*>::const_iterator 1411 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE; 1412 ++UVI) { 1413 const MDNode *Var = *UVI; 1414 if (Processed.count(Var)) 1415 continue; 1416 1417 // History contains relevant DBG_VALUE instructions for Var and instructions 1418 // clobbering it. 1419 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 1420 if (History.empty()) 1421 continue; 1422 const MachineInstr *MInsn = History.front(); 1423 1424 DIVariable DV(Var); 1425 DbgScope *Scope = NULL; 1426 if (DV.getTag() == dwarf::DW_TAG_arg_variable && 1427 DISubprogram(DV.getContext()).describes(MF->getFunction())) 1428 Scope = CurrentFnDbgScope; 1429 else 1430 Scope = findDbgScope(MInsn); 1431 // If variable scope is not found then skip this variable. 1432 if (!Scope) 1433 continue; 1434 1435 Processed.insert(DV); 1436 assert(MInsn->isDebugValue() && "History must begin with debug value"); 1437 DbgVariable *RegVar = new DbgVariable(DV); 1438 if (!addCurrentFnArgument(MF, RegVar, Scope)) 1439 Scope->addVariable(RegVar); 1440 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) { 1441 DbgVariableToDbgInstMap[AbsVar] = MInsn; 1442 VarToAbstractVarMap[RegVar] = AbsVar; 1443 } 1444 1445 // Simple ranges that are fully coalesced. 1446 if (History.size() <= 1 || (History.size() == 2 && 1447 MInsn->isIdenticalTo(History.back()))) { 1448 DbgVariableToDbgInstMap[RegVar] = MInsn; 1449 continue; 1450 } 1451 1452 // handle multiple DBG_VALUE instructions describing one variable. 1453 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 1454 1455 for (SmallVectorImpl<const MachineInstr*>::const_iterator 1456 HI = History.begin(), HE = History.end(); HI != HE; ++HI) { 1457 const MachineInstr *Begin = *HI; 1458 assert(Begin->isDebugValue() && "Invalid History entry"); 1459 MachineLocation MLoc; 1460 if (Begin->getNumOperands() == 3) { 1461 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm()) 1462 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm()); 1463 } else 1464 MLoc = Asm->getDebugValueLocation(Begin); 1465 1466 // FIXME: emitDebugLoc only understands registers. 1467 if (!MLoc.getReg()) 1468 continue; 1469 1470 // Compute the range for a register location. 1471 const MCSymbol *FLabel = getLabelBeforeInsn(Begin); 1472 const MCSymbol *SLabel = 0; 1473 1474 if (HI + 1 == HE) 1475 // If Begin is the last instruction in History then its value is valid 1476 // until the end of the function. 1477 SLabel = FunctionEndSym; 1478 else { 1479 const MachineInstr *End = HI[1]; 1480 if (End->isDebugValue()) 1481 SLabel = getLabelBeforeInsn(End); 1482 else { 1483 // End is a normal instruction clobbering the range. 1484 SLabel = getLabelAfterInsn(End); 1485 assert(SLabel && "Forgot label after clobber instruction"); 1486 ++HI; 1487 } 1488 } 1489 1490 // The value is valid until the next DBG_VALUE or clobber. 1491 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc, Var)); 1492 } 1493 DotDebugLocEntries.push_back(DotDebugLocEntry()); 1494 } 1495 1496 // Collect info for variables that were optimized out. 1497 const Function *F = MF->getFunction(); 1498 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) { 1499 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 1500 DIVariable DV(cast<MDNode>(NMD->getOperand(i))); 1501 if (!DV || !Processed.insert(DV)) 1502 continue; 1503 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext()); 1504 if (Scope) 1505 Scope->addVariable(new DbgVariable(DV)); 1506 } 1507 } 1508 } 1509 1510 /// getLabelBeforeInsn - Return Label preceding the instruction. 1511 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 1512 MCSymbol *Label = LabelsBeforeInsn.lookup(MI); 1513 assert(Label && "Didn't insert label before instruction"); 1514 return Label; 1515 } 1516 1517 /// getLabelAfterInsn - Return Label immediately following the instruction. 1518 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 1519 return LabelsAfterInsn.lookup(MI); 1520 } 1521 1522 /// beginInstruction - Process beginning of an instruction. 1523 void DwarfDebug::beginInstruction(const MachineInstr *MI) { 1524 // Check if source location changes, but ignore DBG_VALUE locations. 1525 if (!MI->isDebugValue()) { 1526 DebugLoc DL = MI->getDebugLoc(); 1527 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) { 1528 PrevInstLoc = DL; 1529 if (!DL.isUnknown()) { 1530 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 1531 recordSourceLine(DL.getLine(), DL.getCol(), Scope); 1532 } else 1533 recordSourceLine(0, 0, 0); 1534 } 1535 } 1536 1537 // Insert labels where requested. 1538 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1539 LabelsBeforeInsn.find(MI); 1540 1541 // No label needed. 1542 if (I == LabelsBeforeInsn.end()) 1543 return; 1544 1545 // Label already assigned. 1546 if (I->second) 1547 return; 1548 1549 if (!PrevLabel) { 1550 PrevLabel = MMI->getContext().CreateTempSymbol(); 1551 Asm->OutStreamer.EmitLabel(PrevLabel); 1552 } 1553 I->second = PrevLabel; 1554 } 1555 1556 /// endInstruction - Process end of an instruction. 1557 void DwarfDebug::endInstruction(const MachineInstr *MI) { 1558 // Don't create a new label after DBG_VALUE instructions. 1559 // They don't generate code. 1560 if (!MI->isDebugValue()) 1561 PrevLabel = 0; 1562 1563 DenseMap<const MachineInstr*, MCSymbol*>::iterator I = 1564 LabelsAfterInsn.find(MI); 1565 1566 // No label needed. 1567 if (I == LabelsAfterInsn.end()) 1568 return; 1569 1570 // Label already assigned. 1571 if (I->second) 1572 return; 1573 1574 // We need a label after this instruction. 1575 if (!PrevLabel) { 1576 PrevLabel = MMI->getContext().CreateTempSymbol(); 1577 Asm->OutStreamer.EmitLabel(PrevLabel); 1578 } 1579 I->second = PrevLabel; 1580 } 1581 1582 /// getOrCreateDbgScope - Create DbgScope for the scope. 1583 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, 1584 const MDNode *InlinedAt) { 1585 if (!InlinedAt) { 1586 DbgScope *WScope = DbgScopeMap.lookup(Scope); 1587 if (WScope) 1588 return WScope; 1589 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL); 1590 DbgScopeMap.insert(std::make_pair(Scope, WScope)); 1591 if (DIDescriptor(Scope).isLexicalBlock()) { 1592 DbgScope *Parent = 1593 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL); 1594 WScope->setParent(Parent); 1595 Parent->addScope(WScope); 1596 } 1597 1598 if (!WScope->getParent()) { 1599 StringRef SPName = DISubprogram(Scope).getLinkageName(); 1600 // We used to check only for a linkage name, but that fails 1601 // since we began omitting the linkage name for private 1602 // functions. The new way is to check for the name in metadata, 1603 // but that's not supported in old .ll test cases. Ergo, we 1604 // check both. 1605 if (SPName == Asm->MF->getFunction()->getName() || 1606 DISubprogram(Scope).getFunction() == Asm->MF->getFunction()) 1607 CurrentFnDbgScope = WScope; 1608 } 1609 1610 return WScope; 1611 } 1612 1613 getOrCreateAbstractScope(Scope); 1614 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt); 1615 if (WScope) 1616 return WScope; 1617 1618 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt); 1619 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope)); 1620 DILocation DL(InlinedAt); 1621 DbgScope *Parent = 1622 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation()); 1623 WScope->setParent(Parent); 1624 Parent->addScope(WScope); 1625 1626 ConcreteScopes[InlinedAt] = WScope; 1627 1628 return WScope; 1629 } 1630 1631 /// hasValidLocation - Return true if debug location entry attached with 1632 /// machine instruction encodes valid location info. 1633 static bool hasValidLocation(LLVMContext &Ctx, 1634 const MachineInstr *MInsn, 1635 const MDNode *&Scope, const MDNode *&InlinedAt) { 1636 DebugLoc DL = MInsn->getDebugLoc(); 1637 if (DL.isUnknown()) return false; 1638 1639 const MDNode *S = DL.getScope(Ctx); 1640 1641 // There is no need to create another DIE for compile unit. For all 1642 // other scopes, create one DbgScope now. This will be translated 1643 // into a scope DIE at the end. 1644 if (DIScope(S).isCompileUnit()) return false; 1645 1646 Scope = S; 1647 InlinedAt = DL.getInlinedAt(Ctx); 1648 return true; 1649 } 1650 1651 /// calculateDominanceGraph - Calculate dominance graph for DbgScope 1652 /// hierarchy. 1653 static void calculateDominanceGraph(DbgScope *Scope) { 1654 assert (Scope && "Unable to calculate scop edominance graph!"); 1655 SmallVector<DbgScope *, 4> WorkStack; 1656 WorkStack.push_back(Scope); 1657 unsigned Counter = 0; 1658 while (!WorkStack.empty()) { 1659 DbgScope *WS = WorkStack.back(); 1660 const SmallVector<DbgScope *, 4> &Children = WS->getScopes(); 1661 bool visitedChildren = false; 1662 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(), 1663 SE = Children.end(); SI != SE; ++SI) { 1664 DbgScope *ChildScope = *SI; 1665 if (!ChildScope->getDFSOut()) { 1666 WorkStack.push_back(ChildScope); 1667 visitedChildren = true; 1668 ChildScope->setDFSIn(++Counter); 1669 break; 1670 } 1671 } 1672 if (!visitedChildren) { 1673 WorkStack.pop_back(); 1674 WS->setDFSOut(++Counter); 1675 } 1676 } 1677 } 1678 1679 /// printDbgScopeInfo - Print DbgScope info for each machine instruction. 1680 static 1681 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF, 1682 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap) 1683 { 1684 #ifndef NDEBUG 1685 unsigned PrevDFSIn = 0; 1686 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1687 I != E; ++I) { 1688 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1689 II != IE; ++II) { 1690 const MachineInstr *MInsn = II; 1691 const MDNode *Scope = NULL; 1692 const MDNode *InlinedAt = NULL; 1693 1694 // Check if instruction has valid location information. 1695 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) { 1696 dbgs() << " [ "; 1697 if (InlinedAt) 1698 dbgs() << "*"; 1699 DenseMap<const MachineInstr *, DbgScope *>::iterator DI = 1700 MI2ScopeMap.find(MInsn); 1701 if (DI != MI2ScopeMap.end()) { 1702 DbgScope *S = DI->second; 1703 dbgs() << S->getDFSIn(); 1704 PrevDFSIn = S->getDFSIn(); 1705 } else 1706 dbgs() << PrevDFSIn; 1707 } else 1708 dbgs() << " [ x" << PrevDFSIn; 1709 dbgs() << " ]"; 1710 MInsn->dump(); 1711 } 1712 dbgs() << "\n"; 1713 } 1714 #endif 1715 } 1716 /// extractScopeInformation - Scan machine instructions in this function 1717 /// and collect DbgScopes. Return true, if at least one scope was found. 1718 bool DwarfDebug::extractScopeInformation() { 1719 // If scope information was extracted using .dbg intrinsics then there is not 1720 // any need to extract these information by scanning each instruction. 1721 if (!DbgScopeMap.empty()) 1722 return false; 1723 1724 // Scan each instruction and create scopes. First build working set of scopes. 1725 LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); 1726 SmallVector<DbgRange, 4> MIRanges; 1727 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap; 1728 const MDNode *PrevScope = NULL; 1729 const MDNode *PrevInlinedAt = NULL; 1730 const MachineInstr *RangeBeginMI = NULL; 1731 const MachineInstr *PrevMI = NULL; 1732 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); 1733 I != E; ++I) { 1734 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1735 II != IE; ++II) { 1736 const MachineInstr *MInsn = II; 1737 const MDNode *Scope = NULL; 1738 const MDNode *InlinedAt = NULL; 1739 1740 // Check if instruction has valid location information. 1741 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) { 1742 PrevMI = MInsn; 1743 continue; 1744 } 1745 1746 // If scope has not changed then skip this instruction. 1747 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) { 1748 PrevMI = MInsn; 1749 continue; 1750 } 1751 1752 // Ignore DBG_VALUE. It does not contribute any instruction in output. 1753 if (MInsn->isDebugValue()) 1754 continue; 1755 1756 if (RangeBeginMI) { 1757 // If we have alread seen a beginning of a instruction range and 1758 // current instruction scope does not match scope of first instruction 1759 // in this range then create a new instruction range. 1760 DbgRange R(RangeBeginMI, PrevMI); 1761 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, 1762 PrevInlinedAt); 1763 MIRanges.push_back(R); 1764 } 1765 1766 // This is a beginning of a new instruction range. 1767 RangeBeginMI = MInsn; 1768 1769 // Reset previous markers. 1770 PrevMI = MInsn; 1771 PrevScope = Scope; 1772 PrevInlinedAt = InlinedAt; 1773 } 1774 } 1775 1776 // Create last instruction range. 1777 if (RangeBeginMI && PrevMI && PrevScope) { 1778 DbgRange R(RangeBeginMI, PrevMI); 1779 MIRanges.push_back(R); 1780 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt); 1781 } 1782 1783 if (!CurrentFnDbgScope) 1784 return false; 1785 1786 calculateDominanceGraph(CurrentFnDbgScope); 1787 if (PrintDbgScope) 1788 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap); 1789 1790 // Find ranges of instructions covered by each DbgScope; 1791 DbgScope *PrevDbgScope = NULL; 1792 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(), 1793 RE = MIRanges.end(); RI != RE; ++RI) { 1794 const DbgRange &R = *RI; 1795 DbgScope *S = MI2ScopeMap.lookup(R.first); 1796 assert (S && "Lost DbgScope for a machine instruction!"); 1797 if (PrevDbgScope && !PrevDbgScope->dominates(S)) 1798 PrevDbgScope->closeInsnRange(S); 1799 S->openInsnRange(R.first); 1800 S->extendInsnRange(R.second); 1801 PrevDbgScope = S; 1802 } 1803 1804 if (PrevDbgScope) 1805 PrevDbgScope->closeInsnRange(); 1806 1807 identifyScopeMarkers(); 1808 1809 return !DbgScopeMap.empty(); 1810 } 1811 1812 /// identifyScopeMarkers() - 1813 /// Each DbgScope has first instruction and last instruction to mark beginning 1814 /// and end of a scope respectively. Create an inverse map that list scopes 1815 /// starts (and ends) with an instruction. One instruction may start (or end) 1816 /// multiple scopes. Ignore scopes that are not reachable. 1817 void DwarfDebug::identifyScopeMarkers() { 1818 SmallVector<DbgScope *, 4> WorkList; 1819 WorkList.push_back(CurrentFnDbgScope); 1820 while (!WorkList.empty()) { 1821 DbgScope *S = WorkList.pop_back_val(); 1822 1823 const SmallVector<DbgScope *, 4> &Children = S->getScopes(); 1824 if (!Children.empty()) 1825 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(), 1826 SE = Children.end(); SI != SE; ++SI) 1827 WorkList.push_back(*SI); 1828 1829 if (S->isAbstractScope()) 1830 continue; 1831 1832 const SmallVector<DbgRange, 4> &Ranges = S->getRanges(); 1833 if (Ranges.empty()) 1834 continue; 1835 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(), 1836 RE = Ranges.end(); RI != RE; ++RI) { 1837 assert(RI->first && "DbgRange does not have first instruction!"); 1838 assert(RI->second && "DbgRange does not have second instruction!"); 1839 requestLabelBeforeInsn(RI->first); 1840 requestLabelAfterInsn(RI->second); 1841 } 1842 } 1843 } 1844 1845 /// FindFirstDebugLoc - Find the first debug location in the function. This 1846 /// is intended to be an approximation for the source position of the 1847 /// beginning of the function. 1848 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) { 1849 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1850 I != E; ++I) 1851 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end(); 1852 MBBI != MBBE; ++MBBI) { 1853 DebugLoc DL = MBBI->getDebugLoc(); 1854 if (!DL.isUnknown()) 1855 return DL; 1856 } 1857 return DebugLoc(); 1858 } 1859 1860 /// beginFunction - Gather pre-function debug information. Assumes being 1861 /// emitted immediately after the function entry point. 1862 void DwarfDebug::beginFunction(const MachineFunction *MF) { 1863 if (!MMI->hasDebugInfo()) return; 1864 if (!extractScopeInformation()) return; 1865 1866 FunctionBeginSym = Asm->GetTempSymbol("func_begin", 1867 Asm->getFunctionNumber()); 1868 // Assumes in correct section after the entry point. 1869 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 1870 1871 // Emit label for the implicitly defined dbg.stoppoint at the start of the 1872 // function. 1873 DebugLoc FDL = FindFirstDebugLoc(MF); 1874 if (FDL.isUnknown()) return; 1875 1876 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext()); 1877 const MDNode *TheScope = 0; 1878 1879 DISubprogram SP = getDISubprogram(Scope); 1880 unsigned Line, Col; 1881 if (SP.Verify()) { 1882 Line = SP.getLineNumber(); 1883 Col = 0; 1884 TheScope = SP; 1885 } else { 1886 Line = FDL.getLine(); 1887 Col = FDL.getCol(); 1888 TheScope = Scope; 1889 } 1890 1891 recordSourceLine(Line, Col, TheScope); 1892 1893 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned"); 1894 1895 /// ProcessedArgs - Collection of arguments already processed. 1896 SmallPtrSet<const MDNode *, 8> ProcessedArgs; 1897 1898 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 1899 1900 /// LiveUserVar - Map physreg numbers to the MDNode they contain. 1901 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs()); 1902 1903 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1904 I != E; ++I) { 1905 bool AtBlockEntry = true; 1906 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1907 II != IE; ++II) { 1908 const MachineInstr *MI = II; 1909 1910 if (MI->isDebugValue()) { 1911 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!"); 1912 1913 // Keep track of user variables. 1914 const MDNode *Var = 1915 MI->getOperand(MI->getNumOperands() - 1).getMetadata(); 1916 1917 // Variable is in a register, we need to check for clobbers. 1918 if (isDbgValueInDefinedReg(MI)) 1919 LiveUserVar[MI->getOperand(0).getReg()] = Var; 1920 1921 // Check the history of this variable. 1922 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var]; 1923 if (History.empty()) { 1924 UserVariables.push_back(Var); 1925 // The first mention of a function argument gets the FunctionBeginSym 1926 // label, so arguments are visible when breaking at function entry. 1927 DIVariable DV(Var); 1928 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable && 1929 DISubprogram(getDISubprogram(DV.getContext())) 1930 .describes(MF->getFunction())) 1931 LabelsBeforeInsn[MI] = FunctionBeginSym; 1932 } else { 1933 // We have seen this variable before. Try to coalesce DBG_VALUEs. 1934 const MachineInstr *Prev = History.back(); 1935 if (Prev->isDebugValue()) { 1936 // Coalesce identical entries at the end of History. 1937 if (History.size() >= 2 && 1938 Prev->isIdenticalTo(History[History.size() - 2])) 1939 History.pop_back(); 1940 1941 // Terminate old register assignments that don't reach MI; 1942 MachineFunction::const_iterator PrevMBB = Prev->getParent(); 1943 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) && 1944 isDbgValueInDefinedReg(Prev)) { 1945 // Previous register assignment needs to terminate at the end of 1946 // its basic block. 1947 MachineBasicBlock::const_iterator LastMI = 1948 PrevMBB->getLastNonDebugInstr(); 1949 if (LastMI == PrevMBB->end()) 1950 // Drop DBG_VALUE for empty range. 1951 History.pop_back(); 1952 else { 1953 // Terminate after LastMI. 1954 History.push_back(LastMI); 1955 } 1956 } 1957 } 1958 } 1959 History.push_back(MI); 1960 } else { 1961 // Not a DBG_VALUE instruction. 1962 if (!MI->isLabel()) 1963 AtBlockEntry = false; 1964 1965 // Check if the instruction clobbers any registers with debug vars. 1966 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(), 1967 MOE = MI->operands_end(); MOI != MOE; ++MOI) { 1968 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg()) 1969 continue; 1970 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg()); 1971 unsigned Reg = *AI; ++AI) { 1972 const MDNode *Var = LiveUserVar[Reg]; 1973 if (!Var) 1974 continue; 1975 // Reg is now clobbered. 1976 LiveUserVar[Reg] = 0; 1977 1978 // Was MD last defined by a DBG_VALUE referring to Reg? 1979 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var); 1980 if (HistI == DbgValues.end()) 1981 continue; 1982 SmallVectorImpl<const MachineInstr*> &History = HistI->second; 1983 if (History.empty()) 1984 continue; 1985 const MachineInstr *Prev = History.back(); 1986 // Sanity-check: Register assignments are terminated at the end of 1987 // their block. 1988 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent()) 1989 continue; 1990 // Is the variable still in Reg? 1991 if (!isDbgValueInDefinedReg(Prev) || 1992 Prev->getOperand(0).getReg() != Reg) 1993 continue; 1994 // Var is clobbered. Make sure the next instruction gets a label. 1995 History.push_back(MI); 1996 } 1997 } 1998 } 1999 } 2000 } 2001 2002 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end(); 2003 I != E; ++I) { 2004 SmallVectorImpl<const MachineInstr*> &History = I->second; 2005 if (History.empty()) 2006 continue; 2007 2008 // Make sure the final register assignments are terminated. 2009 const MachineInstr *Prev = History.back(); 2010 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) { 2011 const MachineBasicBlock *PrevMBB = Prev->getParent(); 2012 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr(); 2013 if (LastMI == PrevMBB->end()) 2014 // Drop DBG_VALUE for empty range. 2015 History.pop_back(); 2016 else { 2017 // Terminate after LastMI. 2018 History.push_back(LastMI); 2019 } 2020 } 2021 // Request labels for the full history. 2022 for (unsigned i = 0, e = History.size(); i != e; ++i) { 2023 const MachineInstr *MI = History[i]; 2024 if (MI->isDebugValue()) 2025 requestLabelBeforeInsn(MI); 2026 else 2027 requestLabelAfterInsn(MI); 2028 } 2029 } 2030 2031 PrevInstLoc = DebugLoc(); 2032 PrevLabel = FunctionBeginSym; 2033 } 2034 2035 /// endFunction - Gather and emit post-function debug information. 2036 /// 2037 void DwarfDebug::endFunction(const MachineFunction *MF) { 2038 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return; 2039 2040 if (CurrentFnDbgScope) { 2041 2042 // Define end label for subprogram. 2043 FunctionEndSym = Asm->GetTempSymbol("func_end", 2044 Asm->getFunctionNumber()); 2045 // Assumes in correct section after the entry point. 2046 Asm->OutStreamer.EmitLabel(FunctionEndSym); 2047 2048 SmallPtrSet<const MDNode *, 16> ProcessedVars; 2049 collectVariableInfo(MF, ProcessedVars); 2050 2051 // Construct abstract scopes. 2052 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(), 2053 AE = AbstractScopesList.end(); AI != AE; ++AI) { 2054 DISubprogram SP((*AI)->getScopeNode()); 2055 if (SP.Verify()) { 2056 // Collect info for variables that were optimized out. 2057 StringRef FName = SP.getLinkageName(); 2058 if (FName.empty()) 2059 FName = SP.getName(); 2060 if (NamedMDNode *NMD = 2061 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) { 2062 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 2063 DIVariable DV(cast<MDNode>(NMD->getOperand(i))); 2064 if (!DV || !ProcessedVars.insert(DV)) 2065 continue; 2066 DbgScope *Scope = AbstractScopes.lookup(DV.getContext()); 2067 if (Scope) 2068 Scope->addVariable(new DbgVariable(DV)); 2069 } 2070 } 2071 } 2072 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0) 2073 constructScopeDIE(*AI); 2074 } 2075 2076 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope); 2077 2078 if (!DisableFramePointerElim(*MF)) 2079 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE, 2080 dwarf::DW_AT_APPLE_omit_frame_ptr, 2081 dwarf::DW_FORM_flag, 1); 2082 2083 2084 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), 2085 MMI->getFrameMoves())); 2086 } 2087 2088 // Clear debug info 2089 CurrentFnDbgScope = NULL; 2090 DeleteContainerPointers(CurrentFnArguments); 2091 DbgVariableToFrameIndexMap.clear(); 2092 VarToAbstractVarMap.clear(); 2093 DbgVariableToDbgInstMap.clear(); 2094 DeleteContainerSeconds(DbgScopeMap); 2095 UserVariables.clear(); 2096 DbgValues.clear(); 2097 ConcreteScopes.clear(); 2098 DeleteContainerSeconds(AbstractScopes); 2099 AbstractScopesList.clear(); 2100 AbstractVariables.clear(); 2101 LabelsBeforeInsn.clear(); 2102 LabelsAfterInsn.clear(); 2103 PrevLabel = NULL; 2104 } 2105 2106 /// recordVariableFrameIndex - Record a variable's index. 2107 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) { 2108 assert (V && "Invalid DbgVariable!"); 2109 DbgVariableToFrameIndexMap[V] = Index; 2110 } 2111 2112 /// findVariableFrameIndex - Return true if frame index for the variable 2113 /// is found. Update FI to hold value of the index. 2114 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) { 2115 assert (V && "Invalid DbgVariable!"); 2116 DenseMap<const DbgVariable *, int>::iterator I = 2117 DbgVariableToFrameIndexMap.find(V); 2118 if (I == DbgVariableToFrameIndexMap.end()) 2119 return false; 2120 *FI = I->second; 2121 return true; 2122 } 2123 2124 /// findDbgScope - Find DbgScope for the debug loc attached with an 2125 /// instruction. 2126 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) { 2127 DbgScope *Scope = NULL; 2128 LLVMContext &Ctx = 2129 MInsn->getParent()->getParent()->getFunction()->getContext(); 2130 DebugLoc DL = MInsn->getDebugLoc(); 2131 2132 if (DL.isUnknown()) 2133 return Scope; 2134 2135 if (const MDNode *IA = DL.getInlinedAt(Ctx)) 2136 Scope = ConcreteScopes.lookup(IA); 2137 if (Scope == 0) 2138 Scope = DbgScopeMap.lookup(DL.getScope(Ctx)); 2139 2140 return Scope; 2141 } 2142 2143 2144 /// recordSourceLine - Register a source line with debug info. Returns the 2145 /// unique label that was emitted and which provides correspondence to 2146 /// the source line list. 2147 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){ 2148 StringRef Fn; 2149 StringRef Dir; 2150 unsigned Src = 1; 2151 if (S) { 2152 DIDescriptor Scope(S); 2153 2154 if (Scope.isCompileUnit()) { 2155 DICompileUnit CU(S); 2156 Fn = CU.getFilename(); 2157 Dir = CU.getDirectory(); 2158 } else if (Scope.isFile()) { 2159 DIFile F(S); 2160 Fn = F.getFilename(); 2161 Dir = F.getDirectory(); 2162 } else if (Scope.isSubprogram()) { 2163 DISubprogram SP(S); 2164 Fn = SP.getFilename(); 2165 Dir = SP.getDirectory(); 2166 } else if (Scope.isLexicalBlock()) { 2167 DILexicalBlock DB(S); 2168 Fn = DB.getFilename(); 2169 Dir = DB.getDirectory(); 2170 } else 2171 assert(0 && "Unexpected scope info"); 2172 2173 Src = GetOrCreateSourceID(Fn, Dir); 2174 } 2175 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT, 2176 0, 0, Fn); 2177 } 2178 2179 //===----------------------------------------------------------------------===// 2180 // Emit Methods 2181 //===----------------------------------------------------------------------===// 2182 2183 /// computeSizeAndOffset - Compute the size and offset of a DIE. 2184 /// 2185 unsigned 2186 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 2187 // Get the children. 2188 const std::vector<DIE *> &Children = Die->getChildren(); 2189 2190 // If not last sibling and has children then add sibling offset attribute. 2191 if (!Last && !Children.empty()) 2192 Die->addSiblingOffset(DIEValueAllocator); 2193 2194 // Record the abbreviation. 2195 assignAbbrevNumber(Die->getAbbrev()); 2196 2197 // Get the abbreviation for this DIE. 2198 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2199 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2200 2201 // Set DIE offset 2202 Die->setOffset(Offset); 2203 2204 // Start the size with the size of abbreviation code. 2205 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 2206 2207 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2208 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2209 2210 // Size the DIE attribute values. 2211 for (unsigned i = 0, N = Values.size(); i < N; ++i) 2212 // Size attribute value. 2213 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 2214 2215 // Size the DIE children if any. 2216 if (!Children.empty()) { 2217 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 2218 "Children flag not set"); 2219 2220 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2221 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 2222 2223 // End of children marker. 2224 Offset += sizeof(int8_t); 2225 } 2226 2227 Die->setSize(Offset - Die->getOffset()); 2228 return Offset; 2229 } 2230 2231 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 2232 /// 2233 void DwarfDebug::computeSizeAndOffsets() { 2234 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2235 E = CUMap.end(); I != E; ++I) { 2236 // Compute size of compile unit header. 2237 unsigned Offset = 2238 sizeof(int32_t) + // Length of Compilation Unit Info 2239 sizeof(int16_t) + // DWARF version number 2240 sizeof(int32_t) + // Offset Into Abbrev. Section 2241 sizeof(int8_t); // Pointer Size (in bytes) 2242 computeSizeAndOffset(I->second->getCUDie(), Offset, true); 2243 } 2244 } 2245 2246 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler 2247 /// temporary label to it if SymbolStem is specified. 2248 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section, 2249 const char *SymbolStem = 0) { 2250 Asm->OutStreamer.SwitchSection(Section); 2251 if (!SymbolStem) return 0; 2252 2253 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem); 2254 Asm->OutStreamer.EmitLabel(TmpSym); 2255 return TmpSym; 2256 } 2257 2258 /// EmitSectionLabels - Emit initial Dwarf sections with a label at 2259 /// the start of each one. 2260 void DwarfDebug::EmitSectionLabels() { 2261 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 2262 2263 // Dwarf sections base addresses. 2264 if (Asm->MAI->doesDwarfRequireFrameSection()) { 2265 DwarfFrameSectionSym = 2266 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame"); 2267 } 2268 2269 DwarfInfoSectionSym = 2270 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 2271 DwarfAbbrevSectionSym = 2272 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 2273 EmitSectionSym(Asm, TLOF.getDwarfARangesSection()); 2274 2275 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection()) 2276 EmitSectionSym(Asm, MacroInfo); 2277 2278 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); 2279 EmitSectionSym(Asm, TLOF.getDwarfLocSection()); 2280 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection()); 2281 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 2282 DwarfStrSectionSym = 2283 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); 2284 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(), 2285 "debug_range"); 2286 2287 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(), 2288 "section_debug_loc"); 2289 2290 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); 2291 EmitSectionSym(Asm, TLOF.getDataSection()); 2292 } 2293 2294 /// emitDIE - Recusively Emits a debug information entry. 2295 /// 2296 void DwarfDebug::emitDIE(DIE *Die) { 2297 // Get the abbreviation for this DIE. 2298 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2299 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2300 2301 // Emit the code (index) for the abbreviation. 2302 if (Asm->isVerbose()) 2303 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" + 2304 Twine::utohexstr(Die->getOffset()) + ":0x" + 2305 Twine::utohexstr(Die->getSize()) + " " + 2306 dwarf::TagString(Abbrev->getTag())); 2307 Asm->EmitULEB128(AbbrevNumber); 2308 2309 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2310 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2311 2312 // Emit the DIE attribute values. 2313 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 2314 unsigned Attr = AbbrevData[i].getAttribute(); 2315 unsigned Form = AbbrevData[i].getForm(); 2316 assert(Form && "Too many attributes for DIE (check abbreviation)"); 2317 2318 if (Asm->isVerbose()) 2319 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 2320 2321 switch (Attr) { 2322 case dwarf::DW_AT_sibling: 2323 Asm->EmitInt32(Die->getSiblingOffset()); 2324 break; 2325 case dwarf::DW_AT_abstract_origin: { 2326 DIEEntry *E = cast<DIEEntry>(Values[i]); 2327 DIE *Origin = E->getEntry(); 2328 unsigned Addr = Origin->getOffset(); 2329 Asm->EmitInt32(Addr); 2330 break; 2331 } 2332 case dwarf::DW_AT_ranges: { 2333 // DW_AT_range Value encodes offset in debug_range section. 2334 DIEInteger *V = cast<DIEInteger>(Values[i]); 2335 2336 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) { 2337 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym, 2338 V->getValue(), 2339 4); 2340 } else { 2341 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym, 2342 V->getValue(), 2343 DwarfDebugRangeSectionSym, 2344 4); 2345 } 2346 break; 2347 } 2348 case dwarf::DW_AT_location: { 2349 if (UseDotDebugLocEntry.count(Die) != 0) { 2350 DIELabel *L = cast<DIELabel>(Values[i]); 2351 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); 2352 } else 2353 Values[i]->EmitValue(Asm, Form); 2354 break; 2355 } 2356 case dwarf::DW_AT_accessibility: { 2357 if (Asm->isVerbose()) { 2358 DIEInteger *V = cast<DIEInteger>(Values[i]); 2359 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue())); 2360 } 2361 Values[i]->EmitValue(Asm, Form); 2362 break; 2363 } 2364 default: 2365 // Emit an attribute using the defined form. 2366 Values[i]->EmitValue(Asm, Form); 2367 break; 2368 } 2369 } 2370 2371 // Emit the DIE children if any. 2372 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 2373 const std::vector<DIE *> &Children = Die->getChildren(); 2374 2375 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2376 emitDIE(Children[j]); 2377 2378 if (Asm->isVerbose()) 2379 Asm->OutStreamer.AddComment("End Of Children Mark"); 2380 Asm->EmitInt8(0); 2381 } 2382 } 2383 2384 /// emitDebugInfo - Emit the debug info section. 2385 /// 2386 void DwarfDebug::emitDebugInfo() { 2387 // Start debug info section. 2388 Asm->OutStreamer.SwitchSection( 2389 Asm->getObjFileLowering().getDwarfInfoSection()); 2390 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2391 E = CUMap.end(); I != E; ++I) { 2392 CompileUnit *TheCU = I->second; 2393 DIE *Die = TheCU->getCUDie(); 2394 2395 // Emit the compile units header. 2396 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin", 2397 TheCU->getID())); 2398 2399 // Emit size of content not including length itself 2400 unsigned ContentSize = Die->getSize() + 2401 sizeof(int16_t) + // DWARF version number 2402 sizeof(int32_t) + // Offset Into Abbrev. Section 2403 sizeof(int8_t); // Pointer Size (in bytes) 2404 2405 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 2406 Asm->EmitInt32(ContentSize); 2407 Asm->OutStreamer.AddComment("DWARF version number"); 2408 Asm->EmitInt16(dwarf::DWARF_VERSION); 2409 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 2410 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 2411 DwarfAbbrevSectionSym); 2412 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2413 Asm->EmitInt8(Asm->getTargetData().getPointerSize()); 2414 2415 emitDIE(Die); 2416 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID())); 2417 } 2418 } 2419 2420 /// emitAbbreviations - Emit the abbreviation section. 2421 /// 2422 void DwarfDebug::emitAbbreviations() const { 2423 // Check to see if it is worth the effort. 2424 if (!Abbreviations.empty()) { 2425 // Start the debug abbrev section. 2426 Asm->OutStreamer.SwitchSection( 2427 Asm->getObjFileLowering().getDwarfAbbrevSection()); 2428 2429 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin")); 2430 2431 // For each abbrevation. 2432 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 2433 // Get abbreviation data 2434 const DIEAbbrev *Abbrev = Abbreviations[i]; 2435 2436 // Emit the abbrevations code (base 1 index.) 2437 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 2438 2439 // Emit the abbreviations data. 2440 Abbrev->Emit(Asm); 2441 } 2442 2443 // Mark end of abbreviations. 2444 Asm->EmitULEB128(0, "EOM(3)"); 2445 2446 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end")); 2447 } 2448 } 2449 2450 /// emitEndOfLineMatrix - Emit the last address of the section and the end of 2451 /// the line matrix. 2452 /// 2453 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 2454 // Define last address of section. 2455 Asm->OutStreamer.AddComment("Extended Op"); 2456 Asm->EmitInt8(0); 2457 2458 Asm->OutStreamer.AddComment("Op size"); 2459 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); 2460 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 2461 Asm->EmitInt8(dwarf::DW_LNE_set_address); 2462 2463 Asm->OutStreamer.AddComment("Section end label"); 2464 2465 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), 2466 Asm->getTargetData().getPointerSize(), 2467 0/*AddrSpace*/); 2468 2469 // Mark end of matrix. 2470 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 2471 Asm->EmitInt8(0); 2472 Asm->EmitInt8(1); 2473 Asm->EmitInt8(1); 2474 } 2475 2476 /// emitCommonDebugFrame - Emit common frame info into a debug frame section. 2477 /// 2478 void DwarfDebug::emitCommonDebugFrame() { 2479 if (!Asm->MAI->doesDwarfRequireFrameSection()) 2480 return; 2481 2482 int stackGrowth = Asm->getTargetData().getPointerSize(); 2483 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() == 2484 TargetFrameLowering::StackGrowsDown) 2485 stackGrowth *= -1; 2486 2487 // Start the dwarf frame section. 2488 Asm->OutStreamer.SwitchSection( 2489 Asm->getObjFileLowering().getDwarfFrameSection()); 2490 2491 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common")); 2492 Asm->OutStreamer.AddComment("Length of Common Information Entry"); 2493 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"), 2494 Asm->GetTempSymbol("debug_frame_common_begin"), 4); 2495 2496 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin")); 2497 Asm->OutStreamer.AddComment("CIE Identifier Tag"); 2498 Asm->EmitInt32((int)dwarf::DW_CIE_ID); 2499 Asm->OutStreamer.AddComment("CIE Version"); 2500 Asm->EmitInt8(dwarf::DW_CIE_VERSION); 2501 Asm->OutStreamer.AddComment("CIE Augmentation"); 2502 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator. 2503 Asm->EmitULEB128(1, "CIE Code Alignment Factor"); 2504 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor"); 2505 Asm->OutStreamer.AddComment("CIE RA Column"); 2506 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 2507 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 2508 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); 2509 2510 std::vector<MachineMove> Moves; 2511 TFI->getInitialFrameState(Moves); 2512 2513 Asm->EmitFrameMoves(Moves, 0, false); 2514 2515 Asm->EmitAlignment(2); 2516 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end")); 2517 } 2518 2519 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame 2520 /// section. 2521 void DwarfDebug:: 2522 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { 2523 if (!Asm->MAI->doesDwarfRequireFrameSection()) 2524 return; 2525 2526 // Start the dwarf frame section. 2527 Asm->OutStreamer.SwitchSection( 2528 Asm->getObjFileLowering().getDwarfFrameSection()); 2529 2530 Asm->OutStreamer.AddComment("Length of Frame Information Entry"); 2531 MCSymbol *DebugFrameBegin = 2532 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number); 2533 MCSymbol *DebugFrameEnd = 2534 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number); 2535 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4); 2536 2537 Asm->OutStreamer.EmitLabel(DebugFrameBegin); 2538 2539 Asm->OutStreamer.AddComment("FDE CIE offset"); 2540 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"), 2541 DwarfFrameSectionSym); 2542 2543 Asm->OutStreamer.AddComment("FDE initial location"); 2544 MCSymbol *FuncBeginSym = 2545 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number); 2546 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym, 2547 Asm->getTargetData().getPointerSize(), 2548 0/*AddrSpace*/); 2549 2550 2551 Asm->OutStreamer.AddComment("FDE address range"); 2552 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number), 2553 FuncBeginSym, Asm->getTargetData().getPointerSize()); 2554 2555 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false); 2556 2557 Asm->EmitAlignment(2); 2558 Asm->OutStreamer.EmitLabel(DebugFrameEnd); 2559 } 2560 2561 /// emitDebugPubNames - Emit visible names into a debug pubnames section. 2562 /// 2563 void DwarfDebug::emitDebugPubNames() { 2564 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2565 E = CUMap.end(); I != E; ++I) { 2566 CompileUnit *TheCU = I->second; 2567 // Start the dwarf pubnames section. 2568 Asm->OutStreamer.SwitchSection( 2569 Asm->getObjFileLowering().getDwarfPubNamesSection()); 2570 2571 Asm->OutStreamer.AddComment("Length of Public Names Info"); 2572 Asm->EmitLabelDifference( 2573 Asm->GetTempSymbol("pubnames_end", TheCU->getID()), 2574 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4); 2575 2576 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", 2577 TheCU->getID())); 2578 2579 Asm->OutStreamer.AddComment("DWARF Version"); 2580 Asm->EmitInt16(dwarf::DWARF_VERSION); 2581 2582 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 2583 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 2584 DwarfInfoSectionSym); 2585 2586 Asm->OutStreamer.AddComment("Compilation Unit Length"); 2587 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()), 2588 Asm->GetTempSymbol("info_begin", TheCU->getID()), 2589 4); 2590 2591 const StringMap<DIE*> &Globals = TheCU->getGlobals(); 2592 for (StringMap<DIE*>::const_iterator 2593 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2594 const char *Name = GI->getKeyData(); 2595 DIE *Entity = GI->second; 2596 2597 Asm->OutStreamer.AddComment("DIE offset"); 2598 Asm->EmitInt32(Entity->getOffset()); 2599 2600 if (Asm->isVerbose()) 2601 Asm->OutStreamer.AddComment("External Name"); 2602 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0); 2603 } 2604 2605 Asm->OutStreamer.AddComment("End Mark"); 2606 Asm->EmitInt32(0); 2607 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", 2608 TheCU->getID())); 2609 } 2610 } 2611 2612 void DwarfDebug::emitDebugPubTypes() { 2613 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2614 E = CUMap.end(); I != E; ++I) { 2615 CompileUnit *TheCU = I->second; 2616 // Start the dwarf pubnames section. 2617 Asm->OutStreamer.SwitchSection( 2618 Asm->getObjFileLowering().getDwarfPubTypesSection()); 2619 Asm->OutStreamer.AddComment("Length of Public Types Info"); 2620 Asm->EmitLabelDifference( 2621 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()), 2622 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4); 2623 2624 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin", 2625 TheCU->getID())); 2626 2627 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version"); 2628 Asm->EmitInt16(dwarf::DWARF_VERSION); 2629 2630 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 2631 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 2632 DwarfInfoSectionSym); 2633 2634 Asm->OutStreamer.AddComment("Compilation Unit Length"); 2635 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()), 2636 Asm->GetTempSymbol("info_begin", TheCU->getID()), 2637 4); 2638 2639 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes(); 2640 for (StringMap<DIE*>::const_iterator 2641 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2642 const char *Name = GI->getKeyData(); 2643 DIE * Entity = GI->second; 2644 2645 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2646 Asm->EmitInt32(Entity->getOffset()); 2647 2648 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name"); 2649 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0); 2650 } 2651 2652 Asm->OutStreamer.AddComment("End Mark"); 2653 Asm->EmitInt32(0); 2654 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end", 2655 TheCU->getID())); 2656 } 2657 } 2658 2659 /// emitDebugStr - Emit visible names into a debug str section. 2660 /// 2661 void DwarfDebug::emitDebugStr() { 2662 // Check to see if it is worth the effort. 2663 if (StringPool.empty()) return; 2664 2665 // Start the dwarf str section. 2666 Asm->OutStreamer.SwitchSection( 2667 Asm->getObjFileLowering().getDwarfStrSection()); 2668 2669 // Get all of the string pool entries and put them in an array by their ID so 2670 // we can sort them. 2671 SmallVector<std::pair<unsigned, 2672 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; 2673 2674 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator 2675 I = StringPool.begin(), E = StringPool.end(); I != E; ++I) 2676 Entries.push_back(std::make_pair(I->second.second, &*I)); 2677 2678 array_pod_sort(Entries.begin(), Entries.end()); 2679 2680 for (unsigned i = 0, e = Entries.size(); i != e; ++i) { 2681 // Emit a label for reference from debug information entries. 2682 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first); 2683 2684 // Emit the string itself. 2685 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/); 2686 } 2687 } 2688 2689 /// emitDebugLoc - Emit visible names into a debug loc section. 2690 /// 2691 void DwarfDebug::emitDebugLoc() { 2692 if (DotDebugLocEntries.empty()) 2693 return; 2694 2695 for (SmallVector<DotDebugLocEntry, 4>::iterator 2696 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2697 I != E; ++I) { 2698 DotDebugLocEntry &Entry = *I; 2699 if (I + 1 != DotDebugLocEntries.end()) 2700 Entry.Merge(I+1); 2701 } 2702 2703 // Start the dwarf loc section. 2704 Asm->OutStreamer.SwitchSection( 2705 Asm->getObjFileLowering().getDwarfLocSection()); 2706 unsigned char Size = Asm->getTargetData().getPointerSize(); 2707 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0)); 2708 unsigned index = 1; 2709 for (SmallVector<DotDebugLocEntry, 4>::iterator 2710 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 2711 I != E; ++I, ++index) { 2712 DotDebugLocEntry &Entry = *I; 2713 if (Entry.isMerged()) continue; 2714 if (Entry.isEmpty()) { 2715 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2716 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2717 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); 2718 } else { 2719 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0); 2720 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0); 2721 DIVariable DV(Entry.Variable); 2722 if (DV.hasComplexAddress()) { 2723 unsigned N = DV.getNumAddrElements(); 2724 unsigned i = 0; 2725 Asm->OutStreamer.AddComment("Loc expr size"); 2726 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { 2727 // If first address element is OpPlus then emit 2728 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 2729 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1)); 2730 Asm->EmitInt16(Asm->getDwarfRegOpSize(Loc) + N - 2); 2731 Asm->EmitDwarfRegOp(Loc); 2732 // Asm->EmitULEB128(DV.getAddrElement(1)); 2733 i = 2; 2734 } else { 2735 Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc) + N); 2736 Asm->EmitDwarfRegOp(Entry.Loc); 2737 } 2738 2739 // Emit remaining complex address elements. 2740 for (; i < N; ++i) { 2741 uint64_t Element = DV.getAddrElement(i); 2742 if (Element == DIBuilder::OpPlus) { 2743 Asm->EmitInt8(dwarf::DW_OP_plus_uconst); 2744 Asm->EmitULEB128(DV.getAddrElement(++i)); 2745 } else if (Element == DIBuilder::OpDeref) 2746 Asm->EmitInt8(dwarf::DW_OP_deref); 2747 else llvm_unreachable("unknown Opcode found in complex address"); 2748 } 2749 } else { 2750 Asm->OutStreamer.AddComment("Loc expr size"); 2751 Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc)); 2752 Asm->EmitDwarfRegOp(Entry.Loc); 2753 } 2754 } 2755 } 2756 } 2757 2758 /// EmitDebugARanges - Emit visible names into a debug aranges section. 2759 /// 2760 void DwarfDebug::EmitDebugARanges() { 2761 // Start the dwarf aranges section. 2762 Asm->OutStreamer.SwitchSection( 2763 Asm->getObjFileLowering().getDwarfARangesSection()); 2764 } 2765 2766 /// emitDebugRanges - Emit visible names into a debug ranges section. 2767 /// 2768 void DwarfDebug::emitDebugRanges() { 2769 // Start the dwarf ranges section. 2770 Asm->OutStreamer.SwitchSection( 2771 Asm->getObjFileLowering().getDwarfRangesSection()); 2772 unsigned char Size = Asm->getTargetData().getPointerSize(); 2773 for (SmallVector<const MCSymbol *, 8>::iterator 2774 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 2775 I != E; ++I) { 2776 if (*I) 2777 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0); 2778 else 2779 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 2780 } 2781 } 2782 2783 /// emitDebugMacInfo - Emit visible names into a debug macinfo section. 2784 /// 2785 void DwarfDebug::emitDebugMacInfo() { 2786 if (const MCSection *LineInfo = 2787 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 2788 // Start the dwarf macinfo section. 2789 Asm->OutStreamer.SwitchSection(LineInfo); 2790 } 2791 } 2792 2793 /// emitDebugInlineInfo - Emit inline info using following format. 2794 /// Section Header: 2795 /// 1. length of section 2796 /// 2. Dwarf version number 2797 /// 3. address size. 2798 /// 2799 /// Entries (one "entry" for each function that was inlined): 2800 /// 2801 /// 1. offset into __debug_str section for MIPS linkage name, if exists; 2802 /// otherwise offset into __debug_str for regular function name. 2803 /// 2. offset into __debug_str section for regular function name. 2804 /// 3. an unsigned LEB128 number indicating the number of distinct inlining 2805 /// instances for the function. 2806 /// 2807 /// The rest of the entry consists of a {die_offset, low_pc} pair for each 2808 /// inlined instance; the die_offset points to the inlined_subroutine die in the 2809 /// __debug_info section, and the low_pc is the starting address for the 2810 /// inlining instance. 2811 void DwarfDebug::emitDebugInlineInfo() { 2812 if (!Asm->MAI->doesDwarfUsesInlineInfoSection()) 2813 return; 2814 2815 if (!FirstCU) 2816 return; 2817 2818 Asm->OutStreamer.SwitchSection( 2819 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 2820 2821 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry"); 2822 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1), 2823 Asm->GetTempSymbol("debug_inlined_begin", 1), 4); 2824 2825 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1)); 2826 2827 Asm->OutStreamer.AddComment("Dwarf Version"); 2828 Asm->EmitInt16(dwarf::DWARF_VERSION); 2829 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 2830 Asm->EmitInt8(Asm->getTargetData().getPointerSize()); 2831 2832 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 2833 E = InlinedSPNodes.end(); I != E; ++I) { 2834 2835 const MDNode *Node = *I; 2836 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 2837 = InlineInfo.find(Node); 2838 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 2839 DISubprogram SP(Node); 2840 StringRef LName = SP.getLinkageName(); 2841 StringRef Name = SP.getName(); 2842 2843 Asm->OutStreamer.AddComment("MIPS linkage name"); 2844 if (LName.empty()) { 2845 Asm->OutStreamer.EmitBytes(Name, 0); 2846 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator. 2847 } else 2848 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)), 2849 DwarfStrSectionSym); 2850 2851 Asm->OutStreamer.AddComment("Function name"); 2852 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 2853 Asm->EmitULEB128(Labels.size(), "Inline count"); 2854 2855 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2856 LE = Labels.end(); LI != LE; ++LI) { 2857 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 2858 Asm->EmitInt32(LI->second->getOffset()); 2859 2860 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 2861 Asm->OutStreamer.EmitSymbolValue(LI->first, 2862 Asm->getTargetData().getPointerSize(),0); 2863 } 2864 } 2865 2866 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1)); 2867 } 2868