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