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/TargetRegisterInfo.h"
28 #include "llvm/ADT/STLExtras.h"
29 #include "llvm/ADT/StringExtras.h"
30 #include "llvm/Support/Debug.h"
31 #include "llvm/Support/ErrorHandling.h"
32 #include "llvm/Support/ValueHandle.h"
33 #include "llvm/Support/FormattedStream.h"
34 #include "llvm/Support/Timer.h"
35 #include "llvm/System/Path.h"
38 //===----------------------------------------------------------------------===//
40 /// Configuration values for initial hash set sizes (log2).
42 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
46 //===----------------------------------------------------------------------===//
47 /// CompileUnit - This dwarf writer support class manages information associate
48 /// with a source file.
50 /// ID - File identifier for source.
54 /// Die - Compile unit debug information entry.
56 const OwningPtr<DIE> CUDie;
58 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
61 /// GVToDieMap - Tracks the mapping of unit level debug informaton
62 /// variables to debug information entries.
63 /// FIXME : Rename GVToDieMap -> NodeToDieMap
64 DenseMap<MDNode *, DIE *> GVToDieMap;
66 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
67 /// descriptors to debug information entries using a DIEEntry proxy.
69 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
71 /// Globals - A map of globally visible named entities for this unit.
73 StringMap<DIE*> Globals;
75 /// GlobalTypes - A map of globally visible types for this unit.
77 StringMap<DIE*> GlobalTypes;
80 CompileUnit(unsigned I, DIE *D)
81 : ID(I), CUDie(D), IndexTyDie(0) {}
84 unsigned getID() const { return ID; }
85 DIE* getCUDie() const { return CUDie.get(); }
86 const StringMap<DIE*> &getGlobals() const { return Globals; }
87 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
89 /// hasContent - Return true if this compile unit has something to write out.
91 bool hasContent() const { return !CUDie->getChildren().empty(); }
93 /// addGlobal - Add a new global entity to the compile unit.
95 void addGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
97 /// addGlobalType - Add a new global type to the compile unit.
99 void addGlobalType(const std::string &Name, DIE *Die) {
100 GlobalTypes[Name] = Die;
103 /// getDIE - Returns the debug information entry map slot for the
104 /// specified debug variable.
105 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
107 /// insertDIE - Insert DIE into the map.
108 void insertDIE(MDNode *N, DIE *D) {
109 GVToDieMap.insert(std::make_pair(N, D));
112 /// getDIEEntry - Returns the debug information entry for the speciefied
114 DIEEntry *getDIEEntry(MDNode *N) {
115 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
116 if (I == GVToDIEEntryMap.end())
121 /// insertDIEEntry - Insert debug information entry into the map.
122 void insertDIEEntry(MDNode *N, DIEEntry *E) {
123 GVToDIEEntryMap.insert(std::make_pair(N, E));
126 /// addDie - Adds or interns the DIE to the compile unit.
128 void addDie(DIE *Buffer) {
129 this->CUDie->addChild(Buffer);
132 // getIndexTyDie - Get an anonymous type for index type.
133 DIE *getIndexTyDie() {
137 // setIndexTyDie - Set D as anonymous type for index which can be reused
139 void setIndexTyDie(DIE *D) {
145 //===----------------------------------------------------------------------===//
146 /// DbgVariable - This class is used to track local variable information.
149 DIVariable Var; // Variable Descriptor.
150 unsigned FrameIndex; // Variable frame index.
151 const MachineInstr *DbgValueMInsn; // DBG_VALUE
152 DbgVariable *const AbstractVar; // Abstract variable for this variable.
155 // AbsVar may be NULL.
156 DbgVariable(DIVariable V, unsigned I, DbgVariable *AbsVar)
157 : Var(V), FrameIndex(I), DbgValueMInsn(0), AbstractVar(AbsVar), TheDIE(0) {}
158 DbgVariable(DIVariable V, const MachineInstr *MI, DbgVariable *AbsVar)
159 : Var(V), FrameIndex(0), DbgValueMInsn(MI), AbstractVar(AbsVar), TheDIE(0)
163 DIVariable getVariable() const { return Var; }
164 unsigned getFrameIndex() const { return FrameIndex; }
165 const MachineInstr *getDbgValue() const { return DbgValueMInsn; }
166 DbgVariable *getAbstractVariable() const { return AbstractVar; }
167 void setDIE(DIE *D) { TheDIE = D; }
168 DIE *getDIE() const { return TheDIE; }
171 //===----------------------------------------------------------------------===//
172 /// DbgScope - This class is used to track scope information.
175 DbgScope *Parent; // Parent to this scope.
176 DIDescriptor Desc; // Debug info descriptor for scope.
177 // Location at which this scope is inlined.
178 AssertingVH<MDNode> InlinedAtLocation;
179 bool AbstractScope; // Abstract Scope
180 MCSymbol *StartLabel; // Label ID of the beginning of scope.
181 MCSymbol *EndLabel; // Label ID of the end of scope.
182 const MachineInstr *LastInsn; // Last instruction of this scope.
183 const MachineInstr *FirstInsn; // First instruction of this scope.
184 // Scopes defined in scope. Contents not owned.
185 SmallVector<DbgScope *, 4> Scopes;
186 // Variables declared in scope. Contents owned.
187 SmallVector<DbgVariable *, 8> Variables;
189 // Private state for dump()
190 mutable unsigned IndentLevel;
192 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
193 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
194 StartLabel(0), EndLabel(0),
195 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
199 DbgScope *getParent() const { return Parent; }
200 void setParent(DbgScope *P) { Parent = P; }
201 DIDescriptor getDesc() const { return Desc; }
202 MDNode *getInlinedAt() const { return InlinedAtLocation; }
203 MDNode *getScopeNode() const { return Desc.getNode(); }
204 MCSymbol *getStartLabel() const { return StartLabel; }
205 MCSymbol *getEndLabel() const { return EndLabel; }
206 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
207 const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
208 void setStartLabel(MCSymbol *S) { StartLabel = S; }
209 void setEndLabel(MCSymbol *E) { EndLabel = E; }
210 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
211 const MachineInstr *getLastInsn() { return LastInsn; }
212 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
213 void setAbstractScope() { AbstractScope = true; }
214 bool isAbstractScope() const { return AbstractScope; }
215 const MachineInstr *getFirstInsn() { return FirstInsn; }
217 /// addScope - Add a scope to the scope.
219 void addScope(DbgScope *S) { Scopes.push_back(S); }
221 /// addVariable - Add a variable to the scope.
223 void addVariable(DbgVariable *V) { Variables.push_back(V); }
225 void fixInstructionMarkers(DenseMap<const MachineInstr *,
226 unsigned> &MIIndexMap) {
227 assert (getFirstInsn() && "First instruction is missing!");
229 // Use the end of last child scope as end of this scope.
230 const SmallVector<DbgScope *, 4> &Scopes = getScopes();
231 const MachineInstr *LastInsn = getFirstInsn();
233 if (Scopes.empty()) {
234 assert (getLastInsn() && "Inner most scope does not have last insn!");
237 for (SmallVector<DbgScope *, 4>::const_iterator SI = Scopes.begin(),
238 SE = Scopes.end(); SI != SE; ++SI) {
240 DS->fixInstructionMarkers(MIIndexMap);
241 const MachineInstr *DSLastInsn = DS->getLastInsn();
242 unsigned DSI = MIIndexMap[DSLastInsn];
244 LastInsn = DSLastInsn;
249 unsigned CurrentLastInsnIndex = 0;
250 if (const MachineInstr *CL = getLastInsn())
251 CurrentLastInsnIndex = MIIndexMap[CL];
252 unsigned FIndex = MIIndexMap[getFirstInsn()];
254 // Set LastInsn as the last instruction for this scope only if
256 // 1) this scope's first instruction and
257 // 2) current last instruction for this scope, if any.
258 if (LIndex >= CurrentLastInsnIndex && LIndex >= FIndex)
259 setLastInsn(LastInsn);
268 void DbgScope::dump() const {
269 raw_ostream &err = dbgs();
270 err.indent(IndentLevel);
271 MDNode *N = Desc.getNode();
273 err << " [" << StartLabel << ", " << EndLabel << "]\n";
275 err << "Abstract Scope\n";
279 err << "Children ...\n";
280 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
281 if (Scopes[i] != this)
288 DbgScope::~DbgScope() {
289 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
293 } // end llvm namespace
295 DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
296 : DwarfPrinter(OS, A, T), ModuleCU(0),
297 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
298 DIEValues(), SectionSourceLines(), didInitial(false), shouldEmit(false),
299 CurrentFnDbgScope(0), DebugTimer(0) {
300 NextStringPoolNumber = 0;
301 if (TimePassesIsEnabled)
302 DebugTimer = new Timer("Dwarf Debug Writer");
304 DwarfDebug::~DwarfDebug() {
305 for (unsigned j = 0, M = DIEValues.size(); j < M; ++j)
311 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
312 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
313 if (Entry.first) return Entry.first;
315 Entry.second = NextStringPoolNumber++;
316 return Entry.first = getDWLabel("string", Entry.second);
320 /// assignAbbrevNumber - Define a unique number for the abbreviation.
322 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
323 // Profile the node so that we can make it unique.
327 // Check the set for priors.
328 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
330 // If it's newly added.
331 if (InSet == &Abbrev) {
332 // Add to abbreviation list.
333 Abbreviations.push_back(&Abbrev);
335 // Assign the vector position + 1 as its number.
336 Abbrev.setNumber(Abbreviations.size());
338 // Assign existing abbreviation number.
339 Abbrev.setNumber(InSet->getNumber());
343 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
344 /// information entry.
345 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
346 DIEEntry *Value = new DIEEntry(Entry);
347 DIEValues.push_back(Value);
351 /// addUInt - Add an unsigned integer attribute data and value.
353 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
354 unsigned Form, uint64_t Integer) {
355 if (!Form) Form = DIEInteger::BestForm(false, Integer);
356 DIEValue *Value = new DIEInteger(Integer);
357 DIEValues.push_back(Value);
358 Die->addValue(Attribute, Form, Value);
361 /// addSInt - Add an signed integer attribute data and value.
363 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
364 unsigned Form, int64_t Integer) {
365 if (!Form) Form = DIEInteger::BestForm(true, Integer);
366 DIEValue *Value = new DIEInteger(Integer);
367 DIEValues.push_back(Value);
368 Die->addValue(Attribute, Form, Value);
371 /// addString - Add a string attribute data and value. DIEString only
372 /// keeps string reference.
373 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
375 DIEValue *Value = new DIEString(String);
376 DIEValues.push_back(Value);
377 Die->addValue(Attribute, Form, Value);
380 /// addLabel - Add a Dwarf label attribute data and value.
382 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
383 const MCSymbol *Label) {
384 DIEValue *Value = new DIELabel(Label);
385 DIEValues.push_back(Value);
386 Die->addValue(Attribute, Form, Value);
389 /// addSectionOffset - Add a section offset label attribute data and value.
391 void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
392 const MCSymbol *Label,const MCSymbol *Section,
394 DIEValue *Value = new DIESectionOffset(Label, Section, isEH);
395 DIEValues.push_back(Value);
396 Die->addValue(Attribute, Form, Value);
399 /// addDelta - Add a label delta attribute data and value.
401 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
402 const MCSymbol *Hi, const MCSymbol *Lo) {
403 DIEValue *Value = new DIEDelta(Hi, Lo);
404 DIEValues.push_back(Value);
405 Die->addValue(Attribute, Form, Value);
408 /// addBlock - Add block data.
410 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
412 Block->ComputeSize(TD);
413 DIEValues.push_back(Block);
414 Die->addValue(Attribute, Block->BestForm(), Block);
417 /// addSourceLine - Add location information to specified debug information
419 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
420 // If there is no compile unit specified, don't add a line #.
421 if (!V->getCompileUnit().Verify())
424 unsigned Line = V->getLineNumber();
425 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
426 V->getContext().getFilename());
427 assert(FileID && "Invalid file id");
428 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
429 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
432 /// addSourceLine - Add location information to specified debug information
434 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
435 // If there is no compile unit specified, don't add a line #.
436 if (!G->getCompileUnit().Verify())
439 unsigned Line = G->getLineNumber();
440 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
441 G->getContext().getFilename());
442 assert(FileID && "Invalid file id");
443 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
444 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
447 /// addSourceLine - Add location information to specified debug information
449 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
450 // If there is no compile unit specified, don't add a line #.
451 if (!SP->getCompileUnit().Verify())
453 // If the line number is 0, don't add it.
454 if (SP->getLineNumber() == 0)
457 unsigned Line = SP->getLineNumber();
458 if (!SP->getContext().Verify())
460 unsigned FileID = GetOrCreateSourceID(SP->getContext().getDirectory(),
461 SP->getContext().getFilename());
462 assert(FileID && "Invalid file id");
463 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
464 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
467 /// addSourceLine - Add location information to specified debug information
469 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
470 // If there is no compile unit specified, don't add a line #.
471 DICompileUnit CU = Ty->getCompileUnit();
475 unsigned Line = Ty->getLineNumber();
476 if (!Ty->getContext().Verify())
478 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
479 Ty->getContext().getFilename());
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);
485 /// addSourceLine - Add location information to specified debug information
487 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
488 // If there is no compile unit specified, don't add a line #.
489 if (!NS->getCompileUnit().Verify())
492 unsigned Line = NS->getLineNumber();
493 StringRef FN = NS->getFilename();
494 StringRef Dir = NS->getDirectory();
496 unsigned FileID = GetOrCreateSourceID(Dir, FN);
497 assert(FileID && "Invalid file id");
498 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
499 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
502 /* Byref variables, in Blocks, are declared by the programmer as
503 "SomeType VarName;", but the compiler creates a
504 __Block_byref_x_VarName struct, and gives the variable VarName
505 either the struct, or a pointer to the struct, as its type. This
506 is necessary for various behind-the-scenes things the compiler
507 needs to do with by-reference variables in blocks.
509 However, as far as the original *programmer* is concerned, the
510 variable should still have type 'SomeType', as originally declared.
512 The following function dives into the __Block_byref_x_VarName
513 struct to find the original type of the variable. This will be
514 passed back to the code generating the type for the Debug
515 Information Entry for the variable 'VarName'. 'VarName' will then
516 have the original type 'SomeType' in its debug information.
518 The original type 'SomeType' will be the type of the field named
519 'VarName' inside the __Block_byref_x_VarName struct.
521 NOTE: In order for this to not completely fail on the debugger
522 side, the Debug Information Entry for the variable VarName needs to
523 have a DW_AT_location that tells the debugger how to unwind through
524 the pointers and __Block_byref_x_VarName struct to find the actual
525 value of the variable. The function addBlockByrefType does this. */
527 /// Find the type the programmer originally declared the variable to be
528 /// and return that type.
530 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
533 unsigned tag = Ty.getTag();
535 if (tag == dwarf::DW_TAG_pointer_type) {
536 DIDerivedType DTy = DIDerivedType(Ty.getNode());
537 subType = DTy.getTypeDerivedFrom();
540 DICompositeType blockStruct = DICompositeType(subType.getNode());
541 DIArray Elements = blockStruct.getTypeArray();
543 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
544 DIDescriptor Element = Elements.getElement(i);
545 DIDerivedType DT = DIDerivedType(Element.getNode());
546 if (Name == DT.getName())
547 return (DT.getTypeDerivedFrom());
553 /// addComplexAddress - Start with the address based on the location provided,
554 /// and generate the DWARF information necessary to find the actual variable
555 /// given the extra address information encoded in the DIVariable, starting from
556 /// the starting location. Add the DWARF information to the die.
558 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
560 const MachineLocation &Location) {
561 const DIVariable &VD = DV->getVariable();
562 DIType Ty = VD.getType();
564 // Decode the original location, and use that as the start of the byref
565 // variable's location.
566 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
567 DIEBlock *Block = new DIEBlock();
569 if (Location.isReg()) {
571 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
573 Reg = Reg - dwarf::DW_OP_reg0;
574 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
575 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
579 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
581 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
582 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
585 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
588 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
589 uint64_t Element = VD.getAddrElement(i);
591 if (Element == DIFactory::OpPlus) {
592 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
593 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
594 } else if (Element == DIFactory::OpDeref) {
595 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
596 } else llvm_unreachable("unknown DIFactory Opcode");
599 // Now attach the location information to the DIE.
600 addBlock(Die, Attribute, 0, Block);
603 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
604 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
605 gives the variable VarName either the struct, or a pointer to the struct, as
606 its type. This is necessary for various behind-the-scenes things the
607 compiler needs to do with by-reference variables in Blocks.
609 However, as far as the original *programmer* is concerned, the variable
610 should still have type 'SomeType', as originally declared.
612 The function getBlockByrefType dives into the __Block_byref_x_VarName
613 struct to find the original type of the variable, which is then assigned to
614 the variable's Debug Information Entry as its real type. So far, so good.
615 However now the debugger will expect the variable VarName to have the type
616 SomeType. So we need the location attribute for the variable to be an
617 expression that explains to the debugger how to navigate through the
618 pointers and struct to find the actual variable of type SomeType.
620 The following function does just that. We start by getting
621 the "normal" location for the variable. This will be the location
622 of either the struct __Block_byref_x_VarName or the pointer to the
623 struct __Block_byref_x_VarName.
625 The struct will look something like:
627 struct __Block_byref_x_VarName {
629 struct __Block_byref_x_VarName *forwarding;
630 ... <various other fields>
632 ... <maybe more fields>
635 If we are given the struct directly (as our starting point) we
636 need to tell the debugger to:
638 1). Add the offset of the forwarding field.
640 2). Follow that pointer to get the real __Block_byref_x_VarName
641 struct to use (the real one may have been copied onto the heap).
643 3). Add the offset for the field VarName, to find the actual variable.
645 If we started with a pointer to the struct, then we need to
646 dereference that pointer first, before the other steps.
647 Translating this into DWARF ops, we will need to append the following
648 to the current location description for the variable:
650 DW_OP_deref -- optional, if we start with a pointer
651 DW_OP_plus_uconst <forward_fld_offset>
653 DW_OP_plus_uconst <varName_fld_offset>
655 That is what this function does. */
657 /// addBlockByrefAddress - Start with the address based on the location
658 /// provided, and generate the DWARF information necessary to find the
659 /// actual Block variable (navigating the Block struct) based on the
660 /// starting location. Add the DWARF information to the die. For
661 /// more information, read large comment just above here.
663 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
665 const MachineLocation &Location) {
666 const DIVariable &VD = DV->getVariable();
667 DIType Ty = VD.getType();
669 unsigned Tag = Ty.getTag();
670 bool isPointer = false;
672 StringRef varName = VD.getName();
674 if (Tag == dwarf::DW_TAG_pointer_type) {
675 DIDerivedType DTy = DIDerivedType(Ty.getNode());
676 TmpTy = DTy.getTypeDerivedFrom();
680 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
682 // Find the __forwarding field and the variable field in the __Block_byref
684 DIArray Fields = blockStruct.getTypeArray();
685 DIDescriptor varField = DIDescriptor();
686 DIDescriptor forwardingField = DIDescriptor();
688 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
689 DIDescriptor Element = Fields.getElement(i);
690 DIDerivedType DT = DIDerivedType(Element.getNode());
691 StringRef fieldName = DT.getName();
692 if (fieldName == "__forwarding")
693 forwardingField = Element;
694 else if (fieldName == varName)
698 // Get the offsets for the forwarding field and the variable field.
699 unsigned int forwardingFieldOffset =
700 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
701 unsigned int varFieldOffset =
702 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
704 // Decode the original location, and use that as the start of the byref
705 // variable's location.
706 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
707 DIEBlock *Block = new DIEBlock();
709 if (Location.isReg()) {
711 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
713 Reg = Reg - dwarf::DW_OP_reg0;
714 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
715 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
719 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
721 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
722 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
725 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
728 // If we started with a pointer to the __Block_byref... struct, then
729 // the first thing we need to do is dereference the pointer (DW_OP_deref).
731 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
733 // Next add the offset for the '__forwarding' field:
734 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
735 // adding the offset if it's 0.
736 if (forwardingFieldOffset > 0) {
737 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
738 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
741 // Now dereference the __forwarding field to get to the real __Block_byref
742 // struct: DW_OP_deref.
743 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
745 // Now that we've got the real __Block_byref... struct, add the offset
746 // for the variable's field to get to the location of the actual variable:
747 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
748 if (varFieldOffset > 0) {
749 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
750 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
753 // Now attach the location information to the DIE.
754 addBlock(Die, Attribute, 0, Block);
757 /// addAddress - Add an address attribute to a die based on the location
759 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
760 const MachineLocation &Location) {
761 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
762 DIEBlock *Block = new DIEBlock();
764 if (Location.isReg()) {
766 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
768 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
769 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
773 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
775 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
776 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
779 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
782 addBlock(Die, Attribute, 0, Block);
785 /// addToContextOwner - Add Die into the list of its context owner's children.
786 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
787 if (Context.isType()) {
788 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
789 ContextDIE->addChild(Die);
790 } else if (Context.isNameSpace()) {
791 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
792 ContextDIE->addChild(Die);
793 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
794 ContextDIE->addChild(Die);
796 ModuleCU->addDie(Die);
799 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
801 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
802 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
807 TyDIE = new DIE(dwarf::DW_TAG_base_type);
808 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
809 if (Ty.isBasicType())
810 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
811 else if (Ty.isCompositeType())
812 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
814 assert(Ty.isDerivedType() && "Unknown kind of DIType");
815 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
818 addToContextOwner(TyDIE, Ty.getContext());
822 /// addType - Add a new type attribute to the specified entity.
823 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
827 // Check for pre-existence.
828 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
829 // If it exists then use the existing value.
831 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
836 DIE *Buffer = getOrCreateTypeDIE(Ty);
839 Entry = createDIEEntry(Buffer);
840 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
842 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
845 /// constructTypeDIE - Construct basic type die from DIBasicType.
846 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
847 // Get core information.
848 StringRef Name = BTy.getName();
849 Buffer.setTag(dwarf::DW_TAG_base_type);
850 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
853 // Add name if not anonymous or intermediate type.
855 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
856 uint64_t Size = BTy.getSizeInBits() >> 3;
857 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
860 /// constructTypeDIE - Construct derived type die from DIDerivedType.
861 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
862 // Get core information.
863 StringRef Name = DTy.getName();
864 uint64_t Size = DTy.getSizeInBits() >> 3;
865 unsigned Tag = DTy.getTag();
867 // FIXME - Workaround for templates.
868 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
872 // Map to main type, void will not have a type.
873 DIType FromTy = DTy.getTypeDerivedFrom();
874 addType(&Buffer, FromTy);
876 // Add name if not anonymous or intermediate type.
878 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
880 // Add size if non-zero (derived types might be zero-sized.)
882 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
884 // Add source line info if available and TyDesc is not a forward declaration.
885 if (!DTy.isForwardDecl())
886 addSourceLine(&Buffer, &DTy);
889 /// constructTypeDIE - Construct type DIE from DICompositeType.
890 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
891 // Get core information.
892 StringRef Name = CTy.getName();
894 uint64_t Size = CTy.getSizeInBits() >> 3;
895 unsigned Tag = CTy.getTag();
899 case dwarf::DW_TAG_vector_type:
900 case dwarf::DW_TAG_array_type:
901 constructArrayTypeDIE(Buffer, &CTy);
903 case dwarf::DW_TAG_enumeration_type: {
904 DIArray Elements = CTy.getTypeArray();
906 // Add enumerators to enumeration type.
907 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
909 DIDescriptor Enum(Elements.getElement(i).getNode());
910 if (Enum.isEnumerator()) {
911 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum.getNode()));
912 Buffer.addChild(ElemDie);
917 case dwarf::DW_TAG_subroutine_type: {
919 DIArray Elements = CTy.getTypeArray();
920 DIDescriptor RTy = Elements.getElement(0);
921 addType(&Buffer, DIType(RTy.getNode()));
923 // Add prototype flag.
924 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
927 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
928 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
929 DIDescriptor Ty = Elements.getElement(i);
930 addType(Arg, DIType(Ty.getNode()));
931 Buffer.addChild(Arg);
935 case dwarf::DW_TAG_structure_type:
936 case dwarf::DW_TAG_union_type:
937 case dwarf::DW_TAG_class_type: {
938 // Add elements to structure type.
939 DIArray Elements = CTy.getTypeArray();
941 // A forward struct declared type may not have elements available.
942 unsigned N = Elements.getNumElements();
946 // Add elements to structure type.
947 for (unsigned i = 0; i < N; ++i) {
948 DIDescriptor Element = Elements.getElement(i);
950 if (Element.isSubprogram())
951 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
952 else if (Element.isVariable()) {
953 DIVariable DV(Element.getNode());
954 ElemDie = new DIE(dwarf::DW_TAG_variable);
955 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
957 addType(ElemDie, DV.getType());
958 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
959 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
960 addSourceLine(ElemDie, &DV);
961 } else if (Element.isDerivedType())
962 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
965 Buffer.addChild(ElemDie);
968 if (CTy.isAppleBlockExtension())
969 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
971 unsigned RLang = CTy.getRunTimeLang();
973 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
974 dwarf::DW_FORM_data1, RLang);
976 DICompositeType ContainingType = CTy.getContainingType();
977 if (DIDescriptor(ContainingType.getNode()).isCompositeType())
978 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
979 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
986 // Add name if not anonymous or intermediate type.
988 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
990 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
991 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
992 // Add size if non-zero (derived types might be zero-sized.)
994 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
996 // Add zero size if it is not a forward declaration.
997 if (CTy.isForwardDecl())
998 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1000 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1003 // Add source line info if available.
1004 if (!CTy.isForwardDecl())
1005 addSourceLine(&Buffer, &CTy);
1009 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1010 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1011 int64_t L = SR.getLo();
1012 int64_t H = SR.getHi();
1013 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1015 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1017 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1018 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1020 Buffer.addChild(DW_Subrange);
1023 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1024 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1025 DICompositeType *CTy) {
1026 Buffer.setTag(dwarf::DW_TAG_array_type);
1027 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1028 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1030 // Emit derived type.
1031 addType(&Buffer, CTy->getTypeDerivedFrom());
1032 DIArray Elements = CTy->getTypeArray();
1034 // Get an anonymous type for index type.
1035 DIE *IdxTy = ModuleCU->getIndexTyDie();
1037 // Construct an anonymous type for index type.
1038 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1039 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1040 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1041 dwarf::DW_ATE_signed);
1042 ModuleCU->addDie(IdxTy);
1043 ModuleCU->setIndexTyDie(IdxTy);
1046 // Add subranges to array type.
1047 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1048 DIDescriptor Element = Elements.getElement(i);
1049 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1050 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1054 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1055 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1056 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1057 StringRef Name = ETy.getName();
1058 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1059 int64_t Value = ETy.getEnumValue();
1060 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1064 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1065 /// printer to not emit usual symbol prefix before the symbol name is used then
1066 /// return linkage name after skipping this special LLVM prefix.
1067 static StringRef getRealLinkageName(StringRef LinkageName) {
1069 if (LinkageName.startswith(StringRef(&One, 1)))
1070 return LinkageName.substr(1);
1074 /// createGlobalVariableDIE - Create new DIE using GV.
1075 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1076 // If the global variable was optmized out then no need to create debug info
1078 if (!GV.getGlobal()) return NULL;
1079 if (GV.getDisplayName().empty()) return NULL;
1081 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1082 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1083 GV.getDisplayName());
1085 StringRef LinkageName = GV.getLinkageName();
1086 if (!LinkageName.empty())
1087 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1088 getRealLinkageName(LinkageName));
1090 addType(GVDie, GV.getType());
1091 if (!GV.isLocalToUnit())
1092 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1093 addSourceLine(GVDie, &GV);
1098 /// createMemberDIE - Create new member DIE.
1099 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1100 DIE *MemberDie = new DIE(DT.getTag());
1101 StringRef Name = DT.getName();
1103 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1105 addType(MemberDie, DT.getTypeDerivedFrom());
1107 addSourceLine(MemberDie, &DT);
1109 DIEBlock *MemLocationDie = new DIEBlock();
1110 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1112 uint64_t Size = DT.getSizeInBits();
1113 uint64_t FieldSize = DT.getOriginalTypeSize();
1115 if (Size != FieldSize) {
1117 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1118 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1120 uint64_t Offset = DT.getOffsetInBits();
1121 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1122 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1123 uint64_t FieldOffset = (HiMark - FieldSize);
1124 Offset -= FieldOffset;
1126 // Maybe we need to work from the other end.
1127 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1128 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1130 // Here WD_AT_data_member_location points to the anonymous
1131 // field that includes this bit field.
1132 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1135 // This is not a bitfield.
1136 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1138 if (DT.getTag() == dwarf::DW_TAG_inheritance
1139 && DT.isVirtual()) {
1141 // For C++, virtual base classes are not at fixed offset. Use following
1142 // expression to extract appropriate offset from vtable.
1143 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1145 DIEBlock *VBaseLocationDie = new DIEBlock();
1146 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1147 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1148 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1149 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1150 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1151 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1152 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1154 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1157 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1159 if (DT.isProtected())
1160 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1161 dwarf::DW_ACCESS_protected);
1162 else if (DT.isPrivate())
1163 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1164 dwarf::DW_ACCESS_private);
1165 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1166 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1167 dwarf::DW_ACCESS_public);
1169 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1170 dwarf::DW_VIRTUALITY_virtual);
1174 /// createSubprogramDIE - Create new DIE using SP.
1175 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1176 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1180 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1181 // Constructors and operators for anonymous aggregates do not have names.
1182 if (!SP.getName().empty())
1183 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1185 StringRef LinkageName = SP.getLinkageName();
1186 if (!LinkageName.empty())
1187 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1188 getRealLinkageName(LinkageName));
1190 addSourceLine(SPDie, &SP);
1192 // Add prototyped tag, if C or ObjC.
1193 unsigned Lang = SP.getCompileUnit().getLanguage();
1194 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1195 Lang == dwarf::DW_LANG_ObjC)
1196 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1199 DICompositeType SPTy = SP.getType();
1200 DIArray Args = SPTy.getTypeArray();
1201 unsigned SPTag = SPTy.getTag();
1203 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1204 addType(SPDie, SPTy);
1206 addType(SPDie, DIType(Args.getElement(0).getNode()));
1208 unsigned VK = SP.getVirtuality();
1210 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1211 DIEBlock *Block = new DIEBlock();
1212 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1213 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1214 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1215 ContainingTypeMap.insert(std::make_pair(SPDie,
1216 SP.getContainingType().getNode()));
1219 if (MakeDecl || !SP.isDefinition()) {
1220 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1222 // Add arguments. Do not add arguments for subprogram definition. They will
1223 // be handled while processing variables.
1224 DICompositeType SPTy = SP.getType();
1225 DIArray Args = SPTy.getTypeArray();
1226 unsigned SPTag = SPTy.getTag();
1228 if (SPTag == dwarf::DW_TAG_subroutine_type)
1229 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1230 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1231 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1233 if (ATy.isArtificial())
1234 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1235 SPDie->addChild(Arg);
1239 if (SP.isArtificial())
1240 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1242 // DW_TAG_inlined_subroutine may refer to this DIE.
1243 ModuleCU->insertDIE(SP.getNode(), SPDie);
1247 /// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
1248 /// Initialize scope and update scope hierarchy.
1249 DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1250 MDNode *InlinedAt) {
1251 assert (N && "Invalid Scope encoding!");
1252 assert (MI && "Missing machine instruction!");
1253 bool GetConcreteScope = (MI && InlinedAt);
1255 DbgScope *NScope = NULL;
1258 NScope = DbgScopeMap.lookup(InlinedAt);
1260 NScope = DbgScopeMap.lookup(N);
1261 assert (NScope && "Unable to find working scope!");
1263 if (NScope->getFirstInsn())
1266 DbgScope *Parent = NULL;
1267 if (GetConcreteScope) {
1268 DILocation IL(InlinedAt);
1269 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1270 IL.getOrigLocation().getNode());
1271 assert (Parent && "Unable to find Parent scope!");
1272 NScope->setParent(Parent);
1273 Parent->addScope(NScope);
1274 } else if (DIDescriptor(N).isLexicalBlock()) {
1275 DILexicalBlock DB(N);
1276 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1277 NScope->setParent(Parent);
1278 Parent->addScope(NScope);
1281 NScope->setFirstInsn(MI);
1283 if (!Parent && !InlinedAt) {
1284 StringRef SPName = DISubprogram(N).getLinkageName();
1285 if (SPName == MF->getFunction()->getName())
1286 CurrentFnDbgScope = NScope;
1289 if (GetConcreteScope) {
1290 ConcreteScopes[InlinedAt] = NScope;
1291 getOrCreateAbstractScope(N);
1297 DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1298 assert (N && "Invalid Scope encoding!");
1300 DbgScope *AScope = AbstractScopes.lookup(N);
1304 DbgScope *Parent = NULL;
1306 DIDescriptor Scope(N);
1307 if (Scope.isLexicalBlock()) {
1308 DILexicalBlock DB(N);
1309 DIDescriptor ParentDesc = DB.getContext();
1310 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1313 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1316 Parent->addScope(AScope);
1317 AScope->setAbstractScope();
1318 AbstractScopes[N] = AScope;
1319 if (DIDescriptor(N).isSubprogram())
1320 AbstractScopesList.push_back(AScope);
1324 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1325 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1326 /// If there are global variables in this scope then create and insert
1327 /// DIEs for these variables.
1328 DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1329 DIE *SPDie = ModuleCU->getDIE(SPNode);
1330 assert(SPDie && "Unable to find subprogram DIE!");
1331 DISubprogram SP(SPNode);
1333 // There is not any need to generate specification DIE for a function
1334 // defined at compile unit level. If a function is defined inside another
1335 // function then gdb prefers the definition at top level and but does not
1336 // expect specification DIE in parent function. So avoid creating
1337 // specification DIE for a function defined inside a function.
1338 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1339 !SP.getContext().isFile() && !SP.getContext().isSubprogram()) {
1340 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1343 DICompositeType SPTy = SP.getType();
1344 DIArray Args = SPTy.getTypeArray();
1345 unsigned SPTag = SPTy.getTag();
1346 if (SPTag == dwarf::DW_TAG_subroutine_type)
1347 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1348 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1349 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1351 if (ATy.isArtificial())
1352 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1353 SPDie->addChild(Arg);
1355 DIE *SPDeclDie = SPDie;
1356 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1357 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1359 ModuleCU->addDie(SPDie);
1362 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1363 getDWLabel("func_begin", SubprogramCount));
1364 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1365 getDWLabel("func_end", SubprogramCount));
1366 MachineLocation Location(RI->getFrameRegister(*MF));
1367 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1369 if (!DISubprogram(SPNode).isLocalToUnit())
1370 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1375 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1376 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1377 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1378 MCSymbol *Start = Scope->getStartLabel();
1379 MCSymbol *End = Scope->getEndLabel();
1380 if (Start == 0) return 0;
1382 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1383 assert(End->isDefined() && "Invalid end label for an inlined scope!");
1385 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1386 if (Scope->isAbstractScope())
1389 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1390 Start ? Start : getDWLabel("func_begin", SubprogramCount));
1391 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1392 End ? End : getDWLabel("func_end", SubprogramCount));
1397 /// constructInlinedScopeDIE - This scope represents inlined body of
1398 /// a function. Construct DIE to represent this concrete inlined copy
1399 /// of the function.
1400 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1401 MCSymbol *StartLabel = Scope->getStartLabel();
1402 MCSymbol *EndLabel = Scope->getEndLabel();
1403 if (StartLabel == 0) return 0;
1405 assert(StartLabel->isDefined() &&
1406 "Invalid starting label for an inlined scope!");
1407 assert(EndLabel->isDefined() &&
1408 "Invalid end label for an inlined scope!");
1409 if (!Scope->getScopeNode())
1411 DIScope DS(Scope->getScopeNode());
1412 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1414 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1415 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1416 assert (OriginDIE && "Unable to find Origin DIE!");
1417 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1418 dwarf::DW_FORM_ref4, OriginDIE);
1420 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1421 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1423 InlinedSubprogramDIEs.insert(OriginDIE);
1425 // Track the start label for this inlined function.
1426 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1427 I = InlineInfo.find(InlinedSP.getNode());
1429 if (I == InlineInfo.end()) {
1430 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1432 InlinedSPNodes.push_back(InlinedSP.getNode());
1434 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1436 DILocation DL(Scope->getInlinedAt());
1437 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1438 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1444 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1445 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1446 // Get the descriptor.
1447 const DIVariable &VD = DV->getVariable();
1448 StringRef Name = VD.getName();
1452 // Translate tag to proper Dwarf tag. The result variable is dropped for
1455 switch (VD.getTag()) {
1456 case dwarf::DW_TAG_return_variable:
1458 case dwarf::DW_TAG_arg_variable:
1459 Tag = dwarf::DW_TAG_formal_parameter;
1461 case dwarf::DW_TAG_auto_variable: // fall thru
1463 Tag = dwarf::DW_TAG_variable;
1467 // Define variable debug information entry.
1468 DIE *VariableDie = new DIE(Tag);
1472 if (DbgVariable *AV = DV->getAbstractVariable())
1473 AbsDIE = AV->getDIE();
1476 DIScope DS(Scope->getScopeNode());
1477 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1478 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1480 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1481 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1482 assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
1483 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1484 dwarf::DW_FORM_ref4, AbsDIE);
1487 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1488 addSourceLine(VariableDie, &VD);
1490 // Add variable type.
1491 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1492 // addresses instead.
1493 if (VD.isBlockByrefVariable())
1494 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1496 addType(VariableDie, VD.getType());
1499 // Add variable address.
1500 if (!Scope->isAbstractScope()) {
1501 // Check if variable is described by DBG_VALUE instruction.
1502 if (const MachineInstr *DbgValueInsn = DV->getDbgValue()) {
1503 if (DbgValueInsn->getNumOperands() == 3) {
1504 // FIXME : Handle getNumOperands != 3
1505 if (DbgValueInsn->getOperand(0).getType()
1506 == MachineOperand::MO_Register
1507 && DbgValueInsn->getOperand(0).getReg()) {
1508 MachineLocation Location;
1509 Location.set(DbgValueInsn->getOperand(0).getReg());
1510 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1511 } else if (DbgValueInsn->getOperand(0).getType() ==
1512 MachineOperand::MO_Immediate) {
1513 DIEBlock *Block = new DIEBlock();
1514 unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1515 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1516 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1518 //FIXME : Handle other operand types.
1524 MachineLocation Location;
1526 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1527 Location.set(FrameReg, Offset);
1529 if (VD.hasComplexAddress())
1530 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1531 else if (VD.isBlockByrefVariable())
1532 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1534 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1538 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1539 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1540 DV->setDIE(VariableDie);
1545 void DwarfDebug::addPubTypes(DISubprogram SP) {
1546 DICompositeType SPTy = SP.getType();
1547 unsigned SPTag = SPTy.getTag();
1548 if (SPTag != dwarf::DW_TAG_subroutine_type)
1551 DIArray Args = SPTy.getTypeArray();
1552 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1553 DIType ATy(Args.getElement(i).getNode());
1556 DICompositeType CATy = getDICompositeType(ATy);
1557 if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1558 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1559 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1564 /// constructScopeDIE - Construct a DIE for this scope.
1565 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1566 if (!Scope || !Scope->getScopeNode())
1569 DIScope DS(Scope->getScopeNode());
1570 DIE *ScopeDIE = NULL;
1571 if (Scope->getInlinedAt())
1572 ScopeDIE = constructInlinedScopeDIE(Scope);
1573 else if (DS.isSubprogram()) {
1574 if (Scope->isAbstractScope())
1575 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1577 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1580 ScopeDIE = constructLexicalScopeDIE(Scope);
1581 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 // FIXME: Why getting the delta between two identical labels??
1670 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1671 getTempLabel("section_line"), getTempLabel("section_line"),
1673 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1674 DIUnit.getProducer());
1675 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1676 DIUnit.getLanguage());
1677 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1680 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1681 if (DIUnit.isOptimized())
1682 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1684 StringRef Flags = DIUnit.getFlags();
1686 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1688 unsigned RVer = DIUnit.getRunTimeVersion();
1690 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1691 dwarf::DW_FORM_data1, RVer);
1694 "ModuleCU assigned since the top of constructCompileUnit");
1695 ModuleCU = new CompileUnit(ID, Die);
1698 void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1699 DIGlobalVariable DI_GV(N);
1701 // If debug information is malformed then ignore it.
1702 if (DI_GV.Verify() == false)
1705 // Check for pre-existence.
1706 if (ModuleCU->getDIE(DI_GV.getNode()))
1709 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1714 ModuleCU->insertDIE(N, VariableDie);
1716 // Add to context owner.
1717 DIDescriptor GVContext = DI_GV.getContext();
1718 // Do not create specification DIE if context is either compile unit
1720 if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1721 && !GVContext.isFile() && !GVContext.isSubprogram()) {
1722 // Create specification DIE.
1723 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1724 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1725 dwarf::DW_FORM_ref4, VariableDie);
1726 DIEBlock *Block = new DIEBlock();
1727 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1728 addLabel(Block, 0, dwarf::DW_FORM_udata,
1729 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1730 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1731 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1732 ModuleCU->addDie(VariableSpecDIE);
1734 DIEBlock *Block = new DIEBlock();
1735 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1736 addLabel(Block, 0, dwarf::DW_FORM_udata,
1737 Asm->Mang->getSymbol(DI_GV.getGlobal()));
1738 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1740 addToContextOwner(VariableDie, GVContext);
1742 // Expose as global. FIXME - need to check external flag.
1743 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1745 DIType GTy = DI_GV.getType();
1746 if (GTy.isCompositeType() && !GTy.getName().empty()) {
1747 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1748 assert (Entry && "Missing global type!");
1749 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1754 void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1757 // Check for pre-existence.
1758 if (ModuleCU->getDIE(N))
1761 if (!SP.isDefinition())
1762 // This is a method declaration which will be handled while constructing
1766 DIE *SubprogramDie = createSubprogramDIE(SP);
1769 ModuleCU->insertDIE(N, SubprogramDie);
1771 // Add to context owner.
1772 addToContextOwner(SubprogramDie, SP.getContext());
1774 // Expose as global.
1775 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1780 /// beginModule - Emit all Dwarf sections that should come prior to the
1781 /// content. Create global DIEs and emit initial debug info sections.
1782 /// This is inovked by the target AsmPrinter.
1783 void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1786 if (TimePassesIsEnabled)
1787 DebugTimer->startTimer();
1789 if (!MAI->doesSupportDebugInformation())
1792 DebugInfoFinder DbgFinder;
1793 DbgFinder.processModule(*M);
1795 // Create all the compile unit DIEs.
1796 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1797 E = DbgFinder.compile_unit_end(); I != E; ++I)
1798 constructCompileUnit(*I);
1803 // Create DIEs for each subprogram.
1804 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1805 E = DbgFinder.subprogram_end(); I != E; ++I)
1806 constructSubprogramDIE(*I);
1808 // Create DIEs for each global variable.
1809 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1810 E = DbgFinder.global_variable_end(); I != E; ++I)
1811 constructGlobalVariableDIE(*I);
1815 MMI->setDebugInfoAvailability(true);
1817 // Prime section data.
1818 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1820 // Print out .file directives to specify files for .loc directives. These are
1821 // printed out early so that they precede any .loc directives.
1822 if (MAI->hasDotLocAndDotFile()) {
1823 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1824 // Remember source id starts at 1.
1825 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1826 // FIXME: don't use sys::path for this! This should not depend on the
1828 sys::Path FullPath(getSourceDirectoryName(Id.first));
1830 FullPath.appendComponent(getSourceFileName(Id.second));
1831 assert(AppendOk && "Could not append filename to directory!");
1833 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1837 // Emit initial sections
1840 if (TimePassesIsEnabled)
1841 DebugTimer->stopTimer();
1844 /// endModule - Emit all Dwarf sections that should come after the content.
1846 void DwarfDebug::endModule() {
1850 if (TimePassesIsEnabled)
1851 DebugTimer->startTimer();
1853 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1854 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1855 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1857 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1860 // Insert top level DIEs.
1861 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1862 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1863 ModuleCU->getCUDie()->addChild(*TI);
1865 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1866 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1867 DIE *SPDie = CI->first;
1868 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1870 DIE *NDie = ModuleCU->getDIE(N);
1871 if (!NDie) continue;
1872 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1873 // FIXME - This is not the correct approach.
1874 // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1877 // Standard sections final addresses.
1878 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1879 Asm->OutStreamer.EmitLabel(getTempLabel("text_end"));
1880 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1881 Asm->OutStreamer.EmitLabel(getTempLabel("data_end"));
1883 // End text sections.
1884 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1885 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1886 Asm->OutStreamer.EmitLabel(getDWLabel("section_end", i));
1889 // Emit common frame information.
1890 emitCommonDebugFrame();
1892 // Emit function debug frame information
1893 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1894 E = DebugFrames.end(); I != E; ++I)
1895 emitFunctionDebugFrame(*I);
1897 // Compute DIE offsets and sizes.
1898 computeSizeAndOffsets();
1900 // Emit all the DIEs into a debug info section
1903 // Corresponding abbreviations into a abbrev section.
1904 emitAbbreviations();
1906 // Emit source line correspondence into a debug line section.
1909 // Emit info into a debug pubnames section.
1910 emitDebugPubNames();
1912 // Emit info into a debug pubtypes section.
1913 emitDebugPubTypes();
1915 // Emit info into a debug loc section.
1918 // Emit info into a debug aranges section.
1921 // Emit info into a debug ranges section.
1924 // Emit info into a debug macinfo section.
1927 // Emit inline info.
1928 emitDebugInlineInfo();
1930 // Emit info into a debug str section.
1934 ModuleCU = NULL; // Reset for the next Module, if any.
1936 if (TimePassesIsEnabled)
1937 DebugTimer->stopTimer();
1940 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1941 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1943 DILocation &ScopeLoc) {
1945 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1947 return AbsDbgVariable;
1949 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1953 AbsDbgVariable = new DbgVariable(Var, FrameIdx,
1954 NULL /* No more-abstract variable*/);
1955 Scope->addVariable(AbsDbgVariable);
1956 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1957 return AbsDbgVariable;
1960 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1961 /// FIXME : Refactor findAbstractVariable.
1962 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1963 const MachineInstr *MI,
1964 DILocation &ScopeLoc) {
1966 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1968 return AbsDbgVariable;
1970 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1974 AbsDbgVariable = new DbgVariable(Var, MI,
1975 NULL /* No more-abstract variable*/);
1976 Scope->addVariable(AbsDbgVariable);
1977 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1978 return AbsDbgVariable;
1981 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1982 void DwarfDebug::collectVariableInfo() {
1985 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1986 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1987 VE = VMap.end(); VI != VE; ++VI) {
1988 MDNode *Var = VI->first;
1990 DIVariable DV (Var);
1991 std::pair< unsigned, MDNode *> VP = VI->second;
1992 DILocation ScopeLoc(VP.second);
1995 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1997 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1998 // If variable scope is not found then skip this variable.
2002 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, ScopeLoc);
2003 DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
2004 Scope->addVariable(RegVar);
2007 // Collect variable information from DBG_VALUE machine instructions;
2008 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2010 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2012 const MachineInstr *MInsn = II;
2013 if (MInsn->getOpcode() != TargetOpcode::DBG_VALUE)
2015 // FIXME : Lift this restriction.
2016 if (MInsn->getNumOperands() != 3)
2018 DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata()));
2019 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
2020 // FIXME Handle inlined subroutine arguments.
2021 DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2022 CurrentFnDbgScope->addVariable(ArgVar);
2026 DebugLoc DL = MInsn->getDebugLoc();
2027 if (DL.isUnknown()) continue;
2028 DILocation ScopeLoc = MF->getDILocation(DL);
2030 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
2032 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
2033 // If variable scope is not found then skip this variable.
2037 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn,
2039 DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
2040 Scope->addVariable(RegVar);
2045 /// beginScope - Process beginning of a scope starting at Label.
2046 void DwarfDebug::beginScope(const MachineInstr *MI, MCSymbol *Label) {
2047 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2048 if (I == DbgScopeBeginMap.end())
2050 ScopeVector &SD = I->second;
2051 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2053 (*SDI)->setStartLabel(Label);
2056 /// endScope - Process end of a scope.
2057 void DwarfDebug::endScope(const MachineInstr *MI) {
2058 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2059 if (I == DbgScopeEndMap.end())
2062 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2063 Asm->OutStreamer.EmitLabel(Label);
2065 SmallVector<DbgScope*, 2> &SD = I->second;
2066 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2068 (*SDI)->setEndLabel(Label);
2072 /// createDbgScope - Create DbgScope for the scope.
2073 void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2076 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2079 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2080 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2081 if (DIDescriptor(Scope).isLexicalBlock())
2082 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2086 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2090 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2091 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2092 DILocation DL(InlinedAt);
2093 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2096 /// extractScopeInformation - Scan machine instructions in this function
2097 /// and collect DbgScopes. Return true, if atleast one scope was found.
2098 bool DwarfDebug::extractScopeInformation() {
2099 // If scope information was extracted using .dbg intrinsics then there is not
2100 // any need to extract these information by scanning each instruction.
2101 if (!DbgScopeMap.empty())
2104 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2105 unsigned MIIndex = 0;
2106 // Scan each instruction and create scopes. First build working set of scopes.
2107 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2109 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2111 const MachineInstr *MInsn = II;
2112 // FIXME : Remove DBG_VALUE check.
2113 if (MInsn->getOpcode() == TargetOpcode::DBG_VALUE) continue;
2114 MIIndexMap[MInsn] = MIIndex++;
2115 DebugLoc DL = MInsn->getDebugLoc();
2116 if (DL.isUnknown()) continue;
2117 DILocation DLT = MF->getDILocation(DL);
2118 DIScope DLTScope = DLT.getScope();
2119 // There is no need to create another DIE for compile unit. For all
2120 // other scopes, create one DbgScope now. This will be translated
2121 // into a scope DIE at the end.
2122 if (DLTScope.isCompileUnit()) continue;
2123 createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2128 // Build scope hierarchy using working set of scopes.
2129 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2131 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2133 const MachineInstr *MInsn = II;
2134 // FIXME : Remove DBG_VALUE check.
2135 if (MInsn->getOpcode() == TargetOpcode::DBG_VALUE) continue;
2136 DebugLoc DL = MInsn->getDebugLoc();
2137 if (DL.isUnknown()) continue;
2138 DILocation DLT = MF->getDILocation(DL);
2139 DIScope DLTScope = DLT.getScope();
2140 // There is no need to create another DIE for compile unit. For all
2141 // other scopes, create one DbgScope now. This will be translated
2142 // into a scope DIE at the end.
2143 if (DLTScope.isCompileUnit()) continue;
2144 DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2145 DLT.getOrigLocation().getNode());
2146 Scope->setLastInsn(MInsn);
2150 if (!CurrentFnDbgScope)
2153 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2155 // Each scope has first instruction and last instruction to mark beginning
2156 // and end of a scope respectively. Create an inverse map that list scopes
2157 // starts (and ends) with an instruction. One instruction may start (or end)
2158 // multiple scopes. Ignore scopes that are not reachable.
2159 SmallVector<DbgScope *, 4> WorkList;
2160 WorkList.push_back(CurrentFnDbgScope);
2161 while (!WorkList.empty()) {
2162 DbgScope *S = WorkList.back(); WorkList.pop_back();
2164 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2165 if (!Children.empty())
2166 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2167 SE = Children.end(); SI != SE; ++SI)
2168 WorkList.push_back(*SI);
2170 if (S->isAbstractScope())
2172 const MachineInstr *MI = S->getFirstInsn();
2173 assert (MI && "DbgScope does not have first instruction!");
2175 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2176 if (IDI != DbgScopeBeginMap.end())
2177 IDI->second.push_back(S);
2179 DbgScopeBeginMap[MI].push_back(S);
2181 MI = S->getLastInsn();
2182 assert (MI && "DbgScope does not have last instruction!");
2183 IDI = DbgScopeEndMap.find(MI);
2184 if (IDI != DbgScopeEndMap.end())
2185 IDI->second.push_back(S);
2187 DbgScopeEndMap[MI].push_back(S);
2190 return !DbgScopeMap.empty();
2193 /// beginFunction - Gather pre-function debug information. Assumes being
2194 /// emitted immediately after the function entry point.
2195 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2198 if (!ShouldEmitDwarfDebug()) return;
2200 if (TimePassesIsEnabled)
2201 DebugTimer->startTimer();
2203 if (!extractScopeInformation())
2206 collectVariableInfo();
2208 // Assumes in correct section after the entry point.
2209 Asm->OutStreamer.EmitLabel(getDWLabel("func_begin", ++SubprogramCount));
2211 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2213 DebugLoc FDL = MF->getDefaultDebugLoc();
2214 if (!FDL.isUnknown()) {
2215 DILocation DLT = MF->getDILocation(FDL);
2216 DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2219 Line = SP.getLineNumber();
2222 Line = DLT.getLineNumber();
2223 Col = DLT.getColumnNumber();
2226 recordSourceLine(Line, Col, DLT.getScope().getNode());
2228 if (TimePassesIsEnabled)
2229 DebugTimer->stopTimer();
2232 /// endFunction - Gather and emit post-function debug information.
2234 void DwarfDebug::endFunction(const MachineFunction *MF) {
2235 if (!ShouldEmitDwarfDebug()) return;
2237 if (TimePassesIsEnabled)
2238 DebugTimer->startTimer();
2240 if (DbgScopeMap.empty())
2243 if (CurrentFnDbgScope) {
2244 // Define end label for subprogram.
2245 Asm->OutStreamer.EmitLabel(getDWLabel("func_end", SubprogramCount));
2247 // Get function line info.
2248 if (!Lines.empty()) {
2249 // Get section line info.
2250 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2251 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2252 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2253 // Append the function info to section info.
2254 SectionLineInfos.insert(SectionLineInfos.end(),
2255 Lines.begin(), Lines.end());
2258 // Construct abstract scopes.
2259 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2260 AE = AbstractScopesList.end(); AI != AE; ++AI)
2261 constructScopeDIE(*AI);
2263 constructScopeDIE(CurrentFnDbgScope);
2265 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2266 MMI->getFrameMoves()));
2270 CurrentFnDbgScope = NULL;
2271 DeleteContainerSeconds(DbgScopeMap);
2272 DbgScopeBeginMap.clear();
2273 DbgScopeEndMap.clear();
2274 ConcreteScopes.clear();
2275 DeleteContainerSeconds(AbstractScopes);
2276 AbstractScopesList.clear();
2277 AbstractVariables.clear();
2280 if (TimePassesIsEnabled)
2281 DebugTimer->stopTimer();
2284 /// recordSourceLine - Register a source line with debug info. Returns the
2285 /// unique label that was emitted and which provides correspondence to
2286 /// the source line list.
2287 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2291 if (TimePassesIsEnabled)
2292 DebugTimer->startTimer();
2297 DIDescriptor Scope(S);
2298 if (Scope.isCompileUnit()) {
2299 DICompileUnit CU(S);
2300 Dir = CU.getDirectory();
2301 Fn = CU.getFilename();
2302 } else if (Scope.isSubprogram()) {
2304 Dir = SP.getDirectory();
2305 Fn = SP.getFilename();
2306 } else if (Scope.isLexicalBlock()) {
2307 DILexicalBlock DB(S);
2308 Dir = DB.getDirectory();
2309 Fn = DB.getFilename();
2311 assert(0 && "Unexpected scope info");
2313 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2314 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2315 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2317 if (TimePassesIsEnabled)
2318 DebugTimer->stopTimer();
2320 Asm->OutStreamer.EmitLabel(Label);
2324 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2325 /// timed. Look up the source id with the given directory and source file
2326 /// names. If none currently exists, create a new id and insert it in the
2327 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2329 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2330 const std::string &FileName) {
2331 if (TimePassesIsEnabled)
2332 DebugTimer->startTimer();
2334 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2336 if (TimePassesIsEnabled)
2337 DebugTimer->stopTimer();
2342 //===----------------------------------------------------------------------===//
2344 //===----------------------------------------------------------------------===//
2346 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2349 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2350 // Get the children.
2351 const std::vector<DIE *> &Children = Die->getChildren();
2353 // If not last sibling and has children then add sibling offset attribute.
2354 if (!Last && !Children.empty()) Die->addSiblingOffset();
2356 // Record the abbreviation.
2357 assignAbbrevNumber(Die->getAbbrev());
2359 // Get the abbreviation for this DIE.
2360 unsigned AbbrevNumber = Die->getAbbrevNumber();
2361 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2364 Die->setOffset(Offset);
2366 // Start the size with the size of abbreviation code.
2367 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2369 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2370 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2372 // Size the DIE attribute values.
2373 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2374 // Size attribute value.
2375 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2377 // Size the DIE children if any.
2378 if (!Children.empty()) {
2379 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2380 "Children flag not set");
2382 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2383 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2385 // End of children marker.
2386 Offset += sizeof(int8_t);
2389 Die->setSize(Offset - Die->getOffset());
2393 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2395 void DwarfDebug::computeSizeAndOffsets() {
2396 // Compute size of compile unit header.
2397 static unsigned Offset =
2398 sizeof(int32_t) + // Length of Compilation Unit Info
2399 sizeof(int16_t) + // DWARF version number
2400 sizeof(int32_t) + // Offset Into Abbrev. Section
2401 sizeof(int8_t); // Pointer Size (in bytes)
2403 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2404 CompileUnitOffsets[ModuleCU] = 0;
2407 /// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
2408 /// tools to recognize the object file contains Dwarf information.
2409 void DwarfDebug::emitInitial() {
2410 // Check to see if we already emitted intial headers.
2411 if (didInitial) return;
2414 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2416 // Dwarf sections base addresses.
2417 if (MAI->doesDwarfRequireFrameSection()) {
2418 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2419 Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2422 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2423 Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2424 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2425 Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2426 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2427 Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2429 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2430 Asm->OutStreamer.SwitchSection(LineInfoDirective);
2431 Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2434 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2435 Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2436 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2437 Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2438 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2439 Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2440 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2441 Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2442 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2443 Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2444 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2445 Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2447 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2448 Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2449 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2450 Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2453 /// emitDIE - Recusively Emits a debug information entry.
2455 void DwarfDebug::emitDIE(DIE *Die) {
2456 // Get the abbreviation for this DIE.
2457 unsigned AbbrevNumber = Die->getAbbrevNumber();
2458 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2460 // Emit the code (index) for the abbreviation.
2461 if (Asm->VerboseAsm)
2462 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2463 Twine::utohexstr(Die->getOffset()) + ":0x" +
2464 Twine::utohexstr(Die->getSize()) + " " +
2465 dwarf::TagString(Abbrev->getTag()));
2466 EmitULEB128(AbbrevNumber);
2468 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2469 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2471 // Emit the DIE attribute values.
2472 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2473 unsigned Attr = AbbrevData[i].getAttribute();
2474 unsigned Form = AbbrevData[i].getForm();
2475 assert(Form && "Too many attributes for DIE (check abbreviation)");
2477 if (Asm->VerboseAsm)
2478 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2481 case dwarf::DW_AT_sibling:
2482 Asm->EmitInt32(Die->getSiblingOffset());
2484 case dwarf::DW_AT_abstract_origin: {
2485 DIEEntry *E = cast<DIEEntry>(Values[i]);
2486 DIE *Origin = E->getEntry();
2487 unsigned Addr = Origin->getOffset();
2488 Asm->EmitInt32(Addr);
2492 // Emit an attribute using the defined form.
2493 Values[i]->EmitValue(this, Form);
2498 // Emit the DIE children if any.
2499 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2500 const std::vector<DIE *> &Children = Die->getChildren();
2502 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2503 emitDIE(Children[j]);
2505 if (Asm->VerboseAsm)
2506 Asm->OutStreamer.AddComment("End Of Children Mark");
2511 /// emitDebugInfo - Emit the debug info section.
2513 void DwarfDebug::emitDebugInfo() {
2514 // Start debug info section.
2515 Asm->OutStreamer.SwitchSection(
2516 Asm->getObjFileLowering().getDwarfInfoSection());
2517 DIE *Die = ModuleCU->getCUDie();
2519 // Emit the compile units header.
2520 Asm->OutStreamer.EmitLabel(getDWLabel("info_begin", ModuleCU->getID()));
2522 // Emit size of content not including length itself
2523 unsigned ContentSize = Die->getSize() +
2524 sizeof(int16_t) + // DWARF version number
2525 sizeof(int32_t) + // Offset Into Abbrev. Section
2526 sizeof(int8_t) + // Pointer Size (in bytes)
2527 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2529 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2530 Asm->EmitInt32(ContentSize);
2531 Asm->OutStreamer.AddComment("DWARF version number");
2532 Asm->EmitInt16(dwarf::DWARF_VERSION);
2533 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2534 EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2536 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2537 Asm->EmitInt8(TD->getPointerSize());
2540 // FIXME - extra padding for gdb bug.
2541 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2546 Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2549 /// emitAbbreviations - Emit the abbreviation section.
2551 void DwarfDebug::emitAbbreviations() const {
2552 // Check to see if it is worth the effort.
2553 if (!Abbreviations.empty()) {
2554 // Start the debug abbrev section.
2555 Asm->OutStreamer.SwitchSection(
2556 Asm->getObjFileLowering().getDwarfAbbrevSection());
2558 Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2560 // For each abbrevation.
2561 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2562 // Get abbreviation data
2563 const DIEAbbrev *Abbrev = Abbreviations[i];
2565 // Emit the abbrevations code (base 1 index.)
2566 EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2568 // Emit the abbreviations data.
2572 // Mark end of abbreviations.
2573 EmitULEB128(0, "EOM(3)");
2575 Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2579 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2580 /// the line matrix.
2582 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2583 // Define last address of section.
2584 Asm->OutStreamer.AddComment("Extended Op");
2587 Asm->OutStreamer.AddComment("Op size");
2588 Asm->EmitInt8(TD->getPointerSize() + 1);
2589 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2590 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2592 Asm->OutStreamer.AddComment("Section end label");
2594 Asm->OutStreamer.EmitSymbolValue(getDWLabel("section_end", SectionEnd),
2595 TD->getPointerSize(), 0/*AddrSpace*/);
2597 // Mark end of matrix.
2598 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2604 /// emitDebugLines - Emit source line information.
2606 void DwarfDebug::emitDebugLines() {
2607 // If the target is using .loc/.file, the assembler will be emitting the
2608 // .debug_line table automatically.
2609 if (MAI->hasDotLocAndDotFile())
2612 // Minimum line delta, thus ranging from -10..(255-10).
2613 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2614 // Maximum line delta, thus ranging from -10..(255-10).
2615 const int MaxLineDelta = 255 + MinLineDelta;
2617 // Start the dwarf line section.
2618 Asm->OutStreamer.SwitchSection(
2619 Asm->getObjFileLowering().getDwarfLineSection());
2621 // Construct the section header.
2622 Asm->OutStreamer.AddComment("Length of Source Line Info");
2623 EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2624 Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2626 Asm->OutStreamer.AddComment("DWARF version number");
2627 Asm->EmitInt16(dwarf::DWARF_VERSION);
2629 Asm->OutStreamer.AddComment("Prolog Length");
2630 EmitDifference(getTempLabel("line_prolog_end"),
2631 getTempLabel("line_prolog_begin"), true);
2632 Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2634 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2636 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2638 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2639 Asm->EmitInt8(MinLineDelta);
2640 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2641 Asm->EmitInt8(MaxLineDelta);
2642 Asm->OutStreamer.AddComment("Special Opcode Base");
2643 Asm->EmitInt8(-MinLineDelta);
2645 // Line number standard opcode encodings argument count
2646 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2648 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2650 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2652 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2654 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2656 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2658 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2660 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2662 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2665 // Emit directories.
2666 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2667 const std::string &Dir = getSourceDirectoryName(DI);
2668 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2669 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2672 Asm->OutStreamer.AddComment("End of directories");
2676 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2677 // Remember source id starts at 1.
2678 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2679 const std::string &FN = getSourceFileName(Id.second);
2680 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2681 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2683 EmitULEB128(Id.first, "Directory #");
2684 EmitULEB128(0, "Mod date");
2685 EmitULEB128(0, "File size");
2688 Asm->OutStreamer.AddComment("End of files");
2691 Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2693 // A sequence for each text section.
2694 unsigned SecSrcLinesSize = SectionSourceLines.size();
2696 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2697 // Isolate current sections line info.
2698 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2700 // Dwarf assumes we start with first line of first source file.
2701 unsigned Source = 1;
2704 // Construct rows of the address, source, line, column matrix.
2705 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2706 const SrcLineInfo &LineInfo = LineInfos[i];
2707 MCSymbol *Label = LineInfo.getLabel();
2708 if (!Label->isDefined()) continue; // Not emitted, in dead code.
2710 if (LineInfo.getLine() == 0) continue;
2712 if (Asm->isVerbose()) {
2713 std::pair<unsigned, unsigned> SrcID =
2714 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2715 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2717 Twine(getSourceFileName(SrcID.second)) +
2718 ":" + Twine(LineInfo.getLine()));
2721 // Define the line address.
2722 Asm->OutStreamer.AddComment("Extended Op");
2724 Asm->OutStreamer.AddComment("Op size");
2725 Asm->EmitInt8(TD->getPointerSize() + 1);
2727 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2728 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2730 Asm->OutStreamer.AddComment("Location label");
2731 Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2734 // If change of source, then switch to the new source.
2735 if (Source != LineInfo.getSourceID()) {
2736 Source = LineInfo.getSourceID();
2737 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2738 Asm->EmitInt8(dwarf::DW_LNS_set_file);
2739 EmitULEB128(Source, "New Source");
2742 // If change of line.
2743 if (Line != LineInfo.getLine()) {
2744 // Determine offset.
2745 int Offset = LineInfo.getLine() - Line;
2746 int Delta = Offset - MinLineDelta;
2749 Line = LineInfo.getLine();
2751 // If delta is small enough and in range...
2752 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2753 // ... then use fast opcode.
2754 Asm->OutStreamer.AddComment("Line Delta");
2755 Asm->EmitInt8(Delta - MinLineDelta);
2757 // ... otherwise use long hand.
2758 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2759 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2760 EmitSLEB128(Offset, "Line Offset");
2761 Asm->OutStreamer.AddComment("DW_LNS_copy");
2762 Asm->EmitInt8(dwarf::DW_LNS_copy);
2765 // Copy the previous row (different address or source)
2766 Asm->OutStreamer.AddComment("DW_LNS_copy");
2767 Asm->EmitInt8(dwarf::DW_LNS_copy);
2771 emitEndOfLineMatrix(j + 1);
2774 if (SecSrcLinesSize == 0)
2775 // Because we're emitting a debug_line section, we still need a line
2776 // table. The linker and friends expect it to exist. If there's nothing to
2777 // put into it, emit an empty table.
2778 emitEndOfLineMatrix(1);
2780 Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2783 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2785 void DwarfDebug::emitCommonDebugFrame() {
2786 if (!MAI->doesDwarfRequireFrameSection())
2790 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2791 TargetFrameInfo::StackGrowsUp ?
2792 TD->getPointerSize() : -TD->getPointerSize();
2794 // Start the dwarf frame section.
2795 Asm->OutStreamer.SwitchSection(
2796 Asm->getObjFileLowering().getDwarfFrameSection());
2798 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2799 Asm->OutStreamer.AddComment("Length of Common Information Entry");
2800 EmitDifference(getTempLabel("debug_frame_common_end"),
2801 getTempLabel("debug_frame_common_begin"), true);
2803 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2804 Asm->OutStreamer.AddComment("CIE Identifier Tag");
2805 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2806 Asm->OutStreamer.AddComment("CIE Version");
2807 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2808 Asm->OutStreamer.AddComment("CIE Augmentation");
2809 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2810 EmitULEB128(1, "CIE Code Alignment Factor");
2811 EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2812 Asm->OutStreamer.AddComment("CIE RA Column");
2813 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2815 std::vector<MachineMove> Moves;
2816 RI->getInitialFrameState(Moves);
2818 EmitFrameMoves(0, Moves, false);
2820 Asm->EmitAlignment(2, 0, 0, false);
2821 Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2824 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2827 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2828 if (!MAI->doesDwarfRequireFrameSection())
2831 // Start the dwarf frame section.
2832 Asm->OutStreamer.SwitchSection(
2833 Asm->getObjFileLowering().getDwarfFrameSection());
2835 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2836 MCSymbol *DebugFrameBegin =
2837 getDWLabel("debug_frame_begin", DebugFrameInfo.Number);
2838 MCSymbol *DebugFrameEnd =
2839 getDWLabel("debug_frame_end", DebugFrameInfo.Number);
2840 EmitDifference(DebugFrameEnd, DebugFrameBegin, true);
2842 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2844 Asm->OutStreamer.AddComment("FDE CIE offset");
2845 EmitSectionOffset(getTempLabel("debug_frame_common"),
2846 getTempLabel("section_debug_frame"), true, false);
2848 Asm->OutStreamer.AddComment("FDE initial location");
2849 MCSymbol *FuncBeginSym = getDWLabel("func_begin", DebugFrameInfo.Number);
2850 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2851 TD->getPointerSize(), 0/*AddrSpace*/);
2854 Asm->OutStreamer.AddComment("FDE address range");
2855 EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number), FuncBeginSym);
2857 EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2859 Asm->EmitAlignment(2, 0, 0, false);
2860 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2863 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2865 void DwarfDebug::emitDebugPubNames() {
2866 // Start the dwarf pubnames section.
2867 Asm->OutStreamer.SwitchSection(
2868 Asm->getObjFileLowering().getDwarfPubNamesSection());
2870 Asm->OutStreamer.AddComment("Length of Public Names Info");
2871 EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2872 getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2874 Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2876 Asm->OutStreamer.AddComment("DWARF Version");
2877 Asm->EmitInt16(dwarf::DWARF_VERSION);
2879 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2880 EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2881 getTempLabel("section_info"),
2884 Asm->OutStreamer.AddComment("Compilation Unit Length");
2885 EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2886 getDWLabel("info_begin", ModuleCU->getID()),
2889 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2890 for (StringMap<DIE*>::const_iterator
2891 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2892 const char *Name = GI->getKeyData();
2893 DIE *Entity = GI->second;
2895 Asm->OutStreamer.AddComment("DIE offset");
2896 Asm->EmitInt32(Entity->getOffset());
2898 if (Asm->VerboseAsm)
2899 Asm->OutStreamer.AddComment("External Name");
2900 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2903 Asm->OutStreamer.AddComment("End Mark");
2905 Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2908 void DwarfDebug::emitDebugPubTypes() {
2909 // Start the dwarf pubnames section.
2910 Asm->OutStreamer.SwitchSection(
2911 Asm->getObjFileLowering().getDwarfPubTypesSection());
2912 Asm->OutStreamer.AddComment("Length of Public Types Info");
2913 EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2914 getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2916 Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2918 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2919 Asm->EmitInt16(dwarf::DWARF_VERSION);
2921 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2922 EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2923 getTempLabel("section_info"), true, false);
2925 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2926 EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2927 getDWLabel("info_begin", ModuleCU->getID()),
2930 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2931 for (StringMap<DIE*>::const_iterator
2932 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2933 const char *Name = GI->getKeyData();
2934 DIE * Entity = GI->second;
2936 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2937 Asm->EmitInt32(Entity->getOffset());
2939 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2940 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2943 Asm->OutStreamer.AddComment("End Mark");
2945 Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2948 /// emitDebugStr - Emit visible names into a debug str section.
2950 void DwarfDebug::emitDebugStr() {
2951 // Check to see if it is worth the effort.
2952 if (StringPool.empty()) return;
2954 // Start the dwarf str section.
2955 Asm->OutStreamer.SwitchSection(
2956 Asm->getObjFileLowering().getDwarfStrSection());
2958 // Get all of the string pool entries and put them in an array by their ID so
2959 // we can sort them.
2960 SmallVector<std::pair<unsigned,
2961 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2963 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2964 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2965 Entries.push_back(std::make_pair(I->second.second, &*I));
2967 array_pod_sort(Entries.begin(), Entries.end());
2969 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2970 // Emit a label for reference from debug information entries.
2971 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2973 // Emit the string itself.
2974 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
2978 /// emitDebugLoc - Emit visible names into a debug loc section.
2980 void DwarfDebug::emitDebugLoc() {
2981 // Start the dwarf loc section.
2982 Asm->OutStreamer.SwitchSection(
2983 Asm->getObjFileLowering().getDwarfLocSection());
2986 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2988 void DwarfDebug::EmitDebugARanges() {
2989 // Start the dwarf aranges section.
2990 Asm->OutStreamer.SwitchSection(
2991 Asm->getObjFileLowering().getDwarfARangesSection());
2994 /// emitDebugRanges - Emit visible names into a debug ranges section.
2996 void DwarfDebug::emitDebugRanges() {
2997 // Start the dwarf ranges section.
2998 Asm->OutStreamer.SwitchSection(
2999 Asm->getObjFileLowering().getDwarfRangesSection());
3002 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3004 void DwarfDebug::emitDebugMacInfo() {
3005 if (const MCSection *LineInfo =
3006 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3007 // Start the dwarf macinfo section.
3008 Asm->OutStreamer.SwitchSection(LineInfo);
3012 /// emitDebugInlineInfo - Emit inline info using following format.
3014 /// 1. length of section
3015 /// 2. Dwarf version number
3016 /// 3. address size.
3018 /// Entries (one "entry" for each function that was inlined):
3020 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3021 /// otherwise offset into __debug_str for regular function name.
3022 /// 2. offset into __debug_str section for regular function name.
3023 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3024 /// instances for the function.
3026 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3027 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3028 /// __debug_info section, and the low_pc is the starting address for the
3029 /// inlining instance.
3030 void DwarfDebug::emitDebugInlineInfo() {
3031 if (!MAI->doesDwarfUsesInlineInfoSection())
3037 Asm->OutStreamer.SwitchSection(
3038 Asm->getObjFileLowering().getDwarfDebugInlineSection());
3040 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3041 EmitDifference(getDWLabel("debug_inlined_end", 1),
3042 getDWLabel("debug_inlined_begin", 1), true);
3044 Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
3046 Asm->OutStreamer.AddComment("Dwarf Version");
3047 Asm->EmitInt16(dwarf::DWARF_VERSION);
3048 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3049 Asm->EmitInt8(TD->getPointerSize());
3051 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3052 E = InlinedSPNodes.end(); I != E; ++I) {
3055 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3056 = InlineInfo.find(Node);
3057 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3058 DISubprogram SP(Node);
3059 StringRef LName = SP.getLinkageName();
3060 StringRef Name = SP.getName();
3062 Asm->OutStreamer.AddComment("MIPS linkage name");
3063 if (LName.empty()) {
3064 Asm->OutStreamer.EmitBytes(Name, 0);
3065 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3067 EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3068 getTempLabel("section_str"), true);
3070 Asm->OutStreamer.AddComment("Function name");
3071 EmitSectionOffset(getStringPoolEntry(Name), getTempLabel("section_str"),
3073 EmitULEB128(Labels.size(), "Inline count");
3075 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3076 LE = Labels.end(); LI != LE; ++LI) {
3077 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
3078 Asm->EmitInt32(LI->second->getOffset());
3080 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("low_pc");
3081 Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3085 Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));