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