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