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 = getDWLabel("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 getDWLabel("func_begin", SubprogramCount));
1355 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1356 getDWLabel("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 : getDWLabel("func_begin", SubprogramCount));
1382 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1383 End ? End : getDWLabel("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 getTempLabel("text_begin"));
1673 addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1674 getTempLabel("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(getTempLabel("text_end"));
1876 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1877 Asm->OutStreamer.EmitLabel(getTempLabel("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(getDWLabel("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(getDWLabel("func_begin", ++SubprogramCount));
2260 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2262 DebugLoc FDL = MF->getDefaultDebugLoc();
2263 if (FDL.isUnknown()) return;
2265 MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2267 DISubprogram SP = getDISubprogram(Scope);
2270 Line = SP.getLineNumber();
2273 Line = FDL.getLine();
2277 recordSourceLine(Line, Col, Scope);
2280 /// endFunction - Gather and emit post-function debug information.
2282 void DwarfDebug::endFunction(const MachineFunction *MF) {
2283 if (!ShouldEmitDwarfDebug()) return;
2284 if (DbgScopeMap.empty()) return;
2286 TimeRegion Timer(DebugTimer);
2288 if (CurrentFnDbgScope) {
2289 // Define end label for subprogram.
2290 Asm->OutStreamer.EmitLabel(getDWLabel("func_end", SubprogramCount));
2292 // Get function line info.
2293 if (!Lines.empty()) {
2294 // Get section line info.
2295 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2296 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2297 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2298 // Append the function info to section info.
2299 SectionLineInfos.insert(SectionLineInfos.end(),
2300 Lines.begin(), Lines.end());
2303 // Construct abstract scopes.
2304 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2305 AE = AbstractScopesList.end(); AI != AE; ++AI)
2306 constructScopeDIE(*AI);
2308 constructScopeDIE(CurrentFnDbgScope);
2310 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2311 MMI->getFrameMoves()));
2315 CurrentFnDbgScope = NULL;
2316 DeleteContainerSeconds(DbgScopeMap);
2317 DbgScopeBeginMap.clear();
2318 DbgScopeEndMap.clear();
2319 DbgValueStartMap.clear();
2320 ConcreteScopes.clear();
2321 DeleteContainerSeconds(AbstractScopes);
2322 AbstractScopesList.clear();
2323 AbstractVariables.clear();
2327 /// recordSourceLine - Register a source line with debug info. Returns the
2328 /// unique label that was emitted and which provides correspondence to
2329 /// the source line list.
2330 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2334 TimeRegion Timer(DebugTimer);
2339 DIDescriptor Scope(S);
2340 if (Scope.isCompileUnit()) {
2341 DICompileUnit CU(S);
2342 Dir = CU.getDirectory();
2343 Fn = CU.getFilename();
2344 } else if (Scope.isSubprogram()) {
2346 Dir = SP.getDirectory();
2347 Fn = SP.getFilename();
2348 } else if (Scope.isLexicalBlock()) {
2349 DILexicalBlock DB(S);
2350 Dir = DB.getDirectory();
2351 Fn = DB.getFilename();
2353 assert(0 && "Unexpected scope info");
2355 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2356 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2357 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2359 Asm->OutStreamer.EmitLabel(Label);
2363 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2364 /// timed. Look up the source id with the given directory and source file
2365 /// names. If none currently exists, create a new id and insert it in the
2366 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2368 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2369 const std::string &FileName) {
2370 TimeRegion Timer(DebugTimer);
2371 return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2374 //===----------------------------------------------------------------------===//
2376 //===----------------------------------------------------------------------===//
2378 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2381 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2382 // Get the children.
2383 const std::vector<DIE *> &Children = Die->getChildren();
2385 // If not last sibling and has children then add sibling offset attribute.
2386 if (!Last && !Children.empty())
2387 Die->addSiblingOffset(DIEValueAllocator);
2389 // Record the abbreviation.
2390 assignAbbrevNumber(Die->getAbbrev());
2392 // Get the abbreviation for this DIE.
2393 unsigned AbbrevNumber = Die->getAbbrevNumber();
2394 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2397 Die->setOffset(Offset);
2399 // Start the size with the size of abbreviation code.
2400 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2402 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2403 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2405 // Size the DIE attribute values.
2406 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2407 // Size attribute value.
2408 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2410 // Size the DIE children if any.
2411 if (!Children.empty()) {
2412 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2413 "Children flag not set");
2415 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2416 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2418 // End of children marker.
2419 Offset += sizeof(int8_t);
2422 Die->setSize(Offset - Die->getOffset());
2426 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2428 void DwarfDebug::computeSizeAndOffsets() {
2429 // Compute size of compile unit header.
2430 static unsigned Offset =
2431 sizeof(int32_t) + // Length of Compilation Unit Info
2432 sizeof(int16_t) + // DWARF version number
2433 sizeof(int32_t) + // Offset Into Abbrev. Section
2434 sizeof(int8_t); // Pointer Size (in bytes)
2436 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2437 CompileUnitOffsets[ModuleCU] = 0;
2440 /// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
2441 /// tools to recognize the object file contains Dwarf information.
2442 void DwarfDebug::emitInitial() {
2443 // Check to see if we already emitted intial headers.
2444 if (didInitial) return;
2447 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2449 // Dwarf sections base addresses.
2450 if (MAI->doesDwarfRequireFrameSection()) {
2451 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2452 Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2455 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2456 Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2457 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2458 Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2459 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2460 Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2462 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2463 Asm->OutStreamer.SwitchSection(LineInfoDirective);
2464 Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2467 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2468 Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2469 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2470 Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2471 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2472 Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2473 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2474 Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2475 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2476 Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2477 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2478 Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2480 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2481 Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2482 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2483 Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2486 /// emitDIE - Recusively Emits a debug information entry.
2488 void DwarfDebug::emitDIE(DIE *Die) {
2489 // Get the abbreviation for this DIE.
2490 unsigned AbbrevNumber = Die->getAbbrevNumber();
2491 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2493 // Emit the code (index) for the abbreviation.
2494 if (Asm->isVerbose())
2495 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2496 Twine::utohexstr(Die->getOffset()) + ":0x" +
2497 Twine::utohexstr(Die->getSize()) + " " +
2498 dwarf::TagString(Abbrev->getTag()));
2499 Asm->EmitULEB128(AbbrevNumber);
2501 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2502 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2504 // Emit the DIE attribute values.
2505 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2506 unsigned Attr = AbbrevData[i].getAttribute();
2507 unsigned Form = AbbrevData[i].getForm();
2508 assert(Form && "Too many attributes for DIE (check abbreviation)");
2510 if (Asm->isVerbose())
2511 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2514 case dwarf::DW_AT_sibling:
2515 Asm->EmitInt32(Die->getSiblingOffset());
2517 case dwarf::DW_AT_abstract_origin: {
2518 DIEEntry *E = cast<DIEEntry>(Values[i]);
2519 DIE *Origin = E->getEntry();
2520 unsigned Addr = Origin->getOffset();
2521 Asm->EmitInt32(Addr);
2525 // Emit an attribute using the defined form.
2526 Values[i]->EmitValue(this, Form);
2531 // Emit the DIE children if any.
2532 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2533 const std::vector<DIE *> &Children = Die->getChildren();
2535 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2536 emitDIE(Children[j]);
2538 if (Asm->isVerbose())
2539 Asm->OutStreamer.AddComment("End Of Children Mark");
2544 /// emitDebugInfo - Emit the debug info section.
2546 void DwarfDebug::emitDebugInfo() {
2547 // Start debug info section.
2548 Asm->OutStreamer.SwitchSection(
2549 Asm->getObjFileLowering().getDwarfInfoSection());
2550 DIE *Die = ModuleCU->getCUDie();
2552 // Emit the compile units header.
2553 Asm->OutStreamer.EmitLabel(getDWLabel("info_begin", ModuleCU->getID()));
2555 // Emit size of content not including length itself
2556 unsigned ContentSize = Die->getSize() +
2557 sizeof(int16_t) + // DWARF version number
2558 sizeof(int32_t) + // Offset Into Abbrev. Section
2559 sizeof(int8_t) + // Pointer Size (in bytes)
2560 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2562 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2563 Asm->EmitInt32(ContentSize);
2564 Asm->OutStreamer.AddComment("DWARF version number");
2565 Asm->EmitInt16(dwarf::DWARF_VERSION);
2566 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2567 EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2569 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2570 Asm->EmitInt8(TD->getPointerSize());
2573 // FIXME - extra padding for gdb bug.
2574 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2579 Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2582 /// emitAbbreviations - Emit the abbreviation section.
2584 void DwarfDebug::emitAbbreviations() const {
2585 // Check to see if it is worth the effort.
2586 if (!Abbreviations.empty()) {
2587 // Start the debug abbrev section.
2588 Asm->OutStreamer.SwitchSection(
2589 Asm->getObjFileLowering().getDwarfAbbrevSection());
2591 Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2593 // For each abbrevation.
2594 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2595 // Get abbreviation data
2596 const DIEAbbrev *Abbrev = Abbreviations[i];
2598 // Emit the abbrevations code (base 1 index.)
2599 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2601 // Emit the abbreviations data.
2605 // Mark end of abbreviations.
2606 Asm->EmitULEB128(0, "EOM(3)");
2608 Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2612 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2613 /// the line matrix.
2615 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2616 // Define last address of section.
2617 Asm->OutStreamer.AddComment("Extended Op");
2620 Asm->OutStreamer.AddComment("Op size");
2621 Asm->EmitInt8(TD->getPointerSize() + 1);
2622 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2623 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2625 Asm->OutStreamer.AddComment("Section end label");
2627 Asm->OutStreamer.EmitSymbolValue(getDWLabel("section_end", SectionEnd),
2628 TD->getPointerSize(), 0/*AddrSpace*/);
2630 // Mark end of matrix.
2631 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2637 /// emitDebugLines - Emit source line information.
2639 void DwarfDebug::emitDebugLines() {
2640 // If the target is using .loc/.file, the assembler will be emitting the
2641 // .debug_line table automatically.
2642 if (MAI->hasDotLocAndDotFile())
2645 // Minimum line delta, thus ranging from -10..(255-10).
2646 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2647 // Maximum line delta, thus ranging from -10..(255-10).
2648 const int MaxLineDelta = 255 + MinLineDelta;
2650 // Start the dwarf line section.
2651 Asm->OutStreamer.SwitchSection(
2652 Asm->getObjFileLowering().getDwarfLineSection());
2654 // Construct the section header.
2655 Asm->OutStreamer.AddComment("Length of Source Line Info");
2656 EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2657 Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2659 Asm->OutStreamer.AddComment("DWARF version number");
2660 Asm->EmitInt16(dwarf::DWARF_VERSION);
2662 Asm->OutStreamer.AddComment("Prolog Length");
2663 EmitDifference(getTempLabel("line_prolog_end"),
2664 getTempLabel("line_prolog_begin"), true);
2665 Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2667 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2669 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2671 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2672 Asm->EmitInt8(MinLineDelta);
2673 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2674 Asm->EmitInt8(MaxLineDelta);
2675 Asm->OutStreamer.AddComment("Special Opcode Base");
2676 Asm->EmitInt8(-MinLineDelta);
2678 // Line number standard opcode encodings argument count
2679 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2681 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2683 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2685 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2687 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2689 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2691 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2693 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2695 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2698 // Emit directories.
2699 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2700 const std::string &Dir = getSourceDirectoryName(DI);
2701 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
2702 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2705 Asm->OutStreamer.AddComment("End of directories");
2709 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2710 // Remember source id starts at 1.
2711 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2712 const std::string &FN = getSourceFileName(Id.second);
2713 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
2714 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2716 Asm->EmitULEB128(Id.first, "Directory #");
2717 Asm->EmitULEB128(0, "Mod date");
2718 Asm->EmitULEB128(0, "File size");
2721 Asm->OutStreamer.AddComment("End of files");
2724 Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2726 // A sequence for each text section.
2727 unsigned SecSrcLinesSize = SectionSourceLines.size();
2729 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2730 // Isolate current sections line info.
2731 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2733 // Dwarf assumes we start with first line of first source file.
2734 unsigned Source = 1;
2737 // Construct rows of the address, source, line, column matrix.
2738 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2739 const SrcLineInfo &LineInfo = LineInfos[i];
2740 MCSymbol *Label = LineInfo.getLabel();
2741 if (!Label->isDefined()) continue; // Not emitted, in dead code.
2743 if (LineInfo.getLine() == 0) continue;
2745 if (Asm->isVerbose()) {
2746 std::pair<unsigned, unsigned> SrcID =
2747 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2748 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2750 Twine(getSourceFileName(SrcID.second)) +
2751 ":" + Twine(LineInfo.getLine()));
2754 // Define the line address.
2755 Asm->OutStreamer.AddComment("Extended Op");
2757 Asm->OutStreamer.AddComment("Op size");
2758 Asm->EmitInt8(TD->getPointerSize() + 1);
2760 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2761 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2763 Asm->OutStreamer.AddComment("Location label");
2764 Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2767 // If change of source, then switch to the new source.
2768 if (Source != LineInfo.getSourceID()) {
2769 Source = LineInfo.getSourceID();
2770 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2771 Asm->EmitInt8(dwarf::DW_LNS_set_file);
2772 Asm->EmitULEB128(Source, "New Source");
2775 // If change of line.
2776 if (Line != LineInfo.getLine()) {
2777 // Determine offset.
2778 int Offset = LineInfo.getLine() - Line;
2779 int Delta = Offset - MinLineDelta;
2782 Line = LineInfo.getLine();
2784 // If delta is small enough and in range...
2785 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2786 // ... then use fast opcode.
2787 Asm->OutStreamer.AddComment("Line Delta");
2788 Asm->EmitInt8(Delta - MinLineDelta);
2790 // ... otherwise use long hand.
2791 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2792 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2793 Asm->EmitSLEB128(Offset, "Line Offset");
2794 Asm->OutStreamer.AddComment("DW_LNS_copy");
2795 Asm->EmitInt8(dwarf::DW_LNS_copy);
2798 // Copy the previous row (different address or source)
2799 Asm->OutStreamer.AddComment("DW_LNS_copy");
2800 Asm->EmitInt8(dwarf::DW_LNS_copy);
2804 emitEndOfLineMatrix(j + 1);
2807 if (SecSrcLinesSize == 0)
2808 // Because we're emitting a debug_line section, we still need a line
2809 // table. The linker and friends expect it to exist. If there's nothing to
2810 // put into it, emit an empty table.
2811 emitEndOfLineMatrix(1);
2813 Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2816 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2818 void DwarfDebug::emitCommonDebugFrame() {
2819 if (!MAI->doesDwarfRequireFrameSection())
2823 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2824 TargetFrameInfo::StackGrowsUp ?
2825 TD->getPointerSize() : -TD->getPointerSize();
2827 // Start the dwarf frame section.
2828 Asm->OutStreamer.SwitchSection(
2829 Asm->getObjFileLowering().getDwarfFrameSection());
2831 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2832 Asm->OutStreamer.AddComment("Length of Common Information Entry");
2833 EmitDifference(getTempLabel("debug_frame_common_end"),
2834 getTempLabel("debug_frame_common_begin"), true);
2836 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2837 Asm->OutStreamer.AddComment("CIE Identifier Tag");
2838 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2839 Asm->OutStreamer.AddComment("CIE Version");
2840 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2841 Asm->OutStreamer.AddComment("CIE Augmentation");
2842 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2843 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2844 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2845 Asm->OutStreamer.AddComment("CIE RA Column");
2846 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2848 std::vector<MachineMove> Moves;
2849 RI->getInitialFrameState(Moves);
2851 EmitFrameMoves(0, Moves, false);
2853 Asm->EmitAlignment(2, 0, 0, false);
2854 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2857 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2860 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2861 if (!MAI->doesDwarfRequireFrameSection())
2864 // Start the dwarf frame section.
2865 Asm->OutStreamer.SwitchSection(
2866 Asm->getObjFileLowering().getDwarfFrameSection());
2868 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2869 MCSymbol *DebugFrameBegin =
2870 getDWLabel("debug_frame_begin", DebugFrameInfo.Number);
2871 MCSymbol *DebugFrameEnd =
2872 getDWLabel("debug_frame_end", DebugFrameInfo.Number);
2873 EmitDifference(DebugFrameEnd, DebugFrameBegin, true);
2875 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2877 Asm->OutStreamer.AddComment("FDE CIE offset");
2878 EmitSectionOffset(getTempLabel("debug_frame_common"),
2879 getTempLabel("section_debug_frame"), true);
2881 Asm->OutStreamer.AddComment("FDE initial location");
2882 MCSymbol *FuncBeginSym = getDWLabel("func_begin", DebugFrameInfo.Number);
2883 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2884 TD->getPointerSize(), 0/*AddrSpace*/);
2887 Asm->OutStreamer.AddComment("FDE address range");
2888 EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number), FuncBeginSym);
2890 EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2892 Asm->EmitAlignment(2, 0, 0, false);
2893 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2896 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2898 void DwarfDebug::emitDebugPubNames() {
2899 // Start the dwarf pubnames section.
2900 Asm->OutStreamer.SwitchSection(
2901 Asm->getObjFileLowering().getDwarfPubNamesSection());
2903 Asm->OutStreamer.AddComment("Length of Public Names Info");
2904 EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2905 getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2907 Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2909 Asm->OutStreamer.AddComment("DWARF Version");
2910 Asm->EmitInt16(dwarf::DWARF_VERSION);
2912 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2913 EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2914 getTempLabel("section_info"), true);
2916 Asm->OutStreamer.AddComment("Compilation Unit Length");
2917 EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2918 getDWLabel("info_begin", ModuleCU->getID()),
2921 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2922 for (StringMap<DIE*>::const_iterator
2923 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2924 const char *Name = GI->getKeyData();
2925 DIE *Entity = GI->second;
2927 Asm->OutStreamer.AddComment("DIE offset");
2928 Asm->EmitInt32(Entity->getOffset());
2930 if (Asm->isVerbose())
2931 Asm->OutStreamer.AddComment("External Name");
2932 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2935 Asm->OutStreamer.AddComment("End Mark");
2937 Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2940 void DwarfDebug::emitDebugPubTypes() {
2941 // Start the dwarf pubnames section.
2942 Asm->OutStreamer.SwitchSection(
2943 Asm->getObjFileLowering().getDwarfPubTypesSection());
2944 Asm->OutStreamer.AddComment("Length of Public Types Info");
2945 EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2946 getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2948 Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2950 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2951 Asm->EmitInt16(dwarf::DWARF_VERSION);
2953 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2954 EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2955 getTempLabel("section_info"), true);
2957 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2958 EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2959 getDWLabel("info_begin", ModuleCU->getID()),
2962 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2963 for (StringMap<DIE*>::const_iterator
2964 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2965 const char *Name = GI->getKeyData();
2966 DIE * Entity = GI->second;
2968 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2969 Asm->EmitInt32(Entity->getOffset());
2971 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2972 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2975 Asm->OutStreamer.AddComment("End Mark");
2977 Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2980 /// emitDebugStr - Emit visible names into a debug str section.
2982 void DwarfDebug::emitDebugStr() {
2983 // Check to see if it is worth the effort.
2984 if (StringPool.empty()) return;
2986 // Start the dwarf str section.
2987 Asm->OutStreamer.SwitchSection(
2988 Asm->getObjFileLowering().getDwarfStrSection());
2990 // Get all of the string pool entries and put them in an array by their ID so
2991 // we can sort them.
2992 SmallVector<std::pair<unsigned,
2993 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2995 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2996 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2997 Entries.push_back(std::make_pair(I->second.second, &*I));
2999 array_pod_sort(Entries.begin(), Entries.end());
3001 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3002 // Emit a label for reference from debug information entries.
3003 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3005 // Emit the string itself.
3006 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3010 /// emitDebugLoc - Emit visible names into a debug loc section.
3012 void DwarfDebug::emitDebugLoc() {
3013 // Start the dwarf loc section.
3014 Asm->OutStreamer.SwitchSection(
3015 Asm->getObjFileLowering().getDwarfLocSection());
3018 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3020 void DwarfDebug::EmitDebugARanges() {
3021 // Start the dwarf aranges section.
3022 Asm->OutStreamer.SwitchSection(
3023 Asm->getObjFileLowering().getDwarfARangesSection());
3026 /// emitDebugRanges - Emit visible names into a debug ranges section.
3028 void DwarfDebug::emitDebugRanges() {
3029 // Start the dwarf ranges section.
3030 Asm->OutStreamer.SwitchSection(
3031 Asm->getObjFileLowering().getDwarfRangesSection());
3034 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3036 void DwarfDebug::emitDebugMacInfo() {
3037 if (const MCSection *LineInfo =
3038 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3039 // Start the dwarf macinfo section.
3040 Asm->OutStreamer.SwitchSection(LineInfo);
3044 /// emitDebugInlineInfo - Emit inline info using following format.
3046 /// 1. length of section
3047 /// 2. Dwarf version number
3048 /// 3. address size.
3050 /// Entries (one "entry" for each function that was inlined):
3052 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3053 /// otherwise offset into __debug_str for regular function name.
3054 /// 2. offset into __debug_str section for regular function name.
3055 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3056 /// instances for the function.
3058 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3059 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3060 /// __debug_info section, and the low_pc is the starting address for the
3061 /// inlining instance.
3062 void DwarfDebug::emitDebugInlineInfo() {
3063 if (!MAI->doesDwarfUsesInlineInfoSection())
3069 Asm->OutStreamer.SwitchSection(
3070 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3072 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3073 EmitDifference(getDWLabel("debug_inlined_end", 1),
3074 getDWLabel("debug_inlined_begin", 1), true);
3076 Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
3078 Asm->OutStreamer.AddComment("Dwarf Version");
3079 Asm->EmitInt16(dwarf::DWARF_VERSION);
3080 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3081 Asm->EmitInt8(TD->getPointerSize());
3083 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3084 E = InlinedSPNodes.end(); I != E; ++I) {
3087 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3088 = InlineInfo.find(Node);
3089 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3090 DISubprogram SP(Node);
3091 StringRef LName = SP.getLinkageName();
3092 StringRef Name = SP.getName();
3094 Asm->OutStreamer.AddComment("MIPS linkage name");
3095 if (LName.empty()) {
3096 Asm->OutStreamer.EmitBytes(Name, 0);
3097 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3099 EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3100 getTempLabel("section_str"), true);
3102 Asm->OutStreamer.AddComment("Function name");
3103 EmitSectionOffset(getStringPoolEntry(Name), getTempLabel("section_str"),
3105 Asm->EmitULEB128(Labels.size(), "Inline count");
3107 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3108 LE = Labels.end(); LI != LE; ++LI) {
3109 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3110 Asm->EmitInt32(LI->second->getOffset());
3112 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3113 Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3117 Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));