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