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/Instructions.h"
20 #include "llvm/CodeGen/MachineFunction.h"
21 #include "llvm/CodeGen/MachineModuleInfo.h"
22 #include "llvm/MC/MCAsmInfo.h"
23 #include "llvm/MC/MCSection.h"
24 #include "llvm/MC/MCStreamer.h"
25 #include "llvm/MC/MCSymbol.h"
26 #include "llvm/Target/Mangler.h"
27 #include "llvm/Target/TargetData.h"
28 #include "llvm/Target/TargetFrameLowering.h"
29 #include "llvm/Target/TargetLoweringObjectFile.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetRegisterInfo.h"
32 #include "llvm/Target/TargetOptions.h"
33 #include "llvm/Analysis/DebugInfo.h"
34 #include "llvm/Analysis/DIBuilder.h"
35 #include "llvm/ADT/Statistic.h"
36 #include "llvm/ADT/STLExtras.h"
37 #include "llvm/ADT/StringExtras.h"
38 #include "llvm/Support/CommandLine.h"
39 #include "llvm/Support/Debug.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/ValueHandle.h"
42 #include "llvm/Support/FormattedStream.h"
43 #include "llvm/Support/Timer.h"
44 #include "llvm/Support/Path.h"
47 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
48 cl::desc("Print DbgScope information for each machine instruction"));
50 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
52 cl::desc("Disable debug info printing"));
54 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
55 cl::desc("Make an absense of debug location information explicit."),
59 STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
63 const char *DWARFGroupName = "DWARF Emission";
64 const char *DbgTimerName = "DWARF Debug Writer";
65 } // end anonymous namespace
67 //===----------------------------------------------------------------------===//
69 /// Configuration values for initial hash set sizes (log2).
71 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
75 //===----------------------------------------------------------------------===//
76 /// CompileUnit - This dwarf writer support class manages information associate
77 /// with a source file.
79 /// ID - File identifier for source.
83 /// Die - Compile unit debug information entry.
85 const OwningPtr<DIE> CUDie;
87 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
90 /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton
91 /// variables to debug information entries.
92 DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
94 /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton
95 /// descriptors to debug information entries using a DIEEntry proxy.
96 DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
98 /// Globals - A map of globally visible named entities for this unit.
100 StringMap<DIE*> Globals;
102 /// GlobalTypes - A map of globally visible types for this unit.
104 StringMap<DIE*> GlobalTypes;
107 CompileUnit(unsigned I, DIE *D)
108 : ID(I), CUDie(D), IndexTyDie(0) {}
111 unsigned getID() const { return ID; }
112 DIE* getCUDie() const { return CUDie.get(); }
113 const StringMap<DIE*> &getGlobals() const { return Globals; }
114 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
116 /// hasContent - Return true if this compile unit has something to write out.
118 bool hasContent() const { return !CUDie->getChildren().empty(); }
120 /// addGlobal - Add a new global entity to the compile unit.
122 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
124 /// addGlobalType - Add a new global type to the compile unit.
126 void addGlobalType(StringRef Name, DIE *Die) {
127 GlobalTypes[Name] = Die;
130 /// getDIE - Returns the debug information entry map slot for the
131 /// specified debug variable.
132 DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
134 /// insertDIE - Insert DIE into the map.
135 void insertDIE(const MDNode *N, DIE *D) {
136 MDNodeToDieMap.insert(std::make_pair(N, D));
139 /// getDIEEntry - Returns the debug information entry for the speciefied
141 DIEEntry *getDIEEntry(const MDNode *N) {
142 DenseMap<const MDNode *, DIEEntry *>::iterator I =
143 MDNodeToDIEEntryMap.find(N);
144 if (I == MDNodeToDIEEntryMap.end())
149 /// insertDIEEntry - Insert debug information entry into the map.
150 void insertDIEEntry(const MDNode *N, DIEEntry *E) {
151 MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
154 /// addDie - Adds or interns the DIE to the compile unit.
156 void addDie(DIE *Buffer) {
157 this->CUDie->addChild(Buffer);
160 // getIndexTyDie - Get an anonymous type for index type.
161 DIE *getIndexTyDie() {
165 // setIndexTyDie - Set D as anonymous type for index which can be reused
167 void setIndexTyDie(DIE *D) {
173 //===----------------------------------------------------------------------===//
174 /// DbgVariable - This class is used to track local variable information.
177 DIVariable Var; // Variable Descriptor.
178 DIE *TheDIE; // Variable DIE.
179 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.
181 // AbsVar may be NULL.
182 DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
185 DIVariable getVariable() const { return Var; }
186 void setDIE(DIE *D) { TheDIE = D; }
187 DIE *getDIE() const { return TheDIE; }
188 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }
189 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }
190 StringRef getName() const { return Var.getName(); }
191 unsigned getTag() const { return Var.getTag(); }
192 bool variableHasComplexAddress() const {
193 assert(Var.Verify() && "Invalid complex DbgVariable!");
194 return Var.hasComplexAddress();
196 bool isBlockByrefVariable() const {
197 assert(Var.Verify() && "Invalid complex DbgVariable!");
198 return Var.isBlockByrefVariable();
200 unsigned getNumAddrElements() const {
201 assert(Var.Verify() && "Invalid complex DbgVariable!");
202 return Var.getNumAddrElements();
204 uint64_t getAddrElement(unsigned i) const {
205 return Var.getAddrElement(i);
207 DIType getType() const {
208 DIType Ty = Var.getType();
209 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
210 // addresses instead.
211 if (Var.isBlockByrefVariable()) {
212 /* Byref variables, in Blocks, are declared by the programmer as
213 "SomeType VarName;", but the compiler creates a
214 __Block_byref_x_VarName struct, and gives the variable VarName
215 either the struct, or a pointer to the struct, as its type. This
216 is necessary for various behind-the-scenes things the compiler
217 needs to do with by-reference variables in blocks.
219 However, as far as the original *programmer* is concerned, the
220 variable should still have type 'SomeType', as originally declared.
222 The following function dives into the __Block_byref_x_VarName
223 struct to find the original type of the variable. This will be
224 passed back to the code generating the type for the Debug
225 Information Entry for the variable 'VarName'. 'VarName' will then
226 have the original type 'SomeType' in its debug information.
228 The original type 'SomeType' will be the type of the field named
229 'VarName' inside the __Block_byref_x_VarName struct.
231 NOTE: In order for this to not completely fail on the debugger
232 side, the Debug Information Entry for the variable VarName needs to
233 have a DW_AT_location that tells the debugger how to unwind through
234 the pointers and __Block_byref_x_VarName struct to find the actual
235 value of the variable. The function addBlockByrefType does this. */
237 unsigned tag = Ty.getTag();
239 if (tag == dwarf::DW_TAG_pointer_type) {
240 DIDerivedType DTy = DIDerivedType(Ty);
241 subType = DTy.getTypeDerivedFrom();
244 DICompositeType blockStruct = DICompositeType(subType);
245 DIArray Elements = blockStruct.getTypeArray();
247 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
248 DIDescriptor Element = Elements.getElement(i);
249 DIDerivedType DT = DIDerivedType(Element);
250 if (getName() == DT.getName())
251 return (DT.getTypeDerivedFrom());
259 //===----------------------------------------------------------------------===//
260 /// DbgRange - This is used to track range of instructions with identical
261 /// debug info scope.
263 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
265 //===----------------------------------------------------------------------===//
266 /// DbgScope - This class is used to track scope information.
269 DbgScope *Parent; // Parent to this scope.
270 DIDescriptor Desc; // Debug info descriptor for scope.
271 // Location at which this scope is inlined.
272 AssertingVH<const MDNode> InlinedAtLocation;
273 bool AbstractScope; // Abstract Scope
274 const MachineInstr *LastInsn; // Last instruction of this scope.
275 const MachineInstr *FirstInsn; // First instruction of this scope.
276 unsigned DFSIn, DFSOut;
277 // Scopes defined in scope. Contents not owned.
278 SmallVector<DbgScope *, 4> Scopes;
279 // Variables declared in scope. Contents owned.
280 SmallVector<DbgVariable *, 8> Variables;
281 SmallVector<DbgRange, 4> Ranges;
282 // Private state for dump()
283 mutable unsigned IndentLevel;
285 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
286 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
287 LastInsn(0), FirstInsn(0),
288 DFSIn(0), DFSOut(0), IndentLevel(0) {}
292 DbgScope *getParent() const { return Parent; }
293 void setParent(DbgScope *P) { Parent = P; }
294 DIDescriptor getDesc() const { return Desc; }
295 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
296 const MDNode *getScopeNode() const { return Desc; }
297 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
298 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
299 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
301 /// openInsnRange - This scope covers instruction range starting from MI.
302 void openInsnRange(const MachineInstr *MI) {
307 Parent->openInsnRange(MI);
310 /// extendInsnRange - Extend the current instruction range covered by
312 void extendInsnRange(const MachineInstr *MI) {
313 assert (FirstInsn && "MI Range is not open!");
316 Parent->extendInsnRange(MI);
319 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
320 /// until now. This is used when a new scope is encountered while walking
321 /// machine instructions.
322 void closeInsnRange(DbgScope *NewScope = NULL) {
323 assert (LastInsn && "Last insn missing!");
324 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
327 // If Parent dominates NewScope then do not close Parent's instruction
329 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
330 Parent->closeInsnRange(NewScope);
333 void setAbstractScope() { AbstractScope = true; }
334 bool isAbstractScope() const { return AbstractScope; }
336 // Depth First Search support to walk and mainpluate DbgScope hierarchy.
337 unsigned getDFSOut() const { return DFSOut; }
338 void setDFSOut(unsigned O) { DFSOut = O; }
339 unsigned getDFSIn() const { return DFSIn; }
340 void setDFSIn(unsigned I) { DFSIn = I; }
341 bool dominates(const DbgScope *S) {
344 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
349 /// addScope - Add a scope to the scope.
351 void addScope(DbgScope *S) { Scopes.push_back(S); }
353 /// addVariable - Add a variable to the scope.
355 void addVariable(DbgVariable *V) { Variables.push_back(V); }
362 } // end llvm namespace
365 void DbgScope::dump() const {
366 raw_ostream &err = dbgs();
367 err.indent(IndentLevel);
368 const MDNode *N = Desc;
371 err << "Abstract Scope\n";
375 err << "Children ...\n";
376 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
377 if (Scopes[i] != this)
384 DbgScope::~DbgScope() {
385 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
389 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
390 : Asm(A), MMI(Asm->MMI), FirstCU(0),
391 AbbreviationsSet(InitAbbreviationsSetSize),
392 CurrentFnDbgScope(0), PrevLabel(NULL) {
393 NextStringPoolNumber = 0;
395 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
396 DwarfStrSectionSym = TextSectionSym = 0;
397 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
398 FunctionBeginSym = FunctionEndSym = 0;
399 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
401 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
405 DwarfDebug::~DwarfDebug() {
406 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
407 DIEBlocks[j]->~DIEBlock();
410 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
411 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
412 if (Entry.first) return Entry.first;
414 Entry.second = NextStringPoolNumber++;
415 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
419 /// assignAbbrevNumber - Define a unique number for the abbreviation.
421 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
422 // Profile the node so that we can make it unique.
426 // Check the set for priors.
427 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
429 // If it's newly added.
430 if (InSet == &Abbrev) {
431 // Add to abbreviation list.
432 Abbreviations.push_back(&Abbrev);
434 // Assign the vector position + 1 as its number.
435 Abbrev.setNumber(Abbreviations.size());
437 // Assign existing abbreviation number.
438 Abbrev.setNumber(InSet->getNumber());
442 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
443 /// information entry.
444 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
445 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
449 /// addUInt - Add an unsigned integer attribute data and value.
451 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
452 unsigned Form, uint64_t Integer) {
453 if (!Form) Form = DIEInteger::BestForm(false, Integer);
454 DIEValue *Value = Integer == 1 ?
455 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
456 Die->addValue(Attribute, Form, Value);
459 /// addSInt - Add an signed integer attribute data and value.
461 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
462 unsigned Form, int64_t Integer) {
463 if (!Form) Form = DIEInteger::BestForm(true, Integer);
464 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
465 Die->addValue(Attribute, Form, Value);
468 /// addString - Add a string attribute data and value. DIEString only
469 /// keeps string reference.
470 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
472 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
473 Die->addValue(Attribute, Form, Value);
476 /// addLabel - Add a Dwarf label attribute data and value.
478 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
479 const MCSymbol *Label) {
480 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
481 Die->addValue(Attribute, Form, Value);
484 /// addDelta - Add a label delta attribute data and value.
486 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
487 const MCSymbol *Hi, const MCSymbol *Lo) {
488 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
489 Die->addValue(Attribute, Form, Value);
492 /// addDIEEntry - Add a DIE attribute data and value.
494 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
496 Die->addValue(Attribute, Form, createDIEEntry(Entry));
500 /// addBlock - Add block data.
502 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
504 Block->ComputeSize(Asm);
505 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
506 Die->addValue(Attribute, Block->BestForm(), Block);
509 /// addSourceLine - Add location information to specified debug information
511 void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
516 unsigned Line = V.getLineNumber();
519 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename());
520 assert(FileID && "Invalid file id");
521 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
522 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
525 /// addSourceLine - Add location information to specified debug information
527 void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
528 // Verify global variable.
532 unsigned Line = G.getLineNumber();
535 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename());
536 assert(FileID && "Invalid file id");
537 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
538 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
541 /// addSourceLine - Add location information to specified debug information
543 void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
544 // Verify subprogram.
547 // If the line number is 0, don't add it.
548 if (SP.getLineNumber() == 0)
551 unsigned Line = SP.getLineNumber();
552 if (!SP.getContext().Verify())
554 unsigned FileID = GetOrCreateSourceID(SP.getFilename());
555 assert(FileID && "Invalid file id");
556 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
557 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
560 /// addSourceLine - Add location information to specified debug information
562 void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
567 unsigned Line = Ty.getLineNumber();
568 if (Line == 0 || !Ty.getContext().Verify())
570 unsigned FileID = GetOrCreateSourceID(Ty.getFilename());
571 assert(FileID && "Invalid file id");
572 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
573 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
576 /// addSourceLine - Add location information to specified debug information
578 void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
583 unsigned Line = NS.getLineNumber();
586 StringRef FN = NS.getFilename();
588 unsigned FileID = GetOrCreateSourceID(FN);
589 assert(FileID && "Invalid file id");
590 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
591 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
594 /// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
595 /// on provided frame index.
596 void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
597 MachineLocation Location;
599 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
600 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
601 Location.set(FrameReg, Offset);
603 if (DV->variableHasComplexAddress())
604 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
605 else if (DV->isBlockByrefVariable())
606 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
608 addAddress(Die, dwarf::DW_AT_location, Location);
611 /// addComplexAddress - Start with the address based on the location provided,
612 /// and generate the DWARF information necessary to find the actual variable
613 /// given the extra address information encoded in the DIVariable, starting from
614 /// the starting location. Add the DWARF information to the die.
616 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
618 const MachineLocation &Location) {
619 DIType Ty = DV->getType();
621 // Decode the original location, and use that as the start of the byref
622 // variable's location.
623 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
624 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
625 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
627 if (Location.isReg()) {
629 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
631 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
632 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
636 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
639 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
642 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
645 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
646 uint64_t Element = DV->getAddrElement(i);
648 if (Element == DIBuilder::OpPlus) {
649 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
650 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
651 } else if (Element == DIBuilder::OpDeref) {
652 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
653 } else llvm_unreachable("unknown DIBuilder Opcode");
656 // Now attach the location information to the DIE.
657 addBlock(Die, Attribute, 0, Block);
660 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
661 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
662 gives the variable VarName either the struct, or a pointer to the struct, as
663 its type. This is necessary for various behind-the-scenes things the
664 compiler needs to do with by-reference variables in Blocks.
666 However, as far as the original *programmer* is concerned, the variable
667 should still have type 'SomeType', as originally declared.
669 The function getBlockByrefType dives into the __Block_byref_x_VarName
670 struct to find the original type of the variable, which is then assigned to
671 the variable's Debug Information Entry as its real type. So far, so good.
672 However now the debugger will expect the variable VarName to have the type
673 SomeType. So we need the location attribute for the variable to be an
674 expression that explains to the debugger how to navigate through the
675 pointers and struct to find the actual variable of type SomeType.
677 The following function does just that. We start by getting
678 the "normal" location for the variable. This will be the location
679 of either the struct __Block_byref_x_VarName or the pointer to the
680 struct __Block_byref_x_VarName.
682 The struct will look something like:
684 struct __Block_byref_x_VarName {
686 struct __Block_byref_x_VarName *forwarding;
687 ... <various other fields>
689 ... <maybe more fields>
692 If we are given the struct directly (as our starting point) we
693 need to tell the debugger to:
695 1). Add the offset of the forwarding field.
697 2). Follow that pointer to get the real __Block_byref_x_VarName
698 struct to use (the real one may have been copied onto the heap).
700 3). Add the offset for the field VarName, to find the actual variable.
702 If we started with a pointer to the struct, then we need to
703 dereference that pointer first, before the other steps.
704 Translating this into DWARF ops, we will need to append the following
705 to the current location description for the variable:
707 DW_OP_deref -- optional, if we start with a pointer
708 DW_OP_plus_uconst <forward_fld_offset>
710 DW_OP_plus_uconst <varName_fld_offset>
712 That is what this function does. */
714 /// addBlockByrefAddress - Start with the address based on the location
715 /// provided, and generate the DWARF information necessary to find the
716 /// actual Block variable (navigating the Block struct) based on the
717 /// starting location. Add the DWARF information to the die. For
718 /// more information, read large comment just above here.
720 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
722 const MachineLocation &Location) {
723 DIType Ty = DV->getType();
725 unsigned Tag = Ty.getTag();
726 bool isPointer = false;
728 StringRef varName = DV->getName();
730 if (Tag == dwarf::DW_TAG_pointer_type) {
731 DIDerivedType DTy = DIDerivedType(Ty);
732 TmpTy = DTy.getTypeDerivedFrom();
736 DICompositeType blockStruct = DICompositeType(TmpTy);
738 // Find the __forwarding field and the variable field in the __Block_byref
740 DIArray Fields = blockStruct.getTypeArray();
741 DIDescriptor varField = DIDescriptor();
742 DIDescriptor forwardingField = DIDescriptor();
744 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
745 DIDescriptor Element = Fields.getElement(i);
746 DIDerivedType DT = DIDerivedType(Element);
747 StringRef fieldName = DT.getName();
748 if (fieldName == "__forwarding")
749 forwardingField = Element;
750 else if (fieldName == varName)
754 // Get the offsets for the forwarding field and the variable field.
755 unsigned forwardingFieldOffset =
756 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
757 unsigned varFieldOffset =
758 DIDerivedType(varField).getOffsetInBits() >> 3;
760 // Decode the original location, and use that as the start of the byref
761 // variable's location.
762 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
763 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
764 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
766 if (Location.isReg()) {
768 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
770 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
771 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
775 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
778 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
781 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
784 // If we started with a pointer to the __Block_byref... struct, then
785 // the first thing we need to do is dereference the pointer (DW_OP_deref).
787 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
789 // Next add the offset for the '__forwarding' field:
790 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
791 // adding the offset if it's 0.
792 if (forwardingFieldOffset > 0) {
793 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
794 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
797 // Now dereference the __forwarding field to get to the real __Block_byref
798 // struct: DW_OP_deref.
799 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
801 // Now that we've got the real __Block_byref... struct, add the offset
802 // for the variable's field to get to the location of the actual variable:
803 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
804 if (varFieldOffset > 0) {
805 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
806 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
809 // Now attach the location information to the DIE.
810 addBlock(Die, Attribute, 0, Block);
813 /// addAddress - Add an address attribute to a die based on the location
815 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
816 const MachineLocation &Location) {
817 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
818 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
819 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
821 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
822 && Location.getOffset()) {
823 // If variable offset is based in frame register then use fbreg.
824 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
825 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
826 addBlock(Die, Attribute, 0, Block);
830 if (Location.isReg()) {
832 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
834 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
835 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
839 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
842 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
845 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
848 addBlock(Die, Attribute, 0, Block);
851 /// addRegisterAddress - Add register location entry in variable DIE.
852 bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
853 assert (MO.isReg() && "Invalid machine operand!");
856 MachineLocation Location;
857 Location.set(MO.getReg());
858 addAddress(Die, dwarf::DW_AT_location, Location);
862 /// addConstantValue - Add constant value entry in variable DIE.
863 bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
864 assert (MO.isImm() && "Invalid machine operand!");
865 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
866 unsigned Imm = MO.getImm();
867 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
868 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
872 /// addConstantFPValue - Add constant value entry in variable DIE.
873 bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
874 assert (MO.isFPImm() && "Invalid machine operand!");
875 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
876 APFloat FPImm = MO.getFPImm()->getValueAPF();
878 // Get the raw data form of the floating point.
879 const APInt FltVal = FPImm.bitcastToAPInt();
880 const char *FltPtr = (const char*)FltVal.getRawData();
882 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
883 bool LittleEndian = Asm->getTargetData().isLittleEndian();
884 int Incr = (LittleEndian ? 1 : -1);
885 int Start = (LittleEndian ? 0 : NumBytes - 1);
886 int Stop = (LittleEndian ? NumBytes : -1);
888 // Output the constant to DWARF one byte at a time.
889 for (; Start != Stop; Start += Incr)
890 addUInt(Block, 0, dwarf::DW_FORM_data1,
891 (unsigned char)0xFF & FltPtr[Start]);
893 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
897 /// addConstantValue - Add constant value entry in variable DIE.
898 bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
900 if (CI->getBitWidth() <= 64) {
902 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
905 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
910 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
912 // Get the raw data form of the large APInt.
913 const APInt Val = CI->getValue();
914 const char *Ptr = (const char*)Val.getRawData();
916 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
917 bool LittleEndian = Asm->getTargetData().isLittleEndian();
918 int Incr = (LittleEndian ? 1 : -1);
919 int Start = (LittleEndian ? 0 : NumBytes - 1);
920 int Stop = (LittleEndian ? NumBytes : -1);
922 // Output the constant to DWARF one byte at a time.
923 for (; Start != Stop; Start += Incr)
924 addUInt(Block, 0, dwarf::DW_FORM_data1,
925 (unsigned char)0xFF & Ptr[Start]);
927 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
931 /// addToContextOwner - Add Die into the list of its context owner's children.
932 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
933 if (Context.isType()) {
934 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
935 ContextDIE->addChild(Die);
936 } else if (Context.isNameSpace()) {
937 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
938 ContextDIE->addChild(Die);
939 } else if (Context.isSubprogram()) {
940 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
941 ContextDIE->addChild(Die);
942 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
943 ContextDIE->addChild(Die);
945 getCompileUnit(Context)->addDie(Die);
948 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
950 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
951 CompileUnit *TypeCU = getCompileUnit(Ty);
952 DIE *TyDIE = TypeCU->getDIE(Ty);
957 TyDIE = new DIE(dwarf::DW_TAG_base_type);
958 TypeCU->insertDIE(Ty, TyDIE);
959 if (Ty.isBasicType())
960 constructTypeDIE(*TyDIE, DIBasicType(Ty));
961 else if (Ty.isCompositeType())
962 constructTypeDIE(*TyDIE, DICompositeType(Ty));
964 assert(Ty.isDerivedType() && "Unknown kind of DIType");
965 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
968 addToContextOwner(TyDIE, Ty.getContext());
972 /// addType - Add a new type attribute to the specified entity.
973 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
977 // Check for pre-existence.
978 CompileUnit *TypeCU = getCompileUnit(Ty);
979 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
980 // If it exists then use the existing value.
982 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
987 DIE *Buffer = getOrCreateTypeDIE(Ty);
990 Entry = createDIEEntry(Buffer);
991 TypeCU->insertDIEEntry(Ty, Entry);
993 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
996 /// constructTypeDIE - Construct basic type die from DIBasicType.
997 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
998 // Get core information.
999 StringRef Name = BTy.getName();
1000 Buffer.setTag(dwarf::DW_TAG_base_type);
1001 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1004 // Add name if not anonymous or intermediate type.
1006 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1007 uint64_t Size = BTy.getSizeInBits() >> 3;
1008 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1011 /// constructTypeDIE - Construct derived type die from DIDerivedType.
1012 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1013 // Get core information.
1014 StringRef Name = DTy.getName();
1015 uint64_t Size = DTy.getSizeInBits() >> 3;
1016 unsigned Tag = DTy.getTag();
1018 // FIXME - Workaround for templates.
1019 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1023 // Map to main type, void will not have a type.
1024 DIType FromTy = DTy.getTypeDerivedFrom();
1025 addType(&Buffer, FromTy);
1027 // Add name if not anonymous or intermediate type.
1029 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1031 // Add size if non-zero (derived types might be zero-sized.)
1033 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1035 // Add source line info if available and TyDesc is not a forward declaration.
1036 if (!DTy.isForwardDecl())
1037 addSourceLine(&Buffer, DTy);
1040 /// constructTypeDIE - Construct type DIE from DICompositeType.
1041 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1042 // Get core information.
1043 StringRef Name = CTy.getName();
1045 uint64_t Size = CTy.getSizeInBits() >> 3;
1046 unsigned Tag = CTy.getTag();
1050 case dwarf::DW_TAG_vector_type:
1051 case dwarf::DW_TAG_array_type:
1052 constructArrayTypeDIE(Buffer, &CTy);
1054 case dwarf::DW_TAG_enumeration_type: {
1055 DIArray Elements = CTy.getTypeArray();
1057 // Add enumerators to enumeration type.
1058 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1059 DIE *ElemDie = NULL;
1060 DIDescriptor Enum(Elements.getElement(i));
1061 if (Enum.isEnumerator()) {
1062 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1063 Buffer.addChild(ElemDie);
1068 case dwarf::DW_TAG_subroutine_type: {
1070 DIArray Elements = CTy.getTypeArray();
1071 DIDescriptor RTy = Elements.getElement(0);
1072 addType(&Buffer, DIType(RTy));
1074 bool isPrototyped = true;
1076 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1077 DIDescriptor Ty = Elements.getElement(i);
1078 if (Ty.isUnspecifiedParameter()) {
1079 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1080 Buffer.addChild(Arg);
1081 isPrototyped = false;
1083 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1084 addType(Arg, DIType(Ty));
1085 Buffer.addChild(Arg);
1088 // Add prototype flag.
1090 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1093 case dwarf::DW_TAG_structure_type:
1094 case dwarf::DW_TAG_union_type:
1095 case dwarf::DW_TAG_class_type: {
1096 // Add elements to structure type.
1097 DIArray Elements = CTy.getTypeArray();
1099 // A forward struct declared type may not have elements available.
1100 unsigned N = Elements.getNumElements();
1104 // Add elements to structure type.
1105 for (unsigned i = 0; i < N; ++i) {
1106 DIDescriptor Element = Elements.getElement(i);
1107 DIE *ElemDie = NULL;
1108 if (Element.isSubprogram()) {
1109 DISubprogram SP(Element);
1110 ElemDie = createSubprogramDIE(DISubprogram(Element));
1111 if (SP.isProtected())
1112 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1113 dwarf::DW_ACCESS_protected);
1114 else if (SP.isPrivate())
1115 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1116 dwarf::DW_ACCESS_private);
1118 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1119 dwarf::DW_ACCESS_public);
1120 if (SP.isExplicit())
1121 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
1123 else if (Element.isVariable()) {
1124 DIVariable DV(Element);
1125 ElemDie = new DIE(dwarf::DW_TAG_variable);
1126 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1128 addType(ElemDie, DV.getType());
1129 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1130 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1131 addSourceLine(ElemDie, DV);
1132 } else if (Element.isDerivedType())
1133 ElemDie = createMemberDIE(DIDerivedType(Element));
1136 Buffer.addChild(ElemDie);
1139 if (CTy.isAppleBlockExtension())
1140 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1142 unsigned RLang = CTy.getRunTimeLang();
1144 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1145 dwarf::DW_FORM_data1, RLang);
1147 DICompositeType ContainingType = CTy.getContainingType();
1148 if (DIDescriptor(ContainingType).isCompositeType())
1149 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1150 getOrCreateTypeDIE(DIType(ContainingType)));
1152 DIDescriptor Context = CTy.getContext();
1153 addToContextOwner(&Buffer, Context);
1156 if (Tag == dwarf::DW_TAG_class_type) {
1157 DIArray TParams = CTy.getTemplateParams();
1158 unsigned N = TParams.getNumElements();
1159 // Add template parameters.
1160 for (unsigned i = 0; i < N; ++i) {
1161 DIDescriptor Element = TParams.getElement(i);
1162 if (Element.isTemplateTypeParameter())
1163 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
1164 DITemplateTypeParameter(Element)));
1165 else if (Element.isTemplateValueParameter())
1166 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
1167 DITemplateValueParameter(Element)));
1176 // Add name if not anonymous or intermediate type.
1178 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1180 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
1181 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1183 // Add size if non-zero (derived types might be zero-sized.)
1185 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1187 // Add zero size if it is not a forward declaration.
1188 if (CTy.isForwardDecl())
1189 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1191 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1194 // Add source line info if available.
1195 if (!CTy.isForwardDecl())
1196 addSourceLine(&Buffer, CTy);
1200 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1201 /// for the given DITemplateTypeParameter.
1203 DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1204 CompileUnit *TypeCU = getCompileUnit(TP);
1205 DIE *ParamDIE = TypeCU->getDIE(TP);
1209 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1210 addType(ParamDIE, TP.getType());
1211 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1215 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1216 /// for the given DITemplateValueParameter.
1218 DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1219 CompileUnit *TVCU = getCompileUnit(TPV);
1220 DIE *ParamDIE = TVCU->getDIE(TPV);
1224 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1225 addType(ParamDIE, TPV.getType());
1226 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
1227 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1232 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1233 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1234 int64_t L = SR.getLo();
1235 int64_t H = SR.getHi();
1236 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1238 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1240 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1241 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1243 Buffer.addChild(DW_Subrange);
1246 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1247 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1248 DICompositeType *CTy) {
1249 Buffer.setTag(dwarf::DW_TAG_array_type);
1250 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1251 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1253 // Emit derived type.
1254 addType(&Buffer, CTy->getTypeDerivedFrom());
1255 DIArray Elements = CTy->getTypeArray();
1257 // Get an anonymous type for index type.
1258 CompileUnit *TheCU = getCompileUnit(*CTy);
1259 DIE *IdxTy = TheCU->getIndexTyDie();
1261 // Construct an anonymous type for index type.
1262 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1263 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1264 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1265 dwarf::DW_ATE_signed);
1266 TheCU->addDie(IdxTy);
1267 TheCU->setIndexTyDie(IdxTy);
1270 // Add subranges to array type.
1271 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1272 DIDescriptor Element = Elements.getElement(i);
1273 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1274 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1278 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1279 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1280 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1281 StringRef Name = ETy.getName();
1282 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1283 int64_t Value = ETy.getEnumValue();
1284 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1288 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1289 /// printer to not emit usual symbol prefix before the symbol name is used then
1290 /// return linkage name after skipping this special LLVM prefix.
1291 static StringRef getRealLinkageName(StringRef LinkageName) {
1293 if (LinkageName.startswith(StringRef(&One, 1)))
1294 return LinkageName.substr(1);
1298 /// createMemberDIE - Create new member DIE.
1299 DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
1300 DIE *MemberDie = new DIE(DT.getTag());
1301 StringRef Name = DT.getName();
1303 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1305 addType(MemberDie, DT.getTypeDerivedFrom());
1307 addSourceLine(MemberDie, DT);
1309 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1310 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1312 uint64_t Size = DT.getSizeInBits();
1313 uint64_t FieldSize = DT.getOriginalTypeSize();
1315 if (Size != FieldSize) {
1317 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1318 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1320 uint64_t Offset = DT.getOffsetInBits();
1321 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1322 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1323 uint64_t FieldOffset = (HiMark - FieldSize);
1324 Offset -= FieldOffset;
1326 // Maybe we need to work from the other end.
1327 if (Asm->getTargetData().isLittleEndian())
1328 Offset = FieldSize - (Offset + Size);
1329 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1331 // Here WD_AT_data_member_location points to the anonymous
1332 // field that includes this bit field.
1333 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1336 // This is not a bitfield.
1337 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1339 if (DT.getTag() == dwarf::DW_TAG_inheritance
1340 && DT.isVirtual()) {
1342 // For C++, virtual base classes are not at fixed offset. Use following
1343 // expression to extract appropriate offset from vtable.
1344 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1346 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1347 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1348 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1349 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1350 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1351 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1352 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1353 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1355 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1358 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1360 if (DT.isProtected())
1361 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1362 dwarf::DW_ACCESS_protected);
1363 else if (DT.isPrivate())
1364 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1365 dwarf::DW_ACCESS_private);
1366 // Otherwise C++ member and base classes are considered public.
1367 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1368 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1369 dwarf::DW_ACCESS_public);
1371 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1372 dwarf::DW_VIRTUALITY_virtual);
1376 /// createSubprogramDIE - Create new DIE using SP.
1377 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
1378 CompileUnit *SPCU = getCompileUnit(SP);
1379 DIE *SPDie = SPCU->getDIE(SP);
1383 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1384 // Constructors and operators for anonymous aggregates do not have names.
1385 if (!SP.getName().empty())
1386 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1388 StringRef LinkageName = SP.getLinkageName();
1389 if (!LinkageName.empty())
1390 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1391 getRealLinkageName(LinkageName));
1393 addSourceLine(SPDie, SP);
1395 if (SP.isPrototyped())
1396 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1399 DICompositeType SPTy = SP.getType();
1400 DIArray Args = SPTy.getTypeArray();
1401 unsigned SPTag = SPTy.getTag();
1403 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1404 addType(SPDie, SPTy);
1406 addType(SPDie, DIType(Args.getElement(0)));
1408 unsigned VK = SP.getVirtuality();
1410 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1411 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1412 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1413 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1414 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1415 ContainingTypeMap.insert(std::make_pair(SPDie,
1416 SP.getContainingType()));
1419 if (!SP.isDefinition()) {
1420 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1422 // Add arguments. Do not add arguments for subprogram definition. They will
1423 // be handled while processing variables.
1424 DICompositeType SPTy = SP.getType();
1425 DIArray Args = SPTy.getTypeArray();
1426 unsigned SPTag = SPTy.getTag();
1428 if (SPTag == dwarf::DW_TAG_subroutine_type)
1429 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1430 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1431 DIType ATy = DIType(DIType(Args.getElement(i)));
1433 if (ATy.isArtificial())
1434 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1435 SPDie->addChild(Arg);
1439 if (SP.isArtificial())
1440 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1442 if (!SP.isLocalToUnit())
1443 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1445 if (SP.isOptimized())
1446 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1448 if (unsigned isa = Asm->getISAEncoding()) {
1449 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1452 // DW_TAG_inlined_subroutine may refer to this DIE.
1453 SPCU->insertDIE(SP, SPDie);
1455 // Add to context owner.
1456 addToContextOwner(SPDie, SP.getContext());
1461 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1462 assert(N && "Invalid Scope encoding!");
1464 DbgScope *AScope = AbstractScopes.lookup(N);
1468 DbgScope *Parent = NULL;
1470 DIDescriptor Scope(N);
1471 if (Scope.isLexicalBlock()) {
1472 DILexicalBlock DB(N);
1473 DIDescriptor ParentDesc = DB.getContext();
1474 Parent = getOrCreateAbstractScope(ParentDesc);
1477 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1480 Parent->addScope(AScope);
1481 AScope->setAbstractScope();
1482 AbstractScopes[N] = AScope;
1483 if (DIDescriptor(N).isSubprogram())
1484 AbstractScopesList.push_back(AScope);
1488 /// isSubprogramContext - Return true if Context is either a subprogram
1489 /// or another context nested inside a subprogram.
1490 static bool isSubprogramContext(const MDNode *Context) {
1493 DIDescriptor D(Context);
1494 if (D.isSubprogram())
1497 return isSubprogramContext(DIType(Context).getContext());
1501 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1502 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1503 /// If there are global variables in this scope then create and insert
1504 /// DIEs for these variables.
1505 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1506 CompileUnit *SPCU = getCompileUnit(SPNode);
1507 DIE *SPDie = SPCU->getDIE(SPNode);
1509 assert(SPDie && "Unable to find subprogram DIE!");
1510 DISubprogram SP(SPNode);
1512 // There is not any need to generate specification DIE for a function
1513 // defined at compile unit level. If a function is defined inside another
1514 // function then gdb prefers the definition at top level and but does not
1515 // expect specification DIE in parent function. So avoid creating
1516 // specification DIE for a function defined inside a function.
1517 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1518 !SP.getContext().isFile() &&
1519 !isSubprogramContext(SP.getContext())) {
1520 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1523 DICompositeType SPTy = SP.getType();
1524 DIArray Args = SPTy.getTypeArray();
1525 unsigned SPTag = SPTy.getTag();
1526 if (SPTag == dwarf::DW_TAG_subroutine_type)
1527 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1528 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1529 DIType ATy = DIType(DIType(Args.getElement(i)));
1531 if (ATy.isArtificial())
1532 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1533 SPDie->addChild(Arg);
1535 DIE *SPDeclDie = SPDie;
1536 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1537 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1539 SPCU->addDie(SPDie);
1542 // Pick up abstract subprogram DIE.
1543 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1544 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1545 addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1546 dwarf::DW_FORM_ref4, AbsSPDIE);
1547 SPCU->addDie(SPDie);
1550 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1551 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1552 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1553 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1554 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1555 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1556 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1561 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1562 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1563 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1565 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1566 if (Scope->isAbstractScope())
1569 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1573 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1574 if (Ranges.size() > 1) {
1575 // .debug_range section has not been laid out yet. Emit offset in
1576 // .debug_range as a uint, size 4, for now. emitDIE will handle
1577 // DW_AT_ranges appropriately.
1578 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1579 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1580 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1581 RE = Ranges.end(); RI != RE; ++RI) {
1582 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1583 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1585 DebugRangeSymbols.push_back(NULL);
1586 DebugRangeSymbols.push_back(NULL);
1590 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1591 const MCSymbol *End = getLabelAfterInsn(RI->second);
1593 if (End == 0) return 0;
1595 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1596 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1598 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1599 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1604 /// constructInlinedScopeDIE - This scope represents inlined body of
1605 /// a function. Construct DIE to represent this concrete inlined copy
1606 /// of the function.
1607 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1609 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1610 assert (Ranges.empty() == false
1611 && "DbgScope does not have instruction markers!");
1613 // FIXME : .debug_inlined section specification does not clearly state how
1614 // to emit inlined scope that is split into multiple instruction ranges.
1615 // For now, use first instruction range and emit low_pc/high_pc pair and
1616 // corresponding .debug_inlined section entry for this pair.
1617 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1618 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1619 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1621 if (StartLabel == 0 || EndLabel == 0) {
1622 assert (0 && "Unexpected Start and End labels for a inlined scope!");
1625 assert(StartLabel->isDefined() &&
1626 "Invalid starting label for an inlined scope!");
1627 assert(EndLabel->isDefined() &&
1628 "Invalid end label for an inlined scope!");
1630 if (!Scope->getScopeNode())
1632 DIScope DS(Scope->getScopeNode());
1633 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1635 DISubprogram InlinedSP = getDISubprogram(DS);
1636 CompileUnit *TheCU = getCompileUnit(InlinedSP);
1637 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1638 assert(OriginDIE && "Unable to find Origin DIE!");
1639 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1640 dwarf::DW_FORM_ref4, OriginDIE);
1642 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1643 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1645 InlinedSubprogramDIEs.insert(OriginDIE);
1647 // Track the start label for this inlined function.
1648 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1649 I = InlineInfo.find(InlinedSP);
1651 if (I == InlineInfo.end()) {
1652 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1654 InlinedSPNodes.push_back(InlinedSP);
1656 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1658 DILocation DL(Scope->getInlinedAt());
1659 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1660 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1666 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1667 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1668 StringRef Name = DV->getName();
1672 // Translate tag to proper Dwarf tag. The result variable is dropped for
1675 switch (DV->getTag()) {
1676 case dwarf::DW_TAG_return_variable:
1678 case dwarf::DW_TAG_arg_variable:
1679 Tag = dwarf::DW_TAG_formal_parameter;
1681 case dwarf::DW_TAG_auto_variable: // fall thru
1683 Tag = dwarf::DW_TAG_variable;
1687 // Define variable debug information entry.
1688 DIE *VariableDie = new DIE(Tag);
1691 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1692 V2AVI = VarToAbstractVarMap.find(DV);
1693 if (V2AVI != VarToAbstractVarMap.end())
1694 AbsDIE = V2AVI->second->getDIE();
1697 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1698 dwarf::DW_FORM_ref4, AbsDIE);
1700 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1701 addSourceLine(VariableDie, DV->getVariable());
1703 // Add variable type.
1704 addType(VariableDie, DV->getType());
1707 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
1708 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1709 else if (DIVariable(DV->getVariable()).isArtificial())
1710 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1712 if (Scope->isAbstractScope()) {
1713 DV->setDIE(VariableDie);
1717 // Add variable address.
1719 unsigned Offset = DV->getDotDebugLocOffset();
1720 if (Offset != ~0U) {
1721 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1722 Asm->GetTempSymbol("debug_loc", Offset));
1723 DV->setDIE(VariableDie);
1724 UseDotDebugLocEntry.insert(VariableDie);
1728 // Check if variable is described by a DBG_VALUE instruction.
1729 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1730 DbgVariableToDbgInstMap.find(DV);
1731 if (DVI != DbgVariableToDbgInstMap.end()) {
1732 const MachineInstr *DVInsn = DVI->second;
1733 bool updated = false;
1734 // FIXME : Handle getNumOperands != 3
1735 if (DVInsn->getNumOperands() == 3) {
1736 if (DVInsn->getOperand(0).isReg()) {
1737 const MachineOperand RegOp = DVInsn->getOperand(0);
1738 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1739 if (DVInsn->getOperand(1).isImm() &&
1740 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1741 addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
1744 updated = addRegisterAddress(VariableDie, RegOp);
1746 else if (DVInsn->getOperand(0).isImm())
1747 updated = addConstantValue(VariableDie, DVInsn->getOperand(0));
1748 else if (DVInsn->getOperand(0).isFPImm())
1750 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1752 MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1753 if (Location.getReg()) {
1754 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1759 // If variableDie is not updated then DBG_VALUE instruction does not
1760 // have valid variable info.
1764 DV->setDIE(VariableDie);
1768 // .. else use frame index, if available.
1770 if (findVariableFrameIndex(DV, &FI))
1771 addVariableAddress(DV, VariableDie, FI);
1773 DV->setDIE(VariableDie);
1778 void DwarfDebug::addPubTypes(DISubprogram SP) {
1779 DICompositeType SPTy = SP.getType();
1780 unsigned SPTag = SPTy.getTag();
1781 if (SPTag != dwarf::DW_TAG_subroutine_type)
1784 DIArray Args = SPTy.getTypeArray();
1785 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1786 DIType ATy(Args.getElement(i));
1789 DICompositeType CATy = getDICompositeType(ATy);
1790 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1791 && !CATy.isForwardDecl()) {
1792 CompileUnit *TheCU = getCompileUnit(CATy);
1793 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1794 TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1799 /// constructScopeDIE - Construct a DIE for this scope.
1800 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1801 if (!Scope || !Scope->getScopeNode())
1804 SmallVector <DIE *, 8> Children;
1806 // Collect arguments for current function.
1807 if (Scope == CurrentFnDbgScope)
1808 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
1809 if (DbgVariable *ArgDV = CurrentFnArguments[i])
1810 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
1811 Children.push_back(Arg);
1813 // Collect lexical scope childrens first.
1814 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1815 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1816 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1817 Children.push_back(Variable);
1818 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1819 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1820 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1821 Children.push_back(Nested);
1822 DIScope DS(Scope->getScopeNode());
1823 DIE *ScopeDIE = NULL;
1824 if (Scope->getInlinedAt())
1825 ScopeDIE = constructInlinedScopeDIE(Scope);
1826 else if (DS.isSubprogram()) {
1827 ProcessedSPNodes.insert(DS);
1828 if (Scope->isAbstractScope()) {
1829 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1830 // Note down abstract DIE.
1832 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1835 ScopeDIE = updateSubprogramScopeDIE(DS);
1838 // There is no need to emit empty lexical block DIE.
1839 if (Children.empty())
1841 ScopeDIE = constructLexicalScopeDIE(Scope);
1844 if (!ScopeDIE) return NULL;
1847 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1848 E = Children.end(); I != E; ++I)
1849 ScopeDIE->addChild(*I);
1851 if (DS.isSubprogram())
1852 addPubTypes(DISubprogram(DS));
1857 /// GetOrCreateSourceID - Look up the source id with the given directory and
1858 /// source file names. If none currently exists, create a new id and insert it
1859 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1862 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName){
1863 // If FE did not provide a file name, then assume stdin.
1864 if (FileName.empty())
1865 return GetOrCreateSourceID("<stdin>");
1867 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1868 if (Entry.getValue())
1869 return Entry.getValue();
1871 unsigned SrcId = SourceIdMap.size();
1872 Entry.setValue(SrcId);
1874 // Print out a .file directive to specify files for .loc directives.
1875 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, FileName);
1880 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1881 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1882 CompileUnit *TheCU = getCompileUnit(NS);
1883 DIE *NDie = TheCU->getDIE(NS);
1886 NDie = new DIE(dwarf::DW_TAG_namespace);
1887 TheCU->insertDIE(NS, NDie);
1888 if (!NS.getName().empty())
1889 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1890 addSourceLine(NDie, NS);
1891 addToContextOwner(NDie, NS.getContext());
1895 /// constructCompileUnit - Create new CompileUnit for the given
1896 /// metadata node with tag DW_TAG_compile_unit.
1897 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1898 DICompileUnit DIUnit(N);
1899 StringRef FN = DIUnit.getFilename();
1900 StringRef Dir = DIUnit.getDirectory();
1901 unsigned ID = GetOrCreateSourceID(FN);
1903 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1904 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1905 DIUnit.getProducer());
1906 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
1907 DIUnit.getLanguage());
1908 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1909 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1910 // simplifies debug range entries.
1911 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1912 // DW_AT_stmt_list is a offset of line number information for this
1913 // compile unit in debug_line section.
1914 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
1915 addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1916 Asm->GetTempSymbol("section_line"));
1918 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1921 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1922 if (DIUnit.isOptimized())
1923 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1925 StringRef Flags = DIUnit.getFlags();
1927 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1929 unsigned RVer = DIUnit.getRunTimeVersion();
1931 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1932 dwarf::DW_FORM_data1, RVer);
1934 CompileUnit *NewCU = new CompileUnit(ID, Die);
1937 CUMap.insert(std::make_pair(N, NewCU));
1940 /// getCompielUnit - Get CompileUnit DIE.
1941 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1942 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1944 const MDNode *CUNode = NULL;
1945 if (D.isCompileUnit())
1947 else if (D.isSubprogram())
1948 CUNode = DISubprogram(N).getCompileUnit();
1949 else if (D.isType())
1950 CUNode = DIType(N).getCompileUnit();
1951 else if (D.isGlobalVariable())
1952 CUNode = DIGlobalVariable(N).getCompileUnit();
1953 else if (D.isVariable())
1954 CUNode = DIVariable(N).getCompileUnit();
1955 else if (D.isNameSpace())
1956 CUNode = DINameSpace(N).getCompileUnit();
1957 else if (D.isFile())
1958 CUNode = DIFile(N).getCompileUnit();
1962 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1963 = CUMap.find(CUNode);
1964 if (I == CUMap.end())
1969 /// isUnsignedDIType - Return true if type encoding is unsigned.
1970 static bool isUnsignedDIType(DIType Ty) {
1971 DIDerivedType DTy(Ty);
1973 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1975 DIBasicType BTy(Ty);
1977 unsigned Encoding = BTy.getEncoding();
1978 if (Encoding == dwarf::DW_ATE_unsigned ||
1979 Encoding == dwarf::DW_ATE_unsigned_char)
1985 // Return const exprssion if value is a GEP to access merged global
1987 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1988 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1989 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1990 if (!CE || CE->getNumOperands() != 3 ||
1991 CE->getOpcode() != Instruction::GetElementPtr)
1994 // First operand points to a global value.
1995 if (!isa<GlobalValue>(CE->getOperand(0)))
1998 // Second operand is zero.
1999 const ConstantInt *CI =
2000 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2001 if (!CI || !CI->isZero())
2004 // Third operand is offset.
2005 if (!isa<ConstantInt>(CE->getOperand(2)))
2011 /// constructGlobalVariableDIE - Construct global variable DIE.
2012 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
2013 DIGlobalVariable GV(N);
2015 // If debug information is malformed then ignore it.
2016 if (GV.Verify() == false)
2019 // Check for pre-existence.
2020 CompileUnit *TheCU = getCompileUnit(N);
2021 if (TheCU->getDIE(GV))
2024 DIType GTy = GV.getType();
2025 DIE *VariableDIE = new DIE(GV.getTag());
2027 bool isGlobalVariable = GV.getGlobal() != NULL;
2030 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2031 GV.getDisplayName());
2032 StringRef LinkageName = GV.getLinkageName();
2033 if (!LinkageName.empty() && isGlobalVariable)
2034 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2035 getRealLinkageName(LinkageName));
2037 addType(VariableDIE, GTy);
2038 if (GTy.isCompositeType() && !GTy.getName().empty()
2039 && !GTy.isForwardDecl()) {
2040 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
2041 assert(Entry && "Missing global type!");
2042 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
2044 // Add scoping info.
2045 if (!GV.isLocalToUnit()) {
2046 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2047 // Expose as global.
2048 TheCU->addGlobal(GV.getName(), VariableDIE);
2050 // Add line number info.
2051 addSourceLine(VariableDIE, GV);
2053 TheCU->insertDIE(N, VariableDIE);
2054 // Add to context owner.
2055 DIDescriptor GVContext = GV.getContext();
2056 addToContextOwner(VariableDIE, GVContext);
2058 if (isGlobalVariable) {
2059 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2060 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2061 addLabel(Block, 0, dwarf::DW_FORM_udata,
2062 Asm->Mang->getSymbol(GV.getGlobal()));
2063 // Do not create specification DIE if context is either compile unit
2065 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2066 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2067 // Create specification DIE.
2068 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2069 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2070 dwarf::DW_FORM_ref4, VariableDIE);
2071 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2072 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2073 TheCU->addDie(VariableSpecDIE);
2075 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2077 } else if (ConstantInt *CI =
2078 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2079 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
2080 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2081 // GV is a merged global.
2082 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2083 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2084 addLabel(Block, 0, dwarf::DW_FORM_udata,
2085 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2086 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2087 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2088 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2089 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2090 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2096 /// construct SubprogramDIE - Construct subprogram DIE.
2097 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
2100 // Check for pre-existence.
2101 CompileUnit *TheCU = getCompileUnit(N);
2102 if (TheCU->getDIE(N))
2105 if (!SP.isDefinition())
2106 // This is a method declaration which will be handled while constructing
2110 DIE *SubprogramDie = createSubprogramDIE(SP);
2113 TheCU->insertDIE(N, SubprogramDie);
2115 // Add to context owner.
2116 addToContextOwner(SubprogramDie, SP.getContext());
2118 // Expose as global.
2119 TheCU->addGlobal(SP.getName(), SubprogramDie);
2124 /// beginModule - Emit all Dwarf sections that should come prior to the
2125 /// content. Create global DIEs and emit initial debug info sections.
2126 /// This is inovked by the target AsmPrinter.
2127 void DwarfDebug::beginModule(Module *M) {
2128 if (DisableDebugInfoPrinting)
2131 DebugInfoFinder DbgFinder;
2132 DbgFinder.processModule(*M);
2134 bool HasDebugInfo = false;
2136 // Scan all the compile-units to see if there are any marked as the main unit.
2137 // if not, we do not generate debug info.
2138 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2139 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2140 if (DICompileUnit(*I).isMain()) {
2141 HasDebugInfo = true;
2146 if (!HasDebugInfo) return;
2148 // Tell MMI that we have debug info.
2149 MMI->setDebugInfoAvailability(true);
2151 // Emit initial sections.
2152 EmitSectionLabels();
2154 // Create all the compile unit DIEs.
2155 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2156 E = DbgFinder.compile_unit_end(); I != E; ++I)
2157 constructCompileUnit(*I);
2159 // Create DIEs for each subprogram.
2160 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2161 E = DbgFinder.subprogram_end(); I != E; ++I)
2162 constructSubprogramDIE(*I);
2164 // Create DIEs for each global variable.
2165 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2166 E = DbgFinder.global_variable_end(); I != E; ++I)
2167 constructGlobalVariableDIE(*I);
2169 //getOrCreateTypeDIE
2170 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2171 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2172 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2174 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2175 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2176 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2178 // Prime section data.
2179 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2182 /// endModule - Emit all Dwarf sections that should come after the content.
2184 void DwarfDebug::endModule() {
2185 if (!FirstCU) return;
2186 const Module *M = MMI->getModule();
2187 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2188 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2189 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2190 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2191 DISubprogram SP(AllSPs->getOperand(SI));
2192 if (!SP.Verify()) continue;
2194 // Collect info for variables that were optimized out.
2195 if (!SP.isDefinition()) continue;
2196 StringRef FName = SP.getLinkageName();
2198 FName = SP.getName();
2199 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
2201 unsigned E = NMD->getNumOperands();
2203 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2204 DeadFnScopeMap[SP] = Scope;
2205 for (unsigned I = 0; I != E; ++I) {
2206 DIVariable DV(NMD->getOperand(I));
2207 if (!DV.Verify()) continue;
2208 Scope->addVariable(new DbgVariable(DV));
2211 // Construct subprogram DIE and add variables DIEs.
2212 constructSubprogramDIE(SP);
2213 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2214 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2215 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2216 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2218 ScopeDIE->addChild(VariableDIE);
2223 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2224 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2225 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2227 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2230 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2231 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2232 DIE *SPDie = CI->first;
2233 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2235 DIE *NDie = getCompileUnit(N)->getDIE(N);
2236 if (!NDie) continue;
2237 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2240 // Standard sections final addresses.
2241 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2242 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2243 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2244 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2246 // End text sections.
2247 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2248 Asm->OutStreamer.SwitchSection(SectionMap[i]);
2249 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2252 // Emit common frame information.
2253 emitCommonDebugFrame();
2255 // Emit function debug frame information
2256 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2257 E = DebugFrames.end(); I != E; ++I)
2258 emitFunctionDebugFrame(*I);
2260 // Compute DIE offsets and sizes.
2261 computeSizeAndOffsets();
2263 // Emit all the DIEs into a debug info section
2266 // Corresponding abbreviations into a abbrev section.
2267 emitAbbreviations();
2269 // Emit info into a debug pubnames section.
2270 emitDebugPubNames();
2272 // Emit info into a debug pubtypes section.
2273 emitDebugPubTypes();
2275 // Emit info into a debug loc section.
2278 // Emit info into a debug aranges section.
2281 // Emit info into a debug ranges section.
2284 // Emit info into a debug macinfo section.
2287 // Emit inline info.
2288 emitDebugInlineInfo();
2290 // Emit info into a debug str section.
2294 DeleteContainerSeconds(DeadFnScopeMap);
2295 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2296 E = CUMap.end(); I != E; ++I)
2298 FirstCU = NULL; // Reset for the next Module, if any.
2301 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2302 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2303 DebugLoc ScopeLoc) {
2305 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2307 return AbsDbgVariable;
2309 LLVMContext &Ctx = Var->getContext();
2310 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2314 AbsDbgVariable = new DbgVariable(Var);
2315 Scope->addVariable(AbsDbgVariable);
2316 AbstractVariables[Var] = AbsDbgVariable;
2317 return AbsDbgVariable;
2320 /// addCurrentFnArgument - If Var is an current function argument that add
2321 /// it in CurrentFnArguments list.
2322 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
2323 DbgVariable *Var, DbgScope *Scope) {
2324 if (Scope != CurrentFnDbgScope)
2326 DIVariable DV = Var->getVariable();
2327 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2329 unsigned ArgNo = DV.getArgNumber();
2333 size_t Size = CurrentFnArguments.size();
2335 CurrentFnArguments.resize(MF->getFunction()->arg_size());
2336 // llvm::Function argument size is not good indicator of how many
2337 // arguments does the function have at source level.
2339 CurrentFnArguments.resize(ArgNo * 2);
2340 CurrentFnArguments[ArgNo - 1] = Var;
2344 /// collectVariableInfoFromMMITable - Collect variable information from
2345 /// side table maintained by MMI.
2347 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2348 SmallPtrSet<const MDNode *, 16> &Processed) {
2349 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2350 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2351 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2352 VE = VMap.end(); VI != VE; ++VI) {
2353 const MDNode *Var = VI->first;
2355 Processed.insert(Var);
2357 const std::pair<unsigned, DebugLoc> &VP = VI->second;
2359 DbgScope *Scope = 0;
2360 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2361 Scope = ConcreteScopes.lookup(IA);
2363 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2365 // If variable scope is not found then skip this variable.
2369 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2370 DbgVariable *RegVar = new DbgVariable(DV);
2371 recordVariableFrameIndex(RegVar, VP.first);
2372 if (!addCurrentFnArgument(MF, RegVar, Scope))
2373 Scope->addVariable(RegVar);
2374 if (AbsDbgVariable) {
2375 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2376 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2381 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2382 /// DBG_VALUE instruction, is in a defined reg.
2383 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2384 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2385 return MI->getNumOperands() == 3 &&
2386 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
2387 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
2390 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2392 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2393 SmallPtrSet<const MDNode *, 16> &Processed) {
2395 /// collection info from MMI table.
2396 collectVariableInfoFromMMITable(MF, Processed);
2398 SmallVector<const MachineInstr *, 8> DbgValues;
2399 // Collect variable information from DBG_VALUE machine instructions;
2400 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2402 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2404 const MachineInstr *MInsn = II;
2405 if (!MInsn->isDebugValue())
2407 DbgValues.push_back(MInsn);
2410 // This is a collection of DBG_VALUE instructions describing same variable.
2411 SmallVector<const MachineInstr *, 4> MultipleValues;
2412 for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2413 E = DbgValues.end(); I != E; ++I) {
2414 const MachineInstr *MInsn = *I;
2415 MultipleValues.clear();
2416 if (isDbgValueInDefinedReg(MInsn))
2417 MultipleValues.push_back(MInsn);
2418 DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2419 if (Processed.count(DV) != 0)
2422 for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2423 ME = DbgValues.end(); MI != ME; ++MI) {
2425 (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2427 MultipleValues.push_back(*MI);
2430 DbgScope *Scope = NULL;
2431 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2432 DISubprogram(DV.getContext()).describes(MF->getFunction()))
2433 Scope = CurrentFnDbgScope;
2435 Scope = findDbgScope(MInsn);
2436 // If variable scope is not found then skip this variable.
2440 Processed.insert(DV);
2441 DbgVariable *RegVar = new DbgVariable(DV);
2442 if (!addCurrentFnArgument(MF, RegVar, Scope))
2443 Scope->addVariable(RegVar);
2444 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2445 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2446 VarToAbstractVarMap[RegVar] = AbsVar;
2448 if (MultipleValues.size() <= 1 && !RegClobberInsn.count(MInsn)) {
2449 DbgVariableToDbgInstMap[RegVar] = MInsn;
2453 // handle multiple DBG_VALUE instructions describing one variable.
2454 if (DotDebugLocEntries.empty())
2455 RegVar->setDotDebugLocOffset(0);
2457 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2459 for (SmallVector<const MachineInstr *, 4>::iterator
2460 MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2461 MVI != MVE; ++MVI) {
2462 const MachineInstr *Begin = *MVI;
2463 MachineLocation MLoc;
2464 if (Begin->getNumOperands() == 3) {
2465 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2466 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2468 MLoc = Asm->getDebugValueLocation(Begin);
2473 // Compute the range for a register location.
2474 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2475 const MCSymbol *SLabel = 0;
2477 if (const MachineInstr *ClobberMI = RegClobberInsn.lookup(Begin))
2478 // The register range starting at Begin may be clobbered.
2479 SLabel = getLabelAfterInsn(ClobberMI);
2480 else if (MVI + 1 == MVE)
2481 // If Begin is the last instruction then its value is valid
2482 // until the end of the funtion.
2483 SLabel = FunctionEndSym;
2485 // The value is valid until the next DBG_VALUE.
2486 SLabel = getLabelBeforeInsn(MVI[1]);
2488 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2490 DotDebugLocEntries.push_back(DotDebugLocEntry());
2493 // Collect info for variables that were optimized out.
2494 const Function *F = MF->getFunction();
2495 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
2496 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2497 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2498 if (!DV || !Processed.insert(DV))
2500 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2502 Scope->addVariable(new DbgVariable(DV));
2507 /// getLabelBeforeInsn - Return Label preceding the instruction.
2508 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2509 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2510 LabelsBeforeInsn.find(MI);
2511 if (I == LabelsBeforeInsn.end())
2512 // FunctionBeginSym always preceeds all the instruction in current function.
2513 return FunctionBeginSym;
2517 /// getLabelAfterInsn - Return Label immediately following the instruction.
2518 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2519 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2520 LabelsAfterInsn.find(MI);
2521 if (I == LabelsAfterInsn.end())
2526 /// beginInstruction - Process beginning of an instruction.
2527 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
2528 if (InsnNeedsLabel.count(MI) == 0) {
2529 LabelsBeforeInsn[MI] = PrevLabel;
2534 DebugLoc DL = MI->getDebugLoc();
2535 if (!DL.isUnknown()) {
2536 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2537 PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2539 LabelsBeforeInsn[MI] = PrevLabel;
2543 // If location is unknown then use temp label for this DBG_VALUE
2545 if (MI->isDebugValue()) {
2546 PrevLabel = MMI->getContext().CreateTempSymbol();
2547 Asm->OutStreamer.EmitLabel(PrevLabel);
2548 LabelsBeforeInsn[MI] = PrevLabel;
2552 if (UnknownLocations) {
2553 PrevLabel = recordSourceLine(0, 0, 0);
2554 LabelsBeforeInsn[MI] = PrevLabel;
2558 assert (0 && "Instruction is not processed!");
2561 /// endInstruction - Process end of an instruction.
2562 void DwarfDebug::endInstruction(const MachineInstr *MI) {
2563 if (InsnsNeedsLabelAfter.count(MI) != 0) {
2564 // Emit a label if this instruction ends a scope.
2565 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2566 Asm->OutStreamer.EmitLabel(Label);
2567 LabelsAfterInsn[MI] = Label;
2571 /// getOrCreateDbgScope - Create DbgScope for the scope.
2572 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2573 const MDNode *InlinedAt) {
2575 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2578 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2579 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2580 if (DIDescriptor(Scope).isLexicalBlock()) {
2582 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2583 WScope->setParent(Parent);
2584 Parent->addScope(WScope);
2587 if (!WScope->getParent()) {
2588 StringRef SPName = DISubprogram(Scope).getLinkageName();
2589 // We used to check only for a linkage name, but that fails
2590 // since we began omitting the linkage name for private
2591 // functions. The new way is to check for the name in metadata,
2592 // but that's not supported in old .ll test cases. Ergo, we
2594 if (SPName == Asm->MF->getFunction()->getName() ||
2595 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2596 CurrentFnDbgScope = WScope;
2602 getOrCreateAbstractScope(Scope);
2603 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2607 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2608 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2609 DILocation DL(InlinedAt);
2611 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2612 WScope->setParent(Parent);
2613 Parent->addScope(WScope);
2615 ConcreteScopes[InlinedAt] = WScope;
2620 /// hasValidLocation - Return true if debug location entry attached with
2621 /// machine instruction encodes valid location info.
2622 static bool hasValidLocation(LLVMContext &Ctx,
2623 const MachineInstr *MInsn,
2624 const MDNode *&Scope, const MDNode *&InlinedAt) {
2625 DebugLoc DL = MInsn->getDebugLoc();
2626 if (DL.isUnknown()) return false;
2628 const MDNode *S = DL.getScope(Ctx);
2630 // There is no need to create another DIE for compile unit. For all
2631 // other scopes, create one DbgScope now. This will be translated
2632 // into a scope DIE at the end.
2633 if (DIScope(S).isCompileUnit()) return false;
2636 InlinedAt = DL.getInlinedAt(Ctx);
2640 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2642 static void calculateDominanceGraph(DbgScope *Scope) {
2643 assert (Scope && "Unable to calculate scop edominance graph!");
2644 SmallVector<DbgScope *, 4> WorkStack;
2645 WorkStack.push_back(Scope);
2646 unsigned Counter = 0;
2647 while (!WorkStack.empty()) {
2648 DbgScope *WS = WorkStack.back();
2649 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2650 bool visitedChildren = false;
2651 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2652 SE = Children.end(); SI != SE; ++SI) {
2653 DbgScope *ChildScope = *SI;
2654 if (!ChildScope->getDFSOut()) {
2655 WorkStack.push_back(ChildScope);
2656 visitedChildren = true;
2657 ChildScope->setDFSIn(++Counter);
2661 if (!visitedChildren) {
2662 WorkStack.pop_back();
2663 WS->setDFSOut(++Counter);
2668 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2670 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2671 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2674 unsigned PrevDFSIn = 0;
2675 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2677 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2679 const MachineInstr *MInsn = II;
2680 const MDNode *Scope = NULL;
2681 const MDNode *InlinedAt = NULL;
2683 // Check if instruction has valid location information.
2684 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2688 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2689 MI2ScopeMap.find(MInsn);
2690 if (DI != MI2ScopeMap.end()) {
2691 DbgScope *S = DI->second;
2692 dbgs() << S->getDFSIn();
2693 PrevDFSIn = S->getDFSIn();
2695 dbgs() << PrevDFSIn;
2697 dbgs() << " [ x" << PrevDFSIn;
2705 /// extractScopeInformation - Scan machine instructions in this function
2706 /// and collect DbgScopes. Return true, if at least one scope was found.
2707 bool DwarfDebug::extractScopeInformation() {
2708 // If scope information was extracted using .dbg intrinsics then there is not
2709 // any need to extract these information by scanning each instruction.
2710 if (!DbgScopeMap.empty())
2713 // Scan each instruction and create scopes. First build working set of scopes.
2714 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2715 SmallVector<DbgRange, 4> MIRanges;
2716 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2717 const MDNode *PrevScope = NULL;
2718 const MDNode *PrevInlinedAt = NULL;
2719 const MachineInstr *RangeBeginMI = NULL;
2720 const MachineInstr *PrevMI = NULL;
2721 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2723 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2725 const MachineInstr *MInsn = II;
2726 const MDNode *Scope = NULL;
2727 const MDNode *InlinedAt = NULL;
2729 // Check if instruction has valid location information.
2730 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2735 // If scope has not changed then skip this instruction.
2736 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2741 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2742 if (MInsn->isDebugValue())
2746 // If we have alread seen a beginning of a instruction range and
2747 // current instruction scope does not match scope of first instruction
2748 // in this range then create a new instruction range.
2749 DbgRange R(RangeBeginMI, PrevMI);
2750 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2752 MIRanges.push_back(R);
2755 // This is a beginning of a new instruction range.
2756 RangeBeginMI = MInsn;
2758 // Reset previous markers.
2761 PrevInlinedAt = InlinedAt;
2765 // Create last instruction range.
2766 if (RangeBeginMI && PrevMI && PrevScope) {
2767 DbgRange R(RangeBeginMI, PrevMI);
2768 MIRanges.push_back(R);
2769 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2772 if (!CurrentFnDbgScope)
2775 calculateDominanceGraph(CurrentFnDbgScope);
2777 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2779 // Find ranges of instructions covered by each DbgScope;
2780 DbgScope *PrevDbgScope = NULL;
2781 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2782 RE = MIRanges.end(); RI != RE; ++RI) {
2783 const DbgRange &R = *RI;
2784 DbgScope *S = MI2ScopeMap.lookup(R.first);
2785 assert (S && "Lost DbgScope for a machine instruction!");
2786 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2787 PrevDbgScope->closeInsnRange(S);
2788 S->openInsnRange(R.first);
2789 S->extendInsnRange(R.second);
2794 PrevDbgScope->closeInsnRange();
2796 identifyScopeMarkers();
2798 return !DbgScopeMap.empty();
2801 /// identifyScopeMarkers() -
2802 /// Each DbgScope has first instruction and last instruction to mark beginning
2803 /// and end of a scope respectively. Create an inverse map that list scopes
2804 /// starts (and ends) with an instruction. One instruction may start (or end)
2805 /// multiple scopes. Ignore scopes that are not reachable.
2806 void DwarfDebug::identifyScopeMarkers() {
2807 SmallVector<DbgScope *, 4> WorkList;
2808 WorkList.push_back(CurrentFnDbgScope);
2809 while (!WorkList.empty()) {
2810 DbgScope *S = WorkList.pop_back_val();
2812 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2813 if (!Children.empty())
2814 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2815 SE = Children.end(); SI != SE; ++SI)
2816 WorkList.push_back(*SI);
2818 if (S->isAbstractScope())
2821 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2824 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2825 RE = Ranges.end(); RI != RE; ++RI) {
2826 assert(RI->first && "DbgRange does not have first instruction!");
2827 assert(RI->second && "DbgRange does not have second instruction!");
2828 InsnsNeedsLabelAfter.insert(RI->second);
2833 /// FindFirstDebugLoc - Find the first debug location in the function. This
2834 /// is intended to be an approximation for the source position of the
2835 /// beginning of the function.
2836 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2837 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2839 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2840 MBBI != MBBE; ++MBBI) {
2841 DebugLoc DL = MBBI->getDebugLoc();
2842 if (!DL.isUnknown())
2849 /// CheckLineNumbers - Count basicblocks whose instructions do not have any
2850 /// line number information.
2851 static void CheckLineNumbers(const MachineFunction *MF) {
2852 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2854 bool FoundLineNo = false;
2855 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2857 const MachineInstr *MI = II;
2858 if (!MI->getDebugLoc().isUnknown()) {
2863 if (!FoundLineNo && I->size())
2864 ++BlocksWithoutLineNo;
2869 /// beginFunction - Gather pre-function debug information. Assumes being
2870 /// emitted immediately after the function entry point.
2871 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2872 if (!MMI->hasDebugInfo()) return;
2873 if (!extractScopeInformation()) return;
2876 CheckLineNumbers(MF);
2879 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2880 Asm->getFunctionNumber());
2881 // Assumes in correct section after the entry point.
2882 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2884 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2886 DebugLoc FDL = FindFirstDebugLoc(MF);
2887 if (FDL.isUnknown()) return;
2889 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2890 const MDNode *TheScope = 0;
2892 DISubprogram SP = getDISubprogram(Scope);
2895 Line = SP.getLineNumber();
2899 Line = FDL.getLine();
2904 recordSourceLine(Line, Col, TheScope);
2906 /// ProcessedArgs - Collection of arguments already processed.
2907 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2909 /// LastDbgValue - Refer back to the last DBG_VALUE instruction to mention MD.
2910 DenseMap<const MDNode*, const MachineInstr*> LastDbgValue;
2912 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
2914 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
2915 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
2918 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2920 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2922 const MachineInstr *MI = II;
2923 DebugLoc DL = MI->getDebugLoc();
2924 if (MI->isDebugValue()) {
2925 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2927 // Keep track of variables in registers.
2929 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
2930 LastDbgValue[Var] = MI;
2931 if (isDbgValueInDefinedReg(MI))
2932 LiveUserVar[MI->getOperand(0).getReg()] = Var;
2935 if (!DV.Verify()) continue;
2936 // If DBG_VALUE is for a local variable then it needs a label.
2937 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2938 InsnNeedsLabel.insert(MI);
2939 // DBG_VALUE for inlined functions argument needs a label.
2940 else if (!DISubprogram(getDISubprogram(DV.getContext())).
2941 describes(MF->getFunction()))
2942 InsnNeedsLabel.insert(MI);
2943 // DBG_VALUE indicating argument location change needs a label.
2944 else if (!ProcessedArgs.insert(DV))
2945 InsnNeedsLabel.insert(MI);
2947 // If location is unknown then instruction needs a location only if
2948 // UnknownLocations flag is set.
2949 if (DL.isUnknown()) {
2950 if (UnknownLocations && !PrevLoc.isUnknown())
2951 InsnNeedsLabel.insert(MI);
2952 } else if (DL != PrevLoc)
2953 // Otherwise, instruction needs a location only if it is new location.
2954 InsnNeedsLabel.insert(MI);
2956 // Check if the instruction clobbers any registers with debug vars.
2957 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
2958 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
2959 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
2961 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
2962 unsigned Reg = *AI; ++AI) {
2963 const MDNode *Var = LiveUserVar[Reg];
2966 // Reg is now clobbered.
2967 LiveUserVar[Reg] = 0;
2969 // Was MD last defined by a DBG_VALUE referring to Reg?
2970 const MachineInstr *Last = LastDbgValue.lookup(Var);
2971 if (!Last || Last->getParent() != MI->getParent())
2973 if (!isDbgValueInDefinedReg(Last) ||
2974 Last->getOperand(0).getReg() != Reg)
2976 // MD is clobbered. Make sure the next instruction gets a label.
2977 InsnsNeedsLabelAfter.insert(MI);
2978 RegClobberInsn[Last] = MI;
2983 if (!DL.isUnknown() || UnknownLocations)
2987 PrevLabel = FunctionBeginSym;
2990 /// endFunction - Gather and emit post-function debug information.
2992 void DwarfDebug::endFunction(const MachineFunction *MF) {
2993 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2995 if (CurrentFnDbgScope) {
2997 // Define end label for subprogram.
2998 FunctionEndSym = Asm->GetTempSymbol("func_end",
2999 Asm->getFunctionNumber());
3000 // Assumes in correct section after the entry point.
3001 Asm->OutStreamer.EmitLabel(FunctionEndSym);
3003 SmallPtrSet<const MDNode *, 16> ProcessedVars;
3004 collectVariableInfo(MF, ProcessedVars);
3006 // Construct abstract scopes.
3007 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
3008 AE = AbstractScopesList.end(); AI != AE; ++AI) {
3009 DISubprogram SP((*AI)->getScopeNode());
3011 // Collect info for variables that were optimized out.
3012 StringRef FName = SP.getLinkageName();
3014 FName = SP.getName();
3015 if (NamedMDNode *NMD =
3016 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
3017 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
3018 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
3019 if (!DV || !ProcessedVars.insert(DV))
3021 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
3023 Scope->addVariable(new DbgVariable(DV));
3027 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
3028 constructScopeDIE(*AI);
3031 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
3033 if (!DisableFramePointerElim(*MF))
3034 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
3035 dwarf::DW_FORM_flag, 1);
3038 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
3039 MMI->getFrameMoves()));
3043 CurrentFnDbgScope = NULL;
3044 CurrentFnArguments.clear();
3045 InsnNeedsLabel.clear();
3046 DbgVariableToFrameIndexMap.clear();
3047 VarToAbstractVarMap.clear();
3048 DbgVariableToDbgInstMap.clear();
3049 DeleteContainerSeconds(DbgScopeMap);
3050 InsnsNeedsLabelAfter.clear();
3051 RegClobberInsn.clear();
3052 ConcreteScopes.clear();
3053 DeleteContainerSeconds(AbstractScopes);
3054 AbstractScopesList.clear();
3055 AbstractVariables.clear();
3056 LabelsBeforeInsn.clear();
3057 LabelsAfterInsn.clear();
3061 /// recordVariableFrameIndex - Record a variable's index.
3062 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3063 assert (V && "Invalid DbgVariable!");
3064 DbgVariableToFrameIndexMap[V] = Index;
3067 /// findVariableFrameIndex - Return true if frame index for the variable
3068 /// is found. Update FI to hold value of the index.
3069 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3070 assert (V && "Invalid DbgVariable!");
3071 DenseMap<const DbgVariable *, int>::iterator I =
3072 DbgVariableToFrameIndexMap.find(V);
3073 if (I == DbgVariableToFrameIndexMap.end())
3079 /// findDbgScope - Find DbgScope for the debug loc attached with an
3081 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3082 DbgScope *Scope = NULL;
3084 MInsn->getParent()->getParent()->getFunction()->getContext();
3085 DebugLoc DL = MInsn->getDebugLoc();
3090 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3091 Scope = ConcreteScopes.lookup(IA);
3093 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
3099 /// recordSourceLine - Register a source line with debug info. Returns the
3100 /// unique label that was emitted and which provides correspondence to
3101 /// the source line list.
3102 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
3108 DIDescriptor Scope(S);
3110 if (Scope.isCompileUnit()) {
3111 DICompileUnit CU(S);
3112 Fn = CU.getFilename();
3113 } else if (Scope.isFile()) {
3115 Fn = F.getFilename();
3116 } else if (Scope.isSubprogram()) {
3118 Fn = SP.getFilename();
3119 } else if (Scope.isLexicalBlock()) {
3120 DILexicalBlock DB(S);
3121 Fn = DB.getFilename();
3123 assert(0 && "Unexpected scope info");
3125 Src = GetOrCreateSourceID(Fn);
3128 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3131 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
3132 Asm->OutStreamer.EmitLabel(Label);
3136 //===----------------------------------------------------------------------===//
3138 //===----------------------------------------------------------------------===//
3140 /// computeSizeAndOffset - Compute the size and offset of a DIE.
3143 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
3144 // Get the children.
3145 const std::vector<DIE *> &Children = Die->getChildren();
3147 // If not last sibling and has children then add sibling offset attribute.
3148 if (!Last && !Children.empty())
3149 Die->addSiblingOffset(DIEValueAllocator);
3151 // Record the abbreviation.
3152 assignAbbrevNumber(Die->getAbbrev());
3154 // Get the abbreviation for this DIE.
3155 unsigned AbbrevNumber = Die->getAbbrevNumber();
3156 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3159 Die->setOffset(Offset);
3161 // Start the size with the size of abbreviation code.
3162 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
3164 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3165 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3167 // Size the DIE attribute values.
3168 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3169 // Size attribute value.
3170 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
3172 // Size the DIE children if any.
3173 if (!Children.empty()) {
3174 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3175 "Children flag not set");
3177 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3178 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
3180 // End of children marker.
3181 Offset += sizeof(int8_t);
3184 Die->setSize(Offset - Die->getOffset());
3188 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3190 void DwarfDebug::computeSizeAndOffsets() {
3191 unsigned PrevOffset = 0;
3192 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3193 E = CUMap.end(); I != E; ++I) {
3194 // Compute size of compile unit header.
3195 static unsigned Offset = PrevOffset +
3196 sizeof(int32_t) + // Length of Compilation Unit Info
3197 sizeof(int16_t) + // DWARF version number
3198 sizeof(int32_t) + // Offset Into Abbrev. Section
3199 sizeof(int8_t); // Pointer Size (in bytes)
3200 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3201 PrevOffset = Offset;
3205 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3206 /// temporary label to it if SymbolStem is specified.
3207 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3208 const char *SymbolStem = 0) {
3209 Asm->OutStreamer.SwitchSection(Section);
3210 if (!SymbolStem) return 0;
3212 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3213 Asm->OutStreamer.EmitLabel(TmpSym);
3217 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3218 /// the start of each one.
3219 void DwarfDebug::EmitSectionLabels() {
3220 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3222 // Dwarf sections base addresses.
3223 if (Asm->MAI->doesDwarfRequireFrameSection()) {
3224 DwarfFrameSectionSym =
3225 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3228 DwarfInfoSectionSym =
3229 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3230 DwarfAbbrevSectionSym =
3231 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3232 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3234 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3235 EmitSectionSym(Asm, MacroInfo);
3237 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3238 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3239 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3240 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3241 DwarfStrSectionSym =
3242 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3243 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3246 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3247 "section_debug_loc");
3249 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3250 EmitSectionSym(Asm, TLOF.getDataSection());
3253 /// emitDIE - Recusively Emits a debug information entry.
3255 void DwarfDebug::emitDIE(DIE *Die) {
3256 // Get the abbreviation for this DIE.
3257 unsigned AbbrevNumber = Die->getAbbrevNumber();
3258 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3260 // Emit the code (index) for the abbreviation.
3261 if (Asm->isVerbose())
3262 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3263 Twine::utohexstr(Die->getOffset()) + ":0x" +
3264 Twine::utohexstr(Die->getSize()) + " " +
3265 dwarf::TagString(Abbrev->getTag()));
3266 Asm->EmitULEB128(AbbrevNumber);
3268 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3269 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3271 // Emit the DIE attribute values.
3272 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3273 unsigned Attr = AbbrevData[i].getAttribute();
3274 unsigned Form = AbbrevData[i].getForm();
3275 assert(Form && "Too many attributes for DIE (check abbreviation)");
3277 if (Asm->isVerbose())
3278 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3281 case dwarf::DW_AT_sibling:
3282 Asm->EmitInt32(Die->getSiblingOffset());
3284 case dwarf::DW_AT_abstract_origin: {
3285 DIEEntry *E = cast<DIEEntry>(Values[i]);
3286 DIE *Origin = E->getEntry();
3287 unsigned Addr = Origin->getOffset();
3288 Asm->EmitInt32(Addr);
3291 case dwarf::DW_AT_ranges: {
3292 // DW_AT_range Value encodes offset in debug_range section.
3293 DIEInteger *V = cast<DIEInteger>(Values[i]);
3295 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3296 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3300 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3302 DwarfDebugRangeSectionSym,
3307 case dwarf::DW_AT_location: {
3308 if (UseDotDebugLocEntry.count(Die) != 0) {
3309 DIELabel *L = cast<DIELabel>(Values[i]);
3310 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3312 Values[i]->EmitValue(Asm, Form);
3315 case dwarf::DW_AT_accessibility: {
3316 if (Asm->isVerbose()) {
3317 DIEInteger *V = cast<DIEInteger>(Values[i]);
3318 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3320 Values[i]->EmitValue(Asm, Form);
3324 // Emit an attribute using the defined form.
3325 Values[i]->EmitValue(Asm, Form);
3330 // Emit the DIE children if any.
3331 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3332 const std::vector<DIE *> &Children = Die->getChildren();
3334 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3335 emitDIE(Children[j]);
3337 if (Asm->isVerbose())
3338 Asm->OutStreamer.AddComment("End Of Children Mark");
3343 /// emitDebugInfo - Emit the debug info section.
3345 void DwarfDebug::emitDebugInfo() {
3346 // Start debug info section.
3347 Asm->OutStreamer.SwitchSection(
3348 Asm->getObjFileLowering().getDwarfInfoSection());
3349 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3350 E = CUMap.end(); I != E; ++I) {
3351 CompileUnit *TheCU = I->second;
3352 DIE *Die = TheCU->getCUDie();
3354 // Emit the compile units header.
3355 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3358 // Emit size of content not including length itself
3359 unsigned ContentSize = Die->getSize() +
3360 sizeof(int16_t) + // DWARF version number
3361 sizeof(int32_t) + // Offset Into Abbrev. Section
3362 sizeof(int8_t) + // Pointer Size (in bytes)
3363 sizeof(int32_t); // FIXME - extra pad for gdb bug.
3365 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3366 Asm->EmitInt32(ContentSize);
3367 Asm->OutStreamer.AddComment("DWARF version number");
3368 Asm->EmitInt16(dwarf::DWARF_VERSION);
3369 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3370 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3371 DwarfAbbrevSectionSym);
3372 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3373 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3376 // FIXME - extra padding for gdb bug.
3377 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3382 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3386 /// emitAbbreviations - Emit the abbreviation section.
3388 void DwarfDebug::emitAbbreviations() const {
3389 // Check to see if it is worth the effort.
3390 if (!Abbreviations.empty()) {
3391 // Start the debug abbrev section.
3392 Asm->OutStreamer.SwitchSection(
3393 Asm->getObjFileLowering().getDwarfAbbrevSection());
3395 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3397 // For each abbrevation.
3398 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3399 // Get abbreviation data
3400 const DIEAbbrev *Abbrev = Abbreviations[i];
3402 // Emit the abbrevations code (base 1 index.)
3403 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3405 // Emit the abbreviations data.
3409 // Mark end of abbreviations.
3410 Asm->EmitULEB128(0, "EOM(3)");
3412 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3416 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3417 /// the line matrix.
3419 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3420 // Define last address of section.
3421 Asm->OutStreamer.AddComment("Extended Op");
3424 Asm->OutStreamer.AddComment("Op size");
3425 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3426 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3427 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3429 Asm->OutStreamer.AddComment("Section end label");
3431 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3432 Asm->getTargetData().getPointerSize(),
3435 // Mark end of matrix.
3436 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3442 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3444 void DwarfDebug::emitCommonDebugFrame() {
3445 if (!Asm->MAI->doesDwarfRequireFrameSection())
3448 int stackGrowth = Asm->getTargetData().getPointerSize();
3449 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3450 TargetFrameLowering::StackGrowsDown)
3453 // Start the dwarf frame section.
3454 Asm->OutStreamer.SwitchSection(
3455 Asm->getObjFileLowering().getDwarfFrameSection());
3457 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3458 Asm->OutStreamer.AddComment("Length of Common Information Entry");
3459 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3460 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3462 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3463 Asm->OutStreamer.AddComment("CIE Identifier Tag");
3464 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3465 Asm->OutStreamer.AddComment("CIE Version");
3466 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3467 Asm->OutStreamer.AddComment("CIE Augmentation");
3468 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3469 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3470 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3471 Asm->OutStreamer.AddComment("CIE RA Column");
3472 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3473 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
3474 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3476 std::vector<MachineMove> Moves;
3477 TFI->getInitialFrameState(Moves);
3479 Asm->EmitFrameMoves(Moves, 0, false);
3481 Asm->EmitAlignment(2);
3482 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3485 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3488 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3489 if (!Asm->MAI->doesDwarfRequireFrameSection())
3492 // Start the dwarf frame section.
3493 Asm->OutStreamer.SwitchSection(
3494 Asm->getObjFileLowering().getDwarfFrameSection());
3496 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3497 MCSymbol *DebugFrameBegin =
3498 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3499 MCSymbol *DebugFrameEnd =
3500 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3501 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3503 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3505 Asm->OutStreamer.AddComment("FDE CIE offset");
3506 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3507 DwarfFrameSectionSym);
3509 Asm->OutStreamer.AddComment("FDE initial location");
3510 MCSymbol *FuncBeginSym =
3511 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3512 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3513 Asm->getTargetData().getPointerSize(),
3517 Asm->OutStreamer.AddComment("FDE address range");
3518 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3519 FuncBeginSym, Asm->getTargetData().getPointerSize());
3521 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3523 Asm->EmitAlignment(2);
3524 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3527 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3529 void DwarfDebug::emitDebugPubNames() {
3530 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3531 E = CUMap.end(); I != E; ++I) {
3532 CompileUnit *TheCU = I->second;
3533 // Start the dwarf pubnames section.
3534 Asm->OutStreamer.SwitchSection(
3535 Asm->getObjFileLowering().getDwarfPubNamesSection());
3537 Asm->OutStreamer.AddComment("Length of Public Names Info");
3538 Asm->EmitLabelDifference(
3539 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3540 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3542 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3545 Asm->OutStreamer.AddComment("DWARF Version");
3546 Asm->EmitInt16(dwarf::DWARF_VERSION);
3548 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3549 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3550 DwarfInfoSectionSym);
3552 Asm->OutStreamer.AddComment("Compilation Unit Length");
3553 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3554 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3557 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3558 for (StringMap<DIE*>::const_iterator
3559 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3560 const char *Name = GI->getKeyData();
3561 DIE *Entity = GI->second;
3563 Asm->OutStreamer.AddComment("DIE offset");
3564 Asm->EmitInt32(Entity->getOffset());
3566 if (Asm->isVerbose())
3567 Asm->OutStreamer.AddComment("External Name");
3568 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3571 Asm->OutStreamer.AddComment("End Mark");
3573 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3578 void DwarfDebug::emitDebugPubTypes() {
3579 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3580 E = CUMap.end(); I != E; ++I) {
3581 CompileUnit *TheCU = I->second;
3582 // Start the dwarf pubnames section.
3583 Asm->OutStreamer.SwitchSection(
3584 Asm->getObjFileLowering().getDwarfPubTypesSection());
3585 Asm->OutStreamer.AddComment("Length of Public Types Info");
3586 Asm->EmitLabelDifference(
3587 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3588 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3590 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3593 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3594 Asm->EmitInt16(dwarf::DWARF_VERSION);
3596 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3597 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3598 DwarfInfoSectionSym);
3600 Asm->OutStreamer.AddComment("Compilation Unit Length");
3601 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3602 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3605 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3606 for (StringMap<DIE*>::const_iterator
3607 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3608 const char *Name = GI->getKeyData();
3609 DIE * Entity = GI->second;
3611 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3612 Asm->EmitInt32(Entity->getOffset());
3614 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3615 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3618 Asm->OutStreamer.AddComment("End Mark");
3620 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3625 /// emitDebugStr - Emit visible names into a debug str section.
3627 void DwarfDebug::emitDebugStr() {
3628 // Check to see if it is worth the effort.
3629 if (StringPool.empty()) return;
3631 // Start the dwarf str section.
3632 Asm->OutStreamer.SwitchSection(
3633 Asm->getObjFileLowering().getDwarfStrSection());
3635 // Get all of the string pool entries and put them in an array by their ID so
3636 // we can sort them.
3637 SmallVector<std::pair<unsigned,
3638 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3640 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3641 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3642 Entries.push_back(std::make_pair(I->second.second, &*I));
3644 array_pod_sort(Entries.begin(), Entries.end());
3646 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3647 // Emit a label for reference from debug information entries.
3648 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3650 // Emit the string itself.
3651 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3655 /// emitDebugLoc - Emit visible names into a debug loc section.
3657 void DwarfDebug::emitDebugLoc() {
3658 if (DotDebugLocEntries.empty())
3661 for (SmallVector<DotDebugLocEntry, 4>::iterator
3662 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3664 DotDebugLocEntry &Entry = *I;
3665 if (I + 1 != DotDebugLocEntries.end())
3669 // Start the dwarf loc section.
3670 Asm->OutStreamer.SwitchSection(
3671 Asm->getObjFileLowering().getDwarfLocSection());
3672 unsigned char Size = Asm->getTargetData().getPointerSize();
3673 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3675 for (SmallVector<DotDebugLocEntry, 4>::iterator
3676 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3677 I != E; ++I, ++index) {
3678 DotDebugLocEntry &Entry = *I;
3679 if (Entry.isMerged()) continue;
3680 if (Entry.isEmpty()) {
3681 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3682 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3683 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3685 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3686 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3687 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3688 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3689 if (int Offset = Entry.Loc.getOffset()) {
3690 // If the value is at a certain offset from frame register then
3692 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3693 Asm->OutStreamer.AddComment("Loc expr size");
3694 Asm->EmitInt16(1 + OffsetSize);
3695 Asm->OutStreamer.AddComment(
3696 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3697 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3698 Asm->OutStreamer.AddComment("Offset");
3699 Asm->EmitSLEB128(Offset);
3702 Asm->OutStreamer.AddComment("Loc expr size");
3704 Asm->OutStreamer.AddComment(
3705 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3706 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3708 Asm->OutStreamer.AddComment("Loc expr size");
3709 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3710 Asm->EmitInt8(dwarf::DW_OP_regx);
3711 Asm->EmitULEB128(Reg);
3718 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3720 void DwarfDebug::EmitDebugARanges() {
3721 // Start the dwarf aranges section.
3722 Asm->OutStreamer.SwitchSection(
3723 Asm->getObjFileLowering().getDwarfARangesSection());
3726 /// emitDebugRanges - Emit visible names into a debug ranges section.
3728 void DwarfDebug::emitDebugRanges() {
3729 // Start the dwarf ranges section.
3730 Asm->OutStreamer.SwitchSection(
3731 Asm->getObjFileLowering().getDwarfRangesSection());
3732 unsigned char Size = Asm->getTargetData().getPointerSize();
3733 for (SmallVector<const MCSymbol *, 8>::iterator
3734 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3737 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3739 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3743 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3745 void DwarfDebug::emitDebugMacInfo() {
3746 if (const MCSection *LineInfo =
3747 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3748 // Start the dwarf macinfo section.
3749 Asm->OutStreamer.SwitchSection(LineInfo);
3753 /// emitDebugInlineInfo - Emit inline info using following format.
3755 /// 1. length of section
3756 /// 2. Dwarf version number
3757 /// 3. address size.
3759 /// Entries (one "entry" for each function that was inlined):
3761 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3762 /// otherwise offset into __debug_str for regular function name.
3763 /// 2. offset into __debug_str section for regular function name.
3764 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3765 /// instances for the function.
3767 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3768 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3769 /// __debug_info section, and the low_pc is the starting address for the
3770 /// inlining instance.
3771 void DwarfDebug::emitDebugInlineInfo() {
3772 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3778 Asm->OutStreamer.SwitchSection(
3779 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3781 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3782 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3783 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3785 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3787 Asm->OutStreamer.AddComment("Dwarf Version");
3788 Asm->EmitInt16(dwarf::DWARF_VERSION);
3789 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3790 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3792 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3793 E = InlinedSPNodes.end(); I != E; ++I) {
3795 const MDNode *Node = *I;
3796 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3797 = InlineInfo.find(Node);
3798 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3799 DISubprogram SP(Node);
3800 StringRef LName = SP.getLinkageName();
3801 StringRef Name = SP.getName();
3803 Asm->OutStreamer.AddComment("MIPS linkage name");
3804 if (LName.empty()) {
3805 Asm->OutStreamer.EmitBytes(Name, 0);
3806 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3808 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3809 DwarfStrSectionSym);
3811 Asm->OutStreamer.AddComment("Function name");
3812 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3813 Asm->EmitULEB128(Labels.size(), "Inline count");
3815 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3816 LE = Labels.end(); LI != LE; ++LI) {
3817 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3818 Asm->EmitInt32(LI->second->getOffset());
3820 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3821 Asm->OutStreamer.EmitSymbolValue(LI->first,
3822 Asm->getTargetData().getPointerSize(),0);
3826 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));