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