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