Fix decl/def debug info for template functions. 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 == FunctionBeginSym || 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   const MDNode *TheScope = 0;
2686   
2687   DISubprogram SP = getDISubprogram(Scope);
2688   unsigned Line, Col;
2689   if (SP.Verify()) {
2690     Line = SP.getLineNumber();
2691     Col = 0;
2692     TheScope = SP;
2693   } else {
2694     Line = FDL.getLine();
2695     Col = FDL.getCol();
2696     TheScope = Scope;
2697   }
2698   
2699   recordSourceLine(Line, Col, TheScope);
2700
2701   /// ProcessedArgs - Collection of arguments already processed.
2702   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2703
2704   DebugLoc PrevLoc;
2705   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2706        I != E; ++I)
2707     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2708          II != IE; ++II) {
2709       const MachineInstr *MI = II;
2710       DebugLoc DL = MI->getDebugLoc();
2711       if (MI->isDebugValue()) {
2712         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2713         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2714         if (!DV.Verify()) continue;
2715         // If DBG_VALUE is for a local variable then it needs a label.
2716         if (DV.getTag() != dwarf::DW_TAG_arg_variable 
2717             && isDbgValueInUndefinedReg(MI) == false)
2718           InsnNeedsLabel.insert(MI);
2719         // DBG_VALUE for inlined functions argument needs a label.
2720         else if (!DISubprogram(getDISubprogram(DV.getContext())).
2721                  describes(MF->getFunction()))
2722           InsnNeedsLabel.insert(MI);
2723         // DBG_VALUE indicating argument location change needs a label.
2724         else if (isDbgValueInUndefinedReg(MI) == false && !ProcessedArgs.insert(DV))
2725           InsnNeedsLabel.insert(MI);
2726       } else {
2727         // If location is unknown then instruction needs a location only if 
2728         // UnknownLocations flag is set.
2729         if (DL.isUnknown()) {
2730           if (UnknownLocations && !PrevLoc.isUnknown())
2731             InsnNeedsLabel.insert(MI);
2732         } else if (DL != PrevLoc)
2733           // Otherwise, instruction needs a location only if it is new location.
2734           InsnNeedsLabel.insert(MI);
2735       }
2736       
2737       if (!DL.isUnknown() || UnknownLocations)
2738         PrevLoc = DL;
2739     }
2740
2741   PrevLabel = FunctionBeginSym;
2742 }
2743
2744 /// endFunction - Gather and emit post-function debug information.
2745 ///
2746 void DwarfDebug::endFunction(const MachineFunction *MF) {
2747   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2748
2749   if (CurrentFnDbgScope) {
2750
2751     // Define end label for subprogram.
2752     FunctionEndSym = Asm->GetTempSymbol("func_end",
2753                                         Asm->getFunctionNumber());
2754     // Assumes in correct section after the entry point.
2755     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2756     
2757     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2758     collectVariableInfo(MF, ProcessedVars);
2759
2760     // Get function line info.
2761     if (!Lines.empty()) {
2762       // Get section line info.
2763       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2764       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2765       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2766       // Append the function info to section info.
2767       SectionLineInfos.insert(SectionLineInfos.end(),
2768                               Lines.begin(), Lines.end());
2769     }
2770     
2771     // Construct abstract scopes.
2772     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2773            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2774       DISubprogram SP((*AI)->getScopeNode());
2775       if (SP.Verify()) {
2776         // Collect info for variables that were optimized out.
2777         StringRef FName = SP.getLinkageName();
2778         if (FName.empty())
2779           FName = SP.getName();
2780         const Module *M = MF->getFunction()->getParent();
2781         if (NamedMDNode *NMD = 
2782             M->getNamedMetadata(Twine("llvm.dbg.lv.", 
2783                                       getRealLinkageName(FName)))) {
2784           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2785           DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2786           if (!DV || !ProcessedVars.insert(DV))
2787             continue;
2788           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2789           if (Scope)
2790             Scope->addVariable(new DbgVariable(DV));
2791           }
2792         }
2793       }
2794       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2795         constructScopeDIE(*AI);
2796     }
2797
2798     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2799     
2800     if (!DisableFramePointerElim(*MF))
2801       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr, 
2802               dwarf::DW_FORM_flag, 1);
2803
2804
2805     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2806                                                  MMI->getFrameMoves()));
2807   }
2808
2809   // Clear debug info
2810   CurrentFnDbgScope = NULL;
2811   InsnNeedsLabel.clear();
2812   DbgVariableToFrameIndexMap.clear();
2813   VarToAbstractVarMap.clear();
2814   DbgVariableToDbgInstMap.clear();
2815   DbgVariableLabelsMap.clear();
2816   DeleteContainerSeconds(DbgScopeMap);
2817   InsnsEndScopeSet.clear();
2818   ConcreteScopes.clear();
2819   DeleteContainerSeconds(AbstractScopes);
2820   AbstractScopesList.clear();
2821   AbstractVariables.clear();
2822   LabelsBeforeInsn.clear();
2823   LabelsAfterInsn.clear();
2824   Lines.clear();
2825   PrevLabel = NULL;
2826 }
2827
2828 /// recordVariableFrameIndex - Record a variable's index.
2829 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2830   assert (V && "Invalid DbgVariable!");
2831   DbgVariableToFrameIndexMap[V] = Index;
2832 }
2833
2834 /// findVariableFrameIndex - Return true if frame index for the variable
2835 /// is found. Update FI to hold value of the index.
2836 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2837   assert (V && "Invalid DbgVariable!");
2838   DenseMap<const DbgVariable *, int>::iterator I =
2839     DbgVariableToFrameIndexMap.find(V);
2840   if (I == DbgVariableToFrameIndexMap.end())
2841     return false;
2842   *FI = I->second;
2843   return true;
2844 }
2845
2846 /// findVariableLabel - Find MCSymbol for the variable.
2847 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2848   DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2849     = DbgVariableLabelsMap.find(V);
2850   if (I == DbgVariableLabelsMap.end())
2851     return NULL;
2852   else return I->second;
2853 }
2854
2855 /// findDbgScope - Find DbgScope for the debug loc attached with an 
2856 /// instruction.
2857 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2858   DbgScope *Scope = NULL;
2859   LLVMContext &Ctx = 
2860     MInsn->getParent()->getParent()->getFunction()->getContext();
2861   DebugLoc DL = MInsn->getDebugLoc();
2862
2863   if (DL.isUnknown()) 
2864     return Scope;
2865
2866   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2867     Scope = ConcreteScopes.lookup(IA);
2868   if (Scope == 0)
2869     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2870     
2871   return Scope;
2872 }
2873
2874
2875 /// recordSourceLine - Register a source line with debug info. Returns the
2876 /// unique label that was emitted and which provides correspondence to
2877 /// the source line list.
2878 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, 
2879                                        const MDNode *S) {
2880   StringRef Dir;
2881   StringRef Fn;
2882
2883   unsigned Src = 1;
2884   if (S) {
2885     DIDescriptor Scope(S);
2886
2887     if (Scope.isCompileUnit()) {
2888       DICompileUnit CU(S);
2889       Dir = CU.getDirectory();
2890       Fn = CU.getFilename();
2891     } else if (Scope.isSubprogram()) {
2892       DISubprogram SP(S);
2893       Dir = SP.getDirectory();
2894       Fn = SP.getFilename();
2895     } else if (Scope.isLexicalBlock()) {
2896       DILexicalBlock DB(S);
2897       Dir = DB.getDirectory();
2898       Fn = DB.getFilename();
2899     } else
2900       assert(0 && "Unexpected scope info");
2901
2902     Src = GetOrCreateSourceID(Dir, Fn);
2903   }
2904
2905   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2906   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2907
2908   Asm->OutStreamer.EmitLabel(Label);
2909   return Label;
2910 }
2911
2912 //===----------------------------------------------------------------------===//
2913 // Emit Methods
2914 //===----------------------------------------------------------------------===//
2915
2916 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2917 ///
2918 unsigned
2919 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2920   // Get the children.
2921   const std::vector<DIE *> &Children = Die->getChildren();
2922
2923   // If not last sibling and has children then add sibling offset attribute.
2924   if (!Last && !Children.empty())
2925     Die->addSiblingOffset(DIEValueAllocator);
2926
2927   // Record the abbreviation.
2928   assignAbbrevNumber(Die->getAbbrev());
2929
2930   // Get the abbreviation for this DIE.
2931   unsigned AbbrevNumber = Die->getAbbrevNumber();
2932   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2933
2934   // Set DIE offset
2935   Die->setOffset(Offset);
2936
2937   // Start the size with the size of abbreviation code.
2938   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2939
2940   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2941   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2942
2943   // Size the DIE attribute values.
2944   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2945     // Size attribute value.
2946     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2947
2948   // Size the DIE children if any.
2949   if (!Children.empty()) {
2950     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2951            "Children flag not set");
2952
2953     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2954       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2955
2956     // End of children marker.
2957     Offset += sizeof(int8_t);
2958   }
2959
2960   Die->setSize(Offset - Die->getOffset());
2961   return Offset;
2962 }
2963
2964 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2965 ///
2966 void DwarfDebug::computeSizeAndOffsets() {
2967   unsigned PrevOffset = 0;
2968   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2969          E = CUMap.end(); I != E; ++I) {
2970     // Compute size of compile unit header.
2971     static unsigned Offset = PrevOffset +
2972       sizeof(int32_t) + // Length of Compilation Unit Info
2973       sizeof(int16_t) + // DWARF version number
2974       sizeof(int32_t) + // Offset Into Abbrev. Section
2975       sizeof(int8_t);   // Pointer Size (in bytes)
2976     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2977     PrevOffset = Offset;
2978   }
2979 }
2980
2981 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2982 /// temporary label to it if SymbolStem is specified.
2983 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2984                                 const char *SymbolStem = 0) {
2985   Asm->OutStreamer.SwitchSection(Section);
2986   if (!SymbolStem) return 0;
2987   
2988   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2989   Asm->OutStreamer.EmitLabel(TmpSym);
2990   return TmpSym;
2991 }
2992
2993 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2994 /// the start of each one.
2995 void DwarfDebug::EmitSectionLabels() {
2996   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2997
2998   // Dwarf sections base addresses.
2999   if (Asm->MAI->doesDwarfRequireFrameSection()) {
3000     DwarfFrameSectionSym =
3001       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3002    }
3003
3004   DwarfInfoSectionSym = 
3005     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3006   DwarfAbbrevSectionSym = 
3007     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3008   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3009   
3010   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3011     EmitSectionSym(Asm, MacroInfo);
3012
3013   DwarfDebugLineSectionSym = 
3014     EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3015   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3016   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3017   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3018   DwarfStrSectionSym = 
3019     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3020   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3021                                              "debug_range");
3022
3023   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3024                                            "section_debug_loc");
3025
3026   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3027   EmitSectionSym(Asm, TLOF.getDataSection());
3028 }
3029
3030 /// emitDIE - Recusively Emits a debug information entry.
3031 ///
3032 void DwarfDebug::emitDIE(DIE *Die) {
3033   // Get the abbreviation for this DIE.
3034   unsigned AbbrevNumber = Die->getAbbrevNumber();
3035   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3036
3037   // Emit the code (index) for the abbreviation.
3038   if (Asm->isVerbose())
3039     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3040                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
3041                                 Twine::utohexstr(Die->getSize()) + " " +
3042                                 dwarf::TagString(Abbrev->getTag()));
3043   Asm->EmitULEB128(AbbrevNumber);
3044
3045   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3046   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3047
3048   // Emit the DIE attribute values.
3049   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3050     unsigned Attr = AbbrevData[i].getAttribute();
3051     unsigned Form = AbbrevData[i].getForm();
3052     assert(Form && "Too many attributes for DIE (check abbreviation)");
3053
3054     if (Asm->isVerbose())
3055       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3056     
3057     switch (Attr) {
3058     case dwarf::DW_AT_sibling:
3059       Asm->EmitInt32(Die->getSiblingOffset());
3060       break;
3061     case dwarf::DW_AT_abstract_origin: {
3062       DIEEntry *E = cast<DIEEntry>(Values[i]);
3063       DIE *Origin = E->getEntry();
3064       unsigned Addr = Origin->getOffset();
3065       Asm->EmitInt32(Addr);
3066       break;
3067     }
3068     case dwarf::DW_AT_ranges: {
3069       // DW_AT_range Value encodes offset in debug_range section.
3070       DIEInteger *V = cast<DIEInteger>(Values[i]);
3071       Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3072                                      V->getValue(),
3073                                      DwarfDebugRangeSectionSym,
3074                                      4);
3075       break;
3076     }
3077     case dwarf::DW_AT_stmt_list: {
3078       Asm->EmitLabelDifference(CurrentLineSectionSym, 
3079                                DwarfDebugLineSectionSym, 4);
3080       break;
3081     }
3082     case dwarf::DW_AT_location: {
3083       if (UseDotDebugLocEntry.count(Die) != 0) {
3084         DIELabel *L = cast<DIELabel>(Values[i]);
3085         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3086       } else
3087         Values[i]->EmitValue(Asm, Form);
3088       break;
3089     }
3090     default:
3091       // Emit an attribute using the defined form.
3092       Values[i]->EmitValue(Asm, Form);
3093       break;
3094     }
3095   }
3096
3097   // Emit the DIE children if any.
3098   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3099     const std::vector<DIE *> &Children = Die->getChildren();
3100
3101     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3102       emitDIE(Children[j]);
3103
3104     if (Asm->isVerbose())
3105       Asm->OutStreamer.AddComment("End Of Children Mark");
3106     Asm->EmitInt8(0);
3107   }
3108 }
3109
3110 /// emitDebugInfo - Emit the debug info section.
3111 ///
3112 void DwarfDebug::emitDebugInfo() {
3113   // Start debug info section.
3114   Asm->OutStreamer.SwitchSection(
3115                             Asm->getObjFileLowering().getDwarfInfoSection());
3116   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3117          E = CUMap.end(); I != E; ++I) {
3118     CompileUnit *TheCU = I->second;
3119     DIE *Die = TheCU->getCUDie();
3120     
3121     // Emit the compile units header.
3122     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3123                                                   TheCU->getID()));
3124     
3125     // Emit size of content not including length itself
3126     unsigned ContentSize = Die->getSize() +
3127       sizeof(int16_t) + // DWARF version number
3128       sizeof(int32_t) + // Offset Into Abbrev. Section
3129       sizeof(int8_t) +  // Pointer Size (in bytes)
3130       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3131     
3132     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3133     Asm->EmitInt32(ContentSize);
3134     Asm->OutStreamer.AddComment("DWARF version number");
3135     Asm->EmitInt16(dwarf::DWARF_VERSION);
3136     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3137     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3138                            DwarfAbbrevSectionSym);
3139     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3140     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3141     
3142     emitDIE(Die);
3143     // FIXME - extra padding for gdb bug.
3144     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3145     Asm->EmitInt8(0);
3146     Asm->EmitInt8(0);
3147     Asm->EmitInt8(0);
3148     Asm->EmitInt8(0);
3149     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3150   }
3151 }
3152
3153 /// emitAbbreviations - Emit the abbreviation section.
3154 ///
3155 void DwarfDebug::emitAbbreviations() const {
3156   // Check to see if it is worth the effort.
3157   if (!Abbreviations.empty()) {
3158     // Start the debug abbrev section.
3159     Asm->OutStreamer.SwitchSection(
3160                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3161
3162     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3163
3164     // For each abbrevation.
3165     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3166       // Get abbreviation data
3167       const DIEAbbrev *Abbrev = Abbreviations[i];
3168
3169       // Emit the abbrevations code (base 1 index.)
3170       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3171
3172       // Emit the abbreviations data.
3173       Abbrev->Emit(Asm);
3174     }
3175
3176     // Mark end of abbreviations.
3177     Asm->EmitULEB128(0, "EOM(3)");
3178
3179     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3180   }
3181 }
3182
3183 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3184 /// the line matrix.
3185 ///
3186 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3187   // Define last address of section.
3188   Asm->OutStreamer.AddComment("Extended Op");
3189   Asm->EmitInt8(0);
3190   
3191   Asm->OutStreamer.AddComment("Op size");
3192   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3193   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3194   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3195
3196   Asm->OutStreamer.AddComment("Section end label");
3197
3198   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3199                                    Asm->getTargetData().getPointerSize(),
3200                                    0/*AddrSpace*/);
3201
3202   // Mark end of matrix.
3203   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3204   Asm->EmitInt8(0);
3205   Asm->EmitInt8(1);
3206   Asm->EmitInt8(1);
3207 }
3208
3209 /// emitDebugLines - Emit source line information.
3210 ///
3211 void DwarfDebug::emitDebugLines() {
3212   // If the target is using .loc/.file, the assembler will be emitting the
3213   // .debug_line table automatically.
3214   if (Asm->MAI->hasDotLocAndDotFile())
3215     return;
3216
3217   // Minimum line delta, thus ranging from -10..(255-10).
3218   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3219   // Maximum line delta, thus ranging from -10..(255-10).
3220   const int MaxLineDelta = 255 + MinLineDelta;
3221
3222   // Start the dwarf line section.
3223   Asm->OutStreamer.SwitchSection(
3224                             Asm->getObjFileLowering().getDwarfLineSection());
3225
3226   // Construct the section header.
3227   CurrentLineSectionSym = Asm->GetTempSymbol("section_line_begin");
3228   Asm->OutStreamer.EmitLabel(CurrentLineSectionSym);
3229   Asm->OutStreamer.AddComment("Length of Source Line Info");
3230   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3231                            Asm->GetTempSymbol("line_begin"), 4);
3232   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3233
3234   Asm->OutStreamer.AddComment("DWARF version number");
3235   Asm->EmitInt16(dwarf::DWARF_VERSION); 
3236
3237   Asm->OutStreamer.AddComment("Prolog Length");
3238   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3239                            Asm->GetTempSymbol("line_prolog_begin"), 4);
3240   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3241
3242   Asm->OutStreamer.AddComment("Minimum Instruction Length");
3243   Asm->EmitInt8(1);
3244   Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3245   Asm->EmitInt8(1);
3246   Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3247   Asm->EmitInt8(MinLineDelta);
3248   Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3249   Asm->EmitInt8(MaxLineDelta);
3250   Asm->OutStreamer.AddComment("Special Opcode Base");
3251   Asm->EmitInt8(-MinLineDelta);
3252
3253   // Line number standard opcode encodings argument count
3254   Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3255   Asm->EmitInt8(0);
3256   Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3257   Asm->EmitInt8(1);
3258   Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3259   Asm->EmitInt8(1);
3260   Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3261   Asm->EmitInt8(1);
3262   Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3263   Asm->EmitInt8(1);
3264   Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3265   Asm->EmitInt8(0);
3266   Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3267   Asm->EmitInt8(0);
3268   Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3269   Asm->EmitInt8(0);
3270   Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3271   Asm->EmitInt8(1);
3272
3273   // Emit directories.
3274   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3275     const std::string &Dir = getSourceDirectoryName(DI);
3276     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3277     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3278   }
3279
3280   Asm->OutStreamer.AddComment("End of directories");
3281   Asm->EmitInt8(0);
3282
3283   // Emit files.
3284   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3285     // Remember source id starts at 1.
3286     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3287     const std::string &FN = getSourceFileName(Id.second);
3288     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3289     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3290     
3291     Asm->EmitULEB128(Id.first, "Directory #");
3292     Asm->EmitULEB128(0, "Mod date");
3293     Asm->EmitULEB128(0, "File size");
3294   }
3295
3296   Asm->OutStreamer.AddComment("End of files");
3297   Asm->EmitInt8(0);
3298
3299   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3300
3301   // A sequence for each text section.
3302   unsigned SecSrcLinesSize = SectionSourceLines.size();
3303
3304   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3305     // Isolate current sections line info.
3306     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3307
3308     // Dwarf assumes we start with first line of first source file.
3309     unsigned Source = 1;
3310     unsigned Line = 1;
3311
3312     // Construct rows of the address, source, line, column matrix.
3313     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3314       const SrcLineInfo &LineInfo = LineInfos[i];
3315       MCSymbol *Label = LineInfo.getLabel();
3316       if (!Label->isDefined()) continue; // Not emitted, in dead code.
3317
3318       if (Asm->isVerbose()) {
3319         std::pair<unsigned, unsigned> SrcID =
3320           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3321         Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3322                                     "/" +
3323                                     Twine(getSourceFileName(SrcID.second)) +
3324                                     ":" + Twine(LineInfo.getLine()));
3325       }
3326
3327       // Define the line address.
3328       Asm->OutStreamer.AddComment("Extended Op");
3329       Asm->EmitInt8(0);
3330       Asm->OutStreamer.AddComment("Op size");
3331       Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3332
3333       Asm->OutStreamer.AddComment("DW_LNE_set_address");
3334       Asm->EmitInt8(dwarf::DW_LNE_set_address); 
3335
3336       Asm->OutStreamer.AddComment("Location label");
3337       Asm->OutStreamer.EmitSymbolValue(Label,
3338                                        Asm->getTargetData().getPointerSize(),
3339                                        0/*AddrSpace*/);
3340       
3341       // If change of source, then switch to the new source.
3342       if (Source != LineInfo.getSourceID()) {
3343         Source = LineInfo.getSourceID();
3344         Asm->OutStreamer.AddComment("DW_LNS_set_file");
3345         Asm->EmitInt8(dwarf::DW_LNS_set_file); 
3346         Asm->EmitULEB128(Source, "New Source");
3347       }
3348
3349       // If change of line.
3350       if (Line != LineInfo.getLine()) {
3351         // Determine offset.
3352         int Offset = LineInfo.getLine() - Line;
3353         int Delta = Offset - MinLineDelta;
3354
3355         // Update line.
3356         Line = LineInfo.getLine();
3357
3358         // If delta is small enough and in range...
3359         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3360           // ... then use fast opcode.
3361           Asm->OutStreamer.AddComment("Line Delta");
3362           Asm->EmitInt8(Delta - MinLineDelta);
3363         } else {
3364           // ... otherwise use long hand.
3365           Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3366           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3367           Asm->EmitSLEB128(Offset, "Line Offset");
3368           Asm->OutStreamer.AddComment("DW_LNS_copy");
3369           Asm->EmitInt8(dwarf::DW_LNS_copy);
3370         }
3371       } else {
3372         // Copy the previous row (different address or source)
3373         Asm->OutStreamer.AddComment("DW_LNS_copy");
3374         Asm->EmitInt8(dwarf::DW_LNS_copy);
3375       }
3376     }
3377
3378     emitEndOfLineMatrix(j + 1);
3379   }
3380
3381   if (SecSrcLinesSize == 0)
3382     // Because we're emitting a debug_line section, we still need a line
3383     // table. The linker and friends expect it to exist. If there's nothing to
3384     // put into it, emit an empty table.
3385     emitEndOfLineMatrix(1);
3386
3387   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3388 }
3389
3390 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3391 ///
3392 void DwarfDebug::emitCommonDebugFrame() {
3393   if (!Asm->MAI->doesDwarfRequireFrameSection())
3394     return;
3395
3396   int stackGrowth = Asm->getTargetData().getPointerSize();
3397   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3398       TargetFrameInfo::StackGrowsDown)
3399     stackGrowth *= -1;
3400
3401   // Start the dwarf frame section.
3402   Asm->OutStreamer.SwitchSection(
3403                               Asm->getObjFileLowering().getDwarfFrameSection());
3404
3405   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3406   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3407   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3408                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3409
3410   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3411   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3412   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3413   Asm->OutStreamer.AddComment("CIE Version");
3414   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3415   Asm->OutStreamer.AddComment("CIE Augmentation");
3416   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3417   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3418   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3419   Asm->OutStreamer.AddComment("CIE RA Column");
3420   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3421   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3422
3423   std::vector<MachineMove> Moves;
3424   RI->getInitialFrameState(Moves);
3425
3426   Asm->EmitFrameMoves(Moves, 0, false);
3427
3428   Asm->EmitAlignment(2);
3429   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3430 }
3431
3432 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3433 /// section.
3434 void DwarfDebug::
3435 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3436   if (!Asm->MAI->doesDwarfRequireFrameSection())
3437     return;
3438
3439   // Start the dwarf frame section.
3440   Asm->OutStreamer.SwitchSection(
3441                               Asm->getObjFileLowering().getDwarfFrameSection());
3442
3443   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3444   MCSymbol *DebugFrameBegin =
3445     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3446   MCSymbol *DebugFrameEnd =
3447     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3448   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3449
3450   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3451
3452   Asm->OutStreamer.AddComment("FDE CIE offset");
3453   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"), 
3454                          DwarfFrameSectionSym);
3455
3456   Asm->OutStreamer.AddComment("FDE initial location");
3457   MCSymbol *FuncBeginSym =
3458     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3459   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3460                                    Asm->getTargetData().getPointerSize(),
3461                                    0/*AddrSpace*/);
3462   
3463   
3464   Asm->OutStreamer.AddComment("FDE address range");
3465   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3466                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3467
3468   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3469
3470   Asm->EmitAlignment(2);
3471   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3472 }
3473
3474 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3475 ///
3476 void DwarfDebug::emitDebugPubNames() {
3477   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3478          E = CUMap.end(); I != E; ++I) {
3479     CompileUnit *TheCU = I->second;
3480     // Start the dwarf pubnames section.
3481     Asm->OutStreamer.SwitchSection(
3482       Asm->getObjFileLowering().getDwarfPubNamesSection());
3483     
3484     Asm->OutStreamer.AddComment("Length of Public Names Info");
3485     Asm->EmitLabelDifference(
3486       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3487       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3488     
3489     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3490                                                   TheCU->getID()));
3491     
3492     Asm->OutStreamer.AddComment("DWARF Version");
3493     Asm->EmitInt16(dwarf::DWARF_VERSION); 
3494     
3495     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3496     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()), 
3497                            DwarfInfoSectionSym);
3498     
3499     Asm->OutStreamer.AddComment("Compilation Unit Length");
3500     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3501                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3502                              4);
3503     
3504     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3505     for (StringMap<DIE*>::const_iterator
3506            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3507       const char *Name = GI->getKeyData();
3508       DIE *Entity = GI->second;
3509       
3510       Asm->OutStreamer.AddComment("DIE offset");
3511       Asm->EmitInt32(Entity->getOffset());
3512       
3513       if (Asm->isVerbose())
3514         Asm->OutStreamer.AddComment("External Name");
3515       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3516     }
3517     
3518     Asm->OutStreamer.AddComment("End Mark");
3519     Asm->EmitInt32(0);
3520     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3521                                                 TheCU->getID()));
3522   }
3523 }
3524
3525 void DwarfDebug::emitDebugPubTypes() {
3526   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3527          E = CUMap.end(); I != E; ++I) {
3528     CompileUnit *TheCU = I->second;
3529     // Start the dwarf pubnames section.
3530     Asm->OutStreamer.SwitchSection(
3531       Asm->getObjFileLowering().getDwarfPubTypesSection());
3532     Asm->OutStreamer.AddComment("Length of Public Types Info");
3533     Asm->EmitLabelDifference(
3534       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3535       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3536     
3537     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3538                                                   TheCU->getID()));
3539     
3540     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3541     Asm->EmitInt16(dwarf::DWARF_VERSION);
3542     
3543     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3544     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3545                            DwarfInfoSectionSym);
3546     
3547     Asm->OutStreamer.AddComment("Compilation Unit Length");
3548     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3549                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3550                              4);
3551     
3552     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3553     for (StringMap<DIE*>::const_iterator
3554            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3555       const char *Name = GI->getKeyData();
3556       DIE * Entity = GI->second;
3557       
3558       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3559       Asm->EmitInt32(Entity->getOffset());
3560       
3561       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3562       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3563     }
3564     
3565     Asm->OutStreamer.AddComment("End Mark");
3566     Asm->EmitInt32(0); 
3567     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3568                                                   TheCU->getID()));
3569   }
3570 }
3571
3572 /// emitDebugStr - Emit visible names into a debug str section.
3573 ///
3574 void DwarfDebug::emitDebugStr() {
3575   // Check to see if it is worth the effort.
3576   if (StringPool.empty()) return;
3577   
3578   // Start the dwarf str section.
3579   Asm->OutStreamer.SwitchSection(
3580                                 Asm->getObjFileLowering().getDwarfStrSection());
3581
3582   // Get all of the string pool entries and put them in an array by their ID so
3583   // we can sort them.
3584   SmallVector<std::pair<unsigned, 
3585       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3586   
3587   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3588        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3589     Entries.push_back(std::make_pair(I->second.second, &*I));
3590   
3591   array_pod_sort(Entries.begin(), Entries.end());
3592   
3593   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3594     // Emit a label for reference from debug information entries.
3595     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3596     
3597     // Emit the string itself.
3598     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3599   }
3600 }
3601
3602 /// emitDebugLoc - Emit visible names into a debug loc section.
3603 ///
3604 void DwarfDebug::emitDebugLoc() {
3605   if (DotDebugLocEntries.empty())
3606     return;
3607
3608   // Start the dwarf loc section.
3609   Asm->OutStreamer.SwitchSection(
3610     Asm->getObjFileLowering().getDwarfLocSection());
3611   unsigned char Size = Asm->getTargetData().getPointerSize();
3612   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3613   unsigned index = 1;
3614   for (SmallVector<DotDebugLocEntry, 4>::iterator 
3615          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end(); 
3616        I != E; ++I, ++index) {
3617     DotDebugLocEntry Entry = *I;
3618     if (Entry.isEmpty()) {
3619       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3620       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3621       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3622     } else {
3623       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3624       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3625       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3626       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3627       if (Reg < 32) {
3628         Asm->OutStreamer.AddComment("Loc expr size");
3629         Asm->EmitInt16(1);
3630         Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3631       } else {
3632         Asm->OutStreamer.AddComment("Loc expr size");
3633         Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3634         Asm->EmitInt8(dwarf::DW_OP_regx);
3635         Asm->EmitULEB128(Reg);
3636       }
3637     }
3638   }
3639 }
3640
3641 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3642 ///
3643 void DwarfDebug::EmitDebugARanges() {
3644   // Start the dwarf aranges section.
3645   Asm->OutStreamer.SwitchSection(
3646                           Asm->getObjFileLowering().getDwarfARangesSection());
3647 }
3648
3649 /// emitDebugRanges - Emit visible names into a debug ranges section.
3650 ///
3651 void DwarfDebug::emitDebugRanges() {
3652   // Start the dwarf ranges section.
3653   Asm->OutStreamer.SwitchSection(
3654     Asm->getObjFileLowering().getDwarfRangesSection());
3655   unsigned char Size = Asm->getTargetData().getPointerSize();
3656   for (SmallVector<const MCSymbol *, 8>::iterator
3657          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end(); 
3658        I != E; ++I) {
3659     if (*I)
3660       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3661     else
3662       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3663   }
3664 }
3665
3666 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3667 ///
3668 void DwarfDebug::emitDebugMacInfo() {
3669   if (const MCSection *LineInfo =
3670       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3671     // Start the dwarf macinfo section.
3672     Asm->OutStreamer.SwitchSection(LineInfo);
3673   }
3674 }
3675
3676 /// emitDebugInlineInfo - Emit inline info using following format.
3677 /// Section Header:
3678 /// 1. length of section
3679 /// 2. Dwarf version number
3680 /// 3. address size.
3681 ///
3682 /// Entries (one "entry" for each function that was inlined):
3683 ///
3684 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3685 ///   otherwise offset into __debug_str for regular function name.
3686 /// 2. offset into __debug_str section for regular function name.
3687 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3688 /// instances for the function.
3689 ///
3690 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3691 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3692 /// __debug_info section, and the low_pc is the starting address for the
3693 /// inlining instance.
3694 void DwarfDebug::emitDebugInlineInfo() {
3695   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3696     return;
3697
3698   if (!FirstCU)
3699     return;
3700
3701   Asm->OutStreamer.SwitchSection(
3702                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3703
3704   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3705   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3706                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3707
3708   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3709
3710   Asm->OutStreamer.AddComment("Dwarf Version");
3711   Asm->EmitInt16(dwarf::DWARF_VERSION);
3712   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3713   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3714
3715   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3716          E = InlinedSPNodes.end(); I != E; ++I) {
3717
3718     const MDNode *Node = *I;
3719     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3720       = InlineInfo.find(Node);
3721     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3722     DISubprogram SP(Node);
3723     StringRef LName = SP.getLinkageName();
3724     StringRef Name = SP.getName();
3725
3726     Asm->OutStreamer.AddComment("MIPS linkage name");
3727     if (LName.empty()) {
3728       Asm->OutStreamer.EmitBytes(Name, 0);
3729       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3730     } else 
3731       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3732                              DwarfStrSectionSym);
3733
3734     Asm->OutStreamer.AddComment("Function name");
3735     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3736     Asm->EmitULEB128(Labels.size(), "Inline count");
3737
3738     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3739            LE = Labels.end(); LI != LE; ++LI) {
3740       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3741       Asm->EmitInt32(LI->second->getOffset());
3742
3743       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3744       Asm->OutStreamer.EmitSymbolValue(LI->first,
3745                                        Asm->getTargetData().getPointerSize(),0);
3746     }
3747   }
3748
3749   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3750 }