DwarfDebug.cpp revision ba1d8264e65b37146dbc26c71c748b5c7020ae88
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 = NULL; 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/// createGlobalVariableDIE - Create new DIE using GV. 1036DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) { 1037 // If the global variable was optmized out then no need to create debug info 1038 // entry. 1039 if (!GV.getGlobal()) return NULL; 1040 if (GV.getDisplayName().empty()) return NULL; 1041 1042 DIE *GVDie = new DIE(dwarf::DW_TAG_variable); 1043 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 1044 GV.getDisplayName()); 1045 1046 StringRef LinkageName = GV.getLinkageName(); 1047 if (!LinkageName.empty()) { 1048 // Skip special LLVM prefix that is used to inform the asm printer to not 1049 // emit usual symbol prefix before the symbol name. This happens for 1050 // Objective-C symbol names and symbol whose name is replaced using GCC's 1051 // __asm__ attribute. 1052 if (LinkageName[0] == 1) 1053 LinkageName = LinkageName.substr(1); 1054 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1055 LinkageName); 1056 } 1057 addType(GVDie, GV.getType()); 1058 if (!GV.isLocalToUnit()) 1059 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1060 addSourceLine(GVDie, &GV); 1061 1062 return GVDie; 1063} 1064 1065/// createMemberDIE - Create new member DIE. 1066DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) { 1067 DIE *MemberDie = new DIE(DT.getTag()); 1068 StringRef Name = DT.getName(); 1069 if (!Name.empty()) 1070 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1071 1072 addType(MemberDie, DT.getTypeDerivedFrom()); 1073 1074 addSourceLine(MemberDie, &DT); 1075 1076 DIEBlock *MemLocationDie = new DIEBlock(); 1077 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1078 1079 uint64_t Size = DT.getSizeInBits(); 1080 uint64_t FieldSize = DT.getOriginalTypeSize(); 1081 1082 if (Size != FieldSize) { 1083 // Handle bitfield. 1084 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1085 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1086 1087 uint64_t Offset = DT.getOffsetInBits(); 1088 uint64_t FieldOffset = Offset; 1089 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1090 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1091 FieldOffset = (HiMark - FieldSize); 1092 Offset -= FieldOffset; 1093 1094 // Maybe we need to work from the other end. 1095 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size); 1096 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1097 1098 // Here WD_AT_data_member_location points to the anonymous 1099 // field that includes this bit field. 1100 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1101 1102 } else 1103 // This is not a bitfield. 1104 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1105 1106 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1107 1108 if (DT.isProtected()) 1109 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1110 dwarf::DW_ACCESS_protected); 1111 else if (DT.isPrivate()) 1112 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1113 dwarf::DW_ACCESS_private); 1114 else if (DT.getTag() == dwarf::DW_TAG_inheritance) 1115 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1116 dwarf::DW_ACCESS_public); 1117 if (DT.isVirtual()) 1118 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, 1119 dwarf::DW_VIRTUALITY_virtual); 1120 return MemberDie; 1121} 1122 1123/// createSubprogramDIE - Create new DIE using SP. 1124DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) { 1125 DIE *SPDie = ModuleCU->getDIE(SP.getNode()); 1126 if (SPDie) 1127 return SPDie; 1128 1129 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1130 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName()); 1131 1132 StringRef LinkageName = SP.getLinkageName(); 1133 if (!LinkageName.empty()) { 1134 // Skip special LLVM prefix that is used to inform the asm printer to not 1135 // emit usual symbol prefix before the symbol name. This happens for 1136 // Objective-C symbol names and symbol whose name is replaced using GCC's 1137 // __asm__ attribute. 1138 if (LinkageName[0] == 1) 1139 LinkageName = LinkageName.substr(1); 1140 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1141 LinkageName); 1142 } 1143 addSourceLine(SPDie, &SP); 1144 1145 // Add prototyped tag, if C or ObjC. 1146 unsigned Lang = SP.getCompileUnit().getLanguage(); 1147 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 || 1148 Lang == dwarf::DW_LANG_ObjC) 1149 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 1150 1151 // Add Return Type. 1152 DICompositeType SPTy = SP.getType(); 1153 DIArray Args = SPTy.getTypeArray(); 1154 unsigned SPTag = SPTy.getTag(); 1155 1156 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type) 1157 addType(SPDie, SPTy); 1158 else 1159 addType(SPDie, DIType(Args.getElement(0).getNode())); 1160 1161 unsigned VK = SP.getVirtuality(); 1162 if (VK) { 1163 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK); 1164 DIEBlock *Block = new DIEBlock(); 1165 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1166 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex()); 1167 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1168 ContainingTypeMap.insert(std::make_pair(SPDie, WeakVH(SP.getContainingType().getNode()))); 1169 } 1170 1171 if (MakeDecl || !SP.isDefinition()) { 1172 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1173 1174 // Add arguments. Do not add arguments for subprogram definition. They will 1175 // be handled while processing variables. 1176 DICompositeType SPTy = SP.getType(); 1177 DIArray Args = SPTy.getTypeArray(); 1178 unsigned SPTag = SPTy.getTag(); 1179 1180 if (SPTag == dwarf::DW_TAG_subroutine_type) 1181 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1182 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1183 addType(Arg, DIType(Args.getElement(i).getNode())); 1184 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ?? 1185 SPDie->addChild(Arg); 1186 } 1187 } 1188 1189 // DW_TAG_inlined_subroutine may refer to this DIE. 1190 ModuleCU->insertDIE(SP.getNode(), SPDie); 1191 return SPDie; 1192} 1193 1194/// findCompileUnit - Get the compile unit for the given descriptor. 1195/// 1196CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) { 1197 DenseMap<Value *, CompileUnit *>::const_iterator I = 1198 CompileUnitMap.find(Unit.getNode()); 1199 if (I == CompileUnitMap.end()) 1200 return constructCompileUnit(Unit.getNode()); 1201 return I->second; 1202} 1203 1204/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction. 1205/// Initialize scope and update scope hierarchy. 1206DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI, 1207 MDNode *InlinedAt) { 1208 assert (N && "Invalid Scope encoding!"); 1209 assert (MI && "Missing machine instruction!"); 1210 bool GetConcreteScope = (MI && InlinedAt); 1211 1212 DbgScope *NScope = NULL; 1213 1214 if (InlinedAt) 1215 NScope = DbgScopeMap.lookup(InlinedAt); 1216 else 1217 NScope = DbgScopeMap.lookup(N); 1218 assert (NScope && "Unable to find working scope!"); 1219 1220 if (NScope->getFirstInsn()) 1221 return NScope; 1222 1223 DbgScope *Parent = NULL; 1224 if (GetConcreteScope) { 1225 DILocation IL(InlinedAt); 1226 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI, 1227 IL.getOrigLocation().getNode()); 1228 assert (Parent && "Unable to find Parent scope!"); 1229 NScope->setParent(Parent); 1230 Parent->addScope(NScope); 1231 } else if (DIDescriptor(N).isLexicalBlock()) { 1232 DILexicalBlock DB(N); 1233 if (!DB.getContext().isNull()) { 1234 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt); 1235 NScope->setParent(Parent); 1236 Parent->addScope(NScope); 1237 } 1238 } 1239 1240 NScope->setFirstInsn(MI); 1241 1242 if (!Parent && !InlinedAt) { 1243 StringRef SPName = DISubprogram(N).getLinkageName(); 1244 if (SPName == MF->getFunction()->getName()) 1245 CurrentFnDbgScope = NScope; 1246 } 1247 1248 if (GetConcreteScope) { 1249 ConcreteScopes[InlinedAt] = NScope; 1250 getOrCreateAbstractScope(N); 1251 } 1252 1253 return NScope; 1254} 1255 1256DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) { 1257 assert (N && "Invalid Scope encoding!"); 1258 1259 DbgScope *AScope = AbstractScopes.lookup(N); 1260 if (AScope) 1261 return AScope; 1262 1263 DbgScope *Parent = NULL; 1264 1265 DIDescriptor Scope(N); 1266 if (Scope.isLexicalBlock()) { 1267 DILexicalBlock DB(N); 1268 DIDescriptor ParentDesc = DB.getContext(); 1269 if (!ParentDesc.isNull()) 1270 Parent = getOrCreateAbstractScope(ParentDesc.getNode()); 1271 } 1272 1273 AScope = new DbgScope(Parent, DIDescriptor(N), NULL); 1274 1275 if (Parent) 1276 Parent->addScope(AScope); 1277 AScope->setAbstractScope(); 1278 AbstractScopes[N] = AScope; 1279 if (DIDescriptor(N).isSubprogram()) 1280 AbstractScopesList.push_back(AScope); 1281 return AScope; 1282} 1283 1284/// updateSubprogramScopeDIE - Find DIE for the given subprogram and 1285/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 1286/// If there are global variables in this scope then create and insert 1287/// DIEs for these variables. 1288DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) { 1289 1290 DIE *SPDie = ModuleCU->getDIE(SPNode); 1291 assert (SPDie && "Unable to find subprogram DIE!"); 1292 DISubprogram SP(SPNode); 1293 if (SP.isDefinition() && !SP.getContext().isCompileUnit()) { 1294 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1295 // Add arguments. 1296 DICompositeType SPTy = SP.getType(); 1297 DIArray Args = SPTy.getTypeArray(); 1298 unsigned SPTag = SPTy.getTag(); 1299 if (SPTag == dwarf::DW_TAG_subroutine_type) 1300 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1301 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1302 addType(Arg, DIType(Args.getElement(i).getNode())); 1303 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ?? 1304 SPDie->addChild(Arg); 1305 } 1306 DIE *SPDeclDie = SPDie; 1307 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1308 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 1309 SPDeclDie); 1310 ModuleCU->addDie(SPDie); 1311 } 1312 1313 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1314 DWLabel("func_begin", SubprogramCount)); 1315 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1316 DWLabel("func_end", SubprogramCount)); 1317 MachineLocation Location(RI->getFrameRegister(*MF)); 1318 addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 1319 1320 if (!DISubprogram(SPNode).isLocalToUnit()) 1321 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1322 1323 return SPDie; 1324} 1325 1326/// constructLexicalScope - Construct new DW_TAG_lexical_block 1327/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 1328DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) { 1329 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID()); 1330 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID()); 1331 1332 // Ignore empty scopes. 1333 if (StartID == EndID && StartID != 0) 1334 return NULL; 1335 1336 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 1337 if (Scope->isAbstractScope()) 1338 return ScopeDIE; 1339 1340 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1341 StartID ? 1342 DWLabel("label", StartID) 1343 : DWLabel("func_begin", SubprogramCount)); 1344 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1345 EndID ? 1346 DWLabel("label", EndID) 1347 : DWLabel("func_end", SubprogramCount)); 1348 1349 1350 1351 return ScopeDIE; 1352} 1353 1354/// constructInlinedScopeDIE - This scope represents inlined body of 1355/// a function. Construct DIE to represent this concrete inlined copy 1356/// of the function. 1357DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) { 1358 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID()); 1359 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID()); 1360 assert (StartID && "Invalid starting label for an inlined scope!"); 1361 assert (EndID && "Invalid end label for an inlined scope!"); 1362 // Ignore empty scopes. 1363 if (StartID == EndID && StartID != 0) 1364 return NULL; 1365 1366 DIScope DS(Scope->getScopeNode()); 1367 if (DS.isNull()) 1368 return NULL; 1369 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 1370 1371 DISubprogram InlinedSP = getDISubprogram(DS.getNode()); 1372 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode()); 1373 assert (OriginDIE && "Unable to find Origin DIE!"); 1374 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 1375 dwarf::DW_FORM_ref4, OriginDIE); 1376 1377 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1378 DWLabel("label", StartID)); 1379 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1380 DWLabel("label", EndID)); 1381 1382 InlinedSubprogramDIEs.insert(OriginDIE); 1383 1384 // Track the start label for this inlined function. 1385 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 1386 I = InlineInfo.find(InlinedSP.getNode()); 1387 1388 if (I == InlineInfo.end()) { 1389 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID, 1390 ScopeDIE)); 1391 InlinedSPNodes.push_back(InlinedSP.getNode()); 1392 } else 1393 I->second.push_back(std::make_pair(StartID, ScopeDIE)); 1394 1395 StringPool.insert(InlinedSP.getName()); 1396 StringRef LinkageName = InlinedSP.getLinkageName(); 1397 if (!LinkageName.empty()) { 1398 // Skip special LLVM prefix that is used to inform the asm printer to not 1399 // emit usual symbol prefix before the symbol name. This happens for 1400 // Objective-C symbol names and symbol whose name is replaced using GCC's 1401 // __asm__ attribute. 1402 if (LinkageName[0] == 1) 1403 LinkageName = LinkageName.substr(1); 1404 } 1405 StringPool.insert(LinkageName); 1406 DILocation DL(Scope->getInlinedAt()); 1407 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID()); 1408 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 1409 1410 return ScopeDIE; 1411} 1412 1413 1414/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1415DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) { 1416 // Get the descriptor. 1417 const DIVariable &VD = DV->getVariable(); 1418 StringRef Name = VD.getName(); 1419 if (Name.empty()) 1420 return NULL; 1421 1422 // Translate tag to proper Dwarf tag. The result variable is dropped for 1423 // now. 1424 unsigned Tag; 1425 switch (VD.getTag()) { 1426 case dwarf::DW_TAG_return_variable: 1427 return NULL; 1428 case dwarf::DW_TAG_arg_variable: 1429 Tag = dwarf::DW_TAG_formal_parameter; 1430 break; 1431 case dwarf::DW_TAG_auto_variable: // fall thru 1432 default: 1433 Tag = dwarf::DW_TAG_variable; 1434 break; 1435 } 1436 1437 // Define variable debug information entry. 1438 DIE *VariableDie = new DIE(Tag); 1439 1440 1441 DIE *AbsDIE = NULL; 1442 if (DbgVariable *AV = DV->getAbstractVariable()) 1443 AbsDIE = AV->getDIE(); 1444 1445 if (AbsDIE) { 1446 DIScope DS(Scope->getScopeNode()); 1447 DISubprogram InlinedSP = getDISubprogram(DS.getNode()); 1448 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode()); 1449 (void) OriginSPDIE; 1450 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!"); 1451 DIE *AbsDIE = DV->getAbstractVariable()->getDIE(); 1452 assert (AbsDIE && "Unable to find Origin DIE for the Variable!"); 1453 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1454 dwarf::DW_FORM_ref4, AbsDIE); 1455 } 1456 else { 1457 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1458 addSourceLine(VariableDie, &VD); 1459 1460 // Add variable type. 1461 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 1462 // addresses instead. 1463 if (VD.isBlockByrefVariable()) 1464 addType(VariableDie, getBlockByrefType(VD.getType(), Name)); 1465 else 1466 addType(VariableDie, VD.getType()); 1467 } 1468 1469 // Add variable address. 1470 if (!Scope->isAbstractScope()) { 1471 MachineLocation Location; 1472 unsigned FrameReg; 1473 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg); 1474 Location.set(FrameReg, Offset); 1475 1476 if (VD.hasComplexAddress()) 1477 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1478 else if (VD.isBlockByrefVariable()) 1479 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1480 else 1481 addAddress(VariableDie, dwarf::DW_AT_location, Location); 1482 } 1483 DV->setDIE(VariableDie); 1484 return VariableDie; 1485 1486} 1487 1488void DwarfDebug::addPubTypes(DISubprogram SP) { 1489 DICompositeType SPTy = SP.getType(); 1490 unsigned SPTag = SPTy.getTag(); 1491 if (SPTag != dwarf::DW_TAG_subroutine_type) 1492 return; 1493 1494 DIArray Args = SPTy.getTypeArray(); 1495 if (Args.isNull()) 1496 return; 1497 1498 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 1499 DIType ATy(Args.getElement(i).getNode()); 1500 if (ATy.isNull()) 1501 continue; 1502 DICompositeType CATy = getDICompositeType(ATy); 1503 if (!CATy.isNull() && !CATy.getName().empty()) { 1504 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode())) 1505 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry()); 1506 } 1507 } 1508} 1509 1510/// constructScopeDIE - Construct a DIE for this scope. 1511DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) { 1512 if (!Scope) 1513 return NULL; 1514 DIScope DS(Scope->getScopeNode()); 1515 if (DS.isNull()) 1516 return NULL; 1517 1518 DIE *ScopeDIE = NULL; 1519 if (Scope->getInlinedAt()) 1520 ScopeDIE = constructInlinedScopeDIE(Scope); 1521 else if (DS.isSubprogram()) { 1522 if (Scope->isAbstractScope()) 1523 ScopeDIE = ModuleCU->getDIE(DS.getNode()); 1524 else 1525 ScopeDIE = updateSubprogramScopeDIE(DS.getNode()); 1526 } 1527 else { 1528 ScopeDIE = constructLexicalScopeDIE(Scope); 1529 if (!ScopeDIE) return NULL; 1530 } 1531 1532 // Add variables to scope. 1533 SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables(); 1534 for (unsigned i = 0, N = Variables.size(); i < N; ++i) { 1535 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope); 1536 if (VariableDIE) 1537 ScopeDIE->addChild(VariableDIE); 1538 } 1539 1540 // Add nested scopes. 1541 SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes(); 1542 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) { 1543 // Define the Scope debug information entry. 1544 DIE *NestedDIE = constructScopeDIE(Scopes[j]); 1545 if (NestedDIE) 1546 ScopeDIE->addChild(NestedDIE); 1547 } 1548 1549 if (DS.isSubprogram()) 1550 addPubTypes(DISubprogram(DS.getNode())); 1551 1552 return ScopeDIE; 1553} 1554 1555/// GetOrCreateSourceID - Look up the source id with the given directory and 1556/// source file names. If none currently exists, create a new id and insert it 1557/// in the SourceIds map. This can update DirectoryNames and SourceFileNames 1558/// maps as well. 1559unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) { 1560 unsigned DId; 1561 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName); 1562 if (DI != DirectoryIdMap.end()) { 1563 DId = DI->getValue(); 1564 } else { 1565 DId = DirectoryNames.size() + 1; 1566 DirectoryIdMap[DirName] = DId; 1567 DirectoryNames.push_back(DirName); 1568 } 1569 1570 unsigned FId; 1571 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName); 1572 if (FI != SourceFileIdMap.end()) { 1573 FId = FI->getValue(); 1574 } else { 1575 FId = SourceFileNames.size() + 1; 1576 SourceFileIdMap[FileName] = FId; 1577 SourceFileNames.push_back(FileName); 1578 } 1579 1580 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI = 1581 SourceIdMap.find(std::make_pair(DId, FId)); 1582 if (SI != SourceIdMap.end()) 1583 return SI->second; 1584 1585 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0. 1586 SourceIdMap[std::make_pair(DId, FId)] = SrcId; 1587 SourceIds.push_back(std::make_pair(DId, FId)); 1588 1589 return SrcId; 1590} 1591 1592/// getOrCreateNameSpace - Create a DIE for DINameSpace. 1593DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) { 1594 DIE *NDie = ModuleCU->getDIE(NS.getNode()); 1595 if (NDie) 1596 return NDie; 1597 NDie = new DIE(dwarf::DW_TAG_namespace); 1598 ModuleCU->insertDIE(NS.getNode(), NDie); 1599 if (!NS.getName().empty()) 1600 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName()); 1601 addSourceLine(NDie, &NS); 1602 addToContextOwner(NDie, NS.getContext()); 1603 return NDie; 1604} 1605 1606CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) { 1607 DICompileUnit DIUnit(N); 1608 StringRef FN = DIUnit.getFilename(); 1609 StringRef Dir = DIUnit.getDirectory(); 1610 unsigned ID = GetOrCreateSourceID(Dir, FN); 1611 1612 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 1613 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 1614 DWLabel("section_line", 0), DWLabel("section_line", 0), 1615 false); 1616 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string, 1617 DIUnit.getProducer()); 1618 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1, 1619 DIUnit.getLanguage()); 1620 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN); 1621 1622 if (!Dir.empty()) 1623 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir); 1624 if (DIUnit.isOptimized()) 1625 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 1626 1627 StringRef Flags = DIUnit.getFlags(); 1628 if (!Flags.empty()) 1629 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags); 1630 1631 unsigned RVer = DIUnit.getRunTimeVersion(); 1632 if (RVer) 1633 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 1634 dwarf::DW_FORM_data1, RVer); 1635 1636 CompileUnit *Unit = new CompileUnit(ID, Die); 1637 if (!ModuleCU && DIUnit.isMain()) { 1638 // Use first compile unit marked as isMain as the compile unit 1639 // for this module. 1640 ModuleCU = Unit; 1641 } 1642 1643 CompileUnitMap[DIUnit.getNode()] = Unit; 1644 CompileUnits.push_back(Unit); 1645 return Unit; 1646} 1647 1648void DwarfDebug::constructGlobalVariableDIE(MDNode *N) { 1649 DIGlobalVariable DI_GV(N); 1650 1651 // If debug information is malformed then ignore it. 1652 if (DI_GV.Verify() == false) 1653 return; 1654 1655 // Check for pre-existence. 1656 if (ModuleCU->getDIE(DI_GV.getNode())) 1657 return; 1658 1659 DIE *VariableDie = createGlobalVariableDIE(DI_GV); 1660 if (!VariableDie) 1661 return; 1662 1663 // Add to map. 1664 ModuleCU->insertDIE(N, VariableDie); 1665 1666 // Add to context owner. 1667 if (DI_GV.isDefinition() 1668 && !DI_GV.getContext().isCompileUnit()) { 1669 // Create specification DIE. 1670 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 1671 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 1672 dwarf::DW_FORM_ref4, VariableDie); 1673 DIEBlock *Block = new DIEBlock(); 1674 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 1675 addObjectLabel(Block, 0, dwarf::DW_FORM_udata, 1676 Asm->Mang->getMangledName(DI_GV.getGlobal())); 1677 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 1678 ModuleCU->addDie(VariableSpecDIE); 1679 } else { 1680 DIEBlock *Block = new DIEBlock(); 1681 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 1682 addObjectLabel(Block, 0, dwarf::DW_FORM_udata, 1683 Asm->Mang->getMangledName(DI_GV.getGlobal())); 1684 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block); 1685 } 1686 addToContextOwner(VariableDie, DI_GV.getContext()); 1687 1688 // Expose as global. FIXME - need to check external flag. 1689 ModuleCU->addGlobal(DI_GV.getName(), VariableDie); 1690 1691 DIType GTy = DI_GV.getType(); 1692 if (GTy.isCompositeType() && !GTy.getName().empty()) { 1693 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode()); 1694 assert (Entry && "Missing global type!"); 1695 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry()); 1696 } 1697 return; 1698} 1699 1700void DwarfDebug::constructSubprogramDIE(MDNode *N) { 1701 DISubprogram SP(N); 1702 1703 // Check for pre-existence. 1704 if (ModuleCU->getDIE(N)) 1705 return; 1706 1707 if (!SP.isDefinition()) 1708 // This is a method declaration which will be handled while constructing 1709 // class type. 1710 return; 1711 1712 DIE *SubprogramDie = createSubprogramDIE(SP); 1713 1714 // Add to map. 1715 ModuleCU->insertDIE(N, SubprogramDie); 1716 1717 // Add to context owner. 1718 addToContextOwner(SubprogramDie, SP.getContext()); 1719 1720 // Expose as global. 1721 ModuleCU->addGlobal(SP.getName(), SubprogramDie); 1722 1723 return; 1724} 1725 1726/// beginModule - Emit all Dwarf sections that should come prior to the 1727/// content. Create global DIEs and emit initial debug info sections. 1728/// This is inovked by the target AsmPrinter. 1729void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) { 1730 this->M = M; 1731 1732 if (TimePassesIsEnabled) 1733 DebugTimer->startTimer(); 1734 1735 if (!MAI->doesSupportDebugInformation()) 1736 return; 1737 1738 DebugInfoFinder DbgFinder; 1739 DbgFinder.processModule(*M); 1740 1741 // Create all the compile unit DIEs. 1742 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 1743 E = DbgFinder.compile_unit_end(); I != E; ++I) 1744 constructCompileUnit(*I); 1745 1746 if (CompileUnits.empty()) { 1747 if (TimePassesIsEnabled) 1748 DebugTimer->stopTimer(); 1749 1750 return; 1751 } 1752 1753 // If main compile unit for this module is not seen than randomly 1754 // select first compile unit. 1755 if (!ModuleCU) 1756 ModuleCU = CompileUnits[0]; 1757 1758 // Create DIEs for each subprogram. 1759 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), 1760 E = DbgFinder.subprogram_end(); I != E; ++I) 1761 constructSubprogramDIE(*I); 1762 1763 // Create DIEs for each global variable. 1764 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), 1765 E = DbgFinder.global_variable_end(); I != E; ++I) 1766 constructGlobalVariableDIE(*I); 1767 1768 MMI = mmi; 1769 shouldEmit = true; 1770 MMI->setDebugInfoAvailability(true); 1771 1772 // Prime section data. 1773 SectionMap.insert(Asm->getObjFileLowering().getTextSection()); 1774 1775 // Print out .file directives to specify files for .loc directives. These are 1776 // printed out early so that they precede any .loc directives. 1777 if (MAI->hasDotLocAndDotFile()) { 1778 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) { 1779 // Remember source id starts at 1. 1780 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i); 1781 sys::Path FullPath(getSourceDirectoryName(Id.first)); 1782 bool AppendOk = 1783 FullPath.appendComponent(getSourceFileName(Id.second)); 1784 assert(AppendOk && "Could not append filename to directory!"); 1785 AppendOk = false; 1786 Asm->EmitFile(i, FullPath.str()); 1787 Asm->EOL(); 1788 } 1789 } 1790 1791 // Emit initial sections 1792 emitInitial(); 1793 1794 if (TimePassesIsEnabled) 1795 DebugTimer->stopTimer(); 1796} 1797 1798/// endModule - Emit all Dwarf sections that should come after the content. 1799/// 1800void DwarfDebug::endModule() { 1801 if (!ModuleCU) 1802 return; 1803 1804 if (TimePassesIsEnabled) 1805 DebugTimer->startTimer(); 1806 1807 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 1808 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(), 1809 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) { 1810 DIE *ISP = *AI; 1811 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 1812 } 1813 1814 // Insert top level DIEs. 1815 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(), 1816 TE = TopLevelDIEsVector.end(); TI != TE; ++TI) 1817 ModuleCU->getCUDie()->addChild(*TI); 1818 1819 for (DenseMap<DIE *, WeakVH>::iterator CI = ContainingTypeMap.begin(), 1820 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1821 DIE *SPDie = CI->first; 1822 MDNode *N = dyn_cast_or_null<MDNode>(CI->second); 1823 if (!N) continue; 1824 DIE *NDie = ModuleCU->getDIE(N); 1825 if (!NDie) continue; 1826 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1827 addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1828 } 1829 1830 // Standard sections final addresses. 1831 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection()); 1832 EmitLabel("text_end", 0); 1833 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection()); 1834 EmitLabel("data_end", 0); 1835 1836 // End text sections. 1837 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) { 1838 Asm->OutStreamer.SwitchSection(SectionMap[i]); 1839 EmitLabel("section_end", i); 1840 } 1841 1842 // Emit common frame information. 1843 emitCommonDebugFrame(); 1844 1845 // Emit function debug frame information 1846 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(), 1847 E = DebugFrames.end(); I != E; ++I) 1848 emitFunctionDebugFrame(*I); 1849 1850 // Compute DIE offsets and sizes. 1851 computeSizeAndOffsets(); 1852 1853 // Emit all the DIEs into a debug info section 1854 emitDebugInfo(); 1855 1856 // Corresponding abbreviations into a abbrev section. 1857 emitAbbreviations(); 1858 1859 // Emit source line correspondence into a debug line section. 1860 emitDebugLines(); 1861 1862 // Emit info into a debug pubnames section. 1863 emitDebugPubNames(); 1864 1865 // Emit info into a debug pubtypes section. 1866 emitDebugPubTypes(); 1867 1868 // Emit info into a debug str section. 1869 emitDebugStr(); 1870 1871 // Emit info into a debug loc section. 1872 emitDebugLoc(); 1873 1874 // Emit info into a debug aranges section. 1875 EmitDebugARanges(); 1876 1877 // Emit info into a debug ranges section. 1878 emitDebugRanges(); 1879 1880 // Emit info into a debug macinfo section. 1881 emitDebugMacInfo(); 1882 1883 // Emit inline info. 1884 emitDebugInlineInfo(); 1885 1886 if (TimePassesIsEnabled) 1887 DebugTimer->stopTimer(); 1888} 1889 1890/// findAbstractVariable - Find abstract variable, if any, associated with Var. 1891DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, 1892 unsigned FrameIdx, 1893 DILocation &ScopeLoc) { 1894 1895 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode()); 1896 if (AbsDbgVariable) 1897 return AbsDbgVariable; 1898 1899 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode()); 1900 if (!Scope) 1901 return NULL; 1902 1903 AbsDbgVariable = new DbgVariable(Var, FrameIdx); 1904 Scope->addVariable(AbsDbgVariable); 1905 AbstractVariables[Var.getNode()] = AbsDbgVariable; 1906 return AbsDbgVariable; 1907} 1908 1909/// collectVariableInfo - Populate DbgScope entries with variables' info. 1910void DwarfDebug::collectVariableInfo() { 1911 if (!MMI) return; 1912 1913 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 1914 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 1915 VE = VMap.end(); VI != VE; ++VI) { 1916 MetadataBase *MB = VI->first; 1917 MDNode *Var = dyn_cast_or_null<MDNode>(MB); 1918 if (!Var) continue; 1919 DIVariable DV (Var); 1920 std::pair< unsigned, MDNode *> VP = VI->second; 1921 DILocation ScopeLoc(VP.second); 1922 1923 DbgScope *Scope = 1924 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode()); 1925 if (!Scope) 1926 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode()); 1927 // If variable scope is not found then skip this variable. 1928 if (!Scope) 1929 continue; 1930 1931 DbgVariable *RegVar = new DbgVariable(DV, VP.first); 1932 Scope->addVariable(RegVar); 1933 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, 1934 ScopeLoc)) 1935 RegVar->setAbstractVariable(AbsDbgVariable); 1936 } 1937} 1938 1939/// beginScope - Process beginning of a scope starting at Label. 1940void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) { 1941 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI); 1942 if (I == DbgScopeBeginMap.end()) 1943 return; 1944 ScopeVector &SD = I->second; 1945 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end(); 1946 SDI != SDE; ++SDI) 1947 (*SDI)->setStartLabelID(Label); 1948} 1949 1950/// endScope - Process end of a scope. 1951void DwarfDebug::endScope(const MachineInstr *MI) { 1952 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI); 1953 if (I == DbgScopeEndMap.end()) 1954 return; 1955 1956 unsigned Label = MMI->NextLabelID(); 1957 Asm->printLabel(Label); 1958 O << '\n'; 1959 1960 SmallVector<DbgScope *, 2> &SD = I->second; 1961 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end(); 1962 SDI != SDE; ++SDI) 1963 (*SDI)->setEndLabelID(Label); 1964 return; 1965} 1966 1967/// createDbgScope - Create DbgScope for the scope. 1968void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) { 1969 1970 if (!InlinedAt) { 1971 DbgScope *WScope = DbgScopeMap.lookup(Scope); 1972 if (WScope) 1973 return; 1974 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL); 1975 DbgScopeMap.insert(std::make_pair(Scope, WScope)); 1976 if (DIDescriptor(Scope).isLexicalBlock()) 1977 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL); 1978 return; 1979 } 1980 1981 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt); 1982 if (WScope) 1983 return; 1984 1985 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt); 1986 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope)); 1987 DILocation DL(InlinedAt); 1988 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode()); 1989} 1990 1991/// extractScopeInformation - Scan machine instructions in this function 1992/// and collect DbgScopes. Return true, if atleast one scope was found. 1993bool DwarfDebug::extractScopeInformation(MachineFunction *MF) { 1994 // If scope information was extracted using .dbg intrinsics then there is not 1995 // any need to extract these information by scanning each instruction. 1996 if (!DbgScopeMap.empty()) 1997 return false; 1998 1999 DenseMap<const MachineInstr *, unsigned> MIIndexMap; 2000 unsigned MIIndex = 0; 2001 // Scan each instruction and create scopes. First build working set of scopes. 2002 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 2003 I != E; ++I) { 2004 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2005 II != IE; ++II) { 2006 const MachineInstr *MInsn = II; 2007 MIIndexMap[MInsn] = MIIndex++; 2008 DebugLoc DL = MInsn->getDebugLoc(); 2009 if (DL.isUnknown()) continue; 2010 DebugLocTuple DLT = MF->getDebugLocTuple(DL); 2011 if (!DLT.Scope) continue; 2012 // There is no need to create another DIE for compile unit. For all 2013 // other scopes, create one DbgScope now. This will be translated 2014 // into a scope DIE at the end. 2015 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue; 2016 createDbgScope(DLT.Scope, DLT.InlinedAtLoc); 2017 } 2018 } 2019 2020 2021 // Build scope hierarchy using working set of scopes. 2022 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 2023 I != E; ++I) { 2024 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 2025 II != IE; ++II) { 2026 const MachineInstr *MInsn = II; 2027 DebugLoc DL = MInsn->getDebugLoc(); 2028 if (DL.isUnknown()) continue; 2029 DebugLocTuple DLT = MF->getDebugLocTuple(DL); 2030 if (!DLT.Scope) continue; 2031 // There is no need to create another DIE for compile unit. For all 2032 // other scopes, create one DbgScope now. This will be translated 2033 // into a scope DIE at the end. 2034 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue; 2035 DbgScope *Scope = getUpdatedDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc); 2036 Scope->setLastInsn(MInsn); 2037 } 2038 } 2039 2040 if (!CurrentFnDbgScope) 2041 return false; 2042 2043 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap); 2044 2045 // Each scope has first instruction and last instruction to mark beginning 2046 // and end of a scope respectively. Create an inverse map that list scopes 2047 // starts (and ends) with an instruction. One instruction may start (or end) 2048 // multiple scopes. 2049 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(), 2050 DE = DbgScopeMap.end(); DI != DE; ++DI) { 2051 DbgScope *S = DI->second; 2052 if (S->isAbstractScope()) 2053 continue; 2054 const MachineInstr *MI = S->getFirstInsn(); 2055 assert (MI && "DbgScope does not have first instruction!"); 2056 2057 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI); 2058 if (IDI != DbgScopeBeginMap.end()) 2059 IDI->second.push_back(S); 2060 else 2061 DbgScopeBeginMap[MI].push_back(S); 2062 2063 MI = S->getLastInsn(); 2064 assert (MI && "DbgScope does not have last instruction!"); 2065 IDI = DbgScopeEndMap.find(MI); 2066 if (IDI != DbgScopeEndMap.end()) 2067 IDI->second.push_back(S); 2068 else 2069 DbgScopeEndMap[MI].push_back(S); 2070 } 2071 2072 return !DbgScopeMap.empty(); 2073} 2074 2075/// beginFunction - Gather pre-function debug information. Assumes being 2076/// emitted immediately after the function entry point. 2077void DwarfDebug::beginFunction(MachineFunction *MF) { 2078 this->MF = MF; 2079 2080 if (!ShouldEmitDwarfDebug()) return; 2081 2082 if (TimePassesIsEnabled) 2083 DebugTimer->startTimer(); 2084 2085 if (!extractScopeInformation(MF)) 2086 return; 2087 2088 collectVariableInfo(); 2089 2090 // Begin accumulating function debug information. 2091 MMI->BeginFunction(MF); 2092 2093 // Assumes in correct section after the entry point. 2094 EmitLabel("func_begin", ++SubprogramCount); 2095 2096 // Emit label for the implicitly defined dbg.stoppoint at the start of the 2097 // function. 2098 DebugLoc FDL = MF->getDefaultDebugLoc(); 2099 if (!FDL.isUnknown()) { 2100 DebugLocTuple DLT = MF->getDebugLocTuple(FDL); 2101 unsigned LabelID = 0; 2102 DISubprogram SP = getDISubprogram(DLT.Scope); 2103 if (!SP.isNull()) 2104 LabelID = recordSourceLine(SP.getLineNumber(), 0, DLT.Scope); 2105 else 2106 LabelID = recordSourceLine(DLT.Line, DLT.Col, DLT.Scope); 2107 Asm->printLabel(LabelID); 2108 O << '\n'; 2109 } 2110 if (TimePassesIsEnabled) 2111 DebugTimer->stopTimer(); 2112} 2113 2114/// endFunction - Gather and emit post-function debug information. 2115/// 2116void DwarfDebug::endFunction(MachineFunction *MF) { 2117 if (!ShouldEmitDwarfDebug()) return; 2118 2119 if (TimePassesIsEnabled) 2120 DebugTimer->startTimer(); 2121 2122 if (DbgScopeMap.empty()) 2123 return; 2124 2125 if (CurrentFnDbgScope) { 2126 // Define end label for subprogram. 2127 EmitLabel("func_end", SubprogramCount); 2128 2129 // Get function line info. 2130 if (!Lines.empty()) { 2131 // Get section line info. 2132 unsigned ID = SectionMap.insert(Asm->getCurrentSection()); 2133 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID); 2134 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1]; 2135 // Append the function info to section info. 2136 SectionLineInfos.insert(SectionLineInfos.end(), 2137 Lines.begin(), Lines.end()); 2138 } 2139 2140 // Construct abstract scopes. 2141 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(), 2142 AE = AbstractScopesList.end(); AI != AE; ++AI) 2143 constructScopeDIE(*AI); 2144 2145 constructScopeDIE(CurrentFnDbgScope); 2146 2147 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount, 2148 MMI->getFrameMoves())); 2149 } 2150 2151 // Clear debug info 2152 CurrentFnDbgScope = NULL; 2153 DbgScopeMap.clear(); 2154 DbgScopeBeginMap.clear(); 2155 DbgScopeEndMap.clear(); 2156 ConcreteScopes.clear(); 2157 AbstractScopesList.clear(); 2158 2159 Lines.clear(); 2160 2161 if (TimePassesIsEnabled) 2162 DebugTimer->stopTimer(); 2163} 2164 2165/// recordSourceLine - Records location information and associates it with a 2166/// label. Returns a unique label ID used to generate a label and provide 2167/// correspondence to the source line list. 2168unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, 2169 MDNode *S) { 2170 if (!MMI) 2171 return 0; 2172 2173 if (TimePassesIsEnabled) 2174 DebugTimer->startTimer(); 2175 2176 StringRef Dir; 2177 StringRef Fn; 2178 2179 DIDescriptor Scope(S); 2180 if (Scope.isCompileUnit()) { 2181 DICompileUnit CU(S); 2182 Dir = CU.getDirectory(); 2183 Fn = CU.getFilename(); 2184 } else if (Scope.isSubprogram()) { 2185 DISubprogram SP(S); 2186 Dir = SP.getDirectory(); 2187 Fn = SP.getFilename(); 2188 } else if (Scope.isLexicalBlock()) { 2189 DILexicalBlock DB(S); 2190 Dir = DB.getDirectory(); 2191 Fn = DB.getFilename(); 2192 } else 2193 assert (0 && "Unexpected scope info"); 2194 2195 unsigned Src = GetOrCreateSourceID(Dir, Fn); 2196 unsigned ID = MMI->NextLabelID(); 2197 Lines.push_back(SrcLineInfo(Line, Col, Src, ID)); 2198 2199 if (TimePassesIsEnabled) 2200 DebugTimer->stopTimer(); 2201 2202 return ID; 2203} 2204 2205/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be 2206/// timed. Look up the source id with the given directory and source file 2207/// names. If none currently exists, create a new id and insert it in the 2208/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as 2209/// well. 2210unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName, 2211 const std::string &FileName) { 2212 if (TimePassesIsEnabled) 2213 DebugTimer->startTimer(); 2214 2215 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str()); 2216 2217 if (TimePassesIsEnabled) 2218 DebugTimer->stopTimer(); 2219 2220 return SrcId; 2221} 2222 2223//===----------------------------------------------------------------------===// 2224// Emit Methods 2225//===----------------------------------------------------------------------===// 2226 2227/// computeSizeAndOffset - Compute the size and offset of a DIE. 2228/// 2229unsigned 2230DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 2231 // Get the children. 2232 const std::vector<DIE *> &Children = Die->getChildren(); 2233 2234 // If not last sibling and has children then add sibling offset attribute. 2235 if (!Last && !Children.empty()) Die->addSiblingOffset(); 2236 2237 // Record the abbreviation. 2238 assignAbbrevNumber(Die->getAbbrev()); 2239 2240 // Get the abbreviation for this DIE. 2241 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2242 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2243 2244 // Set DIE offset 2245 Die->setOffset(Offset); 2246 2247 // Start the size with the size of abbreviation code. 2248 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 2249 2250 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2251 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2252 2253 // Size the DIE attribute values. 2254 for (unsigned i = 0, N = Values.size(); i < N; ++i) 2255 // Size attribute value. 2256 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm()); 2257 2258 // Size the DIE children if any. 2259 if (!Children.empty()) { 2260 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 2261 "Children flag not set"); 2262 2263 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2264 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 2265 2266 // End of children marker. 2267 Offset += sizeof(int8_t); 2268 } 2269 2270 Die->setSize(Offset - Die->getOffset()); 2271 return Offset; 2272} 2273 2274/// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 2275/// 2276void DwarfDebug::computeSizeAndOffsets() { 2277 // Compute size of compile unit header. 2278 static unsigned Offset = 2279 sizeof(int32_t) + // Length of Compilation Unit Info 2280 sizeof(int16_t) + // DWARF version number 2281 sizeof(int32_t) + // Offset Into Abbrev. Section 2282 sizeof(int8_t); // Pointer Size (in bytes) 2283 2284 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true); 2285 CompileUnitOffsets[ModuleCU] = 0; 2286} 2287 2288/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc 2289/// tools to recognize the object file contains Dwarf information. 2290void DwarfDebug::emitInitial() { 2291 // Check to see if we already emitted intial headers. 2292 if (didInitial) return; 2293 didInitial = true; 2294 2295 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 2296 2297 // Dwarf sections base addresses. 2298 if (MAI->doesDwarfRequireFrameSection()) { 2299 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection()); 2300 EmitLabel("section_debug_frame", 0); 2301 } 2302 2303 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection()); 2304 EmitLabel("section_info", 0); 2305 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection()); 2306 EmitLabel("section_abbrev", 0); 2307 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection()); 2308 EmitLabel("section_aranges", 0); 2309 2310 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) { 2311 Asm->OutStreamer.SwitchSection(LineInfoDirective); 2312 EmitLabel("section_macinfo", 0); 2313 } 2314 2315 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection()); 2316 EmitLabel("section_line", 0); 2317 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection()); 2318 EmitLabel("section_loc", 0); 2319 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection()); 2320 EmitLabel("section_pubnames", 0); 2321 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection()); 2322 EmitLabel("section_pubtypes", 0); 2323 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection()); 2324 EmitLabel("section_str", 0); 2325 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection()); 2326 EmitLabel("section_ranges", 0); 2327 2328 Asm->OutStreamer.SwitchSection(TLOF.getTextSection()); 2329 EmitLabel("text_begin", 0); 2330 Asm->OutStreamer.SwitchSection(TLOF.getDataSection()); 2331 EmitLabel("data_begin", 0); 2332} 2333 2334/// emitDIE - Recusively Emits a debug information entry. 2335/// 2336void DwarfDebug::emitDIE(DIE *Die) { 2337 // Get the abbreviation for this DIE. 2338 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2339 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2340 2341 Asm->EOL(); 2342 2343 // Emit the code (index) for the abbreviation. 2344 Asm->EmitULEB128Bytes(AbbrevNumber); 2345 2346 if (Asm->isVerbose()) 2347 Asm->EOL(std::string("Abbrev [" + 2348 utostr(AbbrevNumber) + 2349 "] 0x" + utohexstr(Die->getOffset()) + 2350 ":0x" + utohexstr(Die->getSize()) + " " + 2351 dwarf::TagString(Abbrev->getTag()))); 2352 else 2353 Asm->EOL(); 2354 2355 SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2356 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2357 2358 // Emit the DIE attribute values. 2359 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 2360 unsigned Attr = AbbrevData[i].getAttribute(); 2361 unsigned Form = AbbrevData[i].getForm(); 2362 assert(Form && "Too many attributes for DIE (check abbreviation)"); 2363 2364 switch (Attr) { 2365 case dwarf::DW_AT_sibling: 2366 Asm->EmitInt32(Die->getSiblingOffset()); 2367 break; 2368 case dwarf::DW_AT_abstract_origin: { 2369 DIEEntry *E = cast<DIEEntry>(Values[i]); 2370 DIE *Origin = E->getEntry(); 2371 unsigned Addr = Origin->getOffset(); 2372 Asm->EmitInt32(Addr); 2373 break; 2374 } 2375 default: 2376 // Emit an attribute using the defined form. 2377 Values[i]->EmitValue(this, Form); 2378 break; 2379 } 2380 2381 Asm->EOL(dwarf::AttributeString(Attr)); 2382 } 2383 2384 // Emit the DIE children if any. 2385 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 2386 const std::vector<DIE *> &Children = Die->getChildren(); 2387 2388 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2389 emitDIE(Children[j]); 2390 2391 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark"); 2392 } 2393} 2394 2395/// emitDebugInfo - Emit the debug info section. 2396/// 2397void DwarfDebug::emitDebugInfo() { 2398 // Start debug info section. 2399 Asm->OutStreamer.SwitchSection( 2400 Asm->getObjFileLowering().getDwarfInfoSection()); 2401 DIE *Die = ModuleCU->getCUDie(); 2402 2403 // Emit the compile units header. 2404 EmitLabel("info_begin", ModuleCU->getID()); 2405 2406 // Emit size of content not including length itself 2407 unsigned ContentSize = Die->getSize() + 2408 sizeof(int16_t) + // DWARF version number 2409 sizeof(int32_t) + // Offset Into Abbrev. Section 2410 sizeof(int8_t) + // Pointer Size (in bytes) 2411 sizeof(int32_t); // FIXME - extra pad for gdb bug. 2412 2413 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info"); 2414 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number"); 2415 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false); 2416 Asm->EOL("Offset Into Abbrev. Section"); 2417 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); 2418 2419 emitDIE(Die); 2420 // FIXME - extra padding for gdb bug. 2421 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2422 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2423 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2424 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2425 EmitLabel("info_end", ModuleCU->getID()); 2426 2427 Asm->EOL(); 2428} 2429 2430/// emitAbbreviations - Emit the abbreviation section. 2431/// 2432void DwarfDebug::emitAbbreviations() const { 2433 // Check to see if it is worth the effort. 2434 if (!Abbreviations.empty()) { 2435 // Start the debug abbrev section. 2436 Asm->OutStreamer.SwitchSection( 2437 Asm->getObjFileLowering().getDwarfAbbrevSection()); 2438 2439 EmitLabel("abbrev_begin", 0); 2440 2441 // For each abbrevation. 2442 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 2443 // Get abbreviation data 2444 const DIEAbbrev *Abbrev = Abbreviations[i]; 2445 2446 // Emit the abbrevations code (base 1 index.) 2447 Asm->EmitULEB128Bytes(Abbrev->getNumber()); 2448 Asm->EOL("Abbreviation Code"); 2449 2450 // Emit the abbreviations data. 2451 Abbrev->Emit(Asm); 2452 2453 Asm->EOL(); 2454 } 2455 2456 // Mark end of abbreviations. 2457 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)"); 2458 2459 EmitLabel("abbrev_end", 0); 2460 Asm->EOL(); 2461 } 2462} 2463 2464/// emitEndOfLineMatrix - Emit the last address of the section and the end of 2465/// the line matrix. 2466/// 2467void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 2468 // Define last address of section. 2469 Asm->EmitInt8(0); Asm->EOL("Extended Op"); 2470 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size"); 2471 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address"); 2472 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label"); 2473 2474 // Mark end of matrix. 2475 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence"); 2476 Asm->EmitULEB128Bytes(1); Asm->EOL(); 2477 Asm->EmitInt8(1); Asm->EOL(); 2478} 2479 2480/// emitDebugLines - Emit source line information. 2481/// 2482void DwarfDebug::emitDebugLines() { 2483 // If the target is using .loc/.file, the assembler will be emitting the 2484 // .debug_line table automatically. 2485 if (MAI->hasDotLocAndDotFile()) 2486 return; 2487 2488 // Minimum line delta, thus ranging from -10..(255-10). 2489 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1); 2490 // Maximum line delta, thus ranging from -10..(255-10). 2491 const int MaxLineDelta = 255 + MinLineDelta; 2492 2493 // Start the dwarf line section. 2494 Asm->OutStreamer.SwitchSection( 2495 Asm->getObjFileLowering().getDwarfLineSection()); 2496 2497 // Construct the section header. 2498 EmitDifference("line_end", 0, "line_begin", 0, true); 2499 Asm->EOL("Length of Source Line Info"); 2500 EmitLabel("line_begin", 0); 2501 2502 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number"); 2503 2504 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true); 2505 Asm->EOL("Prolog Length"); 2506 EmitLabel("line_prolog_begin", 0); 2507 2508 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length"); 2509 2510 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag"); 2511 2512 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)"); 2513 2514 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)"); 2515 2516 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base"); 2517 2518 // Line number standard opcode encodings argument count 2519 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count"); 2520 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count"); 2521 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count"); 2522 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count"); 2523 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count"); 2524 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count"); 2525 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count"); 2526 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count"); 2527 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count"); 2528 2529 // Emit directories. 2530 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) { 2531 Asm->EmitString(getSourceDirectoryName(DI)); 2532 Asm->EOL("Directory"); 2533 } 2534 2535 Asm->EmitInt8(0); Asm->EOL("End of directories"); 2536 2537 // Emit files. 2538 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) { 2539 // Remember source id starts at 1. 2540 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI); 2541 Asm->EmitString(getSourceFileName(Id.second)); 2542 Asm->EOL("Source"); 2543 Asm->EmitULEB128Bytes(Id.first); 2544 Asm->EOL("Directory #"); 2545 Asm->EmitULEB128Bytes(0); 2546 Asm->EOL("Mod date"); 2547 Asm->EmitULEB128Bytes(0); 2548 Asm->EOL("File size"); 2549 } 2550 2551 Asm->EmitInt8(0); Asm->EOL("End of files"); 2552 2553 EmitLabel("line_prolog_end", 0); 2554 2555 // A sequence for each text section. 2556 unsigned SecSrcLinesSize = SectionSourceLines.size(); 2557 2558 for (unsigned j = 0; j < SecSrcLinesSize; ++j) { 2559 // Isolate current sections line info. 2560 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j]; 2561 2562 /*if (Asm->isVerbose()) { 2563 const MCSection *S = SectionMap[j + 1]; 2564 O << '\t' << MAI->getCommentString() << " Section" 2565 << S->getName() << '\n'; 2566 }*/ 2567 Asm->EOL(); 2568 2569 // Dwarf assumes we start with first line of first source file. 2570 unsigned Source = 1; 2571 unsigned Line = 1; 2572 2573 // Construct rows of the address, source, line, column matrix. 2574 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) { 2575 const SrcLineInfo &LineInfo = LineInfos[i]; 2576 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID()); 2577 if (!LabelID) continue; 2578 2579 if (LineInfo.getLine() == 0) continue; 2580 2581 if (!Asm->isVerbose()) 2582 Asm->EOL(); 2583 else { 2584 std::pair<unsigned, unsigned> SourceID = 2585 getSourceDirectoryAndFileIds(LineInfo.getSourceID()); 2586 O << '\t' << MAI->getCommentString() << ' ' 2587 << getSourceDirectoryName(SourceID.first) << '/' 2588 << getSourceFileName(SourceID.second) 2589 << ':' << utostr_32(LineInfo.getLine()) << '\n'; 2590 } 2591 2592 // Define the line address. 2593 Asm->EmitInt8(0); Asm->EOL("Extended Op"); 2594 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size"); 2595 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address"); 2596 EmitReference("label", LabelID); Asm->EOL("Location label"); 2597 2598 // If change of source, then switch to the new source. 2599 if (Source != LineInfo.getSourceID()) { 2600 Source = LineInfo.getSourceID(); 2601 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file"); 2602 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source"); 2603 } 2604 2605 // If change of line. 2606 if (Line != LineInfo.getLine()) { 2607 // Determine offset. 2608 int Offset = LineInfo.getLine() - Line; 2609 int Delta = Offset - MinLineDelta; 2610 2611 // Update line. 2612 Line = LineInfo.getLine(); 2613 2614 // If delta is small enough and in range... 2615 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) { 2616 // ... then use fast opcode. 2617 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta"); 2618 } else { 2619 // ... otherwise use long hand. 2620 Asm->EmitInt8(dwarf::DW_LNS_advance_line); 2621 Asm->EOL("DW_LNS_advance_line"); 2622 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset"); 2623 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy"); 2624 } 2625 } else { 2626 // Copy the previous row (different address or source) 2627 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy"); 2628 } 2629 } 2630 2631 emitEndOfLineMatrix(j + 1); 2632 } 2633 2634 if (SecSrcLinesSize == 0) 2635 // Because we're emitting a debug_line section, we still need a line 2636 // table. The linker and friends expect it to exist. If there's nothing to 2637 // put into it, emit an empty table. 2638 emitEndOfLineMatrix(1); 2639 2640 EmitLabel("line_end", 0); 2641 Asm->EOL(); 2642} 2643 2644/// emitCommonDebugFrame - Emit common frame info into a debug frame section. 2645/// 2646void DwarfDebug::emitCommonDebugFrame() { 2647 if (!MAI->doesDwarfRequireFrameSection()) 2648 return; 2649 2650 int stackGrowth = 2651 Asm->TM.getFrameInfo()->getStackGrowthDirection() == 2652 TargetFrameInfo::StackGrowsUp ? 2653 TD->getPointerSize() : -TD->getPointerSize(); 2654 2655 // Start the dwarf frame section. 2656 Asm->OutStreamer.SwitchSection( 2657 Asm->getObjFileLowering().getDwarfFrameSection()); 2658 2659 EmitLabel("debug_frame_common", 0); 2660 EmitDifference("debug_frame_common_end", 0, 2661 "debug_frame_common_begin", 0, true); 2662 Asm->EOL("Length of Common Information Entry"); 2663 2664 EmitLabel("debug_frame_common_begin", 0); 2665 Asm->EmitInt32((int)dwarf::DW_CIE_ID); 2666 Asm->EOL("CIE Identifier Tag"); 2667 Asm->EmitInt8(dwarf::DW_CIE_VERSION); 2668 Asm->EOL("CIE Version"); 2669 Asm->EmitString(""); 2670 Asm->EOL("CIE Augmentation"); 2671 Asm->EmitULEB128Bytes(1); 2672 Asm->EOL("CIE Code Alignment Factor"); 2673 Asm->EmitSLEB128Bytes(stackGrowth); 2674 Asm->EOL("CIE Data Alignment Factor"); 2675 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); 2676 Asm->EOL("CIE RA Column"); 2677 2678 std::vector<MachineMove> Moves; 2679 RI->getInitialFrameState(Moves); 2680 2681 EmitFrameMoves(NULL, 0, Moves, false); 2682 2683 Asm->EmitAlignment(2, 0, 0, false); 2684 EmitLabel("debug_frame_common_end", 0); 2685 2686 Asm->EOL(); 2687} 2688 2689/// emitFunctionDebugFrame - Emit per function frame info into a debug frame 2690/// section. 2691void 2692DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){ 2693 if (!MAI->doesDwarfRequireFrameSection()) 2694 return; 2695 2696 // Start the dwarf frame section. 2697 Asm->OutStreamer.SwitchSection( 2698 Asm->getObjFileLowering().getDwarfFrameSection()); 2699 2700 EmitDifference("debug_frame_end", DebugFrameInfo.Number, 2701 "debug_frame_begin", DebugFrameInfo.Number, true); 2702 Asm->EOL("Length of Frame Information Entry"); 2703 2704 EmitLabel("debug_frame_begin", DebugFrameInfo.Number); 2705 2706 EmitSectionOffset("debug_frame_common", "section_debug_frame", 2707 0, 0, true, false); 2708 Asm->EOL("FDE CIE offset"); 2709 2710 EmitReference("func_begin", DebugFrameInfo.Number); 2711 Asm->EOL("FDE initial location"); 2712 EmitDifference("func_end", DebugFrameInfo.Number, 2713 "func_begin", DebugFrameInfo.Number); 2714 Asm->EOL("FDE address range"); 2715 2716 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves, 2717 false); 2718 2719 Asm->EmitAlignment(2, 0, 0, false); 2720 EmitLabel("debug_frame_end", DebugFrameInfo.Number); 2721 2722 Asm->EOL(); 2723} 2724 2725/// emitDebugPubNames - Emit visible names into a debug pubnames section. 2726/// 2727void DwarfDebug::emitDebugPubNames() { 2728 // Start the dwarf pubnames section. 2729 Asm->OutStreamer.SwitchSection( 2730 Asm->getObjFileLowering().getDwarfPubNamesSection()); 2731 2732 EmitDifference("pubnames_end", ModuleCU->getID(), 2733 "pubnames_begin", ModuleCU->getID(), true); 2734 Asm->EOL("Length of Public Names Info"); 2735 2736 EmitLabel("pubnames_begin", ModuleCU->getID()); 2737 2738 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version"); 2739 2740 EmitSectionOffset("info_begin", "section_info", 2741 ModuleCU->getID(), 0, true, false); 2742 Asm->EOL("Offset of Compilation Unit Info"); 2743 2744 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(), 2745 true); 2746 Asm->EOL("Compilation Unit Length"); 2747 2748 const StringMap<DIE*> &Globals = ModuleCU->getGlobals(); 2749 for (StringMap<DIE*>::const_iterator 2750 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2751 const char *Name = GI->getKeyData(); 2752 DIE * Entity = GI->second; 2753 2754 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset"); 2755 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name"); 2756 } 2757 2758 Asm->EmitInt32(0); Asm->EOL("End Mark"); 2759 EmitLabel("pubnames_end", ModuleCU->getID()); 2760 2761 Asm->EOL(); 2762} 2763 2764void DwarfDebug::emitDebugPubTypes() { 2765 // Start the dwarf pubnames section. 2766 Asm->OutStreamer.SwitchSection( 2767 Asm->getObjFileLowering().getDwarfPubTypesSection()); 2768 EmitDifference("pubtypes_end", ModuleCU->getID(), 2769 "pubtypes_begin", ModuleCU->getID(), true); 2770 Asm->EOL("Length of Public Types Info"); 2771 2772 EmitLabel("pubtypes_begin", ModuleCU->getID()); 2773 2774 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version"); 2775 2776 EmitSectionOffset("info_begin", "section_info", 2777 ModuleCU->getID(), 0, true, false); 2778 Asm->EOL("Offset of Compilation ModuleCU Info"); 2779 2780 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(), 2781 true); 2782 Asm->EOL("Compilation ModuleCU Length"); 2783 2784 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes(); 2785 for (StringMap<DIE*>::const_iterator 2786 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2787 const char *Name = GI->getKeyData(); 2788 DIE * Entity = GI->second; 2789 2790 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset"); 2791 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name"); 2792 } 2793 2794 Asm->EmitInt32(0); Asm->EOL("End Mark"); 2795 EmitLabel("pubtypes_end", ModuleCU->getID()); 2796 2797 Asm->EOL(); 2798} 2799 2800/// emitDebugStr - Emit visible names into a debug str section. 2801/// 2802void DwarfDebug::emitDebugStr() { 2803 // Check to see if it is worth the effort. 2804 if (!StringPool.empty()) { 2805 // Start the dwarf str section. 2806 Asm->OutStreamer.SwitchSection( 2807 Asm->getObjFileLowering().getDwarfStrSection()); 2808 2809 // For each of strings in the string pool. 2810 for (unsigned StringID = 1, N = StringPool.size(); 2811 StringID <= N; ++StringID) { 2812 // Emit a label for reference from debug information entries. 2813 EmitLabel("string", StringID); 2814 2815 // Emit the string itself. 2816 const std::string &String = StringPool[StringID]; 2817 Asm->EmitString(String); Asm->EOL(); 2818 } 2819 2820 Asm->EOL(); 2821 } 2822} 2823 2824/// emitDebugLoc - Emit visible names into a debug loc section. 2825/// 2826void DwarfDebug::emitDebugLoc() { 2827 // Start the dwarf loc section. 2828 Asm->OutStreamer.SwitchSection( 2829 Asm->getObjFileLowering().getDwarfLocSection()); 2830 Asm->EOL(); 2831} 2832 2833/// EmitDebugARanges - Emit visible names into a debug aranges section. 2834/// 2835void DwarfDebug::EmitDebugARanges() { 2836 // Start the dwarf aranges section. 2837 Asm->OutStreamer.SwitchSection( 2838 Asm->getObjFileLowering().getDwarfARangesSection()); 2839 2840 // FIXME - Mock up 2841#if 0 2842 CompileUnit *Unit = GetBaseCompileUnit(); 2843 2844 // Don't include size of length 2845 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info"); 2846 2847 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version"); 2848 2849 EmitReference("info_begin", Unit->getID()); 2850 Asm->EOL("Offset of Compilation Unit Info"); 2851 2852 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address"); 2853 2854 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor"); 2855 2856 Asm->EmitInt16(0); Asm->EOL("Pad (1)"); 2857 Asm->EmitInt16(0); Asm->EOL("Pad (2)"); 2858 2859 // Range 1 2860 EmitReference("text_begin", 0); Asm->EOL("Address"); 2861 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length"); 2862 2863 Asm->EmitInt32(0); Asm->EOL("EOM (1)"); 2864 Asm->EmitInt32(0); Asm->EOL("EOM (2)"); 2865#endif 2866 2867 Asm->EOL(); 2868} 2869 2870/// emitDebugRanges - Emit visible names into a debug ranges section. 2871/// 2872void DwarfDebug::emitDebugRanges() { 2873 // Start the dwarf ranges section. 2874 Asm->OutStreamer.SwitchSection( 2875 Asm->getObjFileLowering().getDwarfRangesSection()); 2876 Asm->EOL(); 2877} 2878 2879/// emitDebugMacInfo - Emit visible names into a debug macinfo section. 2880/// 2881void DwarfDebug::emitDebugMacInfo() { 2882 if (const MCSection *LineInfo = 2883 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 2884 // Start the dwarf macinfo section. 2885 Asm->OutStreamer.SwitchSection(LineInfo); 2886 Asm->EOL(); 2887 } 2888} 2889 2890/// emitDebugInlineInfo - Emit inline info using following format. 2891/// Section Header: 2892/// 1. length of section 2893/// 2. Dwarf version number 2894/// 3. address size. 2895/// 2896/// Entries (one "entry" for each function that was inlined): 2897/// 2898/// 1. offset into __debug_str section for MIPS linkage name, if exists; 2899/// otherwise offset into __debug_str for regular function name. 2900/// 2. offset into __debug_str section for regular function name. 2901/// 3. an unsigned LEB128 number indicating the number of distinct inlining 2902/// instances for the function. 2903/// 2904/// The rest of the entry consists of a {die_offset, low_pc} pair for each 2905/// inlined instance; the die_offset points to the inlined_subroutine die in the 2906/// __debug_info section, and the low_pc is the starting address for the 2907/// inlining instance. 2908void DwarfDebug::emitDebugInlineInfo() { 2909 if (!MAI->doesDwarfUsesInlineInfoSection()) 2910 return; 2911 2912 if (!ModuleCU) 2913 return; 2914 2915 Asm->OutStreamer.SwitchSection( 2916 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 2917 Asm->EOL(); 2918 EmitDifference("debug_inlined_end", 1, 2919 "debug_inlined_begin", 1, true); 2920 Asm->EOL("Length of Debug Inlined Information Entry"); 2921 2922 EmitLabel("debug_inlined_begin", 1); 2923 2924 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version"); 2925 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); 2926 2927 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 2928 E = InlinedSPNodes.end(); I != E; ++I) { 2929 2930 MDNode *Node = *I; 2931 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 2932 = InlineInfo.find(Node); 2933 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 2934 DISubprogram SP(Node); 2935 StringRef LName = SP.getLinkageName(); 2936 StringRef Name = SP.getName(); 2937 2938 if (LName.empty()) 2939 Asm->EmitString(Name); 2940 else { 2941 // Skip special LLVM prefix that is used to inform the asm printer to not 2942 // emit usual symbol prefix before the symbol name. This happens for 2943 // Objective-C symbol names and symbol whose name is replaced using GCC's 2944 // __asm__ attribute. 2945 if (LName[0] == 1) 2946 LName = LName.substr(1); 2947 EmitSectionOffset("string", "section_str", 2948 StringPool.idFor(LName), false, true); 2949 2950 } 2951 Asm->EOL("MIPS linkage name"); 2952 EmitSectionOffset("string", "section_str", 2953 StringPool.idFor(Name), false, true); 2954 Asm->EOL("Function name"); 2955 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count"); 2956 2957 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2958 LE = Labels.end(); LI != LE; ++LI) { 2959 DIE *SP = LI->second; 2960 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset"); 2961 2962 if (TD->getPointerSize() == sizeof(int32_t)) 2963 O << MAI->getData32bitsDirective(); 2964 else 2965 O << MAI->getData64bitsDirective(); 2966 2967 PrintLabelName("label", LI->first); Asm->EOL("low_pc"); 2968 } 2969 } 2970 2971 EmitLabel("debug_inlined_end", 1); 2972 Asm->EOL(); 2973} 2974