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