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