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