1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for writing dwarf debug info into asm files.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
17 #include "llvm/Constants.h"
18 #include "llvm/Module.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineModuleInfo.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCSection.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/Target/Mangler.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Target/TargetFrameInfo.h"
28 #include "llvm/Target/TargetLoweringObjectFile.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetRegisterInfo.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Analysis/DebugInfo.h"
33 #include "llvm/ADT/STLExtras.h"
34 #include "llvm/ADT/StringExtras.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include "llvm/Support/ValueHandle.h"
39 #include "llvm/Support/FormattedStream.h"
40 #include "llvm/Support/Timer.h"
41 #include "llvm/System/Path.h"
44 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
45 cl::desc("Print DbgScope information for each machine instruction"));
47 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
48 cl::desc("Disable debug info printing"));
50 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
51 cl::desc("Make an absense of debug location information explicit."),
55 const char *DWARFGroupName = "DWARF Emission";
56 const char *DbgTimerName = "DWARF Debug Writer";
57 } // end anonymous namespace
59 //===----------------------------------------------------------------------===//
61 /// Configuration values for initial hash set sizes (log2).
63 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
67 //===----------------------------------------------------------------------===//
68 /// CompileUnit - This dwarf writer support class manages information associate
69 /// with a source file.
71 /// ID - File identifier for source.
75 /// Die - Compile unit debug information entry.
77 const OwningPtr<DIE> CUDie;
79 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
82 /// GVToDieMap - Tracks the mapping of unit level debug informaton
83 /// variables to debug information entries.
84 /// FIXME : Rename GVToDieMap -> NodeToDieMap
85 DenseMap<const MDNode *, DIE *> GVToDieMap;
87 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
88 /// descriptors to debug information entries using a DIEEntry proxy.
90 DenseMap<const MDNode *, DIEEntry *> GVToDIEEntryMap;
92 /// Globals - A map of globally visible named entities for this unit.
94 StringMap<DIE*> Globals;
96 /// GlobalTypes - A map of globally visible types for this unit.
98 StringMap<DIE*> GlobalTypes;
101 CompileUnit(unsigned I, DIE *D)
102 : ID(I), CUDie(D), IndexTyDie(0) {}
105 unsigned getID() const { return ID; }
106 DIE* getCUDie() const { return CUDie.get(); }
107 const StringMap<DIE*> &getGlobals() const { return Globals; }
108 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
110 /// hasContent - Return true if this compile unit has something to write out.
112 bool hasContent() const { return !CUDie->getChildren().empty(); }
114 /// addGlobal - Add a new global entity to the compile unit.
116 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
118 /// addGlobalType - Add a new global type to the compile unit.
120 void addGlobalType(StringRef Name, DIE *Die) {
121 GlobalTypes[Name] = Die;
124 /// getDIE - Returns the debug information entry map slot for the
125 /// specified debug variable.
126 DIE *getDIE(const MDNode *N) { return GVToDieMap.lookup(N); }
128 /// insertDIE - Insert DIE into the map.
129 void insertDIE(const MDNode *N, DIE *D) {
130 GVToDieMap.insert(std::make_pair(N, D));
133 /// getDIEEntry - Returns the debug information entry for the speciefied
135 DIEEntry *getDIEEntry(const MDNode *N) {
136 DenseMap<const MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
137 if (I == GVToDIEEntryMap.end())
142 /// insertDIEEntry - Insert debug information entry into the map.
143 void insertDIEEntry(const MDNode *N, DIEEntry *E) {
144 GVToDIEEntryMap.insert(std::make_pair(N, E));
147 /// addDie - Adds or interns the DIE to the compile unit.
149 void addDie(DIE *Buffer) {
150 this->CUDie->addChild(Buffer);
153 // getIndexTyDie - Get an anonymous type for index type.
154 DIE *getIndexTyDie() {
158 // setIndexTyDie - Set D as anonymous type for index which can be reused
160 void setIndexTyDie(DIE *D) {
166 //===----------------------------------------------------------------------===//
167 /// DbgVariable - This class is used to track local variable information.
170 DIVariable Var; // Variable Descriptor.
171 DIE *TheDIE; // Variable DIE.
172 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.
174 // AbsVar may be NULL.
175 DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
178 DIVariable getVariable() const { return Var; }
179 void setDIE(DIE *D) { TheDIE = D; }
180 DIE *getDIE() const { return TheDIE; }
181 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }
182 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }
185 //===----------------------------------------------------------------------===//
186 /// DbgRange - This is used to track range of instructions with identical
187 /// debug info scope.
189 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
191 //===----------------------------------------------------------------------===//
192 /// DbgScope - This class is used to track scope information.
195 DbgScope *Parent; // Parent to this scope.
196 DIDescriptor Desc; // Debug info descriptor for scope.
197 // Location at which this scope is inlined.
198 AssertingVH<const MDNode> InlinedAtLocation;
199 bool AbstractScope; // Abstract Scope
200 const MachineInstr *LastInsn; // Last instruction of this scope.
201 const MachineInstr *FirstInsn; // First instruction of this scope.
202 unsigned DFSIn, DFSOut;
203 // Scopes defined in scope. Contents not owned.
204 SmallVector<DbgScope *, 4> Scopes;
205 // Variables declared in scope. Contents owned.
206 SmallVector<DbgVariable *, 8> Variables;
207 SmallVector<DbgRange, 4> Ranges;
208 // Private state for dump()
209 mutable unsigned IndentLevel;
211 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
212 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
213 LastInsn(0), FirstInsn(0),
214 DFSIn(0), DFSOut(0), IndentLevel(0) {}
218 DbgScope *getParent() const { return Parent; }
219 void setParent(DbgScope *P) { Parent = P; }
220 DIDescriptor getDesc() const { return Desc; }
221 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
222 const MDNode *getScopeNode() const { return Desc; }
223 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
224 const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
225 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
227 /// openInsnRange - This scope covers instruction range starting from MI.
228 void openInsnRange(const MachineInstr *MI) {
233 Parent->openInsnRange(MI);
236 /// extendInsnRange - Extend the current instruction range covered by
238 void extendInsnRange(const MachineInstr *MI) {
239 assert (FirstInsn && "MI Range is not open!");
242 Parent->extendInsnRange(MI);
245 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
246 /// until now. This is used when a new scope is encountered while walking
247 /// machine instructions.
248 void closeInsnRange(DbgScope *NewScope = NULL) {
249 assert (LastInsn && "Last insn missing!");
250 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
253 // If Parent dominates NewScope then do not close Parent's instruction
255 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
256 Parent->closeInsnRange(NewScope);
259 void setAbstractScope() { AbstractScope = true; }
260 bool isAbstractScope() const { return AbstractScope; }
262 // Depth First Search support to walk and mainpluate DbgScope hierarchy.
263 unsigned getDFSOut() const { return DFSOut; }
264 void setDFSOut(unsigned O) { DFSOut = O; }
265 unsigned getDFSIn() const { return DFSIn; }
266 void setDFSIn(unsigned I) { DFSIn = I; }
267 bool dominates(const DbgScope *S) {
270 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
275 /// addScope - Add a scope to the scope.
277 void addScope(DbgScope *S) { Scopes.push_back(S); }
279 /// addVariable - Add a variable to the scope.
281 void addVariable(DbgVariable *V) { Variables.push_back(V); }
288 } // end llvm namespace
291 void DbgScope::dump() const {
292 raw_ostream &err = dbgs();
293 err.indent(IndentLevel);
294 const MDNode *N = Desc;
297 err << "Abstract Scope\n";
301 err << "Children ...\n";
302 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
303 if (Scopes[i] != this)
310 DbgScope::~DbgScope() {
311 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
315 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
316 : Asm(A), MMI(Asm->MMI), FirstCU(0),
317 AbbreviationsSet(InitAbbreviationsSetSize),
318 CurrentFnDbgScope(0), PrevLabel(NULL) {
319 NextStringPoolNumber = 0;
321 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
322 DwarfStrSectionSym = TextSectionSym = 0;
323 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
324 FunctionBeginSym = FunctionEndSym = 0;
326 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
330 DwarfDebug::~DwarfDebug() {
331 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
332 DIEBlocks[j]->~DIEBlock();
335 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
336 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
337 if (Entry.first) return Entry.first;
339 Entry.second = NextStringPoolNumber++;
340 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
344 /// assignAbbrevNumber - Define a unique number for the abbreviation.
346 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
347 // Profile the node so that we can make it unique.
351 // Check the set for priors.
352 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
354 // If it's newly added.
355 if (InSet == &Abbrev) {
356 // Add to abbreviation list.
357 Abbreviations.push_back(&Abbrev);
359 // Assign the vector position + 1 as its number.
360 Abbrev.setNumber(Abbreviations.size());
362 // Assign existing abbreviation number.
363 Abbrev.setNumber(InSet->getNumber());
367 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
368 /// information entry.
369 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
370 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
374 /// addUInt - Add an unsigned integer attribute data and value.
376 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
377 unsigned Form, uint64_t Integer) {
378 if (!Form) Form = DIEInteger::BestForm(false, Integer);
379 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
380 Die->addValue(Attribute, Form, Value);
383 /// addSInt - Add an signed integer attribute data and value.
385 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
386 unsigned Form, int64_t Integer) {
387 if (!Form) Form = DIEInteger::BestForm(true, Integer);
388 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
389 Die->addValue(Attribute, Form, Value);
392 /// addString - Add a string attribute data and value. DIEString only
393 /// keeps string reference.
394 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
396 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
397 Die->addValue(Attribute, Form, Value);
400 /// addLabel - Add a Dwarf label attribute data and value.
402 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
403 const MCSymbol *Label) {
404 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
405 Die->addValue(Attribute, Form, Value);
408 /// addDelta - Add a label delta attribute data and value.
410 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
411 const MCSymbol *Hi, const MCSymbol *Lo) {
412 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
413 Die->addValue(Attribute, Form, Value);
416 /// addDIEEntry - Add a DIE attribute data and value.
418 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
420 Die->addValue(Attribute, Form, createDIEEntry(Entry));
424 /// addBlock - Add block data.
426 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
428 Block->ComputeSize(Asm);
429 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
430 Die->addValue(Attribute, Block->BestForm(), Block);
433 /// addSourceLine - Add location information to specified debug information
435 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
440 unsigned Line = V->getLineNumber();
441 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
442 V->getContext().getFilename());
443 assert(FileID && "Invalid file id");
444 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
445 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
448 /// addSourceLine - Add location information to specified debug information
450 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobalVariable *G) {
451 // Verify global variable.
455 unsigned Line = G->getLineNumber();
456 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
457 G->getContext().getFilename());
458 assert(FileID && "Invalid file id");
459 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
460 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
463 /// addSourceLine - Add location information to specified debug information
465 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
466 // Verify subprogram.
469 // If the line number is 0, don't add it.
470 if (SP->getLineNumber() == 0)
473 unsigned Line = SP->getLineNumber();
474 if (!SP->getContext().Verify())
476 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
478 assert(FileID && "Invalid file id");
479 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
480 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
483 /// addSourceLine - Add location information to specified debug information
485 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
490 unsigned Line = Ty->getLineNumber();
491 if (!Ty->getContext().Verify())
493 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
494 Ty->getContext().getFilename());
495 assert(FileID && "Invalid file id");
496 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
497 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
500 /// addSourceLine - Add location information to specified debug information
502 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
507 unsigned Line = NS->getLineNumber();
508 StringRef FN = NS->getFilename();
509 StringRef Dir = NS->getDirectory();
511 unsigned FileID = GetOrCreateSourceID(Dir, FN);
512 assert(FileID && "Invalid file id");
513 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
514 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
517 /* Byref variables, in Blocks, are declared by the programmer as
518 "SomeType VarName;", but the compiler creates a
519 __Block_byref_x_VarName struct, and gives the variable VarName
520 either the struct, or a pointer to the struct, as its type. This
521 is necessary for various behind-the-scenes things the compiler
522 needs to do with by-reference variables in blocks.
524 However, as far as the original *programmer* is concerned, the
525 variable should still have type 'SomeType', as originally declared.
527 The following function dives into the __Block_byref_x_VarName
528 struct to find the original type of the variable. This will be
529 passed back to the code generating the type for the Debug
530 Information Entry for the variable 'VarName'. 'VarName' will then
531 have the original type 'SomeType' in its debug information.
533 The original type 'SomeType' will be the type of the field named
534 'VarName' inside the __Block_byref_x_VarName struct.
536 NOTE: In order for this to not completely fail on the debugger
537 side, the Debug Information Entry for the variable VarName needs to
538 have a DW_AT_location that tells the debugger how to unwind through
539 the pointers and __Block_byref_x_VarName struct to find the actual
540 value of the variable. The function addBlockByrefType does this. */
542 /// Find the type the programmer originally declared the variable to be
543 /// and return that type.
545 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
548 unsigned tag = Ty.getTag();
550 if (tag == dwarf::DW_TAG_pointer_type) {
551 DIDerivedType DTy = DIDerivedType(Ty);
552 subType = DTy.getTypeDerivedFrom();
555 DICompositeType blockStruct = DICompositeType(subType);
556 DIArray Elements = blockStruct.getTypeArray();
558 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
559 DIDescriptor Element = Elements.getElement(i);
560 DIDerivedType DT = DIDerivedType(Element);
561 if (Name == DT.getName())
562 return (DT.getTypeDerivedFrom());
568 /// addComplexAddress - Start with the address based on the location provided,
569 /// and generate the DWARF information necessary to find the actual variable
570 /// given the extra address information encoded in the DIVariable, starting from
571 /// the starting location. Add the DWARF information to the die.
573 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
575 const MachineLocation &Location) {
576 const DIVariable &VD = DV->getVariable();
577 DIType Ty = VD.getType();
579 // Decode the original location, and use that as the start of the byref
580 // variable's location.
581 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
582 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
583 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
585 if (Location.isReg()) {
587 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
589 Reg = Reg - dwarf::DW_OP_reg0;
590 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
591 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
595 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
597 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
598 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
601 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
604 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
605 uint64_t Element = VD.getAddrElement(i);
607 if (Element == DIFactory::OpPlus) {
608 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
609 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
610 } else if (Element == DIFactory::OpDeref) {
611 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
612 } else llvm_unreachable("unknown DIFactory Opcode");
615 // Now attach the location information to the DIE.
616 addBlock(Die, Attribute, 0, Block);
619 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
620 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
621 gives the variable VarName either the struct, or a pointer to the struct, as
622 its type. This is necessary for various behind-the-scenes things the
623 compiler needs to do with by-reference variables in Blocks.
625 However, as far as the original *programmer* is concerned, the variable
626 should still have type 'SomeType', as originally declared.
628 The function getBlockByrefType dives into the __Block_byref_x_VarName
629 struct to find the original type of the variable, which is then assigned to
630 the variable's Debug Information Entry as its real type. So far, so good.
631 However now the debugger will expect the variable VarName to have the type
632 SomeType. So we need the location attribute for the variable to be an
633 expression that explains to the debugger how to navigate through the
634 pointers and struct to find the actual variable of type SomeType.
636 The following function does just that. We start by getting
637 the "normal" location for the variable. This will be the location
638 of either the struct __Block_byref_x_VarName or the pointer to the
639 struct __Block_byref_x_VarName.
641 The struct will look something like:
643 struct __Block_byref_x_VarName {
645 struct __Block_byref_x_VarName *forwarding;
646 ... <various other fields>
648 ... <maybe more fields>
651 If we are given the struct directly (as our starting point) we
652 need to tell the debugger to:
654 1). Add the offset of the forwarding field.
656 2). Follow that pointer to get the real __Block_byref_x_VarName
657 struct to use (the real one may have been copied onto the heap).
659 3). Add the offset for the field VarName, to find the actual variable.
661 If we started with a pointer to the struct, then we need to
662 dereference that pointer first, before the other steps.
663 Translating this into DWARF ops, we will need to append the following
664 to the current location description for the variable:
666 DW_OP_deref -- optional, if we start with a pointer
667 DW_OP_plus_uconst <forward_fld_offset>
669 DW_OP_plus_uconst <varName_fld_offset>
671 That is what this function does. */
673 /// addBlockByrefAddress - Start with the address based on the location
674 /// provided, and generate the DWARF information necessary to find the
675 /// actual Block variable (navigating the Block struct) based on the
676 /// starting location. Add the DWARF information to the die. For
677 /// more information, read large comment just above here.
679 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
681 const MachineLocation &Location) {
682 const DIVariable &VD = DV->getVariable();
683 DIType Ty = VD.getType();
685 unsigned Tag = Ty.getTag();
686 bool isPointer = false;
688 StringRef varName = VD.getName();
690 if (Tag == dwarf::DW_TAG_pointer_type) {
691 DIDerivedType DTy = DIDerivedType(Ty);
692 TmpTy = DTy.getTypeDerivedFrom();
696 DICompositeType blockStruct = DICompositeType(TmpTy);
698 // Find the __forwarding field and the variable field in the __Block_byref
700 DIArray Fields = blockStruct.getTypeArray();
701 DIDescriptor varField = DIDescriptor();
702 DIDescriptor forwardingField = DIDescriptor();
704 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
705 DIDescriptor Element = Fields.getElement(i);
706 DIDerivedType DT = DIDerivedType(Element);
707 StringRef fieldName = DT.getName();
708 if (fieldName == "__forwarding")
709 forwardingField = Element;
710 else if (fieldName == varName)
714 // Get the offsets for the forwarding field and the variable field.
715 unsigned forwardingFieldOffset =
716 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
717 unsigned varFieldOffset =
718 DIDerivedType(varField).getOffsetInBits() >> 3;
720 // Decode the original location, and use that as the start of the byref
721 // variable's location.
722 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
723 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
724 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
726 if (Location.isReg()) {
728 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
730 Reg = Reg - dwarf::DW_OP_reg0;
731 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
732 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
736 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
738 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
739 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
742 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
745 // If we started with a pointer to the __Block_byref... struct, then
746 // the first thing we need to do is dereference the pointer (DW_OP_deref).
748 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
750 // Next add the offset for the '__forwarding' field:
751 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
752 // adding the offset if it's 0.
753 if (forwardingFieldOffset > 0) {
754 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
755 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
758 // Now dereference the __forwarding field to get to the real __Block_byref
759 // struct: DW_OP_deref.
760 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
762 // Now that we've got the real __Block_byref... struct, add the offset
763 // for the variable's field to get to the location of the actual variable:
764 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
765 if (varFieldOffset > 0) {
766 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
767 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
770 // Now attach the location information to the DIE.
771 addBlock(Die, Attribute, 0, Block);
774 /// addAddress - Add an address attribute to a die based on the location
776 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
777 const MachineLocation &Location) {
778 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
779 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
780 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
782 if (Location.isReg()) {
784 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
786 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
787 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
791 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
793 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
794 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
797 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
800 addBlock(Die, Attribute, 0, Block);
803 /// addRegisterAddress - Add register location entry in variable DIE.
804 bool DwarfDebug::addRegisterAddress(DIE *Die, const MCSymbol *VS,
805 const MachineOperand &MO) {
806 assert (MO.isReg() && "Invalid machine operand!");
809 MachineLocation Location;
810 Location.set(MO.getReg());
811 addAddress(Die, dwarf::DW_AT_location, Location);
813 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
817 /// addConstantValue - Add constant value entry in variable DIE.
818 bool DwarfDebug::addConstantValue(DIE *Die, const MCSymbol *VS,
819 const MachineOperand &MO) {
820 assert (MO.isImm() && "Invalid machine operand!");
821 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
822 unsigned Imm = MO.getImm();
823 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
824 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
826 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
830 /// addConstantFPValue - Add constant value entry in variable DIE.
831 bool DwarfDebug::addConstantFPValue(DIE *Die, const MCSymbol *VS,
832 const MachineOperand &MO) {
833 assert (MO.isFPImm() && "Invalid machine operand!");
834 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
835 APFloat FPImm = MO.getFPImm()->getValueAPF();
837 // Get the raw data form of the floating point.
838 const APInt FltVal = FPImm.bitcastToAPInt();
839 const char *FltPtr = (const char*)FltVal.getRawData();
841 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
842 bool LittleEndian = Asm->getTargetData().isLittleEndian();
843 int Incr = (LittleEndian ? 1 : -1);
844 int Start = (LittleEndian ? 0 : NumBytes - 1);
845 int Stop = (LittleEndian ? NumBytes : -1);
847 // Output the constant to DWARF one byte at a time.
848 for (; Start != Stop; Start += Incr)
849 addUInt(Block, 0, dwarf::DW_FORM_data1,
850 (unsigned char)0xFF & FltPtr[Start]);
852 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
854 addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
859 /// addToContextOwner - Add Die into the list of its context owner's children.
860 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
861 if (Context.isType()) {
862 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
863 ContextDIE->addChild(Die);
864 } else if (Context.isNameSpace()) {
865 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
866 ContextDIE->addChild(Die);
867 } else if (Context.isSubprogram()) {
868 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context),
870 ContextDIE->addChild(Die);
871 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
872 ContextDIE->addChild(Die);
874 getCompileUnit(Context)->addDie(Die);
877 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
879 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
880 CompileUnit *TypeCU = getCompileUnit(Ty);
881 DIE *TyDIE = TypeCU->getDIE(Ty);
886 TyDIE = new DIE(dwarf::DW_TAG_base_type);
887 TypeCU->insertDIE(Ty, TyDIE);
888 if (Ty.isBasicType())
889 constructTypeDIE(*TyDIE, DIBasicType(Ty));
890 else if (Ty.isCompositeType())
891 constructTypeDIE(*TyDIE, DICompositeType(Ty));
893 assert(Ty.isDerivedType() && "Unknown kind of DIType");
894 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
897 addToContextOwner(TyDIE, Ty.getContext());
901 /// addType - Add a new type attribute to the specified entity.
902 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
906 // Check for pre-existence.
907 CompileUnit *TypeCU = getCompileUnit(Ty);
908 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
909 // If it exists then use the existing value.
911 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
916 DIE *Buffer = getOrCreateTypeDIE(Ty);
919 Entry = createDIEEntry(Buffer);
920 TypeCU->insertDIEEntry(Ty, Entry);
922 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
925 /// constructTypeDIE - Construct basic type die from DIBasicType.
926 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
927 // Get core information.
928 StringRef Name = BTy.getName();
929 Buffer.setTag(dwarf::DW_TAG_base_type);
930 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
933 // Add name if not anonymous or intermediate type.
935 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
936 uint64_t Size = BTy.getSizeInBits() >> 3;
937 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
940 /// constructTypeDIE - Construct derived type die from DIDerivedType.
941 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
942 // Get core information.
943 StringRef Name = DTy.getName();
944 uint64_t Size = DTy.getSizeInBits() >> 3;
945 unsigned Tag = DTy.getTag();
947 // FIXME - Workaround for templates.
948 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
952 // Map to main type, void will not have a type.
953 DIType FromTy = DTy.getTypeDerivedFrom();
954 addType(&Buffer, FromTy);
956 // Add name if not anonymous or intermediate type.
958 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
960 // Add size if non-zero (derived types might be zero-sized.)
962 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
964 // Add source line info if available and TyDesc is not a forward declaration.
965 if (!DTy.isForwardDecl())
966 addSourceLine(&Buffer, &DTy);
969 /// constructTypeDIE - Construct type DIE from DICompositeType.
970 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
971 // Get core information.
972 StringRef Name = CTy.getName();
974 uint64_t Size = CTy.getSizeInBits() >> 3;
975 unsigned Tag = CTy.getTag();
979 case dwarf::DW_TAG_vector_type:
980 case dwarf::DW_TAG_array_type:
981 constructArrayTypeDIE(Buffer, &CTy);
983 case dwarf::DW_TAG_enumeration_type: {
984 DIArray Elements = CTy.getTypeArray();
986 // Add enumerators to enumeration type.
987 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
989 DIDescriptor Enum(Elements.getElement(i));
990 if (Enum.isEnumerator()) {
991 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
992 Buffer.addChild(ElemDie);
997 case dwarf::DW_TAG_subroutine_type: {
999 DIArray Elements = CTy.getTypeArray();
1000 DIDescriptor RTy = Elements.getElement(0);
1001 addType(&Buffer, DIType(RTy));
1003 // Add prototype flag.
1004 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1007 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1008 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1009 DIDescriptor Ty = Elements.getElement(i);
1010 addType(Arg, DIType(Ty));
1011 Buffer.addChild(Arg);
1015 case dwarf::DW_TAG_structure_type:
1016 case dwarf::DW_TAG_union_type:
1017 case dwarf::DW_TAG_class_type: {
1018 // Add elements to structure type.
1019 DIArray Elements = CTy.getTypeArray();
1021 // A forward struct declared type may not have elements available.
1022 unsigned N = Elements.getNumElements();
1026 // Add elements to structure type.
1027 for (unsigned i = 0; i < N; ++i) {
1028 DIDescriptor Element = Elements.getElement(i);
1029 DIE *ElemDie = NULL;
1030 if (Element.isSubprogram())
1031 ElemDie = createSubprogramDIE(DISubprogram(Element));
1032 else if (Element.isVariable()) {
1033 DIVariable DV(Element);
1034 ElemDie = new DIE(dwarf::DW_TAG_variable);
1035 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1037 addType(ElemDie, DV.getType());
1038 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1039 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1040 addSourceLine(ElemDie, &DV);
1041 } else if (Element.isDerivedType())
1042 ElemDie = createMemberDIE(DIDerivedType(Element));
1045 Buffer.addChild(ElemDie);
1048 if (CTy.isAppleBlockExtension())
1049 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1051 unsigned RLang = CTy.getRunTimeLang();
1053 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1054 dwarf::DW_FORM_data1, RLang);
1056 DICompositeType ContainingType = CTy.getContainingType();
1057 if (DIDescriptor(ContainingType).isCompositeType())
1058 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1059 getOrCreateTypeDIE(DIType(ContainingType)));
1061 DIDescriptor Context = CTy.getContext();
1062 addToContextOwner(&Buffer, Context);
1070 // Add name if not anonymous or intermediate type.
1072 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1074 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
1075 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
1076 // Add size if non-zero (derived types might be zero-sized.)
1078 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1080 // Add zero size if it is not a forward declaration.
1081 if (CTy.isForwardDecl())
1082 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1084 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1087 // Add source line info if available.
1088 if (!CTy.isForwardDecl())
1089 addSourceLine(&Buffer, &CTy);
1093 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1094 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1095 int64_t L = SR.getLo();
1096 int64_t H = SR.getHi();
1097 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1099 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1101 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1102 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1104 Buffer.addChild(DW_Subrange);
1107 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1108 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1109 DICompositeType *CTy) {
1110 Buffer.setTag(dwarf::DW_TAG_array_type);
1111 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1112 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1114 // Emit derived type.
1115 addType(&Buffer, CTy->getTypeDerivedFrom());
1116 DIArray Elements = CTy->getTypeArray();
1118 // Get an anonymous type for index type.
1119 CompileUnit *TheCU = getCompileUnit(*CTy);
1120 DIE *IdxTy = TheCU->getIndexTyDie();
1122 // Construct an anonymous type for index type.
1123 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1124 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1125 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1126 dwarf::DW_ATE_signed);
1127 TheCU->addDie(IdxTy);
1128 TheCU->setIndexTyDie(IdxTy);
1131 // Add subranges to array type.
1132 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1133 DIDescriptor Element = Elements.getElement(i);
1134 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1135 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1139 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1140 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1141 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1142 StringRef Name = ETy.getName();
1143 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1144 int64_t Value = ETy.getEnumValue();
1145 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1149 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1150 /// printer to not emit usual symbol prefix before the symbol name is used then
1151 /// return linkage name after skipping this special LLVM prefix.
1152 static StringRef getRealLinkageName(StringRef LinkageName) {
1154 if (LinkageName.startswith(StringRef(&One, 1)))
1155 return LinkageName.substr(1);
1159 /// createGlobalVariableDIE - Create new DIE using GV.
1160 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1161 // If the global variable was optmized out then no need to create debug info
1163 if (!GV.getGlobal()) return NULL;
1164 if (GV.getDisplayName().empty()) return NULL;
1166 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1167 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1168 GV.getDisplayName());
1170 StringRef LinkageName = GV.getLinkageName();
1171 if (!LinkageName.empty())
1172 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1173 getRealLinkageName(LinkageName));
1175 addType(GVDie, GV.getType());
1176 if (!GV.isLocalToUnit())
1177 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1178 addSourceLine(GVDie, &GV);
1183 /// createMemberDIE - Create new member DIE.
1184 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1185 DIE *MemberDie = new DIE(DT.getTag());
1186 StringRef Name = DT.getName();
1188 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1190 addType(MemberDie, DT.getTypeDerivedFrom());
1192 addSourceLine(MemberDie, &DT);
1194 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1195 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1197 uint64_t Size = DT.getSizeInBits();
1198 uint64_t FieldSize = DT.getOriginalTypeSize();
1200 if (Size != FieldSize) {
1202 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1203 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1205 uint64_t Offset = DT.getOffsetInBits();
1206 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1207 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1208 uint64_t FieldOffset = (HiMark - FieldSize);
1209 Offset -= FieldOffset;
1211 // Maybe we need to work from the other end.
1212 if (Asm->getTargetData().isLittleEndian())
1213 Offset = FieldSize - (Offset + Size);
1214 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1216 // Here WD_AT_data_member_location points to the anonymous
1217 // field that includes this bit field.
1218 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1221 // This is not a bitfield.
1222 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1224 if (DT.getTag() == dwarf::DW_TAG_inheritance
1225 && DT.isVirtual()) {
1227 // For C++, virtual base classes are not at fixed offset. Use following
1228 // expression to extract appropriate offset from vtable.
1229 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1231 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1232 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1233 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1234 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1235 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1236 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1237 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1238 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1240 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1243 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1245 if (DT.isProtected())
1246 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1247 dwarf::DW_ACCESS_protected);
1248 else if (DT.isPrivate())
1249 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1250 dwarf::DW_ACCESS_private);
1251 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1252 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1253 dwarf::DW_ACCESS_public);
1255 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1256 dwarf::DW_VIRTUALITY_virtual);
1260 /// createSubprogramDIE - Create new DIE using SP.
1261 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1262 CompileUnit *SPCU = getCompileUnit(SP);
1263 DIE *SPDie = SPCU->getDIE(SP);
1267 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1268 // Constructors and operators for anonymous aggregates do not have names.
1269 if (!SP.getName().empty())
1270 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1272 StringRef LinkageName = SP.getLinkageName();
1273 if (!LinkageName.empty())
1274 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1275 getRealLinkageName(LinkageName));
1277 addSourceLine(SPDie, &SP);
1279 // Add prototyped tag, if C or ObjC.
1280 unsigned Lang = SP.getCompileUnit().getLanguage();
1281 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1282 Lang == dwarf::DW_LANG_ObjC)
1283 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1286 DICompositeType SPTy = SP.getType();
1287 DIArray Args = SPTy.getTypeArray();
1288 unsigned SPTag = SPTy.getTag();
1290 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1291 addType(SPDie, SPTy);
1293 addType(SPDie, DIType(Args.getElement(0)));
1295 unsigned VK = SP.getVirtuality();
1297 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1298 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1299 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1300 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1301 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1302 ContainingTypeMap.insert(std::make_pair(SPDie,
1303 SP.getContainingType()));
1306 if (MakeDecl || !SP.isDefinition()) {
1307 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1309 // Add arguments. Do not add arguments for subprogram definition. They will
1310 // be handled while processing variables.
1311 DICompositeType SPTy = SP.getType();
1312 DIArray Args = SPTy.getTypeArray();
1313 unsigned SPTag = SPTy.getTag();
1315 if (SPTag == dwarf::DW_TAG_subroutine_type)
1316 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1317 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1318 DIType ATy = DIType(DIType(Args.getElement(i)));
1320 if (ATy.isArtificial())
1321 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1322 SPDie->addChild(Arg);
1326 if (SP.isArtificial())
1327 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1329 if (!SP.isLocalToUnit())
1330 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1332 if (SP.isOptimized())
1333 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1335 // DW_TAG_inlined_subroutine may refer to this DIE.
1336 SPCU->insertDIE(SP, SPDie);
1338 // Add to context owner.
1339 addToContextOwner(SPDie, SP.getContext());
1344 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1345 assert(N && "Invalid Scope encoding!");
1347 DbgScope *AScope = AbstractScopes.lookup(N);
1351 DbgScope *Parent = NULL;
1353 DIDescriptor Scope(N);
1354 if (Scope.isLexicalBlock()) {
1355 DILexicalBlock DB(N);
1356 DIDescriptor ParentDesc = DB.getContext();
1357 Parent = getOrCreateAbstractScope(ParentDesc);
1360 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1363 Parent->addScope(AScope);
1364 AScope->setAbstractScope();
1365 AbstractScopes[N] = AScope;
1366 if (DIDescriptor(N).isSubprogram())
1367 AbstractScopesList.push_back(AScope);
1371 /// isSubprogramContext - Return true if Context is either a subprogram
1372 /// or another context nested inside a subprogram.
1373 static bool isSubprogramContext(const MDNode *Context) {
1376 DIDescriptor D(Context);
1377 if (D.isSubprogram())
1380 return isSubprogramContext(DIType(Context).getContext());
1384 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1385 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1386 /// If there are global variables in this scope then create and insert
1387 /// DIEs for these variables.
1388 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1389 CompileUnit *SPCU = getCompileUnit(SPNode);
1390 DIE *SPDie = SPCU->getDIE(SPNode);
1391 assert(SPDie && "Unable to find subprogram DIE!");
1392 DISubprogram SP(SPNode);
1394 // There is not any need to generate specification DIE for a function
1395 // defined at compile unit level. If a function is defined inside another
1396 // function then gdb prefers the definition at top level and but does not
1397 // expect specification DIE in parent function. So avoid creating
1398 // specification DIE for a function defined inside a function.
1399 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1400 !SP.getContext().isFile() &&
1401 !isSubprogramContext(SP.getContext())) {
1402 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1405 DICompositeType SPTy = SP.getType();
1406 DIArray Args = SPTy.getTypeArray();
1407 unsigned SPTag = SPTy.getTag();
1408 if (SPTag == dwarf::DW_TAG_subroutine_type)
1409 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1410 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1411 DIType ATy = DIType(DIType(Args.getElement(i)));
1413 if (ATy.isArtificial())
1414 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1415 SPDie->addChild(Arg);
1417 DIE *SPDeclDie = SPDie;
1418 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1419 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1421 SPCU->addDie(SPDie);
1424 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1425 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1426 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1427 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1428 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1429 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1430 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1435 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1436 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1437 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1439 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1440 if (Scope->isAbstractScope())
1443 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1447 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1448 if (Ranges.size() > 1) {
1449 // .debug_range section has not been laid out yet. Emit offset in
1450 // .debug_range as a uint, size 4, for now. emitDIE will handle
1451 // DW_AT_ranges appropriately.
1452 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1453 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1454 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1455 RE = Ranges.end(); RI != RE; ++RI) {
1456 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1457 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1459 DebugRangeSymbols.push_back(NULL);
1460 DebugRangeSymbols.push_back(NULL);
1464 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1465 const MCSymbol *End = getLabelAfterInsn(RI->second);
1467 if (End == 0) return 0;
1469 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1470 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1472 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1473 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1478 /// constructInlinedScopeDIE - This scope represents inlined body of
1479 /// a function. Construct DIE to represent this concrete inlined copy
1480 /// of the function.
1481 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1483 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1484 assert (Ranges.empty() == false
1485 && "DbgScope does not have instruction markers!");
1487 // FIXME : .debug_inlined section specification does not clearly state how
1488 // to emit inlined scope that is split into multiple instruction ranges.
1489 // For now, use first instruction range and emit low_pc/high_pc pair and
1490 // corresponding .debug_inlined section entry for this pair.
1491 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1492 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1493 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1495 if (StartLabel == FunctionBeginSym || EndLabel == 0) {
1496 assert (0 && "Unexpected Start and End labels for a inlined scope!");
1499 assert(StartLabel->isDefined() &&
1500 "Invalid starting label for an inlined scope!");
1501 assert(EndLabel->isDefined() &&
1502 "Invalid end label for an inlined scope!");
1504 if (!Scope->getScopeNode())
1506 DIScope DS(Scope->getScopeNode());
1507 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1509 DISubprogram InlinedSP = getDISubprogram(DS);
1510 CompileUnit *TheCU = getCompileUnit(InlinedSP);
1511 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1512 assert(OriginDIE && "Unable to find Origin DIE!");
1513 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1514 dwarf::DW_FORM_ref4, OriginDIE);
1516 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1517 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1519 InlinedSubprogramDIEs.insert(OriginDIE);
1521 // Track the start label for this inlined function.
1522 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1523 I = InlineInfo.find(InlinedSP);
1525 if (I == InlineInfo.end()) {
1526 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1528 InlinedSPNodes.push_back(InlinedSP);
1530 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1532 DILocation DL(Scope->getInlinedAt());
1533 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1534 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1540 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1541 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1542 // Get the descriptor.
1543 const DIVariable &VD = DV->getVariable();
1544 StringRef Name = VD.getName();
1548 // Translate tag to proper Dwarf tag. The result variable is dropped for
1551 switch (VD.getTag()) {
1552 case dwarf::DW_TAG_return_variable:
1554 case dwarf::DW_TAG_arg_variable:
1555 Tag = dwarf::DW_TAG_formal_parameter;
1557 case dwarf::DW_TAG_auto_variable: // fall thru
1559 Tag = dwarf::DW_TAG_variable;
1563 // Define variable debug information entry.
1564 DIE *VariableDie = new DIE(Tag);
1567 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1568 V2AVI = VarToAbstractVarMap.find(DV);
1569 if (V2AVI != VarToAbstractVarMap.end())
1570 AbsDIE = V2AVI->second->getDIE();
1573 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1574 dwarf::DW_FORM_ref4, AbsDIE);
1576 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1577 addSourceLine(VariableDie, &VD);
1579 // Add variable type.
1580 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1581 // addresses instead.
1582 if (VD.isBlockByrefVariable())
1583 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1585 addType(VariableDie, VD.getType());
1588 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1589 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1591 if (Scope->isAbstractScope()) {
1592 DV->setDIE(VariableDie);
1596 // Add variable address.
1598 unsigned Offset = DV->getDotDebugLocOffset();
1599 if (Offset != ~0U) {
1600 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1601 Asm->GetTempSymbol("debug_loc", Offset));
1602 DV->setDIE(VariableDie);
1603 UseDotDebugLocEntry.insert(VariableDie);
1607 // Check if variable is described by a DBG_VALUE instruction.
1608 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1609 DbgVariableToDbgInstMap.find(DV);
1610 if (DVI != DbgVariableToDbgInstMap.end()) {
1611 const MachineInstr *DVInsn = DVI->second;
1612 const MCSymbol *DVLabel = findVariableLabel(DV);
1613 bool updated = false;
1614 // FIXME : Handle getNumOperands != 3
1615 if (DVInsn->getNumOperands() == 3) {
1616 if (DVInsn->getOperand(0).isReg())
1617 updated = addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0));
1618 else if (DVInsn->getOperand(0).isImm())
1619 updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1620 else if (DVInsn->getOperand(0).isFPImm())
1621 updated = addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1623 MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1624 if (Location.getReg()) {
1625 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1627 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1633 // If variableDie is not updated then DBG_VALUE instruction does not
1634 // have valid variable info.
1638 DV->setDIE(VariableDie);
1642 // .. else use frame index, if available.
1643 MachineLocation Location;
1645 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1647 if (findVariableFrameIndex(DV, &FI)) {
1648 int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1649 Location.set(FrameReg, Offset);
1651 if (VD.hasComplexAddress())
1652 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1653 else if (VD.isBlockByrefVariable())
1654 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1656 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1658 DV->setDIE(VariableDie);
1663 void DwarfDebug::addPubTypes(DISubprogram SP) {
1664 DICompositeType SPTy = SP.getType();
1665 unsigned SPTag = SPTy.getTag();
1666 if (SPTag != dwarf::DW_TAG_subroutine_type)
1669 DIArray Args = SPTy.getTypeArray();
1670 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1671 DIType ATy(Args.getElement(i));
1674 DICompositeType CATy = getDICompositeType(ATy);
1675 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1676 && !CATy.isForwardDecl()) {
1677 CompileUnit *TheCU = getCompileUnit(CATy);
1678 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1679 TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1684 /// constructScopeDIE - Construct a DIE for this scope.
1685 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1686 if (!Scope || !Scope->getScopeNode())
1689 DIScope DS(Scope->getScopeNode());
1690 DIE *ScopeDIE = NULL;
1691 if (Scope->getInlinedAt())
1692 ScopeDIE = constructInlinedScopeDIE(Scope);
1693 else if (DS.isSubprogram()) {
1694 if (Scope->isAbstractScope())
1695 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1697 ScopeDIE = updateSubprogramScopeDIE(DS);
1700 ScopeDIE = constructLexicalScopeDIE(Scope);
1701 if (!ScopeDIE) return NULL;
1703 // Add variables to scope.
1704 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1705 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1706 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1708 ScopeDIE->addChild(VariableDIE);
1711 // Add nested scopes.
1712 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1713 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1714 // Define the Scope debug information entry.
1715 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1717 ScopeDIE->addChild(NestedDIE);
1720 if (DS.isSubprogram())
1721 addPubTypes(DISubprogram(DS));
1726 /// GetOrCreateSourceID - Look up the source id with the given directory and
1727 /// source file names. If none currently exists, create a new id and insert it
1728 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1730 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1732 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1733 if (DI != DirectoryIdMap.end()) {
1734 DId = DI->getValue();
1736 DId = DirectoryNames.size() + 1;
1737 DirectoryIdMap[DirName] = DId;
1738 DirectoryNames.push_back(DirName);
1742 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1743 if (FI != SourceFileIdMap.end()) {
1744 FId = FI->getValue();
1746 FId = SourceFileNames.size() + 1;
1747 SourceFileIdMap[FileName] = FId;
1748 SourceFileNames.push_back(FileName);
1751 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1752 SourceIdMap.find(std::make_pair(DId, FId));
1753 if (SI != SourceIdMap.end())
1756 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1757 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1758 SourceIds.push_back(std::make_pair(DId, FId));
1763 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1764 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1765 CompileUnit *TheCU = getCompileUnit(NS);
1766 DIE *NDie = TheCU->getDIE(NS);
1769 NDie = new DIE(dwarf::DW_TAG_namespace);
1770 TheCU->insertDIE(NS, NDie);
1771 if (!NS.getName().empty())
1772 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1773 addSourceLine(NDie, &NS);
1774 addToContextOwner(NDie, NS.getContext());
1778 /// constructCompileUnit - Create new CompileUnit for the given
1779 /// metadata node with tag DW_TAG_compile_unit.
1780 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1781 DICompileUnit DIUnit(N);
1782 StringRef FN = DIUnit.getFilename();
1783 StringRef Dir = DIUnit.getDirectory();
1784 unsigned ID = GetOrCreateSourceID(Dir, FN);
1786 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1787 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1788 DIUnit.getProducer());
1789 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1790 DIUnit.getLanguage());
1791 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1792 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1793 // simplifies debug range entries.
1794 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_data4, 0);
1795 // DW_AT_stmt_list is a offset of line number information for this
1796 // compile unit in debug_line section. It is always zero when only one
1797 // compile unit is emitted in one object file.
1798 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1801 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1802 if (DIUnit.isOptimized())
1803 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1805 StringRef Flags = DIUnit.getFlags();
1807 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1809 unsigned RVer = DIUnit.getRunTimeVersion();
1811 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1812 dwarf::DW_FORM_data1, RVer);
1814 CompileUnit *NewCU = new CompileUnit(ID, Die);
1817 CUMap.insert(std::make_pair(N, NewCU));
1820 /// getCompielUnit - Get CompileUnit DIE.
1821 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1822 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1824 const MDNode *CUNode = NULL;
1825 if (D.isCompileUnit())
1827 else if (D.isSubprogram())
1828 CUNode = DISubprogram(N).getCompileUnit();
1829 else if (D.isType())
1830 CUNode = DIType(N).getCompileUnit();
1831 else if (D.isGlobalVariable())
1832 CUNode = DIGlobalVariable(N).getCompileUnit();
1833 else if (D.isVariable())
1834 CUNode = DIVariable(N).getCompileUnit();
1835 else if (D.isNameSpace())
1836 CUNode = DINameSpace(N).getCompileUnit();
1837 else if (D.isFile())
1838 CUNode = DIFile(N).getCompileUnit();
1842 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1843 = CUMap.find(CUNode);
1844 if (I == CUMap.end())
1850 /// constructGlobalVariableDIE - Construct global variable DIE.
1851 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1852 DIGlobalVariable DI_GV(N);
1854 // If debug information is malformed then ignore it.
1855 if (DI_GV.Verify() == false)
1858 // Check for pre-existence.
1859 CompileUnit *TheCU = getCompileUnit(N);
1860 if (TheCU->getDIE(DI_GV))
1863 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1868 TheCU->insertDIE(N, VariableDie);
1870 // Add to context owner.
1871 DIDescriptor GVContext = DI_GV.getContext();
1872 // Do not create specification DIE if context is either compile unit
1874 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1875 !GVContext.isFile() &&
1876 !isSubprogramContext(GVContext)) {
1877 // Create specification DIE.
1878 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1879 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1880 dwarf::DW_FORM_ref4, VariableDie);
1881 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1882 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1883 addLabel(Block, 0, dwarf::DW_FORM_udata,
1884 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1885 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1886 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1887 TheCU->addDie(VariableSpecDIE);
1889 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1890 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1891 addLabel(Block, 0, dwarf::DW_FORM_udata,
1892 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1893 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1895 addToContextOwner(VariableDie, GVContext);
1897 // Expose as global. FIXME - need to check external flag.
1898 TheCU->addGlobal(DI_GV.getName(), VariableDie);
1900 DIType GTy = DI_GV.getType();
1901 if (GTy.isCompositeType() && !GTy.getName().empty()
1902 && !GTy.isForwardDecl()) {
1903 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1904 assert(Entry && "Missing global type!");
1905 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1910 /// construct SubprogramDIE - Construct subprogram DIE.
1911 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1914 // Check for pre-existence.
1915 CompileUnit *TheCU = getCompileUnit(N);
1916 if (TheCU->getDIE(N))
1919 if (!SP.isDefinition())
1920 // This is a method declaration which will be handled while constructing
1924 DIE *SubprogramDie = createSubprogramDIE(SP);
1927 TheCU->insertDIE(N, SubprogramDie);
1929 // Add to context owner.
1930 addToContextOwner(SubprogramDie, SP.getContext());
1932 // Expose as global.
1933 TheCU->addGlobal(SP.getName(), SubprogramDie);
1938 /// beginModule - Emit all Dwarf sections that should come prior to the
1939 /// content. Create global DIEs and emit initial debug info sections.
1940 /// This is inovked by the target AsmPrinter.
1941 void DwarfDebug::beginModule(Module *M) {
1942 if (DisableDebugInfoPrinting)
1945 DebugInfoFinder DbgFinder;
1946 DbgFinder.processModule(*M);
1948 bool HasDebugInfo = false;
1950 // Scan all the compile-units to see if there are any marked as the main unit.
1951 // if not, we do not generate debug info.
1952 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1953 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1954 if (DICompileUnit(*I).isMain()) {
1955 HasDebugInfo = true;
1960 if (!HasDebugInfo) return;
1962 // Tell MMI that we have debug info.
1963 MMI->setDebugInfoAvailability(true);
1965 // Emit initial sections.
1966 EmitSectionLabels();
1968 // Create all the compile unit DIEs.
1969 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1970 E = DbgFinder.compile_unit_end(); I != E; ++I)
1971 constructCompileUnit(*I);
1973 // Create DIEs for each subprogram.
1974 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1975 E = DbgFinder.subprogram_end(); I != E; ++I)
1976 constructSubprogramDIE(*I);
1978 // Create DIEs for each global variable.
1979 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1980 E = DbgFinder.global_variable_end(); I != E; ++I)
1981 constructGlobalVariableDIE(*I);
1983 // Prime section data.
1984 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1986 // Print out .file directives to specify files for .loc directives. These are
1987 // printed out early so that they precede any .loc directives.
1988 if (Asm->MAI->hasDotLocAndDotFile()) {
1989 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1990 // Remember source id starts at 1.
1991 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1992 // FIXME: don't use sys::path for this! This should not depend on the
1994 sys::Path FullPath(getSourceDirectoryName(Id.first));
1996 FullPath.appendComponent(getSourceFileName(Id.second));
1997 assert(AppendOk && "Could not append filename to directory!");
1999 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2004 /// endModule - Emit all Dwarf sections that should come after the content.
2006 void DwarfDebug::endModule() {
2007 if (!FirstCU) return;
2009 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2010 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2011 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2013 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2016 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2017 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2018 DIE *SPDie = CI->first;
2019 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2021 DIE *NDie = getCompileUnit(N)->getDIE(N);
2022 if (!NDie) continue;
2023 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2026 // Standard sections final addresses.
2027 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2028 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2029 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2030 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2032 // End text sections.
2033 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2034 Asm->OutStreamer.SwitchSection(SectionMap[i]);
2035 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2038 // Emit common frame information.
2039 emitCommonDebugFrame();
2041 // Emit function debug frame information
2042 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2043 E = DebugFrames.end(); I != E; ++I)
2044 emitFunctionDebugFrame(*I);
2046 // Compute DIE offsets and sizes.
2047 computeSizeAndOffsets();
2049 // Emit all the DIEs into a debug info section
2052 // Corresponding abbreviations into a abbrev section.
2053 emitAbbreviations();
2055 // Emit source line correspondence into a debug line section.
2058 // Emit info into a debug pubnames section.
2059 emitDebugPubNames();
2061 // Emit info into a debug pubtypes section.
2062 emitDebugPubTypes();
2064 // Emit info into a debug loc section.
2067 // Emit info into a debug aranges section.
2070 // Emit info into a debug ranges section.
2073 // Emit info into a debug macinfo section.
2076 // Emit inline info.
2077 emitDebugInlineInfo();
2079 // Emit info into a debug str section.
2082 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2083 E = CUMap.end(); I != E; ++I)
2085 FirstCU = NULL; // Reset for the next Module, if any.
2088 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2089 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2090 DebugLoc ScopeLoc) {
2092 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2094 return AbsDbgVariable;
2096 LLVMContext &Ctx = Var->getContext();
2097 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2101 AbsDbgVariable = new DbgVariable(Var);
2102 Scope->addVariable(AbsDbgVariable);
2103 AbstractVariables[Var] = AbsDbgVariable;
2104 return AbsDbgVariable;
2107 /// collectVariableInfoFromMMITable - Collect variable information from
2108 /// side table maintained by MMI.
2110 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2111 SmallPtrSet<const MDNode *, 16> &Processed) {
2112 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2113 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2114 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2115 VE = VMap.end(); VI != VE; ++VI) {
2116 const MDNode *Var = VI->first;
2118 Processed.insert(Var);
2120 const std::pair<unsigned, DebugLoc> &VP = VI->second;
2122 DbgScope *Scope = 0;
2123 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2124 Scope = ConcreteScopes.lookup(IA);
2126 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2128 // If variable scope is not found then skip this variable.
2132 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2133 DbgVariable *RegVar = new DbgVariable(DV);
2134 recordVariableFrameIndex(RegVar, VP.first);
2135 Scope->addVariable(RegVar);
2136 if (AbsDbgVariable) {
2137 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2138 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2143 /// isDbgValueInUndefinedReg - Return true if debug value, encoded by
2144 /// DBG_VALUE instruction, is in undefined reg.
2145 static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2146 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2147 if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2152 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2153 /// DBG_VALUE instruction, is in a defined reg.
2154 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2155 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2156 if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2161 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2163 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2164 SmallPtrSet<const MDNode *, 16> &Processed) {
2166 /// collection info from MMI table.
2167 collectVariableInfoFromMMITable(MF, Processed);
2169 SmallVector<const MachineInstr *, 8> DbgValues;
2170 // Collect variable information from DBG_VALUE machine instructions;
2171 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2173 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2175 const MachineInstr *MInsn = II;
2176 if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2178 DbgValues.push_back(MInsn);
2181 // This is a collection of DBV_VALUE instructions describing same variable.
2182 SmallVector<const MachineInstr *, 4> MultipleValues;
2183 for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2184 E = DbgValues.end(); I != E; ++I) {
2185 const MachineInstr *MInsn = *I;
2186 MultipleValues.clear();
2187 if (isDbgValueInDefinedReg(MInsn))
2188 MultipleValues.push_back(MInsn);
2189 DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2190 if (Processed.count(DV) != 0)
2193 const MachineInstr *PrevMI = MInsn;
2194 for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2195 ME = DbgValues.end(); MI != ME; ++MI) {
2197 (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2198 if (Var == DV && isDbgValueInDefinedReg(*MI) &&
2199 !PrevMI->isIdenticalTo(*MI))
2200 MultipleValues.push_back(*MI);
2204 DbgScope *Scope = findDbgScope(MInsn);
2205 bool CurFnArg = false;
2206 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2207 DISubprogram(DV.getContext()).describes(MF->getFunction()))
2209 if (!Scope && CurFnArg)
2210 Scope = CurrentFnDbgScope;
2211 // If variable scope is not found then skip this variable.
2215 Processed.insert(DV);
2216 DbgVariable *RegVar = new DbgVariable(DV);
2217 Scope->addVariable(RegVar);
2219 DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2220 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2221 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2222 VarToAbstractVarMap[RegVar] = AbsVar;
2224 if (MultipleValues.size() <= 1) {
2225 DbgVariableToDbgInstMap[RegVar] = MInsn;
2229 // handle multiple DBG_VALUE instructions describing one variable.
2230 if (DotDebugLocEntries.empty())
2231 RegVar->setDotDebugLocOffset(0);
2233 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2234 const MachineInstr *Begin = NULL;
2235 const MachineInstr *End = NULL;
2236 for (SmallVector<const MachineInstr *, 4>::iterator
2237 MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) {
2243 MachineLocation MLoc;
2244 MLoc.set(Begin->getOperand(0).getReg(), 0);
2245 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2246 const MCSymbol *SLabel = getLabelBeforeInsn(End);
2247 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2249 if (MVI + 1 == MVE) {
2250 // If End is the last instruction then its value is valid
2251 // until the end of the funtion.
2252 MLoc.set(End->getOperand(0).getReg(), 0);
2254 push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc));
2257 DotDebugLocEntries.push_back(DotDebugLocEntry());
2260 // Collect info for variables that were optimized out.
2261 const Function *F = MF->getFunction();
2262 const Module *M = F->getParent();
2263 if (NamedMDNode *NMD =
2264 M->getNamedMetadata(Twine("llvm.dbg.lv.",
2265 getRealLinkageName(F->getName())))) {
2266 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2267 DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2268 if (!DV || !Processed.insert(DV))
2270 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2272 Scope->addVariable(new DbgVariable(DV));
2277 /// getLabelBeforeInsn - Return Label preceding the instruction.
2278 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2279 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2280 LabelsBeforeInsn.find(MI);
2281 if (I == LabelsBeforeInsn.end())
2282 // FunctionBeginSym always preceeds all the instruction in current function.
2283 return FunctionBeginSym;
2287 /// getLabelAfterInsn - Return Label immediately following the instruction.
2288 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2289 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2290 LabelsAfterInsn.find(MI);
2291 if (I == LabelsAfterInsn.end())
2296 /// beginScope - Process beginning of a scope.
2297 void DwarfDebug::beginScope(const MachineInstr *MI) {
2298 if (InsnNeedsLabel.count(MI) == 0) {
2299 LabelsBeforeInsn[MI] = PrevLabel;
2304 DebugLoc DL = MI->getDebugLoc();
2305 if (!DL.isUnknown()) {
2306 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2307 PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2309 LabelsBeforeInsn[MI] = PrevLabel;
2313 // If location is unknown then use temp label for this DBG_VALUE
2315 if (MI->isDebugValue()) {
2316 PrevLabel = MMI->getContext().CreateTempSymbol();
2317 Asm->OutStreamer.EmitLabel(PrevLabel);
2318 LabelsBeforeInsn[MI] = PrevLabel;
2322 if (UnknownLocations) {
2323 PrevLabel = recordSourceLine(0, 0, 0);
2324 LabelsBeforeInsn[MI] = PrevLabel;
2328 assert (0 && "Instruction is not processed!");
2331 /// endScope - Process end of a scope.
2332 void DwarfDebug::endScope(const MachineInstr *MI) {
2333 if (InsnsEndScopeSet.count(MI) != 0) {
2334 // Emit a label if this instruction ends a scope.
2335 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2336 Asm->OutStreamer.EmitLabel(Label);
2337 LabelsAfterInsn[MI] = Label;
2341 /// getOrCreateDbgScope - Create DbgScope for the scope.
2342 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) {
2344 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2347 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2348 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2349 if (DIDescriptor(Scope).isLexicalBlock()) {
2351 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2352 WScope->setParent(Parent);
2353 Parent->addScope(WScope);
2356 if (!WScope->getParent()) {
2357 StringRef SPName = DISubprogram(Scope).getLinkageName();
2358 // We used to check only for a linkage name, but that fails
2359 // since we began omitting the linkage name for private
2360 // functions. The new way is to check for the name in metadata,
2361 // but that's not supported in old .ll test cases. Ergo, we
2363 if (SPName == Asm->MF->getFunction()->getName() ||
2364 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2365 CurrentFnDbgScope = WScope;
2371 getOrCreateAbstractScope(Scope);
2372 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2376 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2377 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2378 DILocation DL(InlinedAt);
2380 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2381 WScope->setParent(Parent);
2382 Parent->addScope(WScope);
2384 ConcreteScopes[InlinedAt] = WScope;
2389 /// hasValidLocation - Return true if debug location entry attached with
2390 /// machine instruction encodes valid location info.
2391 static bool hasValidLocation(LLVMContext &Ctx,
2392 const MachineInstr *MInsn,
2393 const MDNode *&Scope, const MDNode *&InlinedAt) {
2394 DebugLoc DL = MInsn->getDebugLoc();
2395 if (DL.isUnknown()) return false;
2397 const MDNode *S = DL.getScope(Ctx);
2399 // There is no need to create another DIE for compile unit. For all
2400 // other scopes, create one DbgScope now. This will be translated
2401 // into a scope DIE at the end.
2402 if (DIScope(S).isCompileUnit()) return false;
2405 InlinedAt = DL.getInlinedAt(Ctx);
2409 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2411 static void calculateDominanceGraph(DbgScope *Scope) {
2412 assert (Scope && "Unable to calculate scop edominance graph!");
2413 SmallVector<DbgScope *, 4> WorkStack;
2414 WorkStack.push_back(Scope);
2415 unsigned Counter = 0;
2416 while (!WorkStack.empty()) {
2417 DbgScope *WS = WorkStack.back();
2418 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2419 bool visitedChildren = false;
2420 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2421 SE = Children.end(); SI != SE; ++SI) {
2422 DbgScope *ChildScope = *SI;
2423 if (!ChildScope->getDFSOut()) {
2424 WorkStack.push_back(ChildScope);
2425 visitedChildren = true;
2426 ChildScope->setDFSIn(++Counter);
2430 if (!visitedChildren) {
2431 WorkStack.pop_back();
2432 WS->setDFSOut(++Counter);
2437 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2439 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2440 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2443 unsigned PrevDFSIn = 0;
2444 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2446 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2448 const MachineInstr *MInsn = II;
2449 const MDNode *Scope = NULL;
2450 const MDNode *InlinedAt = NULL;
2452 // Check if instruction has valid location information.
2453 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2457 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2458 MI2ScopeMap.find(MInsn);
2459 if (DI != MI2ScopeMap.end()) {
2460 DbgScope *S = DI->second;
2461 dbgs() << S->getDFSIn();
2462 PrevDFSIn = S->getDFSIn();
2464 dbgs() << PrevDFSIn;
2466 dbgs() << " [ x" << PrevDFSIn;
2474 /// extractScopeInformation - Scan machine instructions in this function
2475 /// and collect DbgScopes. Return true, if at least one scope was found.
2476 bool DwarfDebug::extractScopeInformation() {
2477 // If scope information was extracted using .dbg intrinsics then there is not
2478 // any need to extract these information by scanning each instruction.
2479 if (!DbgScopeMap.empty())
2482 // Scan each instruction and create scopes. First build working set of scopes.
2483 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2484 SmallVector<DbgRange, 4> MIRanges;
2485 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2486 const MDNode *PrevScope = NULL;
2487 const MDNode *PrevInlinedAt = NULL;
2488 const MachineInstr *RangeBeginMI = NULL;
2489 const MachineInstr *PrevMI = NULL;
2490 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2492 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2494 const MachineInstr *MInsn = II;
2495 const MDNode *Scope = NULL;
2496 const MDNode *InlinedAt = NULL;
2498 // Check if instruction has valid location information.
2499 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2504 // If scope has not changed then skip this instruction.
2505 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2511 // If we have alread seen a beginning of a instruction range and
2512 // current instruction scope does not match scope of first instruction
2513 // in this range then create a new instruction range.
2514 DbgRange R(RangeBeginMI, PrevMI);
2515 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2516 MIRanges.push_back(R);
2519 // This is a beginning of a new instruction range.
2520 RangeBeginMI = MInsn;
2522 // Reset previous markers.
2525 PrevInlinedAt = InlinedAt;
2529 // Create last instruction range.
2530 if (RangeBeginMI && PrevMI && PrevScope) {
2531 DbgRange R(RangeBeginMI, PrevMI);
2532 MIRanges.push_back(R);
2533 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2536 if (!CurrentFnDbgScope)
2539 calculateDominanceGraph(CurrentFnDbgScope);
2541 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2543 // Find ranges of instructions covered by each DbgScope;
2544 DbgScope *PrevDbgScope = NULL;
2545 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2546 RE = MIRanges.end(); RI != RE; ++RI) {
2547 const DbgRange &R = *RI;
2548 DbgScope *S = MI2ScopeMap.lookup(R.first);
2549 assert (S && "Lost DbgScope for a machine instruction!");
2550 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2551 PrevDbgScope->closeInsnRange(S);
2552 S->openInsnRange(R.first);
2553 S->extendInsnRange(R.second);
2558 PrevDbgScope->closeInsnRange();
2560 identifyScopeMarkers();
2562 return !DbgScopeMap.empty();
2565 /// identifyScopeMarkers() -
2566 /// Each DbgScope has first instruction and last instruction to mark beginning
2567 /// and end of a scope respectively. Create an inverse map that list scopes
2568 /// starts (and ends) with an instruction. One instruction may start (or end)
2569 /// multiple scopes. Ignore scopes that are not reachable.
2570 void DwarfDebug::identifyScopeMarkers() {
2571 SmallVector<DbgScope *, 4> WorkList;
2572 WorkList.push_back(CurrentFnDbgScope);
2573 while (!WorkList.empty()) {
2574 DbgScope *S = WorkList.pop_back_val();
2576 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2577 if (!Children.empty())
2578 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2579 SE = Children.end(); SI != SE; ++SI)
2580 WorkList.push_back(*SI);
2582 if (S->isAbstractScope())
2585 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2588 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2589 RE = Ranges.end(); RI != RE; ++RI) {
2590 assert(RI->first && "DbgRange does not have first instruction!");
2591 assert(RI->second && "DbgRange does not have second instruction!");
2592 InsnsEndScopeSet.insert(RI->second);
2597 /// FindFirstDebugLoc - Find the first debug location in the function. This
2598 /// is intended to be an approximation for the source position of the
2599 /// beginning of the function.
2600 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2601 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2603 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2604 MBBI != MBBE; ++MBBI) {
2605 DebugLoc DL = MBBI->getDebugLoc();
2606 if (!DL.isUnknown())
2612 /// beginFunction - Gather pre-function debug information. Assumes being
2613 /// emitted immediately after the function entry point.
2614 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2615 if (!MMI->hasDebugInfo()) return;
2616 if (!extractScopeInformation()) return;
2618 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2619 Asm->getFunctionNumber());
2620 // Assumes in correct section after the entry point.
2621 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2623 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2625 DebugLoc FDL = FindFirstDebugLoc(MF);
2626 if (FDL.isUnknown()) return;
2628 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2630 DISubprogram SP = getDISubprogram(Scope);
2633 Line = SP.getLineNumber();
2636 Line = FDL.getLine();
2640 recordSourceLine(Line, Col, Scope);
2642 /// ProcessedArgs - Collection of arguments already processed.
2643 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2646 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2648 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2650 const MachineInstr *MI = II;
2651 DebugLoc DL = MI->getDebugLoc();
2652 if (MI->isDebugValue()) {
2653 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2654 DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2655 if (!DV.Verify()) continue;
2656 // If DBG_VALUE is for a local variable then it needs a label.
2657 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2658 InsnNeedsLabel.insert(MI);
2659 // DBG_VALUE for inlined functions argument needs a label.
2660 else if (!DISubprogram(DV.getContext()).describes(MF->getFunction()))
2661 InsnNeedsLabel.insert(MI);
2662 // DBG_VALUE indicating argument location change needs a label.
2663 else if (isDbgValueInUndefinedReg(MI) == false && !ProcessedArgs.insert(DV))
2664 InsnNeedsLabel.insert(MI);
2666 // If location is unknown then instruction needs a location only if
2667 // UnknownLocations flag is set.
2668 if (DL.isUnknown()) {
2669 if (UnknownLocations && !PrevLoc.isUnknown())
2670 InsnNeedsLabel.insert(MI);
2671 } else if (DL != PrevLoc)
2672 // Otherwise, instruction needs a location only if it is new location.
2673 InsnNeedsLabel.insert(MI);
2676 if (!DL.isUnknown() || UnknownLocations)
2680 PrevLabel = FunctionBeginSym;
2683 /// endFunction - Gather and emit post-function debug information.
2685 void DwarfDebug::endFunction(const MachineFunction *MF) {
2686 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2688 if (CurrentFnDbgScope) {
2690 // Define end label for subprogram.
2691 FunctionEndSym = Asm->GetTempSymbol("func_end",
2692 Asm->getFunctionNumber());
2693 // Assumes in correct section after the entry point.
2694 Asm->OutStreamer.EmitLabel(FunctionEndSym);
2696 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2697 collectVariableInfo(MF, ProcessedVars);
2699 // Get function line info.
2700 if (!Lines.empty()) {
2701 // Get section line info.
2702 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2703 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2704 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2705 // Append the function info to section info.
2706 SectionLineInfos.insert(SectionLineInfos.end(),
2707 Lines.begin(), Lines.end());
2710 // Construct abstract scopes.
2711 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2712 AE = AbstractScopesList.end(); AI != AE; ++AI) {
2713 constructScopeDIE(*AI);
2714 DISubprogram SP((*AI)->getScopeNode());
2716 // Collect info for variables that were optimized out.
2717 StringRef FName = SP.getLinkageName();
2719 FName = SP.getName();
2720 const Module *M = MF->getFunction()->getParent();
2721 if (NamedMDNode *NMD =
2722 M->getNamedMetadata(Twine("llvm.dbg.lv.",
2723 getRealLinkageName(FName)))) {
2724 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2725 DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2726 if (!DV || !ProcessedVars.insert(DV))
2728 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2730 Scope->addVariable(new DbgVariable(DV));
2736 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2738 if (!DisableFramePointerElim(*MF))
2739 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2740 dwarf::DW_FORM_flag, 1);
2743 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2744 MMI->getFrameMoves()));
2748 CurrentFnDbgScope = NULL;
2749 InsnNeedsLabel.clear();
2750 DbgVariableToFrameIndexMap.clear();
2751 VarToAbstractVarMap.clear();
2752 DbgVariableToDbgInstMap.clear();
2753 DbgVariableLabelsMap.clear();
2754 DeleteContainerSeconds(DbgScopeMap);
2755 InsnsEndScopeSet.clear();
2756 ConcreteScopes.clear();
2757 DeleteContainerSeconds(AbstractScopes);
2758 AbstractScopesList.clear();
2759 AbstractVariables.clear();
2760 LabelsBeforeInsn.clear();
2761 LabelsAfterInsn.clear();
2766 /// recordVariableFrameIndex - Record a variable's index.
2767 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2768 assert (V && "Invalid DbgVariable!");
2769 DbgVariableToFrameIndexMap[V] = Index;
2772 /// findVariableFrameIndex - Return true if frame index for the variable
2773 /// is found. Update FI to hold value of the index.
2774 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2775 assert (V && "Invalid DbgVariable!");
2776 DenseMap<const DbgVariable *, int>::iterator I =
2777 DbgVariableToFrameIndexMap.find(V);
2778 if (I == DbgVariableToFrameIndexMap.end())
2784 /// findVariableLabel - Find MCSymbol for the variable.
2785 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2786 DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2787 = DbgVariableLabelsMap.find(V);
2788 if (I == DbgVariableLabelsMap.end())
2790 else return I->second;
2793 /// findDbgScope - Find DbgScope for the debug loc attached with an
2795 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2796 DbgScope *Scope = NULL;
2798 MInsn->getParent()->getParent()->getFunction()->getContext();
2799 DebugLoc DL = MInsn->getDebugLoc();
2804 if (const MDNode *IA = DL.getInlinedAt(Ctx))
2805 Scope = ConcreteScopes.lookup(IA);
2807 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2813 /// recordSourceLine - Register a source line with debug info. Returns the
2814 /// unique label that was emitted and which provides correspondence to
2815 /// the source line list.
2816 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) {
2822 DIDescriptor Scope(S);
2824 if (Scope.isCompileUnit()) {
2825 DICompileUnit CU(S);
2826 Dir = CU.getDirectory();
2827 Fn = CU.getFilename();
2828 } else if (Scope.isSubprogram()) {
2830 Dir = SP.getDirectory();
2831 Fn = SP.getFilename();
2832 } else if (Scope.isLexicalBlock()) {
2833 DILexicalBlock DB(S);
2834 Dir = DB.getDirectory();
2835 Fn = DB.getFilename();
2837 assert(0 && "Unexpected scope info");
2839 Src = GetOrCreateSourceID(Dir, Fn);
2843 if (!Lines.empty()) {
2844 SrcLineInfo lastSrcLineInfo = Lines.back();
2845 // Emitting sequential line records with the same line number (but
2846 // different addresses) seems to confuse GDB. Avoid this.
2847 if (lastSrcLineInfo.getLine() == Line)
2852 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2853 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2855 Asm->OutStreamer.EmitLabel(Label);
2859 //===----------------------------------------------------------------------===//
2861 //===----------------------------------------------------------------------===//
2863 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2866 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2867 // Get the children.
2868 const std::vector<DIE *> &Children = Die->getChildren();
2870 // If not last sibling and has children then add sibling offset attribute.
2871 if (!Last && !Children.empty())
2872 Die->addSiblingOffset(DIEValueAllocator);
2874 // Record the abbreviation.
2875 assignAbbrevNumber(Die->getAbbrev());
2877 // Get the abbreviation for this DIE.
2878 unsigned AbbrevNumber = Die->getAbbrevNumber();
2879 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2882 Die->setOffset(Offset);
2884 // Start the size with the size of abbreviation code.
2885 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2887 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2888 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2890 // Size the DIE attribute values.
2891 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2892 // Size attribute value.
2893 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2895 // Size the DIE children if any.
2896 if (!Children.empty()) {
2897 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2898 "Children flag not set");
2900 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2901 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2903 // End of children marker.
2904 Offset += sizeof(int8_t);
2907 Die->setSize(Offset - Die->getOffset());
2911 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2913 void DwarfDebug::computeSizeAndOffsets() {
2914 unsigned PrevOffset = 0;
2915 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2916 E = CUMap.end(); I != E; ++I) {
2917 // Compute size of compile unit header.
2918 static unsigned Offset = PrevOffset +
2919 sizeof(int32_t) + // Length of Compilation Unit Info
2920 sizeof(int16_t) + // DWARF version number
2921 sizeof(int32_t) + // Offset Into Abbrev. Section
2922 sizeof(int8_t); // Pointer Size (in bytes)
2923 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2924 PrevOffset = Offset;
2928 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2929 /// temporary label to it if SymbolStem is specified.
2930 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2931 const char *SymbolStem = 0) {
2932 Asm->OutStreamer.SwitchSection(Section);
2933 if (!SymbolStem) return 0;
2935 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2936 Asm->OutStreamer.EmitLabel(TmpSym);
2940 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2941 /// the start of each one.
2942 void DwarfDebug::EmitSectionLabels() {
2943 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2945 // Dwarf sections base addresses.
2946 if (Asm->MAI->doesDwarfRequireFrameSection()) {
2947 DwarfFrameSectionSym =
2948 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2951 DwarfInfoSectionSym =
2952 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2953 DwarfAbbrevSectionSym =
2954 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2955 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2957 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2958 EmitSectionSym(Asm, MacroInfo);
2960 EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2961 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2962 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2963 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2964 DwarfStrSectionSym =
2965 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2966 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2969 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2970 "section_debug_loc");
2972 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2973 EmitSectionSym(Asm, TLOF.getDataSection());
2976 /// emitDIE - Recusively Emits a debug information entry.
2978 void DwarfDebug::emitDIE(DIE *Die) {
2979 // Get the abbreviation for this DIE.
2980 unsigned AbbrevNumber = Die->getAbbrevNumber();
2981 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2983 // Emit the code (index) for the abbreviation.
2984 if (Asm->isVerbose())
2985 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2986 Twine::utohexstr(Die->getOffset()) + ":0x" +
2987 Twine::utohexstr(Die->getSize()) + " " +
2988 dwarf::TagString(Abbrev->getTag()));
2989 Asm->EmitULEB128(AbbrevNumber);
2991 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2992 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2994 // Emit the DIE attribute values.
2995 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2996 unsigned Attr = AbbrevData[i].getAttribute();
2997 unsigned Form = AbbrevData[i].getForm();
2998 assert(Form && "Too many attributes for DIE (check abbreviation)");
3000 if (Asm->isVerbose())
3001 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3004 case dwarf::DW_AT_sibling:
3005 Asm->EmitInt32(Die->getSiblingOffset());
3007 case dwarf::DW_AT_abstract_origin: {
3008 DIEEntry *E = cast<DIEEntry>(Values[i]);
3009 DIE *Origin = E->getEntry();
3010 unsigned Addr = Origin->getOffset();
3011 Asm->EmitInt32(Addr);
3014 case dwarf::DW_AT_ranges: {
3015 // DW_AT_range Value encodes offset in debug_range section.
3016 DIEInteger *V = cast<DIEInteger>(Values[i]);
3017 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3019 DwarfDebugRangeSectionSym,
3023 case dwarf::DW_AT_location: {
3024 if (UseDotDebugLocEntry.count(Die) != 0) {
3025 DIELabel *L = cast<DIELabel>(Values[i]);
3026 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3028 Values[i]->EmitValue(Asm, Form);
3032 // Emit an attribute using the defined form.
3033 Values[i]->EmitValue(Asm, Form);
3038 // Emit the DIE children if any.
3039 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3040 const std::vector<DIE *> &Children = Die->getChildren();
3042 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3043 emitDIE(Children[j]);
3045 if (Asm->isVerbose())
3046 Asm->OutStreamer.AddComment("End Of Children Mark");
3051 /// emitDebugInfo - Emit the debug info section.
3053 void DwarfDebug::emitDebugInfo() {
3054 // Start debug info section.
3055 Asm->OutStreamer.SwitchSection(
3056 Asm->getObjFileLowering().getDwarfInfoSection());
3057 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3058 E = CUMap.end(); I != E; ++I) {
3059 CompileUnit *TheCU = I->second;
3060 DIE *Die = TheCU->getCUDie();
3062 // Emit the compile units header.
3063 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3066 // Emit size of content not including length itself
3067 unsigned ContentSize = Die->getSize() +
3068 sizeof(int16_t) + // DWARF version number
3069 sizeof(int32_t) + // Offset Into Abbrev. Section
3070 sizeof(int8_t) + // Pointer Size (in bytes)
3071 sizeof(int32_t); // FIXME - extra pad for gdb bug.
3073 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3074 Asm->EmitInt32(ContentSize);
3075 Asm->OutStreamer.AddComment("DWARF version number");
3076 Asm->EmitInt16(dwarf::DWARF_VERSION);
3077 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3078 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3079 DwarfAbbrevSectionSym);
3080 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3081 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3084 // FIXME - extra padding for gdb bug.
3085 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3090 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3094 /// emitAbbreviations - Emit the abbreviation section.
3096 void DwarfDebug::emitAbbreviations() const {
3097 // Check to see if it is worth the effort.
3098 if (!Abbreviations.empty()) {
3099 // Start the debug abbrev section.
3100 Asm->OutStreamer.SwitchSection(
3101 Asm->getObjFileLowering().getDwarfAbbrevSection());
3103 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3105 // For each abbrevation.
3106 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3107 // Get abbreviation data
3108 const DIEAbbrev *Abbrev = Abbreviations[i];
3110 // Emit the abbrevations code (base 1 index.)
3111 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3113 // Emit the abbreviations data.
3117 // Mark end of abbreviations.
3118 Asm->EmitULEB128(0, "EOM(3)");
3120 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3124 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3125 /// the line matrix.
3127 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3128 // Define last address of section.
3129 Asm->OutStreamer.AddComment("Extended Op");
3132 Asm->OutStreamer.AddComment("Op size");
3133 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3134 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3135 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3137 Asm->OutStreamer.AddComment("Section end label");
3139 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3140 Asm->getTargetData().getPointerSize(),
3143 // Mark end of matrix.
3144 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3150 /// emitDebugLines - Emit source line information.
3152 void DwarfDebug::emitDebugLines() {
3153 // If the target is using .loc/.file, the assembler will be emitting the
3154 // .debug_line table automatically.
3155 if (Asm->MAI->hasDotLocAndDotFile())
3158 // Minimum line delta, thus ranging from -10..(255-10).
3159 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3160 // Maximum line delta, thus ranging from -10..(255-10).
3161 const int MaxLineDelta = 255 + MinLineDelta;
3163 // Start the dwarf line section.
3164 Asm->OutStreamer.SwitchSection(
3165 Asm->getObjFileLowering().getDwarfLineSection());
3167 // Construct the section header.
3168 Asm->OutStreamer.AddComment("Length of Source Line Info");
3169 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3170 Asm->GetTempSymbol("line_begin"), 4);
3171 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3173 Asm->OutStreamer.AddComment("DWARF version number");
3174 Asm->EmitInt16(dwarf::DWARF_VERSION);
3176 Asm->OutStreamer.AddComment("Prolog Length");
3177 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3178 Asm->GetTempSymbol("line_prolog_begin"), 4);
3179 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3181 Asm->OutStreamer.AddComment("Minimum Instruction Length");
3183 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3185 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3186 Asm->EmitInt8(MinLineDelta);
3187 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3188 Asm->EmitInt8(MaxLineDelta);
3189 Asm->OutStreamer.AddComment("Special Opcode Base");
3190 Asm->EmitInt8(-MinLineDelta);
3192 // Line number standard opcode encodings argument count
3193 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3195 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3197 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3199 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3201 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3203 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3205 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3207 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3209 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3212 // Emit directories.
3213 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3214 const std::string &Dir = getSourceDirectoryName(DI);
3215 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3216 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3219 Asm->OutStreamer.AddComment("End of directories");
3223 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3224 // Remember source id starts at 1.
3225 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3226 const std::string &FN = getSourceFileName(Id.second);
3227 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3228 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3230 Asm->EmitULEB128(Id.first, "Directory #");
3231 Asm->EmitULEB128(0, "Mod date");
3232 Asm->EmitULEB128(0, "File size");
3235 Asm->OutStreamer.AddComment("End of files");
3238 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3240 // A sequence for each text section.
3241 unsigned SecSrcLinesSize = SectionSourceLines.size();
3243 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3244 // Isolate current sections line info.
3245 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3247 // Dwarf assumes we start with first line of first source file.
3248 unsigned Source = 1;
3251 // Construct rows of the address, source, line, column matrix.
3252 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3253 const SrcLineInfo &LineInfo = LineInfos[i];
3254 MCSymbol *Label = LineInfo.getLabel();
3255 if (!Label->isDefined()) continue; // Not emitted, in dead code.
3257 if (Asm->isVerbose()) {
3258 std::pair<unsigned, unsigned> SrcID =
3259 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3260 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3262 Twine(getSourceFileName(SrcID.second)) +
3263 ":" + Twine(LineInfo.getLine()));
3266 // Define the line address.
3267 Asm->OutStreamer.AddComment("Extended Op");
3269 Asm->OutStreamer.AddComment("Op size");
3270 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3272 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3273 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3275 Asm->OutStreamer.AddComment("Location label");
3276 Asm->OutStreamer.EmitSymbolValue(Label,
3277 Asm->getTargetData().getPointerSize(),
3280 // If change of source, then switch to the new source.
3281 if (Source != LineInfo.getSourceID()) {
3282 Source = LineInfo.getSourceID();
3283 Asm->OutStreamer.AddComment("DW_LNS_set_file");
3284 Asm->EmitInt8(dwarf::DW_LNS_set_file);
3285 Asm->EmitULEB128(Source, "New Source");
3288 // If change of line.
3289 if (Line != LineInfo.getLine()) {
3290 // Determine offset.
3291 int Offset = LineInfo.getLine() - Line;
3292 int Delta = Offset - MinLineDelta;
3295 Line = LineInfo.getLine();
3297 // If delta is small enough and in range...
3298 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3299 // ... then use fast opcode.
3300 Asm->OutStreamer.AddComment("Line Delta");
3301 Asm->EmitInt8(Delta - MinLineDelta);
3303 // ... otherwise use long hand.
3304 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3305 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3306 Asm->EmitSLEB128(Offset, "Line Offset");
3307 Asm->OutStreamer.AddComment("DW_LNS_copy");
3308 Asm->EmitInt8(dwarf::DW_LNS_copy);
3311 // Copy the previous row (different address or source)
3312 Asm->OutStreamer.AddComment("DW_LNS_copy");
3313 Asm->EmitInt8(dwarf::DW_LNS_copy);
3317 emitEndOfLineMatrix(j + 1);
3320 if (SecSrcLinesSize == 0)
3321 // Because we're emitting a debug_line section, we still need a line
3322 // table. The linker and friends expect it to exist. If there's nothing to
3323 // put into it, emit an empty table.
3324 emitEndOfLineMatrix(1);
3326 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3329 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3331 void DwarfDebug::emitCommonDebugFrame() {
3332 if (!Asm->MAI->doesDwarfRequireFrameSection())
3335 int stackGrowth = Asm->getTargetData().getPointerSize();
3336 if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3337 TargetFrameInfo::StackGrowsDown)
3340 // Start the dwarf frame section.
3341 Asm->OutStreamer.SwitchSection(
3342 Asm->getObjFileLowering().getDwarfFrameSection());
3344 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3345 Asm->OutStreamer.AddComment("Length of Common Information Entry");
3346 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3347 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3349 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3350 Asm->OutStreamer.AddComment("CIE Identifier Tag");
3351 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3352 Asm->OutStreamer.AddComment("CIE Version");
3353 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3354 Asm->OutStreamer.AddComment("CIE Augmentation");
3355 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3356 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3357 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3358 Asm->OutStreamer.AddComment("CIE RA Column");
3359 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3360 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3362 std::vector<MachineMove> Moves;
3363 RI->getInitialFrameState(Moves);
3365 Asm->EmitFrameMoves(Moves, 0, false);
3367 Asm->EmitAlignment(2);
3368 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3371 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3374 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3375 if (!Asm->MAI->doesDwarfRequireFrameSection())
3378 // Start the dwarf frame section.
3379 Asm->OutStreamer.SwitchSection(
3380 Asm->getObjFileLowering().getDwarfFrameSection());
3382 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3383 MCSymbol *DebugFrameBegin =
3384 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3385 MCSymbol *DebugFrameEnd =
3386 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3387 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3389 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3391 Asm->OutStreamer.AddComment("FDE CIE offset");
3392 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3393 DwarfFrameSectionSym);
3395 Asm->OutStreamer.AddComment("FDE initial location");
3396 MCSymbol *FuncBeginSym =
3397 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3398 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3399 Asm->getTargetData().getPointerSize(),
3403 Asm->OutStreamer.AddComment("FDE address range");
3404 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3405 FuncBeginSym, Asm->getTargetData().getPointerSize());
3407 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3409 Asm->EmitAlignment(2);
3410 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3413 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3415 void DwarfDebug::emitDebugPubNames() {
3416 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3417 E = CUMap.end(); I != E; ++I) {
3418 CompileUnit *TheCU = I->second;
3419 // Start the dwarf pubnames section.
3420 Asm->OutStreamer.SwitchSection(
3421 Asm->getObjFileLowering().getDwarfPubNamesSection());
3423 Asm->OutStreamer.AddComment("Length of Public Names Info");
3424 Asm->EmitLabelDifference(
3425 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3426 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3428 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3431 Asm->OutStreamer.AddComment("DWARF Version");
3432 Asm->EmitInt16(dwarf::DWARF_VERSION);
3434 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3435 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3436 DwarfInfoSectionSym);
3438 Asm->OutStreamer.AddComment("Compilation Unit Length");
3439 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3440 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3443 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3444 for (StringMap<DIE*>::const_iterator
3445 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3446 const char *Name = GI->getKeyData();
3447 DIE *Entity = GI->second;
3449 Asm->OutStreamer.AddComment("DIE offset");
3450 Asm->EmitInt32(Entity->getOffset());
3452 if (Asm->isVerbose())
3453 Asm->OutStreamer.AddComment("External Name");
3454 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3457 Asm->OutStreamer.AddComment("End Mark");
3459 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3464 void DwarfDebug::emitDebugPubTypes() {
3465 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3466 E = CUMap.end(); I != E; ++I) {
3467 CompileUnit *TheCU = I->second;
3468 // Start the dwarf pubnames section.
3469 Asm->OutStreamer.SwitchSection(
3470 Asm->getObjFileLowering().getDwarfPubTypesSection());
3471 Asm->OutStreamer.AddComment("Length of Public Types Info");
3472 Asm->EmitLabelDifference(
3473 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3474 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3476 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3479 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3480 Asm->EmitInt16(dwarf::DWARF_VERSION);
3482 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3483 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3484 DwarfInfoSectionSym);
3486 Asm->OutStreamer.AddComment("Compilation Unit Length");
3487 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3488 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3491 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3492 for (StringMap<DIE*>::const_iterator
3493 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3494 const char *Name = GI->getKeyData();
3495 DIE * Entity = GI->second;
3497 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3498 Asm->EmitInt32(Entity->getOffset());
3500 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3501 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3504 Asm->OutStreamer.AddComment("End Mark");
3506 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3511 /// emitDebugStr - Emit visible names into a debug str section.
3513 void DwarfDebug::emitDebugStr() {
3514 // Check to see if it is worth the effort.
3515 if (StringPool.empty()) return;
3517 // Start the dwarf str section.
3518 Asm->OutStreamer.SwitchSection(
3519 Asm->getObjFileLowering().getDwarfStrSection());
3521 // Get all of the string pool entries and put them in an array by their ID so
3522 // we can sort them.
3523 SmallVector<std::pair<unsigned,
3524 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3526 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3527 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3528 Entries.push_back(std::make_pair(I->second.second, &*I));
3530 array_pod_sort(Entries.begin(), Entries.end());
3532 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3533 // Emit a label for reference from debug information entries.
3534 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3536 // Emit the string itself.
3537 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3541 /// emitDebugLoc - Emit visible names into a debug loc section.
3543 void DwarfDebug::emitDebugLoc() {
3544 if (DotDebugLocEntries.empty())
3547 // Start the dwarf loc section.
3548 Asm->OutStreamer.SwitchSection(
3549 Asm->getObjFileLowering().getDwarfLocSection());
3550 unsigned char Size = Asm->getTargetData().getPointerSize();
3551 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3553 for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(),
3554 E = DotDebugLocEntries.end(); I != E; ++I, ++index) {
3555 DotDebugLocEntry Entry = *I;
3556 if (Entry.isEmpty()) {
3557 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3558 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3559 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3561 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3562 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3563 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3564 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3566 Asm->OutStreamer.AddComment("Loc expr size");
3568 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3570 Asm->OutStreamer.AddComment("Loc expr size");
3571 Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3572 Asm->EmitInt8(dwarf::DW_OP_regx);
3573 Asm->EmitULEB128(Reg);
3579 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3581 void DwarfDebug::EmitDebugARanges() {
3582 // Start the dwarf aranges section.
3583 Asm->OutStreamer.SwitchSection(
3584 Asm->getObjFileLowering().getDwarfARangesSection());
3587 /// emitDebugRanges - Emit visible names into a debug ranges section.
3589 void DwarfDebug::emitDebugRanges() {
3590 // Start the dwarf ranges section.
3591 Asm->OutStreamer.SwitchSection(
3592 Asm->getObjFileLowering().getDwarfRangesSection());
3593 unsigned char Size = Asm->getTargetData().getPointerSize();
3594 for (SmallVector<const MCSymbol *, 8>::iterator
3595 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3598 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3600 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3604 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3606 void DwarfDebug::emitDebugMacInfo() {
3607 if (const MCSection *LineInfo =
3608 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3609 // Start the dwarf macinfo section.
3610 Asm->OutStreamer.SwitchSection(LineInfo);
3614 /// emitDebugInlineInfo - Emit inline info using following format.
3616 /// 1. length of section
3617 /// 2. Dwarf version number
3618 /// 3. address size.
3620 /// Entries (one "entry" for each function that was inlined):
3622 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3623 /// otherwise offset into __debug_str for regular function name.
3624 /// 2. offset into __debug_str section for regular function name.
3625 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3626 /// instances for the function.
3628 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3629 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3630 /// __debug_info section, and the low_pc is the starting address for the
3631 /// inlining instance.
3632 void DwarfDebug::emitDebugInlineInfo() {
3633 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3639 Asm->OutStreamer.SwitchSection(
3640 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3642 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3643 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3644 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3646 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3648 Asm->OutStreamer.AddComment("Dwarf Version");
3649 Asm->EmitInt16(dwarf::DWARF_VERSION);
3650 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3651 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3653 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3654 E = InlinedSPNodes.end(); I != E; ++I) {
3656 const MDNode *Node = *I;
3657 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3658 = InlineInfo.find(Node);
3659 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3660 DISubprogram SP(Node);
3661 StringRef LName = SP.getLinkageName();
3662 StringRef Name = SP.getName();
3664 Asm->OutStreamer.AddComment("MIPS linkage name");
3665 if (LName.empty()) {
3666 Asm->OutStreamer.EmitBytes(Name, 0);
3667 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3669 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3670 DwarfStrSectionSym);
3672 Asm->OutStreamer.AddComment("Function name");
3673 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3674 Asm->EmitULEB128(Labels.size(), "Inline count");
3676 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3677 LE = Labels.end(); LI != LE; ++LI) {
3678 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3679 Asm->EmitInt32(LI->second->getOffset());
3681 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3682 Asm->OutStreamer.EmitSymbolValue(LI->first,
3683 Asm->getTargetData().getPointerSize(),0);
3687 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));