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