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 = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
309 DwarfStrSectionSym = TextSectionSym = 0;
311 if (TimePassesIsEnabled)
312 DebugTimer = new Timer("Dwarf Debug Writer");
314 DwarfDebug::~DwarfDebug() {
315 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
316 DIEBlocks[j]->~DIEBlock();
321 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
322 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
323 if (Entry.first) return Entry.first;
325 Entry.second = NextStringPoolNumber++;
326 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
330 /// assignAbbrevNumber - Define a unique number for the abbreviation.
332 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
333 // Profile the node so that we can make it unique.
337 // Check the set for priors.
338 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
340 // If it's newly added.
341 if (InSet == &Abbrev) {
342 // Add to abbreviation list.
343 Abbreviations.push_back(&Abbrev);
345 // Assign the vector position + 1 as its number.
346 Abbrev.setNumber(Abbreviations.size());
348 // Assign existing abbreviation number.
349 Abbrev.setNumber(InSet->getNumber());
353 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
354 /// information entry.
355 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
356 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
360 /// addUInt - Add an unsigned integer attribute data and value.
362 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
363 unsigned Form, uint64_t Integer) {
364 if (!Form) Form = DIEInteger::BestForm(false, Integer);
365 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
366 Die->addValue(Attribute, Form, Value);
369 /// addSInt - Add an signed integer attribute data and value.
371 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
372 unsigned Form, int64_t Integer) {
373 if (!Form) Form = DIEInteger::BestForm(true, Integer);
374 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
375 Die->addValue(Attribute, Form, Value);
378 /// addString - Add a string attribute data and value. DIEString only
379 /// keeps string reference.
380 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
382 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
383 Die->addValue(Attribute, Form, Value);
386 /// addLabel - Add a Dwarf label attribute data and value.
388 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
389 const MCSymbol *Label) {
390 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
391 Die->addValue(Attribute, Form, Value);
394 /// addDelta - Add a label delta attribute data and value.
396 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
397 const MCSymbol *Hi, const MCSymbol *Lo) {
398 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
399 Die->addValue(Attribute, Form, Value);
402 /// addBlock - Add block data.
404 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
406 Block->ComputeSize(TD);
407 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
408 Die->addValue(Attribute, Block->BestForm(), Block);
411 /// addSourceLine - Add location information to specified debug information
413 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
414 // If there is no compile unit specified, don't add a line #.
415 if (!V->getCompileUnit().Verify())
418 unsigned Line = V->getLineNumber();
419 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
420 V->getContext().getFilename());
421 assert(FileID && "Invalid file id");
422 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
423 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
426 /// addSourceLine - Add location information to specified debug information
428 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
429 // If there is no compile unit specified, don't add a line #.
430 if (!G->getCompileUnit().Verify())
433 unsigned Line = G->getLineNumber();
434 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
435 G->getContext().getFilename());
436 assert(FileID && "Invalid file id");
437 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
438 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
441 /// addSourceLine - Add location information to specified debug information
443 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
444 // If there is no compile unit specified, don't add a line #.
445 if (!SP->getCompileUnit().Verify())
447 // If the line number is 0, don't add it.
448 if (SP->getLineNumber() == 0)
451 unsigned Line = SP->getLineNumber();
452 if (!SP->getContext().Verify())
454 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
456 assert(FileID && "Invalid file id");
457 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
458 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
461 /// addSourceLine - Add location information to specified debug information
463 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
464 // If there is no compile unit specified, don't add a line #.
465 DICompileUnit CU = Ty->getCompileUnit();
469 unsigned Line = Ty->getLineNumber();
470 if (!Ty->getContext().Verify())
472 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
473 Ty->getContext().getFilename());
474 assert(FileID && "Invalid file id");
475 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
476 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
479 /// addSourceLine - Add location information to specified debug information
481 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
482 // If there is no compile unit specified, don't add a line #.
483 if (!NS->getCompileUnit().Verify())
486 unsigned Line = NS->getLineNumber();
487 StringRef FN = NS->getFilename();
488 StringRef Dir = NS->getDirectory();
490 unsigned FileID = GetOrCreateSourceID(Dir, FN);
491 assert(FileID && "Invalid file id");
492 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
493 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
496 /* Byref variables, in Blocks, are declared by the programmer as
497 "SomeType VarName;", but the compiler creates a
498 __Block_byref_x_VarName struct, and gives the variable VarName
499 either the struct, or a pointer to the struct, as its type. This
500 is necessary for various behind-the-scenes things the compiler
501 needs to do with by-reference variables in blocks.
503 However, as far as the original *programmer* is concerned, the
504 variable should still have type 'SomeType', as originally declared.
506 The following function dives into the __Block_byref_x_VarName
507 struct to find the original type of the variable. This will be
508 passed back to the code generating the type for the Debug
509 Information Entry for the variable 'VarName'. 'VarName' will then
510 have the original type 'SomeType' in its debug information.
512 The original type 'SomeType' will be the type of the field named
513 'VarName' inside the __Block_byref_x_VarName struct.
515 NOTE: In order for this to not completely fail on the debugger
516 side, the Debug Information Entry for the variable VarName needs to
517 have a DW_AT_location that tells the debugger how to unwind through
518 the pointers and __Block_byref_x_VarName struct to find the actual
519 value of the variable. The function addBlockByrefType does this. */
521 /// Find the type the programmer originally declared the variable to be
522 /// and return that type.
524 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
527 unsigned tag = Ty.getTag();
529 if (tag == dwarf::DW_TAG_pointer_type) {
530 DIDerivedType DTy = DIDerivedType(Ty.getNode());
531 subType = DTy.getTypeDerivedFrom();
534 DICompositeType blockStruct = DICompositeType(subType.getNode());
535 DIArray Elements = blockStruct.getTypeArray();
537 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
538 DIDescriptor Element = Elements.getElement(i);
539 DIDerivedType DT = DIDerivedType(Element.getNode());
540 if (Name == DT.getName())
541 return (DT.getTypeDerivedFrom());
547 /// addComplexAddress - Start with the address based on the location provided,
548 /// and generate the DWARF information necessary to find the actual variable
549 /// given the extra address information encoded in the DIVariable, starting from
550 /// the starting location. Add the DWARF information to the die.
552 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
554 const MachineLocation &Location) {
555 const DIVariable &VD = DV->getVariable();
556 DIType Ty = VD.getType();
558 // Decode the original location, and use that as the start of the byref
559 // variable's location.
560 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
561 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
563 if (Location.isReg()) {
565 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
567 Reg = Reg - dwarf::DW_OP_reg0;
568 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
569 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
573 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
575 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
576 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
579 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
582 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
583 uint64_t Element = VD.getAddrElement(i);
585 if (Element == DIFactory::OpPlus) {
586 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
587 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
588 } else if (Element == DIFactory::OpDeref) {
589 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
590 } else llvm_unreachable("unknown DIFactory Opcode");
593 // Now attach the location information to the DIE.
594 addBlock(Die, Attribute, 0, Block);
597 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
598 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
599 gives the variable VarName either the struct, or a pointer to the struct, as
600 its type. This is necessary for various behind-the-scenes things the
601 compiler needs to do with by-reference variables in Blocks.
603 However, as far as the original *programmer* is concerned, the variable
604 should still have type 'SomeType', as originally declared.
606 The function getBlockByrefType dives into the __Block_byref_x_VarName
607 struct to find the original type of the variable, which is then assigned to
608 the variable's Debug Information Entry as its real type. So far, so good.
609 However now the debugger will expect the variable VarName to have the type
610 SomeType. So we need the location attribute for the variable to be an
611 expression that explains to the debugger how to navigate through the
612 pointers and struct to find the actual variable of type SomeType.
614 The following function does just that. We start by getting
615 the "normal" location for the variable. This will be the location
616 of either the struct __Block_byref_x_VarName or the pointer to the
617 struct __Block_byref_x_VarName.
619 The struct will look something like:
621 struct __Block_byref_x_VarName {
623 struct __Block_byref_x_VarName *forwarding;
624 ... <various other fields>
626 ... <maybe more fields>
629 If we are given the struct directly (as our starting point) we
630 need to tell the debugger to:
632 1). Add the offset of the forwarding field.
634 2). Follow that pointer to get the real __Block_byref_x_VarName
635 struct to use (the real one may have been copied onto the heap).
637 3). Add the offset for the field VarName, to find the actual variable.
639 If we started with a pointer to the struct, then we need to
640 dereference that pointer first, before the other steps.
641 Translating this into DWARF ops, we will need to append the following
642 to the current location description for the variable:
644 DW_OP_deref -- optional, if we start with a pointer
645 DW_OP_plus_uconst <forward_fld_offset>
647 DW_OP_plus_uconst <varName_fld_offset>
649 That is what this function does. */
651 /// addBlockByrefAddress - Start with the address based on the location
652 /// provided, and generate the DWARF information necessary to find the
653 /// actual Block variable (navigating the Block struct) based on the
654 /// starting location. Add the DWARF information to the die. For
655 /// more information, read large comment just above here.
657 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
659 const MachineLocation &Location) {
660 const DIVariable &VD = DV->getVariable();
661 DIType Ty = VD.getType();
663 unsigned Tag = Ty.getTag();
664 bool isPointer = false;
666 StringRef varName = VD.getName();
668 if (Tag == dwarf::DW_TAG_pointer_type) {
669 DIDerivedType DTy = DIDerivedType(Ty.getNode());
670 TmpTy = DTy.getTypeDerivedFrom();
674 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
676 // Find the __forwarding field and the variable field in the __Block_byref
678 DIArray Fields = blockStruct.getTypeArray();
679 DIDescriptor varField = DIDescriptor();
680 DIDescriptor forwardingField = DIDescriptor();
682 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
683 DIDescriptor Element = Fields.getElement(i);
684 DIDerivedType DT = DIDerivedType(Element.getNode());
685 StringRef fieldName = DT.getName();
686 if (fieldName == "__forwarding")
687 forwardingField = Element;
688 else if (fieldName == varName)
692 // Get the offsets for the forwarding field and the variable field.
693 unsigned forwardingFieldOffset =
694 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
695 unsigned varFieldOffset =
696 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
698 // Decode the original location, and use that as the start of the byref
699 // variable's location.
700 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
701 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
703 if (Location.isReg()) {
705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
707 Reg = Reg - dwarf::DW_OP_reg0;
708 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
709 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
713 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
715 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
716 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
719 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
722 // If we started with a pointer to the __Block_byref... struct, then
723 // the first thing we need to do is dereference the pointer (DW_OP_deref).
725 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
727 // Next add the offset for the '__forwarding' field:
728 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
729 // adding the offset if it's 0.
730 if (forwardingFieldOffset > 0) {
731 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
732 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
735 // Now dereference the __forwarding field to get to the real __Block_byref
736 // struct: DW_OP_deref.
737 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
739 // Now that we've got the real __Block_byref... struct, add the offset
740 // for the variable's field to get to the location of the actual variable:
741 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
742 if (varFieldOffset > 0) {
743 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
744 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
747 // Now attach the location information to the DIE.
748 addBlock(Die, Attribute, 0, Block);
751 /// addAddress - Add an address attribute to a die based on the location
753 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
754 const MachineLocation &Location) {
755 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
756 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
758 if (Location.isReg()) {
760 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
762 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
763 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
767 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
769 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
770 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
773 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
776 addBlock(Die, Attribute, 0, Block);
779 /// addToContextOwner - Add Die into the list of its context owner's children.
780 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
781 if (Context.isType()) {
782 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
783 ContextDIE->addChild(Die);
784 } else if (Context.isNameSpace()) {
785 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
786 ContextDIE->addChild(Die);
787 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
788 ContextDIE->addChild(Die);
790 ModuleCU->addDie(Die);
793 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
795 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
796 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
801 TyDIE = new DIE(dwarf::DW_TAG_base_type);
802 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
803 if (Ty.isBasicType())
804 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
805 else if (Ty.isCompositeType())
806 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
808 assert(Ty.isDerivedType() && "Unknown kind of DIType");
809 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
812 addToContextOwner(TyDIE, Ty.getContext());
816 /// addType - Add a new type attribute to the specified entity.
817 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
821 // Check for pre-existence.
822 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
823 // If it exists then use the existing value.
825 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
830 DIE *Buffer = getOrCreateTypeDIE(Ty);
833 Entry = createDIEEntry(Buffer);
834 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
836 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
839 /// constructTypeDIE - Construct basic type die from DIBasicType.
840 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
841 // Get core information.
842 StringRef Name = BTy.getName();
843 Buffer.setTag(dwarf::DW_TAG_base_type);
844 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
847 // Add name if not anonymous or intermediate type.
849 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
850 uint64_t Size = BTy.getSizeInBits() >> 3;
851 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
854 /// constructTypeDIE - Construct derived type die from DIDerivedType.
855 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
856 // Get core information.
857 StringRef Name = DTy.getName();
858 uint64_t Size = DTy.getSizeInBits() >> 3;
859 unsigned Tag = DTy.getTag();
861 // FIXME - Workaround for templates.
862 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
866 // Map to main type, void will not have a type.
867 DIType FromTy = DTy.getTypeDerivedFrom();
868 addType(&Buffer, FromTy);
870 // Add name if not anonymous or intermediate type.
872 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
874 // Add size if non-zero (derived types might be zero-sized.)
876 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
878 // Add source line info if available and TyDesc is not a forward declaration.
879 if (!DTy.isForwardDecl())
880 addSourceLine(&Buffer, &DTy);
883 /// constructTypeDIE - Construct type DIE from DICompositeType.
884 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
885 // Get core information.
886 StringRef Name = CTy.getName();
888 uint64_t Size = CTy.getSizeInBits() >> 3;
889 unsigned Tag = CTy.getTag();
893 case dwarf::DW_TAG_vector_type:
894 case dwarf::DW_TAG_array_type:
895 constructArrayTypeDIE(Buffer, &CTy);
897 case dwarf::DW_TAG_enumeration_type: {
898 DIArray Elements = CTy.getTypeArray();
900 // Add enumerators to enumeration type.
901 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
903 DIDescriptor Enum(Elements.getElement(i).getNode());
904 if (Enum.isEnumerator()) {
905 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum.getNode()));
906 Buffer.addChild(ElemDie);
911 case dwarf::DW_TAG_subroutine_type: {
913 DIArray Elements = CTy.getTypeArray();
914 DIDescriptor RTy = Elements.getElement(0);
915 addType(&Buffer, DIType(RTy.getNode()));
917 // Add prototype flag.
918 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
921 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
922 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
923 DIDescriptor Ty = Elements.getElement(i);
924 addType(Arg, DIType(Ty.getNode()));
925 Buffer.addChild(Arg);
929 case dwarf::DW_TAG_structure_type:
930 case dwarf::DW_TAG_union_type:
931 case dwarf::DW_TAG_class_type: {
932 // Add elements to structure type.
933 DIArray Elements = CTy.getTypeArray();
935 // A forward struct declared type may not have elements available.
936 unsigned N = Elements.getNumElements();
940 // Add elements to structure type.
941 for (unsigned i = 0; i < N; ++i) {
942 DIDescriptor Element = Elements.getElement(i);
944 if (Element.isSubprogram())
945 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
946 else if (Element.isVariable()) {
947 DIVariable DV(Element.getNode());
948 ElemDie = new DIE(dwarf::DW_TAG_variable);
949 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
951 addType(ElemDie, DV.getType());
952 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
953 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
954 addSourceLine(ElemDie, &DV);
955 } else if (Element.isDerivedType())
956 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
959 Buffer.addChild(ElemDie);
962 if (CTy.isAppleBlockExtension())
963 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
965 unsigned RLang = CTy.getRunTimeLang();
967 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
968 dwarf::DW_FORM_data1, RLang);
970 DICompositeType ContainingType = CTy.getContainingType();
971 if (DIDescriptor(ContainingType.getNode()).isCompositeType())
972 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
973 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
980 // Add name if not anonymous or intermediate type.
982 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
984 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
985 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
986 // Add size if non-zero (derived types might be zero-sized.)
988 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
990 // Add zero size if it is not a forward declaration.
991 if (CTy.isForwardDecl())
992 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
994 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
997 // Add source line info if available.
998 if (!CTy.isForwardDecl())
999 addSourceLine(&Buffer, &CTy);
1003 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1004 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1005 int64_t L = SR.getLo();
1006 int64_t H = SR.getHi();
1007 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1009 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1011 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1012 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1014 Buffer.addChild(DW_Subrange);
1017 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1018 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1019 DICompositeType *CTy) {
1020 Buffer.setTag(dwarf::DW_TAG_array_type);
1021 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1022 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1024 // Emit derived type.
1025 addType(&Buffer, CTy->getTypeDerivedFrom());
1026 DIArray Elements = CTy->getTypeArray();
1028 // Get an anonymous type for index type.
1029 DIE *IdxTy = ModuleCU->getIndexTyDie();
1031 // Construct an anonymous type for index type.
1032 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1033 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1034 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1035 dwarf::DW_ATE_signed);
1036 ModuleCU->addDie(IdxTy);
1037 ModuleCU->setIndexTyDie(IdxTy);
1040 // Add subranges to array type.
1041 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1042 DIDescriptor Element = Elements.getElement(i);
1043 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1044 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1048 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1049 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1050 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1051 StringRef Name = ETy.getName();
1052 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1053 int64_t Value = ETy.getEnumValue();
1054 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1058 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1059 /// printer to not emit usual symbol prefix before the symbol name is used then
1060 /// return linkage name after skipping this special LLVM prefix.
1061 static StringRef getRealLinkageName(StringRef LinkageName) {
1063 if (LinkageName.startswith(StringRef(&One, 1)))
1064 return LinkageName.substr(1);
1068 /// createGlobalVariableDIE - Create new DIE using GV.
1069 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1070 // If the global variable was optmized out then no need to create debug info
1072 if (!GV.getGlobal()) return NULL;
1073 if (GV.getDisplayName().empty()) return NULL;
1075 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1076 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1077 GV.getDisplayName());
1079 StringRef LinkageName = GV.getLinkageName();
1080 if (!LinkageName.empty())
1081 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1082 getRealLinkageName(LinkageName));
1084 addType(GVDie, GV.getType());
1085 if (!GV.isLocalToUnit())
1086 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1087 addSourceLine(GVDie, &GV);
1092 /// createMemberDIE - Create new member DIE.
1093 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1094 DIE *MemberDie = new DIE(DT.getTag());
1095 StringRef Name = DT.getName();
1097 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1099 addType(MemberDie, DT.getTypeDerivedFrom());
1101 addSourceLine(MemberDie, &DT);
1103 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1104 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1106 uint64_t Size = DT.getSizeInBits();
1107 uint64_t FieldSize = DT.getOriginalTypeSize();
1109 if (Size != FieldSize) {
1111 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1112 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1114 uint64_t Offset = DT.getOffsetInBits();
1115 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1116 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1117 uint64_t FieldOffset = (HiMark - FieldSize);
1118 Offset -= FieldOffset;
1120 // Maybe we need to work from the other end.
1121 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1122 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1124 // Here WD_AT_data_member_location points to the anonymous
1125 // field that includes this bit field.
1126 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1129 // This is not a bitfield.
1130 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1132 if (DT.getTag() == dwarf::DW_TAG_inheritance
1133 && DT.isVirtual()) {
1135 // For C++, virtual base classes are not at fixed offset. Use following
1136 // expression to extract appropriate offset from vtable.
1137 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1139 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1140 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1141 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1142 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1143 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1144 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1145 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1146 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1148 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1151 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1153 if (DT.isProtected())
1154 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1155 dwarf::DW_ACCESS_protected);
1156 else if (DT.isPrivate())
1157 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1158 dwarf::DW_ACCESS_private);
1159 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1160 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1161 dwarf::DW_ACCESS_public);
1163 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1164 dwarf::DW_VIRTUALITY_virtual);
1168 /// createSubprogramDIE - Create new DIE using SP.
1169 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1170 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1174 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1175 // Constructors and operators for anonymous aggregates do not have names.
1176 if (!SP.getName().empty())
1177 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1179 StringRef LinkageName = SP.getLinkageName();
1180 if (!LinkageName.empty())
1181 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1182 getRealLinkageName(LinkageName));
1184 addSourceLine(SPDie, &SP);
1186 // Add prototyped tag, if C or ObjC.
1187 unsigned Lang = SP.getCompileUnit().getLanguage();
1188 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1189 Lang == dwarf::DW_LANG_ObjC)
1190 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1193 DICompositeType SPTy = SP.getType();
1194 DIArray Args = SPTy.getTypeArray();
1195 unsigned SPTag = SPTy.getTag();
1197 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1198 addType(SPDie, SPTy);
1200 addType(SPDie, DIType(Args.getElement(0).getNode()));
1202 unsigned VK = SP.getVirtuality();
1204 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1205 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1206 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1207 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1208 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1209 ContainingTypeMap.insert(std::make_pair(SPDie,
1210 SP.getContainingType().getNode()));
1213 if (MakeDecl || !SP.isDefinition()) {
1214 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1216 // Add arguments. Do not add arguments for subprogram definition. They will
1217 // be handled while processing variables.
1218 DICompositeType SPTy = SP.getType();
1219 DIArray Args = SPTy.getTypeArray();
1220 unsigned SPTag = SPTy.getTag();
1222 if (SPTag == dwarf::DW_TAG_subroutine_type)
1223 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1224 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1225 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1227 if (ATy.isArtificial())
1228 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1229 SPDie->addChild(Arg);
1233 if (SP.isArtificial())
1234 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1236 // DW_TAG_inlined_subroutine may refer to this DIE.
1237 ModuleCU->insertDIE(SP.getNode(), SPDie);
1241 /// getUpdatedDbgScope - Find DbgScope assicated with the instruction.
1242 /// Update scope hierarchy. Create abstract scope if required.
1243 DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1244 MDNode *InlinedAt) {
1245 assert(N && "Invalid Scope encoding!");
1246 assert(MI && "Missing machine instruction!");
1247 bool isAConcreteScope = InlinedAt != 0;
1249 DbgScope *NScope = NULL;
1252 NScope = DbgScopeMap.lookup(InlinedAt);
1254 NScope = DbgScopeMap.lookup(N);
1255 assert(NScope && "Unable to find working scope!");
1257 if (NScope->getFirstInsn())
1260 DbgScope *Parent = NULL;
1261 if (isAConcreteScope) {
1262 DILocation IL(InlinedAt);
1263 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1264 IL.getOrigLocation().getNode());
1265 assert(Parent && "Unable to find Parent scope!");
1266 NScope->setParent(Parent);
1267 Parent->addScope(NScope);
1268 } else if (DIDescriptor(N).isLexicalBlock()) {
1269 DILexicalBlock DB(N);
1270 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1271 NScope->setParent(Parent);
1272 Parent->addScope(NScope);
1275 NScope->setFirstInsn(MI);
1277 if (!Parent && !InlinedAt) {
1278 StringRef SPName = DISubprogram(N).getLinkageName();
1279 if (SPName == MF->getFunction()->getName())
1280 CurrentFnDbgScope = NScope;
1283 if (isAConcreteScope) {
1284 ConcreteScopes[InlinedAt] = NScope;
1285 getOrCreateAbstractScope(N);
1291 DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1292 assert(N && "Invalid Scope encoding!");
1294 DbgScope *AScope = AbstractScopes.lookup(N);
1298 DbgScope *Parent = NULL;
1300 DIDescriptor Scope(N);
1301 if (Scope.isLexicalBlock()) {
1302 DILexicalBlock DB(N);
1303 DIDescriptor ParentDesc = DB.getContext();
1304 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1307 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1310 Parent->addScope(AScope);
1311 AScope->setAbstractScope();
1312 AbstractScopes[N] = AScope;
1313 if (DIDescriptor(N).isSubprogram())
1314 AbstractScopesList.push_back(AScope);
1318 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1319 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1320 /// If there are global variables in this scope then create and insert
1321 /// DIEs for these variables.
1322 DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1323 DIE *SPDie = ModuleCU->getDIE(SPNode);
1324 assert(SPDie && "Unable to find subprogram DIE!");
1325 DISubprogram SP(SPNode);
1327 // There is not any need to generate specification DIE for a function
1328 // defined at compile unit level. If a function is defined inside another
1329 // function then gdb prefers the definition at top level and but does not
1330 // expect specification DIE in parent function. So avoid creating
1331 // specification DIE for a function defined inside a function.
1332 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1333 !SP.getContext().isFile() && !SP.getContext().isSubprogram()) {
1334 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1337 DICompositeType SPTy = SP.getType();
1338 DIArray Args = SPTy.getTypeArray();
1339 unsigned SPTag = SPTy.getTag();
1340 if (SPTag == dwarf::DW_TAG_subroutine_type)
1341 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1342 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1343 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1345 if (ATy.isArtificial())
1346 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1347 SPDie->addChild(Arg);
1349 DIE *SPDeclDie = SPDie;
1350 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1351 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1353 ModuleCU->addDie(SPDie);
1356 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1357 Asm->GetTempSymbol("func_begin", SubprogramCount));
1358 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1359 Asm->GetTempSymbol("func_end", SubprogramCount));
1360 MachineLocation Location(RI->getFrameRegister(*MF));
1361 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1363 if (!DISubprogram(SPNode).isLocalToUnit())
1364 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1369 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1370 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1371 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1372 MCSymbol *Start = Scope->getStartLabel();
1373 MCSymbol *End = Scope->getEndLabel();
1374 if (Start == 0 || End == 0) return 0;
1376 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1377 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1379 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1380 if (Scope->isAbstractScope())
1383 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1384 Start ? Start : Asm->GetTempSymbol("func_begin", SubprogramCount));
1385 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1386 End ? End : Asm->GetTempSymbol("func_end", SubprogramCount));
1391 /// constructInlinedScopeDIE - This scope represents inlined body of
1392 /// a function. Construct DIE to represent this concrete inlined copy
1393 /// of the function.
1394 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1395 MCSymbol *StartLabel = Scope->getStartLabel();
1396 MCSymbol *EndLabel = Scope->getEndLabel();
1397 if (StartLabel == 0 || EndLabel == 0) return 0;
1399 assert(StartLabel->isDefined() &&
1400 "Invalid starting label for an inlined scope!");
1401 assert(EndLabel->isDefined() &&
1402 "Invalid end label for an inlined scope!");
1403 if (!Scope->getScopeNode())
1405 DIScope DS(Scope->getScopeNode());
1406 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1408 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1409 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1410 assert(OriginDIE && "Unable to find Origin DIE!");
1411 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1412 dwarf::DW_FORM_ref4, OriginDIE);
1414 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1415 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1417 InlinedSubprogramDIEs.insert(OriginDIE);
1419 // Track the start label for this inlined function.
1420 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1421 I = InlineInfo.find(InlinedSP.getNode());
1423 if (I == InlineInfo.end()) {
1424 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1426 InlinedSPNodes.push_back(InlinedSP.getNode());
1428 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1430 DILocation DL(Scope->getInlinedAt());
1431 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1432 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1438 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1439 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1440 // Get the descriptor.
1441 const DIVariable &VD = DV->getVariable();
1442 StringRef Name = VD.getName();
1446 // Translate tag to proper Dwarf tag. The result variable is dropped for
1449 switch (VD.getTag()) {
1450 case dwarf::DW_TAG_return_variable:
1452 case dwarf::DW_TAG_arg_variable:
1453 Tag = dwarf::DW_TAG_formal_parameter;
1455 case dwarf::DW_TAG_auto_variable: // fall thru
1457 Tag = dwarf::DW_TAG_variable;
1461 // Define variable debug information entry.
1462 DIE *VariableDie = new DIE(Tag);
1466 if (DbgVariable *AV = DV->getAbstractVariable())
1467 AbsDIE = AV->getDIE();
1470 DIScope DS(Scope->getScopeNode());
1471 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1472 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1474 assert(OriginSPDIE && "Unable to find Origin DIE for the SP!");
1475 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1476 assert(AbsDIE && "Unable to find Origin DIE for the Variable!");
1477 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1478 dwarf::DW_FORM_ref4, AbsDIE);
1481 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1482 addSourceLine(VariableDie, &VD);
1484 // Add variable type.
1485 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1486 // addresses instead.
1487 if (VD.isBlockByrefVariable())
1488 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1490 addType(VariableDie, VD.getType());
1493 // Add variable address.
1494 if (!Scope->isAbstractScope()) {
1495 // Check if variable is described by DBG_VALUE instruction.
1496 if (const MachineInstr *DbgValueInsn = DV->getDbgValue()) {
1497 if (DbgValueInsn->getNumOperands() == 3) {
1498 // FIXME : Handle getNumOperands != 3
1499 if (DbgValueInsn->getOperand(0).getType()
1500 == MachineOperand::MO_Register
1501 && DbgValueInsn->getOperand(0).getReg()) {
1502 MachineLocation Location;
1503 Location.set(DbgValueInsn->getOperand(0).getReg());
1504 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1505 if (MCSymbol *VS = DV->getDbgValueLabel())
1506 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1508 } else if (DbgValueInsn->getOperand(0).getType() ==
1509 MachineOperand::MO_Immediate) {
1510 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1511 unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1512 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1513 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1514 if (MCSymbol *VS = DV->getDbgValueLabel())
1515 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1518 //FIXME : Handle other operand types.
1524 MachineLocation Location;
1526 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(),
1528 Location.set(FrameReg, Offset);
1530 if (VD.hasComplexAddress())
1531 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1532 else if (VD.isBlockByrefVariable())
1533 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1535 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1539 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1540 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1541 DV->setDIE(VariableDie);
1546 void DwarfDebug::addPubTypes(DISubprogram SP) {
1547 DICompositeType SPTy = SP.getType();
1548 unsigned SPTag = SPTy.getTag();
1549 if (SPTag != dwarf::DW_TAG_subroutine_type)
1552 DIArray Args = SPTy.getTypeArray();
1553 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1554 DIType ATy(Args.getElement(i).getNode());
1557 DICompositeType CATy = getDICompositeType(ATy);
1558 if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1559 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1560 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1565 /// constructScopeDIE - Construct a DIE for this scope.
1566 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1567 if (!Scope || !Scope->getScopeNode())
1570 DIScope DS(Scope->getScopeNode());
1571 DIE *ScopeDIE = NULL;
1572 if (Scope->getInlinedAt())
1573 ScopeDIE = constructInlinedScopeDIE(Scope);
1574 else if (DS.isSubprogram()) {
1575 if (Scope->isAbstractScope())
1576 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1578 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1581 ScopeDIE = constructLexicalScopeDIE(Scope);
1582 if (!ScopeDIE) return NULL;
1584 // Add variables to scope.
1585 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1586 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1587 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1589 ScopeDIE->addChild(VariableDIE);
1592 // Add nested scopes.
1593 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1594 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1595 // Define the Scope debug information entry.
1596 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1598 ScopeDIE->addChild(NestedDIE);
1601 if (DS.isSubprogram())
1602 addPubTypes(DISubprogram(DS.getNode()));
1607 /// GetOrCreateSourceID - Look up the source id with the given directory and
1608 /// source file names. If none currently exists, create a new id and insert it
1609 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1611 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1613 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1614 if (DI != DirectoryIdMap.end()) {
1615 DId = DI->getValue();
1617 DId = DirectoryNames.size() + 1;
1618 DirectoryIdMap[DirName] = DId;
1619 DirectoryNames.push_back(DirName);
1623 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1624 if (FI != SourceFileIdMap.end()) {
1625 FId = FI->getValue();
1627 FId = SourceFileNames.size() + 1;
1628 SourceFileIdMap[FileName] = FId;
1629 SourceFileNames.push_back(FileName);
1632 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1633 SourceIdMap.find(std::make_pair(DId, FId));
1634 if (SI != SourceIdMap.end())
1637 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1638 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1639 SourceIds.push_back(std::make_pair(DId, FId));
1644 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1645 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1646 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1649 NDie = new DIE(dwarf::DW_TAG_namespace);
1650 ModuleCU->insertDIE(NS.getNode(), NDie);
1651 if (!NS.getName().empty())
1652 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1653 addSourceLine(NDie, &NS);
1654 addToContextOwner(NDie, NS.getContext());
1658 void DwarfDebug::constructCompileUnit(MDNode *N) {
1659 DICompileUnit DIUnit(N);
1660 // Use first compile unit marked as isMain as the compile unit for this
1662 if (ModuleCU || !DIUnit.isMain())
1664 StringRef FN = DIUnit.getFilename();
1665 StringRef Dir = DIUnit.getDirectory();
1666 unsigned ID = GetOrCreateSourceID(Dir, FN);
1668 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1669 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1670 DIUnit.getProducer());
1671 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1672 DIUnit.getLanguage());
1673 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1674 addLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, TextSectionSym);
1675 addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1676 Asm->GetTempSymbol("text_end"));
1677 // DW_AT_stmt_list is a offset of line number information for this
1678 // compile unit in debug_line section. It is always zero when only one
1679 // compile unit is emitted in one object file.
1680 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1683 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1684 if (DIUnit.isOptimized())
1685 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1687 StringRef Flags = DIUnit.getFlags();
1689 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1691 unsigned RVer = DIUnit.getRunTimeVersion();
1693 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1694 dwarf::DW_FORM_data1, RVer);
1697 "ModuleCU assigned since the top of constructCompileUnit");
1698 ModuleCU = new CompileUnit(ID, Die);
1701 void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1702 DIGlobalVariable DI_GV(N);
1704 // If debug information is malformed then ignore it.
1705 if (DI_GV.Verify() == false)
1708 // Check for pre-existence.
1709 if (ModuleCU->getDIE(DI_GV.getNode()))
1712 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1717 ModuleCU->insertDIE(N, VariableDie);
1719 // Add to context owner.
1720 DIDescriptor GVContext = DI_GV.getContext();
1721 // Do not create specification DIE if context is either compile unit
1723 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1724 !GVContext.isFile() && !GVContext.isSubprogram()) {
1725 // Create specification DIE.
1726 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1727 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1728 dwarf::DW_FORM_ref4, VariableDie);
1729 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1730 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1731 addLabel(Block, 0, dwarf::DW_FORM_udata,
1732 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1733 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1734 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1735 ModuleCU->addDie(VariableSpecDIE);
1737 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1738 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1739 addLabel(Block, 0, dwarf::DW_FORM_udata,
1740 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1741 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1743 addToContextOwner(VariableDie, GVContext);
1745 // Expose as global. FIXME - need to check external flag.
1746 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1748 DIType GTy = DI_GV.getType();
1749 if (GTy.isCompositeType() && !GTy.getName().empty()) {
1750 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1751 assert(Entry && "Missing global type!");
1752 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1757 void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1760 // Check for pre-existence.
1761 if (ModuleCU->getDIE(N))
1764 if (!SP.isDefinition())
1765 // This is a method declaration which will be handled while constructing
1769 DIE *SubprogramDie = createSubprogramDIE(SP);
1772 ModuleCU->insertDIE(N, SubprogramDie);
1774 // Add to context owner.
1775 addToContextOwner(SubprogramDie, SP.getContext());
1777 // Expose as global.
1778 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1783 /// beginModule - Emit all Dwarf sections that should come prior to the
1784 /// content. Create global DIEs and emit initial debug info sections.
1785 /// This is inovked by the target AsmPrinter.
1786 void DwarfDebug::beginModule(Module *M) {
1789 if (!MAI->doesSupportDebugInformation())
1792 TimeRegion Timer(DebugTimer);
1794 DebugInfoFinder DbgFinder;
1795 DbgFinder.processModule(*M);
1797 // Emit initial sections.
1798 if (DbgFinder.compile_unit_begin() != DbgFinder.compile_unit_end())
1799 EmitSectionLabels();
1801 // Create all the compile unit DIEs.
1802 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1803 E = DbgFinder.compile_unit_end(); I != E; ++I)
1804 constructCompileUnit(*I);
1809 // Create DIEs for each subprogram.
1810 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1811 E = DbgFinder.subprogram_end(); I != E; ++I)
1812 constructSubprogramDIE(*I);
1814 // Create DIEs for each global variable.
1815 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1816 E = DbgFinder.global_variable_end(); I != E; ++I)
1817 constructGlobalVariableDIE(*I);
1821 MMI->setDebugInfoAvailability(true);
1823 // Prime section data.
1824 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1826 // Print out .file directives to specify files for .loc directives. These are
1827 // printed out early so that they precede any .loc directives.
1828 if (MAI->hasDotLocAndDotFile()) {
1829 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1830 // Remember source id starts at 1.
1831 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1832 // FIXME: don't use sys::path for this! This should not depend on the
1834 sys::Path FullPath(getSourceDirectoryName(Id.first));
1836 FullPath.appendComponent(getSourceFileName(Id.second));
1837 assert(AppendOk && "Could not append filename to directory!");
1839 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1844 /// endModule - Emit all Dwarf sections that should come after the content.
1846 void DwarfDebug::endModule() {
1850 TimeRegion Timer(DebugTimer);
1852 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1853 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1854 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1856 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1859 // Insert top level DIEs.
1860 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1861 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1862 ModuleCU->getCUDie()->addChild(*TI);
1864 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1865 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1866 DIE *SPDie = CI->first;
1867 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1869 DIE *NDie = ModuleCU->getDIE(N);
1870 if (!NDie) continue;
1871 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1872 // FIXME - This is not the correct approach.
1873 //addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie
1876 // Standard sections final addresses.
1877 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1878 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1879 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1880 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1882 // End text sections.
1883 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1884 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1885 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1888 // Emit common frame information.
1889 emitCommonDebugFrame();
1891 // Emit function debug frame information
1892 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1893 E = DebugFrames.end(); I != E; ++I)
1894 emitFunctionDebugFrame(*I);
1896 // Compute DIE offsets and sizes.
1897 computeSizeAndOffsets();
1899 // Emit all the DIEs into a debug info section
1902 // Corresponding abbreviations into a abbrev section.
1903 emitAbbreviations();
1905 // Emit source line correspondence into a debug line section.
1908 // Emit info into a debug pubnames section.
1909 emitDebugPubNames();
1911 // Emit info into a debug pubtypes section.
1912 emitDebugPubTypes();
1914 // Emit info into a debug loc section.
1917 // Emit info into a debug aranges section.
1920 // Emit info into a debug ranges section.
1923 // Emit info into a debug macinfo section.
1926 // Emit inline info.
1927 emitDebugInlineInfo();
1929 // Emit info into a debug str section.
1933 ModuleCU = NULL; // Reset for the next Module, if any.
1936 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1937 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1939 DebugLoc ScopeLoc) {
1941 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1943 return AbsDbgVariable;
1945 LLVMContext &Ctx = Var.getNode()->getContext();
1946 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1950 AbsDbgVariable = new DbgVariable(Var, FrameIdx,
1951 NULL /* No more-abstract variable*/);
1952 Scope->addVariable(AbsDbgVariable);
1953 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1954 return AbsDbgVariable;
1957 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1958 /// FIXME : Refactor findAbstractVariable.
1959 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1960 const MachineInstr *MI,
1961 DebugLoc ScopeLoc) {
1963 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1965 return AbsDbgVariable;
1967 LLVMContext &Ctx = Var.getNode()->getContext();
1968 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1972 AbsDbgVariable = new DbgVariable(Var, MI,
1973 NULL /* No more-abstract variable*/);
1974 Scope->addVariable(AbsDbgVariable);
1975 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1976 DbgValueStartMap[MI] = AbsDbgVariable;
1977 return AbsDbgVariable;
1980 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1981 void DwarfDebug::collectVariableInfo() {
1984 const LLVMContext &Ctx = MF->getFunction()->getContext();
1986 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1987 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1988 VE = VMap.end(); VI != VE; ++VI) {
1989 MDNode *Var = VI->first;
1992 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1994 DbgScope *Scope = 0;
1995 if (MDNode *IA = VP.second.getInlinedAt(Ctx))
1996 Scope = ConcreteScopes.lookup(IA);
1998 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2000 // If variable scope is not found then skip this variable.
2004 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, VP.second);
2005 DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
2006 Scope->addVariable(RegVar);
2009 // Collect variable information from DBG_VALUE machine instructions;
2010 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2012 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2014 const MachineInstr *MInsn = II;
2015 if (!MInsn->isDebugValue())
2018 // FIXME : Lift this restriction.
2019 if (MInsn->getNumOperands() != 3)
2021 DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands()
2022 - 1).getMetadata()));
2023 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
2024 // FIXME Handle inlined subroutine arguments.
2025 DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2026 CurrentFnDbgScope->addVariable(ArgVar);
2027 DbgValueStartMap[MInsn] = ArgVar;
2031 DebugLoc DL = MInsn->getDebugLoc();
2032 if (DL.isUnknown()) continue;
2033 DbgScope *Scope = 0;
2034 if (MDNode *IA = DL.getInlinedAt(Ctx))
2035 Scope = ConcreteScopes.lookup(IA);
2037 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2039 // If variable scope is not found then skip this variable.
2043 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn, DL);
2044 DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
2045 DbgValueStartMap[MInsn] = RegVar;
2046 Scope->addVariable(RegVar);
2051 /// beginScope - Process beginning of a scope.
2052 void DwarfDebug::beginScope(const MachineInstr *MI) {
2054 DebugLoc DL = MI->getDebugLoc();
2058 // Check and update last known location info.
2059 if (DL == PrevInstLoc)
2062 MDNode *Scope = DL.getScope(MF->getFunction()->getContext());
2064 // FIXME: Should only verify each scope once!
2065 if (!DIScope(Scope).Verify())
2068 // DBG_VALUE instruction establishes new value.
2069 if (MI->isDebugValue()) {
2070 DenseMap<const MachineInstr *, DbgVariable *>::iterator DI
2071 = DbgValueStartMap.find(MI);
2072 if (DI != DbgValueStartMap.end()) {
2073 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2075 DI->second->setDbgValueLabel(Label);
2080 // Emit a label to indicate location change. This is used for line
2081 // table even if this instruction does start a new scope.
2082 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2085 // update DbgScope if this instruction starts a new scope.
2086 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2087 if (I == DbgScopeBeginMap.end())
2090 ScopeVector &SD = I->second;
2091 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2093 (*SDI)->setStartLabel(Label);
2096 /// endScope - Process end of a scope.
2097 void DwarfDebug::endScope(const MachineInstr *MI) {
2098 // Ignore DBG_VALUE instruction.
2099 if (MI->isDebugValue())
2103 DebugLoc DL = MI->getDebugLoc();
2107 // Emit a label and update DbgScope if this instruction ends a scope.
2108 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2109 if (I == DbgScopeEndMap.end())
2112 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2113 Asm->OutStreamer.EmitLabel(Label);
2115 SmallVector<DbgScope*, 2> &SD = I->second;
2116 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2118 (*SDI)->setEndLabel(Label);
2122 /// createDbgScope - Create DbgScope for the scope.
2123 void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2125 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2128 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2129 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2130 if (DIDescriptor(Scope).isLexicalBlock())
2131 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2135 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2139 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2140 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2141 DILocation DL(InlinedAt);
2142 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2145 /// extractScopeInformation - Scan machine instructions in this function
2146 /// and collect DbgScopes. Return true, if at least one scope was found.
2147 bool DwarfDebug::extractScopeInformation() {
2148 // If scope information was extracted using .dbg intrinsics then there is not
2149 // any need to extract these information by scanning each instruction.
2150 if (!DbgScopeMap.empty())
2153 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2154 unsigned MIIndex = 0;
2155 LLVMContext &Ctx = MF->getFunction()->getContext();
2157 // Scan each instruction and create scopes. First build working set of scopes.
2158 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2160 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2162 const MachineInstr *MInsn = II;
2163 // FIXME : Remove DBG_VALUE check.
2164 if (MInsn->isDebugValue()) continue;
2165 MIIndexMap[MInsn] = MIIndex++;
2167 DebugLoc DL = MInsn->getDebugLoc();
2168 if (DL.isUnknown()) continue;
2170 MDNode *Scope = DL.getScope(Ctx);
2172 // There is no need to create another DIE for compile unit. For all
2173 // other scopes, create one DbgScope now. This will be translated
2174 // into a scope DIE at the end.
2175 if (DIScope(Scope).isCompileUnit()) continue;
2176 createDbgScope(Scope, DL.getInlinedAt(Ctx));
2181 // Build scope hierarchy using working set of scopes.
2182 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2184 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2186 const MachineInstr *MInsn = II;
2187 // FIXME : Remove DBG_VALUE check.
2188 if (MInsn->isDebugValue()) continue;
2189 DebugLoc DL = MInsn->getDebugLoc();
2190 if (DL.isUnknown()) continue;
2192 MDNode *Scope = DL.getScope(Ctx);
2193 if (Scope == 0) continue;
2195 // There is no need to create another DIE for compile unit. For all
2196 // other scopes, create one DbgScope now. This will be translated
2197 // into a scope DIE at the end.
2198 if (DIScope(Scope).isCompileUnit()) continue;
2199 DbgScope *DScope = getUpdatedDbgScope(Scope, MInsn, DL.getInlinedAt(Ctx));
2200 DScope->setLastInsn(MInsn);
2204 if (!CurrentFnDbgScope)
2207 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2209 // Each scope has first instruction and last instruction to mark beginning
2210 // and end of a scope respectively. Create an inverse map that list scopes
2211 // starts (and ends) with an instruction. One instruction may start (or end)
2212 // multiple scopes. Ignore scopes that are not reachable.
2213 SmallVector<DbgScope *, 4> WorkList;
2214 WorkList.push_back(CurrentFnDbgScope);
2215 while (!WorkList.empty()) {
2216 DbgScope *S = WorkList.pop_back_val();
2218 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2219 if (!Children.empty())
2220 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2221 SE = Children.end(); SI != SE; ++SI)
2222 WorkList.push_back(*SI);
2224 if (S->isAbstractScope())
2226 const MachineInstr *MI = S->getFirstInsn();
2227 assert(MI && "DbgScope does not have first instruction!");
2229 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2230 if (IDI != DbgScopeBeginMap.end())
2231 IDI->second.push_back(S);
2233 DbgScopeBeginMap[MI].push_back(S);
2235 MI = S->getLastInsn();
2236 assert(MI && "DbgScope does not have last instruction!");
2237 IDI = DbgScopeEndMap.find(MI);
2238 if (IDI != DbgScopeEndMap.end())
2239 IDI->second.push_back(S);
2241 DbgScopeEndMap[MI].push_back(S);
2244 return !DbgScopeMap.empty();
2247 /// beginFunction - Gather pre-function debug information. Assumes being
2248 /// emitted immediately after the function entry point.
2249 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2252 if (!ShouldEmitDwarfDebug()) return;
2253 if (!extractScopeInformation())
2256 TimeRegion Timer(DebugTimer);
2258 collectVariableInfo();
2260 // Assumes in correct section after the entry point.
2261 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin",
2262 ++SubprogramCount));
2264 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2266 DebugLoc FDL = MF->getDefaultDebugLoc();
2267 if (FDL.isUnknown()) return;
2269 MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2271 DISubprogram SP = getDISubprogram(Scope);
2274 Line = SP.getLineNumber();
2277 Line = FDL.getLine();
2281 recordSourceLine(Line, Col, Scope);
2284 /// endFunction - Gather and emit post-function debug information.
2286 void DwarfDebug::endFunction(const MachineFunction *MF) {
2287 if (!ShouldEmitDwarfDebug()) return;
2288 if (DbgScopeMap.empty()) return;
2290 TimeRegion Timer(DebugTimer);
2292 if (CurrentFnDbgScope) {
2293 // Define end label for subprogram.
2294 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end", SubprogramCount));
2296 // Get function line info.
2297 if (!Lines.empty()) {
2298 // Get section line info.
2299 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2300 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2301 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2302 // Append the function info to section info.
2303 SectionLineInfos.insert(SectionLineInfos.end(),
2304 Lines.begin(), Lines.end());
2307 // Construct abstract scopes.
2308 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2309 AE = AbstractScopesList.end(); AI != AE; ++AI)
2310 constructScopeDIE(*AI);
2312 constructScopeDIE(CurrentFnDbgScope);
2314 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2315 MMI->getFrameMoves()));
2319 CurrentFnDbgScope = NULL;
2320 DeleteContainerSeconds(DbgScopeMap);
2321 DbgScopeBeginMap.clear();
2322 DbgScopeEndMap.clear();
2323 DbgValueStartMap.clear();
2324 ConcreteScopes.clear();
2325 DeleteContainerSeconds(AbstractScopes);
2326 AbstractScopesList.clear();
2327 AbstractVariables.clear();
2331 /// recordSourceLine - Register a source line with debug info. Returns the
2332 /// unique label that was emitted and which provides correspondence to
2333 /// the source line list.
2334 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2338 TimeRegion Timer(DebugTimer);
2343 DIDescriptor Scope(S);
2344 if (Scope.isCompileUnit()) {
2345 DICompileUnit CU(S);
2346 Dir = CU.getDirectory();
2347 Fn = CU.getFilename();
2348 } else if (Scope.isSubprogram()) {
2350 Dir = SP.getDirectory();
2351 Fn = SP.getFilename();
2352 } else if (Scope.isLexicalBlock()) {
2353 DILexicalBlock DB(S);
2354 Dir = DB.getDirectory();
2355 Fn = DB.getFilename();
2357 assert(0 && "Unexpected scope info");
2359 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2360 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2361 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2363 Asm->OutStreamer.EmitLabel(Label);
2367 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2368 /// timed. Look up the source id with the given directory and source file
2369 /// names. If none currently exists, create a new id and insert it in the
2370 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2372 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2373 const std::string &FileName) {
2374 TimeRegion Timer(DebugTimer);
2375 return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2378 //===----------------------------------------------------------------------===//
2380 //===----------------------------------------------------------------------===//
2382 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2385 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2386 // Get the children.
2387 const std::vector<DIE *> &Children = Die->getChildren();
2389 // If not last sibling and has children then add sibling offset attribute.
2390 if (!Last && !Children.empty())
2391 Die->addSiblingOffset(DIEValueAllocator);
2393 // Record the abbreviation.
2394 assignAbbrevNumber(Die->getAbbrev());
2396 // Get the abbreviation for this DIE.
2397 unsigned AbbrevNumber = Die->getAbbrevNumber();
2398 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2401 Die->setOffset(Offset);
2403 // Start the size with the size of abbreviation code.
2404 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2406 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2407 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2409 // Size the DIE attribute values.
2410 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2411 // Size attribute value.
2412 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2414 // Size the DIE children if any.
2415 if (!Children.empty()) {
2416 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2417 "Children flag not set");
2419 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2420 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2422 // End of children marker.
2423 Offset += sizeof(int8_t);
2426 Die->setSize(Offset - Die->getOffset());
2430 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2432 void DwarfDebug::computeSizeAndOffsets() {
2433 // Compute size of compile unit header.
2434 static unsigned Offset =
2435 sizeof(int32_t) + // Length of Compilation Unit Info
2436 sizeof(int16_t) + // DWARF version number
2437 sizeof(int32_t) + // Offset Into Abbrev. Section
2438 sizeof(int8_t); // Pointer Size (in bytes)
2440 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2441 CompileUnitOffsets[ModuleCU] = 0;
2444 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2445 /// temporary label to it if SymbolStem is specified.
2446 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2447 const char *SymbolStem = 0) {
2448 Asm->OutStreamer.SwitchSection(Section);
2449 if (!SymbolStem) return 0;
2451 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2452 Asm->OutStreamer.EmitLabel(TmpSym);
2456 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2457 /// the start of each one.
2458 void DwarfDebug::EmitSectionLabels() {
2459 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2461 // Dwarf sections base addresses.
2462 if (MAI->doesDwarfRequireFrameSection()) {
2463 DwarfFrameSectionSym =
2464 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2467 DwarfInfoSectionSym =
2468 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2469 DwarfAbbrevSectionSym =
2470 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2471 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2473 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2474 EmitSectionSym(Asm, MacroInfo);
2476 EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2477 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2478 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2479 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2480 DwarfStrSectionSym =
2481 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2482 EmitSectionSym(Asm, TLOF.getDwarfRangesSection());
2484 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2485 EmitSectionSym(Asm, TLOF.getDataSection());
2488 /// emitDIE - Recusively Emits a debug information entry.
2490 void DwarfDebug::emitDIE(DIE *Die) {
2491 // Get the abbreviation for this DIE.
2492 unsigned AbbrevNumber = Die->getAbbrevNumber();
2493 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2495 // Emit the code (index) for the abbreviation.
2496 if (Asm->isVerbose())
2497 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2498 Twine::utohexstr(Die->getOffset()) + ":0x" +
2499 Twine::utohexstr(Die->getSize()) + " " +
2500 dwarf::TagString(Abbrev->getTag()));
2501 Asm->EmitULEB128(AbbrevNumber);
2503 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2504 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2506 // Emit the DIE attribute values.
2507 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2508 unsigned Attr = AbbrevData[i].getAttribute();
2509 unsigned Form = AbbrevData[i].getForm();
2510 assert(Form && "Too many attributes for DIE (check abbreviation)");
2512 if (Asm->isVerbose())
2513 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2516 case dwarf::DW_AT_sibling:
2517 Asm->EmitInt32(Die->getSiblingOffset());
2519 case dwarf::DW_AT_abstract_origin: {
2520 DIEEntry *E = cast<DIEEntry>(Values[i]);
2521 DIE *Origin = E->getEntry();
2522 unsigned Addr = Origin->getOffset();
2523 Asm->EmitInt32(Addr);
2527 // Emit an attribute using the defined form.
2528 Values[i]->EmitValue(this, Form);
2533 // Emit the DIE children if any.
2534 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2535 const std::vector<DIE *> &Children = Die->getChildren();
2537 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2538 emitDIE(Children[j]);
2540 if (Asm->isVerbose())
2541 Asm->OutStreamer.AddComment("End Of Children Mark");
2546 /// emitDebugInfo - Emit the debug info section.
2548 void DwarfDebug::emitDebugInfo() {
2549 // Start debug info section.
2550 Asm->OutStreamer.SwitchSection(
2551 Asm->getObjFileLowering().getDwarfInfoSection());
2552 DIE *Die = ModuleCU->getCUDie();
2554 // Emit the compile units header.
2555 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2556 ModuleCU->getID()));
2558 // Emit size of content not including length itself
2559 unsigned ContentSize = Die->getSize() +
2560 sizeof(int16_t) + // DWARF version number
2561 sizeof(int32_t) + // Offset Into Abbrev. Section
2562 sizeof(int8_t) + // Pointer Size (in bytes)
2563 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2565 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2566 Asm->EmitInt32(ContentSize);
2567 Asm->OutStreamer.AddComment("DWARF version number");
2568 Asm->EmitInt16(dwarf::DWARF_VERSION);
2569 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2570 EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"), DwarfAbbrevSectionSym);
2571 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2572 Asm->EmitInt8(TD->getPointerSize());
2575 // FIXME - extra padding for gdb bug.
2576 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2581 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", ModuleCU->getID()));
2584 /// emitAbbreviations - Emit the abbreviation section.
2586 void DwarfDebug::emitAbbreviations() const {
2587 // Check to see if it is worth the effort.
2588 if (!Abbreviations.empty()) {
2589 // Start the debug abbrev section.
2590 Asm->OutStreamer.SwitchSection(
2591 Asm->getObjFileLowering().getDwarfAbbrevSection());
2593 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2595 // For each abbrevation.
2596 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2597 // Get abbreviation data
2598 const DIEAbbrev *Abbrev = Abbreviations[i];
2600 // Emit the abbrevations code (base 1 index.)
2601 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2603 // Emit the abbreviations data.
2607 // Mark end of abbreviations.
2608 Asm->EmitULEB128(0, "EOM(3)");
2610 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2614 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2615 /// the line matrix.
2617 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2618 // Define last address of section.
2619 Asm->OutStreamer.AddComment("Extended Op");
2622 Asm->OutStreamer.AddComment("Op size");
2623 Asm->EmitInt8(TD->getPointerSize() + 1);
2624 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2625 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2627 Asm->OutStreamer.AddComment("Section end label");
2629 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2630 TD->getPointerSize(), 0/*AddrSpace*/);
2632 // Mark end of matrix.
2633 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2639 /// emitDebugLines - Emit source line information.
2641 void DwarfDebug::emitDebugLines() {
2642 // If the target is using .loc/.file, the assembler will be emitting the
2643 // .debug_line table automatically.
2644 if (MAI->hasDotLocAndDotFile())
2647 // Minimum line delta, thus ranging from -10..(255-10).
2648 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2649 // Maximum line delta, thus ranging from -10..(255-10).
2650 const int MaxLineDelta = 255 + MinLineDelta;
2652 // Start the dwarf line section.
2653 Asm->OutStreamer.SwitchSection(
2654 Asm->getObjFileLowering().getDwarfLineSection());
2656 // Construct the section header.
2657 Asm->OutStreamer.AddComment("Length of Source Line Info");
2658 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
2659 Asm->GetTempSymbol("line_begin"), 4);
2660 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
2662 Asm->OutStreamer.AddComment("DWARF version number");
2663 Asm->EmitInt16(dwarf::DWARF_VERSION);
2665 Asm->OutStreamer.AddComment("Prolog Length");
2666 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
2667 Asm->GetTempSymbol("line_prolog_begin"), 4);
2668 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
2670 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2672 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2674 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2675 Asm->EmitInt8(MinLineDelta);
2676 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2677 Asm->EmitInt8(MaxLineDelta);
2678 Asm->OutStreamer.AddComment("Special Opcode Base");
2679 Asm->EmitInt8(-MinLineDelta);
2681 // Line number standard opcode encodings argument count
2682 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2684 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2686 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2688 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2690 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2692 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2694 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2696 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2698 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2701 // Emit directories.
2702 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2703 const std::string &Dir = getSourceDirectoryName(DI);
2704 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
2705 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2708 Asm->OutStreamer.AddComment("End of directories");
2712 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2713 // Remember source id starts at 1.
2714 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2715 const std::string &FN = getSourceFileName(Id.second);
2716 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
2717 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2719 Asm->EmitULEB128(Id.first, "Directory #");
2720 Asm->EmitULEB128(0, "Mod date");
2721 Asm->EmitULEB128(0, "File size");
2724 Asm->OutStreamer.AddComment("End of files");
2727 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
2729 // A sequence for each text section.
2730 unsigned SecSrcLinesSize = SectionSourceLines.size();
2732 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2733 // Isolate current sections line info.
2734 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2736 // Dwarf assumes we start with first line of first source file.
2737 unsigned Source = 1;
2740 // Construct rows of the address, source, line, column matrix.
2741 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2742 const SrcLineInfo &LineInfo = LineInfos[i];
2743 MCSymbol *Label = LineInfo.getLabel();
2744 if (!Label->isDefined()) continue; // Not emitted, in dead code.
2746 if (LineInfo.getLine() == 0) continue;
2748 if (Asm->isVerbose()) {
2749 std::pair<unsigned, unsigned> SrcID =
2750 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2751 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2753 Twine(getSourceFileName(SrcID.second)) +
2754 ":" + Twine(LineInfo.getLine()));
2757 // Define the line address.
2758 Asm->OutStreamer.AddComment("Extended Op");
2760 Asm->OutStreamer.AddComment("Op size");
2761 Asm->EmitInt8(TD->getPointerSize() + 1);
2763 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2764 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2766 Asm->OutStreamer.AddComment("Location label");
2767 Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2770 // If change of source, then switch to the new source.
2771 if (Source != LineInfo.getSourceID()) {
2772 Source = LineInfo.getSourceID();
2773 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2774 Asm->EmitInt8(dwarf::DW_LNS_set_file);
2775 Asm->EmitULEB128(Source, "New Source");
2778 // If change of line.
2779 if (Line != LineInfo.getLine()) {
2780 // Determine offset.
2781 int Offset = LineInfo.getLine() - Line;
2782 int Delta = Offset - MinLineDelta;
2785 Line = LineInfo.getLine();
2787 // If delta is small enough and in range...
2788 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2789 // ... then use fast opcode.
2790 Asm->OutStreamer.AddComment("Line Delta");
2791 Asm->EmitInt8(Delta - MinLineDelta);
2793 // ... otherwise use long hand.
2794 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2795 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2796 Asm->EmitSLEB128(Offset, "Line Offset");
2797 Asm->OutStreamer.AddComment("DW_LNS_copy");
2798 Asm->EmitInt8(dwarf::DW_LNS_copy);
2801 // Copy the previous row (different address or source)
2802 Asm->OutStreamer.AddComment("DW_LNS_copy");
2803 Asm->EmitInt8(dwarf::DW_LNS_copy);
2807 emitEndOfLineMatrix(j + 1);
2810 if (SecSrcLinesSize == 0)
2811 // Because we're emitting a debug_line section, we still need a line
2812 // table. The linker and friends expect it to exist. If there's nothing to
2813 // put into it, emit an empty table.
2814 emitEndOfLineMatrix(1);
2816 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
2819 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2821 void DwarfDebug::emitCommonDebugFrame() {
2822 if (!MAI->doesDwarfRequireFrameSection())
2826 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2827 TargetFrameInfo::StackGrowsUp ?
2828 TD->getPointerSize() : -TD->getPointerSize();
2830 // Start the dwarf frame section.
2831 Asm->OutStreamer.SwitchSection(
2832 Asm->getObjFileLowering().getDwarfFrameSection());
2834 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
2835 Asm->OutStreamer.AddComment("Length of Common Information Entry");
2836 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2837 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
2839 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
2840 Asm->OutStreamer.AddComment("CIE Identifier Tag");
2841 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2842 Asm->OutStreamer.AddComment("CIE Version");
2843 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2844 Asm->OutStreamer.AddComment("CIE Augmentation");
2845 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2846 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2847 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2848 Asm->OutStreamer.AddComment("CIE RA Column");
2849 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2851 std::vector<MachineMove> Moves;
2852 RI->getInitialFrameState(Moves);
2854 EmitFrameMoves(0, Moves, false);
2856 Asm->EmitAlignment(2, 0, 0, false);
2857 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
2860 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2863 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2864 if (!MAI->doesDwarfRequireFrameSection())
2867 // Start the dwarf frame section.
2868 Asm->OutStreamer.SwitchSection(
2869 Asm->getObjFileLowering().getDwarfFrameSection());
2871 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2872 MCSymbol *DebugFrameBegin =
2873 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
2874 MCSymbol *DebugFrameEnd =
2875 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
2876 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
2878 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2880 Asm->OutStreamer.AddComment("FDE CIE offset");
2881 EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2882 DwarfFrameSectionSym);
2884 Asm->OutStreamer.AddComment("FDE initial location");
2885 MCSymbol *FuncBeginSym =
2886 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
2887 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2888 TD->getPointerSize(), 0/*AddrSpace*/);
2891 Asm->OutStreamer.AddComment("FDE address range");
2892 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
2893 FuncBeginSym, TD->getPointerSize());
2895 EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2897 Asm->EmitAlignment(2, 0, 0, false);
2898 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2901 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2903 void DwarfDebug::emitDebugPubNames() {
2904 // Start the dwarf pubnames section.
2905 Asm->OutStreamer.SwitchSection(
2906 Asm->getObjFileLowering().getDwarfPubNamesSection());
2908 Asm->OutStreamer.AddComment("Length of Public Names Info");
2909 Asm->EmitLabelDifference(
2910 Asm->GetTempSymbol("pubnames_end", ModuleCU->getID()),
2911 Asm->GetTempSymbol("pubnames_begin", ModuleCU->getID()), 4);
2913 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2914 ModuleCU->getID()));
2916 Asm->OutStreamer.AddComment("DWARF Version");
2917 Asm->EmitInt16(dwarf::DWARF_VERSION);
2919 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2920 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2921 DwarfInfoSectionSym);
2923 Asm->OutStreamer.AddComment("Compilation Unit Length");
2924 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2925 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2928 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2929 for (StringMap<DIE*>::const_iterator
2930 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2931 const char *Name = GI->getKeyData();
2932 DIE *Entity = GI->second;
2934 Asm->OutStreamer.AddComment("DIE offset");
2935 Asm->EmitInt32(Entity->getOffset());
2937 if (Asm->isVerbose())
2938 Asm->OutStreamer.AddComment("External Name");
2939 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2942 Asm->OutStreamer.AddComment("End Mark");
2944 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2945 ModuleCU->getID()));
2948 void DwarfDebug::emitDebugPubTypes() {
2949 // Start the dwarf pubnames section.
2950 Asm->OutStreamer.SwitchSection(
2951 Asm->getObjFileLowering().getDwarfPubTypesSection());
2952 Asm->OutStreamer.AddComment("Length of Public Types Info");
2953 Asm->EmitLabelDifference(
2954 Asm->GetTempSymbol("pubtypes_end", ModuleCU->getID()),
2955 Asm->GetTempSymbol("pubtypes_begin", ModuleCU->getID()), 4);
2957 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2958 ModuleCU->getID()));
2960 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2961 Asm->EmitInt16(dwarf::DWARF_VERSION);
2963 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2964 EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2965 DwarfInfoSectionSym);
2967 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2968 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2969 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2972 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2973 for (StringMap<DIE*>::const_iterator
2974 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2975 const char *Name = GI->getKeyData();
2976 DIE * Entity = GI->second;
2978 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2979 Asm->EmitInt32(Entity->getOffset());
2981 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2982 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2985 Asm->OutStreamer.AddComment("End Mark");
2987 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2988 ModuleCU->getID()));
2991 /// emitDebugStr - Emit visible names into a debug str section.
2993 void DwarfDebug::emitDebugStr() {
2994 // Check to see if it is worth the effort.
2995 if (StringPool.empty()) return;
2997 // Start the dwarf str section.
2998 Asm->OutStreamer.SwitchSection(
2999 Asm->getObjFileLowering().getDwarfStrSection());
3001 // Get all of the string pool entries and put them in an array by their ID so
3002 // we can sort them.
3003 SmallVector<std::pair<unsigned,
3004 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3006 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3007 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3008 Entries.push_back(std::make_pair(I->second.second, &*I));
3010 array_pod_sort(Entries.begin(), Entries.end());
3012 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3013 // Emit a label for reference from debug information entries.
3014 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3016 // Emit the string itself.
3017 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3021 /// emitDebugLoc - Emit visible names into a debug loc section.
3023 void DwarfDebug::emitDebugLoc() {
3024 // Start the dwarf loc section.
3025 Asm->OutStreamer.SwitchSection(
3026 Asm->getObjFileLowering().getDwarfLocSection());
3029 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3031 void DwarfDebug::EmitDebugARanges() {
3032 // Start the dwarf aranges section.
3033 Asm->OutStreamer.SwitchSection(
3034 Asm->getObjFileLowering().getDwarfARangesSection());
3037 /// emitDebugRanges - Emit visible names into a debug ranges section.
3039 void DwarfDebug::emitDebugRanges() {
3040 // Start the dwarf ranges section.
3041 Asm->OutStreamer.SwitchSection(
3042 Asm->getObjFileLowering().getDwarfRangesSection());
3045 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3047 void DwarfDebug::emitDebugMacInfo() {
3048 if (const MCSection *LineInfo =
3049 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3050 // Start the dwarf macinfo section.
3051 Asm->OutStreamer.SwitchSection(LineInfo);
3055 /// emitDebugInlineInfo - Emit inline info using following format.
3057 /// 1. length of section
3058 /// 2. Dwarf version number
3059 /// 3. address size.
3061 /// Entries (one "entry" for each function that was inlined):
3063 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3064 /// otherwise offset into __debug_str for regular function name.
3065 /// 2. offset into __debug_str section for regular function name.
3066 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3067 /// instances for the function.
3069 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3070 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3071 /// __debug_info section, and the low_pc is the starting address for the
3072 /// inlining instance.
3073 void DwarfDebug::emitDebugInlineInfo() {
3074 if (!MAI->doesDwarfUsesInlineInfoSection())
3080 Asm->OutStreamer.SwitchSection(
3081 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3083 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3084 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3085 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3087 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3089 Asm->OutStreamer.AddComment("Dwarf Version");
3090 Asm->EmitInt16(dwarf::DWARF_VERSION);
3091 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3092 Asm->EmitInt8(TD->getPointerSize());
3094 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3095 E = InlinedSPNodes.end(); I != E; ++I) {
3098 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3099 = InlineInfo.find(Node);
3100 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3101 DISubprogram SP(Node);
3102 StringRef LName = SP.getLinkageName();
3103 StringRef Name = SP.getName();
3105 Asm->OutStreamer.AddComment("MIPS linkage name");
3106 if (LName.empty()) {
3107 Asm->OutStreamer.EmitBytes(Name, 0);
3108 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3110 EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3111 DwarfStrSectionSym);
3113 Asm->OutStreamer.AddComment("Function name");
3114 EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3115 Asm->EmitULEB128(Labels.size(), "Inline count");
3117 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3118 LE = Labels.end(); LI != LE; ++LI) {
3119 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3120 Asm->EmitInt32(LI->second->getOffset());
3122 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3123 Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3127 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));