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 V.getContext().getDirectory());
521 assert(FileID && "Invalid file id");
522 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
523 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
526 /// addSourceLine - Add location information to specified debug information
528 void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
529 // Verify global variable.
533 unsigned Line = G.getLineNumber();
536 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename(),
537 G.getContext().getDirectory());
538 assert(FileID && "Invalid file id");
539 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
540 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
543 /// addSourceLine - Add location information to specified debug information
545 void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
546 // Verify subprogram.
549 // If the line number is 0, don't add it.
550 if (SP.getLineNumber() == 0)
553 unsigned Line = SP.getLineNumber();
554 if (!SP.getContext().Verify())
556 unsigned FileID = GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
557 assert(FileID && "Invalid file id");
558 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
559 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
562 /// addSourceLine - Add location information to specified debug information
564 void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
569 unsigned Line = Ty.getLineNumber();
570 if (Line == 0 || !Ty.getContext().Verify())
572 unsigned FileID = GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
573 assert(FileID && "Invalid file id");
574 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
575 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
578 /// addSourceLine - Add location information to specified debug information
580 void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
585 unsigned Line = NS.getLineNumber();
588 StringRef FN = NS.getFilename();
590 unsigned FileID = GetOrCreateSourceID(FN, NS.getDirectory());
591 assert(FileID && "Invalid file id");
592 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
593 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
596 /// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
597 /// on provided frame index.
598 void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
599 MachineLocation Location;
601 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
602 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
603 Location.set(FrameReg, Offset);
605 if (DV->variableHasComplexAddress())
606 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
607 else if (DV->isBlockByrefVariable())
608 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
610 addAddress(Die, dwarf::DW_AT_location, Location);
613 /// addComplexAddress - Start with the address based on the location provided,
614 /// and generate the DWARF information necessary to find the actual variable
615 /// given the extra address information encoded in the DIVariable, starting from
616 /// the starting location. Add the DWARF information to the die.
618 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
620 const MachineLocation &Location) {
621 DIType Ty = DV->getType();
623 // Decode the original location, and use that as the start of the byref
624 // variable's location.
625 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
626 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
627 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
629 if (Location.isReg()) {
631 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
633 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
634 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
640 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
641 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
644 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
647 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
648 uint64_t Element = DV->getAddrElement(i);
650 if (Element == DIBuilder::OpPlus) {
651 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
652 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
653 } else if (Element == DIBuilder::OpDeref) {
654 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
655 } else llvm_unreachable("unknown DIBuilder Opcode");
658 // Now attach the location information to the DIE.
659 addBlock(Die, Attribute, 0, Block);
662 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
663 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
664 gives the variable VarName either the struct, or a pointer to the struct, as
665 its type. This is necessary for various behind-the-scenes things the
666 compiler needs to do with by-reference variables in Blocks.
668 However, as far as the original *programmer* is concerned, the variable
669 should still have type 'SomeType', as originally declared.
671 The function getBlockByrefType dives into the __Block_byref_x_VarName
672 struct to find the original type of the variable, which is then assigned to
673 the variable's Debug Information Entry as its real type. So far, so good.
674 However now the debugger will expect the variable VarName to have the type
675 SomeType. So we need the location attribute for the variable to be an
676 expression that explains to the debugger how to navigate through the
677 pointers and struct to find the actual variable of type SomeType.
679 The following function does just that. We start by getting
680 the "normal" location for the variable. This will be the location
681 of either the struct __Block_byref_x_VarName or the pointer to the
682 struct __Block_byref_x_VarName.
684 The struct will look something like:
686 struct __Block_byref_x_VarName {
688 struct __Block_byref_x_VarName *forwarding;
689 ... <various other fields>
691 ... <maybe more fields>
694 If we are given the struct directly (as our starting point) we
695 need to tell the debugger to:
697 1). Add the offset of the forwarding field.
699 2). Follow that pointer to get the real __Block_byref_x_VarName
700 struct to use (the real one may have been copied onto the heap).
702 3). Add the offset for the field VarName, to find the actual variable.
704 If we started with a pointer to the struct, then we need to
705 dereference that pointer first, before the other steps.
706 Translating this into DWARF ops, we will need to append the following
707 to the current location description for the variable:
709 DW_OP_deref -- optional, if we start with a pointer
710 DW_OP_plus_uconst <forward_fld_offset>
712 DW_OP_plus_uconst <varName_fld_offset>
714 That is what this function does. */
716 /// addBlockByrefAddress - Start with the address based on the location
717 /// provided, and generate the DWARF information necessary to find the
718 /// actual Block variable (navigating the Block struct) based on the
719 /// starting location. Add the DWARF information to the die. For
720 /// more information, read large comment just above here.
722 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
724 const MachineLocation &Location) {
725 DIType Ty = DV->getType();
727 unsigned Tag = Ty.getTag();
728 bool isPointer = false;
730 StringRef varName = DV->getName();
732 if (Tag == dwarf::DW_TAG_pointer_type) {
733 DIDerivedType DTy = DIDerivedType(Ty);
734 TmpTy = DTy.getTypeDerivedFrom();
738 DICompositeType blockStruct = DICompositeType(TmpTy);
740 // Find the __forwarding field and the variable field in the __Block_byref
742 DIArray Fields = blockStruct.getTypeArray();
743 DIDescriptor varField = DIDescriptor();
744 DIDescriptor forwardingField = DIDescriptor();
746 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
747 DIDescriptor Element = Fields.getElement(i);
748 DIDerivedType DT = DIDerivedType(Element);
749 StringRef fieldName = DT.getName();
750 if (fieldName == "__forwarding")
751 forwardingField = Element;
752 else if (fieldName == varName)
756 // Get the offsets for the forwarding field and the variable field.
757 unsigned forwardingFieldOffset =
758 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
759 unsigned varFieldOffset =
760 DIDerivedType(varField).getOffsetInBits() >> 3;
762 // Decode the original location, and use that as the start of the byref
763 // variable's location.
764 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
765 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
766 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
768 if (Location.isReg()) {
770 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
772 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
773 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
779 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
780 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
783 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
786 // If we started with a pointer to the __Block_byref... struct, then
787 // the first thing we need to do is dereference the pointer (DW_OP_deref).
789 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
791 // Next add the offset for the '__forwarding' field:
792 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
793 // adding the offset if it's 0.
794 if (forwardingFieldOffset > 0) {
795 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
796 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
799 // Now dereference the __forwarding field to get to the real __Block_byref
800 // struct: DW_OP_deref.
801 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
803 // Now that we've got the real __Block_byref... struct, add the offset
804 // for the variable's field to get to the location of the actual variable:
805 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
806 if (varFieldOffset > 0) {
807 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
808 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
811 // Now attach the location information to the DIE.
812 addBlock(Die, Attribute, 0, Block);
815 /// addAddress - Add an address attribute to a die based on the location
817 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
818 const MachineLocation &Location) {
819 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
820 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
821 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
823 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
824 && Location.getOffset()) {
825 // If variable offset is based in frame register then use fbreg.
826 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
827 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
828 addBlock(Die, Attribute, 0, Block);
832 if (Location.isReg()) {
834 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
836 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
837 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
843 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
844 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
847 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
850 addBlock(Die, Attribute, 0, Block);
853 /// addRegisterAddress - Add register location entry in variable DIE.
854 bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
855 assert (MO.isReg() && "Invalid machine operand!");
858 MachineLocation Location;
859 Location.set(MO.getReg());
860 addAddress(Die, dwarf::DW_AT_location, Location);
864 /// addConstantValue - Add constant value entry in variable DIE.
865 bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
866 assert (MO.isImm() && "Invalid machine operand!");
867 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
868 unsigned Imm = MO.getImm();
869 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
870 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
874 /// addConstantFPValue - Add constant value entry in variable DIE.
875 bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
876 assert (MO.isFPImm() && "Invalid machine operand!");
877 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
878 APFloat FPImm = MO.getFPImm()->getValueAPF();
880 // Get the raw data form of the floating point.
881 const APInt FltVal = FPImm.bitcastToAPInt();
882 const char *FltPtr = (const char*)FltVal.getRawData();
884 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
885 bool LittleEndian = Asm->getTargetData().isLittleEndian();
886 int Incr = (LittleEndian ? 1 : -1);
887 int Start = (LittleEndian ? 0 : NumBytes - 1);
888 int Stop = (LittleEndian ? NumBytes : -1);
890 // Output the constant to DWARF one byte at a time.
891 for (; Start != Stop; Start += Incr)
892 addUInt(Block, 0, dwarf::DW_FORM_data1,
893 (unsigned char)0xFF & FltPtr[Start]);
895 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
899 /// addConstantValue - Add constant value entry in variable DIE.
900 bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
902 if (CI->getBitWidth() <= 64) {
904 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
907 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
912 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
914 // Get the raw data form of the large APInt.
915 const APInt Val = CI->getValue();
916 const char *Ptr = (const char*)Val.getRawData();
918 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
919 bool LittleEndian = Asm->getTargetData().isLittleEndian();
920 int Incr = (LittleEndian ? 1 : -1);
921 int Start = (LittleEndian ? 0 : NumBytes - 1);
922 int Stop = (LittleEndian ? NumBytes : -1);
924 // Output the constant to DWARF one byte at a time.
925 for (; Start != Stop; Start += Incr)
926 addUInt(Block, 0, dwarf::DW_FORM_data1,
927 (unsigned char)0xFF & Ptr[Start]);
929 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
933 /// addTemplateParams - Add template parameters in buffer.
934 void DwarfDebug::addTemplateParams(DIE &Buffer, DIArray TParams) {
935 // Add template parameters.
936 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
937 DIDescriptor Element = TParams.getElement(i);
938 if (Element.isTemplateTypeParameter())
939 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
940 DITemplateTypeParameter(Element)));
941 else if (Element.isTemplateValueParameter())
942 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
943 DITemplateValueParameter(Element)));
947 /// addToContextOwner - Add Die into the list of its context owner's children.
948 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
949 if (Context.isType()) {
950 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
951 ContextDIE->addChild(Die);
952 } else if (Context.isNameSpace()) {
953 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
954 ContextDIE->addChild(Die);
955 } else if (Context.isSubprogram()) {
956 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
957 ContextDIE->addChild(Die);
958 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
959 ContextDIE->addChild(Die);
961 getCompileUnit(Context)->addDie(Die);
964 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
966 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
967 CompileUnit *TypeCU = getCompileUnit(Ty);
968 DIE *TyDIE = TypeCU->getDIE(Ty);
973 TyDIE = new DIE(dwarf::DW_TAG_base_type);
974 TypeCU->insertDIE(Ty, TyDIE);
975 if (Ty.isBasicType())
976 constructTypeDIE(*TyDIE, DIBasicType(Ty));
977 else if (Ty.isCompositeType())
978 constructTypeDIE(*TyDIE, DICompositeType(Ty));
980 assert(Ty.isDerivedType() && "Unknown kind of DIType");
981 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
984 addToContextOwner(TyDIE, Ty.getContext());
988 /// addType - Add a new type attribute to the specified entity.
989 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
993 // Check for pre-existence.
994 CompileUnit *TypeCU = getCompileUnit(Ty);
995 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
996 // If it exists then use the existing value.
998 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
1003 DIE *Buffer = getOrCreateTypeDIE(Ty);
1006 Entry = createDIEEntry(Buffer);
1007 TypeCU->insertDIEEntry(Ty, Entry);
1009 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
1012 /// constructTypeDIE - Construct basic type die from DIBasicType.
1013 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1014 // Get core information.
1015 StringRef Name = BTy.getName();
1016 Buffer.setTag(dwarf::DW_TAG_base_type);
1017 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1020 // Add name if not anonymous or intermediate type.
1022 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1023 uint64_t Size = BTy.getSizeInBits() >> 3;
1024 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1027 /// constructTypeDIE - Construct derived type die from DIDerivedType.
1028 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1029 // Get core information.
1030 StringRef Name = DTy.getName();
1031 uint64_t Size = DTy.getSizeInBits() >> 3;
1032 unsigned Tag = DTy.getTag();
1034 // FIXME - Workaround for templates.
1035 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1039 // Map to main type, void will not have a type.
1040 DIType FromTy = DTy.getTypeDerivedFrom();
1041 addType(&Buffer, FromTy);
1043 // Add name if not anonymous or intermediate type.
1045 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1047 // Add size if non-zero (derived types might be zero-sized.)
1049 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1051 // Add source line info if available and TyDesc is not a forward declaration.
1052 if (!DTy.isForwardDecl())
1053 addSourceLine(&Buffer, DTy);
1056 /// constructTypeDIE - Construct type DIE from DICompositeType.
1057 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1058 // Get core information.
1059 StringRef Name = CTy.getName();
1061 uint64_t Size = CTy.getSizeInBits() >> 3;
1062 unsigned Tag = CTy.getTag();
1066 case dwarf::DW_TAG_vector_type:
1067 case dwarf::DW_TAG_array_type:
1068 constructArrayTypeDIE(Buffer, &CTy);
1070 case dwarf::DW_TAG_enumeration_type: {
1071 DIArray Elements = CTy.getTypeArray();
1073 // Add enumerators to enumeration type.
1074 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1075 DIE *ElemDie = NULL;
1076 DIDescriptor Enum(Elements.getElement(i));
1077 if (Enum.isEnumerator()) {
1078 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1079 Buffer.addChild(ElemDie);
1084 case dwarf::DW_TAG_subroutine_type: {
1086 DIArray Elements = CTy.getTypeArray();
1087 DIDescriptor RTy = Elements.getElement(0);
1088 addType(&Buffer, DIType(RTy));
1090 bool isPrototyped = true;
1092 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1093 DIDescriptor Ty = Elements.getElement(i);
1094 if (Ty.isUnspecifiedParameter()) {
1095 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1096 Buffer.addChild(Arg);
1097 isPrototyped = false;
1099 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1100 addType(Arg, DIType(Ty));
1101 Buffer.addChild(Arg);
1104 // Add prototype flag.
1106 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1109 case dwarf::DW_TAG_structure_type:
1110 case dwarf::DW_TAG_union_type:
1111 case dwarf::DW_TAG_class_type: {
1112 // Add elements to structure type.
1113 DIArray Elements = CTy.getTypeArray();
1115 // A forward struct declared type may not have elements available.
1116 unsigned N = Elements.getNumElements();
1120 // Add elements to structure type.
1121 for (unsigned i = 0; i < N; ++i) {
1122 DIDescriptor Element = Elements.getElement(i);
1123 DIE *ElemDie = NULL;
1124 if (Element.isSubprogram()) {
1125 DISubprogram SP(Element);
1126 ElemDie = createSubprogramDIE(DISubprogram(Element));
1127 if (SP.isProtected())
1128 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1129 dwarf::DW_ACCESS_protected);
1130 else if (SP.isPrivate())
1131 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1132 dwarf::DW_ACCESS_private);
1134 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1135 dwarf::DW_ACCESS_public);
1136 if (SP.isExplicit())
1137 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
1139 else if (Element.isVariable()) {
1140 DIVariable DV(Element);
1141 ElemDie = new DIE(dwarf::DW_TAG_variable);
1142 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1144 addType(ElemDie, DV.getType());
1145 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1146 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1147 addSourceLine(ElemDie, DV);
1148 } else if (Element.isDerivedType())
1149 ElemDie = createMemberDIE(DIDerivedType(Element));
1152 Buffer.addChild(ElemDie);
1155 if (CTy.isAppleBlockExtension())
1156 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1158 unsigned RLang = CTy.getRunTimeLang();
1160 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1161 dwarf::DW_FORM_data1, RLang);
1163 DICompositeType ContainingType = CTy.getContainingType();
1164 if (DIDescriptor(ContainingType).isCompositeType())
1165 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1166 getOrCreateTypeDIE(DIType(ContainingType)));
1168 DIDescriptor Context = CTy.getContext();
1169 addToContextOwner(&Buffer, Context);
1172 if (Tag == dwarf::DW_TAG_class_type)
1173 addTemplateParams(Buffer, CTy.getTemplateParams());
1181 // Add name if not anonymous or intermediate type.
1183 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1185 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
1186 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1188 // Add size if non-zero (derived types might be zero-sized.)
1190 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1192 // Add zero size if it is not a forward declaration.
1193 if (CTy.isForwardDecl())
1194 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1196 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1199 // Add source line info if available.
1200 if (!CTy.isForwardDecl())
1201 addSourceLine(&Buffer, CTy);
1205 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1206 /// for the given DITemplateTypeParameter.
1208 DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1209 CompileUnit *TypeCU = getCompileUnit(TP);
1210 DIE *ParamDIE = TypeCU->getDIE(TP);
1214 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1215 addType(ParamDIE, TP.getType());
1216 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1220 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1221 /// for the given DITemplateValueParameter.
1223 DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1224 CompileUnit *TVCU = getCompileUnit(TPV);
1225 DIE *ParamDIE = TVCU->getDIE(TPV);
1229 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1230 addType(ParamDIE, TPV.getType());
1231 if (!TPV.getName().empty())
1232 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
1233 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1238 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1239 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1240 int64_t L = SR.getLo();
1241 int64_t H = SR.getHi();
1242 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1244 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1246 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1247 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1249 Buffer.addChild(DW_Subrange);
1252 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1253 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1254 DICompositeType *CTy) {
1255 Buffer.setTag(dwarf::DW_TAG_array_type);
1256 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1257 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1259 // Emit derived type.
1260 addType(&Buffer, CTy->getTypeDerivedFrom());
1261 DIArray Elements = CTy->getTypeArray();
1263 // Get an anonymous type for index type.
1264 CompileUnit *TheCU = getCompileUnit(*CTy);
1265 DIE *IdxTy = TheCU->getIndexTyDie();
1267 // Construct an anonymous type for index type.
1268 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1269 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1270 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1271 dwarf::DW_ATE_signed);
1272 TheCU->addDie(IdxTy);
1273 TheCU->setIndexTyDie(IdxTy);
1276 // Add subranges to array type.
1277 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1278 DIDescriptor Element = Elements.getElement(i);
1279 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1280 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1284 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1285 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1286 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1287 StringRef Name = ETy.getName();
1288 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1289 int64_t Value = ETy.getEnumValue();
1290 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1294 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1295 /// printer to not emit usual symbol prefix before the symbol name is used then
1296 /// return linkage name after skipping this special LLVM prefix.
1297 static StringRef getRealLinkageName(StringRef LinkageName) {
1299 if (LinkageName.startswith(StringRef(&One, 1)))
1300 return LinkageName.substr(1);
1304 /// createMemberDIE - Create new member DIE.
1305 DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
1306 DIE *MemberDie = new DIE(DT.getTag());
1307 StringRef Name = DT.getName();
1309 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1311 addType(MemberDie, DT.getTypeDerivedFrom());
1313 addSourceLine(MemberDie, DT);
1315 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1316 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1318 uint64_t Size = DT.getSizeInBits();
1319 uint64_t FieldSize = DT.getOriginalTypeSize();
1321 if (Size != FieldSize) {
1323 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1324 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1326 uint64_t Offset = DT.getOffsetInBits();
1327 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1328 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1329 uint64_t FieldOffset = (HiMark - FieldSize);
1330 Offset -= FieldOffset;
1332 // Maybe we need to work from the other end.
1333 if (Asm->getTargetData().isLittleEndian())
1334 Offset = FieldSize - (Offset + Size);
1335 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1337 // Here WD_AT_data_member_location points to the anonymous
1338 // field that includes this bit field.
1339 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1342 // This is not a bitfield.
1343 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1345 if (DT.getTag() == dwarf::DW_TAG_inheritance
1346 && DT.isVirtual()) {
1348 // For C++, virtual base classes are not at fixed offset. Use following
1349 // expression to extract appropriate offset from vtable.
1350 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1352 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1353 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1354 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1355 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1356 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1357 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1358 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1359 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1361 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1364 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1366 if (DT.isProtected())
1367 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1368 dwarf::DW_ACCESS_protected);
1369 else if (DT.isPrivate())
1370 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1371 dwarf::DW_ACCESS_private);
1372 // Otherwise C++ member and base classes are considered public.
1373 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1374 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1375 dwarf::DW_ACCESS_public);
1377 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1378 dwarf::DW_VIRTUALITY_virtual);
1382 /// createSubprogramDIE - Create new DIE using SP.
1383 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
1384 CompileUnit *SPCU = getCompileUnit(SP);
1385 DIE *SPDie = SPCU->getDIE(SP);
1389 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1390 // Constructors and operators for anonymous aggregates do not have names.
1391 if (!SP.getName().empty())
1392 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1394 StringRef LinkageName = SP.getLinkageName();
1395 if (!LinkageName.empty())
1396 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1397 getRealLinkageName(LinkageName));
1399 addSourceLine(SPDie, SP);
1401 if (SP.isPrototyped())
1402 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1405 DICompositeType SPTy = SP.getType();
1406 DIArray Args = SPTy.getTypeArray();
1407 unsigned SPTag = SPTy.getTag();
1409 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1410 addType(SPDie, SPTy);
1412 addType(SPDie, DIType(Args.getElement(0)));
1414 unsigned VK = SP.getVirtuality();
1416 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1417 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1418 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1419 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1420 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1421 ContainingTypeMap.insert(std::make_pair(SPDie,
1422 SP.getContainingType()));
1425 if (!SP.isDefinition()) {
1426 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1428 // Add arguments. Do not add arguments for subprogram definition. They will
1429 // be handled while processing variables.
1430 DICompositeType SPTy = SP.getType();
1431 DIArray Args = SPTy.getTypeArray();
1432 unsigned SPTag = SPTy.getTag();
1434 if (SPTag == dwarf::DW_TAG_subroutine_type)
1435 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1436 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1437 DIType ATy = DIType(DIType(Args.getElement(i)));
1439 if (ATy.isArtificial())
1440 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1441 SPDie->addChild(Arg);
1445 if (SP.isArtificial())
1446 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1448 if (!SP.isLocalToUnit())
1449 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1451 if (SP.isOptimized())
1452 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1454 if (unsigned isa = Asm->getISAEncoding()) {
1455 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1458 // Add function template parameters.
1459 addTemplateParams(*SPDie, SP.getTemplateParams());
1461 // DW_TAG_inlined_subroutine may refer to this DIE.
1462 SPCU->insertDIE(SP, SPDie);
1464 // Add to context owner.
1465 addToContextOwner(SPDie, SP.getContext());
1470 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1471 assert(N && "Invalid Scope encoding!");
1473 DbgScope *AScope = AbstractScopes.lookup(N);
1477 DbgScope *Parent = NULL;
1479 DIDescriptor Scope(N);
1480 if (Scope.isLexicalBlock()) {
1481 DILexicalBlock DB(N);
1482 DIDescriptor ParentDesc = DB.getContext();
1483 Parent = getOrCreateAbstractScope(ParentDesc);
1486 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1489 Parent->addScope(AScope);
1490 AScope->setAbstractScope();
1491 AbstractScopes[N] = AScope;
1492 if (DIDescriptor(N).isSubprogram())
1493 AbstractScopesList.push_back(AScope);
1497 /// isSubprogramContext - Return true if Context is either a subprogram
1498 /// or another context nested inside a subprogram.
1499 static bool isSubprogramContext(const MDNode *Context) {
1502 DIDescriptor D(Context);
1503 if (D.isSubprogram())
1506 return isSubprogramContext(DIType(Context).getContext());
1510 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1511 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1512 /// If there are global variables in this scope then create and insert
1513 /// DIEs for these variables.
1514 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1515 CompileUnit *SPCU = getCompileUnit(SPNode);
1516 DIE *SPDie = SPCU->getDIE(SPNode);
1518 assert(SPDie && "Unable to find subprogram DIE!");
1519 DISubprogram SP(SPNode);
1521 // There is not any need to generate specification DIE for a function
1522 // defined at compile unit level. If a function is defined inside another
1523 // function then gdb prefers the definition at top level and but does not
1524 // expect specification DIE in parent function. So avoid creating
1525 // specification DIE for a function defined inside a function.
1526 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1527 !SP.getContext().isFile() &&
1528 !isSubprogramContext(SP.getContext())) {
1529 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1532 DICompositeType SPTy = SP.getType();
1533 DIArray Args = SPTy.getTypeArray();
1534 unsigned SPTag = SPTy.getTag();
1535 if (SPTag == dwarf::DW_TAG_subroutine_type)
1536 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1537 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1538 DIType ATy = DIType(DIType(Args.getElement(i)));
1540 if (ATy.isArtificial())
1541 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1542 SPDie->addChild(Arg);
1544 DIE *SPDeclDie = SPDie;
1545 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1546 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1548 SPCU->addDie(SPDie);
1551 // Pick up abstract subprogram DIE.
1552 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1553 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1554 addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1555 dwarf::DW_FORM_ref4, AbsSPDIE);
1556 SPCU->addDie(SPDie);
1559 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1560 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1561 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1562 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1563 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1564 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1565 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1570 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1571 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1572 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1574 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1575 if (Scope->isAbstractScope())
1578 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1582 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1583 if (Ranges.size() > 1) {
1584 // .debug_range section has not been laid out yet. Emit offset in
1585 // .debug_range as a uint, size 4, for now. emitDIE will handle
1586 // DW_AT_ranges appropriately.
1587 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1588 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1589 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1590 RE = Ranges.end(); RI != RE; ++RI) {
1591 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1592 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1594 DebugRangeSymbols.push_back(NULL);
1595 DebugRangeSymbols.push_back(NULL);
1599 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1600 const MCSymbol *End = getLabelAfterInsn(RI->second);
1602 if (End == 0) return 0;
1604 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1605 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1607 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1608 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1613 /// constructInlinedScopeDIE - This scope represents inlined body of
1614 /// a function. Construct DIE to represent this concrete inlined copy
1615 /// of the function.
1616 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1618 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1619 assert (Ranges.empty() == false
1620 && "DbgScope does not have instruction markers!");
1622 // FIXME : .debug_inlined section specification does not clearly state how
1623 // to emit inlined scope that is split into multiple instruction ranges.
1624 // For now, use first instruction range and emit low_pc/high_pc pair and
1625 // corresponding .debug_inlined section entry for this pair.
1626 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1627 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1628 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1630 if (StartLabel == 0 || EndLabel == 0) {
1631 assert (0 && "Unexpected Start and End labels for a inlined scope!");
1634 assert(StartLabel->isDefined() &&
1635 "Invalid starting label for an inlined scope!");
1636 assert(EndLabel->isDefined() &&
1637 "Invalid end label for an inlined scope!");
1639 if (!Scope->getScopeNode())
1641 DIScope DS(Scope->getScopeNode());
1642 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1644 DISubprogram InlinedSP = getDISubprogram(DS);
1645 CompileUnit *TheCU = getCompileUnit(InlinedSP);
1646 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1647 assert(OriginDIE && "Unable to find Origin DIE!");
1648 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1649 dwarf::DW_FORM_ref4, OriginDIE);
1651 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1652 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1654 InlinedSubprogramDIEs.insert(OriginDIE);
1656 // Track the start label for this inlined function.
1657 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1658 I = InlineInfo.find(InlinedSP);
1660 if (I == InlineInfo.end()) {
1661 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1663 InlinedSPNodes.push_back(InlinedSP);
1665 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1667 DILocation DL(Scope->getInlinedAt());
1668 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1669 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1675 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1676 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1677 StringRef Name = DV->getName();
1681 // Translate tag to proper Dwarf tag. The result variable is dropped for
1684 switch (DV->getTag()) {
1685 case dwarf::DW_TAG_return_variable:
1687 case dwarf::DW_TAG_arg_variable:
1688 Tag = dwarf::DW_TAG_formal_parameter;
1690 case dwarf::DW_TAG_auto_variable: // fall thru
1692 Tag = dwarf::DW_TAG_variable;
1696 // Define variable debug information entry.
1697 DIE *VariableDie = new DIE(Tag);
1700 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1701 V2AVI = VarToAbstractVarMap.find(DV);
1702 if (V2AVI != VarToAbstractVarMap.end())
1703 AbsDIE = V2AVI->second->getDIE();
1706 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1707 dwarf::DW_FORM_ref4, AbsDIE);
1709 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1710 addSourceLine(VariableDie, DV->getVariable());
1712 // Add variable type.
1713 addType(VariableDie, DV->getType());
1716 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
1717 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1718 else if (DIVariable(DV->getVariable()).isArtificial())
1719 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1721 if (Scope->isAbstractScope()) {
1722 DV->setDIE(VariableDie);
1726 // Add variable address.
1728 unsigned Offset = DV->getDotDebugLocOffset();
1729 if (Offset != ~0U) {
1730 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1731 Asm->GetTempSymbol("debug_loc", Offset));
1732 DV->setDIE(VariableDie);
1733 UseDotDebugLocEntry.insert(VariableDie);
1737 // Check if variable is described by a DBG_VALUE instruction.
1738 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1739 DbgVariableToDbgInstMap.find(DV);
1740 if (DVI != DbgVariableToDbgInstMap.end()) {
1741 const MachineInstr *DVInsn = DVI->second;
1742 bool updated = false;
1743 // FIXME : Handle getNumOperands != 3
1744 if (DVInsn->getNumOperands() == 3) {
1745 if (DVInsn->getOperand(0).isReg()) {
1746 const MachineOperand RegOp = DVInsn->getOperand(0);
1747 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1748 if (DVInsn->getOperand(1).isImm() &&
1749 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1750 addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
1753 updated = addRegisterAddress(VariableDie, RegOp);
1755 else if (DVInsn->getOperand(0).isImm())
1756 updated = addConstantValue(VariableDie, DVInsn->getOperand(0));
1757 else if (DVInsn->getOperand(0).isFPImm())
1759 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1761 MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1762 if (Location.getReg()) {
1763 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1768 // If variableDie is not updated then DBG_VALUE instruction does not
1769 // have valid variable info.
1773 DV->setDIE(VariableDie);
1777 // .. else use frame index, if available.
1779 if (findVariableFrameIndex(DV, &FI))
1780 addVariableAddress(DV, VariableDie, FI);
1782 DV->setDIE(VariableDie);
1787 void DwarfDebug::addPubTypes(DISubprogram SP) {
1788 DICompositeType SPTy = SP.getType();
1789 unsigned SPTag = SPTy.getTag();
1790 if (SPTag != dwarf::DW_TAG_subroutine_type)
1793 DIArray Args = SPTy.getTypeArray();
1794 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1795 DIType ATy(Args.getElement(i));
1798 DICompositeType CATy = getDICompositeType(ATy);
1799 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1800 && !CATy.isForwardDecl()) {
1801 CompileUnit *TheCU = getCompileUnit(CATy);
1802 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1803 TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1808 /// constructScopeDIE - Construct a DIE for this scope.
1809 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1810 if (!Scope || !Scope->getScopeNode())
1813 SmallVector <DIE *, 8> Children;
1815 // Collect arguments for current function.
1816 if (Scope == CurrentFnDbgScope)
1817 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
1818 if (DbgVariable *ArgDV = CurrentFnArguments[i])
1819 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
1820 Children.push_back(Arg);
1822 // Collect lexical scope childrens first.
1823 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1824 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1825 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1826 Children.push_back(Variable);
1827 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1828 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1829 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1830 Children.push_back(Nested);
1831 DIScope DS(Scope->getScopeNode());
1832 DIE *ScopeDIE = NULL;
1833 if (Scope->getInlinedAt())
1834 ScopeDIE = constructInlinedScopeDIE(Scope);
1835 else if (DS.isSubprogram()) {
1836 ProcessedSPNodes.insert(DS);
1837 if (Scope->isAbstractScope()) {
1838 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1839 // Note down abstract DIE.
1841 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1844 ScopeDIE = updateSubprogramScopeDIE(DS);
1847 // There is no need to emit empty lexical block DIE.
1848 if (Children.empty())
1850 ScopeDIE = constructLexicalScopeDIE(Scope);
1853 if (!ScopeDIE) return NULL;
1856 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1857 E = Children.end(); I != E; ++I)
1858 ScopeDIE->addChild(*I);
1860 if (DS.isSubprogram())
1861 addPubTypes(DISubprogram(DS));
1866 /// GetOrCreateSourceID - Look up the source id with the given directory and
1867 /// source file names. If none currently exists, create a new id and insert it
1868 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1871 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
1872 StringRef DirName) {
1873 // If FE did not provide a file name, then assume stdin.
1874 if (FileName.empty())
1875 return GetOrCreateSourceID("<stdin>", StringRef());
1877 // MCStream expects full path name as filename.
1878 if (!DirName.empty() && !FileName.startswith("/")) {
1879 std::string FullPathName(DirName.data());
1880 if (!DirName.endswith("/"))
1881 FullPathName += "/";
1882 FullPathName += FileName.data();
1883 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
1884 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
1887 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1888 if (Entry.getValue())
1889 return Entry.getValue();
1891 unsigned SrcId = SourceIdMap.size();
1892 Entry.setValue(SrcId);
1894 // Print out a .file directive to specify files for .loc directives.
1895 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
1900 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1901 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1902 CompileUnit *TheCU = getCompileUnit(NS);
1903 DIE *NDie = TheCU->getDIE(NS);
1906 NDie = new DIE(dwarf::DW_TAG_namespace);
1907 TheCU->insertDIE(NS, NDie);
1908 if (!NS.getName().empty())
1909 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1910 addSourceLine(NDie, NS);
1911 addToContextOwner(NDie, NS.getContext());
1915 /// constructCompileUnit - Create new CompileUnit for the given
1916 /// metadata node with tag DW_TAG_compile_unit.
1917 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1918 DICompileUnit DIUnit(N);
1919 StringRef FN = DIUnit.getFilename();
1920 StringRef Dir = DIUnit.getDirectory();
1921 unsigned ID = GetOrCreateSourceID(FN, Dir);
1923 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1924 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1925 DIUnit.getProducer());
1926 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
1927 DIUnit.getLanguage());
1928 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1929 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1930 // simplifies debug range entries.
1931 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1932 // DW_AT_stmt_list is a offset of line number information for this
1933 // compile unit in debug_line section.
1934 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
1935 addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1936 Asm->GetTempSymbol("section_line"));
1938 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1941 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1942 if (DIUnit.isOptimized())
1943 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1945 StringRef Flags = DIUnit.getFlags();
1947 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1949 unsigned RVer = DIUnit.getRunTimeVersion();
1951 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1952 dwarf::DW_FORM_data1, RVer);
1954 CompileUnit *NewCU = new CompileUnit(ID, Die);
1957 CUMap.insert(std::make_pair(N, NewCU));
1960 /// getCompielUnit - Get CompileUnit DIE.
1961 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1962 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1964 const MDNode *CUNode = NULL;
1965 if (D.isCompileUnit())
1967 else if (D.isSubprogram())
1968 CUNode = DISubprogram(N).getCompileUnit();
1969 else if (D.isType())
1970 CUNode = DIType(N).getCompileUnit();
1971 else if (D.isGlobalVariable())
1972 CUNode = DIGlobalVariable(N).getCompileUnit();
1973 else if (D.isVariable())
1974 CUNode = DIVariable(N).getCompileUnit();
1975 else if (D.isNameSpace())
1976 CUNode = DINameSpace(N).getCompileUnit();
1977 else if (D.isFile())
1978 CUNode = DIFile(N).getCompileUnit();
1982 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1983 = CUMap.find(CUNode);
1984 if (I == CUMap.end())
1989 /// isUnsignedDIType - Return true if type encoding is unsigned.
1990 static bool isUnsignedDIType(DIType Ty) {
1991 DIDerivedType DTy(Ty);
1993 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1995 DIBasicType BTy(Ty);
1997 unsigned Encoding = BTy.getEncoding();
1998 if (Encoding == dwarf::DW_ATE_unsigned ||
1999 Encoding == dwarf::DW_ATE_unsigned_char)
2005 // Return const exprssion if value is a GEP to access merged global
2007 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
2008 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
2009 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
2010 if (!CE || CE->getNumOperands() != 3 ||
2011 CE->getOpcode() != Instruction::GetElementPtr)
2014 // First operand points to a global value.
2015 if (!isa<GlobalValue>(CE->getOperand(0)))
2018 // Second operand is zero.
2019 const ConstantInt *CI =
2020 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2021 if (!CI || !CI->isZero())
2024 // Third operand is offset.
2025 if (!isa<ConstantInt>(CE->getOperand(2)))
2031 /// constructGlobalVariableDIE - Construct global variable DIE.
2032 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
2033 DIGlobalVariable GV(N);
2035 // If debug information is malformed then ignore it.
2036 if (GV.Verify() == false)
2039 // Check for pre-existence.
2040 CompileUnit *TheCU = getCompileUnit(N);
2041 if (TheCU->getDIE(GV))
2044 DIType GTy = GV.getType();
2045 DIE *VariableDIE = new DIE(GV.getTag());
2047 bool isGlobalVariable = GV.getGlobal() != NULL;
2050 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2051 GV.getDisplayName());
2052 StringRef LinkageName = GV.getLinkageName();
2053 if (!LinkageName.empty() && isGlobalVariable)
2054 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2055 getRealLinkageName(LinkageName));
2057 addType(VariableDIE, GTy);
2058 if (GTy.isCompositeType() && !GTy.getName().empty()
2059 && !GTy.isForwardDecl()) {
2060 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
2061 assert(Entry && "Missing global type!");
2062 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
2064 // Add scoping info.
2065 if (!GV.isLocalToUnit()) {
2066 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2067 // Expose as global.
2068 TheCU->addGlobal(GV.getName(), VariableDIE);
2070 // Add line number info.
2071 addSourceLine(VariableDIE, GV);
2073 TheCU->insertDIE(N, VariableDIE);
2074 // Add to context owner.
2075 DIDescriptor GVContext = GV.getContext();
2076 addToContextOwner(VariableDIE, GVContext);
2078 if (isGlobalVariable) {
2079 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2080 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2081 addLabel(Block, 0, dwarf::DW_FORM_udata,
2082 Asm->Mang->getSymbol(GV.getGlobal()));
2083 // Do not create specification DIE if context is either compile unit
2085 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2086 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2087 // Create specification DIE.
2088 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2089 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2090 dwarf::DW_FORM_ref4, VariableDIE);
2091 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2092 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2093 TheCU->addDie(VariableSpecDIE);
2095 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2097 } else if (ConstantInt *CI =
2098 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2099 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
2100 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2101 // GV is a merged global.
2102 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2103 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2104 addLabel(Block, 0, dwarf::DW_FORM_udata,
2105 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2106 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2107 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2108 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2109 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2110 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2116 /// construct SubprogramDIE - Construct subprogram DIE.
2117 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
2120 // Check for pre-existence.
2121 CompileUnit *TheCU = getCompileUnit(N);
2122 if (TheCU->getDIE(N))
2125 if (!SP.isDefinition())
2126 // This is a method declaration which will be handled while constructing
2130 DIE *SubprogramDie = createSubprogramDIE(SP);
2133 TheCU->insertDIE(N, SubprogramDie);
2135 // Add to context owner.
2136 addToContextOwner(SubprogramDie, SP.getContext());
2138 // Expose as global.
2139 TheCU->addGlobal(SP.getName(), SubprogramDie);
2144 /// beginModule - Emit all Dwarf sections that should come prior to the
2145 /// content. Create global DIEs and emit initial debug info sections.
2146 /// This is inovked by the target AsmPrinter.
2147 void DwarfDebug::beginModule(Module *M) {
2148 if (DisableDebugInfoPrinting)
2151 DebugInfoFinder DbgFinder;
2152 DbgFinder.processModule(*M);
2154 bool HasDebugInfo = false;
2156 // Scan all the compile-units to see if there are any marked as the main unit.
2157 // if not, we do not generate debug info.
2158 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2159 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2160 if (DICompileUnit(*I).isMain()) {
2161 HasDebugInfo = true;
2166 if (!HasDebugInfo) return;
2168 // Tell MMI that we have debug info.
2169 MMI->setDebugInfoAvailability(true);
2171 // Emit initial sections.
2172 EmitSectionLabels();
2174 // Create all the compile unit DIEs.
2175 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2176 E = DbgFinder.compile_unit_end(); I != E; ++I)
2177 constructCompileUnit(*I);
2179 // Create DIEs for each subprogram.
2180 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2181 E = DbgFinder.subprogram_end(); I != E; ++I)
2182 constructSubprogramDIE(*I);
2184 // Create DIEs for each global variable.
2185 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2186 E = DbgFinder.global_variable_end(); I != E; ++I)
2187 constructGlobalVariableDIE(*I);
2189 //getOrCreateTypeDIE
2190 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2191 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2192 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2194 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2195 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2196 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2198 // Prime section data.
2199 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2202 /// endModule - Emit all Dwarf sections that should come after the content.
2204 void DwarfDebug::endModule() {
2205 if (!FirstCU) return;
2206 const Module *M = MMI->getModule();
2207 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2208 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2209 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2210 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2211 DISubprogram SP(AllSPs->getOperand(SI));
2212 if (!SP.Verify()) continue;
2214 // Collect info for variables that were optimized out.
2215 if (!SP.isDefinition()) continue;
2216 StringRef FName = SP.getLinkageName();
2218 FName = SP.getName();
2219 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
2221 unsigned E = NMD->getNumOperands();
2223 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2224 DeadFnScopeMap[SP] = Scope;
2225 for (unsigned I = 0; I != E; ++I) {
2226 DIVariable DV(NMD->getOperand(I));
2227 if (!DV.Verify()) continue;
2228 Scope->addVariable(new DbgVariable(DV));
2231 // Construct subprogram DIE and add variables DIEs.
2232 constructSubprogramDIE(SP);
2233 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2234 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2235 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2236 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2238 ScopeDIE->addChild(VariableDIE);
2243 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2244 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2245 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2247 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2250 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2251 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2252 DIE *SPDie = CI->first;
2253 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2255 DIE *NDie = getCompileUnit(N)->getDIE(N);
2256 if (!NDie) continue;
2257 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2260 // Standard sections final addresses.
2261 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2262 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2263 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2264 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2266 // End text sections.
2267 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2268 Asm->OutStreamer.SwitchSection(SectionMap[i]);
2269 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2272 // Emit common frame information.
2273 emitCommonDebugFrame();
2275 // Emit function debug frame information
2276 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2277 E = DebugFrames.end(); I != E; ++I)
2278 emitFunctionDebugFrame(*I);
2280 // Compute DIE offsets and sizes.
2281 computeSizeAndOffsets();
2283 // Emit all the DIEs into a debug info section
2286 // Corresponding abbreviations into a abbrev section.
2287 emitAbbreviations();
2289 // Emit info into a debug pubnames section.
2290 emitDebugPubNames();
2292 // Emit info into a debug pubtypes section.
2293 emitDebugPubTypes();
2295 // Emit info into a debug loc section.
2298 // Emit info into a debug aranges section.
2301 // Emit info into a debug ranges section.
2304 // Emit info into a debug macinfo section.
2307 // Emit inline info.
2308 emitDebugInlineInfo();
2310 // Emit info into a debug str section.
2314 DeleteContainerSeconds(DeadFnScopeMap);
2315 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2316 E = CUMap.end(); I != E; ++I)
2318 FirstCU = NULL; // Reset for the next Module, if any.
2321 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2322 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2323 DebugLoc ScopeLoc) {
2325 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2327 return AbsDbgVariable;
2329 LLVMContext &Ctx = Var->getContext();
2330 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2334 AbsDbgVariable = new DbgVariable(Var);
2335 Scope->addVariable(AbsDbgVariable);
2336 AbstractVariables[Var] = AbsDbgVariable;
2337 return AbsDbgVariable;
2340 /// addCurrentFnArgument - If Var is an current function argument that add
2341 /// it in CurrentFnArguments list.
2342 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
2343 DbgVariable *Var, DbgScope *Scope) {
2344 if (Scope != CurrentFnDbgScope)
2346 DIVariable DV = Var->getVariable();
2347 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2349 unsigned ArgNo = DV.getArgNumber();
2353 size_t Size = CurrentFnArguments.size();
2355 CurrentFnArguments.resize(MF->getFunction()->arg_size());
2356 // llvm::Function argument size is not good indicator of how many
2357 // arguments does the function have at source level.
2359 CurrentFnArguments.resize(ArgNo * 2);
2360 CurrentFnArguments[ArgNo - 1] = Var;
2364 /// collectVariableInfoFromMMITable - Collect variable information from
2365 /// side table maintained by MMI.
2367 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2368 SmallPtrSet<const MDNode *, 16> &Processed) {
2369 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2370 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2371 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2372 VE = VMap.end(); VI != VE; ++VI) {
2373 const MDNode *Var = VI->first;
2375 Processed.insert(Var);
2377 const std::pair<unsigned, DebugLoc> &VP = VI->second;
2379 DbgScope *Scope = 0;
2380 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2381 Scope = ConcreteScopes.lookup(IA);
2383 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2385 // If variable scope is not found then skip this variable.
2389 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2390 DbgVariable *RegVar = new DbgVariable(DV);
2391 recordVariableFrameIndex(RegVar, VP.first);
2392 if (!addCurrentFnArgument(MF, RegVar, Scope))
2393 Scope->addVariable(RegVar);
2394 if (AbsDbgVariable) {
2395 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2396 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2401 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2402 /// DBG_VALUE instruction, is in a defined reg.
2403 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2404 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2405 return MI->getNumOperands() == 3 &&
2406 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
2407 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
2410 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2412 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2413 SmallPtrSet<const MDNode *, 16> &Processed) {
2415 /// collection info from MMI table.
2416 collectVariableInfoFromMMITable(MF, Processed);
2418 for (SmallVectorImpl<const MDNode*>::const_iterator
2419 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
2421 const MDNode *Var = *UVI;
2422 if (Processed.count(Var))
2425 // History contains relevant DBG_VALUE instructions for Var and instructions
2427 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2428 if (History.empty())
2430 const MachineInstr *MInsn = History.front();
2433 DbgScope *Scope = NULL;
2434 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2435 DISubprogram(DV.getContext()).describes(MF->getFunction()))
2436 Scope = CurrentFnDbgScope;
2438 Scope = findDbgScope(MInsn);
2439 // If variable scope is not found then skip this variable.
2443 Processed.insert(DV);
2444 assert(MInsn->isDebugValue() && "History must begin with debug value");
2445 DbgVariable *RegVar = new DbgVariable(DV);
2446 if (!addCurrentFnArgument(MF, RegVar, Scope))
2447 Scope->addVariable(RegVar);
2448 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2449 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2450 VarToAbstractVarMap[RegVar] = AbsVar;
2453 // Simple ranges that are fully coalesced.
2454 if (History.size() <= 1 || (History.size() == 2 &&
2455 MInsn->isIdenticalTo(History.back()))) {
2456 DbgVariableToDbgInstMap[RegVar] = MInsn;
2460 // handle multiple DBG_VALUE instructions describing one variable.
2461 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2463 for (SmallVectorImpl<const MachineInstr*>::const_iterator
2464 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
2465 const MachineInstr *Begin = *HI;
2466 assert(Begin->isDebugValue() && "Invalid History entry");
2467 MachineLocation MLoc;
2468 if (Begin->getNumOperands() == 3) {
2469 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2470 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2472 MLoc = Asm->getDebugValueLocation(Begin);
2474 // FIXME: emitDebugLoc only understands registers.
2478 // Compute the range for a register location.
2479 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2480 const MCSymbol *SLabel = 0;
2483 // If Begin is the last instruction in History then its value is valid
2484 // until the end of the funtion.
2485 SLabel = FunctionEndSym;
2487 const MachineInstr *End = HI[1];
2488 if (End->isDebugValue())
2489 SLabel = getLabelBeforeInsn(End);
2491 // End is a normal instruction clobbering the range.
2492 SLabel = getLabelAfterInsn(End);
2493 assert(SLabel && "Forgot label after clobber instruction");
2498 // The value is valid until the next DBG_VALUE or clobber.
2499 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2501 DotDebugLocEntries.push_back(DotDebugLocEntry());
2504 // Collect info for variables that were optimized out.
2505 const Function *F = MF->getFunction();
2506 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
2507 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2508 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2509 if (!DV || !Processed.insert(DV))
2511 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2513 Scope->addVariable(new DbgVariable(DV));
2518 /// getLabelBeforeInsn - Return Label preceding the instruction.
2519 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2520 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
2521 assert(Label && "Didn't insert label before instruction");
2525 /// getLabelAfterInsn - Return Label immediately following the instruction.
2526 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2527 return LabelsAfterInsn.lookup(MI);
2530 /// beginInstruction - Process beginning of an instruction.
2531 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
2532 // Check if source location changes, but ignore DBG_VALUE locations.
2533 if (!MI->isDebugValue()) {
2534 DebugLoc DL = MI->getDebugLoc();
2535 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
2537 if (!DL.isUnknown()) {
2538 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2539 recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2541 recordSourceLine(0, 0, 0);
2545 // Insert labels where requested.
2546 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2547 LabelsBeforeInsn.find(MI);
2550 if (I == LabelsBeforeInsn.end())
2553 // Label already assigned.
2558 PrevLabel = MMI->getContext().CreateTempSymbol();
2559 Asm->OutStreamer.EmitLabel(PrevLabel);
2561 I->second = PrevLabel;
2564 /// endInstruction - Process end of an instruction.
2565 void DwarfDebug::endInstruction(const MachineInstr *MI) {
2566 // Don't create a new label after DBG_VALUE instructions.
2567 // They don't generate code.
2568 if (!MI->isDebugValue())
2571 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2572 LabelsAfterInsn.find(MI);
2575 if (I == LabelsAfterInsn.end())
2578 // Label already assigned.
2582 // We need a label after this instruction.
2584 PrevLabel = MMI->getContext().CreateTempSymbol();
2585 Asm->OutStreamer.EmitLabel(PrevLabel);
2587 I->second = PrevLabel;
2590 /// getOrCreateDbgScope - Create DbgScope for the scope.
2591 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2592 const MDNode *InlinedAt) {
2594 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2597 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2598 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2599 if (DIDescriptor(Scope).isLexicalBlock()) {
2601 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2602 WScope->setParent(Parent);
2603 Parent->addScope(WScope);
2606 if (!WScope->getParent()) {
2607 StringRef SPName = DISubprogram(Scope).getLinkageName();
2608 // We used to check only for a linkage name, but that fails
2609 // since we began omitting the linkage name for private
2610 // functions. The new way is to check for the name in metadata,
2611 // but that's not supported in old .ll test cases. Ergo, we
2613 if (SPName == Asm->MF->getFunction()->getName() ||
2614 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2615 CurrentFnDbgScope = WScope;
2621 getOrCreateAbstractScope(Scope);
2622 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2626 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2627 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2628 DILocation DL(InlinedAt);
2630 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2631 WScope->setParent(Parent);
2632 Parent->addScope(WScope);
2634 ConcreteScopes[InlinedAt] = WScope;
2639 /// hasValidLocation - Return true if debug location entry attached with
2640 /// machine instruction encodes valid location info.
2641 static bool hasValidLocation(LLVMContext &Ctx,
2642 const MachineInstr *MInsn,
2643 const MDNode *&Scope, const MDNode *&InlinedAt) {
2644 DebugLoc DL = MInsn->getDebugLoc();
2645 if (DL.isUnknown()) return false;
2647 const MDNode *S = DL.getScope(Ctx);
2649 // There is no need to create another DIE for compile unit. For all
2650 // other scopes, create one DbgScope now. This will be translated
2651 // into a scope DIE at the end.
2652 if (DIScope(S).isCompileUnit()) return false;
2655 InlinedAt = DL.getInlinedAt(Ctx);
2659 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2661 static void calculateDominanceGraph(DbgScope *Scope) {
2662 assert (Scope && "Unable to calculate scop edominance graph!");
2663 SmallVector<DbgScope *, 4> WorkStack;
2664 WorkStack.push_back(Scope);
2665 unsigned Counter = 0;
2666 while (!WorkStack.empty()) {
2667 DbgScope *WS = WorkStack.back();
2668 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2669 bool visitedChildren = false;
2670 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2671 SE = Children.end(); SI != SE; ++SI) {
2672 DbgScope *ChildScope = *SI;
2673 if (!ChildScope->getDFSOut()) {
2674 WorkStack.push_back(ChildScope);
2675 visitedChildren = true;
2676 ChildScope->setDFSIn(++Counter);
2680 if (!visitedChildren) {
2681 WorkStack.pop_back();
2682 WS->setDFSOut(++Counter);
2687 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2689 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2690 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2693 unsigned PrevDFSIn = 0;
2694 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2696 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2698 const MachineInstr *MInsn = II;
2699 const MDNode *Scope = NULL;
2700 const MDNode *InlinedAt = NULL;
2702 // Check if instruction has valid location information.
2703 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2707 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2708 MI2ScopeMap.find(MInsn);
2709 if (DI != MI2ScopeMap.end()) {
2710 DbgScope *S = DI->second;
2711 dbgs() << S->getDFSIn();
2712 PrevDFSIn = S->getDFSIn();
2714 dbgs() << PrevDFSIn;
2716 dbgs() << " [ x" << PrevDFSIn;
2724 /// extractScopeInformation - Scan machine instructions in this function
2725 /// and collect DbgScopes. Return true, if at least one scope was found.
2726 bool DwarfDebug::extractScopeInformation() {
2727 // If scope information was extracted using .dbg intrinsics then there is not
2728 // any need to extract these information by scanning each instruction.
2729 if (!DbgScopeMap.empty())
2732 // Scan each instruction and create scopes. First build working set of scopes.
2733 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2734 SmallVector<DbgRange, 4> MIRanges;
2735 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2736 const MDNode *PrevScope = NULL;
2737 const MDNode *PrevInlinedAt = NULL;
2738 const MachineInstr *RangeBeginMI = NULL;
2739 const MachineInstr *PrevMI = NULL;
2740 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2742 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2744 const MachineInstr *MInsn = II;
2745 const MDNode *Scope = NULL;
2746 const MDNode *InlinedAt = NULL;
2748 // Check if instruction has valid location information.
2749 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2754 // If scope has not changed then skip this instruction.
2755 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2760 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2761 if (MInsn->isDebugValue())
2765 // If we have alread seen a beginning of a instruction range and
2766 // current instruction scope does not match scope of first instruction
2767 // in this range then create a new instruction range.
2768 DbgRange R(RangeBeginMI, PrevMI);
2769 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2771 MIRanges.push_back(R);
2774 // This is a beginning of a new instruction range.
2775 RangeBeginMI = MInsn;
2777 // Reset previous markers.
2780 PrevInlinedAt = InlinedAt;
2784 // Create last instruction range.
2785 if (RangeBeginMI && PrevMI && PrevScope) {
2786 DbgRange R(RangeBeginMI, PrevMI);
2787 MIRanges.push_back(R);
2788 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2791 if (!CurrentFnDbgScope)
2794 calculateDominanceGraph(CurrentFnDbgScope);
2796 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2798 // Find ranges of instructions covered by each DbgScope;
2799 DbgScope *PrevDbgScope = NULL;
2800 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2801 RE = MIRanges.end(); RI != RE; ++RI) {
2802 const DbgRange &R = *RI;
2803 DbgScope *S = MI2ScopeMap.lookup(R.first);
2804 assert (S && "Lost DbgScope for a machine instruction!");
2805 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2806 PrevDbgScope->closeInsnRange(S);
2807 S->openInsnRange(R.first);
2808 S->extendInsnRange(R.second);
2813 PrevDbgScope->closeInsnRange();
2815 identifyScopeMarkers();
2817 return !DbgScopeMap.empty();
2820 /// identifyScopeMarkers() -
2821 /// Each DbgScope has first instruction and last instruction to mark beginning
2822 /// and end of a scope respectively. Create an inverse map that list scopes
2823 /// starts (and ends) with an instruction. One instruction may start (or end)
2824 /// multiple scopes. Ignore scopes that are not reachable.
2825 void DwarfDebug::identifyScopeMarkers() {
2826 SmallVector<DbgScope *, 4> WorkList;
2827 WorkList.push_back(CurrentFnDbgScope);
2828 while (!WorkList.empty()) {
2829 DbgScope *S = WorkList.pop_back_val();
2831 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2832 if (!Children.empty())
2833 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2834 SE = Children.end(); SI != SE; ++SI)
2835 WorkList.push_back(*SI);
2837 if (S->isAbstractScope())
2840 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2843 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2844 RE = Ranges.end(); RI != RE; ++RI) {
2845 assert(RI->first && "DbgRange does not have first instruction!");
2846 assert(RI->second && "DbgRange does not have second instruction!");
2847 requestLabelBeforeInsn(RI->first);
2848 requestLabelAfterInsn(RI->second);
2853 /// FindFirstDebugLoc - Find the first debug location in the function. This
2854 /// is intended to be an approximation for the source position of the
2855 /// beginning of the function.
2856 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2857 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2859 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2860 MBBI != MBBE; ++MBBI) {
2861 DebugLoc DL = MBBI->getDebugLoc();
2862 if (!DL.isUnknown())
2869 /// CheckLineNumbers - Count basicblocks whose instructions do not have any
2870 /// line number information.
2871 static void CheckLineNumbers(const MachineFunction *MF) {
2872 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2874 bool FoundLineNo = false;
2875 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2877 const MachineInstr *MI = II;
2878 if (!MI->getDebugLoc().isUnknown()) {
2883 if (!FoundLineNo && I->size())
2884 ++BlocksWithoutLineNo;
2889 /// beginFunction - Gather pre-function debug information. Assumes being
2890 /// emitted immediately after the function entry point.
2891 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2892 if (!MMI->hasDebugInfo()) return;
2893 if (!extractScopeInformation()) return;
2896 CheckLineNumbers(MF);
2899 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2900 Asm->getFunctionNumber());
2901 // Assumes in correct section after the entry point.
2902 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2904 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2906 DebugLoc FDL = FindFirstDebugLoc(MF);
2907 if (FDL.isUnknown()) return;
2909 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2910 const MDNode *TheScope = 0;
2912 DISubprogram SP = getDISubprogram(Scope);
2915 Line = SP.getLineNumber();
2919 Line = FDL.getLine();
2924 recordSourceLine(Line, Col, TheScope);
2926 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
2928 /// ProcessedArgs - Collection of arguments already processed.
2929 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2931 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
2933 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
2934 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
2936 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2938 bool AtBlockEntry = true;
2939 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2941 const MachineInstr *MI = II;
2943 if (MI->isDebugValue()) {
2944 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2946 // Keep track of user variables.
2948 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
2950 // Variable is in a register, we need to check for clobbers.
2951 if (isDbgValueInDefinedReg(MI))
2952 LiveUserVar[MI->getOperand(0).getReg()] = Var;
2954 // Check the history of this variable.
2955 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2956 if (History.empty()) {
2957 UserVariables.push_back(Var);
2958 // The first mention of a function argument gets the FunctionBeginSym
2959 // label, so arguments are visible when breaking at function entry.
2961 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
2962 DISubprogram(getDISubprogram(DV.getContext()))
2963 .describes(MF->getFunction()))
2964 LabelsBeforeInsn[MI] = FunctionBeginSym;
2966 // We have seen this variable before. Try to coalesce DBG_VALUEs.
2967 const MachineInstr *Prev = History.back();
2968 if (Prev->isDebugValue()) {
2969 // Coalesce identical entries at the end of History.
2970 if (History.size() >= 2 &&
2971 Prev->isIdenticalTo(History[History.size() - 2]))
2974 // Terminate old register assignments that don't reach MI;
2975 MachineFunction::const_iterator PrevMBB = Prev->getParent();
2976 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
2977 isDbgValueInDefinedReg(Prev)) {
2978 // Previous register assignment needs to terminate at the end of
2980 MachineBasicBlock::const_iterator LastMI =
2981 PrevMBB->getLastNonDebugInstr();
2982 if (LastMI == PrevMBB->end())
2983 // Drop DBG_VALUE for empty range.
2986 // Terminate after LastMI.
2987 History.push_back(LastMI);
2992 History.push_back(MI);
2994 // Not a DBG_VALUE instruction.
2996 AtBlockEntry = false;
2998 // Check if the instruction clobbers any registers with debug vars.
2999 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
3000 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
3001 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
3003 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
3004 unsigned Reg = *AI; ++AI) {
3005 const MDNode *Var = LiveUserVar[Reg];
3008 // Reg is now clobbered.
3009 LiveUserVar[Reg] = 0;
3011 // Was MD last defined by a DBG_VALUE referring to Reg?
3012 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
3013 if (HistI == DbgValues.end())
3015 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
3016 if (History.empty())
3018 const MachineInstr *Prev = History.back();
3019 // Sanity-check: Register assignments are terminated at the end of
3021 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
3023 // Is the variable still in Reg?
3024 if (!isDbgValueInDefinedReg(Prev) ||
3025 Prev->getOperand(0).getReg() != Reg)
3027 // Var is clobbered. Make sure the next instruction gets a label.
3028 History.push_back(MI);
3035 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
3037 SmallVectorImpl<const MachineInstr*> &History = I->second;
3038 if (History.empty())
3041 // Make sure the final register assignments are terminated.
3042 const MachineInstr *Prev = History.back();
3043 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
3044 const MachineBasicBlock *PrevMBB = Prev->getParent();
3045 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
3046 if (LastMI == PrevMBB->end())
3047 // Drop DBG_VALUE for empty range.
3050 // Terminate after LastMI.
3051 History.push_back(LastMI);
3054 // Request labels for the full history.
3055 for (unsigned i = 0, e = History.size(); i != e; ++i) {
3056 const MachineInstr *MI = History[i];
3057 if (MI->isDebugValue())
3058 requestLabelBeforeInsn(MI);
3060 requestLabelAfterInsn(MI);
3064 PrevInstLoc = DebugLoc();
3065 PrevLabel = FunctionBeginSym;
3068 /// endFunction - Gather and emit post-function debug information.
3070 void DwarfDebug::endFunction(const MachineFunction *MF) {
3071 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
3073 if (CurrentFnDbgScope) {
3075 // Define end label for subprogram.
3076 FunctionEndSym = Asm->GetTempSymbol("func_end",
3077 Asm->getFunctionNumber());
3078 // Assumes in correct section after the entry point.
3079 Asm->OutStreamer.EmitLabel(FunctionEndSym);
3081 SmallPtrSet<const MDNode *, 16> ProcessedVars;
3082 collectVariableInfo(MF, ProcessedVars);
3084 // Construct abstract scopes.
3085 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
3086 AE = AbstractScopesList.end(); AI != AE; ++AI) {
3087 DISubprogram SP((*AI)->getScopeNode());
3089 // Collect info for variables that were optimized out.
3090 StringRef FName = SP.getLinkageName();
3092 FName = SP.getName();
3093 if (NamedMDNode *NMD =
3094 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
3095 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
3096 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
3097 if (!DV || !ProcessedVars.insert(DV))
3099 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
3101 Scope->addVariable(new DbgVariable(DV));
3105 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
3106 constructScopeDIE(*AI);
3109 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
3111 if (!DisableFramePointerElim(*MF))
3112 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
3113 dwarf::DW_FORM_flag, 1);
3116 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
3117 MMI->getFrameMoves()));
3121 CurrentFnDbgScope = NULL;
3122 CurrentFnArguments.clear();
3123 DbgVariableToFrameIndexMap.clear();
3124 VarToAbstractVarMap.clear();
3125 DbgVariableToDbgInstMap.clear();
3126 DeleteContainerSeconds(DbgScopeMap);
3127 UserVariables.clear();
3129 ConcreteScopes.clear();
3130 DeleteContainerSeconds(AbstractScopes);
3131 AbstractScopesList.clear();
3132 AbstractVariables.clear();
3133 LabelsBeforeInsn.clear();
3134 LabelsAfterInsn.clear();
3138 /// recordVariableFrameIndex - Record a variable's index.
3139 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3140 assert (V && "Invalid DbgVariable!");
3141 DbgVariableToFrameIndexMap[V] = Index;
3144 /// findVariableFrameIndex - Return true if frame index for the variable
3145 /// is found. Update FI to hold value of the index.
3146 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3147 assert (V && "Invalid DbgVariable!");
3148 DenseMap<const DbgVariable *, int>::iterator I =
3149 DbgVariableToFrameIndexMap.find(V);
3150 if (I == DbgVariableToFrameIndexMap.end())
3156 /// findDbgScope - Find DbgScope for the debug loc attached with an
3158 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3159 DbgScope *Scope = NULL;
3161 MInsn->getParent()->getParent()->getFunction()->getContext();
3162 DebugLoc DL = MInsn->getDebugLoc();
3167 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3168 Scope = ConcreteScopes.lookup(IA);
3170 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
3176 /// recordSourceLine - Register a source line with debug info. Returns the
3177 /// unique label that was emitted and which provides correspondence to
3178 /// the source line list.
3179 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){
3184 DIDescriptor Scope(S);
3186 if (Scope.isCompileUnit()) {
3187 DICompileUnit CU(S);
3188 Fn = CU.getFilename();
3189 Dir = CU.getDirectory();
3190 } else if (Scope.isFile()) {
3192 Fn = F.getFilename();
3193 Dir = F.getDirectory();
3194 } else if (Scope.isSubprogram()) {
3196 Fn = SP.getFilename();
3197 Dir = SP.getDirectory();
3198 } else if (Scope.isLexicalBlock()) {
3199 DILexicalBlock DB(S);
3200 Fn = DB.getFilename();
3201 Dir = DB.getDirectory();
3203 assert(0 && "Unexpected scope info");
3205 Src = GetOrCreateSourceID(Fn, Dir);
3208 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3212 //===----------------------------------------------------------------------===//
3214 //===----------------------------------------------------------------------===//
3216 /// computeSizeAndOffset - Compute the size and offset of a DIE.
3219 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
3220 // Get the children.
3221 const std::vector<DIE *> &Children = Die->getChildren();
3223 // If not last sibling and has children then add sibling offset attribute.
3224 if (!Last && !Children.empty())
3225 Die->addSiblingOffset(DIEValueAllocator);
3227 // Record the abbreviation.
3228 assignAbbrevNumber(Die->getAbbrev());
3230 // Get the abbreviation for this DIE.
3231 unsigned AbbrevNumber = Die->getAbbrevNumber();
3232 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3235 Die->setOffset(Offset);
3237 // Start the size with the size of abbreviation code.
3238 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
3240 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3241 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3243 // Size the DIE attribute values.
3244 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3245 // Size attribute value.
3246 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
3248 // Size the DIE children if any.
3249 if (!Children.empty()) {
3250 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3251 "Children flag not set");
3253 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3254 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
3256 // End of children marker.
3257 Offset += sizeof(int8_t);
3260 Die->setSize(Offset - Die->getOffset());
3264 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3266 void DwarfDebug::computeSizeAndOffsets() {
3267 unsigned PrevOffset = 0;
3268 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3269 E = CUMap.end(); I != E; ++I) {
3270 // Compute size of compile unit header.
3271 static unsigned Offset = PrevOffset +
3272 sizeof(int32_t) + // Length of Compilation Unit Info
3273 sizeof(int16_t) + // DWARF version number
3274 sizeof(int32_t) + // Offset Into Abbrev. Section
3275 sizeof(int8_t); // Pointer Size (in bytes)
3276 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3277 PrevOffset = Offset;
3281 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3282 /// temporary label to it if SymbolStem is specified.
3283 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3284 const char *SymbolStem = 0) {
3285 Asm->OutStreamer.SwitchSection(Section);
3286 if (!SymbolStem) return 0;
3288 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3289 Asm->OutStreamer.EmitLabel(TmpSym);
3293 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3294 /// the start of each one.
3295 void DwarfDebug::EmitSectionLabels() {
3296 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3298 // Dwarf sections base addresses.
3299 if (Asm->MAI->doesDwarfRequireFrameSection()) {
3300 DwarfFrameSectionSym =
3301 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3304 DwarfInfoSectionSym =
3305 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3306 DwarfAbbrevSectionSym =
3307 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3308 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3310 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3311 EmitSectionSym(Asm, MacroInfo);
3313 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3314 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3315 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3316 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3317 DwarfStrSectionSym =
3318 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3319 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3322 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3323 "section_debug_loc");
3325 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3326 EmitSectionSym(Asm, TLOF.getDataSection());
3329 /// emitDIE - Recusively Emits a debug information entry.
3331 void DwarfDebug::emitDIE(DIE *Die) {
3332 // Get the abbreviation for this DIE.
3333 unsigned AbbrevNumber = Die->getAbbrevNumber();
3334 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3336 // Emit the code (index) for the abbreviation.
3337 if (Asm->isVerbose())
3338 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3339 Twine::utohexstr(Die->getOffset()) + ":0x" +
3340 Twine::utohexstr(Die->getSize()) + " " +
3341 dwarf::TagString(Abbrev->getTag()));
3342 Asm->EmitULEB128(AbbrevNumber);
3344 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3345 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3347 // Emit the DIE attribute values.
3348 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3349 unsigned Attr = AbbrevData[i].getAttribute();
3350 unsigned Form = AbbrevData[i].getForm();
3351 assert(Form && "Too many attributes for DIE (check abbreviation)");
3353 if (Asm->isVerbose())
3354 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3357 case dwarf::DW_AT_sibling:
3358 Asm->EmitInt32(Die->getSiblingOffset());
3360 case dwarf::DW_AT_abstract_origin: {
3361 DIEEntry *E = cast<DIEEntry>(Values[i]);
3362 DIE *Origin = E->getEntry();
3363 unsigned Addr = Origin->getOffset();
3364 Asm->EmitInt32(Addr);
3367 case dwarf::DW_AT_ranges: {
3368 // DW_AT_range Value encodes offset in debug_range section.
3369 DIEInteger *V = cast<DIEInteger>(Values[i]);
3371 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3372 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3376 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3378 DwarfDebugRangeSectionSym,
3383 case dwarf::DW_AT_location: {
3384 if (UseDotDebugLocEntry.count(Die) != 0) {
3385 DIELabel *L = cast<DIELabel>(Values[i]);
3386 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3388 Values[i]->EmitValue(Asm, Form);
3391 case dwarf::DW_AT_accessibility: {
3392 if (Asm->isVerbose()) {
3393 DIEInteger *V = cast<DIEInteger>(Values[i]);
3394 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3396 Values[i]->EmitValue(Asm, Form);
3400 // Emit an attribute using the defined form.
3401 Values[i]->EmitValue(Asm, Form);
3406 // Emit the DIE children if any.
3407 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3408 const std::vector<DIE *> &Children = Die->getChildren();
3410 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3411 emitDIE(Children[j]);
3413 if (Asm->isVerbose())
3414 Asm->OutStreamer.AddComment("End Of Children Mark");
3419 /// emitDebugInfo - Emit the debug info section.
3421 void DwarfDebug::emitDebugInfo() {
3422 // Start debug info section.
3423 Asm->OutStreamer.SwitchSection(
3424 Asm->getObjFileLowering().getDwarfInfoSection());
3425 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3426 E = CUMap.end(); I != E; ++I) {
3427 CompileUnit *TheCU = I->second;
3428 DIE *Die = TheCU->getCUDie();
3430 // Emit the compile units header.
3431 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3434 // Emit size of content not including length itself
3435 unsigned ContentSize = Die->getSize() +
3436 sizeof(int16_t) + // DWARF version number
3437 sizeof(int32_t) + // Offset Into Abbrev. Section
3438 sizeof(int8_t) + // Pointer Size (in bytes)
3439 sizeof(int32_t); // FIXME - extra pad for gdb bug.
3441 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3442 Asm->EmitInt32(ContentSize);
3443 Asm->OutStreamer.AddComment("DWARF version number");
3444 Asm->EmitInt16(dwarf::DWARF_VERSION);
3445 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3446 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3447 DwarfAbbrevSectionSym);
3448 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3449 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3452 // FIXME - extra padding for gdb bug.
3453 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3458 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3462 /// emitAbbreviations - Emit the abbreviation section.
3464 void DwarfDebug::emitAbbreviations() const {
3465 // Check to see if it is worth the effort.
3466 if (!Abbreviations.empty()) {
3467 // Start the debug abbrev section.
3468 Asm->OutStreamer.SwitchSection(
3469 Asm->getObjFileLowering().getDwarfAbbrevSection());
3471 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3473 // For each abbrevation.
3474 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3475 // Get abbreviation data
3476 const DIEAbbrev *Abbrev = Abbreviations[i];
3478 // Emit the abbrevations code (base 1 index.)
3479 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3481 // Emit the abbreviations data.
3485 // Mark end of abbreviations.
3486 Asm->EmitULEB128(0, "EOM(3)");
3488 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3492 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3493 /// the line matrix.
3495 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3496 // Define last address of section.
3497 Asm->OutStreamer.AddComment("Extended Op");
3500 Asm->OutStreamer.AddComment("Op size");
3501 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3502 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3503 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3505 Asm->OutStreamer.AddComment("Section end label");
3507 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3508 Asm->getTargetData().getPointerSize(),
3511 // Mark end of matrix.
3512 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3518 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3520 void DwarfDebug::emitCommonDebugFrame() {
3521 if (!Asm->MAI->doesDwarfRequireFrameSection())
3524 int stackGrowth = Asm->getTargetData().getPointerSize();
3525 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3526 TargetFrameLowering::StackGrowsDown)
3529 // Start the dwarf frame section.
3530 Asm->OutStreamer.SwitchSection(
3531 Asm->getObjFileLowering().getDwarfFrameSection());
3533 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3534 Asm->OutStreamer.AddComment("Length of Common Information Entry");
3535 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3536 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3538 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3539 Asm->OutStreamer.AddComment("CIE Identifier Tag");
3540 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3541 Asm->OutStreamer.AddComment("CIE Version");
3542 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3543 Asm->OutStreamer.AddComment("CIE Augmentation");
3544 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3545 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3546 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3547 Asm->OutStreamer.AddComment("CIE RA Column");
3548 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3549 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
3550 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3552 std::vector<MachineMove> Moves;
3553 TFI->getInitialFrameState(Moves);
3555 Asm->EmitFrameMoves(Moves, 0, false);
3557 Asm->EmitAlignment(2);
3558 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3561 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3564 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3565 if (!Asm->MAI->doesDwarfRequireFrameSection())
3568 // Start the dwarf frame section.
3569 Asm->OutStreamer.SwitchSection(
3570 Asm->getObjFileLowering().getDwarfFrameSection());
3572 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3573 MCSymbol *DebugFrameBegin =
3574 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3575 MCSymbol *DebugFrameEnd =
3576 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3577 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3579 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3581 Asm->OutStreamer.AddComment("FDE CIE offset");
3582 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3583 DwarfFrameSectionSym);
3585 Asm->OutStreamer.AddComment("FDE initial location");
3586 MCSymbol *FuncBeginSym =
3587 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3588 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3589 Asm->getTargetData().getPointerSize(),
3593 Asm->OutStreamer.AddComment("FDE address range");
3594 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3595 FuncBeginSym, Asm->getTargetData().getPointerSize());
3597 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3599 Asm->EmitAlignment(2);
3600 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3603 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3605 void DwarfDebug::emitDebugPubNames() {
3606 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3607 E = CUMap.end(); I != E; ++I) {
3608 CompileUnit *TheCU = I->second;
3609 // Start the dwarf pubnames section.
3610 Asm->OutStreamer.SwitchSection(
3611 Asm->getObjFileLowering().getDwarfPubNamesSection());
3613 Asm->OutStreamer.AddComment("Length of Public Names Info");
3614 Asm->EmitLabelDifference(
3615 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3616 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3618 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3621 Asm->OutStreamer.AddComment("DWARF Version");
3622 Asm->EmitInt16(dwarf::DWARF_VERSION);
3624 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3625 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3626 DwarfInfoSectionSym);
3628 Asm->OutStreamer.AddComment("Compilation Unit Length");
3629 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3630 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3633 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3634 for (StringMap<DIE*>::const_iterator
3635 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3636 const char *Name = GI->getKeyData();
3637 DIE *Entity = GI->second;
3639 Asm->OutStreamer.AddComment("DIE offset");
3640 Asm->EmitInt32(Entity->getOffset());
3642 if (Asm->isVerbose())
3643 Asm->OutStreamer.AddComment("External Name");
3644 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3647 Asm->OutStreamer.AddComment("End Mark");
3649 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3654 void DwarfDebug::emitDebugPubTypes() {
3655 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3656 E = CUMap.end(); I != E; ++I) {
3657 CompileUnit *TheCU = I->second;
3658 // Start the dwarf pubnames section.
3659 Asm->OutStreamer.SwitchSection(
3660 Asm->getObjFileLowering().getDwarfPubTypesSection());
3661 Asm->OutStreamer.AddComment("Length of Public Types Info");
3662 Asm->EmitLabelDifference(
3663 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3664 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3666 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3669 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3670 Asm->EmitInt16(dwarf::DWARF_VERSION);
3672 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3673 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3674 DwarfInfoSectionSym);
3676 Asm->OutStreamer.AddComment("Compilation Unit Length");
3677 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3678 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3681 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3682 for (StringMap<DIE*>::const_iterator
3683 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3684 const char *Name = GI->getKeyData();
3685 DIE * Entity = GI->second;
3687 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3688 Asm->EmitInt32(Entity->getOffset());
3690 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3691 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3694 Asm->OutStreamer.AddComment("End Mark");
3696 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3701 /// emitDebugStr - Emit visible names into a debug str section.
3703 void DwarfDebug::emitDebugStr() {
3704 // Check to see if it is worth the effort.
3705 if (StringPool.empty()) return;
3707 // Start the dwarf str section.
3708 Asm->OutStreamer.SwitchSection(
3709 Asm->getObjFileLowering().getDwarfStrSection());
3711 // Get all of the string pool entries and put them in an array by their ID so
3712 // we can sort them.
3713 SmallVector<std::pair<unsigned,
3714 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3716 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3717 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3718 Entries.push_back(std::make_pair(I->second.second, &*I));
3720 array_pod_sort(Entries.begin(), Entries.end());
3722 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3723 // Emit a label for reference from debug information entries.
3724 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3726 // Emit the string itself.
3727 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3731 /// emitDebugLoc - Emit visible names into a debug loc section.
3733 void DwarfDebug::emitDebugLoc() {
3734 if (DotDebugLocEntries.empty())
3737 for (SmallVector<DotDebugLocEntry, 4>::iterator
3738 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3740 DotDebugLocEntry &Entry = *I;
3741 if (I + 1 != DotDebugLocEntries.end())
3745 // Start the dwarf loc section.
3746 Asm->OutStreamer.SwitchSection(
3747 Asm->getObjFileLowering().getDwarfLocSection());
3748 unsigned char Size = Asm->getTargetData().getPointerSize();
3749 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3751 for (SmallVector<DotDebugLocEntry, 4>::iterator
3752 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3753 I != E; ++I, ++index) {
3754 DotDebugLocEntry &Entry = *I;
3755 if (Entry.isMerged()) continue;
3756 if (Entry.isEmpty()) {
3757 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3758 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3759 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3761 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3762 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3763 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3764 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3765 if (int Offset = Entry.Loc.getOffset()) {
3766 // If the value is at a certain offset from frame register then
3768 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3769 Asm->OutStreamer.AddComment("Loc expr size");
3770 Asm->EmitInt16(1 + OffsetSize);
3771 Asm->OutStreamer.AddComment(
3772 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3773 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3774 Asm->OutStreamer.AddComment("Offset");
3775 Asm->EmitSLEB128(Offset);
3778 Asm->OutStreamer.AddComment("Loc expr size");
3780 Asm->OutStreamer.AddComment(
3781 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3782 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3784 Asm->OutStreamer.AddComment("Loc expr size");
3785 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3786 Asm->EmitInt8(dwarf::DW_OP_regx);
3787 Asm->EmitULEB128(Reg);
3794 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3796 void DwarfDebug::EmitDebugARanges() {
3797 // Start the dwarf aranges section.
3798 Asm->OutStreamer.SwitchSection(
3799 Asm->getObjFileLowering().getDwarfARangesSection());
3802 /// emitDebugRanges - Emit visible names into a debug ranges section.
3804 void DwarfDebug::emitDebugRanges() {
3805 // Start the dwarf ranges section.
3806 Asm->OutStreamer.SwitchSection(
3807 Asm->getObjFileLowering().getDwarfRangesSection());
3808 unsigned char Size = Asm->getTargetData().getPointerSize();
3809 for (SmallVector<const MCSymbol *, 8>::iterator
3810 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3813 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3815 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3819 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3821 void DwarfDebug::emitDebugMacInfo() {
3822 if (const MCSection *LineInfo =
3823 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3824 // Start the dwarf macinfo section.
3825 Asm->OutStreamer.SwitchSection(LineInfo);
3829 /// emitDebugInlineInfo - Emit inline info using following format.
3831 /// 1. length of section
3832 /// 2. Dwarf version number
3833 /// 3. address size.
3835 /// Entries (one "entry" for each function that was inlined):
3837 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3838 /// otherwise offset into __debug_str for regular function name.
3839 /// 2. offset into __debug_str section for regular function name.
3840 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3841 /// instances for the function.
3843 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3844 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3845 /// __debug_info section, and the low_pc is the starting address for the
3846 /// inlining instance.
3847 void DwarfDebug::emitDebugInlineInfo() {
3848 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3854 Asm->OutStreamer.SwitchSection(
3855 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3857 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3858 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3859 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3861 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3863 Asm->OutStreamer.AddComment("Dwarf Version");
3864 Asm->EmitInt16(dwarf::DWARF_VERSION);
3865 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3866 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3868 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3869 E = InlinedSPNodes.end(); I != E; ++I) {
3871 const MDNode *Node = *I;
3872 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3873 = InlineInfo.find(Node);
3874 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3875 DISubprogram SP(Node);
3876 StringRef LName = SP.getLinkageName();
3877 StringRef Name = SP.getName();
3879 Asm->OutStreamer.AddComment("MIPS linkage name");
3880 if (LName.empty()) {
3881 Asm->OutStreamer.EmitBytes(Name, 0);
3882 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3884 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3885 DwarfStrSectionSym);
3887 Asm->OutStreamer.AddComment("Function name");
3888 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3889 Asm->EmitULEB128(Labels.size(), "Inline count");
3891 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3892 LE = Labels.end(); LI != LE; ++LI) {
3893 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3894 Asm->EmitInt32(LI->second->getOffset());
3896 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3897 Asm->OutStreamer.EmitSymbolValue(LI->first,
3898 Asm->getTargetData().getPointerSize(),0);
3902 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));