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