DwarfDebug.cpp revision c366f83d89d93be557f136f1560d696b4acb6a46
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/// addToContextOwner - Add Die into the list of its context owner's children. 742void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) { 743 if (Context.isNull()) 744 ModuleCU->addDie(Die); 745 else if (Context.isType()) { 746 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode())); 747 ContextDIE->addChild(Die); 748 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode())) 749 ContextDIE->addChild(Die); 750 else 751 ModuleCU->addDie(Die); 752} 753 754/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 755/// given DIType. 756DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) { 757 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode()); 758 if (TyDIE) 759 return TyDIE; 760 761 // Create new type. 762 TyDIE = new DIE(dwarf::DW_TAG_base_type); 763 ModuleCU->insertDIE(Ty.getNode(), TyDIE); 764 if (Ty.isBasicType()) 765 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode())); 766 else if (Ty.isCompositeType()) 767 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode())); 768 else { 769 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 770 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode())); 771 } 772 773 addToContextOwner(TyDIE, Ty.getContext()); 774 return TyDIE; 775} 776 777/// addType - Add a new type attribute to the specified entity. 778void DwarfDebug::addType(DIE *Entity, DIType Ty) { 779 if (Ty.isNull()) 780 return; 781 782 // Check for pre-existence. 783 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode()); 784 785 // If it exists then use the existing value. 786 if (Entry) { 787 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry); 788 return; 789 } 790 791 // Set up proxy. 792 Entry = createDIEEntry(); 793 ModuleCU->insertDIEEntry(Ty.getNode(), Entry); 794 795 // Construct type. 796 DIE *Buffer = getOrCreateTypeDIE(Ty); 797 798 Entry->setEntry(Buffer); 799 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry); 800} 801 802/// constructTypeDIE - Construct basic type die from DIBasicType. 803void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 804 // Get core information. 805 StringRef Name = BTy.getName(); 806 Buffer.setTag(dwarf::DW_TAG_base_type); 807 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 808 BTy.getEncoding()); 809 810 // Add name if not anonymous or intermediate type. 811 if (!Name.empty()) 812 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 813 uint64_t Size = BTy.getSizeInBits() >> 3; 814 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 815} 816 817/// constructTypeDIE - Construct derived type die from DIDerivedType. 818void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 819 // Get core information. 820 StringRef Name = DTy.getName(); 821 uint64_t Size = DTy.getSizeInBits() >> 3; 822 unsigned Tag = DTy.getTag(); 823 824 // FIXME - Workaround for templates. 825 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 826 827 Buffer.setTag(Tag); 828 829 // Map to main type, void will not have a type. 830 DIType FromTy = DTy.getTypeDerivedFrom(); 831 addType(&Buffer, FromTy); 832 833 // Add name if not anonymous or intermediate type. 834 if (!Name.empty()) 835 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 836 837 // Add size if non-zero (derived types might be zero-sized.) 838 if (Size) 839 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 840 841 // Add source line info if available and TyDesc is not a forward declaration. 842 if (!DTy.isForwardDecl()) 843 addSourceLine(&Buffer, &DTy); 844} 845 846/// constructTypeDIE - Construct type DIE from DICompositeType. 847void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 848 // Get core information. 849 StringRef Name = CTy.getName(); 850 851 uint64_t Size = CTy.getSizeInBits() >> 3; 852 unsigned Tag = CTy.getTag(); 853 Buffer.setTag(Tag); 854 855 switch (Tag) { 856 case dwarf::DW_TAG_vector_type: 857 case dwarf::DW_TAG_array_type: 858 constructArrayTypeDIE(Buffer, &CTy); 859 break; 860 case dwarf::DW_TAG_enumeration_type: { 861 DIArray Elements = CTy.getTypeArray(); 862 863 // Add enumerators to enumeration type. 864 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 865 DIE *ElemDie = NULL; 866 DIEnumerator Enum(Elements.getElement(i).getNode()); 867 if (!Enum.isNull()) { 868 ElemDie = constructEnumTypeDIE(&Enum); 869 Buffer.addChild(ElemDie); 870 } 871 } 872 } 873 break; 874 case dwarf::DW_TAG_subroutine_type: { 875 // Add return type. 876 DIArray Elements = CTy.getTypeArray(); 877 DIDescriptor RTy = Elements.getElement(0); 878 addType(&Buffer, DIType(RTy.getNode())); 879 880 // Add prototype flag. 881 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 882 883 // Add arguments. 884 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 885 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 886 DIDescriptor Ty = Elements.getElement(i); 887 addType(Arg, DIType(Ty.getNode())); 888 Buffer.addChild(Arg); 889 } 890 } 891 break; 892 case dwarf::DW_TAG_structure_type: 893 case dwarf::DW_TAG_union_type: 894 case dwarf::DW_TAG_class_type: { 895 // Add elements to structure type. 896 DIArray Elements = CTy.getTypeArray(); 897 898 // A forward struct declared type may not have elements available. 899 if (Elements.isNull()) 900 break; 901 902 // Add elements to structure type. 903 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 904 DIDescriptor Element = Elements.getElement(i); 905 if (Element.isNull()) 906 continue; 907 DIE *ElemDie = NULL; 908 if (Element.getTag() == dwarf::DW_TAG_subprogram) 909 ElemDie = createMemberSubprogramDIE(DISubprogram(Element.getNode())); 910 else 911 ElemDie = createMemberDIE(DIDerivedType(Element.getNode())); 912 Buffer.addChild(ElemDie); 913 } 914 915 if (CTy.isAppleBlockExtension()) 916 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1); 917 918 unsigned RLang = CTy.getRunTimeLang(); 919 if (RLang) 920 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 921 dwarf::DW_FORM_data1, RLang); 922 break; 923 } 924 default: 925 break; 926 } 927 928 // Add name if not anonymous or intermediate type. 929 if (!Name.empty()) 930 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 931 932 if (Tag == dwarf::DW_TAG_enumeration_type || 933 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) { 934 // Add size if non-zero (derived types might be zero-sized.) 935 if (Size) 936 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 937 else { 938 // Add zero size if it is not a forward declaration. 939 if (CTy.isForwardDecl()) 940 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 941 else 942 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 943 } 944 945 // Add source line info if available. 946 if (!CTy.isForwardDecl()) 947 addSourceLine(&Buffer, &CTy); 948 } 949} 950 951/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 952void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){ 953 int64_t L = SR.getLo(); 954 int64_t H = SR.getHi(); 955 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 956 957 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 958 if (L) 959 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L); 960 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H); 961 962 Buffer.addChild(DW_Subrange); 963} 964 965/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 966void DwarfDebug::constructArrayTypeDIE(DIE &Buffer, 967 DICompositeType *CTy) { 968 Buffer.setTag(dwarf::DW_TAG_array_type); 969 if (CTy->getTag() == dwarf::DW_TAG_vector_type) 970 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1); 971 972 // Emit derived type. 973 addType(&Buffer, CTy->getTypeDerivedFrom()); 974 DIArray Elements = CTy->getTypeArray(); 975 976 // Get an anonymous type for index type. 977 DIE *IdxTy = ModuleCU->getIndexTyDie(); 978 if (!IdxTy) { 979 // Construct an anonymous type for index type. 980 IdxTy = new DIE(dwarf::DW_TAG_base_type); 981 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 982 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 983 dwarf::DW_ATE_signed); 984 ModuleCU->addDie(IdxTy); 985 ModuleCU->setIndexTyDie(IdxTy); 986 } 987 988 // Add subranges to array type. 989 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 990 DIDescriptor Element = Elements.getElement(i); 991 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 992 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy); 993 } 994} 995 996/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 997DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) { 998 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 999 StringRef Name = ETy->getName(); 1000 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1001 int64_t Value = ETy->getEnumValue(); 1002 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1003 return Enumerator; 1004} 1005 1006/// createGlobalVariableDIE - Create new DIE using GV. 1007DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) { 1008 // If the global variable was optmized out then no need to create debug info 1009 // entry. 1010 if (!GV.getGlobal()) return NULL; 1011 if (GV.getDisplayName().empty()) return NULL; 1012 1013 DIE *GVDie = new DIE(dwarf::DW_TAG_variable); 1014 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 1015 GV.getDisplayName()); 1016 1017 StringRef LinkageName = GV.getLinkageName(); 1018 if (!LinkageName.empty()) { 1019 // Skip special LLVM prefix that is used to inform the asm printer to not 1020 // emit usual symbol prefix before the symbol name. This happens for 1021 // Objective-C symbol names and symbol whose name is replaced using GCC's 1022 // __asm__ attribute. 1023 if (LinkageName[0] == 1) 1024 LinkageName = LinkageName.substr(1); 1025 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1026 LinkageName); 1027 } 1028 addType(GVDie, GV.getType()); 1029 if (!GV.isLocalToUnit()) 1030 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1031 addSourceLine(GVDie, &GV); 1032 1033 // Add address. 1034 DIEBlock *Block = new DIEBlock(); 1035 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 1036 addObjectLabel(Block, 0, dwarf::DW_FORM_udata, 1037 Asm->Mang->getMangledName(GV.getGlobal())); 1038 addBlock(GVDie, dwarf::DW_AT_location, 0, Block); 1039 1040 return GVDie; 1041} 1042 1043/// createMemberDIE - Create new member DIE. 1044DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) { 1045 DIE *MemberDie = new DIE(DT.getTag()); 1046 StringRef Name = DT.getName(); 1047 if (!Name.empty()) 1048 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1049 1050 addType(MemberDie, DT.getTypeDerivedFrom()); 1051 1052 addSourceLine(MemberDie, &DT); 1053 1054 DIEBlock *MemLocationDie = new DIEBlock(); 1055 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1056 1057 uint64_t Size = DT.getSizeInBits(); 1058 uint64_t FieldSize = DT.getOriginalTypeSize(); 1059 1060 if (Size != FieldSize) { 1061 // Handle bitfield. 1062 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1063 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1064 1065 uint64_t Offset = DT.getOffsetInBits(); 1066 uint64_t FieldOffset = Offset; 1067 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1068 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1069 FieldOffset = (HiMark - FieldSize); 1070 Offset -= FieldOffset; 1071 1072 // Maybe we need to work from the other end. 1073 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size); 1074 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1075 1076 // Here WD_AT_data_member_location points to the anonymous 1077 // field that includes this bit field. 1078 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1079 1080 } else 1081 // This is not a bitfield. 1082 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1083 1084 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1085 1086 if (DT.isProtected()) 1087 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1088 dwarf::DW_ACCESS_protected); 1089 else if (DT.isPrivate()) 1090 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1091 dwarf::DW_ACCESS_private); 1092 else if (DT.getTag() == dwarf::DW_TAG_inheritance) 1093 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag, 1094 dwarf::DW_ACCESS_public); 1095 if (DT.isVirtual()) 1096 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, 1097 dwarf::DW_VIRTUALITY_virtual); 1098 return MemberDie; 1099} 1100 1101/// createRawSubprogramDIE - Create new partially incomplete DIE. This is 1102/// a helper routine used by createMemberSubprogramDIE and 1103/// createSubprogramDIE. 1104DIE *DwarfDebug::createRawSubprogramDIE(const DISubprogram &SP) { 1105 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram); 1106 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName()); 1107 1108 StringRef LinkageName = SP.getLinkageName(); 1109 if (!LinkageName.empty()) { 1110 // Skip special LLVM prefix that is used to inform the asm printer to not 1111 // emit usual symbol prefix before the symbol name. This happens for 1112 // Objective-C symbol names and symbol whose name is replaced using GCC's 1113 // __asm__ attribute. 1114 if (LinkageName[0] == 1) 1115 LinkageName = LinkageName.substr(1); 1116 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string, 1117 LinkageName); 1118 } 1119 addSourceLine(SPDie, &SP); 1120 1121 // Add prototyped tag, if C or ObjC. 1122 unsigned Lang = SP.getCompileUnit().getLanguage(); 1123 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 || 1124 Lang == dwarf::DW_LANG_ObjC) 1125 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); 1126 1127 // Add Return Type. 1128 DICompositeType SPTy = SP.getType(); 1129 DIArray Args = SPTy.getTypeArray(); 1130 unsigned SPTag = SPTy.getTag(); 1131 1132 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type) 1133 addType(SPDie, SPTy); 1134 else 1135 addType(SPDie, DIType(Args.getElement(0).getNode())); 1136 1137 unsigned VK = SP.getVirtuality(); 1138 if (VK) { 1139 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK); 1140 DIEBlock *Block = new DIEBlock(); 1141 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1142 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex()); 1143 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1144 ContainingTypeMap.insert(std::make_pair(SPDie, WeakVH(SP.getContainingType().getNode()))); 1145 } 1146 1147 return SPDie; 1148} 1149 1150/// createMemberSubprogramDIE - Create new member DIE using SP. This routine 1151/// always returns a die with DW_AT_declaration attribute. 1152DIE *DwarfDebug::createMemberSubprogramDIE(const DISubprogram &SP) { 1153 DIE *SPDie = ModuleCU->getDIE(SP.getNode()); 1154 if (!SPDie) 1155 SPDie = createSubprogramDIE(SP); 1156 1157 // If SPDie has DW_AT_declaration then reuse it. 1158 if (!SP.isDefinition()) 1159 return SPDie; 1160 1161 // Otherwise create new DIE for the declaration. First push definition 1162 // DIE at the top level. 1163 if (TopLevelDIEs.insert(SPDie)) 1164 TopLevelDIEsVector.push_back(SPDie); 1165 1166 SPDie = createRawSubprogramDIE(SP); 1167 1168 // Add arguments. 1169 DICompositeType SPTy = SP.getType(); 1170 DIArray Args = SPTy.getTypeArray(); 1171 unsigned SPTag = SPTy.getTag(); 1172 if (SPTag == dwarf::DW_TAG_subroutine_type) 1173 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1174 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1175 addType(Arg, DIType(Args.getElement(i).getNode())); 1176 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ?? 1177 SPDie->addChild(Arg); 1178 } 1179 1180 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1181 return SPDie; 1182} 1183 1184/// createSubprogramDIE - Create new DIE using SP. 1185DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP) { 1186 DIE *SPDie = ModuleCU->getDIE(SP.getNode()); 1187 if (SPDie) 1188 return SPDie; 1189 1190 SPDie = createRawSubprogramDIE(SP); 1191 1192 if (!SP.isDefinition()) { 1193 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1); 1194 1195 // Add arguments. Do not add arguments for subprogram definition. They will 1196 // be handled while processing variables. 1197 DICompositeType SPTy = SP.getType(); 1198 DIArray Args = SPTy.getTypeArray(); 1199 unsigned SPTag = SPTy.getTag(); 1200 1201 if (SPTag == dwarf::DW_TAG_subroutine_type) 1202 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1203 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1204 addType(Arg, DIType(Args.getElement(i).getNode())); 1205 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ?? 1206 SPDie->addChild(Arg); 1207 } 1208 } 1209 1210 // DW_TAG_inlined_subroutine may refer to this DIE. 1211 ModuleCU->insertDIE(SP.getNode(), SPDie); 1212 return SPDie; 1213} 1214 1215/// findCompileUnit - Get the compile unit for the given descriptor. 1216/// 1217CompileUnit &DwarfDebug::findCompileUnit(DICompileUnit Unit) const { 1218 DenseMap<Value *, CompileUnit *>::const_iterator I = 1219 CompileUnitMap.find(Unit.getNode()); 1220 assert(I != CompileUnitMap.end() && "Missing compile unit."); 1221 return *I->second; 1222} 1223 1224/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction. 1225/// Initialize scope and update scope hierarchy. 1226DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI, 1227 MDNode *InlinedAt) { 1228 assert (N && "Invalid Scope encoding!"); 1229 assert (MI && "Missing machine instruction!"); 1230 bool GetConcreteScope = (MI && InlinedAt); 1231 1232 DbgScope *NScope = NULL; 1233 1234 if (InlinedAt) 1235 NScope = DbgScopeMap.lookup(InlinedAt); 1236 else 1237 NScope = DbgScopeMap.lookup(N); 1238 assert (NScope && "Unable to find working scope!"); 1239 1240 if (NScope->getFirstInsn()) 1241 return NScope; 1242 1243 DbgScope *Parent = NULL; 1244 if (GetConcreteScope) { 1245 DILocation IL(InlinedAt); 1246 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI, 1247 IL.getOrigLocation().getNode()); 1248 assert (Parent && "Unable to find Parent scope!"); 1249 NScope->setParent(Parent); 1250 Parent->addScope(NScope); 1251 } else if (DIDescriptor(N).isLexicalBlock()) { 1252 DILexicalBlock DB(N); 1253 if (!DB.getContext().isNull()) { 1254 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt); 1255 NScope->setParent(Parent); 1256 Parent->addScope(NScope); 1257 } 1258 } 1259 1260 NScope->setFirstInsn(MI); 1261 1262 if (!Parent && !InlinedAt) { 1263 StringRef SPName = DISubprogram(N).getLinkageName(); 1264 if (SPName == MF->getFunction()->getName()) 1265 CurrentFnDbgScope = NScope; 1266 } 1267 1268 if (GetConcreteScope) { 1269 ConcreteScopes[InlinedAt] = NScope; 1270 getOrCreateAbstractScope(N); 1271 } 1272 1273 return NScope; 1274} 1275 1276DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) { 1277 assert (N && "Invalid Scope encoding!"); 1278 1279 DbgScope *AScope = AbstractScopes.lookup(N); 1280 if (AScope) 1281 return AScope; 1282 1283 DbgScope *Parent = NULL; 1284 1285 DIDescriptor Scope(N); 1286 if (Scope.isLexicalBlock()) { 1287 DILexicalBlock DB(N); 1288 DIDescriptor ParentDesc = DB.getContext(); 1289 if (!ParentDesc.isNull()) 1290 Parent = getOrCreateAbstractScope(ParentDesc.getNode()); 1291 } 1292 1293 AScope = new DbgScope(Parent, DIDescriptor(N), NULL); 1294 1295 if (Parent) 1296 Parent->addScope(AScope); 1297 AScope->setAbstractScope(); 1298 AbstractScopes[N] = AScope; 1299 if (DIDescriptor(N).isSubprogram()) 1300 AbstractScopesList.push_back(AScope); 1301 return AScope; 1302} 1303 1304/// updateSubprogramScopeDIE - Find DIE for the given subprogram and 1305/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes. 1306/// If there are global variables in this scope then create and insert 1307/// DIEs for these variables. 1308DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) { 1309 1310 DIE *SPDie = ModuleCU->getDIE(SPNode); 1311 assert (SPDie && "Unable to find subprogram DIE!"); 1312 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1313 DWLabel("func_begin", SubprogramCount)); 1314 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1315 DWLabel("func_end", SubprogramCount)); 1316 MachineLocation Location(RI->getFrameRegister(*MF)); 1317 addAddress(SPDie, dwarf::DW_AT_frame_base, Location); 1318 1319 if (!DISubprogram(SPNode).isLocalToUnit()) 1320 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1); 1321 1322 return SPDie; 1323} 1324 1325/// constructLexicalScope - Construct new DW_TAG_lexical_block 1326/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels. 1327DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) { 1328 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID()); 1329 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID()); 1330 1331 // Ignore empty scopes. 1332 if (StartID == EndID && StartID != 0) 1333 return NULL; 1334 1335 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block); 1336 if (Scope->isAbstractScope()) 1337 return ScopeDIE; 1338 1339 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1340 StartID ? 1341 DWLabel("label", StartID) 1342 : DWLabel("func_begin", SubprogramCount)); 1343 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1344 EndID ? 1345 DWLabel("label", EndID) 1346 : DWLabel("func_end", SubprogramCount)); 1347 1348 1349 1350 return ScopeDIE; 1351} 1352 1353/// constructInlinedScopeDIE - This scope represents inlined body of 1354/// a function. Construct DIE to represent this concrete inlined copy 1355/// of the function. 1356DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) { 1357 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID()); 1358 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID()); 1359 assert (StartID && "Invalid starting label for an inlined scope!"); 1360 assert (EndID && "Invalid end label for an inlined scope!"); 1361 // Ignore empty scopes. 1362 if (StartID == EndID && StartID != 0) 1363 return NULL; 1364 1365 DIScope DS(Scope->getScopeNode()); 1366 if (DS.isNull()) 1367 return NULL; 1368 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine); 1369 1370 DISubprogram InlinedSP = getDISubprogram(DS.getNode()); 1371 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode()); 1372 assert (OriginDIE && "Unable to find Origin DIE!"); 1373 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, 1374 dwarf::DW_FORM_ref4, OriginDIE); 1375 1376 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 1377 DWLabel("label", StartID)); 1378 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, 1379 DWLabel("label", EndID)); 1380 1381 InlinedSubprogramDIEs.insert(OriginDIE); 1382 1383 // Track the start label for this inlined function. 1384 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 1385 I = InlineInfo.find(InlinedSP.getNode()); 1386 1387 if (I == InlineInfo.end()) { 1388 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID, 1389 ScopeDIE)); 1390 InlinedSPNodes.push_back(InlinedSP.getNode()); 1391 } else 1392 I->second.push_back(std::make_pair(StartID, ScopeDIE)); 1393 1394 StringPool.insert(InlinedSP.getName()); 1395 StringPool.insert(InlinedSP.getLinkageName()); 1396 DILocation DL(Scope->getInlinedAt()); 1397 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID()); 1398 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber()); 1399 1400 return ScopeDIE; 1401} 1402 1403 1404/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1405DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) { 1406 // Get the descriptor. 1407 const DIVariable &VD = DV->getVariable(); 1408 StringRef Name = VD.getName(); 1409 if (Name.empty()) 1410 return NULL; 1411 1412 // Translate tag to proper Dwarf tag. The result variable is dropped for 1413 // now. 1414 unsigned Tag; 1415 switch (VD.getTag()) { 1416 case dwarf::DW_TAG_return_variable: 1417 return NULL; 1418 case dwarf::DW_TAG_arg_variable: 1419 Tag = dwarf::DW_TAG_formal_parameter; 1420 break; 1421 case dwarf::DW_TAG_auto_variable: // fall thru 1422 default: 1423 Tag = dwarf::DW_TAG_variable; 1424 break; 1425 } 1426 1427 // Define variable debug information entry. 1428 DIE *VariableDie = new DIE(Tag); 1429 1430 1431 DIE *AbsDIE = NULL; 1432 if (DbgVariable *AV = DV->getAbstractVariable()) 1433 AbsDIE = AV->getDIE(); 1434 1435 if (AbsDIE) { 1436 DIScope DS(Scope->getScopeNode()); 1437 DISubprogram InlinedSP = getDISubprogram(DS.getNode()); 1438 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode()); 1439 (void) OriginSPDIE; 1440 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!"); 1441 DIE *AbsDIE = DV->getAbstractVariable()->getDIE(); 1442 assert (AbsDIE && "Unable to find Origin DIE for the Variable!"); 1443 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1444 dwarf::DW_FORM_ref4, AbsDIE); 1445 } 1446 else { 1447 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name); 1448 addSourceLine(VariableDie, &VD); 1449 1450 // Add variable type. 1451 // FIXME: isBlockByrefVariable should be reformulated in terms of complex 1452 // addresses instead. 1453 if (VD.isBlockByrefVariable()) 1454 addType(VariableDie, getBlockByrefType(VD.getType(), Name)); 1455 else 1456 addType(VariableDie, VD.getType()); 1457 } 1458 1459 // Add variable address. 1460 if (!Scope->isAbstractScope()) { 1461 MachineLocation Location; 1462 unsigned FrameReg; 1463 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg); 1464 Location.set(FrameReg, Offset); 1465 1466 if (VD.hasComplexAddress()) 1467 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1468 else if (VD.isBlockByrefVariable()) 1469 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location); 1470 else 1471 addAddress(VariableDie, dwarf::DW_AT_location, Location); 1472 } 1473 DV->setDIE(VariableDie); 1474 return VariableDie; 1475 1476} 1477 1478void DwarfDebug::addPubTypes(DISubprogram SP) { 1479 DICompositeType SPTy = SP.getType(); 1480 unsigned SPTag = SPTy.getTag(); 1481 if (SPTag != dwarf::DW_TAG_subroutine_type) 1482 return; 1483 1484 DIArray Args = SPTy.getTypeArray(); 1485 if (Args.isNull()) 1486 return; 1487 1488 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 1489 DIType ATy(Args.getElement(i).getNode()); 1490 if (ATy.isNull()) 1491 continue; 1492 DICompositeType CATy = getDICompositeType(ATy); 1493 if (!CATy.isNull() && !CATy.getName().empty()) { 1494 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode())) 1495 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry()); 1496 } 1497 } 1498} 1499 1500/// constructScopeDIE - Construct a DIE for this scope. 1501DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) { 1502 if (!Scope) 1503 return NULL; 1504 DIScope DS(Scope->getScopeNode()); 1505 if (DS.isNull()) 1506 return NULL; 1507 1508 DIE *ScopeDIE = NULL; 1509 if (Scope->getInlinedAt()) 1510 ScopeDIE = constructInlinedScopeDIE(Scope); 1511 else if (DS.isSubprogram()) { 1512 if (Scope->isAbstractScope()) 1513 ScopeDIE = ModuleCU->getDIE(DS.getNode()); 1514 else 1515 ScopeDIE = updateSubprogramScopeDIE(DS.getNode()); 1516 } 1517 else { 1518 ScopeDIE = constructLexicalScopeDIE(Scope); 1519 if (!ScopeDIE) return NULL; 1520 } 1521 1522 // Add variables to scope. 1523 SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables(); 1524 for (unsigned i = 0, N = Variables.size(); i < N; ++i) { 1525 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope); 1526 if (VariableDIE) 1527 ScopeDIE->addChild(VariableDIE); 1528 } 1529 1530 // Add nested scopes. 1531 SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes(); 1532 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) { 1533 // Define the Scope debug information entry. 1534 DIE *NestedDIE = constructScopeDIE(Scopes[j]); 1535 if (NestedDIE) 1536 ScopeDIE->addChild(NestedDIE); 1537 } 1538 1539 if (DS.isSubprogram()) 1540 addPubTypes(DISubprogram(DS.getNode())); 1541 1542 return ScopeDIE; 1543} 1544 1545/// GetOrCreateSourceID - Look up the source id with the given directory and 1546/// source file names. If none currently exists, create a new id and insert it 1547/// in the SourceIds map. This can update DirectoryNames and SourceFileNames 1548/// maps as well. 1549unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) { 1550 unsigned DId; 1551 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName); 1552 if (DI != DirectoryIdMap.end()) { 1553 DId = DI->getValue(); 1554 } else { 1555 DId = DirectoryNames.size() + 1; 1556 DirectoryIdMap[DirName] = DId; 1557 DirectoryNames.push_back(DirName); 1558 } 1559 1560 unsigned FId; 1561 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName); 1562 if (FI != SourceFileIdMap.end()) { 1563 FId = FI->getValue(); 1564 } else { 1565 FId = SourceFileNames.size() + 1; 1566 SourceFileIdMap[FileName] = FId; 1567 SourceFileNames.push_back(FileName); 1568 } 1569 1570 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI = 1571 SourceIdMap.find(std::make_pair(DId, FId)); 1572 if (SI != SourceIdMap.end()) 1573 return SI->second; 1574 1575 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0. 1576 SourceIdMap[std::make_pair(DId, FId)] = SrcId; 1577 SourceIds.push_back(std::make_pair(DId, FId)); 1578 1579 return SrcId; 1580} 1581 1582void DwarfDebug::constructCompileUnit(MDNode *N) { 1583 DICompileUnit DIUnit(N); 1584 StringRef FN = DIUnit.getFilename(); 1585 StringRef Dir = DIUnit.getDirectory(); 1586 unsigned ID = GetOrCreateSourceID(Dir, FN); 1587 1588 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); 1589 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 1590 DWLabel("section_line", 0), DWLabel("section_line", 0), 1591 false); 1592 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string, 1593 DIUnit.getProducer()); 1594 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1, 1595 DIUnit.getLanguage()); 1596 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN); 1597 1598 if (!Dir.empty()) 1599 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir); 1600 if (DIUnit.isOptimized()) 1601 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1); 1602 1603 StringRef Flags = DIUnit.getFlags(); 1604 if (!Flags.empty()) 1605 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags); 1606 1607 unsigned RVer = DIUnit.getRunTimeVersion(); 1608 if (RVer) 1609 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, 1610 dwarf::DW_FORM_data1, RVer); 1611 1612 CompileUnit *Unit = new CompileUnit(ID, Die); 1613 if (!ModuleCU && DIUnit.isMain()) { 1614 // Use first compile unit marked as isMain as the compile unit 1615 // for this module. 1616 ModuleCU = Unit; 1617 } 1618 1619 CompileUnitMap[DIUnit.getNode()] = Unit; 1620 CompileUnits.push_back(Unit); 1621} 1622 1623void DwarfDebug::constructGlobalVariableDIE(MDNode *N) { 1624 DIGlobalVariable DI_GV(N); 1625 1626 // If debug information is malformed then ignore it. 1627 if (DI_GV.Verify() == false) 1628 return; 1629 1630 // Check for pre-existence. 1631 if (ModuleCU->getDIE(DI_GV.getNode())) 1632 return; 1633 1634 DIE *VariableDie = createGlobalVariableDIE(DI_GV); 1635 1636 // Add to map. 1637 ModuleCU->insertDIE(N, VariableDie); 1638 1639 // Add to context owner. 1640 addToContextOwner(VariableDie, DI_GV.getContext()); 1641 1642 // Expose as global. FIXME - need to check external flag. 1643 ModuleCU->addGlobal(DI_GV.getName(), VariableDie); 1644 1645 DIType GTy = DI_GV.getType(); 1646 if (GTy.isCompositeType() && !GTy.getName().empty()) { 1647 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode()); 1648 assert (Entry && "Missing global type!"); 1649 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry()); 1650 } 1651 return; 1652} 1653 1654void DwarfDebug::constructSubprogramDIE(MDNode *N) { 1655 DISubprogram SP(N); 1656 1657 // Check for pre-existence. 1658 if (ModuleCU->getDIE(N)) 1659 return; 1660 1661 if (!SP.isDefinition()) 1662 // This is a method declaration which will be handled while constructing 1663 // class type. 1664 return; 1665 1666 DIE *SubprogramDie = createSubprogramDIE(SP); 1667 1668 // Add to map. 1669 ModuleCU->insertDIE(N, SubprogramDie); 1670 1671 // Add to context owner. 1672 if (SP.getContext().getNode() == SP.getCompileUnit().getNode()) 1673 if (TopLevelDIEs.insert(SubprogramDie)) 1674 TopLevelDIEsVector.push_back(SubprogramDie); 1675 1676 // Expose as global. 1677 ModuleCU->addGlobal(SP.getName(), SubprogramDie); 1678 1679 return; 1680} 1681 1682/// beginModule - Emit all Dwarf sections that should come prior to the 1683/// content. Create global DIEs and emit initial debug info sections. 1684/// This is inovked by the target AsmPrinter. 1685void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) { 1686 this->M = M; 1687 1688 if (TimePassesIsEnabled) 1689 DebugTimer->startTimer(); 1690 1691 if (!MAI->doesSupportDebugInformation()) 1692 return; 1693 1694 DebugInfoFinder DbgFinder; 1695 DbgFinder.processModule(*M); 1696 1697 // Create all the compile unit DIEs. 1698 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), 1699 E = DbgFinder.compile_unit_end(); I != E; ++I) 1700 constructCompileUnit(*I); 1701 1702 if (CompileUnits.empty()) { 1703 if (TimePassesIsEnabled) 1704 DebugTimer->stopTimer(); 1705 1706 return; 1707 } 1708 1709 // If main compile unit for this module is not seen than randomly 1710 // select first compile unit. 1711 if (!ModuleCU) 1712 ModuleCU = CompileUnits[0]; 1713 1714 // Create DIEs for each subprogram. 1715 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), 1716 E = DbgFinder.subprogram_end(); I != E; ++I) 1717 constructSubprogramDIE(*I); 1718 1719 // Create DIEs for each global variable. 1720 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), 1721 E = DbgFinder.global_variable_end(); I != E; ++I) 1722 constructGlobalVariableDIE(*I); 1723 1724 MMI = mmi; 1725 shouldEmit = true; 1726 MMI->setDebugInfoAvailability(true); 1727 1728 // Prime section data. 1729 SectionMap.insert(Asm->getObjFileLowering().getTextSection()); 1730 1731 // Print out .file directives to specify files for .loc directives. These are 1732 // printed out early so that they precede any .loc directives. 1733 if (MAI->hasDotLocAndDotFile()) { 1734 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) { 1735 // Remember source id starts at 1. 1736 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i); 1737 sys::Path FullPath(getSourceDirectoryName(Id.first)); 1738 bool AppendOk = 1739 FullPath.appendComponent(getSourceFileName(Id.second)); 1740 assert(AppendOk && "Could not append filename to directory!"); 1741 AppendOk = false; 1742 Asm->EmitFile(i, FullPath.str()); 1743 Asm->EOL(); 1744 } 1745 } 1746 1747 // Emit initial sections 1748 emitInitial(); 1749 1750 if (TimePassesIsEnabled) 1751 DebugTimer->stopTimer(); 1752} 1753 1754/// endModule - Emit all Dwarf sections that should come after the content. 1755/// 1756void DwarfDebug::endModule() { 1757 if (!ModuleCU) 1758 return; 1759 1760 if (TimePassesIsEnabled) 1761 DebugTimer->startTimer(); 1762 1763 // Attach DW_AT_inline attribute with inlined subprogram DIEs. 1764 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(), 1765 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) { 1766 DIE *ISP = *AI; 1767 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined); 1768 } 1769 1770 // Insert top level DIEs. 1771 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(), 1772 TE = TopLevelDIEsVector.end(); TI != TE; ++TI) 1773 ModuleCU->getCUDie()->addChild(*TI); 1774 1775 for (DenseMap<DIE *, WeakVH>::iterator CI = ContainingTypeMap.begin(), 1776 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1777 DIE *SPDie = CI->first; 1778 MDNode *N = dyn_cast_or_null<MDNode>(CI->second); 1779 if (!N) continue; 1780 DIE *NDie = ModuleCU->getDIE(N); 1781 if (!NDie) continue; 1782 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1783 addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1784 } 1785 1786 // Standard sections final addresses. 1787 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection()); 1788 EmitLabel("text_end", 0); 1789 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection()); 1790 EmitLabel("data_end", 0); 1791 1792 // End text sections. 1793 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) { 1794 Asm->OutStreamer.SwitchSection(SectionMap[i]); 1795 EmitLabel("section_end", i); 1796 } 1797 1798 // Emit common frame information. 1799 emitCommonDebugFrame(); 1800 1801 // Emit function debug frame information 1802 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(), 1803 E = DebugFrames.end(); I != E; ++I) 1804 emitFunctionDebugFrame(*I); 1805 1806 // Compute DIE offsets and sizes. 1807 computeSizeAndOffsets(); 1808 1809 // Emit all the DIEs into a debug info section 1810 emitDebugInfo(); 1811 1812 // Corresponding abbreviations into a abbrev section. 1813 emitAbbreviations(); 1814 1815 // Emit source line correspondence into a debug line section. 1816 emitDebugLines(); 1817 1818 // Emit info into a debug pubnames section. 1819 emitDebugPubNames(); 1820 1821 // Emit info into a debug pubtypes section. 1822 emitDebugPubTypes(); 1823 1824 // Emit info into a debug str section. 1825 emitDebugStr(); 1826 1827 // Emit info into a debug loc section. 1828 emitDebugLoc(); 1829 1830 // Emit info into a debug aranges section. 1831 EmitDebugARanges(); 1832 1833 // Emit info into a debug ranges section. 1834 emitDebugRanges(); 1835 1836 // Emit info into a debug macinfo section. 1837 emitDebugMacInfo(); 1838 1839 // Emit inline info. 1840 emitDebugInlineInfo(); 1841 1842 if (TimePassesIsEnabled) 1843 DebugTimer->stopTimer(); 1844} 1845 1846/// findAbstractVariable - Find abstract variable, if any, associated with Var. 1847DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, 1848 unsigned FrameIdx, 1849 DILocation &ScopeLoc) { 1850 1851 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode()); 1852 if (AbsDbgVariable) 1853 return AbsDbgVariable; 1854 1855 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode()); 1856 if (!Scope) 1857 return NULL; 1858 1859 AbsDbgVariable = new DbgVariable(Var, FrameIdx); 1860 Scope->addVariable(AbsDbgVariable); 1861 AbstractVariables[Var.getNode()] = AbsDbgVariable; 1862 return AbsDbgVariable; 1863} 1864 1865/// collectVariableInfo - Populate DbgScope entries with variables' info. 1866void DwarfDebug::collectVariableInfo() { 1867 if (!MMI) return; 1868 1869 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo(); 1870 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(), 1871 VE = VMap.end(); VI != VE; ++VI) { 1872 MetadataBase *MB = VI->first; 1873 MDNode *Var = dyn_cast_or_null<MDNode>(MB); 1874 if (!Var) continue; 1875 DIVariable DV (Var); 1876 std::pair< unsigned, MDNode *> VP = VI->second; 1877 DILocation ScopeLoc(VP.second); 1878 1879 DbgScope *Scope = 1880 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode()); 1881 if (!Scope) 1882 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode()); 1883 // If variable scope is not found then skip this variable. 1884 if (!Scope) 1885 continue; 1886 1887 DbgVariable *RegVar = new DbgVariable(DV, VP.first); 1888 Scope->addVariable(RegVar); 1889 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, 1890 ScopeLoc)) 1891 RegVar->setAbstractVariable(AbsDbgVariable); 1892 } 1893} 1894 1895/// beginScope - Process beginning of a scope starting at Label. 1896void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) { 1897 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI); 1898 if (I == DbgScopeBeginMap.end()) 1899 return; 1900 ScopeVector &SD = I->second; 1901 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end(); 1902 SDI != SDE; ++SDI) 1903 (*SDI)->setStartLabelID(Label); 1904} 1905 1906/// endScope - Process end of a scope. 1907void DwarfDebug::endScope(const MachineInstr *MI) { 1908 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI); 1909 if (I == DbgScopeEndMap.end()) 1910 return; 1911 1912 unsigned Label = MMI->NextLabelID(); 1913 Asm->printLabel(Label); 1914 O << '\n'; 1915 1916 SmallVector<DbgScope *, 2> &SD = I->second; 1917 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end(); 1918 SDI != SDE; ++SDI) 1919 (*SDI)->setEndLabelID(Label); 1920 return; 1921} 1922 1923/// createDbgScope - Create DbgScope for the scope. 1924void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) { 1925 1926 if (!InlinedAt) { 1927 DbgScope *WScope = DbgScopeMap.lookup(Scope); 1928 if (WScope) 1929 return; 1930 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL); 1931 DbgScopeMap.insert(std::make_pair(Scope, WScope)); 1932 if (DIDescriptor(Scope).isLexicalBlock()) 1933 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL); 1934 return; 1935 } 1936 1937 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt); 1938 if (WScope) 1939 return; 1940 1941 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt); 1942 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope)); 1943 DILocation DL(InlinedAt); 1944 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode()); 1945} 1946 1947/// extractScopeInformation - Scan machine instructions in this function 1948/// and collect DbgScopes. Return true, if atleast one scope was found. 1949bool DwarfDebug::extractScopeInformation(MachineFunction *MF) { 1950 // If scope information was extracted using .dbg intrinsics then there is not 1951 // any need to extract these information by scanning each instruction. 1952 if (!DbgScopeMap.empty()) 1953 return false; 1954 1955 // Scan each instruction and create scopes. First build working set of scopes. 1956 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1957 I != E; ++I) { 1958 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1959 II != IE; ++II) { 1960 const MachineInstr *MInsn = II; 1961 DebugLoc DL = MInsn->getDebugLoc(); 1962 if (DL.isUnknown()) continue; 1963 DebugLocTuple DLT = MF->getDebugLocTuple(DL); 1964 if (!DLT.Scope) continue; 1965 // There is no need to create another DIE for compile unit. For all 1966 // other scopes, create one DbgScope now. This will be translated 1967 // into a scope DIE at the end. 1968 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue; 1969 createDbgScope(DLT.Scope, DLT.InlinedAtLoc); 1970 } 1971 } 1972 1973 1974 // Build scope hierarchy using working set of scopes. 1975 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 1976 I != E; ++I) { 1977 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 1978 II != IE; ++II) { 1979 const MachineInstr *MInsn = II; 1980 DebugLoc DL = MInsn->getDebugLoc(); 1981 if (DL.isUnknown()) continue; 1982 DebugLocTuple DLT = MF->getDebugLocTuple(DL); 1983 if (!DLT.Scope) continue; 1984 // There is no need to create another DIE for compile unit. For all 1985 // other scopes, create one DbgScope now. This will be translated 1986 // into a scope DIE at the end. 1987 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue; 1988 DbgScope *Scope = getUpdatedDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc); 1989 Scope->setLastInsn(MInsn); 1990 } 1991 } 1992 1993 // If a scope's last instruction is not set then use its child scope's 1994 // last instruction as this scope's last instrunction. 1995 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(), 1996 DE = DbgScopeMap.end(); DI != DE; ++DI) { 1997 if (DI->second->isAbstractScope()) 1998 continue; 1999 assert (DI->second->getFirstInsn() && "Invalid first instruction!"); 2000 DI->second->fixInstructionMarkers(); 2001 assert (DI->second->getLastInsn() && "Invalid last instruction!"); 2002 } 2003 2004 // Each scope has first instruction and last instruction to mark beginning 2005 // and end of a scope respectively. Create an inverse map that list scopes 2006 // starts (and ends) with an instruction. One instruction may start (or end) 2007 // multiple scopes. 2008 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(), 2009 DE = DbgScopeMap.end(); DI != DE; ++DI) { 2010 DbgScope *S = DI->second; 2011 if (S->isAbstractScope()) 2012 continue; 2013 const MachineInstr *MI = S->getFirstInsn(); 2014 assert (MI && "DbgScope does not have first instruction!"); 2015 2016 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI); 2017 if (IDI != DbgScopeBeginMap.end()) 2018 IDI->second.push_back(S); 2019 else 2020 DbgScopeBeginMap[MI].push_back(S); 2021 2022 MI = S->getLastInsn(); 2023 assert (MI && "DbgScope does not have last instruction!"); 2024 IDI = DbgScopeEndMap.find(MI); 2025 if (IDI != DbgScopeEndMap.end()) 2026 IDI->second.push_back(S); 2027 else 2028 DbgScopeEndMap[MI].push_back(S); 2029 } 2030 2031 return !DbgScopeMap.empty(); 2032} 2033 2034/// beginFunction - Gather pre-function debug information. Assumes being 2035/// emitted immediately after the function entry point. 2036void DwarfDebug::beginFunction(MachineFunction *MF) { 2037 this->MF = MF; 2038 2039 if (!ShouldEmitDwarfDebug()) return; 2040 2041 if (TimePassesIsEnabled) 2042 DebugTimer->startTimer(); 2043 2044 if (!extractScopeInformation(MF)) 2045 return; 2046 2047 collectVariableInfo(); 2048 2049 // Begin accumulating function debug information. 2050 MMI->BeginFunction(MF); 2051 2052 // Assumes in correct section after the entry point. 2053 EmitLabel("func_begin", ++SubprogramCount); 2054 2055 // Emit label for the implicitly defined dbg.stoppoint at the start of the 2056 // function. 2057 DebugLoc FDL = MF->getDefaultDebugLoc(); 2058 if (!FDL.isUnknown()) { 2059 DebugLocTuple DLT = MF->getDebugLocTuple(FDL); 2060 unsigned LabelID = 0; 2061 DISubprogram SP = getDISubprogram(DLT.Scope); 2062 if (!SP.isNull()) 2063 LabelID = recordSourceLine(SP.getLineNumber(), 0, DLT.Scope); 2064 else 2065 LabelID = recordSourceLine(DLT.Line, DLT.Col, DLT.Scope); 2066 Asm->printLabel(LabelID); 2067 O << '\n'; 2068 } 2069 if (TimePassesIsEnabled) 2070 DebugTimer->stopTimer(); 2071} 2072 2073/// endFunction - Gather and emit post-function debug information. 2074/// 2075void DwarfDebug::endFunction(MachineFunction *MF) { 2076 if (!ShouldEmitDwarfDebug()) return; 2077 2078 if (TimePassesIsEnabled) 2079 DebugTimer->startTimer(); 2080 2081 if (DbgScopeMap.empty()) 2082 return; 2083 2084 // Define end label for subprogram. 2085 EmitLabel("func_end", SubprogramCount); 2086 2087 // Get function line info. 2088 if (!Lines.empty()) { 2089 // Get section line info. 2090 unsigned ID = SectionMap.insert(Asm->getCurrentSection()); 2091 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID); 2092 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1]; 2093 // Append the function info to section info. 2094 SectionLineInfos.insert(SectionLineInfos.end(), 2095 Lines.begin(), Lines.end()); 2096 } 2097 2098 // Construct abstract scopes. 2099 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(), 2100 AE = AbstractScopesList.end(); AI != AE; ++AI) 2101 constructScopeDIE(*AI); 2102 2103 constructScopeDIE(CurrentFnDbgScope); 2104 2105 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount, 2106 MMI->getFrameMoves())); 2107 2108 // Clear debug info 2109 CurrentFnDbgScope = NULL; 2110 DbgScopeMap.clear(); 2111 DbgScopeBeginMap.clear(); 2112 DbgScopeEndMap.clear(); 2113 ConcreteScopes.clear(); 2114 AbstractScopesList.clear(); 2115 2116 Lines.clear(); 2117 2118 if (TimePassesIsEnabled) 2119 DebugTimer->stopTimer(); 2120} 2121 2122/// recordSourceLine - Records location information and associates it with a 2123/// label. Returns a unique label ID used to generate a label and provide 2124/// correspondence to the source line list. 2125unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, 2126 MDNode *S) { 2127 if (!MMI) 2128 return 0; 2129 2130 if (TimePassesIsEnabled) 2131 DebugTimer->startTimer(); 2132 2133 StringRef Dir; 2134 StringRef Fn; 2135 2136 DIDescriptor Scope(S); 2137 if (Scope.isCompileUnit()) { 2138 DICompileUnit CU(S); 2139 Dir = CU.getDirectory(); 2140 Fn = CU.getFilename(); 2141 } else if (Scope.isSubprogram()) { 2142 DISubprogram SP(S); 2143 Dir = SP.getDirectory(); 2144 Fn = SP.getFilename(); 2145 } else if (Scope.isLexicalBlock()) { 2146 DILexicalBlock DB(S); 2147 Dir = DB.getDirectory(); 2148 Fn = DB.getFilename(); 2149 } else 2150 assert (0 && "Unexpected scope info"); 2151 2152 unsigned Src = GetOrCreateSourceID(Dir, Fn); 2153 unsigned ID = MMI->NextLabelID(); 2154 Lines.push_back(SrcLineInfo(Line, Col, Src, ID)); 2155 2156 if (TimePassesIsEnabled) 2157 DebugTimer->stopTimer(); 2158 2159 return ID; 2160} 2161 2162/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be 2163/// timed. Look up the source id with the given directory and source file 2164/// names. If none currently exists, create a new id and insert it in the 2165/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as 2166/// well. 2167unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName, 2168 const std::string &FileName) { 2169 if (TimePassesIsEnabled) 2170 DebugTimer->startTimer(); 2171 2172 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str()); 2173 2174 if (TimePassesIsEnabled) 2175 DebugTimer->stopTimer(); 2176 2177 return SrcId; 2178} 2179 2180//===----------------------------------------------------------------------===// 2181// Emit Methods 2182//===----------------------------------------------------------------------===// 2183 2184/// computeSizeAndOffset - Compute the size and offset of a DIE. 2185/// 2186unsigned 2187DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) { 2188 // Get the children. 2189 const std::vector<DIE *> &Children = Die->getChildren(); 2190 2191 // If not last sibling and has children then add sibling offset attribute. 2192 if (!Last && !Children.empty()) Die->addSiblingOffset(); 2193 2194 // Record the abbreviation. 2195 assignAbbrevNumber(Die->getAbbrev()); 2196 2197 // Get the abbreviation for this DIE. 2198 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2199 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2200 2201 // Set DIE offset 2202 Die->setOffset(Offset); 2203 2204 // Start the size with the size of abbreviation code. 2205 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber); 2206 2207 const SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2208 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2209 2210 // Size the DIE attribute values. 2211 for (unsigned i = 0, N = Values.size(); i < N; ++i) 2212 // Size attribute value. 2213 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm()); 2214 2215 // Size the DIE children if any. 2216 if (!Children.empty()) { 2217 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes && 2218 "Children flag not set"); 2219 2220 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2221 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M); 2222 2223 // End of children marker. 2224 Offset += sizeof(int8_t); 2225 } 2226 2227 Die->setSize(Offset - Die->getOffset()); 2228 return Offset; 2229} 2230 2231/// computeSizeAndOffsets - Compute the size and offset of all the DIEs. 2232/// 2233void DwarfDebug::computeSizeAndOffsets() { 2234 // Compute size of compile unit header. 2235 static unsigned Offset = 2236 sizeof(int32_t) + // Length of Compilation Unit Info 2237 sizeof(int16_t) + // DWARF version number 2238 sizeof(int32_t) + // Offset Into Abbrev. Section 2239 sizeof(int8_t); // Pointer Size (in bytes) 2240 2241 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true); 2242 CompileUnitOffsets[ModuleCU] = 0; 2243} 2244 2245/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc 2246/// tools to recognize the object file contains Dwarf information. 2247void DwarfDebug::emitInitial() { 2248 // Check to see if we already emitted intial headers. 2249 if (didInitial) return; 2250 didInitial = true; 2251 2252 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 2253 2254 // Dwarf sections base addresses. 2255 if (MAI->doesDwarfRequireFrameSection()) { 2256 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection()); 2257 EmitLabel("section_debug_frame", 0); 2258 } 2259 2260 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection()); 2261 EmitLabel("section_info", 0); 2262 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection()); 2263 EmitLabel("section_abbrev", 0); 2264 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection()); 2265 EmitLabel("section_aranges", 0); 2266 2267 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) { 2268 Asm->OutStreamer.SwitchSection(LineInfoDirective); 2269 EmitLabel("section_macinfo", 0); 2270 } 2271 2272 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection()); 2273 EmitLabel("section_line", 0); 2274 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection()); 2275 EmitLabel("section_loc", 0); 2276 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection()); 2277 EmitLabel("section_pubnames", 0); 2278 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection()); 2279 EmitLabel("section_pubtypes", 0); 2280 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection()); 2281 EmitLabel("section_str", 0); 2282 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection()); 2283 EmitLabel("section_ranges", 0); 2284 2285 Asm->OutStreamer.SwitchSection(TLOF.getTextSection()); 2286 EmitLabel("text_begin", 0); 2287 Asm->OutStreamer.SwitchSection(TLOF.getDataSection()); 2288 EmitLabel("data_begin", 0); 2289} 2290 2291/// emitDIE - Recusively Emits a debug information entry. 2292/// 2293void DwarfDebug::emitDIE(DIE *Die) { 2294 // Get the abbreviation for this DIE. 2295 unsigned AbbrevNumber = Die->getAbbrevNumber(); 2296 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1]; 2297 2298 Asm->EOL(); 2299 2300 // Emit the code (index) for the abbreviation. 2301 Asm->EmitULEB128Bytes(AbbrevNumber); 2302 2303 if (Asm->isVerbose()) 2304 Asm->EOL(std::string("Abbrev [" + 2305 utostr(AbbrevNumber) + 2306 "] 0x" + utohexstr(Die->getOffset()) + 2307 ":0x" + utohexstr(Die->getSize()) + " " + 2308 dwarf::TagString(Abbrev->getTag()))); 2309 else 2310 Asm->EOL(); 2311 2312 SmallVector<DIEValue*, 32> &Values = Die->getValues(); 2313 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData(); 2314 2315 // Emit the DIE attribute values. 2316 for (unsigned i = 0, N = Values.size(); i < N; ++i) { 2317 unsigned Attr = AbbrevData[i].getAttribute(); 2318 unsigned Form = AbbrevData[i].getForm(); 2319 assert(Form && "Too many attributes for DIE (check abbreviation)"); 2320 2321 switch (Attr) { 2322 case dwarf::DW_AT_sibling: 2323 Asm->EmitInt32(Die->getSiblingOffset()); 2324 break; 2325 case dwarf::DW_AT_abstract_origin: { 2326 DIEEntry *E = cast<DIEEntry>(Values[i]); 2327 DIE *Origin = E->getEntry(); 2328 unsigned Addr = Origin->getOffset(); 2329 Asm->EmitInt32(Addr); 2330 break; 2331 } 2332 default: 2333 // Emit an attribute using the defined form. 2334 Values[i]->EmitValue(this, Form); 2335 break; 2336 } 2337 2338 Asm->EOL(dwarf::AttributeString(Attr)); 2339 } 2340 2341 // Emit the DIE children if any. 2342 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) { 2343 const std::vector<DIE *> &Children = Die->getChildren(); 2344 2345 for (unsigned j = 0, M = Children.size(); j < M; ++j) 2346 emitDIE(Children[j]); 2347 2348 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark"); 2349 } 2350} 2351 2352/// emitDebugInfo - Emit the debug info section. 2353/// 2354void DwarfDebug::emitDebugInfo() { 2355 // Start debug info section. 2356 Asm->OutStreamer.SwitchSection( 2357 Asm->getObjFileLowering().getDwarfInfoSection()); 2358 DIE *Die = ModuleCU->getCUDie(); 2359 2360 // Emit the compile units header. 2361 EmitLabel("info_begin", ModuleCU->getID()); 2362 2363 // Emit size of content not including length itself 2364 unsigned ContentSize = Die->getSize() + 2365 sizeof(int16_t) + // DWARF version number 2366 sizeof(int32_t) + // Offset Into Abbrev. Section 2367 sizeof(int8_t) + // Pointer Size (in bytes) 2368 sizeof(int32_t); // FIXME - extra pad for gdb bug. 2369 2370 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info"); 2371 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number"); 2372 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false); 2373 Asm->EOL("Offset Into Abbrev. Section"); 2374 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); 2375 2376 emitDIE(Die); 2377 // FIXME - extra padding for gdb bug. 2378 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2379 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2380 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2381 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB"); 2382 EmitLabel("info_end", ModuleCU->getID()); 2383 2384 Asm->EOL(); 2385 2386} 2387 2388/// emitAbbreviations - Emit the abbreviation section. 2389/// 2390void DwarfDebug::emitAbbreviations() const { 2391 // Check to see if it is worth the effort. 2392 if (!Abbreviations.empty()) { 2393 // Start the debug abbrev section. 2394 Asm->OutStreamer.SwitchSection( 2395 Asm->getObjFileLowering().getDwarfAbbrevSection()); 2396 2397 EmitLabel("abbrev_begin", 0); 2398 2399 // For each abbrevation. 2400 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) { 2401 // Get abbreviation data 2402 const DIEAbbrev *Abbrev = Abbreviations[i]; 2403 2404 // Emit the abbrevations code (base 1 index.) 2405 Asm->EmitULEB128Bytes(Abbrev->getNumber()); 2406 Asm->EOL("Abbreviation Code"); 2407 2408 // Emit the abbreviations data. 2409 Abbrev->Emit(Asm); 2410 2411 Asm->EOL(); 2412 } 2413 2414 // Mark end of abbreviations. 2415 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)"); 2416 2417 EmitLabel("abbrev_end", 0); 2418 Asm->EOL(); 2419 } 2420} 2421 2422/// emitEndOfLineMatrix - Emit the last address of the section and the end of 2423/// the line matrix. 2424/// 2425void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { 2426 // Define last address of section. 2427 Asm->EmitInt8(0); Asm->EOL("Extended Op"); 2428 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size"); 2429 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address"); 2430 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label"); 2431 2432 // Mark end of matrix. 2433 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence"); 2434 Asm->EmitULEB128Bytes(1); Asm->EOL(); 2435 Asm->EmitInt8(1); Asm->EOL(); 2436} 2437 2438/// emitDebugLines - Emit source line information. 2439/// 2440void DwarfDebug::emitDebugLines() { 2441 // If the target is using .loc/.file, the assembler will be emitting the 2442 // .debug_line table automatically. 2443 if (MAI->hasDotLocAndDotFile()) 2444 return; 2445 2446 // Minimum line delta, thus ranging from -10..(255-10). 2447 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1); 2448 // Maximum line delta, thus ranging from -10..(255-10). 2449 const int MaxLineDelta = 255 + MinLineDelta; 2450 2451 // Start the dwarf line section. 2452 Asm->OutStreamer.SwitchSection( 2453 Asm->getObjFileLowering().getDwarfLineSection()); 2454 2455 // Construct the section header. 2456 EmitDifference("line_end", 0, "line_begin", 0, true); 2457 Asm->EOL("Length of Source Line Info"); 2458 EmitLabel("line_begin", 0); 2459 2460 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number"); 2461 2462 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true); 2463 Asm->EOL("Prolog Length"); 2464 EmitLabel("line_prolog_begin", 0); 2465 2466 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length"); 2467 2468 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag"); 2469 2470 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)"); 2471 2472 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)"); 2473 2474 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base"); 2475 2476 // Line number standard opcode encodings argument count 2477 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count"); 2478 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count"); 2479 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count"); 2480 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count"); 2481 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count"); 2482 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count"); 2483 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count"); 2484 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count"); 2485 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count"); 2486 2487 // Emit directories. 2488 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) { 2489 Asm->EmitString(getSourceDirectoryName(DI)); 2490 Asm->EOL("Directory"); 2491 } 2492 2493 Asm->EmitInt8(0); Asm->EOL("End of directories"); 2494 2495 // Emit files. 2496 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) { 2497 // Remember source id starts at 1. 2498 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI); 2499 Asm->EmitString(getSourceFileName(Id.second)); 2500 Asm->EOL("Source"); 2501 Asm->EmitULEB128Bytes(Id.first); 2502 Asm->EOL("Directory #"); 2503 Asm->EmitULEB128Bytes(0); 2504 Asm->EOL("Mod date"); 2505 Asm->EmitULEB128Bytes(0); 2506 Asm->EOL("File size"); 2507 } 2508 2509 Asm->EmitInt8(0); Asm->EOL("End of files"); 2510 2511 EmitLabel("line_prolog_end", 0); 2512 2513 // A sequence for each text section. 2514 unsigned SecSrcLinesSize = SectionSourceLines.size(); 2515 2516 for (unsigned j = 0; j < SecSrcLinesSize; ++j) { 2517 // Isolate current sections line info. 2518 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j]; 2519 2520 /*if (Asm->isVerbose()) { 2521 const MCSection *S = SectionMap[j + 1]; 2522 O << '\t' << MAI->getCommentString() << " Section" 2523 << S->getName() << '\n'; 2524 }*/ 2525 Asm->EOL(); 2526 2527 // Dwarf assumes we start with first line of first source file. 2528 unsigned Source = 1; 2529 unsigned Line = 1; 2530 2531 // Construct rows of the address, source, line, column matrix. 2532 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) { 2533 const SrcLineInfo &LineInfo = LineInfos[i]; 2534 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID()); 2535 if (!LabelID) continue; 2536 2537 if (LineInfo.getLine() == 0) continue; 2538 2539 if (!Asm->isVerbose()) 2540 Asm->EOL(); 2541 else { 2542 std::pair<unsigned, unsigned> SourceID = 2543 getSourceDirectoryAndFileIds(LineInfo.getSourceID()); 2544 O << '\t' << MAI->getCommentString() << ' ' 2545 << getSourceDirectoryName(SourceID.first) << '/' 2546 << getSourceFileName(SourceID.second) 2547 << ':' << utostr_32(LineInfo.getLine()) << '\n'; 2548 } 2549 2550 // Define the line address. 2551 Asm->EmitInt8(0); Asm->EOL("Extended Op"); 2552 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size"); 2553 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address"); 2554 EmitReference("label", LabelID); Asm->EOL("Location label"); 2555 2556 // If change of source, then switch to the new source. 2557 if (Source != LineInfo.getSourceID()) { 2558 Source = LineInfo.getSourceID(); 2559 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file"); 2560 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source"); 2561 } 2562 2563 // If change of line. 2564 if (Line != LineInfo.getLine()) { 2565 // Determine offset. 2566 int Offset = LineInfo.getLine() - Line; 2567 int Delta = Offset - MinLineDelta; 2568 2569 // Update line. 2570 Line = LineInfo.getLine(); 2571 2572 // If delta is small enough and in range... 2573 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) { 2574 // ... then use fast opcode. 2575 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta"); 2576 } else { 2577 // ... otherwise use long hand. 2578 Asm->EmitInt8(dwarf::DW_LNS_advance_line); 2579 Asm->EOL("DW_LNS_advance_line"); 2580 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset"); 2581 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy"); 2582 } 2583 } else { 2584 // Copy the previous row (different address or source) 2585 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy"); 2586 } 2587 } 2588 2589 emitEndOfLineMatrix(j + 1); 2590 } 2591 2592 if (SecSrcLinesSize == 0) 2593 // Because we're emitting a debug_line section, we still need a line 2594 // table. The linker and friends expect it to exist. If there's nothing to 2595 // put into it, emit an empty table. 2596 emitEndOfLineMatrix(1); 2597 2598 EmitLabel("line_end", 0); 2599 Asm->EOL(); 2600} 2601 2602/// emitCommonDebugFrame - Emit common frame info into a debug frame section. 2603/// 2604void DwarfDebug::emitCommonDebugFrame() { 2605 if (!MAI->doesDwarfRequireFrameSection()) 2606 return; 2607 2608 int stackGrowth = 2609 Asm->TM.getFrameInfo()->getStackGrowthDirection() == 2610 TargetFrameInfo::StackGrowsUp ? 2611 TD->getPointerSize() : -TD->getPointerSize(); 2612 2613 // Start the dwarf frame section. 2614 Asm->OutStreamer.SwitchSection( 2615 Asm->getObjFileLowering().getDwarfFrameSection()); 2616 2617 EmitLabel("debug_frame_common", 0); 2618 EmitDifference("debug_frame_common_end", 0, 2619 "debug_frame_common_begin", 0, true); 2620 Asm->EOL("Length of Common Information Entry"); 2621 2622 EmitLabel("debug_frame_common_begin", 0); 2623 Asm->EmitInt32((int)dwarf::DW_CIE_ID); 2624 Asm->EOL("CIE Identifier Tag"); 2625 Asm->EmitInt8(dwarf::DW_CIE_VERSION); 2626 Asm->EOL("CIE Version"); 2627 Asm->EmitString(""); 2628 Asm->EOL("CIE Augmentation"); 2629 Asm->EmitULEB128Bytes(1); 2630 Asm->EOL("CIE Code Alignment Factor"); 2631 Asm->EmitSLEB128Bytes(stackGrowth); 2632 Asm->EOL("CIE Data Alignment Factor"); 2633 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false)); 2634 Asm->EOL("CIE RA Column"); 2635 2636 std::vector<MachineMove> Moves; 2637 RI->getInitialFrameState(Moves); 2638 2639 EmitFrameMoves(NULL, 0, Moves, false); 2640 2641 Asm->EmitAlignment(2, 0, 0, false); 2642 EmitLabel("debug_frame_common_end", 0); 2643 2644 Asm->EOL(); 2645} 2646 2647/// emitFunctionDebugFrame - Emit per function frame info into a debug frame 2648/// section. 2649void 2650DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){ 2651 if (!MAI->doesDwarfRequireFrameSection()) 2652 return; 2653 2654 // Start the dwarf frame section. 2655 Asm->OutStreamer.SwitchSection( 2656 Asm->getObjFileLowering().getDwarfFrameSection()); 2657 2658 EmitDifference("debug_frame_end", DebugFrameInfo.Number, 2659 "debug_frame_begin", DebugFrameInfo.Number, true); 2660 Asm->EOL("Length of Frame Information Entry"); 2661 2662 EmitLabel("debug_frame_begin", DebugFrameInfo.Number); 2663 2664 EmitSectionOffset("debug_frame_common", "section_debug_frame", 2665 0, 0, true, false); 2666 Asm->EOL("FDE CIE offset"); 2667 2668 EmitReference("func_begin", DebugFrameInfo.Number); 2669 Asm->EOL("FDE initial location"); 2670 EmitDifference("func_end", DebugFrameInfo.Number, 2671 "func_begin", DebugFrameInfo.Number); 2672 Asm->EOL("FDE address range"); 2673 2674 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves, 2675 false); 2676 2677 Asm->EmitAlignment(2, 0, 0, false); 2678 EmitLabel("debug_frame_end", DebugFrameInfo.Number); 2679 2680 Asm->EOL(); 2681} 2682 2683/// emitDebugPubNames - Emit visible names into a debug pubnames section. 2684/// 2685void DwarfDebug::emitDebugPubNames() { 2686 // Start the dwarf pubnames section. 2687 Asm->OutStreamer.SwitchSection( 2688 Asm->getObjFileLowering().getDwarfPubNamesSection()); 2689 2690 EmitDifference("pubnames_end", ModuleCU->getID(), 2691 "pubnames_begin", ModuleCU->getID(), true); 2692 Asm->EOL("Length of Public Names Info"); 2693 2694 EmitLabel("pubnames_begin", ModuleCU->getID()); 2695 2696 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version"); 2697 2698 EmitSectionOffset("info_begin", "section_info", 2699 ModuleCU->getID(), 0, true, false); 2700 Asm->EOL("Offset of Compilation Unit Info"); 2701 2702 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(), 2703 true); 2704 Asm->EOL("Compilation Unit Length"); 2705 2706 const StringMap<DIE*> &Globals = ModuleCU->getGlobals(); 2707 for (StringMap<DIE*>::const_iterator 2708 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2709 const char *Name = GI->getKeyData(); 2710 DIE * Entity = GI->second; 2711 2712 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset"); 2713 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name"); 2714 } 2715 2716 Asm->EmitInt32(0); Asm->EOL("End Mark"); 2717 EmitLabel("pubnames_end", ModuleCU->getID()); 2718 2719 Asm->EOL(); 2720} 2721 2722void DwarfDebug::emitDebugPubTypes() { 2723 // Start the dwarf pubnames section. 2724 Asm->OutStreamer.SwitchSection( 2725 Asm->getObjFileLowering().getDwarfPubTypesSection()); 2726 EmitDifference("pubtypes_end", ModuleCU->getID(), 2727 "pubtypes_begin", ModuleCU->getID(), true); 2728 Asm->EOL("Length of Public Types Info"); 2729 2730 EmitLabel("pubtypes_begin", ModuleCU->getID()); 2731 2732 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version"); 2733 2734 EmitSectionOffset("info_begin", "section_info", 2735 ModuleCU->getID(), 0, true, false); 2736 Asm->EOL("Offset of Compilation ModuleCU Info"); 2737 2738 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(), 2739 true); 2740 Asm->EOL("Compilation ModuleCU Length"); 2741 2742 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes(); 2743 for (StringMap<DIE*>::const_iterator 2744 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) { 2745 const char *Name = GI->getKeyData(); 2746 DIE * Entity = GI->second; 2747 2748 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset"); 2749 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name"); 2750 } 2751 2752 Asm->EmitInt32(0); Asm->EOL("End Mark"); 2753 EmitLabel("pubtypes_end", ModuleCU->getID()); 2754 2755 Asm->EOL(); 2756} 2757 2758/// emitDebugStr - Emit visible names into a debug str section. 2759/// 2760void DwarfDebug::emitDebugStr() { 2761 // Check to see if it is worth the effort. 2762 if (!StringPool.empty()) { 2763 // Start the dwarf str section. 2764 Asm->OutStreamer.SwitchSection( 2765 Asm->getObjFileLowering().getDwarfStrSection()); 2766 2767 // For each of strings in the string pool. 2768 for (unsigned StringID = 1, N = StringPool.size(); 2769 StringID <= N; ++StringID) { 2770 // Emit a label for reference from debug information entries. 2771 EmitLabel("string", StringID); 2772 2773 // Emit the string itself. 2774 const std::string &String = StringPool[StringID]; 2775 Asm->EmitString(String); Asm->EOL(); 2776 } 2777 2778 Asm->EOL(); 2779 } 2780} 2781 2782/// emitDebugLoc - Emit visible names into a debug loc section. 2783/// 2784void DwarfDebug::emitDebugLoc() { 2785 // Start the dwarf loc section. 2786 Asm->OutStreamer.SwitchSection( 2787 Asm->getObjFileLowering().getDwarfLocSection()); 2788 Asm->EOL(); 2789} 2790 2791/// EmitDebugARanges - Emit visible names into a debug aranges section. 2792/// 2793void DwarfDebug::EmitDebugARanges() { 2794 // Start the dwarf aranges section. 2795 Asm->OutStreamer.SwitchSection( 2796 Asm->getObjFileLowering().getDwarfARangesSection()); 2797 2798 // FIXME - Mock up 2799#if 0 2800 CompileUnit *Unit = GetBaseCompileUnit(); 2801 2802 // Don't include size of length 2803 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info"); 2804 2805 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version"); 2806 2807 EmitReference("info_begin", Unit->getID()); 2808 Asm->EOL("Offset of Compilation Unit Info"); 2809 2810 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address"); 2811 2812 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor"); 2813 2814 Asm->EmitInt16(0); Asm->EOL("Pad (1)"); 2815 Asm->EmitInt16(0); Asm->EOL("Pad (2)"); 2816 2817 // Range 1 2818 EmitReference("text_begin", 0); Asm->EOL("Address"); 2819 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length"); 2820 2821 Asm->EmitInt32(0); Asm->EOL("EOM (1)"); 2822 Asm->EmitInt32(0); Asm->EOL("EOM (2)"); 2823#endif 2824 2825 Asm->EOL(); 2826} 2827 2828/// emitDebugRanges - Emit visible names into a debug ranges section. 2829/// 2830void DwarfDebug::emitDebugRanges() { 2831 // Start the dwarf ranges section. 2832 Asm->OutStreamer.SwitchSection( 2833 Asm->getObjFileLowering().getDwarfRangesSection()); 2834 Asm->EOL(); 2835} 2836 2837/// emitDebugMacInfo - Emit visible names into a debug macinfo section. 2838/// 2839void DwarfDebug::emitDebugMacInfo() { 2840 if (const MCSection *LineInfo = 2841 Asm->getObjFileLowering().getDwarfMacroInfoSection()) { 2842 // Start the dwarf macinfo section. 2843 Asm->OutStreamer.SwitchSection(LineInfo); 2844 Asm->EOL(); 2845 } 2846} 2847 2848/// emitDebugInlineInfo - Emit inline info using following format. 2849/// Section Header: 2850/// 1. length of section 2851/// 2. Dwarf version number 2852/// 3. address size. 2853/// 2854/// Entries (one "entry" for each function that was inlined): 2855/// 2856/// 1. offset into __debug_str section for MIPS linkage name, if exists; 2857/// otherwise offset into __debug_str for regular function name. 2858/// 2. offset into __debug_str section for regular function name. 2859/// 3. an unsigned LEB128 number indicating the number of distinct inlining 2860/// instances for the function. 2861/// 2862/// The rest of the entry consists of a {die_offset, low_pc} pair for each 2863/// inlined instance; the die_offset points to the inlined_subroutine die in the 2864/// __debug_info section, and the low_pc is the starting address for the 2865/// inlining instance. 2866void DwarfDebug::emitDebugInlineInfo() { 2867 if (!MAI->doesDwarfUsesInlineInfoSection()) 2868 return; 2869 2870 if (!ModuleCU) 2871 return; 2872 2873 Asm->OutStreamer.SwitchSection( 2874 Asm->getObjFileLowering().getDwarfDebugInlineSection()); 2875 Asm->EOL(); 2876 EmitDifference("debug_inlined_end", 1, 2877 "debug_inlined_begin", 1, true); 2878 Asm->EOL("Length of Debug Inlined Information Entry"); 2879 2880 EmitLabel("debug_inlined_begin", 1); 2881 2882 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version"); 2883 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); 2884 2885 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(), 2886 E = InlinedSPNodes.end(); I != E; ++I) { 2887 2888// for (ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator 2889 // I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) { 2890 MDNode *Node = *I; 2891 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II 2892 = InlineInfo.find(Node); 2893 SmallVector<InlineInfoLabels, 4> &Labels = II->second; 2894 DISubprogram SP(Node); 2895 StringRef LName = SP.getLinkageName(); 2896 StringRef Name = SP.getName(); 2897 2898 if (LName.empty()) 2899 Asm->EmitString(Name); 2900 else { 2901 // Skip special LLVM prefix that is used to inform the asm printer to not 2902 // emit usual symbol prefix before the symbol name. This happens for 2903 // Objective-C symbol names and symbol whose name is replaced using GCC's 2904 // __asm__ attribute. 2905 if (LName[0] == 1) 2906 LName = LName.substr(1); 2907// Asm->EmitString(LName); 2908 EmitSectionOffset("string", "section_str", 2909 StringPool.idFor(LName), false, true); 2910 2911 } 2912 Asm->EOL("MIPS linkage name"); 2913// Asm->EmitString(Name); 2914 EmitSectionOffset("string", "section_str", 2915 StringPool.idFor(Name), false, true); 2916 Asm->EOL("Function name"); 2917 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count"); 2918 2919 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(), 2920 LE = Labels.end(); LI != LE; ++LI) { 2921 DIE *SP = LI->second; 2922 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset"); 2923 2924 if (TD->getPointerSize() == sizeof(int32_t)) 2925 O << MAI->getData32bitsDirective(); 2926 else 2927 O << MAI->getData64bitsDirective(); 2928 2929 PrintLabelName("label", LI->first); Asm->EOL("low_pc"); 2930 } 2931 } 2932 2933 EmitLabel("debug_inlined_end", 1); 2934 Asm->EOL(); 2935} 2936