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