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