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