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