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