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