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), shouldEmit(false),
305 CurrentFnDbgScope(0), DebugTimer(0) {
306 NextStringPoolNumber = 0;
308 DwarfFrameSectionSym = 0;
309 DwarfInfoSectionSym = 0;
310 DwarfAbbrevSectionSym = 0;
311 DwarfStrSectionSym = 0;
315 if (TimePassesIsEnabled)
316 DebugTimer = new Timer("Dwarf Debug Writer");
318 DwarfDebug::~DwarfDebug() {
319 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
320 DIEBlocks[j]->~DIEBlock();
325 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
326 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
327 if (Entry.first) return Entry.first;
329 Entry.second = NextStringPoolNumber++;
330 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
334 /// assignAbbrevNumber - Define a unique number for the abbreviation.
336 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
337 // Profile the node so that we can make it unique.
341 // Check the set for priors.
342 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
344 // If it's newly added.
345 if (InSet == &Abbrev) {
346 // Add to abbreviation list.
347 Abbreviations.push_back(&Abbrev);
349 // Assign the vector position + 1 as its number.
350 Abbrev.setNumber(Abbreviations.size());
352 // Assign existing abbreviation number.
353 Abbrev.setNumber(InSet->getNumber());
357 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
358 /// information entry.
359 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
360 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
364 /// addUInt - Add an unsigned integer attribute data and value.
366 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
367 unsigned Form, uint64_t Integer) {
368 if (!Form) Form = DIEInteger::BestForm(false, Integer);
369 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
370 Die->addValue(Attribute, Form, Value);
373 /// addSInt - Add an signed integer attribute data and value.
375 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
376 unsigned Form, int64_t Integer) {
377 if (!Form) Form = DIEInteger::BestForm(true, Integer);
378 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
379 Die->addValue(Attribute, Form, Value);
382 /// addString - Add a string attribute data and value. DIEString only
383 /// keeps string reference.
384 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
386 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
387 Die->addValue(Attribute, Form, Value);
390 /// addLabel - Add a Dwarf label attribute data and value.
392 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
393 const MCSymbol *Label) {
394 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
395 Die->addValue(Attribute, Form, Value);
398 /// addDelta - Add a label delta attribute data and value.
400 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
401 const MCSymbol *Hi, const MCSymbol *Lo) {
402 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
403 Die->addValue(Attribute, Form, Value);
406 /// addBlock - Add block data.
408 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
410 Block->ComputeSize(TD);
411 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
412 Die->addValue(Attribute, Block->BestForm(), Block);
415 /// addSourceLine - Add location information to specified debug information
417 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
418 // If there is no compile unit specified, don't add a line #.
419 if (!V->getCompileUnit().Verify())
422 unsigned Line = V->getLineNumber();
423 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
424 V->getContext().getFilename());
425 assert(FileID && "Invalid file id");
426 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
427 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
430 /// addSourceLine - Add location information to specified debug information
432 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
433 // If there is no compile unit specified, don't add a line #.
434 if (!G->getCompileUnit().Verify())
437 unsigned Line = G->getLineNumber();
438 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
439 G->getContext().getFilename());
440 assert(FileID && "Invalid file id");
441 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
442 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
445 /// addSourceLine - Add location information to specified debug information
447 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
448 // If there is no compile unit specified, don't add a line #.
449 if (!SP->getCompileUnit().Verify())
451 // If the line number is 0, don't add it.
452 if (SP->getLineNumber() == 0)
455 unsigned Line = SP->getLineNumber();
456 if (!SP->getContext().Verify())
458 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
460 assert(FileID && "Invalid file id");
461 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
462 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
465 /// addSourceLine - Add location information to specified debug information
467 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
468 // If there is no compile unit specified, don't add a line #.
469 DICompileUnit CU = Ty->getCompileUnit();
473 unsigned Line = Ty->getLineNumber();
474 if (!Ty->getContext().Verify())
476 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
477 Ty->getContext().getFilename());
478 assert(FileID && "Invalid file id");
479 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
480 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
483 /// addSourceLine - Add location information to specified debug information
485 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
486 // If there is no compile unit specified, don't add a line #.
487 if (!NS->getCompileUnit().Verify())
490 unsigned Line = NS->getLineNumber();
491 StringRef FN = NS->getFilename();
492 StringRef Dir = NS->getDirectory();
494 unsigned FileID = GetOrCreateSourceID(Dir, FN);
495 assert(FileID && "Invalid file id");
496 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
497 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
500 /* Byref variables, in Blocks, are declared by the programmer as
501 "SomeType VarName;", but the compiler creates a
502 __Block_byref_x_VarName struct, and gives the variable VarName
503 either the struct, or a pointer to the struct, as its type. This
504 is necessary for various behind-the-scenes things the compiler
505 needs to do with by-reference variables in blocks.
507 However, as far as the original *programmer* is concerned, the
508 variable should still have type 'SomeType', as originally declared.
510 The following function dives into the __Block_byref_x_VarName
511 struct to find the original type of the variable. This will be
512 passed back to the code generating the type for the Debug
513 Information Entry for the variable 'VarName'. 'VarName' will then
514 have the original type 'SomeType' in its debug information.
516 The original type 'SomeType' will be the type of the field named
517 'VarName' inside the __Block_byref_x_VarName struct.
519 NOTE: In order for this to not completely fail on the debugger
520 side, the Debug Information Entry for the variable VarName needs to
521 have a DW_AT_location that tells the debugger how to unwind through
522 the pointers and __Block_byref_x_VarName struct to find the actual
523 value of the variable. The function addBlockByrefType does this. */
525 /// Find the type the programmer originally declared the variable to be
526 /// and return that type.
528 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
531 unsigned tag = Ty.getTag();
533 if (tag == dwarf::DW_TAG_pointer_type) {
534 DIDerivedType DTy = DIDerivedType(Ty.getNode());
535 subType = DTy.getTypeDerivedFrom();
538 DICompositeType blockStruct = DICompositeType(subType.getNode());
539 DIArray Elements = blockStruct.getTypeArray();
541 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
542 DIDescriptor Element = Elements.getElement(i);
543 DIDerivedType DT = DIDerivedType(Element.getNode());
544 if (Name == DT.getName())
545 return (DT.getTypeDerivedFrom());
551 /// addComplexAddress - Start with the address based on the location provided,
552 /// and generate the DWARF information necessary to find the actual variable
553 /// given the extra address information encoded in the DIVariable, starting from
554 /// the starting location. Add the DWARF information to the die.
556 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
558 const MachineLocation &Location) {
559 const DIVariable &VD = DV->getVariable();
560 DIType Ty = VD.getType();
562 // Decode the original location, and use that as the start of the byref
563 // variable's location.
564 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
565 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
567 if (Location.isReg()) {
569 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
571 Reg = Reg - dwarf::DW_OP_reg0;
572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
573 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
577 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
579 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
580 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
583 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
586 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
587 uint64_t Element = VD.getAddrElement(i);
589 if (Element == DIFactory::OpPlus) {
590 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
591 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
592 } else if (Element == DIFactory::OpDeref) {
593 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
594 } else llvm_unreachable("unknown DIFactory Opcode");
597 // Now attach the location information to the DIE.
598 addBlock(Die, Attribute, 0, Block);
601 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
602 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
603 gives the variable VarName either the struct, or a pointer to the struct, as
604 its type. This is necessary for various behind-the-scenes things the
605 compiler needs to do with by-reference variables in Blocks.
607 However, as far as the original *programmer* is concerned, the variable
608 should still have type 'SomeType', as originally declared.
610 The function getBlockByrefType dives into the __Block_byref_x_VarName
611 struct to find the original type of the variable, which is then assigned to
612 the variable's Debug Information Entry as its real type. So far, so good.
613 However now the debugger will expect the variable VarName to have the type
614 SomeType. So we need the location attribute for the variable to be an
615 expression that explains to the debugger how to navigate through the
616 pointers and struct to find the actual variable of type SomeType.
618 The following function does just that. We start by getting
619 the "normal" location for the variable. This will be the location
620 of either the struct __Block_byref_x_VarName or the pointer to the
621 struct __Block_byref_x_VarName.
623 The struct will look something like:
625 struct __Block_byref_x_VarName {
627 struct __Block_byref_x_VarName *forwarding;
628 ... <various other fields>
630 ... <maybe more fields>
633 If we are given the struct directly (as our starting point) we
634 need to tell the debugger to:
636 1). Add the offset of the forwarding field.
638 2). Follow that pointer to get the real __Block_byref_x_VarName
639 struct to use (the real one may have been copied onto the heap).
641 3). Add the offset for the field VarName, to find the actual variable.
643 If we started with a pointer to the struct, then we need to
644 dereference that pointer first, before the other steps.
645 Translating this into DWARF ops, we will need to append the following
646 to the current location description for the variable:
648 DW_OP_deref -- optional, if we start with a pointer
649 DW_OP_plus_uconst <forward_fld_offset>
651 DW_OP_plus_uconst <varName_fld_offset>
653 That is what this function does. */
655 /// addBlockByrefAddress - Start with the address based on the location
656 /// provided, and generate the DWARF information necessary to find the
657 /// actual Block variable (navigating the Block struct) based on the
658 /// starting location. Add the DWARF information to the die. For
659 /// more information, read large comment just above here.
661 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
663 const MachineLocation &Location) {
664 const DIVariable &VD = DV->getVariable();
665 DIType Ty = VD.getType();
667 unsigned Tag = Ty.getTag();
668 bool isPointer = false;
670 StringRef varName = VD.getName();
672 if (Tag == dwarf::DW_TAG_pointer_type) {
673 DIDerivedType DTy = DIDerivedType(Ty.getNode());
674 TmpTy = DTy.getTypeDerivedFrom();
678 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
680 // Find the __forwarding field and the variable field in the __Block_byref
682 DIArray Fields = blockStruct.getTypeArray();
683 DIDescriptor varField = DIDescriptor();
684 DIDescriptor forwardingField = DIDescriptor();
686 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
687 DIDescriptor Element = Fields.getElement(i);
688 DIDerivedType DT = DIDerivedType(Element.getNode());
689 StringRef fieldName = DT.getName();
690 if (fieldName == "__forwarding")
691 forwardingField = Element;
692 else if (fieldName == varName)
696 // Get the offsets for the forwarding field and the variable field.
697 unsigned forwardingFieldOffset =
698 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
699 unsigned varFieldOffset =
700 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
702 // Decode the original location, and use that as the start of the byref
703 // variable's location.
704 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
705 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
707 if (Location.isReg()) {
709 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
711 Reg = Reg - dwarf::DW_OP_reg0;
712 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
713 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
717 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
719 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
720 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
723 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
726 // If we started with a pointer to the __Block_byref... struct, then
727 // the first thing we need to do is dereference the pointer (DW_OP_deref).
729 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
731 // Next add the offset for the '__forwarding' field:
732 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
733 // adding the offset if it's 0.
734 if (forwardingFieldOffset > 0) {
735 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
736 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
739 // Now dereference the __forwarding field to get to the real __Block_byref
740 // struct: DW_OP_deref.
741 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
743 // Now that we've got the real __Block_byref... struct, add the offset
744 // for the variable's field to get to the location of the actual variable:
745 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
746 if (varFieldOffset > 0) {
747 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
748 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
751 // Now attach the location information to the DIE.
752 addBlock(Die, Attribute, 0, Block);
755 /// addAddress - Add an address attribute to a die based on the location
757 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
758 const MachineLocation &Location) {
759 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
760 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
762 if (Location.isReg()) {
764 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
766 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
767 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
771 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
773 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
774 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
777 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
780 addBlock(Die, Attribute, 0, Block);
783 /// addToContextOwner - Add Die into the list of its context owner's children.
784 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
785 if (Context.isType()) {
786 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
787 ContextDIE->addChild(Die);
788 } else if (Context.isNameSpace()) {
789 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
790 ContextDIE->addChild(Die);
791 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
792 ContextDIE->addChild(Die);
794 ModuleCU->addDie(Die);
797 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
799 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
800 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
805 TyDIE = new DIE(dwarf::DW_TAG_base_type);
806 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
807 if (Ty.isBasicType())
808 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
809 else if (Ty.isCompositeType())
810 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
812 assert(Ty.isDerivedType() && "Unknown kind of DIType");
813 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
816 addToContextOwner(TyDIE, Ty.getContext());
820 /// addType - Add a new type attribute to the specified entity.
821 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
825 // Check for pre-existence.
826 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
827 // If it exists then use the existing value.
829 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
834 DIE *Buffer = getOrCreateTypeDIE(Ty);
837 Entry = createDIEEntry(Buffer);
838 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
840 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
843 /// constructTypeDIE - Construct basic type die from DIBasicType.
844 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
845 // Get core information.
846 StringRef Name = BTy.getName();
847 Buffer.setTag(dwarf::DW_TAG_base_type);
848 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
851 // Add name if not anonymous or intermediate type.
853 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
854 uint64_t Size = BTy.getSizeInBits() >> 3;
855 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
858 /// constructTypeDIE - Construct derived type die from DIDerivedType.
859 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
860 // Get core information.
861 StringRef Name = DTy.getName();
862 uint64_t Size = DTy.getSizeInBits() >> 3;
863 unsigned Tag = DTy.getTag();
865 // FIXME - Workaround for templates.
866 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
870 // Map to main type, void will not have a type.
871 DIType FromTy = DTy.getTypeDerivedFrom();
872 addType(&Buffer, FromTy);
874 // Add name if not anonymous or intermediate type.
876 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
878 // Add size if non-zero (derived types might be zero-sized.)
880 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
882 // Add source line info if available and TyDesc is not a forward declaration.
883 if (!DTy.isForwardDecl())
884 addSourceLine(&Buffer, &DTy);
887 /// constructTypeDIE - Construct type DIE from DICompositeType.
888 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
889 // Get core information.
890 StringRef Name = CTy.getName();
892 uint64_t Size = CTy.getSizeInBits() >> 3;
893 unsigned Tag = CTy.getTag();
897 case dwarf::DW_TAG_vector_type:
898 case dwarf::DW_TAG_array_type:
899 constructArrayTypeDIE(Buffer, &CTy);
901 case dwarf::DW_TAG_enumeration_type: {
902 DIArray Elements = CTy.getTypeArray();
904 // Add enumerators to enumeration type.
905 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
907 DIDescriptor Enum(Elements.getElement(i).getNode());
908 if (Enum.isEnumerator()) {
909 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum.getNode()));
910 Buffer.addChild(ElemDie);
915 case dwarf::DW_TAG_subroutine_type: {
917 DIArray Elements = CTy.getTypeArray();
918 DIDescriptor RTy = Elements.getElement(0);
919 addType(&Buffer, DIType(RTy.getNode()));
921 // Add prototype flag.
922 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
925 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
926 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
927 DIDescriptor Ty = Elements.getElement(i);
928 addType(Arg, DIType(Ty.getNode()));
929 Buffer.addChild(Arg);
933 case dwarf::DW_TAG_structure_type:
934 case dwarf::DW_TAG_union_type:
935 case dwarf::DW_TAG_class_type: {
936 // Add elements to structure type.
937 DIArray Elements = CTy.getTypeArray();
939 // A forward struct declared type may not have elements available.
940 unsigned N = Elements.getNumElements();
944 // Add elements to structure type.
945 for (unsigned i = 0; i < N; ++i) {
946 DIDescriptor Element = Elements.getElement(i);
948 if (Element.isSubprogram())
949 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
950 else if (Element.isVariable()) {
951 DIVariable DV(Element.getNode());
952 ElemDie = new DIE(dwarf::DW_TAG_variable);
953 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
955 addType(ElemDie, DV.getType());
956 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
957 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
958 addSourceLine(ElemDie, &DV);
959 } else if (Element.isDerivedType())
960 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
963 Buffer.addChild(ElemDie);
966 if (CTy.isAppleBlockExtension())
967 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
969 unsigned RLang = CTy.getRunTimeLang();
971 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
972 dwarf::DW_FORM_data1, RLang);
974 DICompositeType ContainingType = CTy.getContainingType();
975 if (DIDescriptor(ContainingType.getNode()).isCompositeType())
976 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
977 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
984 // Add name if not anonymous or intermediate type.
986 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
988 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
989 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
990 // Add size if non-zero (derived types might be zero-sized.)
992 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
994 // Add zero size if it is not a forward declaration.
995 if (CTy.isForwardDecl())
996 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
998 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1001 // Add source line info if available.
1002 if (!CTy.isForwardDecl())
1003 addSourceLine(&Buffer, &CTy);
1007 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1008 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1009 int64_t L = SR.getLo();
1010 int64_t H = SR.getHi();
1011 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1013 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1015 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1016 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1018 Buffer.addChild(DW_Subrange);
1021 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1022 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1023 DICompositeType *CTy) {
1024 Buffer.setTag(dwarf::DW_TAG_array_type);
1025 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1026 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1028 // Emit derived type.
1029 addType(&Buffer, CTy->getTypeDerivedFrom());
1030 DIArray Elements = CTy->getTypeArray();
1032 // Get an anonymous type for index type.
1033 DIE *IdxTy = ModuleCU->getIndexTyDie();
1035 // Construct an anonymous type for index type.
1036 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1037 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1038 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1039 dwarf::DW_ATE_signed);
1040 ModuleCU->addDie(IdxTy);
1041 ModuleCU->setIndexTyDie(IdxTy);
1044 // Add subranges to array type.
1045 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1046 DIDescriptor Element = Elements.getElement(i);
1047 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1048 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1052 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1053 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1054 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1055 StringRef Name = ETy.getName();
1056 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1057 int64_t Value = ETy.getEnumValue();
1058 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1062 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1063 /// printer to not emit usual symbol prefix before the symbol name is used then
1064 /// return linkage name after skipping this special LLVM prefix.
1065 static StringRef getRealLinkageName(StringRef LinkageName) {
1067 if (LinkageName.startswith(StringRef(&One, 1)))
1068 return LinkageName.substr(1);
1072 /// createGlobalVariableDIE - Create new DIE using GV.
1073 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1074 // If the global variable was optmized out then no need to create debug info
1076 if (!GV.getGlobal()) return NULL;
1077 if (GV.getDisplayName().empty()) return NULL;
1079 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1080 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1081 GV.getDisplayName());
1083 StringRef LinkageName = GV.getLinkageName();
1084 if (!LinkageName.empty())
1085 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1086 getRealLinkageName(LinkageName));
1088 addType(GVDie, GV.getType());
1089 if (!GV.isLocalToUnit())
1090 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1091 addSourceLine(GVDie, &GV);
1096 /// createMemberDIE - Create new member DIE.
1097 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1098 DIE *MemberDie = new DIE(DT.getTag());
1099 StringRef Name = DT.getName();
1101 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1103 addType(MemberDie, DT.getTypeDerivedFrom());
1105 addSourceLine(MemberDie, &DT);
1107 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1108 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1110 uint64_t Size = DT.getSizeInBits();
1111 uint64_t FieldSize = DT.getOriginalTypeSize();
1113 if (Size != FieldSize) {
1115 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1116 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1118 uint64_t Offset = DT.getOffsetInBits();
1119 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1120 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1121 uint64_t FieldOffset = (HiMark - FieldSize);
1122 Offset -= FieldOffset;
1124 // Maybe we need to work from the other end.
1125 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1126 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1128 // Here WD_AT_data_member_location points to the anonymous
1129 // field that includes this bit field.
1130 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1133 // This is not a bitfield.
1134 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1136 if (DT.getTag() == dwarf::DW_TAG_inheritance
1137 && DT.isVirtual()) {
1139 // For C++, virtual base classes are not at fixed offset. Use following
1140 // expression to extract appropriate offset from vtable.
1141 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1143 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1144 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1145 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1146 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1147 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1148 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1149 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1150 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1152 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1155 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1157 if (DT.isProtected())
1158 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1159 dwarf::DW_ACCESS_protected);
1160 else if (DT.isPrivate())
1161 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1162 dwarf::DW_ACCESS_private);
1163 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1164 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1165 dwarf::DW_ACCESS_public);
1167 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1168 dwarf::DW_VIRTUALITY_virtual);
1172 /// createSubprogramDIE - Create new DIE using SP.
1173 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1174 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1178 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1179 // Constructors and operators for anonymous aggregates do not have names.
1180 if (!SP.getName().empty())
1181 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1183 StringRef LinkageName = SP.getLinkageName();
1184 if (!LinkageName.empty())
1185 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1186 getRealLinkageName(LinkageName));
1188 addSourceLine(SPDie, &SP);
1190 // Add prototyped tag, if C or ObjC.
1191 unsigned Lang = SP.getCompileUnit().getLanguage();
1192 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1193 Lang == dwarf::DW_LANG_ObjC)
1194 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1197 DICompositeType SPTy = SP.getType();
1198 DIArray Args = SPTy.getTypeArray();
1199 unsigned SPTag = SPTy.getTag();
1201 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1202 addType(SPDie, SPTy);
1204 addType(SPDie, DIType(Args.getElement(0).getNode()));
1206 unsigned VK = SP.getVirtuality();
1208 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1209 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1210 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1211 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1212 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1213 ContainingTypeMap.insert(std::make_pair(SPDie,
1214 SP.getContainingType().getNode()));
1217 if (MakeDecl || !SP.isDefinition()) {
1218 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1220 // Add arguments. Do not add arguments for subprogram definition. They will
1221 // be handled while processing variables.
1222 DICompositeType SPTy = SP.getType();
1223 DIArray Args = SPTy.getTypeArray();
1224 unsigned SPTag = SPTy.getTag();
1226 if (SPTag == dwarf::DW_TAG_subroutine_type)
1227 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1228 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1229 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1231 if (ATy.isArtificial())
1232 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1233 SPDie->addChild(Arg);
1237 if (SP.isArtificial())
1238 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1240 // DW_TAG_inlined_subroutine may refer to this DIE.
1241 ModuleCU->insertDIE(SP.getNode(), SPDie);
1245 /// getUpdatedDbgScope - Find DbgScope assicated with the instruction.
1246 /// Update scope hierarchy. Create abstract scope if required.
1247 DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1248 MDNode *InlinedAt) {
1249 assert(N && "Invalid Scope encoding!");
1250 assert(MI && "Missing machine instruction!");
1251 bool isAConcreteScope = InlinedAt != 0;
1253 DbgScope *NScope = NULL;
1256 NScope = DbgScopeMap.lookup(InlinedAt);
1258 NScope = DbgScopeMap.lookup(N);
1259 assert(NScope && "Unable to find working scope!");
1261 if (NScope->getFirstInsn())
1264 DbgScope *Parent = NULL;
1265 if (isAConcreteScope) {
1266 DILocation IL(InlinedAt);
1267 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1268 IL.getOrigLocation().getNode());
1269 assert(Parent && "Unable to find Parent scope!");
1270 NScope->setParent(Parent);
1271 Parent->addScope(NScope);
1272 } else if (DIDescriptor(N).isLexicalBlock()) {
1273 DILexicalBlock DB(N);
1274 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1275 NScope->setParent(Parent);
1276 Parent->addScope(NScope);
1279 NScope->setFirstInsn(MI);
1281 if (!Parent && !InlinedAt) {
1282 StringRef SPName = DISubprogram(N).getLinkageName();
1283 if (SPName == MF->getFunction()->getName())
1284 CurrentFnDbgScope = NScope;
1287 if (isAConcreteScope) {
1288 ConcreteScopes[InlinedAt] = NScope;
1289 getOrCreateAbstractScope(N);
1295 DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1296 assert(N && "Invalid Scope encoding!");
1298 DbgScope *AScope = AbstractScopes.lookup(N);
1302 DbgScope *Parent = NULL;
1304 DIDescriptor Scope(N);
1305 if (Scope.isLexicalBlock()) {
1306 DILexicalBlock DB(N);
1307 DIDescriptor ParentDesc = DB.getContext();
1308 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1311 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1314 Parent->addScope(AScope);
1315 AScope->setAbstractScope();
1316 AbstractScopes[N] = AScope;
1317 if (DIDescriptor(N).isSubprogram())
1318 AbstractScopesList.push_back(AScope);
1322 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1323 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1324 /// If there are global variables in this scope then create and insert
1325 /// DIEs for these variables.
1326 DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1327 DIE *SPDie = ModuleCU->getDIE(SPNode);
1328 assert(SPDie && "Unable to find subprogram DIE!");
1329 DISubprogram SP(SPNode);
1331 // There is not any need to generate specification DIE for a function
1332 // defined at compile unit level. If a function is defined inside another
1333 // function then gdb prefers the definition at top level and but does not
1334 // expect specification DIE in parent function. So avoid creating
1335 // specification DIE for a function defined inside a function.
1336 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1337 !SP.getContext().isFile() && !SP.getContext().isSubprogram()) {
1338 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1341 DICompositeType SPTy = SP.getType();
1342 DIArray Args = SPTy.getTypeArray();
1343 unsigned SPTag = SPTy.getTag();
1344 if (SPTag == dwarf::DW_TAG_subroutine_type)
1345 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1346 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1347 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1349 if (ATy.isArtificial())
1350 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1351 SPDie->addChild(Arg);
1353 DIE *SPDeclDie = SPDie;
1354 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1355 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1357 ModuleCU->addDie(SPDie);
1360 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1361 Asm->GetTempSymbol("func_begin", SubprogramCount));
1362 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1363 Asm->GetTempSymbol("func_end", SubprogramCount));
1364 MachineLocation Location(RI->getFrameRegister(*MF));
1365 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1367 if (!DISubprogram(SPNode).isLocalToUnit())
1368 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1373 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1374 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1375 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1376 MCSymbol *Start = Scope->getStartLabel();
1377 MCSymbol *End = Scope->getEndLabel();
1378 if (Start == 0 || End == 0) return 0;
1380 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1381 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1383 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1384 if (Scope->isAbstractScope())
1387 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1388 Start ? Start : Asm->GetTempSymbol("func_begin", SubprogramCount));
1389 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1390 End ? End : Asm->GetTempSymbol("func_end", SubprogramCount));
1395 /// constructInlinedScopeDIE - This scope represents inlined body of
1396 /// a function. Construct DIE to represent this concrete inlined copy
1397 /// of the function.
1398 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1399 MCSymbol *StartLabel = Scope->getStartLabel();
1400 MCSymbol *EndLabel = Scope->getEndLabel();
1401 if (StartLabel == 0 || EndLabel == 0) return 0;
1403 assert(StartLabel->isDefined() &&
1404 "Invalid starting label for an inlined scope!");
1405 assert(EndLabel->isDefined() &&
1406 "Invalid end label for an inlined scope!");
1407 if (!Scope->getScopeNode())
1409 DIScope DS(Scope->getScopeNode());
1410 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1412 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1413 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1414 assert(OriginDIE && "Unable to find Origin DIE!");
1415 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1416 dwarf::DW_FORM_ref4, OriginDIE);
1418 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1419 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1421 InlinedSubprogramDIEs.insert(OriginDIE);
1423 // Track the start label for this inlined function.
1424 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1425 I = InlineInfo.find(InlinedSP.getNode());
1427 if (I == InlineInfo.end()) {
1428 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1430 InlinedSPNodes.push_back(InlinedSP.getNode());
1432 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1434 DILocation DL(Scope->getInlinedAt());
1435 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1436 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1442 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1443 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1444 // Get the descriptor.
1445 const DIVariable &VD = DV->getVariable();
1446 StringRef Name = VD.getName();
1450 // Translate tag to proper Dwarf tag. The result variable is dropped for
1453 switch (VD.getTag()) {
1454 case dwarf::DW_TAG_return_variable:
1456 case dwarf::DW_TAG_arg_variable:
1457 Tag = dwarf::DW_TAG_formal_parameter;
1459 case dwarf::DW_TAG_auto_variable: // fall thru
1461 Tag = dwarf::DW_TAG_variable;
1465 // Define variable debug information entry.
1466 DIE *VariableDie = new DIE(Tag);
1470 if (DbgVariable *AV = DV->getAbstractVariable())
1471 AbsDIE = AV->getDIE();
1474 DIScope DS(Scope->getScopeNode());
1475 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1476 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1478 assert(OriginSPDIE && "Unable to find Origin DIE for the SP!");
1479 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1480 assert(AbsDIE && "Unable to find Origin DIE for the Variable!");
1481 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1482 dwarf::DW_FORM_ref4, AbsDIE);
1485 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1486 addSourceLine(VariableDie, &VD);
1488 // Add variable type.
1489 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1490 // addresses instead.
1491 if (VD.isBlockByrefVariable())
1492 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1494 addType(VariableDie, VD.getType());
1497 // Add variable address.
1498 if (!Scope->isAbstractScope()) {
1499 // Check if variable is described by DBG_VALUE instruction.
1500 if (const MachineInstr *DbgValueInsn = DV->getDbgValue()) {
1501 if (DbgValueInsn->getNumOperands() == 3) {
1502 // FIXME : Handle getNumOperands != 3
1503 if (DbgValueInsn->getOperand(0).getType()
1504 == MachineOperand::MO_Register
1505 && DbgValueInsn->getOperand(0).getReg()) {
1506 MachineLocation Location;
1507 Location.set(DbgValueInsn->getOperand(0).getReg());
1508 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1509 if (MCSymbol *VS = DV->getDbgValueLabel())
1510 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1512 } else if (DbgValueInsn->getOperand(0).getType() ==
1513 MachineOperand::MO_Immediate) {
1514 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1515 unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1516 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1517 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1518 if (MCSymbol *VS = DV->getDbgValueLabel())
1519 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1522 //FIXME : Handle other operand types.
1528 MachineLocation Location;
1530 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(),
1532 Location.set(FrameReg, Offset);
1534 if (VD.hasComplexAddress())
1535 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1536 else if (VD.isBlockByrefVariable())
1537 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1539 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1543 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1544 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1545 DV->setDIE(VariableDie);
1550 void DwarfDebug::addPubTypes(DISubprogram SP) {
1551 DICompositeType SPTy = SP.getType();
1552 unsigned SPTag = SPTy.getTag();
1553 if (SPTag != dwarf::DW_TAG_subroutine_type)
1556 DIArray Args = SPTy.getTypeArray();
1557 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1558 DIType ATy(Args.getElement(i).getNode());
1561 DICompositeType CATy = getDICompositeType(ATy);
1562 if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1563 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1564 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1569 /// constructScopeDIE - Construct a DIE for this scope.
1570 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1571 if (!Scope || !Scope->getScopeNode())
1574 DIScope DS(Scope->getScopeNode());
1575 DIE *ScopeDIE = NULL;
1576 if (Scope->getInlinedAt())
1577 ScopeDIE = constructInlinedScopeDIE(Scope);
1578 else if (DS.isSubprogram()) {
1579 if (Scope->isAbstractScope())
1580 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1582 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1585 ScopeDIE = constructLexicalScopeDIE(Scope);
1586 if (!ScopeDIE) return NULL;
1588 // Add variables to scope.
1589 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1590 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1591 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1593 ScopeDIE->addChild(VariableDIE);
1596 // Add nested scopes.
1597 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1598 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1599 // Define the Scope debug information entry.
1600 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1602 ScopeDIE->addChild(NestedDIE);
1605 if (DS.isSubprogram())
1606 addPubTypes(DISubprogram(DS.getNode()));
1611 /// GetOrCreateSourceID - Look up the source id with the given directory and
1612 /// source file names. If none currently exists, create a new id and insert it
1613 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1615 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1617 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1618 if (DI != DirectoryIdMap.end()) {
1619 DId = DI->getValue();
1621 DId = DirectoryNames.size() + 1;
1622 DirectoryIdMap[DirName] = DId;
1623 DirectoryNames.push_back(DirName);
1627 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1628 if (FI != SourceFileIdMap.end()) {
1629 FId = FI->getValue();
1631 FId = SourceFileNames.size() + 1;
1632 SourceFileIdMap[FileName] = FId;
1633 SourceFileNames.push_back(FileName);
1636 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1637 SourceIdMap.find(std::make_pair(DId, FId));
1638 if (SI != SourceIdMap.end())
1641 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1642 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1643 SourceIds.push_back(std::make_pair(DId, FId));
1648 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1649 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1650 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1653 NDie = new DIE(dwarf::DW_TAG_namespace);
1654 ModuleCU->insertDIE(NS.getNode(), NDie);
1655 if (!NS.getName().empty())
1656 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1657 addSourceLine(NDie, &NS);
1658 addToContextOwner(NDie, NS.getContext());
1662 void DwarfDebug::constructCompileUnit(MDNode *N) {
1663 DICompileUnit DIUnit(N);
1664 // Use first compile unit marked as isMain as the compile unit for this
1666 if (ModuleCU || !DIUnit.isMain())
1668 StringRef FN = DIUnit.getFilename();
1669 StringRef Dir = DIUnit.getDirectory();
1670 unsigned ID = GetOrCreateSourceID(Dir, FN);
1672 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1673 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1674 DIUnit.getProducer());
1675 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1676 DIUnit.getLanguage());
1677 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1678 addLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, TextSectionSym);
1679 addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1680 Asm->GetTempSymbol("text_end"));
1681 // DW_AT_stmt_list is a offset of line number information for this
1682 // compile unit in debug_line section. It is always zero when only one
1683 // compile unit is emitted in one object file.
1684 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1687 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1688 if (DIUnit.isOptimized())
1689 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1691 StringRef Flags = DIUnit.getFlags();
1693 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1695 unsigned RVer = DIUnit.getRunTimeVersion();
1697 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1698 dwarf::DW_FORM_data1, RVer);
1701 "ModuleCU assigned since the top of constructCompileUnit");
1702 ModuleCU = new CompileUnit(ID, Die);
1705 void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1706 DIGlobalVariable DI_GV(N);
1708 // If debug information is malformed then ignore it.
1709 if (DI_GV.Verify() == false)
1712 // Check for pre-existence.
1713 if (ModuleCU->getDIE(DI_GV.getNode()))
1716 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1721 ModuleCU->insertDIE(N, VariableDie);
1723 // Add to context owner.
1724 DIDescriptor GVContext = DI_GV.getContext();
1725 // Do not create specification DIE if context is either compile unit
1727 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1728 !GVContext.isFile() && !GVContext.isSubprogram()) {
1729 // Create specification DIE.
1730 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1731 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1732 dwarf::DW_FORM_ref4, VariableDie);
1733 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1734 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1735 addLabel(Block, 0, dwarf::DW_FORM_udata,
1736 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1737 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1738 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1739 ModuleCU->addDie(VariableSpecDIE);
1741 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1742 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1743 addLabel(Block, 0, dwarf::DW_FORM_udata,
1744 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1745 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1747 addToContextOwner(VariableDie, GVContext);
1749 // Expose as global. FIXME - need to check external flag.
1750 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1752 DIType GTy = DI_GV.getType();
1753 if (GTy.isCompositeType() && !GTy.getName().empty()) {
1754 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1755 assert(Entry && "Missing global type!");
1756 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1761 void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1764 // Check for pre-existence.
1765 if (ModuleCU->getDIE(N))
1768 if (!SP.isDefinition())
1769 // This is a method declaration which will be handled while constructing
1773 DIE *SubprogramDie = createSubprogramDIE(SP);
1776 ModuleCU->insertDIE(N, SubprogramDie);
1778 // Add to context owner.
1779 addToContextOwner(SubprogramDie, SP.getContext());
1781 // Expose as global.
1782 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1787 /// beginModule - Emit all Dwarf sections that should come prior to the
1788 /// content. Create global DIEs and emit initial debug info sections.
1789 /// This is inovked by the target AsmPrinter.
1790 void DwarfDebug::beginModule(Module *M) {
1793 if (!MAI->doesSupportDebugInformation())
1796 TimeRegion Timer(DebugTimer);
1798 DebugInfoFinder DbgFinder;
1799 DbgFinder.processModule(*M);
1801 // Emit initial sections
1802 EmitSectionLabels();
1804 // Create all the compile unit DIEs.
1805 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1806 E = DbgFinder.compile_unit_end(); I != E; ++I)
1807 constructCompileUnit(*I);
1812 // Create DIEs for each subprogram.
1813 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1814 E = DbgFinder.subprogram_end(); I != E; ++I)
1815 constructSubprogramDIE(*I);
1817 // Create DIEs for each global variable.
1818 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1819 E = DbgFinder.global_variable_end(); I != E; ++I)
1820 constructGlobalVariableDIE(*I);
1824 MMI->setDebugInfoAvailability(true);
1826 // Prime section data.
1827 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1829 // Print out .file directives to specify files for .loc directives. These are
1830 // printed out early so that they precede any .loc directives.
1831 if (MAI->hasDotLocAndDotFile()) {
1832 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1833 // Remember source id starts at 1.
1834 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1835 // FIXME: don't use sys::path for this! This should not depend on the
1837 sys::Path FullPath(getSourceDirectoryName(Id.first));
1839 FullPath.appendComponent(getSourceFileName(Id.second));
1840 assert(AppendOk && "Could not append filename to directory!");
1842 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1847 /// endModule - Emit all Dwarf sections that should come after the content.
1849 void DwarfDebug::endModule() {
1853 TimeRegion Timer(DebugTimer);
1855 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1856 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1857 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1859 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1862 // Insert top level DIEs.
1863 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1864 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1865 ModuleCU->getCUDie()->addChild(*TI);
1867 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1868 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1869 DIE *SPDie = CI->first;
1870 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1872 DIE *NDie = ModuleCU->getDIE(N);
1873 if (!NDie) continue;
1874 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1875 // FIXME - This is not the correct approach.
1876 //addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie
1879 // Standard sections final addresses.
1880 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1881 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1882 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1883 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1885 // End text sections.
1886 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1887 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1888 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1891 // Emit common frame information.
1892 emitCommonDebugFrame();
1894 // Emit function debug frame information
1895 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1896 E = DebugFrames.end(); I != E; ++I)
1897 emitFunctionDebugFrame(*I);
1899 // Compute DIE offsets and sizes.
1900 computeSizeAndOffsets();
1902 // Emit all the DIEs into a debug info section
1905 // Corresponding abbreviations into a abbrev section.
1906 emitAbbreviations();
1908 // Emit source line correspondence into a debug line section.
1911 // Emit info into a debug pubnames section.
1912 emitDebugPubNames();
1914 // Emit info into a debug pubtypes section.
1915 emitDebugPubTypes();
1917 // Emit info into a debug loc section.
1920 // Emit info into a debug aranges section.
1923 // Emit info into a debug ranges section.
1926 // Emit info into a debug macinfo section.
1929 // Emit inline info.
1930 emitDebugInlineInfo();
1932 // Emit info into a debug str section.
1936 ModuleCU = NULL; // Reset for the next Module, if any.
1939 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1940 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1942 DebugLoc ScopeLoc) {
1944 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1946 return AbsDbgVariable;
1948 LLVMContext &Ctx = Var.getNode()->getContext();
1949 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1953 AbsDbgVariable = new DbgVariable(Var, FrameIdx,
1954 NULL /* No more-abstract variable*/);
1955 Scope->addVariable(AbsDbgVariable);
1956 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1957 return AbsDbgVariable;
1960 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1961 /// FIXME : Refactor findAbstractVariable.
1962 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1963 const MachineInstr *MI,
1964 DebugLoc ScopeLoc) {
1966 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1968 return AbsDbgVariable;
1970 LLVMContext &Ctx = Var.getNode()->getContext();
1971 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1975 AbsDbgVariable = new DbgVariable(Var, MI,
1976 NULL /* No more-abstract variable*/);
1977 Scope->addVariable(AbsDbgVariable);
1978 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1979 DbgValueStartMap[MI] = AbsDbgVariable;
1980 return AbsDbgVariable;
1983 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1984 void DwarfDebug::collectVariableInfo() {
1987 const LLVMContext &Ctx = MF->getFunction()->getContext();
1989 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1990 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1991 VE = VMap.end(); VI != VE; ++VI) {
1992 MDNode *Var = VI->first;
1995 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1997 DbgScope *Scope = 0;
1998 if (MDNode *IA = VP.second.getInlinedAt(Ctx))
1999 Scope = ConcreteScopes.lookup(IA);
2001 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2003 // If variable scope is not found then skip this variable.
2007 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, VP.second);
2008 DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
2009 Scope->addVariable(RegVar);
2012 // Collect variable information from DBG_VALUE machine instructions;
2013 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2015 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2017 const MachineInstr *MInsn = II;
2018 if (!MInsn->isDebugValue())
2021 // FIXME : Lift this restriction.
2022 if (MInsn->getNumOperands() != 3)
2024 DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands()
2025 - 1).getMetadata()));
2026 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
2027 // FIXME Handle inlined subroutine arguments.
2028 DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2029 CurrentFnDbgScope->addVariable(ArgVar);
2030 DbgValueStartMap[MInsn] = ArgVar;
2034 DebugLoc DL = MInsn->getDebugLoc();
2035 if (DL.isUnknown()) continue;
2036 DbgScope *Scope = 0;
2037 if (MDNode *IA = DL.getInlinedAt(Ctx))
2038 Scope = ConcreteScopes.lookup(IA);
2040 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2042 // If variable scope is not found then skip this variable.
2046 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn, DL);
2047 DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
2048 DbgValueStartMap[MInsn] = RegVar;
2049 Scope->addVariable(RegVar);
2054 /// beginScope - Process beginning of a scope.
2055 void DwarfDebug::beginScope(const MachineInstr *MI) {
2057 DebugLoc DL = MI->getDebugLoc();
2061 // Check and update last known location info.
2062 if (DL == PrevInstLoc)
2065 MDNode *Scope = DL.getScope(MF->getFunction()->getContext());
2067 // FIXME: Should only verify each scope once!
2068 if (!DIScope(Scope).Verify())
2071 // DBG_VALUE instruction establishes new value.
2072 if (MI->isDebugValue()) {
2073 DenseMap<const MachineInstr *, DbgVariable *>::iterator DI
2074 = DbgValueStartMap.find(MI);
2075 if (DI != DbgValueStartMap.end()) {
2076 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2078 DI->second->setDbgValueLabel(Label);
2083 // Emit a label to indicate location change. This is used for line
2084 // table even if this instruction does start a new scope.
2085 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2088 // update DbgScope if this instruction starts a new scope.
2089 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2090 if (I == DbgScopeBeginMap.end())
2093 ScopeVector &SD = I->second;
2094 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2096 (*SDI)->setStartLabel(Label);
2099 /// endScope - Process end of a scope.
2100 void DwarfDebug::endScope(const MachineInstr *MI) {
2101 // Ignore DBG_VALUE instruction.
2102 if (MI->isDebugValue())
2106 DebugLoc DL = MI->getDebugLoc();
2110 // Emit a label and update DbgScope if this instruction ends a scope.
2111 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2112 if (I == DbgScopeEndMap.end())
2115 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2116 Asm->OutStreamer.EmitLabel(Label);
2118 SmallVector<DbgScope*, 2> &SD = I->second;
2119 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2121 (*SDI)->setEndLabel(Label);
2125 /// createDbgScope - Create DbgScope for the scope.
2126 void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2128 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2131 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2132 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2133 if (DIDescriptor(Scope).isLexicalBlock())
2134 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2138 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2142 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2143 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2144 DILocation DL(InlinedAt);
2145 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2148 /// extractScopeInformation - Scan machine instructions in this function
2149 /// and collect DbgScopes. Return true, if at least one scope was found.
2150 bool DwarfDebug::extractScopeInformation() {
2151 // If scope information was extracted using .dbg intrinsics then there is not
2152 // any need to extract these information by scanning each instruction.
2153 if (!DbgScopeMap.empty())
2156 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2157 unsigned MIIndex = 0;
2158 LLVMContext &Ctx = MF->getFunction()->getContext();
2160 // Scan each instruction and create scopes. First build working set of scopes.
2161 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2163 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2165 const MachineInstr *MInsn = II;
2166 // FIXME : Remove DBG_VALUE check.
2167 if (MInsn->isDebugValue()) continue;
2168 MIIndexMap[MInsn] = MIIndex++;
2170 DebugLoc DL = MInsn->getDebugLoc();
2171 if (DL.isUnknown()) continue;
2173 MDNode *Scope = DL.getScope(Ctx);
2175 // There is no need to create another DIE for compile unit. For all
2176 // other scopes, create one DbgScope now. This will be translated
2177 // into a scope DIE at the end.
2178 if (DIScope(Scope).isCompileUnit()) continue;
2179 createDbgScope(Scope, DL.getInlinedAt(Ctx));
2184 // Build scope hierarchy using working set of scopes.
2185 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2187 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2189 const MachineInstr *MInsn = II;
2190 // FIXME : Remove DBG_VALUE check.
2191 if (MInsn->isDebugValue()) continue;
2192 DebugLoc DL = MInsn->getDebugLoc();
2193 if (DL.isUnknown()) continue;
2195 MDNode *Scope = DL.getScope(Ctx);
2196 if (Scope == 0) continue;
2198 // There is no need to create another DIE for compile unit. For all
2199 // other scopes, create one DbgScope now. This will be translated
2200 // into a scope DIE at the end.
2201 if (DIScope(Scope).isCompileUnit()) continue;
2202 DbgScope *DScope = getUpdatedDbgScope(Scope, MInsn, DL.getInlinedAt(Ctx));
2203 DScope->setLastInsn(MInsn);
2207 if (!CurrentFnDbgScope)
2210 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2212 // Each scope has first instruction and last instruction to mark beginning
2213 // and end of a scope respectively. Create an inverse map that list scopes
2214 // starts (and ends) with an instruction. One instruction may start (or end)
2215 // multiple scopes. Ignore scopes that are not reachable.
2216 SmallVector<DbgScope *, 4> WorkList;
2217 WorkList.push_back(CurrentFnDbgScope);
2218 while (!WorkList.empty()) {
2219 DbgScope *S = WorkList.pop_back_val();
2221 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2222 if (!Children.empty())
2223 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2224 SE = Children.end(); SI != SE; ++SI)
2225 WorkList.push_back(*SI);
2227 if (S->isAbstractScope())
2229 const MachineInstr *MI = S->getFirstInsn();
2230 assert(MI && "DbgScope does not have first instruction!");
2232 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2233 if (IDI != DbgScopeBeginMap.end())
2234 IDI->second.push_back(S);
2236 DbgScopeBeginMap[MI].push_back(S);
2238 MI = S->getLastInsn();
2239 assert(MI && "DbgScope does not have last instruction!");
2240 IDI = DbgScopeEndMap.find(MI);
2241 if (IDI != DbgScopeEndMap.end())
2242 IDI->second.push_back(S);
2244 DbgScopeEndMap[MI].push_back(S);
2247 return !DbgScopeMap.empty();
2250 /// beginFunction - Gather pre-function debug information. Assumes being
2251 /// emitted immediately after the function entry point.
2252 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2255 if (!ShouldEmitDwarfDebug()) return;
2256 if (!extractScopeInformation())
2259 TimeRegion Timer(DebugTimer);
2261 collectVariableInfo();
2263 // Assumes in correct section after the entry point.
2264 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin",
2265 ++SubprogramCount));
2267 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2269 DebugLoc FDL = MF->getDefaultDebugLoc();
2270 if (FDL.isUnknown()) return;
2272 MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2274 DISubprogram SP = getDISubprogram(Scope);
2277 Line = SP.getLineNumber();
2280 Line = FDL.getLine();
2284 recordSourceLine(Line, Col, Scope);
2287 /// endFunction - Gather and emit post-function debug information.
2289 void DwarfDebug::endFunction(const MachineFunction *MF) {
2290 if (!ShouldEmitDwarfDebug()) return;
2291 if (DbgScopeMap.empty()) return;
2293 TimeRegion Timer(DebugTimer);
2295 if (CurrentFnDbgScope) {
2296 // Define end label for subprogram.
2297 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", SubprogramCount));
2299 // Get function line info.
2300 if (!Lines.empty()) {
2301 // Get section line info.
2302 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2303 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2304 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2305 // Append the function info to section info.
2306 SectionLineInfos.insert(SectionLineInfos.end(),
2307 Lines.begin(), Lines.end());
2310 // Construct abstract scopes.
2311 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2312 AE = AbstractScopesList.end(); AI != AE; ++AI)
2313 constructScopeDIE(*AI);
2315 constructScopeDIE(CurrentFnDbgScope);
2317 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2318 MMI->getFrameMoves()));
2322 CurrentFnDbgScope = NULL;
2323 DeleteContainerSeconds(DbgScopeMap);
2324 DbgScopeBeginMap.clear();
2325 DbgScopeEndMap.clear();
2326 DbgValueStartMap.clear();
2327 ConcreteScopes.clear();
2328 DeleteContainerSeconds(AbstractScopes);
2329 AbstractScopesList.clear();
2330 AbstractVariables.clear();
2334 /// recordSourceLine - Register a source line with debug info. Returns the
2335 /// unique label that was emitted and which provides correspondence to
2336 /// the source line list.
2337 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2341 TimeRegion Timer(DebugTimer);
2346 DIDescriptor Scope(S);
2347 if (Scope.isCompileUnit()) {
2348 DICompileUnit CU(S);
2349 Dir = CU.getDirectory();
2350 Fn = CU.getFilename();
2351 } else if (Scope.isSubprogram()) {
2353 Dir = SP.getDirectory();
2354 Fn = SP.getFilename();
2355 } else if (Scope.isLexicalBlock()) {
2356 DILexicalBlock DB(S);
2357 Dir = DB.getDirectory();
2358 Fn = DB.getFilename();
2360 assert(0 && "Unexpected scope info");
2362 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2363 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2364 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2366 Asm->OutStreamer.EmitLabel(Label);
2370 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2371 /// timed. Look up the source id with the given directory and source file
2372 /// names. If none currently exists, create a new id and insert it in the
2373 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2375 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2376 const std::string &FileName) {
2377 TimeRegion Timer(DebugTimer);
2378 return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2381 //===----------------------------------------------------------------------===//
2383 //===----------------------------------------------------------------------===//
2385 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2388 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2389 // Get the children.
2390 const std::vector<DIE *> &Children = Die->getChildren();
2392 // If not last sibling and has children then add sibling offset attribute.
2393 if (!Last && !Children.empty())
2394 Die->addSiblingOffset(DIEValueAllocator);
2396 // Record the abbreviation.
2397 assignAbbrevNumber(Die->getAbbrev());
2399 // Get the abbreviation for this DIE.
2400 unsigned AbbrevNumber = Die->getAbbrevNumber();
2401 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2404 Die->setOffset(Offset);
2406 // Start the size with the size of abbreviation code.
2407 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2409 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2410 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2412 // Size the DIE attribute values.
2413 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2414 // Size attribute value.
2415 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2417 // Size the DIE children if any.
2418 if (!Children.empty()) {
2419 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2420 "Children flag not set");
2422 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2423 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2425 // End of children marker.
2426 Offset += sizeof(int8_t);
2429 Die->setSize(Offset - Die->getOffset());
2433 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2435 void DwarfDebug::computeSizeAndOffsets() {
2436 // Compute size of compile unit header.
2437 static unsigned Offset =
2438 sizeof(int32_t) + // Length of Compilation Unit Info
2439 sizeof(int16_t) + // DWARF version number
2440 sizeof(int32_t) + // Offset Into Abbrev. Section
2441 sizeof(int8_t); // Pointer Size (in bytes)
2443 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2444 CompileUnitOffsets[ModuleCU] = 0;
2447 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2448 /// temporary label to it if SymbolStem is specified.
2449 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2450 const char *SymbolStem = 0) {
2451 Asm->OutStreamer.SwitchSection(Section);
2452 if (!SymbolStem) return 0;
2454 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2455 Asm->OutStreamer.EmitLabel(TmpSym);
2459 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2460 /// the start of each one.
2461 void DwarfDebug::EmitSectionLabels() {
2462 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2464 // Dwarf sections base addresses.
2465 if (MAI->doesDwarfRequireFrameSection()) {
2466 DwarfFrameSectionSym =
2467 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2470 DwarfInfoSectionSym =
2471 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2472 DwarfAbbrevSectionSym =
2473 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2474 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2476 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2477 EmitSectionSym(Asm, MacroInfo);
2479 EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2480 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2481 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2482 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2483 DwarfStrSectionSym =
2484 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2485 EmitSectionSym(Asm, TLOF.getDwarfRangesSection());
2487 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2489 // This is subtly used by the ocaml GC stuff.
2490 DataSectionSym = EmitSectionSym(Asm, TLOF.getDataSection(), "data_begin");
2493 /// emitDIE - Recusively Emits a debug information entry.
2495 void DwarfDebug::emitDIE(DIE *Die) {
2496 // Get the abbreviation for this DIE.
2497 unsigned AbbrevNumber = Die->getAbbrevNumber();
2498 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2500 // Emit the code (index) for the abbreviation.
2501 if (Asm->isVerbose())
2502 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2503 Twine::utohexstr(Die->getOffset()) + ":0x" +
2504 Twine::utohexstr(Die->getSize()) + " " +
2505 dwarf::TagString(Abbrev->getTag()));
2506 Asm->EmitULEB128(AbbrevNumber);
2508 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2509 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2511 // Emit the DIE attribute values.
2512 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2513 unsigned Attr = AbbrevData[i].getAttribute();
2514 unsigned Form = AbbrevData[i].getForm();
2515 assert(Form && "Too many attributes for DIE (check abbreviation)");
2517 if (Asm->isVerbose())
2518 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2521 case dwarf::DW_AT_sibling:
2522 Asm->EmitInt32(Die->getSiblingOffset());
2524 case dwarf::DW_AT_abstract_origin: {
2525 DIEEntry *E = cast<DIEEntry>(Values[i]);
2526 DIE *Origin = E->getEntry();
2527 unsigned Addr = Origin->getOffset();
2528 Asm->EmitInt32(Addr);
2532 // Emit an attribute using the defined form.
2533 Values[i]->EmitValue(this, Form);
2538 // Emit the DIE children if any.
2539 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2540 const std::vector<DIE *> &Children = Die->getChildren();
2542 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2543 emitDIE(Children[j]);
2545 if (Asm->isVerbose())
2546 Asm->OutStreamer.AddComment("End Of Children Mark");
2551 /// emitDebugInfo - Emit the debug info section.
2553 void DwarfDebug::emitDebugInfo() {
2554 // Start debug info section.
2555 Asm->OutStreamer.SwitchSection(
2556 Asm->getObjFileLowering().getDwarfInfoSection());
2557 DIE *Die = ModuleCU->getCUDie();
2559 // Emit the compile units header.
2560 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2561 ModuleCU->getID()));
2563 // Emit size of content not including length itself
2564 unsigned ContentSize = Die->getSize() +
2565 sizeof(int16_t) + // DWARF version number
2566 sizeof(int32_t) + // Offset Into Abbrev. Section
2567 sizeof(int8_t) + // Pointer Size (in bytes)
2568 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2570 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2571 Asm->EmitInt32(ContentSize);
2572 Asm->OutStreamer.AddComment("DWARF version number");
2573 Asm->EmitInt16(dwarf::DWARF_VERSION);
2574 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2575 EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), DwarfAbbrevSectionSym);
2576 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2577 Asm->EmitInt8(TD->getPointerSize());
2580 // FIXME - extra padding for gdb bug.
2581 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2586 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", ModuleCU->getID()));
2589 /// emitAbbreviations - Emit the abbreviation section.
2591 void DwarfDebug::emitAbbreviations() const {
2592 // Check to see if it is worth the effort.
2593 if (!Abbreviations.empty()) {
2594 // Start the debug abbrev section.
2595 Asm->OutStreamer.SwitchSection(
2596 Asm->getObjFileLowering().getDwarfAbbrevSection());
2598 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2600 // For each abbrevation.
2601 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2602 // Get abbreviation data
2603 const DIEAbbrev *Abbrev = Abbreviations[i];
2605 // Emit the abbrevations code (base 1 index.)
2606 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2608 // Emit the abbreviations data.
2612 // Mark end of abbreviations.
2613 Asm->EmitULEB128(0, "EOM(3)");
2615 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2619 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2620 /// the line matrix.
2622 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2623 // Define last address of section.
2624 Asm->OutStreamer.AddComment("Extended Op");
2627 Asm->OutStreamer.AddComment("Op size");
2628 Asm->EmitInt8(TD->getPointerSize() + 1);
2629 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2630 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2632 Asm->OutStreamer.AddComment("Section end label");
2634 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2635 TD->getPointerSize(), 0/*AddrSpace*/);
2637 // Mark end of matrix.
2638 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2644 /// emitDebugLines - Emit source line information.
2646 void DwarfDebug::emitDebugLines() {
2647 // If the target is using .loc/.file, the assembler will be emitting the
2648 // .debug_line table automatically.
2649 if (MAI->hasDotLocAndDotFile())
2652 // Minimum line delta, thus ranging from -10..(255-10).
2653 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2654 // Maximum line delta, thus ranging from -10..(255-10).
2655 const int MaxLineDelta = 255 + MinLineDelta;
2657 // Start the dwarf line section.
2658 Asm->OutStreamer.SwitchSection(
2659 Asm->getObjFileLowering().getDwarfLineSection());
2661 // Construct the section header.
2662 Asm->OutStreamer.AddComment("Length of Source Line Info");
2663 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
2664 Asm->GetTempSymbol("line_begin"), 4);
2665 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
2667 Asm->OutStreamer.AddComment("DWARF version number");
2668 Asm->EmitInt16(dwarf::DWARF_VERSION);
2670 Asm->OutStreamer.AddComment("Prolog Length");
2671 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
2672 Asm->GetTempSymbol("line_prolog_begin"), 4);
2673 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
2675 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2677 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2679 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2680 Asm->EmitInt8(MinLineDelta);
2681 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2682 Asm->EmitInt8(MaxLineDelta);
2683 Asm->OutStreamer.AddComment("Special Opcode Base");
2684 Asm->EmitInt8(-MinLineDelta);
2686 // Line number standard opcode encodings argument count
2687 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2689 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2691 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2693 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2695 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2697 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2699 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2701 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2703 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2706 // Emit directories.
2707 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2708 const std::string &Dir = getSourceDirectoryName(DI);
2709 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
2710 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2713 Asm->OutStreamer.AddComment("End of directories");
2717 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2718 // Remember source id starts at 1.
2719 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2720 const std::string &FN = getSourceFileName(Id.second);
2721 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
2722 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2724 Asm->EmitULEB128(Id.first, "Directory #");
2725 Asm->EmitULEB128(0, "Mod date");
2726 Asm->EmitULEB128(0, "File size");
2729 Asm->OutStreamer.AddComment("End of files");
2732 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
2734 // A sequence for each text section.
2735 unsigned SecSrcLinesSize = SectionSourceLines.size();
2737 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2738 // Isolate current sections line info.
2739 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2741 // Dwarf assumes we start with first line of first source file.
2742 unsigned Source = 1;
2745 // Construct rows of the address, source, line, column matrix.
2746 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2747 const SrcLineInfo &LineInfo = LineInfos[i];
2748 MCSymbol *Label = LineInfo.getLabel();
2749 if (!Label->isDefined()) continue; // Not emitted, in dead code.
2751 if (LineInfo.getLine() == 0) continue;
2753 if (Asm->isVerbose()) {
2754 std::pair<unsigned, unsigned> SrcID =
2755 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2756 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2758 Twine(getSourceFileName(SrcID.second)) +
2759 ":" + Twine(LineInfo.getLine()));
2762 // Define the line address.
2763 Asm->OutStreamer.AddComment("Extended Op");
2765 Asm->OutStreamer.AddComment("Op size");
2766 Asm->EmitInt8(TD->getPointerSize() + 1);
2768 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2769 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2771 Asm->OutStreamer.AddComment("Location label");
2772 Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2775 // If change of source, then switch to the new source.
2776 if (Source != LineInfo.getSourceID()) {
2777 Source = LineInfo.getSourceID();
2778 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2779 Asm->EmitInt8(dwarf::DW_LNS_set_file);
2780 Asm->EmitULEB128(Source, "New Source");
2783 // If change of line.
2784 if (Line != LineInfo.getLine()) {
2785 // Determine offset.
2786 int Offset = LineInfo.getLine() - Line;
2787 int Delta = Offset - MinLineDelta;
2790 Line = LineInfo.getLine();
2792 // If delta is small enough and in range...
2793 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2794 // ... then use fast opcode.
2795 Asm->OutStreamer.AddComment("Line Delta");
2796 Asm->EmitInt8(Delta - MinLineDelta);
2798 // ... otherwise use long hand.
2799 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2800 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2801 Asm->EmitSLEB128(Offset, "Line Offset");
2802 Asm->OutStreamer.AddComment("DW_LNS_copy");
2803 Asm->EmitInt8(dwarf::DW_LNS_copy);
2806 // Copy the previous row (different address or source)
2807 Asm->OutStreamer.AddComment("DW_LNS_copy");
2808 Asm->EmitInt8(dwarf::DW_LNS_copy);
2812 emitEndOfLineMatrix(j + 1);
2815 if (SecSrcLinesSize == 0)
2816 // Because we're emitting a debug_line section, we still need a line
2817 // table. The linker and friends expect it to exist. If there's nothing to
2818 // put into it, emit an empty table.
2819 emitEndOfLineMatrix(1);
2821 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
2824 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2826 void DwarfDebug::emitCommonDebugFrame() {
2827 if (!MAI->doesDwarfRequireFrameSection())
2831 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2832 TargetFrameInfo::StackGrowsUp ?
2833 TD->getPointerSize() : -TD->getPointerSize();
2835 // Start the dwarf frame section.
2836 Asm->OutStreamer.SwitchSection(
2837 Asm->getObjFileLowering().getDwarfFrameSection());
2839 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
2840 Asm->OutStreamer.AddComment("Length of Common Information Entry");
2841 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2842 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
2844 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
2845 Asm->OutStreamer.AddComment("CIE Identifier Tag");
2846 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2847 Asm->OutStreamer.AddComment("CIE Version");
2848 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2849 Asm->OutStreamer.AddComment("CIE Augmentation");
2850 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2851 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2852 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2853 Asm->OutStreamer.AddComment("CIE RA Column");
2854 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2856 std::vector<MachineMove> Moves;
2857 RI->getInitialFrameState(Moves);
2859 EmitFrameMoves(0, Moves, false);
2861 Asm->EmitAlignment(2, 0, 0, false);
2862 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
2865 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2868 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2869 if (!MAI->doesDwarfRequireFrameSection())
2872 // Start the dwarf frame section.
2873 Asm->OutStreamer.SwitchSection(
2874 Asm->getObjFileLowering().getDwarfFrameSection());
2876 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2877 MCSymbol *DebugFrameBegin =
2878 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
2879 MCSymbol *DebugFrameEnd =
2880 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
2881 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
2883 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2885 Asm->OutStreamer.AddComment("FDE CIE offset");
2886 EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2887 DwarfFrameSectionSym);
2889 Asm->OutStreamer.AddComment("FDE initial location");
2890 MCSymbol *FuncBeginSym =
2891 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
2892 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2893 TD->getPointerSize(), 0/*AddrSpace*/);
2896 Asm->OutStreamer.AddComment("FDE address range");
2897 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
2898 FuncBeginSym, TD->getPointerSize());
2900 EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2902 Asm->EmitAlignment(2, 0, 0, false);
2903 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2906 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2908 void DwarfDebug::emitDebugPubNames() {
2909 // Start the dwarf pubnames section.
2910 Asm->OutStreamer.SwitchSection(
2911 Asm->getObjFileLowering().getDwarfPubNamesSection());
2913 Asm->OutStreamer.AddComment("Length of Public Names Info");
2914 Asm->EmitLabelDifference(
2915 Asm->GetTempSymbol("pubnames_end", ModuleCU->getID()),
2916 Asm->GetTempSymbol("pubnames_begin", ModuleCU->getID()), 4);
2918 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2919 ModuleCU->getID()));
2921 Asm->OutStreamer.AddComment("DWARF Version");
2922 Asm->EmitInt16(dwarf::DWARF_VERSION);
2924 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2925 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2926 DwarfInfoSectionSym);
2928 Asm->OutStreamer.AddComment("Compilation Unit Length");
2929 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2930 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2933 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2934 for (StringMap<DIE*>::const_iterator
2935 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2936 const char *Name = GI->getKeyData();
2937 DIE *Entity = GI->second;
2939 Asm->OutStreamer.AddComment("DIE offset");
2940 Asm->EmitInt32(Entity->getOffset());
2942 if (Asm->isVerbose())
2943 Asm->OutStreamer.AddComment("External Name");
2944 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2947 Asm->OutStreamer.AddComment("End Mark");
2949 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2950 ModuleCU->getID()));
2953 void DwarfDebug::emitDebugPubTypes() {
2954 // Start the dwarf pubnames section.
2955 Asm->OutStreamer.SwitchSection(
2956 Asm->getObjFileLowering().getDwarfPubTypesSection());
2957 Asm->OutStreamer.AddComment("Length of Public Types Info");
2958 Asm->EmitLabelDifference(
2959 Asm->GetTempSymbol("pubtypes_end", ModuleCU->getID()),
2960 Asm->GetTempSymbol("pubtypes_begin", ModuleCU->getID()), 4);
2962 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2963 ModuleCU->getID()));
2965 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2966 Asm->EmitInt16(dwarf::DWARF_VERSION);
2968 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2969 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2970 DwarfInfoSectionSym);
2972 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2973 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2974 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2977 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2978 for (StringMap<DIE*>::const_iterator
2979 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2980 const char *Name = GI->getKeyData();
2981 DIE * Entity = GI->second;
2983 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2984 Asm->EmitInt32(Entity->getOffset());
2986 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2987 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2990 Asm->OutStreamer.AddComment("End Mark");
2992 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2993 ModuleCU->getID()));
2996 /// emitDebugStr - Emit visible names into a debug str section.
2998 void DwarfDebug::emitDebugStr() {
2999 // Check to see if it is worth the effort.
3000 if (StringPool.empty()) return;
3002 // Start the dwarf str section.
3003 Asm->OutStreamer.SwitchSection(
3004 Asm->getObjFileLowering().getDwarfStrSection());
3006 // Get all of the string pool entries and put them in an array by their ID so
3007 // we can sort them.
3008 SmallVector<std::pair<unsigned,
3009 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3011 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3012 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3013 Entries.push_back(std::make_pair(I->second.second, &*I));
3015 array_pod_sort(Entries.begin(), Entries.end());
3017 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3018 // Emit a label for reference from debug information entries.
3019 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3021 // Emit the string itself.
3022 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3026 /// emitDebugLoc - Emit visible names into a debug loc section.
3028 void DwarfDebug::emitDebugLoc() {
3029 // Start the dwarf loc section.
3030 Asm->OutStreamer.SwitchSection(
3031 Asm->getObjFileLowering().getDwarfLocSection());
3034 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3036 void DwarfDebug::EmitDebugARanges() {
3037 // Start the dwarf aranges section.
3038 Asm->OutStreamer.SwitchSection(
3039 Asm->getObjFileLowering().getDwarfARangesSection());
3042 /// emitDebugRanges - Emit visible names into a debug ranges section.
3044 void DwarfDebug::emitDebugRanges() {
3045 // Start the dwarf ranges section.
3046 Asm->OutStreamer.SwitchSection(
3047 Asm->getObjFileLowering().getDwarfRangesSection());
3050 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3052 void DwarfDebug::emitDebugMacInfo() {
3053 if (const MCSection *LineInfo =
3054 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3055 // Start the dwarf macinfo section.
3056 Asm->OutStreamer.SwitchSection(LineInfo);
3060 /// emitDebugInlineInfo - Emit inline info using following format.
3062 /// 1. length of section
3063 /// 2. Dwarf version number
3064 /// 3. address size.
3066 /// Entries (one "entry" for each function that was inlined):
3068 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3069 /// otherwise offset into __debug_str for regular function name.
3070 /// 2. offset into __debug_str section for regular function name.
3071 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3072 /// instances for the function.
3074 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3075 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3076 /// __debug_info section, and the low_pc is the starting address for the
3077 /// inlining instance.
3078 void DwarfDebug::emitDebugInlineInfo() {
3079 if (!MAI->doesDwarfUsesInlineInfoSection())
3085 Asm->OutStreamer.SwitchSection(
3086 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3088 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3089 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3090 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3092 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3094 Asm->OutStreamer.AddComment("Dwarf Version");
3095 Asm->EmitInt16(dwarf::DWARF_VERSION);
3096 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3097 Asm->EmitInt8(TD->getPointerSize());
3099 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3100 E = InlinedSPNodes.end(); I != E; ++I) {
3103 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3104 = InlineInfo.find(Node);
3105 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3106 DISubprogram SP(Node);
3107 StringRef LName = SP.getLinkageName();
3108 StringRef Name = SP.getName();
3110 Asm->OutStreamer.AddComment("MIPS linkage name");
3111 if (LName.empty()) {
3112 Asm->OutStreamer.EmitBytes(Name, 0);
3113 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3115 EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3116 DwarfStrSectionSym);
3118 Asm->OutStreamer.AddComment("Function name");
3119 EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3120 Asm->EmitULEB128(Labels.size(), "Inline count");
3122 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3123 LE = Labels.end(); LI != LE; ++LI) {
3124 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3125 Asm->EmitInt32(LI->second->getOffset());
3127 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3128 Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3132 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));