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