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 #include "DwarfDebug.h"
15 #include "llvm/Module.h"
16 #include "llvm/CodeGen/MachineModuleInfo.h"
17 #include "llvm/MC/MCSection.h"
18 #include "llvm/Target/TargetAsmInfo.h"
19 #include "llvm/Target/TargetData.h"
20 #include "llvm/Target/TargetFrameInfo.h"
21 #include "llvm/Target/TargetLoweringObjectFile.h"
22 #include "llvm/Target/TargetRegisterInfo.h"
23 #include "llvm/Support/Timer.h"
24 #include "llvm/System/Path.h"
27 static TimerGroup
&getDwarfTimerGroup() {
28 static TimerGroup
DwarfTimerGroup("Dwarf Debugging");
29 return DwarfTimerGroup
;
32 //===----------------------------------------------------------------------===//
34 /// Configuration values for initial hash set sizes (log2).
36 static const unsigned InitDiesSetSize
= 9; // log2(512)
37 static const unsigned InitAbbreviationsSetSize
= 9; // log2(512)
38 static const unsigned InitValuesSetSize
= 9; // log2(512)
42 //===----------------------------------------------------------------------===//
43 /// CompileUnit - This dwarf writer support class manages information associate
44 /// with a source file.
45 class VISIBILITY_HIDDEN CompileUnit
{
46 /// ID - File identifier for source.
50 /// Die - Compile unit debug information entry.
54 /// GVToDieMap - Tracks the mapping of unit level debug informaton
55 /// variables to debug information entries.
56 std::map
<GlobalVariable
*, DIE
*> GVToDieMap
;
58 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
59 /// descriptors to debug information entries using a DIEEntry proxy.
60 std::map
<GlobalVariable
*, DIEEntry
*> GVToDIEEntryMap
;
62 /// Globals - A map of globally visible named entities for this unit.
64 StringMap
<DIE
*> Globals
;
66 /// DiesSet - Used to uniquely define dies within the compile unit.
68 FoldingSet
<DIE
> DiesSet
;
70 CompileUnit(unsigned I
, DIE
*D
)
71 : ID(I
), Die(D
), DiesSet(InitDiesSetSize
) {}
72 ~CompileUnit() { delete Die
; }
75 unsigned getID() const { return ID
; }
76 DIE
* getDie() const { return Die
; }
77 StringMap
<DIE
*> &getGlobals() { return Globals
; }
79 /// hasContent - Return true if this compile unit has something to write out.
81 bool hasContent() const { return !Die
->getChildren().empty(); }
83 /// AddGlobal - Add a new global entity to the compile unit.
85 void AddGlobal(const std::string
&Name
, DIE
*Die
) { Globals
[Name
] = Die
; }
87 /// getDieMapSlotFor - Returns the debug information entry map slot for the
88 /// specified debug variable.
89 DIE
*&getDieMapSlotFor(GlobalVariable
*GV
) { return GVToDieMap
[GV
]; }
91 /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
92 /// the specified debug variable.
93 DIEEntry
*&getDIEEntrySlotFor(GlobalVariable
*GV
) {
94 return GVToDIEEntryMap
[GV
];
97 /// AddDie - Adds or interns the DIE to the compile unit.
99 DIE
*AddDie(DIE
&Buffer
) {
103 DIE
*Die
= DiesSet
.FindNodeOrInsertPos(ID
, Where
);
106 Die
= new DIE(Buffer
);
107 DiesSet
.InsertNode(Die
, Where
);
108 this->Die
->AddChild(Die
);
116 //===----------------------------------------------------------------------===//
117 /// DbgVariable - This class is used to track local variable information.
119 class VISIBILITY_HIDDEN DbgVariable
{
120 DIVariable Var
; // Variable Descriptor.
121 unsigned FrameIndex
; // Variable frame index.
122 bool InlinedFnVar
; // Variable for an inlined function.
124 DbgVariable(DIVariable V
, unsigned I
, bool IFV
)
125 : Var(V
), FrameIndex(I
), InlinedFnVar(IFV
) {}
128 DIVariable
getVariable() const { return Var
; }
129 unsigned getFrameIndex() const { return FrameIndex
; }
130 bool isInlinedFnVar() const { return InlinedFnVar
; }
133 //===----------------------------------------------------------------------===//
134 /// DbgScope - This class is used to track scope information.
136 class DbgConcreteScope
;
137 class VISIBILITY_HIDDEN DbgScope
{
138 DbgScope
*Parent
; // Parent to this scope.
139 DIDescriptor Desc
; // Debug info descriptor for scope.
140 // Either subprogram or block.
141 unsigned StartLabelID
; // Label ID of the beginning of scope.
142 unsigned EndLabelID
; // Label ID of the end of scope.
143 SmallVector
<DbgScope
*, 4> Scopes
; // Scopes defined in scope.
144 SmallVector
<DbgVariable
*, 8> Variables
;// Variables declared in scope.
145 SmallVector
<DbgConcreteScope
*, 8> ConcreteInsts
;// Concrete insts of funcs.
147 // Private state for dump()
148 mutable unsigned IndentLevel
;
150 DbgScope(DbgScope
*P
, DIDescriptor D
)
151 : Parent(P
), Desc(D
), StartLabelID(0), EndLabelID(0), IndentLevel(0) {}
155 DbgScope
*getParent() const { return Parent
; }
156 DIDescriptor
getDesc() const { return Desc
; }
157 unsigned getStartLabelID() const { return StartLabelID
; }
158 unsigned getEndLabelID() const { return EndLabelID
; }
159 SmallVector
<DbgScope
*, 4> &getScopes() { return Scopes
; }
160 SmallVector
<DbgVariable
*, 8> &getVariables() { return Variables
; }
161 SmallVector
<DbgConcreteScope
*,8> &getConcreteInsts() { return ConcreteInsts
; }
162 void setStartLabelID(unsigned S
) { StartLabelID
= S
; }
163 void setEndLabelID(unsigned E
) { EndLabelID
= E
; }
165 /// AddScope - Add a scope to the scope.
167 void AddScope(DbgScope
*S
) { Scopes
.push_back(S
); }
169 /// AddVariable - Add a variable to the scope.
171 void AddVariable(DbgVariable
*V
) { Variables
.push_back(V
); }
173 /// AddConcreteInst - Add a concrete instance to the scope.
175 void AddConcreteInst(DbgConcreteScope
*C
) { ConcreteInsts
.push_back(C
); }
183 void DbgScope::dump() const {
184 std::string
Indent(IndentLevel
, ' ');
186 cerr
<< Indent
; Desc
.dump();
187 cerr
<< " [" << StartLabelID
<< ", " << EndLabelID
<< "]\n";
191 for (unsigned i
= 0, e
= Scopes
.size(); i
!= e
; ++i
)
192 if (Scopes
[i
] != this)
199 //===----------------------------------------------------------------------===//
200 /// DbgConcreteScope - This class is used to track a scope that holds concrete
201 /// instance information.
203 class VISIBILITY_HIDDEN DbgConcreteScope
: public DbgScope
{
205 DIE
*Die
; // Debug info for this concrete scope.
207 DbgConcreteScope(DIDescriptor D
) : DbgScope(NULL
, D
) {}
210 DIE
*getDie() const { return Die
; }
211 void setDie(DIE
*D
) { Die
= D
; }
214 DbgScope::~DbgScope() {
215 for (unsigned i
= 0, N
= Scopes
.size(); i
< N
; ++i
)
217 for (unsigned j
= 0, M
= Variables
.size(); j
< M
; ++j
)
219 for (unsigned k
= 0, O
= ConcreteInsts
.size(); k
< O
; ++k
)
220 delete ConcreteInsts
[k
];
223 } // end llvm namespace
225 DwarfDebug::DwarfDebug(raw_ostream
&OS
, AsmPrinter
*A
, const TargetAsmInfo
*T
)
226 : Dwarf(OS
, A
, T
, "dbg"), ModuleCU(0),
227 AbbreviationsSet(InitAbbreviationsSetSize
), Abbreviations(),
228 ValuesSet(InitValuesSetSize
), Values(), StringPool(),
229 SectionSourceLines(), didInitial(false), shouldEmit(false),
230 FunctionDbgScope(0), DebugTimer(0) {
231 if (TimePassesIsEnabled
)
232 DebugTimer
= new Timer("Dwarf Debug Writer",
233 getDwarfTimerGroup());
235 DwarfDebug::~DwarfDebug() {
236 for (unsigned j
= 0, M
= Values
.size(); j
< M
; ++j
)
239 for (DenseMap
<const GlobalVariable
*, DbgScope
*>::iterator
240 I
= AbstractInstanceRootMap
.begin(),
241 E
= AbstractInstanceRootMap
.end(); I
!= E
;++I
)
247 /// AssignAbbrevNumber - Define a unique number for the abbreviation.
249 void DwarfDebug::AssignAbbrevNumber(DIEAbbrev
&Abbrev
) {
250 // Profile the node so that we can make it unique.
254 // Check the set for priors.
255 DIEAbbrev
*InSet
= AbbreviationsSet
.GetOrInsertNode(&Abbrev
);
257 // If it's newly added.
258 if (InSet
== &Abbrev
) {
259 // Add to abbreviation list.
260 Abbreviations
.push_back(&Abbrev
);
262 // Assign the vector position + 1 as its number.
263 Abbrev
.setNumber(Abbreviations
.size());
265 // Assign existing abbreviation number.
266 Abbrev
.setNumber(InSet
->getNumber());
270 /// CreateDIEEntry - Creates a new DIEEntry to be a proxy for a debug
271 /// information entry.
272 DIEEntry
*DwarfDebug::CreateDIEEntry(DIE
*Entry
) {
277 DIEEntry::Profile(ID
, Entry
);
279 Value
= static_cast<DIEEntry
*>(ValuesSet
.FindNodeOrInsertPos(ID
, Where
));
281 if (Value
) return Value
;
283 Value
= new DIEEntry(Entry
);
284 ValuesSet
.InsertNode(Value
, Where
);
286 Value
= new DIEEntry(Entry
);
289 Values
.push_back(Value
);
293 /// SetDIEEntry - Set a DIEEntry once the debug information entry is defined.
295 void DwarfDebug::SetDIEEntry(DIEEntry
*Value
, DIE
*Entry
) {
296 Value
->setEntry(Entry
);
298 // Add to values set if not already there. If it is, we merely have a
299 // duplicate in the values list (no harm.)
300 ValuesSet
.GetOrInsertNode(Value
);
303 /// AddUInt - Add an unsigned integer attribute data and value.
305 void DwarfDebug::AddUInt(DIE
*Die
, unsigned Attribute
,
306 unsigned Form
, uint64_t Integer
) {
307 if (!Form
) Form
= DIEInteger::BestForm(false, Integer
);
310 DIEInteger::Profile(ID
, Integer
);
312 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
315 Value
= new DIEInteger(Integer
);
316 ValuesSet
.InsertNode(Value
, Where
);
317 Values
.push_back(Value
);
320 Die
->AddValue(Attribute
, Form
, Value
);
323 /// AddSInt - Add an signed integer attribute data and value.
325 void DwarfDebug::AddSInt(DIE
*Die
, unsigned Attribute
,
326 unsigned Form
, int64_t Integer
) {
327 if (!Form
) Form
= DIEInteger::BestForm(true, Integer
);
330 DIEInteger::Profile(ID
, (uint64_t)Integer
);
332 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
335 Value
= new DIEInteger(Integer
);
336 ValuesSet
.InsertNode(Value
, Where
);
337 Values
.push_back(Value
);
340 Die
->AddValue(Attribute
, Form
, Value
);
343 /// AddString - Add a string attribute data and value.
345 void DwarfDebug::AddString(DIE
*Die
, unsigned Attribute
, unsigned Form
,
346 const std::string
&String
) {
348 DIEString::Profile(ID
, String
);
350 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
353 Value
= new DIEString(String
);
354 ValuesSet
.InsertNode(Value
, Where
);
355 Values
.push_back(Value
);
358 Die
->AddValue(Attribute
, Form
, Value
);
361 /// AddLabel - Add a Dwarf label attribute data and value.
363 void DwarfDebug::AddLabel(DIE
*Die
, unsigned Attribute
, unsigned Form
,
364 const DWLabel
&Label
) {
366 DIEDwarfLabel::Profile(ID
, Label
);
368 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
371 Value
= new DIEDwarfLabel(Label
);
372 ValuesSet
.InsertNode(Value
, Where
);
373 Values
.push_back(Value
);
376 Die
->AddValue(Attribute
, Form
, Value
);
379 /// AddObjectLabel - Add an non-Dwarf label attribute data and value.
381 void DwarfDebug::AddObjectLabel(DIE
*Die
, unsigned Attribute
, unsigned Form
,
382 const std::string
&Label
) {
384 DIEObjectLabel::Profile(ID
, Label
);
386 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
389 Value
= new DIEObjectLabel(Label
);
390 ValuesSet
.InsertNode(Value
, Where
);
391 Values
.push_back(Value
);
394 Die
->AddValue(Attribute
, Form
, Value
);
397 /// AddSectionOffset - Add a section offset label attribute data and value.
399 void DwarfDebug::AddSectionOffset(DIE
*Die
, unsigned Attribute
, unsigned Form
,
400 const DWLabel
&Label
, const DWLabel
&Section
,
401 bool isEH
, bool useSet
) {
403 DIESectionOffset::Profile(ID
, Label
, Section
);
405 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
408 Value
= new DIESectionOffset(Label
, Section
, isEH
, useSet
);
409 ValuesSet
.InsertNode(Value
, Where
);
410 Values
.push_back(Value
);
413 Die
->AddValue(Attribute
, Form
, Value
);
416 /// AddDelta - Add a label delta attribute data and value.
418 void DwarfDebug::AddDelta(DIE
*Die
, unsigned Attribute
, unsigned Form
,
419 const DWLabel
&Hi
, const DWLabel
&Lo
) {
421 DIEDelta::Profile(ID
, Hi
, Lo
);
423 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
426 Value
= new DIEDelta(Hi
, Lo
);
427 ValuesSet
.InsertNode(Value
, Where
);
428 Values
.push_back(Value
);
431 Die
->AddValue(Attribute
, Form
, Value
);
434 /// AddBlock - Add block data.
436 void DwarfDebug::AddBlock(DIE
*Die
, unsigned Attribute
, unsigned Form
,
438 Block
->ComputeSize(TD
);
442 DIEValue
*Value
= ValuesSet
.FindNodeOrInsertPos(ID
, Where
);
446 ValuesSet
.InsertNode(Value
, Where
);
447 Values
.push_back(Value
);
449 // Already exists, reuse the previous one.
451 Block
= cast
<DIEBlock
>(Value
);
454 Die
->AddValue(Attribute
, Block
->BestForm(), Value
);
457 /// AddSourceLine - Add location information to specified debug information
459 void DwarfDebug::AddSourceLine(DIE
*Die
, const DIVariable
*V
) {
460 // If there is no compile unit specified, don't add a line #.
461 if (V
->getCompileUnit().isNull())
464 unsigned Line
= V
->getLineNumber();
465 unsigned FileID
= FindCompileUnit(V
->getCompileUnit()).getID();
466 assert(FileID
&& "Invalid file id");
467 AddUInt(Die
, dwarf::DW_AT_decl_file
, 0, FileID
);
468 AddUInt(Die
, dwarf::DW_AT_decl_line
, 0, Line
);
471 /// AddSourceLine - Add location information to specified debug information
473 void DwarfDebug::AddSourceLine(DIE
*Die
, const DIGlobal
*G
) {
474 // If there is no compile unit specified, don't add a line #.
475 if (G
->getCompileUnit().isNull())
478 unsigned Line
= G
->getLineNumber();
479 unsigned FileID
= FindCompileUnit(G
->getCompileUnit()).getID();
480 assert(FileID
&& "Invalid file id");
481 AddUInt(Die
, dwarf::DW_AT_decl_file
, 0, FileID
);
482 AddUInt(Die
, dwarf::DW_AT_decl_line
, 0, Line
);
484 void DwarfDebug::AddSourceLine(DIE
*Die
, const DIType
*Ty
) {
485 // If there is no compile unit specified, don't add a line #.
486 DICompileUnit CU
= Ty
->getCompileUnit();
490 unsigned Line
= Ty
->getLineNumber();
491 unsigned FileID
= FindCompileUnit(CU
).getID();
492 assert(FileID
&& "Invalid file id");
493 AddUInt(Die
, dwarf::DW_AT_decl_file
, 0, FileID
);
494 AddUInt(Die
, dwarf::DW_AT_decl_line
, 0, Line
);
497 /// AddAddress - Add an address attribute to a die based on the location
499 void DwarfDebug::AddAddress(DIE
*Die
, unsigned Attribute
,
500 const MachineLocation
&Location
) {
501 unsigned Reg
= RI
->getDwarfRegNum(Location
.getReg(), false);
502 DIEBlock
*Block
= new DIEBlock();
504 if (Location
.isReg()) {
506 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_reg0
+ Reg
);
508 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_regx
);
509 AddUInt(Block
, 0, dwarf::DW_FORM_udata
, Reg
);
513 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_breg0
+ Reg
);
515 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_bregx
);
516 AddUInt(Block
, 0, dwarf::DW_FORM_udata
, Reg
);
519 AddUInt(Block
, 0, dwarf::DW_FORM_sdata
, Location
.getOffset());
522 AddBlock(Die
, Attribute
, 0, Block
);
525 /// AddType - Add a new type attribute to the specified entity.
526 void DwarfDebug::AddType(CompileUnit
*DW_Unit
, DIE
*Entity
, DIType Ty
) {
530 // Check for pre-existence.
531 DIEEntry
*&Slot
= DW_Unit
->getDIEEntrySlotFor(Ty
.getGV());
533 // If it exists then use the existing value.
535 Entity
->AddValue(dwarf::DW_AT_type
, dwarf::DW_FORM_ref4
, Slot
);
540 Slot
= CreateDIEEntry();
543 DIE
Buffer(dwarf::DW_TAG_base_type
);
544 if (Ty
.isBasicType(Ty
.getTag()))
545 ConstructTypeDIE(DW_Unit
, Buffer
, DIBasicType(Ty
.getGV()));
546 else if (Ty
.isDerivedType(Ty
.getTag()))
547 ConstructTypeDIE(DW_Unit
, Buffer
, DIDerivedType(Ty
.getGV()));
549 assert(Ty
.isCompositeType(Ty
.getTag()) && "Unknown kind of DIType");
550 ConstructTypeDIE(DW_Unit
, Buffer
, DICompositeType(Ty
.getGV()));
553 // Add debug information entry to entity and appropriate context.
555 DIDescriptor Context
= Ty
.getContext();
556 if (!Context
.isNull())
557 Die
= DW_Unit
->getDieMapSlotFor(Context
.getGV());
560 DIE
*Child
= new DIE(Buffer
);
561 Die
->AddChild(Child
);
563 SetDIEEntry(Slot
, Child
);
565 Die
= DW_Unit
->AddDie(Buffer
);
566 SetDIEEntry(Slot
, Die
);
569 Entity
->AddValue(dwarf::DW_AT_type
, dwarf::DW_FORM_ref4
, Slot
);
572 /// ConstructTypeDIE - Construct basic type die from DIBasicType.
573 void DwarfDebug::ConstructTypeDIE(CompileUnit
*DW_Unit
, DIE
&Buffer
,
575 // Get core information.
578 Buffer
.setTag(dwarf::DW_TAG_base_type
);
579 AddUInt(&Buffer
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
,
582 // Add name if not anonymous or intermediate type.
584 AddString(&Buffer
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
585 uint64_t Size
= BTy
.getSizeInBits() >> 3;
586 AddUInt(&Buffer
, dwarf::DW_AT_byte_size
, 0, Size
);
589 /// ConstructTypeDIE - Construct derived type die from DIDerivedType.
590 void DwarfDebug::ConstructTypeDIE(CompileUnit
*DW_Unit
, DIE
&Buffer
,
592 // Get core information.
595 uint64_t Size
= DTy
.getSizeInBits() >> 3;
596 unsigned Tag
= DTy
.getTag();
598 // FIXME - Workaround for templates.
599 if (Tag
== dwarf::DW_TAG_inheritance
) Tag
= dwarf::DW_TAG_reference_type
;
603 // Map to main type, void will not have a type.
604 DIType FromTy
= DTy
.getTypeDerivedFrom();
605 AddType(DW_Unit
, &Buffer
, FromTy
);
607 // Add name if not anonymous or intermediate type.
609 AddString(&Buffer
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
611 // Add size if non-zero (derived types might be zero-sized.)
613 AddUInt(&Buffer
, dwarf::DW_AT_byte_size
, 0, Size
);
615 // Add source line info if available and TyDesc is not a forward declaration.
616 if (!DTy
.isForwardDecl())
617 AddSourceLine(&Buffer
, &DTy
);
620 /// ConstructTypeDIE - Construct type DIE from DICompositeType.
621 void DwarfDebug::ConstructTypeDIE(CompileUnit
*DW_Unit
, DIE
&Buffer
,
622 DICompositeType CTy
) {
623 // Get core information.
627 uint64_t Size
= CTy
.getSizeInBits() >> 3;
628 unsigned Tag
= CTy
.getTag();
632 case dwarf::DW_TAG_vector_type
:
633 case dwarf::DW_TAG_array_type
:
634 ConstructArrayTypeDIE(DW_Unit
, Buffer
, &CTy
);
636 case dwarf::DW_TAG_enumeration_type
: {
637 DIArray Elements
= CTy
.getTypeArray();
639 // Add enumerators to enumeration type.
640 for (unsigned i
= 0, N
= Elements
.getNumElements(); i
< N
; ++i
) {
642 DIEnumerator
Enum(Elements
.getElement(i
).getGV());
643 ElemDie
= ConstructEnumTypeDIE(DW_Unit
, &Enum
);
644 Buffer
.AddChild(ElemDie
);
648 case dwarf::DW_TAG_subroutine_type
: {
650 DIArray Elements
= CTy
.getTypeArray();
651 DIDescriptor RTy
= Elements
.getElement(0);
652 AddType(DW_Unit
, &Buffer
, DIType(RTy
.getGV()));
654 // Add prototype flag.
655 AddUInt(&Buffer
, dwarf::DW_AT_prototyped
, dwarf::DW_FORM_flag
, 1);
658 for (unsigned i
= 1, N
= Elements
.getNumElements(); i
< N
; ++i
) {
659 DIE
*Arg
= new DIE(dwarf::DW_TAG_formal_parameter
);
660 DIDescriptor Ty
= Elements
.getElement(i
);
661 AddType(DW_Unit
, Arg
, DIType(Ty
.getGV()));
662 Buffer
.AddChild(Arg
);
666 case dwarf::DW_TAG_structure_type
:
667 case dwarf::DW_TAG_union_type
:
668 case dwarf::DW_TAG_class_type
: {
669 // Add elements to structure type.
670 DIArray Elements
= CTy
.getTypeArray();
672 // A forward struct declared type may not have elements available.
673 if (Elements
.isNull())
676 // Add elements to structure type.
677 for (unsigned i
= 0, N
= Elements
.getNumElements(); i
< N
; ++i
) {
678 DIDescriptor Element
= Elements
.getElement(i
);
680 if (Element
.getTag() == dwarf::DW_TAG_subprogram
)
681 ElemDie
= CreateSubprogramDIE(DW_Unit
,
682 DISubprogram(Element
.getGV()));
684 ElemDie
= CreateMemberDIE(DW_Unit
,
685 DIDerivedType(Element
.getGV()));
686 Buffer
.AddChild(ElemDie
);
689 // FIXME: We'd like an API to register additional attributes for the
690 // frontend to use while synthesizing, and then we'd use that api in clang
692 if (Name
== "__block_literal_generic")
693 AddUInt(&Buffer
, dwarf::DW_AT_APPLE_block
, dwarf::DW_FORM_flag
, 1);
695 unsigned RLang
= CTy
.getRunTimeLang();
697 AddUInt(&Buffer
, dwarf::DW_AT_APPLE_runtime_class
,
698 dwarf::DW_FORM_data1
, RLang
);
705 // Add name if not anonymous or intermediate type.
707 AddString(&Buffer
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
709 if (Tag
== dwarf::DW_TAG_enumeration_type
||
710 Tag
== dwarf::DW_TAG_structure_type
|| Tag
== dwarf::DW_TAG_union_type
) {
711 // Add size if non-zero (derived types might be zero-sized.)
713 AddUInt(&Buffer
, dwarf::DW_AT_byte_size
, 0, Size
);
715 // Add zero size if it is not a forward declaration.
716 if (CTy
.isForwardDecl())
717 AddUInt(&Buffer
, dwarf::DW_AT_declaration
, dwarf::DW_FORM_flag
, 1);
719 AddUInt(&Buffer
, dwarf::DW_AT_byte_size
, 0, 0);
722 // Add source line info if available.
723 if (!CTy
.isForwardDecl())
724 AddSourceLine(&Buffer
, &CTy
);
728 /// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
729 void DwarfDebug::ConstructSubrangeDIE(DIE
&Buffer
, DISubrange SR
, DIE
*IndexTy
){
730 int64_t L
= SR
.getLo();
731 int64_t H
= SR
.getHi();
732 DIE
*DW_Subrange
= new DIE(dwarf::DW_TAG_subrange_type
);
735 AddDIEEntry(DW_Subrange
, dwarf::DW_AT_type
, dwarf::DW_FORM_ref4
, IndexTy
);
737 AddSInt(DW_Subrange
, dwarf::DW_AT_lower_bound
, 0, L
);
738 AddSInt(DW_Subrange
, dwarf::DW_AT_upper_bound
, 0, H
);
741 Buffer
.AddChild(DW_Subrange
);
744 /// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
745 void DwarfDebug::ConstructArrayTypeDIE(CompileUnit
*DW_Unit
, DIE
&Buffer
,
746 DICompositeType
*CTy
) {
747 Buffer
.setTag(dwarf::DW_TAG_array_type
);
748 if (CTy
->getTag() == dwarf::DW_TAG_vector_type
)
749 AddUInt(&Buffer
, dwarf::DW_AT_GNU_vector
, dwarf::DW_FORM_flag
, 1);
751 // Emit derived type.
752 AddType(DW_Unit
, &Buffer
, CTy
->getTypeDerivedFrom());
753 DIArray Elements
= CTy
->getTypeArray();
755 // Construct an anonymous type for index type.
756 DIE
IdxBuffer(dwarf::DW_TAG_base_type
);
757 AddUInt(&IdxBuffer
, dwarf::DW_AT_byte_size
, 0, sizeof(int32_t));
758 AddUInt(&IdxBuffer
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
,
759 dwarf::DW_ATE_signed
);
760 DIE
*IndexTy
= DW_Unit
->AddDie(IdxBuffer
);
762 // Add subranges to array type.
763 for (unsigned i
= 0, N
= Elements
.getNumElements(); i
< N
; ++i
) {
764 DIDescriptor Element
= Elements
.getElement(i
);
765 if (Element
.getTag() == dwarf::DW_TAG_subrange_type
)
766 ConstructSubrangeDIE(Buffer
, DISubrange(Element
.getGV()), IndexTy
);
770 /// ConstructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
771 DIE
*DwarfDebug::ConstructEnumTypeDIE(CompileUnit
*DW_Unit
, DIEnumerator
*ETy
) {
772 DIE
*Enumerator
= new DIE(dwarf::DW_TAG_enumerator
);
775 AddString(Enumerator
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
776 int64_t Value
= ETy
->getEnumValue();
777 AddSInt(Enumerator
, dwarf::DW_AT_const_value
, dwarf::DW_FORM_sdata
, Value
);
781 /// CreateGlobalVariableDIE - Create new DIE using GV.
782 DIE
*DwarfDebug::CreateGlobalVariableDIE(CompileUnit
*DW_Unit
,
783 const DIGlobalVariable
&GV
) {
784 DIE
*GVDie
= new DIE(dwarf::DW_TAG_variable
);
786 GV
.getDisplayName(Name
);
787 AddString(GVDie
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
788 std::string LinkageName
;
789 GV
.getLinkageName(LinkageName
);
790 if (!LinkageName
.empty()) {
791 // Skip special LLVM prefix that is used to inform the asm printer to not emit
792 // usual symbol prefix before the symbol name. This happens for Objective-C
793 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
794 if (LinkageName
[0] == 1)
795 LinkageName
= &LinkageName
[1];
796 AddString(GVDie
, dwarf::DW_AT_MIPS_linkage_name
, dwarf::DW_FORM_string
,
799 AddType(DW_Unit
, GVDie
, GV
.getType());
800 if (!GV
.isLocalToUnit())
801 AddUInt(GVDie
, dwarf::DW_AT_external
, dwarf::DW_FORM_flag
, 1);
802 AddSourceLine(GVDie
, &GV
);
806 /// CreateMemberDIE - Create new member DIE.
807 DIE
*DwarfDebug::CreateMemberDIE(CompileUnit
*DW_Unit
, const DIDerivedType
&DT
){
808 DIE
*MemberDie
= new DIE(DT
.getTag());
812 AddString(MemberDie
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
814 AddType(DW_Unit
, MemberDie
, DT
.getTypeDerivedFrom());
816 AddSourceLine(MemberDie
, &DT
);
818 uint64_t Size
= DT
.getSizeInBits();
819 uint64_t FieldSize
= DT
.getOriginalTypeSize();
821 if (Size
!= FieldSize
) {
823 AddUInt(MemberDie
, dwarf::DW_AT_byte_size
, 0, DT
.getOriginalTypeSize()>>3);
824 AddUInt(MemberDie
, dwarf::DW_AT_bit_size
, 0, DT
.getSizeInBits());
826 uint64_t Offset
= DT
.getOffsetInBits();
827 uint64_t FieldOffset
= Offset
;
828 uint64_t AlignMask
= ~(DT
.getAlignInBits() - 1);
829 uint64_t HiMark
= (Offset
+ FieldSize
) & AlignMask
;
830 FieldOffset
= (HiMark
- FieldSize
);
831 Offset
-= FieldOffset
;
833 // Maybe we need to work from the other end.
834 if (TD
->isLittleEndian()) Offset
= FieldSize
- (Offset
+ Size
);
835 AddUInt(MemberDie
, dwarf::DW_AT_bit_offset
, 0, Offset
);
838 DIEBlock
*Block
= new DIEBlock();
839 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_plus_uconst
);
840 AddUInt(Block
, 0, dwarf::DW_FORM_udata
, DT
.getOffsetInBits() >> 3);
841 AddBlock(MemberDie
, dwarf::DW_AT_data_member_location
, 0, Block
);
843 if (DT
.isProtected())
844 AddUInt(MemberDie
, dwarf::DW_AT_accessibility
, 0,
845 dwarf::DW_ACCESS_protected
);
846 else if (DT
.isPrivate())
847 AddUInt(MemberDie
, dwarf::DW_AT_accessibility
, 0,
848 dwarf::DW_ACCESS_private
);
853 /// CreateSubprogramDIE - Create new DIE using SP.
854 DIE
*DwarfDebug::CreateSubprogramDIE(CompileUnit
*DW_Unit
,
855 const DISubprogram
&SP
,
858 DIE
*SPDie
= new DIE(dwarf::DW_TAG_subprogram
);
862 AddString(SPDie
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
864 std::string LinkageName
;
865 SP
.getLinkageName(LinkageName
);
866 if (!LinkageName
.empty()) {
867 // Skip special LLVM prefix that is used to inform the asm printer to not emit
868 // usual symbol prefix before the symbol name. This happens for Objective-C
869 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
870 if (LinkageName
[0] == 1)
871 LinkageName
= &LinkageName
[1];
872 AddString(SPDie
, dwarf::DW_AT_MIPS_linkage_name
, dwarf::DW_FORM_string
,
875 AddSourceLine(SPDie
, &SP
);
877 DICompositeType SPTy
= SP
.getType();
878 DIArray Args
= SPTy
.getTypeArray();
880 // Add prototyped tag, if C or ObjC.
881 unsigned Lang
= SP
.getCompileUnit().getLanguage();
882 if (Lang
== dwarf::DW_LANG_C99
|| Lang
== dwarf::DW_LANG_C89
||
883 Lang
== dwarf::DW_LANG_ObjC
)
884 AddUInt(SPDie
, dwarf::DW_AT_prototyped
, dwarf::DW_FORM_flag
, 1);
887 unsigned SPTag
= SPTy
.getTag();
888 if (!IsConstructor
) {
889 if (Args
.isNull() || SPTag
!= dwarf::DW_TAG_subroutine_type
)
890 AddType(DW_Unit
, SPDie
, SPTy
);
892 AddType(DW_Unit
, SPDie
, DIType(Args
.getElement(0).getGV()));
895 if (!SP
.isDefinition()) {
896 AddUInt(SPDie
, dwarf::DW_AT_declaration
, dwarf::DW_FORM_flag
, 1);
898 // Add arguments. Do not add arguments for subprogram definition. They will
899 // be handled through RecordVariable.
900 if (SPTag
== dwarf::DW_TAG_subroutine_type
)
901 for (unsigned i
= 1, N
= Args
.getNumElements(); i
< N
; ++i
) {
902 DIE
*Arg
= new DIE(dwarf::DW_TAG_formal_parameter
);
903 AddType(DW_Unit
, Arg
, DIType(Args
.getElement(i
).getGV()));
904 AddUInt(Arg
, dwarf::DW_AT_artificial
, dwarf::DW_FORM_flag
, 1); // ??
905 SPDie
->AddChild(Arg
);
909 if (!SP
.isLocalToUnit() && !IsInlined
)
910 AddUInt(SPDie
, dwarf::DW_AT_external
, dwarf::DW_FORM_flag
, 1);
912 // DW_TAG_inlined_subroutine may refer to this DIE.
913 DIE
*&Slot
= DW_Unit
->getDieMapSlotFor(SP
.getGV());
918 /// FindCompileUnit - Get the compile unit for the given descriptor.
920 CompileUnit
&DwarfDebug::FindCompileUnit(DICompileUnit Unit
) const {
921 DenseMap
<Value
*, CompileUnit
*>::const_iterator I
=
922 CompileUnitMap
.find(Unit
.getGV());
923 assert(I
!= CompileUnitMap
.end() && "Missing compile unit.");
927 /// CreateDbgScopeVariable - Create a new scope variable.
929 DIE
*DwarfDebug::CreateDbgScopeVariable(DbgVariable
*DV
, CompileUnit
*Unit
) {
930 // Get the descriptor.
931 const DIVariable
&VD
= DV
->getVariable();
933 // Translate tag to proper Dwarf tag. The result variable is dropped for
936 switch (VD
.getTag()) {
937 case dwarf::DW_TAG_return_variable
:
939 case dwarf::DW_TAG_arg_variable
:
940 Tag
= dwarf::DW_TAG_formal_parameter
;
942 case dwarf::DW_TAG_auto_variable
: // fall thru
944 Tag
= dwarf::DW_TAG_variable
;
948 // Define variable debug information entry.
949 DIE
*VariableDie
= new DIE(Tag
);
952 AddString(VariableDie
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, Name
);
954 // Add source line info if available.
955 AddSourceLine(VariableDie
, &VD
);
957 // Add variable type.
958 AddType(Unit
, VariableDie
, VD
.getType());
960 // Add variable address.
961 if (!DV
->isInlinedFnVar()) {
962 // Variables for abstract instances of inlined functions don't get a
964 MachineLocation Location
;
965 Location
.set(RI
->getFrameRegister(*MF
),
966 RI
->getFrameIndexOffset(*MF
, DV
->getFrameIndex()));
967 AddAddress(VariableDie
, dwarf::DW_AT_location
, Location
);
973 /// getOrCreateScope - Returns the scope associated with the given descriptor.
975 DbgScope
*DwarfDebug::getOrCreateScope(GlobalVariable
*V
) {
976 DbgScope
*&Slot
= DbgScopeMap
[V
];
977 if (Slot
) return Slot
;
979 DbgScope
*Parent
= NULL
;
982 // Don't create a new scope if we already created one for an inlined function.
983 DenseMap
<const GlobalVariable
*, DbgScope
*>::iterator
984 II
= AbstractInstanceRootMap
.find(V
);
985 if (II
!= AbstractInstanceRootMap
.end())
986 return LexicalScopeStack
.back();
988 if (!Block
.isNull()) {
989 DIDescriptor ParentDesc
= Block
.getContext();
991 ParentDesc
.isNull() ? NULL
: getOrCreateScope(ParentDesc
.getGV());
994 Slot
= new DbgScope(Parent
, DIDescriptor(V
));
997 Parent
->AddScope(Slot
);
999 // First function is top level function.
1000 FunctionDbgScope
= Slot
;
1005 /// ConstructDbgScope - Construct the components of a scope.
1007 void DwarfDebug::ConstructDbgScope(DbgScope
*ParentScope
,
1008 unsigned ParentStartID
,
1009 unsigned ParentEndID
,
1010 DIE
*ParentDie
, CompileUnit
*Unit
) {
1011 // Add variables to scope.
1012 SmallVector
<DbgVariable
*, 8> &Variables
= ParentScope
->getVariables();
1013 for (unsigned i
= 0, N
= Variables
.size(); i
< N
; ++i
) {
1014 DIE
*VariableDie
= CreateDbgScopeVariable(Variables
[i
], Unit
);
1015 if (VariableDie
) ParentDie
->AddChild(VariableDie
);
1018 // Add concrete instances to scope.
1019 SmallVector
<DbgConcreteScope
*, 8> &ConcreteInsts
=
1020 ParentScope
->getConcreteInsts();
1021 for (unsigned i
= 0, N
= ConcreteInsts
.size(); i
< N
; ++i
) {
1022 DbgConcreteScope
*ConcreteInst
= ConcreteInsts
[i
];
1023 DIE
*Die
= ConcreteInst
->getDie();
1025 unsigned StartID
= ConcreteInst
->getStartLabelID();
1026 unsigned EndID
= ConcreteInst
->getEndLabelID();
1028 // Add the scope bounds.
1030 AddLabel(Die
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1031 DWLabel("label", StartID
));
1033 AddLabel(Die
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1034 DWLabel("func_begin", SubprogramCount
));
1037 AddLabel(Die
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1038 DWLabel("label", EndID
));
1040 AddLabel(Die
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1041 DWLabel("func_end", SubprogramCount
));
1043 ParentDie
->AddChild(Die
);
1046 // Add nested scopes.
1047 SmallVector
<DbgScope
*, 4> &Scopes
= ParentScope
->getScopes();
1048 for (unsigned j
= 0, M
= Scopes
.size(); j
< M
; ++j
) {
1049 // Define the Scope debug information entry.
1050 DbgScope
*Scope
= Scopes
[j
];
1052 unsigned StartID
= MMI
->MappedLabel(Scope
->getStartLabelID());
1053 unsigned EndID
= MMI
->MappedLabel(Scope
->getEndLabelID());
1055 // Ignore empty scopes.
1056 if (StartID
== EndID
&& StartID
!= 0) continue;
1058 // Do not ignore inlined scopes even if they don't have any variables or
1060 if (Scope
->getScopes().empty() && Scope
->getVariables().empty() &&
1061 Scope
->getConcreteInsts().empty())
1064 if (StartID
== ParentStartID
&& EndID
== ParentEndID
) {
1065 // Just add stuff to the parent scope.
1066 ConstructDbgScope(Scope
, ParentStartID
, ParentEndID
, ParentDie
, Unit
);
1068 DIE
*ScopeDie
= new DIE(dwarf::DW_TAG_lexical_block
);
1070 // Add the scope bounds.
1072 AddLabel(ScopeDie
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1073 DWLabel("label", StartID
));
1075 AddLabel(ScopeDie
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1076 DWLabel("func_begin", SubprogramCount
));
1079 AddLabel(ScopeDie
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1080 DWLabel("label", EndID
));
1082 AddLabel(ScopeDie
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1083 DWLabel("func_end", SubprogramCount
));
1085 // Add the scope's contents.
1086 ConstructDbgScope(Scope
, StartID
, EndID
, ScopeDie
, Unit
);
1087 ParentDie
->AddChild(ScopeDie
);
1092 /// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1094 void DwarfDebug::ConstructFunctionDbgScope(DbgScope
*RootScope
,
1095 bool AbstractScope
) {
1096 // Exit if there is no root scope.
1097 if (!RootScope
) return;
1098 DIDescriptor Desc
= RootScope
->getDesc();
1102 // Get the subprogram debug information entry.
1103 DISubprogram
SPD(Desc
.getGV());
1105 // Get the subprogram die.
1106 DIE
*SPDie
= ModuleCU
->getDieMapSlotFor(SPD
.getGV());
1107 assert(SPDie
&& "Missing subprogram descriptor");
1109 if (!AbstractScope
) {
1110 // Add the function bounds.
1111 AddLabel(SPDie
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1112 DWLabel("func_begin", SubprogramCount
));
1113 AddLabel(SPDie
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1114 DWLabel("func_end", SubprogramCount
));
1115 MachineLocation
Location(RI
->getFrameRegister(*MF
));
1116 AddAddress(SPDie
, dwarf::DW_AT_frame_base
, Location
);
1119 ConstructDbgScope(RootScope
, 0, 0, SPDie
, ModuleCU
);
1122 /// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1124 void DwarfDebug::ConstructDefaultDbgScope(MachineFunction
*MF
) {
1125 StringMap
<DIE
*> &Globals
= ModuleCU
->getGlobals();
1126 StringMap
<DIE
*>::iterator GI
= Globals
.find(MF
->getFunction()->getName());
1127 if (GI
!= Globals
.end()) {
1128 DIE
*SPDie
= GI
->second
;
1130 // Add the function bounds.
1131 AddLabel(SPDie
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
,
1132 DWLabel("func_begin", SubprogramCount
));
1133 AddLabel(SPDie
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
,
1134 DWLabel("func_end", SubprogramCount
));
1136 MachineLocation
Location(RI
->getFrameRegister(*MF
));
1137 AddAddress(SPDie
, dwarf::DW_AT_frame_base
, Location
);
1141 /// GetOrCreateSourceID - Look up the source id with the given directory and
1142 /// source file names. If none currently exists, create a new id and insert it
1143 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1145 unsigned DwarfDebug::GetOrCreateSourceID(const std::string
&DirName
,
1146 const std::string
&FileName
) {
1148 StringMap
<unsigned>::iterator DI
= DirectoryIdMap
.find(DirName
);
1149 if (DI
!= DirectoryIdMap
.end()) {
1150 DId
= DI
->getValue();
1152 DId
= DirectoryNames
.size() + 1;
1153 DirectoryIdMap
[DirName
] = DId
;
1154 DirectoryNames
.push_back(DirName
);
1158 StringMap
<unsigned>::iterator FI
= SourceFileIdMap
.find(FileName
);
1159 if (FI
!= SourceFileIdMap
.end()) {
1160 FId
= FI
->getValue();
1162 FId
= SourceFileNames
.size() + 1;
1163 SourceFileIdMap
[FileName
] = FId
;
1164 SourceFileNames
.push_back(FileName
);
1167 DenseMap
<std::pair
<unsigned, unsigned>, unsigned>::iterator SI
=
1168 SourceIdMap
.find(std::make_pair(DId
, FId
));
1169 if (SI
!= SourceIdMap
.end())
1172 unsigned SrcId
= SourceIds
.size() + 1; // DW_AT_decl_file cannot be 0.
1173 SourceIdMap
[std::make_pair(DId
, FId
)] = SrcId
;
1174 SourceIds
.push_back(std::make_pair(DId
, FId
));
1179 void DwarfDebug::ConstructCompileUnit(GlobalVariable
*GV
) {
1180 DICompileUnit
DIUnit(GV
);
1181 std::string Dir
, FN
, Prod
;
1182 unsigned ID
= GetOrCreateSourceID(DIUnit
.getDirectory(Dir
),
1183 DIUnit
.getFilename(FN
));
1185 DIE
*Die
= new DIE(dwarf::DW_TAG_compile_unit
);
1186 AddSectionOffset(Die
, dwarf::DW_AT_stmt_list
, dwarf::DW_FORM_data4
,
1187 DWLabel("section_line", 0), DWLabel("section_line", 0),
1189 AddString(Die
, dwarf::DW_AT_producer
, dwarf::DW_FORM_string
,
1190 DIUnit
.getProducer(Prod
));
1191 AddUInt(Die
, dwarf::DW_AT_language
, dwarf::DW_FORM_data1
,
1192 DIUnit
.getLanguage());
1193 AddString(Die
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
, FN
);
1196 AddString(Die
, dwarf::DW_AT_comp_dir
, dwarf::DW_FORM_string
, Dir
);
1197 if (DIUnit
.isOptimized())
1198 AddUInt(Die
, dwarf::DW_AT_APPLE_optimized
, dwarf::DW_FORM_flag
, 1);
1201 DIUnit
.getFlags(Flags
);
1203 AddString(Die
, dwarf::DW_AT_APPLE_flags
, dwarf::DW_FORM_string
, Flags
);
1205 unsigned RVer
= DIUnit
.getRunTimeVersion();
1207 AddUInt(Die
, dwarf::DW_AT_APPLE_major_runtime_vers
,
1208 dwarf::DW_FORM_data1
, RVer
);
1210 CompileUnit
*Unit
= new CompileUnit(ID
, Die
);
1211 if (!ModuleCU
&& DIUnit
.isMain()) {
1212 // Use first compile unit marked as isMain as the compile unit
1217 CompileUnitMap
[DIUnit
.getGV()] = Unit
;
1218 CompileUnits
.push_back(Unit
);
1221 void DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable
*GV
) {
1222 DIGlobalVariable
DI_GV(GV
);
1224 // Check for pre-existence.
1225 DIE
*&Slot
= ModuleCU
->getDieMapSlotFor(DI_GV
.getGV());
1229 DIE
*VariableDie
= CreateGlobalVariableDIE(ModuleCU
, DI_GV
);
1232 DIEBlock
*Block
= new DIEBlock();
1233 AddUInt(Block
, 0, dwarf::DW_FORM_data1
, dwarf::DW_OP_addr
);
1235 AddObjectLabel(Block
, 0, dwarf::DW_FORM_udata
,
1236 Asm
->getGlobalLinkName(DI_GV
.getGlobal(), GLN
));
1237 AddBlock(VariableDie
, dwarf::DW_AT_location
, 0, Block
);
1242 // Add to context owner.
1243 ModuleCU
->getDie()->AddChild(VariableDie
);
1245 // Expose as global. FIXME - need to check external flag.
1247 ModuleCU
->AddGlobal(DI_GV
.getName(Name
), VariableDie
);
1251 void DwarfDebug::ConstructSubprogram(GlobalVariable
*GV
) {
1252 DISubprogram
SP(GV
);
1254 // Check for pre-existence.
1255 DIE
*&Slot
= ModuleCU
->getDieMapSlotFor(GV
);
1259 if (!SP
.isDefinition())
1260 // This is a method declaration which will be handled while constructing
1264 DIE
*SubprogramDie
= CreateSubprogramDIE(ModuleCU
, SP
);
1267 Slot
= SubprogramDie
;
1269 // Add to context owner.
1270 ModuleCU
->getDie()->AddChild(SubprogramDie
);
1272 // Expose as global.
1274 ModuleCU
->AddGlobal(SP
.getName(Name
), SubprogramDie
);
1278 /// BeginModule - Emit all Dwarf sections that should come prior to the
1279 /// content. Create global DIEs and emit initial debug info sections.
1280 /// This is inovked by the target AsmPrinter.
1281 void DwarfDebug::BeginModule(Module
*M
, MachineModuleInfo
*mmi
) {
1284 if (TimePassesIsEnabled
)
1285 DebugTimer
->startTimer();
1287 DebugInfoFinder DbgFinder
;
1288 DbgFinder
.processModule(*M
);
1290 // Create all the compile unit DIEs.
1291 for (DebugInfoFinder::iterator I
= DbgFinder
.compile_unit_begin(),
1292 E
= DbgFinder
.compile_unit_end(); I
!= E
; ++I
)
1293 ConstructCompileUnit(*I
);
1295 if (CompileUnits
.empty()) {
1296 if (TimePassesIsEnabled
)
1297 DebugTimer
->stopTimer();
1302 // If main compile unit for this module is not seen than randomly
1303 // select first compile unit.
1305 ModuleCU
= CompileUnits
[0];
1307 // If there is not any debug info available for any global variables and any
1308 // subprograms then there is not any debug info to emit.
1309 if (DbgFinder
.global_variable_count() == 0
1310 && DbgFinder
.subprogram_count() == 0) {
1311 if (TimePassesIsEnabled
)
1312 DebugTimer
->stopTimer();
1316 // Create DIEs for each of the externally visible global variables.
1317 for (DebugInfoFinder::iterator I
= DbgFinder
.global_variable_begin(),
1318 E
= DbgFinder
.global_variable_end(); I
!= E
; ++I
)
1319 ConstructGlobalVariableDIE(*I
);
1321 // Create DIEs for each of the externally visible subprograms.
1322 for (DebugInfoFinder::iterator I
= DbgFinder
.subprogram_begin(),
1323 E
= DbgFinder
.subprogram_end(); I
!= E
; ++I
)
1324 ConstructSubprogram(*I
);
1328 MMI
->setDebugInfoAvailability(true);
1330 // Prime section data.
1331 SectionMap
.insert(Asm
->getObjFileLowering().getTextSection());
1333 // Print out .file directives to specify files for .loc directives. These are
1334 // printed out early so that they precede any .loc directives.
1335 if (TAI
->hasDotLocAndDotFile()) {
1336 for (unsigned i
= 1, e
= getNumSourceIds()+1; i
!= e
; ++i
) {
1337 // Remember source id starts at 1.
1338 std::pair
<unsigned, unsigned> Id
= getSourceDirectoryAndFileIds(i
);
1339 sys::Path
FullPath(getSourceDirectoryName(Id
.first
));
1341 FullPath
.appendComponent(getSourceFileName(Id
.second
));
1342 assert(AppendOk
&& "Could not append filename to directory!");
1344 Asm
->EmitFile(i
, FullPath
.toString());
1349 // Emit initial sections
1352 if (TimePassesIsEnabled
)
1353 DebugTimer
->stopTimer();
1356 /// EndModule - Emit all Dwarf sections that should come after the content.
1358 void DwarfDebug::EndModule() {
1359 if (!ShouldEmitDwarfDebug())
1362 if (TimePassesIsEnabled
)
1363 DebugTimer
->startTimer();
1365 // Standard sections final addresses.
1366 Asm
->SwitchToSection(Asm
->getObjFileLowering().getTextSection());
1367 EmitLabel("text_end", 0);
1368 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDataSection());
1369 EmitLabel("data_end", 0);
1371 // End text sections.
1372 for (unsigned i
= 1, N
= SectionMap
.size(); i
<= N
; ++i
) {
1373 Asm
->SwitchToSection(SectionMap
[i
]);
1374 EmitLabel("section_end", i
);
1377 // Emit common frame information.
1378 EmitCommonDebugFrame();
1380 // Emit function debug frame information
1381 for (std::vector
<FunctionDebugFrameInfo
>::iterator I
= DebugFrames
.begin(),
1382 E
= DebugFrames
.end(); I
!= E
; ++I
)
1383 EmitFunctionDebugFrame(*I
);
1385 // Compute DIE offsets and sizes.
1388 // Emit all the DIEs into a debug info section
1391 // Corresponding abbreviations into a abbrev section.
1392 EmitAbbreviations();
1394 // Emit source line correspondence into a debug line section.
1397 // Emit info into a debug pubnames section.
1398 EmitDebugPubNames();
1400 // Emit info into a debug str section.
1403 // Emit info into a debug loc section.
1406 // Emit info into a debug aranges section.
1409 // Emit info into a debug ranges section.
1412 // Emit info into a debug macinfo section.
1415 // Emit inline info.
1416 EmitDebugInlineInfo();
1418 if (TimePassesIsEnabled
)
1419 DebugTimer
->stopTimer();
1422 /// BeginFunction - Gather pre-function debug information. Assumes being
1423 /// emitted immediately after the function entry point.
1424 void DwarfDebug::BeginFunction(MachineFunction
*MF
) {
1427 if (!ShouldEmitDwarfDebug()) return;
1429 if (TimePassesIsEnabled
)
1430 DebugTimer
->startTimer();
1432 // Begin accumulating function debug information.
1433 MMI
->BeginFunction(MF
);
1435 // Assumes in correct section after the entry point.
1436 EmitLabel("func_begin", ++SubprogramCount
);
1438 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1440 DebugLoc FDL
= MF
->getDefaultDebugLoc();
1441 if (!FDL
.isUnknown()) {
1442 DebugLocTuple DLT
= MF
->getDebugLocTuple(FDL
);
1443 unsigned LabelID
= RecordSourceLine(DLT
.Line
, DLT
.Col
,
1444 DICompileUnit(DLT
.CompileUnit
));
1445 Asm
->printLabel(LabelID
);
1448 if (TimePassesIsEnabled
)
1449 DebugTimer
->stopTimer();
1452 /// EndFunction - Gather and emit post-function debug information.
1454 void DwarfDebug::EndFunction(MachineFunction
*MF
) {
1455 if (!ShouldEmitDwarfDebug()) return;
1457 if (TimePassesIsEnabled
)
1458 DebugTimer
->startTimer();
1460 // Define end label for subprogram.
1461 EmitLabel("func_end", SubprogramCount
);
1463 // Get function line info.
1464 if (!Lines
.empty()) {
1465 // Get section line info.
1466 unsigned ID
= SectionMap
.insert(Asm
->getCurrentSection());
1467 if (SectionSourceLines
.size() < ID
) SectionSourceLines
.resize(ID
);
1468 std::vector
<SrcLineInfo
> &SectionLineInfos
= SectionSourceLines
[ID
-1];
1469 // Append the function info to section info.
1470 SectionLineInfos
.insert(SectionLineInfos
.end(),
1471 Lines
.begin(), Lines
.end());
1474 // Construct the DbgScope for abstract instances.
1475 for (SmallVector
<DbgScope
*, 32>::iterator
1476 I
= AbstractInstanceRootList
.begin(),
1477 E
= AbstractInstanceRootList
.end(); I
!= E
; ++I
)
1478 ConstructFunctionDbgScope(*I
);
1480 // Construct scopes for subprogram.
1481 if (FunctionDbgScope
)
1482 ConstructFunctionDbgScope(FunctionDbgScope
);
1484 // FIXME: This is wrong. We are essentially getting past a problem with
1485 // debug information not being able to handle unreachable blocks that have
1486 // debug information in them. In particular, those unreachable blocks that
1487 // have "region end" info in them. That situation results in the "root
1488 // scope" not being created. If that's the case, then emit a "default"
1489 // scope, i.e., one that encompasses the whole function. This isn't
1490 // desirable. And a better way of handling this (and all of the debugging
1491 // information) needs to be explored.
1492 ConstructDefaultDbgScope(MF
);
1494 DebugFrames
.push_back(FunctionDebugFrameInfo(SubprogramCount
,
1495 MMI
->getFrameMoves()));
1498 if (FunctionDbgScope
) {
1499 delete FunctionDbgScope
;
1500 DbgScopeMap
.clear();
1501 DbgAbstractScopeMap
.clear();
1502 DbgConcreteScopeMap
.clear();
1503 InlinedVariableScopes
.clear();
1504 FunctionDbgScope
= NULL
;
1505 LexicalScopeStack
.clear();
1506 AbstractInstanceRootList
.clear();
1507 AbstractInstanceRootMap
.clear();
1512 if (TimePassesIsEnabled
)
1513 DebugTimer
->stopTimer();
1516 /// RecordSourceLine - Records location information and associates it with a
1517 /// label. Returns a unique label ID used to generate a label and provide
1518 /// correspondence to the source line list.
1519 unsigned DwarfDebug::RecordSourceLine(Value
*V
, unsigned Line
, unsigned Col
) {
1520 if (TimePassesIsEnabled
)
1521 DebugTimer
->startTimer();
1523 CompileUnit
*Unit
= CompileUnitMap
[V
];
1524 assert(Unit
&& "Unable to find CompileUnit");
1525 unsigned ID
= MMI
->NextLabelID();
1526 Lines
.push_back(SrcLineInfo(Line
, Col
, Unit
->getID(), ID
));
1528 if (TimePassesIsEnabled
)
1529 DebugTimer
->stopTimer();
1534 /// RecordSourceLine - Records location information and associates it with a
1535 /// label. Returns a unique label ID used to generate a label and provide
1536 /// correspondence to the source line list.
1537 unsigned DwarfDebug::RecordSourceLine(unsigned Line
, unsigned Col
,
1539 if (TimePassesIsEnabled
)
1540 DebugTimer
->startTimer();
1542 std::string Dir
, Fn
;
1543 unsigned Src
= GetOrCreateSourceID(CU
.getDirectory(Dir
),
1544 CU
.getFilename(Fn
));
1545 unsigned ID
= MMI
->NextLabelID();
1546 Lines
.push_back(SrcLineInfo(Line
, Col
, Src
, ID
));
1548 if (TimePassesIsEnabled
)
1549 DebugTimer
->stopTimer();
1554 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
1555 /// timed. Look up the source id with the given directory and source file
1556 /// names. If none currently exists, create a new id and insert it in the
1557 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
1559 unsigned DwarfDebug::getOrCreateSourceID(const std::string
&DirName
,
1560 const std::string
&FileName
) {
1561 if (TimePassesIsEnabled
)
1562 DebugTimer
->startTimer();
1564 unsigned SrcId
= GetOrCreateSourceID(DirName
, FileName
);
1566 if (TimePassesIsEnabled
)
1567 DebugTimer
->stopTimer();
1572 /// RecordRegionStart - Indicate the start of a region.
1573 unsigned DwarfDebug::RecordRegionStart(GlobalVariable
*V
) {
1574 if (TimePassesIsEnabled
)
1575 DebugTimer
->startTimer();
1577 DbgScope
*Scope
= getOrCreateScope(V
);
1578 unsigned ID
= MMI
->NextLabelID();
1579 if (!Scope
->getStartLabelID()) Scope
->setStartLabelID(ID
);
1580 LexicalScopeStack
.push_back(Scope
);
1582 if (TimePassesIsEnabled
)
1583 DebugTimer
->stopTimer();
1588 /// RecordRegionEnd - Indicate the end of a region.
1589 unsigned DwarfDebug::RecordRegionEnd(GlobalVariable
*V
) {
1590 if (TimePassesIsEnabled
)
1591 DebugTimer
->startTimer();
1593 DbgScope
*Scope
= getOrCreateScope(V
);
1594 unsigned ID
= MMI
->NextLabelID();
1595 Scope
->setEndLabelID(ID
);
1596 // FIXME : region.end() may not be in the last basic block.
1597 // For now, do not pop last lexical scope because next basic
1598 // block may start new inlined function's body.
1599 unsigned LSSize
= LexicalScopeStack
.size();
1600 if (LSSize
!= 0 && LSSize
!= 1)
1601 LexicalScopeStack
.pop_back();
1603 if (TimePassesIsEnabled
)
1604 DebugTimer
->stopTimer();
1609 /// RecordVariable - Indicate the declaration of a local variable.
1610 void DwarfDebug::RecordVariable(GlobalVariable
*GV
, unsigned FrameIndex
,
1611 const MachineInstr
*MI
) {
1612 if (TimePassesIsEnabled
)
1613 DebugTimer
->startTimer();
1615 DIDescriptor
Desc(GV
);
1616 DbgScope
*Scope
= NULL
;
1617 bool InlinedFnVar
= false;
1619 if (Desc
.getTag() == dwarf::DW_TAG_variable
) {
1620 // GV is a global variable.
1621 DIGlobalVariable
DG(GV
);
1622 Scope
= getOrCreateScope(DG
.getContext().getGV());
1624 DenseMap
<const MachineInstr
*, DbgScope
*>::iterator
1625 SI
= InlinedVariableScopes
.find(MI
);
1627 if (SI
!= InlinedVariableScopes
.end()) {
1628 // or GV is an inlined local variable.
1630 InlinedFnVar
= true;
1633 GlobalVariable
*V
= DV
.getContext().getGV();
1635 // or GV is a local variable.
1636 Scope
= getOrCreateScope(V
);
1640 assert(Scope
&& "Unable to find the variable's scope");
1641 DbgVariable
*DV
= new DbgVariable(DIVariable(GV
), FrameIndex
, InlinedFnVar
);
1642 Scope
->AddVariable(DV
);
1644 if (TimePassesIsEnabled
)
1645 DebugTimer
->stopTimer();
1648 //// RecordInlinedFnStart - Indicate the start of inlined subroutine.
1649 unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram
&SP
, DICompileUnit CU
,
1650 unsigned Line
, unsigned Col
) {
1651 unsigned LabelID
= MMI
->NextLabelID();
1653 if (!TAI
->doesDwarfUsesInlineInfoSection())
1656 if (TimePassesIsEnabled
)
1657 DebugTimer
->startTimer();
1659 GlobalVariable
*GV
= SP
.getGV();
1660 DenseMap
<const GlobalVariable
*, DbgScope
*>::iterator
1661 II
= AbstractInstanceRootMap
.find(GV
);
1663 if (II
== AbstractInstanceRootMap
.end()) {
1664 // Create an abstract instance entry for this inlined function if it doesn't
1666 DbgScope
*Scope
= new DbgScope(NULL
, DIDescriptor(GV
));
1668 // Get the compile unit context.
1669 DIE
*SPDie
= ModuleCU
->getDieMapSlotFor(GV
);
1671 SPDie
= CreateSubprogramDIE(ModuleCU
, SP
, false, true);
1673 // Mark as being inlined. This makes this subprogram entry an abstract
1675 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
1676 // that it's defined. That probably won't change in the future. However,
1677 // this could be more elegant.
1678 AddUInt(SPDie
, dwarf::DW_AT_inline
, 0, dwarf::DW_INL_declared_not_inlined
);
1680 // Keep track of the abstract scope for this function.
1681 DbgAbstractScopeMap
[GV
] = Scope
;
1683 AbstractInstanceRootMap
[GV
] = Scope
;
1684 AbstractInstanceRootList
.push_back(Scope
);
1687 // Create a concrete inlined instance for this inlined function.
1688 DbgConcreteScope
*ConcreteScope
= new DbgConcreteScope(DIDescriptor(GV
));
1689 DIE
*ScopeDie
= new DIE(dwarf::DW_TAG_inlined_subroutine
);
1690 ScopeDie
->setAbstractCompileUnit(ModuleCU
);
1692 DIE
*Origin
= ModuleCU
->getDieMapSlotFor(GV
);
1693 AddDIEEntry(ScopeDie
, dwarf::DW_AT_abstract_origin
,
1694 dwarf::DW_FORM_ref4
, Origin
);
1695 AddUInt(ScopeDie
, dwarf::DW_AT_call_file
, 0, ModuleCU
->getID());
1696 AddUInt(ScopeDie
, dwarf::DW_AT_call_line
, 0, Line
);
1697 AddUInt(ScopeDie
, dwarf::DW_AT_call_column
, 0, Col
);
1699 ConcreteScope
->setDie(ScopeDie
);
1700 ConcreteScope
->setStartLabelID(LabelID
);
1701 MMI
->RecordUsedDbgLabel(LabelID
);
1703 LexicalScopeStack
.back()->AddConcreteInst(ConcreteScope
);
1705 // Keep track of the concrete scope that's inlined into this function.
1706 DenseMap
<GlobalVariable
*, SmallVector
<DbgScope
*, 8> >::iterator
1707 SI
= DbgConcreteScopeMap
.find(GV
);
1709 if (SI
== DbgConcreteScopeMap
.end())
1710 DbgConcreteScopeMap
[GV
].push_back(ConcreteScope
);
1712 SI
->second
.push_back(ConcreteScope
);
1714 // Track the start label for this inlined function.
1715 DenseMap
<GlobalVariable
*, SmallVector
<unsigned, 4> >::iterator
1716 I
= InlineInfo
.find(GV
);
1718 if (I
== InlineInfo
.end())
1719 InlineInfo
[GV
].push_back(LabelID
);
1721 I
->second
.push_back(LabelID
);
1723 if (TimePassesIsEnabled
)
1724 DebugTimer
->stopTimer();
1729 /// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
1730 unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram
&SP
) {
1731 if (!TAI
->doesDwarfUsesInlineInfoSection())
1734 if (TimePassesIsEnabled
)
1735 DebugTimer
->startTimer();
1737 GlobalVariable
*GV
= SP
.getGV();
1738 DenseMap
<GlobalVariable
*, SmallVector
<DbgScope
*, 8> >::iterator
1739 I
= DbgConcreteScopeMap
.find(GV
);
1741 if (I
== DbgConcreteScopeMap
.end()) {
1742 // FIXME: Can this situation actually happen? And if so, should it?
1743 if (TimePassesIsEnabled
)
1744 DebugTimer
->stopTimer();
1749 SmallVector
<DbgScope
*, 8> &Scopes
= I
->second
;
1750 if (Scopes
.empty()) {
1751 // Returned ID is 0 if this is unbalanced "end of inlined
1752 // scope". This could happen if optimizer eats dbg intrinsics
1753 // or "beginning of inlined scope" is not recoginized due to
1754 // missing location info. In such cases, ignore this region.end.
1758 DbgScope
*Scope
= Scopes
.back(); Scopes
.pop_back();
1759 unsigned ID
= MMI
->NextLabelID();
1760 MMI
->RecordUsedDbgLabel(ID
);
1761 Scope
->setEndLabelID(ID
);
1763 if (TimePassesIsEnabled
)
1764 DebugTimer
->stopTimer();
1769 /// RecordVariableScope - Record scope for the variable declared by
1770 /// DeclareMI. DeclareMI must describe TargetInstrInfo::DECLARE. Record scopes
1771 /// for only inlined subroutine variables. Other variables's scopes are
1772 /// determined during RecordVariable().
1773 void DwarfDebug::RecordVariableScope(DIVariable
&DV
,
1774 const MachineInstr
*DeclareMI
) {
1775 if (TimePassesIsEnabled
)
1776 DebugTimer
->startTimer();
1778 DISubprogram
SP(DV
.getContext().getGV());
1781 if (TimePassesIsEnabled
)
1782 DebugTimer
->stopTimer();
1787 DenseMap
<GlobalVariable
*, DbgScope
*>::iterator
1788 I
= DbgAbstractScopeMap
.find(SP
.getGV());
1789 if (I
!= DbgAbstractScopeMap
.end())
1790 InlinedVariableScopes
[DeclareMI
] = I
->second
;
1792 if (TimePassesIsEnabled
)
1793 DebugTimer
->stopTimer();
1796 //===----------------------------------------------------------------------===//
1798 //===----------------------------------------------------------------------===//
1800 /// SizeAndOffsetDie - Compute the size and offset of a DIE.
1802 unsigned DwarfDebug::SizeAndOffsetDie(DIE
*Die
, unsigned Offset
, bool Last
) {
1803 // Get the children.
1804 const std::vector
<DIE
*> &Children
= Die
->getChildren();
1806 // If not last sibling and has children then add sibling offset attribute.
1807 if (!Last
&& !Children
.empty()) Die
->AddSiblingOffset();
1809 // Record the abbreviation.
1810 AssignAbbrevNumber(Die
->getAbbrev());
1812 // Get the abbreviation for this DIE.
1813 unsigned AbbrevNumber
= Die
->getAbbrevNumber();
1814 const DIEAbbrev
*Abbrev
= Abbreviations
[AbbrevNumber
- 1];
1817 Die
->setOffset(Offset
);
1819 // Start the size with the size of abbreviation code.
1820 Offset
+= TargetAsmInfo::getULEB128Size(AbbrevNumber
);
1822 const SmallVector
<DIEValue
*, 32> &Values
= Die
->getValues();
1823 const SmallVector
<DIEAbbrevData
, 8> &AbbrevData
= Abbrev
->getData();
1825 // Size the DIE attribute values.
1826 for (unsigned i
= 0, N
= Values
.size(); i
< N
; ++i
)
1827 // Size attribute value.
1828 Offset
+= Values
[i
]->SizeOf(TD
, AbbrevData
[i
].getForm());
1830 // Size the DIE children if any.
1831 if (!Children
.empty()) {
1832 assert(Abbrev
->getChildrenFlag() == dwarf::DW_CHILDREN_yes
&&
1833 "Children flag not set");
1835 for (unsigned j
= 0, M
= Children
.size(); j
< M
; ++j
)
1836 Offset
= SizeAndOffsetDie(Children
[j
], Offset
, (j
+ 1) == M
);
1838 // End of children marker.
1839 Offset
+= sizeof(int8_t);
1842 Die
->setSize(Offset
- Die
->getOffset());
1846 /// SizeAndOffsets - Compute the size and offset of all the DIEs.
1848 void DwarfDebug::SizeAndOffsets() {
1849 // Compute size of compile unit header.
1850 static unsigned Offset
=
1851 sizeof(int32_t) + // Length of Compilation Unit Info
1852 sizeof(int16_t) + // DWARF version number
1853 sizeof(int32_t) + // Offset Into Abbrev. Section
1854 sizeof(int8_t); // Pointer Size (in bytes)
1856 SizeAndOffsetDie(ModuleCU
->getDie(), Offset
, true);
1857 CompileUnitOffsets
[ModuleCU
] = 0;
1860 /// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
1861 /// tools to recognize the object file contains Dwarf information.
1862 void DwarfDebug::EmitInitial() {
1863 // Check to see if we already emitted intial headers.
1864 if (didInitial
) return;
1867 // Dwarf sections base addresses.
1868 if (TAI
->doesDwarfRequireFrameSection()) {
1869 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfFrameSection());
1870 EmitLabel("section_debug_frame", 0);
1873 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfInfoSection());
1874 EmitLabel("section_info", 0);
1875 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfAbbrevSection());
1876 EmitLabel("section_abbrev", 0);
1877 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfARangesSection());
1878 EmitLabel("section_aranges", 0);
1880 if (const MCSection
*LineInfoDirective
=
1881 Asm
->getObjFileLowering().getDwarfMacroInfoSection()) {
1882 Asm
->SwitchToSection(LineInfoDirective
);
1883 EmitLabel("section_macinfo", 0);
1886 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfLineSection());
1887 EmitLabel("section_line", 0);
1888 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfLocSection());
1889 EmitLabel("section_loc", 0);
1890 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfPubNamesSection());
1891 EmitLabel("section_pubnames", 0);
1892 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfStrSection());
1893 EmitLabel("section_str", 0);
1894 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfRangesSection());
1895 EmitLabel("section_ranges", 0);
1897 Asm
->SwitchToSection(Asm
->getObjFileLowering().getTextSection());
1898 EmitLabel("text_begin", 0);
1899 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDataSection());
1900 EmitLabel("data_begin", 0);
1903 /// EmitDIE - Recusively Emits a debug information entry.
1905 void DwarfDebug::EmitDIE(DIE
*Die
) {
1906 // Get the abbreviation for this DIE.
1907 unsigned AbbrevNumber
= Die
->getAbbrevNumber();
1908 const DIEAbbrev
*Abbrev
= Abbreviations
[AbbrevNumber
- 1];
1912 // Emit the code (index) for the abbreviation.
1913 Asm
->EmitULEB128Bytes(AbbrevNumber
);
1915 if (Asm
->isVerbose())
1916 Asm
->EOL(std::string("Abbrev [" +
1917 utostr(AbbrevNumber
) +
1918 "] 0x" + utohexstr(Die
->getOffset()) +
1919 ":0x" + utohexstr(Die
->getSize()) + " " +
1920 dwarf::TagString(Abbrev
->getTag())));
1924 SmallVector
<DIEValue
*, 32> &Values
= Die
->getValues();
1925 const SmallVector
<DIEAbbrevData
, 8> &AbbrevData
= Abbrev
->getData();
1927 // Emit the DIE attribute values.
1928 for (unsigned i
= 0, N
= Values
.size(); i
< N
; ++i
) {
1929 unsigned Attr
= AbbrevData
[i
].getAttribute();
1930 unsigned Form
= AbbrevData
[i
].getForm();
1931 assert(Form
&& "Too many attributes for DIE (check abbreviation)");
1934 case dwarf::DW_AT_sibling
:
1935 Asm
->EmitInt32(Die
->SiblingOffset());
1937 case dwarf::DW_AT_abstract_origin
: {
1938 DIEEntry
*E
= cast
<DIEEntry
>(Values
[i
]);
1939 DIE
*Origin
= E
->getEntry();
1941 CompileUnitOffsets
[Die
->getAbstractCompileUnit()] +
1942 Origin
->getOffset();
1944 Asm
->EmitInt32(Addr
);
1948 // Emit an attribute using the defined form.
1949 Values
[i
]->EmitValue(this, Form
);
1953 Asm
->EOL(dwarf::AttributeString(Attr
));
1956 // Emit the DIE children if any.
1957 if (Abbrev
->getChildrenFlag() == dwarf::DW_CHILDREN_yes
) {
1958 const std::vector
<DIE
*> &Children
= Die
->getChildren();
1960 for (unsigned j
= 0, M
= Children
.size(); j
< M
; ++j
)
1961 EmitDIE(Children
[j
]);
1963 Asm
->EmitInt8(0); Asm
->EOL("End Of Children Mark");
1967 /// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
1969 void DwarfDebug::EmitDebugInfoPerCU(CompileUnit
*Unit
) {
1970 DIE
*Die
= Unit
->getDie();
1972 // Emit the compile units header.
1973 EmitLabel("info_begin", Unit
->getID());
1975 // Emit size of content not including length itself
1976 unsigned ContentSize
= Die
->getSize() +
1977 sizeof(int16_t) + // DWARF version number
1978 sizeof(int32_t) + // Offset Into Abbrev. Section
1979 sizeof(int8_t) + // Pointer Size (in bytes)
1980 sizeof(int32_t); // FIXME - extra pad for gdb bug.
1982 Asm
->EmitInt32(ContentSize
); Asm
->EOL("Length of Compilation Unit Info");
1983 Asm
->EmitInt16(dwarf::DWARF_VERSION
); Asm
->EOL("DWARF version number");
1984 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
1985 Asm
->EOL("Offset Into Abbrev. Section");
1986 Asm
->EmitInt8(TD
->getPointerSize()); Asm
->EOL("Address Size (in bytes)");
1989 // FIXME - extra padding for gdb bug.
1990 Asm
->EmitInt8(0); Asm
->EOL("Extra Pad For GDB");
1991 Asm
->EmitInt8(0); Asm
->EOL("Extra Pad For GDB");
1992 Asm
->EmitInt8(0); Asm
->EOL("Extra Pad For GDB");
1993 Asm
->EmitInt8(0); Asm
->EOL("Extra Pad For GDB");
1994 EmitLabel("info_end", Unit
->getID());
1999 void DwarfDebug::EmitDebugInfo() {
2000 // Start debug info section.
2001 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfInfoSection());
2003 EmitDebugInfoPerCU(ModuleCU
);
2006 /// EmitAbbreviations - Emit the abbreviation section.
2008 void DwarfDebug::EmitAbbreviations() const {
2009 // Check to see if it is worth the effort.
2010 if (!Abbreviations
.empty()) {
2011 // Start the debug abbrev section.
2012 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfAbbrevSection());
2014 EmitLabel("abbrev_begin", 0);
2016 // For each abbrevation.
2017 for (unsigned i
= 0, N
= Abbreviations
.size(); i
< N
; ++i
) {
2018 // Get abbreviation data
2019 const DIEAbbrev
*Abbrev
= Abbreviations
[i
];
2021 // Emit the abbrevations code (base 1 index.)
2022 Asm
->EmitULEB128Bytes(Abbrev
->getNumber());
2023 Asm
->EOL("Abbreviation Code");
2025 // Emit the abbreviations data.
2031 // Mark end of abbreviations.
2032 Asm
->EmitULEB128Bytes(0); Asm
->EOL("EOM(3)");
2034 EmitLabel("abbrev_end", 0);
2039 /// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2040 /// the line matrix.
2042 void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd
) {
2043 // Define last address of section.
2044 Asm
->EmitInt8(0); Asm
->EOL("Extended Op");
2045 Asm
->EmitInt8(TD
->getPointerSize() + 1); Asm
->EOL("Op size");
2046 Asm
->EmitInt8(dwarf::DW_LNE_set_address
); Asm
->EOL("DW_LNE_set_address");
2047 EmitReference("section_end", SectionEnd
); Asm
->EOL("Section end label");
2049 // Mark end of matrix.
2050 Asm
->EmitInt8(0); Asm
->EOL("DW_LNE_end_sequence");
2051 Asm
->EmitULEB128Bytes(1); Asm
->EOL();
2052 Asm
->EmitInt8(1); Asm
->EOL();
2055 /// EmitDebugLines - Emit source line information.
2057 void DwarfDebug::EmitDebugLines() {
2058 // If the target is using .loc/.file, the assembler will be emitting the
2059 // .debug_line table automatically.
2060 if (TAI
->hasDotLocAndDotFile())
2063 // Minimum line delta, thus ranging from -10..(255-10).
2064 const int MinLineDelta
= -(dwarf::DW_LNS_fixed_advance_pc
+ 1);
2065 // Maximum line delta, thus ranging from -10..(255-10).
2066 const int MaxLineDelta
= 255 + MinLineDelta
;
2068 // Start the dwarf line section.
2069 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfLineSection());
2071 // Construct the section header.
2072 EmitDifference("line_end", 0, "line_begin", 0, true);
2073 Asm
->EOL("Length of Source Line Info");
2074 EmitLabel("line_begin", 0);
2076 Asm
->EmitInt16(dwarf::DWARF_VERSION
); Asm
->EOL("DWARF version number");
2078 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2079 Asm
->EOL("Prolog Length");
2080 EmitLabel("line_prolog_begin", 0);
2082 Asm
->EmitInt8(1); Asm
->EOL("Minimum Instruction Length");
2084 Asm
->EmitInt8(1); Asm
->EOL("Default is_stmt_start flag");
2086 Asm
->EmitInt8(MinLineDelta
); Asm
->EOL("Line Base Value (Special Opcodes)");
2088 Asm
->EmitInt8(MaxLineDelta
); Asm
->EOL("Line Range Value (Special Opcodes)");
2090 Asm
->EmitInt8(-MinLineDelta
); Asm
->EOL("Special Opcode Base");
2092 // Line number standard opcode encodings argument count
2093 Asm
->EmitInt8(0); Asm
->EOL("DW_LNS_copy arg count");
2094 Asm
->EmitInt8(1); Asm
->EOL("DW_LNS_advance_pc arg count");
2095 Asm
->EmitInt8(1); Asm
->EOL("DW_LNS_advance_line arg count");
2096 Asm
->EmitInt8(1); Asm
->EOL("DW_LNS_set_file arg count");
2097 Asm
->EmitInt8(1); Asm
->EOL("DW_LNS_set_column arg count");
2098 Asm
->EmitInt8(0); Asm
->EOL("DW_LNS_negate_stmt arg count");
2099 Asm
->EmitInt8(0); Asm
->EOL("DW_LNS_set_basic_block arg count");
2100 Asm
->EmitInt8(0); Asm
->EOL("DW_LNS_const_add_pc arg count");
2101 Asm
->EmitInt8(1); Asm
->EOL("DW_LNS_fixed_advance_pc arg count");
2103 // Emit directories.
2104 for (unsigned DI
= 1, DE
= getNumSourceDirectories()+1; DI
!= DE
; ++DI
) {
2105 Asm
->EmitString(getSourceDirectoryName(DI
));
2106 Asm
->EOL("Directory");
2109 Asm
->EmitInt8(0); Asm
->EOL("End of directories");
2112 for (unsigned SI
= 1, SE
= getNumSourceIds()+1; SI
!= SE
; ++SI
) {
2113 // Remember source id starts at 1.
2114 std::pair
<unsigned, unsigned> Id
= getSourceDirectoryAndFileIds(SI
);
2115 Asm
->EmitString(getSourceFileName(Id
.second
));
2117 Asm
->EmitULEB128Bytes(Id
.first
);
2118 Asm
->EOL("Directory #");
2119 Asm
->EmitULEB128Bytes(0);
2120 Asm
->EOL("Mod date");
2121 Asm
->EmitULEB128Bytes(0);
2122 Asm
->EOL("File size");
2125 Asm
->EmitInt8(0); Asm
->EOL("End of files");
2127 EmitLabel("line_prolog_end", 0);
2129 // A sequence for each text section.
2130 unsigned SecSrcLinesSize
= SectionSourceLines
.size();
2132 for (unsigned j
= 0; j
< SecSrcLinesSize
; ++j
) {
2133 // Isolate current sections line info.
2134 const std::vector
<SrcLineInfo
> &LineInfos
= SectionSourceLines
[j
];
2136 if (Asm
->isVerbose()) {
2137 const MCSection
*S
= SectionMap
[j
+ 1];
2138 O
<< '\t' << TAI
->getCommentString() << " Section"
2139 << S
->getName() << '\n';
2144 // Dwarf assumes we start with first line of first source file.
2145 unsigned Source
= 1;
2148 // Construct rows of the address, source, line, column matrix.
2149 for (unsigned i
= 0, N
= LineInfos
.size(); i
< N
; ++i
) {
2150 const SrcLineInfo
&LineInfo
= LineInfos
[i
];
2151 unsigned LabelID
= MMI
->MappedLabel(LineInfo
.getLabelID());
2152 if (!LabelID
) continue;
2154 if (!Asm
->isVerbose())
2157 std::pair
<unsigned, unsigned> SourceID
=
2158 getSourceDirectoryAndFileIds(LineInfo
.getSourceID());
2159 O
<< '\t' << TAI
->getCommentString() << ' '
2160 << getSourceDirectoryName(SourceID
.first
) << ' '
2161 << getSourceFileName(SourceID
.second
)
2162 <<" :" << utostr_32(LineInfo
.getLine()) << '\n';
2165 // Define the line address.
2166 Asm
->EmitInt8(0); Asm
->EOL("Extended Op");
2167 Asm
->EmitInt8(TD
->getPointerSize() + 1); Asm
->EOL("Op size");
2168 Asm
->EmitInt8(dwarf::DW_LNE_set_address
); Asm
->EOL("DW_LNE_set_address");
2169 EmitReference("label", LabelID
); Asm
->EOL("Location label");
2171 // If change of source, then switch to the new source.
2172 if (Source
!= LineInfo
.getSourceID()) {
2173 Source
= LineInfo
.getSourceID();
2174 Asm
->EmitInt8(dwarf::DW_LNS_set_file
); Asm
->EOL("DW_LNS_set_file");
2175 Asm
->EmitULEB128Bytes(Source
); Asm
->EOL("New Source");
2178 // If change of line.
2179 if (Line
!= LineInfo
.getLine()) {
2180 // Determine offset.
2181 int Offset
= LineInfo
.getLine() - Line
;
2182 int Delta
= Offset
- MinLineDelta
;
2185 Line
= LineInfo
.getLine();
2187 // If delta is small enough and in range...
2188 if (Delta
>= 0 && Delta
< (MaxLineDelta
- 1)) {
2189 // ... then use fast opcode.
2190 Asm
->EmitInt8(Delta
- MinLineDelta
); Asm
->EOL("Line Delta");
2192 // ... otherwise use long hand.
2193 Asm
->EmitInt8(dwarf::DW_LNS_advance_line
);
2194 Asm
->EOL("DW_LNS_advance_line");
2195 Asm
->EmitSLEB128Bytes(Offset
); Asm
->EOL("Line Offset");
2196 Asm
->EmitInt8(dwarf::DW_LNS_copy
); Asm
->EOL("DW_LNS_copy");
2199 // Copy the previous row (different address or source)
2200 Asm
->EmitInt8(dwarf::DW_LNS_copy
); Asm
->EOL("DW_LNS_copy");
2204 EmitEndOfLineMatrix(j
+ 1);
2207 if (SecSrcLinesSize
== 0)
2208 // Because we're emitting a debug_line section, we still need a line
2209 // table. The linker and friends expect it to exist. If there's nothing to
2210 // put into it, emit an empty table.
2211 EmitEndOfLineMatrix(1);
2213 EmitLabel("line_end", 0);
2217 /// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2219 void DwarfDebug::EmitCommonDebugFrame() {
2220 if (!TAI
->doesDwarfRequireFrameSection())
2224 Asm
->TM
.getFrameInfo()->getStackGrowthDirection() ==
2225 TargetFrameInfo::StackGrowsUp
?
2226 TD
->getPointerSize() : -TD
->getPointerSize();
2228 // Start the dwarf frame section.
2229 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfFrameSection());
2231 EmitLabel("debug_frame_common", 0);
2232 EmitDifference("debug_frame_common_end", 0,
2233 "debug_frame_common_begin", 0, true);
2234 Asm
->EOL("Length of Common Information Entry");
2236 EmitLabel("debug_frame_common_begin", 0);
2237 Asm
->EmitInt32((int)dwarf::DW_CIE_ID
);
2238 Asm
->EOL("CIE Identifier Tag");
2239 Asm
->EmitInt8(dwarf::DW_CIE_VERSION
);
2240 Asm
->EOL("CIE Version");
2241 Asm
->EmitString("");
2242 Asm
->EOL("CIE Augmentation");
2243 Asm
->EmitULEB128Bytes(1);
2244 Asm
->EOL("CIE Code Alignment Factor");
2245 Asm
->EmitSLEB128Bytes(stackGrowth
);
2246 Asm
->EOL("CIE Data Alignment Factor");
2247 Asm
->EmitInt8(RI
->getDwarfRegNum(RI
->getRARegister(), false));
2248 Asm
->EOL("CIE RA Column");
2250 std::vector
<MachineMove
> Moves
;
2251 RI
->getInitialFrameState(Moves
);
2253 EmitFrameMoves(NULL
, 0, Moves
, false);
2255 Asm
->EmitAlignment(2, 0, 0, false);
2256 EmitLabel("debug_frame_common_end", 0);
2261 /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2264 DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo
&DebugFrameInfo
){
2265 if (!TAI
->doesDwarfRequireFrameSection())
2268 // Start the dwarf frame section.
2269 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfFrameSection());
2271 EmitDifference("debug_frame_end", DebugFrameInfo
.Number
,
2272 "debug_frame_begin", DebugFrameInfo
.Number
, true);
2273 Asm
->EOL("Length of Frame Information Entry");
2275 EmitLabel("debug_frame_begin", DebugFrameInfo
.Number
);
2277 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2279 Asm
->EOL("FDE CIE offset");
2281 EmitReference("func_begin", DebugFrameInfo
.Number
);
2282 Asm
->EOL("FDE initial location");
2283 EmitDifference("func_end", DebugFrameInfo
.Number
,
2284 "func_begin", DebugFrameInfo
.Number
);
2285 Asm
->EOL("FDE address range");
2287 EmitFrameMoves("func_begin", DebugFrameInfo
.Number
, DebugFrameInfo
.Moves
,
2290 Asm
->EmitAlignment(2, 0, 0, false);
2291 EmitLabel("debug_frame_end", DebugFrameInfo
.Number
);
2296 void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit
*Unit
) {
2297 EmitDifference("pubnames_end", Unit
->getID(),
2298 "pubnames_begin", Unit
->getID(), true);
2299 Asm
->EOL("Length of Public Names Info");
2301 EmitLabel("pubnames_begin", Unit
->getID());
2303 Asm
->EmitInt16(dwarf::DWARF_VERSION
); Asm
->EOL("DWARF Version");
2305 EmitSectionOffset("info_begin", "section_info",
2306 Unit
->getID(), 0, true, false);
2307 Asm
->EOL("Offset of Compilation Unit Info");
2309 EmitDifference("info_end", Unit
->getID(), "info_begin", Unit
->getID(),
2311 Asm
->EOL("Compilation Unit Length");
2313 StringMap
<DIE
*> &Globals
= Unit
->getGlobals();
2314 for (StringMap
<DIE
*>::const_iterator
2315 GI
= Globals
.begin(), GE
= Globals
.end(); GI
!= GE
; ++GI
) {
2316 const char *Name
= GI
->getKeyData();
2317 DIE
* Entity
= GI
->second
;
2319 Asm
->EmitInt32(Entity
->getOffset()); Asm
->EOL("DIE offset");
2320 Asm
->EmitString(Name
, strlen(Name
)); Asm
->EOL("External Name");
2323 Asm
->EmitInt32(0); Asm
->EOL("End Mark");
2324 EmitLabel("pubnames_end", Unit
->getID());
2329 /// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2331 void DwarfDebug::EmitDebugPubNames() {
2332 // Start the dwarf pubnames section.
2333 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfPubNamesSection());
2335 EmitDebugPubNamesPerCU(ModuleCU
);
2338 /// EmitDebugStr - Emit visible names into a debug str section.
2340 void DwarfDebug::EmitDebugStr() {
2341 // Check to see if it is worth the effort.
2342 if (!StringPool
.empty()) {
2343 // Start the dwarf str section.
2344 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfStrSection());
2346 // For each of strings in the string pool.
2347 for (unsigned StringID
= 1, N
= StringPool
.size();
2348 StringID
<= N
; ++StringID
) {
2349 // Emit a label for reference from debug information entries.
2350 EmitLabel("string", StringID
);
2352 // Emit the string itself.
2353 const std::string
&String
= StringPool
[StringID
];
2354 Asm
->EmitString(String
); Asm
->EOL();
2361 /// EmitDebugLoc - Emit visible names into a debug loc section.
2363 void DwarfDebug::EmitDebugLoc() {
2364 // Start the dwarf loc section.
2365 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfLocSection());
2369 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2371 void DwarfDebug::EmitDebugARanges() {
2372 // Start the dwarf aranges section.
2373 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfARangesSection());
2377 CompileUnit
*Unit
= GetBaseCompileUnit();
2379 // Don't include size of length
2380 Asm
->EmitInt32(0x1c); Asm
->EOL("Length of Address Ranges Info");
2382 Asm
->EmitInt16(dwarf::DWARF_VERSION
); Asm
->EOL("Dwarf Version");
2384 EmitReference("info_begin", Unit
->getID());
2385 Asm
->EOL("Offset of Compilation Unit Info");
2387 Asm
->EmitInt8(TD
->getPointerSize()); Asm
->EOL("Size of Address");
2389 Asm
->EmitInt8(0); Asm
->EOL("Size of Segment Descriptor");
2391 Asm
->EmitInt16(0); Asm
->EOL("Pad (1)");
2392 Asm
->EmitInt16(0); Asm
->EOL("Pad (2)");
2395 EmitReference("text_begin", 0); Asm
->EOL("Address");
2396 EmitDifference("text_end", 0, "text_begin", 0, true); Asm
->EOL("Length");
2398 Asm
->EmitInt32(0); Asm
->EOL("EOM (1)");
2399 Asm
->EmitInt32(0); Asm
->EOL("EOM (2)");
2405 /// EmitDebugRanges - Emit visible names into a debug ranges section.
2407 void DwarfDebug::EmitDebugRanges() {
2408 // Start the dwarf ranges section.
2409 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfRangesSection());
2413 /// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2415 void DwarfDebug::EmitDebugMacInfo() {
2416 if (const MCSection
*LineInfo
=
2417 Asm
->getObjFileLowering().getDwarfMacroInfoSection()) {
2418 // Start the dwarf macinfo section.
2419 Asm
->SwitchToSection(LineInfo
);
2424 /// EmitDebugInlineInfo - Emit inline info using following format.
2426 /// 1. length of section
2427 /// 2. Dwarf version number
2428 /// 3. address size.
2430 /// Entries (one "entry" for each function that was inlined):
2432 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2433 /// otherwise offset into __debug_str for regular function name.
2434 /// 2. offset into __debug_str section for regular function name.
2435 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2436 /// instances for the function.
2438 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2439 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2440 /// __debug_info section, and the low_pc is the starting address for the
2441 /// inlining instance.
2442 void DwarfDebug::EmitDebugInlineInfo() {
2443 if (!TAI
->doesDwarfUsesInlineInfoSection())
2449 Asm
->SwitchToSection(Asm
->getObjFileLowering().getDwarfDebugInlineSection());
2451 EmitDifference("debug_inlined_end", 1,
2452 "debug_inlined_begin", 1, true);
2453 Asm
->EOL("Length of Debug Inlined Information Entry");
2455 EmitLabel("debug_inlined_begin", 1);
2457 Asm
->EmitInt16(dwarf::DWARF_VERSION
); Asm
->EOL("Dwarf Version");
2458 Asm
->EmitInt8(TD
->getPointerSize()); Asm
->EOL("Address Size (in bytes)");
2460 for (DenseMap
<GlobalVariable
*, SmallVector
<unsigned, 4> >::iterator
2461 I
= InlineInfo
.begin(), E
= InlineInfo
.end(); I
!= E
; ++I
) {
2462 GlobalVariable
*GV
= I
->first
;
2463 SmallVector
<unsigned, 4> &Labels
= I
->second
;
2464 DISubprogram
SP(GV
);
2468 SP
.getLinkageName(LName
);
2472 Asm
->EmitString(Name
);
2474 // Skip special LLVM prefix that is used to inform the asm printer to not emit
2475 // usual symbol prefix before the symbol name. This happens for Objective-C
2476 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
2479 Asm
->EmitString(LName
);
2481 Asm
->EOL("MIPS linkage name");
2483 Asm
->EmitString(Name
); Asm
->EOL("Function name");
2485 Asm
->EmitULEB128Bytes(Labels
.size()); Asm
->EOL("Inline count");
2487 for (SmallVector
<unsigned, 4>::iterator LI
= Labels
.begin(),
2488 LE
= Labels
.end(); LI
!= LE
; ++LI
) {
2489 DIE
*SP
= ModuleCU
->getDieMapSlotFor(GV
);
2490 Asm
->EmitInt32(SP
->getOffset()); Asm
->EOL("DIE offset");
2492 if (TD
->getPointerSize() == sizeof(int32_t))
2493 O
<< TAI
->getData32bitsDirective();
2495 O
<< TAI
->getData64bitsDirective();
2497 PrintLabelName("label", *LI
); Asm
->EOL("low_pc");
2501 EmitLabel("debug_inlined_end", 1);