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