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 /// addSectionOffset - Add a Dwarf section relative label attribute data and
487 void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
488 const MCSymbol *Label) {
489 DIEValue *Value = new (DIEValueAllocator) DIESectionOffset(Label);
490 Die->addValue(Attribute, Form, Value);
493 /// addDelta - Add a label delta attribute data and value.
495 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
496 const MCSymbol *Hi, const MCSymbol *Lo) {
497 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
498 Die->addValue(Attribute, Form, Value);
501 /// addDIEEntry - Add a DIE attribute data and value.
503 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
505 Die->addValue(Attribute, Form, createDIEEntry(Entry));
509 /// addBlock - Add block data.
511 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
513 Block->ComputeSize(Asm);
514 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
515 Die->addValue(Attribute, Block->BestForm(), Block);
518 /// addSourceLine - Add location information to specified debug information
520 void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
525 unsigned Line = V.getLineNumber();
528 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename());
529 assert(FileID && "Invalid file id");
530 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
531 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
534 /// addSourceLine - Add location information to specified debug information
536 void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
537 // Verify global variable.
541 unsigned Line = G.getLineNumber();
544 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename());
545 assert(FileID && "Invalid file id");
546 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
547 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
550 /// addSourceLine - Add location information to specified debug information
552 void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
553 // Verify subprogram.
556 // If the line number is 0, don't add it.
557 if (SP.getLineNumber() == 0)
560 unsigned Line = SP.getLineNumber();
561 if (!SP.getContext().Verify())
563 unsigned FileID = GetOrCreateSourceID(SP.getFilename());
564 assert(FileID && "Invalid file id");
565 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
566 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
569 /// addSourceLine - Add location information to specified debug information
571 void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
576 unsigned Line = Ty.getLineNumber();
577 if (Line == 0 || !Ty.getContext().Verify())
579 unsigned FileID = GetOrCreateSourceID(Ty.getFilename());
580 assert(FileID && "Invalid file id");
581 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
582 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
585 /// addSourceLine - Add location information to specified debug information
587 void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
592 unsigned Line = NS.getLineNumber();
595 StringRef FN = NS.getFilename();
597 unsigned FileID = GetOrCreateSourceID(FN);
598 assert(FileID && "Invalid file id");
599 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
600 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
603 /// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
604 /// on provided frame index.
605 void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
606 MachineLocation Location;
608 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
609 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
610 Location.set(FrameReg, Offset);
612 if (DV->variableHasComplexAddress())
613 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
614 else if (DV->isBlockByrefVariable())
615 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
617 addAddress(Die, dwarf::DW_AT_location, Location);
620 /// addComplexAddress - Start with the address based on the location provided,
621 /// and generate the DWARF information necessary to find the actual variable
622 /// given the extra address information encoded in the DIVariable, starting from
623 /// the starting location. Add the DWARF information to the die.
625 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
627 const MachineLocation &Location) {
628 DIType Ty = DV->getType();
630 // Decode the original location, and use that as the start of the byref
631 // variable's location.
632 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
633 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
634 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
636 if (Location.isReg()) {
638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
640 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
641 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
645 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
647 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
648 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
651 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
654 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
655 uint64_t Element = DV->getAddrElement(i);
657 if (Element == DIBuilder::OpPlus) {
658 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
659 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
660 } else if (Element == DIBuilder::OpDeref) {
661 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
662 } else llvm_unreachable("unknown DIBuilder Opcode");
665 // Now attach the location information to the DIE.
666 addBlock(Die, Attribute, 0, Block);
669 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
670 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
671 gives the variable VarName either the struct, or a pointer to the struct, as
672 its type. This is necessary for various behind-the-scenes things the
673 compiler needs to do with by-reference variables in Blocks.
675 However, as far as the original *programmer* is concerned, the variable
676 should still have type 'SomeType', as originally declared.
678 The function getBlockByrefType dives into the __Block_byref_x_VarName
679 struct to find the original type of the variable, which is then assigned to
680 the variable's Debug Information Entry as its real type. So far, so good.
681 However now the debugger will expect the variable VarName to have the type
682 SomeType. So we need the location attribute for the variable to be an
683 expression that explains to the debugger how to navigate through the
684 pointers and struct to find the actual variable of type SomeType.
686 The following function does just that. We start by getting
687 the "normal" location for the variable. This will be the location
688 of either the struct __Block_byref_x_VarName or the pointer to the
689 struct __Block_byref_x_VarName.
691 The struct will look something like:
693 struct __Block_byref_x_VarName {
695 struct __Block_byref_x_VarName *forwarding;
696 ... <various other fields>
698 ... <maybe more fields>
701 If we are given the struct directly (as our starting point) we
702 need to tell the debugger to:
704 1). Add the offset of the forwarding field.
706 2). Follow that pointer to get the real __Block_byref_x_VarName
707 struct to use (the real one may have been copied onto the heap).
709 3). Add the offset for the field VarName, to find the actual variable.
711 If we started with a pointer to the struct, then we need to
712 dereference that pointer first, before the other steps.
713 Translating this into DWARF ops, we will need to append the following
714 to the current location description for the variable:
716 DW_OP_deref -- optional, if we start with a pointer
717 DW_OP_plus_uconst <forward_fld_offset>
719 DW_OP_plus_uconst <varName_fld_offset>
721 That is what this function does. */
723 /// addBlockByrefAddress - Start with the address based on the location
724 /// provided, and generate the DWARF information necessary to find the
725 /// actual Block variable (navigating the Block struct) based on the
726 /// starting location. Add the DWARF information to the die. For
727 /// more information, read large comment just above here.
729 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
731 const MachineLocation &Location) {
732 DIType Ty = DV->getType();
734 unsigned Tag = Ty.getTag();
735 bool isPointer = false;
737 StringRef varName = DV->getName();
739 if (Tag == dwarf::DW_TAG_pointer_type) {
740 DIDerivedType DTy = DIDerivedType(Ty);
741 TmpTy = DTy.getTypeDerivedFrom();
745 DICompositeType blockStruct = DICompositeType(TmpTy);
747 // Find the __forwarding field and the variable field in the __Block_byref
749 DIArray Fields = blockStruct.getTypeArray();
750 DIDescriptor varField = DIDescriptor();
751 DIDescriptor forwardingField = DIDescriptor();
753 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
754 DIDescriptor Element = Fields.getElement(i);
755 DIDerivedType DT = DIDerivedType(Element);
756 StringRef fieldName = DT.getName();
757 if (fieldName == "__forwarding")
758 forwardingField = Element;
759 else if (fieldName == varName)
763 // Get the offsets for the forwarding field and the variable field.
764 unsigned forwardingFieldOffset =
765 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
766 unsigned varFieldOffset =
767 DIDerivedType(varField).getOffsetInBits() >> 3;
769 // Decode the original location, and use that as the start of the byref
770 // variable's location.
771 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
772 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
773 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
775 if (Location.isReg()) {
777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
779 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
780 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
784 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
786 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
787 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
790 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
793 // If we started with a pointer to the __Block_byref... struct, then
794 // the first thing we need to do is dereference the pointer (DW_OP_deref).
796 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
798 // Next add the offset for the '__forwarding' field:
799 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
800 // adding the offset if it's 0.
801 if (forwardingFieldOffset > 0) {
802 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
803 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
806 // Now dereference the __forwarding field to get to the real __Block_byref
807 // struct: DW_OP_deref.
808 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
810 // Now that we've got the real __Block_byref... struct, add the offset
811 // for the variable's field to get to the location of the actual variable:
812 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
813 if (varFieldOffset > 0) {
814 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
815 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
818 // Now attach the location information to the DIE.
819 addBlock(Die, Attribute, 0, Block);
822 /// addAddress - Add an address attribute to a die based on the location
824 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
825 const MachineLocation &Location) {
826 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
827 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
828 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
830 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
831 && Location.getOffset()) {
832 // If variable offset is based in frame register then use fbreg.
833 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
834 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
835 addBlock(Die, Attribute, 0, Block);
839 if (Location.isReg()) {
841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
843 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
844 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
848 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
850 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
851 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
854 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
857 addBlock(Die, Attribute, 0, Block);
860 /// addRegisterAddress - Add register location entry in variable DIE.
861 bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
862 assert (MO.isReg() && "Invalid machine operand!");
865 MachineLocation Location;
866 Location.set(MO.getReg());
867 addAddress(Die, dwarf::DW_AT_location, Location);
871 /// addConstantValue - Add constant value entry in variable DIE.
872 bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
873 assert (MO.isImm() && "Invalid machine operand!");
874 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
875 unsigned Imm = MO.getImm();
876 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
877 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
881 /// addConstantFPValue - Add constant value entry in variable DIE.
882 bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
883 assert (MO.isFPImm() && "Invalid machine operand!");
884 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
885 APFloat FPImm = MO.getFPImm()->getValueAPF();
887 // Get the raw data form of the floating point.
888 const APInt FltVal = FPImm.bitcastToAPInt();
889 const char *FltPtr = (const char*)FltVal.getRawData();
891 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
892 bool LittleEndian = Asm->getTargetData().isLittleEndian();
893 int Incr = (LittleEndian ? 1 : -1);
894 int Start = (LittleEndian ? 0 : NumBytes - 1);
895 int Stop = (LittleEndian ? NumBytes : -1);
897 // Output the constant to DWARF one byte at a time.
898 for (; Start != Stop; Start += Incr)
899 addUInt(Block, 0, dwarf::DW_FORM_data1,
900 (unsigned char)0xFF & FltPtr[Start]);
902 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
906 /// addConstantValue - Add constant value entry in variable DIE.
907 bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
909 if (CI->getBitWidth() <= 64) {
911 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
914 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
919 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
921 // Get the raw data form of the large APInt.
922 const APInt Val = CI->getValue();
923 const char *Ptr = (const char*)Val.getRawData();
925 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
926 bool LittleEndian = Asm->getTargetData().isLittleEndian();
927 int Incr = (LittleEndian ? 1 : -1);
928 int Start = (LittleEndian ? 0 : NumBytes - 1);
929 int Stop = (LittleEndian ? NumBytes : -1);
931 // Output the constant to DWARF one byte at a time.
932 for (; Start != Stop; Start += Incr)
933 addUInt(Block, 0, dwarf::DW_FORM_data1,
934 (unsigned char)0xFF & Ptr[Start]);
936 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
940 /// addToContextOwner - Add Die into the list of its context owner's children.
941 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
942 if (Context.isType()) {
943 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
944 ContextDIE->addChild(Die);
945 } else if (Context.isNameSpace()) {
946 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
947 ContextDIE->addChild(Die);
948 } else if (Context.isSubprogram()) {
949 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
950 ContextDIE->addChild(Die);
951 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
952 ContextDIE->addChild(Die);
954 getCompileUnit(Context)->addDie(Die);
957 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
959 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
960 CompileUnit *TypeCU = getCompileUnit(Ty);
961 DIE *TyDIE = TypeCU->getDIE(Ty);
966 TyDIE = new DIE(dwarf::DW_TAG_base_type);
967 TypeCU->insertDIE(Ty, TyDIE);
968 if (Ty.isBasicType())
969 constructTypeDIE(*TyDIE, DIBasicType(Ty));
970 else if (Ty.isCompositeType())
971 constructTypeDIE(*TyDIE, DICompositeType(Ty));
973 assert(Ty.isDerivedType() && "Unknown kind of DIType");
974 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
977 addToContextOwner(TyDIE, Ty.getContext());
981 /// addType - Add a new type attribute to the specified entity.
982 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
986 // Check for pre-existence.
987 CompileUnit *TypeCU = getCompileUnit(Ty);
988 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
989 // If it exists then use the existing value.
991 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
996 DIE *Buffer = getOrCreateTypeDIE(Ty);
999 Entry = createDIEEntry(Buffer);
1000 TypeCU->insertDIEEntry(Ty, Entry);
1002 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
1005 /// constructTypeDIE - Construct basic type die from DIBasicType.
1006 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
1007 // Get core information.
1008 StringRef Name = BTy.getName();
1009 Buffer.setTag(dwarf::DW_TAG_base_type);
1010 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1013 // Add name if not anonymous or intermediate type.
1015 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1016 uint64_t Size = BTy.getSizeInBits() >> 3;
1017 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1020 /// constructTypeDIE - Construct derived type die from DIDerivedType.
1021 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1022 // Get core information.
1023 StringRef Name = DTy.getName();
1024 uint64_t Size = DTy.getSizeInBits() >> 3;
1025 unsigned Tag = DTy.getTag();
1027 // FIXME - Workaround for templates.
1028 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1032 // Map to main type, void will not have a type.
1033 DIType FromTy = DTy.getTypeDerivedFrom();
1034 addType(&Buffer, FromTy);
1036 // Add name if not anonymous or intermediate type.
1038 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1040 // Add size if non-zero (derived types might be zero-sized.)
1042 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1044 // Add source line info if available and TyDesc is not a forward declaration.
1045 if (!DTy.isForwardDecl())
1046 addSourceLine(&Buffer, DTy);
1049 /// constructTypeDIE - Construct type DIE from DICompositeType.
1050 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1051 // Get core information.
1052 StringRef Name = CTy.getName();
1054 uint64_t Size = CTy.getSizeInBits() >> 3;
1055 unsigned Tag = CTy.getTag();
1059 case dwarf::DW_TAG_vector_type:
1060 case dwarf::DW_TAG_array_type:
1061 constructArrayTypeDIE(Buffer, &CTy);
1063 case dwarf::DW_TAG_enumeration_type: {
1064 DIArray Elements = CTy.getTypeArray();
1066 // Add enumerators to enumeration type.
1067 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1068 DIE *ElemDie = NULL;
1069 DIDescriptor Enum(Elements.getElement(i));
1070 if (Enum.isEnumerator()) {
1071 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1072 Buffer.addChild(ElemDie);
1077 case dwarf::DW_TAG_subroutine_type: {
1079 DIArray Elements = CTy.getTypeArray();
1080 DIDescriptor RTy = Elements.getElement(0);
1081 addType(&Buffer, DIType(RTy));
1083 bool isPrototyped = true;
1085 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1086 DIDescriptor Ty = Elements.getElement(i);
1087 if (Ty.isUnspecifiedParameter()) {
1088 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1089 Buffer.addChild(Arg);
1090 isPrototyped = false;
1092 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1093 addType(Arg, DIType(Ty));
1094 Buffer.addChild(Arg);
1097 // Add prototype flag.
1099 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1102 case dwarf::DW_TAG_structure_type:
1103 case dwarf::DW_TAG_union_type:
1104 case dwarf::DW_TAG_class_type: {
1105 // Add elements to structure type.
1106 DIArray Elements = CTy.getTypeArray();
1108 // A forward struct declared type may not have elements available.
1109 unsigned N = Elements.getNumElements();
1113 // Add elements to structure type.
1114 for (unsigned i = 0; i < N; ++i) {
1115 DIDescriptor Element = Elements.getElement(i);
1116 DIE *ElemDie = NULL;
1117 if (Element.isSubprogram()) {
1118 DISubprogram SP(Element);
1119 ElemDie = createSubprogramDIE(DISubprogram(Element));
1120 if (SP.isProtected())
1121 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1122 dwarf::DW_ACCESS_protected);
1123 else if (SP.isPrivate())
1124 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1125 dwarf::DW_ACCESS_private);
1127 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1128 dwarf::DW_ACCESS_public);
1129 if (SP.isExplicit())
1130 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
1132 else if (Element.isVariable()) {
1133 DIVariable DV(Element);
1134 ElemDie = new DIE(dwarf::DW_TAG_variable);
1135 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1137 addType(ElemDie, DV.getType());
1138 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1139 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1140 addSourceLine(ElemDie, DV);
1141 } else if (Element.isDerivedType())
1142 ElemDie = createMemberDIE(DIDerivedType(Element));
1145 Buffer.addChild(ElemDie);
1148 if (CTy.isAppleBlockExtension())
1149 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1151 unsigned RLang = CTy.getRunTimeLang();
1153 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1154 dwarf::DW_FORM_data1, RLang);
1156 DICompositeType ContainingType = CTy.getContainingType();
1157 if (DIDescriptor(ContainingType).isCompositeType())
1158 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1159 getOrCreateTypeDIE(DIType(ContainingType)));
1161 DIDescriptor Context = CTy.getContext();
1162 addToContextOwner(&Buffer, Context);
1165 if (Tag == dwarf::DW_TAG_class_type) {
1166 DIArray TParams = CTy.getTemplateParams();
1167 unsigned N = TParams.getNumElements();
1168 // Add template parameters.
1169 for (unsigned i = 0; i < N; ++i) {
1170 DIDescriptor Element = TParams.getElement(i);
1171 if (Element.isTemplateTypeParameter())
1172 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
1173 DITemplateTypeParameter(Element)));
1174 else if (Element.isTemplateValueParameter())
1175 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
1176 DITemplateValueParameter(Element)));
1185 // Add name if not anonymous or intermediate type.
1187 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1189 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
1190 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1192 // Add size if non-zero (derived types might be zero-sized.)
1194 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1196 // Add zero size if it is not a forward declaration.
1197 if (CTy.isForwardDecl())
1198 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1200 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1203 // Add source line info if available.
1204 if (!CTy.isForwardDecl())
1205 addSourceLine(&Buffer, CTy);
1209 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1210 /// for the given DITemplateTypeParameter.
1212 DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1213 CompileUnit *TypeCU = getCompileUnit(TP);
1214 DIE *ParamDIE = TypeCU->getDIE(TP);
1218 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1219 addType(ParamDIE, TP.getType());
1220 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1224 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1225 /// for the given DITemplateValueParameter.
1227 DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1228 CompileUnit *TVCU = getCompileUnit(TPV);
1229 DIE *ParamDIE = TVCU->getDIE(TPV);
1233 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1234 addType(ParamDIE, TPV.getType());
1235 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
1236 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1241 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1242 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1243 int64_t L = SR.getLo();
1244 int64_t H = SR.getHi();
1245 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1247 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1249 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1250 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1252 Buffer.addChild(DW_Subrange);
1255 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1256 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1257 DICompositeType *CTy) {
1258 Buffer.setTag(dwarf::DW_TAG_array_type);
1259 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1260 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1262 // Emit derived type.
1263 addType(&Buffer, CTy->getTypeDerivedFrom());
1264 DIArray Elements = CTy->getTypeArray();
1266 // Get an anonymous type for index type.
1267 CompileUnit *TheCU = getCompileUnit(*CTy);
1268 DIE *IdxTy = TheCU->getIndexTyDie();
1270 // Construct an anonymous type for index type.
1271 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1272 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1273 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1274 dwarf::DW_ATE_signed);
1275 TheCU->addDie(IdxTy);
1276 TheCU->setIndexTyDie(IdxTy);
1279 // Add subranges to array type.
1280 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1281 DIDescriptor Element = Elements.getElement(i);
1282 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1283 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1287 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1288 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1289 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1290 StringRef Name = ETy.getName();
1291 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1292 int64_t Value = ETy.getEnumValue();
1293 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1297 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1298 /// printer to not emit usual symbol prefix before the symbol name is used then
1299 /// return linkage name after skipping this special LLVM prefix.
1300 static StringRef getRealLinkageName(StringRef LinkageName) {
1302 if (LinkageName.startswith(StringRef(&One, 1)))
1303 return LinkageName.substr(1);
1307 /// createMemberDIE - Create new member DIE.
1308 DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
1309 DIE *MemberDie = new DIE(DT.getTag());
1310 StringRef Name = DT.getName();
1312 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1314 addType(MemberDie, DT.getTypeDerivedFrom());
1316 addSourceLine(MemberDie, DT);
1318 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1319 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1321 uint64_t Size = DT.getSizeInBits();
1322 uint64_t FieldSize = DT.getOriginalTypeSize();
1324 if (Size != FieldSize) {
1326 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1327 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1329 uint64_t Offset = DT.getOffsetInBits();
1330 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1331 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1332 uint64_t FieldOffset = (HiMark - FieldSize);
1333 Offset -= FieldOffset;
1335 // Maybe we need to work from the other end.
1336 if (Asm->getTargetData().isLittleEndian())
1337 Offset = FieldSize - (Offset + Size);
1338 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1340 // Here WD_AT_data_member_location points to the anonymous
1341 // field that includes this bit field.
1342 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1345 // This is not a bitfield.
1346 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1348 if (DT.getTag() == dwarf::DW_TAG_inheritance
1349 && DT.isVirtual()) {
1351 // For C++, virtual base classes are not at fixed offset. Use following
1352 // expression to extract appropriate offset from vtable.
1353 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1355 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1356 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1357 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1358 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1359 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1360 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1361 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1362 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1364 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1367 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1369 if (DT.isProtected())
1370 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1371 dwarf::DW_ACCESS_protected);
1372 else if (DT.isPrivate())
1373 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1374 dwarf::DW_ACCESS_private);
1375 // Otherwise C++ member and base classes are considered public.
1376 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1377 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1378 dwarf::DW_ACCESS_public);
1380 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1381 dwarf::DW_VIRTUALITY_virtual);
1385 /// createSubprogramDIE - Create new DIE using SP.
1386 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
1387 CompileUnit *SPCU = getCompileUnit(SP);
1388 DIE *SPDie = SPCU->getDIE(SP);
1392 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1393 // Constructors and operators for anonymous aggregates do not have names.
1394 if (!SP.getName().empty())
1395 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1397 StringRef LinkageName = SP.getLinkageName();
1398 if (!LinkageName.empty())
1399 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1400 getRealLinkageName(LinkageName));
1402 addSourceLine(SPDie, SP);
1404 if (SP.isPrototyped())
1405 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1408 DICompositeType SPTy = SP.getType();
1409 DIArray Args = SPTy.getTypeArray();
1410 unsigned SPTag = SPTy.getTag();
1412 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1413 addType(SPDie, SPTy);
1415 addType(SPDie, DIType(Args.getElement(0)));
1417 unsigned VK = SP.getVirtuality();
1419 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1420 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1421 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1422 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1423 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1424 ContainingTypeMap.insert(std::make_pair(SPDie,
1425 SP.getContainingType()));
1428 if (!SP.isDefinition()) {
1429 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1431 // Add arguments. Do not add arguments for subprogram definition. They will
1432 // be handled while processing variables.
1433 DICompositeType SPTy = SP.getType();
1434 DIArray Args = SPTy.getTypeArray();
1435 unsigned SPTag = SPTy.getTag();
1437 if (SPTag == dwarf::DW_TAG_subroutine_type)
1438 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1439 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1440 DIType ATy = DIType(DIType(Args.getElement(i)));
1442 if (ATy.isArtificial())
1443 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1444 SPDie->addChild(Arg);
1448 if (SP.isArtificial())
1449 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1451 if (!SP.isLocalToUnit())
1452 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1454 if (SP.isOptimized())
1455 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1457 if (unsigned isa = Asm->getISAEncoding()) {
1458 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
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;
1814 // Collect lexical scope childrens first.
1815 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1816 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1817 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1818 Children.push_back(Variable);
1819 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1820 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1821 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1822 Children.push_back(Nested);
1823 DIScope DS(Scope->getScopeNode());
1824 DIE *ScopeDIE = NULL;
1825 if (Scope->getInlinedAt())
1826 ScopeDIE = constructInlinedScopeDIE(Scope);
1827 else if (DS.isSubprogram()) {
1828 ProcessedSPNodes.insert(DS);
1829 if (Scope->isAbstractScope()) {
1830 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1831 // Note down abstract DIE.
1833 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1836 ScopeDIE = updateSubprogramScopeDIE(DS);
1839 // There is no need to emit empty lexical block DIE.
1840 if (Children.empty())
1842 ScopeDIE = constructLexicalScopeDIE(Scope);
1845 if (!ScopeDIE) return NULL;
1848 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1849 E = Children.end(); I != E; ++I)
1850 ScopeDIE->addChild(*I);
1852 if (DS.isSubprogram())
1853 addPubTypes(DISubprogram(DS));
1858 /// GetOrCreateSourceID - Look up the source id with the given directory and
1859 /// source file names. If none currently exists, create a new id and insert it
1860 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1863 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName){
1864 // If FE did not provide a file name, then assume stdin.
1865 if (FileName.empty())
1866 return GetOrCreateSourceID("<stdin>");
1868 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1869 if (Entry.getValue())
1870 return Entry.getValue();
1872 unsigned SrcId = SourceIdMap.size();
1873 Entry.setValue(SrcId);
1875 // Print out a .file directive to specify files for .loc directives.
1876 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, FileName);
1881 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1882 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1883 CompileUnit *TheCU = getCompileUnit(NS);
1884 DIE *NDie = TheCU->getDIE(NS);
1887 NDie = new DIE(dwarf::DW_TAG_namespace);
1888 TheCU->insertDIE(NS, NDie);
1889 if (!NS.getName().empty())
1890 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1891 addSourceLine(NDie, NS);
1892 addToContextOwner(NDie, NS.getContext());
1896 /// constructCompileUnit - Create new CompileUnit for the given
1897 /// metadata node with tag DW_TAG_compile_unit.
1898 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1899 DICompileUnit DIUnit(N);
1900 StringRef FN = DIUnit.getFilename();
1901 StringRef Dir = DIUnit.getDirectory();
1902 unsigned ID = GetOrCreateSourceID(FN);
1904 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1905 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1906 DIUnit.getProducer());
1907 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
1908 DIUnit.getLanguage());
1909 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1910 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1911 // simplifies debug range entries.
1912 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1913 // DW_AT_stmt_list is a offset of line number information for this
1914 // compile unit in debug_line section.
1915 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
1916 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1917 Asm->GetTempSymbol("section_line"));
1919 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1922 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1923 if (DIUnit.isOptimized())
1924 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1926 StringRef Flags = DIUnit.getFlags();
1928 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1930 unsigned RVer = DIUnit.getRunTimeVersion();
1932 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1933 dwarf::DW_FORM_data1, RVer);
1935 CompileUnit *NewCU = new CompileUnit(ID, Die);
1938 CUMap.insert(std::make_pair(N, NewCU));
1941 /// getCompielUnit - Get CompileUnit DIE.
1942 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1943 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1945 const MDNode *CUNode = NULL;
1946 if (D.isCompileUnit())
1948 else if (D.isSubprogram())
1949 CUNode = DISubprogram(N).getCompileUnit();
1950 else if (D.isType())
1951 CUNode = DIType(N).getCompileUnit();
1952 else if (D.isGlobalVariable())
1953 CUNode = DIGlobalVariable(N).getCompileUnit();
1954 else if (D.isVariable())
1955 CUNode = DIVariable(N).getCompileUnit();
1956 else if (D.isNameSpace())
1957 CUNode = DINameSpace(N).getCompileUnit();
1958 else if (D.isFile())
1959 CUNode = DIFile(N).getCompileUnit();
1963 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1964 = CUMap.find(CUNode);
1965 if (I == CUMap.end())
1970 /// isUnsignedDIType - Return true if type encoding is unsigned.
1971 static bool isUnsignedDIType(DIType Ty) {
1972 DIDerivedType DTy(Ty);
1974 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1976 DIBasicType BTy(Ty);
1978 unsigned Encoding = BTy.getEncoding();
1979 if (Encoding == dwarf::DW_ATE_unsigned ||
1980 Encoding == dwarf::DW_ATE_unsigned_char)
1986 // Return const exprssion if value is a GEP to access merged global
1988 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1989 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1990 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1991 if (!CE || CE->getNumOperands() != 3 ||
1992 CE->getOpcode() != Instruction::GetElementPtr)
1995 // First operand points to a global value.
1996 if (!isa<GlobalValue>(CE->getOperand(0)))
1999 // Second operand is zero.
2000 const ConstantInt *CI =
2001 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2002 if (!CI || !CI->isZero())
2005 // Third operand is offset.
2006 if (!isa<ConstantInt>(CE->getOperand(2)))
2012 /// constructGlobalVariableDIE - Construct global variable DIE.
2013 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
2014 DIGlobalVariable GV(N);
2016 // If debug information is malformed then ignore it.
2017 if (GV.Verify() == false)
2020 // Check for pre-existence.
2021 CompileUnit *TheCU = getCompileUnit(N);
2022 if (TheCU->getDIE(GV))
2025 DIType GTy = GV.getType();
2026 DIE *VariableDIE = new DIE(GV.getTag());
2028 bool isGlobalVariable = GV.getGlobal() != NULL;
2031 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2032 GV.getDisplayName());
2033 StringRef LinkageName = GV.getLinkageName();
2034 if (!LinkageName.empty() && isGlobalVariable)
2035 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2036 getRealLinkageName(LinkageName));
2038 addType(VariableDIE, GTy);
2039 if (GTy.isCompositeType() && !GTy.getName().empty()
2040 && !GTy.isForwardDecl()) {
2041 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
2042 assert(Entry && "Missing global type!");
2043 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
2045 // Add scoping info.
2046 if (!GV.isLocalToUnit()) {
2047 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2048 // Expose as global.
2049 TheCU->addGlobal(GV.getName(), VariableDIE);
2051 // Add line number info.
2052 addSourceLine(VariableDIE, GV);
2054 TheCU->insertDIE(N, VariableDIE);
2055 // Add to context owner.
2056 DIDescriptor GVContext = GV.getContext();
2057 addToContextOwner(VariableDIE, GVContext);
2059 if (isGlobalVariable) {
2060 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2061 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2062 addLabel(Block, 0, dwarf::DW_FORM_udata,
2063 Asm->Mang->getSymbol(GV.getGlobal()));
2064 // Do not create specification DIE if context is either compile unit
2066 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2067 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2068 // Create specification DIE.
2069 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2070 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2071 dwarf::DW_FORM_ref4, VariableDIE);
2072 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2073 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2074 TheCU->addDie(VariableSpecDIE);
2076 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2078 } else if (ConstantInt *CI =
2079 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2080 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
2081 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2082 // GV is a merged global.
2083 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2084 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2085 addLabel(Block, 0, dwarf::DW_FORM_udata,
2086 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2087 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2088 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2089 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2090 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2091 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2097 /// construct SubprogramDIE - Construct subprogram DIE.
2098 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
2101 // Check for pre-existence.
2102 CompileUnit *TheCU = getCompileUnit(N);
2103 if (TheCU->getDIE(N))
2106 if (!SP.isDefinition())
2107 // This is a method declaration which will be handled while constructing
2111 DIE *SubprogramDie = createSubprogramDIE(SP);
2114 TheCU->insertDIE(N, SubprogramDie);
2116 // Add to context owner.
2117 addToContextOwner(SubprogramDie, SP.getContext());
2119 // Expose as global.
2120 TheCU->addGlobal(SP.getName(), SubprogramDie);
2125 /// beginModule - Emit all Dwarf sections that should come prior to the
2126 /// content. Create global DIEs and emit initial debug info sections.
2127 /// This is inovked by the target AsmPrinter.
2128 void DwarfDebug::beginModule(Module *M) {
2129 if (DisableDebugInfoPrinting)
2132 DebugInfoFinder DbgFinder;
2133 DbgFinder.processModule(*M);
2135 bool HasDebugInfo = false;
2137 // Scan all the compile-units to see if there are any marked as the main unit.
2138 // if not, we do not generate debug info.
2139 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2140 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2141 if (DICompileUnit(*I).isMain()) {
2142 HasDebugInfo = true;
2147 if (!HasDebugInfo) return;
2149 // Tell MMI that we have debug info.
2150 MMI->setDebugInfoAvailability(true);
2152 // Emit initial sections.
2153 EmitSectionLabels();
2155 // Create all the compile unit DIEs.
2156 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2157 E = DbgFinder.compile_unit_end(); I != E; ++I)
2158 constructCompileUnit(*I);
2160 // Create DIEs for each subprogram.
2161 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2162 E = DbgFinder.subprogram_end(); I != E; ++I)
2163 constructSubprogramDIE(*I);
2165 // Create DIEs for each global variable.
2166 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2167 E = DbgFinder.global_variable_end(); I != E; ++I)
2168 constructGlobalVariableDIE(*I);
2170 //getOrCreateTypeDIE
2171 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2172 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2173 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2175 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2176 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2177 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2179 // Prime section data.
2180 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2183 /// endModule - Emit all Dwarf sections that should come after the content.
2185 void DwarfDebug::endModule() {
2186 if (!FirstCU) return;
2187 const Module *M = MMI->getModule();
2188 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2189 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2190 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2191 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2192 DISubprogram SP(AllSPs->getOperand(SI));
2193 if (!SP.Verify()) continue;
2195 // Collect info for variables that were optimized out.
2196 if (!SP.isDefinition()) continue;
2197 StringRef FName = SP.getLinkageName();
2199 FName = SP.getName();
2200 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
2202 unsigned E = NMD->getNumOperands();
2204 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2205 DeadFnScopeMap[SP] = Scope;
2206 for (unsigned I = 0; I != E; ++I) {
2207 DIVariable DV(NMD->getOperand(I));
2208 if (!DV.Verify()) continue;
2209 Scope->addVariable(new DbgVariable(DV));
2212 // Construct subprogram DIE and add variables DIEs.
2213 constructSubprogramDIE(SP);
2214 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2215 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2216 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2217 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2219 ScopeDIE->addChild(VariableDIE);
2224 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2225 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2226 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2228 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2231 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2232 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2233 DIE *SPDie = CI->first;
2234 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2236 DIE *NDie = getCompileUnit(N)->getDIE(N);
2237 if (!NDie) continue;
2238 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2241 // Standard sections final addresses.
2242 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2243 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2244 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2245 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2247 // End text sections.
2248 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2249 Asm->OutStreamer.SwitchSection(SectionMap[i]);
2250 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2253 // Emit common frame information.
2254 emitCommonDebugFrame();
2256 // Emit function debug frame information
2257 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2258 E = DebugFrames.end(); I != E; ++I)
2259 emitFunctionDebugFrame(*I);
2261 // Compute DIE offsets and sizes.
2262 computeSizeAndOffsets();
2264 // Emit all the DIEs into a debug info section
2267 // Corresponding abbreviations into a abbrev section.
2268 emitAbbreviations();
2270 // Emit info into a debug pubnames section.
2271 emitDebugPubNames();
2273 // Emit info into a debug pubtypes section.
2274 emitDebugPubTypes();
2276 // Emit info into a debug loc section.
2279 // Emit info into a debug aranges section.
2282 // Emit info into a debug ranges section.
2285 // Emit info into a debug macinfo section.
2288 // Emit inline info.
2289 emitDebugInlineInfo();
2291 // Emit info into a debug str section.
2295 DeleteContainerSeconds(DeadFnScopeMap);
2296 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2297 E = CUMap.end(); I != E; ++I)
2299 FirstCU = NULL; // Reset for the next Module, if any.
2302 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2303 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2304 DebugLoc ScopeLoc) {
2306 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2308 return AbsDbgVariable;
2310 LLVMContext &Ctx = Var->getContext();
2311 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2315 AbsDbgVariable = new DbgVariable(Var);
2316 Scope->addVariable(AbsDbgVariable);
2317 AbstractVariables[Var] = AbsDbgVariable;
2318 return AbsDbgVariable;
2321 /// collectVariableInfoFromMMITable - Collect variable information from
2322 /// side table maintained by MMI.
2324 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2325 SmallPtrSet<const MDNode *, 16> &Processed) {
2326 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2327 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2328 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2329 VE = VMap.end(); VI != VE; ++VI) {
2330 const MDNode *Var = VI->first;
2332 Processed.insert(Var);
2334 const std::pair<unsigned, DebugLoc> &VP = VI->second;
2336 DbgScope *Scope = 0;
2337 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2338 Scope = ConcreteScopes.lookup(IA);
2340 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2342 // If variable scope is not found then skip this variable.
2346 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2347 DbgVariable *RegVar = new DbgVariable(DV);
2348 recordVariableFrameIndex(RegVar, VP.first);
2349 Scope->addVariable(RegVar);
2350 if (AbsDbgVariable) {
2351 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2352 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2357 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2358 /// DBG_VALUE instruction, is in a defined reg.
2359 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2360 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2361 if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2366 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2368 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2369 SmallPtrSet<const MDNode *, 16> &Processed) {
2371 /// collection info from MMI table.
2372 collectVariableInfoFromMMITable(MF, Processed);
2374 SmallVector<const MachineInstr *, 8> DbgValues;
2375 // Collect variable information from DBG_VALUE machine instructions;
2376 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2378 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2380 const MachineInstr *MInsn = II;
2381 if (!MInsn->isDebugValue())
2383 DbgValues.push_back(MInsn);
2386 // This is a collection of DBV_VALUE instructions describing same variable.
2387 SmallVector<const MachineInstr *, 4> MultipleValues;
2388 for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2389 E = DbgValues.end(); I != E; ++I) {
2390 const MachineInstr *MInsn = *I;
2391 MultipleValues.clear();
2392 if (isDbgValueInDefinedReg(MInsn))
2393 MultipleValues.push_back(MInsn);
2394 DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2395 if (Processed.count(DV) != 0)
2398 const MachineInstr *PrevMI = MInsn;
2399 for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2400 ME = DbgValues.end(); MI != ME; ++MI) {
2402 (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2404 !PrevMI->isIdenticalTo(*MI))
2405 MultipleValues.push_back(*MI);
2409 DbgScope *Scope = NULL;
2410 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2411 DISubprogram(DV.getContext()).describes(MF->getFunction()))
2412 Scope = CurrentFnDbgScope;
2414 Scope = findDbgScope(MInsn);
2415 // If variable scope is not found then skip this variable.
2419 Processed.insert(DV);
2420 DbgVariable *RegVar = new DbgVariable(DV);
2421 Scope->addVariable(RegVar);
2422 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2423 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2424 VarToAbstractVarMap[RegVar] = AbsVar;
2426 if (MultipleValues.size() <= 1) {
2427 DbgVariableToDbgInstMap[RegVar] = MInsn;
2431 // handle multiple DBG_VALUE instructions describing one variable.
2432 if (DotDebugLocEntries.empty())
2433 RegVar->setDotDebugLocOffset(0);
2435 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2436 const MachineInstr *Begin = NULL;
2437 const MachineInstr *End = NULL;
2438 for (SmallVector<const MachineInstr *, 4>::iterator
2439 MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2440 MVI != MVE; ++MVI) {
2446 MachineLocation MLoc;
2447 if (Begin->getNumOperands() == 3) {
2448 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2449 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2451 MLoc = Asm->getDebugValueLocation(Begin);
2453 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2454 const MCSymbol *SLabel = getLabelBeforeInsn(End);
2456 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2459 if (MVI + 1 == MVE) {
2460 // If End is the last instruction then its value is valid
2461 // until the end of the funtion.
2462 MachineLocation EMLoc;
2463 if (End->getNumOperands() == 3) {
2464 if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2465 EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2467 EMLoc = Asm->getDebugValueLocation(End);
2470 push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
2473 DotDebugLocEntries.push_back(DotDebugLocEntry());
2476 // Collect info for variables that were optimized out.
2477 const Function *F = MF->getFunction();
2478 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
2479 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2480 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2481 if (!DV || !Processed.insert(DV))
2483 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2485 Scope->addVariable(new DbgVariable(DV));
2490 /// getLabelBeforeInsn - Return Label preceding the instruction.
2491 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2492 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2493 LabelsBeforeInsn.find(MI);
2494 if (I == LabelsBeforeInsn.end())
2495 // FunctionBeginSym always preceeds all the instruction in current function.
2496 return FunctionBeginSym;
2500 /// getLabelAfterInsn - Return Label immediately following the instruction.
2501 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2502 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2503 LabelsAfterInsn.find(MI);
2504 if (I == LabelsAfterInsn.end())
2509 /// beginInstruction - Process beginning of an instruction.
2510 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
2511 if (InsnNeedsLabel.count(MI) == 0) {
2512 LabelsBeforeInsn[MI] = PrevLabel;
2517 DebugLoc DL = MI->getDebugLoc();
2518 if (!DL.isUnknown()) {
2519 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2520 PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2522 LabelsBeforeInsn[MI] = PrevLabel;
2526 // If location is unknown then use temp label for this DBG_VALUE
2528 if (MI->isDebugValue()) {
2529 PrevLabel = MMI->getContext().CreateTempSymbol();
2530 Asm->OutStreamer.EmitLabel(PrevLabel);
2531 LabelsBeforeInsn[MI] = PrevLabel;
2535 if (UnknownLocations) {
2536 PrevLabel = recordSourceLine(0, 0, 0);
2537 LabelsBeforeInsn[MI] = PrevLabel;
2541 assert (0 && "Instruction is not processed!");
2544 /// endInstruction - Process end of an instruction.
2545 void DwarfDebug::endInstruction(const MachineInstr *MI) {
2546 if (InsnsEndScopeSet.count(MI) != 0) {
2547 // Emit a label if this instruction ends a scope.
2548 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2549 Asm->OutStreamer.EmitLabel(Label);
2550 LabelsAfterInsn[MI] = Label;
2554 /// getOrCreateDbgScope - Create DbgScope for the scope.
2555 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2556 const MDNode *InlinedAt) {
2558 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2561 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2562 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2563 if (DIDescriptor(Scope).isLexicalBlock()) {
2565 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2566 WScope->setParent(Parent);
2567 Parent->addScope(WScope);
2570 if (!WScope->getParent()) {
2571 StringRef SPName = DISubprogram(Scope).getLinkageName();
2572 // We used to check only for a linkage name, but that fails
2573 // since we began omitting the linkage name for private
2574 // functions. The new way is to check for the name in metadata,
2575 // but that's not supported in old .ll test cases. Ergo, we
2577 if (SPName == Asm->MF->getFunction()->getName() ||
2578 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2579 CurrentFnDbgScope = WScope;
2585 getOrCreateAbstractScope(Scope);
2586 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2590 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2591 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2592 DILocation DL(InlinedAt);
2594 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2595 WScope->setParent(Parent);
2596 Parent->addScope(WScope);
2598 ConcreteScopes[InlinedAt] = WScope;
2603 /// hasValidLocation - Return true if debug location entry attached with
2604 /// machine instruction encodes valid location info.
2605 static bool hasValidLocation(LLVMContext &Ctx,
2606 const MachineInstr *MInsn,
2607 const MDNode *&Scope, const MDNode *&InlinedAt) {
2608 DebugLoc DL = MInsn->getDebugLoc();
2609 if (DL.isUnknown()) return false;
2611 const MDNode *S = DL.getScope(Ctx);
2613 // There is no need to create another DIE for compile unit. For all
2614 // other scopes, create one DbgScope now. This will be translated
2615 // into a scope DIE at the end.
2616 if (DIScope(S).isCompileUnit()) return false;
2619 InlinedAt = DL.getInlinedAt(Ctx);
2623 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2625 static void calculateDominanceGraph(DbgScope *Scope) {
2626 assert (Scope && "Unable to calculate scop edominance graph!");
2627 SmallVector<DbgScope *, 4> WorkStack;
2628 WorkStack.push_back(Scope);
2629 unsigned Counter = 0;
2630 while (!WorkStack.empty()) {
2631 DbgScope *WS = WorkStack.back();
2632 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2633 bool visitedChildren = false;
2634 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2635 SE = Children.end(); SI != SE; ++SI) {
2636 DbgScope *ChildScope = *SI;
2637 if (!ChildScope->getDFSOut()) {
2638 WorkStack.push_back(ChildScope);
2639 visitedChildren = true;
2640 ChildScope->setDFSIn(++Counter);
2644 if (!visitedChildren) {
2645 WorkStack.pop_back();
2646 WS->setDFSOut(++Counter);
2651 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2653 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2654 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2657 unsigned PrevDFSIn = 0;
2658 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2660 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2662 const MachineInstr *MInsn = II;
2663 const MDNode *Scope = NULL;
2664 const MDNode *InlinedAt = NULL;
2666 // Check if instruction has valid location information.
2667 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2671 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2672 MI2ScopeMap.find(MInsn);
2673 if (DI != MI2ScopeMap.end()) {
2674 DbgScope *S = DI->second;
2675 dbgs() << S->getDFSIn();
2676 PrevDFSIn = S->getDFSIn();
2678 dbgs() << PrevDFSIn;
2680 dbgs() << " [ x" << PrevDFSIn;
2688 /// extractScopeInformation - Scan machine instructions in this function
2689 /// and collect DbgScopes. Return true, if at least one scope was found.
2690 bool DwarfDebug::extractScopeInformation() {
2691 // If scope information was extracted using .dbg intrinsics then there is not
2692 // any need to extract these information by scanning each instruction.
2693 if (!DbgScopeMap.empty())
2696 // Scan each instruction and create scopes. First build working set of scopes.
2697 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2698 SmallVector<DbgRange, 4> MIRanges;
2699 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2700 const MDNode *PrevScope = NULL;
2701 const MDNode *PrevInlinedAt = NULL;
2702 const MachineInstr *RangeBeginMI = NULL;
2703 const MachineInstr *PrevMI = NULL;
2704 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2706 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2708 const MachineInstr *MInsn = II;
2709 const MDNode *Scope = NULL;
2710 const MDNode *InlinedAt = NULL;
2712 // Check if instruction has valid location information.
2713 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2718 // If scope has not changed then skip this instruction.
2719 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2724 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2725 if (MInsn->isDebugValue())
2729 // If we have alread seen a beginning of a instruction range and
2730 // current instruction scope does not match scope of first instruction
2731 // in this range then create a new instruction range.
2732 DbgRange R(RangeBeginMI, PrevMI);
2733 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2735 MIRanges.push_back(R);
2738 // This is a beginning of a new instruction range.
2739 RangeBeginMI = MInsn;
2741 // Reset previous markers.
2744 PrevInlinedAt = InlinedAt;
2748 // Create last instruction range.
2749 if (RangeBeginMI && PrevMI && PrevScope) {
2750 DbgRange R(RangeBeginMI, PrevMI);
2751 MIRanges.push_back(R);
2752 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2755 if (!CurrentFnDbgScope)
2758 calculateDominanceGraph(CurrentFnDbgScope);
2760 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2762 // Find ranges of instructions covered by each DbgScope;
2763 DbgScope *PrevDbgScope = NULL;
2764 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2765 RE = MIRanges.end(); RI != RE; ++RI) {
2766 const DbgRange &R = *RI;
2767 DbgScope *S = MI2ScopeMap.lookup(R.first);
2768 assert (S && "Lost DbgScope for a machine instruction!");
2769 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2770 PrevDbgScope->closeInsnRange(S);
2771 S->openInsnRange(R.first);
2772 S->extendInsnRange(R.second);
2777 PrevDbgScope->closeInsnRange();
2779 identifyScopeMarkers();
2781 return !DbgScopeMap.empty();
2784 /// identifyScopeMarkers() -
2785 /// Each DbgScope has first instruction and last instruction to mark beginning
2786 /// and end of a scope respectively. Create an inverse map that list scopes
2787 /// starts (and ends) with an instruction. One instruction may start (or end)
2788 /// multiple scopes. Ignore scopes that are not reachable.
2789 void DwarfDebug::identifyScopeMarkers() {
2790 SmallVector<DbgScope *, 4> WorkList;
2791 WorkList.push_back(CurrentFnDbgScope);
2792 while (!WorkList.empty()) {
2793 DbgScope *S = WorkList.pop_back_val();
2795 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2796 if (!Children.empty())
2797 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2798 SE = Children.end(); SI != SE; ++SI)
2799 WorkList.push_back(*SI);
2801 if (S->isAbstractScope())
2804 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2807 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2808 RE = Ranges.end(); RI != RE; ++RI) {
2809 assert(RI->first && "DbgRange does not have first instruction!");
2810 assert(RI->second && "DbgRange does not have second instruction!");
2811 InsnsEndScopeSet.insert(RI->second);
2816 /// FindFirstDebugLoc - Find the first debug location in the function. This
2817 /// is intended to be an approximation for the source position of the
2818 /// beginning of the function.
2819 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2820 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2822 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2823 MBBI != MBBE; ++MBBI) {
2824 DebugLoc DL = MBBI->getDebugLoc();
2825 if (!DL.isUnknown())
2832 /// CheckLineNumbers - Count basicblocks whose instructions do not have any
2833 /// line number information.
2834 static void CheckLineNumbers(const MachineFunction *MF) {
2835 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2837 bool FoundLineNo = false;
2838 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2840 const MachineInstr *MI = II;
2841 if (!MI->getDebugLoc().isUnknown()) {
2846 if (!FoundLineNo && I->size())
2847 ++BlocksWithoutLineNo;
2852 /// beginFunction - Gather pre-function debug information. Assumes being
2853 /// emitted immediately after the function entry point.
2854 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2855 if (!MMI->hasDebugInfo()) return;
2856 if (!extractScopeInformation()) return;
2859 CheckLineNumbers(MF);
2862 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2863 Asm->getFunctionNumber());
2864 // Assumes in correct section after the entry point.
2865 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2867 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2869 DebugLoc FDL = FindFirstDebugLoc(MF);
2870 if (FDL.isUnknown()) return;
2872 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2873 const MDNode *TheScope = 0;
2875 DISubprogram SP = getDISubprogram(Scope);
2878 Line = SP.getLineNumber();
2882 Line = FDL.getLine();
2887 recordSourceLine(Line, Col, TheScope);
2889 /// ProcessedArgs - Collection of arguments already processed.
2890 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2893 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2895 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2897 const MachineInstr *MI = II;
2898 DebugLoc DL = MI->getDebugLoc();
2899 if (MI->isDebugValue()) {
2900 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2901 DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2902 if (!DV.Verify()) continue;
2903 // If DBG_VALUE is for a local variable then it needs a label.
2904 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2905 InsnNeedsLabel.insert(MI);
2906 // DBG_VALUE for inlined functions argument needs a label.
2907 else if (!DISubprogram(getDISubprogram(DV.getContext())).
2908 describes(MF->getFunction()))
2909 InsnNeedsLabel.insert(MI);
2910 // DBG_VALUE indicating argument location change needs a label.
2911 else if (!ProcessedArgs.insert(DV))
2912 InsnNeedsLabel.insert(MI);
2914 // If location is unknown then instruction needs a location only if
2915 // UnknownLocations flag is set.
2916 if (DL.isUnknown()) {
2917 if (UnknownLocations && !PrevLoc.isUnknown())
2918 InsnNeedsLabel.insert(MI);
2919 } else if (DL != PrevLoc)
2920 // Otherwise, instruction needs a location only if it is new location.
2921 InsnNeedsLabel.insert(MI);
2924 if (!DL.isUnknown() || UnknownLocations)
2928 PrevLabel = FunctionBeginSym;
2931 /// endFunction - Gather and emit post-function debug information.
2933 void DwarfDebug::endFunction(const MachineFunction *MF) {
2934 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2936 if (CurrentFnDbgScope) {
2938 // Define end label for subprogram.
2939 FunctionEndSym = Asm->GetTempSymbol("func_end",
2940 Asm->getFunctionNumber());
2941 // Assumes in correct section after the entry point.
2942 Asm->OutStreamer.EmitLabel(FunctionEndSym);
2944 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2945 collectVariableInfo(MF, ProcessedVars);
2947 // Construct abstract scopes.
2948 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2949 AE = AbstractScopesList.end(); AI != AE; ++AI) {
2950 DISubprogram SP((*AI)->getScopeNode());
2952 // Collect info for variables that were optimized out.
2953 StringRef FName = SP.getLinkageName();
2955 FName = SP.getName();
2956 if (NamedMDNode *NMD =
2957 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2958 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2959 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2960 if (!DV || !ProcessedVars.insert(DV))
2962 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2964 Scope->addVariable(new DbgVariable(DV));
2968 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2969 constructScopeDIE(*AI);
2972 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2974 if (!DisableFramePointerElim(*MF))
2975 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2976 dwarf::DW_FORM_flag, 1);
2979 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2980 MMI->getFrameMoves()));
2984 CurrentFnDbgScope = NULL;
2985 InsnNeedsLabel.clear();
2986 DbgVariableToFrameIndexMap.clear();
2987 VarToAbstractVarMap.clear();
2988 DbgVariableToDbgInstMap.clear();
2989 DeleteContainerSeconds(DbgScopeMap);
2990 InsnsEndScopeSet.clear();
2991 ConcreteScopes.clear();
2992 DeleteContainerSeconds(AbstractScopes);
2993 AbstractScopesList.clear();
2994 AbstractVariables.clear();
2995 LabelsBeforeInsn.clear();
2996 LabelsAfterInsn.clear();
3000 /// recordVariableFrameIndex - Record a variable's index.
3001 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3002 assert (V && "Invalid DbgVariable!");
3003 DbgVariableToFrameIndexMap[V] = Index;
3006 /// findVariableFrameIndex - Return true if frame index for the variable
3007 /// is found. Update FI to hold value of the index.
3008 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3009 assert (V && "Invalid DbgVariable!");
3010 DenseMap<const DbgVariable *, int>::iterator I =
3011 DbgVariableToFrameIndexMap.find(V);
3012 if (I == DbgVariableToFrameIndexMap.end())
3018 /// findDbgScope - Find DbgScope for the debug loc attached with an
3020 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3021 DbgScope *Scope = NULL;
3023 MInsn->getParent()->getParent()->getFunction()->getContext();
3024 DebugLoc DL = MInsn->getDebugLoc();
3029 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3030 Scope = ConcreteScopes.lookup(IA);
3032 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
3038 /// recordSourceLine - Register a source line with debug info. Returns the
3039 /// unique label that was emitted and which provides correspondence to
3040 /// the source line list.
3041 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
3047 DIDescriptor Scope(S);
3049 if (Scope.isCompileUnit()) {
3050 DICompileUnit CU(S);
3051 Fn = CU.getFilename();
3052 } else if (Scope.isFile()) {
3054 Fn = F.getFilename();
3055 } else if (Scope.isSubprogram()) {
3057 Fn = SP.getFilename();
3058 } else if (Scope.isLexicalBlock()) {
3059 DILexicalBlock DB(S);
3060 Fn = DB.getFilename();
3062 assert(0 && "Unexpected scope info");
3064 Src = GetOrCreateSourceID(Fn);
3067 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3070 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
3071 Asm->OutStreamer.EmitLabel(Label);
3075 //===----------------------------------------------------------------------===//
3077 //===----------------------------------------------------------------------===//
3079 /// computeSizeAndOffset - Compute the size and offset of a DIE.
3082 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
3083 // Get the children.
3084 const std::vector<DIE *> &Children = Die->getChildren();
3086 // If not last sibling and has children then add sibling offset attribute.
3087 if (!Last && !Children.empty())
3088 Die->addSiblingOffset(DIEValueAllocator);
3090 // Record the abbreviation.
3091 assignAbbrevNumber(Die->getAbbrev());
3093 // Get the abbreviation for this DIE.
3094 unsigned AbbrevNumber = Die->getAbbrevNumber();
3095 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3098 Die->setOffset(Offset);
3100 // Start the size with the size of abbreviation code.
3101 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
3103 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3104 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3106 // Size the DIE attribute values.
3107 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3108 // Size attribute value.
3109 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
3111 // Size the DIE children if any.
3112 if (!Children.empty()) {
3113 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3114 "Children flag not set");
3116 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3117 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
3119 // End of children marker.
3120 Offset += sizeof(int8_t);
3123 Die->setSize(Offset - Die->getOffset());
3127 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3129 void DwarfDebug::computeSizeAndOffsets() {
3130 unsigned PrevOffset = 0;
3131 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3132 E = CUMap.end(); I != E; ++I) {
3133 // Compute size of compile unit header.
3134 static unsigned Offset = PrevOffset +
3135 sizeof(int32_t) + // Length of Compilation Unit Info
3136 sizeof(int16_t) + // DWARF version number
3137 sizeof(int32_t) + // Offset Into Abbrev. Section
3138 sizeof(int8_t); // Pointer Size (in bytes)
3139 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3140 PrevOffset = Offset;
3144 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3145 /// temporary label to it if SymbolStem is specified.
3146 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3147 const char *SymbolStem = 0) {
3148 Asm->OutStreamer.SwitchSection(Section);
3149 if (!SymbolStem) return 0;
3151 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3152 Asm->OutStreamer.EmitLabel(TmpSym);
3156 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3157 /// the start of each one.
3158 void DwarfDebug::EmitSectionLabels() {
3159 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3161 // Dwarf sections base addresses.
3162 if (Asm->MAI->doesDwarfRequireFrameSection()) {
3163 DwarfFrameSectionSym =
3164 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3167 DwarfInfoSectionSym =
3168 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3169 DwarfAbbrevSectionSym =
3170 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3171 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3173 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3174 EmitSectionSym(Asm, MacroInfo);
3176 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3177 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3178 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3179 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3180 DwarfStrSectionSym =
3181 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3182 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3185 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3186 "section_debug_loc");
3188 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3189 EmitSectionSym(Asm, TLOF.getDataSection());
3192 /// emitDIE - Recusively Emits a debug information entry.
3194 void DwarfDebug::emitDIE(DIE *Die) {
3195 // Get the abbreviation for this DIE.
3196 unsigned AbbrevNumber = Die->getAbbrevNumber();
3197 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3199 // Emit the code (index) for the abbreviation.
3200 if (Asm->isVerbose())
3201 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3202 Twine::utohexstr(Die->getOffset()) + ":0x" +
3203 Twine::utohexstr(Die->getSize()) + " " +
3204 dwarf::TagString(Abbrev->getTag()));
3205 Asm->EmitULEB128(AbbrevNumber);
3207 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3208 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3210 // Emit the DIE attribute values.
3211 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3212 unsigned Attr = AbbrevData[i].getAttribute();
3213 unsigned Form = AbbrevData[i].getForm();
3214 assert(Form && "Too many attributes for DIE (check abbreviation)");
3216 if (Asm->isVerbose())
3217 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3220 case dwarf::DW_AT_sibling:
3221 Asm->EmitInt32(Die->getSiblingOffset());
3223 case dwarf::DW_AT_abstract_origin: {
3224 DIEEntry *E = cast<DIEEntry>(Values[i]);
3225 DIE *Origin = E->getEntry();
3226 unsigned Addr = Origin->getOffset();
3227 Asm->EmitInt32(Addr);
3230 case dwarf::DW_AT_ranges: {
3231 // DW_AT_range Value encodes offset in debug_range section.
3232 DIEInteger *V = cast<DIEInteger>(Values[i]);
3234 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3235 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3239 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3241 DwarfDebugRangeSectionSym,
3246 case dwarf::DW_AT_location: {
3247 if (UseDotDebugLocEntry.count(Die) != 0) {
3248 DIELabel *L = cast<DIELabel>(Values[i]);
3249 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3251 Values[i]->EmitValue(Asm, Form);
3254 case dwarf::DW_AT_accessibility: {
3255 if (Asm->isVerbose()) {
3256 DIEInteger *V = cast<DIEInteger>(Values[i]);
3257 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3259 Values[i]->EmitValue(Asm, Form);
3263 // Emit an attribute using the defined form.
3264 Values[i]->EmitValue(Asm, Form);
3269 // Emit the DIE children if any.
3270 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3271 const std::vector<DIE *> &Children = Die->getChildren();
3273 for (unsigned j = 0, M = Children.size(); j < M; ++j)
3274 emitDIE(Children[j]);
3276 if (Asm->isVerbose())
3277 Asm->OutStreamer.AddComment("End Of Children Mark");
3282 /// emitDebugInfo - Emit the debug info section.
3284 void DwarfDebug::emitDebugInfo() {
3285 // Start debug info section.
3286 Asm->OutStreamer.SwitchSection(
3287 Asm->getObjFileLowering().getDwarfInfoSection());
3288 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3289 E = CUMap.end(); I != E; ++I) {
3290 CompileUnit *TheCU = I->second;
3291 DIE *Die = TheCU->getCUDie();
3293 // Emit the compile units header.
3294 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3297 // Emit size of content not including length itself
3298 unsigned ContentSize = Die->getSize() +
3299 sizeof(int16_t) + // DWARF version number
3300 sizeof(int32_t) + // Offset Into Abbrev. Section
3301 sizeof(int8_t) + // Pointer Size (in bytes)
3302 sizeof(int32_t); // FIXME - extra pad for gdb bug.
3304 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3305 Asm->EmitInt32(ContentSize);
3306 Asm->OutStreamer.AddComment("DWARF version number");
3307 Asm->EmitInt16(dwarf::DWARF_VERSION);
3308 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3309 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3310 DwarfAbbrevSectionSym);
3311 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3312 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3315 // FIXME - extra padding for gdb bug.
3316 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3325 /// emitAbbreviations - Emit the abbreviation section.
3327 void DwarfDebug::emitAbbreviations() const {
3328 // Check to see if it is worth the effort.
3329 if (!Abbreviations.empty()) {
3330 // Start the debug abbrev section.
3331 Asm->OutStreamer.SwitchSection(
3332 Asm->getObjFileLowering().getDwarfAbbrevSection());
3334 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3336 // For each abbrevation.
3337 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3338 // Get abbreviation data
3339 const DIEAbbrev *Abbrev = Abbreviations[i];
3341 // Emit the abbrevations code (base 1 index.)
3342 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3344 // Emit the abbreviations data.
3348 // Mark end of abbreviations.
3349 Asm->EmitULEB128(0, "EOM(3)");
3351 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3355 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3356 /// the line matrix.
3358 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3359 // Define last address of section.
3360 Asm->OutStreamer.AddComment("Extended Op");
3363 Asm->OutStreamer.AddComment("Op size");
3364 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3365 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3366 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3368 Asm->OutStreamer.AddComment("Section end label");
3370 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3371 Asm->getTargetData().getPointerSize(),
3374 // Mark end of matrix.
3375 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3381 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3383 void DwarfDebug::emitCommonDebugFrame() {
3384 if (!Asm->MAI->doesDwarfRequireFrameSection())
3387 int stackGrowth = Asm->getTargetData().getPointerSize();
3388 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3389 TargetFrameLowering::StackGrowsDown)
3392 // Start the dwarf frame section.
3393 Asm->OutStreamer.SwitchSection(
3394 Asm->getObjFileLowering().getDwarfFrameSection());
3396 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3397 Asm->OutStreamer.AddComment("Length of Common Information Entry");
3398 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3399 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3401 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3402 Asm->OutStreamer.AddComment("CIE Identifier Tag");
3403 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3404 Asm->OutStreamer.AddComment("CIE Version");
3405 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3406 Asm->OutStreamer.AddComment("CIE Augmentation");
3407 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3408 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3409 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3410 Asm->OutStreamer.AddComment("CIE RA Column");
3411 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3412 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
3413 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3415 std::vector<MachineMove> Moves;
3416 TFI->getInitialFrameState(Moves);
3418 Asm->EmitFrameMoves(Moves, 0, false);
3420 Asm->EmitAlignment(2);
3421 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3424 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3427 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3428 if (!Asm->MAI->doesDwarfRequireFrameSection())
3431 // Start the dwarf frame section.
3432 Asm->OutStreamer.SwitchSection(
3433 Asm->getObjFileLowering().getDwarfFrameSection());
3435 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3436 MCSymbol *DebugFrameBegin =
3437 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3438 MCSymbol *DebugFrameEnd =
3439 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3440 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3442 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3444 Asm->OutStreamer.AddComment("FDE CIE offset");
3445 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3446 DwarfFrameSectionSym);
3448 Asm->OutStreamer.AddComment("FDE initial location");
3449 MCSymbol *FuncBeginSym =
3450 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3451 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3452 Asm->getTargetData().getPointerSize(),
3456 Asm->OutStreamer.AddComment("FDE address range");
3457 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3458 FuncBeginSym, Asm->getTargetData().getPointerSize());
3460 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3462 Asm->EmitAlignment(2);
3463 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3466 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3468 void DwarfDebug::emitDebugPubNames() {
3469 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3470 E = CUMap.end(); I != E; ++I) {
3471 CompileUnit *TheCU = I->second;
3472 // Start the dwarf pubnames section.
3473 Asm->OutStreamer.SwitchSection(
3474 Asm->getObjFileLowering().getDwarfPubNamesSection());
3476 Asm->OutStreamer.AddComment("Length of Public Names Info");
3477 Asm->EmitLabelDifference(
3478 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3479 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3481 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3484 Asm->OutStreamer.AddComment("DWARF Version");
3485 Asm->EmitInt16(dwarf::DWARF_VERSION);
3487 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3488 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3489 DwarfInfoSectionSym);
3491 Asm->OutStreamer.AddComment("Compilation Unit Length");
3492 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3493 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3496 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3497 for (StringMap<DIE*>::const_iterator
3498 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3499 const char *Name = GI->getKeyData();
3500 DIE *Entity = GI->second;
3502 Asm->OutStreamer.AddComment("DIE offset");
3503 Asm->EmitInt32(Entity->getOffset());
3505 if (Asm->isVerbose())
3506 Asm->OutStreamer.AddComment("External Name");
3507 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3510 Asm->OutStreamer.AddComment("End Mark");
3512 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3517 void DwarfDebug::emitDebugPubTypes() {
3518 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3519 E = CUMap.end(); I != E; ++I) {
3520 CompileUnit *TheCU = I->second;
3521 // Start the dwarf pubnames section.
3522 Asm->OutStreamer.SwitchSection(
3523 Asm->getObjFileLowering().getDwarfPubTypesSection());
3524 Asm->OutStreamer.AddComment("Length of Public Types Info");
3525 Asm->EmitLabelDifference(
3526 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3527 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3529 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3532 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3533 Asm->EmitInt16(dwarf::DWARF_VERSION);
3535 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3536 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3537 DwarfInfoSectionSym);
3539 Asm->OutStreamer.AddComment("Compilation Unit Length");
3540 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3541 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3544 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3545 for (StringMap<DIE*>::const_iterator
3546 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3547 const char *Name = GI->getKeyData();
3548 DIE * Entity = GI->second;
3550 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3551 Asm->EmitInt32(Entity->getOffset());
3553 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3554 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3557 Asm->OutStreamer.AddComment("End Mark");
3559 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3564 /// emitDebugStr - Emit visible names into a debug str section.
3566 void DwarfDebug::emitDebugStr() {
3567 // Check to see if it is worth the effort.
3568 if (StringPool.empty()) return;
3570 // Start the dwarf str section.
3571 Asm->OutStreamer.SwitchSection(
3572 Asm->getObjFileLowering().getDwarfStrSection());
3574 // Get all of the string pool entries and put them in an array by their ID so
3575 // we can sort them.
3576 SmallVector<std::pair<unsigned,
3577 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3579 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3580 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3581 Entries.push_back(std::make_pair(I->second.second, &*I));
3583 array_pod_sort(Entries.begin(), Entries.end());
3585 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3586 // Emit a label for reference from debug information entries.
3587 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3589 // Emit the string itself.
3590 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3594 /// emitDebugLoc - Emit visible names into a debug loc section.
3596 void DwarfDebug::emitDebugLoc() {
3597 if (DotDebugLocEntries.empty())
3600 for (SmallVector<DotDebugLocEntry, 4>::iterator
3601 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3603 DotDebugLocEntry &Entry = *I;
3604 if (I + 1 != DotDebugLocEntries.end())
3608 // Start the dwarf loc section.
3609 Asm->OutStreamer.SwitchSection(
3610 Asm->getObjFileLowering().getDwarfLocSection());
3611 unsigned char Size = Asm->getTargetData().getPointerSize();
3612 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3614 for (SmallVector<DotDebugLocEntry, 4>::iterator
3615 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3616 I != E; ++I, ++index) {
3617 DotDebugLocEntry &Entry = *I;
3618 if (Entry.isMerged()) continue;
3619 if (Entry.isEmpty()) {
3620 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3621 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3622 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3624 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3625 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3626 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3627 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3628 if (int Offset = Entry.Loc.getOffset()) {
3629 // If the value is at a certain offset from frame register then
3631 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3632 Asm->OutStreamer.AddComment("Loc expr size");
3633 Asm->EmitInt16(1 + OffsetSize);
3634 Asm->OutStreamer.AddComment(
3635 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3636 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3637 Asm->OutStreamer.AddComment("Offset");
3638 Asm->EmitSLEB128(Offset);
3641 Asm->OutStreamer.AddComment("Loc expr size");
3643 Asm->OutStreamer.AddComment(
3644 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3645 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3647 Asm->OutStreamer.AddComment("Loc expr size");
3648 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3649 Asm->EmitInt8(dwarf::DW_OP_regx);
3650 Asm->EmitULEB128(Reg);
3657 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3659 void DwarfDebug::EmitDebugARanges() {
3660 // Start the dwarf aranges section.
3661 Asm->OutStreamer.SwitchSection(
3662 Asm->getObjFileLowering().getDwarfARangesSection());
3665 /// emitDebugRanges - Emit visible names into a debug ranges section.
3667 void DwarfDebug::emitDebugRanges() {
3668 // Start the dwarf ranges section.
3669 Asm->OutStreamer.SwitchSection(
3670 Asm->getObjFileLowering().getDwarfRangesSection());
3671 unsigned char Size = Asm->getTargetData().getPointerSize();
3672 for (SmallVector<const MCSymbol *, 8>::iterator
3673 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3676 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3678 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3682 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3684 void DwarfDebug::emitDebugMacInfo() {
3685 if (const MCSection *LineInfo =
3686 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3687 // Start the dwarf macinfo section.
3688 Asm->OutStreamer.SwitchSection(LineInfo);
3692 /// emitDebugInlineInfo - Emit inline info using following format.
3694 /// 1. length of section
3695 /// 2. Dwarf version number
3696 /// 3. address size.
3698 /// Entries (one "entry" for each function that was inlined):
3700 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3701 /// otherwise offset into __debug_str for regular function name.
3702 /// 2. offset into __debug_str section for regular function name.
3703 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3704 /// instances for the function.
3706 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3707 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3708 /// __debug_info section, and the low_pc is the starting address for the
3709 /// inlining instance.
3710 void DwarfDebug::emitDebugInlineInfo() {
3711 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3717 Asm->OutStreamer.SwitchSection(
3718 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3720 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3721 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3722 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3724 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3726 Asm->OutStreamer.AddComment("Dwarf Version");
3727 Asm->EmitInt16(dwarf::DWARF_VERSION);
3728 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3729 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3731 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3732 E = InlinedSPNodes.end(); I != E; ++I) {
3734 const MDNode *Node = *I;
3735 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3736 = InlineInfo.find(Node);
3737 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3738 DISubprogram SP(Node);
3739 StringRef LName = SP.getLinkageName();
3740 StringRef Name = SP.getName();
3742 Asm->OutStreamer.AddComment("MIPS linkage name");
3743 if (LName.empty()) {
3744 Asm->OutStreamer.EmitBytes(Name, 0);
3745 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3747 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3748 DwarfStrSectionSym);
3750 Asm->OutStreamer.AddComment("Function name");
3751 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3752 Asm->EmitULEB128(Labels.size(), "Inline count");
3754 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3755 LE = Labels.end(); LI != LE; ++LI) {
3756 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3757 Asm->EmitInt32(LI->second->getOffset());
3759 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3760 Asm->OutStreamer.EmitSymbolValue(LI->first,
3761 Asm->getTargetData().getPointerSize(),0);
3765 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));