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