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