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