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