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