add a EmitSymbolValue convenience method to MCStreamer.
[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 = MMI->MappedLabel(Scope->getStartLabelID());
1366   unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1367
1368   // Ignore empty scopes.
1369   if (StartID == EndID && StartID != 0)
1370     return NULL;
1371
1372   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1373   if (Scope->isAbstractScope())
1374     return ScopeDIE;
1375
1376   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1377            StartID ? getDWLabel("label", StartID)
1378                    : getDWLabel("func_begin", SubprogramCount));
1379   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1380            EndID ? getDWLabel("label", EndID)
1381                  : getDWLabel("func_end", SubprogramCount));
1382
1383   return ScopeDIE;
1384 }
1385
1386 /// constructInlinedScopeDIE - This scope represents inlined body of
1387 /// a function. Construct DIE to represent this concrete inlined copy
1388 /// of the function.
1389 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1390   unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1391   unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1392   assert (StartID && "Invalid starting label for an inlined scope!");
1393   assert (EndID && "Invalid end label for an inlined scope!");
1394   // Ignore empty scopes.
1395   if (StartID == EndID && StartID != 0)
1396     return NULL;
1397   if (!Scope->getScopeNode())
1398     return NULL;
1399   DIScope DS(Scope->getScopeNode());
1400   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1401
1402   DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1403   DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1404   assert (OriginDIE && "Unable to find Origin DIE!");
1405   addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1406               dwarf::DW_FORM_ref4, OriginDIE);
1407
1408   MCSymbol *StartLabel = getDWLabel("label", StartID);
1409   
1410   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1411   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1412            getDWLabel("label", EndID));
1413
1414   InlinedSubprogramDIEs.insert(OriginDIE);
1415
1416   // Track the start label for this inlined function.
1417   DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1418     I = InlineInfo.find(InlinedSP.getNode());
1419
1420   if (I == InlineInfo.end()) {
1421     InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1422                                                              ScopeDIE));
1423     InlinedSPNodes.push_back(InlinedSP.getNode());
1424   } else
1425     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1426
1427   StringPool.insert(InlinedSP.getName());
1428   StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1429
1430   DILocation DL(Scope->getInlinedAt());
1431   addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1432   addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1433
1434   return ScopeDIE;
1435 }
1436
1437
1438 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1439 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1440   // Get the descriptor.
1441   const DIVariable &VD = DV->getVariable();
1442   StringRef Name = VD.getName();
1443   if (Name.empty())
1444     return NULL;
1445
1446   // Translate tag to proper Dwarf tag.  The result variable is dropped for
1447   // now.
1448   unsigned Tag;
1449   switch (VD.getTag()) {
1450   case dwarf::DW_TAG_return_variable:
1451     return NULL;
1452   case dwarf::DW_TAG_arg_variable:
1453     Tag = dwarf::DW_TAG_formal_parameter;
1454     break;
1455   case dwarf::DW_TAG_auto_variable:    // fall thru
1456   default:
1457     Tag = dwarf::DW_TAG_variable;
1458     break;
1459   }
1460
1461   // Define variable debug information entry.
1462   DIE *VariableDie = new DIE(Tag);
1463
1464
1465   DIE *AbsDIE = NULL;
1466   if (DbgVariable *AV = DV->getAbstractVariable())
1467     AbsDIE = AV->getDIE();
1468
1469   if (AbsDIE) {
1470     DIScope DS(Scope->getScopeNode());
1471     DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1472     DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1473     (void) OriginSPDIE;
1474     assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1475     DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1476     assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
1477     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1478                 dwarf::DW_FORM_ref4, AbsDIE);
1479   }
1480   else {
1481     addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1482     addSourceLine(VariableDie, &VD);
1483
1484     // Add variable type.
1485     // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1486     // addresses instead.
1487     if (VD.isBlockByrefVariable())
1488       addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1489     else
1490       addType(VariableDie, VD.getType());
1491   }
1492
1493   // Add variable address.
1494   if (!Scope->isAbstractScope()) {
1495     MachineLocation Location;
1496     unsigned FrameReg;
1497     int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1498     Location.set(FrameReg, Offset);
1499
1500     if (VD.hasComplexAddress())
1501       addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1502     else if (VD.isBlockByrefVariable())
1503       addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1504     else
1505       addAddress(VariableDie, dwarf::DW_AT_location, Location);
1506   }
1507
1508   if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1509     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1510   DV->setDIE(VariableDie);
1511   return VariableDie;
1512
1513 }
1514
1515 void DwarfDebug::addPubTypes(DISubprogram SP) {
1516   DICompositeType SPTy = SP.getType();
1517   unsigned SPTag = SPTy.getTag();
1518   if (SPTag != dwarf::DW_TAG_subroutine_type) 
1519     return;
1520
1521   DIArray Args = SPTy.getTypeArray();
1522   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1523     DIType ATy(Args.getElement(i).getNode());
1524     if (!ATy.isValid())
1525       continue;
1526     DICompositeType CATy = getDICompositeType(ATy);
1527     if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1528       if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1529         ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1530     }
1531   }
1532 }
1533
1534 /// constructScopeDIE - Construct a DIE for this scope.
1535 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1536   if (!Scope || !Scope->getScopeNode())
1537     return NULL;
1538  
1539   DIScope DS(Scope->getScopeNode());
1540   DIE *ScopeDIE = NULL;
1541   if (Scope->getInlinedAt())
1542     ScopeDIE = constructInlinedScopeDIE(Scope);
1543   else if (DS.isSubprogram()) {
1544     if (Scope->isAbstractScope())
1545       ScopeDIE = ModuleCU->getDIE(DS.getNode());
1546     else
1547       ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1548   }
1549   else {
1550     ScopeDIE = constructLexicalScopeDIE(Scope);
1551     if (!ScopeDIE) return NULL;
1552   }
1553   
1554   // Add variables to scope.
1555   SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1556   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1557     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1558     if (VariableDIE)
1559       ScopeDIE->addChild(VariableDIE);
1560   }
1561
1562   // Add nested scopes.
1563   SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1564   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1565     // Define the Scope debug information entry.
1566     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1567     if (NestedDIE)
1568       ScopeDIE->addChild(NestedDIE);
1569   }
1570
1571   if (DS.isSubprogram()) 
1572     addPubTypes(DISubprogram(DS.getNode()));
1573  
1574  return ScopeDIE;
1575 }
1576
1577 /// GetOrCreateSourceID - Look up the source id with the given directory and
1578 /// source file names. If none currently exists, create a new id and insert it
1579 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1580 /// maps as well.
1581 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
1582   unsigned DId;
1583   StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1584   if (DI != DirectoryIdMap.end()) {
1585     DId = DI->getValue();
1586   } else {
1587     DId = DirectoryNames.size() + 1;
1588     DirectoryIdMap[DirName] = DId;
1589     DirectoryNames.push_back(DirName);
1590   }
1591
1592   unsigned FId;
1593   StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1594   if (FI != SourceFileIdMap.end()) {
1595     FId = FI->getValue();
1596   } else {
1597     FId = SourceFileNames.size() + 1;
1598     SourceFileIdMap[FileName] = FId;
1599     SourceFileNames.push_back(FileName);
1600   }
1601
1602   DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1603     SourceIdMap.find(std::make_pair(DId, FId));
1604   if (SI != SourceIdMap.end())
1605     return SI->second;
1606
1607   unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1608   SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1609   SourceIds.push_back(std::make_pair(DId, FId));
1610
1611   return SrcId;
1612 }
1613
1614 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1615 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1616   DIE *NDie = ModuleCU->getDIE(NS.getNode());
1617   if (NDie)
1618     return NDie;
1619   NDie = new DIE(dwarf::DW_TAG_namespace);
1620   ModuleCU->insertDIE(NS.getNode(), NDie);
1621   if (!NS.getName().empty())
1622     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1623   addSourceLine(NDie, &NS);
1624   addToContextOwner(NDie, NS.getContext());
1625   return NDie;
1626 }
1627
1628 CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
1629   DICompileUnit DIUnit(N);
1630   StringRef FN = DIUnit.getFilename();
1631   StringRef Dir = DIUnit.getDirectory();
1632   unsigned ID = GetOrCreateSourceID(Dir, FN);
1633
1634   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1635   // FIXME: Why getting the delta between two identical labels??
1636   addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1637                    getTempLabel("section_line"), getTempLabel("section_line"),
1638                    false);
1639   addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1640             DIUnit.getProducer());
1641   addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1642           DIUnit.getLanguage());
1643   addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1644
1645   if (!Dir.empty())
1646     addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1647   if (DIUnit.isOptimized())
1648     addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1649
1650   StringRef Flags = DIUnit.getFlags();
1651   if (!Flags.empty())
1652     addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1653
1654   unsigned RVer = DIUnit.getRunTimeVersion();
1655   if (RVer)
1656     addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1657             dwarf::DW_FORM_data1, RVer);
1658
1659   CompileUnit *Unit = new CompileUnit(ID, Die);
1660   if (!ModuleCU && DIUnit.isMain()) {
1661     // Use first compile unit marked as isMain as the compile unit
1662     // for this module.
1663     ModuleCU = Unit;
1664   }
1665
1666   return Unit;
1667 }
1668
1669 void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1670   DIGlobalVariable DI_GV(N);
1671
1672   // If debug information is malformed then ignore it.
1673   if (DI_GV.Verify() == false)
1674     return;
1675
1676   // Check for pre-existence.
1677   if (ModuleCU->getDIE(DI_GV.getNode()))
1678     return;
1679
1680   DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1681   if (!VariableDie)
1682     return;
1683
1684   // Add to map.
1685   ModuleCU->insertDIE(N, VariableDie);
1686
1687   // Add to context owner.
1688   DIDescriptor GVContext = DI_GV.getContext();
1689   // Do not create specification DIE if context is either compile unit
1690   // or a subprogram.
1691   if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1692       && !GVContext.isSubprogram()) {
1693     // Create specification DIE.
1694     DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1695     addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1696                 dwarf::DW_FORM_ref4, VariableDie);
1697     DIEBlock *Block = new DIEBlock();
1698     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1699     addLabel(Block, 0, dwarf::DW_FORM_udata,
1700              Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1701     addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1702     addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1703     ModuleCU->addDie(VariableSpecDIE);
1704   } else {
1705     DIEBlock *Block = new DIEBlock();
1706     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1707     addLabel(Block, 0, dwarf::DW_FORM_udata,
1708              Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1709     addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1710   }
1711   addToContextOwner(VariableDie, GVContext);
1712   
1713   // Expose as global. FIXME - need to check external flag.
1714   ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1715
1716   DIType GTy = DI_GV.getType();
1717   if (GTy.isCompositeType() && !GTy.getName().empty()) {
1718     DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1719     assert (Entry && "Missing global type!");
1720     ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1721   }
1722   return;
1723 }
1724
1725 void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1726   DISubprogram SP(N);
1727
1728   // Check for pre-existence.
1729   if (ModuleCU->getDIE(N))
1730     return;
1731
1732   if (!SP.isDefinition())
1733     // This is a method declaration which will be handled while constructing
1734     // class type.
1735     return;
1736
1737   DIE *SubprogramDie = createSubprogramDIE(SP);
1738
1739   // Add to map.
1740   ModuleCU->insertDIE(N, SubprogramDie);
1741
1742   // Add to context owner.
1743   addToContextOwner(SubprogramDie, SP.getContext());
1744
1745   // Expose as global.
1746   ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1747
1748   return;
1749 }
1750
1751 /// beginModule - Emit all Dwarf sections that should come prior to the
1752 /// content. Create global DIEs and emit initial debug info sections.
1753 /// This is inovked by the target AsmPrinter.
1754 void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1755   this->M = M;
1756
1757   if (TimePassesIsEnabled)
1758     DebugTimer->startTimer();
1759
1760   if (!MAI->doesSupportDebugInformation())
1761     return;
1762
1763   DebugInfoFinder DbgFinder;
1764   DbgFinder.processModule(*M);
1765
1766   // Create all the compile unit DIEs.
1767   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1768          E = DbgFinder.compile_unit_end(); I != E; ++I)
1769     constructCompileUnit(*I);
1770
1771   if (!ModuleCU)
1772     return;
1773
1774   // Create DIEs for each subprogram.
1775   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1776          E = DbgFinder.subprogram_end(); I != E; ++I)
1777     constructSubprogramDIE(*I);
1778
1779   // Create DIEs for each global variable.
1780   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1781          E = DbgFinder.global_variable_end(); I != E; ++I)
1782     constructGlobalVariableDIE(*I);
1783
1784   MMI = mmi;
1785   shouldEmit = true;
1786   MMI->setDebugInfoAvailability(true);
1787
1788   // Prime section data.
1789   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1790
1791   // Print out .file directives to specify files for .loc directives. These are
1792   // printed out early so that they precede any .loc directives.
1793   if (MAI->hasDotLocAndDotFile()) {
1794     for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1795       // Remember source id starts at 1.
1796       std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1797       // FIXME: don't use sys::path for this!  This should not depend on the
1798       // host.
1799       sys::Path FullPath(getSourceDirectoryName(Id.first));
1800       bool AppendOk =
1801         FullPath.appendComponent(getSourceFileName(Id.second));
1802       assert(AppendOk && "Could not append filename to directory!");
1803       AppendOk = false;
1804       Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1805     }
1806   }
1807
1808   // Emit initial sections
1809   emitInitial();
1810
1811   if (TimePassesIsEnabled)
1812     DebugTimer->stopTimer();
1813 }
1814
1815 /// endModule - Emit all Dwarf sections that should come after the content.
1816 ///
1817 void DwarfDebug::endModule() {
1818   if (!ModuleCU)
1819     return;
1820
1821   if (TimePassesIsEnabled)
1822     DebugTimer->startTimer();
1823
1824   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1825   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1826          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1827     DIE *ISP = *AI;
1828     addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1829   }
1830
1831   // Insert top level DIEs.
1832   for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1833          TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1834     ModuleCU->getCUDie()->addChild(*TI);
1835
1836   for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1837          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1838     DIE *SPDie = CI->first;
1839     MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1840     if (!N) continue;
1841     DIE *NDie = ModuleCU->getDIE(N);
1842     if (!NDie) continue;
1843     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1844     // FIXME - This is not the correct approach.
1845     // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1846   }
1847
1848   // Standard sections final addresses.
1849   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1850   Asm->OutStreamer.EmitLabel(getTempLabel("text_end"));
1851   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1852   Asm->OutStreamer.EmitLabel(getTempLabel("data_end"));
1853
1854   // End text sections.
1855   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1856     Asm->OutStreamer.SwitchSection(SectionMap[i]);
1857     Asm->OutStreamer.EmitLabel(getDWLabel("section_end", i));
1858   }
1859
1860   // Emit common frame information.
1861   emitCommonDebugFrame();
1862
1863   // Emit function debug frame information
1864   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1865          E = DebugFrames.end(); I != E; ++I)
1866     emitFunctionDebugFrame(*I);
1867
1868   // Compute DIE offsets and sizes.
1869   computeSizeAndOffsets();
1870
1871   // Emit all the DIEs into a debug info section
1872   emitDebugInfo();
1873
1874   // Corresponding abbreviations into a abbrev section.
1875   emitAbbreviations();
1876
1877   // Emit source line correspondence into a debug line section.
1878   emitDebugLines();
1879
1880   // Emit info into a debug pubnames section.
1881   emitDebugPubNames();
1882
1883   // Emit info into a debug pubtypes section.
1884   emitDebugPubTypes();
1885
1886   // Emit info into a debug str section.
1887   emitDebugStr();
1888
1889   // Emit info into a debug loc section.
1890   emitDebugLoc();
1891
1892   // Emit info into a debug aranges section.
1893   EmitDebugARanges();
1894
1895   // Emit info into a debug ranges section.
1896   emitDebugRanges();
1897
1898   // Emit info into a debug macinfo section.
1899   emitDebugMacInfo();
1900
1901   // Emit inline info.
1902   emitDebugInlineInfo();
1903
1904   if (TimePassesIsEnabled)
1905     DebugTimer->stopTimer();
1906 }
1907
1908 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1909 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1910                                               unsigned FrameIdx,
1911                                               DILocation &ScopeLoc) {
1912
1913   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1914   if (AbsDbgVariable)
1915     return AbsDbgVariable;
1916
1917   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1918   if (!Scope)
1919     return NULL;
1920
1921   AbsDbgVariable = new DbgVariable(Var, FrameIdx);
1922   Scope->addVariable(AbsDbgVariable);
1923   AbstractVariables[Var.getNode()] = AbsDbgVariable;
1924   return AbsDbgVariable;
1925 }
1926
1927 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1928 void DwarfDebug::collectVariableInfo() {
1929   if (!MMI) return;
1930
1931   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1932   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1933          VE = VMap.end(); VI != VE; ++VI) {
1934     MDNode *Var = VI->first;
1935     if (!Var) continue;
1936     DIVariable DV (Var);
1937     std::pair< unsigned, MDNode *> VP = VI->second;
1938     DILocation ScopeLoc(VP.second);
1939
1940     DbgScope *Scope =
1941       ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1942     if (!Scope)
1943       Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1944     // If variable scope is not found then skip this variable.
1945     if (!Scope)
1946       continue;
1947
1948     DbgVariable *RegVar = new DbgVariable(DV, VP.first);
1949     Scope->addVariable(RegVar);
1950     if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1951                                                            ScopeLoc))
1952       RegVar->setAbstractVariable(AbsDbgVariable);
1953   }
1954 }
1955
1956 /// beginScope - Process beginning of a scope starting at Label.
1957 void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
1958   InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1959   if (I == DbgScopeBeginMap.end())
1960     return;
1961   ScopeVector &SD = I->second;
1962   for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
1963        SDI != SDE; ++SDI)
1964     (*SDI)->setStartLabelID(Label);
1965 }
1966
1967 /// endScope - Process end of a scope.
1968 void DwarfDebug::endScope(const MachineInstr *MI) {
1969   InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
1970   if (I == DbgScopeEndMap.end())
1971     return;
1972
1973   unsigned Label = MMI->NextLabelID();
1974   Asm->printLabel(Label);
1975   O << '\n';
1976
1977   SmallVector<DbgScope *, 2> &SD = I->second;
1978   for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1979        SDI != SDE; ++SDI)
1980     (*SDI)->setEndLabelID(Label);
1981   return;
1982 }
1983
1984 /// createDbgScope - Create DbgScope for the scope.
1985 void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
1986
1987   if (!InlinedAt) {
1988     DbgScope *WScope = DbgScopeMap.lookup(Scope);
1989     if (WScope)
1990       return;
1991     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1992     DbgScopeMap.insert(std::make_pair(Scope, WScope));
1993     if (DIDescriptor(Scope).isLexicalBlock())
1994       createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
1995     return;
1996   }
1997
1998   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1999   if (WScope)
2000     return;
2001
2002   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2003   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2004   DILocation DL(InlinedAt);
2005   createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2006 }
2007
2008 /// extractScopeInformation - Scan machine instructions in this function
2009 /// and collect DbgScopes. Return true, if atleast one scope was found.
2010 bool DwarfDebug::extractScopeInformation() {
2011   // If scope information was extracted using .dbg intrinsics then there is not
2012   // any need to extract these information by scanning each instruction.
2013   if (!DbgScopeMap.empty())
2014     return false;
2015
2016   DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2017   unsigned MIIndex = 0;
2018   // Scan each instruction and create scopes. First build working set of scopes.
2019   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2020        I != E; ++I) {
2021     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2022          II != IE; ++II) {
2023       const MachineInstr *MInsn = II;
2024       MIIndexMap[MInsn] = MIIndex++;
2025       DebugLoc DL = MInsn->getDebugLoc();
2026       if (DL.isUnknown()) continue;
2027       DILocation DLT = MF->getDILocation(DL);
2028       DIScope DLTScope = DLT.getScope();
2029       // There is no need to create another DIE for compile unit. For all
2030       // other scopes, create one DbgScope now. This will be translated
2031       // into a scope DIE at the end.
2032       if (DLTScope.isCompileUnit()) continue;
2033       createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2034     }
2035   }
2036
2037
2038   // Build scope hierarchy using working set of scopes.
2039   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2040        I != E; ++I) {
2041     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2042          II != IE; ++II) {
2043       const MachineInstr *MInsn = II;
2044       DebugLoc DL = MInsn->getDebugLoc();
2045       if (DL.isUnknown())  continue;
2046       DILocation DLT = MF->getDILocation(DL);
2047       DIScope DLTScope = DLT.getScope();
2048       // There is no need to create another DIE for compile unit. For all
2049       // other scopes, create one DbgScope now. This will be translated
2050       // into a scope DIE at the end.
2051       if (DLTScope.isCompileUnit()) continue;
2052       DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn, 
2053                                            DLT.getOrigLocation().getNode());
2054       Scope->setLastInsn(MInsn);
2055     }
2056   }
2057
2058   if (!CurrentFnDbgScope)
2059     return false;
2060
2061   CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2062
2063   // Each scope has first instruction and last instruction to mark beginning
2064   // and end of a scope respectively. Create an inverse map that list scopes
2065   // starts (and ends) with an instruction. One instruction may start (or end)
2066   // multiple scopes. Ignore scopes that are not reachable.
2067   SmallVector<DbgScope *, 4> WorkList;
2068   WorkList.push_back(CurrentFnDbgScope);
2069   while (!WorkList.empty()) {
2070     DbgScope *S = WorkList.back(); WorkList.pop_back();
2071
2072     SmallVector<DbgScope *, 4> &Children = S->getScopes();
2073     if (!Children.empty()) 
2074       for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2075              SE = Children.end(); SI != SE; ++SI)
2076         WorkList.push_back(*SI);
2077
2078     if (S->isAbstractScope())
2079       continue;
2080     const MachineInstr *MI = S->getFirstInsn();
2081     assert (MI && "DbgScope does not have first instruction!");
2082
2083     InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2084     if (IDI != DbgScopeBeginMap.end())
2085       IDI->second.push_back(S);
2086     else
2087       DbgScopeBeginMap[MI].push_back(S);
2088
2089     MI = S->getLastInsn();
2090     assert (MI && "DbgScope does not have last instruction!");
2091     IDI = DbgScopeEndMap.find(MI);
2092     if (IDI != DbgScopeEndMap.end())
2093       IDI->second.push_back(S);
2094     else
2095       DbgScopeEndMap[MI].push_back(S);
2096   }
2097
2098   return !DbgScopeMap.empty();
2099 }
2100
2101 /// beginFunction - Gather pre-function debug information.  Assumes being
2102 /// emitted immediately after the function entry point.
2103 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2104   this->MF = MF;
2105
2106   if (!ShouldEmitDwarfDebug()) return;
2107
2108   if (TimePassesIsEnabled)
2109     DebugTimer->startTimer();
2110
2111   if (!extractScopeInformation())
2112     return;
2113
2114   collectVariableInfo();
2115
2116   // Assumes in correct section after the entry point.
2117   Asm->OutStreamer.EmitLabel(getDWLabel("func_begin", ++SubprogramCount));
2118
2119   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2120   // function.
2121   DebugLoc FDL = MF->getDefaultDebugLoc();
2122   if (!FDL.isUnknown()) {
2123     DILocation DLT = MF->getDILocation(FDL);
2124     unsigned LabelID = 0;
2125     DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2126     if (SP.Verify())
2127       LabelID = recordSourceLine(SP.getLineNumber(), 0, 
2128                                  DLT.getScope().getNode());
2129     else
2130       LabelID = recordSourceLine(DLT.getLineNumber(), 
2131                                  DLT.getColumnNumber(), 
2132                                  DLT.getScope().getNode());
2133     Asm->printLabel(LabelID);
2134     O << '\n';
2135   }
2136   if (TimePassesIsEnabled)
2137     DebugTimer->stopTimer();
2138 }
2139
2140 /// endFunction - Gather and emit post-function debug information.
2141 ///
2142 void DwarfDebug::endFunction(const MachineFunction *MF) {
2143   if (!ShouldEmitDwarfDebug()) return;
2144
2145   if (TimePassesIsEnabled)
2146     DebugTimer->startTimer();
2147
2148   if (DbgScopeMap.empty())
2149     return;
2150
2151   if (CurrentFnDbgScope) {
2152     // Define end label for subprogram.
2153     Asm->OutStreamer.EmitLabel(getDWLabel("func_end", SubprogramCount));
2154     
2155     // Get function line info.
2156     if (!Lines.empty()) {
2157       // Get section line info.
2158       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2159       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2160       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2161       // Append the function info to section info.
2162       SectionLineInfos.insert(SectionLineInfos.end(),
2163                               Lines.begin(), Lines.end());
2164     }
2165     
2166     // Construct abstract scopes.
2167     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2168            AE = AbstractScopesList.end(); AI != AE; ++AI)
2169       constructScopeDIE(*AI);
2170     
2171     constructScopeDIE(CurrentFnDbgScope);
2172     
2173     DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2174                                                  MMI->getFrameMoves()));
2175   }
2176
2177   // Clear debug info
2178   CurrentFnDbgScope = NULL;
2179   DbgScopeMap.clear();
2180   DbgScopeBeginMap.clear();
2181   DbgScopeEndMap.clear();
2182   ConcreteScopes.clear();
2183   AbstractScopesList.clear();
2184   Lines.clear();
2185   
2186   if (TimePassesIsEnabled)
2187     DebugTimer->stopTimer();
2188 }
2189
2190 /// recordSourceLine - Records location information and associates it with a
2191 /// label. Returns a unique label ID used to generate a label and provide
2192 /// correspondence to the source line list.
2193 unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2194                                       MDNode *S) {
2195   if (!MMI)
2196     return 0;
2197
2198   if (TimePassesIsEnabled)
2199     DebugTimer->startTimer();
2200
2201   StringRef Dir;
2202   StringRef Fn;
2203
2204   DIDescriptor Scope(S);
2205   if (Scope.isCompileUnit()) {
2206     DICompileUnit CU(S);
2207     Dir = CU.getDirectory();
2208     Fn = CU.getFilename();
2209   } else if (Scope.isSubprogram()) {
2210     DISubprogram SP(S);
2211     Dir = SP.getDirectory();
2212     Fn = SP.getFilename();
2213   } else if (Scope.isLexicalBlock()) {
2214     DILexicalBlock DB(S);
2215     Dir = DB.getDirectory();
2216     Fn = DB.getFilename();
2217   } else
2218     assert (0 && "Unexpected scope info");
2219
2220   unsigned Src = GetOrCreateSourceID(Dir, Fn);
2221   unsigned ID = MMI->NextLabelID();
2222   Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2223
2224   if (TimePassesIsEnabled)
2225     DebugTimer->stopTimer();
2226
2227   return ID;
2228 }
2229
2230 /// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2231 /// timed. Look up the source id with the given directory and source file
2232 /// names. If none currently exists, create a new id and insert it in the
2233 /// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2234 /// well.
2235 unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2236                                          const std::string &FileName) {
2237   if (TimePassesIsEnabled)
2238     DebugTimer->startTimer();
2239
2240   unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2241
2242   if (TimePassesIsEnabled)
2243     DebugTimer->stopTimer();
2244
2245   return SrcId;
2246 }
2247
2248 //===----------------------------------------------------------------------===//
2249 // Emit Methods
2250 //===----------------------------------------------------------------------===//
2251
2252 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2253 ///
2254 unsigned
2255 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2256   // Get the children.
2257   const std::vector<DIE *> &Children = Die->getChildren();
2258
2259   // If not last sibling and has children then add sibling offset attribute.
2260   if (!Last && !Children.empty()) Die->addSiblingOffset();
2261
2262   // Record the abbreviation.
2263   assignAbbrevNumber(Die->getAbbrev());
2264
2265   // Get the abbreviation for this DIE.
2266   unsigned AbbrevNumber = Die->getAbbrevNumber();
2267   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2268
2269   // Set DIE offset
2270   Die->setOffset(Offset);
2271
2272   // Start the size with the size of abbreviation code.
2273   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2274
2275   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2276   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2277
2278   // Size the DIE attribute values.
2279   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2280     // Size attribute value.
2281     Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2282
2283   // Size the DIE children if any.
2284   if (!Children.empty()) {
2285     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2286            "Children flag not set");
2287
2288     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2289       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2290
2291     // End of children marker.
2292     Offset += sizeof(int8_t);
2293   }
2294
2295   Die->setSize(Offset - Die->getOffset());
2296   return Offset;
2297 }
2298
2299 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2300 ///
2301 void DwarfDebug::computeSizeAndOffsets() {
2302   // Compute size of compile unit header.
2303   static unsigned Offset =
2304     sizeof(int32_t) + // Length of Compilation Unit Info
2305     sizeof(int16_t) + // DWARF version number
2306     sizeof(int32_t) + // Offset Into Abbrev. Section
2307     sizeof(int8_t);   // Pointer Size (in bytes)
2308
2309   computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2310   CompileUnitOffsets[ModuleCU] = 0;
2311 }
2312
2313 /// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2314 /// tools to recognize the object file contains Dwarf information.
2315 void DwarfDebug::emitInitial() {
2316   // Check to see if we already emitted intial headers.
2317   if (didInitial) return;
2318   didInitial = true;
2319
2320   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2321
2322   // Dwarf sections base addresses.
2323   if (MAI->doesDwarfRequireFrameSection()) {
2324     Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2325     Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2326   }
2327
2328   Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2329   Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2330   Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2331   Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2332   Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2333   Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2334
2335   if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2336     Asm->OutStreamer.SwitchSection(LineInfoDirective);
2337     Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2338   }
2339
2340   Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2341   Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2342   Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2343   Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2344   Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2345   Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2346   Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2347   Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2348   Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2349   Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2350   Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2351   Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2352
2353   Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2354   Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2355   Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2356   Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2357 }
2358
2359 /// emitDIE - Recusively Emits a debug information entry.
2360 ///
2361 void DwarfDebug::emitDIE(DIE *Die) {
2362   // Get the abbreviation for this DIE.
2363   unsigned AbbrevNumber = Die->getAbbrevNumber();
2364   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2365
2366   Asm->O << '\n';
2367
2368   // Emit the code (index) for the abbreviation.
2369   if (Asm->VerboseAsm)
2370     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2371                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
2372                                 Twine::utohexstr(Die->getSize()) + " " +
2373                                 dwarf::TagString(Abbrev->getTag()));
2374   EmitULEB128(AbbrevNumber);
2375
2376   SmallVector<DIEValue*, 32> &Values = Die->getValues();
2377   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2378
2379   // Emit the DIE attribute values.
2380   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2381     unsigned Attr = AbbrevData[i].getAttribute();
2382     unsigned Form = AbbrevData[i].getForm();
2383     assert(Form && "Too many attributes for DIE (check abbreviation)");
2384
2385     if (Asm->VerboseAsm)
2386       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2387     
2388     switch (Attr) {
2389     case dwarf::DW_AT_sibling:
2390       Asm->EmitInt32(Die->getSiblingOffset());
2391       break;
2392     case dwarf::DW_AT_abstract_origin: {
2393       DIEEntry *E = cast<DIEEntry>(Values[i]);
2394       DIE *Origin = E->getEntry();
2395       unsigned Addr = Origin->getOffset();
2396       Asm->EmitInt32(Addr);
2397       break;
2398     }
2399     default:
2400       // Emit an attribute using the defined form.
2401       Values[i]->EmitValue(this, Form);
2402       O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
2403       break;
2404     }
2405   }
2406
2407   // Emit the DIE children if any.
2408   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2409     const std::vector<DIE *> &Children = Die->getChildren();
2410
2411     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2412       emitDIE(Children[j]);
2413
2414     Asm->EmitInt8(0); EOL("End Of Children Mark");
2415   }
2416 }
2417
2418 /// emitDebugInfo - Emit the debug info section.
2419 ///
2420 void DwarfDebug::emitDebugInfo() {
2421   // Start debug info section.
2422   Asm->OutStreamer.SwitchSection(
2423                             Asm->getObjFileLowering().getDwarfInfoSection());
2424   DIE *Die = ModuleCU->getCUDie();
2425
2426   // Emit the compile units header.
2427   Asm->OutStreamer.EmitLabel(getDWLabel("info_begin", ModuleCU->getID()));
2428
2429   // Emit size of content not including length itself
2430   unsigned ContentSize = Die->getSize() +
2431     sizeof(int16_t) + // DWARF version number
2432     sizeof(int32_t) + // Offset Into Abbrev. Section
2433     sizeof(int8_t) +  // Pointer Size (in bytes)
2434     sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2435
2436   Asm->EmitInt32(ContentSize);  EOL("Length of Compilation Unit Info");
2437   Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2438   EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2439                     true, false);
2440   EOL("Offset Into Abbrev. Section");
2441   Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2442
2443   emitDIE(Die);
2444   // FIXME - extra padding for gdb bug.
2445   Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2446   Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2447   Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2448   Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2449   Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2450   Asm->O << '\n';
2451 }
2452
2453 /// emitAbbreviations - Emit the abbreviation section.
2454 ///
2455 void DwarfDebug::emitAbbreviations() const {
2456   // Check to see if it is worth the effort.
2457   if (!Abbreviations.empty()) {
2458     // Start the debug abbrev section.
2459     Asm->OutStreamer.SwitchSection(
2460                             Asm->getObjFileLowering().getDwarfAbbrevSection());
2461
2462     Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2463
2464     // For each abbrevation.
2465     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2466       // Get abbreviation data
2467       const DIEAbbrev *Abbrev = Abbreviations[i];
2468
2469       // Emit the abbrevations code (base 1 index.)
2470       EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2471
2472       // Emit the abbreviations data.
2473       Abbrev->Emit(this);
2474       Asm->O << '\n';
2475     }
2476
2477     // Mark end of abbreviations.
2478     EmitULEB128(0, "EOM(3)");
2479
2480     Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2481   }
2482 }
2483
2484 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2485 /// the line matrix.
2486 ///
2487 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2488   // Define last address of section.
2489   Asm->EmitInt8(0); EOL("Extended Op");
2490   Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2491   Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2492   EmitReference(getDWLabel("section_end", SectionEnd));
2493   EOL("Section end label");
2494
2495   // Mark end of matrix.
2496   Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
2497   Asm->EmitInt8(1);
2498   Asm->EmitInt8(1);
2499 }
2500
2501 /// emitDebugLines - Emit source line information.
2502 ///
2503 void DwarfDebug::emitDebugLines() {
2504   // If the target is using .loc/.file, the assembler will be emitting the
2505   // .debug_line table automatically.
2506   if (MAI->hasDotLocAndDotFile())
2507     return;
2508
2509   // Minimum line delta, thus ranging from -10..(255-10).
2510   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2511   // Maximum line delta, thus ranging from -10..(255-10).
2512   const int MaxLineDelta = 255 + MinLineDelta;
2513
2514   // Start the dwarf line section.
2515   Asm->OutStreamer.SwitchSection(
2516                             Asm->getObjFileLowering().getDwarfLineSection());
2517
2518   // Construct the section header.
2519   EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2520   EOL("Length of Source Line Info");
2521   Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2522
2523   Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2524
2525   EmitDifference(getTempLabel("line_prolog_end"),
2526                  getTempLabel("line_prolog_begin"), true);
2527   EOL("Prolog Length");
2528   Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2529
2530   Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2531   Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2532   Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2533   Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2534   Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2535
2536   // Line number standard opcode encodings argument count
2537   Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2538   Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2539   Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2540   Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2541   Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2542   Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2543   Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2544   Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2545   Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2546
2547   // Emit directories.
2548   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2549     const std::string &Dir = getSourceDirectoryName(DI);
2550     if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2551     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2552   }
2553
2554   Asm->EmitInt8(0); EOL("End of directories");
2555
2556   // Emit files.
2557   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2558     // Remember source id starts at 1.
2559     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2560     const std::string &FN = getSourceFileName(Id.second);
2561     if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2562     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2563     
2564     EmitULEB128(Id.first, "Directory #");
2565     EmitULEB128(0, "Mod date");
2566     EmitULEB128(0, "File size");
2567   }
2568
2569   Asm->EmitInt8(0); EOL("End of files");
2570
2571   Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2572
2573   // A sequence for each text section.
2574   unsigned SecSrcLinesSize = SectionSourceLines.size();
2575
2576   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2577     // Isolate current sections line info.
2578     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2579
2580     /*if (Asm->isVerbose()) {
2581       const MCSection *S = SectionMap[j + 1];
2582       O << '\t' << MAI->getCommentString() << " Section"
2583         << S->getName() << '\n';
2584     }*/
2585     Asm->O << '\n';
2586
2587     // Dwarf assumes we start with first line of first source file.
2588     unsigned Source = 1;
2589     unsigned Line = 1;
2590
2591     // Construct rows of the address, source, line, column matrix.
2592     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2593       const SrcLineInfo &LineInfo = LineInfos[i];
2594       unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2595       if (!LabelID) continue;
2596
2597       if (LineInfo.getLine() == 0) continue;
2598
2599       if (!Asm->isVerbose())
2600         Asm->O << '\n';
2601       else {
2602         std::pair<unsigned, unsigned> SourceID =
2603           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2604         O << '\t' << MAI->getCommentString() << ' '
2605           << getSourceDirectoryName(SourceID.first) << '/'
2606           << getSourceFileName(SourceID.second)
2607           << ':' << utostr_32(LineInfo.getLine()) << '\n';
2608       }
2609
2610       // Define the line address.
2611       Asm->EmitInt8(0); EOL("Extended Op");
2612       Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2613       Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2614       EmitReference(getDWLabel("label", LabelID)); EOL("Location label");
2615
2616       // If change of source, then switch to the new source.
2617       if (Source != LineInfo.getSourceID()) {
2618         Source = LineInfo.getSourceID();
2619         Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
2620         EmitULEB128(Source, "New Source");
2621       }
2622
2623       // If change of line.
2624       if (Line != LineInfo.getLine()) {
2625         // Determine offset.
2626         int Offset = LineInfo.getLine() - Line;
2627         int Delta = Offset - MinLineDelta;
2628
2629         // Update line.
2630         Line = LineInfo.getLine();
2631
2632         // If delta is small enough and in range...
2633         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2634           // ... then use fast opcode.
2635           Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2636         } else {
2637           // ... otherwise use long hand.
2638           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2639           EOL("DW_LNS_advance_line");
2640           EmitSLEB128(Offset, "Line Offset");
2641           Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2642         }
2643       } else {
2644         // Copy the previous row (different address or source)
2645         Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2646       }
2647     }
2648
2649     emitEndOfLineMatrix(j + 1);
2650   }
2651
2652   if (SecSrcLinesSize == 0)
2653     // Because we're emitting a debug_line section, we still need a line
2654     // table. The linker and friends expect it to exist. If there's nothing to
2655     // put into it, emit an empty table.
2656     emitEndOfLineMatrix(1);
2657
2658   Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2659 }
2660
2661 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2662 ///
2663 void DwarfDebug::emitCommonDebugFrame() {
2664   if (!MAI->doesDwarfRequireFrameSection())
2665     return;
2666
2667   int stackGrowth =
2668     Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2669       TargetFrameInfo::StackGrowsUp ?
2670     TD->getPointerSize() : -TD->getPointerSize();
2671
2672   // Start the dwarf frame section.
2673   Asm->OutStreamer.SwitchSection(
2674                               Asm->getObjFileLowering().getDwarfFrameSection());
2675
2676   Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2677   EmitDifference(getTempLabel("debug_frame_common_end"),
2678                  getTempLabel("debug_frame_common_begin"), true);
2679   EOL("Length of Common Information Entry");
2680
2681   Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2682   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2683   EOL("CIE Identifier Tag");
2684   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2685   EOL("CIE Version");
2686   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2687   EOL("CIE Augmentation");
2688   EmitULEB128(1, "CIE Code Alignment Factor");
2689   EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2690   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2691   EOL("CIE RA Column");
2692
2693   std::vector<MachineMove> Moves;
2694   RI->getInitialFrameState(Moves);
2695
2696   EmitFrameMoves(NULL, 0, Moves, false);
2697
2698   Asm->EmitAlignment(2, 0, 0, false);
2699   Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2700 }
2701
2702 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2703 /// section.
2704 void
2705 DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
2706   if (!MAI->doesDwarfRequireFrameSection())
2707     return;
2708
2709   // Start the dwarf frame section.
2710   Asm->OutStreamer.SwitchSection(
2711                               Asm->getObjFileLowering().getDwarfFrameSection());
2712
2713   EmitDifference(getDWLabel("debug_frame_end", DebugFrameInfo.Number),
2714                  getDWLabel("debug_frame_begin", DebugFrameInfo.Number), true);
2715   EOL("Length of Frame Information Entry");
2716
2717   Asm->OutStreamer.EmitLabel(getDWLabel("debug_frame_begin",
2718                                         DebugFrameInfo.Number));
2719
2720   EmitSectionOffset(getTempLabel("debug_frame_common"),
2721                     getTempLabel("section_debug_frame"), true, false);
2722   EOL("FDE CIE offset");
2723
2724   EmitReference(getDWLabel("func_begin", DebugFrameInfo.Number));
2725   EOL("FDE initial location");
2726   EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number),
2727                  getDWLabel("func_begin", DebugFrameInfo.Number));
2728   EOL("FDE address range");
2729
2730   EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2731                  false);
2732
2733   Asm->EmitAlignment(2, 0, 0, false);
2734   Asm->OutStreamer.EmitLabel(getDWLabel("debug_frame_end",
2735                                         DebugFrameInfo.Number));
2736 }
2737
2738 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2739 ///
2740 void DwarfDebug::emitDebugPubNames() {
2741   // Start the dwarf pubnames section.
2742   Asm->OutStreamer.SwitchSection(
2743                           Asm->getObjFileLowering().getDwarfPubNamesSection());
2744
2745   EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2746                  getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2747   EOL("Length of Public Names Info");
2748
2749   Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2750
2751   Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2752
2753   EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()), 
2754                     getTempLabel("section_info"),
2755                     true, false);
2756   EOL("Offset of Compilation Unit Info");
2757
2758   EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2759                  getDWLabel("info_begin", ModuleCU->getID()),
2760                  true);
2761   EOL("Compilation Unit Length");
2762
2763   const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2764   for (StringMap<DIE*>::const_iterator
2765          GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2766     const char *Name = GI->getKeyData();
2767     DIE * Entity = GI->second;
2768
2769     Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2770     
2771     if (Asm->VerboseAsm)
2772       Asm->OutStreamer.AddComment("External Name");
2773     Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2774   }
2775
2776   Asm->EmitInt32(0); EOL("End Mark");
2777   Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2778 }
2779
2780 void DwarfDebug::emitDebugPubTypes() {
2781   // Start the dwarf pubnames section.
2782   Asm->OutStreamer.SwitchSection(
2783                           Asm->getObjFileLowering().getDwarfPubTypesSection());
2784   EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2785                  getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2786   EOL("Length of Public Types Info");
2787
2788   Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2789
2790   if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2791   Asm->EmitInt16(dwarf::DWARF_VERSION);
2792
2793   EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2794                     getTempLabel("section_info"), true, false);
2795   EOL("Offset of Compilation ModuleCU Info");
2796
2797   EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2798                  getDWLabel("info_begin", ModuleCU->getID()),
2799                  true);
2800   EOL("Compilation ModuleCU Length");
2801
2802   const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2803   for (StringMap<DIE*>::const_iterator
2804          GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2805     const char *Name = GI->getKeyData();
2806     DIE * Entity = GI->second;
2807
2808     if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2809     Asm->EmitInt32(Entity->getOffset());
2810     
2811     if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2812     Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2813   }
2814
2815   Asm->EmitInt32(0); EOL("End Mark");
2816   Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2817 }
2818
2819 /// emitDebugStr - Emit visible names into a debug str section.
2820 ///
2821 void DwarfDebug::emitDebugStr() {
2822   // Check to see if it is worth the effort.
2823   if (!StringPool.empty()) {
2824     // Start the dwarf str section.
2825     Asm->OutStreamer.SwitchSection(
2826                                 Asm->getObjFileLowering().getDwarfStrSection());
2827
2828     // For each of strings in the string pool.
2829     for (unsigned StringID = 1, N = StringPool.size();
2830          StringID <= N; ++StringID) {
2831       // Emit a label for reference from debug information entries.
2832       Asm->OutStreamer.EmitLabel(getDWLabel("string", StringID));
2833
2834       // Emit the string itself.
2835       const std::string &String = StringPool[StringID];
2836       Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
2837     }
2838
2839     Asm->O << '\n';
2840   }
2841 }
2842
2843 /// emitDebugLoc - Emit visible names into a debug loc section.
2844 ///
2845 void DwarfDebug::emitDebugLoc() {
2846   // Start the dwarf loc section.
2847   Asm->OutStreamer.SwitchSection(
2848                               Asm->getObjFileLowering().getDwarfLocSection());
2849 }
2850
2851 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2852 ///
2853 void DwarfDebug::EmitDebugARanges() {
2854   // Start the dwarf aranges section.
2855   Asm->OutStreamer.SwitchSection(
2856                           Asm->getObjFileLowering().getDwarfARangesSection());
2857
2858   // FIXME - Mock up
2859 #if 0
2860   CompileUnit *Unit = GetBaseCompileUnit();
2861
2862   // Don't include size of length
2863   Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2864
2865   Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2866
2867   EmitReference("info_begin", Unit->getID());
2868   EOL("Offset of Compilation Unit Info");
2869
2870   Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
2871
2872   Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
2873
2874   Asm->EmitInt16(0);  EOL("Pad (1)");
2875   Asm->EmitInt16(0);  EOL("Pad (2)");
2876
2877   // Range 1
2878   EmitReference("text_begin", 0); EOL("Address");
2879   EmitDifference(getTempLabel("text_end"), getTempLabel("text_begin"),
2880                  true); EOL("Length");
2881
2882   Asm->EmitInt32(0); EOL("EOM (1)");
2883   Asm->EmitInt32(0); EOL("EOM (2)");
2884 #endif
2885 }
2886
2887 /// emitDebugRanges - Emit visible names into a debug ranges section.
2888 ///
2889 void DwarfDebug::emitDebugRanges() {
2890   // Start the dwarf ranges section.
2891   Asm->OutStreamer.SwitchSection(
2892                             Asm->getObjFileLowering().getDwarfRangesSection());
2893 }
2894
2895 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2896 ///
2897 void DwarfDebug::emitDebugMacInfo() {
2898   if (const MCSection *LineInfo =
2899       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2900     // Start the dwarf macinfo section.
2901     Asm->OutStreamer.SwitchSection(LineInfo);
2902   }
2903 }
2904
2905 /// emitDebugInlineInfo - Emit inline info using following format.
2906 /// Section Header:
2907 /// 1. length of section
2908 /// 2. Dwarf version number
2909 /// 3. address size.
2910 ///
2911 /// Entries (one "entry" for each function that was inlined):
2912 ///
2913 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2914 ///   otherwise offset into __debug_str for regular function name.
2915 /// 2. offset into __debug_str section for regular function name.
2916 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2917 /// instances for the function.
2918 ///
2919 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2920 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2921 /// __debug_info section, and the low_pc is the starting address for the
2922 /// inlining instance.
2923 void DwarfDebug::emitDebugInlineInfo() {
2924   if (!MAI->doesDwarfUsesInlineInfoSection())
2925     return;
2926
2927   if (!ModuleCU)
2928     return;
2929
2930   Asm->OutStreamer.SwitchSection(
2931                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
2932
2933   EmitDifference(getDWLabel("debug_inlined_end", 1),
2934                  getDWLabel("debug_inlined_begin", 1), true);
2935   EOL("Length of Debug Inlined Information Entry");
2936
2937   Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
2938
2939   Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2940   Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2941
2942   for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2943          E = InlinedSPNodes.end(); I != E; ++I) {
2944
2945     MDNode *Node = *I;
2946     DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2947       = InlineInfo.find(Node);
2948     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2949     DISubprogram SP(Node);
2950     StringRef LName = SP.getLinkageName();
2951     StringRef Name = SP.getName();
2952
2953     if (LName.empty()) {
2954       Asm->OutStreamer.EmitBytes(Name, 0);
2955       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2956     } else 
2957       EmitSectionOffset(getDWLabel("string",
2958                                    StringPool.idFor(getRealLinkageName(LName))),
2959                         getTempLabel("section_str"), true);
2960
2961     EOL("MIPS linkage name");
2962     EmitSectionOffset(getDWLabel("string", StringPool.idFor(Name)),
2963                       getTempLabel("section_str"), false, true);
2964     EOL("Function name");
2965     EmitULEB128(Labels.size(), "Inline count");
2966
2967     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2968            LE = Labels.end(); LI != LE; ++LI) {
2969       if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2970       Asm->EmitInt32(LI->second->getOffset());
2971
2972       if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("low_pc");
2973       Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
2974     }
2975   }
2976
2977   Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));
2978 }