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