DwarfDebug.cpp revision 354eb7ea968f35a9e8628b8036a69f48a66e1ff9
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 "llvm/Constants.h" 18#include "llvm/Module.h" 19#include "llvm/CodeGen/MachineFunction.h" 20#include "llvm/CodeGen/MachineModuleInfo.h" 21#include "llvm/MC/MCAsmInfo.h" 22#include "llvm/MC/MCSection.h" 23#include "llvm/MC/MCStreamer.h" 24#include "llvm/MC/MCSymbol.h" 25#include "llvm/Target/Mangler.h" 26#include "llvm/Target/TargetData.h" 27#include "llvm/Target/TargetFrameInfo.h" 28#include "llvm/Target/TargetLoweringObjectFile.h" 29#include "llvm/Target/TargetMachine.h" 30#include "llvm/Target/TargetRegisterInfo.h" 31#include "llvm/Target/TargetOptions.h" 32#include "llvm/Analysis/DebugInfo.h" 33#include "llvm/ADT/STLExtras.h" 34#include "llvm/ADT/StringExtras.h" 35#include "llvm/Support/CommandLine.h" 36#include "llvm/Support/Debug.h" 37#include "llvm/Support/ErrorHandling.h" 38#include "llvm/Support/ValueHandle.h" 39#include "llvm/Support/FormattedStream.h" 40#include "llvm/Support/Timer.h" 41#include "llvm/System/Path.h" 42using namespace llvm; 43 44static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden, 45 cl::desc("Print DbgScope information for each machine instruction")); 46 47static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden, 48 cl::desc("Disable debug info printing")); 49 50static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden, 51 cl::desc("Make an absense of debug location information explicit."), 52 cl::init(false)); 53 54namespace { 55 const char *DWARFGroupName = "DWARF Emission"; 56 const char *DbgTimerName = "DWARF Debug Writer"; 57} // end anonymous namespace 58 59//===----------------------------------------------------------------------===// 60 61/// Configuration values for initial hash set sizes (log2). 62/// 63static const unsigned InitAbbreviationsSetSize = 9; // log2(512) 64 65namespace llvm { 66 67//===----------------------------------------------------------------------===// 68/// CompileUnit - This dwarf writer support class manages information associate 69/// with a source file. 70class CompileUnit { 71 /// ID - File identifier for source. 72 /// 73 unsigned ID; 74 75 /// Die - Compile unit debug information entry. 76 /// 77 const OwningPtr<DIE> CUDie; 78 79 /// IndexTyDie - An anonymous type for index type. Owned by CUDie. 80 DIE *IndexTyDie; 81 82 /// GVToDieMap - Tracks the mapping of unit level debug informaton 83 /// variables to debug information entries. 84 /// FIXME : Rename GVToDieMap -> NodeToDieMap 85 DenseMap<const MDNode *, DIE *> GVToDieMap; 86 87 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton 88 /// descriptors to debug information entries using a DIEEntry proxy. 89 /// FIXME : Rename 90 DenseMap<const MDNode *, DIEEntry *> GVToDIEEntryMap; 91 92 /// Globals - A map of globally visible named entities for this unit. 93 /// 94 StringMap<DIE*> Globals; 95 96 /// GlobalTypes - A map of globally visible types for this unit. 97 /// 98 StringMap<DIE*> GlobalTypes; 99 100public: 101 CompileUnit(unsigned I, DIE *D) 102 : ID(I), CUDie(D), IndexTyDie(0) {} 103 104 // Accessors. 105 unsigned getID() const { return ID; } 106 DIE* getCUDie() const { return CUDie.get(); } 107 const StringMap<DIE*> &getGlobals() const { return Globals; } 108 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; } 109 110 /// hasContent - Return true if this compile unit has something to write out. 111 /// 112 bool hasContent() const { return !CUDie->getChildren().empty(); } 113 114 /// addGlobal - Add a new global entity to the compile unit. 115 /// 116 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; } 117 118 /// addGlobalType - Add a new global type to the compile unit. 119 /// 120 void addGlobalType(StringRef Name, DIE *Die) { 121 GlobalTypes[Name] = Die; 122 } 123 124 /// getDIE - Returns the debug information entry map slot for the 125 /// specified debug variable. 126 DIE *getDIE(const MDNode *N) { return GVToDieMap.lookup(N); } 127 128 /// insertDIE - Insert DIE into the map. 129 void insertDIE(const MDNode *N, DIE *D) { 130 GVToDieMap.insert(std::make_pair(N, D)); 131 } 132 133 /// getDIEEntry - Returns the debug information entry for the speciefied 134 /// debug variable. 135 DIEEntry *getDIEEntry(const MDNode *N) { 136 DenseMap<const MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N); 137 if (I == GVToDIEEntryMap.end()) 138 return NULL; 139 return I->second; 140 } 141 142 /// insertDIEEntry - Insert debug information entry into the map. 143 void insertDIEEntry(const MDNode *N, DIEEntry *E) { 144 GVToDIEEntryMap.insert(std::make_pair(N, E)); 145 } 146 147 /// addDie - Adds or interns the DIE to the compile unit. 148 /// 149 void addDie(DIE *Buffer) { 150 this->CUDie->addChild(Buffer); 151 } 152 153 // getIndexTyDie - Get an anonymous type for index type. 154 DIE *getIndexTyDie() { 155 return IndexTyDie; 156 } 157 158 // setIndexTyDie - Set D as anonymous type for index which can be reused 159 // later. 160 void setIndexTyDie(DIE *D) { 161 IndexTyDie = D; 162 } 163 164}; 165 166//===----------------------------------------------------------------------===// 167/// DbgVariable - This class is used to track local variable information. 168/// 169class DbgVariable { 170 DIVariable Var; // Variable Descriptor. 171 DIE *TheDIE; // Variable DIE. 172 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries. 173public: 174 // AbsVar may be NULL. 175 DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {} 176 177 // Accessors. 178 DIVariable getVariable() const { return Var; } 179 void setDIE(DIE *D) { TheDIE = D; } 180 DIE *getDIE() const { return TheDIE; } 181 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } 182 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; } 183}; 184 185//===----------------------------------------------------------------------===// 186/// DbgRange - This is used to track range of instructions with identical 187/// debug info scope. 188/// 189typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange; 190 191//===----------------------------------------------------------------------===// 192/// DbgScope - This class is used to track scope information. 193/// 194class DbgScope { 195 DbgScope *Parent; // Parent to this scope. 196 DIDescriptor Desc; // Debug info descriptor for scope. 197 // Location at which this scope is inlined. 198 AssertingVH<const MDNode> InlinedAtLocation; 199 bool AbstractScope; // Abstract Scope 200 const MachineInstr *LastInsn; // Last instruction of this scope. 201 const MachineInstr *FirstInsn; // First instruction of this scope. 202 unsigned DFSIn, DFSOut; 203 // Scopes defined in scope. Contents not owned. 204 SmallVector<DbgScope *, 4> Scopes; 205 // Variables declared in scope. Contents owned. 206 SmallVector<DbgVariable *, 8> Variables; 207 SmallVector<DbgRange, 4> Ranges; 208 // Private state for dump() 209 mutable unsigned IndentLevel; 210public: 211 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0) 212 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false), 213 LastInsn(0), FirstInsn(0), 214 DFSIn(0), DFSOut(0), IndentLevel(0) {} 215 virtual ~DbgScope(); 216 217 // Accessors. 218 DbgScope *getParent() const { return Parent; } 219 void setParent(DbgScope *P) { Parent = P; } 220 DIDescriptor getDesc() const { return Desc; } 221 const MDNode *getInlinedAt() const { return InlinedAtLocation; } 222 const MDNode *getScopeNode() const { return Desc; } 223 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; } 224 const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; } 225 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; } 226 227 /// openInsnRange - This scope covers instruction range starting from MI. 228 void openInsnRange(const MachineInstr *MI) { 229 if (!FirstInsn) 230 FirstInsn = MI; 231 232 if (Parent) 233 Parent->openInsnRange(MI); 234 } 235 236 /// extendInsnRange - Extend the current instruction range covered by 237 /// this scope. 238 void extendInsnRange(const MachineInstr *MI) { 239 assert (FirstInsn && "MI Range is not open!"); 240 LastInsn = MI; 241 if (Parent) 242 Parent->extendInsnRange(MI); 243 } 244 245 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected 246 /// until now. This is used when a new scope is encountered while walking 247 /// machine instructions. 248 void closeInsnRange(DbgScope *NewScope = NULL) { 249 assert (LastInsn && "Last insn missing!"); 250 Ranges.push_back(DbgRange(FirstInsn, LastInsn)); 251 FirstInsn = NULL; 252 LastInsn = NULL; 253 // If Parent dominates NewScope then do not close Parent's instruction 254 // range. 255 if (Parent && (!NewScope || !Parent->dominates(NewScope))) 256 Parent->closeInsnRange(NewScope); 257 } 258 259 void setAbstractScope() { AbstractScope = true; } 260 bool isAbstractScope() const { return AbstractScope; } 261 262 // Depth First Search support to walk and mainpluate DbgScope hierarchy. 263 unsigned getDFSOut() const { return DFSOut; } 264 void setDFSOut(unsigned O) { DFSOut = O; } 265 unsigned getDFSIn() const { return DFSIn; } 266 void setDFSIn(unsigned I) { DFSIn = I; } 267 bool dominates(const DbgScope *S) { 268 if (S == this) 269 return true; 270 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut()) 271 return true; 272 return false; 273 } 274 275 /// addScope - Add a scope to the scope. 276 /// 277 void addScope(DbgScope *S) { Scopes.push_back(S); } 278 279 /// addVariable - Add a variable to the scope. 280 /// 281 void addVariable(DbgVariable *V) { Variables.push_back(V); } 282 283#ifndef NDEBUG 284 void dump() const; 285#endif 286}; 287 288} // end llvm namespace 289 290#ifndef NDEBUG 291void DbgScope::dump() const { 292 raw_ostream &err = dbgs(); 293 err.indent(IndentLevel); 294 const MDNode *N = Desc; 295 N->dump(); 296 if (AbstractScope) 297 err << "Abstract Scope\n"; 298 299 IndentLevel += 2; 300 if (!Scopes.empty()) 301 err << "Children ...\n"; 302 for (unsigned i = 0, e = Scopes.size(); i != e; ++i) 303 if (Scopes[i] != this) 304 Scopes[i]->dump(); 305 306 IndentLevel -= 2; 307} 308#endif 309 310DbgScope::~DbgScope() { 311 for (unsigned j = 0, M = Variables.size(); j < M; ++j) 312 delete Variables[j]; 313} 314 315DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 316 : Asm(A), MMI(Asm->MMI), FirstCU(0), 317 AbbreviationsSet(InitAbbreviationsSetSize), 318 CurrentFnDbgScope(0), PrevLabel(NULL) { 319 NextStringPoolNumber = 0; 320 321 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0; 322 DwarfStrSectionSym = TextSectionSym = 0; 323 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; 324 FunctionBeginSym = FunctionEndSym = 0; 325 if (TimePassesIsEnabled) { 326 NamedRegionTimer T(DbgTimerName, DWARFGroupName); 327 beginModule(M); 328 } else { 329 beginModule(M); 330 } 331} 332DwarfDebug::~DwarfDebug() { 333 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 334 DIEBlocks[j]->~DIEBlock(); 335} 336 337MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) { 338 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str]; 339 if (Entry.first) return Entry.first; 340 341 Entry.second = NextStringPoolNumber++; 342 return Entry.first = Asm->GetTempSymbol("string", Entry.second); 343} 344 345 346/// assignAbbrevNumber - Define a unique number for the abbreviation. 347/// 348void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) { 349 // Profile the node so that we can make it unique. 350 FoldingSetNodeID ID; 351 Abbrev.Profile(ID); 352 353 // Check the set for priors. 354 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev); 355 356 // If it's newly added. 357 if (InSet == &Abbrev) { 358 // Add to abbreviation list. 359 Abbreviations.push_back(&Abbrev); 360 361 // Assign the vector position + 1 as its number. 362 Abbrev.setNumber(Abbreviations.size()); 363 } else { 364 // Assign existing abbreviation number. 365 Abbrev.setNumber(InSet->getNumber()); 366 } 367} 368 369/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 370/// information entry. 371DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) { 372 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 373 return Value; 374} 375 376/// addUInt - Add an unsigned integer attribute data and value. 377/// 378void DwarfDebug::addUInt(DIE *Die, unsigned Attribute, 379 unsigned Form, uint64_t Integer) { 380 if (!Form) Form = DIEInteger::BestForm(false, Integer); 381 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 382 Die->addValue(Attribute, Form, Value); 383} 384 385/// addSInt - Add an signed integer attribute data and value. 386/// 387void DwarfDebug::addSInt(DIE *Die, unsigned Attribute, 388 unsigned Form, int64_t Integer) { 389 if (!Form) Form = DIEInteger::BestForm(true, Integer); 390 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 391 Die->addValue(Attribute, Form, Value); 392} 393 394/// addString - Add a string attribute data and value. DIEString only 395/// keeps string reference. 396void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form, 397 StringRef String) { 398 DIEValue *Value = new (DIEValueAllocator) DIEString(String); 399 Die->addValue(Attribute, Form, Value); 400} 401 402/// addLabel - Add a Dwarf label attribute data and value. 403/// 404void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form, 405 const MCSymbol *Label) { 406 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 407 Die->addValue(Attribute, Form, Value); 408} 409 410/// addDelta - Add a label delta attribute data and value. 411/// 412void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form, 413 const MCSymbol *Hi, const MCSymbol *Lo) { 414 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 415 Die->addValue(Attribute, Form, Value); 416} 417 418/// addDIEEntry - Add a DIE attribute data and value. 419/// 420void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, 421 DIE *Entry) { 422 Die->addValue(Attribute, Form, createDIEEntry(Entry)); 423} 424 425 426/// addBlock - Add block data. 427/// 428void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form, 429 DIEBlock *Block) { 430 Block->ComputeSize(Asm); 431 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 432 Die->addValue(Attribute, Block->BestForm(), Block); 433} 434 435/// addSourceLine - Add location information to specified debug information 436/// entry. 437void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) { 438 // Verify variable. 439 if (!V->Verify()) 440 return; 441 442 unsigned Line = V->getLineNumber(); 443 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(), 444 V->getContext().getFilename()); 445 assert(FileID && "Invalid file id"); 446 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 447 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 448} 449 450/// addSourceLine - Add location information to specified debug information 451/// entry. 452void DwarfDebug::addSourceLine(DIE *Die, const DIGlobalVariable *G) { 453 // Verify global variable. 454 if (!G->Verify()) 455 return; 456 457 unsigned Line = G->getLineNumber(); 458 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(), 459 G->getContext().getFilename()); 460 assert(FileID && "Invalid file id"); 461 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 462 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 463} 464 465/// addSourceLine - Add location information to specified debug information 466/// entry. 467void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) { 468 // Verify subprogram. 469 if (!SP->Verify()) 470 return; 471 // If the line number is 0, don't add it. 472 if (SP->getLineNumber() == 0) 473 return; 474 475 unsigned Line = SP->getLineNumber(); 476 if (!SP->getContext().Verify()) 477 return; 478 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(), 479 SP->getFilename()); 480 assert(FileID && "Invalid file id"); 481 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 482 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 483} 484 485/// addSourceLine - Add location information to specified debug information 486/// entry. 487void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) { 488 // Verify type. 489 if (!Ty->Verify()) 490 return; 491 492 unsigned Line = Ty->getLineNumber(); 493 if (!Ty->getContext().Verify()) 494 return; 495 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(), 496 Ty->getContext().getFilename()); 497 assert(FileID && "Invalid file id"); 498 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 499 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 500} 501 502/// addSourceLine - Add location information to specified debug information 503/// entry. 504void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) { 505 // Verify namespace. 506 if (!NS->Verify()) 507 return; 508 509 unsigned Line = NS->getLineNumber(); 510 StringRef FN = NS->getFilename(); 511 StringRef Dir = NS->getDirectory(); 512 513 unsigned FileID = GetOrCreateSourceID(Dir, FN); 514 assert(FileID && "Invalid file id"); 515 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 516 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 517} 518 519/* Byref variables, in Blocks, are declared by the programmer as 520 "SomeType VarName;", but the compiler creates a 521 __Block_byref_x_VarName struct, and gives the variable VarName 522 either the struct, or a pointer to the struct, as its type. This 523 is necessary for various behind-the-scenes things the compiler 524 needs to do with by-reference variables in blocks. 525 526 However, as far as the original *programmer* is concerned, the 527 variable should still have type 'SomeType', as originally declared. 528 529 The following function dives into the __Block_byref_x_VarName 530 struct to find the original type of the variable. This will be 531 passed back to the code generating the type for the Debug 532 Information Entry for the variable 'VarName'. 'VarName' will then 533 have the original type 'SomeType' in its debug information. 534 535 The original type 'SomeType' will be the type of the field named 536 'VarName' inside the __Block_byref_x_VarName struct. 537 538 NOTE: In order for this to not completely fail on the debugger 539 side, the Debug Information Entry for the variable VarName needs to 540 have a DW_AT_location that tells the debugger how to unwind through 541 the pointers and __Block_byref_x_VarName struct to find the actual 542 value of the variable. The function addBlockByrefType does this. */ 543 544/// Find the type the programmer originally declared the variable to be 545/// and return that type. 546/// 547DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) { 548 549 DIType subType = Ty; 550 unsigned tag = Ty.getTag(); 551 552 if (tag == dwarf::DW_TAG_pointer_type) { 553 DIDerivedType DTy = DIDerivedType(Ty); 554 subType = DTy.getTypeDerivedFrom(); 555 } 556 557 DICompositeType blockStruct = DICompositeType(subType); 558 DIArray Elements = blockStruct.getTypeArray(); 559 560 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 561 DIDescriptor Element = Elements.getElement(i); 562 DIDerivedType DT = DIDerivedType(Element); 563 if (Name == DT.getName()) 564 return (DT.getTypeDerivedFrom()); 565 } 566 567 return Ty; 568} 569 570/// addComplexAddress - Start with the address based on the location provided, 571/// and generate the DWARF information necessary to find the actual variable 572/// given the extra address information encoded in the DIVariable, starting from 573/// the starting location. Add the DWARF information to the die. 574/// 575void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die, 576 unsigned Attribute, 577 const MachineLocation &Location) { 578 const DIVariable &VD = DV->getVariable(); 579 DIType Ty = VD.getType(); 580 581 // Decode the original location, and use that as the start of the byref 582 // variable's location. 583 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 584 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); 585 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 586 587 if (Location.isReg()) { 588 if (Reg < 32) { 589 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg); 590 } else { 591 Reg = Reg - dwarf::DW_OP_reg0; 592 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 593 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 594 } 595 } else { 596 if (Reg < 32) 597 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 598 else { 599 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 600 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 601 } 602 603 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset()); 604 } 605 606 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) { 607 uint64_t Element = VD.getAddrElement(i); 608 609 if (Element == DIFactory::OpPlus) { 610 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 611 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i)); 612 } else if (Element == DIFactory::OpDeref) { 613 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 614 } else llvm_unreachable("unknown DIFactory Opcode"); 615 } 616 617 // Now attach the location information to the DIE. 618 addBlock(Die, Attribute, 0, Block); 619} 620 621/* Byref variables, in Blocks, are declared by the programmer as "SomeType 622 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 623 gives the variable VarName either the struct, or a pointer to the struct, as 624 its type. This is necessary for various behind-the-scenes things the 625 compiler needs to do with by-reference variables in Blocks. 626 627 However, as far as the original *programmer* is concerned, the variable 628 should still have type 'SomeType', as originally declared. 629 630 The function getBlockByrefType dives into the __Block_byref_x_VarName 631 struct to find the original type of the variable, which is then assigned to 632 the variable's Debug Information Entry as its real type. So far, so good. 633 However now the debugger will expect the variable VarName to have the type 634 SomeType. So we need the location attribute for the variable to be an 635 expression that explains to the debugger how to navigate through the 636 pointers and struct to find the actual variable of type SomeType. 637 638 The following function does just that. We start by getting 639 the "normal" location for the variable. This will be the location 640 of either the struct __Block_byref_x_VarName or the pointer to the 641 struct __Block_byref_x_VarName. 642 643 The struct will look something like: 644 645 struct __Block_byref_x_VarName { 646 ... <various fields> 647 struct __Block_byref_x_VarName *forwarding; 648 ... <various other fields> 649 SomeType VarName; 650 ... <maybe more fields> 651 }; 652 653 If we are given the struct directly (as our starting point) we 654 need to tell the debugger to: 655 656 1). Add the offset of the forwarding field. 657 658 2). Follow that pointer to get the real __Block_byref_x_VarName 659 struct to use (the real one may have been copied onto the heap). 660 661 3). Add the offset for the field VarName, to find the actual variable. 662 663 If we started with a pointer to the struct, then we need to 664 dereference that pointer first, before the other steps. 665 Translating this into DWARF ops, we will need to append the following 666 to the current location description for the variable: 667 668 DW_OP_deref -- optional, if we start with a pointer 669 DW_OP_plus_uconst <forward_fld_offset> 670 DW_OP_deref 671 DW_OP_plus_uconst <varName_fld_offset> 672 673 That is what this function does. */ 674 675/// addBlockByrefAddress - Start with the address based on the location 676/// provided, and generate the DWARF information necessary to find the 677/// actual Block variable (navigating the Block struct) based on the 678/// starting location. Add the DWARF information to the die. For 679/// more information, read large comment just above here. 680/// 681void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die, 682 unsigned Attribute, 683 const MachineLocation &Location) { 684 const DIVariable &VD = DV->getVariable(); 685 DIType Ty = VD.getType(); 686 DIType TmpTy = Ty; 687 unsigned Tag = Ty.getTag(); 688 bool isPointer = false; 689 690 StringRef varName = VD.getName(); 691 692 if (Tag == dwarf::DW_TAG_pointer_type) { 693 DIDerivedType DTy = DIDerivedType(Ty); 694 TmpTy = DTy.getTypeDerivedFrom(); 695 isPointer = true; 696 } 697 698 DICompositeType blockStruct = DICompositeType(TmpTy); 699 700 // Find the __forwarding field and the variable field in the __Block_byref 701 // struct. 702 DIArray Fields = blockStruct.getTypeArray(); 703 DIDescriptor varField = DIDescriptor(); 704 DIDescriptor forwardingField = DIDescriptor(); 705 706 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) { 707 DIDescriptor Element = Fields.getElement(i); 708 DIDerivedType DT = DIDerivedType(Element); 709 StringRef fieldName = DT.getName(); 710 if (fieldName == "__forwarding") 711 forwardingField = Element; 712 else if (fieldName == varName) 713 varField = Element; 714 } 715 716 // Get the offsets for the forwarding field and the variable field. 717 unsigned forwardingFieldOffset = 718 DIDerivedType(forwardingField).getOffsetInBits() >> 3; 719 unsigned varFieldOffset = 720 DIDerivedType(varField).getOffsetInBits() >> 3; 721 722 // Decode the original location, and use that as the start of the byref 723 // variable's location. 724 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 725 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); 726 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 727 728 if (Location.isReg()) { 729 if (Reg < 32) 730 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg); 731 else { 732 Reg = Reg - dwarf::DW_OP_reg0; 733 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 734 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 735 } 736 } else { 737 if (Reg < 32) 738 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 739 else { 740 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 741 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 742 } 743 744 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset()); 745 } 746 747 // If we started with a pointer to the __Block_byref... struct, then 748 // the first thing we need to do is dereference the pointer (DW_OP_deref). 749 if (isPointer) 750 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 751 752 // Next add the offset for the '__forwarding' field: 753 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 754 // adding the offset if it's 0. 755 if (forwardingFieldOffset > 0) { 756 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 757 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset); 758 } 759 760 // Now dereference the __forwarding field to get to the real __Block_byref 761 // struct: DW_OP_deref. 762 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 763 764 // Now that we've got the real __Block_byref... struct, add the offset 765 // for the variable's field to get to the location of the actual variable: 766 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 767 if (varFieldOffset > 0) { 768 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 769 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset); 770 } 771 772 // Now attach the location information to the DIE. 773 addBlock(Die, Attribute, 0, Block); 774} 775 776/// addAddress - Add an address attribute to a die based on the location 777/// provided. 778void DwarfDebug::addAddress(DIE *Die, unsigned Attribute, 779 const MachineLocation &Location) { 780 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 781 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false); 782 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 783 784 if (Location.isReg()) { 785 if (Reg < 32) { 786 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg); 787 } else { 788 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx); 789 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 790 } 791 } else { 792 if (Reg < 32) { 793 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg); 794 } else { 795 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 796 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg); 797 } 798 799 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset()); 800 } 801 802 addBlock(Die, Attribute, 0, Block); 803} 804 805/// addRegisterAddress - Add register location entry in variable DIE. 806bool DwarfDebug::addRegisterAddress(DIE *Die, const MCSymbol *VS, 807 const MachineOperand &MO) { 808 assert (MO.isReg() && "Invalid machine operand!"); 809 if (!MO.getReg()) 810 return false; 811 MachineLocation Location; 812 Location.set(MO.getReg()); 813 addAddress(Die, dwarf::DW_AT_location, Location); 814 if (VS) 815 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS); 816 return true; 817} 818 819/// addConstantValue - Add constant value entry in variable DIE. 820bool DwarfDebug::addConstantValue(DIE *Die, const MCSymbol *VS, 821 const MachineOperand &MO) { 822 assert (MO.isImm() && "Invalid machine operand!"); 823 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 824 unsigned Imm = MO.getImm(); 825 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm); 826 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 827 if (VS) 828 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS); 829 return true; 830} 831 832/// addConstantFPValue - Add constant value entry in variable DIE. 833bool DwarfDebug::addConstantFPValue(DIE *Die, const MCSymbol *VS, 834 const MachineOperand &MO) { 835 assert (MO.isFPImm() && "Invalid machine operand!"); 836 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 837 APFloat FPImm = MO.getFPImm()->getValueAPF(); 838 839 // Get the raw data form of the floating point. 840 const APInt FltVal = FPImm.bitcastToAPInt(); 841 const char *FltPtr = (const char*)FltVal.getRawData(); 842 843 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 844 bool LittleEndian = Asm->getTargetData().isLittleEndian(); 845 int Incr = (LittleEndian ? 1 : -1); 846 int Start = (LittleEndian ? 0 : NumBytes - 1); 847 int Stop = (LittleEndian ? NumBytes : -1); 848 849 // Output the constant to DWARF one byte at a time. 850 for (; Start != Stop; Start += Incr) 851 addUInt(Block, 0, dwarf::DW_FORM_data1, 852 (unsigned char)0xFF & FltPtr[Start]); 853 854 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 855 if (VS) 856 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS); 857 return true; 858} 859 860 861/// addToContextOwner - Add Die into the list of its context owner's children. 862void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) { 863 if (Context.isType()) { 864 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context)); 865 ContextDIE->addChild(Die); 866 } else if (Context.isNameSpace()) { 867 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context)); 868 ContextDIE->addChild(Die); 869 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context)) 870 ContextDIE->addChild(Die); 871 else 872 getCompileUnit(Context)->addDie(Die); 873} 874 875/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 876/// given DIType. 877DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) { 878 CompileUnit *TypeCU = getCompileUnit(Ty); 879 DIE *TyDIE = TypeCU->getDIE(Ty); 880 if (TyDIE) 881 return TyDIE; 882 883 // Create new type. 884 TyDIE = new DIE(dwarf::DW_TAG_base_type); 885 TypeCU->insertDIE(Ty, TyDIE); 886 if (Ty.isBasicType()) 887 constructTypeDIE(*TyDIE, DIBasicType(Ty)); 888 else if (Ty.isCompositeType()) 889 constructTypeDIE(*TyDIE, DICompositeType(Ty)); 890 else { 891 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 892 constructTypeDIE(*TyDIE, DIDerivedType(Ty)); 893 } 894 895 addToContextOwner(TyDIE, Ty.getContext()); 896 return TyDIE; 897} 898 899/// addType - Add a new type attribute to the specified entity. 900void DwarfDebug::addType(DIE *Entity, DIType Ty) { 901 if (!Ty.Verify()) 902 return; 903 904 // Check for pre-existence. 905 CompileUnit *TypeCU = getCompileUnit(Ty); 906 DIEEntry *Entry = TypeCU->getDIEEntry(Ty); 907 // If it exists then use the existing value. 908 if (Entry) { 909 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry); 910 return; 911 } 912 913 // Construct type. 914 DIE *Buffer = getOrCreateTypeDIE(Ty); 915 916 // Set up proxy. 917 Entry = createDIEEntry(Buffer); 918 TypeCU->insertDIEEntry(Ty, Entry); 919 920 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry); 921} 922 923/// constructTypeDIE - Construct basic type die from DIBasicType. 924void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 925 // Get core information. 926 StringRef Name = BTy.getName(); 927 Buffer.setTag(dwarf::DW_TAG_base_type); 928 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 929 BTy.getEncoding()); 930 931 // Add name if not anonymous or intermediate type. 932 if (!Name.empty()) 933 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 934 uint64_t Size = BTy.getSizeInBits() >> 3; 935 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 936} 937 938/// constructTypeDIE - Construct derived type die from DIDerivedType. 939void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 940 // Get core information. 941 StringRef Name = DTy.getName(); 942 uint64_t Size = DTy.getSizeInBits() >> 3; 943 unsigned Tag = DTy.getTag(); 944 945 // FIXME - Workaround for templates. 946 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 947 948 Buffer.setTag(Tag); 949 950 // Map to main type, void will not have a type. 951 DIType FromTy = DTy.getTypeDerivedFrom(); 952 addType(&Buffer, FromTy); 953 954 // Add name if not anonymous or intermediate type. 955 if (!Name.empty()) 956 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 957 958 // Add size if non-zero (derived types might be zero-sized.) 959 if (Size) 960 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 961 962 // Add source line info if available and TyDesc is not a forward declaration. 963 if (!DTy.isForwardDecl()) 964 addSourceLine(&Buffer, &DTy); 965} 966 967/// constructTypeDIE - Construct type DIE from DICompositeType. 968void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 969 // Get core information. 970 StringRef Name = CTy.getName(); 971 972 uint64_t Size = CTy.getSizeInBits() >> 3; 973 unsigned Tag = CTy.getTag(); 974 Buffer.setTag(Tag); 975 976 switch (Tag) { 977 case dwarf::DW_TAG_vector_type: 978 case dwarf::DW_TAG_array_type: 979 constructArrayTypeDIE(Buffer, &CTy); 980 break; 981 case dwarf::DW_TAG_enumeration_type: { 982 DIArray Elements = CTy.getTypeArray(); 983 984 // Add enumerators to enumeration type. 985 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 986 DIE *ElemDie = NULL; 987 DIDescriptor Enum(Elements.getElement(i)); 988 if (Enum.isEnumerator()) { 989 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum)); 990 Buffer.addChild(ElemDie); 991 } 992 } 993 } 994 break; 995 case dwarf::DW_TAG_subroutine_type: { 996 // Add return type. 997 DIArray Elements = CTy.getTypeArray(); 998 DIDescriptor RTy = Elements.getElement(0); 999 addType(&Buffer, DIType(RTy)); 1000 1001 // Add prototype flag. 1002 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 1003 1004 // Add arguments. 1005 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 1006 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1007 DIDescriptor Ty = Elements.getElement(i); 1008 addType(Arg, DIType(Ty)); 1009 Buffer.addChild(Arg); 1010 } 1011 } 1012 break; 1013 case dwarf::DW_TAG_structure_type: 1014 case dwarf::DW_TAG_union_type: 1015 case dwarf::DW_TAG_class_type: { 1016 // Add elements to structure type. 1017 DIArray Elements = CTy.getTypeArray(); 1018 1019 // A forward struct declared type may not have elements available. 1020 unsigned N = Elements.getNumElements(); 1021 if (N == 0) 1022 break; 1023 1024 // Add elements to structure type. 1025 for (unsigned i = 0; i < N; ++i) { 1026 DIDescriptor Element = Elements.getElement(i); 1027 DIE *ElemDie = NULL; 1028 if (Element.isSubprogram()) 1029 ElemDie = createSubprogramDIE(DISubprogram(Element)); 1030 else if (Element.isVariable()) { 1031 DIVariable DV(Element); 1032 ElemDie = new DIE(dwarf::DW_TAG_variable); 1033 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 1034 DV.getName()); 1035 addType(ElemDie, DV.getType()); 1036 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1037 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1038 addSourceLine(ElemDie, &DV); 1039 } else if (Element.isDerivedType()) 1040 ElemDie = createMemberDIE(DIDerivedType(Element)); 1041 else 1042 continue; 1043 Buffer.addChild(ElemDie); 1044 } 1045 1046 if (CTy.isAppleBlockExtension()) 1047 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1); 1048 1049 unsigned RLang = CTy.getRunTimeLang(); 1050 if (RLang) 1051 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 1052 dwarf::DW_FORM_data1, RLang); 1053 1054 DICompositeType ContainingType = CTy.getContainingType(); 1055 if (DIDescriptor(ContainingType).isCompositeType()) 1056 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 1057 getOrCreateTypeDIE(DIType(ContainingType))); 1058 break; 1059 } 1060 default: 1061 break; 1062 } 1063 1064 // Add name if not anonymous or intermediate type. 1065 if (!Name.empty()) 1066 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1067 1068 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type || 1069 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) { 1070 // Add size if non-zero (derived types might be zero-sized.) 1071 if (Size) 1072 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 1073 else { 1074 // Add zero size if it is not a forward declaration. 1075 if (CTy.isForwardDecl()) 1076 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1077 else 1078 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 1079 } 1080 1081 // Add source line info if available. 1082 if (!CTy.isForwardDecl()) 1083 addSourceLine(&Buffer, &CTy); 1084 } 1085} 1086 1087/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1088void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){ 1089 int64_t L = SR.getLo(); 1090 int64_t H = SR.getHi(); 1091 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 1092 1093 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 1094 if (L) 1095 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L); 1096 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H); 1097 1098 Buffer.addChild(DW_Subrange); 1099} 1100 1101/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1102void DwarfDebug::constructArrayTypeDIE(DIE &Buffer, 1103 DICompositeType *CTy) { 1104 Buffer.setTag(dwarf::DW_TAG_array_type); 1105 if (CTy->getTag() == dwarf::DW_TAG_vector_type) 1106 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1); 1107 1108 // Emit derived type. 1109 addType(&Buffer, CTy->getTypeDerivedFrom()); 1110 DIArray Elements = CTy->getTypeArray(); 1111 1112 // Get an anonymous type for index type. 1113 CompileUnit *TheCU = getCompileUnit(*CTy); 1114 DIE *IdxTy = TheCU->getIndexTyDie(); 1115 if (!IdxTy) { 1116 // Construct an anonymous type for index type. 1117 IdxTy = new DIE(dwarf::DW_TAG_base_type); 1118 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 1119 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1120 dwarf::DW_ATE_signed); 1121 TheCU->addDie(IdxTy); 1122 TheCU->setIndexTyDie(IdxTy); 1123 } 1124 1125 // Add subranges to array type. 1126 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1127 DIDescriptor Element = Elements.getElement(i); 1128 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1129 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1130 } 1131} 1132 1133/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 1134DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) { 1135 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 1136 StringRef Name = ETy.getName(); 1137 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1138 int64_t Value = ETy.getEnumValue(); 1139 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1140 return Enumerator; 1141} 1142 1143/// getRealLinkageName - If special LLVM prefix that is used to inform the asm 1144/// printer to not emit usual symbol prefix before the symbol name is used then 1145/// return linkage name after skipping this special LLVM prefix. 1146static StringRef getRealLinkageName(StringRef LinkageName) { 1147 char One = '\1'; 1148 if (LinkageName.startswith(StringRef(&One, 1))) 1149 return LinkageName.substr(1); 1150 return LinkageName; 1151} 1152 1153/// createGlobalVariableDIE - Create new DIE using GV. 1154DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) { 1155 // If the global variable was optmized out then no need to create debug info 1156 // entry. 1157 if (!GV.getGlobal()) return NULL; 1158 if (GV.getDisplayName().empty()) return NULL; 1159 1160 DIE *GVDie = new DIE(dwarf::DW_TAG_variable); 1161 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 1162 GV.getDisplayName()); 1163 1164 StringRef LinkageName = GV.getLinkageName(); 1165 if (!LinkageName.empty()) 1166 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1167 getRealLinkageName(LinkageName)); 1168 1169 addType(GVDie, GV.getType()); 1170 if (!GV.isLocalToUnit()) 1171 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1172 addSourceLine(GVDie, &GV); 1173 1174 return GVDie; 1175} 1176 1177/// createMemberDIE - Create new member DIE. 1178DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) { 1179 DIE *MemberDie = new DIE(DT.getTag()); 1180 StringRef Name = DT.getName(); 1181 if (!Name.empty()) 1182 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1183 1184 addType(MemberDie, DT.getTypeDerivedFrom()); 1185 1186 addSourceLine(MemberDie, &DT); 1187 1188 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock(); 1189 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1190 1191 uint64_t Size = DT.getSizeInBits(); 1192 uint64_t FieldSize = DT.getOriginalTypeSize(); 1193 1194 if (Size != FieldSize) { 1195 // Handle bitfield. 1196 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1197 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1198 1199 uint64_t Offset = DT.getOffsetInBits(); 1200 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1201 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1202 uint64_t FieldOffset = (HiMark - FieldSize); 1203 Offset -= FieldOffset; 1204 1205 // Maybe we need to work from the other end. 1206 if (Asm->getTargetData().isLittleEndian()) 1207 Offset = FieldSize - (Offset + Size); 1208 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1209 1210 // Here WD_AT_data_member_location points to the anonymous 1211 // field that includes this bit field. 1212 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1213 1214 } else 1215 // This is not a bitfield. 1216 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1217 1218 if (DT.getTag() == dwarf::DW_TAG_inheritance 1219 && DT.isVirtual()) { 1220 1221 // For C++, virtual base classes are not at fixed offset. Use following 1222 // expression to extract appropriate offset from vtable. 1223 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1224 1225 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock(); 1226 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1227 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1228 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1229 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1230 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1231 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1232 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1233 1234 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 1235 VBaseLocationDie); 1236 } else 1237 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1238 1239 if (DT.isProtected()) 1240 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1241 dwarf::DW_ACCESS_protected); 1242 else if (DT.isPrivate()) 1243 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1244 dwarf::DW_ACCESS_private); 1245 else if (DT.getTag() == dwarf::DW_TAG_inheritance) 1246 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1247 dwarf::DW_ACCESS_public); 1248 if (DT.isVirtual()) 1249 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, 1250 dwarf::DW_VIRTUALITY_virtual); 1251 return MemberDie; 1252} 1253 1254/// createSubprogramDIE - Create new DIE using SP. 1255DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) { 1256 CompileUnit *SPCU = getCompileUnit(SP); 1257 DIE *SPDie = SPCU->getDIE(SP); 1258 if (SPDie) 1259 return SPDie; 1260 1261 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1262 // Constructors and operators for anonymous aggregates do not have names. 1263 if (!SP.getName().empty()) 1264 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName()); 1265 1266 StringRef LinkageName = SP.getLinkageName(); 1267 if (!LinkageName.empty()) 1268 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1269 getRealLinkageName(LinkageName)); 1270 1271 addSourceLine(SPDie, &SP); 1272 1273 // Add prototyped tag, if C or ObjC. 1274 unsigned Lang = SP.getCompileUnit().getLanguage(); 1275 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 || 1276 Lang == dwarf::DW_LANG_ObjC) 1277 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 1278 1279 // Add Return Type. 1280 DICompositeType SPTy = SP.getType(); 1281 DIArray Args = SPTy.getTypeArray(); 1282 unsigned SPTag = SPTy.getTag(); 1283 1284 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type) 1285 addType(SPDie, SPTy); 1286 else 1287 addType(SPDie, DIType(Args.getElement(0))); 1288 1289 unsigned VK = SP.getVirtuality(); 1290 if (VK) { 1291 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK); 1292 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1293 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1294 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex()); 1295 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1296 ContainingTypeMap.insert(std::make_pair(SPDie, 1297 SP.getContainingType())); 1298 } 1299 1300 if (MakeDecl || !SP.isDefinition()) { 1301 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1302 1303 // Add arguments. Do not add arguments for subprogram definition. They will 1304 // be handled while processing variables. 1305 DICompositeType SPTy = SP.getType(); 1306 DIArray Args = SPTy.getTypeArray(); 1307 unsigned SPTag = SPTy.getTag(); 1308 1309 if (SPTag == dwarf::DW_TAG_subroutine_type) 1310 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1311 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1312 DIType ATy = DIType(DIType(Args.getElement(i))); 1313 addType(Arg, ATy); 1314 if (ATy.isArtificial()) 1315 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1316 SPDie->addChild(Arg); 1317 } 1318 } 1319 1320 if (SP.isArtificial()) 1321 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1322 1323 if (!SP.isLocalToUnit()) 1324 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1325 1326 if (SP.isOptimized()) 1327 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 1328 1329 // DW_TAG_inlined_subroutine may refer to this DIE. 1330 SPCU->insertDIE(SP, SPDie); 1331 1332 return SPDie; 1333} 1334 1335DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) { 1336 assert(N && "Invalid Scope encoding!"); 1337 1338 DbgScope *AScope = AbstractScopes.lookup(N); 1339 if (AScope) 1340 return AScope; 1341 1342 DbgScope *Parent = NULL; 1343 1344 DIDescriptor Scope(N); 1345 if (Scope.isLexicalBlock()) { 1346 DILexicalBlock DB(N); 1347 DIDescriptor ParentDesc = DB.getContext(); 1348 Parent = getOrCreateAbstractScope(ParentDesc); 1349 } 1350 1351 AScope = new DbgScope(Parent, DIDescriptor(N), NULL); 1352 1353 if (Parent) 1354 Parent->addScope(AScope); 1355 AScope->setAbstractScope(); 1356 AbstractScopes[N] = AScope; 1357 if (DIDescriptor(N).isSubprogram()) 1358 AbstractScopesList.push_back(AScope); 1359 return AScope; 1360} 1361 1362/// isSubprogramContext - Return true if Context is either a subprogram 1363/// or another context nested inside a subprogram. 1364static bool isSubprogramContext(const MDNode *Context) { 1365 if (!Context) 1366 return false; 1367 DIDescriptor D(Context); 1368 if (D.isSubprogram()) 1369 return true; 1370 if (D.isType()) 1371 return isSubprogramContext(DIType(Context).getContext()); 1372 return false; 1373} 1374 1375/// updateSubprogramScopeDIE - Find DIE for the given subprogram and 1376/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 1377/// If there are global variables in this scope then create and insert 1378/// DIEs for these variables. 1379DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) { 1380 CompileUnit *SPCU = getCompileUnit(SPNode); 1381 DIE *SPDie = SPCU->getDIE(SPNode); 1382 assert(SPDie && "Unable to find subprogram DIE!"); 1383 DISubprogram SP(SPNode); 1384 1385 // There is not any need to generate specification DIE for a function 1386 // defined at compile unit level. If a function is defined inside another 1387 // function then gdb prefers the definition at top level and but does not 1388 // expect specification DIE in parent function. So avoid creating 1389 // specification DIE for a function defined inside a function. 1390 if (SP.isDefinition() && !SP.getContext().isCompileUnit() && 1391 !SP.getContext().isFile() && 1392 !isSubprogramContext(SP.getContext())) { 1393 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1394 1395 // Add arguments. 1396 DICompositeType SPTy = SP.getType(); 1397 DIArray Args = SPTy.getTypeArray(); 1398 unsigned SPTag = SPTy.getTag(); 1399 if (SPTag == dwarf::DW_TAG_subroutine_type) 1400 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1401 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1402 DIType ATy = DIType(DIType(Args.getElement(i))); 1403 addType(Arg, ATy); 1404 if (ATy.isArtificial()) 1405 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1406 SPDie->addChild(Arg); 1407 } 1408 DIE *SPDeclDie = SPDie; 1409 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1410 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 1411 SPDeclDie); 1412 SPCU->addDie(SPDie); 1413 } 1414 1415 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1416 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber())); 1417 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1418 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber())); 1419 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 1420 MachineLocation Location(RI->getFrameRegister(*Asm->MF)); 1421 addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 1422 1423 return SPDie; 1424} 1425 1426/// constructLexicalScope - Construct new DW_TAG_lexical_block 1427/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 1428DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) { 1429 1430 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 1431 if (Scope->isAbstractScope()) 1432 return ScopeDIE; 1433 1434 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges(); 1435 if (Ranges.empty()) 1436 return 0; 1437 1438 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(); 1439 if (Ranges.size() > 1) { 1440 // .debug_range section has not been laid out yet. Emit offset in 1441 // .debug_range as a uint, size 4, for now. emitDIE will handle 1442 // DW_AT_ranges appropriately. 1443 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 1444 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize()); 1445 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(), 1446 RE = Ranges.end(); RI != RE; ++RI) { 1447 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 1448 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second)); 1449 } 1450 DebugRangeSymbols.push_back(NULL); 1451 DebugRangeSymbols.push_back(NULL); 1452 return ScopeDIE; 1453 } 1454 1455 const MCSymbol *Start = getLabelBeforeInsn(RI->first); 1456 const MCSymbol *End = getLabelAfterInsn(RI->second); 1457 1458 if (End == 0) return 0; 1459 1460 assert(Start->isDefined() && "Invalid starting label for an inlined scope!"); 1461 assert(End->isDefined() && "Invalid end label for an inlined scope!"); 1462 1463 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start); 1464 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End); 1465 1466 return ScopeDIE; 1467} 1468 1469/// constructInlinedScopeDIE - This scope represents inlined body of 1470/// a function. Construct DIE to represent this concrete inlined copy 1471/// of the function. 1472DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) { 1473 1474 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges(); 1475 assert (Ranges.empty() == false 1476 && "DbgScope does not have instruction markers!"); 1477 1478 // FIXME : .debug_inlined section specification does not clearly state how 1479 // to emit inlined scope that is split into multiple instruction ranges. 1480 // For now, use first instruction range and emit low_pc/high_pc pair and 1481 // corresponding .debug_inlined section entry for this pair. 1482 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(); 1483 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first); 1484 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second); 1485 1486 if (StartLabel == FunctionBeginSym || EndLabel == 0) { 1487 assert (0 && "Unexpected Start and End labels for a inlined scope!"); 1488 return 0; 1489 } 1490 assert(StartLabel->isDefined() && 1491 "Invalid starting label for an inlined scope!"); 1492 assert(EndLabel->isDefined() && 1493 "Invalid end label for an inlined scope!"); 1494 1495 if (!Scope->getScopeNode()) 1496 return NULL; 1497 DIScope DS(Scope->getScopeNode()); 1498 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 1499 1500 DISubprogram InlinedSP = getDISubprogram(DS); 1501 CompileUnit *TheCU = getCompileUnit(InlinedSP); 1502 DIE *OriginDIE = TheCU->getDIE(InlinedSP); 1503 assert(OriginDIE && "Unable to find Origin DIE!"); 1504 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 1505 dwarf::DW_FORM_ref4, OriginDIE); 1506 1507 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel); 1508 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel); 1509 1510 InlinedSubprogramDIEs.insert(OriginDIE); 1511 1512 // Track the start label for this inlined function. 1513 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 1514 I = InlineInfo.find(InlinedSP); 1515 1516 if (I == InlineInfo.end()) { 1517 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, 1518 ScopeDIE)); 1519 InlinedSPNodes.push_back(InlinedSP); 1520 } else 1521 I->second.push_back(std::make_pair(StartLabel, ScopeDIE)); 1522 1523 DILocation DL(Scope->getInlinedAt()); 1524 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID()); 1525 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 1526 1527 return ScopeDIE; 1528} 1529 1530 1531/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1532DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) { 1533 // Get the descriptor. 1534 const DIVariable &VD = DV->getVariable(); 1535 StringRef Name = VD.getName(); 1536 if (Name.empty()) 1537 return NULL; 1538 1539 // Translate tag to proper Dwarf tag. The result variable is dropped for 1540 // now. 1541 unsigned Tag; 1542 switch (VD.getTag()) { 1543 case dwarf::DW_TAG_return_variable: 1544 return NULL; 1545 case dwarf::DW_TAG_arg_variable: 1546 Tag = dwarf::DW_TAG_formal_parameter; 1547 break; 1548 case dwarf::DW_TAG_auto_variable: // fall thru 1549 default: 1550 Tag = dwarf::DW_TAG_variable; 1551 break; 1552 } 1553 1554 // Define variable debug information entry. 1555 DIE *VariableDie = new DIE(Tag); 1556 1557 DIE *AbsDIE = NULL; 1558 DenseMap<const DbgVariable *, const DbgVariable *>::iterator 1559 V2AVI = VarToAbstractVarMap.find(DV); 1560 if (V2AVI != VarToAbstractVarMap.end()) 1561 AbsDIE = V2AVI->second->getDIE(); 1562 1563 if (AbsDIE) 1564 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1565 dwarf::DW_FORM_ref4, AbsDIE); 1566 else { 1567 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1568 addSourceLine(VariableDie, &VD); 1569 1570 // Add variable type. 1571 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 1572 // addresses instead. 1573 if (VD.isBlockByrefVariable()) 1574 addType(VariableDie, getBlockByrefType(VD.getType(), Name)); 1575 else 1576 addType(VariableDie, VD.getType()); 1577 } 1578 1579 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial()) 1580 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); 1581 1582 if (Scope->isAbstractScope()) { 1583 DV->setDIE(VariableDie); 1584 return VariableDie; 1585 } 1586 1587 // Add variable address. 1588 1589 unsigned Offset = DV->getDotDebugLocOffset(); 1590 if (Offset != ~0U) { 1591 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4, 1592 Asm->GetTempSymbol("debug_loc", Offset)); 1593 DV->setDIE(VariableDie); 1594 UseDotDebugLocEntry.insert(VariableDie); 1595 return VariableDie; 1596 } 1597 1598 // Check if variable is described by a DBG_VALUE instruction. 1599 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI = 1600 DbgVariableToDbgInstMap.find(DV); 1601 if (DVI != DbgVariableToDbgInstMap.end()) { 1602 const MachineInstr *DVInsn = DVI->second; 1603 const MCSymbol *DVLabel = findVariableLabel(DV); 1604 bool updated = false; 1605 // FIXME : Handle getNumOperands != 3 1606 if (DVInsn->getNumOperands() == 3) { 1607 if (DVInsn->getOperand(0).isReg()) 1608 updated = addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0)); 1609 else if (DVInsn->getOperand(0).isImm()) 1610 updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0)); 1611 else if (DVInsn->getOperand(0).isFPImm()) 1612 updated = addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0)); 1613 } else { 1614 MachineLocation Location = Asm->getDebugValueLocation(DVInsn); 1615 if (Location.getReg()) { 1616 addAddress(VariableDie, dwarf::DW_AT_location, Location); 1617 if (DVLabel) 1618 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, 1619 DVLabel); 1620 updated = true; 1621 } 1622 } 1623 if (!updated) { 1624 // If variableDie is not updated then DBG_VALUE instruction does not 1625 // have valid variable info. 1626 delete VariableDie; 1627 return NULL; 1628 } 1629 DV->setDIE(VariableDie); 1630 return VariableDie; 1631 } 1632 1633 // .. else use frame index, if available. 1634 MachineLocation Location; 1635 unsigned FrameReg; 1636 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 1637 int FI = 0; 1638 if (findVariableFrameIndex(DV, &FI)) { 1639 int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg); 1640 Location.set(FrameReg, Offset); 1641 1642 if (VD.hasComplexAddress()) 1643 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1644 else if (VD.isBlockByrefVariable()) 1645 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1646 else 1647 addAddress(VariableDie, dwarf::DW_AT_location, Location); 1648 } 1649 DV->setDIE(VariableDie); 1650 return VariableDie; 1651 1652} 1653 1654void DwarfDebug::addPubTypes(DISubprogram SP) { 1655 DICompositeType SPTy = SP.getType(); 1656 unsigned SPTag = SPTy.getTag(); 1657 if (SPTag != dwarf::DW_TAG_subroutine_type) 1658 return; 1659 1660 DIArray Args = SPTy.getTypeArray(); 1661 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 1662 DIType ATy(Args.getElement(i)); 1663 if (!ATy.Verify()) 1664 continue; 1665 DICompositeType CATy = getDICompositeType(ATy); 1666 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty() 1667 && !CATy.isForwardDecl()) { 1668 CompileUnit *TheCU = getCompileUnit(CATy); 1669 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy)) 1670 TheCU->addGlobalType(CATy.getName(), Entry->getEntry()); 1671 } 1672 } 1673} 1674 1675/// constructScopeDIE - Construct a DIE for this scope. 1676DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) { 1677 if (!Scope || !Scope->getScopeNode()) 1678 return NULL; 1679 1680 DIScope DS(Scope->getScopeNode()); 1681 DIE *ScopeDIE = NULL; 1682 if (Scope->getInlinedAt()) 1683 ScopeDIE = constructInlinedScopeDIE(Scope); 1684 else if (DS.isSubprogram()) { 1685 if (Scope->isAbstractScope()) 1686 ScopeDIE = getCompileUnit(DS)->getDIE(DS); 1687 else 1688 ScopeDIE = updateSubprogramScopeDIE(DS); 1689 } 1690 else 1691 ScopeDIE = constructLexicalScopeDIE(Scope); 1692 if (!ScopeDIE) return NULL; 1693 1694 // Add variables to scope. 1695 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables(); 1696 for (unsigned i = 0, N = Variables.size(); i < N; ++i) { 1697 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope); 1698 if (VariableDIE) 1699 ScopeDIE->addChild(VariableDIE); 1700 } 1701 1702 // Add nested scopes. 1703 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes(); 1704 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) { 1705 // Define the Scope debug information entry. 1706 DIE *NestedDIE = constructScopeDIE(Scopes[j]); 1707 if (NestedDIE) 1708 ScopeDIE->addChild(NestedDIE); 1709 } 1710 1711 if (DS.isSubprogram()) 1712 addPubTypes(DISubprogram(DS)); 1713 1714 return ScopeDIE; 1715} 1716 1717/// GetOrCreateSourceID - Look up the source id with the given directory and 1718/// source file names. If none currently exists, create a new id and insert it 1719/// in the SourceIds map. This can update DirectoryNames and SourceFileNames 1720/// maps as well. 1721unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){ 1722 unsigned DId; 1723 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName); 1724 if (DI != DirectoryIdMap.end()) { 1725 DId = DI->getValue(); 1726 } else { 1727 DId = DirectoryNames.size() + 1; 1728 DirectoryIdMap[DirName] = DId; 1729 DirectoryNames.push_back(DirName); 1730 } 1731 1732 unsigned FId; 1733 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName); 1734 if (FI != SourceFileIdMap.end()) { 1735 FId = FI->getValue(); 1736 } else { 1737 FId = SourceFileNames.size() + 1; 1738 SourceFileIdMap[FileName] = FId; 1739 SourceFileNames.push_back(FileName); 1740 } 1741 1742 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI = 1743 SourceIdMap.find(std::make_pair(DId, FId)); 1744 if (SI != SourceIdMap.end()) 1745 return SI->second; 1746 1747 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0. 1748 SourceIdMap[std::make_pair(DId, FId)] = SrcId; 1749 SourceIds.push_back(std::make_pair(DId, FId)); 1750 1751 return SrcId; 1752} 1753 1754/// getOrCreateNameSpace - Create a DIE for DINameSpace. 1755DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) { 1756 CompileUnit *TheCU = getCompileUnit(NS); 1757 DIE *NDie = TheCU->getDIE(NS); 1758 if (NDie) 1759 return NDie; 1760 NDie = new DIE(dwarf::DW_TAG_namespace); 1761 TheCU->insertDIE(NS, NDie); 1762 if (!NS.getName().empty()) 1763 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName()); 1764 addSourceLine(NDie, &NS); 1765 addToContextOwner(NDie, NS.getContext()); 1766 return NDie; 1767} 1768 1769/// constructCompileUnit - Create new CompileUnit for the given 1770/// metadata node with tag DW_TAG_compile_unit. 1771void DwarfDebug::constructCompileUnit(const MDNode *N) { 1772 DICompileUnit DIUnit(N); 1773 StringRef FN = DIUnit.getFilename(); 1774 StringRef Dir = DIUnit.getDirectory(); 1775 unsigned ID = GetOrCreateSourceID(Dir, FN); 1776 1777 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 1778 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string, 1779 DIUnit.getProducer()); 1780 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1, 1781 DIUnit.getLanguage()); 1782 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN); 1783 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This 1784 // simplifies debug range entries. 1785 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_data4, 0); 1786 // DW_AT_stmt_list is a offset of line number information for this 1787 // compile unit in debug_line section. It is always zero when only one 1788 // compile unit is emitted in one object file. 1789 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); 1790 1791 if (!Dir.empty()) 1792 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir); 1793 if (DIUnit.isOptimized()) 1794 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 1795 1796 StringRef Flags = DIUnit.getFlags(); 1797 if (!Flags.empty()) 1798 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags); 1799 1800 unsigned RVer = DIUnit.getRunTimeVersion(); 1801 if (RVer) 1802 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 1803 dwarf::DW_FORM_data1, RVer); 1804 1805 CompileUnit *NewCU = new CompileUnit(ID, Die); 1806 if (!FirstCU) 1807 FirstCU = NewCU; 1808 CUMap.insert(std::make_pair(N, NewCU)); 1809} 1810 1811/// getCompielUnit - Get CompileUnit DIE. 1812CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const { 1813 assert (N && "Invalid DwarfDebug::getCompileUnit argument!"); 1814 DIDescriptor D(N); 1815 const MDNode *CUNode = NULL; 1816 if (D.isCompileUnit()) 1817 CUNode = N; 1818 else if (D.isSubprogram()) 1819 CUNode = DISubprogram(N).getCompileUnit(); 1820 else if (D.isType()) 1821 CUNode = DIType(N).getCompileUnit(); 1822 else if (D.isGlobalVariable()) 1823 CUNode = DIGlobalVariable(N).getCompileUnit(); 1824 else if (D.isVariable()) 1825 CUNode = DIVariable(N).getCompileUnit(); 1826 else if (D.isNameSpace()) 1827 CUNode = DINameSpace(N).getCompileUnit(); 1828 else if (D.isFile()) 1829 CUNode = DIFile(N).getCompileUnit(); 1830 else 1831 return FirstCU; 1832 1833 DenseMap<const MDNode *, CompileUnit *>::const_iterator I 1834 = CUMap.find(CUNode); 1835 if (I == CUMap.end()) 1836 return FirstCU; 1837 return I->second; 1838} 1839 1840 1841/// constructGlobalVariableDIE - Construct global variable DIE. 1842void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) { 1843 DIGlobalVariable DI_GV(N); 1844 1845 // If debug information is malformed then ignore it. 1846 if (DI_GV.Verify() == false) 1847 return; 1848 1849 // Check for pre-existence. 1850 CompileUnit *TheCU = getCompileUnit(N); 1851 if (TheCU->getDIE(DI_GV)) 1852 return; 1853 1854 DIE *VariableDie = createGlobalVariableDIE(DI_GV); 1855 if (!VariableDie) 1856 return; 1857 1858 // Add to map. 1859 TheCU->insertDIE(N, VariableDie); 1860 1861 // Add to context owner. 1862 DIDescriptor GVContext = DI_GV.getContext(); 1863 // Do not create specification DIE if context is either compile unit 1864 // or a subprogram. 1865 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() && 1866 !GVContext.isFile() && 1867 !isSubprogramContext(GVContext)) { 1868 // Create specification DIE. 1869 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 1870 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 1871 dwarf::DW_FORM_ref4, VariableDie); 1872 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1873 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 1874 addLabel(Block, 0, dwarf::DW_FORM_udata, 1875 Asm->Mang->getSymbol(DI_GV.getGlobal())); 1876 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 1877 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1878 TheCU->addDie(VariableSpecDIE); 1879 } else { 1880 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1881 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 1882 addLabel(Block, 0, dwarf::DW_FORM_udata, 1883 Asm->Mang->getSymbol(DI_GV.getGlobal())); 1884 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block); 1885 } 1886 addToContextOwner(VariableDie, GVContext); 1887 1888 // Expose as global. FIXME - need to check external flag. 1889 TheCU->addGlobal(DI_GV.getName(), VariableDie); 1890 1891 DIType GTy = DI_GV.getType(); 1892 if (GTy.isCompositeType() && !GTy.getName().empty() 1893 && !GTy.isForwardDecl()) { 1894 DIEEntry *Entry = TheCU->getDIEEntry(GTy); 1895 assert(Entry && "Missing global type!"); 1896 TheCU->addGlobalType(GTy.getName(), Entry->getEntry()); 1897 } 1898 return; 1899} 1900 1901/// construct SubprogramDIE - Construct subprogram DIE. 1902void DwarfDebug::constructSubprogramDIE(const MDNode *N) { 1903 DISubprogram SP(N); 1904 1905 // Check for pre-existence. 1906 CompileUnit *TheCU = getCompileUnit(N); 1907 if (TheCU->getDIE(N)) 1908 return; 1909 1910 if (!SP.isDefinition()) 1911 // This is a method declaration which will be handled while constructing 1912 // class type. 1913 return; 1914 1915 DIE *SubprogramDie = createSubprogramDIE(SP); 1916 1917 // Add to map. 1918 TheCU->insertDIE(N, SubprogramDie); 1919 1920 // Add to context owner. 1921 addToContextOwner(SubprogramDie, SP.getContext()); 1922 1923 // Expose as global. 1924 TheCU->addGlobal(SP.getName(), SubprogramDie); 1925 1926 return; 1927} 1928 1929/// beginModule - Emit all Dwarf sections that should come prior to the 1930/// content. Create global DIEs and emit initial debug info sections. 1931/// This is inovked by the target AsmPrinter. 1932void DwarfDebug::beginModule(Module *M) { 1933 if (DisableDebugInfoPrinting) 1934 return; 1935 1936 DebugInfoFinder DbgFinder; 1937 DbgFinder.processModule(*M); 1938 1939 bool HasDebugInfo = false; 1940 1941 // Scan all the compile-units to see if there are any marked as the main unit. 1942 // if not, we do not generate debug info. 1943 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 1944 E = DbgFinder.compile_unit_end(); I != E; ++I) { 1945 if (DICompileUnit(*I).isMain()) { 1946 HasDebugInfo = true; 1947 break; 1948 } 1949 } 1950 1951 if (!HasDebugInfo) return; 1952 1953 // Tell MMI that we have debug info. 1954 MMI->setDebugInfoAvailability(true); 1955 1956 // Emit initial sections. 1957 EmitSectionLabels(); 1958 1959 // Create all the compile unit DIEs. 1960 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 1961 E = DbgFinder.compile_unit_end(); I != E; ++I) 1962 constructCompileUnit(*I); 1963 1964 // Create DIEs for each subprogram. 1965 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), 1966 E = DbgFinder.subprogram_end(); I != E; ++I) 1967 constructSubprogramDIE(*I); 1968 1969 // Create DIEs for each global variable. 1970 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), 1971 E = DbgFinder.global_variable_end(); I != E; ++I) 1972 constructGlobalVariableDIE(*I); 1973 1974 // Prime section data. 1975 SectionMap.insert(Asm->getObjFileLowering().getTextSection()); 1976 1977 // Print out .file directives to specify files for .loc directives. These are 1978 // printed out early so that they precede any .loc directives. 1979 if (Asm->MAI->hasDotLocAndDotFile()) { 1980 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) { 1981 // Remember source id starts at 1. 1982 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i); 1983 // FIXME: don't use sys::path for this! This should not depend on the 1984 // host. 1985 sys::Path FullPath(getSourceDirectoryName(Id.first)); 1986 bool AppendOk = 1987 FullPath.appendComponent(getSourceFileName(Id.second)); 1988 assert(AppendOk && "Could not append filename to directory!"); 1989 AppendOk = false; 1990 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str()); 1991 } 1992 } 1993} 1994 1995/// endModule - Emit all Dwarf sections that should come after the content. 1996/// 1997void DwarfDebug::endModule() { 1998 if (!FirstCU) return; 1999 2000 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 2001 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(), 2002 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) { 2003 DIE *ISP = *AI; 2004 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 2005 } 2006 2007 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 2008 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 2009 DIE *SPDie = CI->first; 2010 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second); 2011 if (!N) continue; 2012 DIE *NDie = getCompileUnit(N)->getDIE(N); 2013 if (!NDie) continue; 2014 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 2015 } 2016 2017 // Standard sections final addresses. 2018 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection()); 2019 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end")); 2020 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection()); 2021 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end")); 2022 2023 // End text sections. 2024 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) { 2025 Asm->OutStreamer.SwitchSection(SectionMap[i]); 2026 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i)); 2027 } 2028 2029 // Emit common frame information. 2030 emitCommonDebugFrame(); 2031 2032 // Emit function debug frame information 2033 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(), 2034 E = DebugFrames.end(); I != E; ++I) 2035 emitFunctionDebugFrame(*I); 2036 2037 // Compute DIE offsets and sizes. 2038 computeSizeAndOffsets(); 2039 2040 // Emit all the DIEs into a debug info section 2041 emitDebugInfo(); 2042 2043 // Corresponding abbreviations into a abbrev section. 2044 emitAbbreviations(); 2045 2046 // Emit source line correspondence into a debug line section. 2047 emitDebugLines(); 2048 2049 // Emit info into a debug pubnames section. 2050 emitDebugPubNames(); 2051 2052 // Emit info into a debug pubtypes section. 2053 emitDebugPubTypes(); 2054 2055 // Emit info into a debug loc section. 2056 emitDebugLoc(); 2057 2058 // Emit info into a debug aranges section. 2059 EmitDebugARanges(); 2060 2061 // Emit info into a debug ranges section. 2062 emitDebugRanges(); 2063 2064 // Emit info into a debug macinfo section. 2065 emitDebugMacInfo(); 2066 2067 // Emit inline info. 2068 emitDebugInlineInfo(); 2069 2070 // Emit info into a debug str section. 2071 emitDebugStr(); 2072 2073 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2074 E = CUMap.end(); I != E; ++I) 2075 delete I->second; 2076 FirstCU = NULL; // Reset for the next Module, if any. 2077} 2078 2079/// findAbstractVariable - Find abstract variable, if any, associated with Var. 2080DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, 2081 DebugLoc ScopeLoc) { 2082 2083 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var); 2084 if (AbsDbgVariable) 2085 return AbsDbgVariable; 2086 2087 LLVMContext &Ctx = Var->getContext(); 2088 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx)); 2089 if (!Scope) 2090 return NULL; 2091 2092 AbsDbgVariable = new DbgVariable(Var); 2093 Scope->addVariable(AbsDbgVariable); 2094 AbstractVariables[Var] = AbsDbgVariable; 2095 return AbsDbgVariable; 2096} 2097 2098/// collectVariableInfoFromMMITable - Collect variable information from 2099/// side table maintained by MMI. 2100void 2101DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF, 2102 SmallPtrSet<const MDNode *, 16> &Processed) { 2103 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); 2104 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 2105 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 2106 VE = VMap.end(); VI != VE; ++VI) { 2107 const MDNode *Var = VI->first; 2108 if (!Var) continue; 2109 Processed.insert(Var); 2110 DIVariable DV(Var); 2111 const std::pair<unsigned, DebugLoc> &VP = VI->second; 2112 2113 DbgScope *Scope = 0; 2114 if (const MDNode *IA = VP.second.getInlinedAt(Ctx)) 2115 Scope = ConcreteScopes.lookup(IA); 2116 if (Scope == 0) 2117 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx)); 2118 2119 // If variable scope is not found then skip this variable. 2120 if (Scope == 0) 2121 continue; 2122 2123 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second); 2124 DbgVariable *RegVar = new DbgVariable(DV); 2125 recordVariableFrameIndex(RegVar, VP.first); 2126 Scope->addVariable(RegVar); 2127 if (AbsDbgVariable) { 2128 recordVariableFrameIndex(AbsDbgVariable, VP.first); 2129 VarToAbstractVarMap[RegVar] = AbsDbgVariable; 2130 } 2131 } 2132} 2133 2134/// isDbgValueInUndefinedReg - Return true if debug value, encoded by 2135/// DBG_VALUE instruction, is in undefined reg. 2136static bool isDbgValueInUndefinedReg(const MachineInstr *MI) { 2137 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 2138 if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg()) 2139 return true; 2140 return false; 2141} 2142 2143/// isDbgValueInDefinedReg - Return true if debug value, encoded by 2144/// DBG_VALUE instruction, is in a defined reg. 2145static bool isDbgValueInDefinedReg(const MachineInstr *MI) { 2146 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!"); 2147 if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg()) 2148 return true; 2149 return false; 2150} 2151 2152/// collectVariableInfo - Populate DbgScope entries with variables' info. 2153void DwarfDebug::collectVariableInfo(const MachineFunction *MF) { 2154 SmallPtrSet<const MDNode *, 16> Processed; 2155 2156 /// collection info from MMI table. 2157 collectVariableInfoFromMMITable(MF, Processed); 2158 2159 SmallVector<const MachineInstr *, 8> DbgValues; 2160 // Collect variable information from DBG_VALUE machine instructions; 2161 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); 2162 I != E; ++I) 2163 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2164 II != IE; ++II) { 2165 const MachineInstr *MInsn = II; 2166 if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn)) 2167 continue; 2168 DbgValues.push_back(MInsn); 2169 } 2170 2171 // This is a collection of DBV_VALUE instructions describing same variable. 2172 SmallVector<const MachineInstr *, 4> MultipleValues; 2173 for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(), 2174 E = DbgValues.end(); I != E; ++I) { 2175 const MachineInstr *MInsn = *I; 2176 MultipleValues.clear(); 2177 if (isDbgValueInDefinedReg(MInsn)) 2178 MultipleValues.push_back(MInsn); 2179 DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata()); 2180 if (Processed.count(DV) != 0) 2181 continue; 2182 2183 const MachineInstr *PrevMI = MInsn; 2184 for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1, 2185 ME = DbgValues.end(); MI != ME; ++MI) { 2186 const MDNode *Var = 2187 (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata(); 2188 if (Var == DV && isDbgValueInDefinedReg(*MI) && 2189 !PrevMI->isIdenticalTo(*MI)) 2190 MultipleValues.push_back(*MI); 2191 PrevMI = *MI; 2192 } 2193 2194 DbgScope *Scope = findDbgScope(MInsn); 2195 bool CurFnArg = false; 2196 if (DV.getTag() == dwarf::DW_TAG_arg_variable && 2197 DISubprogram(DV.getContext()).describes(MF->getFunction())) 2198 CurFnArg = true; 2199 if (!Scope && CurFnArg) 2200 Scope = CurrentFnDbgScope; 2201 // If variable scope is not found then skip this variable. 2202 if (!Scope) 2203 continue; 2204 2205 Processed.insert(DV); 2206 DbgVariable *RegVar = new DbgVariable(DV); 2207 Scope->addVariable(RegVar); 2208 if (!CurFnArg) 2209 DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn); 2210 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) { 2211 DbgVariableToDbgInstMap[AbsVar] = MInsn; 2212 VarToAbstractVarMap[RegVar] = AbsVar; 2213 } 2214 if (MultipleValues.size() <= 1) { 2215 DbgVariableToDbgInstMap[RegVar] = MInsn; 2216 continue; 2217 } 2218 2219 // handle multiple DBG_VALUE instructions describing one variable. 2220 if (DotDebugLocEntries.empty()) 2221 RegVar->setDotDebugLocOffset(0); 2222 else 2223 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); 2224 const MachineInstr *Begin = NULL; 2225 const MachineInstr *End = NULL; 2226 for (SmallVector<const MachineInstr *, 4>::iterator 2227 MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) { 2228 if (!Begin) { 2229 Begin = *MVI; 2230 continue; 2231 } 2232 End = *MVI; 2233 MachineLocation MLoc; 2234 MLoc.set(Begin->getOperand(0).getReg(), 0); 2235 const MCSymbol *FLabel = getLabelBeforeInsn(Begin); 2236 const MCSymbol *SLabel = getLabelBeforeInsn(End); 2237 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc)); 2238 Begin = End; 2239 if (MVI + 1 == MVE) { 2240 // If End is the last instruction then its value is valid 2241 // until the end of the funtion. 2242 MLoc.set(End->getOperand(0).getReg(), 0); 2243 DotDebugLocEntries. 2244 push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc)); 2245 } 2246 } 2247 DotDebugLocEntries.push_back(DotDebugLocEntry()); 2248 } 2249 2250 // Collect info for variables that were optimized out. 2251 if (NamedMDNode *NMD = 2252 MF->getFunction()->getParent()->getNamedMetadata("llvm.dbg.lv")) { 2253 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 2254 DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i))); 2255 if (!DV || !Processed.insert(DV)) 2256 continue; 2257 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext()); 2258 if (Scope) 2259 Scope->addVariable(new DbgVariable(DV)); 2260 } 2261 } 2262} 2263 2264/// getLabelBeforeInsn - Return Label preceding the instruction. 2265const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) { 2266 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 2267 LabelsBeforeInsn.find(MI); 2268 if (I == LabelsBeforeInsn.end()) 2269 // FunctionBeginSym always preceeds all the instruction in current function. 2270 return FunctionBeginSym; 2271 return I->second; 2272} 2273 2274/// getLabelAfterInsn - Return Label immediately following the instruction. 2275const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) { 2276 DenseMap<const MachineInstr *, MCSymbol *>::iterator I = 2277 LabelsAfterInsn.find(MI); 2278 if (I == LabelsAfterInsn.end()) 2279 return NULL; 2280 return I->second; 2281} 2282 2283/// beginScope - Process beginning of a scope. 2284void DwarfDebug::beginScope(const MachineInstr *MI) { 2285 if (InsnNeedsLabel.count(MI) == 0) { 2286 LabelsBeforeInsn[MI] = PrevLabel; 2287 return; 2288 } 2289 2290 // Check location. 2291 DebugLoc DL = MI->getDebugLoc(); 2292 if (!DL.isUnknown()) { 2293 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext()); 2294 PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope); 2295 PrevInstLoc = DL; 2296 LabelsBeforeInsn[MI] = PrevLabel; 2297 return; 2298 } 2299 2300 // If location is unknown then use temp label for this DBG_VALUE 2301 // instruction. 2302 if (MI->isDebugValue()) { 2303 PrevLabel = MMI->getContext().CreateTempSymbol(); 2304 Asm->OutStreamer.EmitLabel(PrevLabel); 2305 LabelsBeforeInsn[MI] = PrevLabel; 2306 return; 2307 } 2308 2309 if (UnknownLocations) { 2310 PrevLabel = recordSourceLine(0, 0, 0); 2311 LabelsBeforeInsn[MI] = PrevLabel; 2312 return; 2313 } 2314 2315 assert (0 && "Instruction is not processed!"); 2316} 2317 2318/// endScope - Process end of a scope. 2319void DwarfDebug::endScope(const MachineInstr *MI) { 2320 if (InsnsEndScopeSet.count(MI) != 0) { 2321 // Emit a label if this instruction ends a scope. 2322 MCSymbol *Label = MMI->getContext().CreateTempSymbol(); 2323 Asm->OutStreamer.EmitLabel(Label); 2324 LabelsAfterInsn[MI] = Label; 2325 } 2326} 2327 2328/// getOrCreateDbgScope - Create DbgScope for the scope. 2329DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) { 2330 if (!InlinedAt) { 2331 DbgScope *WScope = DbgScopeMap.lookup(Scope); 2332 if (WScope) 2333 return WScope; 2334 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL); 2335 DbgScopeMap.insert(std::make_pair(Scope, WScope)); 2336 if (DIDescriptor(Scope).isLexicalBlock()) { 2337 DbgScope *Parent = 2338 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL); 2339 WScope->setParent(Parent); 2340 Parent->addScope(WScope); 2341 } 2342 2343 if (!WScope->getParent()) { 2344 StringRef SPName = DISubprogram(Scope).getLinkageName(); 2345 if (SPName == Asm->MF->getFunction()->getName()) 2346 CurrentFnDbgScope = WScope; 2347 } 2348 2349 return WScope; 2350 } 2351 2352 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt); 2353 if (WScope) 2354 return WScope; 2355 2356 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt); 2357 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope)); 2358 DILocation DL(InlinedAt); 2359 DbgScope *Parent = 2360 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation()); 2361 WScope->setParent(Parent); 2362 Parent->addScope(WScope); 2363 2364 ConcreteScopes[InlinedAt] = WScope; 2365 getOrCreateAbstractScope(Scope); 2366 2367 return WScope; 2368} 2369 2370/// hasValidLocation - Return true if debug location entry attached with 2371/// machine instruction encodes valid location info. 2372static bool hasValidLocation(LLVMContext &Ctx, 2373 const MachineInstr *MInsn, 2374 const MDNode *&Scope, const MDNode *&InlinedAt) { 2375 if (MInsn->isDebugValue()) 2376 return false; 2377 DebugLoc DL = MInsn->getDebugLoc(); 2378 if (DL.isUnknown()) return false; 2379 2380 const MDNode *S = DL.getScope(Ctx); 2381 2382 // There is no need to create another DIE for compile unit. For all 2383 // other scopes, create one DbgScope now. This will be translated 2384 // into a scope DIE at the end. 2385 if (DIScope(S).isCompileUnit()) return false; 2386 2387 Scope = S; 2388 InlinedAt = DL.getInlinedAt(Ctx); 2389 return true; 2390} 2391 2392/// calculateDominanceGraph - Calculate dominance graph for DbgScope 2393/// hierarchy. 2394static void calculateDominanceGraph(DbgScope *Scope) { 2395 assert (Scope && "Unable to calculate scop edominance graph!"); 2396 SmallVector<DbgScope *, 4> WorkStack; 2397 WorkStack.push_back(Scope); 2398 unsigned Counter = 0; 2399 while (!WorkStack.empty()) { 2400 DbgScope *WS = WorkStack.back(); 2401 const SmallVector<DbgScope *, 4> &Children = WS->getScopes(); 2402 bool visitedChildren = false; 2403 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(), 2404 SE = Children.end(); SI != SE; ++SI) { 2405 DbgScope *ChildScope = *SI; 2406 if (!ChildScope->getDFSOut()) { 2407 WorkStack.push_back(ChildScope); 2408 visitedChildren = true; 2409 ChildScope->setDFSIn(++Counter); 2410 break; 2411 } 2412 } 2413 if (!visitedChildren) { 2414 WorkStack.pop_back(); 2415 WS->setDFSOut(++Counter); 2416 } 2417 } 2418} 2419 2420/// printDbgScopeInfo - Print DbgScope info for each machine instruction. 2421static 2422void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF, 2423 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap) 2424{ 2425#ifndef NDEBUG 2426 unsigned PrevDFSIn = 0; 2427 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 2428 I != E; ++I) { 2429 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2430 II != IE; ++II) { 2431 const MachineInstr *MInsn = II; 2432 const MDNode *Scope = NULL; 2433 const MDNode *InlinedAt = NULL; 2434 2435 // Check if instruction has valid location information. 2436 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) { 2437 dbgs() << " [ "; 2438 if (InlinedAt) 2439 dbgs() << "*"; 2440 DenseMap<const MachineInstr *, DbgScope *>::iterator DI = 2441 MI2ScopeMap.find(MInsn); 2442 if (DI != MI2ScopeMap.end()) { 2443 DbgScope *S = DI->second; 2444 dbgs() << S->getDFSIn(); 2445 PrevDFSIn = S->getDFSIn(); 2446 } else 2447 dbgs() << PrevDFSIn; 2448 } else 2449 dbgs() << " [ x" << PrevDFSIn; 2450 dbgs() << " ]"; 2451 MInsn->dump(); 2452 } 2453 dbgs() << "\n"; 2454 } 2455#endif 2456} 2457/// extractScopeInformation - Scan machine instructions in this function 2458/// and collect DbgScopes. Return true, if at least one scope was found. 2459bool DwarfDebug::extractScopeInformation() { 2460 // If scope information was extracted using .dbg intrinsics then there is not 2461 // any need to extract these information by scanning each instruction. 2462 if (!DbgScopeMap.empty()) 2463 return false; 2464 2465 // Scan each instruction and create scopes. First build working set of scopes. 2466 LLVMContext &Ctx = Asm->MF->getFunction()->getContext(); 2467 SmallVector<DbgRange, 4> MIRanges; 2468 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap; 2469 const MDNode *PrevScope = NULL; 2470 const MDNode *PrevInlinedAt = NULL; 2471 const MachineInstr *RangeBeginMI = NULL; 2472 const MachineInstr *PrevMI = NULL; 2473 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end(); 2474 I != E; ++I) { 2475 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2476 II != IE; ++II) { 2477 const MachineInstr *MInsn = II; 2478 const MDNode *Scope = NULL; 2479 const MDNode *InlinedAt = NULL; 2480 2481 // Check if instruction has valid location information. 2482 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) { 2483 PrevMI = MInsn; 2484 continue; 2485 } 2486 2487 // If scope has not changed then skip this instruction. 2488 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) { 2489 PrevMI = MInsn; 2490 continue; 2491 } 2492 2493 if (RangeBeginMI) { 2494 // If we have alread seen a beginning of a instruction range and 2495 // current instruction scope does not match scope of first instruction 2496 // in this range then create a new instruction range. 2497 DbgRange R(RangeBeginMI, PrevMI); 2498 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt); 2499 MIRanges.push_back(R); 2500 } 2501 2502 // This is a beginning of a new instruction range. 2503 RangeBeginMI = MInsn; 2504 2505 // Reset previous markers. 2506 PrevMI = MInsn; 2507 PrevScope = Scope; 2508 PrevInlinedAt = InlinedAt; 2509 } 2510 } 2511 2512 // Create last instruction range. 2513 if (RangeBeginMI && PrevMI && PrevScope) { 2514 DbgRange R(RangeBeginMI, PrevMI); 2515 MIRanges.push_back(R); 2516 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt); 2517 } 2518 2519 if (!CurrentFnDbgScope) 2520 return false; 2521 2522 calculateDominanceGraph(CurrentFnDbgScope); 2523 if (PrintDbgScope) 2524 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap); 2525 2526 // Find ranges of instructions covered by each DbgScope; 2527 DbgScope *PrevDbgScope = NULL; 2528 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(), 2529 RE = MIRanges.end(); RI != RE; ++RI) { 2530 const DbgRange &R = *RI; 2531 DbgScope *S = MI2ScopeMap.lookup(R.first); 2532 assert (S && "Lost DbgScope for a machine instruction!"); 2533 if (PrevDbgScope && !PrevDbgScope->dominates(S)) 2534 PrevDbgScope->closeInsnRange(S); 2535 S->openInsnRange(R.first); 2536 S->extendInsnRange(R.second); 2537 PrevDbgScope = S; 2538 } 2539 2540 if (PrevDbgScope) 2541 PrevDbgScope->closeInsnRange(); 2542 2543 identifyScopeMarkers(); 2544 2545 return !DbgScopeMap.empty(); 2546} 2547 2548/// identifyScopeMarkers() - 2549/// Each DbgScope has first instruction and last instruction to mark beginning 2550/// and end of a scope respectively. Create an inverse map that list scopes 2551/// starts (and ends) with an instruction. One instruction may start (or end) 2552/// multiple scopes. Ignore scopes that are not reachable. 2553void DwarfDebug::identifyScopeMarkers() { 2554 SmallVector<DbgScope *, 4> WorkList; 2555 WorkList.push_back(CurrentFnDbgScope); 2556 while (!WorkList.empty()) { 2557 DbgScope *S = WorkList.pop_back_val(); 2558 2559 const SmallVector<DbgScope *, 4> &Children = S->getScopes(); 2560 if (!Children.empty()) 2561 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(), 2562 SE = Children.end(); SI != SE; ++SI) 2563 WorkList.push_back(*SI); 2564 2565 if (S->isAbstractScope()) 2566 continue; 2567 2568 const SmallVector<DbgRange, 4> &Ranges = S->getRanges(); 2569 if (Ranges.empty()) 2570 continue; 2571 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(), 2572 RE = Ranges.end(); RI != RE; ++RI) { 2573 assert(RI->first && "DbgRange does not have first instruction!"); 2574 assert(RI->second && "DbgRange does not have second instruction!"); 2575 InsnsBeginScopeSet.insert(RI->first); 2576 InsnsEndScopeSet.insert(RI->second); 2577 } 2578 } 2579} 2580 2581/// FindFirstDebugLoc - Find the first debug location in the function. This 2582/// is intended to be an approximation for the source position of the 2583/// beginning of the function. 2584static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) { 2585 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 2586 I != E; ++I) 2587 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end(); 2588 MBBI != MBBE; ++MBBI) { 2589 DebugLoc DL = MBBI->getDebugLoc(); 2590 if (!DL.isUnknown()) 2591 return DL; 2592 } 2593 return DebugLoc(); 2594} 2595 2596/// beginFunction - Gather pre-function debug information. Assumes being 2597/// emitted immediately after the function entry point. 2598void DwarfDebug::beginFunction(const MachineFunction *MF) { 2599 if (!MMI->hasDebugInfo()) return; 2600 if (!extractScopeInformation()) return; 2601 2602 FunctionBeginSym = Asm->GetTempSymbol("func_begin", 2603 Asm->getFunctionNumber()); 2604 // Assumes in correct section after the entry point. 2605 Asm->OutStreamer.EmitLabel(FunctionBeginSym); 2606 2607 // Emit label for the implicitly defined dbg.stoppoint at the start of the 2608 // function. 2609 DebugLoc FDL = FindFirstDebugLoc(MF); 2610 if (FDL.isUnknown()) return; 2611 2612 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext()); 2613 2614 DISubprogram SP = getDISubprogram(Scope); 2615 unsigned Line, Col; 2616 if (SP.Verify()) { 2617 Line = SP.getLineNumber(); 2618 Col = 0; 2619 } else { 2620 Line = FDL.getLine(); 2621 Col = FDL.getCol(); 2622 } 2623 2624 recordSourceLine(Line, Col, Scope); 2625 2626 /// ProcessedArgs - Collection of arguments already processed. 2627 SmallPtrSet<const MDNode *, 8> ProcessedArgs; 2628 2629 DebugLoc PrevLoc; 2630 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 2631 I != E; ++I) 2632 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2633 II != IE; ++II) { 2634 const MachineInstr *MI = II; 2635 DebugLoc DL = MI->getDebugLoc(); 2636 if (MI->isDebugValue()) { 2637 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!"); 2638 DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata()); 2639 if (!DV.Verify()) continue; 2640 if (isDbgValueInUndefinedReg(MI)) continue; 2641 // If DBG_VALUE is for a local variable then it needs a label. 2642 if (DV.getTag() != dwarf::DW_TAG_arg_variable) 2643 InsnNeedsLabel.insert(MI); 2644 // DBG_VALUE for inlined functions argument needs a label. 2645 else if (!DISubprogram(DV.getContext()).describes(MF->getFunction())) 2646 InsnNeedsLabel.insert(MI); 2647 // DBG_VALUE indicating argument location change needs a label. 2648 else if (!ProcessedArgs.insert(DV)) 2649 InsnNeedsLabel.insert(MI); 2650 } else { 2651 // If location is unknown then instruction needs a location only if 2652 // UnknownLocations flag is set. 2653 if (DL.isUnknown()) { 2654 if (UnknownLocations && !PrevLoc.isUnknown()) 2655 InsnNeedsLabel.insert(MI); 2656 } else if (DL != PrevLoc) 2657 // Otherwise, instruction needs a location only if it is new location. 2658 InsnNeedsLabel.insert(MI); 2659 } 2660 2661 if (!DL.isUnknown() || UnknownLocations) 2662 PrevLoc = DL; 2663 } 2664 2665 PrevLabel = FunctionBeginSym; 2666} 2667 2668/// endFunction - Gather and emit post-function debug information. 2669/// 2670void DwarfDebug::endFunction(const MachineFunction *MF) { 2671 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return; 2672 2673 if (CurrentFnDbgScope) { 2674 2675 // Define end label for subprogram. 2676 FunctionEndSym = Asm->GetTempSymbol("func_end", 2677 Asm->getFunctionNumber()); 2678 // Assumes in correct section after the entry point. 2679 Asm->OutStreamer.EmitLabel(FunctionEndSym); 2680 2681 collectVariableInfo(MF); 2682 2683 // Get function line info. 2684 if (!Lines.empty()) { 2685 // Get section line info. 2686 unsigned ID = SectionMap.insert(Asm->getCurrentSection()); 2687 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID); 2688 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1]; 2689 // Append the function info to section info. 2690 SectionLineInfos.insert(SectionLineInfos.end(), 2691 Lines.begin(), Lines.end()); 2692 } 2693 2694 // Construct abstract scopes. 2695 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(), 2696 AE = AbstractScopesList.end(); AI != AE; ++AI) 2697 constructScopeDIE(*AI); 2698 2699 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope); 2700 2701 if (!DisableFramePointerElim(*MF)) 2702 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr, 2703 dwarf::DW_FORM_flag, 1); 2704 2705 2706 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(), 2707 MMI->getFrameMoves())); 2708 } 2709 2710 // Clear debug info 2711 CurrentFnDbgScope = NULL; 2712 InsnNeedsLabel.clear(); 2713 DbgVariableToFrameIndexMap.clear(); 2714 VarToAbstractVarMap.clear(); 2715 DbgVariableToDbgInstMap.clear(); 2716 DbgVariableLabelsMap.clear(); 2717 DeleteContainerSeconds(DbgScopeMap); 2718 InsnsBeginScopeSet.clear(); 2719 InsnsEndScopeSet.clear(); 2720 ConcreteScopes.clear(); 2721 DeleteContainerSeconds(AbstractScopes); 2722 AbstractScopesList.clear(); 2723 AbstractVariables.clear(); 2724 LabelsBeforeInsn.clear(); 2725 LabelsAfterInsn.clear(); 2726 Lines.clear(); 2727 PrevLabel = NULL; 2728} 2729 2730/// recordVariableFrameIndex - Record a variable's index. 2731void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) { 2732 assert (V && "Invalid DbgVariable!"); 2733 DbgVariableToFrameIndexMap[V] = Index; 2734} 2735 2736/// findVariableFrameIndex - Return true if frame index for the variable 2737/// is found. Update FI to hold value of the index. 2738bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) { 2739 assert (V && "Invalid DbgVariable!"); 2740 DenseMap<const DbgVariable *, int>::iterator I = 2741 DbgVariableToFrameIndexMap.find(V); 2742 if (I == DbgVariableToFrameIndexMap.end()) 2743 return false; 2744 *FI = I->second; 2745 return true; 2746} 2747 2748/// findVariableLabel - Find MCSymbol for the variable. 2749const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) { 2750 DenseMap<const DbgVariable *, const MCSymbol *>::iterator I 2751 = DbgVariableLabelsMap.find(V); 2752 if (I == DbgVariableLabelsMap.end()) 2753 return NULL; 2754 else return I->second; 2755} 2756 2757/// findDbgScope - Find DbgScope for the debug loc attached with an 2758/// instruction. 2759DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) { 2760 DbgScope *Scope = NULL; 2761 LLVMContext &Ctx = 2762 MInsn->getParent()->getParent()->getFunction()->getContext(); 2763 DebugLoc DL = MInsn->getDebugLoc(); 2764 2765 if (DL.isUnknown()) 2766 return Scope; 2767 2768 if (const MDNode *IA = DL.getInlinedAt(Ctx)) 2769 Scope = ConcreteScopes.lookup(IA); 2770 if (Scope == 0) 2771 Scope = DbgScopeMap.lookup(DL.getScope(Ctx)); 2772 2773 return Scope; 2774} 2775 2776 2777/// recordSourceLine - Register a source line with debug info. Returns the 2778/// unique label that was emitted and which provides correspondence to 2779/// the source line list. 2780MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) { 2781 StringRef Dir; 2782 StringRef Fn; 2783 2784 unsigned Src = 1; 2785 if (S) { 2786 DIDescriptor Scope(S); 2787 2788 if (Scope.isCompileUnit()) { 2789 DICompileUnit CU(S); 2790 Dir = CU.getDirectory(); 2791 Fn = CU.getFilename(); 2792 } else if (Scope.isSubprogram()) { 2793 DISubprogram SP(S); 2794 Dir = SP.getDirectory(); 2795 Fn = SP.getFilename(); 2796 } else if (Scope.isLexicalBlock()) { 2797 DILexicalBlock DB(S); 2798 Dir = DB.getDirectory(); 2799 Fn = DB.getFilename(); 2800 } else 2801 assert(0 && "Unexpected scope info"); 2802 2803 Src = GetOrCreateSourceID(Dir, Fn); 2804 } 2805 2806 MCSymbol *Label = MMI->getContext().CreateTempSymbol(); 2807 Lines.push_back(SrcLineInfo(Line, Col, Src, Label)); 2808 2809 Asm->OutStreamer.EmitLabel(Label); 2810 return Label; 2811} 2812 2813//===----------------------------------------------------------------------===// 2814// Emit Methods 2815//===----------------------------------------------------------------------===// 2816 2817/// computeSizeAndOffset - Compute the size and offset of a DIE. 2818/// 2819unsigned 2820DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 2821 // Get the children. 2822 const std::vector<DIE *> &Children = Die->getChildren(); 2823 2824 // If not last sibling and has children then add sibling offset attribute. 2825 if (!Last && !Children.empty()) 2826 Die->addSiblingOffset(DIEValueAllocator); 2827 2828 // Record the abbreviation. 2829 assignAbbrevNumber(Die->getAbbrev()); 2830 2831 // Get the abbreviation for this DIE. 2832 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2833 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2834 2835 // Set DIE offset 2836 Die->setOffset(Offset); 2837 2838 // Start the size with the size of abbreviation code. 2839 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 2840 2841 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2842 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2843 2844 // Size the DIE attribute values. 2845 for (unsigned i = 0, N = Values.size(); i < N; ++i) 2846 // Size attribute value. 2847 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); 2848 2849 // Size the DIE children if any. 2850 if (!Children.empty()) { 2851 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 2852 "Children flag not set"); 2853 2854 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2855 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 2856 2857 // End of children marker. 2858 Offset += sizeof(int8_t); 2859 } 2860 2861 Die->setSize(Offset - Die->getOffset()); 2862 return Offset; 2863} 2864 2865/// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 2866/// 2867void DwarfDebug::computeSizeAndOffsets() { 2868 unsigned PrevOffset = 0; 2869 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 2870 E = CUMap.end(); I != E; ++I) { 2871 // Compute size of compile unit header. 2872 static unsigned Offset = PrevOffset + 2873 sizeof(int32_t) + // Length of Compilation Unit Info 2874 sizeof(int16_t) + // DWARF version number 2875 sizeof(int32_t) + // Offset Into Abbrev. Section 2876 sizeof(int8_t); // Pointer Size (in bytes) 2877 computeSizeAndOffset(I->second->getCUDie(), Offset, true); 2878 PrevOffset = Offset; 2879 } 2880} 2881 2882/// EmitSectionSym - Switch to the specified MCSection and emit an assembler 2883/// temporary label to it if SymbolStem is specified. 2884static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section, 2885 const char *SymbolStem = 0) { 2886 Asm->OutStreamer.SwitchSection(Section); 2887 if (!SymbolStem) return 0; 2888 2889 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem); 2890 Asm->OutStreamer.EmitLabel(TmpSym); 2891 return TmpSym; 2892} 2893 2894/// EmitSectionLabels - Emit initial Dwarf sections with a label at 2895/// the start of each one. 2896void DwarfDebug::EmitSectionLabels() { 2897 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 2898 2899 // Dwarf sections base addresses. 2900 if (Asm->MAI->doesDwarfRequireFrameSection()) { 2901 DwarfFrameSectionSym = 2902 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame"); 2903 } 2904 2905 DwarfInfoSectionSym = 2906 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); 2907 DwarfAbbrevSectionSym = 2908 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); 2909 EmitSectionSym(Asm, TLOF.getDwarfARangesSection()); 2910 2911 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection()) 2912 EmitSectionSym(Asm, MacroInfo); 2913 2914 EmitSectionSym(Asm, TLOF.getDwarfLineSection()); 2915 EmitSectionSym(Asm, TLOF.getDwarfLocSection()); 2916 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection()); 2917 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); 2918 DwarfStrSectionSym = 2919 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); 2920 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(), 2921 "debug_range"); 2922 2923 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(), 2924 "section_debug_loc"); 2925 2926 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); 2927 EmitSectionSym(Asm, TLOF.getDataSection()); 2928} 2929 2930/// emitDIE - Recusively Emits a debug information entry. 2931/// 2932void DwarfDebug::emitDIE(DIE *Die) { 2933 // Get the abbreviation for this DIE. 2934 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2935 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2936 2937 // Emit the code (index) for the abbreviation. 2938 if (Asm->isVerbose()) 2939 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" + 2940 Twine::utohexstr(Die->getOffset()) + ":0x" + 2941 Twine::utohexstr(Die->getSize()) + " " + 2942 dwarf::TagString(Abbrev->getTag())); 2943 Asm->EmitULEB128(AbbrevNumber); 2944 2945 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2946 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2947 2948 // Emit the DIE attribute values. 2949 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 2950 unsigned Attr = AbbrevData[i].getAttribute(); 2951 unsigned Form = AbbrevData[i].getForm(); 2952 assert(Form && "Too many attributes for DIE (check abbreviation)"); 2953 2954 if (Asm->isVerbose()) 2955 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr)); 2956 2957 switch (Attr) { 2958 case dwarf::DW_AT_sibling: 2959 Asm->EmitInt32(Die->getSiblingOffset()); 2960 break; 2961 case dwarf::DW_AT_abstract_origin: { 2962 DIEEntry *E = cast<DIEEntry>(Values[i]); 2963 DIE *Origin = E->getEntry(); 2964 unsigned Addr = Origin->getOffset(); 2965 Asm->EmitInt32(Addr); 2966 break; 2967 } 2968 case dwarf::DW_AT_ranges: { 2969 // DW_AT_range Value encodes offset in debug_range section. 2970 DIEInteger *V = cast<DIEInteger>(Values[i]); 2971 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym, 2972 V->getValue(), 2973 DwarfDebugRangeSectionSym, 2974 4); 2975 break; 2976 } 2977 case dwarf::DW_AT_location: { 2978 if (UseDotDebugLocEntry.count(Die) != 0) { 2979 DIELabel *L = cast<DIELabel>(Values[i]); 2980 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4); 2981 } else 2982 Values[i]->EmitValue(Asm, Form); 2983 break; 2984 } 2985 default: 2986 // Emit an attribute using the defined form. 2987 Values[i]->EmitValue(Asm, Form); 2988 break; 2989 } 2990 } 2991 2992 // Emit the DIE children if any. 2993 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 2994 const std::vector<DIE *> &Children = Die->getChildren(); 2995 2996 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2997 emitDIE(Children[j]); 2998 2999 if (Asm->isVerbose()) 3000 Asm->OutStreamer.AddComment("End Of Children Mark"); 3001 Asm->EmitInt8(0); 3002 } 3003} 3004 3005/// emitDebugInfo - Emit the debug info section. 3006/// 3007void DwarfDebug::emitDebugInfo() { 3008 // Start debug info section. 3009 Asm->OutStreamer.SwitchSection( 3010 Asm->getObjFileLowering().getDwarfInfoSection()); 3011 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 3012 E = CUMap.end(); I != E; ++I) { 3013 CompileUnit *TheCU = I->second; 3014 DIE *Die = TheCU->getCUDie(); 3015 3016 // Emit the compile units header. 3017 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin", 3018 TheCU->getID())); 3019 3020 // Emit size of content not including length itself 3021 unsigned ContentSize = Die->getSize() + 3022 sizeof(int16_t) + // DWARF version number 3023 sizeof(int32_t) + // Offset Into Abbrev. Section 3024 sizeof(int8_t) + // Pointer Size (in bytes) 3025 sizeof(int32_t); // FIXME - extra pad for gdb bug. 3026 3027 Asm->OutStreamer.AddComment("Length of Compilation Unit Info"); 3028 Asm->EmitInt32(ContentSize); 3029 Asm->OutStreamer.AddComment("DWARF version number"); 3030 Asm->EmitInt16(dwarf::DWARF_VERSION); 3031 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 3032 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), 3033 DwarfAbbrevSectionSym); 3034 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 3035 Asm->EmitInt8(Asm->getTargetData().getPointerSize()); 3036 3037 emitDIE(Die); 3038 // FIXME - extra padding for gdb bug. 3039 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB"); 3040 Asm->EmitInt8(0); 3041 Asm->EmitInt8(0); 3042 Asm->EmitInt8(0); 3043 Asm->EmitInt8(0); 3044 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID())); 3045 } 3046} 3047 3048/// emitAbbreviations - Emit the abbreviation section. 3049/// 3050void DwarfDebug::emitAbbreviations() const { 3051 // Check to see if it is worth the effort. 3052 if (!Abbreviations.empty()) { 3053 // Start the debug abbrev section. 3054 Asm->OutStreamer.SwitchSection( 3055 Asm->getObjFileLowering().getDwarfAbbrevSection()); 3056 3057 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin")); 3058 3059 // For each abbrevation. 3060 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 3061 // Get abbreviation data 3062 const DIEAbbrev *Abbrev = Abbreviations[i]; 3063 3064 // Emit the abbrevations code (base 1 index.) 3065 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code"); 3066 3067 // Emit the abbreviations data. 3068 Abbrev->Emit(Asm); 3069 } 3070 3071 // Mark end of abbreviations. 3072 Asm->EmitULEB128(0, "EOM(3)"); 3073 3074 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end")); 3075 } 3076} 3077 3078/// emitEndOfLineMatrix - Emit the last address of the section and the end of 3079/// the line matrix. 3080/// 3081void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 3082 // Define last address of section. 3083 Asm->OutStreamer.AddComment("Extended Op"); 3084 Asm->EmitInt8(0); 3085 3086 Asm->OutStreamer.AddComment("Op size"); 3087 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); 3088 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 3089 Asm->EmitInt8(dwarf::DW_LNE_set_address); 3090 3091 Asm->OutStreamer.AddComment("Section end label"); 3092 3093 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd), 3094 Asm->getTargetData().getPointerSize(), 3095 0/*AddrSpace*/); 3096 3097 // Mark end of matrix. 3098 Asm->OutStreamer.AddComment("DW_LNE_end_sequence"); 3099 Asm->EmitInt8(0); 3100 Asm->EmitInt8(1); 3101 Asm->EmitInt8(1); 3102} 3103 3104/// emitDebugLines - Emit source line information. 3105/// 3106void DwarfDebug::emitDebugLines() { 3107 // If the target is using .loc/.file, the assembler will be emitting the 3108 // .debug_line table automatically. 3109 if (Asm->MAI->hasDotLocAndDotFile()) 3110 return; 3111 3112 // Minimum line delta, thus ranging from -10..(255-10). 3113 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1); 3114 // Maximum line delta, thus ranging from -10..(255-10). 3115 const int MaxLineDelta = 255 + MinLineDelta; 3116 3117 // Start the dwarf line section. 3118 Asm->OutStreamer.SwitchSection( 3119 Asm->getObjFileLowering().getDwarfLineSection()); 3120 3121 // Construct the section header. 3122 Asm->OutStreamer.AddComment("Length of Source Line Info"); 3123 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"), 3124 Asm->GetTempSymbol("line_begin"), 4); 3125 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin")); 3126 3127 Asm->OutStreamer.AddComment("DWARF version number"); 3128 Asm->EmitInt16(dwarf::DWARF_VERSION); 3129 3130 Asm->OutStreamer.AddComment("Prolog Length"); 3131 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"), 3132 Asm->GetTempSymbol("line_prolog_begin"), 4); 3133 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin")); 3134 3135 Asm->OutStreamer.AddComment("Minimum Instruction Length"); 3136 Asm->EmitInt8(1); 3137 Asm->OutStreamer.AddComment("Default is_stmt_start flag"); 3138 Asm->EmitInt8(1); 3139 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)"); 3140 Asm->EmitInt8(MinLineDelta); 3141 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)"); 3142 Asm->EmitInt8(MaxLineDelta); 3143 Asm->OutStreamer.AddComment("Special Opcode Base"); 3144 Asm->EmitInt8(-MinLineDelta); 3145 3146 // Line number standard opcode encodings argument count 3147 Asm->OutStreamer.AddComment("DW_LNS_copy arg count"); 3148 Asm->EmitInt8(0); 3149 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count"); 3150 Asm->EmitInt8(1); 3151 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count"); 3152 Asm->EmitInt8(1); 3153 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count"); 3154 Asm->EmitInt8(1); 3155 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count"); 3156 Asm->EmitInt8(1); 3157 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count"); 3158 Asm->EmitInt8(0); 3159 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count"); 3160 Asm->EmitInt8(0); 3161 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count"); 3162 Asm->EmitInt8(0); 3163 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count"); 3164 Asm->EmitInt8(1); 3165 3166 // Emit directories. 3167 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) { 3168 const std::string &Dir = getSourceDirectoryName(DI); 3169 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory"); 3170 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0); 3171 } 3172 3173 Asm->OutStreamer.AddComment("End of directories"); 3174 Asm->EmitInt8(0); 3175 3176 // Emit files. 3177 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) { 3178 // Remember source id starts at 1. 3179 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI); 3180 const std::string &FN = getSourceFileName(Id.second); 3181 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source"); 3182 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0); 3183 3184 Asm->EmitULEB128(Id.first, "Directory #"); 3185 Asm->EmitULEB128(0, "Mod date"); 3186 Asm->EmitULEB128(0, "File size"); 3187 } 3188 3189 Asm->OutStreamer.AddComment("End of files"); 3190 Asm->EmitInt8(0); 3191 3192 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end")); 3193 3194 // A sequence for each text section. 3195 unsigned SecSrcLinesSize = SectionSourceLines.size(); 3196 3197 for (unsigned j = 0; j < SecSrcLinesSize; ++j) { 3198 // Isolate current sections line info. 3199 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j]; 3200 3201 // Dwarf assumes we start with first line of first source file. 3202 unsigned Source = 1; 3203 unsigned Line = 1; 3204 3205 // Construct rows of the address, source, line, column matrix. 3206 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) { 3207 const SrcLineInfo &LineInfo = LineInfos[i]; 3208 MCSymbol *Label = LineInfo.getLabel(); 3209 if (!Label->isDefined()) continue; // Not emitted, in dead code. 3210 3211 if (Asm->isVerbose()) { 3212 std::pair<unsigned, unsigned> SrcID = 3213 getSourceDirectoryAndFileIds(LineInfo.getSourceID()); 3214 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) + 3215 "/" + 3216 Twine(getSourceFileName(SrcID.second)) + 3217 ":" + Twine(LineInfo.getLine())); 3218 } 3219 3220 // Define the line address. 3221 Asm->OutStreamer.AddComment("Extended Op"); 3222 Asm->EmitInt8(0); 3223 Asm->OutStreamer.AddComment("Op size"); 3224 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1); 3225 3226 Asm->OutStreamer.AddComment("DW_LNE_set_address"); 3227 Asm->EmitInt8(dwarf::DW_LNE_set_address); 3228 3229 Asm->OutStreamer.AddComment("Location label"); 3230 Asm->OutStreamer.EmitSymbolValue(Label, 3231 Asm->getTargetData().getPointerSize(), 3232 0/*AddrSpace*/); 3233 3234 // If change of source, then switch to the new source. 3235 if (Source != LineInfo.getSourceID()) { 3236 Source = LineInfo.getSourceID(); 3237 Asm->OutStreamer.AddComment("DW_LNS_set_file"); 3238 Asm->EmitInt8(dwarf::DW_LNS_set_file); 3239 Asm->EmitULEB128(Source, "New Source"); 3240 } 3241 3242 // If change of line. 3243 if (Line != LineInfo.getLine()) { 3244 // Determine offset. 3245 int Offset = LineInfo.getLine() - Line; 3246 int Delta = Offset - MinLineDelta; 3247 3248 // Update line. 3249 Line = LineInfo.getLine(); 3250 3251 // If delta is small enough and in range... 3252 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) { 3253 // ... then use fast opcode. 3254 Asm->OutStreamer.AddComment("Line Delta"); 3255 Asm->EmitInt8(Delta - MinLineDelta); 3256 } else { 3257 // ... otherwise use long hand. 3258 Asm->OutStreamer.AddComment("DW_LNS_advance_line"); 3259 Asm->EmitInt8(dwarf::DW_LNS_advance_line); 3260 Asm->EmitSLEB128(Offset, "Line Offset"); 3261 Asm->OutStreamer.AddComment("DW_LNS_copy"); 3262 Asm->EmitInt8(dwarf::DW_LNS_copy); 3263 } 3264 } else { 3265 // Copy the previous row (different address or source) 3266 Asm->OutStreamer.AddComment("DW_LNS_copy"); 3267 Asm->EmitInt8(dwarf::DW_LNS_copy); 3268 } 3269 } 3270 3271 emitEndOfLineMatrix(j + 1); 3272 } 3273 3274 if (SecSrcLinesSize == 0) 3275 // Because we're emitting a debug_line section, we still need a line 3276 // table. The linker and friends expect it to exist. If there's nothing to 3277 // put into it, emit an empty table. 3278 emitEndOfLineMatrix(1); 3279 3280 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end")); 3281} 3282 3283/// emitCommonDebugFrame - Emit common frame info into a debug frame section. 3284/// 3285void DwarfDebug::emitCommonDebugFrame() { 3286 if (!Asm->MAI->doesDwarfRequireFrameSection()) 3287 return; 3288 3289 int stackGrowth = Asm->getTargetData().getPointerSize(); 3290 if (Asm->TM.getFrameInfo()->getStackGrowthDirection() == 3291 TargetFrameInfo::StackGrowsDown) 3292 stackGrowth *= -1; 3293 3294 // Start the dwarf frame section. 3295 Asm->OutStreamer.SwitchSection( 3296 Asm->getObjFileLowering().getDwarfFrameSection()); 3297 3298 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common")); 3299 Asm->OutStreamer.AddComment("Length of Common Information Entry"); 3300 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"), 3301 Asm->GetTempSymbol("debug_frame_common_begin"), 4); 3302 3303 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin")); 3304 Asm->OutStreamer.AddComment("CIE Identifier Tag"); 3305 Asm->EmitInt32((int)dwarf::DW_CIE_ID); 3306 Asm->OutStreamer.AddComment("CIE Version"); 3307 Asm->EmitInt8(dwarf::DW_CIE_VERSION); 3308 Asm->OutStreamer.AddComment("CIE Augmentation"); 3309 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator. 3310 Asm->EmitULEB128(1, "CIE Code Alignment Factor"); 3311 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor"); 3312 Asm->OutStreamer.AddComment("CIE RA Column"); 3313 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 3314 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); 3315 3316 std::vector<MachineMove> Moves; 3317 RI->getInitialFrameState(Moves); 3318 3319 Asm->EmitFrameMoves(Moves, 0, false); 3320 3321 Asm->EmitAlignment(2); 3322 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end")); 3323} 3324 3325/// emitFunctionDebugFrame - Emit per function frame info into a debug frame 3326/// section. 3327void DwarfDebug:: 3328emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { 3329 if (!Asm->MAI->doesDwarfRequireFrameSection()) 3330 return; 3331 3332 // Start the dwarf frame section. 3333 Asm->OutStreamer.SwitchSection( 3334 Asm->getObjFileLowering().getDwarfFrameSection()); 3335 3336 Asm->OutStreamer.AddComment("Length of Frame Information Entry"); 3337 MCSymbol *DebugFrameBegin = 3338 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number); 3339 MCSymbol *DebugFrameEnd = 3340 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number); 3341 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4); 3342 3343 Asm->OutStreamer.EmitLabel(DebugFrameBegin); 3344 3345 Asm->OutStreamer.AddComment("FDE CIE offset"); 3346 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"), 3347 DwarfFrameSectionSym); 3348 3349 Asm->OutStreamer.AddComment("FDE initial location"); 3350 MCSymbol *FuncBeginSym = 3351 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number); 3352 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym, 3353 Asm->getTargetData().getPointerSize(), 3354 0/*AddrSpace*/); 3355 3356 3357 Asm->OutStreamer.AddComment("FDE address range"); 3358 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number), 3359 FuncBeginSym, Asm->getTargetData().getPointerSize()); 3360 3361 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false); 3362 3363 Asm->EmitAlignment(2); 3364 Asm->OutStreamer.EmitLabel(DebugFrameEnd); 3365} 3366 3367/// emitDebugPubNames - Emit visible names into a debug pubnames section. 3368/// 3369void DwarfDebug::emitDebugPubNames() { 3370 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 3371 E = CUMap.end(); I != E; ++I) { 3372 CompileUnit *TheCU = I->second; 3373 // Start the dwarf pubnames section. 3374 Asm->OutStreamer.SwitchSection( 3375 Asm->getObjFileLowering().getDwarfPubNamesSection()); 3376 3377 Asm->OutStreamer.AddComment("Length of Public Names Info"); 3378 Asm->EmitLabelDifference( 3379 Asm->GetTempSymbol("pubnames_end", TheCU->getID()), 3380 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4); 3381 3382 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", 3383 TheCU->getID())); 3384 3385 Asm->OutStreamer.AddComment("DWARF Version"); 3386 Asm->EmitInt16(dwarf::DWARF_VERSION); 3387 3388 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 3389 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 3390 DwarfInfoSectionSym); 3391 3392 Asm->OutStreamer.AddComment("Compilation Unit Length"); 3393 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()), 3394 Asm->GetTempSymbol("info_begin", TheCU->getID()), 3395 4); 3396 3397 const StringMap<DIE*> &Globals = TheCU->getGlobals(); 3398 for (StringMap<DIE*>::const_iterator 3399 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 3400 const char *Name = GI->getKeyData(); 3401 DIE *Entity = GI->second; 3402 3403 Asm->OutStreamer.AddComment("DIE offset"); 3404 Asm->EmitInt32(Entity->getOffset()); 3405 3406 if (Asm->isVerbose()) 3407 Asm->OutStreamer.AddComment("External Name"); 3408 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0); 3409 } 3410 3411 Asm->OutStreamer.AddComment("End Mark"); 3412 Asm->EmitInt32(0); 3413 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", 3414 TheCU->getID())); 3415 } 3416} 3417 3418void DwarfDebug::emitDebugPubTypes() { 3419 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(), 3420 E = CUMap.end(); I != E; ++I) { 3421 CompileUnit *TheCU = I->second; 3422 // Start the dwarf pubnames section. 3423 Asm->OutStreamer.SwitchSection( 3424 Asm->getObjFileLowering().getDwarfPubTypesSection()); 3425 Asm->OutStreamer.AddComment("Length of Public Types Info"); 3426 Asm->EmitLabelDifference( 3427 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()), 3428 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4); 3429 3430 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin", 3431 TheCU->getID())); 3432 3433 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version"); 3434 Asm->EmitInt16(dwarf::DWARF_VERSION); 3435 3436 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info"); 3437 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 3438 DwarfInfoSectionSym); 3439 3440 Asm->OutStreamer.AddComment("Compilation Unit Length"); 3441 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()), 3442 Asm->GetTempSymbol("info_begin", TheCU->getID()), 3443 4); 3444 3445 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes(); 3446 for (StringMap<DIE*>::const_iterator 3447 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 3448 const char *Name = GI->getKeyData(); 3449 DIE * Entity = GI->second; 3450 3451 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 3452 Asm->EmitInt32(Entity->getOffset()); 3453 3454 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name"); 3455 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0); 3456 } 3457 3458 Asm->OutStreamer.AddComment("End Mark"); 3459 Asm->EmitInt32(0); 3460 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end", 3461 TheCU->getID())); 3462 } 3463} 3464 3465/// emitDebugStr - Emit visible names into a debug str section. 3466/// 3467void DwarfDebug::emitDebugStr() { 3468 // Check to see if it is worth the effort. 3469 if (StringPool.empty()) return; 3470 3471 // Start the dwarf str section. 3472 Asm->OutStreamer.SwitchSection( 3473 Asm->getObjFileLowering().getDwarfStrSection()); 3474 3475 // Get all of the string pool entries and put them in an array by their ID so 3476 // we can sort them. 3477 SmallVector<std::pair<unsigned, 3478 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; 3479 3480 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator 3481 I = StringPool.begin(), E = StringPool.end(); I != E; ++I) 3482 Entries.push_back(std::make_pair(I->second.second, &*I)); 3483 3484 array_pod_sort(Entries.begin(), Entries.end()); 3485 3486 for (unsigned i = 0, e = Entries.size(); i != e; ++i) { 3487 // Emit a label for reference from debug information entries. 3488 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first); 3489 3490 // Emit the string itself. 3491 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/); 3492 } 3493} 3494 3495/// emitDebugLoc - Emit visible names into a debug loc section. 3496/// 3497void DwarfDebug::emitDebugLoc() { 3498 if (DotDebugLocEntries.empty()) 3499 return; 3500 3501 // Start the dwarf loc section. 3502 Asm->OutStreamer.SwitchSection( 3503 Asm->getObjFileLowering().getDwarfLocSection()); 3504 unsigned char Size = Asm->getTargetData().getPointerSize(); 3505 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0)); 3506 unsigned index = 1; 3507 for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(), 3508 E = DotDebugLocEntries.end(); I != E; ++I, ++index) { 3509 DotDebugLocEntry Entry = *I; 3510 if (Entry.isEmpty()) { 3511 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 3512 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 3513 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); 3514 } else { 3515 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0); 3516 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0); 3517 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 3518 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false); 3519 if (Reg < 32) { 3520 Asm->OutStreamer.AddComment("Loc expr size"); 3521 Asm->EmitInt16(1); 3522 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg); 3523 } else { 3524 Asm->OutStreamer.AddComment("Loc expr size"); 3525 Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg)); 3526 Asm->EmitInt8(dwarf::DW_OP_regx); 3527 Asm->EmitULEB128(Reg); 3528 } 3529 } 3530 } 3531} 3532 3533/// EmitDebugARanges - Emit visible names into a debug aranges section. 3534/// 3535void DwarfDebug::EmitDebugARanges() { 3536 // Start the dwarf aranges section. 3537 Asm->OutStreamer.SwitchSection( 3538 Asm->getObjFileLowering().getDwarfARangesSection()); 3539} 3540 3541/// emitDebugRanges - Emit visible names into a debug ranges section. 3542/// 3543void DwarfDebug::emitDebugRanges() { 3544 // Start the dwarf ranges section. 3545 Asm->OutStreamer.SwitchSection( 3546 Asm->getObjFileLowering().getDwarfRangesSection()); 3547 unsigned char Size = Asm->getTargetData().getPointerSize(); 3548 for (SmallVector<const MCSymbol *, 8>::iterator 3549 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 3550 I != E; ++I) { 3551 if (*I) 3552 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0); 3553 else 3554 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0); 3555 } 3556} 3557 3558/// emitDebugMacInfo - Emit visible names into a debug macinfo section. 3559/// 3560void DwarfDebug::emitDebugMacInfo() { 3561 if (const MCSection *LineInfo = 3562 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 3563 // Start the dwarf macinfo section. 3564 Asm->OutStreamer.SwitchSection(LineInfo); 3565 } 3566} 3567 3568/// emitDebugInlineInfo - Emit inline info using following format. 3569/// Section Header: 3570/// 1. length of section 3571/// 2. Dwarf version number 3572/// 3. address size. 3573/// 3574/// Entries (one "entry" for each function that was inlined): 3575/// 3576/// 1. offset into __debug_str section for MIPS linkage name, if exists; 3577/// otherwise offset into __debug_str for regular function name. 3578/// 2. offset into __debug_str section for regular function name. 3579/// 3. an unsigned LEB128 number indicating the number of distinct inlining 3580/// instances for the function. 3581/// 3582/// The rest of the entry consists of a {die_offset, low_pc} pair for each 3583/// inlined instance; the die_offset points to the inlined_subroutine die in the 3584/// __debug_info section, and the low_pc is the starting address for the 3585/// inlining instance. 3586void DwarfDebug::emitDebugInlineInfo() { 3587 if (!Asm->MAI->doesDwarfUsesInlineInfoSection()) 3588 return; 3589 3590 if (!FirstCU) 3591 return; 3592 3593 Asm->OutStreamer.SwitchSection( 3594 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 3595 3596 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry"); 3597 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1), 3598 Asm->GetTempSymbol("debug_inlined_begin", 1), 4); 3599 3600 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1)); 3601 3602 Asm->OutStreamer.AddComment("Dwarf Version"); 3603 Asm->EmitInt16(dwarf::DWARF_VERSION); 3604 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 3605 Asm->EmitInt8(Asm->getTargetData().getPointerSize()); 3606 3607 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 3608 E = InlinedSPNodes.end(); I != E; ++I) { 3609 3610 const MDNode *Node = *I; 3611 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 3612 = InlineInfo.find(Node); 3613 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 3614 DISubprogram SP(Node); 3615 StringRef LName = SP.getLinkageName(); 3616 StringRef Name = SP.getName(); 3617 3618 Asm->OutStreamer.AddComment("MIPS linkage name"); 3619 if (LName.empty()) { 3620 Asm->OutStreamer.EmitBytes(Name, 0); 3621 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator. 3622 } else 3623 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)), 3624 DwarfStrSectionSym); 3625 3626 Asm->OutStreamer.AddComment("Function name"); 3627 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym); 3628 Asm->EmitULEB128(Labels.size(), "Inline count"); 3629 3630 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 3631 LE = Labels.end(); LI != LE; ++LI) { 3632 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset"); 3633 Asm->EmitInt32(LI->second->getOffset()); 3634 3635 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc"); 3636 Asm->OutStreamer.EmitSymbolValue(LI->first, 3637 Asm->getTargetData().getPointerSize(),0); 3638 } 3639 } 3640 3641 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1)); 3642} 3643