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