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