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