Remove dead code.
[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 
2163 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2164                                 SmallPtrSet<const MDNode *, 16> &Processed) {
2165   
2166   /// collection info from MMI table.
2167   collectVariableInfoFromMMITable(MF, Processed);
2168
2169   SmallVector<const MachineInstr *, 8> DbgValues;
2170   // Collect variable information from DBG_VALUE machine instructions;
2171   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2172        I != E; ++I)
2173     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2174          II != IE; ++II) {
2175       const MachineInstr *MInsn = II;
2176       if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2177         continue;
2178       DbgValues.push_back(MInsn);
2179     }
2180
2181   // This is a collection of DBV_VALUE instructions describing same variable.
2182   SmallVector<const MachineInstr *, 4> MultipleValues;
2183   for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2184         E = DbgValues.end(); I != E; ++I) {
2185     const MachineInstr *MInsn = *I;
2186     MultipleValues.clear();
2187     if (isDbgValueInDefinedReg(MInsn))
2188       MultipleValues.push_back(MInsn);
2189     DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2190     if (Processed.count(DV) != 0)
2191       continue;
2192
2193     const MachineInstr *PrevMI = MInsn;
2194     for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1, 
2195            ME = DbgValues.end(); MI != ME; ++MI) {
2196       const MDNode *Var = 
2197         (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2198       if (Var == DV && isDbgValueInDefinedReg(*MI) && 
2199           !PrevMI->isIdenticalTo(*MI))
2200         MultipleValues.push_back(*MI);
2201       PrevMI = *MI;
2202     }
2203
2204     DbgScope *Scope = findDbgScope(MInsn);
2205     bool CurFnArg = false;
2206     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2207         DISubprogram(DV.getContext()).describes(MF->getFunction()))
2208       CurFnArg = true;
2209     if (!Scope && CurFnArg)
2210       Scope = CurrentFnDbgScope;
2211     // If variable scope is not found then skip this variable.
2212     if (!Scope)
2213       continue;
2214
2215     Processed.insert(DV);
2216     DbgVariable *RegVar = new DbgVariable(DV);
2217     Scope->addVariable(RegVar);
2218     if (!CurFnArg)
2219       DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn); 
2220     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2221       DbgVariableToDbgInstMap[AbsVar] = MInsn;
2222       VarToAbstractVarMap[RegVar] = AbsVar;
2223     }
2224     if (MultipleValues.size() <= 1) {
2225       DbgVariableToDbgInstMap[RegVar] = MInsn;
2226       continue;
2227     }
2228
2229     // handle multiple DBG_VALUE instructions describing one variable.
2230     if (DotDebugLocEntries.empty())
2231       RegVar->setDotDebugLocOffset(0);
2232     else
2233       RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2234     const MachineInstr *Begin = NULL;
2235     const MachineInstr *End = NULL;
2236     for (SmallVector<const MachineInstr *, 4>::iterator 
2237            MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) {
2238       if (!Begin) {
2239         Begin = *MVI;
2240         continue;
2241       } 
2242       End = *MVI;
2243       MachineLocation MLoc;
2244       MLoc.set(Begin->getOperand(0).getReg(), 0);
2245       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2246       const MCSymbol *SLabel = getLabelBeforeInsn(End);
2247       DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2248       Begin = End;
2249       if (MVI + 1 == MVE) {
2250         // If End is the last instruction then its value is valid
2251         // until the end of the funtion.
2252         MLoc.set(End->getOperand(0).getReg(), 0);
2253         DotDebugLocEntries.
2254           push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc));
2255       }
2256     }
2257     DotDebugLocEntries.push_back(DotDebugLocEntry());
2258   }
2259
2260   // Collect info for variables that were optimized out.
2261   const Function *F = MF->getFunction();
2262   const Module *M = F->getParent();
2263   if (NamedMDNode *NMD = 
2264       M->getNamedMetadata(Twine("llvm.dbg.lv.", 
2265                                 getRealLinkageName(F->getName())))) {
2266     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2267       DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2268       if (!DV || !Processed.insert(DV))
2269         continue;
2270       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2271       if (Scope)
2272         Scope->addVariable(new DbgVariable(DV));
2273     }
2274   }
2275 }
2276
2277 /// getLabelBeforeInsn - Return Label preceding the instruction.
2278 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2279   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2280     LabelsBeforeInsn.find(MI);
2281   if (I == LabelsBeforeInsn.end())
2282     // FunctionBeginSym always preceeds all the instruction in current function.
2283     return FunctionBeginSym;
2284   return I->second;
2285 }
2286
2287 /// getLabelAfterInsn - Return Label immediately following the instruction.
2288 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2289   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2290     LabelsAfterInsn.find(MI);
2291   if (I == LabelsAfterInsn.end())
2292     return NULL;
2293   return I->second;
2294 }
2295
2296 /// beginScope - Process beginning of a scope.
2297 void DwarfDebug::beginScope(const MachineInstr *MI) {
2298   if (InsnNeedsLabel.count(MI) == 0) {
2299     LabelsBeforeInsn[MI] = PrevLabel;
2300     return;
2301   }
2302
2303   // Check location.
2304   DebugLoc DL = MI->getDebugLoc();
2305   if (!DL.isUnknown()) {
2306     const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2307     PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2308     PrevInstLoc = DL;
2309     LabelsBeforeInsn[MI] = PrevLabel;
2310     return;
2311   }
2312
2313   // If location is unknown then use temp label for this DBG_VALUE 
2314   // instruction.
2315   if (MI->isDebugValue()) {
2316     PrevLabel = MMI->getContext().CreateTempSymbol();
2317     Asm->OutStreamer.EmitLabel(PrevLabel);
2318     LabelsBeforeInsn[MI] = PrevLabel;
2319     return;
2320   }
2321
2322   if (UnknownLocations) {
2323     PrevLabel = recordSourceLine(0, 0, 0);
2324     LabelsBeforeInsn[MI] = PrevLabel;
2325     return;
2326   }
2327
2328   assert (0 && "Instruction is not processed!");
2329 }
2330
2331 /// endScope - Process end of a scope.
2332 void DwarfDebug::endScope(const MachineInstr *MI) {
2333   if (InsnsEndScopeSet.count(MI) != 0) {
2334     // Emit a label if this instruction ends a scope.
2335     MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2336     Asm->OutStreamer.EmitLabel(Label);
2337     LabelsAfterInsn[MI] = Label;
2338   }
2339 }
2340
2341 /// getOrCreateDbgScope - Create DbgScope for the scope.
2342 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) {
2343   if (!InlinedAt) {
2344     DbgScope *WScope = DbgScopeMap.lookup(Scope);
2345     if (WScope)
2346       return WScope;
2347     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2348     DbgScopeMap.insert(std::make_pair(Scope, WScope));
2349     if (DIDescriptor(Scope).isLexicalBlock()) {
2350       DbgScope *Parent = 
2351         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2352       WScope->setParent(Parent);
2353       Parent->addScope(WScope);
2354     }
2355
2356     if (!WScope->getParent()) {
2357       StringRef SPName = DISubprogram(Scope).getLinkageName();
2358       // We used to check only for a linkage name, but that fails
2359       // since we began omitting the linkage name for private
2360       // functions.  The new way is to check for the name in metadata,
2361       // but that's not supported in old .ll test cases.  Ergo, we
2362       // check both.
2363       if (SPName == Asm->MF->getFunction()->getName() ||
2364           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2365         CurrentFnDbgScope = WScope;
2366     }
2367     
2368     return WScope;
2369   }
2370
2371   getOrCreateAbstractScope(Scope);
2372   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2373   if (WScope)
2374     return WScope;
2375
2376   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2377   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2378   DILocation DL(InlinedAt);
2379   DbgScope *Parent =
2380     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2381   WScope->setParent(Parent);
2382   Parent->addScope(WScope);
2383
2384   ConcreteScopes[InlinedAt] = WScope;
2385
2386   return WScope;
2387 }
2388
2389 /// hasValidLocation - Return true if debug location entry attached with
2390 /// machine instruction encodes valid location info.
2391 static bool hasValidLocation(LLVMContext &Ctx,
2392                              const MachineInstr *MInsn,
2393                              const MDNode *&Scope, const MDNode *&InlinedAt) {
2394   DebugLoc DL = MInsn->getDebugLoc();
2395   if (DL.isUnknown()) return false;
2396       
2397   const MDNode *S = DL.getScope(Ctx);
2398   
2399   // There is no need to create another DIE for compile unit. For all
2400   // other scopes, create one DbgScope now. This will be translated
2401   // into a scope DIE at the end.
2402   if (DIScope(S).isCompileUnit()) return false;
2403      
2404   Scope = S;
2405   InlinedAt = DL.getInlinedAt(Ctx);
2406   return true;
2407 }
2408
2409 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2410 /// hierarchy.
2411 static void calculateDominanceGraph(DbgScope *Scope) {
2412   assert (Scope && "Unable to calculate scop edominance graph!");
2413   SmallVector<DbgScope *, 4> WorkStack;
2414   WorkStack.push_back(Scope);
2415   unsigned Counter = 0;
2416   while (!WorkStack.empty()) {
2417     DbgScope *WS = WorkStack.back();
2418     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2419     bool visitedChildren = false;
2420     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2421            SE = Children.end(); SI != SE; ++SI) {
2422       DbgScope *ChildScope = *SI;
2423       if (!ChildScope->getDFSOut()) {
2424         WorkStack.push_back(ChildScope);
2425         visitedChildren = true;
2426         ChildScope->setDFSIn(++Counter);
2427         break;
2428       }
2429     }
2430     if (!visitedChildren) {
2431       WorkStack.pop_back();
2432       WS->setDFSOut(++Counter);
2433     }
2434   }
2435 }
2436
2437 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2438 static 
2439 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2440                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2441 {
2442 #ifndef NDEBUG
2443   unsigned PrevDFSIn = 0;
2444   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2445        I != E; ++I) {
2446     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2447          II != IE; ++II) {
2448       const MachineInstr *MInsn = II;
2449       const MDNode *Scope = NULL;
2450       const MDNode *InlinedAt = NULL;
2451
2452       // Check if instruction has valid location information.
2453       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2454         dbgs() << " [ ";
2455         if (InlinedAt) 
2456           dbgs() << "*";
2457         DenseMap<const MachineInstr *, DbgScope *>::iterator DI = 
2458           MI2ScopeMap.find(MInsn);
2459         if (DI != MI2ScopeMap.end()) {
2460           DbgScope *S = DI->second;
2461           dbgs() << S->getDFSIn();
2462           PrevDFSIn = S->getDFSIn();
2463         } else
2464           dbgs() << PrevDFSIn;
2465       } else 
2466         dbgs() << " [ x" << PrevDFSIn;
2467       dbgs() << " ]";
2468       MInsn->dump();
2469     }
2470     dbgs() << "\n";
2471   }
2472 #endif
2473 }
2474 /// extractScopeInformation - Scan machine instructions in this function
2475 /// and collect DbgScopes. Return true, if at least one scope was found.
2476 bool DwarfDebug::extractScopeInformation() {
2477   // If scope information was extracted using .dbg intrinsics then there is not
2478   // any need to extract these information by scanning each instruction.
2479   if (!DbgScopeMap.empty())
2480     return false;
2481
2482   // Scan each instruction and create scopes. First build working set of scopes.
2483   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2484   SmallVector<DbgRange, 4> MIRanges;
2485   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2486   const MDNode *PrevScope = NULL;
2487   const MDNode *PrevInlinedAt = NULL;
2488   const MachineInstr *RangeBeginMI = NULL;
2489   const MachineInstr *PrevMI = NULL;
2490   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2491        I != E; ++I) {
2492     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2493          II != IE; ++II) {
2494       const MachineInstr *MInsn = II;
2495       const MDNode *Scope = NULL;
2496       const MDNode *InlinedAt = NULL;
2497
2498       // Check if instruction has valid location information.
2499       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2500         PrevMI = MInsn;
2501         continue;
2502       }
2503       
2504       // If scope has not changed then skip this instruction.
2505       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2506         PrevMI = MInsn;
2507         continue;
2508       }
2509
2510       if (RangeBeginMI) {      
2511         // If we have alread seen a beginning of a instruction range and 
2512         // current instruction scope does not match scope of first instruction
2513         // in this range then create a new instruction range.
2514         DbgRange R(RangeBeginMI, PrevMI);
2515         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2516         MIRanges.push_back(R);
2517       } 
2518
2519       // This is a beginning of a new instruction range.
2520       RangeBeginMI = MInsn;
2521       
2522       // Reset previous markers.
2523       PrevMI = MInsn;
2524       PrevScope = Scope;
2525       PrevInlinedAt = InlinedAt;
2526     }
2527   }
2528
2529   // Create last instruction range.
2530   if (RangeBeginMI && PrevMI && PrevScope) {
2531     DbgRange R(RangeBeginMI, PrevMI);
2532     MIRanges.push_back(R);
2533     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2534   }
2535   
2536   if (!CurrentFnDbgScope)
2537     return false;
2538
2539   calculateDominanceGraph(CurrentFnDbgScope);
2540   if (PrintDbgScope)
2541     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2542
2543   // Find ranges of instructions covered by each DbgScope;
2544   DbgScope *PrevDbgScope = NULL;
2545   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2546          RE = MIRanges.end(); RI != RE; ++RI) {
2547     const DbgRange &R = *RI;
2548     DbgScope *S = MI2ScopeMap.lookup(R.first);
2549     assert (S && "Lost DbgScope for a machine instruction!");
2550     if (PrevDbgScope && !PrevDbgScope->dominates(S))
2551       PrevDbgScope->closeInsnRange(S);
2552     S->openInsnRange(R.first);
2553     S->extendInsnRange(R.second);
2554     PrevDbgScope = S;
2555   }
2556
2557   if (PrevDbgScope)
2558     PrevDbgScope->closeInsnRange();
2559
2560   identifyScopeMarkers();
2561
2562   return !DbgScopeMap.empty();
2563 }
2564
2565 /// identifyScopeMarkers() - 
2566 /// Each DbgScope has first instruction and last instruction to mark beginning
2567 /// and end of a scope respectively. Create an inverse map that list scopes
2568 /// starts (and ends) with an instruction. One instruction may start (or end)
2569 /// multiple scopes. Ignore scopes that are not reachable.
2570 void DwarfDebug::identifyScopeMarkers() {
2571   SmallVector<DbgScope *, 4> WorkList;
2572   WorkList.push_back(CurrentFnDbgScope);
2573   while (!WorkList.empty()) {
2574     DbgScope *S = WorkList.pop_back_val();
2575     
2576     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2577     if (!Children.empty()) 
2578       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2579              SE = Children.end(); SI != SE; ++SI)
2580         WorkList.push_back(*SI);
2581
2582     if (S->isAbstractScope())
2583       continue;
2584     
2585     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2586     if (Ranges.empty())
2587       continue;
2588     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2589            RE = Ranges.end(); RI != RE; ++RI) {
2590       assert(RI->first && "DbgRange does not have first instruction!");      
2591       assert(RI->second && "DbgRange does not have second instruction!");      
2592       InsnsEndScopeSet.insert(RI->second);
2593     }
2594   }
2595 }
2596
2597 /// FindFirstDebugLoc - Find the first debug location in the function. This
2598 /// is intended to be an approximation for the source position of the
2599 /// beginning of the function.
2600 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2601   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2602        I != E; ++I)
2603     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2604          MBBI != MBBE; ++MBBI) {
2605       DebugLoc DL = MBBI->getDebugLoc();
2606       if (!DL.isUnknown())
2607         return DL;
2608     }
2609   return DebugLoc();
2610 }
2611
2612 /// beginFunction - Gather pre-function debug information.  Assumes being
2613 /// emitted immediately after the function entry point.
2614 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2615   if (!MMI->hasDebugInfo()) return;
2616   if (!extractScopeInformation()) return;
2617
2618   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2619                                         Asm->getFunctionNumber());
2620   // Assumes in correct section after the entry point.
2621   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2622
2623   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2624   // function.
2625   DebugLoc FDL = FindFirstDebugLoc(MF);
2626   if (FDL.isUnknown()) return;
2627   
2628   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2629   
2630   DISubprogram SP = getDISubprogram(Scope);
2631   unsigned Line, Col;
2632   if (SP.Verify()) {
2633     Line = SP.getLineNumber();
2634     Col = 0;
2635   } else {
2636     Line = FDL.getLine();
2637     Col = FDL.getCol();
2638   }
2639   
2640   recordSourceLine(Line, Col, Scope);
2641
2642   /// ProcessedArgs - Collection of arguments already processed.
2643   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2644
2645   DebugLoc PrevLoc;
2646   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2647        I != E; ++I)
2648     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2649          II != IE; ++II) {
2650       const MachineInstr *MI = II;
2651       DebugLoc DL = MI->getDebugLoc();
2652       if (MI->isDebugValue()) {
2653         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2654         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2655         if (!DV.Verify()) continue;
2656         // If DBG_VALUE is for a local variable then it needs a label.
2657         if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2658           InsnNeedsLabel.insert(MI);
2659         // DBG_VALUE for inlined functions argument needs a label.
2660         else if (!DISubprogram(DV.getContext()).describes(MF->getFunction()))
2661           InsnNeedsLabel.insert(MI);
2662         // DBG_VALUE indicating argument location change needs a label.
2663         else if (isDbgValueInUndefinedReg(MI) == false && !ProcessedArgs.insert(DV))
2664           InsnNeedsLabel.insert(MI);
2665       } else {
2666         // If location is unknown then instruction needs a location only if 
2667         // UnknownLocations flag is set.
2668         if (DL.isUnknown()) {
2669           if (UnknownLocations && !PrevLoc.isUnknown())
2670             InsnNeedsLabel.insert(MI);
2671         } else if (DL != PrevLoc)
2672           // Otherwise, instruction needs a location only if it is new location.
2673           InsnNeedsLabel.insert(MI);
2674       }
2675       
2676       if (!DL.isUnknown() || UnknownLocations)
2677         PrevLoc = DL;
2678     }
2679
2680   PrevLabel = FunctionBeginSym;
2681 }
2682
2683 /// endFunction - Gather and emit post-function debug information.
2684 ///
2685 void DwarfDebug::endFunction(const MachineFunction *MF) {
2686   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2687
2688   if (CurrentFnDbgScope) {
2689
2690     // Define end label for subprogram.
2691     FunctionEndSym = Asm->GetTempSymbol("func_end",
2692                                         Asm->getFunctionNumber());
2693     // Assumes in correct section after the entry point.
2694     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2695     
2696     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2697     collectVariableInfo(MF, ProcessedVars);
2698
2699     // Get function line info.
2700     if (!Lines.empty()) {
2701       // Get section line info.
2702       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2703       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2704       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2705       // Append the function info to section info.
2706       SectionLineInfos.insert(SectionLineInfos.end(),
2707                               Lines.begin(), Lines.end());
2708     }
2709     
2710     // Construct abstract scopes.
2711     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2712            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2713       constructScopeDIE(*AI);
2714       DISubprogram SP((*AI)->getScopeNode());
2715       if (SP.Verify()) {
2716         // Collect info for variables that were optimized out.
2717         StringRef FName = SP.getLinkageName();
2718         if (FName.empty())
2719           FName = SP.getName();
2720         const Module *M = MF->getFunction()->getParent();
2721         if (NamedMDNode *NMD = 
2722             M->getNamedMetadata(Twine("llvm.dbg.lv.", 
2723                                       getRealLinkageName(FName)))) {
2724           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2725           DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2726           if (!DV || !ProcessedVars.insert(DV))
2727             continue;
2728           DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2729           if (Scope)
2730             Scope->addVariable(new DbgVariable(DV));
2731           }
2732         }
2733       }
2734     }
2735     
2736     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2737     
2738     if (!DisableFramePointerElim(*MF))
2739       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr, 
2740               dwarf::DW_FORM_flag, 1);
2741
2742
2743     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2744                                                  MMI->getFrameMoves()));
2745   }
2746
2747   // Clear debug info
2748   CurrentFnDbgScope = NULL;
2749   InsnNeedsLabel.clear();
2750   DbgVariableToFrameIndexMap.clear();
2751   VarToAbstractVarMap.clear();
2752   DbgVariableToDbgInstMap.clear();
2753   DbgVariableLabelsMap.clear();
2754   DeleteContainerSeconds(DbgScopeMap);
2755   InsnsEndScopeSet.clear();
2756   ConcreteScopes.clear();
2757   DeleteContainerSeconds(AbstractScopes);
2758   AbstractScopesList.clear();
2759   AbstractVariables.clear();
2760   LabelsBeforeInsn.clear();
2761   LabelsAfterInsn.clear();
2762   Lines.clear();
2763   PrevLabel = NULL;
2764 }
2765
2766 /// recordVariableFrameIndex - Record a variable's index.
2767 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2768   assert (V && "Invalid DbgVariable!");
2769   DbgVariableToFrameIndexMap[V] = Index;
2770 }
2771
2772 /// findVariableFrameIndex - Return true if frame index for the variable
2773 /// is found. Update FI to hold value of the index.
2774 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2775   assert (V && "Invalid DbgVariable!");
2776   DenseMap<const DbgVariable *, int>::iterator I =
2777     DbgVariableToFrameIndexMap.find(V);
2778   if (I == DbgVariableToFrameIndexMap.end())
2779     return false;
2780   *FI = I->second;
2781   return true;
2782 }
2783
2784 /// findVariableLabel - Find MCSymbol for the variable.
2785 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2786   DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2787     = DbgVariableLabelsMap.find(V);
2788   if (I == DbgVariableLabelsMap.end())
2789     return NULL;
2790   else return I->second;
2791 }
2792
2793 /// findDbgScope - Find DbgScope for the debug loc attached with an 
2794 /// instruction.
2795 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2796   DbgScope *Scope = NULL;
2797   LLVMContext &Ctx = 
2798     MInsn->getParent()->getParent()->getFunction()->getContext();
2799   DebugLoc DL = MInsn->getDebugLoc();
2800
2801   if (DL.isUnknown()) 
2802     return Scope;
2803
2804   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2805     Scope = ConcreteScopes.lookup(IA);
2806   if (Scope == 0)
2807     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2808     
2809   return Scope;
2810 }
2811
2812
2813 /// recordSourceLine - Register a source line with debug info. Returns the
2814 /// unique label that was emitted and which provides correspondence to
2815 /// the source line list.
2816 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) {
2817   StringRef Dir;
2818   StringRef Fn;
2819
2820   unsigned Src = 1;
2821   if (S) {
2822     DIDescriptor Scope(S);
2823
2824     if (Scope.isCompileUnit()) {
2825       DICompileUnit CU(S);
2826       Dir = CU.getDirectory();
2827       Fn = CU.getFilename();
2828     } else if (Scope.isSubprogram()) {
2829       DISubprogram SP(S);
2830       Dir = SP.getDirectory();
2831       Fn = SP.getFilename();
2832     } else if (Scope.isLexicalBlock()) {
2833       DILexicalBlock DB(S);
2834       Dir = DB.getDirectory();
2835       Fn = DB.getFilename();
2836     } else
2837       assert(0 && "Unexpected scope info");
2838
2839     Src = GetOrCreateSourceID(Dir, Fn);
2840   }
2841
2842 #if 0
2843   if (!Lines.empty()) {
2844     SrcLineInfo lastSrcLineInfo = Lines.back();
2845     // Emitting sequential line records with the same line number (but
2846     // different addresses) seems to confuse GDB.  Avoid this.
2847     if (lastSrcLineInfo.getLine() == Line)
2848       return NULL;
2849   }
2850 #endif
2851
2852   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2853   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2854
2855   Asm->OutStreamer.EmitLabel(Label);
2856   return Label;
2857 }
2858
2859 //===----------------------------------------------------------------------===//
2860 // Emit Methods
2861 //===----------------------------------------------------------------------===//
2862
2863 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2864 ///
2865 unsigned
2866 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2867   // Get the children.
2868   const std::vector<DIE *> &Children = Die->getChildren();
2869
2870   // If not last sibling and has children then add sibling offset attribute.
2871   if (!Last && !Children.empty())
2872     Die->addSiblingOffset(DIEValueAllocator);
2873
2874   // Record the abbreviation.
2875   assignAbbrevNumber(Die->getAbbrev());
2876
2877   // Get the abbreviation for this DIE.
2878   unsigned AbbrevNumber = Die->getAbbrevNumber();
2879   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2880
2881   // Set DIE offset
2882   Die->setOffset(Offset);
2883
2884   // Start the size with the size of abbreviation code.
2885   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2886
2887   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2888   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2889
2890   // Size the DIE attribute values.
2891   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2892     // Size attribute value.
2893     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2894
2895   // Size the DIE children if any.
2896   if (!Children.empty()) {
2897     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2898            "Children flag not set");
2899
2900     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2901       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2902
2903     // End of children marker.
2904     Offset += sizeof(int8_t);
2905   }
2906
2907   Die->setSize(Offset - Die->getOffset());
2908   return Offset;
2909 }
2910
2911 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2912 ///
2913 void DwarfDebug::computeSizeAndOffsets() {
2914   unsigned PrevOffset = 0;
2915   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2916          E = CUMap.end(); I != E; ++I) {
2917     // Compute size of compile unit header.
2918     static unsigned Offset = PrevOffset +
2919       sizeof(int32_t) + // Length of Compilation Unit Info
2920       sizeof(int16_t) + // DWARF version number
2921       sizeof(int32_t) + // Offset Into Abbrev. Section
2922       sizeof(int8_t);   // Pointer Size (in bytes)
2923     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2924     PrevOffset = Offset;
2925   }
2926 }
2927
2928 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2929 /// temporary label to it if SymbolStem is specified.
2930 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2931                                 const char *SymbolStem = 0) {
2932   Asm->OutStreamer.SwitchSection(Section);
2933   if (!SymbolStem) return 0;
2934   
2935   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2936   Asm->OutStreamer.EmitLabel(TmpSym);
2937   return TmpSym;
2938 }
2939
2940 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2941 /// the start of each one.
2942 void DwarfDebug::EmitSectionLabels() {
2943   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2944
2945   // Dwarf sections base addresses.
2946   if (Asm->MAI->doesDwarfRequireFrameSection()) {
2947     DwarfFrameSectionSym =
2948       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2949    }
2950
2951   DwarfInfoSectionSym = 
2952     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2953   DwarfAbbrevSectionSym = 
2954     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2955   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2956   
2957   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2958     EmitSectionSym(Asm, MacroInfo);
2959
2960   EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2961   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2962   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2963   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2964   DwarfStrSectionSym = 
2965     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2966   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2967                                              "debug_range");
2968
2969   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2970                                            "section_debug_loc");
2971
2972   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2973   EmitSectionSym(Asm, TLOF.getDataSection());
2974 }
2975
2976 /// emitDIE - Recusively Emits a debug information entry.
2977 ///
2978 void DwarfDebug::emitDIE(DIE *Die) {
2979   // Get the abbreviation for this DIE.
2980   unsigned AbbrevNumber = Die->getAbbrevNumber();
2981   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2982
2983   // Emit the code (index) for the abbreviation.
2984   if (Asm->isVerbose())
2985     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2986                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
2987                                 Twine::utohexstr(Die->getSize()) + " " +
2988                                 dwarf::TagString(Abbrev->getTag()));
2989   Asm->EmitULEB128(AbbrevNumber);
2990
2991   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2992   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2993
2994   // Emit the DIE attribute values.
2995   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2996     unsigned Attr = AbbrevData[i].getAttribute();
2997     unsigned Form = AbbrevData[i].getForm();
2998     assert(Form && "Too many attributes for DIE (check abbreviation)");
2999
3000     if (Asm->isVerbose())
3001       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3002     
3003     switch (Attr) {
3004     case dwarf::DW_AT_sibling:
3005       Asm->EmitInt32(Die->getSiblingOffset());
3006       break;
3007     case dwarf::DW_AT_abstract_origin: {
3008       DIEEntry *E = cast<DIEEntry>(Values[i]);
3009       DIE *Origin = E->getEntry();
3010       unsigned Addr = Origin->getOffset();
3011       Asm->EmitInt32(Addr);
3012       break;
3013     }
3014     case dwarf::DW_AT_ranges: {
3015       // DW_AT_range Value encodes offset in debug_range section.
3016       DIEInteger *V = cast<DIEInteger>(Values[i]);
3017       Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3018                                      V->getValue(),
3019                                      DwarfDebugRangeSectionSym,
3020                                      4);
3021       break;
3022     }
3023     case dwarf::DW_AT_location: {
3024       if (UseDotDebugLocEntry.count(Die) != 0) {
3025         DIELabel *L = cast<DIELabel>(Values[i]);
3026         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3027       } else
3028         Values[i]->EmitValue(Asm, Form);
3029       break;
3030     }
3031     default:
3032       // Emit an attribute using the defined form.
3033       Values[i]->EmitValue(Asm, Form);
3034       break;
3035     }
3036   }
3037
3038   // Emit the DIE children if any.
3039   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3040     const std::vector<DIE *> &Children = Die->getChildren();
3041
3042     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3043       emitDIE(Children[j]);
3044
3045     if (Asm->isVerbose())
3046       Asm->OutStreamer.AddComment("End Of Children Mark");
3047     Asm->EmitInt8(0);
3048   }
3049 }
3050
3051 /// emitDebugInfo - Emit the debug info section.
3052 ///
3053 void DwarfDebug::emitDebugInfo() {
3054   // Start debug info section.
3055   Asm->OutStreamer.SwitchSection(
3056                             Asm->getObjFileLowering().getDwarfInfoSection());
3057   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3058          E = CUMap.end(); I != E; ++I) {
3059     CompileUnit *TheCU = I->second;
3060     DIE *Die = TheCU->getCUDie();
3061     
3062     // Emit the compile units header.
3063     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3064                                                   TheCU->getID()));
3065     
3066     // Emit size of content not including length itself
3067     unsigned ContentSize = Die->getSize() +
3068       sizeof(int16_t) + // DWARF version number
3069       sizeof(int32_t) + // Offset Into Abbrev. Section
3070       sizeof(int8_t) +  // Pointer Size (in bytes)
3071       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3072     
3073     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3074     Asm->EmitInt32(ContentSize);
3075     Asm->OutStreamer.AddComment("DWARF version number");
3076     Asm->EmitInt16(dwarf::DWARF_VERSION);
3077     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3078     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3079                            DwarfAbbrevSectionSym);
3080     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3081     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3082     
3083     emitDIE(Die);
3084     // FIXME - extra padding for gdb bug.
3085     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3086     Asm->EmitInt8(0);
3087     Asm->EmitInt8(0);
3088     Asm->EmitInt8(0);
3089     Asm->EmitInt8(0);
3090     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3091   }
3092 }
3093
3094 /// emitAbbreviations - Emit the abbreviation section.
3095 ///
3096 void DwarfDebug::emitAbbreviations() const {
3097   // Check to see if it is worth the effort.
3098   if (!Abbreviations.empty()) {
3099     // Start the debug abbrev section.
3100     Asm->OutStreamer.SwitchSection(
3101                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3102
3103     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3104
3105     // For each abbrevation.
3106     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3107       // Get abbreviation data
3108       const DIEAbbrev *Abbrev = Abbreviations[i];
3109
3110       // Emit the abbrevations code (base 1 index.)
3111       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3112
3113       // Emit the abbreviations data.
3114       Abbrev->Emit(Asm);
3115     }
3116
3117     // Mark end of abbreviations.
3118     Asm->EmitULEB128(0, "EOM(3)");
3119
3120     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3121   }
3122 }
3123
3124 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3125 /// the line matrix.
3126 ///
3127 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3128   // Define last address of section.
3129   Asm->OutStreamer.AddComment("Extended Op");
3130   Asm->EmitInt8(0);
3131   
3132   Asm->OutStreamer.AddComment("Op size");
3133   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3134   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3135   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3136
3137   Asm->OutStreamer.AddComment("Section end label");
3138
3139   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3140                                    Asm->getTargetData().getPointerSize(),
3141                                    0/*AddrSpace*/);
3142
3143   // Mark end of matrix.
3144   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3145   Asm->EmitInt8(0);
3146   Asm->EmitInt8(1);
3147   Asm->EmitInt8(1);
3148 }
3149
3150 /// emitDebugLines - Emit source line information.
3151 ///
3152 void DwarfDebug::emitDebugLines() {
3153   // If the target is using .loc/.file, the assembler will be emitting the
3154   // .debug_line table automatically.
3155   if (Asm->MAI->hasDotLocAndDotFile())
3156     return;
3157
3158   // Minimum line delta, thus ranging from -10..(255-10).
3159   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3160   // Maximum line delta, thus ranging from -10..(255-10).
3161   const int MaxLineDelta = 255 + MinLineDelta;
3162
3163   // Start the dwarf line section.
3164   Asm->OutStreamer.SwitchSection(
3165                             Asm->getObjFileLowering().getDwarfLineSection());
3166
3167   // Construct the section header.
3168   Asm->OutStreamer.AddComment("Length of Source Line Info");
3169   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3170                            Asm->GetTempSymbol("line_begin"), 4);
3171   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3172
3173   Asm->OutStreamer.AddComment("DWARF version number");
3174   Asm->EmitInt16(dwarf::DWARF_VERSION); 
3175
3176   Asm->OutStreamer.AddComment("Prolog Length");
3177   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3178                            Asm->GetTempSymbol("line_prolog_begin"), 4);
3179   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3180
3181   Asm->OutStreamer.AddComment("Minimum Instruction Length");
3182   Asm->EmitInt8(1);
3183   Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3184   Asm->EmitInt8(1);
3185   Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3186   Asm->EmitInt8(MinLineDelta);
3187   Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3188   Asm->EmitInt8(MaxLineDelta);
3189   Asm->OutStreamer.AddComment("Special Opcode Base");
3190   Asm->EmitInt8(-MinLineDelta);
3191
3192   // Line number standard opcode encodings argument count
3193   Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3194   Asm->EmitInt8(0);
3195   Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3196   Asm->EmitInt8(1);
3197   Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3198   Asm->EmitInt8(1);
3199   Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3200   Asm->EmitInt8(1);
3201   Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3202   Asm->EmitInt8(1);
3203   Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3204   Asm->EmitInt8(0);
3205   Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3206   Asm->EmitInt8(0);
3207   Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3208   Asm->EmitInt8(0);
3209   Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3210   Asm->EmitInt8(1);
3211
3212   // Emit directories.
3213   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3214     const std::string &Dir = getSourceDirectoryName(DI);
3215     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3216     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3217   }
3218
3219   Asm->OutStreamer.AddComment("End of directories");
3220   Asm->EmitInt8(0);
3221
3222   // Emit files.
3223   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3224     // Remember source id starts at 1.
3225     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3226     const std::string &FN = getSourceFileName(Id.second);
3227     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3228     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3229     
3230     Asm->EmitULEB128(Id.first, "Directory #");
3231     Asm->EmitULEB128(0, "Mod date");
3232     Asm->EmitULEB128(0, "File size");
3233   }
3234
3235   Asm->OutStreamer.AddComment("End of files");
3236   Asm->EmitInt8(0);
3237
3238   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3239
3240   // A sequence for each text section.
3241   unsigned SecSrcLinesSize = SectionSourceLines.size();
3242
3243   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3244     // Isolate current sections line info.
3245     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3246
3247     // Dwarf assumes we start with first line of first source file.
3248     unsigned Source = 1;
3249     unsigned Line = 1;
3250
3251     // Construct rows of the address, source, line, column matrix.
3252     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3253       const SrcLineInfo &LineInfo = LineInfos[i];
3254       MCSymbol *Label = LineInfo.getLabel();
3255       if (!Label->isDefined()) continue; // Not emitted, in dead code.
3256
3257       if (Asm->isVerbose()) {
3258         std::pair<unsigned, unsigned> SrcID =
3259           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3260         Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3261                                     "/" +
3262                                     Twine(getSourceFileName(SrcID.second)) +
3263                                     ":" + Twine(LineInfo.getLine()));
3264       }
3265
3266       // Define the line address.
3267       Asm->OutStreamer.AddComment("Extended Op");
3268       Asm->EmitInt8(0);
3269       Asm->OutStreamer.AddComment("Op size");
3270       Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3271
3272       Asm->OutStreamer.AddComment("DW_LNE_set_address");
3273       Asm->EmitInt8(dwarf::DW_LNE_set_address); 
3274
3275       Asm->OutStreamer.AddComment("Location label");
3276       Asm->OutStreamer.EmitSymbolValue(Label,
3277                                        Asm->getTargetData().getPointerSize(),
3278                                        0/*AddrSpace*/);
3279       
3280       // If change of source, then switch to the new source.
3281       if (Source != LineInfo.getSourceID()) {
3282         Source = LineInfo.getSourceID();
3283         Asm->OutStreamer.AddComment("DW_LNS_set_file");
3284         Asm->EmitInt8(dwarf::DW_LNS_set_file); 
3285         Asm->EmitULEB128(Source, "New Source");
3286       }
3287
3288       // If change of line.
3289       if (Line != LineInfo.getLine()) {
3290         // Determine offset.
3291         int Offset = LineInfo.getLine() - Line;
3292         int Delta = Offset - MinLineDelta;
3293
3294         // Update line.
3295         Line = LineInfo.getLine();
3296
3297         // If delta is small enough and in range...
3298         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3299           // ... then use fast opcode.
3300           Asm->OutStreamer.AddComment("Line Delta");
3301           Asm->EmitInt8(Delta - MinLineDelta);
3302         } else {
3303           // ... otherwise use long hand.
3304           Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3305           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3306           Asm->EmitSLEB128(Offset, "Line Offset");
3307           Asm->OutStreamer.AddComment("DW_LNS_copy");
3308           Asm->EmitInt8(dwarf::DW_LNS_copy);
3309         }
3310       } else {
3311         // Copy the previous row (different address or source)
3312         Asm->OutStreamer.AddComment("DW_LNS_copy");
3313         Asm->EmitInt8(dwarf::DW_LNS_copy);
3314       }
3315     }
3316
3317     emitEndOfLineMatrix(j + 1);
3318   }
3319
3320   if (SecSrcLinesSize == 0)
3321     // Because we're emitting a debug_line section, we still need a line
3322     // table. The linker and friends expect it to exist. If there's nothing to
3323     // put into it, emit an empty table.
3324     emitEndOfLineMatrix(1);
3325
3326   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3327 }
3328
3329 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3330 ///
3331 void DwarfDebug::emitCommonDebugFrame() {
3332   if (!Asm->MAI->doesDwarfRequireFrameSection())
3333     return;
3334
3335   int stackGrowth = Asm->getTargetData().getPointerSize();
3336   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3337       TargetFrameInfo::StackGrowsDown)
3338     stackGrowth *= -1;
3339
3340   // Start the dwarf frame section.
3341   Asm->OutStreamer.SwitchSection(
3342                               Asm->getObjFileLowering().getDwarfFrameSection());
3343
3344   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3345   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3346   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3347                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3348
3349   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3350   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3351   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3352   Asm->OutStreamer.AddComment("CIE Version");
3353   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3354   Asm->OutStreamer.AddComment("CIE Augmentation");
3355   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3356   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3357   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3358   Asm->OutStreamer.AddComment("CIE RA Column");
3359   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3360   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3361
3362   std::vector<MachineMove> Moves;
3363   RI->getInitialFrameState(Moves);
3364
3365   Asm->EmitFrameMoves(Moves, 0, false);
3366
3367   Asm->EmitAlignment(2);
3368   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3369 }
3370
3371 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3372 /// section.
3373 void DwarfDebug::
3374 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3375   if (!Asm->MAI->doesDwarfRequireFrameSection())
3376     return;
3377
3378   // Start the dwarf frame section.
3379   Asm->OutStreamer.SwitchSection(
3380                               Asm->getObjFileLowering().getDwarfFrameSection());
3381
3382   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3383   MCSymbol *DebugFrameBegin =
3384     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3385   MCSymbol *DebugFrameEnd =
3386     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3387   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3388
3389   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3390
3391   Asm->OutStreamer.AddComment("FDE CIE offset");
3392   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"), 
3393                          DwarfFrameSectionSym);
3394
3395   Asm->OutStreamer.AddComment("FDE initial location");
3396   MCSymbol *FuncBeginSym =
3397     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3398   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3399                                    Asm->getTargetData().getPointerSize(),
3400                                    0/*AddrSpace*/);
3401   
3402   
3403   Asm->OutStreamer.AddComment("FDE address range");
3404   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3405                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3406
3407   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3408
3409   Asm->EmitAlignment(2);
3410   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3411 }
3412
3413 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3414 ///
3415 void DwarfDebug::emitDebugPubNames() {
3416   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3417          E = CUMap.end(); I != E; ++I) {
3418     CompileUnit *TheCU = I->second;
3419     // Start the dwarf pubnames section.
3420     Asm->OutStreamer.SwitchSection(
3421       Asm->getObjFileLowering().getDwarfPubNamesSection());
3422     
3423     Asm->OutStreamer.AddComment("Length of Public Names Info");
3424     Asm->EmitLabelDifference(
3425       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3426       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3427     
3428     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3429                                                   TheCU->getID()));
3430     
3431     Asm->OutStreamer.AddComment("DWARF Version");
3432     Asm->EmitInt16(dwarf::DWARF_VERSION); 
3433     
3434     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3435     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 
3436                            DwarfInfoSectionSym);
3437     
3438     Asm->OutStreamer.AddComment("Compilation Unit Length");
3439     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3440                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3441                              4);
3442     
3443     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3444     for (StringMap<DIE*>::const_iterator
3445            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3446       const char *Name = GI->getKeyData();
3447       DIE *Entity = GI->second;
3448       
3449       Asm->OutStreamer.AddComment("DIE offset");
3450       Asm->EmitInt32(Entity->getOffset());
3451       
3452       if (Asm->isVerbose())
3453         Asm->OutStreamer.AddComment("External Name");
3454       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3455     }
3456     
3457     Asm->OutStreamer.AddComment("End Mark");
3458     Asm->EmitInt32(0);
3459     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3460                                                 TheCU->getID()));
3461   }
3462 }
3463
3464 void DwarfDebug::emitDebugPubTypes() {
3465   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3466          E = CUMap.end(); I != E; ++I) {
3467     CompileUnit *TheCU = I->second;
3468     // Start the dwarf pubnames section.
3469     Asm->OutStreamer.SwitchSection(
3470       Asm->getObjFileLowering().getDwarfPubTypesSection());
3471     Asm->OutStreamer.AddComment("Length of Public Types Info");
3472     Asm->EmitLabelDifference(
3473       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3474       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3475     
3476     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3477                                                   TheCU->getID()));
3478     
3479     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3480     Asm->EmitInt16(dwarf::DWARF_VERSION);
3481     
3482     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3483     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3484                            DwarfInfoSectionSym);
3485     
3486     Asm->OutStreamer.AddComment("Compilation Unit Length");
3487     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3488                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3489                              4);
3490     
3491     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3492     for (StringMap<DIE*>::const_iterator
3493            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3494       const char *Name = GI->getKeyData();
3495       DIE * Entity = GI->second;
3496       
3497       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3498       Asm->EmitInt32(Entity->getOffset());
3499       
3500       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3501       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3502     }
3503     
3504     Asm->OutStreamer.AddComment("End Mark");
3505     Asm->EmitInt32(0); 
3506     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3507                                                   TheCU->getID()));
3508   }
3509 }
3510
3511 /// emitDebugStr - Emit visible names into a debug str section.
3512 ///
3513 void DwarfDebug::emitDebugStr() {
3514   // Check to see if it is worth the effort.
3515   if (StringPool.empty()) return;
3516   
3517   // Start the dwarf str section.
3518   Asm->OutStreamer.SwitchSection(
3519                                 Asm->getObjFileLowering().getDwarfStrSection());
3520
3521   // Get all of the string pool entries and put them in an array by their ID so
3522   // we can sort them.
3523   SmallVector<std::pair<unsigned, 
3524       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3525   
3526   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3527        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3528     Entries.push_back(std::make_pair(I->second.second, &*I));
3529   
3530   array_pod_sort(Entries.begin(), Entries.end());
3531   
3532   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3533     // Emit a label for reference from debug information entries.
3534     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3535     
3536     // Emit the string itself.
3537     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3538   }
3539 }
3540
3541 /// emitDebugLoc - Emit visible names into a debug loc section.
3542 ///
3543 void DwarfDebug::emitDebugLoc() {
3544   if (DotDebugLocEntries.empty())
3545     return;
3546
3547   // Start the dwarf loc section.
3548   Asm->OutStreamer.SwitchSection(
3549     Asm->getObjFileLowering().getDwarfLocSection());
3550   unsigned char Size = Asm->getTargetData().getPointerSize();
3551   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3552   unsigned index = 1;
3553   for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(),
3554          E = DotDebugLocEntries.end(); I != E; ++I, ++index) {
3555     DotDebugLocEntry Entry = *I;
3556     if (Entry.isEmpty()) {
3557       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3558       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3559       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3560     } else {
3561       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3562       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3563       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3564       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3565       if (Reg < 32) {
3566         Asm->OutStreamer.AddComment("Loc expr size");
3567         Asm->EmitInt16(1);
3568         Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3569       } else {
3570         Asm->OutStreamer.AddComment("Loc expr size");
3571         Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3572         Asm->EmitInt8(dwarf::DW_OP_regx);
3573         Asm->EmitULEB128(Reg);
3574       }
3575     }
3576   }
3577 }
3578
3579 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3580 ///
3581 void DwarfDebug::EmitDebugARanges() {
3582   // Start the dwarf aranges section.
3583   Asm->OutStreamer.SwitchSection(
3584                           Asm->getObjFileLowering().getDwarfARangesSection());
3585 }
3586
3587 /// emitDebugRanges - Emit visible names into a debug ranges section.
3588 ///
3589 void DwarfDebug::emitDebugRanges() {
3590   // Start the dwarf ranges section.
3591   Asm->OutStreamer.SwitchSection(
3592     Asm->getObjFileLowering().getDwarfRangesSection());
3593   unsigned char Size = Asm->getTargetData().getPointerSize();
3594   for (SmallVector<const MCSymbol *, 8>::iterator
3595          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 
3596        I != E; ++I) {
3597     if (*I)
3598       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3599     else
3600       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3601   }
3602 }
3603
3604 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3605 ///
3606 void DwarfDebug::emitDebugMacInfo() {
3607   if (const MCSection *LineInfo =
3608       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3609     // Start the dwarf macinfo section.
3610     Asm->OutStreamer.SwitchSection(LineInfo);
3611   }
3612 }
3613
3614 /// emitDebugInlineInfo - Emit inline info using following format.
3615 /// Section Header:
3616 /// 1. length of section
3617 /// 2. Dwarf version number
3618 /// 3. address size.
3619 ///
3620 /// Entries (one "entry" for each function that was inlined):
3621 ///
3622 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3623 ///   otherwise offset into __debug_str for regular function name.
3624 /// 2. offset into __debug_str section for regular function name.
3625 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3626 /// instances for the function.
3627 ///
3628 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3629 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3630 /// __debug_info section, and the low_pc is the starting address for the
3631 /// inlining instance.
3632 void DwarfDebug::emitDebugInlineInfo() {
3633   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3634     return;
3635
3636   if (!FirstCU)
3637     return;
3638
3639   Asm->OutStreamer.SwitchSection(
3640                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3641
3642   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3643   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3644                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3645
3646   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3647
3648   Asm->OutStreamer.AddComment("Dwarf Version");
3649   Asm->EmitInt16(dwarf::DWARF_VERSION);
3650   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3651   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3652
3653   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3654          E = InlinedSPNodes.end(); I != E; ++I) {
3655
3656     const MDNode *Node = *I;
3657     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3658       = InlineInfo.find(Node);
3659     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3660     DISubprogram SP(Node);
3661     StringRef LName = SP.getLinkageName();
3662     StringRef Name = SP.getName();
3663
3664     Asm->OutStreamer.AddComment("MIPS linkage name");
3665     if (LName.empty()) {
3666       Asm->OutStreamer.EmitBytes(Name, 0);
3667       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3668     } else 
3669       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3670                              DwarfStrSectionSym);
3671
3672     Asm->OutStreamer.AddComment("Function name");
3673     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3674     Asm->EmitULEB128(Labels.size(), "Inline count");
3675
3676     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3677            LE = Labels.end(); LI != LE; ++LI) {
3678       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3679       Asm->EmitInt32(LI->second->getOffset());
3680
3681       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3682       Asm->OutStreamer.EmitSymbolValue(LI->first,
3683                                        Asm->getTargetData().getPointerSize(),0);
3684     }
3685   }
3686
3687   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3688 }