• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "DwarfCompileUnit.h"
18 #include "llvm/Constants.h"
19 #include "llvm/Module.h"
20 #include "llvm/Instructions.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineModuleInfo.h"
23 #include "llvm/MC/MCAsmInfo.h"
24 #include "llvm/MC/MCSection.h"
25 #include "llvm/MC/MCStreamer.h"
26 #include "llvm/MC/MCSymbol.h"
27 #include "llvm/Target/Mangler.h"
28 #include "llvm/Target/TargetData.h"
29 #include "llvm/Target/TargetFrameLowering.h"
30 #include "llvm/Target/TargetLoweringObjectFile.h"
31 #include "llvm/Target/TargetMachine.h"
32 #include "llvm/Target/TargetRegisterInfo.h"
33 #include "llvm/Target/TargetOptions.h"
34 #include "llvm/Analysis/DebugInfo.h"
35 #include "llvm/Analysis/DIBuilder.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/ADT/STLExtras.h"
38 #include "llvm/ADT/StringExtras.h"
39 #include "llvm/Support/CommandLine.h"
40 #include "llvm/Support/Debug.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/ValueHandle.h"
43 #include "llvm/Support/FormattedStream.h"
44 #include "llvm/Support/Timer.h"
45 #include "llvm/Support/Path.h"
46 using namespace llvm;
47 
48 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49      cl::desc("Print DbgScope information for each machine instruction"));
50 
51 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
52                                               cl::Hidden,
53      cl::desc("Disable debug info printing"));
54 
55 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
56      cl::desc("Make an absence of debug location information explicit."),
57      cl::init(false));
58 
59 namespace {
60   const char *DWARFGroupName = "DWARF Emission";
61   const char *DbgTimerName = "DWARF Debug Writer";
62 } // end anonymous namespace
63 
64 //===----------------------------------------------------------------------===//
65 
66 /// Configuration values for initial hash set sizes (log2).
67 ///
68 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
69 
70 namespace llvm {
71 
getType() const72 DIType DbgVariable::getType()               const {
73   DIType Ty = Var.getType();
74   // FIXME: isBlockByrefVariable should be reformulated in terms of complex
75   // addresses instead.
76   if (Var.isBlockByrefVariable()) {
77     /* Byref variables, in Blocks, are declared by the programmer as
78        "SomeType VarName;", but the compiler creates a
79        __Block_byref_x_VarName struct, and gives the variable VarName
80        either the struct, or a pointer to the struct, as its type.  This
81        is necessary for various behind-the-scenes things the compiler
82        needs to do with by-reference variables in blocks.
83 
84        However, as far as the original *programmer* is concerned, the
85        variable should still have type 'SomeType', as originally declared.
86 
87        The following function dives into the __Block_byref_x_VarName
88        struct to find the original type of the variable.  This will be
89        passed back to the code generating the type for the Debug
90        Information Entry for the variable 'VarName'.  'VarName' will then
91        have the original type 'SomeType' in its debug information.
92 
93        The original type 'SomeType' will be the type of the field named
94        'VarName' inside the __Block_byref_x_VarName struct.
95 
96        NOTE: In order for this to not completely fail on the debugger
97        side, the Debug Information Entry for the variable VarName needs to
98        have a DW_AT_location that tells the debugger how to unwind through
99        the pointers and __Block_byref_x_VarName struct to find the actual
100        value of the variable.  The function addBlockByrefType does this.  */
101     DIType subType = Ty;
102     unsigned tag = Ty.getTag();
103 
104     if (tag == dwarf::DW_TAG_pointer_type) {
105       DIDerivedType DTy = DIDerivedType(Ty);
106       subType = DTy.getTypeDerivedFrom();
107     }
108 
109     DICompositeType blockStruct = DICompositeType(subType);
110     DIArray Elements = blockStruct.getTypeArray();
111 
112     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
113       DIDescriptor Element = Elements.getElement(i);
114       DIDerivedType DT = DIDerivedType(Element);
115       if (getName() == DT.getName())
116         return (DT.getTypeDerivedFrom());
117     }
118     return Ty;
119   }
120   return Ty;
121 }
122 
123 //===----------------------------------------------------------------------===//
124 /// DbgRange - This is used to track range of instructions with identical
125 /// debug info scope.
126 ///
127 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
128 
129 //===----------------------------------------------------------------------===//
130 /// DbgScope - This class is used to track scope information.
131 ///
132 class DbgScope {
133   DbgScope *Parent;                   // Parent to this scope.
134   DIDescriptor Desc;                  // Debug info descriptor for scope.
135   // Location at which this scope is inlined.
136   AssertingVH<const MDNode> InlinedAtLocation;
137   bool AbstractScope;                 // Abstract Scope
138   const MachineInstr *LastInsn;       // Last instruction of this scope.
139   const MachineInstr *FirstInsn;      // First instruction of this scope.
140   unsigned DFSIn, DFSOut;
141   // Scopes defined in scope.  Contents not owned.
142   SmallVector<DbgScope *, 4> Scopes;
143   // Variables declared in scope.  Contents owned.
144   SmallVector<DbgVariable *, 8> Variables;
145   SmallVector<DbgRange, 4> Ranges;
146   // Private state for dump()
147   mutable unsigned IndentLevel;
148 public:
DbgScope(DbgScope * P,DIDescriptor D,const MDNode * I=0)149   DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
150     : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
151       LastInsn(0), FirstInsn(0),
152       DFSIn(0), DFSOut(0), IndentLevel(0) {}
153   virtual ~DbgScope();
154 
155   // Accessors.
getParent() const156   DbgScope *getParent()          const { return Parent; }
setParent(DbgScope * P)157   void setParent(DbgScope *P)          { Parent = P; }
getDesc() const158   DIDescriptor getDesc()         const { return Desc; }
getInlinedAt() const159   const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
getScopeNode() const160   const MDNode *getScopeNode()         const { return Desc; }
getScopes()161   const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
getDbgVariables()162   const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
getRanges()163   const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
164 
165   /// openInsnRange - This scope covers instruction range starting from MI.
openInsnRange(const MachineInstr * MI)166   void openInsnRange(const MachineInstr *MI) {
167     if (!FirstInsn)
168       FirstInsn = MI;
169 
170     if (Parent)
171       Parent->openInsnRange(MI);
172   }
173 
174   /// extendInsnRange - Extend the current instruction range covered by
175   /// this scope.
extendInsnRange(const MachineInstr * MI)176   void extendInsnRange(const MachineInstr *MI) {
177     assert (FirstInsn && "MI Range is not open!");
178     LastInsn = MI;
179     if (Parent)
180       Parent->extendInsnRange(MI);
181   }
182 
183   /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
184   /// until now. This is used when a new scope is encountered while walking
185   /// machine instructions.
closeInsnRange(DbgScope * NewScope=NULL)186   void closeInsnRange(DbgScope *NewScope = NULL) {
187     assert (LastInsn && "Last insn missing!");
188     Ranges.push_back(DbgRange(FirstInsn, LastInsn));
189     FirstInsn = NULL;
190     LastInsn = NULL;
191     // If Parent dominates NewScope then do not close Parent's instruction
192     // range.
193     if (Parent && (!NewScope || !Parent->dominates(NewScope)))
194       Parent->closeInsnRange(NewScope);
195   }
196 
setAbstractScope()197   void setAbstractScope() { AbstractScope = true; }
isAbstractScope() const198   bool isAbstractScope() const { return AbstractScope; }
199 
200   // Depth First Search support to walk and mainpluate DbgScope hierarchy.
getDFSOut() const201   unsigned getDFSOut() const { return DFSOut; }
setDFSOut(unsigned O)202   void setDFSOut(unsigned O) { DFSOut = O; }
getDFSIn() const203   unsigned getDFSIn() const  { return DFSIn; }
setDFSIn(unsigned I)204   void setDFSIn(unsigned I)  { DFSIn = I; }
dominates(const DbgScope * S)205   bool dominates(const DbgScope *S) {
206     if (S == this)
207       return true;
208     if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
209       return true;
210     return false;
211   }
212 
213   /// addScope - Add a scope to the scope.
214   ///
addScope(DbgScope * S)215   void addScope(DbgScope *S) { Scopes.push_back(S); }
216 
217   /// addVariable - Add a variable to the scope.
218   ///
addVariable(DbgVariable * V)219   void addVariable(DbgVariable *V) { Variables.push_back(V); }
220 
221 #ifndef NDEBUG
222   void dump() const;
223 #endif
224 };
225 
226 } // end llvm namespace
227 
228 #ifndef NDEBUG
dump() const229 void DbgScope::dump() const {
230   raw_ostream &err = dbgs();
231   err.indent(IndentLevel);
232   err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n";
233   const MDNode *N = Desc;
234   N->dump();
235   if (AbstractScope)
236     err << "Abstract Scope\n";
237 
238   IndentLevel += 2;
239   if (!Scopes.empty())
240     err << "Children ...\n";
241   for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
242     if (Scopes[i] != this)
243       Scopes[i]->dump();
244 
245   IndentLevel -= 2;
246 }
247 #endif
248 
~DbgScope()249 DbgScope::~DbgScope() {
250   for (unsigned j = 0, M = Variables.size(); j < M; ++j)
251     delete Variables[j];
252 }
253 
DwarfDebug(AsmPrinter * A,Module * M)254 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
255   : Asm(A), MMI(Asm->MMI), FirstCU(0),
256     AbbreviationsSet(InitAbbreviationsSetSize),
257     CurrentFnDbgScope(0), PrevLabel(NULL) {
258   NextStringPoolNumber = 0;
259 
260   DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
261   DwarfStrSectionSym = TextSectionSym = 0;
262   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
263   FunctionBeginSym = FunctionEndSym = 0;
264   {
265     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
266     beginModule(M);
267   }
268 }
~DwarfDebug()269 DwarfDebug::~DwarfDebug() {
270 }
271 
getStringPoolEntry(StringRef Str)272 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
273   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
274   if (Entry.first) return Entry.first;
275 
276   Entry.second = NextStringPoolNumber++;
277   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
278 }
279 
280 
281 /// assignAbbrevNumber - Define a unique number for the abbreviation.
282 ///
assignAbbrevNumber(DIEAbbrev & Abbrev)283 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
284   // Profile the node so that we can make it unique.
285   FoldingSetNodeID ID;
286   Abbrev.Profile(ID);
287 
288   // Check the set for priors.
289   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
290 
291   // If it's newly added.
292   if (InSet == &Abbrev) {
293     // Add to abbreviation list.
294     Abbreviations.push_back(&Abbrev);
295 
296     // Assign the vector position + 1 as its number.
297     Abbrev.setNumber(Abbreviations.size());
298   } else {
299     // Assign existing abbreviation number.
300     Abbrev.setNumber(InSet->getNumber());
301   }
302 }
303 
304 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
305 /// printer to not emit usual symbol prefix before the symbol name is used then
306 /// return linkage name after skipping this special LLVM prefix.
getRealLinkageName(StringRef LinkageName)307 static StringRef getRealLinkageName(StringRef LinkageName) {
308   char One = '\1';
309   if (LinkageName.startswith(StringRef(&One, 1)))
310     return LinkageName.substr(1);
311   return LinkageName;
312 }
313 
314 /// createSubprogramDIE - Create new DIE using SP.
createSubprogramDIE(DISubprogram SP)315 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
316   CompileUnit *SPCU = getCompileUnit(SP);
317   DIE *SPDie = SPCU->getDIE(SP);
318   if (SPDie)
319     return SPDie;
320 
321   SPDie = new DIE(dwarf::DW_TAG_subprogram);
322 
323   // DW_TAG_inlined_subroutine may refer to this DIE.
324   SPCU->insertDIE(SP, SPDie);
325 
326   // Add to context owner.
327   SPCU->addToContextOwner(SPDie, SP.getContext());
328 
329   // Add function template parameters.
330   SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
331 
332   StringRef LinkageName = SP.getLinkageName();
333   if (!LinkageName.empty())
334     SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
335                     getRealLinkageName(LinkageName));
336 
337   // If this DIE is going to refer declaration info using AT_specification
338   // then there is no need to add other attributes.
339   if (SP.getFunctionDeclaration().isSubprogram())
340     return SPDie;
341 
342   // Constructors and operators for anonymous aggregates do not have names.
343   if (!SP.getName().empty())
344     SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
345                     SP.getName());
346 
347   SPCU->addSourceLine(SPDie, SP);
348 
349   if (SP.isPrototyped())
350     SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
351 
352   // Add Return Type.
353   DICompositeType SPTy = SP.getType();
354   DIArray Args = SPTy.getTypeArray();
355   unsigned SPTag = SPTy.getTag();
356 
357   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
358     SPCU->addType(SPDie, SPTy);
359   else
360     SPCU->addType(SPDie, DIType(Args.getElement(0)));
361 
362   unsigned VK = SP.getVirtuality();
363   if (VK) {
364     SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
365     DIEBlock *Block = SPCU->getDIEBlock();
366     SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
367     SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
368     SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
369     ContainingTypeMap.insert(std::make_pair(SPDie,
370                                             SP.getContainingType()));
371   }
372 
373   if (!SP.isDefinition()) {
374     SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
375 
376     // Add arguments. Do not add arguments for subprogram definition. They will
377     // be handled while processing variables.
378     DICompositeType SPTy = SP.getType();
379     DIArray Args = SPTy.getTypeArray();
380     unsigned SPTag = SPTy.getTag();
381 
382     if (SPTag == dwarf::DW_TAG_subroutine_type)
383       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
384         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
385         DIType ATy = DIType(DIType(Args.getElement(i)));
386         SPCU->addType(Arg, ATy);
387         if (ATy.isArtificial())
388           SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
389         SPDie->addChild(Arg);
390       }
391   }
392 
393   if (SP.isArtificial())
394     SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
395 
396   if (!SP.isLocalToUnit())
397     SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
398 
399   if (SP.isOptimized())
400     SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
401 
402   if (unsigned isa = Asm->getISAEncoding()) {
403     SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
404   }
405 
406   return SPDie;
407 }
408 
getOrCreateAbstractScope(const MDNode * N)409 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
410   assert(N && "Invalid Scope encoding!");
411 
412   DbgScope *AScope = AbstractScopes.lookup(N);
413   if (AScope)
414     return AScope;
415 
416   DbgScope *Parent = NULL;
417 
418   DIDescriptor Scope(N);
419   if (Scope.isLexicalBlock()) {
420     DILexicalBlock DB(N);
421     DIDescriptor ParentDesc = DB.getContext();
422     Parent = getOrCreateAbstractScope(ParentDesc);
423   }
424 
425   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
426 
427   if (Parent)
428     Parent->addScope(AScope);
429   AScope->setAbstractScope();
430   AbstractScopes[N] = AScope;
431   if (DIDescriptor(N).isSubprogram())
432     AbstractScopesList.push_back(AScope);
433   return AScope;
434 }
435 
436 /// isSubprogramContext - Return true if Context is either a subprogram
437 /// or another context nested inside a subprogram.
isSubprogramContext(const MDNode * Context)438 static bool isSubprogramContext(const MDNode *Context) {
439   if (!Context)
440     return false;
441   DIDescriptor D(Context);
442   if (D.isSubprogram())
443     return true;
444   if (D.isType())
445     return isSubprogramContext(DIType(Context).getContext());
446   return false;
447 }
448 
449 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
450 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
451 /// If there are global variables in this scope then create and insert
452 /// DIEs for these variables.
updateSubprogramScopeDIE(const MDNode * SPNode)453 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
454   CompileUnit *SPCU = getCompileUnit(SPNode);
455   DIE *SPDie = SPCU->getDIE(SPNode);
456 
457   assert(SPDie && "Unable to find subprogram DIE!");
458   DISubprogram SP(SPNode);
459 
460   DISubprogram SPDecl = SP.getFunctionDeclaration();
461   if (SPDecl.isSubprogram())
462     // Refer function declaration directly.
463     SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
464                       createSubprogramDIE(SPDecl));
465   else {
466     // There is not any need to generate specification DIE for a function
467     // defined at compile unit level. If a function is defined inside another
468     // function then gdb prefers the definition at top level and but does not
469     // expect specification DIE in parent function. So avoid creating
470     // specification DIE for a function defined inside a function.
471     if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
472         !SP.getContext().isFile() &&
473         !isSubprogramContext(SP.getContext())) {
474       SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
475 
476       // Add arguments.
477       DICompositeType SPTy = SP.getType();
478       DIArray Args = SPTy.getTypeArray();
479       unsigned SPTag = SPTy.getTag();
480       if (SPTag == dwarf::DW_TAG_subroutine_type)
481         for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
482           DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
483           DIType ATy = DIType(DIType(Args.getElement(i)));
484           SPCU->addType(Arg, ATy);
485           if (ATy.isArtificial())
486             SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
487           SPDie->addChild(Arg);
488         }
489       DIE *SPDeclDie = SPDie;
490       SPDie = new DIE(dwarf::DW_TAG_subprogram);
491       SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
492                         SPDeclDie);
493       SPCU->addDie(SPDie);
494     }
495   }
496   // Pick up abstract subprogram DIE.
497   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
498     SPDie = new DIE(dwarf::DW_TAG_subprogram);
499     SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
500                       dwarf::DW_FORM_ref4, AbsSPDIE);
501     SPCU->addDie(SPDie);
502   }
503 
504   SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
505                  Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
506   SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
507                  Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
508   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
509   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
510   SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
511 
512   return SPDie;
513 }
514 
515 /// constructLexicalScope - Construct new DW_TAG_lexical_block
516 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
constructLexicalScopeDIE(DbgScope * Scope)517 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
518 
519   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
520   if (Scope->isAbstractScope())
521     return ScopeDIE;
522 
523   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
524   if (Ranges.empty())
525     return 0;
526 
527   CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
528   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
529   if (Ranges.size() > 1) {
530     // .debug_range section has not been laid out yet. Emit offset in
531     // .debug_range as a uint, size 4, for now. emitDIE will handle
532     // DW_AT_ranges appropriately.
533     TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
534                    DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
535     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
536          RE = Ranges.end(); RI != RE; ++RI) {
537       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
538       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
539     }
540     DebugRangeSymbols.push_back(NULL);
541     DebugRangeSymbols.push_back(NULL);
542     return ScopeDIE;
543   }
544 
545   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
546   const MCSymbol *End = getLabelAfterInsn(RI->second);
547 
548   if (End == 0) return 0;
549 
550   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
551   assert(End->isDefined() && "Invalid end label for an inlined scope!");
552 
553   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
554   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
555 
556   return ScopeDIE;
557 }
558 
559 /// constructInlinedScopeDIE - This scope represents inlined body of
560 /// a function. Construct DIE to represent this concrete inlined copy
561 /// of the function.
constructInlinedScopeDIE(DbgScope * Scope)562 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
563 
564   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
565   assert (Ranges.empty() == false
566           && "DbgScope does not have instruction markers!");
567 
568   // FIXME : .debug_inlined section specification does not clearly state how
569   // to emit inlined scope that is split into multiple instruction ranges.
570   // For now, use first instruction range and emit low_pc/high_pc pair and
571   // corresponding .debug_inlined section entry for this pair.
572   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
573   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
574   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
575 
576   if (StartLabel == 0 || EndLabel == 0) {
577     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
578     return 0;
579   }
580   assert(StartLabel->isDefined() &&
581          "Invalid starting label for an inlined scope!");
582   assert(EndLabel->isDefined() &&
583          "Invalid end label for an inlined scope!");
584 
585   if (!Scope->getScopeNode())
586     return NULL;
587   DIScope DS(Scope->getScopeNode());
588   DISubprogram InlinedSP = getDISubprogram(DS);
589   CompileUnit *TheCU = getCompileUnit(InlinedSP);
590   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
591   if (!OriginDIE) {
592     DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
593     return NULL;
594   }
595   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
596   TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
597                      dwarf::DW_FORM_ref4, OriginDIE);
598 
599   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
600   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
601 
602   InlinedSubprogramDIEs.insert(OriginDIE);
603 
604   // Track the start label for this inlined function.
605   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
606     I = InlineInfo.find(InlinedSP);
607 
608   if (I == InlineInfo.end()) {
609     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
610                                                              ScopeDIE));
611     InlinedSPNodes.push_back(InlinedSP);
612   } else
613     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
614 
615   DILocation DL(Scope->getInlinedAt());
616   TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
617   TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
618 
619   return ScopeDIE;
620 }
621 
622 /// isUnsignedDIType - Return true if type encoding is unsigned.
isUnsignedDIType(DIType Ty)623 static bool isUnsignedDIType(DIType Ty) {
624   DIDerivedType DTy(Ty);
625   if (DTy.Verify())
626     return isUnsignedDIType(DTy.getTypeDerivedFrom());
627 
628   DIBasicType BTy(Ty);
629   if (BTy.Verify()) {
630     unsigned Encoding = BTy.getEncoding();
631     if (Encoding == dwarf::DW_ATE_unsigned ||
632         Encoding == dwarf::DW_ATE_unsigned_char)
633       return true;
634   }
635   return false;
636 }
637 
638 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
constructVariableDIE(DbgVariable * DV,DbgScope * Scope)639 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
640   StringRef Name = DV->getName();
641   if (Name.empty())
642     return NULL;
643 
644   // Translate tag to proper Dwarf tag.  The result variable is dropped for
645   // now.
646   unsigned Tag;
647   switch (DV->getTag()) {
648   case dwarf::DW_TAG_return_variable:
649     return NULL;
650   case dwarf::DW_TAG_arg_variable:
651     Tag = dwarf::DW_TAG_formal_parameter;
652     break;
653   case dwarf::DW_TAG_auto_variable:    // fall thru
654   default:
655     Tag = dwarf::DW_TAG_variable;
656     break;
657   }
658 
659   // Define variable debug information entry.
660   DIE *VariableDie = new DIE(Tag);
661   CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
662   DIE *AbsDIE = NULL;
663   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
664     V2AVI = VarToAbstractVarMap.find(DV);
665   if (V2AVI != VarToAbstractVarMap.end())
666     AbsDIE = V2AVI->second->getDIE();
667 
668   if (AbsDIE)
669     VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
670                        dwarf::DW_FORM_ref4, AbsDIE);
671   else {
672     VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
673                           Name);
674     VariableCU->addSourceLine(VariableDie, DV->getVariable());
675 
676     // Add variable type.
677     VariableCU->addType(VariableDie, DV->getType());
678   }
679 
680   if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
681     VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
682                         dwarf::DW_FORM_flag, 1);
683   else if (DIVariable(DV->getVariable()).isArtificial())
684     VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
685                         dwarf::DW_FORM_flag, 1);
686 
687   if (Scope->isAbstractScope()) {
688     DV->setDIE(VariableDie);
689     return VariableDie;
690   }
691 
692   // Add variable address.
693 
694   unsigned Offset = DV->getDotDebugLocOffset();
695   if (Offset != ~0U) {
696     VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
697              Asm->GetTempSymbol("debug_loc", Offset));
698     DV->setDIE(VariableDie);
699     UseDotDebugLocEntry.insert(VariableDie);
700     return VariableDie;
701   }
702 
703   // Check if variable is described by a  DBG_VALUE instruction.
704   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
705     DbgVariableToDbgInstMap.find(DV);
706   if (DVI != DbgVariableToDbgInstMap.end()) {
707     const MachineInstr *DVInsn = DVI->second;
708     bool updated = false;
709     // FIXME : Handle getNumOperands != 3
710     if (DVInsn->getNumOperands() == 3) {
711       if (DVInsn->getOperand(0).isReg()) {
712         const MachineOperand RegOp = DVInsn->getOperand(0);
713         const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
714         if (DVInsn->getOperand(1).isImm() &&
715             TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
716           unsigned FrameReg = 0;
717           const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
718           int Offset =
719             TFI->getFrameIndexReference(*Asm->MF,
720                                         DVInsn->getOperand(1).getImm(),
721                                         FrameReg);
722           MachineLocation Location(FrameReg, Offset);
723           VariableCU->addVariableAddress(DV, VariableDie, Location);
724 
725         } else if (RegOp.getReg())
726           VariableCU->addVariableAddress(DV, VariableDie,
727                                          MachineLocation(RegOp.getReg()));
728         updated = true;
729       }
730       else if (DVInsn->getOperand(0).isImm())
731         updated =
732           VariableCU->addConstantValue(VariableDie, DVInsn->getOperand(0),
733                                        DV->getType());
734       else if (DVInsn->getOperand(0).isFPImm())
735         updated =
736           VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
737       else if (DVInsn->getOperand(0).isCImm())
738         updated =
739           VariableCU->addConstantValue(VariableDie,
740                                        DVInsn->getOperand(0).getCImm(),
741                                        isUnsignedDIType(DV->getType()));
742     } else {
743       VariableCU->addVariableAddress(DV, VariableDie,
744                                      Asm->getDebugValueLocation(DVInsn));
745       updated = true;
746     }
747     if (!updated) {
748       // If variableDie is not updated then DBG_VALUE instruction does not
749       // have valid variable info.
750       delete VariableDie;
751       return NULL;
752     }
753     DV->setDIE(VariableDie);
754     return VariableDie;
755   }
756 
757   // .. else use frame index, if available.
758   int FI = 0;
759   if (findVariableFrameIndex(DV, &FI)) {
760     unsigned FrameReg = 0;
761     const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
762     int Offset =
763       TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
764     MachineLocation Location(FrameReg, Offset);
765     VariableCU->addVariableAddress(DV, VariableDie, Location);
766   }
767 
768   DV->setDIE(VariableDie);
769   return VariableDie;
770 
771 }
772 
773 /// constructScopeDIE - Construct a DIE for this scope.
constructScopeDIE(DbgScope * Scope)774 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
775   if (!Scope || !Scope->getScopeNode())
776     return NULL;
777 
778   SmallVector <DIE *, 8> Children;
779 
780   // Collect arguments for current function.
781   if (Scope == CurrentFnDbgScope)
782     for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
783       if (DbgVariable *ArgDV = CurrentFnArguments[i])
784         if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
785           Children.push_back(Arg);
786 
787   // Collect lexical scope childrens first.
788   const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
789   for (unsigned i = 0, N = Variables.size(); i < N; ++i)
790     if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
791       Children.push_back(Variable);
792   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
793   for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
794     if (DIE *Nested = constructScopeDIE(Scopes[j]))
795       Children.push_back(Nested);
796   DIScope DS(Scope->getScopeNode());
797   DIE *ScopeDIE = NULL;
798   if (Scope->getInlinedAt())
799     ScopeDIE = constructInlinedScopeDIE(Scope);
800   else if (DS.isSubprogram()) {
801     ProcessedSPNodes.insert(DS);
802     if (Scope->isAbstractScope()) {
803       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
804       // Note down abstract DIE.
805       if (ScopeDIE)
806         AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
807     }
808     else
809       ScopeDIE = updateSubprogramScopeDIE(DS);
810   }
811   else {
812     // There is no need to emit empty lexical block DIE.
813     if (Children.empty())
814       return NULL;
815     ScopeDIE = constructLexicalScopeDIE(Scope);
816   }
817 
818   if (!ScopeDIE) return NULL;
819 
820   // Add children
821   for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
822          E = Children.end(); I != E; ++I)
823     ScopeDIE->addChild(*I);
824 
825   if (DS.isSubprogram())
826     getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
827 
828  return ScopeDIE;
829 }
830 
831 /// GetOrCreateSourceID - Look up the source id with the given directory and
832 /// source file names. If none currently exists, create a new id and insert it
833 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
834 /// maps as well.
835 
GetOrCreateSourceID(StringRef FileName,StringRef DirName)836 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
837                                          StringRef DirName) {
838   // If FE did not provide a file name, then assume stdin.
839   if (FileName.empty())
840     return GetOrCreateSourceID("<stdin>", StringRef());
841 
842   // MCStream expects full path name as filename.
843   if (!DirName.empty() && !sys::path::is_absolute(FileName)) {
844     SmallString<128> FullPathName = DirName;
845     sys::path::append(FullPathName, FileName);
846     // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
847     return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
848   }
849 
850   StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
851   if (Entry.getValue())
852     return Entry.getValue();
853 
854   unsigned SrcId = SourceIdMap.size();
855   Entry.setValue(SrcId);
856 
857   // Print out a .file directive to specify files for .loc directives.
858   Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
859 
860   return SrcId;
861 }
862 
863 /// constructCompileUnit - Create new CompileUnit for the given
864 /// metadata node with tag DW_TAG_compile_unit.
constructCompileUnit(const MDNode * N)865 void DwarfDebug::constructCompileUnit(const MDNode *N) {
866   DICompileUnit DIUnit(N);
867   StringRef FN = DIUnit.getFilename();
868   StringRef Dir = DIUnit.getDirectory();
869   unsigned ID = GetOrCreateSourceID(FN, Dir);
870 
871   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
872   CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
873   NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
874                    DIUnit.getProducer());
875   NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
876                  DIUnit.getLanguage());
877   NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
878   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
879   // simplifies debug range entries.
880   NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
881   // DW_AT_stmt_list is a offset of line number information for this
882   // compile unit in debug_line section.
883   if(Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
884     NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
885                     Asm->GetTempSymbol("section_line"));
886   else
887     NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
888 
889   if (!Dir.empty())
890     NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
891   if (DIUnit.isOptimized())
892     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
893 
894   StringRef Flags = DIUnit.getFlags();
895   if (!Flags.empty())
896     NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
897 
898   unsigned RVer = DIUnit.getRunTimeVersion();
899   if (RVer)
900     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
901             dwarf::DW_FORM_data1, RVer);
902 
903   if (!FirstCU)
904     FirstCU = NewCU;
905   CUMap.insert(std::make_pair(N, NewCU));
906 }
907 
908 /// getCompielUnit - Get CompileUnit DIE.
getCompileUnit(const MDNode * N) const909 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
910   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
911   DIDescriptor D(N);
912   const MDNode *CUNode = NULL;
913   if (D.isCompileUnit())
914     CUNode = N;
915   else if (D.isSubprogram())
916     CUNode = DISubprogram(N).getCompileUnit();
917   else if (D.isType())
918     CUNode = DIType(N).getCompileUnit();
919   else if (D.isGlobalVariable())
920     CUNode = DIGlobalVariable(N).getCompileUnit();
921   else if (D.isVariable())
922     CUNode = DIVariable(N).getCompileUnit();
923   else if (D.isNameSpace())
924     CUNode = DINameSpace(N).getCompileUnit();
925   else if (D.isFile())
926     CUNode = DIFile(N).getCompileUnit();
927   else
928     return FirstCU;
929 
930   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
931     = CUMap.find(CUNode);
932   if (I == CUMap.end())
933     return FirstCU;
934   return I->second;
935 }
936 
937 // Return const exprssion if value is a GEP to access merged global
938 // constant. e.g.
939 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
getMergedGlobalExpr(const Value * V)940 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
941   const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
942   if (!CE || CE->getNumOperands() != 3 ||
943       CE->getOpcode() != Instruction::GetElementPtr)
944     return NULL;
945 
946   // First operand points to a global value.
947   if (!isa<GlobalValue>(CE->getOperand(0)))
948     return NULL;
949 
950   // Second operand is zero.
951   const ConstantInt *CI =
952     dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
953   if (!CI || !CI->isZero())
954     return NULL;
955 
956   // Third operand is offset.
957   if (!isa<ConstantInt>(CE->getOperand(2)))
958     return NULL;
959 
960   return CE;
961 }
962 
963 /// constructGlobalVariableDIE - Construct global variable DIE.
constructGlobalVariableDIE(const MDNode * N)964 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
965   DIGlobalVariable GV(N);
966 
967   // If debug information is malformed then ignore it.
968   if (GV.Verify() == false)
969     return;
970 
971   // Check for pre-existence.
972   CompileUnit *TheCU = getCompileUnit(N);
973   if (TheCU->getDIE(GV))
974     return;
975 
976   DIType GTy = GV.getType();
977   DIE *VariableDIE = new DIE(GV.getTag());
978 
979   bool isGlobalVariable = GV.getGlobal() != NULL;
980 
981   // Add name.
982   TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
983                    GV.getDisplayName());
984   StringRef LinkageName = GV.getLinkageName();
985   if (!LinkageName.empty() && isGlobalVariable)
986     TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
987                      dwarf::DW_FORM_string,
988                      getRealLinkageName(LinkageName));
989   // Add type.
990   TheCU->addType(VariableDIE, GTy);
991 
992   // Add scoping info.
993   if (!GV.isLocalToUnit()) {
994     TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
995     // Expose as global.
996     TheCU->addGlobal(GV.getName(), VariableDIE);
997   }
998   // Add line number info.
999   TheCU->addSourceLine(VariableDIE, GV);
1000   // Add to map.
1001   TheCU->insertDIE(N, VariableDIE);
1002   // Add to context owner.
1003   DIDescriptor GVContext = GV.getContext();
1004   TheCU->addToContextOwner(VariableDIE, GVContext);
1005   // Add location.
1006   if (isGlobalVariable) {
1007     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1008     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1009     TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1010              Asm->Mang->getSymbol(GV.getGlobal()));
1011     // Do not create specification DIE if context is either compile unit
1012     // or a subprogram.
1013     if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1014         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1015       // Create specification DIE.
1016       DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1017       TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1018                   dwarf::DW_FORM_ref4, VariableDIE);
1019       TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1020       TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1021       TheCU->addDie(VariableSpecDIE);
1022     } else {
1023       TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1024     }
1025   } else if (const ConstantInt *CI =
1026              dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1027     TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
1028   else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1029     // GV is a merged global.
1030     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1031     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1032     TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1033                     Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
1034     ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
1035     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1036     TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
1037     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1038     TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1039   }
1040 
1041   return;
1042 }
1043 
1044 /// construct SubprogramDIE - Construct subprogram DIE.
constructSubprogramDIE(const MDNode * N)1045 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1046   DISubprogram SP(N);
1047 
1048   // Check for pre-existence.
1049   CompileUnit *TheCU = getCompileUnit(N);
1050   if (TheCU->getDIE(N))
1051     return;
1052 
1053   if (!SP.isDefinition())
1054     // This is a method declaration which will be handled while constructing
1055     // class type.
1056     return;
1057 
1058   DIE *SubprogramDie = createSubprogramDIE(SP);
1059 
1060   // Add to map.
1061   TheCU->insertDIE(N, SubprogramDie);
1062 
1063   // Add to context owner.
1064   TheCU->addToContextOwner(SubprogramDie, SP.getContext());
1065 
1066   // Expose as global.
1067   TheCU->addGlobal(SP.getName(), SubprogramDie);
1068 
1069   return;
1070 }
1071 
1072 /// beginModule - Emit all Dwarf sections that should come prior to the
1073 /// content. Create global DIEs and emit initial debug info sections.
1074 /// This is inovked by the target AsmPrinter.
beginModule(Module * M)1075 void DwarfDebug::beginModule(Module *M) {
1076   if (DisableDebugInfoPrinting)
1077     return;
1078 
1079   // If module has named metadata anchors then use them, otherwise scan the module
1080   // using debug info finder to collect debug info.
1081   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1082   if (CU_Nodes) {
1083 
1084     NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1085     NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1086     if (!GV_Nodes && !SP_Nodes)
1087       // If there are not any global variables or any functions then
1088       // there is not any debug info in this module.
1089       return;
1090 
1091     for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1092       constructCompileUnit(CU_Nodes->getOperand(i));
1093 
1094     if (GV_Nodes)
1095       for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1096         constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1097 
1098     if (SP_Nodes)
1099       for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1100         constructSubprogramDIE(SP_Nodes->getOperand(i));
1101 
1102   } else {
1103 
1104     DebugInfoFinder DbgFinder;
1105     DbgFinder.processModule(*M);
1106 
1107     bool HasDebugInfo = false;
1108     // Scan all the compile-units to see if there are any marked as the main unit.
1109     // if not, we do not generate debug info.
1110     for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1111            E = DbgFinder.compile_unit_end(); I != E; ++I) {
1112       if (DICompileUnit(*I).isMain()) {
1113         HasDebugInfo = true;
1114         break;
1115       }
1116     }
1117     if (!HasDebugInfo) return;
1118 
1119     // Create all the compile unit DIEs.
1120     for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1121            E = DbgFinder.compile_unit_end(); I != E; ++I)
1122       constructCompileUnit(*I);
1123 
1124     // Create DIEs for each global variable.
1125     for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1126            E = DbgFinder.global_variable_end(); I != E; ++I)
1127       constructGlobalVariableDIE(*I);
1128 
1129     // Create DIEs for each subprogram.
1130     for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1131            E = DbgFinder.subprogram_end(); I != E; ++I)
1132       constructSubprogramDIE(*I);
1133   }
1134 
1135   // Tell MMI that we have debug info.
1136   MMI->setDebugInfoAvailability(true);
1137 
1138   // Emit initial sections.
1139   EmitSectionLabels();
1140 
1141   //getOrCreateTypeDIE
1142   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
1143     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1144       DIType Ty(NMD->getOperand(i));
1145       getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1146     }
1147 
1148   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
1149     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1150       DIType Ty(NMD->getOperand(i));
1151       getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1152     }
1153 
1154   // Prime section data.
1155   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1156 }
1157 
1158 /// endModule - Emit all Dwarf sections that should come after the content.
1159 ///
endModule()1160 void DwarfDebug::endModule() {
1161   if (!FirstCU) return;
1162   const Module *M = MMI->getModule();
1163   DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
1164   if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1165     for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1166       if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1167       DISubprogram SP(AllSPs->getOperand(SI));
1168       if (!SP.Verify()) continue;
1169 
1170       // Collect info for variables that were optimized out.
1171       if (!SP.isDefinition()) continue;
1172       StringRef FName = SP.getLinkageName();
1173       if (FName.empty())
1174         FName = SP.getName();
1175       NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
1176       if (!NMD) continue;
1177       unsigned E = NMD->getNumOperands();
1178       if (!E) continue;
1179       DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
1180       DeadFnScopeMap[SP] = Scope;
1181       for (unsigned I = 0; I != E; ++I) {
1182         DIVariable DV(NMD->getOperand(I));
1183         if (!DV.Verify()) continue;
1184         Scope->addVariable(new DbgVariable(DV));
1185       }
1186 
1187       // Construct subprogram DIE and add variables DIEs.
1188       constructSubprogramDIE(SP);
1189       DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
1190       const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1191       for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1192         DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1193         if (VariableDIE)
1194           ScopeDIE->addChild(VariableDIE);
1195       }
1196     }
1197   }
1198 
1199   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1200   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1201          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1202     DIE *ISP = *AI;
1203     FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1204   }
1205 
1206   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1207          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1208     DIE *SPDie = CI->first;
1209     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1210     if (!N) continue;
1211     DIE *NDie = getCompileUnit(N)->getDIE(N);
1212     if (!NDie) continue;
1213     getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1214                                    dwarf::DW_FORM_ref4, NDie);
1215   }
1216 
1217   // Standard sections final addresses.
1218   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1219   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1220   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1221   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1222 
1223   // End text sections.
1224   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1225     Asm->OutStreamer.SwitchSection(SectionMap[i]);
1226     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1227   }
1228 
1229   // Compute DIE offsets and sizes.
1230   computeSizeAndOffsets();
1231 
1232   // Emit all the DIEs into a debug info section
1233   emitDebugInfo();
1234 
1235   // Corresponding abbreviations into a abbrev section.
1236   emitAbbreviations();
1237 
1238   // Emit info into a debug pubnames section.
1239   emitDebugPubNames();
1240 
1241   // Emit info into a debug pubtypes section.
1242   emitDebugPubTypes();
1243 
1244   // Emit info into a debug loc section.
1245   emitDebugLoc();
1246 
1247   // Emit info into a debug aranges section.
1248   EmitDebugARanges();
1249 
1250   // Emit info into a debug ranges section.
1251   emitDebugRanges();
1252 
1253   // Emit info into a debug macinfo section.
1254   emitDebugMacInfo();
1255 
1256   // Emit inline info.
1257   emitDebugInlineInfo();
1258 
1259   // Emit info into a debug str section.
1260   emitDebugStr();
1261 
1262   // clean up.
1263   DeleteContainerSeconds(DeadFnScopeMap);
1264   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1265          E = CUMap.end(); I != E; ++I)
1266     delete I->second;
1267   FirstCU = NULL;  // Reset for the next Module, if any.
1268 }
1269 
1270 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
findAbstractVariable(DIVariable & DV,DebugLoc ScopeLoc)1271 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
1272                                               DebugLoc ScopeLoc) {
1273   LLVMContext &Ctx = DV->getContext();
1274 
1275   // More then one inlined variable corresponds to one abstract variable.
1276   DIVariable Var = cleanseInlinedVariable(DV, Ctx);
1277 
1278   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1279   if (AbsDbgVariable)
1280     return AbsDbgVariable;
1281 
1282 
1283   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1284   if (!Scope)
1285     return NULL;
1286 
1287   AbsDbgVariable = new DbgVariable(Var);
1288   Scope->addVariable(AbsDbgVariable);
1289   AbstractVariables[Var] = AbsDbgVariable;
1290   return AbsDbgVariable;
1291 }
1292 
1293 /// addCurrentFnArgument - If Var is an current function argument that add
1294 /// it in CurrentFnArguments list.
addCurrentFnArgument(const MachineFunction * MF,DbgVariable * Var,DbgScope * Scope)1295 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1296                                       DbgVariable *Var, DbgScope *Scope) {
1297   if (Scope != CurrentFnDbgScope)
1298     return false;
1299   DIVariable DV = Var->getVariable();
1300   if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1301     return false;
1302   unsigned ArgNo = DV.getArgNumber();
1303   if (ArgNo == 0)
1304     return false;
1305 
1306   size_t Size = CurrentFnArguments.size();
1307   if (Size == 0)
1308     CurrentFnArguments.resize(MF->getFunction()->arg_size());
1309   // llvm::Function argument size is not good indicator of how many
1310   // arguments does the function have at source level.
1311   if (ArgNo > Size)
1312     CurrentFnArguments.resize(ArgNo * 2);
1313   CurrentFnArguments[ArgNo - 1] = Var;
1314   return true;
1315 }
1316 
1317 /// collectVariableInfoFromMMITable - Collect variable information from
1318 /// side table maintained by MMI.
1319 void
collectVariableInfoFromMMITable(const MachineFunction * MF,SmallPtrSet<const MDNode *,16> & Processed)1320 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
1321                                    SmallPtrSet<const MDNode *, 16> &Processed) {
1322   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1323   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1324          VE = VMap.end(); VI != VE; ++VI) {
1325     const MDNode *Var = VI->first;
1326     if (!Var) continue;
1327     Processed.insert(Var);
1328     DIVariable DV(Var);
1329     const std::pair<unsigned, DebugLoc> &VP = VI->second;
1330 
1331     DbgScope *Scope = findDbgScope(VP.second);
1332 
1333     // If variable scope is not found then skip this variable.
1334     if (Scope == 0)
1335       continue;
1336 
1337     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1338     DbgVariable *RegVar = new DbgVariable(DV);
1339     recordVariableFrameIndex(RegVar, VP.first);
1340     if (!addCurrentFnArgument(MF, RegVar, Scope))
1341       Scope->addVariable(RegVar);
1342     if (AbsDbgVariable) {
1343       recordVariableFrameIndex(AbsDbgVariable, VP.first);
1344       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1345     }
1346   }
1347 }
1348 
1349 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
1350 /// DBG_VALUE instruction, is in a defined reg.
isDbgValueInDefinedReg(const MachineInstr * MI)1351 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1352   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1353   return MI->getNumOperands() == 3 &&
1354          MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1355          MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1356 }
1357 
1358 /// getDebugLocEntry - Get .debug_loc entry for the instraction range starting
1359 /// at MI.
getDebugLocEntry(AsmPrinter * Asm,const MCSymbol * FLabel,const MCSymbol * SLabel,const MachineInstr * MI)1360 static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1361                                          const MCSymbol *FLabel,
1362                                          const MCSymbol *SLabel,
1363                                          const MachineInstr *MI) {
1364   const MDNode *Var =  MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1365 
1366   if (MI->getNumOperands() != 3) {
1367     MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1368     return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1369   }
1370   if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1371     MachineLocation MLoc;
1372     MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1373     return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1374   }
1375   if (MI->getOperand(0).isImm())
1376     return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1377   if (MI->getOperand(0).isFPImm())
1378     return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1379   if (MI->getOperand(0).isCImm())
1380     return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1381 
1382   assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
1383   return DotDebugLocEntry();
1384 }
1385 
1386 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1387 void
collectVariableInfo(const MachineFunction * MF,SmallPtrSet<const MDNode *,16> & Processed)1388 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1389                                 SmallPtrSet<const MDNode *, 16> &Processed) {
1390 
1391   /// collection info from MMI table.
1392   collectVariableInfoFromMMITable(MF, Processed);
1393 
1394   for (SmallVectorImpl<const MDNode*>::const_iterator
1395          UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1396          ++UVI) {
1397     const MDNode *Var = *UVI;
1398     if (Processed.count(Var))
1399       continue;
1400 
1401     // History contains relevant DBG_VALUE instructions for Var and instructions
1402     // clobbering it.
1403     SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1404     if (History.empty())
1405       continue;
1406     const MachineInstr *MInsn = History.front();
1407 
1408     DIVariable DV(Var);
1409     DbgScope *Scope = NULL;
1410     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1411         DISubprogram(DV.getContext()).describes(MF->getFunction()))
1412       Scope = CurrentFnDbgScope;
1413     else
1414       Scope = findDbgScope(MInsn->getDebugLoc());
1415     // If variable scope is not found then skip this variable.
1416     if (!Scope)
1417       continue;
1418 
1419     Processed.insert(DV);
1420     assert(MInsn->isDebugValue() && "History must begin with debug value");
1421     DbgVariable *RegVar = new DbgVariable(DV);
1422     if (!addCurrentFnArgument(MF, RegVar, Scope))
1423       Scope->addVariable(RegVar);
1424     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1425       DbgVariableToDbgInstMap[AbsVar] = MInsn;
1426       VarToAbstractVarMap[RegVar] = AbsVar;
1427     }
1428 
1429     // Simple ranges that are fully coalesced.
1430     if (History.size() <= 1 || (History.size() == 2 &&
1431                                 MInsn->isIdenticalTo(History.back()))) {
1432       DbgVariableToDbgInstMap[RegVar] = MInsn;
1433       continue;
1434     }
1435 
1436     // handle multiple DBG_VALUE instructions describing one variable.
1437     RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1438 
1439     for (SmallVectorImpl<const MachineInstr*>::const_iterator
1440            HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1441       const MachineInstr *Begin = *HI;
1442       assert(Begin->isDebugValue() && "Invalid History entry");
1443 
1444       // Check if DBG_VALUE is truncating a range.
1445       if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1446           && !Begin->getOperand(0).getReg())
1447         continue;
1448 
1449       // Compute the range for a register location.
1450       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1451       const MCSymbol *SLabel = 0;
1452 
1453       if (HI + 1 == HE)
1454         // If Begin is the last instruction in History then its value is valid
1455         // until the end of the function.
1456         SLabel = FunctionEndSym;
1457       else {
1458         const MachineInstr *End = HI[1];
1459         DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1460               << "\t" << *Begin << "\t" << *End << "\n");
1461         if (End->isDebugValue())
1462           SLabel = getLabelBeforeInsn(End);
1463         else {
1464           // End is a normal instruction clobbering the range.
1465           SLabel = getLabelAfterInsn(End);
1466           assert(SLabel && "Forgot label after clobber instruction");
1467           ++HI;
1468         }
1469       }
1470 
1471       // The value is valid until the next DBG_VALUE or clobber.
1472       DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
1473     }
1474     DotDebugLocEntries.push_back(DotDebugLocEntry());
1475   }
1476 
1477   // Collect info for variables that were optimized out.
1478   const Function *F = MF->getFunction();
1479   if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
1480     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1481       DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
1482       if (!DV || !Processed.insert(DV))
1483         continue;
1484       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1485       if (Scope)
1486         Scope->addVariable(new DbgVariable(DV));
1487     }
1488   }
1489 }
1490 
1491 /// getLabelBeforeInsn - Return Label preceding the instruction.
getLabelBeforeInsn(const MachineInstr * MI)1492 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1493   MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1494   assert(Label && "Didn't insert label before instruction");
1495   return Label;
1496 }
1497 
1498 /// getLabelAfterInsn - Return Label immediately following the instruction.
getLabelAfterInsn(const MachineInstr * MI)1499 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1500   return LabelsAfterInsn.lookup(MI);
1501 }
1502 
1503 /// beginInstruction - Process beginning of an instruction.
beginInstruction(const MachineInstr * MI)1504 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1505   // Check if source location changes, but ignore DBG_VALUE locations.
1506   if (!MI->isDebugValue()) {
1507     DebugLoc DL = MI->getDebugLoc();
1508     if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1509       unsigned Flags = DWARF2_FLAG_IS_STMT;
1510       PrevInstLoc = DL;
1511       if (DL == PrologEndLoc) {
1512         Flags |= DWARF2_FLAG_PROLOGUE_END;
1513         PrologEndLoc = DebugLoc();
1514       }
1515       if (!DL.isUnknown()) {
1516         const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1517         recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1518       } else
1519         recordSourceLine(0, 0, 0, 0);
1520     }
1521   }
1522 
1523   // Insert labels where requested.
1524   DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1525     LabelsBeforeInsn.find(MI);
1526 
1527   // No label needed.
1528   if (I == LabelsBeforeInsn.end())
1529     return;
1530 
1531   // Label already assigned.
1532   if (I->second)
1533     return;
1534 
1535   if (!PrevLabel) {
1536     PrevLabel = MMI->getContext().CreateTempSymbol();
1537     Asm->OutStreamer.EmitLabel(PrevLabel);
1538   }
1539   I->second = PrevLabel;
1540 }
1541 
1542 /// endInstruction - Process end of an instruction.
endInstruction(const MachineInstr * MI)1543 void DwarfDebug::endInstruction(const MachineInstr *MI) {
1544   // Don't create a new label after DBG_VALUE instructions.
1545   // They don't generate code.
1546   if (!MI->isDebugValue())
1547     PrevLabel = 0;
1548 
1549   DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1550     LabelsAfterInsn.find(MI);
1551 
1552   // No label needed.
1553   if (I == LabelsAfterInsn.end())
1554     return;
1555 
1556   // Label already assigned.
1557   if (I->second)
1558     return;
1559 
1560   // We need a label after this instruction.
1561   if (!PrevLabel) {
1562     PrevLabel = MMI->getContext().CreateTempSymbol();
1563     Asm->OutStreamer.EmitLabel(PrevLabel);
1564   }
1565   I->second = PrevLabel;
1566 }
1567 
1568 /// getOrCreateDbgScope - Create DbgScope for the scope.
getOrCreateDbgScope(DebugLoc DL)1569 DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
1570   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1571   MDNode *Scope = NULL;
1572   MDNode *InlinedAt = NULL;
1573   DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
1574 
1575   if (!InlinedAt) {
1576     DbgScope *WScope = DbgScopeMap.lookup(Scope);
1577     if (WScope)
1578       return WScope;
1579     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1580     DbgScopeMap.insert(std::make_pair(Scope, WScope));
1581     if (DIDescriptor(Scope).isLexicalBlock()) {
1582       DbgScope *Parent =
1583         getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
1584       WScope->setParent(Parent);
1585       Parent->addScope(WScope);
1586     } else if (DIDescriptor(Scope).isSubprogram()
1587                && DISubprogram(Scope).describes(Asm->MF->getFunction()))
1588       CurrentFnDbgScope = WScope;
1589 
1590     return WScope;
1591   }
1592 
1593   getOrCreateAbstractScope(Scope);
1594   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1595   if (WScope)
1596     return WScope;
1597 
1598   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1599   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1600   InlinedDbgScopeMap[DebugLoc::getFromDILocation(InlinedAt)] = WScope;
1601   DbgScope *Parent =
1602     getOrCreateDbgScope(DebugLoc::getFromDILocation(InlinedAt));
1603   WScope->setParent(Parent);
1604   Parent->addScope(WScope);
1605   return WScope;
1606 }
1607 
1608 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
1609 /// hierarchy.
calculateDominanceGraph(DbgScope * Scope)1610 static void calculateDominanceGraph(DbgScope *Scope) {
1611   assert (Scope && "Unable to calculate scop edominance graph!");
1612   SmallVector<DbgScope *, 4> WorkStack;
1613   WorkStack.push_back(Scope);
1614   unsigned Counter = 0;
1615   while (!WorkStack.empty()) {
1616     DbgScope *WS = WorkStack.back();
1617     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1618     bool visitedChildren = false;
1619     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1620            SE = Children.end(); SI != SE; ++SI) {
1621       DbgScope *ChildScope = *SI;
1622       if (!ChildScope->getDFSOut()) {
1623         WorkStack.push_back(ChildScope);
1624         visitedChildren = true;
1625         ChildScope->setDFSIn(++Counter);
1626         break;
1627       }
1628     }
1629     if (!visitedChildren) {
1630       WorkStack.pop_back();
1631       WS->setDFSOut(++Counter);
1632     }
1633   }
1634 }
1635 
1636 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
1637 static
printDbgScopeInfo(const MachineFunction * MF,DenseMap<const MachineInstr *,DbgScope * > & MI2ScopeMap)1638 void printDbgScopeInfo(const MachineFunction *MF,
1639                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1640 {
1641 #ifndef NDEBUG
1642   LLVMContext &Ctx = MF->getFunction()->getContext();
1643   unsigned PrevDFSIn = 0;
1644   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1645        I != E; ++I) {
1646     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1647          II != IE; ++II) {
1648       const MachineInstr *MInsn = II;
1649       MDNode *Scope = NULL;
1650       MDNode *InlinedAt = NULL;
1651 
1652       // Check if instruction has valid location information.
1653       DebugLoc MIDL = MInsn->getDebugLoc();
1654       if (!MIDL.isUnknown()) {
1655         MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
1656         dbgs() << " [ ";
1657         if (InlinedAt)
1658           dbgs() << "*";
1659         DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
1660           MI2ScopeMap.find(MInsn);
1661         if (DI != MI2ScopeMap.end()) {
1662           DbgScope *S = DI->second;
1663           dbgs() << S->getDFSIn();
1664           PrevDFSIn = S->getDFSIn();
1665         } else
1666           dbgs() << PrevDFSIn;
1667       } else
1668         dbgs() << " [ x" << PrevDFSIn;
1669       dbgs() << " ]";
1670       MInsn->dump();
1671     }
1672     dbgs() << "\n";
1673   }
1674 #endif
1675 }
1676 /// extractScopeInformation - Scan machine instructions in this function
1677 /// and collect DbgScopes. Return true, if at least one scope was found.
extractScopeInformation()1678 bool DwarfDebug::extractScopeInformation() {
1679   // If scope information was extracted using .dbg intrinsics then there is not
1680   // any need to extract these information by scanning each instruction.
1681   if (!DbgScopeMap.empty())
1682     return false;
1683 
1684   // Scan each instruction and create scopes. First build working set of scopes.
1685   SmallVector<DbgRange, 4> MIRanges;
1686   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
1687   DebugLoc PrevDL;
1688   const MachineInstr *RangeBeginMI = NULL;
1689   const MachineInstr *PrevMI = NULL;
1690   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
1691        I != E; ++I) {
1692     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1693          II != IE; ++II) {
1694       const MachineInstr *MInsn = II;
1695 
1696       // Check if instruction has valid location information.
1697       const DebugLoc MIDL = MInsn->getDebugLoc();
1698       if (MIDL.isUnknown()) {
1699         PrevMI = MInsn;
1700         continue;
1701       }
1702 
1703       // If scope has not changed then skip this instruction.
1704       if (MIDL == PrevDL) {
1705         PrevMI = MInsn;
1706         continue;
1707       }
1708 
1709       // Ignore DBG_VALUE. It does not contribute any instruction in output.
1710       if (MInsn->isDebugValue())
1711         continue;
1712 
1713       if (RangeBeginMI) {
1714         // If we have alread seen a beginning of a instruction range and
1715         // current instruction scope does not match scope of first instruction
1716         // in this range then create a new instruction range.
1717         DEBUG(dbgs() << "Creating new instruction range :\n");
1718         DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
1719         DEBUG(dbgs() << "End Range at " << *PrevMI);
1720         DEBUG(dbgs() << "Next Range starting at " << *MInsn);
1721         DEBUG(dbgs() << "------------------------\n");
1722         DbgRange R(RangeBeginMI, PrevMI);
1723         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1724         MIRanges.push_back(R);
1725       }
1726 
1727       // This is a beginning of a new instruction range.
1728       RangeBeginMI = MInsn;
1729 
1730       // Reset previous markers.
1731       PrevMI = MInsn;
1732       PrevDL = MIDL;
1733     }
1734   }
1735 
1736   // Create last instruction range.
1737   if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
1738     DbgRange R(RangeBeginMI, PrevMI);
1739     MIRanges.push_back(R);
1740     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1741   }
1742 
1743   if (!CurrentFnDbgScope)
1744     return false;
1745 
1746   calculateDominanceGraph(CurrentFnDbgScope);
1747   if (PrintDbgScope)
1748     printDbgScopeInfo(Asm->MF, MI2ScopeMap);
1749 
1750   // Find ranges of instructions covered by each DbgScope;
1751   DbgScope *PrevDbgScope = NULL;
1752   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1753          RE = MIRanges.end(); RI != RE; ++RI) {
1754     const DbgRange &R = *RI;
1755     DbgScope *S = MI2ScopeMap.lookup(R.first);
1756     assert (S && "Lost DbgScope for a machine instruction!");
1757     if (PrevDbgScope && !PrevDbgScope->dominates(S))
1758       PrevDbgScope->closeInsnRange(S);
1759     S->openInsnRange(R.first);
1760     S->extendInsnRange(R.second);
1761     PrevDbgScope = S;
1762   }
1763 
1764   if (PrevDbgScope)
1765     PrevDbgScope->closeInsnRange();
1766 
1767   identifyScopeMarkers();
1768 
1769   return !DbgScopeMap.empty();
1770 }
1771 
1772 /// identifyScopeMarkers() -
1773 /// Each DbgScope has first instruction and last instruction to mark beginning
1774 /// and end of a scope respectively. Create an inverse map that list scopes
1775 /// starts (and ends) with an instruction. One instruction may start (or end)
1776 /// multiple scopes. Ignore scopes that are not reachable.
identifyScopeMarkers()1777 void DwarfDebug::identifyScopeMarkers() {
1778   SmallVector<DbgScope *, 4> WorkList;
1779   WorkList.push_back(CurrentFnDbgScope);
1780   while (!WorkList.empty()) {
1781     DbgScope *S = WorkList.pop_back_val();
1782 
1783     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
1784     if (!Children.empty())
1785       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1786              SE = Children.end(); SI != SE; ++SI)
1787         WorkList.push_back(*SI);
1788 
1789     if (S->isAbstractScope())
1790       continue;
1791 
1792     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1793     if (Ranges.empty())
1794       continue;
1795     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1796            RE = Ranges.end(); RI != RE; ++RI) {
1797       assert(RI->first && "DbgRange does not have first instruction!");
1798       assert(RI->second && "DbgRange does not have second instruction!");
1799       requestLabelBeforeInsn(RI->first);
1800       requestLabelAfterInsn(RI->second);
1801     }
1802   }
1803 }
1804 
1805 /// getScopeNode - Get MDNode for DebugLoc's scope.
getScopeNode(DebugLoc DL,const LLVMContext & Ctx)1806 static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1807   if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1808     return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1809   return DL.getScope(Ctx);
1810 }
1811 
1812 /// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1813 /// line number  info for the function.
getFnDebugLoc(DebugLoc DL,const LLVMContext & Ctx)1814 static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1815   const MDNode *Scope = getScopeNode(DL, Ctx);
1816   DISubprogram SP = getDISubprogram(Scope);
1817   if (SP.Verify())
1818     return DebugLoc::get(SP.getLineNumber(), 0, SP);
1819   return DebugLoc();
1820 }
1821 
1822 /// beginFunction - Gather pre-function debug information.  Assumes being
1823 /// emitted immediately after the function entry point.
beginFunction(const MachineFunction * MF)1824 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1825   if (!MMI->hasDebugInfo()) return;
1826   if (!extractScopeInformation()) return;
1827 
1828   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1829                                         Asm->getFunctionNumber());
1830   // Assumes in correct section after the entry point.
1831   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1832 
1833   assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1834 
1835   const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1836   /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1837   std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1838 
1839   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1840        I != E; ++I) {
1841     bool AtBlockEntry = true;
1842     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1843          II != IE; ++II) {
1844       const MachineInstr *MI = II;
1845 
1846       if (MI->isDebugValue()) {
1847         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
1848 
1849         // Keep track of user variables.
1850         const MDNode *Var =
1851           MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1852 
1853         // Variable is in a register, we need to check for clobbers.
1854         if (isDbgValueInDefinedReg(MI))
1855           LiveUserVar[MI->getOperand(0).getReg()] = Var;
1856 
1857         // Check the history of this variable.
1858         SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1859         if (History.empty()) {
1860           UserVariables.push_back(Var);
1861           // The first mention of a function argument gets the FunctionBeginSym
1862           // label, so arguments are visible when breaking at function entry.
1863           DIVariable DV(Var);
1864           if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1865               DISubprogram(getDISubprogram(DV.getContext()))
1866                 .describes(MF->getFunction()))
1867             LabelsBeforeInsn[MI] = FunctionBeginSym;
1868         } else {
1869           // We have seen this variable before. Try to coalesce DBG_VALUEs.
1870           const MachineInstr *Prev = History.back();
1871           if (Prev->isDebugValue()) {
1872             // Coalesce identical entries at the end of History.
1873             if (History.size() >= 2 &&
1874                 Prev->isIdenticalTo(History[History.size() - 2])) {
1875               DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1876                     << "\t" << *Prev
1877                     << "\t" << *History[History.size() - 2] << "\n");
1878               History.pop_back();
1879             }
1880 
1881             // Terminate old register assignments that don't reach MI;
1882             MachineFunction::const_iterator PrevMBB = Prev->getParent();
1883             if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1884                 isDbgValueInDefinedReg(Prev)) {
1885               // Previous register assignment needs to terminate at the end of
1886               // its basic block.
1887               MachineBasicBlock::const_iterator LastMI =
1888                 PrevMBB->getLastNonDebugInstr();
1889               if (LastMI == PrevMBB->end()) {
1890                 // Drop DBG_VALUE for empty range.
1891                 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1892                       << "\t" << *Prev << "\n");
1893                 History.pop_back();
1894               }
1895               else {
1896                 // Terminate after LastMI.
1897                 History.push_back(LastMI);
1898               }
1899             }
1900           }
1901         }
1902         History.push_back(MI);
1903       } else {
1904         // Not a DBG_VALUE instruction.
1905         if (!MI->isLabel())
1906           AtBlockEntry = false;
1907 
1908         // First known non DBG_VALUE location marks beginning of function
1909         // body.
1910         if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1911           PrologEndLoc = MI->getDebugLoc();
1912 
1913         // Check if the instruction clobbers any registers with debug vars.
1914         for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1915                MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1916           if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1917             continue;
1918           for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1919                unsigned Reg = *AI; ++AI) {
1920             const MDNode *Var = LiveUserVar[Reg];
1921             if (!Var)
1922               continue;
1923             // Reg is now clobbered.
1924             LiveUserVar[Reg] = 0;
1925 
1926             // Was MD last defined by a DBG_VALUE referring to Reg?
1927             DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1928             if (HistI == DbgValues.end())
1929               continue;
1930             SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1931             if (History.empty())
1932               continue;
1933             const MachineInstr *Prev = History.back();
1934             // Sanity-check: Register assignments are terminated at the end of
1935             // their block.
1936             if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1937               continue;
1938             // Is the variable still in Reg?
1939             if (!isDbgValueInDefinedReg(Prev) ||
1940                 Prev->getOperand(0).getReg() != Reg)
1941               continue;
1942             // Var is clobbered. Make sure the next instruction gets a label.
1943             History.push_back(MI);
1944           }
1945         }
1946       }
1947     }
1948   }
1949 
1950   for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1951        I != E; ++I) {
1952     SmallVectorImpl<const MachineInstr*> &History = I->second;
1953     if (History.empty())
1954       continue;
1955 
1956     // Make sure the final register assignments are terminated.
1957     const MachineInstr *Prev = History.back();
1958     if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1959       const MachineBasicBlock *PrevMBB = Prev->getParent();
1960       MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
1961       if (LastMI == PrevMBB->end())
1962         // Drop DBG_VALUE for empty range.
1963         History.pop_back();
1964       else {
1965         // Terminate after LastMI.
1966         History.push_back(LastMI);
1967       }
1968     }
1969     // Request labels for the full history.
1970     for (unsigned i = 0, e = History.size(); i != e; ++i) {
1971       const MachineInstr *MI = History[i];
1972       if (MI->isDebugValue())
1973         requestLabelBeforeInsn(MI);
1974       else
1975         requestLabelAfterInsn(MI);
1976     }
1977   }
1978 
1979   PrevInstLoc = DebugLoc();
1980   PrevLabel = FunctionBeginSym;
1981 
1982   // Record beginning of function.
1983   if (!PrologEndLoc.isUnknown()) {
1984     DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1985                                        MF->getFunction()->getContext());
1986     recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1987                      FnStartDL.getScope(MF->getFunction()->getContext()),
1988                      DWARF2_FLAG_IS_STMT);
1989   }
1990 }
1991 
1992 /// endFunction - Gather and emit post-function debug information.
1993 ///
endFunction(const MachineFunction * MF)1994 void DwarfDebug::endFunction(const MachineFunction *MF) {
1995   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
1996 
1997   if (CurrentFnDbgScope) {
1998 
1999     // Define end label for subprogram.
2000     FunctionEndSym = Asm->GetTempSymbol("func_end",
2001                                         Asm->getFunctionNumber());
2002     // Assumes in correct section after the entry point.
2003     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2004 
2005     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2006     collectVariableInfo(MF, ProcessedVars);
2007 
2008     // Construct abstract scopes.
2009     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2010            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2011       DISubprogram SP((*AI)->getScopeNode());
2012       if (SP.Verify()) {
2013         // Collect info for variables that were optimized out.
2014         StringRef FName = SP.getLinkageName();
2015         if (FName.empty())
2016           FName = SP.getName();
2017         if (NamedMDNode *NMD =
2018             getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2019           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2020           DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2021           if (!DV || !ProcessedVars.insert(DV))
2022             continue;
2023           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2024           if (Scope)
2025             Scope->addVariable(new DbgVariable(DV));
2026           }
2027         }
2028       }
2029       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2030         constructScopeDIE(*AI);
2031     }
2032 
2033     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2034 
2035     if (!DisableFramePointerElim(*MF))
2036       getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2037                                                                  dwarf::DW_AT_APPLE_omit_frame_ptr,
2038                                                                  dwarf::DW_FORM_flag, 1);
2039 
2040 
2041     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2042                                                  MMI->getFrameMoves()));
2043   }
2044 
2045   // Clear debug info
2046   CurrentFnDbgScope = NULL;
2047   DeleteContainerPointers(CurrentFnArguments);
2048   DbgVariableToFrameIndexMap.clear();
2049   VarToAbstractVarMap.clear();
2050   DbgVariableToDbgInstMap.clear();
2051   InlinedDbgScopeMap.clear();
2052   DeleteContainerSeconds(DbgScopeMap);
2053   UserVariables.clear();
2054   DbgValues.clear();
2055   DeleteContainerSeconds(AbstractScopes);
2056   AbstractScopesList.clear();
2057   AbstractVariables.clear();
2058   LabelsBeforeInsn.clear();
2059   LabelsAfterInsn.clear();
2060   PrevLabel = NULL;
2061 }
2062 
2063 /// recordVariableFrameIndex - Record a variable's index.
recordVariableFrameIndex(const DbgVariable * V,int Index)2064 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2065   assert (V && "Invalid DbgVariable!");
2066   DbgVariableToFrameIndexMap[V] = Index;
2067 }
2068 
2069 /// findVariableFrameIndex - Return true if frame index for the variable
2070 /// is found. Update FI to hold value of the index.
findVariableFrameIndex(const DbgVariable * V,int * FI)2071 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2072   assert (V && "Invalid DbgVariable!");
2073   DenseMap<const DbgVariable *, int>::iterator I =
2074     DbgVariableToFrameIndexMap.find(V);
2075   if (I == DbgVariableToFrameIndexMap.end())
2076     return false;
2077   *FI = I->second;
2078   return true;
2079 }
2080 
2081 /// findDbgScope - Find DbgScope for the debug loc.
findDbgScope(DebugLoc DL)2082 DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
2083   if (DL.isUnknown())
2084     return NULL;
2085 
2086   DbgScope *Scope = NULL;
2087   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2088   if (MDNode *IA = DL.getInlinedAt(Ctx))
2089     Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
2090   else
2091     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2092   return Scope;
2093 }
2094 
2095 
2096 /// recordSourceLine - Register a source line with debug info. Returns the
2097 /// unique label that was emitted and which provides correspondence to
2098 /// the source line list.
recordSourceLine(unsigned Line,unsigned Col,const MDNode * S,unsigned Flags)2099 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2100                                   unsigned Flags) {
2101   StringRef Fn;
2102   StringRef Dir;
2103   unsigned Src = 1;
2104   if (S) {
2105     DIDescriptor Scope(S);
2106 
2107     if (Scope.isCompileUnit()) {
2108       DICompileUnit CU(S);
2109       Fn = CU.getFilename();
2110       Dir = CU.getDirectory();
2111     } else if (Scope.isFile()) {
2112       DIFile F(S);
2113       Fn = F.getFilename();
2114       Dir = F.getDirectory();
2115     } else if (Scope.isSubprogram()) {
2116       DISubprogram SP(S);
2117       Fn = SP.getFilename();
2118       Dir = SP.getDirectory();
2119     } else if (Scope.isLexicalBlock()) {
2120       DILexicalBlock DB(S);
2121       Fn = DB.getFilename();
2122       Dir = DB.getDirectory();
2123     } else
2124       assert(0 && "Unexpected scope info");
2125 
2126     Src = GetOrCreateSourceID(Fn, Dir);
2127   }
2128   Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags,
2129                                          0, 0, Fn);
2130 }
2131 
2132 //===----------------------------------------------------------------------===//
2133 // Emit Methods
2134 //===----------------------------------------------------------------------===//
2135 
2136 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2137 ///
2138 unsigned
computeSizeAndOffset(DIE * Die,unsigned Offset,bool Last)2139 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2140   // Get the children.
2141   const std::vector<DIE *> &Children = Die->getChildren();
2142 
2143   // If not last sibling and has children then add sibling offset attribute.
2144   if (!Last && !Children.empty())
2145     Die->addSiblingOffset(DIEValueAllocator);
2146 
2147   // Record the abbreviation.
2148   assignAbbrevNumber(Die->getAbbrev());
2149 
2150   // Get the abbreviation for this DIE.
2151   unsigned AbbrevNumber = Die->getAbbrevNumber();
2152   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2153 
2154   // Set DIE offset
2155   Die->setOffset(Offset);
2156 
2157   // Start the size with the size of abbreviation code.
2158   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2159 
2160   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2161   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2162 
2163   // Size the DIE attribute values.
2164   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2165     // Size attribute value.
2166     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2167 
2168   // Size the DIE children if any.
2169   if (!Children.empty()) {
2170     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2171            "Children flag not set");
2172 
2173     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2174       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2175 
2176     // End of children marker.
2177     Offset += sizeof(int8_t);
2178   }
2179 
2180   Die->setSize(Offset - Die->getOffset());
2181   return Offset;
2182 }
2183 
2184 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2185 ///
computeSizeAndOffsets()2186 void DwarfDebug::computeSizeAndOffsets() {
2187   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2188          E = CUMap.end(); I != E; ++I) {
2189     // Compute size of compile unit header.
2190     unsigned Offset =
2191       sizeof(int32_t) + // Length of Compilation Unit Info
2192       sizeof(int16_t) + // DWARF version number
2193       sizeof(int32_t) + // Offset Into Abbrev. Section
2194       sizeof(int8_t);   // Pointer Size (in bytes)
2195     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2196   }
2197 }
2198 
2199 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2200 /// temporary label to it if SymbolStem is specified.
EmitSectionSym(AsmPrinter * Asm,const MCSection * Section,const char * SymbolStem=0)2201 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2202                                 const char *SymbolStem = 0) {
2203   Asm->OutStreamer.SwitchSection(Section);
2204   if (!SymbolStem) return 0;
2205 
2206   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2207   Asm->OutStreamer.EmitLabel(TmpSym);
2208   return TmpSym;
2209 }
2210 
2211 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2212 /// the start of each one.
EmitSectionLabels()2213 void DwarfDebug::EmitSectionLabels() {
2214   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2215 
2216   // Dwarf sections base addresses.
2217   DwarfInfoSectionSym =
2218     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2219   DwarfAbbrevSectionSym =
2220     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2221   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2222 
2223   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2224     EmitSectionSym(Asm, MacroInfo);
2225 
2226   EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
2227   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2228   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2229   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2230   DwarfStrSectionSym =
2231     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2232   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2233                                              "debug_range");
2234 
2235   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2236                                            "section_debug_loc");
2237 
2238   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2239   EmitSectionSym(Asm, TLOF.getDataSection());
2240 }
2241 
2242 /// emitDIE - Recusively Emits a debug information entry.
2243 ///
emitDIE(DIE * Die)2244 void DwarfDebug::emitDIE(DIE *Die) {
2245   // Get the abbreviation for this DIE.
2246   unsigned AbbrevNumber = Die->getAbbrevNumber();
2247   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2248 
2249   // Emit the code (index) for the abbreviation.
2250   if (Asm->isVerbose())
2251     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2252                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
2253                                 Twine::utohexstr(Die->getSize()) + " " +
2254                                 dwarf::TagString(Abbrev->getTag()));
2255   Asm->EmitULEB128(AbbrevNumber);
2256 
2257   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2258   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2259 
2260   // Emit the DIE attribute values.
2261   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2262     unsigned Attr = AbbrevData[i].getAttribute();
2263     unsigned Form = AbbrevData[i].getForm();
2264     assert(Form && "Too many attributes for DIE (check abbreviation)");
2265 
2266     if (Asm->isVerbose())
2267       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2268 
2269     switch (Attr) {
2270     case dwarf::DW_AT_sibling:
2271       Asm->EmitInt32(Die->getSiblingOffset());
2272       break;
2273     case dwarf::DW_AT_abstract_origin: {
2274       DIEEntry *E = cast<DIEEntry>(Values[i]);
2275       DIE *Origin = E->getEntry();
2276       unsigned Addr = Origin->getOffset();
2277       Asm->EmitInt32(Addr);
2278       break;
2279     }
2280     case dwarf::DW_AT_ranges: {
2281       // DW_AT_range Value encodes offset in debug_range section.
2282       DIEInteger *V = cast<DIEInteger>(Values[i]);
2283 
2284       if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2285         Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2286                                  V->getValue(),
2287                                  4);
2288       } else {
2289         Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2290                                        V->getValue(),
2291                                        DwarfDebugRangeSectionSym,
2292                                        4);
2293       }
2294       break;
2295     }
2296     case dwarf::DW_AT_location: {
2297       if (UseDotDebugLocEntry.count(Die) != 0) {
2298         DIELabel *L = cast<DIELabel>(Values[i]);
2299         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2300       } else
2301         Values[i]->EmitValue(Asm, Form);
2302       break;
2303     }
2304     case dwarf::DW_AT_accessibility: {
2305       if (Asm->isVerbose()) {
2306         DIEInteger *V = cast<DIEInteger>(Values[i]);
2307         Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2308       }
2309       Values[i]->EmitValue(Asm, Form);
2310       break;
2311     }
2312     default:
2313       // Emit an attribute using the defined form.
2314       Values[i]->EmitValue(Asm, Form);
2315       break;
2316     }
2317   }
2318 
2319   // Emit the DIE children if any.
2320   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2321     const std::vector<DIE *> &Children = Die->getChildren();
2322 
2323     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2324       emitDIE(Children[j]);
2325 
2326     if (Asm->isVerbose())
2327       Asm->OutStreamer.AddComment("End Of Children Mark");
2328     Asm->EmitInt8(0);
2329   }
2330 }
2331 
2332 /// emitDebugInfo - Emit the debug info section.
2333 ///
emitDebugInfo()2334 void DwarfDebug::emitDebugInfo() {
2335   // Start debug info section.
2336   Asm->OutStreamer.SwitchSection(
2337                             Asm->getObjFileLowering().getDwarfInfoSection());
2338   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2339          E = CUMap.end(); I != E; ++I) {
2340     CompileUnit *TheCU = I->second;
2341     DIE *Die = TheCU->getCUDie();
2342 
2343     // Emit the compile units header.
2344     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2345                                                   TheCU->getID()));
2346 
2347     // Emit size of content not including length itself
2348     unsigned ContentSize = Die->getSize() +
2349       sizeof(int16_t) + // DWARF version number
2350       sizeof(int32_t) + // Offset Into Abbrev. Section
2351       sizeof(int8_t);   // Pointer Size (in bytes)
2352 
2353     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2354     Asm->EmitInt32(ContentSize);
2355     Asm->OutStreamer.AddComment("DWARF version number");
2356     Asm->EmitInt16(dwarf::DWARF_VERSION);
2357     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2358     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2359                            DwarfAbbrevSectionSym);
2360     Asm->OutStreamer.AddComment("Address Size (in bytes)");
2361     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2362 
2363     emitDIE(Die);
2364     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2365   }
2366 }
2367 
2368 /// emitAbbreviations - Emit the abbreviation section.
2369 ///
emitAbbreviations() const2370 void DwarfDebug::emitAbbreviations() const {
2371   // Check to see if it is worth the effort.
2372   if (!Abbreviations.empty()) {
2373     // Start the debug abbrev section.
2374     Asm->OutStreamer.SwitchSection(
2375                             Asm->getObjFileLowering().getDwarfAbbrevSection());
2376 
2377     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2378 
2379     // For each abbrevation.
2380     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2381       // Get abbreviation data
2382       const DIEAbbrev *Abbrev = Abbreviations[i];
2383 
2384       // Emit the abbrevations code (base 1 index.)
2385       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2386 
2387       // Emit the abbreviations data.
2388       Abbrev->Emit(Asm);
2389     }
2390 
2391     // Mark end of abbreviations.
2392     Asm->EmitULEB128(0, "EOM(3)");
2393 
2394     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2395   }
2396 }
2397 
2398 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2399 /// the line matrix.
2400 ///
emitEndOfLineMatrix(unsigned SectionEnd)2401 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2402   // Define last address of section.
2403   Asm->OutStreamer.AddComment("Extended Op");
2404   Asm->EmitInt8(0);
2405 
2406   Asm->OutStreamer.AddComment("Op size");
2407   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
2408   Asm->OutStreamer.AddComment("DW_LNE_set_address");
2409   Asm->EmitInt8(dwarf::DW_LNE_set_address);
2410 
2411   Asm->OutStreamer.AddComment("Section end label");
2412 
2413   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2414                                    Asm->getTargetData().getPointerSize(),
2415                                    0/*AddrSpace*/);
2416 
2417   // Mark end of matrix.
2418   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2419   Asm->EmitInt8(0);
2420   Asm->EmitInt8(1);
2421   Asm->EmitInt8(1);
2422 }
2423 
2424 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2425 ///
emitDebugPubNames()2426 void DwarfDebug::emitDebugPubNames() {
2427   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2428          E = CUMap.end(); I != E; ++I) {
2429     CompileUnit *TheCU = I->second;
2430     // Start the dwarf pubnames section.
2431     Asm->OutStreamer.SwitchSection(
2432       Asm->getObjFileLowering().getDwarfPubNamesSection());
2433 
2434     Asm->OutStreamer.AddComment("Length of Public Names Info");
2435     Asm->EmitLabelDifference(
2436       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2437       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
2438 
2439     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2440                                                   TheCU->getID()));
2441 
2442     Asm->OutStreamer.AddComment("DWARF Version");
2443     Asm->EmitInt16(dwarf::DWARF_VERSION);
2444 
2445     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2446     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2447                            DwarfInfoSectionSym);
2448 
2449     Asm->OutStreamer.AddComment("Compilation Unit Length");
2450     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2451                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
2452                              4);
2453 
2454     const StringMap<DIE*> &Globals = TheCU->getGlobals();
2455     for (StringMap<DIE*>::const_iterator
2456            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2457       const char *Name = GI->getKeyData();
2458       DIE *Entity = GI->second;
2459 
2460       Asm->OutStreamer.AddComment("DIE offset");
2461       Asm->EmitInt32(Entity->getOffset());
2462 
2463       if (Asm->isVerbose())
2464         Asm->OutStreamer.AddComment("External Name");
2465       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2466     }
2467 
2468     Asm->OutStreamer.AddComment("End Mark");
2469     Asm->EmitInt32(0);
2470     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2471                                                 TheCU->getID()));
2472   }
2473 }
2474 
emitDebugPubTypes()2475 void DwarfDebug::emitDebugPubTypes() {
2476   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2477          E = CUMap.end(); I != E; ++I) {
2478     CompileUnit *TheCU = I->second;
2479     // Start the dwarf pubnames section.
2480     Asm->OutStreamer.SwitchSection(
2481       Asm->getObjFileLowering().getDwarfPubTypesSection());
2482     Asm->OutStreamer.AddComment("Length of Public Types Info");
2483     Asm->EmitLabelDifference(
2484       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2485       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
2486 
2487     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2488                                                   TheCU->getID()));
2489 
2490     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2491     Asm->EmitInt16(dwarf::DWARF_VERSION);
2492 
2493     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2494     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2495                            DwarfInfoSectionSym);
2496 
2497     Asm->OutStreamer.AddComment("Compilation Unit Length");
2498     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2499                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
2500                              4);
2501 
2502     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2503     for (StringMap<DIE*>::const_iterator
2504            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2505       const char *Name = GI->getKeyData();
2506       DIE * Entity = GI->second;
2507 
2508       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2509       Asm->EmitInt32(Entity->getOffset());
2510 
2511       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2512       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2513     }
2514 
2515     Asm->OutStreamer.AddComment("End Mark");
2516     Asm->EmitInt32(0);
2517     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2518                                                   TheCU->getID()));
2519   }
2520 }
2521 
2522 /// emitDebugStr - Emit visible names into a debug str section.
2523 ///
emitDebugStr()2524 void DwarfDebug::emitDebugStr() {
2525   // Check to see if it is worth the effort.
2526   if (StringPool.empty()) return;
2527 
2528   // Start the dwarf str section.
2529   Asm->OutStreamer.SwitchSection(
2530                                 Asm->getObjFileLowering().getDwarfStrSection());
2531 
2532   // Get all of the string pool entries and put them in an array by their ID so
2533   // we can sort them.
2534   SmallVector<std::pair<unsigned,
2535       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2536 
2537   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2538        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2539     Entries.push_back(std::make_pair(I->second.second, &*I));
2540 
2541   array_pod_sort(Entries.begin(), Entries.end());
2542 
2543   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2544     // Emit a label for reference from debug information entries.
2545     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2546 
2547     // Emit the string itself.
2548     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
2549   }
2550 }
2551 
2552 /// emitDebugLoc - Emit visible names into a debug loc section.
2553 ///
emitDebugLoc()2554 void DwarfDebug::emitDebugLoc() {
2555   if (DotDebugLocEntries.empty())
2556     return;
2557 
2558   for (SmallVector<DotDebugLocEntry, 4>::iterator
2559          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2560        I != E; ++I) {
2561     DotDebugLocEntry &Entry = *I;
2562     if (I + 1 != DotDebugLocEntries.end())
2563       Entry.Merge(I+1);
2564   }
2565 
2566   // Start the dwarf loc section.
2567   Asm->OutStreamer.SwitchSection(
2568     Asm->getObjFileLowering().getDwarfLocSection());
2569   unsigned char Size = Asm->getTargetData().getPointerSize();
2570   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2571   unsigned index = 1;
2572   for (SmallVector<DotDebugLocEntry, 4>::iterator
2573          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2574        I != E; ++I, ++index) {
2575     DotDebugLocEntry &Entry = *I;
2576     if (Entry.isMerged()) continue;
2577     if (Entry.isEmpty()) {
2578       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2579       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2580       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2581     } else {
2582       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2583       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2584       DIVariable DV(Entry.Variable);
2585       Asm->OutStreamer.AddComment("Loc expr size");
2586       MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2587       MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2588       Asm->EmitLabelDifference(end, begin, 2);
2589       Asm->OutStreamer.EmitLabel(begin);
2590       if (Entry.isInt()) {
2591         DIBasicType BTy(DV.getType());
2592         if (BTy.Verify() &&
2593             (BTy.getEncoding()  == dwarf::DW_ATE_signed
2594              || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2595           Asm->OutStreamer.AddComment("DW_OP_consts");
2596           Asm->EmitInt8(dwarf::DW_OP_consts);
2597           Asm->EmitSLEB128(Entry.getInt());
2598         } else {
2599           Asm->OutStreamer.AddComment("DW_OP_constu");
2600           Asm->EmitInt8(dwarf::DW_OP_constu);
2601           Asm->EmitULEB128(Entry.getInt());
2602         }
2603       } else if (Entry.isLocation()) {
2604         if (!DV.hasComplexAddress())
2605           // Regular entry.
2606           Asm->EmitDwarfRegOp(Entry.Loc);
2607         else {
2608           // Complex address entry.
2609           unsigned N = DV.getNumAddrElements();
2610           unsigned i = 0;
2611           if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2612             if (Entry.Loc.getOffset()) {
2613               i = 2;
2614               Asm->EmitDwarfRegOp(Entry.Loc);
2615               Asm->OutStreamer.AddComment("DW_OP_deref");
2616               Asm->EmitInt8(dwarf::DW_OP_deref);
2617               Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2618               Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2619               Asm->EmitSLEB128(DV.getAddrElement(1));
2620             } else {
2621               // If first address element is OpPlus then emit
2622               // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2623               MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2624               Asm->EmitDwarfRegOp(Loc);
2625               i = 2;
2626             }
2627           } else {
2628             Asm->EmitDwarfRegOp(Entry.Loc);
2629           }
2630 
2631           // Emit remaining complex address elements.
2632           for (; i < N; ++i) {
2633             uint64_t Element = DV.getAddrElement(i);
2634             if (Element == DIBuilder::OpPlus) {
2635               Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2636               Asm->EmitULEB128(DV.getAddrElement(++i));
2637             } else if (Element == DIBuilder::OpDeref)
2638               Asm->EmitInt8(dwarf::DW_OP_deref);
2639             else llvm_unreachable("unknown Opcode found in complex address");
2640           }
2641         }
2642       }
2643       // else ... ignore constant fp. There is not any good way to
2644       // to represent them here in dwarf.
2645       Asm->OutStreamer.EmitLabel(end);
2646     }
2647   }
2648 }
2649 
2650 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2651 ///
EmitDebugARanges()2652 void DwarfDebug::EmitDebugARanges() {
2653   // Start the dwarf aranges section.
2654   Asm->OutStreamer.SwitchSection(
2655                           Asm->getObjFileLowering().getDwarfARangesSection());
2656 }
2657 
2658 /// emitDebugRanges - Emit visible names into a debug ranges section.
2659 ///
emitDebugRanges()2660 void DwarfDebug::emitDebugRanges() {
2661   // Start the dwarf ranges section.
2662   Asm->OutStreamer.SwitchSection(
2663     Asm->getObjFileLowering().getDwarfRangesSection());
2664   unsigned char Size = Asm->getTargetData().getPointerSize();
2665   for (SmallVector<const MCSymbol *, 8>::iterator
2666          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2667        I != E; ++I) {
2668     if (*I)
2669       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2670     else
2671       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2672   }
2673 }
2674 
2675 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2676 ///
emitDebugMacInfo()2677 void DwarfDebug::emitDebugMacInfo() {
2678   if (const MCSection *LineInfo =
2679       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2680     // Start the dwarf macinfo section.
2681     Asm->OutStreamer.SwitchSection(LineInfo);
2682   }
2683 }
2684 
2685 /// emitDebugInlineInfo - Emit inline info using following format.
2686 /// Section Header:
2687 /// 1. length of section
2688 /// 2. Dwarf version number
2689 /// 3. address size.
2690 ///
2691 /// Entries (one "entry" for each function that was inlined):
2692 ///
2693 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2694 ///   otherwise offset into __debug_str for regular function name.
2695 /// 2. offset into __debug_str section for regular function name.
2696 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2697 /// instances for the function.
2698 ///
2699 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2700 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2701 /// __debug_info section, and the low_pc is the starting address for the
2702 /// inlining instance.
emitDebugInlineInfo()2703 void DwarfDebug::emitDebugInlineInfo() {
2704   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
2705     return;
2706 
2707   if (!FirstCU)
2708     return;
2709 
2710   Asm->OutStreamer.SwitchSection(
2711                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
2712 
2713   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2714   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2715                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2716 
2717   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2718 
2719   Asm->OutStreamer.AddComment("Dwarf Version");
2720   Asm->EmitInt16(dwarf::DWARF_VERSION);
2721   Asm->OutStreamer.AddComment("Address Size (in bytes)");
2722   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2723 
2724   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2725          E = InlinedSPNodes.end(); I != E; ++I) {
2726 
2727     const MDNode *Node = *I;
2728     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2729       = InlineInfo.find(Node);
2730     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2731     DISubprogram SP(Node);
2732     StringRef LName = SP.getLinkageName();
2733     StringRef Name = SP.getName();
2734 
2735     Asm->OutStreamer.AddComment("MIPS linkage name");
2736     if (LName.empty()) {
2737       Asm->OutStreamer.EmitBytes(Name, 0);
2738       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2739     } else
2740       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2741                              DwarfStrSectionSym);
2742 
2743     Asm->OutStreamer.AddComment("Function name");
2744     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2745     Asm->EmitULEB128(Labels.size(), "Inline count");
2746 
2747     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2748            LE = Labels.end(); LI != LE; ++LI) {
2749       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2750       Asm->EmitInt32(LI->second->getOffset());
2751 
2752       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2753       Asm->OutStreamer.EmitSymbolValue(LI->first,
2754                                        Asm->getTargetData().getPointerSize(),0);
2755     }
2756   }
2757 
2758   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2759 }
2760