d73f2fe5bfb140e8c4e6e0c9aedd1572c0f1c7e2
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfWriter.cpp
1 //===-- llvm/CodeGen/DwarfWriter.cpp - Dwarf Framework ----------*- C++ -*-===//
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 info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/CodeGen/DwarfWriter.h"
15
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/FoldingSet.h"
18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/ADT/UniqueVector.h"
20 #include "llvm/Module.h"
21 #include "llvm/DerivedTypes.h"
22 #include "llvm/CodeGen/AsmPrinter.h"
23 #include "llvm/CodeGen/MachineModuleInfo.h"
24 #include "llvm/CodeGen/MachineFrameInfo.h"
25 #include "llvm/CodeGen/MachineLocation.h"
26 #include "llvm/Analysis/DebugInfo.h"
27 #include "llvm/Support/Debug.h"
28 #include "llvm/Support/Dwarf.h"
29 #include "llvm/Support/CommandLine.h"
30 #include "llvm/Support/DataTypes.h"
31 #include "llvm/Support/Mangler.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include "llvm/System/Path.h"
34 #include "llvm/Target/TargetAsmInfo.h"
35 #include "llvm/Target/TargetRegisterInfo.h"
36 #include "llvm/Target/TargetData.h"
37 #include "llvm/Target/TargetFrameInfo.h"
38 #include "llvm/Target/TargetInstrInfo.h"
39 #include "llvm/Target/TargetMachine.h"
40 #include "llvm/Target/TargetOptions.h"
41 #include <ostream>
42 #include <string>
43 using namespace llvm;
44 using namespace llvm::dwarf;
45
46 static RegisterPass<DwarfWriter>
47 X("dwarfwriter", "DWARF Information Writer");
48 char DwarfWriter::ID = 0;
49
50 namespace llvm {
51
52 //===----------------------------------------------------------------------===//
53
54 /// Configuration values for initial hash set sizes (log2).
55 ///
56 static const unsigned InitDiesSetSize          = 9; // 512
57 static const unsigned InitAbbreviationsSetSize = 9; // 512
58 static const unsigned InitValuesSetSize        = 9; // 512
59
60 //===----------------------------------------------------------------------===//
61 /// Forward declarations.
62 ///
63 class DIE;
64 class DIEValue;
65
66 //===----------------------------------------------------------------------===//
67 /// Utility routines.
68 ///
69 /// getGlobalVariablesUsing - Return all of the GlobalVariables which have the            
70 /// specified value in their initializer somewhere.                                       
71 static void
72 getGlobalVariablesUsing(Value *V, std::vector<GlobalVariable*> &Result) {
73   // Scan though value users.                                                             
74   for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) {
75     if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I)) {
76       // If the user is a GlobalVariable then add to result.                              
77       Result.push_back(GV);
78     } else if (Constant *C = dyn_cast<Constant>(*I)) {
79       // If the user is a constant variable then scan its users                           
80       getGlobalVariablesUsing(C, Result);
81     }
82   }
83 }
84
85 /// getGlobalVariablesUsing - Return all of the GlobalVariables that use the              
86 /// named GlobalVariable.                                                                 
87 static void
88 getGlobalVariablesUsing(Module &M, const std::string &RootName,
89                         std::vector<GlobalVariable*> &Result) {
90   std::vector<const Type*> FieldTypes;
91   FieldTypes.push_back(Type::Int32Ty);
92   FieldTypes.push_back(Type::Int32Ty);
93
94   // Get the GlobalVariable root.                                                         
95   GlobalVariable *UseRoot = M.getGlobalVariable(RootName,
96                                                 StructType::get(FieldTypes));
97
98   // If present and linkonce then scan for users.                                         
99   if (UseRoot && UseRoot->hasLinkOnceLinkage())
100     getGlobalVariablesUsing(UseRoot, Result);
101 }
102
103 //===----------------------------------------------------------------------===//
104 /// DWLabel - Labels are used to track locations in the assembler file.
105 /// Labels appear in the form @verbatim <prefix><Tag><Number> @endverbatim,
106 /// where the tag is a category of label (Ex. location) and number is a value
107 /// unique in that category.
108 class DWLabel {
109 public:
110   /// Tag - Label category tag. Should always be a staticly declared C string.
111   ///
112   const char *Tag;
113
114   /// Number - Value to make label unique.
115   ///
116   unsigned    Number;
117
118   DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {}
119
120   void Profile(FoldingSetNodeID &ID) const {
121     ID.AddString(std::string(Tag));
122     ID.AddInteger(Number);
123   }
124
125 #ifndef NDEBUG
126   void print(std::ostream *O) const {
127     if (O) print(*O);
128   }
129   void print(std::ostream &O) const {
130     O << "." << Tag;
131     if (Number) O << Number;
132   }
133 #endif
134 };
135
136 //===----------------------------------------------------------------------===//
137 /// DIEAbbrevData - Dwarf abbreviation data, describes the one attribute of a
138 /// Dwarf abbreviation.
139 class DIEAbbrevData {
140 private:
141   /// Attribute - Dwarf attribute code.
142   ///
143   unsigned Attribute;
144
145   /// Form - Dwarf form code.
146   ///
147   unsigned Form;
148
149 public:
150   DIEAbbrevData(unsigned A, unsigned F)
151   : Attribute(A)
152   , Form(F)
153   {}
154
155   // Accessors.
156   unsigned getAttribute() const { return Attribute; }
157   unsigned getForm()      const { return Form; }
158
159   /// Profile - Used to gather unique data for the abbreviation folding set.
160   ///
161   void Profile(FoldingSetNodeID &ID)const  {
162     ID.AddInteger(Attribute);
163     ID.AddInteger(Form);
164   }
165 };
166
167 //===----------------------------------------------------------------------===//
168 /// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug
169 /// information object.
170 class DIEAbbrev : public FoldingSetNode {
171 private:
172   /// Tag - Dwarf tag code.
173   ///
174   unsigned Tag;
175
176   /// Unique number for node.
177   ///
178   unsigned Number;
179
180   /// ChildrenFlag - Dwarf children flag.
181   ///
182   unsigned ChildrenFlag;
183
184   /// Data - Raw data bytes for abbreviation.
185   ///
186   SmallVector<DIEAbbrevData, 8> Data;
187
188 public:
189
190   DIEAbbrev(unsigned T, unsigned C)
191   : Tag(T)
192   , ChildrenFlag(C)
193   , Data()
194   {}
195   ~DIEAbbrev() {}
196
197   // Accessors.
198   unsigned getTag()                           const { return Tag; }
199   unsigned getNumber()                        const { return Number; }
200   unsigned getChildrenFlag()                  const { return ChildrenFlag; }
201   const SmallVector<DIEAbbrevData, 8> &getData() const { return Data; }
202   void setTag(unsigned T)                           { Tag = T; }
203   void setChildrenFlag(unsigned CF)                 { ChildrenFlag = CF; }
204   void setNumber(unsigned N)                        { Number = N; }
205
206   /// AddAttribute - Adds another set of attribute information to the
207   /// abbreviation.
208   void AddAttribute(unsigned Attribute, unsigned Form) {
209     Data.push_back(DIEAbbrevData(Attribute, Form));
210   }
211
212   /// AddFirstAttribute - Adds a set of attribute information to the front
213   /// of the abbreviation.
214   void AddFirstAttribute(unsigned Attribute, unsigned Form) {
215     Data.insert(Data.begin(), DIEAbbrevData(Attribute, Form));
216   }
217
218   /// Profile - Used to gather unique data for the abbreviation folding set.
219   ///
220   void Profile(FoldingSetNodeID &ID) {
221     ID.AddInteger(Tag);
222     ID.AddInteger(ChildrenFlag);
223
224     // For each attribute description.
225     for (unsigned i = 0, N = Data.size(); i < N; ++i)
226       Data[i].Profile(ID);
227   }
228
229   /// Emit - Print the abbreviation using the specified Dwarf writer.
230   ///
231   void Emit(const DwarfDebug &DD) const;
232
233 #ifndef NDEBUG
234   void print(std::ostream *O) {
235     if (O) print(*O);
236   }
237   void print(std::ostream &O);
238   void dump();
239 #endif
240 };
241
242 //===----------------------------------------------------------------------===//
243 /// DIE - A structured debug information entry.  Has an abbreviation which
244 /// describes it's organization.
245 class DIE : public FoldingSetNode {
246 protected:
247   /// Abbrev - Buffer for constructing abbreviation.
248   ///
249   DIEAbbrev Abbrev;
250
251   /// Offset - Offset in debug info section.
252   ///
253   unsigned Offset;
254
255   /// Size - Size of instance + children.
256   ///
257   unsigned Size;
258
259   /// Children DIEs.
260   ///
261   std::vector<DIE *> Children;
262
263   /// Attributes values.
264   ///
265   SmallVector<DIEValue*, 32> Values;
266
267 public:
268   explicit DIE(unsigned Tag)
269   : Abbrev(Tag, DW_CHILDREN_no)
270   , Offset(0)
271   , Size(0)
272   , Children()
273   , Values()
274   {}
275   virtual ~DIE();
276
277   // Accessors.
278   DIEAbbrev &getAbbrev()                           { return Abbrev; }
279   unsigned   getAbbrevNumber()               const {
280     return Abbrev.getNumber();
281   }
282   unsigned getTag()                          const { return Abbrev.getTag(); }
283   unsigned getOffset()                       const { return Offset; }
284   unsigned getSize()                         const { return Size; }
285   const std::vector<DIE *> &getChildren()    const { return Children; }
286   SmallVector<DIEValue*, 32> &getValues()       { return Values; }
287   void setTag(unsigned Tag)                  { Abbrev.setTag(Tag); }
288   void setOffset(unsigned O)                 { Offset = O; }
289   void setSize(unsigned S)                   { Size = S; }
290
291   /// AddValue - Add a value and attributes to a DIE.
292   ///
293   void AddValue(unsigned Attribute, unsigned Form, DIEValue *Value) {
294     Abbrev.AddAttribute(Attribute, Form);
295     Values.push_back(Value);
296   }
297
298   /// SiblingOffset - Return the offset of the debug information entry's
299   /// sibling.
300   unsigned SiblingOffset() const { return Offset + Size; }
301
302   /// AddSiblingOffset - Add a sibling offset field to the front of the DIE.
303   ///
304   void AddSiblingOffset();
305
306   /// AddChild - Add a child to the DIE.
307   ///
308   void AddChild(DIE *Child) {
309     Abbrev.setChildrenFlag(DW_CHILDREN_yes);
310     Children.push_back(Child);
311   }
312
313   /// Detach - Detaches objects connected to it after copying.
314   ///
315   void Detach() {
316     Children.clear();
317   }
318
319   /// Profile - Used to gather unique data for the value folding set.
320   ///
321   void Profile(FoldingSetNodeID &ID) ;
322
323 #ifndef NDEBUG
324   void print(std::ostream *O, unsigned IncIndent = 0) {
325     if (O) print(*O, IncIndent);
326   }
327   void print(std::ostream &O, unsigned IncIndent = 0);
328   void dump();
329 #endif
330 };
331
332 //===----------------------------------------------------------------------===//
333 /// DIEValue - A debug information entry value.
334 ///
335 class DIEValue : public FoldingSetNode {
336 public:
337   enum {
338     isInteger,
339     isString,
340     isLabel,
341     isAsIsLabel,
342     isSectionOffset,
343     isDelta,
344     isEntry,
345     isBlock
346   };
347
348   /// Type - Type of data stored in the value.
349   ///
350   unsigned Type;
351
352   explicit DIEValue(unsigned T)
353   : Type(T)
354   {}
355   virtual ~DIEValue() {}
356
357   // Accessors
358   unsigned getType()  const { return Type; }
359
360   // Implement isa/cast/dyncast.
361   static bool classof(const DIEValue *) { return true; }
362
363   /// EmitValue - Emit value via the Dwarf writer.
364   ///
365   virtual void EmitValue(DwarfDebug &DD, unsigned Form) = 0;
366
367   /// SizeOf - Return the size of a value in bytes.
368   ///
369   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const = 0;
370
371   /// Profile - Used to gather unique data for the value folding set.
372   ///
373   virtual void Profile(FoldingSetNodeID &ID) = 0;
374
375 #ifndef NDEBUG
376   void print(std::ostream *O) {
377     if (O) print(*O);
378   }
379   virtual void print(std::ostream &O) = 0;
380   void dump();
381 #endif
382 };
383
384 //===----------------------------------------------------------------------===//
385 /// DWInteger - An integer value DIE.
386 ///
387 class DIEInteger : public DIEValue {
388 private:
389   uint64_t Integer;
390
391 public:
392   explicit DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {}
393
394   // Implement isa/cast/dyncast.
395   static bool classof(const DIEInteger *) { return true; }
396   static bool classof(const DIEValue *I)  { return I->Type == isInteger; }
397
398   /// BestForm - Choose the best form for integer.
399   ///
400   static unsigned BestForm(bool IsSigned, uint64_t Integer) {
401     if (IsSigned) {
402       if ((char)Integer == (signed)Integer)   return DW_FORM_data1;
403       if ((short)Integer == (signed)Integer)  return DW_FORM_data2;
404       if ((int)Integer == (signed)Integer)    return DW_FORM_data4;
405     } else {
406       if ((unsigned char)Integer == Integer)  return DW_FORM_data1;
407       if ((unsigned short)Integer == Integer) return DW_FORM_data2;
408       if ((unsigned int)Integer == Integer)   return DW_FORM_data4;
409     }
410     return DW_FORM_data8;
411   }
412
413   /// EmitValue - Emit integer of appropriate size.
414   ///
415   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
416
417   /// SizeOf - Determine size of integer value in bytes.
418   ///
419   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
420
421   /// Profile - Used to gather unique data for the value folding set.
422   ///
423   static void Profile(FoldingSetNodeID &ID, unsigned Integer) {
424     ID.AddInteger(isInteger);
425     ID.AddInteger(Integer);
426   }
427   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Integer); }
428
429 #ifndef NDEBUG
430   virtual void print(std::ostream &O) {
431     O << "Int: " << (int64_t)Integer
432       << "  0x" << std::hex << Integer << std::dec;
433   }
434 #endif
435 };
436
437 //===----------------------------------------------------------------------===//
438 /// DIEString - A string value DIE.
439 ///
440 class DIEString : public DIEValue {
441 public:
442   const std::string String;
443
444   explicit DIEString(const std::string &S) : DIEValue(isString), String(S) {}
445
446   // Implement isa/cast/dyncast.
447   static bool classof(const DIEString *) { return true; }
448   static bool classof(const DIEValue *S) { return S->Type == isString; }
449
450   /// EmitValue - Emit string value.
451   ///
452   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
453
454   /// SizeOf - Determine size of string value in bytes.
455   ///
456   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const {
457     return String.size() + sizeof(char); // sizeof('\0');
458   }
459
460   /// Profile - Used to gather unique data for the value folding set.
461   ///
462   static void Profile(FoldingSetNodeID &ID, const std::string &String) {
463     ID.AddInteger(isString);
464     ID.AddString(String);
465   }
466   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, String); }
467
468 #ifndef NDEBUG
469   virtual void print(std::ostream &O) {
470     O << "Str: \"" << String << "\"";
471   }
472 #endif
473 };
474
475 //===----------------------------------------------------------------------===//
476 /// DIEDwarfLabel - A Dwarf internal label expression DIE.
477 //
478 class DIEDwarfLabel : public DIEValue {
479 public:
480
481   const DWLabel Label;
482
483   explicit DIEDwarfLabel(const DWLabel &L) : DIEValue(isLabel), Label(L) {}
484
485   // Implement isa/cast/dyncast.
486   static bool classof(const DIEDwarfLabel *)  { return true; }
487   static bool classof(const DIEValue *L) { return L->Type == isLabel; }
488
489   /// EmitValue - Emit label value.
490   ///
491   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
492
493   /// SizeOf - Determine size of label value in bytes.
494   ///
495   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
496
497   /// Profile - Used to gather unique data for the value folding set.
498   ///
499   static void Profile(FoldingSetNodeID &ID, const DWLabel &Label) {
500     ID.AddInteger(isLabel);
501     Label.Profile(ID);
502   }
503   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Label); }
504
505 #ifndef NDEBUG
506   virtual void print(std::ostream &O) {
507     O << "Lbl: ";
508     Label.print(O);
509   }
510 #endif
511 };
512
513
514 //===----------------------------------------------------------------------===//
515 /// DIEObjectLabel - A label to an object in code or data.
516 //
517 class DIEObjectLabel : public DIEValue {
518 public:
519   const std::string Label;
520
521   explicit DIEObjectLabel(const std::string &L)
522   : DIEValue(isAsIsLabel), Label(L) {}
523
524   // Implement isa/cast/dyncast.
525   static bool classof(const DIEObjectLabel *) { return true; }
526   static bool classof(const DIEValue *L)    { return L->Type == isAsIsLabel; }
527
528   /// EmitValue - Emit label value.
529   ///
530   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
531
532   /// SizeOf - Determine size of label value in bytes.
533   ///
534   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
535
536   /// Profile - Used to gather unique data for the value folding set.
537   ///
538   static void Profile(FoldingSetNodeID &ID, const std::string &Label) {
539     ID.AddInteger(isAsIsLabel);
540     ID.AddString(Label);
541   }
542   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Label); }
543
544 #ifndef NDEBUG
545   virtual void print(std::ostream &O) {
546     O << "Obj: " << Label;
547   }
548 #endif
549 };
550
551 //===----------------------------------------------------------------------===//
552 /// DIESectionOffset - A section offset DIE.
553 //
554 class DIESectionOffset : public DIEValue {
555 public:
556   const DWLabel Label;
557   const DWLabel Section;
558   bool IsEH : 1;
559   bool UseSet : 1;
560
561   DIESectionOffset(const DWLabel &Lab, const DWLabel &Sec,
562                    bool isEH = false, bool useSet = true)
563   : DIEValue(isSectionOffset), Label(Lab), Section(Sec),
564                                IsEH(isEH), UseSet(useSet) {}
565
566   // Implement isa/cast/dyncast.
567   static bool classof(const DIESectionOffset *)  { return true; }
568   static bool classof(const DIEValue *D) { return D->Type == isSectionOffset; }
569
570   /// EmitValue - Emit section offset.
571   ///
572   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
573
574   /// SizeOf - Determine size of section offset value in bytes.
575   ///
576   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
577
578   /// Profile - Used to gather unique data for the value folding set.
579   ///
580   static void Profile(FoldingSetNodeID &ID, const DWLabel &Label,
581                                             const DWLabel &Section) {
582     ID.AddInteger(isSectionOffset);
583     Label.Profile(ID);
584     Section.Profile(ID);
585     // IsEH and UseSet are specific to the Label/Section that we will emit
586     // the offset for; so Label/Section are enough for uniqueness.
587   }
588   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Label, Section); }
589
590 #ifndef NDEBUG
591   virtual void print(std::ostream &O) {
592     O << "Off: ";
593     Label.print(O);
594     O << "-";
595     Section.print(O);
596     O << "-" << IsEH << "-" << UseSet;
597   }
598 #endif
599 };
600
601 //===----------------------------------------------------------------------===//
602 /// DIEDelta - A simple label difference DIE.
603 ///
604 class DIEDelta : public DIEValue {
605 public:
606   const DWLabel LabelHi;
607   const DWLabel LabelLo;
608
609   DIEDelta(const DWLabel &Hi, const DWLabel &Lo)
610   : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
611
612   // Implement isa/cast/dyncast.
613   static bool classof(const DIEDelta *)  { return true; }
614   static bool classof(const DIEValue *D) { return D->Type == isDelta; }
615
616   /// EmitValue - Emit delta value.
617   ///
618   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
619
620   /// SizeOf - Determine size of delta value in bytes.
621   ///
622   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
623
624   /// Profile - Used to gather unique data for the value folding set.
625   ///
626   static void Profile(FoldingSetNodeID &ID, const DWLabel &LabelHi,
627                                             const DWLabel &LabelLo) {
628     ID.AddInteger(isDelta);
629     LabelHi.Profile(ID);
630     LabelLo.Profile(ID);
631   }
632   virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, LabelHi, LabelLo); }
633
634 #ifndef NDEBUG
635   virtual void print(std::ostream &O) {
636     O << "Del: ";
637     LabelHi.print(O);
638     O << "-";
639     LabelLo.print(O);
640   }
641 #endif
642 };
643
644 //===----------------------------------------------------------------------===//
645 /// DIEntry - A pointer to another debug information entry.  An instance of this
646 /// class can also be used as a proxy for a debug information entry not yet
647 /// defined (ie. types.)
648 class DIEntry : public DIEValue {
649 public:
650   DIE *Entry;
651
652   explicit DIEntry(DIE *E) : DIEValue(isEntry), Entry(E) {}
653
654   // Implement isa/cast/dyncast.
655   static bool classof(const DIEntry *)   { return true; }
656   static bool classof(const DIEValue *E) { return E->Type == isEntry; }
657
658   /// EmitValue - Emit debug information entry offset.
659   ///
660   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
661
662   /// SizeOf - Determine size of debug information entry in bytes.
663   ///
664   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const {
665     return sizeof(int32_t);
666   }
667
668   /// Profile - Used to gather unique data for the value folding set.
669   ///
670   static void Profile(FoldingSetNodeID &ID, DIE *Entry) {
671     ID.AddInteger(isEntry);
672     ID.AddPointer(Entry);
673   }
674   virtual void Profile(FoldingSetNodeID &ID) {
675     ID.AddInteger(isEntry);
676
677     if (Entry) {
678       ID.AddPointer(Entry);
679     } else {
680       ID.AddPointer(this);
681     }
682   }
683
684 #ifndef NDEBUG
685   virtual void print(std::ostream &O) {
686     O << "Die: 0x" << std::hex << (intptr_t)Entry << std::dec;
687   }
688 #endif
689 };
690
691 //===----------------------------------------------------------------------===//
692 /// DIEBlock - A block of values.  Primarily used for location expressions.
693 //
694 class DIEBlock : public DIEValue, public DIE {
695 public:
696   unsigned Size;                        // Size in bytes excluding size header.
697
698   DIEBlock()
699   : DIEValue(isBlock)
700   , DIE(0)
701   , Size(0)
702   {}
703   ~DIEBlock()  {
704   }
705
706   // Implement isa/cast/dyncast.
707   static bool classof(const DIEBlock *)  { return true; }
708   static bool classof(const DIEValue *E) { return E->Type == isBlock; }
709
710   /// ComputeSize - calculate the size of the block.
711   ///
712   unsigned ComputeSize(DwarfDebug &DD);
713
714   /// BestForm - Choose the best form for data.
715   ///
716   unsigned BestForm() const {
717     if ((unsigned char)Size == Size)  return DW_FORM_block1;
718     if ((unsigned short)Size == Size) return DW_FORM_block2;
719     if ((unsigned int)Size == Size)   return DW_FORM_block4;
720     return DW_FORM_block;
721   }
722
723   /// EmitValue - Emit block data.
724   ///
725   virtual void EmitValue(DwarfDebug &DD, unsigned Form);
726
727   /// SizeOf - Determine size of block data in bytes.
728   ///
729   virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
730
731
732   /// Profile - Used to gather unique data for the value folding set.
733   ///
734   virtual void Profile(FoldingSetNodeID &ID) {
735     ID.AddInteger(isBlock);
736     DIE::Profile(ID);
737   }
738
739 #ifndef NDEBUG
740   virtual void print(std::ostream &O) {
741     O << "Blk: ";
742     DIE::print(O, 5);
743   }
744 #endif
745 };
746
747 //===----------------------------------------------------------------------===//
748 /// CompileUnit - This dwarf writer support class manages information associate
749 /// with a source file.
750 class CompileUnit {
751 private:
752   /// ID - File identifier for source.
753   ///
754   unsigned ID;
755
756   /// Die - Compile unit debug information entry.
757   ///
758   DIE *Die;
759
760   /// GVToDieMap - Tracks the mapping of unit level debug informaton
761   /// variables to debug information entries.
762   DenseMap<GlobalVariable *, DIE *> GVToDieMap;
763
764   /// GVToDIEntryMap - Tracks the mapping of unit level debug informaton
765   /// descriptors to debug information entries using a DIEntry proxy.
766   DenseMap<GlobalVariable *, DIEntry *> GVToDIEntryMap;
767
768   /// Globals - A map of globally visible named entities for this unit.
769   ///
770   std::map<std::string, DIE *> Globals;
771
772   /// DiesSet - Used to uniquely define dies within the compile unit.
773   ///
774   FoldingSet<DIE> DiesSet;
775
776   /// Dies - List of all dies in the compile unit.
777   ///
778   std::vector<DIE *> Dies;
779
780 public:
781   CompileUnit(unsigned I, DIE *D)
782     : ID(I), Die(D), GVToDieMap(),
783       GVToDIEntryMap(), Globals(), DiesSet(InitDiesSetSize), Dies()
784   {}
785
786   ~CompileUnit() {
787     delete Die;
788
789     for (unsigned i = 0, N = Dies.size(); i < N; ++i)
790       delete Dies[i];
791   }
792
793   // Accessors.
794   unsigned getID()           const { return ID; }
795   DIE* getDie()              const { return Die; }
796   std::map<std::string, DIE *> &getGlobals() { return Globals; }
797
798   /// hasContent - Return true if this compile unit has something to write out.
799   ///
800   bool hasContent() const {
801     return !Die->getChildren().empty();
802   }
803
804   /// AddGlobal - Add a new global entity to the compile unit.
805   ///
806   void AddGlobal(const std::string &Name, DIE *Die) {
807     Globals[Name] = Die;
808   }
809
810   /// getDieMapSlotFor - Returns the debug information entry map slot for the
811   /// specified debug variable.
812   DIE *&getDieMapSlotFor(GlobalVariable *GV) {
813     return GVToDieMap[GV];
814   }
815
816   /// getDIEntrySlotFor - Returns the debug information entry proxy slot for the
817   /// specified debug variable.
818   DIEntry *&getDIEntrySlotFor(GlobalVariable *GV) {
819     return GVToDIEntryMap[GV];
820   }
821
822   /// AddDie - Adds or interns the DIE to the compile unit.
823   ///
824   DIE *AddDie(DIE &Buffer) {
825     FoldingSetNodeID ID;
826     Buffer.Profile(ID);
827     void *Where;
828     DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
829
830     if (!Die) {
831       Die = new DIE(Buffer);
832       DiesSet.InsertNode(Die, Where);
833       this->Die->AddChild(Die);
834       Buffer.Detach();
835     }
836
837     return Die;
838   }
839 };
840
841 //===----------------------------------------------------------------------===//
842 /// Dwarf - Emits general Dwarf directives.
843 ///
844 class Dwarf {
845
846 protected:
847
848   //===--------------------------------------------------------------------===//
849   // Core attributes used by the Dwarf writer.
850   //
851
852   //
853   /// O - Stream to .s file.
854   ///
855   raw_ostream &O;
856
857   /// Asm - Target of Dwarf emission.
858   ///
859   AsmPrinter *Asm;
860
861   /// TAI - Target asm information.
862   const TargetAsmInfo *TAI;
863
864   /// TD - Target data.
865   const TargetData *TD;
866
867   /// RI - Register Information.
868   const TargetRegisterInfo *RI;
869
870   /// M - Current module.
871   ///
872   Module *M;
873
874   /// MF - Current machine function.
875   ///
876   MachineFunction *MF;
877
878   /// MMI - Collected machine module information.
879   ///
880   MachineModuleInfo *MMI;
881
882   /// SubprogramCount - The running count of functions being compiled.
883   ///
884   unsigned SubprogramCount;
885
886   /// Flavor - A unique string indicating what dwarf producer this is, used to
887   /// unique labels.
888   const char * const Flavor;
889
890   unsigned SetCounter;
891   Dwarf(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T,
892         const char *flavor)
893   : O(OS)
894   , Asm(A)
895   , TAI(T)
896   , TD(Asm->TM.getTargetData())
897   , RI(Asm->TM.getRegisterInfo())
898   , M(NULL)
899   , MF(NULL)
900   , MMI(NULL)
901   , SubprogramCount(0)
902   , Flavor(flavor)
903   , SetCounter(1)
904   {
905   }
906
907 public:
908
909   //===--------------------------------------------------------------------===//
910   // Accessors.
911   //
912   AsmPrinter *getAsm() const { return Asm; }
913   MachineModuleInfo *getMMI() const { return MMI; }
914   const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
915   const TargetData *getTargetData() const { return TD; }
916
917   void PrintRelDirective(bool Force32Bit = false, bool isInSection = false)
918                                                                          const {
919     if (isInSection && TAI->getDwarfSectionOffsetDirective())
920       O << TAI->getDwarfSectionOffsetDirective();
921     else if (Force32Bit || TD->getPointerSize() == sizeof(int32_t))
922       O << TAI->getData32bitsDirective();
923     else
924       O << TAI->getData64bitsDirective();
925   }
926
927   /// PrintLabelName - Print label name in form used by Dwarf writer.
928   ///
929   void PrintLabelName(DWLabel Label) const {
930     PrintLabelName(Label.Tag, Label.Number);
931   }
932   void PrintLabelName(const char *Tag, unsigned Number) const {
933     O << TAI->getPrivateGlobalPrefix() << Tag;
934     if (Number) O << Number;
935   }
936
937   void PrintLabelName(const char *Tag, unsigned Number,
938                       const char *Suffix) const {
939     O << TAI->getPrivateGlobalPrefix() << Tag;
940     if (Number) O << Number;
941     O << Suffix;
942   }
943
944   /// EmitLabel - Emit location label for internal use by Dwarf.
945   ///
946   void EmitLabel(DWLabel Label) const {
947     EmitLabel(Label.Tag, Label.Number);
948   }
949   void EmitLabel(const char *Tag, unsigned Number) const {
950     PrintLabelName(Tag, Number);
951     O << ":\n";
952   }
953
954   /// EmitReference - Emit a reference to a label.
955   ///
956   void EmitReference(DWLabel Label, bool IsPCRelative = false,
957                      bool Force32Bit = false) const {
958     EmitReference(Label.Tag, Label.Number, IsPCRelative, Force32Bit);
959   }
960   void EmitReference(const char *Tag, unsigned Number,
961                      bool IsPCRelative = false, bool Force32Bit = false) const {
962     PrintRelDirective(Force32Bit);
963     PrintLabelName(Tag, Number);
964
965     if (IsPCRelative) O << "-" << TAI->getPCSymbol();
966   }
967   void EmitReference(const std::string &Name, bool IsPCRelative = false,
968                      bool Force32Bit = false) const {
969     PrintRelDirective(Force32Bit);
970
971     O << Name;
972
973     if (IsPCRelative) O << "-" << TAI->getPCSymbol();
974   }
975
976   /// EmitDifference - Emit the difference between two labels.  Some
977   /// assemblers do not behave with absolute expressions with data directives,
978   /// so there is an option (needsSet) to use an intermediary set expression.
979   void EmitDifference(DWLabel LabelHi, DWLabel LabelLo,
980                       bool IsSmall = false) {
981     EmitDifference(LabelHi.Tag, LabelHi.Number,
982                    LabelLo.Tag, LabelLo.Number,
983                    IsSmall);
984   }
985   void EmitDifference(const char *TagHi, unsigned NumberHi,
986                       const char *TagLo, unsigned NumberLo,
987                       bool IsSmall = false) {
988     if (TAI->needsSet()) {
989       O << "\t.set\t";
990       PrintLabelName("set", SetCounter, Flavor);
991       O << ",";
992       PrintLabelName(TagHi, NumberHi);
993       O << "-";
994       PrintLabelName(TagLo, NumberLo);
995       O << "\n";
996
997       PrintRelDirective(IsSmall);
998       PrintLabelName("set", SetCounter, Flavor);
999       ++SetCounter;
1000     } else {
1001       PrintRelDirective(IsSmall);
1002
1003       PrintLabelName(TagHi, NumberHi);
1004       O << "-";
1005       PrintLabelName(TagLo, NumberLo);
1006     }
1007   }
1008
1009   void EmitSectionOffset(const char* Label, const char* Section,
1010                          unsigned LabelNumber, unsigned SectionNumber,
1011                          bool IsSmall = false, bool isEH = false,
1012                          bool useSet = true) {
1013     bool printAbsolute = false;
1014     if (isEH)
1015       printAbsolute = TAI->isAbsoluteEHSectionOffsets();
1016     else
1017       printAbsolute = TAI->isAbsoluteDebugSectionOffsets();
1018
1019     if (TAI->needsSet() && useSet) {
1020       O << "\t.set\t";
1021       PrintLabelName("set", SetCounter, Flavor);
1022       O << ",";
1023       PrintLabelName(Label, LabelNumber);
1024
1025       if (!printAbsolute) {
1026         O << "-";
1027         PrintLabelName(Section, SectionNumber);
1028       }
1029       O << "\n";
1030
1031       PrintRelDirective(IsSmall);
1032
1033       PrintLabelName("set", SetCounter, Flavor);
1034       ++SetCounter;
1035     } else {
1036       PrintRelDirective(IsSmall, true);
1037
1038       PrintLabelName(Label, LabelNumber);
1039
1040       if (!printAbsolute) {
1041         O << "-";
1042         PrintLabelName(Section, SectionNumber);
1043       }
1044     }
1045   }
1046
1047   /// EmitFrameMoves - Emit frame instructions to describe the layout of the
1048   /// frame.
1049   void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
1050                       const std::vector<MachineMove> &Moves, bool isEH) {
1051     int stackGrowth =
1052         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
1053           TargetFrameInfo::StackGrowsUp ?
1054             TD->getPointerSize() : -TD->getPointerSize();
1055     bool IsLocal = BaseLabel && strcmp(BaseLabel, "label") == 0;
1056
1057     for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
1058       const MachineMove &Move = Moves[i];
1059       unsigned LabelID = Move.getLabelID();
1060
1061       if (LabelID) {
1062         LabelID = MMI->MappedLabel(LabelID);
1063
1064         // Throw out move if the label is invalid.
1065         if (!LabelID) continue;
1066       }
1067
1068       const MachineLocation &Dst = Move.getDestination();
1069       const MachineLocation &Src = Move.getSource();
1070
1071       // Advance row if new location.
1072       if (BaseLabel && LabelID && (BaseLabelID != LabelID || !IsLocal)) {
1073         Asm->EmitInt8(DW_CFA_advance_loc4);
1074         Asm->EOL("DW_CFA_advance_loc4");
1075         EmitDifference("label", LabelID, BaseLabel, BaseLabelID, true);
1076         Asm->EOL();
1077
1078         BaseLabelID = LabelID;
1079         BaseLabel = "label";
1080         IsLocal = true;
1081       }
1082
1083       // If advancing cfa.
1084       if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
1085         if (!Src.isReg()) {
1086           if (Src.getReg() == MachineLocation::VirtualFP) {
1087             Asm->EmitInt8(DW_CFA_def_cfa_offset);
1088             Asm->EOL("DW_CFA_def_cfa_offset");
1089           } else {
1090             Asm->EmitInt8(DW_CFA_def_cfa);
1091             Asm->EOL("DW_CFA_def_cfa");
1092             Asm->EmitULEB128Bytes(RI->getDwarfRegNum(Src.getReg(), isEH));
1093             Asm->EOL("Register");
1094           }
1095
1096           int Offset = -Src.getOffset();
1097
1098           Asm->EmitULEB128Bytes(Offset);
1099           Asm->EOL("Offset");
1100         } else {
1101           assert(0 && "Machine move no supported yet.");
1102         }
1103       } else if (Src.isReg() &&
1104         Src.getReg() == MachineLocation::VirtualFP) {
1105         if (Dst.isReg()) {
1106           Asm->EmitInt8(DW_CFA_def_cfa_register);
1107           Asm->EOL("DW_CFA_def_cfa_register");
1108           Asm->EmitULEB128Bytes(RI->getDwarfRegNum(Dst.getReg(), isEH));
1109           Asm->EOL("Register");
1110         } else {
1111           assert(0 && "Machine move no supported yet.");
1112         }
1113       } else {
1114         unsigned Reg = RI->getDwarfRegNum(Src.getReg(), isEH);
1115         int Offset = Dst.getOffset() / stackGrowth;
1116
1117         if (Offset < 0) {
1118           Asm->EmitInt8(DW_CFA_offset_extended_sf);
1119           Asm->EOL("DW_CFA_offset_extended_sf");
1120           Asm->EmitULEB128Bytes(Reg);
1121           Asm->EOL("Reg");
1122           Asm->EmitSLEB128Bytes(Offset);
1123           Asm->EOL("Offset");
1124         } else if (Reg < 64) {
1125           Asm->EmitInt8(DW_CFA_offset + Reg);
1126           if (VerboseAsm)
1127             Asm->EOL("DW_CFA_offset + Reg (" + utostr(Reg) + ")");
1128           else
1129             Asm->EOL();
1130           Asm->EmitULEB128Bytes(Offset);
1131           Asm->EOL("Offset");
1132         } else {
1133           Asm->EmitInt8(DW_CFA_offset_extended);
1134           Asm->EOL("DW_CFA_offset_extended");
1135           Asm->EmitULEB128Bytes(Reg);
1136           Asm->EOL("Reg");
1137           Asm->EmitULEB128Bytes(Offset);
1138           Asm->EOL("Offset");
1139         }
1140       }
1141     }
1142   }
1143
1144 };
1145
1146 //===----------------------------------------------------------------------===//
1147 /// SrcLineInfo - This class is used to record source line correspondence.
1148 ///
1149 class SrcLineInfo {
1150   unsigned Line;                        // Source line number.
1151   unsigned Column;                      // Source column.
1152   unsigned SourceID;                    // Source ID number.
1153   unsigned LabelID;                     // Label in code ID number.
1154 public:
1155   SrcLineInfo(unsigned L, unsigned C, unsigned S, unsigned I)
1156   : Line(L), Column(C), SourceID(S), LabelID(I) {}
1157   
1158   // Accessors
1159   unsigned getLine()     const { return Line; }
1160   unsigned getColumn()   const { return Column; }
1161   unsigned getSourceID() const { return SourceID; }
1162   unsigned getLabelID()  const { return LabelID; }
1163 };
1164
1165
1166 //===----------------------------------------------------------------------===//
1167 /// SrcFileInfo - This class is used to track source information.
1168 ///
1169 class SrcFileInfo {
1170   unsigned DirectoryID;                 // Directory ID number.
1171   std::string Name;                     // File name (not including directory.)
1172 public:
1173   SrcFileInfo(unsigned D, const std::string &N) : DirectoryID(D), Name(N) {}
1174             
1175   // Accessors
1176   unsigned getDirectoryID()    const { return DirectoryID; }
1177   const std::string &getName() const { return Name; }
1178
1179   /// operator== - Used by UniqueVector to locate entry.
1180   ///
1181   bool operator==(const SrcFileInfo &SI) const {
1182     return getDirectoryID() == SI.getDirectoryID() && getName() == SI.getName();
1183   }
1184
1185   /// operator< - Used by UniqueVector to locate entry.
1186   ///
1187   bool operator<(const SrcFileInfo &SI) const {
1188     return getDirectoryID() < SI.getDirectoryID() ||
1189           (getDirectoryID() == SI.getDirectoryID() && getName() < SI.getName());
1190   }
1191 };
1192
1193 //===----------------------------------------------------------------------===//
1194 /// DbgVariable - This class is used to track local variable information.
1195 ///
1196 class DbgVariable {
1197 private:
1198   DIVariable *Var;                   // Variable Descriptor.
1199   unsigned FrameIndex;               // Variable frame index.
1200
1201 public:
1202   DbgVariable(DIVariable *V, unsigned I) : Var(V), FrameIndex(I)  {}
1203   
1204   // Accessors.
1205   DIVariable *getVariable()  const { return Var; }
1206   unsigned getFrameIndex() const { return FrameIndex; }
1207 };
1208
1209 //===----------------------------------------------------------------------===//
1210 /// DbgScope - This class is used to track scope information.
1211 ///
1212 class DbgScope {
1213 private:
1214   DbgScope *Parent;                   // Parent to this scope.
1215   DIDescriptor Desc;                 // Debug info descriptor for scope.
1216                                       // Either subprogram or block.
1217   unsigned StartLabelID;              // Label ID of the beginning of scope.
1218   unsigned EndLabelID;                // Label ID of the end of scope.
1219   SmallVector<DbgScope *, 4> Scopes;     // Scopes defined in scope.
1220   SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
1221   
1222 public:
1223   DbgScope(DbgScope *P, DIDescriptor D)
1224   : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), Scopes(), Variables()
1225   {}
1226   ~DbgScope() {
1227     for (unsigned i = 0, N = Scopes.size(); i < N; ++i) delete Scopes[i];
1228     for (unsigned j = 0, M = Variables.size(); j < M; ++j) delete Variables[j];
1229   }
1230   
1231   // Accessors.
1232   DbgScope *getParent()        const { return Parent; }
1233   DIDescriptor getDesc()       const { return Desc; }
1234   unsigned getStartLabelID()     const { return StartLabelID; }
1235   unsigned getEndLabelID()       const { return EndLabelID; }
1236   SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
1237   SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
1238   void setStartLabelID(unsigned S) { StartLabelID = S; }
1239   void setEndLabelID(unsigned E)   { EndLabelID = E; }
1240   
1241   /// AddScope - Add a scope to the scope.
1242   ///
1243   void AddScope(DbgScope *S) { Scopes.push_back(S); }
1244   
1245   /// AddVariable - Add a variable to the scope.
1246   ///
1247   void AddVariable(DbgVariable *V) { Variables.push_back(V); }
1248 };
1249
1250 //===----------------------------------------------------------------------===//
1251 /// DwarfDebug - Emits Dwarf debug directives.
1252 ///
1253 class DwarfDebug : public Dwarf {
1254
1255 private:
1256   //===--------------------------------------------------------------------===//
1257   // Attributes used to construct specific Dwarf sections.
1258   //
1259
1260   /// CompileUnits - All the compile units involved in this build.  The index
1261   /// of each entry in this vector corresponds to the sources in MMI.
1262   std::vector<CompileUnit *> CompileUnits;
1263   DenseMap<Value *, CompileUnit *> DW_CUs;
1264
1265   /// AbbreviationsSet - Used to uniquely define abbreviations.
1266   ///
1267   FoldingSet<DIEAbbrev> AbbreviationsSet;
1268
1269   /// Abbreviations - A list of all the unique abbreviations in use.
1270   ///
1271   std::vector<DIEAbbrev *> Abbreviations;
1272
1273   /// ValuesSet - Used to uniquely define values.
1274   ///
1275   // Directories - Uniquing vector for directories.                                       
1276   UniqueVector<std::string> Directories;
1277
1278   // SourceFiles - Uniquing vector for source files.                                      
1279   UniqueVector<SrcFileInfo> SrcFiles;
1280
1281   // Lines - List of of source line correspondence.
1282   std::vector<SrcLineInfo> Lines;
1283
1284   FoldingSet<DIEValue> ValuesSet;
1285
1286   /// Values - A list of all the unique values in use.
1287   ///
1288   std::vector<DIEValue *> Values;
1289
1290   /// StringPool - A UniqueVector of strings used by indirect references.
1291   ///
1292   UniqueVector<std::string> StringPool;
1293
1294   /// SectionMap - Provides a unique id per text section.
1295   ///
1296   UniqueVector<const Section*> SectionMap;
1297
1298   /// SectionSourceLines - Tracks line numbers per text section.
1299   ///
1300   std::vector<std::vector<SrcLineInfo> > SectionSourceLines;
1301
1302   /// didInitial - Flag to indicate if initial emission has been done.
1303   ///
1304   bool didInitial;
1305
1306   /// shouldEmit - Flag to indicate if debug information should be emitted.
1307   ///
1308   bool shouldEmit;
1309
1310   // RootDbgScope - Top level scope for the current function.
1311   //
1312   DbgScope *RootDbgScope;
1313   
1314   // DbgScopeMap - Tracks the scopes in the current function.
1315   DenseMap<GlobalVariable *, DbgScope *> DbgScopeMap;
1316   
1317   struct FunctionDebugFrameInfo {
1318     unsigned Number;
1319     std::vector<MachineMove> Moves;
1320
1321     FunctionDebugFrameInfo(unsigned Num, const std::vector<MachineMove> &M):
1322       Number(Num), Moves(M) { }
1323   };
1324
1325   std::vector<FunctionDebugFrameInfo> DebugFrames;
1326
1327 public:
1328
1329   /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
1330   ///
1331   bool ShouldEmitDwarf() const { return shouldEmit; }
1332
1333   /// AssignAbbrevNumber - Define a unique number for the abbreviation.
1334   ///
1335   void AssignAbbrevNumber(DIEAbbrev &Abbrev) {
1336     // Profile the node so that we can make it unique.
1337     FoldingSetNodeID ID;
1338     Abbrev.Profile(ID);
1339
1340     // Check the set for priors.
1341     DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
1342
1343     // If it's newly added.
1344     if (InSet == &Abbrev) {
1345       // Add to abbreviation list.
1346       Abbreviations.push_back(&Abbrev);
1347       // Assign the vector position + 1 as its number.
1348       Abbrev.setNumber(Abbreviations.size());
1349     } else {
1350       // Assign existing abbreviation number.
1351       Abbrev.setNumber(InSet->getNumber());
1352     }
1353   }
1354
1355   /// NewString - Add a string to the constant pool and returns a label.
1356   ///
1357   DWLabel NewString(const std::string &String) {
1358     unsigned StringID = StringPool.insert(String);
1359     return DWLabel("string", StringID);
1360   }
1361
1362   /// NewDIEntry - Creates a new DIEntry to be a proxy for a debug information
1363   /// entry.
1364   DIEntry *NewDIEntry(DIE *Entry = NULL) {
1365     DIEntry *Value;
1366
1367     if (Entry) {
1368       FoldingSetNodeID ID;
1369       DIEntry::Profile(ID, Entry);
1370       void *Where;
1371       Value = static_cast<DIEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
1372
1373       if (Value) return Value;
1374
1375       Value = new DIEntry(Entry);
1376       ValuesSet.InsertNode(Value, Where);
1377     } else {
1378       Value = new DIEntry(Entry);
1379     }
1380
1381     Values.push_back(Value);
1382     return Value;
1383   }
1384
1385   /// SetDIEntry - Set a DIEntry once the debug information entry is defined.
1386   ///
1387   void SetDIEntry(DIEntry *Value, DIE *Entry) {
1388     Value->Entry = Entry;
1389     // Add to values set if not already there.  If it is, we merely have a
1390     // duplicate in the values list (no harm.)
1391     ValuesSet.GetOrInsertNode(Value);
1392   }
1393
1394   /// AddUInt - Add an unsigned integer attribute data and value.
1395   ///
1396   void AddUInt(DIE *Die, unsigned Attribute, unsigned Form, uint64_t Integer) {
1397     if (!Form) Form = DIEInteger::BestForm(false, Integer);
1398
1399     FoldingSetNodeID ID;
1400     DIEInteger::Profile(ID, Integer);
1401     void *Where;
1402     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1403     if (!Value) {
1404       Value = new DIEInteger(Integer);
1405       ValuesSet.InsertNode(Value, Where);
1406       Values.push_back(Value);
1407     }
1408
1409     Die->AddValue(Attribute, Form, Value);
1410   }
1411
1412   /// AddSInt - Add an signed integer attribute data and value.
1413   ///
1414   void AddSInt(DIE *Die, unsigned Attribute, unsigned Form, int64_t Integer) {
1415     if (!Form) Form = DIEInteger::BestForm(true, Integer);
1416
1417     FoldingSetNodeID ID;
1418     DIEInteger::Profile(ID, (uint64_t)Integer);
1419     void *Where;
1420     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1421     if (!Value) {
1422       Value = new DIEInteger(Integer);
1423       ValuesSet.InsertNode(Value, Where);
1424       Values.push_back(Value);
1425     }
1426
1427     Die->AddValue(Attribute, Form, Value);
1428   }
1429
1430   /// AddString - Add a std::string attribute data and value.
1431   ///
1432   void AddString(DIE *Die, unsigned Attribute, unsigned Form,
1433                  const std::string &String) {
1434     FoldingSetNodeID ID;
1435     DIEString::Profile(ID, String);
1436     void *Where;
1437     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1438     if (!Value) {
1439       Value = new DIEString(String);
1440       ValuesSet.InsertNode(Value, Where);
1441       Values.push_back(Value);
1442     }
1443
1444     Die->AddValue(Attribute, Form, Value);
1445   }
1446
1447   /// AddLabel - Add a Dwarf label attribute data and value.
1448   ///
1449   void AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
1450                      const DWLabel &Label) {
1451     FoldingSetNodeID ID;
1452     DIEDwarfLabel::Profile(ID, Label);
1453     void *Where;
1454     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1455     if (!Value) {
1456       Value = new DIEDwarfLabel(Label);
1457       ValuesSet.InsertNode(Value, Where);
1458       Values.push_back(Value);
1459     }
1460
1461     Die->AddValue(Attribute, Form, Value);
1462   }
1463
1464   /// AddObjectLabel - Add an non-Dwarf label attribute data and value.
1465   ///
1466   void AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
1467                       const std::string &Label) {
1468     FoldingSetNodeID ID;
1469     DIEObjectLabel::Profile(ID, Label);
1470     void *Where;
1471     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1472     if (!Value) {
1473       Value = new DIEObjectLabel(Label);
1474       ValuesSet.InsertNode(Value, Where);
1475       Values.push_back(Value);
1476     }
1477
1478     Die->AddValue(Attribute, Form, Value);
1479   }
1480
1481   /// AddSectionOffset - Add a section offset label attribute data and value.
1482   ///
1483   void AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
1484                         const DWLabel &Label, const DWLabel &Section,
1485                         bool isEH = false, bool useSet = true) {
1486     FoldingSetNodeID ID;
1487     DIESectionOffset::Profile(ID, Label, Section);
1488     void *Where;
1489     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1490     if (!Value) {
1491       Value = new DIESectionOffset(Label, Section, isEH, useSet);
1492       ValuesSet.InsertNode(Value, Where);
1493       Values.push_back(Value);
1494     }
1495
1496     Die->AddValue(Attribute, Form, Value);
1497   }
1498
1499   /// AddDelta - Add a label delta attribute data and value.
1500   ///
1501   void AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
1502                           const DWLabel &Hi, const DWLabel &Lo) {
1503     FoldingSetNodeID ID;
1504     DIEDelta::Profile(ID, Hi, Lo);
1505     void *Where;
1506     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1507     if (!Value) {
1508       Value = new DIEDelta(Hi, Lo);
1509       ValuesSet.InsertNode(Value, Where);
1510       Values.push_back(Value);
1511     }
1512
1513     Die->AddValue(Attribute, Form, Value);
1514   }
1515
1516   /// AddDIEntry - Add a DIE attribute data and value.
1517   ///
1518   void AddDIEntry(DIE *Die, unsigned Attribute, unsigned Form, DIE *Entry) {
1519     Die->AddValue(Attribute, Form, NewDIEntry(Entry));
1520   }
1521
1522   /// AddBlock - Add block data.
1523   ///
1524   void AddBlock(DIE *Die, unsigned Attribute, unsigned Form, DIEBlock *Block) {
1525     Block->ComputeSize(*this);
1526     FoldingSetNodeID ID;
1527     Block->Profile(ID);
1528     void *Where;
1529     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1530     if (!Value) {
1531       Value = Block;
1532       ValuesSet.InsertNode(Value, Where);
1533       Values.push_back(Value);
1534     } else {
1535       // Already exists, reuse the previous one.
1536       delete Block;
1537       Block = cast<DIEBlock>(Value);
1538     }
1539
1540     Die->AddValue(Attribute, Block->BestForm(), Value);
1541   }
1542
1543 private:
1544
1545   /// AddSourceLine - Add location information to specified debug information
1546   /// entry.
1547   void AddSourceLine(DIE *Die, DIVariable *V) {
1548     unsigned FileID = 0;
1549     unsigned Line = V->getLineNumber();
1550     if (V->getVersion() < DIDescriptor::Version7) {
1551       // Version6 or earlier. Use compile unit info to get file id.
1552       CompileUnit *Unit = FindCompileUnit(V->getCompileUnit());
1553       FileID = Unit->getID();
1554     } else {
1555       // Version7 or newer, use filename and directory info from DIVariable
1556       // directly.
1557       unsigned DID = Directories.idFor(V->getDirectory());
1558       FileID = SrcFiles.idFor(SrcFileInfo(DID, V->getFilename()));
1559     }
1560     AddUInt(Die, DW_AT_decl_file, 0, FileID);
1561     AddUInt(Die, DW_AT_decl_line, 0, Line);
1562   }
1563
1564   /// AddSourceLine - Add location information to specified debug information
1565   /// entry.
1566   void AddSourceLine(DIE *Die, DIGlobal *G) {
1567     unsigned FileID = 0;
1568     unsigned Line = G->getLineNumber();
1569     if (G->getVersion() < DIDescriptor::Version7) {
1570       // Version6 or earlier. Use compile unit info to get file id.
1571       CompileUnit *Unit = FindCompileUnit(G->getCompileUnit());
1572       FileID = Unit->getID();
1573     } else {
1574       // Version7 or newer, use filename and directory info from DIGlobal
1575       // directly.
1576       unsigned DID = Directories.idFor(G->getDirectory());
1577       FileID = SrcFiles.idFor(SrcFileInfo(DID, G->getFilename()));
1578     }
1579     AddUInt(Die, DW_AT_decl_file, 0, FileID);
1580     AddUInt(Die, DW_AT_decl_line, 0, Line);
1581   }
1582
1583   void AddSourceLine(DIE *Die, DIType *G) {
1584     unsigned FileID = 0;
1585     unsigned Line = G->getLineNumber();
1586     if (G->getVersion() < DIDescriptor::Version7) {
1587       // Version6 or earlier. Use compile unit info to get file id.
1588       CompileUnit *Unit = FindCompileUnit(G->getCompileUnit());
1589       FileID = Unit->getID();
1590     } else {
1591       // Version7 or newer, use filename and directory info from DIGlobal
1592       // directly.
1593       unsigned DID = Directories.idFor(G->getDirectory());
1594       FileID = SrcFiles.idFor(SrcFileInfo(DID, G->getFilename()));
1595     }
1596     AddUInt(Die, DW_AT_decl_file, 0, FileID);
1597     AddUInt(Die, DW_AT_decl_line, 0, Line);
1598   }
1599
1600   /// AddAddress - Add an address attribute to a die based on the location
1601   /// provided.
1602   void AddAddress(DIE *Die, unsigned Attribute,
1603                             const MachineLocation &Location) {
1604     unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
1605     DIEBlock *Block = new DIEBlock();
1606
1607     if (Location.isReg()) {
1608       if (Reg < 32) {
1609         AddUInt(Block, 0, DW_FORM_data1, DW_OP_reg0 + Reg);
1610       } else {
1611         AddUInt(Block, 0, DW_FORM_data1, DW_OP_regx);
1612         AddUInt(Block, 0, DW_FORM_udata, Reg);
1613       }
1614     } else {
1615       if (Reg < 32) {
1616         AddUInt(Block, 0, DW_FORM_data1, DW_OP_breg0 + Reg);
1617       } else {
1618         AddUInt(Block, 0, DW_FORM_data1, DW_OP_bregx);
1619         AddUInt(Block, 0, DW_FORM_udata, Reg);
1620       }
1621       AddUInt(Block, 0, DW_FORM_sdata, Location.getOffset());
1622     }
1623
1624     AddBlock(Die, Attribute, 0, Block);
1625   }
1626
1627   /// AddBasicType - Add a new basic type attribute to the specified entity.
1628   ///
1629   void AddBasicType(DIE *Entity, CompileUnit *Unit,
1630                     const std::string &Name,
1631                     unsigned Encoding, unsigned Size) {
1632
1633     DIE Buffer(DW_TAG_base_type);
1634     AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1635     AddUInt(&Buffer, DW_AT_encoding, DW_FORM_data1, Encoding);
1636     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1637     DIE *BasicTypeDie = Unit->AddDie(Buffer);
1638     AddDIEntry(Entity, DW_AT_type, DW_FORM_ref4, BasicTypeDie);
1639   }
1640
1641   /// AddPointerType - Add a new pointer type attribute to the specified entity.
1642   ///
1643   void AddPointerType(DIE *Entity, CompileUnit *Unit, const std::string &Name) {
1644     DIE Buffer(DW_TAG_pointer_type);
1645     AddUInt(&Buffer, DW_AT_byte_size, 0, TD->getPointerSize());
1646     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1647     DIE *PointerTypeDie =  Unit->AddDie(Buffer);
1648     AddDIEntry(Entity, DW_AT_type, DW_FORM_ref4, PointerTypeDie);
1649   }
1650
1651   /// AddType - Add a new type attribute to the specified entity.
1652   void AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {
1653     if (Ty.isNull()) {
1654       AddBasicType(Entity, DW_Unit, "", DW_ATE_signed, sizeof(int32_t));
1655       return;
1656     }
1657
1658     // Check for pre-existence.
1659     DIEntry *&Slot = DW_Unit->getDIEntrySlotFor(Ty.getGV());
1660     // If it exists then use the existing value.
1661     if (Slot) {
1662       Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot);
1663       return;
1664     }
1665
1666     // Set up proxy. 
1667     Slot = NewDIEntry();
1668
1669     // Construct type.
1670     DIE Buffer(DW_TAG_base_type);
1671     if (DIBasicType *BT = dyn_cast<DIBasicType>(&Ty))
1672       ConstructTypeDIE(DW_Unit, Buffer, BT);
1673     else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&Ty))
1674       ConstructTypeDIE(DW_Unit, Buffer, DT);
1675     else if (DICompositeType *CT = dyn_cast<DICompositeType>(&Ty))
1676       ConstructTypeDIE(DW_Unit, Buffer, CT);
1677
1678     // Add debug information entry to entity and unit.
1679     DIE *Die = DW_Unit->AddDie(Buffer);
1680     SetDIEntry(Slot, Die);
1681     Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot);
1682   }
1683
1684   /// ConstructTypeDIE - Construct basic type die from DIBasicType.
1685   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1686                         DIBasicType *BTy) {
1687     
1688     // Get core information.
1689     const std::string &Name = BTy->getName();
1690     Buffer.setTag(DW_TAG_base_type);
1691     AddUInt(&Buffer, DW_AT_encoding,  DW_FORM_data1, BTy->getEncoding());
1692     // Add name if not anonymous or intermediate type.
1693     if (!Name.empty())
1694       AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1695     uint64_t Size = BTy->getSizeInBits() >> 3;
1696     AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1697   }
1698
1699   /// ConstructTypeDIE - Construct derived type die from DIDerivedType.
1700   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1701                         DIDerivedType *DTy) {
1702
1703     // Get core information.
1704     const std::string &Name = DTy->getName();
1705     uint64_t Size = DTy->getSizeInBits() >> 3;
1706     unsigned Tag = DTy->getTag();
1707     // FIXME - Workaround for templates.
1708     if (Tag == DW_TAG_inheritance) Tag = DW_TAG_reference_type;
1709
1710     Buffer.setTag(Tag);
1711     // Map to main type, void will not have a type.
1712     DIType FromTy = DTy->getTypeDerivedFrom();
1713     AddType(DW_Unit, &Buffer, FromTy);
1714
1715     // Add name if not anonymous or intermediate type.
1716     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1717
1718     // Add size if non-zero (derived types might be zero-sized.)
1719     if (Size)
1720       AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1721
1722     // Add source line info if available and TyDesc is not a forward
1723     // declaration.
1724     // FIXME - Enable this. if (!DTy->isForwardDecl())
1725     // FIXME - Enable this.     AddSourceLine(&Buffer, *DTy);
1726   }
1727
1728   /// ConstructTypeDIE - Construct type DIE from DICompositeType.
1729   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1730                         DICompositeType *CTy) {
1731
1732     // Get core information.                                                              
1733     const std::string &Name = CTy->getName();
1734     uint64_t Size = CTy->getSizeInBits() >> 3;
1735     unsigned Tag = CTy->getTag();
1736     switch (Tag) {
1737     case DW_TAG_vector_type:
1738     case DW_TAG_array_type:
1739       ConstructArrayTypeDIE(DW_Unit, Buffer, CTy);
1740       break;
1741     //FIXME - Enable this. 
1742     // case DW_TAG_enumeration_type:
1743     //  DIArray Elements = CTy->getTypeArray();
1744     //  // Add enumerators to enumeration type.
1745     //  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) 
1746     //   ConstructEnumTypeDIE(Buffer, &Elements.getElement(i));
1747     //  break;
1748     case DW_TAG_subroutine_type: 
1749       {
1750         // Add prototype flag.
1751         AddUInt(&Buffer, DW_AT_prototyped, DW_FORM_flag, 1);
1752         DIArray Elements = CTy->getTypeArray();
1753         // Add return type.
1754         DIDescriptor RTy = Elements.getElement(0);
1755         if (DIBasicType *BT = dyn_cast<DIBasicType>(&RTy))
1756           AddType(DW_Unit, &Buffer, *BT);
1757         else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&RTy))
1758           AddType(DW_Unit, &Buffer, *DT);
1759         else if (DICompositeType *CT = dyn_cast<DICompositeType>(&RTy))
1760           AddType(DW_Unit, &Buffer, *CT);
1761
1762         //AddType(DW_Unit, &Buffer, Elements.getElement(0));
1763         // Add arguments.
1764         for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1765           DIE *Arg = new DIE(DW_TAG_formal_parameter);
1766           DIDescriptor Ty = Elements.getElement(i);
1767           if (DIBasicType *BT = dyn_cast<DIBasicType>(&Ty))
1768             AddType(DW_Unit, &Buffer, *BT);
1769           else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&Ty))
1770             AddType(DW_Unit, &Buffer, *DT);
1771           else if (DICompositeType *CT = dyn_cast<DICompositeType>(&Ty))
1772             AddType(DW_Unit, &Buffer, *CT);
1773           Buffer.AddChild(Arg);
1774         }
1775       }
1776       break;
1777     case DW_TAG_structure_type:
1778     case DW_TAG_union_type: 
1779       {
1780         // Add elements to structure type.
1781         DIArray Elements = CTy->getTypeArray();
1782         // Add elements to structure type.
1783         for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1784           DIDescriptor Element = Elements.getElement(i);
1785           if (DISubprogram *SP = dyn_cast<DISubprogram>(&Element))
1786             ConstructFieldTypeDIE(DW_Unit, Buffer, SP);
1787           else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&Element))
1788             ConstructFieldTypeDIE(DW_Unit, Buffer, DT);
1789           else if (DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(&Element))
1790             ConstructFieldTypeDIE(DW_Unit, Buffer, GV);
1791         }
1792       }
1793       break;
1794     default:
1795       break;
1796     }
1797
1798     // Add name if not anonymous or intermediate type.
1799     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1800
1801     // Add size if non-zero (derived types might be zero-sized.)
1802     if (Size)
1803       AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1804     else {
1805       // Add zero size even if it is not a forward declaration.
1806       // FIXME - Enable this.
1807       //      if (!CTy->isDefinition())
1808       //        AddUInt(&Buffer, DW_AT_declaration, DW_FORM_flag, 1);
1809       //      else
1810       //        AddUInt(&Buffer, DW_AT_byte_size, 0, 0); 
1811     }
1812
1813     // Add source line info if available and TyDesc is not a forward
1814     // declaration.
1815     // FIXME - Enable this.
1816     // if (CTy->isForwardDecl())                                            
1817     //   AddSourceLine(&Buffer, *CTy);                                    
1818   }
1819   
1820   // ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
1821   void ConstructSubrangeDIE (DIE &Buffer, DISubrange *SR, DIE *IndexTy) {
1822     int64_t L = SR->getLo();
1823     int64_t H = SR->getHi();
1824     DIE *DW_Subrange = new DIE(DW_TAG_subrange_type);
1825     if (L != H) {
1826       AddDIEntry(DW_Subrange, DW_AT_type, DW_FORM_ref4, IndexTy);
1827       if (L)
1828         AddSInt(DW_Subrange, DW_AT_lower_bound, 0, L);
1829         AddSInt(DW_Subrange, DW_AT_upper_bound, 0, H);
1830     }
1831     Buffer.AddChild(DW_Subrange);
1832   }
1833
1834   /// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
1835   void ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer, 
1836                              DICompositeType *CTy) {
1837     Buffer.setTag(DW_TAG_array_type);
1838     if (CTy->getTag() == DW_TAG_vector_type)
1839       AddUInt(&Buffer, DW_AT_GNU_vector, DW_FORM_flag, 1);
1840     
1841     DIArray Elements = CTy->getTypeArray();
1842     // FIXME - Enable this. 
1843     AddType(DW_Unit, &Buffer, CTy->getTypeDerivedFrom());
1844
1845     // Construct an anonymous type for index type.
1846     DIE IdxBuffer(DW_TAG_base_type);
1847     AddUInt(&IdxBuffer, DW_AT_byte_size, 0, sizeof(int32_t));
1848     AddUInt(&IdxBuffer, DW_AT_encoding, DW_FORM_data1, DW_ATE_signed);
1849     DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
1850
1851     // Add subranges to array type.
1852     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1853       DIDescriptor Element = Elements.getElement(i);
1854       if (DISubrange *SR = dyn_cast<DISubrange>(&Element))
1855         ConstructSubrangeDIE(Buffer, SR, IndexTy);
1856     }
1857   }
1858
1859   /// ConstructEnumTypeDIE - Construct enum type DIE from 
1860   /// DIEnumerator.
1861   void ConstructEnumTypeDIE(CompileUnit *DW_Unit, 
1862                             DIE &Buffer, DIEnumerator *ETy) {
1863
1864     DIE *Enumerator = new DIE(DW_TAG_enumerator);
1865     AddString(Enumerator, DW_AT_name, DW_FORM_string, ETy->getName());
1866     int64_t Value = ETy->getEnumValue();                             
1867     AddSInt(Enumerator, DW_AT_const_value, DW_FORM_sdata, Value);
1868     Buffer.AddChild(Enumerator);
1869   }
1870
1871   /// ConstructFieldTypeDIE - Construct variable DIE for a struct field.
1872   void ConstructFieldTypeDIE(CompileUnit *DW_Unit,
1873                              DIE &Buffer, DIGlobalVariable *V) {
1874
1875     DIE *VariableDie = new DIE(DW_TAG_variable);
1876     const std::string &LinkageName = V->getLinkageName();
1877     if (!LinkageName.empty())
1878       AddString(VariableDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
1879                 LinkageName);
1880     // FIXME - Enable this. AddSourceLine(VariableDie, V);
1881     AddType(DW_Unit, VariableDie, V->getType());
1882     if (!V->isLocalToUnit())
1883       AddUInt(VariableDie, DW_AT_external, DW_FORM_flag, 1);
1884     AddUInt(VariableDie, DW_AT_declaration, DW_FORM_flag, 1);
1885     Buffer.AddChild(VariableDie);
1886   }
1887
1888   /// ConstructFieldTypeDIE - Construct subprogram DIE for a struct field.
1889   void ConstructFieldTypeDIE(CompileUnit *DW_Unit,
1890                              DIE &Buffer, DISubprogram *SP,
1891                              bool IsConstructor = false) {
1892     DIE *Method = new DIE(DW_TAG_subprogram);
1893     AddString(Method, DW_AT_name, DW_FORM_string, SP->getName());
1894     const std::string &LinkageName = SP->getLinkageName();
1895     if (!LinkageName.empty())
1896       AddString(Method, DW_AT_MIPS_linkage_name, DW_FORM_string, LinkageName);
1897     // FIXME - Enable this. AddSourceLine(Method, SP);
1898
1899     DICompositeType MTy = SP->getType();
1900     DIArray Args = MTy.getTypeArray();
1901
1902     // Add Return Type.
1903     if (!IsConstructor) {
1904       DIDescriptor Ty = Args.getElement(0);
1905       if (DIBasicType *BT = dyn_cast<DIBasicType>(&Ty))
1906         AddType(DW_Unit, Method, *BT);
1907       else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&Ty))
1908         AddType(DW_Unit, Method, *DT);
1909       else if (DICompositeType *CT = dyn_cast<DICompositeType>(&Ty))
1910         AddType(DW_Unit, Method, *CT);
1911     }
1912
1913     // Add arguments.
1914     for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1915       DIE *Arg = new DIE(DW_TAG_formal_parameter);
1916       DIDescriptor Ty = Args.getElement(i);
1917       if (DIBasicType *BT = dyn_cast<DIBasicType>(&Ty))
1918         AddType(DW_Unit, Method, *BT);
1919       else if (DIDerivedType *DT = dyn_cast<DIDerivedType>(&Ty))
1920         AddType(DW_Unit, Method, *DT);
1921       else if (DICompositeType *CT = dyn_cast<DICompositeType>(&Ty))
1922         AddType(DW_Unit, Method, *CT);
1923       AddUInt(Arg, DW_AT_artificial, DW_FORM_flag, 1); // ???
1924       Method->AddChild(Arg);
1925     }
1926
1927     if (!SP->isLocalToUnit())
1928       AddUInt(Method, DW_AT_external, DW_FORM_flag, 1);                     
1929     Buffer.AddChild(Method);
1930   }
1931
1932   /// COnstructFieldTypeDIE - Construct derived type DIE for a struct field.
1933  void ConstructFieldTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1934                             DIDerivedType *DTy) {
1935     unsigned Tag = DTy->getTag();
1936     DIE *MemberDie = new DIE(Tag);
1937     if (!DTy->getName().empty())
1938       AddString(MemberDie, DW_AT_name, DW_FORM_string, DTy->getName());
1939     // FIXME - Enable this. AddSourceLine(MemberDie, DTy);
1940
1941     DIType FromTy = DTy->getTypeDerivedFrom();
1942     AddType(DW_Unit, MemberDie, FromTy);
1943
1944     uint64_t Size = DTy->getSizeInBits();
1945     uint64_t Offset = DTy->getOffsetInBits();
1946
1947     // FIXME Handle bitfields                                                      
1948
1949     // Add size.
1950     AddUInt(MemberDie, DW_AT_bit_size, 0, Size);
1951     // Add computation for offset.                                                        
1952     DIEBlock *Block = new DIEBlock();
1953     AddUInt(Block, 0, DW_FORM_data1, DW_OP_plus_uconst);
1954     AddUInt(Block, 0, DW_FORM_udata, Offset >> 3);
1955     AddBlock(MemberDie, DW_AT_data_member_location, 0, Block);
1956
1957     // FIXME Handle DW_AT_accessibility.
1958
1959     Buffer.AddChild(MemberDie);
1960   }
1961
1962   /// FindCompileUnit - Get the compile unit for the given descriptor.                    
1963   ///                                                                                     
1964   CompileUnit *FindCompileUnit(DICompileUnit Unit) {
1965     CompileUnit *DW_Unit = DW_CUs[Unit.getGV()];
1966     assert(DW_Unit && "Missing compile unit.");
1967     return DW_Unit;
1968   }
1969
1970   /// NewDbgScopeVariable - Create a new scope variable.
1971   ///
1972   DIE *NewDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
1973     // Get the descriptor.
1974     DIVariable *VD = DV->getVariable();
1975
1976     // Translate tag to proper Dwarf tag.  The result variable is dropped for
1977     // now.
1978     unsigned Tag;
1979     switch (VD->getTag()) {
1980     case DW_TAG_return_variable:  return NULL;
1981     case DW_TAG_arg_variable:     Tag = DW_TAG_formal_parameter; break;
1982     case DW_TAG_auto_variable:    // fall thru
1983     default:                      Tag = DW_TAG_variable; break;
1984     }
1985
1986     // Define variable debug information entry.
1987     DIE *VariableDie = new DIE(Tag);
1988     AddString(VariableDie, DW_AT_name, DW_FORM_string, VD->getName());
1989
1990     // Add source line info if available.
1991     AddSourceLine(VariableDie, VD);
1992
1993     // Add variable type.
1994     AddType(Unit, VariableDie, VD->getType());
1995
1996     // Add variable address.
1997     MachineLocation Location;
1998     Location.set(RI->getFrameRegister(*MF),
1999                  RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
2000     AddAddress(VariableDie, DW_AT_location, Location);
2001
2002     return VariableDie;
2003   }
2004
2005   /// getOrCreateScope - Returns the scope associated with the given descriptor.
2006   ///
2007   DbgScope *getOrCreateScope(GlobalVariable *V) {
2008     DbgScope *&Slot = DbgScopeMap[V];
2009     if (!Slot) {
2010       // FIXME - breaks down when the context is an inlined function.
2011       DIDescriptor ParentDesc;
2012       DIDescriptor Desc(V);
2013       if (Desc.getTag() == dwarf::DW_TAG_lexical_block) {
2014         DIBlock Block(V);
2015         ParentDesc = Block.getContext();
2016       }
2017       DbgScope *Parent = ParentDesc.isNull() ? 
2018         NULL : getOrCreateScope(ParentDesc.getGV());
2019       Slot = new DbgScope(Parent, Desc);
2020       if (Parent) {
2021         Parent->AddScope(Slot);
2022       } else if (RootDbgScope) {
2023         // FIXME - Add inlined function scopes to the root so we can delete
2024         // them later.  Long term, handle inlined functions properly.
2025         RootDbgScope->AddScope(Slot);
2026       } else {
2027         // First function is top level function.
2028         RootDbgScope = Slot;
2029       }
2030     }
2031     return Slot;
2032   }
2033
2034   /// ConstructDbgScope - Construct the components of a scope.
2035   ///
2036   void ConstructDbgScope(DbgScope *ParentScope,
2037                          unsigned ParentStartID, unsigned ParentEndID,
2038                          DIE *ParentDie, CompileUnit *Unit) {
2039     // Add variables to scope.
2040     SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
2041     for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2042       DIE *VariableDie = NewDbgScopeVariable(Variables[i], Unit);
2043       if (VariableDie) ParentDie->AddChild(VariableDie);
2044     }
2045
2046     // Add nested scopes.
2047     SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
2048     for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
2049       // Define the Scope debug information entry.
2050       DbgScope *Scope = Scopes[j];
2051       // FIXME - Ignore inlined functions for the time being.
2052       if (!Scope->getParent()) continue;
2053
2054       unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
2055       unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
2056
2057       // Ignore empty scopes.
2058       if (StartID == EndID && StartID != 0) continue;
2059       if (Scope->getScopes().empty() && Scope->getVariables().empty()) continue;
2060
2061       if (StartID == ParentStartID && EndID == ParentEndID) {
2062         // Just add stuff to the parent scope.
2063         ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
2064       } else {
2065         DIE *ScopeDie = new DIE(DW_TAG_lexical_block);
2066
2067         // Add the scope bounds.
2068         if (StartID) {
2069           AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
2070                              DWLabel("label", StartID));
2071         } else {
2072           AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
2073                              DWLabel("func_begin", SubprogramCount));
2074         }
2075         if (EndID) {
2076           AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
2077                              DWLabel("label", EndID));
2078         } else {
2079           AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
2080                              DWLabel("func_end", SubprogramCount));
2081         }
2082
2083         // Add the scope contents.
2084         ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
2085         ParentDie->AddChild(ScopeDie);
2086       }
2087     }
2088   }
2089
2090   /// ConstructRootDbgScope - Construct the scope for the subprogram.
2091   ///
2092   void ConstructRootDbgScope(DbgScope *RootScope) {
2093     // Exit if there is no root scope.
2094     if (!RootScope) return;
2095     DIDescriptor Desc = RootScope->getDesc();
2096     if (Desc.isNull())
2097       return;
2098
2099     // Get the subprogram debug information entry.
2100     DISubprogram SPD(Desc.getGV());
2101
2102     // Get the compile unit context.
2103     CompileUnit *Unit = FindCompileUnit(SPD.getCompileUnit());
2104
2105     // Get the subprogram die.
2106     DIE *SPDie = Unit->getDieMapSlotFor(SPD.getGV());
2107     assert(SPDie && "Missing subprogram descriptor");
2108
2109     // Add the function bounds.
2110     AddLabel(SPDie, DW_AT_low_pc, DW_FORM_addr,
2111                     DWLabel("func_begin", SubprogramCount));
2112     AddLabel(SPDie, DW_AT_high_pc, DW_FORM_addr,
2113                     DWLabel("func_end", SubprogramCount));
2114     MachineLocation Location(RI->getFrameRegister(*MF));
2115     AddAddress(SPDie, DW_AT_frame_base, Location);
2116
2117     ConstructDbgScope(RootScope, 0, 0, SPDie, Unit);
2118   }
2119
2120   /// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
2121   ///
2122   void ConstructDefaultDbgScope(MachineFunction *MF) {
2123     // Find the correct subprogram descriptor.
2124     std::string SPName = "llvm.dbg.subprograms";
2125     std::vector<GlobalVariable*> Result;
2126     getGlobalVariablesUsing(*M, SPName, Result);
2127     for (std::vector<GlobalVariable *>::iterator I = Result.begin(),
2128            E = Result.end(); I != E; ++I) {
2129
2130       DISubprogram *SPD = new DISubprogram(*I);
2131
2132       if (SPD->getName() == MF->getFunction()->getName()) {
2133         // Get the compile unit context.
2134         CompileUnit *Unit = FindCompileUnit(SPD->getCompileUnit());
2135
2136         // Get the subprogram die.
2137         DIE *SPDie = Unit->getDieMapSlotFor(SPD->getGV());
2138         assert(SPDie && "Missing subprogram descriptor");
2139
2140         // Add the function bounds.
2141         AddLabel(SPDie, DW_AT_low_pc, DW_FORM_addr,
2142                  DWLabel("func_begin", SubprogramCount));
2143         AddLabel(SPDie, DW_AT_high_pc, DW_FORM_addr,
2144                  DWLabel("func_end", SubprogramCount));
2145
2146         MachineLocation Location(RI->getFrameRegister(*MF));
2147         AddAddress(SPDie, DW_AT_frame_base, Location);
2148         return;
2149       }
2150     }
2151 #if 0
2152     // FIXME: This is causing an abort because C++ mangled names are compared
2153     // with their unmangled counterparts. See PR2885. Don't do this assert.
2154     assert(0 && "Couldn't find DIE for machine function!");
2155 #endif
2156   }
2157
2158   /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2159   /// tools to recognize the object file contains Dwarf information.
2160   void EmitInitial() {
2161     // Check to see if we already emitted intial headers.
2162     if (didInitial) return;
2163     didInitial = true;
2164
2165     // Dwarf sections base addresses.
2166     if (TAI->doesDwarfRequireFrameSection()) {
2167       Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
2168       EmitLabel("section_debug_frame", 0);
2169     }
2170     Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
2171     EmitLabel("section_info", 0);
2172     Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
2173     EmitLabel("section_abbrev", 0);
2174     Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
2175     EmitLabel("section_aranges", 0);
2176     Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
2177     EmitLabel("section_macinfo", 0);
2178     Asm->SwitchToDataSection(TAI->getDwarfLineSection());
2179     EmitLabel("section_line", 0);
2180     Asm->SwitchToDataSection(TAI->getDwarfLocSection());
2181     EmitLabel("section_loc", 0);
2182     Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
2183     EmitLabel("section_pubnames", 0);
2184     Asm->SwitchToDataSection(TAI->getDwarfStrSection());
2185     EmitLabel("section_str", 0);
2186     Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
2187     EmitLabel("section_ranges", 0);
2188
2189     Asm->SwitchToSection(TAI->getTextSection());
2190     EmitLabel("text_begin", 0);
2191     Asm->SwitchToSection(TAI->getDataSection());
2192     EmitLabel("data_begin", 0);
2193   }
2194
2195   /// EmitDIE - Recusively Emits a debug information entry.
2196   ///
2197   void EmitDIE(DIE *Die) {
2198     // Get the abbreviation for this DIE.
2199     unsigned AbbrevNumber = Die->getAbbrevNumber();
2200     const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2201
2202     Asm->EOL();
2203
2204     // Emit the code (index) for the abbreviation.
2205     Asm->EmitULEB128Bytes(AbbrevNumber);
2206
2207     if (VerboseAsm)
2208       Asm->EOL(std::string("Abbrev [" +
2209                            utostr(AbbrevNumber) +
2210                            "] 0x" + utohexstr(Die->getOffset()) +
2211                            ":0x" + utohexstr(Die->getSize()) + " " +
2212                            TagString(Abbrev->getTag())));
2213     else
2214       Asm->EOL();
2215
2216     SmallVector<DIEValue*, 32> &Values = Die->getValues();
2217     const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2218
2219     // Emit the DIE attribute values.
2220     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2221       unsigned Attr = AbbrevData[i].getAttribute();
2222       unsigned Form = AbbrevData[i].getForm();
2223       assert(Form && "Too many attributes for DIE (check abbreviation)");
2224
2225       switch (Attr) {
2226       case DW_AT_sibling: {
2227         Asm->EmitInt32(Die->SiblingOffset());
2228         break;
2229       }
2230       default: {
2231         // Emit an attribute using the defined form.
2232         Values[i]->EmitValue(*this, Form);
2233         break;
2234       }
2235       }
2236
2237       Asm->EOL(AttributeString(Attr));
2238     }
2239
2240     // Emit the DIE children if any.
2241     if (Abbrev->getChildrenFlag() == DW_CHILDREN_yes) {
2242       const std::vector<DIE *> &Children = Die->getChildren();
2243
2244       for (unsigned j = 0, M = Children.size(); j < M; ++j) {
2245         EmitDIE(Children[j]);
2246       }
2247
2248       Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2249     }
2250   }
2251
2252   /// SizeAndOffsetDie - Compute the size and offset of a DIE.
2253   ///
2254   unsigned SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2255     // Get the children.
2256     const std::vector<DIE *> &Children = Die->getChildren();
2257
2258     // If not last sibling and has children then add sibling offset attribute.
2259     if (!Last && !Children.empty()) Die->AddSiblingOffset();
2260
2261     // Record the abbreviation.
2262     AssignAbbrevNumber(Die->getAbbrev());
2263
2264     // Get the abbreviation for this DIE.
2265     unsigned AbbrevNumber = Die->getAbbrevNumber();
2266     const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2267
2268     // Set DIE offset
2269     Die->setOffset(Offset);
2270
2271     // Start the size with the size of abbreviation code.
2272     Offset += TargetAsmInfo::getULEB128Size(AbbrevNumber);
2273
2274     const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2275     const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2276
2277     // Size the DIE attribute values.
2278     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2279       // Size attribute value.
2280       Offset += Values[i]->SizeOf(*this, AbbrevData[i].getForm());
2281     }
2282
2283     // Size the DIE children if any.
2284     if (!Children.empty()) {
2285       assert(Abbrev->getChildrenFlag() == DW_CHILDREN_yes &&
2286              "Children flag not set");
2287
2288       for (unsigned j = 0, M = Children.size(); j < M; ++j) {
2289         Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2290       }
2291
2292       // End of children marker.
2293       Offset += sizeof(int8_t);
2294     }
2295
2296     Die->setSize(Offset - Die->getOffset());
2297     return Offset;
2298   }
2299
2300   /// SizeAndOffsets - Compute the size and offset of all the DIEs.
2301   ///
2302   void SizeAndOffsets() {
2303     // Process base compile unit.
2304     for (DenseMap<Value *, CompileUnit *>::iterator CI = DW_CUs.begin(),
2305            CE = DW_CUs.end(); CI != CE; ++CI) {
2306       CompileUnit *Unit = CI->second;
2307       // Compute size of compile unit header
2308       unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info
2309         sizeof(int16_t) + // DWARF version number
2310         sizeof(int32_t) + // Offset Into Abbrev. Section
2311         sizeof(int8_t);   // Pointer Size (in bytes)
2312       SizeAndOffsetDie(Unit->getDie(), Offset, true);
2313     }
2314   }
2315
2316   /// EmitDebugInfo - Emit the debug info section.
2317   ///
2318   void EmitDebugInfo() {
2319     // Start debug info section.
2320     Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
2321
2322     for (DenseMap<Value *, CompileUnit *>::iterator CI = DW_CUs.begin(),
2323            CE = DW_CUs.end(); CI != CE; ++CI) {
2324       CompileUnit *Unit = CI->second;
2325       DIE *Die = Unit->getDie();
2326       // Emit the compile units header.
2327       EmitLabel("info_begin", Unit->getID());
2328       // Emit size of content not including length itself
2329       unsigned ContentSize = Die->getSize() +
2330         sizeof(int16_t) + // DWARF version number
2331         sizeof(int32_t) + // Offset Into Abbrev. Section
2332         sizeof(int8_t) +  // Pointer Size (in bytes)
2333         sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2334       
2335       Asm->EmitInt32(ContentSize);  Asm->EOL("Length of Compilation Unit Info");
2336       Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF version number");
2337       EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2338       Asm->EOL("Offset Into Abbrev. Section");
2339       Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2340       
2341       EmitDIE(Die);
2342       // FIXME - extra padding for gdb bug.
2343       Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2344       Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2345       Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2346       Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2347       EmitLabel("info_end", Unit->getID());
2348       
2349       Asm->EOL();
2350     }
2351   }
2352
2353   /// EmitAbbreviations - Emit the abbreviation section.
2354   ///
2355   void EmitAbbreviations() const {
2356     // Check to see if it is worth the effort.
2357     if (!Abbreviations.empty()) {
2358       // Start the debug abbrev section.
2359       Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
2360
2361       EmitLabel("abbrev_begin", 0);
2362
2363       // For each abbrevation.
2364       for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2365         // Get abbreviation data
2366         const DIEAbbrev *Abbrev = Abbreviations[i];
2367
2368         // Emit the abbrevations code (base 1 index.)
2369         Asm->EmitULEB128Bytes(Abbrev->getNumber());
2370         Asm->EOL("Abbreviation Code");
2371
2372         // Emit the abbreviations data.
2373         Abbrev->Emit(*this);
2374
2375         Asm->EOL();
2376       }
2377
2378       // Mark end of abbreviations.
2379       Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2380
2381       EmitLabel("abbrev_end", 0);
2382
2383       Asm->EOL();
2384     }
2385   }
2386
2387   /// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2388   /// the line matrix.
2389   ///
2390   void EmitEndOfLineMatrix(unsigned SectionEnd) {
2391     // Define last address of section.
2392     Asm->EmitInt8(0); Asm->EOL("Extended Op");
2393     Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2394     Asm->EmitInt8(DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2395     EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2396
2397     // Mark end of matrix.
2398     Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2399     Asm->EmitULEB128Bytes(1); Asm->EOL();
2400     Asm->EmitInt8(1); Asm->EOL();
2401   }
2402
2403   /// EmitDebugLines - Emit source line information.
2404   ///
2405   void EmitDebugLines() {
2406     // If the target is using .loc/.file, the assembler will be emitting the
2407     // .debug_line table automatically.
2408     if (TAI->hasDotLocAndDotFile())
2409       return;
2410
2411     // Minimum line delta, thus ranging from -10..(255-10).
2412     const int MinLineDelta = -(DW_LNS_fixed_advance_pc + 1);
2413     // Maximum line delta, thus ranging from -10..(255-10).
2414     const int MaxLineDelta = 255 + MinLineDelta;
2415
2416     // Start the dwarf line section.
2417     Asm->SwitchToDataSection(TAI->getDwarfLineSection());
2418
2419     // Construct the section header.
2420
2421     EmitDifference("line_end", 0, "line_begin", 0, true);
2422     Asm->EOL("Length of Source Line Info");
2423     EmitLabel("line_begin", 0);
2424
2425     Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF version number");
2426
2427     EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2428     Asm->EOL("Prolog Length");
2429     EmitLabel("line_prolog_begin", 0);
2430
2431     Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2432
2433     Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2434
2435     Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2436
2437     Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2438
2439     Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2440
2441     // Line number standard opcode encodings argument count
2442     Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2443     Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2444     Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2445     Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2446     Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2447     Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2448     Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2449     Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2450     Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2451
2452     // Emit directories.
2453     for (unsigned DirectoryID = 1, NDID = Directories.size();
2454                   DirectoryID <= NDID; ++DirectoryID) {
2455       Asm->EmitString(Directories[DirectoryID]); Asm->EOL("Directory");
2456     }
2457     Asm->EmitInt8(0); Asm->EOL("End of directories");
2458
2459     // Emit files.
2460     for (unsigned SourceID = 1, NSID = SrcFiles.size();
2461                  SourceID <= NSID; ++SourceID) {
2462       const SrcFileInfo &SourceFile = SrcFiles[SourceID];
2463       Asm->EmitString(SourceFile.getName());
2464       Asm->EOL("Source");
2465       Asm->EmitULEB128Bytes(SourceFile.getDirectoryID());
2466       Asm->EOL("Directory #");
2467       Asm->EmitULEB128Bytes(0);
2468       Asm->EOL("Mod date");
2469       Asm->EmitULEB128Bytes(0);
2470       Asm->EOL("File size");
2471     }
2472     Asm->EmitInt8(0); Asm->EOL("End of files");
2473
2474     EmitLabel("line_prolog_end", 0);
2475
2476     // A sequence for each text section.
2477     unsigned SecSrcLinesSize = SectionSourceLines.size();
2478
2479     for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2480       // Isolate current sections line info.
2481       const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2482
2483       if (VerboseAsm) {
2484         const Section* S = SectionMap[j + 1];
2485         Asm->EOL(std::string("Section ") + S->getName());
2486       } else
2487         Asm->EOL();
2488
2489       // Dwarf assumes we start with first line of first source file.
2490       unsigned Source = 1;
2491       unsigned Line = 1;
2492
2493       // Construct rows of the address, source, line, column matrix.
2494       for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2495         const SrcLineInfo &LineInfo = LineInfos[i];
2496         unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2497         if (!LabelID) continue;
2498
2499         unsigned SourceID = LineInfo.getSourceID();
2500         const SrcFileInfo &SourceFile = SrcFiles[SourceID];
2501         unsigned DirectoryID = SourceFile.getDirectoryID();
2502         if (VerboseAsm)
2503           Asm->EOL(Directories[DirectoryID]
2504                    + SourceFile.getName()
2505                    + ":"
2506                    + utostr_32(LineInfo.getLine()));
2507         else
2508           Asm->EOL();
2509
2510         // Define the line address.
2511         Asm->EmitInt8(0); Asm->EOL("Extended Op");
2512         Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2513         Asm->EmitInt8(DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2514         EmitReference("label",  LabelID); Asm->EOL("Location label");
2515
2516         // If change of source, then switch to the new source.
2517         if (Source != LineInfo.getSourceID()) {
2518           Source = LineInfo.getSourceID();
2519           Asm->EmitInt8(DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2520           Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2521         }
2522
2523         // If change of line.
2524         if (Line != LineInfo.getLine()) {
2525           // Determine offset.
2526           int Offset = LineInfo.getLine() - Line;
2527           int Delta = Offset - MinLineDelta;
2528
2529           // Update line.
2530           Line = LineInfo.getLine();
2531
2532           // If delta is small enough and in range...
2533           if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2534             // ... then use fast opcode.
2535             Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2536           } else {
2537             // ... otherwise use long hand.
2538             Asm->EmitInt8(DW_LNS_advance_line); Asm->EOL("DW_LNS_advance_line");
2539             Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2540             Asm->EmitInt8(DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2541           }
2542         } else {
2543           // Copy the previous row (different address or source)
2544           Asm->EmitInt8(DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2545         }
2546       }
2547
2548       EmitEndOfLineMatrix(j + 1);
2549     }
2550
2551     if (SecSrcLinesSize == 0)
2552       // Because we're emitting a debug_line section, we still need a line
2553       // table. The linker and friends expect it to exist. If there's nothing to
2554       // put into it, emit an empty table.
2555       EmitEndOfLineMatrix(1);
2556
2557     EmitLabel("line_end", 0);
2558
2559     Asm->EOL();
2560   }
2561
2562   /// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2563   ///
2564   void EmitCommonDebugFrame() {
2565     if (!TAI->doesDwarfRequireFrameSection())
2566       return;
2567
2568     int stackGrowth =
2569         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2570           TargetFrameInfo::StackGrowsUp ?
2571         TD->getPointerSize() : -TD->getPointerSize();
2572
2573     // Start the dwarf frame section.
2574     Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
2575
2576     EmitLabel("debug_frame_common", 0);
2577     EmitDifference("debug_frame_common_end", 0,
2578                    "debug_frame_common_begin", 0, true);
2579     Asm->EOL("Length of Common Information Entry");
2580
2581     EmitLabel("debug_frame_common_begin", 0);
2582     Asm->EmitInt32((int)DW_CIE_ID);
2583     Asm->EOL("CIE Identifier Tag");
2584     Asm->EmitInt8(DW_CIE_VERSION);
2585     Asm->EOL("CIE Version");
2586     Asm->EmitString("");
2587     Asm->EOL("CIE Augmentation");
2588     Asm->EmitULEB128Bytes(1);
2589     Asm->EOL("CIE Code Alignment Factor");
2590     Asm->EmitSLEB128Bytes(stackGrowth);
2591     Asm->EOL("CIE Data Alignment Factor");
2592     Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2593     Asm->EOL("CIE RA Column");
2594
2595     std::vector<MachineMove> Moves;
2596     RI->getInitialFrameState(Moves);
2597
2598     EmitFrameMoves(NULL, 0, Moves, false);
2599
2600     Asm->EmitAlignment(2, 0, 0, false);
2601     EmitLabel("debug_frame_common_end", 0);
2602
2603     Asm->EOL();
2604   }
2605
2606   /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2607   /// section.
2608   void EmitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2609     if (!TAI->doesDwarfRequireFrameSection())
2610       return;
2611
2612     // Start the dwarf frame section.
2613     Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
2614
2615     EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2616                    "debug_frame_begin", DebugFrameInfo.Number, true);
2617     Asm->EOL("Length of Frame Information Entry");
2618
2619     EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2620
2621     EmitSectionOffset("debug_frame_common", "section_debug_frame",
2622                       0, 0, true, false);
2623     Asm->EOL("FDE CIE offset");
2624
2625     EmitReference("func_begin", DebugFrameInfo.Number);
2626     Asm->EOL("FDE initial location");
2627     EmitDifference("func_end", DebugFrameInfo.Number,
2628                    "func_begin", DebugFrameInfo.Number);
2629     Asm->EOL("FDE address range");
2630
2631     EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves, false);
2632
2633     Asm->EmitAlignment(2, 0, 0, false);
2634     EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2635
2636     Asm->EOL();
2637   }
2638
2639   /// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2640   ///
2641   void EmitDebugPubNames() {
2642     // Start the dwarf pubnames section.
2643     Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
2644
2645     for (DenseMap<Value *, CompileUnit *>::iterator CI = DW_CUs.begin(),
2646            CE = DW_CUs.end(); CI != CE; ++CI) {
2647       CompileUnit *Unit = CI->second;
2648
2649       EmitDifference("pubnames_end", Unit->getID(),
2650                      "pubnames_begin", Unit->getID(), true);
2651       Asm->EOL("Length of Public Names Info");
2652       
2653       EmitLabel("pubnames_begin", Unit->getID());
2654       
2655       Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF Version");
2656       
2657       EmitSectionOffset("info_begin", "section_info",
2658                         Unit->getID(), 0, true, false);
2659       Asm->EOL("Offset of Compilation Unit Info");
2660       
2661       EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),true);
2662       Asm->EOL("Compilation Unit Length");
2663       
2664       std::map<std::string, DIE *> &Globals = Unit->getGlobals();
2665       
2666       for (std::map<std::string, DIE *>::iterator GI = Globals.begin(),
2667              GE = Globals.end();
2668            GI != GE; ++GI) {
2669         const std::string &Name = GI->first;
2670         DIE * Entity = GI->second;
2671         
2672         Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2673         Asm->EmitString(Name); Asm->EOL("External Name");
2674       }
2675       
2676       Asm->EmitInt32(0); Asm->EOL("End Mark");
2677       EmitLabel("pubnames_end", Unit->getID());
2678       
2679       Asm->EOL();
2680     }
2681   }
2682
2683   /// EmitDebugStr - Emit visible names into a debug str section.
2684   ///
2685   void EmitDebugStr() {
2686     // Check to see if it is worth the effort.
2687     if (!StringPool.empty()) {
2688       // Start the dwarf str section.
2689       Asm->SwitchToDataSection(TAI->getDwarfStrSection());
2690
2691       // For each of strings in the string pool.
2692       for (unsigned StringID = 1, N = StringPool.size();
2693            StringID <= N; ++StringID) {
2694         // Emit a label for reference from debug information entries.
2695         EmitLabel("string", StringID);
2696         // Emit the string itself.
2697         const std::string &String = StringPool[StringID];
2698         Asm->EmitString(String); Asm->EOL();
2699       }
2700
2701       Asm->EOL();
2702     }
2703   }
2704
2705   /// EmitDebugLoc - Emit visible names into a debug loc section.
2706   ///
2707   void EmitDebugLoc() {
2708     // Start the dwarf loc section.
2709     Asm->SwitchToDataSection(TAI->getDwarfLocSection());
2710
2711     Asm->EOL();
2712   }
2713
2714   /// EmitDebugARanges - Emit visible names into a debug aranges section.
2715   ///
2716   void EmitDebugARanges() {
2717     // Start the dwarf aranges section.
2718     Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
2719
2720     // FIXME - Mock up
2721 #if 0
2722     CompileUnit *Unit = GetBaseCompileUnit();
2723
2724     // Don't include size of length
2725     Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2726
2727     Asm->EmitInt16(DWARF_VERSION); Asm->EOL("Dwarf Version");
2728
2729     EmitReference("info_begin", Unit->getID());
2730     Asm->EOL("Offset of Compilation Unit Info");
2731
2732     Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2733
2734     Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2735
2736     Asm->EmitInt16(0);  Asm->EOL("Pad (1)");
2737     Asm->EmitInt16(0);  Asm->EOL("Pad (2)");
2738
2739     // Range 1
2740     EmitReference("text_begin", 0); Asm->EOL("Address");
2741     EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2742
2743     Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2744     Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2745 #endif
2746
2747     Asm->EOL();
2748   }
2749
2750   /// EmitDebugRanges - Emit visible names into a debug ranges section.
2751   ///
2752   void EmitDebugRanges() {
2753     // Start the dwarf ranges section.
2754     Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
2755
2756     Asm->EOL();
2757   }
2758
2759   /// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2760   ///
2761   void EmitDebugMacInfo() {
2762     // Start the dwarf macinfo section.
2763     Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
2764
2765     Asm->EOL();
2766   }
2767
2768   /// ConstructCompileUnits - Create a compile unit DIEs.
2769   void ConstructCompileUnits() {
2770     std::string CUName = "llvm.dbg.compile_units";
2771     std::vector<GlobalVariable*> Result;
2772     getGlobalVariablesUsing(*M, CUName, Result);
2773     for (std::vector<GlobalVariable *>::iterator RI = Result.begin(),
2774            RE = Result.end(); RI != RE; ++RI) {
2775       DICompileUnit *DIUnit = new DICompileUnit(*RI);
2776       unsigned ID = RecordSource(DIUnit->getDirectory(),
2777                                  DIUnit->getFilename());
2778
2779       DIE *Die = new DIE(DW_TAG_compile_unit);
2780       AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4,
2781                        DWLabel("section_line", 0), DWLabel("section_line", 0),
2782                        false);
2783       AddString(Die, DW_AT_producer, DW_FORM_string, DIUnit->getProducer());
2784       AddUInt(Die, DW_AT_language, DW_FORM_data1, DIUnit->getLanguage());
2785       AddString(Die, DW_AT_name, DW_FORM_string, DIUnit->getFilename());
2786       if (!DIUnit->getDirectory().empty())
2787         AddString(Die, DW_AT_comp_dir, DW_FORM_string, DIUnit->getDirectory());
2788
2789       CompileUnit *Unit = new CompileUnit(ID, Die);
2790       DW_CUs[DIUnit->getGV()] = Unit;
2791     }
2792   }
2793
2794   /// ConstructGlobalVariableDIEs - Create DIEs for each of the externally 
2795   /// visible global variables.
2796   void ConstructGlobalVariableDIEs() {
2797     std::string GVName = "llvm.dbg.global_variables";
2798     std::vector<GlobalVariable*> Result;
2799     getGlobalVariablesUsing(*M, GVName, Result);
2800     for (std::vector<GlobalVariable *>::iterator GVI = Result.begin(),
2801            GVE = Result.end(); GVI != GVE; ++GVI) {
2802       DIGlobalVariable *DI_GV = new DIGlobalVariable(*GVI);
2803       CompileUnit *DW_Unit = FindCompileUnit(DI_GV->getCompileUnit());
2804
2805       // Check for pre-existence.
2806       DIE *&Slot = DW_Unit->getDieMapSlotFor(DI_GV->getGV());
2807       if (Slot) continue;
2808
2809       DIE *VariableDie = new DIE(DW_TAG_variable);
2810       AddString(VariableDie, DW_AT_name, DW_FORM_string, DI_GV->getName());
2811       const std::string &LinkageName  = DI_GV->getLinkageName();
2812       if (!LinkageName.empty())
2813         AddString(VariableDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
2814                   LinkageName);
2815       AddType(DW_Unit, VariableDie, DI_GV->getType());
2816
2817       if (!DI_GV->isLocalToUnit())
2818         AddUInt(VariableDie, DW_AT_external, DW_FORM_flag, 1);              
2819
2820       // Add source line info, if available.
2821       AddSourceLine(VariableDie, DI_GV);
2822
2823       // Add address.
2824       DIEBlock *Block = new DIEBlock();
2825       AddUInt(Block, 0, DW_FORM_data1, DW_OP_addr);
2826       AddObjectLabel(Block, 0, DW_FORM_udata,
2827                      Asm->getGlobalLinkName(DI_GV->getGV()));
2828       AddBlock(VariableDie, DW_AT_location, 0, Block);
2829
2830       //Add to map.
2831       Slot = VariableDie;
2832
2833       //Add to context owner.
2834       DW_Unit->getDie()->AddChild(VariableDie);
2835
2836       //Expose as global. FIXME - need to check external flag.
2837       DW_Unit->AddGlobal(DI_GV->getName(), VariableDie);
2838     }
2839   }
2840
2841   /// ConstructSubprograms - Create DIEs for each of the externally visible
2842   /// subprograms.
2843   void ConstructSubprograms() {
2844
2845     std::string SPName = "llvm.dbg.subprograms";
2846     std::vector<GlobalVariable*> Result;
2847     getGlobalVariablesUsing(*M, SPName, Result);
2848     for (std::vector<GlobalVariable *>::iterator RI = Result.begin(),
2849            RE = Result.end(); RI != RE; ++RI) {
2850
2851       DISubprogram *SP = new DISubprogram(*RI);
2852       CompileUnit *Unit = FindCompileUnit(SP->getCompileUnit());
2853
2854       // Check for pre-existence.                                                         
2855       DIE *&Slot = Unit->getDieMapSlotFor(SP->getGV());
2856       if (Slot) continue;
2857
2858       DIE *SubprogramDie = new DIE(DW_TAG_subprogram);
2859       AddString(SubprogramDie, DW_AT_name, DW_FORM_string, SP->getName());
2860       const std::string &LinkageName = SP->getLinkageName();
2861       if (!LinkageName.empty())
2862         AddString(SubprogramDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
2863                   LinkageName);
2864       DIType SPTy = SP->getType();
2865       AddType(Unit, SubprogramDie, SPTy);
2866       if (!SP->isLocalToUnit())
2867         AddUInt(SubprogramDie, DW_AT_external, DW_FORM_flag, 1);
2868       AddUInt(SubprogramDie, DW_AT_prototyped, DW_FORM_flag, 1);
2869
2870       AddSourceLine(SubprogramDie, SP);
2871       //Add to map.
2872       Slot = SubprogramDie;
2873       //Add to context owner.
2874       Unit->getDie()->AddChild(SubprogramDie);
2875       //Expose as global.
2876       Unit->AddGlobal(SP->getName(), SubprogramDie);
2877     }
2878   }
2879
2880 public:
2881   //===--------------------------------------------------------------------===//
2882   // Main entry points.
2883   //
2884   DwarfDebug(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
2885   : Dwarf(OS, A, T, "dbg")
2886   , CompileUnits()
2887   , AbbreviationsSet(InitAbbreviationsSetSize)
2888   , Abbreviations()
2889   , ValuesSet(InitValuesSetSize)
2890   , Values()
2891   , StringPool()
2892   , SectionMap()
2893   , SectionSourceLines()
2894   , didInitial(false)
2895   , shouldEmit(false)
2896   , RootDbgScope(NULL)
2897   {
2898   }
2899   virtual ~DwarfDebug() {
2900     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i)
2901       delete CompileUnits[i];
2902     for (unsigned j = 0, M = Values.size(); j < M; ++j)
2903       delete Values[j];
2904   }
2905
2906   /// SetDebugInfo - Create global DIEs and emit initial debug info sections.
2907   /// This is inovked by the target AsmPrinter.
2908   void SetDebugInfo(MachineModuleInfo *mmi) {
2909
2910       // Create all the compile unit DIEs.
2911       ConstructCompileUnits();
2912       
2913       if (DW_CUs.empty())
2914         return;
2915
2916       MMI = mmi;
2917       shouldEmit = true;
2918       MMI->setDebugInfoAvailability(true);
2919
2920       // Create DIEs for each of the externally visible global variables.
2921       ConstructGlobalVariableDIEs();
2922
2923       // Create DIEs for each of the externally visible subprograms.
2924       ConstructSubprograms();
2925
2926       // Prime section data.
2927       SectionMap.insert(TAI->getTextSection());
2928
2929       // Print out .file directives to specify files for .loc directives. These
2930       // are printed out early so that they precede any .loc directives.
2931       if (TAI->hasDotLocAndDotFile()) {
2932         for (unsigned i = 1, e = SrcFiles.size(); i <= e; ++i) {
2933           sys::Path FullPath(Directories[SrcFiles[i].getDirectoryID()]);
2934           bool AppendOk = FullPath.appendComponent(SrcFiles[i].getName());
2935           assert(AppendOk && "Could not append filename to directory!");
2936           AppendOk = false;
2937           Asm->EmitFile(i, FullPath.toString());
2938           Asm->EOL();
2939         }
2940       }
2941
2942       // Emit initial sections
2943       EmitInitial();
2944   }
2945
2946   /// BeginModule - Emit all Dwarf sections that should come prior to the
2947   /// content.
2948   void BeginModule(Module *M) {
2949     this->M = M;
2950   }
2951
2952   /// EndModule - Emit all Dwarf sections that should come after the content.
2953   ///
2954   void EndModule() {
2955     if (!ShouldEmitDwarf()) return;
2956
2957     // Standard sections final addresses.
2958     Asm->SwitchToSection(TAI->getTextSection());
2959     EmitLabel("text_end", 0);
2960     Asm->SwitchToSection(TAI->getDataSection());
2961     EmitLabel("data_end", 0);
2962
2963     // End text sections.
2964     for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2965       Asm->SwitchToSection(SectionMap[i]);
2966       EmitLabel("section_end", i);
2967     }
2968
2969     // Emit common frame information.
2970     EmitCommonDebugFrame();
2971
2972     // Emit function debug frame information
2973     for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2974            E = DebugFrames.end(); I != E; ++I)
2975       EmitFunctionDebugFrame(*I);
2976
2977     // Compute DIE offsets and sizes.
2978     SizeAndOffsets();
2979
2980     // Emit all the DIEs into a debug info section
2981     EmitDebugInfo();
2982
2983     // Corresponding abbreviations into a abbrev section.
2984     EmitAbbreviations();
2985
2986     // Emit source line correspondence into a debug line section.
2987     EmitDebugLines();
2988
2989     // Emit info into a debug pubnames section.
2990     EmitDebugPubNames();
2991
2992     // Emit info into a debug str section.
2993     EmitDebugStr();
2994
2995     // Emit info into a debug loc section.
2996     EmitDebugLoc();
2997
2998     // Emit info into a debug aranges section.
2999     EmitDebugARanges();
3000
3001     // Emit info into a debug ranges section.
3002     EmitDebugRanges();
3003
3004     // Emit info into a debug macinfo section.
3005     EmitDebugMacInfo();
3006   }
3007
3008   /// BeginFunction - Gather pre-function debug information.  Assumes being
3009   /// emitted immediately after the function entry point.
3010   void BeginFunction(MachineFunction *MF) {
3011     this->MF = MF;
3012
3013     if (!ShouldEmitDwarf()) return;
3014
3015     // Begin accumulating function debug information.
3016     MMI->BeginFunction(MF);
3017
3018     // Assumes in correct section after the entry point.
3019     EmitLabel("func_begin", ++SubprogramCount);
3020
3021     // Emit label for the implicitly defined dbg.stoppoint at the start of
3022     // the function.
3023     if (!Lines.empty()) {
3024       const SrcLineInfo &LineInfo = Lines[0];
3025       Asm->printLabel(LineInfo.getLabelID());
3026     }
3027   }
3028
3029   /// EndFunction - Gather and emit post-function debug information.
3030   ///
3031   void EndFunction(MachineFunction *MF) {
3032     if (!ShouldEmitDwarf()) return;
3033
3034     // Define end label for subprogram.
3035     EmitLabel("func_end", SubprogramCount);
3036
3037     // Get function line info.
3038     if (!Lines.empty()) {
3039       // Get section line info.
3040       unsigned ID = SectionMap.insert(Asm->CurrentSection_);
3041       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
3042       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
3043       // Append the function info to section info.
3044       SectionLineInfos.insert(SectionLineInfos.end(),
3045                               Lines.begin(), Lines.end());
3046     }
3047
3048     // Construct scopes for subprogram.
3049     if (RootDbgScope)
3050       ConstructRootDbgScope(RootDbgScope);
3051     else
3052       // FIXME: This is wrong. We are essentially getting past a problem with
3053       // debug information not being able to handle unreachable blocks that have
3054       // debug information in them. In particular, those unreachable blocks that
3055       // have "region end" info in them. That situation results in the "root
3056       // scope" not being created. If that's the case, then emit a "default"
3057       // scope, i.e., one that encompasses the whole function. This isn't
3058       // desirable. And a better way of handling this (and all of the debugging
3059       // information) needs to be explored.
3060       ConstructDefaultDbgScope(MF);
3061
3062     DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
3063                                                  MMI->getFrameMoves()));
3064
3065     // Clear debug info
3066     if (RootDbgScope) {
3067       delete RootDbgScope;
3068       DbgScopeMap.clear();
3069       RootDbgScope = NULL;
3070     }
3071     Lines.clear();
3072   }
3073
3074 public:
3075
3076   /// RecordSourceLine - Records location information and associates it with a 
3077   /// label. Returns a unique label ID used to generate a label and provide
3078   /// correspondence to the source line list.
3079   unsigned RecordSourceLine(Value *V, unsigned Line, unsigned Col) {
3080     CompileUnit *Unit = DW_CUs[V];
3081     assert (Unit && "Unable to find CompileUnit");
3082     unsigned ID = MMI->NextLabelID();
3083     Lines.push_back(SrcLineInfo(Line, Col, Unit->getID(), ID));
3084     return ID;
3085   }
3086   
3087   /// RecordSourceLine - Records location information and associates it with a 
3088   /// label. Returns a unique label ID used to generate a label and provide
3089   /// correspondence to the source line list.
3090   unsigned RecordSourceLine(unsigned Line, unsigned Col, unsigned Src) {
3091     unsigned ID = MMI->NextLabelID();
3092     Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
3093     return ID;
3094   }
3095
3096   unsigned getRecordSourceLineCount() {
3097     return Lines.size();
3098   }
3099                             
3100   /// RecordSource - Register a source file with debug info. Returns an source
3101   /// ID.
3102   unsigned RecordSource(const std::string &Directory,
3103                         const std::string &File) {
3104     unsigned DID = Directories.insert(Directory);
3105     return SrcFiles.insert(SrcFileInfo(DID,File));
3106   }
3107
3108   /// RecordRegionStart - Indicate the start of a region.
3109   ///
3110   unsigned RecordRegionStart(GlobalVariable *V) {
3111     DbgScope *Scope = getOrCreateScope(V);
3112     unsigned ID = MMI->NextLabelID();
3113     if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
3114     return ID;
3115   }
3116
3117   /// RecordRegionEnd - Indicate the end of a region.
3118   ///
3119   unsigned RecordRegionEnd(GlobalVariable *V) {
3120     DbgScope *Scope = getOrCreateScope(V);
3121     unsigned ID = MMI->NextLabelID();
3122     Scope->setEndLabelID(ID);
3123     return ID;
3124   }
3125
3126   /// RecordVariable - Indicate the declaration of  a local variable.
3127   ///
3128   void RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {
3129     DIDescriptor Desc(GV);
3130     DbgScope *Scope = NULL;
3131     if (Desc.getTag() == DW_TAG_variable) {
3132       // GV is a global variable.
3133       DIGlobalVariable DG(GV);
3134       Scope = getOrCreateScope(DG.getContext().getGV());
3135     } else {
3136       // or GV is a local variable.
3137       DIVariable DV(GV);
3138       Scope = getOrCreateScope(DV.getContext().getGV());
3139     }
3140     assert (Scope && "Unable to find variable' scope");
3141     DIVariable *VD = new DIVariable(GV);
3142     DbgVariable *DV = new DbgVariable(VD, FrameIndex);
3143     Scope->AddVariable(DV);
3144   }
3145 };
3146
3147 //===----------------------------------------------------------------------===//
3148 /// DwarfException - Emits Dwarf exception handling directives.
3149 ///
3150 class DwarfException : public Dwarf  {
3151
3152 private:
3153   struct FunctionEHFrameInfo {
3154     std::string FnName;
3155     unsigned Number;
3156     unsigned PersonalityIndex;
3157     bool hasCalls;
3158     bool hasLandingPads;
3159     std::vector<MachineMove> Moves;
3160     const Function * function;
3161
3162     FunctionEHFrameInfo(const std::string &FN, unsigned Num, unsigned P,
3163                         bool hC, bool hL,
3164                         const std::vector<MachineMove> &M,
3165                         const Function *f):
3166       FnName(FN), Number(Num), PersonalityIndex(P),
3167       hasCalls(hC), hasLandingPads(hL), Moves(M), function (f) { }
3168   };
3169
3170   std::vector<FunctionEHFrameInfo> EHFrames;
3171
3172   /// shouldEmitTable - Per-function flag to indicate if EH tables should
3173   /// be emitted.
3174   bool shouldEmitTable;
3175
3176   /// shouldEmitMoves - Per-function flag to indicate if frame moves info
3177   /// should be emitted.
3178   bool shouldEmitMoves;
3179
3180   /// shouldEmitTableModule - Per-module flag to indicate if EH tables
3181   /// should be emitted.
3182   bool shouldEmitTableModule;
3183
3184   /// shouldEmitFrameModule - Per-module flag to indicate if frame moves
3185   /// should be emitted.
3186   bool shouldEmitMovesModule;
3187
3188   /// EmitCommonEHFrame - Emit the common eh unwind frame.
3189   ///
3190   void EmitCommonEHFrame(const Function *Personality, unsigned Index) {
3191     // Size and sign of stack growth.
3192     int stackGrowth =
3193         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3194           TargetFrameInfo::StackGrowsUp ?
3195         TD->getPointerSize() : -TD->getPointerSize();
3196
3197     // Begin eh frame section.
3198     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
3199
3200     if (!TAI->doesRequireNonLocalEHFrameLabel())
3201       O << TAI->getEHGlobalPrefix();
3202     O << "EH_frame" << Index << ":\n";
3203     EmitLabel("section_eh_frame", Index);
3204
3205     // Define base labels.
3206     EmitLabel("eh_frame_common", Index);
3207
3208     // Define the eh frame length.
3209     EmitDifference("eh_frame_common_end", Index,
3210                    "eh_frame_common_begin", Index, true);
3211     Asm->EOL("Length of Common Information Entry");
3212
3213     // EH frame header.
3214     EmitLabel("eh_frame_common_begin", Index);
3215     Asm->EmitInt32((int)0);
3216     Asm->EOL("CIE Identifier Tag");
3217     Asm->EmitInt8(DW_CIE_VERSION);
3218     Asm->EOL("CIE Version");
3219
3220     // The personality presence indicates that language specific information
3221     // will show up in the eh frame.
3222     Asm->EmitString(Personality ? "zPLR" : "zR");
3223     Asm->EOL("CIE Augmentation");
3224
3225     // Round out reader.
3226     Asm->EmitULEB128Bytes(1);
3227     Asm->EOL("CIE Code Alignment Factor");
3228     Asm->EmitSLEB128Bytes(stackGrowth);
3229     Asm->EOL("CIE Data Alignment Factor");
3230     Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
3231     Asm->EOL("CIE Return Address Column");
3232
3233     // If there is a personality, we need to indicate the functions location.
3234     if (Personality) {
3235       Asm->EmitULEB128Bytes(7);
3236       Asm->EOL("Augmentation Size");
3237
3238       if (TAI->getNeedsIndirectEncoding()) {
3239         Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect);
3240         Asm->EOL("Personality (pcrel sdata4 indirect)");
3241       } else {
3242         Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3243         Asm->EOL("Personality (pcrel sdata4)");
3244       }
3245
3246       PrintRelDirective(true);
3247       O << TAI->getPersonalityPrefix();
3248       Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
3249       O << TAI->getPersonalitySuffix();
3250       if (strcmp(TAI->getPersonalitySuffix(), "+4@GOTPCREL"))
3251         O << "-" << TAI->getPCSymbol();
3252       Asm->EOL("Personality");
3253
3254       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3255       Asm->EOL("LSDA Encoding (pcrel sdata4)");
3256
3257       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3258       Asm->EOL("FDE Encoding (pcrel sdata4)");
3259    } else {
3260       Asm->EmitULEB128Bytes(1);
3261       Asm->EOL("Augmentation Size");
3262
3263       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3264       Asm->EOL("FDE Encoding (pcrel sdata4)");
3265     }
3266
3267     // Indicate locations of general callee saved registers in frame.
3268     std::vector<MachineMove> Moves;
3269     RI->getInitialFrameState(Moves);
3270     EmitFrameMoves(NULL, 0, Moves, true);
3271
3272     // On Darwin the linker honors the alignment of eh_frame, which means it
3273     // must be 8-byte on 64-bit targets to match what gcc does.  Otherwise
3274     // you get holes which confuse readers of eh_frame.
3275     Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
3276                        0, 0, false);
3277     EmitLabel("eh_frame_common_end", Index);
3278
3279     Asm->EOL();
3280   }
3281
3282   /// EmitEHFrame - Emit function exception frame information.
3283   ///
3284   void EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
3285     Function::LinkageTypes linkage = EHFrameInfo.function->getLinkage();
3286
3287     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
3288
3289     // Externally visible entry into the functions eh frame info.
3290     // If the corresponding function is static, this should not be
3291     // externally visible.
3292     if (linkage != Function::InternalLinkage) {
3293       if (const char *GlobalEHDirective = TAI->getGlobalEHDirective())
3294         O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
3295     }
3296
3297     // If corresponding function is weak definition, this should be too.
3298     if ((linkage == Function::WeakLinkage ||
3299          linkage == Function::LinkOnceLinkage) &&
3300         TAI->getWeakDefDirective())
3301       O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
3302
3303     // If there are no calls then you can't unwind.  This may mean we can
3304     // omit the EH Frame, but some environments do not handle weak absolute
3305     // symbols.
3306     // If UnwindTablesMandatory is set we cannot do this optimization; the
3307     // unwind info is to be available for non-EH uses.
3308     if (!EHFrameInfo.hasCalls &&
3309         !UnwindTablesMandatory &&
3310         ((linkage != Function::WeakLinkage &&
3311           linkage != Function::LinkOnceLinkage) ||
3312          !TAI->getWeakDefDirective() ||
3313          TAI->getSupportsWeakOmittedEHFrame()))
3314     {
3315       O << EHFrameInfo.FnName << " = 0\n";
3316       // This name has no connection to the function, so it might get
3317       // dead-stripped when the function is not, erroneously.  Prohibit
3318       // dead-stripping unconditionally.
3319       if (const char *UsedDirective = TAI->getUsedDirective())
3320         O << UsedDirective << EHFrameInfo.FnName << "\n\n";
3321     } else {
3322       O << EHFrameInfo.FnName << ":\n";
3323
3324       // EH frame header.
3325       EmitDifference("eh_frame_end", EHFrameInfo.Number,
3326                      "eh_frame_begin", EHFrameInfo.Number, true);
3327       Asm->EOL("Length of Frame Information Entry");
3328
3329       EmitLabel("eh_frame_begin", EHFrameInfo.Number);
3330
3331       if (TAI->doesRequireNonLocalEHFrameLabel()) {
3332         PrintRelDirective(true, true);
3333         PrintLabelName("eh_frame_begin", EHFrameInfo.Number);
3334
3335         if (!TAI->isAbsoluteEHSectionOffsets())
3336           O << "-EH_frame" << EHFrameInfo.PersonalityIndex;
3337       } else {
3338         EmitSectionOffset("eh_frame_begin", "eh_frame_common",
3339                           EHFrameInfo.Number, EHFrameInfo.PersonalityIndex,
3340                           true, true, false);
3341       }
3342
3343       Asm->EOL("FDE CIE offset");
3344
3345       EmitReference("eh_func_begin", EHFrameInfo.Number, true, true);
3346       Asm->EOL("FDE initial location");
3347       EmitDifference("eh_func_end", EHFrameInfo.Number,
3348                      "eh_func_begin", EHFrameInfo.Number, true);
3349       Asm->EOL("FDE address range");
3350
3351       // If there is a personality and landing pads then point to the language
3352       // specific data area in the exception table.
3353       if (EHFrameInfo.PersonalityIndex) {
3354         Asm->EmitULEB128Bytes(4);
3355         Asm->EOL("Augmentation size");
3356
3357         if (EHFrameInfo.hasLandingPads)
3358           EmitReference("exception", EHFrameInfo.Number, true, true);
3359         else
3360           Asm->EmitInt32((int)0);
3361         Asm->EOL("Language Specific Data Area");
3362       } else {
3363         Asm->EmitULEB128Bytes(0);
3364         Asm->EOL("Augmentation size");
3365       }
3366
3367       // Indicate locations of function specific  callee saved registers in
3368       // frame.
3369       EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves, true);
3370
3371       // On Darwin the linker honors the alignment of eh_frame, which means it
3372       // must be 8-byte on 64-bit targets to match what gcc does.  Otherwise
3373       // you get holes which confuse readers of eh_frame.
3374       Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
3375                          0, 0, false);
3376       EmitLabel("eh_frame_end", EHFrameInfo.Number);
3377
3378       // If the function is marked used, this table should be also.  We cannot
3379       // make the mark unconditional in this case, since retaining the table
3380       // also retains the function in this case, and there is code around
3381       // that depends on unused functions (calling undefined externals) being
3382       // dead-stripped to link correctly.  Yes, there really is.
3383       if (MMI->getUsedFunctions().count(EHFrameInfo.function))
3384         if (const char *UsedDirective = TAI->getUsedDirective())
3385           O << UsedDirective << EHFrameInfo.FnName << "\n\n";
3386     }
3387   }
3388
3389   /// EmitExceptionTable - Emit landing pads and actions.
3390   ///
3391   /// The general organization of the table is complex, but the basic concepts
3392   /// are easy.  First there is a header which describes the location and
3393   /// organization of the three components that follow.
3394   ///  1. The landing pad site information describes the range of code covered
3395   ///     by the try.  In our case it's an accumulation of the ranges covered
3396   ///     by the invokes in the try.  There is also a reference to the landing
3397   ///     pad that handles the exception once processed.  Finally an index into
3398   ///     the actions table.
3399   ///  2. The action table, in our case, is composed of pairs of type ids
3400   ///     and next action offset.  Starting with the action index from the
3401   ///     landing pad site, each type Id is checked for a match to the current
3402   ///     exception.  If it matches then the exception and type id are passed
3403   ///     on to the landing pad.  Otherwise the next action is looked up.  This
3404   ///     chain is terminated with a next action of zero.  If no type id is
3405   ///     found the the frame is unwound and handling continues.
3406   ///  3. Type id table contains references to all the C++ typeinfo for all
3407   ///     catches in the function.  This tables is reversed indexed base 1.
3408
3409   /// SharedTypeIds - How many leading type ids two landing pads have in common.
3410   static unsigned SharedTypeIds(const LandingPadInfo *L,
3411                                 const LandingPadInfo *R) {
3412     const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
3413     unsigned LSize = LIds.size(), RSize = RIds.size();
3414     unsigned MinSize = LSize < RSize ? LSize : RSize;
3415     unsigned Count = 0;
3416
3417     for (; Count != MinSize; ++Count)
3418       if (LIds[Count] != RIds[Count])
3419         return Count;
3420
3421     return Count;
3422   }
3423
3424   /// PadLT - Order landing pads lexicographically by type id.
3425   static bool PadLT(const LandingPadInfo *L, const LandingPadInfo *R) {
3426     const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
3427     unsigned LSize = LIds.size(), RSize = RIds.size();
3428     unsigned MinSize = LSize < RSize ? LSize : RSize;
3429
3430     for (unsigned i = 0; i != MinSize; ++i)
3431       if (LIds[i] != RIds[i])
3432         return LIds[i] < RIds[i];
3433
3434     return LSize < RSize;
3435   }
3436
3437   struct KeyInfo {
3438     static inline unsigned getEmptyKey() { return -1U; }
3439     static inline unsigned getTombstoneKey() { return -2U; }
3440     static unsigned getHashValue(const unsigned &Key) { return Key; }
3441     static bool isEqual(unsigned LHS, unsigned RHS) { return LHS == RHS; }
3442     static bool isPod() { return true; }
3443   };
3444
3445   /// ActionEntry - Structure describing an entry in the actions table.
3446   struct ActionEntry {
3447     int ValueForTypeID; // The value to write - may not be equal to the type id.
3448     int NextAction;
3449     struct ActionEntry *Previous;
3450   };
3451
3452   /// PadRange - Structure holding a try-range and the associated landing pad.
3453   struct PadRange {
3454     // The index of the landing pad.
3455     unsigned PadIndex;
3456     // The index of the begin and end labels in the landing pad's label lists.
3457     unsigned RangeIndex;
3458   };
3459
3460   typedef DenseMap<unsigned, PadRange, KeyInfo> RangeMapType;
3461
3462   /// CallSiteEntry - Structure describing an entry in the call-site table.
3463   struct CallSiteEntry {
3464     // The 'try-range' is BeginLabel .. EndLabel.
3465     unsigned BeginLabel; // zero indicates the start of the function.
3466     unsigned EndLabel;   // zero indicates the end of the function.
3467     // The landing pad starts at PadLabel.
3468     unsigned PadLabel;   // zero indicates that there is no landing pad.
3469     unsigned Action;
3470   };
3471
3472   void EmitExceptionTable() {
3473     const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
3474     const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
3475     const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
3476     if (PadInfos.empty()) return;
3477
3478     // Sort the landing pads in order of their type ids.  This is used to fold
3479     // duplicate actions.
3480     SmallVector<const LandingPadInfo *, 64> LandingPads;
3481     LandingPads.reserve(PadInfos.size());
3482     for (unsigned i = 0, N = PadInfos.size(); i != N; ++i)
3483       LandingPads.push_back(&PadInfos[i]);
3484     std::sort(LandingPads.begin(), LandingPads.end(), PadLT);
3485
3486     // Negative type ids index into FilterIds, positive type ids index into
3487     // TypeInfos.  The value written for a positive type id is just the type
3488     // id itself.  For a negative type id, however, the value written is the
3489     // (negative) byte offset of the corresponding FilterIds entry.  The byte
3490     // offset is usually equal to the type id, because the FilterIds entries
3491     // are written using a variable width encoding which outputs one byte per
3492     // entry as long as the value written is not too large, but can differ.
3493     // This kind of complication does not occur for positive type ids because
3494     // type infos are output using a fixed width encoding.
3495     // FilterOffsets[i] holds the byte offset corresponding to FilterIds[i].
3496     SmallVector<int, 16> FilterOffsets;
3497     FilterOffsets.reserve(FilterIds.size());
3498     int Offset = -1;
3499     for(std::vector<unsigned>::const_iterator I = FilterIds.begin(),
3500         E = FilterIds.end(); I != E; ++I) {
3501       FilterOffsets.push_back(Offset);
3502       Offset -= TargetAsmInfo::getULEB128Size(*I);
3503     }
3504
3505     // Compute the actions table and gather the first action index for each
3506     // landing pad site.
3507     SmallVector<ActionEntry, 32> Actions;
3508     SmallVector<unsigned, 64> FirstActions;
3509     FirstActions.reserve(LandingPads.size());
3510
3511     int FirstAction = 0;
3512     unsigned SizeActions = 0;
3513     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
3514       const LandingPadInfo *LP = LandingPads[i];
3515       const std::vector<int> &TypeIds = LP->TypeIds;
3516       const unsigned NumShared = i ? SharedTypeIds(LP, LandingPads[i-1]) : 0;
3517       unsigned SizeSiteActions = 0;
3518
3519       if (NumShared < TypeIds.size()) {
3520         unsigned SizeAction = 0;
3521         ActionEntry *PrevAction = 0;
3522
3523         if (NumShared) {
3524           const unsigned SizePrevIds = LandingPads[i-1]->TypeIds.size();
3525           assert(Actions.size());
3526           PrevAction = &Actions.back();
3527           SizeAction = TargetAsmInfo::getSLEB128Size(PrevAction->NextAction) +
3528             TargetAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
3529           for (unsigned j = NumShared; j != SizePrevIds; ++j) {
3530             SizeAction -=
3531               TargetAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
3532             SizeAction += -PrevAction->NextAction;
3533             PrevAction = PrevAction->Previous;
3534           }
3535         }
3536
3537         // Compute the actions.
3538         for (unsigned I = NumShared, M = TypeIds.size(); I != M; ++I) {
3539           int TypeID = TypeIds[I];
3540           assert(-1-TypeID < (int)FilterOffsets.size() && "Unknown filter id!");
3541           int ValueForTypeID = TypeID < 0 ? FilterOffsets[-1 - TypeID] : TypeID;
3542           unsigned SizeTypeID = TargetAsmInfo::getSLEB128Size(ValueForTypeID);
3543
3544           int NextAction = SizeAction ? -(SizeAction + SizeTypeID) : 0;
3545           SizeAction = SizeTypeID + TargetAsmInfo::getSLEB128Size(NextAction);
3546           SizeSiteActions += SizeAction;
3547
3548           ActionEntry Action = {ValueForTypeID, NextAction, PrevAction};
3549           Actions.push_back(Action);
3550
3551           PrevAction = &Actions.back();
3552         }
3553
3554         // Record the first action of the landing pad site.
3555         FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
3556       } // else identical - re-use previous FirstAction
3557
3558       FirstActions.push_back(FirstAction);
3559
3560       // Compute this sites contribution to size.
3561       SizeActions += SizeSiteActions;
3562     }
3563
3564     // Compute the call-site table.  The entry for an invoke has a try-range
3565     // containing the call, a non-zero landing pad and an appropriate action.
3566     // The entry for an ordinary call has a try-range containing the call and
3567     // zero for the landing pad and the action.  Calls marked 'nounwind' have
3568     // no entry and must not be contained in the try-range of any entry - they
3569     // form gaps in the table.  Entries must be ordered by try-range address.
3570     SmallVector<CallSiteEntry, 64> CallSites;
3571
3572     RangeMapType PadMap;
3573     // Invokes and nounwind calls have entries in PadMap (due to being bracketed
3574     // by try-range labels when lowered).  Ordinary calls do not, so appropriate
3575     // try-ranges for them need be deduced.
3576     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
3577       const LandingPadInfo *LandingPad = LandingPads[i];
3578       for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
3579         unsigned BeginLabel = LandingPad->BeginLabels[j];
3580         assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
3581         PadRange P = { i, j };
3582         PadMap[BeginLabel] = P;
3583       }
3584     }
3585
3586     // The end label of the previous invoke or nounwind try-range.
3587     unsigned LastLabel = 0;
3588
3589     // Whether there is a potentially throwing instruction (currently this means
3590     // an ordinary call) between the end of the previous try-range and now.
3591     bool SawPotentiallyThrowing = false;
3592
3593     // Whether the last callsite entry was for an invoke.
3594     bool PreviousIsInvoke = false;
3595
3596     // Visit all instructions in order of address.
3597     for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
3598          I != E; ++I) {
3599       for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
3600            MI != E; ++MI) {
3601         if (!MI->isLabel()) {
3602           SawPotentiallyThrowing |= MI->getDesc().isCall();
3603           continue;
3604         }
3605
3606         unsigned BeginLabel = MI->getOperand(0).getImm();
3607         assert(BeginLabel && "Invalid label!");
3608
3609         // End of the previous try-range?
3610         if (BeginLabel == LastLabel)
3611           SawPotentiallyThrowing = false;
3612
3613         // Beginning of a new try-range?
3614         RangeMapType::iterator L = PadMap.find(BeginLabel);
3615         if (L == PadMap.end())
3616           // Nope, it was just some random label.
3617           continue;
3618
3619         PadRange P = L->second;
3620         const LandingPadInfo *LandingPad = LandingPads[P.PadIndex];
3621
3622         assert(BeginLabel == LandingPad->BeginLabels[P.RangeIndex] &&
3623                "Inconsistent landing pad map!");
3624
3625         // If some instruction between the previous try-range and this one may
3626         // throw, create a call-site entry with no landing pad for the region
3627         // between the try-ranges.
3628         if (SawPotentiallyThrowing) {
3629           CallSiteEntry Site = {LastLabel, BeginLabel, 0, 0};
3630           CallSites.push_back(Site);
3631           PreviousIsInvoke = false;
3632         }
3633
3634         LastLabel = LandingPad->EndLabels[P.RangeIndex];
3635         assert(BeginLabel && LastLabel && "Invalid landing pad!");
3636
3637         if (LandingPad->LandingPadLabel) {
3638           // This try-range is for an invoke.
3639           CallSiteEntry Site = {BeginLabel, LastLabel,
3640             LandingPad->LandingPadLabel, FirstActions[P.PadIndex]};
3641
3642           // Try to merge with the previous call-site.
3643           if (PreviousIsInvoke) {
3644             CallSiteEntry &Prev = CallSites.back();
3645             if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) {
3646               // Extend the range of the previous entry.
3647               Prev.EndLabel = Site.EndLabel;
3648               continue;
3649             }
3650           }
3651
3652           // Otherwise, create a new call-site.
3653           CallSites.push_back(Site);
3654           PreviousIsInvoke = true;
3655         } else {
3656           // Create a gap.
3657           PreviousIsInvoke = false;
3658         }
3659       }
3660     }
3661     // If some instruction between the previous try-range and the end of the
3662     // function may throw, create a call-site entry with no landing pad for the
3663     // region following the try-range.
3664     if (SawPotentiallyThrowing) {
3665       CallSiteEntry Site = {LastLabel, 0, 0, 0};
3666       CallSites.push_back(Site);
3667     }
3668
3669     // Final tallies.
3670
3671     // Call sites.
3672     const unsigned SiteStartSize  = sizeof(int32_t); // DW_EH_PE_udata4
3673     const unsigned SiteLengthSize = sizeof(int32_t); // DW_EH_PE_udata4
3674     const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
3675     unsigned SizeSites = CallSites.size() * (SiteStartSize +
3676                                              SiteLengthSize +
3677                                              LandingPadSize);
3678     for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
3679       SizeSites += TargetAsmInfo::getULEB128Size(CallSites[i].Action);
3680
3681     // Type infos.
3682     const unsigned TypeInfoSize = TD->getPointerSize(); // DW_EH_PE_absptr
3683     unsigned SizeTypes = TypeInfos.size() * TypeInfoSize;
3684
3685     unsigned TypeOffset = sizeof(int8_t) + // Call site format
3686            TargetAsmInfo::getULEB128Size(SizeSites) + // Call-site table length
3687                           SizeSites + SizeActions + SizeTypes;
3688
3689     unsigned TotalSize = sizeof(int8_t) + // LPStart format
3690                          sizeof(int8_t) + // TType format
3691            TargetAsmInfo::getULEB128Size(TypeOffset) + // TType base offset
3692                          TypeOffset;
3693
3694     unsigned SizeAlign = (4 - TotalSize) & 3;
3695
3696     // Begin the exception table.
3697     Asm->SwitchToDataSection(TAI->getDwarfExceptionSection());
3698     Asm->EmitAlignment(2, 0, 0, false);
3699     O << "GCC_except_table" << SubprogramCount << ":\n";
3700     for (unsigned i = 0; i != SizeAlign; ++i) {
3701       Asm->EmitInt8(0);
3702       Asm->EOL("Padding");
3703     }
3704     EmitLabel("exception", SubprogramCount);
3705
3706     // Emit the header.
3707     Asm->EmitInt8(DW_EH_PE_omit);
3708     Asm->EOL("LPStart format (DW_EH_PE_omit)");
3709     Asm->EmitInt8(DW_EH_PE_absptr);
3710     Asm->EOL("TType format (DW_EH_PE_absptr)");
3711     Asm->EmitULEB128Bytes(TypeOffset);
3712     Asm->EOL("TType base offset");
3713     Asm->EmitInt8(DW_EH_PE_udata4);
3714     Asm->EOL("Call site format (DW_EH_PE_udata4)");
3715     Asm->EmitULEB128Bytes(SizeSites);
3716     Asm->EOL("Call-site table length");
3717
3718     // Emit the landing pad site information.
3719     for (unsigned i = 0; i < CallSites.size(); ++i) {
3720       CallSiteEntry &S = CallSites[i];
3721       const char *BeginTag;
3722       unsigned BeginNumber;
3723
3724       if (!S.BeginLabel) {
3725         BeginTag = "eh_func_begin";
3726         BeginNumber = SubprogramCount;
3727       } else {
3728         BeginTag = "label";
3729         BeginNumber = S.BeginLabel;
3730       }
3731
3732       EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
3733                         true, true);
3734       Asm->EOL("Region start");
3735
3736       if (!S.EndLabel) {
3737         EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
3738                        true);
3739       } else {
3740         EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);
3741       }
3742       Asm->EOL("Region length");
3743
3744       if (!S.PadLabel)
3745         Asm->EmitInt32(0);
3746       else
3747         EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
3748                           true, true);
3749       Asm->EOL("Landing pad");
3750
3751       Asm->EmitULEB128Bytes(S.Action);
3752       Asm->EOL("Action");
3753     }
3754
3755     // Emit the actions.
3756     for (unsigned I = 0, N = Actions.size(); I != N; ++I) {
3757       ActionEntry &Action = Actions[I];
3758
3759       Asm->EmitSLEB128Bytes(Action.ValueForTypeID);
3760       Asm->EOL("TypeInfo index");
3761       Asm->EmitSLEB128Bytes(Action.NextAction);
3762       Asm->EOL("Next action");
3763     }
3764
3765     // Emit the type ids.
3766     for (unsigned M = TypeInfos.size(); M; --M) {
3767       GlobalVariable *GV = TypeInfos[M - 1];
3768
3769       PrintRelDirective();
3770
3771       if (GV)
3772         O << Asm->getGlobalLinkName(GV);
3773       else
3774         O << "0";
3775
3776       Asm->EOL("TypeInfo");
3777     }
3778
3779     // Emit the filter typeids.
3780     for (unsigned j = 0, M = FilterIds.size(); j < M; ++j) {
3781       unsigned TypeID = FilterIds[j];
3782       Asm->EmitULEB128Bytes(TypeID);
3783       Asm->EOL("Filter TypeInfo index");
3784     }
3785
3786     Asm->EmitAlignment(2, 0, 0, false);
3787   }
3788
3789 public:
3790   //===--------------------------------------------------------------------===//
3791   // Main entry points.
3792   //
3793   DwarfException(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
3794   : Dwarf(OS, A, T, "eh")
3795   , shouldEmitTable(false)
3796   , shouldEmitMoves(false)
3797   , shouldEmitTableModule(false)
3798   , shouldEmitMovesModule(false)
3799   {}
3800
3801   virtual ~DwarfException() {}
3802
3803   /// SetModuleInfo - Set machine module information when it's known that pass
3804   /// manager has created it.  Set by the target AsmPrinter.
3805   void SetModuleInfo(MachineModuleInfo *mmi) {
3806     MMI = mmi;
3807   }
3808
3809   /// BeginModule - Emit all exception information that should come prior to the
3810   /// content.
3811   void BeginModule(Module *M) {
3812     this->M = M;
3813   }
3814
3815   /// EndModule - Emit all exception information that should come after the
3816   /// content.
3817   void EndModule() {
3818     if (shouldEmitMovesModule || shouldEmitTableModule) {
3819       const std::vector<Function *> Personalities = MMI->getPersonalities();
3820       for (unsigned i =0; i < Personalities.size(); ++i)
3821         EmitCommonEHFrame(Personalities[i], i);
3822
3823       for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(),
3824              E = EHFrames.end(); I != E; ++I)
3825         EmitEHFrame(*I);
3826     }
3827   }
3828
3829   /// BeginFunction - Gather pre-function exception information.  Assumes being
3830   /// emitted immediately after the function entry point.
3831   void BeginFunction(MachineFunction *MF) {
3832     this->MF = MF;
3833     shouldEmitTable = shouldEmitMoves = false;
3834     if (MMI && TAI->doesSupportExceptionHandling()) {
3835
3836       // Map all labels and get rid of any dead landing pads.
3837       MMI->TidyLandingPads();
3838       // If any landing pads survive, we need an EH table.
3839       if (MMI->getLandingPads().size())
3840         shouldEmitTable = true;
3841
3842       // See if we need frame move info.
3843       if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory)
3844         shouldEmitMoves = true;
3845
3846       if (shouldEmitMoves || shouldEmitTable)
3847         // Assumes in correct section after the entry point.
3848         EmitLabel("eh_func_begin", ++SubprogramCount);
3849     }
3850     shouldEmitTableModule |= shouldEmitTable;
3851     shouldEmitMovesModule |= shouldEmitMoves;
3852   }
3853
3854   /// EndFunction - Gather and emit post-function exception information.
3855   ///
3856   void EndFunction() {
3857     if (shouldEmitMoves || shouldEmitTable) {
3858       EmitLabel("eh_func_end", SubprogramCount);
3859       EmitExceptionTable();
3860
3861       // Save EH frame information
3862       EHFrames.
3863         push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF),
3864                                     SubprogramCount,
3865                                     MMI->getPersonalityIndex(),
3866                                     MF->getFrameInfo()->hasCalls(),
3867                                     !MMI->getLandingPads().empty(),
3868                                     MMI->getFrameMoves(),
3869                                     MF->getFunction()));
3870       }
3871   }
3872 };
3873
3874 } // End of namespace llvm
3875
3876 //===----------------------------------------------------------------------===//
3877
3878 /// Emit - Print the abbreviation using the specified Dwarf writer.
3879 ///
3880 void DIEAbbrev::Emit(const DwarfDebug &DD) const {
3881   // Emit its Dwarf tag type.
3882   DD.getAsm()->EmitULEB128Bytes(Tag);
3883   DD.getAsm()->EOL(TagString(Tag));
3884
3885   // Emit whether it has children DIEs.
3886   DD.getAsm()->EmitULEB128Bytes(ChildrenFlag);
3887   DD.getAsm()->EOL(ChildrenString(ChildrenFlag));
3888
3889   // For each attribute description.
3890   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
3891     const DIEAbbrevData &AttrData = Data[i];
3892
3893     // Emit attribute type.
3894     DD.getAsm()->EmitULEB128Bytes(AttrData.getAttribute());
3895     DD.getAsm()->EOL(AttributeString(AttrData.getAttribute()));
3896
3897     // Emit form type.
3898     DD.getAsm()->EmitULEB128Bytes(AttrData.getForm());
3899     DD.getAsm()->EOL(FormEncodingString(AttrData.getForm()));
3900   }
3901
3902   // Mark end of abbreviation.
3903   DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(1)");
3904   DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(2)");
3905 }
3906
3907 #ifndef NDEBUG
3908 void DIEAbbrev::print(std::ostream &O) {
3909   O << "Abbreviation @"
3910     << std::hex << (intptr_t)this << std::dec
3911     << "  "
3912     << TagString(Tag)
3913     << " "
3914     << ChildrenString(ChildrenFlag)
3915     << "\n";
3916
3917   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
3918     O << "  "
3919       << AttributeString(Data[i].getAttribute())
3920       << "  "
3921       << FormEncodingString(Data[i].getForm())
3922       << "\n";
3923   }
3924 }
3925 void DIEAbbrev::dump() { print(cerr); }
3926 #endif
3927
3928 //===----------------------------------------------------------------------===//
3929
3930 #ifndef NDEBUG
3931 void DIEValue::dump() {
3932   print(cerr);
3933 }
3934 #endif
3935
3936 //===----------------------------------------------------------------------===//
3937
3938 /// EmitValue - Emit integer of appropriate size.
3939 ///
3940 void DIEInteger::EmitValue(DwarfDebug &DD, unsigned Form) {
3941   switch (Form) {
3942   case DW_FORM_flag:  // Fall thru
3943   case DW_FORM_ref1:  // Fall thru
3944   case DW_FORM_data1: DD.getAsm()->EmitInt8(Integer);         break;
3945   case DW_FORM_ref2:  // Fall thru
3946   case DW_FORM_data2: DD.getAsm()->EmitInt16(Integer);        break;
3947   case DW_FORM_ref4:  // Fall thru
3948   case DW_FORM_data4: DD.getAsm()->EmitInt32(Integer);        break;
3949   case DW_FORM_ref8:  // Fall thru
3950   case DW_FORM_data8: DD.getAsm()->EmitInt64(Integer);        break;
3951   case DW_FORM_udata: DD.getAsm()->EmitULEB128Bytes(Integer); break;
3952   case DW_FORM_sdata: DD.getAsm()->EmitSLEB128Bytes(Integer); break;
3953   default: assert(0 && "DIE Value form not supported yet");   break;
3954   }
3955 }
3956
3957 /// SizeOf - Determine size of integer value in bytes.
3958 ///
3959 unsigned DIEInteger::SizeOf(const DwarfDebug &DD, unsigned Form) const {
3960   switch (Form) {
3961   case DW_FORM_flag:  // Fall thru
3962   case DW_FORM_ref1:  // Fall thru
3963   case DW_FORM_data1: return sizeof(int8_t);
3964   case DW_FORM_ref2:  // Fall thru
3965   case DW_FORM_data2: return sizeof(int16_t);
3966   case DW_FORM_ref4:  // Fall thru
3967   case DW_FORM_data4: return sizeof(int32_t);
3968   case DW_FORM_ref8:  // Fall thru
3969   case DW_FORM_data8: return sizeof(int64_t);
3970   case DW_FORM_udata: return TargetAsmInfo::getULEB128Size(Integer);
3971   case DW_FORM_sdata: return TargetAsmInfo::getSLEB128Size(Integer);
3972   default: assert(0 && "DIE Value form not supported yet"); break;
3973   }
3974   return 0;
3975 }
3976
3977 //===----------------------------------------------------------------------===//
3978
3979 /// EmitValue - Emit string value.
3980 ///
3981 void DIEString::EmitValue(DwarfDebug &DD, unsigned Form) {
3982   DD.getAsm()->EmitString(String);
3983 }
3984
3985 //===----------------------------------------------------------------------===//
3986
3987 /// EmitValue - Emit label value.
3988 ///
3989 void DIEDwarfLabel::EmitValue(DwarfDebug &DD, unsigned Form) {
3990   bool IsSmall = Form == DW_FORM_data4;
3991   DD.EmitReference(Label, false, IsSmall);
3992 }
3993
3994 /// SizeOf - Determine size of label value in bytes.
3995 ///
3996 unsigned DIEDwarfLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
3997   if (Form == DW_FORM_data4) return 4;
3998   return DD.getTargetData()->getPointerSize();
3999 }
4000
4001 //===----------------------------------------------------------------------===//
4002
4003 /// EmitValue - Emit label value.
4004 ///
4005 void DIEObjectLabel::EmitValue(DwarfDebug &DD, unsigned Form) {
4006   bool IsSmall = Form == DW_FORM_data4;
4007   DD.EmitReference(Label, false, IsSmall);
4008 }
4009
4010 /// SizeOf - Determine size of label value in bytes.
4011 ///
4012 unsigned DIEObjectLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4013   if (Form == DW_FORM_data4) return 4;
4014   return DD.getTargetData()->getPointerSize();
4015 }
4016
4017 //===----------------------------------------------------------------------===//
4018
4019 /// EmitValue - Emit delta value.
4020 ///
4021 void DIESectionOffset::EmitValue(DwarfDebug &DD, unsigned Form) {
4022   bool IsSmall = Form == DW_FORM_data4;
4023   DD.EmitSectionOffset(Label.Tag, Section.Tag,
4024                        Label.Number, Section.Number, IsSmall, IsEH, UseSet);
4025 }
4026
4027 /// SizeOf - Determine size of delta value in bytes.
4028 ///
4029 unsigned DIESectionOffset::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4030   if (Form == DW_FORM_data4) return 4;
4031   return DD.getTargetData()->getPointerSize();
4032 }
4033
4034 //===----------------------------------------------------------------------===//
4035
4036 /// EmitValue - Emit delta value.
4037 ///
4038 void DIEDelta::EmitValue(DwarfDebug &DD, unsigned Form) {
4039   bool IsSmall = Form == DW_FORM_data4;
4040   DD.EmitDifference(LabelHi, LabelLo, IsSmall);
4041 }
4042
4043 /// SizeOf - Determine size of delta value in bytes.
4044 ///
4045 unsigned DIEDelta::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4046   if (Form == DW_FORM_data4) return 4;
4047   return DD.getTargetData()->getPointerSize();
4048 }
4049
4050 //===----------------------------------------------------------------------===//
4051
4052 /// EmitValue - Emit debug information entry offset.
4053 ///
4054 void DIEntry::EmitValue(DwarfDebug &DD, unsigned Form) {
4055   DD.getAsm()->EmitInt32(Entry->getOffset());
4056 }
4057
4058 //===----------------------------------------------------------------------===//
4059
4060 /// ComputeSize - calculate the size of the block.
4061 ///
4062 unsigned DIEBlock::ComputeSize(DwarfDebug &DD) {
4063   if (!Size) {
4064     const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
4065
4066     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
4067       Size += Values[i]->SizeOf(DD, AbbrevData[i].getForm());
4068     }
4069   }
4070   return Size;
4071 }
4072
4073 /// EmitValue - Emit block data.
4074 ///
4075 void DIEBlock::EmitValue(DwarfDebug &DD, unsigned Form) {
4076   switch (Form) {
4077   case DW_FORM_block1: DD.getAsm()->EmitInt8(Size);         break;
4078   case DW_FORM_block2: DD.getAsm()->EmitInt16(Size);        break;
4079   case DW_FORM_block4: DD.getAsm()->EmitInt32(Size);        break;
4080   case DW_FORM_block:  DD.getAsm()->EmitULEB128Bytes(Size); break;
4081   default: assert(0 && "Improper form for block");          break;
4082   }
4083
4084   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
4085
4086   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
4087     DD.getAsm()->EOL();
4088     Values[i]->EmitValue(DD, AbbrevData[i].getForm());
4089   }
4090 }
4091
4092 /// SizeOf - Determine size of block data in bytes.
4093 ///
4094 unsigned DIEBlock::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4095   switch (Form) {
4096   case DW_FORM_block1: return Size + sizeof(int8_t);
4097   case DW_FORM_block2: return Size + sizeof(int16_t);
4098   case DW_FORM_block4: return Size + sizeof(int32_t);
4099   case DW_FORM_block: return Size + TargetAsmInfo::getULEB128Size(Size);
4100   default: assert(0 && "Improper form for block"); break;
4101   }
4102   return 0;
4103 }
4104
4105 //===----------------------------------------------------------------------===//
4106 /// DIE Implementation
4107
4108 DIE::~DIE() {
4109   for (unsigned i = 0, N = Children.size(); i < N; ++i)
4110     delete Children[i];
4111 }
4112
4113 /// AddSiblingOffset - Add a sibling offset field to the front of the DIE.
4114 ///
4115 void DIE::AddSiblingOffset() {
4116   DIEInteger *DI = new DIEInteger(0);
4117   Values.insert(Values.begin(), DI);
4118   Abbrev.AddFirstAttribute(DW_AT_sibling, DW_FORM_ref4);
4119 }
4120
4121 /// Profile - Used to gather unique data for the value folding set.
4122 ///
4123 void DIE::Profile(FoldingSetNodeID &ID) {
4124   Abbrev.Profile(ID);
4125
4126   for (unsigned i = 0, N = Children.size(); i < N; ++i)
4127     ID.AddPointer(Children[i]);
4128
4129   for (unsigned j = 0, M = Values.size(); j < M; ++j)
4130     ID.AddPointer(Values[j]);
4131 }
4132
4133 #ifndef NDEBUG
4134 void DIE::print(std::ostream &O, unsigned IncIndent) {
4135   static unsigned IndentCount = 0;
4136   IndentCount += IncIndent;
4137   const std::string Indent(IndentCount, ' ');
4138   bool isBlock = Abbrev.getTag() == 0;
4139
4140   if (!isBlock) {
4141     O << Indent
4142       << "Die: "
4143       << "0x" << std::hex << (intptr_t)this << std::dec
4144       << ", Offset: " << Offset
4145       << ", Size: " << Size
4146       << "\n";
4147
4148     O << Indent
4149       << TagString(Abbrev.getTag())
4150       << " "
4151       << ChildrenString(Abbrev.getChildrenFlag());
4152   } else {
4153     O << "Size: " << Size;
4154   }
4155   O << "\n";
4156
4157   const SmallVector<DIEAbbrevData, 8> &Data = Abbrev.getData();
4158
4159   IndentCount += 2;
4160   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
4161     O << Indent;
4162
4163     if (!isBlock)
4164       O << AttributeString(Data[i].getAttribute());
4165     else
4166       O << "Blk[" << i << "]";
4167
4168     O <<  "  "
4169       << FormEncodingString(Data[i].getForm())
4170       << " ";
4171     Values[i]->print(O);
4172     O << "\n";
4173   }
4174   IndentCount -= 2;
4175
4176   for (unsigned j = 0, M = Children.size(); j < M; ++j) {
4177     Children[j]->print(O, 4);
4178   }
4179
4180   if (!isBlock) O << "\n";
4181   IndentCount -= IncIndent;
4182 }
4183
4184 void DIE::dump() {
4185   print(cerr);
4186 }
4187 #endif
4188
4189 //===----------------------------------------------------------------------===//
4190 /// DwarfWriter Implementation
4191 ///
4192
4193 DwarfWriter::DwarfWriter() : ImmutablePass(&ID), DD(NULL), DE(NULL) {
4194 }
4195
4196 DwarfWriter::~DwarfWriter() {
4197   delete DE;
4198   delete DD;
4199 }
4200
4201 /// BeginModule - Emit all Dwarf sections that should come prior to the
4202 /// content.
4203 void DwarfWriter::BeginModule(Module *M,
4204                               MachineModuleInfo *MMI,
4205                               raw_ostream &OS, AsmPrinter *A,
4206                               const TargetAsmInfo *T) {
4207   DE = new DwarfException(OS, A, T);
4208   DD = new DwarfDebug(OS, A, T);
4209   DE->BeginModule(M);
4210   DD->BeginModule(M);
4211   DD->SetDebugInfo(MMI);
4212   DE->SetModuleInfo(MMI);
4213 }
4214
4215 /// EndModule - Emit all Dwarf sections that should come after the content.
4216 ///
4217 void DwarfWriter::EndModule() {
4218   DE->EndModule();
4219   DD->EndModule();
4220 }
4221
4222 /// BeginFunction - Gather pre-function debug information.  Assumes being
4223 /// emitted immediately after the function entry point.
4224 void DwarfWriter::BeginFunction(MachineFunction *MF) {
4225   DE->BeginFunction(MF);
4226   DD->BeginFunction(MF);
4227 }
4228
4229 /// EndFunction - Gather and emit post-function debug information.
4230 ///
4231 void DwarfWriter::EndFunction(MachineFunction *MF) {
4232   DD->EndFunction(MF);
4233   DE->EndFunction();
4234
4235   if (MachineModuleInfo *MMI = DD->getMMI() ? DD->getMMI() : DE->getMMI())
4236     // Clear function debug information.
4237     MMI->EndFunction();
4238 }
4239
4240 /// RecordSourceLine - Records location information and associates it with a 
4241 /// label. Returns a unique label ID used to generate a label and provide
4242 /// correspondence to the source line list.
4243 unsigned DwarfWriter::RecordSourceLine(unsigned Line, unsigned Col, 
4244                                        unsigned Src) {
4245   return DD->RecordSourceLine(Line, Col, Src);
4246 }
4247
4248 /// RecordSource - Register a source file with debug info. Returns an source
4249 /// ID.
4250 unsigned DwarfWriter::RecordSource(const std::string &Dir, 
4251                                    const std::string &File) {
4252   return DD->RecordSource(Dir, File);
4253 }
4254
4255 /// RecordRegionStart - Indicate the start of a region.
4256 unsigned DwarfWriter::RecordRegionStart(GlobalVariable *V) {
4257   return DD->RecordRegionStart(V);
4258 }
4259
4260 /// RecordRegionEnd - Indicate the end of a region.
4261 unsigned DwarfWriter::RecordRegionEnd(GlobalVariable *V) {
4262   return DD->RecordRegionEnd(V);
4263 }
4264
4265 /// getRecordSourceLineCount - Count source lines.
4266 unsigned DwarfWriter::getRecordSourceLineCount() {
4267   return DD->getRecordSourceLineCount();
4268 }
4269
4270 /// RecordVariable - Indicate the declaration of  a local variable.
4271 ///
4272 void DwarfWriter::RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {
4273   DD->RecordVariable(GV, FrameIndex);
4274 }
4275