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