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