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