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