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