Discard special LLVM prefix from linkage name.
[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 "llvm/Constants.h"
18 #include "llvm/Module.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineModuleInfo.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCSection.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/Target/Mangler.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Target/TargetFrameInfo.h"
28 #include "llvm/Target/TargetLoweringObjectFile.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetRegisterInfo.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Analysis/DebugInfo.h"
33 #include "llvm/ADT/STLExtras.h"
34 #include "llvm/ADT/StringExtras.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include "llvm/Support/ValueHandle.h"
39 #include "llvm/Support/FormattedStream.h"
40 #include "llvm/Support/Timer.h"
41 #include "llvm/System/Path.h"
42 using namespace llvm;
43
44 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
45      cl::desc("Print DbgScope information for each machine instruction"));
46
47 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
48      cl::desc("Disable debug info printing"));
49
50 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
51      cl::desc("Make an absense of debug location information explicit."),
52      cl::init(false));
53
54 namespace {
55   const char *DWARFGroupName = "DWARF Emission";
56   const char *DbgTimerName = "DWARF Debug Writer";
57 } // end anonymous namespace
58
59 //===----------------------------------------------------------------------===//
60
61 /// Configuration values for initial hash set sizes (log2).
62 ///
63 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
64
65 namespace llvm {
66
67 //===----------------------------------------------------------------------===//
68 /// CompileUnit - This dwarf writer support class manages information associate
69 /// with a source file.
70 class CompileUnit {
71   /// ID - File identifier for source.
72   ///
73   unsigned ID;
74
75   /// Die - Compile unit debug information entry.
76   ///
77   const OwningPtr<DIE> CUDie;
78
79   /// IndexTyDie - An anonymous type for index type.  Owned by CUDie.
80   DIE *IndexTyDie;
81
82   /// GVToDieMap - Tracks the mapping of unit level debug informaton
83   /// variables to debug information entries.
84   /// FIXME : Rename GVToDieMap -> NodeToDieMap
85   DenseMap<const MDNode *, DIE *> GVToDieMap;
86
87   /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
88   /// descriptors to debug information entries using a DIEEntry proxy.
89   /// FIXME : Rename
90   DenseMap<const MDNode *, DIEEntry *> GVToDIEEntryMap;
91
92   /// Globals - A map of globally visible named entities for this unit.
93   ///
94   StringMap<DIE*> Globals;
95
96   /// GlobalTypes - A map of globally visible types for this unit.
97   ///
98   StringMap<DIE*> GlobalTypes;
99
100 public:
101   CompileUnit(unsigned I, DIE *D)
102     : ID(I), CUDie(D), IndexTyDie(0) {}
103
104   // Accessors.
105   unsigned getID()                  const { return ID; }
106   DIE* getCUDie()                   const { return CUDie.get(); }
107   const StringMap<DIE*> &getGlobals()     const { return Globals; }
108   const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
109
110   /// hasContent - Return true if this compile unit has something to write out.
111   ///
112   bool hasContent() const { return !CUDie->getChildren().empty(); }
113
114   /// addGlobal - Add a new global entity to the compile unit.
115   ///
116   void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
117
118   /// addGlobalType - Add a new global type to the compile unit.
119   ///
120   void addGlobalType(StringRef Name, DIE *Die) { 
121     GlobalTypes[Name] = Die; 
122   }
123
124   /// getDIE - Returns the debug information entry map slot for the
125   /// specified debug variable.
126   DIE *getDIE(const MDNode *N) { return GVToDieMap.lookup(N); }
127
128   /// insertDIE - Insert DIE into the map.
129   void insertDIE(const MDNode *N, DIE *D) {
130     GVToDieMap.insert(std::make_pair(N, D));
131   }
132
133   /// getDIEEntry - Returns the debug information entry for the speciefied
134   /// debug variable.
135   DIEEntry *getDIEEntry(const MDNode *N) { 
136     DenseMap<const MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
137     if (I == GVToDIEEntryMap.end())
138       return NULL;
139     return I->second;
140   }
141
142   /// insertDIEEntry - Insert debug information entry into the map.
143   void insertDIEEntry(const MDNode *N, DIEEntry *E) {
144     GVToDIEEntryMap.insert(std::make_pair(N, E));
145   }
146
147   /// addDie - Adds or interns the DIE to the compile unit.
148   ///
149   void addDie(DIE *Buffer) {
150     this->CUDie->addChild(Buffer);
151   }
152
153   // getIndexTyDie - Get an anonymous type for index type.
154   DIE *getIndexTyDie() {
155     return IndexTyDie;
156   }
157
158   // setIndexTyDie - Set D as anonymous type for index which can be reused
159   // later.
160   void setIndexTyDie(DIE *D) {
161     IndexTyDie = D;
162   }
163
164 };
165
166 //===----------------------------------------------------------------------===//
167 /// DbgVariable - This class is used to track local variable information.
168 ///
169 class DbgVariable {
170   DIVariable Var;                    // Variable Descriptor.
171   DIE *TheDIE;                       // Variable DIE.
172   unsigned DotDebugLocOffset;        // Offset in DotDebugLocEntries.
173 public:
174   // AbsVar may be NULL.
175   DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
176
177   // Accessors.
178   DIVariable getVariable()           const { return Var; }
179   void setDIE(DIE *D)                      { TheDIE = D; }
180   DIE *getDIE()                      const { return TheDIE; }
181   void setDotDebugLocOffset(unsigned O)    { DotDebugLocOffset = O; }
182   unsigned getDotDebugLocOffset()    const { return DotDebugLocOffset; }
183 };
184
185 //===----------------------------------------------------------------------===//
186 /// DbgRange - This is used to track range of instructions with identical
187 /// debug info scope.
188 ///
189 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
190
191 //===----------------------------------------------------------------------===//
192 /// DbgScope - This class is used to track scope information.
193 ///
194 class DbgScope {
195   DbgScope *Parent;                   // Parent to this scope.
196   DIDescriptor Desc;                  // Debug info descriptor for scope.
197   // Location at which this scope is inlined.
198   AssertingVH<const MDNode> InlinedAtLocation;  
199   bool AbstractScope;                 // Abstract Scope
200   const MachineInstr *LastInsn;       // Last instruction of this scope.
201   const MachineInstr *FirstInsn;      // First instruction of this scope.
202   unsigned DFSIn, DFSOut;
203   // Scopes defined in scope.  Contents not owned.
204   SmallVector<DbgScope *, 4> Scopes;
205   // Variables declared in scope.  Contents owned.
206   SmallVector<DbgVariable *, 8> Variables;
207   SmallVector<DbgRange, 4> Ranges;
208   // Private state for dump()
209   mutable unsigned IndentLevel;
210 public:
211   DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
212     : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
213       LastInsn(0), FirstInsn(0),
214       DFSIn(0), DFSOut(0), IndentLevel(0) {}
215   virtual ~DbgScope();
216
217   // Accessors.
218   DbgScope *getParent()          const { return Parent; }
219   void setParent(DbgScope *P)          { Parent = P; }
220   DIDescriptor getDesc()         const { return Desc; }
221   const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
222   const MDNode *getScopeNode()         const { return Desc; }
223   const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
224   const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
225   const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
226
227   /// openInsnRange - This scope covers instruction range starting from MI.
228   void openInsnRange(const MachineInstr *MI) {
229     if (!FirstInsn) 
230       FirstInsn = MI;
231     
232     if (Parent)
233       Parent->openInsnRange(MI);
234   }
235
236   /// extendInsnRange - Extend the current instruction range covered by 
237   /// this scope.
238   void extendInsnRange(const MachineInstr *MI) {
239     assert (FirstInsn && "MI Range is not open!");
240     LastInsn = MI;
241     if (Parent)
242       Parent->extendInsnRange(MI);
243   }
244
245   /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
246   /// until now. This is used when a new scope is encountered while walking
247   /// machine instructions.
248   void closeInsnRange(DbgScope *NewScope = NULL) {
249     assert (LastInsn && "Last insn missing!");
250     Ranges.push_back(DbgRange(FirstInsn, LastInsn));
251     FirstInsn = NULL;    
252     LastInsn = NULL;
253     // If Parent dominates NewScope then do not close Parent's instruction 
254     // range.
255     if (Parent && (!NewScope || !Parent->dominates(NewScope)))
256       Parent->closeInsnRange(NewScope);
257   }
258
259   void setAbstractScope() { AbstractScope = true; }
260   bool isAbstractScope() const { return AbstractScope; }
261
262   // Depth First Search support to walk and mainpluate DbgScope hierarchy.
263   unsigned getDFSOut() const { return DFSOut; }
264   void setDFSOut(unsigned O) { DFSOut = O; }
265   unsigned getDFSIn() const  { return DFSIn; }
266   void setDFSIn(unsigned I)  { DFSIn = I; }
267   bool dominates(const DbgScope *S) {
268     if (S == this) 
269       return true;
270     if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
271       return true;
272     return false;
273   }
274
275   /// addScope - Add a scope to the scope.
276   ///
277   void addScope(DbgScope *S) { Scopes.push_back(S); }
278
279   /// addVariable - Add a variable to the scope.
280   ///
281   void addVariable(DbgVariable *V) { Variables.push_back(V); }
282
283 #ifndef NDEBUG
284   void dump() const;
285 #endif
286 };
287
288 } // end llvm namespace
289
290 #ifndef NDEBUG
291 void DbgScope::dump() const {
292   raw_ostream &err = dbgs();
293   err.indent(IndentLevel);
294   const MDNode *N = Desc;
295   N->dump();
296   if (AbstractScope)
297     err << "Abstract Scope\n";
298
299   IndentLevel += 2;
300   if (!Scopes.empty())
301     err << "Children ...\n";
302   for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
303     if (Scopes[i] != this)
304       Scopes[i]->dump();
305
306   IndentLevel -= 2;
307 }
308 #endif
309
310 DbgScope::~DbgScope() {
311   for (unsigned j = 0, M = Variables.size(); j < M; ++j)
312     delete Variables[j];
313 }
314
315 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
316   : Asm(A), MMI(Asm->MMI), FirstCU(0),
317     AbbreviationsSet(InitAbbreviationsSetSize), 
318     CurrentFnDbgScope(0), PrevLabel(NULL) {
319   NextStringPoolNumber = 0;
320       
321   DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
322   DwarfStrSectionSym = TextSectionSym = 0;
323   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; 
324   FunctionBeginSym = FunctionEndSym = 0;
325   {
326     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
327     beginModule(M);
328   }
329 }
330 DwarfDebug::~DwarfDebug() {
331   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
332     DIEBlocks[j]->~DIEBlock();
333 }
334
335 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
336   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
337   if (Entry.first) return Entry.first;
338
339   Entry.second = NextStringPoolNumber++;
340   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
341 }
342
343
344 /// assignAbbrevNumber - Define a unique number for the abbreviation.
345 ///
346 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
347   // Profile the node so that we can make it unique.
348   FoldingSetNodeID ID;
349   Abbrev.Profile(ID);
350
351   // Check the set for priors.
352   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
353
354   // If it's newly added.
355   if (InSet == &Abbrev) {
356     // Add to abbreviation list.
357     Abbreviations.push_back(&Abbrev);
358
359     // Assign the vector position + 1 as its number.
360     Abbrev.setNumber(Abbreviations.size());
361   } else {
362     // Assign existing abbreviation number.
363     Abbrev.setNumber(InSet->getNumber());
364   }
365 }
366
367 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
368 /// information entry.
369 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
370   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
371   return Value;
372 }
373
374 /// addUInt - Add an unsigned integer attribute data and value.
375 ///
376 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
377                          unsigned Form, uint64_t Integer) {
378   if (!Form) Form = DIEInteger::BestForm(false, Integer);
379   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
380   Die->addValue(Attribute, Form, Value);
381 }
382
383 /// addSInt - Add an signed integer attribute data and value.
384 ///
385 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
386                          unsigned Form, int64_t Integer) {
387   if (!Form) Form = DIEInteger::BestForm(true, Integer);
388   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
389   Die->addValue(Attribute, Form, Value);
390 }
391
392 /// addString - Add a string attribute data and value. DIEString only
393 /// keeps string reference. 
394 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
395                            StringRef String) {
396   DIEValue *Value = new (DIEValueAllocator) DIEString(String);
397   Die->addValue(Attribute, Form, Value);
398 }
399
400 /// addLabel - Add a Dwarf label attribute data and value.
401 ///
402 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
403                           const MCSymbol *Label) {
404   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
405   Die->addValue(Attribute, Form, Value);
406 }
407
408 /// addDelta - Add a label delta attribute data and value.
409 ///
410 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
411                           const MCSymbol *Hi, const MCSymbol *Lo) {
412   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
413   Die->addValue(Attribute, Form, Value);
414 }
415
416 /// addDIEEntry - Add a DIE attribute data and value.
417 ///
418 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
419                              DIE *Entry) {
420   Die->addValue(Attribute, Form, createDIEEntry(Entry));
421 }
422
423
424 /// addBlock - Add block data.
425 ///
426 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
427                           DIEBlock *Block) {
428   Block->ComputeSize(Asm);
429   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
430   Die->addValue(Attribute, Block->BestForm(), Block);
431 }
432
433 /// addSourceLine - Add location information to specified debug information
434 /// entry.
435 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
436   // Verify variable.
437   if (!V->Verify())
438     return;
439
440   unsigned Line = V->getLineNumber();
441   unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
442                                         V->getContext().getFilename());
443   assert(FileID && "Invalid file id");
444   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
445   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
446 }
447
448 /// addSourceLine - Add location information to specified debug information
449 /// entry.
450 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobalVariable *G) {
451   // Verify global variable.
452   if (!G->Verify())
453     return;
454
455   unsigned Line = G->getLineNumber();
456   unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
457                                         G->getContext().getFilename());
458   assert(FileID && "Invalid file id");
459   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
460   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
461 }
462
463 /// addSourceLine - Add location information to specified debug information
464 /// entry.
465 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
466   // Verify subprogram.
467   if (!SP->Verify())
468     return;
469   // If the line number is 0, don't add it.
470   if (SP->getLineNumber() == 0)
471     return;
472
473   unsigned Line = SP->getLineNumber();
474   if (!SP->getContext().Verify())
475     return;
476   unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
477                                         SP->getFilename());
478   assert(FileID && "Invalid file id");
479   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
480   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
481 }
482
483 /// addSourceLine - Add location information to specified debug information
484 /// entry.
485 void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
486   // Verify type.
487   if (!Ty->Verify())
488     return;
489
490   unsigned Line = Ty->getLineNumber();
491   if (!Ty->getContext().Verify())
492     return;
493   unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
494                                         Ty->getContext().getFilename());
495   assert(FileID && "Invalid file id");
496   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
497   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
498 }
499
500 /// addSourceLine - Add location information to specified debug information
501 /// entry.
502 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
503   // Verify namespace.
504   if (!NS->Verify())
505     return;
506
507   unsigned Line = NS->getLineNumber();
508   StringRef FN = NS->getFilename();
509   StringRef Dir = NS->getDirectory();
510
511   unsigned FileID = GetOrCreateSourceID(Dir, FN);
512   assert(FileID && "Invalid file id");
513   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
514   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
515 }
516
517 /* Byref variables, in Blocks, are declared by the programmer as
518    "SomeType VarName;", but the compiler creates a
519    __Block_byref_x_VarName struct, and gives the variable VarName
520    either the struct, or a pointer to the struct, as its type.  This
521    is necessary for various behind-the-scenes things the compiler
522    needs to do with by-reference variables in blocks.
523
524    However, as far as the original *programmer* is concerned, the
525    variable should still have type 'SomeType', as originally declared.
526
527    The following function dives into the __Block_byref_x_VarName
528    struct to find the original type of the variable.  This will be
529    passed back to the code generating the type for the Debug
530    Information Entry for the variable 'VarName'.  'VarName' will then
531    have the original type 'SomeType' in its debug information.
532
533    The original type 'SomeType' will be the type of the field named
534    'VarName' inside the __Block_byref_x_VarName struct.
535
536    NOTE: In order for this to not completely fail on the debugger
537    side, the Debug Information Entry for the variable VarName needs to
538    have a DW_AT_location that tells the debugger how to unwind through
539    the pointers and __Block_byref_x_VarName struct to find the actual
540    value of the variable.  The function addBlockByrefType does this.  */
541
542 /// Find the type the programmer originally declared the variable to be
543 /// and return that type.
544 ///
545 DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
546
547   DIType subType = Ty;
548   unsigned tag = Ty.getTag();
549
550   if (tag == dwarf::DW_TAG_pointer_type) {
551     DIDerivedType DTy = DIDerivedType(Ty);
552     subType = DTy.getTypeDerivedFrom();
553   }
554
555   DICompositeType blockStruct = DICompositeType(subType);
556   DIArray Elements = blockStruct.getTypeArray();
557
558   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
559     DIDescriptor Element = Elements.getElement(i);
560     DIDerivedType DT = DIDerivedType(Element);
561     if (Name == DT.getName())
562       return (DT.getTypeDerivedFrom());
563   }
564
565   return Ty;
566 }
567
568 /// addComplexAddress - Start with the address based on the location provided,
569 /// and generate the DWARF information necessary to find the actual variable
570 /// given the extra address information encoded in the DIVariable, starting from
571 /// the starting location.  Add the DWARF information to the die.
572 ///
573 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
574                                    unsigned Attribute,
575                                    const MachineLocation &Location) {
576   const DIVariable &VD = DV->getVariable();
577   DIType Ty = VD.getType();
578
579   // Decode the original location, and use that as the start of the byref
580   // variable's location.
581   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
582   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
583   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
584
585   if (Location.isReg()) {
586     if (Reg < 32) {
587       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
588     } else {
589       Reg = Reg - dwarf::DW_OP_reg0;
590       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
591       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
592     }
593   } else {
594     if (Reg < 32)
595       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
596     else {
597       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
598       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
599     }
600
601     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
602   }
603
604   for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
605     uint64_t Element = VD.getAddrElement(i);
606
607     if (Element == DIFactory::OpPlus) {
608       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
609       addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
610     } else if (Element == DIFactory::OpDeref) {
611       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
612     } else llvm_unreachable("unknown DIFactory Opcode");
613   }
614
615   // Now attach the location information to the DIE.
616   addBlock(Die, Attribute, 0, Block);
617 }
618
619 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
620    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
621    gives the variable VarName either the struct, or a pointer to the struct, as
622    its type.  This is necessary for various behind-the-scenes things the
623    compiler needs to do with by-reference variables in Blocks.
624
625    However, as far as the original *programmer* is concerned, the variable
626    should still have type 'SomeType', as originally declared.
627
628    The function getBlockByrefType dives into the __Block_byref_x_VarName
629    struct to find the original type of the variable, which is then assigned to
630    the variable's Debug Information Entry as its real type.  So far, so good.
631    However now the debugger will expect the variable VarName to have the type
632    SomeType.  So we need the location attribute for the variable to be an
633    expression that explains to the debugger how to navigate through the
634    pointers and struct to find the actual variable of type SomeType.
635
636    The following function does just that.  We start by getting
637    the "normal" location for the variable. This will be the location
638    of either the struct __Block_byref_x_VarName or the pointer to the
639    struct __Block_byref_x_VarName.
640
641    The struct will look something like:
642
643    struct __Block_byref_x_VarName {
644      ... <various fields>
645      struct __Block_byref_x_VarName *forwarding;
646      ... <various other fields>
647      SomeType VarName;
648      ... <maybe more fields>
649    };
650
651    If we are given the struct directly (as our starting point) we
652    need to tell the debugger to:
653
654    1).  Add the offset of the forwarding field.
655
656    2).  Follow that pointer to get the real __Block_byref_x_VarName
657    struct to use (the real one may have been copied onto the heap).
658
659    3).  Add the offset for the field VarName, to find the actual variable.
660
661    If we started with a pointer to the struct, then we need to
662    dereference that pointer first, before the other steps.
663    Translating this into DWARF ops, we will need to append the following
664    to the current location description for the variable:
665
666    DW_OP_deref                    -- optional, if we start with a pointer
667    DW_OP_plus_uconst <forward_fld_offset>
668    DW_OP_deref
669    DW_OP_plus_uconst <varName_fld_offset>
670
671    That is what this function does.  */
672
673 /// addBlockByrefAddress - Start with the address based on the location
674 /// provided, and generate the DWARF information necessary to find the
675 /// actual Block variable (navigating the Block struct) based on the
676 /// starting location.  Add the DWARF information to the die.  For
677 /// more information, read large comment just above here.
678 ///
679 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
680                                       unsigned Attribute,
681                                       const MachineLocation &Location) {
682   const DIVariable &VD = DV->getVariable();
683   DIType Ty = VD.getType();
684   DIType TmpTy = Ty;
685   unsigned Tag = Ty.getTag();
686   bool isPointer = false;
687
688   StringRef varName = VD.getName();
689
690   if (Tag == dwarf::DW_TAG_pointer_type) {
691     DIDerivedType DTy = DIDerivedType(Ty);
692     TmpTy = DTy.getTypeDerivedFrom();
693     isPointer = true;
694   }
695
696   DICompositeType blockStruct = DICompositeType(TmpTy);
697
698   // Find the __forwarding field and the variable field in the __Block_byref
699   // struct.
700   DIArray Fields = blockStruct.getTypeArray();
701   DIDescriptor varField = DIDescriptor();
702   DIDescriptor forwardingField = DIDescriptor();
703
704   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
705     DIDescriptor Element = Fields.getElement(i);
706     DIDerivedType DT = DIDerivedType(Element);
707     StringRef fieldName = DT.getName();
708     if (fieldName == "__forwarding")
709       forwardingField = Element;
710     else if (fieldName == varName)
711       varField = Element;
712   }
713
714   // Get the offsets for the forwarding field and the variable field.
715   unsigned forwardingFieldOffset =
716     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
717   unsigned varFieldOffset =
718     DIDerivedType(varField).getOffsetInBits() >> 3;
719
720   // Decode the original location, and use that as the start of the byref
721   // variable's location.
722   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
723   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
724   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
725
726   if (Location.isReg()) {
727     if (Reg < 32)
728       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
729     else {
730       Reg = Reg - dwarf::DW_OP_reg0;
731       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
732       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
733     }
734   } else {
735     if (Reg < 32)
736       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
737     else {
738       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
739       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
740     }
741
742     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
743   }
744
745   // If we started with a pointer to the __Block_byref... struct, then
746   // the first thing we need to do is dereference the pointer (DW_OP_deref).
747   if (isPointer)
748     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
749
750   // Next add the offset for the '__forwarding' field:
751   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
752   // adding the offset if it's 0.
753   if (forwardingFieldOffset > 0) {
754     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
755     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
756   }
757
758   // Now dereference the __forwarding field to get to the real __Block_byref
759   // struct:  DW_OP_deref.
760   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
761
762   // Now that we've got the real __Block_byref... struct, add the offset
763   // for the variable's field to get to the location of the actual variable:
764   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
765   if (varFieldOffset > 0) {
766     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
767     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
768   }
769
770   // Now attach the location information to the DIE.
771   addBlock(Die, Attribute, 0, Block);
772 }
773
774 /// addAddress - Add an address attribute to a die based on the location
775 /// provided.
776 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
777                             const MachineLocation &Location) {
778   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
779   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
780   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
781
782   if (Location.isReg()) {
783     if (Reg < 32) {
784       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
785     } else {
786       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
787       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
788     }
789   } else {
790     if (Reg < 32) {
791       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
792     } else {
793       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
794       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
795     }
796
797     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
798   }
799
800   addBlock(Die, Attribute, 0, Block);
801 }
802
803 /// addRegisterAddress - Add register location entry in variable DIE.
804 bool DwarfDebug::addRegisterAddress(DIE *Die, const MCSymbol *VS,
805                                     const MachineOperand &MO) {
806   assert (MO.isReg() && "Invalid machine operand!");
807   if (!MO.getReg())
808     return false;
809   MachineLocation Location;
810   Location.set(MO.getReg());
811   addAddress(Die, dwarf::DW_AT_location, Location);
812   if (VS)
813     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
814   return true;
815 }
816
817 /// addConstantValue - Add constant value entry in variable DIE.
818 bool DwarfDebug::addConstantValue(DIE *Die, const MCSymbol *VS,
819                                   const MachineOperand &MO) {
820   assert (MO.isImm() && "Invalid machine operand!");
821   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
822   unsigned Imm = MO.getImm();
823   addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
824   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
825   if (VS)
826     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
827   return true;
828 }
829
830 /// addConstantFPValue - Add constant value entry in variable DIE.
831 bool DwarfDebug::addConstantFPValue(DIE *Die, const MCSymbol *VS,
832                                     const MachineOperand &MO) {
833   assert (MO.isFPImm() && "Invalid machine operand!");
834   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
835   APFloat FPImm = MO.getFPImm()->getValueAPF();
836   
837   // Get the raw data form of the floating point.
838   const APInt FltVal = FPImm.bitcastToAPInt();
839   const char *FltPtr = (const char*)FltVal.getRawData();
840   
841   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
842   bool LittleEndian = Asm->getTargetData().isLittleEndian();
843   int Incr = (LittleEndian ? 1 : -1);
844   int Start = (LittleEndian ? 0 : NumBytes - 1);
845   int Stop = (LittleEndian ? NumBytes : -1);
846   
847   // Output the constant to DWARF one byte at a time.
848   for (; Start != Stop; Start += Incr)
849     addUInt(Block, 0, dwarf::DW_FORM_data1,
850             (unsigned char)0xFF & FltPtr[Start]);
851   
852   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
853   if (VS)
854     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
855   return true; 
856 }
857
858
859 /// addToContextOwner - Add Die into the list of its context owner's children.
860 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
861   if (Context.isType()) {
862     DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
863     ContextDIE->addChild(Die);
864   } else if (Context.isNameSpace()) {
865     DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
866     ContextDIE->addChild(Die);
867   } else if (Context.isSubprogram()) {
868     DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context),
869                                           /*MakeDecl=*/false);
870     ContextDIE->addChild(Die);
871   } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
872     ContextDIE->addChild(Die);
873   else 
874     getCompileUnit(Context)->addDie(Die);
875 }
876
877 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
878 /// given DIType.
879 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
880   CompileUnit *TypeCU = getCompileUnit(Ty);
881   DIE *TyDIE = TypeCU->getDIE(Ty);
882   if (TyDIE)
883     return TyDIE;
884
885   // Create new type.
886   TyDIE = new DIE(dwarf::DW_TAG_base_type);
887   TypeCU->insertDIE(Ty, TyDIE);
888   if (Ty.isBasicType())
889     constructTypeDIE(*TyDIE, DIBasicType(Ty));
890   else if (Ty.isCompositeType())
891     constructTypeDIE(*TyDIE, DICompositeType(Ty));
892   else {
893     assert(Ty.isDerivedType() && "Unknown kind of DIType");
894     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
895   }
896
897   addToContextOwner(TyDIE, Ty.getContext());
898   return TyDIE;
899 }
900
901 /// addType - Add a new type attribute to the specified entity.
902 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
903   if (!Ty.Verify())
904     return;
905
906   // Check for pre-existence.
907   CompileUnit *TypeCU = getCompileUnit(Ty);
908   DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
909   // If it exists then use the existing value.
910   if (Entry) {
911     Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
912     return;
913   }
914
915   // Construct type.
916   DIE *Buffer = getOrCreateTypeDIE(Ty);
917
918   // Set up proxy.
919   Entry = createDIEEntry(Buffer);
920   TypeCU->insertDIEEntry(Ty, Entry);
921
922   Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
923 }
924
925 /// constructTypeDIE - Construct basic type die from DIBasicType.
926 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
927   // Get core information.
928   StringRef Name = BTy.getName();
929   Buffer.setTag(dwarf::DW_TAG_base_type);
930   addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
931           BTy.getEncoding());
932
933   // Add name if not anonymous or intermediate type.
934   if (!Name.empty())
935     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
936   uint64_t Size = BTy.getSizeInBits() >> 3;
937   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
938 }
939
940 /// constructTypeDIE - Construct derived type die from DIDerivedType.
941 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
942   // Get core information.
943   StringRef Name = DTy.getName();
944   uint64_t Size = DTy.getSizeInBits() >> 3;
945   unsigned Tag = DTy.getTag();
946
947   // FIXME - Workaround for templates.
948   if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
949
950   Buffer.setTag(Tag);
951
952   // Map to main type, void will not have a type.
953   DIType FromTy = DTy.getTypeDerivedFrom();
954   addType(&Buffer, FromTy);
955
956   // Add name if not anonymous or intermediate type.
957   if (!Name.empty())
958     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
959
960   // Add size if non-zero (derived types might be zero-sized.)
961   if (Size)
962     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
963
964   // Add source line info if available and TyDesc is not a forward declaration.
965   if (!DTy.isForwardDecl())
966     addSourceLine(&Buffer, &DTy);
967 }
968
969 /// constructTypeDIE - Construct type DIE from DICompositeType.
970 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
971   // Get core information.
972   StringRef Name = CTy.getName();
973
974   uint64_t Size = CTy.getSizeInBits() >> 3;
975   unsigned Tag = CTy.getTag();
976   Buffer.setTag(Tag);
977
978   switch (Tag) {
979   case dwarf::DW_TAG_vector_type:
980   case dwarf::DW_TAG_array_type:
981     constructArrayTypeDIE(Buffer, &CTy);
982     break;
983   case dwarf::DW_TAG_enumeration_type: {
984     DIArray Elements = CTy.getTypeArray();
985
986     // Add enumerators to enumeration type.
987     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
988       DIE *ElemDie = NULL;
989       DIDescriptor Enum(Elements.getElement(i));
990       if (Enum.isEnumerator()) {
991         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
992         Buffer.addChild(ElemDie);
993       }
994     }
995   }
996     break;
997   case dwarf::DW_TAG_subroutine_type: {
998     // Add return type.
999     DIArray Elements = CTy.getTypeArray();
1000     DIDescriptor RTy = Elements.getElement(0);
1001     addType(&Buffer, DIType(RTy));
1002
1003     // Add prototype flag.
1004     addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1005
1006     // Add arguments.
1007     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1008       DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1009       DIDescriptor Ty = Elements.getElement(i);
1010       addType(Arg, DIType(Ty));
1011       Buffer.addChild(Arg);
1012     }
1013   }
1014     break;
1015   case dwarf::DW_TAG_structure_type:
1016   case dwarf::DW_TAG_union_type:
1017   case dwarf::DW_TAG_class_type: {
1018     // Add elements to structure type.
1019     DIArray Elements = CTy.getTypeArray();
1020
1021     // A forward struct declared type may not have elements available.
1022     unsigned N = Elements.getNumElements();
1023     if (N == 0)
1024       break;
1025
1026     // Add elements to structure type.
1027     for (unsigned i = 0; i < N; ++i) {
1028       DIDescriptor Element = Elements.getElement(i);
1029       DIE *ElemDie = NULL;
1030       if (Element.isSubprogram())
1031         ElemDie = createSubprogramDIE(DISubprogram(Element));
1032       else if (Element.isVariable()) {
1033         DIVariable DV(Element);
1034         ElemDie = new DIE(dwarf::DW_TAG_variable);
1035         addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1036                   DV.getName());
1037         addType(ElemDie, DV.getType());
1038         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1039         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1040         addSourceLine(ElemDie, &DV);
1041       } else if (Element.isDerivedType())
1042         ElemDie = createMemberDIE(DIDerivedType(Element));
1043       else
1044         continue;
1045       Buffer.addChild(ElemDie);
1046     }
1047
1048     if (CTy.isAppleBlockExtension())
1049       addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1050
1051     unsigned RLang = CTy.getRunTimeLang();
1052     if (RLang)
1053       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1054               dwarf::DW_FORM_data1, RLang);
1055
1056     DICompositeType ContainingType = CTy.getContainingType();
1057     if (DIDescriptor(ContainingType).isCompositeType())
1058       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 
1059                   getOrCreateTypeDIE(DIType(ContainingType)));
1060     else {
1061       DIDescriptor Context = CTy.getContext();
1062       addToContextOwner(&Buffer, Context);
1063     }
1064     break;
1065   }
1066   default:
1067     break;
1068   }
1069
1070   // Add name if not anonymous or intermediate type.
1071   if (!Name.empty())
1072     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1073
1074   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
1075       Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
1076     // Add size if non-zero (derived types might be zero-sized.)
1077     if (Size)
1078       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1079     else {
1080       // Add zero size if it is not a forward declaration.
1081       if (CTy.isForwardDecl())
1082         addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1083       else
1084         addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1085     }
1086
1087     // Add source line info if available.
1088     if (!CTy.isForwardDecl())
1089       addSourceLine(&Buffer, &CTy);
1090   }
1091 }
1092
1093 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1094 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1095   int64_t L = SR.getLo();
1096   int64_t H = SR.getHi();
1097   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1098
1099   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1100   if (L)
1101     addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1102   addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1103
1104   Buffer.addChild(DW_Subrange);
1105 }
1106
1107 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1108 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1109                                        DICompositeType *CTy) {
1110   Buffer.setTag(dwarf::DW_TAG_array_type);
1111   if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1112     addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1113
1114   // Emit derived type.
1115   addType(&Buffer, CTy->getTypeDerivedFrom());
1116   DIArray Elements = CTy->getTypeArray();
1117
1118   // Get an anonymous type for index type.
1119   CompileUnit *TheCU = getCompileUnit(*CTy);
1120   DIE *IdxTy = TheCU->getIndexTyDie();
1121   if (!IdxTy) {
1122     // Construct an anonymous type for index type.
1123     IdxTy = new DIE(dwarf::DW_TAG_base_type);
1124     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1125     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1126             dwarf::DW_ATE_signed);
1127     TheCU->addDie(IdxTy);
1128     TheCU->setIndexTyDie(IdxTy);
1129   }
1130
1131   // Add subranges to array type.
1132   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1133     DIDescriptor Element = Elements.getElement(i);
1134     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1135       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1136   }
1137 }
1138
1139 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1140 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1141   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1142   StringRef Name = ETy.getName();
1143   addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1144   int64_t Value = ETy.getEnumValue();
1145   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1146   return Enumerator;
1147 }
1148
1149 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm 
1150 /// printer to not emit usual symbol prefix before the symbol name is used then
1151 /// return linkage name after skipping this special LLVM prefix.
1152 static StringRef getRealLinkageName(StringRef LinkageName) {
1153   char One = '\1';
1154   if (LinkageName.startswith(StringRef(&One, 1)))
1155     return LinkageName.substr(1);
1156   return LinkageName;
1157 }
1158
1159 /// createGlobalVariableDIE - Create new DIE using GV.
1160 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1161   // If the global variable was optmized out then no need to create debug info
1162   // entry.
1163   if (!GV.getGlobal()) return NULL;
1164   if (GV.getDisplayName().empty()) return NULL;
1165
1166   DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1167   addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1168             GV.getDisplayName());
1169
1170   StringRef LinkageName = GV.getLinkageName();
1171   if (!LinkageName.empty())
1172     addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1173               getRealLinkageName(LinkageName));
1174
1175   addType(GVDie, GV.getType());
1176   if (!GV.isLocalToUnit())
1177     addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1178   addSourceLine(GVDie, &GV);
1179
1180   return GVDie;
1181 }
1182
1183 /// createMemberDIE - Create new member DIE.
1184 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1185   DIE *MemberDie = new DIE(DT.getTag());
1186   StringRef Name = DT.getName();
1187   if (!Name.empty())
1188     addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1189   
1190   addType(MemberDie, DT.getTypeDerivedFrom());
1191
1192   addSourceLine(MemberDie, &DT);
1193
1194   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1195   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1196
1197   uint64_t Size = DT.getSizeInBits();
1198   uint64_t FieldSize = DT.getOriginalTypeSize();
1199
1200   if (Size != FieldSize) {
1201     // Handle bitfield.
1202     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1203     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1204
1205     uint64_t Offset = DT.getOffsetInBits();
1206     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1207     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1208     uint64_t FieldOffset = (HiMark - FieldSize);
1209     Offset -= FieldOffset;
1210
1211     // Maybe we need to work from the other end.
1212     if (Asm->getTargetData().isLittleEndian())
1213       Offset = FieldSize - (Offset + Size);
1214     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1215
1216     // Here WD_AT_data_member_location points to the anonymous
1217     // field that includes this bit field.
1218     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1219
1220   } else
1221     // This is not a bitfield.
1222     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1223
1224   if (DT.getTag() == dwarf::DW_TAG_inheritance
1225       && DT.isVirtual()) {
1226
1227     // For C++, virtual base classes are not at fixed offset. Use following
1228     // expression to extract appropriate offset from vtable.
1229     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1230
1231     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1232     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1233     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1234     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1235     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1236     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1237     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1238     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1239
1240     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 
1241              VBaseLocationDie);
1242   } else
1243     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1244
1245   if (DT.isProtected())
1246     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1247             dwarf::DW_ACCESS_protected);
1248   else if (DT.isPrivate())
1249     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1250             dwarf::DW_ACCESS_private);
1251   else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1252     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1253             dwarf::DW_ACCESS_public);
1254   if (DT.isVirtual())
1255     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1256             dwarf::DW_VIRTUALITY_virtual);
1257   return MemberDie;
1258 }
1259
1260 /// createSubprogramDIE - Create new DIE using SP.
1261 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1262   CompileUnit *SPCU = getCompileUnit(SP);
1263   DIE *SPDie = SPCU->getDIE(SP);
1264   if (SPDie)
1265     return SPDie;
1266
1267   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1268   // Constructors and operators for anonymous aggregates do not have names.
1269   if (!SP.getName().empty())
1270     addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1271
1272   StringRef LinkageName = SP.getLinkageName();
1273   if (!LinkageName.empty())
1274     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1275               getRealLinkageName(LinkageName));
1276
1277   addSourceLine(SPDie, &SP);
1278
1279   // Add prototyped tag, if C or ObjC.
1280   unsigned Lang = SP.getCompileUnit().getLanguage();
1281   if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1282       Lang == dwarf::DW_LANG_ObjC)
1283     addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1284
1285   // Add Return Type.
1286   DICompositeType SPTy = SP.getType();
1287   DIArray Args = SPTy.getTypeArray();
1288   unsigned SPTag = SPTy.getTag();
1289
1290   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1291     addType(SPDie, SPTy);
1292   else
1293     addType(SPDie, DIType(Args.getElement(0)));
1294
1295   unsigned VK = SP.getVirtuality();
1296   if (VK) {
1297     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1298     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1299     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1300     addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1301     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1302     ContainingTypeMap.insert(std::make_pair(SPDie, 
1303                                             SP.getContainingType()));
1304   }
1305
1306   if (MakeDecl || !SP.isDefinition()) {
1307     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1308
1309     // Add arguments. Do not add arguments for subprogram definition. They will
1310     // be handled while processing variables.
1311     DICompositeType SPTy = SP.getType();
1312     DIArray Args = SPTy.getTypeArray();
1313     unsigned SPTag = SPTy.getTag();
1314
1315     if (SPTag == dwarf::DW_TAG_subroutine_type)
1316       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1317         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1318         DIType ATy = DIType(DIType(Args.getElement(i)));
1319         addType(Arg, ATy);
1320         if (ATy.isArtificial())
1321           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1322         SPDie->addChild(Arg);
1323       }
1324   }
1325
1326   if (SP.isArtificial())
1327     addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1328
1329   if (!SP.isLocalToUnit())
1330     addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1331   
1332   if (SP.isOptimized())
1333     addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1334
1335   // DW_TAG_inlined_subroutine may refer to this DIE.
1336   SPCU->insertDIE(SP, SPDie);
1337
1338   // Add to context owner.
1339   addToContextOwner(SPDie, SP.getContext());
1340
1341   return SPDie;
1342 }
1343
1344 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1345   assert(N && "Invalid Scope encoding!");
1346
1347   DbgScope *AScope = AbstractScopes.lookup(N);
1348   if (AScope)
1349     return AScope;
1350
1351   DbgScope *Parent = NULL;
1352
1353   DIDescriptor Scope(N);
1354   if (Scope.isLexicalBlock()) {
1355     DILexicalBlock DB(N);
1356     DIDescriptor ParentDesc = DB.getContext();
1357     Parent = getOrCreateAbstractScope(ParentDesc);
1358   }
1359
1360   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1361
1362   if (Parent)
1363     Parent->addScope(AScope);
1364   AScope->setAbstractScope();
1365   AbstractScopes[N] = AScope;
1366   if (DIDescriptor(N).isSubprogram())
1367     AbstractScopesList.push_back(AScope);
1368   return AScope;
1369 }
1370
1371 /// isSubprogramContext - Return true if Context is either a subprogram
1372 /// or another context nested inside a subprogram.
1373 static bool isSubprogramContext(const MDNode *Context) {
1374   if (!Context)
1375     return false;
1376   DIDescriptor D(Context);
1377   if (D.isSubprogram())
1378     return true;
1379   if (D.isType())
1380     return isSubprogramContext(DIType(Context).getContext());
1381   return false;
1382 }
1383
1384 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1385 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1386 /// If there are global variables in this scope then create and insert
1387 /// DIEs for these variables.
1388 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1389   CompileUnit *SPCU = getCompileUnit(SPNode);
1390   DIE *SPDie = SPCU->getDIE(SPNode);
1391   assert(SPDie && "Unable to find subprogram DIE!");
1392   DISubprogram SP(SPNode);
1393   
1394   // There is not any need to generate specification DIE for a function
1395   // defined at compile unit level. If a function is defined inside another
1396   // function then gdb prefers the definition at top level and but does not
1397   // expect specification DIE in parent function. So avoid creating 
1398   // specification DIE for a function defined inside a function.
1399   if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1400       !SP.getContext().isFile() && 
1401       !isSubprogramContext(SP.getContext())) {
1402     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1403     
1404     // Add arguments. 
1405     DICompositeType SPTy = SP.getType();
1406     DIArray Args = SPTy.getTypeArray();
1407     unsigned SPTag = SPTy.getTag();
1408     if (SPTag == dwarf::DW_TAG_subroutine_type)
1409       for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1410         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1411         DIType ATy = DIType(DIType(Args.getElement(i)));
1412         addType(Arg, ATy);
1413         if (ATy.isArtificial())
1414           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1415         SPDie->addChild(Arg);
1416       }
1417     DIE *SPDeclDie = SPDie;
1418     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1419     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 
1420                 SPDeclDie);
1421     SPCU->addDie(SPDie);
1422   }
1423   
1424   addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1425            Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1426   addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1427            Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1428   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1429   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1430   addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1431
1432   return SPDie;
1433 }
1434
1435 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1436 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1437 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1438
1439   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1440   if (Scope->isAbstractScope())
1441     return ScopeDIE;
1442
1443   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1444   if (Ranges.empty())
1445     return 0;
1446
1447   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1448   if (Ranges.size() > 1) {
1449     // .debug_range section has not been laid out yet. Emit offset in
1450     // .debug_range as a uint, size 4, for now. emitDIE will handle 
1451     // DW_AT_ranges appropriately.
1452     addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1453             DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1454     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1455          RE = Ranges.end(); RI != RE; ++RI) {
1456       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1457       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1458     }
1459     DebugRangeSymbols.push_back(NULL);
1460     DebugRangeSymbols.push_back(NULL);
1461     return ScopeDIE;
1462   }
1463
1464   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1465   const MCSymbol *End = getLabelAfterInsn(RI->second);
1466
1467   if (End == 0) return 0;
1468
1469   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1470   assert(End->isDefined() && "Invalid end label for an inlined scope!");
1471   
1472   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1473   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1474
1475   return ScopeDIE;
1476 }
1477
1478 /// constructInlinedScopeDIE - This scope represents inlined body of
1479 /// a function. Construct DIE to represent this concrete inlined copy
1480 /// of the function.
1481 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1482
1483   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1484   assert (Ranges.empty() == false 
1485           && "DbgScope does not have instruction markers!");
1486
1487   // FIXME : .debug_inlined section specification does not clearly state how
1488   // to emit inlined scope that is split into multiple instruction ranges.
1489   // For now, use first instruction range and emit low_pc/high_pc pair and
1490   // corresponding .debug_inlined section entry for this pair.
1491   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1492   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1493   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1494
1495   if (StartLabel == FunctionBeginSym || EndLabel == 0) {
1496     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
1497     return 0;
1498   }
1499   assert(StartLabel->isDefined() &&
1500          "Invalid starting label for an inlined scope!");
1501   assert(EndLabel->isDefined() &&
1502          "Invalid end label for an inlined scope!");
1503
1504   if (!Scope->getScopeNode())
1505     return NULL;
1506   DIScope DS(Scope->getScopeNode());
1507   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1508
1509   DISubprogram InlinedSP = getDISubprogram(DS);
1510   CompileUnit *TheCU = getCompileUnit(InlinedSP);
1511   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1512   assert(OriginDIE && "Unable to find Origin DIE!");
1513   addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1514               dwarf::DW_FORM_ref4, OriginDIE);
1515
1516   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1517   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1518
1519   InlinedSubprogramDIEs.insert(OriginDIE);
1520
1521   // Track the start label for this inlined function.
1522   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1523     I = InlineInfo.find(InlinedSP);
1524
1525   if (I == InlineInfo.end()) {
1526     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1527                                                              ScopeDIE));
1528     InlinedSPNodes.push_back(InlinedSP);
1529   } else
1530     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1531
1532   DILocation DL(Scope->getInlinedAt());
1533   addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1534   addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1535
1536   return ScopeDIE;
1537 }
1538
1539
1540 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1541 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1542   // Get the descriptor.
1543   const DIVariable &VD = DV->getVariable();
1544   StringRef Name = VD.getName();
1545   if (Name.empty())
1546     return NULL;
1547
1548   // Translate tag to proper Dwarf tag.  The result variable is dropped for
1549   // now.
1550   unsigned Tag;
1551   switch (VD.getTag()) {
1552   case dwarf::DW_TAG_return_variable:
1553     return NULL;
1554   case dwarf::DW_TAG_arg_variable:
1555     Tag = dwarf::DW_TAG_formal_parameter;
1556     break;
1557   case dwarf::DW_TAG_auto_variable:    // fall thru
1558   default:
1559     Tag = dwarf::DW_TAG_variable;
1560     break;
1561   }
1562
1563   // Define variable debug information entry.
1564   DIE *VariableDie = new DIE(Tag);
1565
1566   DIE *AbsDIE = NULL;
1567   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1568     V2AVI = VarToAbstractVarMap.find(DV);
1569   if (V2AVI != VarToAbstractVarMap.end())
1570     AbsDIE = V2AVI->second->getDIE();
1571
1572   if (AbsDIE)
1573     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1574                 dwarf::DW_FORM_ref4, AbsDIE);
1575   else {
1576     addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1577     addSourceLine(VariableDie, &VD);
1578
1579     // Add variable type.
1580     // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1581     // addresses instead.
1582     if (VD.isBlockByrefVariable())
1583       addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1584     else
1585       addType(VariableDie, VD.getType());
1586   }
1587
1588   if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1589     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1590
1591   if (Scope->isAbstractScope()) {
1592     DV->setDIE(VariableDie);
1593     return VariableDie;
1594   }
1595
1596   // Add variable address.
1597
1598   unsigned Offset = DV->getDotDebugLocOffset();
1599   if (Offset != ~0U) {
1600     addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1601              Asm->GetTempSymbol("debug_loc", Offset));
1602     DV->setDIE(VariableDie);
1603     UseDotDebugLocEntry.insert(VariableDie);
1604     return VariableDie;
1605   }
1606
1607   // Check if variable is described by a  DBG_VALUE instruction.
1608   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1609     DbgVariableToDbgInstMap.find(DV);
1610   if (DVI != DbgVariableToDbgInstMap.end()) {
1611     const MachineInstr *DVInsn = DVI->second;
1612     const MCSymbol *DVLabel = findVariableLabel(DV);
1613     bool updated = false;
1614     // FIXME : Handle getNumOperands != 3 
1615     if (DVInsn->getNumOperands() == 3) {
1616       if (DVInsn->getOperand(0).isReg())
1617         updated = addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0));
1618       else if (DVInsn->getOperand(0).isImm())
1619         updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1620       else if (DVInsn->getOperand(0).isFPImm()) 
1621         updated = addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1622     } else {
1623       MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1624       if (Location.getReg()) {
1625         addAddress(VariableDie, dwarf::DW_AT_location, Location);
1626         if (DVLabel)
1627           addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1628                    DVLabel);
1629         updated = true;
1630       }
1631     }
1632     if (!updated) {
1633       // If variableDie is not updated then DBG_VALUE instruction does not
1634       // have valid variable info.
1635       delete VariableDie;
1636       return NULL;
1637     }
1638     DV->setDIE(VariableDie);
1639     return VariableDie;
1640   } 
1641
1642   // .. else use frame index, if available.
1643   MachineLocation Location;
1644   unsigned FrameReg;
1645   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1646   int FI = 0;
1647   if (findVariableFrameIndex(DV, &FI)) {
1648     int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1649     Location.set(FrameReg, Offset);
1650     
1651     if (VD.hasComplexAddress())
1652       addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1653     else if (VD.isBlockByrefVariable())
1654       addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1655     else
1656       addAddress(VariableDie, dwarf::DW_AT_location, Location);
1657   }
1658   DV->setDIE(VariableDie);
1659   return VariableDie;
1660
1661 }
1662
1663 void DwarfDebug::addPubTypes(DISubprogram SP) {
1664   DICompositeType SPTy = SP.getType();
1665   unsigned SPTag = SPTy.getTag();
1666   if (SPTag != dwarf::DW_TAG_subroutine_type) 
1667     return;
1668
1669   DIArray Args = SPTy.getTypeArray();
1670   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1671     DIType ATy(Args.getElement(i));
1672     if (!ATy.Verify())
1673       continue;
1674     DICompositeType CATy = getDICompositeType(ATy);
1675     if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1676         && !CATy.isForwardDecl()) {
1677       CompileUnit *TheCU = getCompileUnit(CATy);
1678       if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1679         TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1680     }
1681   }
1682 }
1683
1684 /// constructScopeDIE - Construct a DIE for this scope.
1685 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1686   if (!Scope || !Scope->getScopeNode())
1687     return NULL;
1688  
1689   DIScope DS(Scope->getScopeNode());
1690   DIE *ScopeDIE = NULL;
1691   if (Scope->getInlinedAt())
1692     ScopeDIE = constructInlinedScopeDIE(Scope);
1693   else if (DS.isSubprogram()) {
1694     if (Scope->isAbstractScope())
1695       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1696     else
1697       ScopeDIE = updateSubprogramScopeDIE(DS);
1698   }
1699   else
1700     ScopeDIE = constructLexicalScopeDIE(Scope);
1701   if (!ScopeDIE) return NULL;
1702   
1703   // Add variables to scope.
1704   const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1705   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1706     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1707     if (VariableDIE)
1708       ScopeDIE->addChild(VariableDIE);
1709   }
1710
1711   // Add nested scopes.
1712   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1713   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1714     // Define the Scope debug information entry.
1715     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1716     if (NestedDIE)
1717       ScopeDIE->addChild(NestedDIE);
1718   }
1719
1720   if (DS.isSubprogram()) 
1721     addPubTypes(DISubprogram(DS));
1722  
1723  return ScopeDIE;
1724 }
1725
1726 /// GetOrCreateSourceID - Look up the source id with the given directory and
1727 /// source file names. If none currently exists, create a new id and insert it
1728 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1729 /// maps as well.
1730 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1731   unsigned DId;
1732   StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1733   if (DI != DirectoryIdMap.end()) {
1734     DId = DI->getValue();
1735   } else {
1736     DId = DirectoryNames.size() + 1;
1737     DirectoryIdMap[DirName] = DId;
1738     DirectoryNames.push_back(DirName);
1739   }
1740
1741   unsigned FId;
1742   StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1743   if (FI != SourceFileIdMap.end()) {
1744     FId = FI->getValue();
1745   } else {
1746     FId = SourceFileNames.size() + 1;
1747     SourceFileIdMap[FileName] = FId;
1748     SourceFileNames.push_back(FileName);
1749   }
1750
1751   DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1752     SourceIdMap.find(std::make_pair(DId, FId));
1753   if (SI != SourceIdMap.end())
1754     return SI->second;
1755
1756   unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1757   SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1758   SourceIds.push_back(std::make_pair(DId, FId));
1759
1760   return SrcId;
1761 }
1762
1763 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1764 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1765   CompileUnit *TheCU = getCompileUnit(NS);
1766   DIE *NDie = TheCU->getDIE(NS);
1767   if (NDie)
1768     return NDie;
1769   NDie = new DIE(dwarf::DW_TAG_namespace);
1770   TheCU->insertDIE(NS, NDie);
1771   if (!NS.getName().empty())
1772     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1773   addSourceLine(NDie, &NS);
1774   addToContextOwner(NDie, NS.getContext());
1775   return NDie;
1776 }
1777
1778 /// constructCompileUnit - Create new CompileUnit for the given 
1779 /// metadata node with tag DW_TAG_compile_unit.
1780 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1781   DICompileUnit DIUnit(N);
1782   StringRef FN = DIUnit.getFilename();
1783   StringRef Dir = DIUnit.getDirectory();
1784   unsigned ID = GetOrCreateSourceID(Dir, FN);
1785
1786   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1787   addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1788             DIUnit.getProducer());
1789   addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1790           DIUnit.getLanguage());
1791   addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1792   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1793   // simplifies debug range entries.
1794   addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_data4, 0);
1795   // DW_AT_stmt_list is a offset of line number information for this
1796   // compile unit in debug_line section. It is always zero when only one
1797   // compile unit is emitted in one object file.
1798   addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1799
1800   if (!Dir.empty())
1801     addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1802   if (DIUnit.isOptimized())
1803     addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1804
1805   StringRef Flags = DIUnit.getFlags();
1806   if (!Flags.empty())
1807     addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1808
1809   unsigned RVer = DIUnit.getRunTimeVersion();
1810   if (RVer)
1811     addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1812             dwarf::DW_FORM_data1, RVer);
1813
1814   CompileUnit *NewCU = new CompileUnit(ID, Die);
1815   if (!FirstCU)
1816     FirstCU = NewCU;
1817   CUMap.insert(std::make_pair(N, NewCU));
1818 }
1819
1820 /// getCompielUnit - Get CompileUnit DIE.
1821 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1822   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1823   DIDescriptor D(N);
1824   const MDNode *CUNode = NULL;
1825   if (D.isCompileUnit())
1826     CUNode = N;
1827   else if (D.isSubprogram())
1828     CUNode = DISubprogram(N).getCompileUnit();
1829   else if (D.isType())
1830     CUNode = DIType(N).getCompileUnit();
1831   else if (D.isGlobalVariable())
1832     CUNode = DIGlobalVariable(N).getCompileUnit();
1833   else if (D.isVariable())
1834     CUNode = DIVariable(N).getCompileUnit();
1835   else if (D.isNameSpace())
1836     CUNode = DINameSpace(N).getCompileUnit();
1837   else if (D.isFile())
1838     CUNode = DIFile(N).getCompileUnit();
1839   else
1840     return FirstCU;
1841
1842   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1843     = CUMap.find(CUNode);
1844   if (I == CUMap.end())
1845     return FirstCU;
1846   return I->second;
1847 }
1848
1849
1850 /// constructGlobalVariableDIE - Construct global variable DIE.
1851 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1852   DIGlobalVariable DI_GV(N);
1853
1854   // If debug information is malformed then ignore it.
1855   if (DI_GV.Verify() == false)
1856     return;
1857
1858   // Check for pre-existence.
1859   CompileUnit *TheCU = getCompileUnit(N);
1860   if (TheCU->getDIE(DI_GV))
1861     return;
1862
1863   DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1864   if (!VariableDie)
1865     return;
1866
1867   // Add to map.
1868   TheCU->insertDIE(N, VariableDie);
1869
1870   // Add to context owner.
1871   DIDescriptor GVContext = DI_GV.getContext();
1872   // Do not create specification DIE if context is either compile unit
1873   // or a subprogram.
1874   if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1875       !GVContext.isFile() && 
1876       !isSubprogramContext(GVContext)) {
1877     // Create specification DIE.
1878     DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1879     addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1880                 dwarf::DW_FORM_ref4, VariableDie);
1881     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1882     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1883     addLabel(Block, 0, dwarf::DW_FORM_udata,
1884              Asm->Mang->getSymbol(DI_GV.getGlobal()));
1885     addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1886     addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1887     TheCU->addDie(VariableSpecDIE);
1888   } else {
1889     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1890     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1891     addLabel(Block, 0, dwarf::DW_FORM_udata,
1892              Asm->Mang->getSymbol(DI_GV.getGlobal()));
1893     addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1894   }
1895   addToContextOwner(VariableDie, GVContext);
1896   
1897   // Expose as global. FIXME - need to check external flag.
1898   TheCU->addGlobal(DI_GV.getName(), VariableDie);
1899
1900   DIType GTy = DI_GV.getType();
1901   if (GTy.isCompositeType() && !GTy.getName().empty()
1902       && !GTy.isForwardDecl()) {
1903     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1904     assert(Entry && "Missing global type!");
1905     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1906   }
1907   return;
1908 }
1909
1910 /// construct SubprogramDIE - Construct subprogram DIE.
1911 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1912   DISubprogram SP(N);
1913
1914   // Check for pre-existence.
1915   CompileUnit *TheCU = getCompileUnit(N);
1916   if (TheCU->getDIE(N))
1917     return;
1918
1919   if (!SP.isDefinition())
1920     // This is a method declaration which will be handled while constructing
1921     // class type.
1922     return;
1923
1924   DIE *SubprogramDie = createSubprogramDIE(SP);
1925
1926   // Add to map.
1927   TheCU->insertDIE(N, SubprogramDie);
1928
1929   // Add to context owner.
1930   addToContextOwner(SubprogramDie, SP.getContext());
1931
1932   // Expose as global.
1933   TheCU->addGlobal(SP.getName(), SubprogramDie);
1934
1935   return;
1936 }
1937
1938 /// beginModule - Emit all Dwarf sections that should come prior to the
1939 /// content. Create global DIEs and emit initial debug info sections.
1940 /// This is inovked by the target AsmPrinter.
1941 void DwarfDebug::beginModule(Module *M) {
1942   if (DisableDebugInfoPrinting)
1943     return;
1944
1945   DebugInfoFinder DbgFinder;
1946   DbgFinder.processModule(*M);
1947
1948   bool HasDebugInfo = false;
1949   
1950   // Scan all the compile-units to see if there are any marked as the main unit.
1951   // if not, we do not generate debug info.
1952   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1953        E = DbgFinder.compile_unit_end(); I != E; ++I) {
1954     if (DICompileUnit(*I).isMain()) {
1955       HasDebugInfo = true;
1956       break;
1957     }
1958   }
1959   
1960   if (!HasDebugInfo) return;
1961
1962   // Tell MMI that we have debug info.
1963   MMI->setDebugInfoAvailability(true);
1964   
1965   // Emit initial sections.
1966   EmitSectionLabels();
1967   
1968   // Create all the compile unit DIEs.
1969   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1970          E = DbgFinder.compile_unit_end(); I != E; ++I)
1971     constructCompileUnit(*I);
1972
1973   // Create DIEs for each subprogram.
1974   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1975          E = DbgFinder.subprogram_end(); I != E; ++I)
1976     constructSubprogramDIE(*I);
1977
1978   // Create DIEs for each global variable.
1979   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1980          E = DbgFinder.global_variable_end(); I != E; ++I)
1981     constructGlobalVariableDIE(*I);
1982
1983   // Prime section data.
1984   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1985
1986   // Print out .file directives to specify files for .loc directives. These are
1987   // printed out early so that they precede any .loc directives.
1988   if (Asm->MAI->hasDotLocAndDotFile()) {
1989     for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1990       // Remember source id starts at 1.
1991       std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1992       // FIXME: don't use sys::path for this!  This should not depend on the
1993       // host.
1994       sys::Path FullPath(getSourceDirectoryName(Id.first));
1995       bool AppendOk =
1996         FullPath.appendComponent(getSourceFileName(Id.second));
1997       assert(AppendOk && "Could not append filename to directory!");
1998       AppendOk = false;
1999       Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2000     }
2001   }
2002 }
2003
2004 /// endModule - Emit all Dwarf sections that should come after the content.
2005 ///
2006 void DwarfDebug::endModule() {
2007   if (!FirstCU) return;
2008
2009   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2010   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2011          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2012     DIE *ISP = *AI;
2013     addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2014   }
2015
2016   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2017          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2018     DIE *SPDie = CI->first;
2019     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2020     if (!N) continue;
2021     DIE *NDie = getCompileUnit(N)->getDIE(N);
2022     if (!NDie) continue;
2023     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2024   }
2025
2026   // Standard sections final addresses.
2027   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2028   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2029   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2030   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2031
2032   // End text sections.
2033   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2034     Asm->OutStreamer.SwitchSection(SectionMap[i]);
2035     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2036   }
2037
2038   // Emit common frame information.
2039   emitCommonDebugFrame();
2040
2041   // Emit function debug frame information
2042   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2043          E = DebugFrames.end(); I != E; ++I)
2044     emitFunctionDebugFrame(*I);
2045
2046   // Compute DIE offsets and sizes.
2047   computeSizeAndOffsets();
2048
2049   // Emit all the DIEs into a debug info section
2050   emitDebugInfo();
2051
2052   // Corresponding abbreviations into a abbrev section.
2053   emitAbbreviations();
2054
2055   // Emit source line correspondence into a debug line section.
2056   emitDebugLines();
2057
2058   // Emit info into a debug pubnames section.
2059   emitDebugPubNames();
2060
2061   // Emit info into a debug pubtypes section.
2062   emitDebugPubTypes();
2063
2064   // Emit info into a debug loc section.
2065   emitDebugLoc();
2066
2067   // Emit info into a debug aranges section.
2068   EmitDebugARanges();
2069
2070   // Emit info into a debug ranges section.
2071   emitDebugRanges();
2072
2073   // Emit info into a debug macinfo section.
2074   emitDebugMacInfo();
2075
2076   // Emit inline info.
2077   emitDebugInlineInfo();
2078
2079   // Emit info into a debug str section.
2080   emitDebugStr();
2081   
2082   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2083          E = CUMap.end(); I != E; ++I)
2084     delete I->second;
2085   FirstCU = NULL;  // Reset for the next Module, if any.
2086 }
2087
2088 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2089 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var, 
2090                                               DebugLoc ScopeLoc) {
2091
2092   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2093   if (AbsDbgVariable)
2094     return AbsDbgVariable;
2095
2096   LLVMContext &Ctx = Var->getContext();
2097   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2098   if (!Scope)
2099     return NULL;
2100
2101   AbsDbgVariable = new DbgVariable(Var);
2102   Scope->addVariable(AbsDbgVariable);
2103   AbstractVariables[Var] = AbsDbgVariable;
2104   return AbsDbgVariable;
2105 }
2106
2107 /// collectVariableInfoFromMMITable - Collect variable information from
2108 /// side table maintained by MMI.
2109 void 
2110 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2111                                    SmallPtrSet<const MDNode *, 16> &Processed) {
2112   const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2113   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2114   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2115          VE = VMap.end(); VI != VE; ++VI) {
2116     const MDNode *Var = VI->first;
2117     if (!Var) continue;
2118     Processed.insert(Var);
2119     DIVariable DV(Var);
2120     const std::pair<unsigned, DebugLoc> &VP = VI->second;
2121
2122     DbgScope *Scope = 0;
2123     if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2124       Scope = ConcreteScopes.lookup(IA);
2125     if (Scope == 0)
2126       Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2127     
2128     // If variable scope is not found then skip this variable.
2129     if (Scope == 0)
2130       continue;
2131
2132     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2133     DbgVariable *RegVar = new DbgVariable(DV);
2134     recordVariableFrameIndex(RegVar, VP.first);
2135     Scope->addVariable(RegVar);
2136     if (AbsDbgVariable) {
2137       recordVariableFrameIndex(AbsDbgVariable, VP.first);
2138       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2139     }
2140   }
2141 }
2142
2143 /// isDbgValueInUndefinedReg - Return true if debug value, encoded by 
2144 /// DBG_VALUE instruction, is in undefined reg.
2145 static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2146   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2147   if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2148     return true;
2149   return false;
2150 }
2151
2152 /// isDbgValueInDefinedReg - Return true if debug value, encoded by 
2153 /// DBG_VALUE instruction, is in a defined reg.
2154 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2155   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2156   if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2157     return true;
2158   return false;
2159 }
2160
2161 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2162 void DwarfDebug::collectVariableInfo(const MachineFunction *MF) {
2163   SmallPtrSet<const MDNode *, 16> Processed;
2164   
2165   /// collection info from MMI table.
2166   collectVariableInfoFromMMITable(MF, Processed);
2167
2168   SmallVector<const MachineInstr *, 8> DbgValues;
2169   // Collect variable information from DBG_VALUE machine instructions;
2170   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2171        I != E; ++I)
2172     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2173          II != IE; ++II) {
2174       const MachineInstr *MInsn = II;
2175       if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2176         continue;
2177       DbgValues.push_back(MInsn);
2178     }
2179
2180   // This is a collection of DBV_VALUE instructions describing same variable.
2181   SmallVector<const MachineInstr *, 4> MultipleValues;
2182   for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2183         E = DbgValues.end(); I != E; ++I) {
2184     const MachineInstr *MInsn = *I;
2185     MultipleValues.clear();
2186     if (isDbgValueInDefinedReg(MInsn))
2187       MultipleValues.push_back(MInsn);
2188     DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2189     if (Processed.count(DV) != 0)
2190       continue;
2191
2192     const MachineInstr *PrevMI = MInsn;
2193     for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1, 
2194            ME = DbgValues.end(); MI != ME; ++MI) {
2195       const MDNode *Var = 
2196         (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2197       if (Var == DV && isDbgValueInDefinedReg(*MI) && 
2198           !PrevMI->isIdenticalTo(*MI))
2199         MultipleValues.push_back(*MI);
2200       PrevMI = *MI;
2201     }
2202
2203     DbgScope *Scope = findDbgScope(MInsn);
2204     bool CurFnArg = false;
2205     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2206         DISubprogram(DV.getContext()).describes(MF->getFunction()))
2207       CurFnArg = true;
2208     if (!Scope && CurFnArg)
2209       Scope = CurrentFnDbgScope;
2210     // If variable scope is not found then skip this variable.
2211     if (!Scope)
2212       continue;
2213
2214     Processed.insert(DV);
2215     DbgVariable *RegVar = new DbgVariable(DV);
2216     Scope->addVariable(RegVar);
2217     if (!CurFnArg)
2218       DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn); 
2219     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2220       DbgVariableToDbgInstMap[AbsVar] = MInsn;
2221       VarToAbstractVarMap[RegVar] = AbsVar;
2222     }
2223     if (MultipleValues.size() <= 1) {
2224       DbgVariableToDbgInstMap[RegVar] = MInsn;
2225       continue;
2226     }
2227
2228     // handle multiple DBG_VALUE instructions describing one variable.
2229     if (DotDebugLocEntries.empty())
2230       RegVar->setDotDebugLocOffset(0);
2231     else
2232       RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2233     const MachineInstr *Begin = NULL;
2234     const MachineInstr *End = NULL;
2235     for (SmallVector<const MachineInstr *, 4>::iterator 
2236            MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) {
2237       if (!Begin) {
2238         Begin = *MVI;
2239         continue;
2240       } 
2241       End = *MVI;
2242       MachineLocation MLoc;
2243       MLoc.set(Begin->getOperand(0).getReg(), 0);
2244       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2245       const MCSymbol *SLabel = getLabelBeforeInsn(End);
2246       DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2247       Begin = End;
2248       if (MVI + 1 == MVE) {
2249         // If End is the last instruction then its value is valid
2250         // until the end of the funtion.
2251         MLoc.set(End->getOperand(0).getReg(), 0);
2252         DotDebugLocEntries.
2253           push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc));
2254       }
2255     }
2256     DotDebugLocEntries.push_back(DotDebugLocEntry());
2257   }
2258
2259   // Collect info for variables that were optimized out.
2260   const Function *F = MF->getFunction();
2261   const Module *M = F->getParent();
2262   if (NamedMDNode *NMD = 
2263       M->getNamedMetadataUsingTwine(Twine("llvm.dbg.lv.", 
2264                                           getRealLinkageName(F->getName())))) {
2265     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2266       DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2267       if (!DV || !Processed.insert(DV))
2268         continue;
2269       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2270       if (Scope)
2271         Scope->addVariable(new DbgVariable(DV));
2272     }
2273   }
2274 }
2275
2276 /// getLabelBeforeInsn - Return Label preceding the instruction.
2277 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2278   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2279     LabelsBeforeInsn.find(MI);
2280   if (I == LabelsBeforeInsn.end())
2281     // FunctionBeginSym always preceeds all the instruction in current function.
2282     return FunctionBeginSym;
2283   return I->second;
2284 }
2285
2286 /// getLabelAfterInsn - Return Label immediately following the instruction.
2287 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2288   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2289     LabelsAfterInsn.find(MI);
2290   if (I == LabelsAfterInsn.end())
2291     return NULL;
2292   return I->second;
2293 }
2294
2295 /// beginScope - Process beginning of a scope.
2296 void DwarfDebug::beginScope(const MachineInstr *MI) {
2297   if (InsnNeedsLabel.count(MI) == 0) {
2298     LabelsBeforeInsn[MI] = PrevLabel;
2299     return;
2300   }
2301
2302   // Check location.
2303   DebugLoc DL = MI->getDebugLoc();
2304   if (!DL.isUnknown()) {
2305     const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2306     PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2307     PrevInstLoc = DL;
2308     LabelsBeforeInsn[MI] = PrevLabel;
2309     return;
2310   }
2311
2312   // If location is unknown then use temp label for this DBG_VALUE 
2313   // instruction.
2314   if (MI->isDebugValue()) {
2315     PrevLabel = MMI->getContext().CreateTempSymbol();
2316     Asm->OutStreamer.EmitLabel(PrevLabel);
2317     LabelsBeforeInsn[MI] = PrevLabel;
2318     return;
2319   }
2320
2321   if (UnknownLocations) {
2322     PrevLabel = recordSourceLine(0, 0, 0);
2323     LabelsBeforeInsn[MI] = PrevLabel;
2324     return;
2325   }
2326
2327   assert (0 && "Instruction is not processed!");
2328 }
2329
2330 /// endScope - Process end of a scope.
2331 void DwarfDebug::endScope(const MachineInstr *MI) {
2332   if (InsnsEndScopeSet.count(MI) != 0) {
2333     // Emit a label if this instruction ends a scope.
2334     MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2335     Asm->OutStreamer.EmitLabel(Label);
2336     LabelsAfterInsn[MI] = Label;
2337   }
2338 }
2339
2340 /// getOrCreateDbgScope - Create DbgScope for the scope.
2341 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) {
2342   if (!InlinedAt) {
2343     DbgScope *WScope = DbgScopeMap.lookup(Scope);
2344     if (WScope)
2345       return WScope;
2346     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2347     DbgScopeMap.insert(std::make_pair(Scope, WScope));
2348     if (DIDescriptor(Scope).isLexicalBlock()) {
2349       DbgScope *Parent = 
2350         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2351       WScope->setParent(Parent);
2352       Parent->addScope(WScope);
2353     }
2354
2355     if (!WScope->getParent()) {
2356       StringRef SPName = DISubprogram(Scope).getLinkageName();
2357       // We used to check only for a linkage name, but that fails
2358       // since we began omitting the linkage name for private
2359       // functions.  The new way is to check for the name in metadata,
2360       // but that's not supported in old .ll test cases.  Ergo, we
2361       // check both.
2362       if (SPName == Asm->MF->getFunction()->getName() ||
2363           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2364         CurrentFnDbgScope = WScope;
2365     }
2366     
2367     return WScope;
2368   }
2369
2370   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2371   if (WScope)
2372     return WScope;
2373
2374   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2375   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2376   DILocation DL(InlinedAt);
2377   DbgScope *Parent =
2378     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2379   WScope->setParent(Parent);
2380   Parent->addScope(WScope);
2381
2382   ConcreteScopes[InlinedAt] = WScope;
2383   getOrCreateAbstractScope(Scope);
2384
2385   return WScope;
2386 }
2387
2388 /// hasValidLocation - Return true if debug location entry attached with
2389 /// machine instruction encodes valid location info.
2390 static bool hasValidLocation(LLVMContext &Ctx,
2391                              const MachineInstr *MInsn,
2392                              const MDNode *&Scope, const MDNode *&InlinedAt) {
2393   if (MInsn->isDebugValue())
2394     return false;
2395   DebugLoc DL = MInsn->getDebugLoc();
2396   if (DL.isUnknown()) return false;
2397       
2398   const MDNode *S = DL.getScope(Ctx);
2399   
2400   // There is no need to create another DIE for compile unit. For all
2401   // other scopes, create one DbgScope now. This will be translated
2402   // into a scope DIE at the end.
2403   if (DIScope(S).isCompileUnit()) return false;
2404      
2405   Scope = S;
2406   InlinedAt = DL.getInlinedAt(Ctx);
2407   return true;
2408 }
2409
2410 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2411 /// hierarchy.
2412 static void calculateDominanceGraph(DbgScope *Scope) {
2413   assert (Scope && "Unable to calculate scop edominance graph!");
2414   SmallVector<DbgScope *, 4> WorkStack;
2415   WorkStack.push_back(Scope);
2416   unsigned Counter = 0;
2417   while (!WorkStack.empty()) {
2418     DbgScope *WS = WorkStack.back();
2419     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2420     bool visitedChildren = false;
2421     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2422            SE = Children.end(); SI != SE; ++SI) {
2423       DbgScope *ChildScope = *SI;
2424       if (!ChildScope->getDFSOut()) {
2425         WorkStack.push_back(ChildScope);
2426         visitedChildren = true;
2427         ChildScope->setDFSIn(++Counter);
2428         break;
2429       }
2430     }
2431     if (!visitedChildren) {
2432       WorkStack.pop_back();
2433       WS->setDFSOut(++Counter);
2434     }
2435   }
2436 }
2437
2438 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2439 static 
2440 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2441                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2442 {
2443 #ifndef NDEBUG
2444   unsigned PrevDFSIn = 0;
2445   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2446        I != E; ++I) {
2447     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2448          II != IE; ++II) {
2449       const MachineInstr *MInsn = II;
2450       const MDNode *Scope = NULL;
2451       const MDNode *InlinedAt = NULL;
2452
2453       // Check if instruction has valid location information.
2454       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2455         dbgs() << " [ ";
2456         if (InlinedAt) 
2457           dbgs() << "*";
2458         DenseMap<const MachineInstr *, DbgScope *>::iterator DI = 
2459           MI2ScopeMap.find(MInsn);
2460         if (DI != MI2ScopeMap.end()) {
2461           DbgScope *S = DI->second;
2462           dbgs() << S->getDFSIn();
2463           PrevDFSIn = S->getDFSIn();
2464         } else
2465           dbgs() << PrevDFSIn;
2466       } else 
2467         dbgs() << " [ x" << PrevDFSIn;
2468       dbgs() << " ]";
2469       MInsn->dump();
2470     }
2471     dbgs() << "\n";
2472   }
2473 #endif
2474 }
2475 /// extractScopeInformation - Scan machine instructions in this function
2476 /// and collect DbgScopes. Return true, if at least one scope was found.
2477 bool DwarfDebug::extractScopeInformation() {
2478   // If scope information was extracted using .dbg intrinsics then there is not
2479   // any need to extract these information by scanning each instruction.
2480   if (!DbgScopeMap.empty())
2481     return false;
2482
2483   // Scan each instruction and create scopes. First build working set of scopes.
2484   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2485   SmallVector<DbgRange, 4> MIRanges;
2486   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2487   const MDNode *PrevScope = NULL;
2488   const MDNode *PrevInlinedAt = NULL;
2489   const MachineInstr *RangeBeginMI = NULL;
2490   const MachineInstr *PrevMI = NULL;
2491   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2492        I != E; ++I) {
2493     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2494          II != IE; ++II) {
2495       const MachineInstr *MInsn = II;
2496       const MDNode *Scope = NULL;
2497       const MDNode *InlinedAt = NULL;
2498
2499       // Check if instruction has valid location information.
2500       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2501         PrevMI = MInsn;
2502         continue;
2503       }
2504       
2505       // If scope has not changed then skip this instruction.
2506       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2507         PrevMI = MInsn;
2508         continue;
2509       }
2510
2511       if (RangeBeginMI) {      
2512         // If we have alread seen a beginning of a instruction range and 
2513         // current instruction scope does not match scope of first instruction
2514         // in this range then create a new instruction range.
2515         DbgRange R(RangeBeginMI, PrevMI);
2516         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2517         MIRanges.push_back(R);
2518       } 
2519
2520       // This is a beginning of a new instruction range.
2521       RangeBeginMI = MInsn;
2522       
2523       // Reset previous markers.
2524       PrevMI = MInsn;
2525       PrevScope = Scope;
2526       PrevInlinedAt = InlinedAt;
2527     }
2528   }
2529
2530   // Create last instruction range.
2531   if (RangeBeginMI && PrevMI && PrevScope) {
2532     DbgRange R(RangeBeginMI, PrevMI);
2533     MIRanges.push_back(R);
2534     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2535   }
2536   
2537   if (!CurrentFnDbgScope)
2538     return false;
2539
2540   calculateDominanceGraph(CurrentFnDbgScope);
2541   if (PrintDbgScope)
2542     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2543
2544   // Find ranges of instructions covered by each DbgScope;
2545   DbgScope *PrevDbgScope = NULL;
2546   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2547          RE = MIRanges.end(); RI != RE; ++RI) {
2548     const DbgRange &R = *RI;
2549     DbgScope *S = MI2ScopeMap.lookup(R.first);
2550     assert (S && "Lost DbgScope for a machine instruction!");
2551     if (PrevDbgScope && !PrevDbgScope->dominates(S))
2552       PrevDbgScope->closeInsnRange(S);
2553     S->openInsnRange(R.first);
2554     S->extendInsnRange(R.second);
2555     PrevDbgScope = S;
2556   }
2557
2558   if (PrevDbgScope)
2559     PrevDbgScope->closeInsnRange();
2560
2561   identifyScopeMarkers();
2562
2563   return !DbgScopeMap.empty();
2564 }
2565
2566 /// identifyScopeMarkers() - 
2567 /// Each DbgScope has first instruction and last instruction to mark beginning
2568 /// and end of a scope respectively. Create an inverse map that list scopes
2569 /// starts (and ends) with an instruction. One instruction may start (or end)
2570 /// multiple scopes. Ignore scopes that are not reachable.
2571 void DwarfDebug::identifyScopeMarkers() {
2572   SmallVector<DbgScope *, 4> WorkList;
2573   WorkList.push_back(CurrentFnDbgScope);
2574   while (!WorkList.empty()) {
2575     DbgScope *S = WorkList.pop_back_val();
2576     
2577     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2578     if (!Children.empty()) 
2579       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2580              SE = Children.end(); SI != SE; ++SI)
2581         WorkList.push_back(*SI);
2582
2583     if (S->isAbstractScope())
2584       continue;
2585     
2586     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2587     if (Ranges.empty())
2588       continue;
2589     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2590            RE = Ranges.end(); RI != RE; ++RI) {
2591       assert(RI->first && "DbgRange does not have first instruction!");      
2592       assert(RI->second && "DbgRange does not have second instruction!");      
2593       InsnsBeginScopeSet.insert(RI->first);
2594       InsnsEndScopeSet.insert(RI->second);
2595     }
2596   }
2597 }
2598
2599 /// FindFirstDebugLoc - Find the first debug location in the function. This
2600 /// is intended to be an approximation for the source position of the
2601 /// beginning of the function.
2602 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2603   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2604        I != E; ++I)
2605     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2606          MBBI != MBBE; ++MBBI) {
2607       DebugLoc DL = MBBI->getDebugLoc();
2608       if (!DL.isUnknown())
2609         return DL;
2610     }
2611   return DebugLoc();
2612 }
2613
2614 /// beginFunction - Gather pre-function debug information.  Assumes being
2615 /// emitted immediately after the function entry point.
2616 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2617   if (!MMI->hasDebugInfo()) return;
2618   if (!extractScopeInformation()) return;
2619
2620   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2621                                         Asm->getFunctionNumber());
2622   // Assumes in correct section after the entry point.
2623   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2624
2625   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2626   // function.
2627   DebugLoc FDL = FindFirstDebugLoc(MF);
2628   if (FDL.isUnknown()) return;
2629   
2630   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2631   
2632   DISubprogram SP = getDISubprogram(Scope);
2633   unsigned Line, Col;
2634   if (SP.Verify()) {
2635     Line = SP.getLineNumber();
2636     Col = 0;
2637   } else {
2638     Line = FDL.getLine();
2639     Col = FDL.getCol();
2640   }
2641   
2642   recordSourceLine(Line, Col, Scope);
2643
2644   /// ProcessedArgs - Collection of arguments already processed.
2645   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2646
2647   DebugLoc PrevLoc;
2648   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2649        I != E; ++I)
2650     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2651          II != IE; ++II) {
2652       const MachineInstr *MI = II;
2653       DebugLoc DL = MI->getDebugLoc();
2654       if (MI->isDebugValue()) {
2655         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2656         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2657         if (!DV.Verify()) continue;
2658         if (isDbgValueInUndefinedReg(MI)) continue;
2659         // If DBG_VALUE is for a local variable then it needs a label.
2660         if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2661           InsnNeedsLabel.insert(MI);
2662         // DBG_VALUE for inlined functions argument needs a label.
2663         else if (!DISubprogram(DV.getContext()).describes(MF->getFunction()))
2664           InsnNeedsLabel.insert(MI);
2665         // DBG_VALUE indicating argument location change needs a label.
2666         else if (!ProcessedArgs.insert(DV))
2667           InsnNeedsLabel.insert(MI);
2668       } else {
2669         // If location is unknown then instruction needs a location only if 
2670         // UnknownLocations flag is set.
2671         if (DL.isUnknown()) {
2672           if (UnknownLocations && !PrevLoc.isUnknown())
2673             InsnNeedsLabel.insert(MI);
2674         } else if (DL != PrevLoc)
2675           // Otherwise, instruction needs a location only if it is new location.
2676           InsnNeedsLabel.insert(MI);
2677       }
2678       
2679       if (!DL.isUnknown() || UnknownLocations)
2680         PrevLoc = DL;
2681     }
2682
2683   PrevLabel = FunctionBeginSym;
2684 }
2685
2686 /// endFunction - Gather and emit post-function debug information.
2687 ///
2688 void DwarfDebug::endFunction(const MachineFunction *MF) {
2689   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2690
2691   if (CurrentFnDbgScope) {
2692
2693     // Define end label for subprogram.
2694     FunctionEndSym = Asm->GetTempSymbol("func_end",
2695                                         Asm->getFunctionNumber());
2696     // Assumes in correct section after the entry point.
2697     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2698     
2699     collectVariableInfo(MF);
2700
2701     // Get function line info.
2702     if (!Lines.empty()) {
2703       // Get section line info.
2704       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2705       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2706       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2707       // Append the function info to section info.
2708       SectionLineInfos.insert(SectionLineInfos.end(),
2709                               Lines.begin(), Lines.end());
2710     }
2711     
2712     // Construct abstract scopes.
2713     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2714            AE = AbstractScopesList.end(); AI != AE; ++AI)
2715       constructScopeDIE(*AI);
2716     
2717     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2718     
2719     if (!DisableFramePointerElim(*MF))
2720       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr, 
2721               dwarf::DW_FORM_flag, 1);
2722
2723
2724     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2725                                                  MMI->getFrameMoves()));
2726   }
2727
2728   // Clear debug info
2729   CurrentFnDbgScope = NULL;
2730   InsnNeedsLabel.clear();
2731   DbgVariableToFrameIndexMap.clear();
2732   VarToAbstractVarMap.clear();
2733   DbgVariableToDbgInstMap.clear();
2734   DbgVariableLabelsMap.clear();
2735   DeleteContainerSeconds(DbgScopeMap);
2736   InsnsBeginScopeSet.clear();
2737   InsnsEndScopeSet.clear();
2738   ConcreteScopes.clear();
2739   DeleteContainerSeconds(AbstractScopes);
2740   AbstractScopesList.clear();
2741   AbstractVariables.clear();
2742   LabelsBeforeInsn.clear();
2743   LabelsAfterInsn.clear();
2744   Lines.clear();
2745   PrevLabel = NULL;
2746 }
2747
2748 /// recordVariableFrameIndex - Record a variable's index.
2749 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2750   assert (V && "Invalid DbgVariable!");
2751   DbgVariableToFrameIndexMap[V] = Index;
2752 }
2753
2754 /// findVariableFrameIndex - Return true if frame index for the variable
2755 /// is found. Update FI to hold value of the index.
2756 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2757   assert (V && "Invalid DbgVariable!");
2758   DenseMap<const DbgVariable *, int>::iterator I =
2759     DbgVariableToFrameIndexMap.find(V);
2760   if (I == DbgVariableToFrameIndexMap.end())
2761     return false;
2762   *FI = I->second;
2763   return true;
2764 }
2765
2766 /// findVariableLabel - Find MCSymbol for the variable.
2767 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2768   DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2769     = DbgVariableLabelsMap.find(V);
2770   if (I == DbgVariableLabelsMap.end())
2771     return NULL;
2772   else return I->second;
2773 }
2774
2775 /// findDbgScope - Find DbgScope for the debug loc attached with an 
2776 /// instruction.
2777 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2778   DbgScope *Scope = NULL;
2779   LLVMContext &Ctx = 
2780     MInsn->getParent()->getParent()->getFunction()->getContext();
2781   DebugLoc DL = MInsn->getDebugLoc();
2782
2783   if (DL.isUnknown()) 
2784     return Scope;
2785
2786   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2787     Scope = ConcreteScopes.lookup(IA);
2788   if (Scope == 0)
2789     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2790     
2791   return Scope;
2792 }
2793
2794
2795 /// recordSourceLine - Register a source line with debug info. Returns the
2796 /// unique label that was emitted and which provides correspondence to
2797 /// the source line list.
2798 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) {
2799   StringRef Dir;
2800   StringRef Fn;
2801
2802   unsigned Src = 1;
2803   if (S) {
2804     DIDescriptor Scope(S);
2805
2806     if (Scope.isCompileUnit()) {
2807       DICompileUnit CU(S);
2808       Dir = CU.getDirectory();
2809       Fn = CU.getFilename();
2810     } else if (Scope.isSubprogram()) {
2811       DISubprogram SP(S);
2812       Dir = SP.getDirectory();
2813       Fn = SP.getFilename();
2814     } else if (Scope.isLexicalBlock()) {
2815       DILexicalBlock DB(S);
2816       Dir = DB.getDirectory();
2817       Fn = DB.getFilename();
2818     } else
2819       assert(0 && "Unexpected scope info");
2820
2821     Src = GetOrCreateSourceID(Dir, Fn);
2822   }
2823
2824 #if 0
2825   if (!Lines.empty()) {
2826     SrcLineInfo lastSrcLineInfo = Lines.back();
2827     // Emitting sequential line records with the same line number (but
2828     // different addresses) seems to confuse GDB.  Avoid this.
2829     if (lastSrcLineInfo.getLine() == Line)
2830       return NULL;
2831   }
2832 #endif
2833
2834   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2835   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2836
2837   Asm->OutStreamer.EmitLabel(Label);
2838   return Label;
2839 }
2840
2841 //===----------------------------------------------------------------------===//
2842 // Emit Methods
2843 //===----------------------------------------------------------------------===//
2844
2845 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2846 ///
2847 unsigned
2848 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2849   // Get the children.
2850   const std::vector<DIE *> &Children = Die->getChildren();
2851
2852   // If not last sibling and has children then add sibling offset attribute.
2853   if (!Last && !Children.empty())
2854     Die->addSiblingOffset(DIEValueAllocator);
2855
2856   // Record the abbreviation.
2857   assignAbbrevNumber(Die->getAbbrev());
2858
2859   // Get the abbreviation for this DIE.
2860   unsigned AbbrevNumber = Die->getAbbrevNumber();
2861   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2862
2863   // Set DIE offset
2864   Die->setOffset(Offset);
2865
2866   // Start the size with the size of abbreviation code.
2867   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2868
2869   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2870   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2871
2872   // Size the DIE attribute values.
2873   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2874     // Size attribute value.
2875     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2876
2877   // Size the DIE children if any.
2878   if (!Children.empty()) {
2879     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2880            "Children flag not set");
2881
2882     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2883       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2884
2885     // End of children marker.
2886     Offset += sizeof(int8_t);
2887   }
2888
2889   Die->setSize(Offset - Die->getOffset());
2890   return Offset;
2891 }
2892
2893 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2894 ///
2895 void DwarfDebug::computeSizeAndOffsets() {
2896   unsigned PrevOffset = 0;
2897   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2898          E = CUMap.end(); I != E; ++I) {
2899     // Compute size of compile unit header.
2900     static unsigned Offset = PrevOffset +
2901       sizeof(int32_t) + // Length of Compilation Unit Info
2902       sizeof(int16_t) + // DWARF version number
2903       sizeof(int32_t) + // Offset Into Abbrev. Section
2904       sizeof(int8_t);   // Pointer Size (in bytes)
2905     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2906     PrevOffset = Offset;
2907   }
2908 }
2909
2910 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2911 /// temporary label to it if SymbolStem is specified.
2912 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2913                                 const char *SymbolStem = 0) {
2914   Asm->OutStreamer.SwitchSection(Section);
2915   if (!SymbolStem) return 0;
2916   
2917   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2918   Asm->OutStreamer.EmitLabel(TmpSym);
2919   return TmpSym;
2920 }
2921
2922 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2923 /// the start of each one.
2924 void DwarfDebug::EmitSectionLabels() {
2925   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2926
2927   // Dwarf sections base addresses.
2928   if (Asm->MAI->doesDwarfRequireFrameSection()) {
2929     DwarfFrameSectionSym =
2930       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2931    }
2932
2933   DwarfInfoSectionSym = 
2934     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2935   DwarfAbbrevSectionSym = 
2936     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2937   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2938   
2939   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2940     EmitSectionSym(Asm, MacroInfo);
2941
2942   EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2943   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2944   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2945   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2946   DwarfStrSectionSym = 
2947     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2948   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2949                                              "debug_range");
2950
2951   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2952                                            "section_debug_loc");
2953
2954   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2955   EmitSectionSym(Asm, TLOF.getDataSection());
2956 }
2957
2958 /// emitDIE - Recusively Emits a debug information entry.
2959 ///
2960 void DwarfDebug::emitDIE(DIE *Die) {
2961   // Get the abbreviation for this DIE.
2962   unsigned AbbrevNumber = Die->getAbbrevNumber();
2963   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2964
2965   // Emit the code (index) for the abbreviation.
2966   if (Asm->isVerbose())
2967     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2968                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
2969                                 Twine::utohexstr(Die->getSize()) + " " +
2970                                 dwarf::TagString(Abbrev->getTag()));
2971   Asm->EmitULEB128(AbbrevNumber);
2972
2973   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2974   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2975
2976   // Emit the DIE attribute values.
2977   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2978     unsigned Attr = AbbrevData[i].getAttribute();
2979     unsigned Form = AbbrevData[i].getForm();
2980     assert(Form && "Too many attributes for DIE (check abbreviation)");
2981
2982     if (Asm->isVerbose())
2983       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2984     
2985     switch (Attr) {
2986     case dwarf::DW_AT_sibling:
2987       Asm->EmitInt32(Die->getSiblingOffset());
2988       break;
2989     case dwarf::DW_AT_abstract_origin: {
2990       DIEEntry *E = cast<DIEEntry>(Values[i]);
2991       DIE *Origin = E->getEntry();
2992       unsigned Addr = Origin->getOffset();
2993       Asm->EmitInt32(Addr);
2994       break;
2995     }
2996     case dwarf::DW_AT_ranges: {
2997       // DW_AT_range Value encodes offset in debug_range section.
2998       DIEInteger *V = cast<DIEInteger>(Values[i]);
2999       Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3000                                      V->getValue(),
3001                                      DwarfDebugRangeSectionSym,
3002                                      4);
3003       break;
3004     }
3005     case dwarf::DW_AT_location: {
3006       if (UseDotDebugLocEntry.count(Die) != 0) {
3007         DIELabel *L = cast<DIELabel>(Values[i]);
3008         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3009       } else
3010         Values[i]->EmitValue(Asm, Form);
3011       break;
3012     }
3013     default:
3014       // Emit an attribute using the defined form.
3015       Values[i]->EmitValue(Asm, Form);
3016       break;
3017     }
3018   }
3019
3020   // Emit the DIE children if any.
3021   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3022     const std::vector<DIE *> &Children = Die->getChildren();
3023
3024     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3025       emitDIE(Children[j]);
3026
3027     if (Asm->isVerbose())
3028       Asm->OutStreamer.AddComment("End Of Children Mark");
3029     Asm->EmitInt8(0);
3030   }
3031 }
3032
3033 /// emitDebugInfo - Emit the debug info section.
3034 ///
3035 void DwarfDebug::emitDebugInfo() {
3036   // Start debug info section.
3037   Asm->OutStreamer.SwitchSection(
3038                             Asm->getObjFileLowering().getDwarfInfoSection());
3039   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3040          E = CUMap.end(); I != E; ++I) {
3041     CompileUnit *TheCU = I->second;
3042     DIE *Die = TheCU->getCUDie();
3043     
3044     // Emit the compile units header.
3045     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3046                                                   TheCU->getID()));
3047     
3048     // Emit size of content not including length itself
3049     unsigned ContentSize = Die->getSize() +
3050       sizeof(int16_t) + // DWARF version number
3051       sizeof(int32_t) + // Offset Into Abbrev. Section
3052       sizeof(int8_t) +  // Pointer Size (in bytes)
3053       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3054     
3055     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3056     Asm->EmitInt32(ContentSize);
3057     Asm->OutStreamer.AddComment("DWARF version number");
3058     Asm->EmitInt16(dwarf::DWARF_VERSION);
3059     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3060     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3061                            DwarfAbbrevSectionSym);
3062     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3063     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3064     
3065     emitDIE(Die);
3066     // FIXME - extra padding for gdb bug.
3067     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3068     Asm->EmitInt8(0);
3069     Asm->EmitInt8(0);
3070     Asm->EmitInt8(0);
3071     Asm->EmitInt8(0);
3072     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3073   }
3074 }
3075
3076 /// emitAbbreviations - Emit the abbreviation section.
3077 ///
3078 void DwarfDebug::emitAbbreviations() const {
3079   // Check to see if it is worth the effort.
3080   if (!Abbreviations.empty()) {
3081     // Start the debug abbrev section.
3082     Asm->OutStreamer.SwitchSection(
3083                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3084
3085     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3086
3087     // For each abbrevation.
3088     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3089       // Get abbreviation data
3090       const DIEAbbrev *Abbrev = Abbreviations[i];
3091
3092       // Emit the abbrevations code (base 1 index.)
3093       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3094
3095       // Emit the abbreviations data.
3096       Abbrev->Emit(Asm);
3097     }
3098
3099     // Mark end of abbreviations.
3100     Asm->EmitULEB128(0, "EOM(3)");
3101
3102     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3103   }
3104 }
3105
3106 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3107 /// the line matrix.
3108 ///
3109 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3110   // Define last address of section.
3111   Asm->OutStreamer.AddComment("Extended Op");
3112   Asm->EmitInt8(0);
3113   
3114   Asm->OutStreamer.AddComment("Op size");
3115   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3116   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3117   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3118
3119   Asm->OutStreamer.AddComment("Section end label");
3120
3121   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3122                                    Asm->getTargetData().getPointerSize(),
3123                                    0/*AddrSpace*/);
3124
3125   // Mark end of matrix.
3126   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3127   Asm->EmitInt8(0);
3128   Asm->EmitInt8(1);
3129   Asm->EmitInt8(1);
3130 }
3131
3132 /// emitDebugLines - Emit source line information.
3133 ///
3134 void DwarfDebug::emitDebugLines() {
3135   // If the target is using .loc/.file, the assembler will be emitting the
3136   // .debug_line table automatically.
3137   if (Asm->MAI->hasDotLocAndDotFile())
3138     return;
3139
3140   // Minimum line delta, thus ranging from -10..(255-10).
3141   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3142   // Maximum line delta, thus ranging from -10..(255-10).
3143   const int MaxLineDelta = 255 + MinLineDelta;
3144
3145   // Start the dwarf line section.
3146   Asm->OutStreamer.SwitchSection(
3147                             Asm->getObjFileLowering().getDwarfLineSection());
3148
3149   // Construct the section header.
3150   Asm->OutStreamer.AddComment("Length of Source Line Info");
3151   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3152                            Asm->GetTempSymbol("line_begin"), 4);
3153   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3154
3155   Asm->OutStreamer.AddComment("DWARF version number");
3156   Asm->EmitInt16(dwarf::DWARF_VERSION); 
3157
3158   Asm->OutStreamer.AddComment("Prolog Length");
3159   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3160                            Asm->GetTempSymbol("line_prolog_begin"), 4);
3161   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3162
3163   Asm->OutStreamer.AddComment("Minimum Instruction Length");
3164   Asm->EmitInt8(1);
3165   Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3166   Asm->EmitInt8(1);
3167   Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3168   Asm->EmitInt8(MinLineDelta);
3169   Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3170   Asm->EmitInt8(MaxLineDelta);
3171   Asm->OutStreamer.AddComment("Special Opcode Base");
3172   Asm->EmitInt8(-MinLineDelta);
3173
3174   // Line number standard opcode encodings argument count
3175   Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3176   Asm->EmitInt8(0);
3177   Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3178   Asm->EmitInt8(1);
3179   Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3180   Asm->EmitInt8(1);
3181   Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3182   Asm->EmitInt8(1);
3183   Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3184   Asm->EmitInt8(1);
3185   Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3186   Asm->EmitInt8(0);
3187   Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3188   Asm->EmitInt8(0);
3189   Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3190   Asm->EmitInt8(0);
3191   Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3192   Asm->EmitInt8(1);
3193
3194   // Emit directories.
3195   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3196     const std::string &Dir = getSourceDirectoryName(DI);
3197     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3198     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3199   }
3200
3201   Asm->OutStreamer.AddComment("End of directories");
3202   Asm->EmitInt8(0);
3203
3204   // Emit files.
3205   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3206     // Remember source id starts at 1.
3207     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3208     const std::string &FN = getSourceFileName(Id.second);
3209     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3210     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3211     
3212     Asm->EmitULEB128(Id.first, "Directory #");
3213     Asm->EmitULEB128(0, "Mod date");
3214     Asm->EmitULEB128(0, "File size");
3215   }
3216
3217   Asm->OutStreamer.AddComment("End of files");
3218   Asm->EmitInt8(0);
3219
3220   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3221
3222   // A sequence for each text section.
3223   unsigned SecSrcLinesSize = SectionSourceLines.size();
3224
3225   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3226     // Isolate current sections line info.
3227     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3228
3229     // Dwarf assumes we start with first line of first source file.
3230     unsigned Source = 1;
3231     unsigned Line = 1;
3232
3233     // Construct rows of the address, source, line, column matrix.
3234     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3235       const SrcLineInfo &LineInfo = LineInfos[i];
3236       MCSymbol *Label = LineInfo.getLabel();
3237       if (!Label->isDefined()) continue; // Not emitted, in dead code.
3238
3239       if (Asm->isVerbose()) {
3240         std::pair<unsigned, unsigned> SrcID =
3241           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3242         Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3243                                     "/" +
3244                                     Twine(getSourceFileName(SrcID.second)) +
3245                                     ":" + Twine(LineInfo.getLine()));
3246       }
3247
3248       // Define the line address.
3249       Asm->OutStreamer.AddComment("Extended Op");
3250       Asm->EmitInt8(0);
3251       Asm->OutStreamer.AddComment("Op size");
3252       Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3253
3254       Asm->OutStreamer.AddComment("DW_LNE_set_address");
3255       Asm->EmitInt8(dwarf::DW_LNE_set_address); 
3256
3257       Asm->OutStreamer.AddComment("Location label");
3258       Asm->OutStreamer.EmitSymbolValue(Label,
3259                                        Asm->getTargetData().getPointerSize(),
3260                                        0/*AddrSpace*/);
3261       
3262       // If change of source, then switch to the new source.
3263       if (Source != LineInfo.getSourceID()) {
3264         Source = LineInfo.getSourceID();
3265         Asm->OutStreamer.AddComment("DW_LNS_set_file");
3266         Asm->EmitInt8(dwarf::DW_LNS_set_file); 
3267         Asm->EmitULEB128(Source, "New Source");
3268       }
3269
3270       // If change of line.
3271       if (Line != LineInfo.getLine()) {
3272         // Determine offset.
3273         int Offset = LineInfo.getLine() - Line;
3274         int Delta = Offset - MinLineDelta;
3275
3276         // Update line.
3277         Line = LineInfo.getLine();
3278
3279         // If delta is small enough and in range...
3280         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3281           // ... then use fast opcode.
3282           Asm->OutStreamer.AddComment("Line Delta");
3283           Asm->EmitInt8(Delta - MinLineDelta);
3284         } else {
3285           // ... otherwise use long hand.
3286           Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3287           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3288           Asm->EmitSLEB128(Offset, "Line Offset");
3289           Asm->OutStreamer.AddComment("DW_LNS_copy");
3290           Asm->EmitInt8(dwarf::DW_LNS_copy);
3291         }
3292       } else {
3293         // Copy the previous row (different address or source)
3294         Asm->OutStreamer.AddComment("DW_LNS_copy");
3295         Asm->EmitInt8(dwarf::DW_LNS_copy);
3296       }
3297     }
3298
3299     emitEndOfLineMatrix(j + 1);
3300   }
3301
3302   if (SecSrcLinesSize == 0)
3303     // Because we're emitting a debug_line section, we still need a line
3304     // table. The linker and friends expect it to exist. If there's nothing to
3305     // put into it, emit an empty table.
3306     emitEndOfLineMatrix(1);
3307
3308   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3309 }
3310
3311 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3312 ///
3313 void DwarfDebug::emitCommonDebugFrame() {
3314   if (!Asm->MAI->doesDwarfRequireFrameSection())
3315     return;
3316
3317   int stackGrowth = Asm->getTargetData().getPointerSize();
3318   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3319       TargetFrameInfo::StackGrowsDown)
3320     stackGrowth *= -1;
3321
3322   // Start the dwarf frame section.
3323   Asm->OutStreamer.SwitchSection(
3324                               Asm->getObjFileLowering().getDwarfFrameSection());
3325
3326   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3327   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3328   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3329                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3330
3331   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3332   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3333   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3334   Asm->OutStreamer.AddComment("CIE Version");
3335   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3336   Asm->OutStreamer.AddComment("CIE Augmentation");
3337   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3338   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3339   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3340   Asm->OutStreamer.AddComment("CIE RA Column");
3341   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3342   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3343
3344   std::vector<MachineMove> Moves;
3345   RI->getInitialFrameState(Moves);
3346
3347   Asm->EmitFrameMoves(Moves, 0, false);
3348
3349   Asm->EmitAlignment(2);
3350   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3351 }
3352
3353 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3354 /// section.
3355 void DwarfDebug::
3356 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3357   if (!Asm->MAI->doesDwarfRequireFrameSection())
3358     return;
3359
3360   // Start the dwarf frame section.
3361   Asm->OutStreamer.SwitchSection(
3362                               Asm->getObjFileLowering().getDwarfFrameSection());
3363
3364   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3365   MCSymbol *DebugFrameBegin =
3366     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3367   MCSymbol *DebugFrameEnd =
3368     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3369   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3370
3371   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3372
3373   Asm->OutStreamer.AddComment("FDE CIE offset");
3374   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"), 
3375                          DwarfFrameSectionSym);
3376
3377   Asm->OutStreamer.AddComment("FDE initial location");
3378   MCSymbol *FuncBeginSym =
3379     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3380   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3381                                    Asm->getTargetData().getPointerSize(),
3382                                    0/*AddrSpace*/);
3383   
3384   
3385   Asm->OutStreamer.AddComment("FDE address range");
3386   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3387                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3388
3389   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3390
3391   Asm->EmitAlignment(2);
3392   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3393 }
3394
3395 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3396 ///
3397 void DwarfDebug::emitDebugPubNames() {
3398   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3399          E = CUMap.end(); I != E; ++I) {
3400     CompileUnit *TheCU = I->second;
3401     // Start the dwarf pubnames section.
3402     Asm->OutStreamer.SwitchSection(
3403       Asm->getObjFileLowering().getDwarfPubNamesSection());
3404     
3405     Asm->OutStreamer.AddComment("Length of Public Names Info");
3406     Asm->EmitLabelDifference(
3407       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3408       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3409     
3410     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3411                                                   TheCU->getID()));
3412     
3413     Asm->OutStreamer.AddComment("DWARF Version");
3414     Asm->EmitInt16(dwarf::DWARF_VERSION); 
3415     
3416     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3417     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 
3418                            DwarfInfoSectionSym);
3419     
3420     Asm->OutStreamer.AddComment("Compilation Unit Length");
3421     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3422                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3423                              4);
3424     
3425     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3426     for (StringMap<DIE*>::const_iterator
3427            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3428       const char *Name = GI->getKeyData();
3429       DIE *Entity = GI->second;
3430       
3431       Asm->OutStreamer.AddComment("DIE offset");
3432       Asm->EmitInt32(Entity->getOffset());
3433       
3434       if (Asm->isVerbose())
3435         Asm->OutStreamer.AddComment("External Name");
3436       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3437     }
3438     
3439     Asm->OutStreamer.AddComment("End Mark");
3440     Asm->EmitInt32(0);
3441     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3442                                                 TheCU->getID()));
3443   }
3444 }
3445
3446 void DwarfDebug::emitDebugPubTypes() {
3447   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3448          E = CUMap.end(); I != E; ++I) {
3449     CompileUnit *TheCU = I->second;
3450     // Start the dwarf pubnames section.
3451     Asm->OutStreamer.SwitchSection(
3452       Asm->getObjFileLowering().getDwarfPubTypesSection());
3453     Asm->OutStreamer.AddComment("Length of Public Types Info");
3454     Asm->EmitLabelDifference(
3455       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3456       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3457     
3458     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3459                                                   TheCU->getID()));
3460     
3461     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3462     Asm->EmitInt16(dwarf::DWARF_VERSION);
3463     
3464     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3465     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3466                            DwarfInfoSectionSym);
3467     
3468     Asm->OutStreamer.AddComment("Compilation Unit Length");
3469     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3470                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3471                              4);
3472     
3473     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3474     for (StringMap<DIE*>::const_iterator
3475            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3476       const char *Name = GI->getKeyData();
3477       DIE * Entity = GI->second;
3478       
3479       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3480       Asm->EmitInt32(Entity->getOffset());
3481       
3482       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3483       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3484     }
3485     
3486     Asm->OutStreamer.AddComment("End Mark");
3487     Asm->EmitInt32(0); 
3488     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3489                                                   TheCU->getID()));
3490   }
3491 }
3492
3493 /// emitDebugStr - Emit visible names into a debug str section.
3494 ///
3495 void DwarfDebug::emitDebugStr() {
3496   // Check to see if it is worth the effort.
3497   if (StringPool.empty()) return;
3498   
3499   // Start the dwarf str section.
3500   Asm->OutStreamer.SwitchSection(
3501                                 Asm->getObjFileLowering().getDwarfStrSection());
3502
3503   // Get all of the string pool entries and put them in an array by their ID so
3504   // we can sort them.
3505   SmallVector<std::pair<unsigned, 
3506       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3507   
3508   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3509        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3510     Entries.push_back(std::make_pair(I->second.second, &*I));
3511   
3512   array_pod_sort(Entries.begin(), Entries.end());
3513   
3514   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3515     // Emit a label for reference from debug information entries.
3516     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3517     
3518     // Emit the string itself.
3519     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3520   }
3521 }
3522
3523 /// emitDebugLoc - Emit visible names into a debug loc section.
3524 ///
3525 void DwarfDebug::emitDebugLoc() {
3526   if (DotDebugLocEntries.empty())
3527     return;
3528
3529   // Start the dwarf loc section.
3530   Asm->OutStreamer.SwitchSection(
3531     Asm->getObjFileLowering().getDwarfLocSection());
3532   unsigned char Size = Asm->getTargetData().getPointerSize();
3533   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3534   unsigned index = 1;
3535   for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(),
3536          E = DotDebugLocEntries.end(); I != E; ++I, ++index) {
3537     DotDebugLocEntry Entry = *I;
3538     if (Entry.isEmpty()) {
3539       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3540       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3541       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3542     } else {
3543       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3544       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3545       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3546       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3547       if (Reg < 32) {
3548         Asm->OutStreamer.AddComment("Loc expr size");
3549         Asm->EmitInt16(1);
3550         Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3551       } else {
3552         Asm->OutStreamer.AddComment("Loc expr size");
3553         Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3554         Asm->EmitInt8(dwarf::DW_OP_regx);
3555         Asm->EmitULEB128(Reg);
3556       }
3557     }
3558   }
3559 }
3560
3561 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3562 ///
3563 void DwarfDebug::EmitDebugARanges() {
3564   // Start the dwarf aranges section.
3565   Asm->OutStreamer.SwitchSection(
3566                           Asm->getObjFileLowering().getDwarfARangesSection());
3567 }
3568
3569 /// emitDebugRanges - Emit visible names into a debug ranges section.
3570 ///
3571 void DwarfDebug::emitDebugRanges() {
3572   // Start the dwarf ranges section.
3573   Asm->OutStreamer.SwitchSection(
3574     Asm->getObjFileLowering().getDwarfRangesSection());
3575   unsigned char Size = Asm->getTargetData().getPointerSize();
3576   for (SmallVector<const MCSymbol *, 8>::iterator
3577          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 
3578        I != E; ++I) {
3579     if (*I)
3580       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3581     else
3582       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3583   }
3584 }
3585
3586 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3587 ///
3588 void DwarfDebug::emitDebugMacInfo() {
3589   if (const MCSection *LineInfo =
3590       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3591     // Start the dwarf macinfo section.
3592     Asm->OutStreamer.SwitchSection(LineInfo);
3593   }
3594 }
3595
3596 /// emitDebugInlineInfo - Emit inline info using following format.
3597 /// Section Header:
3598 /// 1. length of section
3599 /// 2. Dwarf version number
3600 /// 3. address size.
3601 ///
3602 /// Entries (one "entry" for each function that was inlined):
3603 ///
3604 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3605 ///   otherwise offset into __debug_str for regular function name.
3606 /// 2. offset into __debug_str section for regular function name.
3607 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3608 /// instances for the function.
3609 ///
3610 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3611 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3612 /// __debug_info section, and the low_pc is the starting address for the
3613 /// inlining instance.
3614 void DwarfDebug::emitDebugInlineInfo() {
3615   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3616     return;
3617
3618   if (!FirstCU)
3619     return;
3620
3621   Asm->OutStreamer.SwitchSection(
3622                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3623
3624   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3625   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3626                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3627
3628   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3629
3630   Asm->OutStreamer.AddComment("Dwarf Version");
3631   Asm->EmitInt16(dwarf::DWARF_VERSION);
3632   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3633   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3634
3635   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3636          E = InlinedSPNodes.end(); I != E; ++I) {
3637
3638     const MDNode *Node = *I;
3639     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3640       = InlineInfo.find(Node);
3641     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3642     DISubprogram SP(Node);
3643     StringRef LName = SP.getLinkageName();
3644     StringRef Name = SP.getName();
3645
3646     Asm->OutStreamer.AddComment("MIPS linkage name");
3647     if (LName.empty()) {
3648       Asm->OutStreamer.EmitBytes(Name, 0);
3649       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3650     } else 
3651       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3652                              DwarfStrSectionSym);
3653
3654     Asm->OutStreamer.AddComment("Function name");
3655     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3656     Asm->EmitULEB128(Labels.size(), "Inline count");
3657
3658     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3659            LE = Labels.end(); LI != LE; ++LI) {
3660       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3661       Asm->EmitInt32(LI->second->getOffset());
3662
3663       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3664       Asm->OutStreamer.EmitSymbolValue(LI->first,
3665                                        Asm->getTargetData().getPointerSize(),0);
3666     }
3667   }
3668
3669   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3670 }