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"
16 #include "llvm/Module.h"
17 #include "llvm/CodeGen/MachineFunction.h"
18 #include "llvm/CodeGen/MachineModuleInfo.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCSection.h"
21 #include "llvm/MC/MCStreamer.h"
22 #include "llvm/MC/MCSymbol.h"
23 #include "llvm/Target/Mangler.h"
24 #include "llvm/Target/TargetData.h"
25 #include "llvm/Target/TargetFrameInfo.h"
26 #include "llvm/Target/TargetLoweringObjectFile.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/Target/TargetRegisterInfo.h"
29 #include "llvm/ADT/STLExtras.h"
30 #include "llvm/ADT/StringExtras.h"
31 #include "llvm/Support/Debug.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/ValueHandle.h"
34 #include "llvm/Support/FormattedStream.h"
35 #include "llvm/Support/Timer.h"
36 #include "llvm/System/Path.h"
39 //===----------------------------------------------------------------------===//
41 /// Configuration values for initial hash set sizes (log2).
43 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
47 //===----------------------------------------------------------------------===//
48 /// CompileUnit - This dwarf writer support class manages information associate
49 /// with a source file.
51 /// ID - File identifier for source.
55 /// Die - Compile unit debug information entry.
57 const OwningPtr<DIE> CUDie;
59 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
62 /// GVToDieMap - Tracks the mapping of unit level debug informaton
63 /// variables to debug information entries.
64 /// FIXME : Rename GVToDieMap -> NodeToDieMap
65 DenseMap<MDNode *, DIE *> GVToDieMap;
67 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
68 /// descriptors to debug information entries using a DIEEntry proxy.
70 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
72 /// Globals - A map of globally visible named entities for this unit.
74 StringMap<DIE*> Globals;
76 /// GlobalTypes - A map of globally visible types for this unit.
78 StringMap<DIE*> GlobalTypes;
81 CompileUnit(unsigned I, DIE *D)
82 : ID(I), CUDie(D), IndexTyDie(0) {}
85 unsigned getID() const { return ID; }
86 DIE* getCUDie() const { return CUDie.get(); }
87 const StringMap<DIE*> &getGlobals() const { return Globals; }
88 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
90 /// hasContent - Return true if this compile unit has something to write out.
92 bool hasContent() const { return !CUDie->getChildren().empty(); }
94 /// addGlobal - Add a new global entity to the compile unit.
96 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
98 /// addGlobalType - Add a new global type to the compile unit.
100 void addGlobalType(StringRef Name, DIE *Die) {
101 GlobalTypes[Name] = Die;
104 /// getDIE - Returns the debug information entry map slot for the
105 /// specified debug variable.
106 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
108 /// insertDIE - Insert DIE into the map.
109 void insertDIE(MDNode *N, DIE *D) {
110 GVToDieMap.insert(std::make_pair(N, D));
113 /// getDIEEntry - Returns the debug information entry for the speciefied
115 DIEEntry *getDIEEntry(MDNode *N) {
116 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
117 if (I == GVToDIEEntryMap.end())
122 /// insertDIEEntry - Insert debug information entry into the map.
123 void insertDIEEntry(MDNode *N, DIEEntry *E) {
124 GVToDIEEntryMap.insert(std::make_pair(N, E));
127 /// addDie - Adds or interns the DIE to the compile unit.
129 void addDie(DIE *Buffer) {
130 this->CUDie->addChild(Buffer);
133 // getIndexTyDie - Get an anonymous type for index type.
134 DIE *getIndexTyDie() {
138 // setIndexTyDie - Set D as anonymous type for index which can be reused
140 void setIndexTyDie(DIE *D) {
146 //===----------------------------------------------------------------------===//
147 /// DbgVariable - This class is used to track local variable information.
150 DIVariable Var; // Variable Descriptor.
151 unsigned FrameIndex; // Variable frame index.
152 const MachineInstr *DbgValueMInsn; // DBG_VALUE
153 // DbgValueLabel - DBG_VALUE is effective from this label.
154 MCSymbol *DbgValueLabel;
155 DbgVariable *const AbstractVar; // Abstract variable for this variable.
158 // AbsVar may be NULL.
159 DbgVariable(DIVariable V, unsigned I, DbgVariable *AbsVar)
160 : Var(V), FrameIndex(I), DbgValueMInsn(0),
161 DbgValueLabel(0), AbstractVar(AbsVar), TheDIE(0) {}
162 DbgVariable(DIVariable V, const MachineInstr *MI, DbgVariable *AbsVar)
163 : Var(V), FrameIndex(0), DbgValueMInsn(MI), DbgValueLabel(0),
164 AbstractVar(AbsVar), TheDIE(0)
168 DIVariable getVariable() const { return Var; }
169 unsigned getFrameIndex() const { return FrameIndex; }
170 const MachineInstr *getDbgValue() const { return DbgValueMInsn; }
171 MCSymbol *getDbgValueLabel() const { return DbgValueLabel; }
172 void setDbgValueLabel(MCSymbol *L) { DbgValueLabel = L; }
173 DbgVariable *getAbstractVariable() const { return AbstractVar; }
174 void setDIE(DIE *D) { TheDIE = D; }
175 DIE *getDIE() const { return TheDIE; }
178 //===----------------------------------------------------------------------===//
179 /// DbgScope - This class is used to track scope information.
182 DbgScope *Parent; // Parent to this scope.
183 DIDescriptor Desc; // Debug info descriptor for scope.
184 // Location at which this scope is inlined.
185 AssertingVH<MDNode> InlinedAtLocation;
186 bool AbstractScope; // Abstract Scope
187 MCSymbol *StartLabel; // Label ID of the beginning of scope.
188 MCSymbol *EndLabel; // Label ID of the end of scope.
189 const MachineInstr *LastInsn; // Last instruction of this scope.
190 const MachineInstr *FirstInsn; // First instruction of this scope.
191 // Scopes defined in scope. Contents not owned.
192 SmallVector<DbgScope *, 4> Scopes;
193 // Variables declared in scope. Contents owned.
194 SmallVector<DbgVariable *, 8> Variables;
196 // Private state for dump()
197 mutable unsigned IndentLevel;
199 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
200 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
201 StartLabel(0), EndLabel(0),
202 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
206 DbgScope *getParent() const { return Parent; }
207 void setParent(DbgScope *P) { Parent = P; }
208 DIDescriptor getDesc() const { return Desc; }
209 MDNode *getInlinedAt() const { return InlinedAtLocation; }
210 MDNode *getScopeNode() const { return Desc.getNode(); }
211 MCSymbol *getStartLabel() const { return StartLabel; }
212 MCSymbol *getEndLabel() const { return EndLabel; }
213 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
214 const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
215 void setStartLabel(MCSymbol *S) { StartLabel = S; }
216 void setEndLabel(MCSymbol *E) { EndLabel = E; }
217 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
218 const MachineInstr *getLastInsn() { return LastInsn; }
219 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
220 void setAbstractScope() { AbstractScope = true; }
221 bool isAbstractScope() const { return AbstractScope; }
222 const MachineInstr *getFirstInsn() { return FirstInsn; }
224 /// addScope - Add a scope to the scope.
226 void addScope(DbgScope *S) { Scopes.push_back(S); }
228 /// addVariable - Add a variable to the scope.
230 void addVariable(DbgVariable *V) { Variables.push_back(V); }
232 void fixInstructionMarkers(DenseMap<const MachineInstr *,
233 unsigned> &MIIndexMap) {
234 assert(getFirstInsn() && "First instruction is missing!");
236 // Use the end of last child scope as end of this scope.
237 const SmallVector<DbgScope *, 4> &Scopes = getScopes();
238 const MachineInstr *LastInsn = getFirstInsn();
240 if (Scopes.empty()) {
241 assert(getLastInsn() && "Inner most scope does not have last insn!");
244 for (SmallVector<DbgScope *, 4>::const_iterator SI = Scopes.begin(),
245 SE = Scopes.end(); SI != SE; ++SI) {
247 DS->fixInstructionMarkers(MIIndexMap);
248 const MachineInstr *DSLastInsn = DS->getLastInsn();
249 unsigned DSI = MIIndexMap[DSLastInsn];
251 LastInsn = DSLastInsn;
256 unsigned CurrentLastInsnIndex = 0;
257 if (const MachineInstr *CL = getLastInsn())
258 CurrentLastInsnIndex = MIIndexMap[CL];
259 unsigned FIndex = MIIndexMap[getFirstInsn()];
261 // Set LastInsn as the last instruction for this scope only if
263 // 1) this scope's first instruction and
264 // 2) current last instruction for this scope, if any.
265 if (LIndex >= CurrentLastInsnIndex && LIndex >= FIndex)
266 setLastInsn(LastInsn);
275 void DbgScope::dump() const {
276 raw_ostream &err = dbgs();
277 err.indent(IndentLevel);
278 MDNode *N = Desc.getNode();
280 err << " [" << StartLabel << ", " << EndLabel << "]\n";
282 err << "Abstract Scope\n";
286 err << "Children ...\n";
287 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
288 if (Scopes[i] != this)
295 DbgScope::~DbgScope() {
296 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
300 } // end llvm namespace
302 DwarfDebug::DwarfDebug(AsmPrinter *A)
303 : DwarfPrinter(A), ModuleCU(0),
304 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
305 DIEBlocks(), SectionSourceLines(), didInitial(false), shouldEmit(false),
306 CurrentFnDbgScope(0), DebugTimer(0) {
307 NextStringPoolNumber = 0;
308 if (TimePassesIsEnabled)
309 DebugTimer = new Timer("Dwarf Debug Writer");
311 DwarfDebug::~DwarfDebug() {
312 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
313 DIEBlocks[j]->~DIEBlock();
318 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
319 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
320 if (Entry.first) return Entry.first;
322 Entry.second = NextStringPoolNumber++;
323 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
327 /// assignAbbrevNumber - Define a unique number for the abbreviation.
329 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
330 // Profile the node so that we can make it unique.
334 // Check the set for priors.
335 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
337 // If it's newly added.
338 if (InSet == &Abbrev) {
339 // Add to abbreviation list.
340 Abbreviations.push_back(&Abbrev);
342 // Assign the vector position + 1 as its number.
343 Abbrev.setNumber(Abbreviations.size());
345 // Assign existing abbreviation number.
346 Abbrev.setNumber(InSet->getNumber());
350 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
351 /// information entry.
352 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
353 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
357 /// addUInt - Add an unsigned integer attribute data and value.
359 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
360 unsigned Form, uint64_t Integer) {
361 if (!Form) Form = DIEInteger::BestForm(false, Integer);
362 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
363 Die->addValue(Attribute, Form, Value);
366 /// addSInt - Add an signed integer attribute data and value.
368 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
369 unsigned Form, int64_t Integer) {
370 if (!Form) Form = DIEInteger::BestForm(true, Integer);
371 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
372 Die->addValue(Attribute, Form, Value);
375 /// addString - Add a string attribute data and value. DIEString only
376 /// keeps string reference.
377 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
379 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
380 Die->addValue(Attribute, Form, Value);
383 /// addLabel - Add a Dwarf label attribute data and value.
385 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
386 const MCSymbol *Label) {
387 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
388 Die->addValue(Attribute, Form, Value);
391 /// addDelta - Add a label delta attribute data and value.
393 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
394 const MCSymbol *Hi, const MCSymbol *Lo) {
395 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
396 Die->addValue(Attribute, Form, Value);
399 /// addBlock - Add block data.
401 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
403 Block->ComputeSize(TD);
404 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
405 Die->addValue(Attribute, Block->BestForm(), Block);
408 /// addSourceLine - Add location information to specified debug information
410 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
411 // If there is no compile unit specified, don't add a line #.
412 if (!V->getCompileUnit().Verify())
415 unsigned Line = V->getLineNumber();
416 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
417 V->getContext().getFilename());
418 assert(FileID && "Invalid file id");
419 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
420 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
423 /// addSourceLine - Add location information to specified debug information
425 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
426 // If there is no compile unit specified, don't add a line #.
427 if (!G->getCompileUnit().Verify())
430 unsigned Line = G->getLineNumber();
431 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
432 G->getContext().getFilename());
433 assert(FileID && "Invalid file id");
434 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
435 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
438 /// addSourceLine - Add location information to specified debug information
440 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
441 // If there is no compile unit specified, don't add a line #.
442 if (!SP->getCompileUnit().Verify())
444 // If the line number is 0, don't add it.
445 if (SP->getLineNumber() == 0)
448 unsigned Line = SP->getLineNumber();
449 if (!SP->getContext().Verify())
451 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
453 assert(FileID && "Invalid file id");
454 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
455 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
458 /// addSourceLine - Add location information to specified debug information
460 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
461 // If there is no compile unit specified, don't add a line #.
462 DICompileUnit CU = Ty->getCompileUnit();
466 unsigned Line = Ty->getLineNumber();
467 if (!Ty->getContext().Verify())
469 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
470 Ty->getContext().getFilename());
471 assert(FileID && "Invalid file id");
472 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
473 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
476 /// addSourceLine - Add location information to specified debug information
478 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
479 // If there is no compile unit specified, don't add a line #.
480 if (!NS->getCompileUnit().Verify())
483 unsigned Line = NS->getLineNumber();
484 StringRef FN = NS->getFilename();
485 StringRef Dir = NS->getDirectory();
487 unsigned FileID = GetOrCreateSourceID(Dir, FN);
488 assert(FileID && "Invalid file id");
489 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
490 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
493 /* Byref variables, in Blocks, are declared by the programmer as
494 "SomeType VarName;", but the compiler creates a
495 __Block_byref_x_VarName struct, and gives the variable VarName
496 either the struct, or a pointer to the struct, as its type. This
497 is necessary for various behind-the-scenes things the compiler
498 needs to do with by-reference variables in blocks.
500 However, as far as the original *programmer* is concerned, the
501 variable should still have type 'SomeType', as originally declared.
503 The following function dives into the __Block_byref_x_VarName
504 struct to find the original type of the variable. This will be
505 passed back to the code generating the type for the Debug
506 Information Entry for the variable 'VarName'. 'VarName' will then
507 have the original type 'SomeType' in its debug information.
509 The original type 'SomeType' will be the type of the field named
510 'VarName' inside the __Block_byref_x_VarName struct.
512 NOTE: In order for this to not completely fail on the debugger
513 side, the Debug Information Entry for the variable VarName needs to
514 have a DW_AT_location that tells the debugger how to unwind through
515 the pointers and __Block_byref_x_VarName struct to find the actual
516 value of the variable. The function addBlockByrefType does this. */
518 /// Find the type the programmer originally declared the variable to be
519 /// and return that type.
521 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
524 unsigned tag = Ty.getTag();
526 if (tag == dwarf::DW_TAG_pointer_type) {
527 DIDerivedType DTy = DIDerivedType(Ty.getNode());
528 subType = DTy.getTypeDerivedFrom();
531 DICompositeType blockStruct = DICompositeType(subType.getNode());
532 DIArray Elements = blockStruct.getTypeArray();
534 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
535 DIDescriptor Element = Elements.getElement(i);
536 DIDerivedType DT = DIDerivedType(Element.getNode());
537 if (Name == DT.getName())
538 return (DT.getTypeDerivedFrom());
544 /// addComplexAddress - Start with the address based on the location provided,
545 /// and generate the DWARF information necessary to find the actual variable
546 /// given the extra address information encoded in the DIVariable, starting from
547 /// the starting location. Add the DWARF information to the die.
549 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
551 const MachineLocation &Location) {
552 const DIVariable &VD = DV->getVariable();
553 DIType Ty = VD.getType();
555 // Decode the original location, and use that as the start of the byref
556 // variable's location.
557 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
558 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
560 if (Location.isReg()) {
562 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
564 Reg = Reg - dwarf::DW_OP_reg0;
565 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
566 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
570 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
573 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
576 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
579 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
580 uint64_t Element = VD.getAddrElement(i);
582 if (Element == DIFactory::OpPlus) {
583 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
584 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
585 } else if (Element == DIFactory::OpDeref) {
586 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
587 } else llvm_unreachable("unknown DIFactory Opcode");
590 // Now attach the location information to the DIE.
591 addBlock(Die, Attribute, 0, Block);
594 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
595 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
596 gives the variable VarName either the struct, or a pointer to the struct, as
597 its type. This is necessary for various behind-the-scenes things the
598 compiler needs to do with by-reference variables in Blocks.
600 However, as far as the original *programmer* is concerned, the variable
601 should still have type 'SomeType', as originally declared.
603 The function getBlockByrefType dives into the __Block_byref_x_VarName
604 struct to find the original type of the variable, which is then assigned to
605 the variable's Debug Information Entry as its real type. So far, so good.
606 However now the debugger will expect the variable VarName to have the type
607 SomeType. So we need the location attribute for the variable to be an
608 expression that explains to the debugger how to navigate through the
609 pointers and struct to find the actual variable of type SomeType.
611 The following function does just that. We start by getting
612 the "normal" location for the variable. This will be the location
613 of either the struct __Block_byref_x_VarName or the pointer to the
614 struct __Block_byref_x_VarName.
616 The struct will look something like:
618 struct __Block_byref_x_VarName {
620 struct __Block_byref_x_VarName *forwarding;
621 ... <various other fields>
623 ... <maybe more fields>
626 If we are given the struct directly (as our starting point) we
627 need to tell the debugger to:
629 1). Add the offset of the forwarding field.
631 2). Follow that pointer to get the real __Block_byref_x_VarName
632 struct to use (the real one may have been copied onto the heap).
634 3). Add the offset for the field VarName, to find the actual variable.
636 If we started with a pointer to the struct, then we need to
637 dereference that pointer first, before the other steps.
638 Translating this into DWARF ops, we will need to append the following
639 to the current location description for the variable:
641 DW_OP_deref -- optional, if we start with a pointer
642 DW_OP_plus_uconst <forward_fld_offset>
644 DW_OP_plus_uconst <varName_fld_offset>
646 That is what this function does. */
648 /// addBlockByrefAddress - Start with the address based on the location
649 /// provided, and generate the DWARF information necessary to find the
650 /// actual Block variable (navigating the Block struct) based on the
651 /// starting location. Add the DWARF information to the die. For
652 /// more information, read large comment just above here.
654 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
656 const MachineLocation &Location) {
657 const DIVariable &VD = DV->getVariable();
658 DIType Ty = VD.getType();
660 unsigned Tag = Ty.getTag();
661 bool isPointer = false;
663 StringRef varName = VD.getName();
665 if (Tag == dwarf::DW_TAG_pointer_type) {
666 DIDerivedType DTy = DIDerivedType(Ty.getNode());
667 TmpTy = DTy.getTypeDerivedFrom();
671 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
673 // Find the __forwarding field and the variable field in the __Block_byref
675 DIArray Fields = blockStruct.getTypeArray();
676 DIDescriptor varField = DIDescriptor();
677 DIDescriptor forwardingField = DIDescriptor();
679 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
680 DIDescriptor Element = Fields.getElement(i);
681 DIDerivedType DT = DIDerivedType(Element.getNode());
682 StringRef fieldName = DT.getName();
683 if (fieldName == "__forwarding")
684 forwardingField = Element;
685 else if (fieldName == varName)
689 // Get the offsets for the forwarding field and the variable field.
690 unsigned forwardingFieldOffset =
691 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
692 unsigned varFieldOffset =
693 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
695 // Decode the original location, and use that as the start of the byref
696 // variable's location.
697 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
698 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
700 if (Location.isReg()) {
702 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
704 Reg = Reg - dwarf::DW_OP_reg0;
705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
706 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
710 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
712 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
713 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
716 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
719 // If we started with a pointer to the __Block_byref... struct, then
720 // the first thing we need to do is dereference the pointer (DW_OP_deref).
722 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
724 // Next add the offset for the '__forwarding' field:
725 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
726 // adding the offset if it's 0.
727 if (forwardingFieldOffset > 0) {
728 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
729 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
732 // Now dereference the __forwarding field to get to the real __Block_byref
733 // struct: DW_OP_deref.
734 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
736 // Now that we've got the real __Block_byref... struct, add the offset
737 // for the variable's field to get to the location of the actual variable:
738 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
739 if (varFieldOffset > 0) {
740 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
741 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
744 // Now attach the location information to the DIE.
745 addBlock(Die, Attribute, 0, Block);
748 /// addAddress - Add an address attribute to a die based on the location
750 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
751 const MachineLocation &Location) {
752 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
753 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
755 if (Location.isReg()) {
757 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
759 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
760 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
764 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
766 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
767 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
770 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
773 addBlock(Die, Attribute, 0, Block);
776 /// addToContextOwner - Add Die into the list of its context owner's children.
777 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
778 if (Context.isType()) {
779 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
780 ContextDIE->addChild(Die);
781 } else if (Context.isNameSpace()) {
782 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
783 ContextDIE->addChild(Die);
784 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
785 ContextDIE->addChild(Die);
787 ModuleCU->addDie(Die);
790 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
792 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
793 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
798 TyDIE = new DIE(dwarf::DW_TAG_base_type);
799 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
800 if (Ty.isBasicType())
801 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
802 else if (Ty.isCompositeType())
803 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
805 assert(Ty.isDerivedType() && "Unknown kind of DIType");
806 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
809 addToContextOwner(TyDIE, Ty.getContext());
813 /// addType - Add a new type attribute to the specified entity.
814 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
818 // Check for pre-existence.
819 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
820 // If it exists then use the existing value.
822 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
827 DIE *Buffer = getOrCreateTypeDIE(Ty);
830 Entry = createDIEEntry(Buffer);
831 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
833 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
836 /// constructTypeDIE - Construct basic type die from DIBasicType.
837 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
838 // Get core information.
839 StringRef Name = BTy.getName();
840 Buffer.setTag(dwarf::DW_TAG_base_type);
841 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
844 // Add name if not anonymous or intermediate type.
846 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
847 uint64_t Size = BTy.getSizeInBits() >> 3;
848 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
851 /// constructTypeDIE - Construct derived type die from DIDerivedType.
852 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
853 // Get core information.
854 StringRef Name = DTy.getName();
855 uint64_t Size = DTy.getSizeInBits() >> 3;
856 unsigned Tag = DTy.getTag();
858 // FIXME - Workaround for templates.
859 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
863 // Map to main type, void will not have a type.
864 DIType FromTy = DTy.getTypeDerivedFrom();
865 addType(&Buffer, FromTy);
867 // Add name if not anonymous or intermediate type.
869 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
871 // Add size if non-zero (derived types might be zero-sized.)
873 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
875 // Add source line info if available and TyDesc is not a forward declaration.
876 if (!DTy.isForwardDecl())
877 addSourceLine(&Buffer, &DTy);
880 /// constructTypeDIE - Construct type DIE from DICompositeType.
881 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
882 // Get core information.
883 StringRef Name = CTy.getName();
885 uint64_t Size = CTy.getSizeInBits() >> 3;
886 unsigned Tag = CTy.getTag();
890 case dwarf::DW_TAG_vector_type:
891 case dwarf::DW_TAG_array_type:
892 constructArrayTypeDIE(Buffer, &CTy);
894 case dwarf::DW_TAG_enumeration_type: {
895 DIArray Elements = CTy.getTypeArray();
897 // Add enumerators to enumeration type.
898 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
900 DIDescriptor Enum(Elements.getElement(i).getNode());
901 if (Enum.isEnumerator()) {
902 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum.getNode()));
903 Buffer.addChild(ElemDie);
908 case dwarf::DW_TAG_subroutine_type: {
910 DIArray Elements = CTy.getTypeArray();
911 DIDescriptor RTy = Elements.getElement(0);
912 addType(&Buffer, DIType(RTy.getNode()));
914 // Add prototype flag.
915 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
918 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
919 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
920 DIDescriptor Ty = Elements.getElement(i);
921 addType(Arg, DIType(Ty.getNode()));
922 Buffer.addChild(Arg);
926 case dwarf::DW_TAG_structure_type:
927 case dwarf::DW_TAG_union_type:
928 case dwarf::DW_TAG_class_type: {
929 // Add elements to structure type.
930 DIArray Elements = CTy.getTypeArray();
932 // A forward struct declared type may not have elements available.
933 unsigned N = Elements.getNumElements();
937 // Add elements to structure type.
938 for (unsigned i = 0; i < N; ++i) {
939 DIDescriptor Element = Elements.getElement(i);
941 if (Element.isSubprogram())
942 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
943 else if (Element.isVariable()) {
944 DIVariable DV(Element.getNode());
945 ElemDie = new DIE(dwarf::DW_TAG_variable);
946 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
948 addType(ElemDie, DV.getType());
949 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
950 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
951 addSourceLine(ElemDie, &DV);
952 } else if (Element.isDerivedType())
953 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
956 Buffer.addChild(ElemDie);
959 if (CTy.isAppleBlockExtension())
960 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
962 unsigned RLang = CTy.getRunTimeLang();
964 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
965 dwarf::DW_FORM_data1, RLang);
967 DICompositeType ContainingType = CTy.getContainingType();
968 if (DIDescriptor(ContainingType.getNode()).isCompositeType())
969 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
970 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
977 // Add name if not anonymous or intermediate type.
979 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
981 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
982 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
983 // Add size if non-zero (derived types might be zero-sized.)
985 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
987 // Add zero size if it is not a forward declaration.
988 if (CTy.isForwardDecl())
989 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
991 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
994 // Add source line info if available.
995 if (!CTy.isForwardDecl())
996 addSourceLine(&Buffer, &CTy);
1000 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1001 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1002 int64_t L = SR.getLo();
1003 int64_t H = SR.getHi();
1004 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1006 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1008 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1009 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1011 Buffer.addChild(DW_Subrange);
1014 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1015 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1016 DICompositeType *CTy) {
1017 Buffer.setTag(dwarf::DW_TAG_array_type);
1018 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1019 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1021 // Emit derived type.
1022 addType(&Buffer, CTy->getTypeDerivedFrom());
1023 DIArray Elements = CTy->getTypeArray();
1025 // Get an anonymous type for index type.
1026 DIE *IdxTy = ModuleCU->getIndexTyDie();
1028 // Construct an anonymous type for index type.
1029 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1030 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1031 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1032 dwarf::DW_ATE_signed);
1033 ModuleCU->addDie(IdxTy);
1034 ModuleCU->setIndexTyDie(IdxTy);
1037 // Add subranges to array type.
1038 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1039 DIDescriptor Element = Elements.getElement(i);
1040 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1041 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1045 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1046 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1047 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1048 StringRef Name = ETy.getName();
1049 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1050 int64_t Value = ETy.getEnumValue();
1051 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1055 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1056 /// printer to not emit usual symbol prefix before the symbol name is used then
1057 /// return linkage name after skipping this special LLVM prefix.
1058 static StringRef getRealLinkageName(StringRef LinkageName) {
1060 if (LinkageName.startswith(StringRef(&One, 1)))
1061 return LinkageName.substr(1);
1065 /// createGlobalVariableDIE - Create new DIE using GV.
1066 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1067 // If the global variable was optmized out then no need to create debug info
1069 if (!GV.getGlobal()) return NULL;
1070 if (GV.getDisplayName().empty()) return NULL;
1072 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1073 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1074 GV.getDisplayName());
1076 StringRef LinkageName = GV.getLinkageName();
1077 if (!LinkageName.empty())
1078 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1079 getRealLinkageName(LinkageName));
1081 addType(GVDie, GV.getType());
1082 if (!GV.isLocalToUnit())
1083 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1084 addSourceLine(GVDie, &GV);
1089 /// createMemberDIE - Create new member DIE.
1090 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1091 DIE *MemberDie = new DIE(DT.getTag());
1092 StringRef Name = DT.getName();
1094 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1096 addType(MemberDie, DT.getTypeDerivedFrom());
1098 addSourceLine(MemberDie, &DT);
1100 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1101 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1103 uint64_t Size = DT.getSizeInBits();
1104 uint64_t FieldSize = DT.getOriginalTypeSize();
1106 if (Size != FieldSize) {
1108 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1109 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1111 uint64_t Offset = DT.getOffsetInBits();
1112 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1113 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1114 uint64_t FieldOffset = (HiMark - FieldSize);
1115 Offset -= FieldOffset;
1117 // Maybe we need to work from the other end.
1118 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1119 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1121 // Here WD_AT_data_member_location points to the anonymous
1122 // field that includes this bit field.
1123 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1126 // This is not a bitfield.
1127 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1129 if (DT.getTag() == dwarf::DW_TAG_inheritance
1130 && DT.isVirtual()) {
1132 // For C++, virtual base classes are not at fixed offset. Use following
1133 // expression to extract appropriate offset from vtable.
1134 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1136 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1137 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1138 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1139 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1140 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1141 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1142 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1143 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1145 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1148 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1150 if (DT.isProtected())
1151 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1152 dwarf::DW_ACCESS_protected);
1153 else if (DT.isPrivate())
1154 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1155 dwarf::DW_ACCESS_private);
1156 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1157 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1158 dwarf::DW_ACCESS_public);
1160 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1161 dwarf::DW_VIRTUALITY_virtual);
1165 /// createSubprogramDIE - Create new DIE using SP.
1166 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1167 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1171 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1172 // Constructors and operators for anonymous aggregates do not have names.
1173 if (!SP.getName().empty())
1174 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1176 StringRef LinkageName = SP.getLinkageName();
1177 if (!LinkageName.empty())
1178 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1179 getRealLinkageName(LinkageName));
1181 addSourceLine(SPDie, &SP);
1183 // Add prototyped tag, if C or ObjC.
1184 unsigned Lang = SP.getCompileUnit().getLanguage();
1185 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1186 Lang == dwarf::DW_LANG_ObjC)
1187 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1190 DICompositeType SPTy = SP.getType();
1191 DIArray Args = SPTy.getTypeArray();
1192 unsigned SPTag = SPTy.getTag();
1194 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1195 addType(SPDie, SPTy);
1197 addType(SPDie, DIType(Args.getElement(0).getNode()));
1199 unsigned VK = SP.getVirtuality();
1201 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1202 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1203 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1204 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1205 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1206 ContainingTypeMap.insert(std::make_pair(SPDie,
1207 SP.getContainingType().getNode()));
1210 if (MakeDecl || !SP.isDefinition()) {
1211 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1213 // Add arguments. Do not add arguments for subprogram definition. They will
1214 // be handled while processing variables.
1215 DICompositeType SPTy = SP.getType();
1216 DIArray Args = SPTy.getTypeArray();
1217 unsigned SPTag = SPTy.getTag();
1219 if (SPTag == dwarf::DW_TAG_subroutine_type)
1220 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1221 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1222 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1224 if (ATy.isArtificial())
1225 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1226 SPDie->addChild(Arg);
1230 if (SP.isArtificial())
1231 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1233 // DW_TAG_inlined_subroutine may refer to this DIE.
1234 ModuleCU->insertDIE(SP.getNode(), SPDie);
1238 /// getUpdatedDbgScope - Find DbgScope assicated with the instruction.
1239 /// Update scope hierarchy. Create abstract scope if required.
1240 DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1241 MDNode *InlinedAt) {
1242 assert(N && "Invalid Scope encoding!");
1243 assert(MI && "Missing machine instruction!");
1244 bool isAConcreteScope = InlinedAt != 0;
1246 DbgScope *NScope = NULL;
1249 NScope = DbgScopeMap.lookup(InlinedAt);
1251 NScope = DbgScopeMap.lookup(N);
1252 assert(NScope && "Unable to find working scope!");
1254 if (NScope->getFirstInsn())
1257 DbgScope *Parent = NULL;
1258 if (isAConcreteScope) {
1259 DILocation IL(InlinedAt);
1260 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1261 IL.getOrigLocation().getNode());
1262 assert(Parent && "Unable to find Parent scope!");
1263 NScope->setParent(Parent);
1264 Parent->addScope(NScope);
1265 } else if (DIDescriptor(N).isLexicalBlock()) {
1266 DILexicalBlock DB(N);
1267 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1268 NScope->setParent(Parent);
1269 Parent->addScope(NScope);
1272 NScope->setFirstInsn(MI);
1274 if (!Parent && !InlinedAt) {
1275 StringRef SPName = DISubprogram(N).getLinkageName();
1276 if (SPName == MF->getFunction()->getName())
1277 CurrentFnDbgScope = NScope;
1280 if (isAConcreteScope) {
1281 ConcreteScopes[InlinedAt] = NScope;
1282 getOrCreateAbstractScope(N);
1288 DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1289 assert(N && "Invalid Scope encoding!");
1291 DbgScope *AScope = AbstractScopes.lookup(N);
1295 DbgScope *Parent = NULL;
1297 DIDescriptor Scope(N);
1298 if (Scope.isLexicalBlock()) {
1299 DILexicalBlock DB(N);
1300 DIDescriptor ParentDesc = DB.getContext();
1301 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1304 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1307 Parent->addScope(AScope);
1308 AScope->setAbstractScope();
1309 AbstractScopes[N] = AScope;
1310 if (DIDescriptor(N).isSubprogram())
1311 AbstractScopesList.push_back(AScope);
1315 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1316 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1317 /// If there are global variables in this scope then create and insert
1318 /// DIEs for these variables.
1319 DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1320 DIE *SPDie = ModuleCU->getDIE(SPNode);
1321 assert(SPDie && "Unable to find subprogram DIE!");
1322 DISubprogram SP(SPNode);
1324 // There is not any need to generate specification DIE for a function
1325 // defined at compile unit level. If a function is defined inside another
1326 // function then gdb prefers the definition at top level and but does not
1327 // expect specification DIE in parent function. So avoid creating
1328 // specification DIE for a function defined inside a function.
1329 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1330 !SP.getContext().isFile() && !SP.getContext().isSubprogram()) {
1331 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1334 DICompositeType SPTy = SP.getType();
1335 DIArray Args = SPTy.getTypeArray();
1336 unsigned SPTag = SPTy.getTag();
1337 if (SPTag == dwarf::DW_TAG_subroutine_type)
1338 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1339 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1340 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1342 if (ATy.isArtificial())
1343 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1344 SPDie->addChild(Arg);
1346 DIE *SPDeclDie = SPDie;
1347 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1348 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1350 ModuleCU->addDie(SPDie);
1353 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1354 Asm->GetTempSymbol("func_begin", SubprogramCount));
1355 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1356 Asm->GetTempSymbol("func_end", SubprogramCount));
1357 MachineLocation Location(RI->getFrameRegister(*MF));
1358 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1360 if (!DISubprogram(SPNode).isLocalToUnit())
1361 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1366 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1367 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1368 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1369 MCSymbol *Start = Scope->getStartLabel();
1370 MCSymbol *End = Scope->getEndLabel();
1371 if (Start == 0 || End == 0) return 0;
1373 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1374 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1376 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1377 if (Scope->isAbstractScope())
1380 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1381 Start ? Start : Asm->GetTempSymbol("func_begin", SubprogramCount));
1382 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1383 End ? End : Asm->GetTempSymbol("func_end", SubprogramCount));
1388 /// constructInlinedScopeDIE - This scope represents inlined body of
1389 /// a function. Construct DIE to represent this concrete inlined copy
1390 /// of the function.
1391 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1392 MCSymbol *StartLabel = Scope->getStartLabel();
1393 MCSymbol *EndLabel = Scope->getEndLabel();
1394 if (StartLabel == 0 || EndLabel == 0) return 0;
1396 assert(StartLabel->isDefined() &&
1397 "Invalid starting label for an inlined scope!");
1398 assert(EndLabel->isDefined() &&
1399 "Invalid end label for an inlined scope!");
1400 if (!Scope->getScopeNode())
1402 DIScope DS(Scope->getScopeNode());
1403 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1405 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1406 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1407 assert(OriginDIE && "Unable to find Origin DIE!");
1408 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1409 dwarf::DW_FORM_ref4, OriginDIE);
1411 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1412 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1414 InlinedSubprogramDIEs.insert(OriginDIE);
1416 // Track the start label for this inlined function.
1417 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1418 I = InlineInfo.find(InlinedSP.getNode());
1420 if (I == InlineInfo.end()) {
1421 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1423 InlinedSPNodes.push_back(InlinedSP.getNode());
1425 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1427 DILocation DL(Scope->getInlinedAt());
1428 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1429 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1435 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1436 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1437 // Get the descriptor.
1438 const DIVariable &VD = DV->getVariable();
1439 StringRef Name = VD.getName();
1443 // Translate tag to proper Dwarf tag. The result variable is dropped for
1446 switch (VD.getTag()) {
1447 case dwarf::DW_TAG_return_variable:
1449 case dwarf::DW_TAG_arg_variable:
1450 Tag = dwarf::DW_TAG_formal_parameter;
1452 case dwarf::DW_TAG_auto_variable: // fall thru
1454 Tag = dwarf::DW_TAG_variable;
1458 // Define variable debug information entry.
1459 DIE *VariableDie = new DIE(Tag);
1463 if (DbgVariable *AV = DV->getAbstractVariable())
1464 AbsDIE = AV->getDIE();
1467 DIScope DS(Scope->getScopeNode());
1468 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1469 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1471 assert(OriginSPDIE && "Unable to find Origin DIE for the SP!");
1472 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1473 assert(AbsDIE && "Unable to find Origin DIE for the Variable!");
1474 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1475 dwarf::DW_FORM_ref4, AbsDIE);
1478 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1479 addSourceLine(VariableDie, &VD);
1481 // Add variable type.
1482 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1483 // addresses instead.
1484 if (VD.isBlockByrefVariable())
1485 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1487 addType(VariableDie, VD.getType());
1490 // Add variable address.
1491 if (!Scope->isAbstractScope()) {
1492 // Check if variable is described by DBG_VALUE instruction.
1493 if (const MachineInstr *DbgValueInsn = DV->getDbgValue()) {
1494 if (DbgValueInsn->getNumOperands() == 3) {
1495 // FIXME : Handle getNumOperands != 3
1496 if (DbgValueInsn->getOperand(0).getType()
1497 == MachineOperand::MO_Register
1498 && DbgValueInsn->getOperand(0).getReg()) {
1499 MachineLocation Location;
1500 Location.set(DbgValueInsn->getOperand(0).getReg());
1501 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1502 if (MCSymbol *VS = DV->getDbgValueLabel())
1503 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1505 } else if (DbgValueInsn->getOperand(0).getType() ==
1506 MachineOperand::MO_Immediate) {
1507 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1508 unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1509 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1510 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1511 if (MCSymbol *VS = DV->getDbgValueLabel())
1512 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1515 //FIXME : Handle other operand types.
1521 MachineLocation Location;
1523 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(),
1525 Location.set(FrameReg, Offset);
1527 if (VD.hasComplexAddress())
1528 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1529 else if (VD.isBlockByrefVariable())
1530 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1532 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1536 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1537 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1538 DV->setDIE(VariableDie);
1543 void DwarfDebug::addPubTypes(DISubprogram SP) {
1544 DICompositeType SPTy = SP.getType();
1545 unsigned SPTag = SPTy.getTag();
1546 if (SPTag != dwarf::DW_TAG_subroutine_type)
1549 DIArray Args = SPTy.getTypeArray();
1550 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1551 DIType ATy(Args.getElement(i).getNode());
1554 DICompositeType CATy = getDICompositeType(ATy);
1555 if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1556 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1557 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1562 /// constructScopeDIE - Construct a DIE for this scope.
1563 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1564 if (!Scope || !Scope->getScopeNode())
1567 DIScope DS(Scope->getScopeNode());
1568 DIE *ScopeDIE = NULL;
1569 if (Scope->getInlinedAt())
1570 ScopeDIE = constructInlinedScopeDIE(Scope);
1571 else if (DS.isSubprogram()) {
1572 if (Scope->isAbstractScope())
1573 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1575 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1578 ScopeDIE = constructLexicalScopeDIE(Scope);
1579 if (!ScopeDIE) return NULL;
1581 // Add variables to scope.
1582 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1583 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1584 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1586 ScopeDIE->addChild(VariableDIE);
1589 // Add nested scopes.
1590 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1591 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1592 // Define the Scope debug information entry.
1593 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1595 ScopeDIE->addChild(NestedDIE);
1598 if (DS.isSubprogram())
1599 addPubTypes(DISubprogram(DS.getNode()));
1604 /// GetOrCreateSourceID - Look up the source id with the given directory and
1605 /// source file names. If none currently exists, create a new id and insert it
1606 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1608 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1610 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1611 if (DI != DirectoryIdMap.end()) {
1612 DId = DI->getValue();
1614 DId = DirectoryNames.size() + 1;
1615 DirectoryIdMap[DirName] = DId;
1616 DirectoryNames.push_back(DirName);
1620 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1621 if (FI != SourceFileIdMap.end()) {
1622 FId = FI->getValue();
1624 FId = SourceFileNames.size() + 1;
1625 SourceFileIdMap[FileName] = FId;
1626 SourceFileNames.push_back(FileName);
1629 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1630 SourceIdMap.find(std::make_pair(DId, FId));
1631 if (SI != SourceIdMap.end())
1634 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1635 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1636 SourceIds.push_back(std::make_pair(DId, FId));
1641 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1642 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1643 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1646 NDie = new DIE(dwarf::DW_TAG_namespace);
1647 ModuleCU->insertDIE(NS.getNode(), NDie);
1648 if (!NS.getName().empty())
1649 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1650 addSourceLine(NDie, &NS);
1651 addToContextOwner(NDie, NS.getContext());
1655 void DwarfDebug::constructCompileUnit(MDNode *N) {
1656 DICompileUnit DIUnit(N);
1657 // Use first compile unit marked as isMain as the compile unit for this
1659 if (ModuleCU || !DIUnit.isMain())
1661 StringRef FN = DIUnit.getFilename();
1662 StringRef Dir = DIUnit.getDirectory();
1663 unsigned ID = GetOrCreateSourceID(Dir, FN);
1665 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1666 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1667 DIUnit.getProducer());
1668 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1669 DIUnit.getLanguage());
1670 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1671 addLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1672 Asm->GetTempSymbol("text_begin"));
1673 addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1674 Asm->GetTempSymbol("text_end"));
1675 // DW_AT_stmt_list is a offset of line number information for this
1676 // compile unit in debug_line section. It is always zero when only one
1677 // compile unit is emitted in one object file.
1678 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1681 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1682 if (DIUnit.isOptimized())
1683 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1685 StringRef Flags = DIUnit.getFlags();
1687 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1689 unsigned RVer = DIUnit.getRunTimeVersion();
1691 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1692 dwarf::DW_FORM_data1, RVer);
1695 "ModuleCU assigned since the top of constructCompileUnit");
1696 ModuleCU = new CompileUnit(ID, Die);
1699 void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1700 DIGlobalVariable DI_GV(N);
1702 // If debug information is malformed then ignore it.
1703 if (DI_GV.Verify() == false)
1706 // Check for pre-existence.
1707 if (ModuleCU->getDIE(DI_GV.getNode()))
1710 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1715 ModuleCU->insertDIE(N, VariableDie);
1717 // Add to context owner.
1718 DIDescriptor GVContext = DI_GV.getContext();
1719 // Do not create specification DIE if context is either compile unit
1721 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1722 !GVContext.isFile() && !GVContext.isSubprogram()) {
1723 // Create specification DIE.
1724 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1725 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1726 dwarf::DW_FORM_ref4, VariableDie);
1727 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1728 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1729 addLabel(Block, 0, dwarf::DW_FORM_udata,
1730 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1731 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1732 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1733 ModuleCU->addDie(VariableSpecDIE);
1735 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1736 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1737 addLabel(Block, 0, dwarf::DW_FORM_udata,
1738 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1739 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1741 addToContextOwner(VariableDie, GVContext);
1743 // Expose as global. FIXME - need to check external flag.
1744 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1746 DIType GTy = DI_GV.getType();
1747 if (GTy.isCompositeType() && !GTy.getName().empty()) {
1748 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1749 assert(Entry && "Missing global type!");
1750 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1755 void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1758 // Check for pre-existence.
1759 if (ModuleCU->getDIE(N))
1762 if (!SP.isDefinition())
1763 // This is a method declaration which will be handled while constructing
1767 DIE *SubprogramDie = createSubprogramDIE(SP);
1770 ModuleCU->insertDIE(N, SubprogramDie);
1772 // Add to context owner.
1773 addToContextOwner(SubprogramDie, SP.getContext());
1775 // Expose as global.
1776 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1781 /// beginModule - Emit all Dwarf sections that should come prior to the
1782 /// content. Create global DIEs and emit initial debug info sections.
1783 /// This is inovked by the target AsmPrinter.
1784 void DwarfDebug::beginModule(Module *M) {
1787 if (!MAI->doesSupportDebugInformation())
1790 TimeRegion Timer(DebugTimer);
1792 DebugInfoFinder DbgFinder;
1793 DbgFinder.processModule(*M);
1795 // Create all the compile unit DIEs.
1796 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1797 E = DbgFinder.compile_unit_end(); I != E; ++I)
1798 constructCompileUnit(*I);
1803 // Create DIEs for each subprogram.
1804 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1805 E = DbgFinder.subprogram_end(); I != E; ++I)
1806 constructSubprogramDIE(*I);
1808 // Create DIEs for each global variable.
1809 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1810 E = DbgFinder.global_variable_end(); I != E; ++I)
1811 constructGlobalVariableDIE(*I);
1815 MMI->setDebugInfoAvailability(true);
1817 // Prime section data.
1818 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1820 // Print out .file directives to specify files for .loc directives. These are
1821 // printed out early so that they precede any .loc directives.
1822 if (MAI->hasDotLocAndDotFile()) {
1823 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1824 // Remember source id starts at 1.
1825 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1826 // FIXME: don't use sys::path for this! This should not depend on the
1828 sys::Path FullPath(getSourceDirectoryName(Id.first));
1830 FullPath.appendComponent(getSourceFileName(Id.second));
1831 assert(AppendOk && "Could not append filename to directory!");
1833 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1837 // Emit initial sections
1841 /// endModule - Emit all Dwarf sections that should come after the content.
1843 void DwarfDebug::endModule() {
1847 TimeRegion Timer(DebugTimer);
1849 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1850 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1851 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1853 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1856 // Insert top level DIEs.
1857 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1858 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1859 ModuleCU->getCUDie()->addChild(*TI);
1861 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1862 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1863 DIE *SPDie = CI->first;
1864 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1866 DIE *NDie = ModuleCU->getDIE(N);
1867 if (!NDie) continue;
1868 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1869 // FIXME - This is not the correct approach.
1870 //addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie
1873 // Standard sections final addresses.
1874 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1875 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1876 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1877 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1879 // End text sections.
1880 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1881 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1882 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1885 // Emit common frame information.
1886 emitCommonDebugFrame();
1888 // Emit function debug frame information
1889 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1890 E = DebugFrames.end(); I != E; ++I)
1891 emitFunctionDebugFrame(*I);
1893 // Compute DIE offsets and sizes.
1894 computeSizeAndOffsets();
1896 // Emit all the DIEs into a debug info section
1899 // Corresponding abbreviations into a abbrev section.
1900 emitAbbreviations();
1902 // Emit source line correspondence into a debug line section.
1905 // Emit info into a debug pubnames section.
1906 emitDebugPubNames();
1908 // Emit info into a debug pubtypes section.
1909 emitDebugPubTypes();
1911 // Emit info into a debug loc section.
1914 // Emit info into a debug aranges section.
1917 // Emit info into a debug ranges section.
1920 // Emit info into a debug macinfo section.
1923 // Emit inline info.
1924 emitDebugInlineInfo();
1926 // Emit info into a debug str section.
1930 ModuleCU = NULL; // Reset for the next Module, if any.
1933 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1934 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1936 DebugLoc ScopeLoc) {
1938 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1940 return AbsDbgVariable;
1942 LLVMContext &Ctx = Var.getNode()->getContext();
1943 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1947 AbsDbgVariable = new DbgVariable(Var, FrameIdx,
1948 NULL /* No more-abstract variable*/);
1949 Scope->addVariable(AbsDbgVariable);
1950 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1951 return AbsDbgVariable;
1954 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1955 /// FIXME : Refactor findAbstractVariable.
1956 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1957 const MachineInstr *MI,
1958 DebugLoc ScopeLoc) {
1960 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1962 return AbsDbgVariable;
1964 LLVMContext &Ctx = Var.getNode()->getContext();
1965 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1969 AbsDbgVariable = new DbgVariable(Var, MI,
1970 NULL /* No more-abstract variable*/);
1971 Scope->addVariable(AbsDbgVariable);
1972 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1973 DbgValueStartMap[MI] = AbsDbgVariable;
1974 return AbsDbgVariable;
1977 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1978 void DwarfDebug::collectVariableInfo() {
1981 const LLVMContext &Ctx = MF->getFunction()->getContext();
1983 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1984 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1985 VE = VMap.end(); VI != VE; ++VI) {
1986 MDNode *Var = VI->first;
1989 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1991 DbgScope *Scope = 0;
1992 if (MDNode *IA = VP.second.getInlinedAt(Ctx))
1993 Scope = ConcreteScopes.lookup(IA);
1995 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
1997 // If variable scope is not found then skip this variable.
2001 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, VP.second);
2002 DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
2003 Scope->addVariable(RegVar);
2006 // Collect variable information from DBG_VALUE machine instructions;
2007 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2009 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2011 const MachineInstr *MInsn = II;
2012 if (!MInsn->isDebugValue())
2015 // FIXME : Lift this restriction.
2016 if (MInsn->getNumOperands() != 3)
2018 DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands()
2019 - 1).getMetadata()));
2020 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
2021 // FIXME Handle inlined subroutine arguments.
2022 DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2023 CurrentFnDbgScope->addVariable(ArgVar);
2024 DbgValueStartMap[MInsn] = ArgVar;
2028 DebugLoc DL = MInsn->getDebugLoc();
2029 if (DL.isUnknown()) continue;
2030 DbgScope *Scope = 0;
2031 if (MDNode *IA = DL.getInlinedAt(Ctx))
2032 Scope = ConcreteScopes.lookup(IA);
2034 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2036 // If variable scope is not found then skip this variable.
2040 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn, DL);
2041 DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
2042 DbgValueStartMap[MInsn] = RegVar;
2043 Scope->addVariable(RegVar);
2048 /// beginScope - Process beginning of a scope.
2049 void DwarfDebug::beginScope(const MachineInstr *MI) {
2051 DebugLoc DL = MI->getDebugLoc();
2055 // Check and update last known location info.
2056 if (DL == PrevInstLoc)
2059 MDNode *Scope = DL.getScope(MF->getFunction()->getContext());
2061 // FIXME: Should only verify each scope once!
2062 if (!DIScope(Scope).Verify())
2065 // DBG_VALUE instruction establishes new value.
2066 if (MI->isDebugValue()) {
2067 DenseMap<const MachineInstr *, DbgVariable *>::iterator DI
2068 = DbgValueStartMap.find(MI);
2069 if (DI != DbgValueStartMap.end()) {
2070 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2072 DI->second->setDbgValueLabel(Label);
2077 // Emit a label to indicate location change. This is used for line
2078 // table even if this instruction does start a new scope.
2079 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2082 // update DbgScope if this instruction starts a new scope.
2083 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2084 if (I == DbgScopeBeginMap.end())
2087 ScopeVector &SD = I->second;
2088 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2090 (*SDI)->setStartLabel(Label);
2093 /// endScope - Process end of a scope.
2094 void DwarfDebug::endScope(const MachineInstr *MI) {
2095 // Ignore DBG_VALUE instruction.
2096 if (MI->isDebugValue())
2100 DebugLoc DL = MI->getDebugLoc();
2104 // Emit a label and update DbgScope if this instruction ends a scope.
2105 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2106 if (I == DbgScopeEndMap.end())
2109 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2110 Asm->OutStreamer.EmitLabel(Label);
2112 SmallVector<DbgScope*, 2> &SD = I->second;
2113 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2115 (*SDI)->setEndLabel(Label);
2119 /// createDbgScope - Create DbgScope for the scope.
2120 void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2122 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2125 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2126 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2127 if (DIDescriptor(Scope).isLexicalBlock())
2128 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2132 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2136 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2137 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2138 DILocation DL(InlinedAt);
2139 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2142 /// extractScopeInformation - Scan machine instructions in this function
2143 /// and collect DbgScopes. Return true, if at least one scope was found.
2144 bool DwarfDebug::extractScopeInformation() {
2145 // If scope information was extracted using .dbg intrinsics then there is not
2146 // any need to extract these information by scanning each instruction.
2147 if (!DbgScopeMap.empty())
2150 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2151 unsigned MIIndex = 0;
2152 LLVMContext &Ctx = MF->getFunction()->getContext();
2154 // Scan each instruction and create scopes. First build working set of scopes.
2155 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2157 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2159 const MachineInstr *MInsn = II;
2160 // FIXME : Remove DBG_VALUE check.
2161 if (MInsn->isDebugValue()) continue;
2162 MIIndexMap[MInsn] = MIIndex++;
2164 DebugLoc DL = MInsn->getDebugLoc();
2165 if (DL.isUnknown()) continue;
2167 MDNode *Scope = DL.getScope(Ctx);
2169 // There is no need to create another DIE for compile unit. For all
2170 // other scopes, create one DbgScope now. This will be translated
2171 // into a scope DIE at the end.
2172 if (DIScope(Scope).isCompileUnit()) continue;
2173 createDbgScope(Scope, DL.getInlinedAt(Ctx));
2178 // Build scope hierarchy using working set of scopes.
2179 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2181 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2183 const MachineInstr *MInsn = II;
2184 // FIXME : Remove DBG_VALUE check.
2185 if (MInsn->isDebugValue()) continue;
2186 DebugLoc DL = MInsn->getDebugLoc();
2187 if (DL.isUnknown()) continue;
2189 MDNode *Scope = DL.getScope(Ctx);
2190 if (Scope == 0) continue;
2192 // There is no need to create another DIE for compile unit. For all
2193 // other scopes, create one DbgScope now. This will be translated
2194 // into a scope DIE at the end.
2195 if (DIScope(Scope).isCompileUnit()) continue;
2196 DbgScope *DScope = getUpdatedDbgScope(Scope, MInsn, DL.getInlinedAt(Ctx));
2197 DScope->setLastInsn(MInsn);
2201 if (!CurrentFnDbgScope)
2204 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2206 // Each scope has first instruction and last instruction to mark beginning
2207 // and end of a scope respectively. Create an inverse map that list scopes
2208 // starts (and ends) with an instruction. One instruction may start (or end)
2209 // multiple scopes. Ignore scopes that are not reachable.
2210 SmallVector<DbgScope *, 4> WorkList;
2211 WorkList.push_back(CurrentFnDbgScope);
2212 while (!WorkList.empty()) {
2213 DbgScope *S = WorkList.pop_back_val();
2215 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2216 if (!Children.empty())
2217 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2218 SE = Children.end(); SI != SE; ++SI)
2219 WorkList.push_back(*SI);
2221 if (S->isAbstractScope())
2223 const MachineInstr *MI = S->getFirstInsn();
2224 assert(MI && "DbgScope does not have first instruction!");
2226 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2227 if (IDI != DbgScopeBeginMap.end())
2228 IDI->second.push_back(S);
2230 DbgScopeBeginMap[MI].push_back(S);
2232 MI = S->getLastInsn();
2233 assert(MI && "DbgScope does not have last instruction!");
2234 IDI = DbgScopeEndMap.find(MI);
2235 if (IDI != DbgScopeEndMap.end())
2236 IDI->second.push_back(S);
2238 DbgScopeEndMap[MI].push_back(S);
2241 return !DbgScopeMap.empty();
2244 /// beginFunction - Gather pre-function debug information. Assumes being
2245 /// emitted immediately after the function entry point.
2246 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2249 if (!ShouldEmitDwarfDebug()) return;
2250 if (!extractScopeInformation())
2253 TimeRegion Timer(DebugTimer);
2255 collectVariableInfo();
2257 // Assumes in correct section after the entry point.
2258 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin",
2259 ++SubprogramCount));
2261 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2263 DebugLoc FDL = MF->getDefaultDebugLoc();
2264 if (FDL.isUnknown()) return;
2266 MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2268 DISubprogram SP = getDISubprogram(Scope);
2271 Line = SP.getLineNumber();
2274 Line = FDL.getLine();
2278 recordSourceLine(Line, Col, Scope);
2281 /// endFunction - Gather and emit post-function debug information.
2283 void DwarfDebug::endFunction(const MachineFunction *MF) {
2284 if (!ShouldEmitDwarfDebug()) return;
2285 if (DbgScopeMap.empty()) return;
2287 TimeRegion Timer(DebugTimer);
2289 if (CurrentFnDbgScope) {
2290 // Define end label for subprogram.
2291 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", SubprogramCount));
2293 // Get function line info.
2294 if (!Lines.empty()) {
2295 // Get section line info.
2296 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2297 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2298 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2299 // Append the function info to section info.
2300 SectionLineInfos.insert(SectionLineInfos.end(),
2301 Lines.begin(), Lines.end());
2304 // Construct abstract scopes.
2305 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2306 AE = AbstractScopesList.end(); AI != AE; ++AI)
2307 constructScopeDIE(*AI);
2309 constructScopeDIE(CurrentFnDbgScope);
2311 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2312 MMI->getFrameMoves()));
2316 CurrentFnDbgScope = NULL;
2317 DeleteContainerSeconds(DbgScopeMap);
2318 DbgScopeBeginMap.clear();
2319 DbgScopeEndMap.clear();
2320 DbgValueStartMap.clear();
2321 ConcreteScopes.clear();
2322 DeleteContainerSeconds(AbstractScopes);
2323 AbstractScopesList.clear();
2324 AbstractVariables.clear();
2328 /// recordSourceLine - Register a source line with debug info. Returns the
2329 /// unique label that was emitted and which provides correspondence to
2330 /// the source line list.
2331 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2335 TimeRegion Timer(DebugTimer);
2340 DIDescriptor Scope(S);
2341 if (Scope.isCompileUnit()) {
2342 DICompileUnit CU(S);
2343 Dir = CU.getDirectory();
2344 Fn = CU.getFilename();
2345 } else if (Scope.isSubprogram()) {
2347 Dir = SP.getDirectory();
2348 Fn = SP.getFilename();
2349 } else if (Scope.isLexicalBlock()) {
2350 DILexicalBlock DB(S);
2351 Dir = DB.getDirectory();
2352 Fn = DB.getFilename();
2354 assert(0 && "Unexpected scope info");
2356 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2357 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2358 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2360 Asm->OutStreamer.EmitLabel(Label);
2364 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2365 /// timed. Look up the source id with the given directory and source file
2366 /// names. If none currently exists, create a new id and insert it in the
2367 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2369 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2370 const std::string &FileName) {
2371 TimeRegion Timer(DebugTimer);
2372 return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2375 //===----------------------------------------------------------------------===//
2377 //===----------------------------------------------------------------------===//
2379 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2382 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2383 // Get the children.
2384 const std::vector<DIE *> &Children = Die->getChildren();
2386 // If not last sibling and has children then add sibling offset attribute.
2387 if (!Last && !Children.empty())
2388 Die->addSiblingOffset(DIEValueAllocator);
2390 // Record the abbreviation.
2391 assignAbbrevNumber(Die->getAbbrev());
2393 // Get the abbreviation for this DIE.
2394 unsigned AbbrevNumber = Die->getAbbrevNumber();
2395 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2398 Die->setOffset(Offset);
2400 // Start the size with the size of abbreviation code.
2401 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2403 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2404 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2406 // Size the DIE attribute values.
2407 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2408 // Size attribute value.
2409 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2411 // Size the DIE children if any.
2412 if (!Children.empty()) {
2413 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2414 "Children flag not set");
2416 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2417 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2419 // End of children marker.
2420 Offset += sizeof(int8_t);
2423 Die->setSize(Offset - Die->getOffset());
2427 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2429 void DwarfDebug::computeSizeAndOffsets() {
2430 // Compute size of compile unit header.
2431 static unsigned Offset =
2432 sizeof(int32_t) + // Length of Compilation Unit Info
2433 sizeof(int16_t) + // DWARF version number
2434 sizeof(int32_t) + // Offset Into Abbrev. Section
2435 sizeof(int8_t); // Pointer Size (in bytes)
2437 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2438 CompileUnitOffsets[ModuleCU] = 0;
2441 /// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
2442 /// tools to recognize the object file contains Dwarf information.
2443 void DwarfDebug::emitInitial() {
2444 // Check to see if we already emitted intial headers.
2445 if (didInitial) return;
2448 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2450 // Dwarf sections base addresses.
2451 if (MAI->doesDwarfRequireFrameSection()) {
2452 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2453 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_debug_frame"));
2456 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2457 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_info"));
2458 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2459 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_abbrev"));
2460 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2461 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_aranges"));
2463 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2464 Asm->OutStreamer.SwitchSection(LineInfoDirective);
2465 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_macinfo"));
2468 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2469 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_line"));
2470 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2471 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_loc"));
2472 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2473 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_pubnames"));
2474 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2475 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_pubtypes"));
2476 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2477 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_str"));
2478 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2479 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_ranges"));
2481 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2482 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_begin"));
2483 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2484 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_begin"));
2487 /// emitDIE - Recusively Emits a debug information entry.
2489 void DwarfDebug::emitDIE(DIE *Die) {
2490 // Get the abbreviation for this DIE.
2491 unsigned AbbrevNumber = Die->getAbbrevNumber();
2492 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2494 // Emit the code (index) for the abbreviation.
2495 if (Asm->isVerbose())
2496 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2497 Twine::utohexstr(Die->getOffset()) + ":0x" +
2498 Twine::utohexstr(Die->getSize()) + " " +
2499 dwarf::TagString(Abbrev->getTag()));
2500 Asm->EmitULEB128(AbbrevNumber);
2502 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2503 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2505 // Emit the DIE attribute values.
2506 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2507 unsigned Attr = AbbrevData[i].getAttribute();
2508 unsigned Form = AbbrevData[i].getForm();
2509 assert(Form && "Too many attributes for DIE (check abbreviation)");
2511 if (Asm->isVerbose())
2512 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2515 case dwarf::DW_AT_sibling:
2516 Asm->EmitInt32(Die->getSiblingOffset());
2518 case dwarf::DW_AT_abstract_origin: {
2519 DIEEntry *E = cast<DIEEntry>(Values[i]);
2520 DIE *Origin = E->getEntry();
2521 unsigned Addr = Origin->getOffset();
2522 Asm->EmitInt32(Addr);
2526 // Emit an attribute using the defined form.
2527 Values[i]->EmitValue(this, Form);
2532 // Emit the DIE children if any.
2533 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2534 const std::vector<DIE *> &Children = Die->getChildren();
2536 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2537 emitDIE(Children[j]);
2539 if (Asm->isVerbose())
2540 Asm->OutStreamer.AddComment("End Of Children Mark");
2545 /// emitDebugInfo - Emit the debug info section.
2547 void DwarfDebug::emitDebugInfo() {
2548 // Start debug info section.
2549 Asm->OutStreamer.SwitchSection(
2550 Asm->getObjFileLowering().getDwarfInfoSection());
2551 DIE *Die = ModuleCU->getCUDie();
2553 // Emit the compile units header.
2554 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2555 ModuleCU->getID()));
2557 // Emit size of content not including length itself
2558 unsigned ContentSize = Die->getSize() +
2559 sizeof(int16_t) + // DWARF version number
2560 sizeof(int32_t) + // Offset Into Abbrev. Section
2561 sizeof(int8_t) + // Pointer Size (in bytes)
2562 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2564 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2565 Asm->EmitInt32(ContentSize);
2566 Asm->OutStreamer.AddComment("DWARF version number");
2567 Asm->EmitInt16(dwarf::DWARF_VERSION);
2568 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2569 EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2570 Asm->GetTempSymbol("section_abbrev"), true);
2571 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2572 Asm->EmitInt8(TD->getPointerSize());
2575 // FIXME - extra padding for gdb bug.
2576 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2581 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", ModuleCU->getID()));
2584 /// emitAbbreviations - Emit the abbreviation section.
2586 void DwarfDebug::emitAbbreviations() const {
2587 // Check to see if it is worth the effort.
2588 if (!Abbreviations.empty()) {
2589 // Start the debug abbrev section.
2590 Asm->OutStreamer.SwitchSection(
2591 Asm->getObjFileLowering().getDwarfAbbrevSection());
2593 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2595 // For each abbrevation.
2596 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2597 // Get abbreviation data
2598 const DIEAbbrev *Abbrev = Abbreviations[i];
2600 // Emit the abbrevations code (base 1 index.)
2601 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2603 // Emit the abbreviations data.
2607 // Mark end of abbreviations.
2608 Asm->EmitULEB128(0, "EOM(3)");
2610 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2614 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2615 /// the line matrix.
2617 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2618 // Define last address of section.
2619 Asm->OutStreamer.AddComment("Extended Op");
2622 Asm->OutStreamer.AddComment("Op size");
2623 Asm->EmitInt8(TD->getPointerSize() + 1);
2624 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2625 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2627 Asm->OutStreamer.AddComment("Section end label");
2629 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2630 TD->getPointerSize(), 0/*AddrSpace*/);
2632 // Mark end of matrix.
2633 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2639 /// emitDebugLines - Emit source line information.
2641 void DwarfDebug::emitDebugLines() {
2642 // If the target is using .loc/.file, the assembler will be emitting the
2643 // .debug_line table automatically.
2644 if (MAI->hasDotLocAndDotFile())
2647 // Minimum line delta, thus ranging from -10..(255-10).
2648 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2649 // Maximum line delta, thus ranging from -10..(255-10).
2650 const int MaxLineDelta = 255 + MinLineDelta;
2652 // Start the dwarf line section.
2653 Asm->OutStreamer.SwitchSection(
2654 Asm->getObjFileLowering().getDwarfLineSection());
2656 // Construct the section header.
2657 Asm->OutStreamer.AddComment("Length of Source Line Info");
2658 EmitDifference(Asm->GetTempSymbol("line_end"),
2659 Asm->GetTempSymbol("line_begin"), true);
2660 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
2662 Asm->OutStreamer.AddComment("DWARF version number");
2663 Asm->EmitInt16(dwarf::DWARF_VERSION);
2665 Asm->OutStreamer.AddComment("Prolog Length");
2666 EmitDifference(Asm->GetTempSymbol("line_prolog_end"),
2667 Asm->GetTempSymbol("line_prolog_begin"), true);
2668 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
2670 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2672 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2674 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2675 Asm->EmitInt8(MinLineDelta);
2676 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2677 Asm->EmitInt8(MaxLineDelta);
2678 Asm->OutStreamer.AddComment("Special Opcode Base");
2679 Asm->EmitInt8(-MinLineDelta);
2681 // Line number standard opcode encodings argument count
2682 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2684 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2686 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2688 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2690 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2692 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2694 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2696 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2698 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2701 // Emit directories.
2702 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2703 const std::string &Dir = getSourceDirectoryName(DI);
2704 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
2705 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2708 Asm->OutStreamer.AddComment("End of directories");
2712 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2713 // Remember source id starts at 1.
2714 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2715 const std::string &FN = getSourceFileName(Id.second);
2716 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
2717 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2719 Asm->EmitULEB128(Id.first, "Directory #");
2720 Asm->EmitULEB128(0, "Mod date");
2721 Asm->EmitULEB128(0, "File size");
2724 Asm->OutStreamer.AddComment("End of files");
2727 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
2729 // A sequence for each text section.
2730 unsigned SecSrcLinesSize = SectionSourceLines.size();
2732 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2733 // Isolate current sections line info.
2734 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2736 // Dwarf assumes we start with first line of first source file.
2737 unsigned Source = 1;
2740 // Construct rows of the address, source, line, column matrix.
2741 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2742 const SrcLineInfo &LineInfo = LineInfos[i];
2743 MCSymbol *Label = LineInfo.getLabel();
2744 if (!Label->isDefined()) continue; // Not emitted, in dead code.
2746 if (LineInfo.getLine() == 0) continue;
2748 if (Asm->isVerbose()) {
2749 std::pair<unsigned, unsigned> SrcID =
2750 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2751 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2753 Twine(getSourceFileName(SrcID.second)) +
2754 ":" + Twine(LineInfo.getLine()));
2757 // Define the line address.
2758 Asm->OutStreamer.AddComment("Extended Op");
2760 Asm->OutStreamer.AddComment("Op size");
2761 Asm->EmitInt8(TD->getPointerSize() + 1);
2763 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2764 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2766 Asm->OutStreamer.AddComment("Location label");
2767 Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2770 // If change of source, then switch to the new source.
2771 if (Source != LineInfo.getSourceID()) {
2772 Source = LineInfo.getSourceID();
2773 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2774 Asm->EmitInt8(dwarf::DW_LNS_set_file);
2775 Asm->EmitULEB128(Source, "New Source");
2778 // If change of line.
2779 if (Line != LineInfo.getLine()) {
2780 // Determine offset.
2781 int Offset = LineInfo.getLine() - Line;
2782 int Delta = Offset - MinLineDelta;
2785 Line = LineInfo.getLine();
2787 // If delta is small enough and in range...
2788 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2789 // ... then use fast opcode.
2790 Asm->OutStreamer.AddComment("Line Delta");
2791 Asm->EmitInt8(Delta - MinLineDelta);
2793 // ... otherwise use long hand.
2794 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2795 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2796 Asm->EmitSLEB128(Offset, "Line Offset");
2797 Asm->OutStreamer.AddComment("DW_LNS_copy");
2798 Asm->EmitInt8(dwarf::DW_LNS_copy);
2801 // Copy the previous row (different address or source)
2802 Asm->OutStreamer.AddComment("DW_LNS_copy");
2803 Asm->EmitInt8(dwarf::DW_LNS_copy);
2807 emitEndOfLineMatrix(j + 1);
2810 if (SecSrcLinesSize == 0)
2811 // Because we're emitting a debug_line section, we still need a line
2812 // table. The linker and friends expect it to exist. If there's nothing to
2813 // put into it, emit an empty table.
2814 emitEndOfLineMatrix(1);
2816 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
2819 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2821 void DwarfDebug::emitCommonDebugFrame() {
2822 if (!MAI->doesDwarfRequireFrameSection())
2826 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2827 TargetFrameInfo::StackGrowsUp ?
2828 TD->getPointerSize() : -TD->getPointerSize();
2830 // Start the dwarf frame section.
2831 Asm->OutStreamer.SwitchSection(
2832 Asm->getObjFileLowering().getDwarfFrameSection());
2834 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
2835 Asm->OutStreamer.AddComment("Length of Common Information Entry");
2836 EmitDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2837 Asm->GetTempSymbol("debug_frame_common_begin"), true);
2839 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
2840 Asm->OutStreamer.AddComment("CIE Identifier Tag");
2841 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2842 Asm->OutStreamer.AddComment("CIE Version");
2843 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2844 Asm->OutStreamer.AddComment("CIE Augmentation");
2845 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2846 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2847 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2848 Asm->OutStreamer.AddComment("CIE RA Column");
2849 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2851 std::vector<MachineMove> Moves;
2852 RI->getInitialFrameState(Moves);
2854 EmitFrameMoves(0, Moves, false);
2856 Asm->EmitAlignment(2, 0, 0, false);
2857 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
2860 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2863 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2864 if (!MAI->doesDwarfRequireFrameSection())
2867 // Start the dwarf frame section.
2868 Asm->OutStreamer.SwitchSection(
2869 Asm->getObjFileLowering().getDwarfFrameSection());
2871 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2872 MCSymbol *DebugFrameBegin =
2873 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
2874 MCSymbol *DebugFrameEnd =
2875 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
2876 EmitDifference(DebugFrameEnd, DebugFrameBegin, true);
2878 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2880 Asm->OutStreamer.AddComment("FDE CIE offset");
2881 EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2882 Asm->GetTempSymbol("section_debug_frame"), true);
2884 Asm->OutStreamer.AddComment("FDE initial location");
2885 MCSymbol *FuncBeginSym =
2886 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
2887 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2888 TD->getPointerSize(), 0/*AddrSpace*/);
2891 Asm->OutStreamer.AddComment("FDE address range");
2892 EmitDifference(Asm->GetTempSymbol("func_end", DebugFrameInfo.Number),
2895 EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2897 Asm->EmitAlignment(2, 0, 0, false);
2898 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2901 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2903 void DwarfDebug::emitDebugPubNames() {
2904 // Start the dwarf pubnames section.
2905 Asm->OutStreamer.SwitchSection(
2906 Asm->getObjFileLowering().getDwarfPubNamesSection());
2908 Asm->OutStreamer.AddComment("Length of Public Names Info");
2909 EmitDifference(Asm->GetTempSymbol("pubnames_end", ModuleCU->getID()),
2910 Asm->GetTempSymbol("pubnames_begin", ModuleCU->getID()), true);
2912 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2913 ModuleCU->getID()));
2915 Asm->OutStreamer.AddComment("DWARF Version");
2916 Asm->EmitInt16(dwarf::DWARF_VERSION);
2918 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2919 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2920 Asm->GetTempSymbol("section_info"), true);
2922 Asm->OutStreamer.AddComment("Compilation Unit Length");
2923 EmitDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2924 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2927 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2928 for (StringMap<DIE*>::const_iterator
2929 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2930 const char *Name = GI->getKeyData();
2931 DIE *Entity = GI->second;
2933 Asm->OutStreamer.AddComment("DIE offset");
2934 Asm->EmitInt32(Entity->getOffset());
2936 if (Asm->isVerbose())
2937 Asm->OutStreamer.AddComment("External Name");
2938 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2941 Asm->OutStreamer.AddComment("End Mark");
2943 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2944 ModuleCU->getID()));
2947 void DwarfDebug::emitDebugPubTypes() {
2948 // Start the dwarf pubnames section.
2949 Asm->OutStreamer.SwitchSection(
2950 Asm->getObjFileLowering().getDwarfPubTypesSection());
2951 Asm->OutStreamer.AddComment("Length of Public Types Info");
2952 EmitDifference(Asm->GetTempSymbol("pubtypes_end", ModuleCU->getID()),
2953 Asm->GetTempSymbol("pubtypes_begin", ModuleCU->getID()), true);
2955 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2956 ModuleCU->getID()));
2958 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2959 Asm->EmitInt16(dwarf::DWARF_VERSION);
2961 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2962 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2963 Asm->GetTempSymbol("section_info"), true);
2965 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2966 EmitDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2967 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2970 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2971 for (StringMap<DIE*>::const_iterator
2972 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2973 const char *Name = GI->getKeyData();
2974 DIE * Entity = GI->second;
2976 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2977 Asm->EmitInt32(Entity->getOffset());
2979 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2980 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2983 Asm->OutStreamer.AddComment("End Mark");
2985 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2986 ModuleCU->getID()));
2989 /// emitDebugStr - Emit visible names into a debug str section.
2991 void DwarfDebug::emitDebugStr() {
2992 // Check to see if it is worth the effort.
2993 if (StringPool.empty()) return;
2995 // Start the dwarf str section.
2996 Asm->OutStreamer.SwitchSection(
2997 Asm->getObjFileLowering().getDwarfStrSection());
2999 // Get all of the string pool entries and put them in an array by their ID so
3000 // we can sort them.
3001 SmallVector<std::pair<unsigned,
3002 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3004 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3005 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3006 Entries.push_back(std::make_pair(I->second.second, &*I));
3008 array_pod_sort(Entries.begin(), Entries.end());
3010 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3011 // Emit a label for reference from debug information entries.
3012 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3014 // Emit the string itself.
3015 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3019 /// emitDebugLoc - Emit visible names into a debug loc section.
3021 void DwarfDebug::emitDebugLoc() {
3022 // Start the dwarf loc section.
3023 Asm->OutStreamer.SwitchSection(
3024 Asm->getObjFileLowering().getDwarfLocSection());
3027 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3029 void DwarfDebug::EmitDebugARanges() {
3030 // Start the dwarf aranges section.
3031 Asm->OutStreamer.SwitchSection(
3032 Asm->getObjFileLowering().getDwarfARangesSection());
3035 /// emitDebugRanges - Emit visible names into a debug ranges section.
3037 void DwarfDebug::emitDebugRanges() {
3038 // Start the dwarf ranges section.
3039 Asm->OutStreamer.SwitchSection(
3040 Asm->getObjFileLowering().getDwarfRangesSection());
3043 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3045 void DwarfDebug::emitDebugMacInfo() {
3046 if (const MCSection *LineInfo =
3047 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3048 // Start the dwarf macinfo section.
3049 Asm->OutStreamer.SwitchSection(LineInfo);
3053 /// emitDebugInlineInfo - Emit inline info using following format.
3055 /// 1. length of section
3056 /// 2. Dwarf version number
3057 /// 3. address size.
3059 /// Entries (one "entry" for each function that was inlined):
3061 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3062 /// otherwise offset into __debug_str for regular function name.
3063 /// 2. offset into __debug_str section for regular function name.
3064 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3065 /// instances for the function.
3067 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3068 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3069 /// __debug_info section, and the low_pc is the starting address for the
3070 /// inlining instance.
3071 void DwarfDebug::emitDebugInlineInfo() {
3072 if (!MAI->doesDwarfUsesInlineInfoSection())
3078 Asm->OutStreamer.SwitchSection(
3079 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3081 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3082 EmitDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3083 Asm->GetTempSymbol("debug_inlined_begin", 1), true);
3085 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3087 Asm->OutStreamer.AddComment("Dwarf Version");
3088 Asm->EmitInt16(dwarf::DWARF_VERSION);
3089 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3090 Asm->EmitInt8(TD->getPointerSize());
3092 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3093 E = InlinedSPNodes.end(); I != E; ++I) {
3096 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3097 = InlineInfo.find(Node);
3098 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3099 DISubprogram SP(Node);
3100 StringRef LName = SP.getLinkageName();
3101 StringRef Name = SP.getName();
3103 Asm->OutStreamer.AddComment("MIPS linkage name");
3104 if (LName.empty()) {
3105 Asm->OutStreamer.EmitBytes(Name, 0);
3106 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3108 EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3109 Asm->GetTempSymbol("section_str"), true);
3111 Asm->OutStreamer.AddComment("Function name");
3112 EmitSectionOffset(getStringPoolEntry(Name),
3113 Asm->GetTempSymbol("section_str"), true);
3114 Asm->EmitULEB128(Labels.size(), "Inline count");
3116 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3117 LE = Labels.end(); LI != LE; ++LI) {
3118 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3119 Asm->EmitInt32(LI->second->getOffset());
3121 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3122 Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3126 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));