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