For PR786:
[oota-llvm.git] / lib / CodeGen / DwarfWriter.cpp
1 //===-- llvm/CodeGen/DwarfWriter.cpp - Dwarf Framework ----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by James M. Laskey and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/CodeGen/DwarfWriter.h"
15
16 #include "llvm/ADT/FoldingSet.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/UniqueVector.h"
19 #include "llvm/Module.h"
20 #include "llvm/Type.h"
21 #include "llvm/CodeGen/AsmPrinter.h"
22 #include "llvm/CodeGen/MachineDebugInfo.h"
23 #include "llvm/CodeGen/MachineFrameInfo.h"
24 #include "llvm/CodeGen/MachineLocation.h"
25 #include "llvm/Support/Dwarf.h"
26 #include "llvm/Support/CommandLine.h"
27 #include "llvm/Support/DataTypes.h"
28 #include "llvm/Support/Mangler.h"
29 #include "llvm/Target/TargetAsmInfo.h"
30 #include "llvm/Target/MRegisterInfo.h"
31 #include "llvm/Target/TargetData.h"
32 #include "llvm/Target/TargetMachine.h"
33 #include "llvm/Target/TargetFrameInfo.h"
34
35 #include <iostream>
36 #include <string>
37
38 using namespace llvm;
39 using namespace llvm::dwarf;
40
41 static cl::opt<bool>
42 DwarfVerbose("dwarf-verbose", cl::Hidden,
43                               cl::desc("Add comments to Dwarf directives."));
44
45 namespace llvm {
46   
47 //===----------------------------------------------------------------------===//
48
49 /// Configuration values for initial hash set sizes (log2).
50 ///
51 static const unsigned InitDiesSetSize          = 9; // 512
52 static const unsigned InitAbbreviationsSetSize = 9; // 512
53 static const unsigned InitValuesSetSize        = 9; // 512
54
55 //===----------------------------------------------------------------------===//
56 /// Forward declarations.
57 ///
58 class DIE;
59 class DIEValue;
60
61 //===----------------------------------------------------------------------===//
62 /// LEB 128 number encoding.
63
64 /// PrintULEB128 - Print a series of hexidecimal values (separated by commas)
65 /// representing an unsigned leb128 value.
66 static void PrintULEB128(std::ostream &O, unsigned Value) {
67   do {
68     unsigned Byte = Value & 0x7f;
69     Value >>= 7;
70     if (Value) Byte |= 0x80;
71     O << "0x" << std::hex << Byte << std::dec;
72     if (Value) O << ", ";
73   } while (Value);
74 }
75
76 /// SizeULEB128 - Compute the number of bytes required for an unsigned leb128
77 /// value.
78 static unsigned SizeULEB128(unsigned Value) {
79   unsigned Size = 0;
80   do {
81     Value >>= 7;
82     Size += sizeof(int8_t);
83   } while (Value);
84   return Size;
85 }
86
87 /// PrintSLEB128 - Print a series of hexidecimal values (separated by commas)
88 /// representing a signed leb128 value.
89 static void PrintSLEB128(std::ostream &O, int Value) {
90   int Sign = Value >> (8 * sizeof(Value) - 1);
91   bool IsMore;
92   
93   do {
94     unsigned Byte = Value & 0x7f;
95     Value >>= 7;
96     IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
97     if (IsMore) Byte |= 0x80;
98     O << "0x" << std::hex << Byte << std::dec;
99     if (IsMore) O << ", ";
100   } while (IsMore);
101 }
102
103 /// SizeSLEB128 - Compute the number of bytes required for a signed leb128
104 /// value.
105 static unsigned SizeSLEB128(int Value) {
106   unsigned Size = 0;
107   int Sign = Value >> (8 * sizeof(Value) - 1);
108   bool IsMore;
109   
110   do {
111     unsigned Byte = Value & 0x7f;
112     Value >>= 7;
113     IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
114     Size += sizeof(int8_t);
115   } while (IsMore);
116   return Size;
117 }
118
119 //===----------------------------------------------------------------------===//
120 /// DWLabel - Labels are used to track locations in the assembler file.
121 /// Labels appear in the form <prefix>debug_<Tag><Number>, where the tag is a
122 /// category of label (Ex. location) and number is a value unique in that
123 /// category.
124 class DWLabel {
125 public:
126   /// Tag - Label category tag. Should always be a staticly declared C string.
127   ///
128   const char *Tag;
129   
130   /// Number - Value to make label unique.
131   ///
132   unsigned    Number;
133
134   DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {}
135   
136   void Profile(FoldingSetNodeID &ID) const {
137     ID.AddString(std::string(Tag));
138     ID.AddInteger(Number);
139   }
140   
141 #ifndef NDEBUG
142   void print(std::ostream &O) const {
143     O << ".debug_" << Tag;
144     if (Number) O << Number;
145   }
146 #endif
147 };
148
149 //===----------------------------------------------------------------------===//
150 /// DIEAbbrevData - Dwarf abbreviation data, describes the one attribute of a
151 /// Dwarf abbreviation.
152 class DIEAbbrevData {
153 private:
154   /// Attribute - Dwarf attribute code.
155   ///
156   unsigned Attribute;
157   
158   /// Form - Dwarf form code.
159   ///              
160   unsigned Form;                      
161   
162 public:
163   DIEAbbrevData(unsigned A, unsigned F)
164   : Attribute(A)
165   , Form(F)
166   {}
167   
168   // Accessors.
169   unsigned getAttribute() const { return Attribute; }
170   unsigned getForm()      const { return Form; }
171
172   /// Profile - Used to gather unique data for the abbreviation folding set.
173   ///
174   void Profile(FoldingSetNodeID &ID)const  {
175     ID.AddInteger(Attribute);
176     ID.AddInteger(Form);
177   }
178 };
179
180 //===----------------------------------------------------------------------===//
181 /// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug
182 /// information object.
183 class DIEAbbrev : public FoldingSetNode {
184 private:
185   /// Tag - Dwarf tag code.
186   ///
187   unsigned Tag;
188   
189   /// Unique number for node.
190   ///
191   unsigned Number;
192
193   /// ChildrenFlag - Dwarf children flag.
194   ///
195   unsigned ChildrenFlag;
196
197   /// Data - Raw data bytes for abbreviation.
198   ///
199   std::vector<DIEAbbrevData> Data;
200
201 public:
202
203   DIEAbbrev(unsigned T, unsigned C)
204   : Tag(T)
205   , ChildrenFlag(C)
206   , Data()
207   {}
208   ~DIEAbbrev() {}
209   
210   // Accessors.
211   unsigned getTag()                           const { return Tag; }
212   unsigned getNumber()                        const { return Number; }
213   unsigned getChildrenFlag()                  const { return ChildrenFlag; }
214   const std::vector<DIEAbbrevData> &getData() const { return Data; }
215   void setTag(unsigned T)                           { Tag = T; }
216   void setChildrenFlag(unsigned CF)                 { ChildrenFlag = CF; }
217   void setNumber(unsigned N)                        { Number = N; }
218   
219   /// AddAttribute - Adds another set of attribute information to the
220   /// abbreviation.
221   void AddAttribute(unsigned Attribute, unsigned Form) {
222     Data.push_back(DIEAbbrevData(Attribute, Form));
223   }
224   
225   /// AddFirstAttribute - Adds a set of attribute information to the front
226   /// of the abbreviation.
227   void AddFirstAttribute(unsigned Attribute, unsigned Form) {
228     Data.insert(Data.begin(), DIEAbbrevData(Attribute, Form));
229   }
230   
231   /// Profile - Used to gather unique data for the abbreviation folding set.
232   ///
233   void Profile(FoldingSetNodeID &ID) {
234     ID.AddInteger(Tag);
235     ID.AddInteger(ChildrenFlag);
236     
237     // For each attribute description.
238     for (unsigned i = 0, N = Data.size(); i < N; ++i)
239       Data[i].Profile(ID);
240   }
241   
242   /// Emit - Print the abbreviation using the specified Dwarf writer.
243   ///
244   void Emit(const Dwarf &DW) const; 
245       
246 #ifndef NDEBUG
247   void print(std::ostream &O);
248   void dump();
249 #endif
250 };
251
252 //===----------------------------------------------------------------------===//
253 /// DIE - A structured debug information entry.  Has an abbreviation which
254 /// describes it's organization.
255 class DIE : public FoldingSetNode {
256 protected:
257   /// Abbrev - Buffer for constructing abbreviation.
258   ///
259   DIEAbbrev Abbrev;
260   
261   /// Offset - Offset in debug info section.
262   ///
263   unsigned Offset;
264   
265   /// Size - Size of instance + children.
266   ///
267   unsigned Size;
268   
269   /// Children DIEs.
270   ///
271   std::vector<DIE *> Children;
272   
273   /// Attributes values.
274   ///
275   std::vector<DIEValue *> Values;
276   
277 public:
278   DIE(unsigned Tag)
279   : Abbrev(Tag, DW_CHILDREN_no)
280   , Offset(0)
281   , Size(0)
282   , Children()
283   , Values()
284   {}
285   virtual ~DIE();
286   
287   // Accessors.
288   DIEAbbrev &getAbbrev()                           { return Abbrev; }
289   unsigned   getAbbrevNumber()               const {
290     return Abbrev.getNumber();
291   }
292   unsigned getOffset()                       const { return Offset; }
293   unsigned getSize()                         const { return Size; }
294   const std::vector<DIE *> &getChildren()    const { return Children; }
295   const std::vector<DIEValue *> &getValues() const { return Values; }
296   void setTag(unsigned Tag)                  { Abbrev.setTag(Tag); }
297   void setOffset(unsigned O)                 { Offset = O; }
298   void setSize(unsigned S)                   { Size = S; }
299   
300   /// AddValue - Add a value and attributes to a DIE.
301   ///
302   void AddValue(unsigned Attribute, unsigned Form, DIEValue *Value) {
303     Abbrev.AddAttribute(Attribute, Form);
304     Values.push_back(Value);
305   }
306   
307   /// SiblingOffset - Return the offset of the debug information entry's
308   /// sibling.
309   unsigned SiblingOffset() const { return Offset + Size; }
310   
311   /// AddSiblingOffset - Add a sibling offset field to the front of the DIE.
312   ///
313   void AddSiblingOffset();
314
315   /// AddChild - Add a child to the DIE.
316   ///
317   void AddChild(DIE *Child) {
318     Abbrev.setChildrenFlag(DW_CHILDREN_yes);
319     Children.push_back(Child);
320   }
321   
322   /// Detach - Detaches objects connected to it after copying.
323   ///
324   void Detach() {
325     Children.clear();
326   }
327   
328   /// Profile - Used to gather unique data for the value folding set.
329   ///
330   void Profile(FoldingSetNodeID &ID) ;
331       
332 #ifndef NDEBUG
333   void print(std::ostream &O, unsigned IncIndent = 0);
334   void dump();
335 #endif
336 };
337
338 //===----------------------------------------------------------------------===//
339 /// DIEValue - A debug information entry value.
340 ///
341 class DIEValue : public FoldingSetNode {
342 public:
343   enum {
344     isInteger,
345     isString,
346     isLabel,
347     isAsIsLabel,
348     isDelta,
349     isEntry,
350     isBlock
351   };
352   
353   /// Type - Type of data stored in the value.
354   ///
355   unsigned Type;
356   
357   /// Usage - Number of uses of this value.
358   ///
359   unsigned Usage;
360   
361   DIEValue(unsigned T)
362   : Type(T)
363   , Usage(1)
364   {}
365   virtual ~DIEValue() {}
366   
367   unsigned getType()  const { return Type; }
368   unsigned getUsage() const { return Usage; }
369   void IncUsage()           { ++Usage; }
370   
371   // Implement isa/cast/dyncast.
372   static bool classof(const DIEValue *) { return true; }
373   
374   /// EmitValue - Emit value via the Dwarf writer.
375   ///
376   virtual void EmitValue(const Dwarf &DW, unsigned Form) const = 0;
377   
378   /// SizeOf - Return the size of a value in bytes.
379   ///
380   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const = 0;
381   
382   /// Profile - Used to gather unique data for the value folding set.
383   ///
384   virtual void Profile(FoldingSetNodeID &ID) = 0;
385       
386 #ifndef NDEBUG
387   virtual void print(std::ostream &O) = 0;
388   void dump();
389 #endif
390 };
391
392 //===----------------------------------------------------------------------===//
393 /// DWInteger - An integer value DIE.
394 /// 
395 class DIEInteger : public DIEValue {
396 private:
397   uint64_t Integer;
398   
399 public:
400   DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {}
401
402   // Implement isa/cast/dyncast.
403   static bool classof(const DIEInteger *) { return true; }
404   static bool classof(const DIEValue *I)  { return I->Type == isInteger; }
405   
406   /// BestForm - Choose the best form for integer.
407   ///
408   static unsigned BestForm(bool IsSigned, uint64_t Integer) {
409     if (IsSigned) {
410       if ((char)Integer == (signed)Integer)   return DW_FORM_data1;
411       if ((short)Integer == (signed)Integer)  return DW_FORM_data2;
412       if ((int)Integer == (signed)Integer)    return DW_FORM_data4;
413     } else {
414       if ((unsigned char)Integer == Integer)  return DW_FORM_data1;
415       if ((unsigned short)Integer == Integer) return DW_FORM_data2;
416       if ((unsigned int)Integer == Integer)   return DW_FORM_data4;
417     }
418     return DW_FORM_data8;
419   }
420     
421   /// EmitValue - Emit integer of appropriate size.
422   ///
423   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
424   
425   /// SizeOf - Determine size of integer value in bytes.
426   ///
427   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const {
428     switch (Form) {
429     case DW_FORM_flag:  // Fall thru
430     case DW_FORM_ref1:  // Fall thru
431     case DW_FORM_data1: return sizeof(int8_t);
432     case DW_FORM_ref2:  // Fall thru
433     case DW_FORM_data2: return sizeof(int16_t);
434     case DW_FORM_ref4:  // Fall thru
435     case DW_FORM_data4: return sizeof(int32_t);
436     case DW_FORM_ref8:  // Fall thru
437     case DW_FORM_data8: return sizeof(int64_t);
438     case DW_FORM_udata: return SizeULEB128(Integer);
439     case DW_FORM_sdata: return SizeSLEB128(Integer);
440     default: assert(0 && "DIE Value form not supported yet"); break;
441     }
442     return 0;
443   }
444   
445   /// Profile - Used to gather unique data for the value folding set.
446   ///
447   virtual void Profile(FoldingSetNodeID &ID) {
448     ID.AddInteger(Integer);
449   }
450   
451 #ifndef NDEBUG
452   virtual void print(std::ostream &O) {
453     O << "Int: " << (int64_t)Integer
454       << "  0x" << std::hex << Integer << std::dec;
455   }
456 #endif
457 };
458
459 //===----------------------------------------------------------------------===//
460 /// DIEString - A string value DIE.
461 /// 
462 class DIEString : public DIEValue {
463 public:
464   const std::string String;
465   
466   DIEString(const std::string &S) : DIEValue(isString), String(S) {}
467
468   // Implement isa/cast/dyncast.
469   static bool classof(const DIEString *) { return true; }
470   static bool classof(const DIEValue *S) { return S->Type == isString; }
471   
472   /// EmitValue - Emit string value.
473   ///
474   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
475   
476   /// SizeOf - Determine size of string value in bytes.
477   ///
478   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const {
479     return String.size() + sizeof(char); // sizeof('\0');
480   }
481   
482   /// Profile - Used to gather unique data for the value folding set.
483   ///
484   virtual void Profile(FoldingSetNodeID &ID) {
485     ID.AddString(String);
486   }
487   
488 #ifndef NDEBUG
489   virtual void print(std::ostream &O) {
490     O << "Str: \"" << String << "\"";
491   }
492 #endif
493 };
494
495 //===----------------------------------------------------------------------===//
496 /// DIEDwarfLabel - A Dwarf internal label expression DIE.
497 //
498 class DIEDwarfLabel : public DIEValue {
499 public:
500
501   const DWLabel Label;
502   
503   DIEDwarfLabel(const DWLabel &L) : DIEValue(isLabel), Label(L) {}
504
505   // Implement isa/cast/dyncast.
506   static bool classof(const DIEDwarfLabel *)  { return true; }
507   static bool classof(const DIEValue *L) { return L->Type == isLabel; }
508   
509   /// EmitValue - Emit label value.
510   ///
511   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
512   
513   /// SizeOf - Determine size of label value in bytes.
514   ///
515   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
516   
517   /// Profile - Used to gather unique data for the value folding set.
518   ///
519   virtual void Profile(FoldingSetNodeID &ID) {
520     Label.Profile(ID);
521   }
522   
523 #ifndef NDEBUG
524   virtual void print(std::ostream &O) {
525     O << "Lbl: ";
526     Label.print(O);
527   }
528 #endif
529 };
530
531
532 //===----------------------------------------------------------------------===//
533 /// DIEObjectLabel - A label to an object in code or data.
534 //
535 class DIEObjectLabel : public DIEValue {
536 public:
537   const std::string Label;
538   
539   DIEObjectLabel(const std::string &L) : DIEValue(isAsIsLabel), Label(L) {}
540
541   // Implement isa/cast/dyncast.
542   static bool classof(const DIEObjectLabel *) { return true; }
543   static bool classof(const DIEValue *L)    { return L->Type == isAsIsLabel; }
544   
545   /// EmitValue - Emit label value.
546   ///
547   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
548   
549   /// SizeOf - Determine size of label value in bytes.
550   ///
551   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
552   
553   /// Profile - Used to gather unique data for the value folding set.
554   ///
555   virtual void Profile(FoldingSetNodeID &ID) {
556     ID.AddString(Label);
557   }
558
559 #ifndef NDEBUG
560   virtual void print(std::ostream &O) {
561     O << "Obj: " << Label;
562   }
563 #endif
564 };
565
566 //===----------------------------------------------------------------------===//
567 /// DIEDelta - A simple label difference DIE.
568 /// 
569 class DIEDelta : public DIEValue {
570 public:
571   const DWLabel LabelHi;
572   const DWLabel LabelLo;
573   
574   DIEDelta(const DWLabel &Hi, const DWLabel &Lo)
575   : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
576
577   // Implement isa/cast/dyncast.
578   static bool classof(const DIEDelta *)  { return true; }
579   static bool classof(const DIEValue *D) { return D->Type == isDelta; }
580   
581   /// EmitValue - Emit delta value.
582   ///
583   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
584   
585   /// SizeOf - Determine size of delta value in bytes.
586   ///
587   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
588   
589   /// Profile - Used to gather unique data for the value folding set.
590   ///
591   virtual void Profile(FoldingSetNodeID &ID){
592     LabelHi.Profile(ID);
593     LabelLo.Profile(ID);
594   }
595
596 #ifndef NDEBUG
597   virtual void print(std::ostream &O) {
598     O << "Del: ";
599     LabelHi.print(O);
600     O << "-";
601     LabelLo.print(O);
602   }
603 #endif
604 };
605
606 //===----------------------------------------------------------------------===//
607 /// DIEntry - A pointer to another debug information entry.  An instance of this
608 /// class can also be used as a proxy for a debug information entry not yet
609 /// defined (ie. types.)
610 class DIEntry : public DIEValue {
611 public:
612   DIE *Entry;
613   
614   DIEntry(DIE *E) : DIEValue(isEntry), Entry(E) {}
615   
616   // Implement isa/cast/dyncast.
617   static bool classof(const DIEntry *)   { return true; }
618   static bool classof(const DIEValue *E) { return E->Type == isEntry; }
619   
620   /// EmitValue - Emit debug information entry offset.
621   ///
622   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
623   
624   /// SizeOf - Determine size of debug information entry in bytes.
625   ///
626   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const {
627     return sizeof(int32_t);
628   }
629   
630   /// Profile - Used to gather unique data for the value folding set.
631   ///
632   virtual void Profile(FoldingSetNodeID &ID) {
633     if (Entry) {
634       ID.AddPointer(Entry);
635     } else {
636       ID.AddPointer(this);
637     }
638   }
639   
640 #ifndef NDEBUG
641   virtual void print(std::ostream &O) {
642     O << "Die: 0x" << std::hex << (intptr_t)Entry << std::dec;
643   }
644 #endif
645 };
646
647 //===----------------------------------------------------------------------===//
648 /// DIEBlock - A block of values.  Primarily used for location expressions.
649 //
650 class DIEBlock : public DIEValue, public DIE {
651 public:
652   unsigned Size;                        // Size in bytes excluding size header.
653   
654   DIEBlock()
655   : DIEValue(isBlock)
656   , DIE(0)
657   , Size(0)
658   {}
659   ~DIEBlock()  {
660   }
661   
662   // Implement isa/cast/dyncast.
663   static bool classof(const DIEBlock *)  { return true; }
664   static bool classof(const DIEValue *E) { return E->Type == isBlock; }
665   
666   /// ComputeSize - calculate the size of the block.
667   ///
668   unsigned ComputeSize(Dwarf &DW);
669   
670   /// BestForm - Choose the best form for data.
671   ///
672   unsigned BestForm() const {
673     if ((unsigned char)Size == Size)  return DW_FORM_block1;
674     if ((unsigned short)Size == Size) return DW_FORM_block2;
675     if ((unsigned int)Size == Size)   return DW_FORM_block4;
676     return DW_FORM_block;
677   }
678
679   /// EmitValue - Emit block data.
680   ///
681   virtual void EmitValue(const Dwarf &DW, unsigned Form) const;
682   
683   /// SizeOf - Determine size of block data in bytes.
684   ///
685   virtual unsigned SizeOf(const Dwarf &DW, unsigned Form) const;
686   
687
688   /// Profile - Used to gather unique data for the value folding set.
689   ///
690   virtual void DIEBlock::Profile(FoldingSetNodeID &ID) {
691     DIE::Profile(ID);
692   }
693   
694 #ifndef NDEBUG
695   virtual void print(std::ostream &O) {
696     O << "Blk: ";
697     DIE::print(O, 5);
698   }
699 #endif
700 };
701
702 //===----------------------------------------------------------------------===//
703 /// CompileUnit - This dwarf writer support class manages information associate
704 /// with a source file.
705 class CompileUnit {
706 private:
707   /// Desc - Compile unit debug descriptor.
708   ///
709   CompileUnitDesc *Desc;
710   
711   /// ID - File identifier for source.
712   ///
713   unsigned ID;
714   
715   /// Die - Compile unit debug information entry.
716   ///
717   DIE *Die;
718   
719   /// DescToDieMap - Tracks the mapping of unit level debug informaton
720   /// descriptors to debug information entries.
721   std::map<DebugInfoDesc *, DIE *> DescToDieMap;
722
723   /// DescToDIEntryMap - Tracks the mapping of unit level debug informaton
724   /// descriptors to debug information entries using a DIEntry proxy.
725   std::map<DebugInfoDesc *, DIEntry *> DescToDIEntryMap;
726
727   /// Globals - A map of globally visible named entities for this unit.
728   ///
729   std::map<std::string, DIE *> Globals;
730
731   /// DiesSet - Used to uniquely define dies within the compile unit.
732   ///
733   FoldingSet<DIE> DiesSet;
734   
735   /// Dies - List of all dies in the compile unit.
736   ///
737   std::vector<DIE *> Dies;
738   
739 public:
740   CompileUnit(CompileUnitDesc *CUD, unsigned I, DIE *D)
741   : Desc(CUD)
742   , ID(I)
743   , Die(D)
744   , DescToDieMap()
745   , DescToDIEntryMap()
746   , Globals()
747   , DiesSet(InitDiesSetSize)
748   , Dies()
749   {}
750   
751   ~CompileUnit() {
752     delete Die;
753     
754     for (unsigned i = 0, N = Dies.size(); i < N; ++i)
755       delete Dies[i];
756   }
757   
758   // Accessors.
759   CompileUnitDesc *getDesc() const { return Desc; }
760   unsigned getID()           const { return ID; }
761   DIE* getDie()              const { return Die; }
762   std::map<std::string, DIE *> &getGlobals() { return Globals; }
763
764   /// hasContent - Return true if this compile unit has something to write out.
765   ///
766   bool hasContent() const {
767     return !Die->getChildren().empty();
768   }
769
770   /// AddGlobal - Add a new global entity to the compile unit.
771   ///
772   void AddGlobal(const std::string &Name, DIE *Die) {
773     Globals[Name] = Die;
774   }
775   
776   /// getDieMapSlotFor - Returns the debug information entry map slot for the
777   /// specified debug descriptor.
778   DIE *&getDieMapSlotFor(DebugInfoDesc *DD) {
779     return DescToDieMap[DD];
780   }
781   
782   /// getDIEntrySlotFor - Returns the debug information entry proxy slot for the
783   /// specified debug descriptor.
784   DIEntry *&getDIEntrySlotFor(DebugInfoDesc *DD) {
785     return DescToDIEntryMap[DD];
786   }
787   
788   /// AddDie - Adds or interns the DIE to the compile unit.
789   ///
790   DIE *AddDie(DIE &Buffer) {
791     FoldingSetNodeID ID;
792     Buffer.Profile(ID);
793     void *Where;
794     DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
795     
796     if (!Die) {
797       Die = new DIE(Buffer);
798       DiesSet.InsertNode(Die, Where);
799       this->Die->AddChild(Die);
800       Buffer.Detach();
801     }
802     
803     return Die;
804   }
805 };
806
807 //===----------------------------------------------------------------------===//
808 /// Dwarf - Emits Dwarf debug and exception handling directives. 
809 ///
810 class Dwarf {
811
812 private:
813
814   //===--------------------------------------------------------------------===//
815   // Core attributes used by the Dwarf  writer.
816   //
817   
818   //
819   /// O - Stream to .s file.
820   ///
821   std::ostream &O;
822
823   /// Asm - Target of Dwarf emission.
824   ///
825   AsmPrinter *Asm;
826   
827   /// TAI - Target Asm Printer.
828   const TargetAsmInfo *TAI;
829   
830   /// TD - Target data.
831   const TargetData *TD;
832   
833   /// RI - Register Information.
834   const MRegisterInfo *RI;
835   
836   /// M - Current module.
837   ///
838   Module *M;
839   
840   /// MF - Current machine function.
841   ///
842   MachineFunction *MF;
843   
844   /// DebugInfo - Collected debug information.
845   ///
846   MachineDebugInfo *DebugInfo;
847   
848   /// didInitial - Flag to indicate if initial emission has been done.
849   ///
850   bool didInitial;
851   
852   /// shouldEmit - Flag to indicate if debug information should be emitted.
853   ///
854   bool shouldEmit;
855   
856   /// SubprogramCount - The running count of functions being compiled.
857   ///
858   unsigned SubprogramCount;
859   
860   //===--------------------------------------------------------------------===//
861   // Attributes used to construct specific Dwarf sections.
862   //
863   
864   /// CompileUnits - All the compile units involved in this build.  The index
865   /// of each entry in this vector corresponds to the sources in DebugInfo.
866   std::vector<CompileUnit *> CompileUnits;
867   
868   /// AbbreviationsSet - Used to uniquely define abbreviations.
869   ///
870   FoldingSet<DIEAbbrev> AbbreviationsSet;
871
872   /// Abbreviations - A list of all the unique abbreviations in use.
873   ///
874   std::vector<DIEAbbrev *> Abbreviations;
875   
876   /// ValuesSet - Used to uniquely define values.
877   ///
878   FoldingSet<DIEValue> ValuesSet;
879   
880   /// Values - A list of all the unique values in use.
881   ///
882   std::vector<DIEValue *> Values;
883   
884   /// StringPool - A UniqueVector of strings used by indirect references.
885   ///
886   UniqueVector<std::string> StringPool;
887
888   /// UnitMap - Map debug information descriptor to compile unit.
889   ///
890   std::map<DebugInfoDesc *, CompileUnit *> DescToUnitMap;
891   
892   /// SectionMap - Provides a unique id per text section.
893   ///
894   UniqueVector<std::string> SectionMap;
895   
896   /// SectionSourceLines - Tracks line numbers per text section.
897   ///
898   std::vector<std::vector<SourceLineInfo> > SectionSourceLines;
899
900
901 public:
902
903   //===--------------------------------------------------------------------===//
904   // Emission and print routines
905   //
906
907   /// PrintHex - Print a value as a hexidecimal value.
908   ///
909   void PrintHex(int Value) const { 
910     O << "0x" << std::hex << Value << std::dec;
911   }
912
913   /// EOL - Print a newline character to asm stream.  If a comment is present
914   /// then it will be printed first.  Comments should not contain '\n'.
915   void EOL(const std::string &Comment) const {
916     if (DwarfVerbose && !Comment.empty()) {
917       O << "\t"
918         << TAI->getCommentString()
919         << " "
920         << Comment;
921     }
922     O << "\n";
923   }
924   
925   /// EmitAlign - Print a align directive.
926   ///
927   void EmitAlign(unsigned Alignment) const {
928     O << TAI->getAlignDirective() << Alignment << "\n";
929   }
930                                         
931   /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
932   /// unsigned leb128 value.
933   void EmitULEB128Bytes(unsigned Value) const {
934     if (TAI->hasLEB128()) {
935       O << "\t.uleb128\t"
936         << Value;
937     } else {
938       O << TAI->getData8bitsDirective();
939       PrintULEB128(O, Value);
940     }
941   }
942   
943   /// EmitSLEB128Bytes - print an assembler byte data directive to compose a
944   /// signed leb128 value.
945   void EmitSLEB128Bytes(int Value) const {
946     if (TAI->hasLEB128()) {
947       O << "\t.sleb128\t"
948         << Value;
949     } else {
950       O << TAI->getData8bitsDirective();
951       PrintSLEB128(O, Value);
952     }
953   }
954   
955   /// EmitInt8 - Emit a byte directive and value.
956   ///
957   void EmitInt8(int Value) const {
958     O << TAI->getData8bitsDirective();
959     PrintHex(Value & 0xFF);
960   }
961
962   /// EmitInt16 - Emit a short directive and value.
963   ///
964   void EmitInt16(int Value) const {
965     O << TAI->getData16bitsDirective();
966     PrintHex(Value & 0xFFFF);
967   }
968
969   /// EmitInt32 - Emit a long directive and value.
970   ///
971   void EmitInt32(int Value) const {
972     O << TAI->getData32bitsDirective();
973     PrintHex(Value);
974   }
975
976   /// EmitInt64 - Emit a long long directive and value.
977   ///
978   void EmitInt64(uint64_t Value) const {
979     if (TAI->getData64bitsDirective()) {
980       O << TAI->getData64bitsDirective();
981       PrintHex(Value);
982     } else {
983       if (TD->isBigEndian()) {
984         EmitInt32(unsigned(Value >> 32)); O << "\n";
985         EmitInt32(unsigned(Value));
986       } else {
987         EmitInt32(unsigned(Value)); O << "\n";
988         EmitInt32(unsigned(Value >> 32));
989       }
990     }
991   }
992
993   /// EmitString - Emit a string with quotes and a null terminator.
994   /// Special characters are emitted properly.
995   /// \literal (Eg. '\t') \endliteral
996   void EmitString(const std::string &String) const {
997     O << TAI->getAsciiDirective()
998       << "\"";
999     for (unsigned i = 0, N = String.size(); i < N; ++i) {
1000       unsigned char C = String[i];
1001       
1002       if (!isascii(C) || iscntrl(C)) {
1003         switch(C) {
1004         case '\b': O << "\\b"; break;
1005         case '\f': O << "\\f"; break;
1006         case '\n': O << "\\n"; break;
1007         case '\r': O << "\\r"; break;
1008         case '\t': O << "\\t"; break;
1009         default:
1010           O << '\\';
1011           O << char('0' + ((C >> 6) & 7));
1012           O << char('0' + ((C >> 3) & 7));
1013           O << char('0' + ((C >> 0) & 7));
1014           break;
1015         }
1016       } else if (C == '\"') {
1017         O << "\\\"";
1018       } else if (C == '\'') {
1019         O << "\\\'";
1020       } else {
1021        O << C;
1022       }
1023     }
1024     O << "\\0\"";
1025   }
1026
1027   /// PrintLabelName - Print label name in form used by Dwarf writer.
1028   ///
1029   void PrintLabelName(DWLabel Label) const {
1030     PrintLabelName(Label.Tag, Label.Number);
1031   }
1032   void PrintLabelName(const char *Tag, unsigned Number) const {
1033     O << TAI->getPrivateGlobalPrefix()
1034       << "debug_"
1035       << Tag;
1036     if (Number) O << Number;
1037   }
1038   
1039   /// EmitLabel - Emit location label for internal use by Dwarf.
1040   ///
1041   void EmitLabel(DWLabel Label) const {
1042     EmitLabel(Label.Tag, Label.Number);
1043   }
1044   void EmitLabel(const char *Tag, unsigned Number) const {
1045     PrintLabelName(Tag, Number);
1046     O << ":\n";
1047   }
1048   
1049   /// EmitReference - Emit a reference to a label.
1050   ///
1051   void EmitReference(DWLabel Label) const {
1052     EmitReference(Label.Tag, Label.Number);
1053   }
1054   void EmitReference(const char *Tag, unsigned Number) const {
1055     if (TAI->getAddressSize() == 4)
1056       O << TAI->getData32bitsDirective();
1057     else
1058       O << TAI->getData64bitsDirective();
1059       
1060     PrintLabelName(Tag, Number);
1061   }
1062   void EmitReference(const std::string &Name) const {
1063     if (TAI->getAddressSize() == 4)
1064       O << TAI->getData32bitsDirective();
1065     else
1066       O << TAI->getData64bitsDirective();
1067       
1068     O << Name;
1069   }
1070
1071   /// EmitDifference - Emit the difference between two labels.  Some
1072   /// assemblers do not behave with absolute expressions with data directives,
1073   /// so there is an option (needsSet) to use an intermediary set expression.
1074   void EmitDifference(DWLabel LabelHi, DWLabel LabelLo) const {
1075     EmitDifference(LabelHi.Tag, LabelHi.Number, LabelLo.Tag, LabelLo.Number);
1076   }
1077   void EmitDifference(const char *TagHi, unsigned NumberHi,
1078                       const char *TagLo, unsigned NumberLo) const {
1079     if (TAI->needsSet()) {
1080       static unsigned SetCounter = 0;
1081       
1082       O << "\t.set\t";
1083       PrintLabelName("set", SetCounter);
1084       O << ",";
1085       PrintLabelName(TagHi, NumberHi);
1086       O << "-";
1087       PrintLabelName(TagLo, NumberLo);
1088       O << "\n";
1089       
1090       if (TAI->getAddressSize() == sizeof(int32_t))
1091         O << TAI->getData32bitsDirective();
1092       else
1093         O << TAI->getData64bitsDirective();
1094         
1095       PrintLabelName("set", SetCounter);
1096       
1097       ++SetCounter;
1098     } else {
1099       if (TAI->getAddressSize() == sizeof(int32_t))
1100         O << TAI->getData32bitsDirective();
1101       else
1102         O << TAI->getData64bitsDirective();
1103         
1104       PrintLabelName(TagHi, NumberHi);
1105       O << "-";
1106       PrintLabelName(TagLo, NumberLo);
1107     }
1108   }
1109                       
1110   /// AssignAbbrevNumber - Define a unique number for the abbreviation.
1111   ///  
1112   void AssignAbbrevNumber(DIEAbbrev &Abbrev) {
1113     // Profile the node so that we can make it unique.
1114     FoldingSetNodeID ID;
1115     Abbrev.Profile(ID);
1116     
1117     // Check the set for priors.
1118     DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
1119     
1120     // If it's newly added.
1121     if (InSet == &Abbrev) {
1122       // Add to abbreviation list. 
1123       Abbreviations.push_back(&Abbrev);
1124       // Assign the vector position + 1 as its number.
1125       Abbrev.setNumber(Abbreviations.size());
1126     } else {
1127       // Assign existing abbreviation number.
1128       Abbrev.setNumber(InSet->getNumber());
1129     }
1130   }
1131
1132   /// NewString - Add a string to the constant pool and returns a label.
1133   ///
1134   DWLabel NewString(const std::string &String) {
1135     unsigned StringID = StringPool.insert(String);
1136     return DWLabel("string", StringID);
1137   }
1138   
1139   /// NewDIEntry - Creates a new DIEntry to be a proxy for a debug information
1140   /// entry.
1141   DIEntry *NewDIEntry(DIE *Entry = NULL) {
1142     DIEntry *Value;
1143     
1144     if (Entry) {
1145       FoldingSetNodeID ID;
1146       ID.AddPointer(Entry);
1147       void *Where;
1148       Value = static_cast<DIEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
1149       
1150       if (Value) {
1151         Value->IncUsage();
1152         return Value;
1153       }
1154       
1155       Value = new DIEntry(Entry);
1156       ValuesSet.InsertNode(Value, Where);
1157     } else {
1158       Value = new DIEntry(Entry);
1159     }
1160     
1161     Values.push_back(Value);
1162     return Value;
1163   }
1164   
1165   /// SetDIEntry - Set a DIEntry once the debug information entry is defined.
1166   ///
1167   void SetDIEntry(DIEntry *Value, DIE *Entry) {
1168     Value->Entry = Entry;
1169     // Add to values set if not already there.  If it is, we merely have a
1170     // duplicate in the values list (no harm.)
1171     ValuesSet.GetOrInsertNode(Value);
1172   }
1173
1174   /// AddUInt - Add an unsigned integer attribute data and value.
1175   ///
1176   void AddUInt(DIE *Die, unsigned Attribute, unsigned Form, uint64_t Integer) {
1177     if (!Form) Form = DIEInteger::BestForm(false, Integer);
1178
1179     FoldingSetNodeID ID;
1180     ID.AddInteger(Integer);
1181     void *Where;
1182     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1183     if (!Value) {
1184       Value = new DIEInteger(Integer);
1185       ValuesSet.InsertNode(Value, Where);
1186       Values.push_back(Value);
1187     } else {
1188       Value->IncUsage();
1189     }
1190   
1191     Die->AddValue(Attribute, Form, Value);
1192   }
1193       
1194   /// AddSInt - Add an signed integer attribute data and value.
1195   ///
1196   void AddSInt(DIE *Die, unsigned Attribute, unsigned Form, int64_t Integer) {
1197     if (!Form) Form = DIEInteger::BestForm(true, Integer);
1198
1199     FoldingSetNodeID ID;
1200     ID.AddInteger((uint64_t)Integer);
1201     void *Where;
1202     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1203     if (!Value) {
1204       Value = new DIEInteger(Integer);
1205       ValuesSet.InsertNode(Value, Where);
1206       Values.push_back(Value);
1207     } else {
1208       Value->IncUsage();
1209     }
1210   
1211     Die->AddValue(Attribute, Form, Value);
1212   }
1213       
1214   /// AddString - Add a std::string attribute data and value.
1215   ///
1216   void AddString(DIE *Die, unsigned Attribute, unsigned Form,
1217                  const std::string &String) {
1218     FoldingSetNodeID ID;
1219     ID.AddString(String);
1220     void *Where;
1221     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1222     if (!Value) {
1223       Value = new DIEString(String);
1224       ValuesSet.InsertNode(Value, Where);
1225       Values.push_back(Value);
1226     } else {
1227       Value->IncUsage();
1228     }
1229   
1230     Die->AddValue(Attribute, Form, Value);
1231   }
1232       
1233   /// AddLabel - Add a Dwarf label attribute data and value.
1234   ///
1235   void AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
1236                      const DWLabel &Label) {
1237     FoldingSetNodeID ID;
1238     Label.Profile(ID);
1239     void *Where;
1240     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1241     if (!Value) {
1242       Value = new DIEDwarfLabel(Label);
1243       ValuesSet.InsertNode(Value, Where);
1244       Values.push_back(Value);
1245     } else {
1246       Value->IncUsage();
1247     }
1248   
1249     Die->AddValue(Attribute, Form, Value);
1250   }
1251       
1252   /// AddObjectLabel - Add an non-Dwarf label attribute data and value.
1253   ///
1254   void AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
1255                       const std::string &Label) {
1256     FoldingSetNodeID ID;
1257     ID.AddString(Label);
1258     void *Where;
1259     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1260     if (!Value) {
1261       Value = new DIEObjectLabel(Label);
1262       ValuesSet.InsertNode(Value, Where);
1263       Values.push_back(Value);
1264     } else {
1265       Value->IncUsage();
1266     }
1267   
1268     Die->AddValue(Attribute, Form, Value);
1269   }
1270       
1271   /// AddDelta - Add a label delta attribute data and value.
1272   ///
1273   void AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
1274                           const DWLabel &Hi, const DWLabel &Lo) {
1275     FoldingSetNodeID ID;
1276     Hi.Profile(ID);
1277     Lo.Profile(ID);
1278     void *Where;
1279     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1280     if (!Value) {
1281       Value = new DIEDelta(Hi, Lo);
1282       ValuesSet.InsertNode(Value, Where);
1283       Values.push_back(Value);
1284     } else {
1285       Value->IncUsage();
1286     }
1287   
1288     Die->AddValue(Attribute, Form, Value);
1289   }
1290       
1291   /// AddDIEntry - Add a DIE attribute data and value.
1292   ///
1293   void AddDIEntry(DIE *Die, unsigned Attribute, unsigned Form, DIE *Entry) {
1294     Die->AddValue(Attribute, Form, NewDIEntry(Entry));
1295   }
1296
1297   /// AddBlock - Add block data.
1298   ///
1299   void AddBlock(DIE *Die, unsigned Attribute, unsigned Form, DIEBlock *Block) {
1300     Block->ComputeSize(*this);
1301     FoldingSetNodeID ID;
1302     Block->Profile(ID);
1303     void *Where;
1304     DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
1305     if (!Value) {
1306       Value = Block;
1307       ValuesSet.InsertNode(Value, Where);
1308       Values.push_back(Value);
1309     } else {
1310       Value->IncUsage();
1311       delete Block;
1312     }
1313   
1314     Die->AddValue(Attribute, Block->BestForm(), Value);
1315   }
1316
1317 private:
1318
1319   /// AddSourceLine - Add location information to specified debug information
1320   /// entry.
1321   void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line) {
1322     if (File && Line) {
1323       CompileUnit *FileUnit = FindCompileUnit(File);
1324       unsigned FileID = FileUnit->getID();
1325       AddUInt(Die, DW_AT_decl_file, 0, FileID);
1326       AddUInt(Die, DW_AT_decl_line, 0, Line);
1327     }
1328   }
1329
1330   /// AddAddress - Add an address attribute to a die based on the location
1331   /// provided.
1332   void AddAddress(DIE *Die, unsigned Attribute,
1333                             const MachineLocation &Location) {
1334     unsigned Reg = RI->getDwarfRegNum(Location.getRegister());
1335     DIEBlock *Block = new DIEBlock();
1336     
1337     if (Location.isRegister()) {
1338       if (Reg < 32) {
1339         AddUInt(Block, 0, DW_FORM_data1, DW_OP_reg0 + Reg);
1340       } else {
1341         AddUInt(Block, 0, DW_FORM_data1, DW_OP_regx);
1342         AddUInt(Block, 0, DW_FORM_udata, Reg);
1343       }
1344     } else {
1345       if (Reg < 32) {
1346         AddUInt(Block, 0, DW_FORM_data1, DW_OP_breg0 + Reg);
1347       } else {
1348         AddUInt(Block, 0, DW_FORM_data1, DW_OP_bregx);
1349         AddUInt(Block, 0, DW_FORM_udata, Reg);
1350       }
1351       AddUInt(Block, 0, DW_FORM_sdata, Location.getOffset());
1352     }
1353     
1354     AddBlock(Die, Attribute, 0, Block);
1355   }
1356   
1357   /// AddBasicType - Add a new basic type attribute to the specified entity.
1358   ///
1359   void AddBasicType(DIE *Entity, CompileUnit *Unit,
1360                     const std::string &Name,
1361                     unsigned Encoding, unsigned Size) {
1362     DIE *Die = ConstructBasicType(Unit, Name, Encoding, Size);
1363     AddDIEntry(Entity, DW_AT_type, DW_FORM_ref4, Die);
1364   }
1365   
1366   /// ConstructBasicType - Construct a new basic type.
1367   ///
1368   DIE *ConstructBasicType(CompileUnit *Unit,
1369                           const std::string &Name,
1370                           unsigned Encoding, unsigned Size) {
1371     DIE Buffer(DW_TAG_base_type);
1372     AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1373     AddUInt(&Buffer, DW_AT_encoding, DW_FORM_data1, Encoding);
1374     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1375     return Unit->AddDie(Buffer);
1376   }
1377   
1378   /// AddPointerType - Add a new pointer type attribute to the specified entity.
1379   ///
1380   void AddPointerType(DIE *Entity, CompileUnit *Unit, const std::string &Name) {
1381     DIE *Die = ConstructPointerType(Unit, Name);
1382     AddDIEntry(Entity, DW_AT_type, DW_FORM_ref4, Die);
1383   }
1384   
1385   /// ConstructPointerType - Construct a new pointer type.
1386   ///
1387   DIE *ConstructPointerType(CompileUnit *Unit, const std::string &Name) {
1388     DIE Buffer(DW_TAG_pointer_type);
1389     AddUInt(&Buffer, DW_AT_byte_size, 0, TAI->getAddressSize());
1390     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1391     return Unit->AddDie(Buffer);
1392   }
1393   
1394   /// AddType - Add a new type attribute to the specified entity.
1395   ///
1396   void AddType(DIE *Entity, TypeDesc *TyDesc, CompileUnit *Unit) {
1397     if (!TyDesc) {
1398       AddBasicType(Entity, Unit, "", DW_ATE_signed, 4);
1399     } else {
1400       // Check for pre-existence.
1401       DIEntry *&Slot = Unit->getDIEntrySlotFor(TyDesc);
1402       
1403       // If it exists then use the existing value.
1404       if (Slot) {
1405         Slot->IncUsage();
1406         Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot);
1407         return;
1408       }
1409       
1410       if (SubprogramDesc *SubprogramTy = dyn_cast<SubprogramDesc>(TyDesc)) {
1411         // FIXME - Not sure why programs and variables are coming through here.
1412         // Short cut for handling subprogram types (not really a TyDesc.)
1413         AddPointerType(Entity, Unit, SubprogramTy->getName());
1414       } else if (GlobalVariableDesc *GlobalTy =
1415                                          dyn_cast<GlobalVariableDesc>(TyDesc)) {
1416         // FIXME - Not sure why programs and variables are coming through here.
1417         // Short cut for handling global variable types (not really a TyDesc.)
1418         AddPointerType(Entity, Unit, GlobalTy->getName());
1419       } else {  
1420         // Set up proxy.
1421         Slot = NewDIEntry();
1422         
1423         // Construct type.
1424         DIE Buffer(DW_TAG_base_type);
1425         ConstructType(Buffer, TyDesc, Unit);
1426         
1427         // Add debug information entry to entity and unit.
1428         DIE *Die = Unit->AddDie(Buffer);
1429         SetDIEntry(Slot, Die);
1430         Entity->AddValue(DW_AT_type, DW_FORM_ref4, Slot);
1431       }
1432     }
1433   }
1434   
1435   /// ConstructType - Adds all the required attributes to the type.
1436   ///
1437   void ConstructType(DIE &Buffer, TypeDesc *TyDesc, CompileUnit *Unit) {
1438     // Get core information.
1439     const std::string &Name = TyDesc->getName();
1440     uint64_t Size = TyDesc->getSize() >> 3;
1441     
1442     if (BasicTypeDesc *BasicTy = dyn_cast<BasicTypeDesc>(TyDesc)) {
1443       // Fundamental types like int, float, bool
1444       Buffer.setTag(DW_TAG_base_type);
1445       AddUInt(&Buffer, DW_AT_encoding,  DW_FORM_data1, BasicTy->getEncoding());
1446     } else if (DerivedTypeDesc *DerivedTy = dyn_cast<DerivedTypeDesc>(TyDesc)) {
1447       // Pointers, tyepdefs et al. 
1448       Buffer.setTag(DerivedTy->getTag());
1449       // Map to main type, void will not have a type.
1450       if (TypeDesc *FromTy = DerivedTy->getFromType())
1451         AddType(&Buffer, FromTy, Unit);
1452     } else if (CompositeTypeDesc *CompTy = dyn_cast<CompositeTypeDesc>(TyDesc)){
1453       // Fetch tag.
1454       unsigned Tag = CompTy->getTag();
1455       
1456       // Set tag accordingly.
1457       if (Tag == DW_TAG_vector_type)
1458         Buffer.setTag(DW_TAG_array_type);
1459       else 
1460         Buffer.setTag(Tag);
1461
1462       std::vector<DebugInfoDesc *> &Elements = CompTy->getElements();
1463       
1464       switch (Tag) {
1465       case DW_TAG_vector_type:
1466         AddUInt(&Buffer, DW_AT_GNU_vector, DW_FORM_flag, 1);
1467         // Fall thru
1468       case DW_TAG_array_type: {
1469         // Add element type.
1470         if (TypeDesc *FromTy = CompTy->getFromType())
1471           AddType(&Buffer, FromTy, Unit);
1472         
1473         // Don't emit size attribute.
1474         Size = 0;
1475         
1476         // Construct an anonymous type for index type.
1477         DIE *IndexTy = ConstructBasicType(Unit, "", DW_ATE_signed, 4);
1478       
1479         // Add subranges to array type.
1480         for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
1481           SubrangeDesc *SRD = cast<SubrangeDesc>(Elements[i]);
1482           int64_t Lo = SRD->getLo();
1483           int64_t Hi = SRD->getHi();
1484           DIE *Subrange = new DIE(DW_TAG_subrange_type);
1485           
1486           // If a range is available.
1487           if (Lo != Hi) {
1488             AddDIEntry(Subrange, DW_AT_type, DW_FORM_ref4, IndexTy);
1489             // Only add low if non-zero.
1490             if (Lo) AddSInt(Subrange, DW_AT_lower_bound, 0, Lo);
1491             AddSInt(Subrange, DW_AT_upper_bound, 0, Hi);
1492           }
1493           
1494           Buffer.AddChild(Subrange);
1495         }
1496         break;
1497       }
1498       case DW_TAG_structure_type:
1499       case DW_TAG_union_type: {
1500         // Add elements to structure type.
1501         for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
1502           DebugInfoDesc *Element = Elements[i];
1503           
1504           if (DerivedTypeDesc *MemberDesc = dyn_cast<DerivedTypeDesc>(Element)){
1505             // Add field or base class.
1506             
1507             unsigned Tag = MemberDesc->getTag();
1508           
1509             // Extract the basic information.
1510             const std::string &Name = MemberDesc->getName();
1511             TypeDesc *MemTy = MemberDesc->getFromType();
1512             uint64_t Size = MemberDesc->getSize();
1513             uint64_t Align = MemberDesc->getAlign();
1514             uint64_t Offset = MemberDesc->getOffset();
1515        
1516             // Construct member debug information entry.
1517             DIE *Member = new DIE(Tag);
1518             
1519             // Add name if not "".
1520             if (!Name.empty())
1521               AddString(Member, DW_AT_name, DW_FORM_string, Name);
1522             // Add location if available.
1523             AddSourceLine(Member, MemberDesc->getFile(), MemberDesc->getLine());
1524             
1525             // Most of the time the field info is the same as the members.
1526             uint64_t FieldSize = Size;
1527             uint64_t FieldAlign = Align;
1528             uint64_t FieldOffset = Offset;
1529             
1530             if (TypeDesc *FromTy = MemberDesc->getFromType()) {
1531               AddType(Member, FromTy, Unit);
1532               FieldSize = FromTy->getSize();
1533               FieldAlign = FromTy->getSize();
1534             }
1535             
1536             // Unless we have a bit field.
1537             if (Tag == DW_TAG_member && FieldSize != Size) {
1538               // Construct the alignment mask.
1539               uint64_t AlignMask = ~(FieldAlign - 1);
1540               // Determine the high bit + 1 of the declared size.
1541               uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1542               // Work backwards to determine the base offset of the field.
1543               FieldOffset = HiMark - FieldSize;
1544               // Now normalize offset to the field.
1545               Offset -= FieldOffset;
1546               
1547               // Maybe we need to work from the other end.
1548               if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1549               
1550               // Add size and offset.
1551               AddUInt(Member, DW_AT_byte_size, 0, FieldSize >> 3);
1552               AddUInt(Member, DW_AT_bit_size, 0, Size);
1553               AddUInt(Member, DW_AT_bit_offset, 0, Offset);
1554             }
1555             
1556             // Add computation for offset.
1557             DIEBlock *Block = new DIEBlock();
1558             AddUInt(Block, 0, DW_FORM_data1, DW_OP_plus_uconst);
1559             AddUInt(Block, 0, DW_FORM_udata, FieldOffset >> 3);
1560             AddBlock(Member, DW_AT_data_member_location, 0, Block);
1561
1562             // Add accessibility (public default unless is base class.
1563             if (MemberDesc->isProtected()) {
1564               AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_protected);
1565             } else if (MemberDesc->isPrivate()) {
1566               AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_private);
1567             } else if (Tag == DW_TAG_inheritance) {
1568               AddUInt(Member, DW_AT_accessibility, 0, DW_ACCESS_public);
1569             }
1570             
1571             Buffer.AddChild(Member);
1572           } else if (GlobalVariableDesc *StaticDesc =
1573                                         dyn_cast<GlobalVariableDesc>(Element)) {
1574             // Add static member.
1575             
1576             // Construct member debug information entry.
1577             DIE *Static = new DIE(DW_TAG_variable);
1578             
1579             // Add name and mangled name.
1580             const std::string &Name = StaticDesc->getDisplayName();
1581             const std::string &MangledName = StaticDesc->getName();
1582             AddString(Static, DW_AT_name, DW_FORM_string, Name);
1583             AddString(Static, DW_AT_MIPS_linkage_name, DW_FORM_string,
1584                               MangledName);
1585             
1586             // Add location.
1587             AddSourceLine(Static, StaticDesc->getFile(), StaticDesc->getLine());
1588            
1589             // Add type.
1590             if (TypeDesc *StaticTy = StaticDesc->getType())
1591               AddType(Static, StaticTy, Unit);
1592             
1593             // Add flags.
1594             AddUInt(Static, DW_AT_external, DW_FORM_flag, 1);
1595             AddUInt(Static, DW_AT_declaration, DW_FORM_flag, 1);
1596             
1597             Buffer.AddChild(Static);
1598           } else if (SubprogramDesc *MethodDesc =
1599                                             dyn_cast<SubprogramDesc>(Element)) {
1600             // Add member function.
1601             
1602             // Construct member debug information entry.
1603             DIE *Method = new DIE(DW_TAG_subprogram);
1604            
1605             // Add name and mangled name.
1606             const std::string &Name = MethodDesc->getDisplayName();
1607             const std::string &MangledName = MethodDesc->getName();
1608             bool IsCTor = false;
1609             
1610             if (Name.empty()) {
1611               AddString(Method, DW_AT_name, DW_FORM_string, MangledName);            
1612               IsCTor = TyDesc->getName() == MangledName;
1613             } else {
1614               AddString(Method, DW_AT_name, DW_FORM_string, Name);            
1615               AddString(Method, DW_AT_MIPS_linkage_name, DW_FORM_string,
1616                                 MangledName);
1617             }
1618             
1619             // Add location.
1620             AddSourceLine(Method, MethodDesc->getFile(), MethodDesc->getLine());
1621            
1622             // Add type.
1623             if (CompositeTypeDesc *MethodTy =
1624                    dyn_cast_or_null<CompositeTypeDesc>(MethodDesc->getType())) {
1625               // Get argument information.
1626               std::vector<DebugInfoDesc *> &Args = MethodTy->getElements();
1627              
1628               // If not a ctor.
1629               if (!IsCTor) {
1630                 // Add return type.
1631                 AddType(Method, dyn_cast<TypeDesc>(Args[0]), Unit);
1632               }
1633               
1634               // Add arguments.
1635               for(unsigned i = 1, N = Args.size(); i < N; ++i) {
1636                 DIE *Arg = new DIE(DW_TAG_formal_parameter);
1637                 AddType(Arg, cast<TypeDesc>(Args[i]), Unit);
1638                 AddUInt(Arg, DW_AT_artificial, DW_FORM_flag, 1);
1639                 Method->AddChild(Arg);
1640               }
1641             }
1642
1643             // Add flags.
1644             AddUInt(Method, DW_AT_external, DW_FORM_flag, 1);
1645             AddUInt(Method, DW_AT_declaration, DW_FORM_flag, 1);
1646               
1647             Buffer.AddChild(Method);
1648           }
1649         }
1650         break;
1651       }
1652       case DW_TAG_enumeration_type: {
1653         // Add enumerators to enumeration type.
1654         for(unsigned i = 0, N = Elements.size(); i < N; ++i) {
1655           EnumeratorDesc *ED = cast<EnumeratorDesc>(Elements[i]);
1656           const std::string &Name = ED->getName();
1657           int64_t Value = ED->getValue();
1658           DIE *Enumerator = new DIE(DW_TAG_enumerator);
1659           AddString(Enumerator, DW_AT_name, DW_FORM_string, Name);
1660           AddSInt(Enumerator, DW_AT_const_value, DW_FORM_sdata, Value);
1661           Buffer.AddChild(Enumerator);
1662         }
1663
1664         break;
1665       }
1666       case DW_TAG_subroutine_type: {
1667         // Add prototype flag.
1668         AddUInt(&Buffer, DW_AT_prototyped, DW_FORM_flag, 1);
1669         // Add return type.
1670         AddType(&Buffer, dyn_cast<TypeDesc>(Elements[0]), Unit);
1671         
1672         // Add arguments.
1673         for(unsigned i = 1, N = Elements.size(); i < N; ++i) {
1674           DIE *Arg = new DIE(DW_TAG_formal_parameter);
1675           AddType(Arg, cast<TypeDesc>(Elements[i]), Unit);
1676           Buffer.AddChild(Arg);
1677         }
1678         
1679         break;
1680       }
1681       default: break;
1682       }
1683     }
1684    
1685     // Add size if non-zero (derived types don't have a size.)
1686     if (Size) AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
1687     // Add name if not anonymous or intermediate type.
1688     if (!Name.empty()) AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
1689     // Add source line info if available.
1690     AddSourceLine(&Buffer, TyDesc->getFile(), TyDesc->getLine());
1691   }
1692
1693   /// NewCompileUnit - Create new compile unit and it's debug information entry.
1694   ///
1695   CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) {
1696     // Construct debug information entry.
1697     DIE *Die = new DIE(DW_TAG_compile_unit);
1698     AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0),
1699                                                   DWLabel("section_line", 0));
1700     AddString(Die, DW_AT_producer,  DW_FORM_string, UnitDesc->getProducer());
1701     AddUInt  (Die, DW_AT_language,  DW_FORM_data1,  UnitDesc->getLanguage());
1702     AddString(Die, DW_AT_name,      DW_FORM_string, UnitDesc->getFileName());
1703     AddString(Die, DW_AT_comp_dir,  DW_FORM_string, UnitDesc->getDirectory());
1704     
1705     // Construct compile unit.
1706     CompileUnit *Unit = new CompileUnit(UnitDesc, ID, Die);
1707     
1708     // Add Unit to compile unit map.
1709     DescToUnitMap[UnitDesc] = Unit;
1710     
1711     return Unit;
1712   }
1713
1714   /// FindCompileUnit - Get the compile unit for the given descriptor.
1715   ///
1716   CompileUnit *FindCompileUnit(CompileUnitDesc *UnitDesc) {
1717 #if 1
1718     // FIXME - Using only one compile unit.  Needs to me fixed at the FE.
1719     CompileUnit *Unit = CompileUnits[0];
1720 #else
1721     CompileUnit *Unit = DescToUnitMap[UnitDesc];
1722 #endif
1723     assert(Unit && "Missing compile unit.");
1724     return Unit;
1725   }
1726
1727   /// NewGlobalVariable - Add a new global variable DIE.
1728   ///
1729   DIE *NewGlobalVariable(GlobalVariableDesc *GVD) {
1730     // Get the compile unit context.
1731     CompileUnitDesc *UnitDesc =
1732       static_cast<CompileUnitDesc *>(GVD->getContext());
1733     CompileUnit *Unit = FindCompileUnit(UnitDesc);
1734
1735     // Check for pre-existence.
1736     DIE *&Slot = Unit->getDieMapSlotFor(GVD);
1737     if (Slot) return Slot;
1738     
1739     // Get the global variable itself.
1740     GlobalVariable *GV = GVD->getGlobalVariable();
1741
1742     const std::string &Name = GVD->hasMangledName() ? GVD->getDisplayName()
1743                                                     : GVD->getName();
1744     const std::string &MangledName = GVD->hasMangledName() ? GVD->getName()
1745                                                            : "";
1746     // Create the global's variable DIE.
1747     DIE *VariableDie = new DIE(DW_TAG_variable);
1748     AddString(VariableDie, DW_AT_name, DW_FORM_string, Name);
1749     if (!MangledName.empty()) {
1750       AddString(VariableDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
1751                              MangledName);
1752     }
1753     AddType(VariableDie, GVD->getType(), Unit); 
1754     AddUInt(VariableDie, DW_AT_external, DW_FORM_flag, 1);
1755     
1756     // Add source line info if available.
1757     AddSourceLine(VariableDie, UnitDesc, GVD->getLine());
1758     
1759     // Work up linkage name.
1760     const std::string LinkageName = Asm->getGlobalLinkName(GV);
1761
1762     // Add address.
1763     DIEBlock *Block = new DIEBlock();
1764     AddUInt(Block, 0, DW_FORM_data1, DW_OP_addr);
1765     AddObjectLabel(Block, 0, DW_FORM_udata, LinkageName);
1766     AddBlock(VariableDie, DW_AT_location,  0, Block);
1767     
1768     // Add to map.
1769     Slot = VariableDie;
1770    
1771     // Add to context owner.
1772     Unit->getDie()->AddChild(VariableDie);
1773     
1774     // Expose as global.
1775     // FIXME - need to check external flag.
1776     Unit->AddGlobal(Name, VariableDie);
1777     
1778     return VariableDie;
1779   }
1780
1781   /// NewSubprogram - Add a new subprogram DIE.
1782   ///
1783   DIE *NewSubprogram(SubprogramDesc *SPD) {
1784     // Get the compile unit context.
1785     CompileUnitDesc *UnitDesc =
1786       static_cast<CompileUnitDesc *>(SPD->getContext());
1787     CompileUnit *Unit = FindCompileUnit(UnitDesc);
1788
1789     // Check for pre-existence.
1790     DIE *&Slot = Unit->getDieMapSlotFor(SPD);
1791     if (Slot) return Slot;
1792     
1793     // Gather the details (simplify add attribute code.)
1794     const std::string &Name = SPD->hasMangledName() ? SPD->getDisplayName()
1795                                                     : SPD->getName();
1796     const std::string &MangledName = SPD->hasMangledName() ? SPD->getName()
1797                                                            : "";
1798     unsigned IsExternal = SPD->isStatic() ? 0 : 1;
1799                                       
1800     DIE *SubprogramDie = new DIE(DW_TAG_subprogram);
1801     AddString(SubprogramDie, DW_AT_name, DW_FORM_string, Name);
1802     if (!MangledName.empty()) {
1803       AddString(SubprogramDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
1804                                MangledName);
1805     }
1806     if (SPD->getType()) AddType(SubprogramDie, SPD->getType(), Unit);
1807     AddUInt(SubprogramDie, DW_AT_external, DW_FORM_flag, IsExternal);
1808     AddUInt(SubprogramDie, DW_AT_prototyped, DW_FORM_flag, 1);
1809     
1810     // Add source line info if available.
1811     AddSourceLine(SubprogramDie, UnitDesc, SPD->getLine());
1812
1813     // Add to map.
1814     Slot = SubprogramDie;
1815    
1816     // Add to context owner.
1817     Unit->getDie()->AddChild(SubprogramDie);
1818     
1819     // Expose as global.
1820     Unit->AddGlobal(Name, SubprogramDie);
1821     
1822     return SubprogramDie;
1823   }
1824
1825   /// NewScopeVariable - Create a new scope variable.
1826   ///
1827   DIE *NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) {
1828     // Get the descriptor.
1829     VariableDesc *VD = DV->getDesc();
1830
1831     // Translate tag to proper Dwarf tag.  The result variable is dropped for
1832     // now.
1833     unsigned Tag;
1834     switch (VD->getTag()) {
1835     case DW_TAG_return_variable:  return NULL;
1836     case DW_TAG_arg_variable:     Tag = DW_TAG_formal_parameter; break;
1837     case DW_TAG_auto_variable:    // fall thru
1838     default:                      Tag = DW_TAG_variable; break;
1839     }
1840
1841     // Define variable debug information entry.
1842     DIE *VariableDie = new DIE(Tag);
1843     AddString(VariableDie, DW_AT_name, DW_FORM_string, VD->getName());
1844
1845     // Add source line info if available.
1846     AddSourceLine(VariableDie, VD->getFile(), VD->getLine());
1847     
1848     // Add variable type.
1849     AddType(VariableDie, VD->getType(), Unit); 
1850     
1851     // Add variable address.
1852     MachineLocation Location;
1853     RI->getLocation(*MF, DV->getFrameIndex(), Location);
1854     AddAddress(VariableDie, DW_AT_location, Location);
1855     
1856     return VariableDie;
1857   }
1858
1859   /// ConstructScope - Construct the components of a scope.
1860   ///
1861   void ConstructScope(DebugScope *ParentScope,
1862                                    DIE *ParentDie, CompileUnit *Unit) {
1863     // Add variables to scope.
1864     std::vector<DebugVariable *> &Variables = ParentScope->getVariables();
1865     for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1866       DIE *VariableDie = NewScopeVariable(Variables[i], Unit);
1867       if (VariableDie) ParentDie->AddChild(VariableDie);
1868     }
1869     
1870     // Add nested scopes.
1871     std::vector<DebugScope *> &Scopes = ParentScope->getScopes();
1872     for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1873       // Define the Scope debug information entry.
1874       DebugScope *Scope = Scopes[j];
1875       // FIXME - Ignore inlined functions for the time being.
1876       if (!Scope->getParent()) continue;
1877       
1878       unsigned StartID = Scope->getStartLabelID();
1879       unsigned EndID = Scope->getEndLabelID();
1880       
1881       // Throw out scope if block is discarded.
1882       if (StartID && !DebugInfo->isLabelValid(StartID)) continue;
1883       if (EndID && !DebugInfo->isLabelValid(EndID)) continue;
1884       
1885       DIE *ScopeDie = new DIE(DW_TAG_lexical_block);
1886       
1887       // Add the scope bounds.
1888       if (StartID) {
1889         AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
1890                            DWLabel("loc", StartID));
1891       } else {
1892         AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
1893                            DWLabel("func_begin", SubprogramCount));
1894       }
1895       if (EndID) {
1896         AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
1897                            DWLabel("loc", EndID));
1898       } else {
1899         AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
1900                            DWLabel("func_end", SubprogramCount));
1901       }
1902                          
1903       // Add the scope contents.
1904       ConstructScope(Scope, ScopeDie, Unit);
1905       ParentDie->AddChild(ScopeDie);
1906     }
1907   }
1908
1909   /// ConstructRootScope - Construct the scope for the subprogram.
1910   ///
1911   void ConstructRootScope(DebugScope *RootScope) {
1912     // Exit if there is no root scope.
1913     if (!RootScope) return;
1914     
1915     // Get the subprogram debug information entry. 
1916     SubprogramDesc *SPD = cast<SubprogramDesc>(RootScope->getDesc());
1917     
1918     // Get the compile unit context.
1919     CompileUnitDesc *UnitDesc =
1920       static_cast<CompileUnitDesc *>(SPD->getContext());
1921     CompileUnit *Unit = FindCompileUnit(UnitDesc);
1922     
1923     // Get the subprogram die.
1924     DIE *SPDie = Unit->getDieMapSlotFor(SPD);
1925     assert(SPDie && "Missing subprogram descriptor");
1926     
1927     // Add the function bounds.
1928     AddLabel(SPDie, DW_AT_low_pc, DW_FORM_addr,
1929                     DWLabel("func_begin", SubprogramCount));
1930     AddLabel(SPDie, DW_AT_high_pc, DW_FORM_addr,
1931                     DWLabel("func_end", SubprogramCount));
1932     MachineLocation Location(RI->getFrameRegister(*MF));
1933     AddAddress(SPDie, DW_AT_frame_base, Location);
1934                     
1935     ConstructScope(RootScope, SPDie, Unit);
1936   }
1937
1938   /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc
1939   /// tools to recognize the object file contains Dwarf information.
1940   void EmitInitial() {
1941     // Check to see if we already emitted intial headers.
1942     if (didInitial) return;
1943     didInitial = true;
1944     
1945     // Dwarf sections base addresses.
1946     if (TAI->getDwarfRequiresFrameSection()) {
1947       Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
1948       EmitLabel("section_frame", 0);
1949     }
1950     Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
1951     EmitLabel("section_info", 0);
1952     Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
1953     EmitLabel("section_abbrev", 0);
1954     Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
1955     EmitLabel("section_aranges", 0);
1956     Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
1957     EmitLabel("section_macinfo", 0);
1958     Asm->SwitchToDataSection(TAI->getDwarfLineSection());
1959     EmitLabel("section_line", 0);
1960     Asm->SwitchToDataSection(TAI->getDwarfLocSection());
1961     EmitLabel("section_loc", 0);
1962     Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
1963     EmitLabel("section_pubnames", 0);
1964     Asm->SwitchToDataSection(TAI->getDwarfStrSection());
1965     EmitLabel("section_str", 0);
1966     Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
1967     EmitLabel("section_ranges", 0);
1968
1969     Asm->SwitchToTextSection(TAI->getTextSection());
1970     EmitLabel("text_begin", 0);
1971     Asm->SwitchToDataSection(TAI->getDataSection());
1972     EmitLabel("data_begin", 0);
1973
1974     // Emit common frame information.
1975     EmitInitialDebugFrame();
1976   }
1977
1978   /// EmitDIE - Recusively Emits a debug information entry.
1979   ///
1980   void EmitDIE(DIE *Die) const {
1981     // Get the abbreviation for this DIE.
1982     unsigned AbbrevNumber = Die->getAbbrevNumber();
1983     const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1984     
1985     O << "\n";
1986
1987     // Emit the code (index) for the abbreviation.
1988     EmitULEB128Bytes(AbbrevNumber);
1989     EOL(std::string("Abbrev [" +
1990         utostr(AbbrevNumber) +
1991         "] 0x" + utohexstr(Die->getOffset()) +
1992         ":0x" + utohexstr(Die->getSize()) + " " +
1993         TagString(Abbrev->getTag())));
1994     
1995     const std::vector<DIEValue *> &Values = Die->getValues();
1996     const std::vector<DIEAbbrevData> &AbbrevData = Abbrev->getData();
1997     
1998     // Emit the DIE attribute values.
1999     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2000       unsigned Attr = AbbrevData[i].getAttribute();
2001       unsigned Form = AbbrevData[i].getForm();
2002       assert(Form && "Too many attributes for DIE (check abbreviation)");
2003       
2004       switch (Attr) {
2005       case DW_AT_sibling: {
2006         EmitInt32(Die->SiblingOffset());
2007         break;
2008       }
2009       default: {
2010         // Emit an attribute using the defined form.
2011         Values[i]->EmitValue(*this, Form);
2012         break;
2013       }
2014       }
2015       
2016       EOL(AttributeString(Attr));
2017     }
2018     
2019     // Emit the DIE children if any.
2020     if (Abbrev->getChildrenFlag() == DW_CHILDREN_yes) {
2021       const std::vector<DIE *> &Children = Die->getChildren();
2022       
2023       for (unsigned j = 0, M = Children.size(); j < M; ++j) {
2024         EmitDIE(Children[j]);
2025       }
2026       
2027       EmitInt8(0); EOL("End Of Children Mark");
2028     }
2029   }
2030
2031   /// SizeAndOffsetDie - Compute the size and offset of a DIE.
2032   ///
2033   unsigned SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2034     // Get the children.
2035     const std::vector<DIE *> &Children = Die->getChildren();
2036     
2037     // If not last sibling and has children then add sibling offset attribute.
2038     if (!Last && !Children.empty()) Die->AddSiblingOffset();
2039
2040     // Record the abbreviation.
2041     AssignAbbrevNumber(Die->getAbbrev());
2042    
2043     // Get the abbreviation for this DIE.
2044     unsigned AbbrevNumber = Die->getAbbrevNumber();
2045     const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2046
2047     // Set DIE offset
2048     Die->setOffset(Offset);
2049     
2050     // Start the size with the size of abbreviation code.
2051     Offset += SizeULEB128(AbbrevNumber);
2052     
2053     const std::vector<DIEValue *> &Values = Die->getValues();
2054     const std::vector<DIEAbbrevData> &AbbrevData = Abbrev->getData();
2055
2056     // Size the DIE attribute values.
2057     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2058       // Size attribute value.
2059       Offset += Values[i]->SizeOf(*this, AbbrevData[i].getForm());
2060     }
2061     
2062     // Size the DIE children if any.
2063     if (!Children.empty()) {
2064       assert(Abbrev->getChildrenFlag() == DW_CHILDREN_yes &&
2065              "Children flag not set");
2066       
2067       for (unsigned j = 0, M = Children.size(); j < M; ++j) {
2068         Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2069       }
2070       
2071       // End of children marker.
2072       Offset += sizeof(int8_t);
2073     }
2074
2075     Die->setSize(Offset - Die->getOffset());
2076     return Offset;
2077   }
2078
2079   /// SizeAndOffsets - Compute the size and offset of all the DIEs.
2080   ///
2081   void SizeAndOffsets() {
2082     // Process each compile unit.
2083     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
2084       CompileUnit *Unit = CompileUnits[i];
2085       if (Unit->hasContent()) {
2086         // Compute size of compile unit header
2087         unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info
2088                           sizeof(int16_t) + // DWARF version number
2089                           sizeof(int32_t) + // Offset Into Abbrev. Section
2090                           sizeof(int8_t);   // Pointer Size (in bytes)
2091         SizeAndOffsetDie(Unit->getDie(), Offset, (i + 1) == N);
2092       }
2093     }
2094   }
2095
2096   /// EmitFrameMoves - Emit frame instructions to describe the layout of the
2097   /// frame.
2098   void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
2099                                    std::vector<MachineMove *> &Moves) {
2100     for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
2101       MachineMove *Move = Moves[i];
2102       unsigned LabelID = Move->getLabelID();
2103       
2104       // Throw out move if the label is invalid.
2105       if (LabelID && !DebugInfo->isLabelValid(LabelID)) continue;
2106       
2107       const MachineLocation &Dst = Move->getDestination();
2108       const MachineLocation &Src = Move->getSource();
2109       
2110       // Advance row if new location.
2111       if (BaseLabel && LabelID && BaseLabelID != LabelID) {
2112         EmitInt8(DW_CFA_advance_loc4);
2113         EOL("DW_CFA_advance_loc4");
2114         EmitDifference("loc", LabelID, BaseLabel, BaseLabelID);
2115         EOL("");
2116         
2117         BaseLabelID = LabelID;
2118         BaseLabel = "loc";
2119       }
2120       
2121       int stackGrowth =
2122           Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2123             TargetFrameInfo::StackGrowsUp ?
2124               TAI->getAddressSize() : -TAI->getAddressSize();
2125
2126       // If advancing cfa.
2127       if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) {
2128         if (!Src.isRegister()) {
2129           if (Src.getRegister() == MachineLocation::VirtualFP) {
2130             EmitInt8(DW_CFA_def_cfa_offset);
2131             EOL("DW_CFA_def_cfa_offset");
2132           } else {
2133             EmitInt8(DW_CFA_def_cfa);
2134             EOL("DW_CFA_def_cfa");
2135             EmitULEB128Bytes(RI->getDwarfRegNum(Src.getRegister()));
2136             EOL("Register");
2137           }
2138           
2139           int Offset = Src.getOffset() / stackGrowth;
2140           
2141           EmitULEB128Bytes(Offset);
2142           EOL("Offset");
2143         } else {
2144           assert(0 && "Machine move no supported yet.");
2145         }
2146       } else {
2147         unsigned Reg = RI->getDwarfRegNum(Src.getRegister());
2148         int Offset = Dst.getOffset() / stackGrowth;
2149         
2150         if (Offset < 0) {
2151           EmitInt8(DW_CFA_offset_extended_sf);
2152           EOL("DW_CFA_offset_extended_sf");
2153           EmitULEB128Bytes(Reg);
2154           EOL("Reg");
2155           EmitSLEB128Bytes(Offset);
2156           EOL("Offset");
2157         } else if (Reg < 64) {
2158           EmitInt8(DW_CFA_offset + Reg);
2159           EOL("DW_CFA_offset + Reg");
2160           EmitULEB128Bytes(Offset);
2161           EOL("Offset");
2162         } else {
2163           EmitInt8(DW_CFA_offset_extended);
2164           EOL("DW_CFA_offset_extended");
2165           EmitULEB128Bytes(Reg);
2166           EOL("Reg");
2167           EmitULEB128Bytes(Offset);
2168           EOL("Offset");
2169         }
2170       }
2171     }
2172   }
2173
2174   /// EmitDebugInfo - Emit the debug info section.
2175   ///
2176   void EmitDebugInfo() const {
2177     // Start debug info section.
2178     Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
2179     
2180     // Process each compile unit.
2181     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
2182       CompileUnit *Unit = CompileUnits[i];
2183       
2184       if (Unit->hasContent()) {
2185         DIE *Die = Unit->getDie();
2186         // Emit the compile units header.
2187         EmitLabel("info_begin", Unit->getID());
2188         // Emit size of content not including length itself
2189         unsigned ContentSize = Die->getSize() +
2190                                sizeof(int16_t) + // DWARF version number
2191                                sizeof(int32_t) + // Offset Into Abbrev. Section
2192                                sizeof(int8_t);   // Pointer Size (in bytes)
2193                                
2194         EmitInt32(ContentSize);  EOL("Length of Compilation Unit Info");
2195         EmitInt16(DWARF_VERSION); EOL("DWARF version number");
2196         EmitDifference("abbrev_begin", 0, "section_abbrev", 0);
2197         EOL("Offset Into Abbrev. Section");
2198         EmitInt8(TAI->getAddressSize()); EOL("Address Size (in bytes)");
2199       
2200         EmitDIE(Die);
2201         EmitLabel("info_end", Unit->getID());
2202       }
2203       
2204       O << "\n";
2205     }
2206   }
2207
2208   /// EmitAbbreviations - Emit the abbreviation section.
2209   ///
2210   void EmitAbbreviations() const {
2211     // Check to see if it is worth the effort.
2212     if (!Abbreviations.empty()) {
2213       // Start the debug abbrev section.
2214       Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
2215       
2216       EmitLabel("abbrev_begin", 0);
2217       
2218       // For each abbrevation.
2219       for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2220         // Get abbreviation data
2221         const DIEAbbrev *Abbrev = Abbreviations[i];
2222         
2223         // Emit the abbrevations code (base 1 index.)
2224         EmitULEB128Bytes(Abbrev->getNumber()); EOL("Abbreviation Code");
2225         
2226         // Emit the abbreviations data.
2227         Abbrev->Emit(*this);
2228     
2229         O << "\n";
2230       }
2231       
2232       EmitLabel("abbrev_end", 0);
2233     
2234       O << "\n";
2235     }
2236   }
2237
2238   /// EmitDebugLines - Emit source line information.
2239   ///
2240   void EmitDebugLines() const {
2241     // Minimum line delta, thus ranging from -10..(255-10).
2242     const int MinLineDelta = -(DW_LNS_fixed_advance_pc + 1);
2243     // Maximum line delta, thus ranging from -10..(255-10).
2244     const int MaxLineDelta = 255 + MinLineDelta;
2245
2246     // Start the dwarf line section.
2247     Asm->SwitchToDataSection(TAI->getDwarfLineSection());
2248     
2249     // Construct the section header.
2250     
2251     EmitDifference("line_end", 0, "line_begin", 0);
2252     EOL("Length of Source Line Info");
2253     EmitLabel("line_begin", 0);
2254     
2255     EmitInt16(DWARF_VERSION); EOL("DWARF version number");
2256     
2257     EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0);
2258     EOL("Prolog Length");
2259     EmitLabel("line_prolog_begin", 0);
2260     
2261     EmitInt8(1); EOL("Minimum Instruction Length");
2262
2263     EmitInt8(1); EOL("Default is_stmt_start flag");
2264
2265     EmitInt8(MinLineDelta);  EOL("Line Base Value (Special Opcodes)");
2266     
2267     EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2268
2269     EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2270     
2271     // Line number standard opcode encodings argument count
2272     EmitInt8(0); EOL("DW_LNS_copy arg count");
2273     EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2274     EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2275     EmitInt8(1); EOL("DW_LNS_set_file arg count");
2276     EmitInt8(1); EOL("DW_LNS_set_column arg count");
2277     EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2278     EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2279     EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2280     EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2281
2282     const UniqueVector<std::string> &Directories = DebugInfo->getDirectories();
2283     const UniqueVector<SourceFileInfo>
2284       &SourceFiles = DebugInfo->getSourceFiles();
2285
2286     // Emit directories.
2287     for (unsigned DirectoryID = 1, NDID = Directories.size();
2288                   DirectoryID <= NDID; ++DirectoryID) {
2289       EmitString(Directories[DirectoryID]); EOL("Directory");
2290     }
2291     EmitInt8(0); EOL("End of directories");
2292     
2293     // Emit files.
2294     for (unsigned SourceID = 1, NSID = SourceFiles.size();
2295                  SourceID <= NSID; ++SourceID) {
2296       const SourceFileInfo &SourceFile = SourceFiles[SourceID];
2297       EmitString(SourceFile.getName()); EOL("Source");
2298       EmitULEB128Bytes(SourceFile.getDirectoryID());  EOL("Directory #");
2299       EmitULEB128Bytes(0);  EOL("Mod date");
2300       EmitULEB128Bytes(0);  EOL("File size");
2301     }
2302     EmitInt8(0); EOL("End of files");
2303     
2304     EmitLabel("line_prolog_end", 0);
2305     
2306     // A sequence for each text section.
2307     for (unsigned j = 0, M = SectionSourceLines.size(); j < M; ++j) {
2308       // Isolate current sections line info.
2309       const std::vector<SourceLineInfo> &LineInfos = SectionSourceLines[j];
2310       
2311       if (DwarfVerbose) {
2312         O << "\t"
2313           << TAI->getCommentString() << " "
2314           << "Section "
2315           << SectionMap[j + 1].c_str() << "\n";
2316       }
2317
2318       // Dwarf assumes we start with first line of first source file.
2319       unsigned Source = 1;
2320       unsigned Line = 1;
2321       
2322       // Construct rows of the address, source, line, column matrix.
2323       for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2324         const SourceLineInfo &LineInfo = LineInfos[i];
2325         unsigned LabelID = LineInfo.getLabelID();
2326         
2327         // Source line labels are validated at the MachineDebugInfo level.
2328         
2329         if (DwarfVerbose) {
2330           unsigned SourceID = LineInfo.getSourceID();
2331           const SourceFileInfo &SourceFile = SourceFiles[SourceID];
2332           unsigned DirectoryID = SourceFile.getDirectoryID();
2333           O << "\t"
2334             << TAI->getCommentString() << " "
2335             << Directories[DirectoryID]
2336             << SourceFile.getName() << ":"
2337             << LineInfo.getLine() << "\n"; 
2338         }
2339
2340         // Define the line address.
2341         EmitInt8(0); EOL("Extended Op");
2342         EmitInt8(4 + 1); EOL("Op size");
2343         EmitInt8(DW_LNE_set_address); EOL("DW_LNE_set_address");
2344         EmitReference("loc",  LabelID); EOL("Location label");
2345         
2346         // If change of source, then switch to the new source.
2347         if (Source != LineInfo.getSourceID()) {
2348           Source = LineInfo.getSourceID();
2349           EmitInt8(DW_LNS_set_file); EOL("DW_LNS_set_file");
2350           EmitULEB128Bytes(Source); EOL("New Source");
2351         }
2352         
2353         // If change of line.
2354         if (Line != LineInfo.getLine()) {
2355           // Determine offset.
2356           int Offset = LineInfo.getLine() - Line;
2357           int Delta = Offset - MinLineDelta;
2358           
2359           // Update line.
2360           Line = LineInfo.getLine();
2361           
2362           // If delta is small enough and in range...
2363           if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2364             // ... then use fast opcode.
2365             EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2366           } else {
2367             // ... otherwise use long hand.
2368             EmitInt8(DW_LNS_advance_line); EOL("DW_LNS_advance_line");
2369             EmitSLEB128Bytes(Offset); EOL("Line Offset");
2370             EmitInt8(DW_LNS_copy); EOL("DW_LNS_copy");
2371           }
2372         } else {
2373           // Copy the previous row (different address or source)
2374           EmitInt8(DW_LNS_copy); EOL("DW_LNS_copy");
2375         }
2376       }
2377
2378       // Define last address of section.
2379       EmitInt8(0); EOL("Extended Op");
2380       EmitInt8(4 + 1); EOL("Op size");
2381       EmitInt8(DW_LNE_set_address); EOL("DW_LNE_set_address");
2382       EmitReference("section_end", j + 1); EOL("Section end label");
2383
2384       // Mark end of matrix.
2385       EmitInt8(0); EOL("DW_LNE_end_sequence");
2386       EmitULEB128Bytes(1);  O << "\n";
2387       EmitInt8(1); O << "\n";
2388     }
2389     
2390     EmitLabel("line_end", 0);
2391     
2392     O << "\n";
2393   }
2394     
2395   /// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
2396   ///
2397   void EmitInitialDebugFrame() {
2398     if (!TAI->getDwarfRequiresFrameSection())
2399       return;
2400
2401     int stackGrowth =
2402         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2403           TargetFrameInfo::StackGrowsUp ?
2404         TAI->getAddressSize() : -TAI->getAddressSize();
2405
2406     // Start the dwarf frame section.
2407     Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
2408
2409     EmitLabel("frame_common", 0);
2410     EmitDifference("frame_common_end", 0,
2411                    "frame_common_begin", 0);
2412     EOL("Length of Common Information Entry");
2413
2414     EmitLabel("frame_common_begin", 0);
2415     EmitInt32(DW_CIE_ID); EOL("CIE Identifier Tag");
2416     EmitInt8(DW_CIE_VERSION); EOL("CIE Version");
2417     EmitString("");  EOL("CIE Augmentation");
2418     EmitULEB128Bytes(1); EOL("CIE Code Alignment Factor");
2419     EmitSLEB128Bytes(stackGrowth); EOL("CIE Data Alignment Factor");   
2420     EmitInt8(RI->getDwarfRegNum(RI->getRARegister())); EOL("CIE RA Column");
2421     
2422     std::vector<MachineMove *> Moves;
2423     RI->getInitialFrameState(Moves);
2424     EmitFrameMoves(NULL, 0, Moves);
2425     for (unsigned i = 0, N = Moves.size(); i < N; ++i) delete Moves[i];
2426
2427     EmitAlign(2);
2428     EmitLabel("frame_common_end", 0);
2429     
2430     O << "\n";
2431   }
2432
2433   /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2434   /// section.
2435   void EmitFunctionDebugFrame() {
2436     // Start the dwarf frame section.
2437     Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
2438     
2439     EmitDifference("frame_end", SubprogramCount,
2440                    "frame_begin", SubprogramCount);
2441     EOL("Length of Frame Information Entry");
2442     
2443     EmitLabel("frame_begin", SubprogramCount);
2444     
2445     EmitDifference("frame_common", 0, "section_frame", 0);
2446     EOL("FDE CIE offset");
2447
2448     EmitReference("func_begin", SubprogramCount); EOL("FDE initial location");
2449     EmitDifference("func_end", SubprogramCount,
2450                    "func_begin", SubprogramCount);
2451     EOL("FDE address range");
2452     
2453     std::vector<MachineMove *> &Moves = DebugInfo->getFrameMoves();
2454     
2455     EmitFrameMoves("func_begin", SubprogramCount, Moves);
2456     
2457     EmitAlign(2);
2458     EmitLabel("frame_end", SubprogramCount);
2459
2460     O << "\n";
2461   }
2462
2463   /// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2464   ///
2465   void EmitDebugPubNames() {
2466     // Start the dwarf pubnames section.
2467     Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
2468       
2469     // Process each compile unit.
2470     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
2471       CompileUnit *Unit = CompileUnits[i];
2472       
2473       if (Unit->hasContent()) {
2474         EmitDifference("pubnames_end", Unit->getID(),
2475                        "pubnames_begin", Unit->getID());
2476         EOL("Length of Public Names Info");
2477         
2478         EmitLabel("pubnames_begin", Unit->getID());
2479         
2480         EmitInt16(DWARF_VERSION); EOL("DWARF Version");
2481         
2482         EmitDifference("info_begin", Unit->getID(), "section_info", 0);
2483         EOL("Offset of Compilation Unit Info");
2484
2485         EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID());
2486         EOL("Compilation Unit Length");
2487         
2488         std::map<std::string, DIE *> &Globals = Unit->getGlobals();
2489         
2490         for (std::map<std::string, DIE *>::iterator GI = Globals.begin(),
2491                                                     GE = Globals.end();
2492              GI != GE; ++GI) {
2493           const std::string &Name = GI->first;
2494           DIE * Entity = GI->second;
2495           
2496           EmitInt32(Entity->getOffset()); EOL("DIE offset");
2497           EmitString(Name); EOL("External Name");
2498         }
2499       
2500         EmitInt32(0); EOL("End Mark");
2501         EmitLabel("pubnames_end", Unit->getID());
2502       
2503         O << "\n";
2504       }
2505     }
2506   }
2507
2508   /// EmitDebugStr - Emit visible names into a debug str section.
2509   ///
2510   void EmitDebugStr() {
2511     // Check to see if it is worth the effort.
2512     if (!StringPool.empty()) {
2513       // Start the dwarf str section.
2514       Asm->SwitchToDataSection(TAI->getDwarfStrSection());
2515       
2516       // For each of strings in the string pool.
2517       for (unsigned StringID = 1, N = StringPool.size();
2518            StringID <= N; ++StringID) {
2519         // Emit a label for reference from debug information entries.
2520         EmitLabel("string", StringID);
2521         // Emit the string itself.
2522         const std::string &String = StringPool[StringID];
2523         EmitString(String); O << "\n";
2524       }
2525     
2526       O << "\n";
2527     }
2528   }
2529
2530   /// EmitDebugLoc - Emit visible names into a debug loc section.
2531   ///
2532   void EmitDebugLoc() {
2533     // Start the dwarf loc section.
2534     Asm->SwitchToDataSection(TAI->getDwarfLocSection());
2535     
2536     O << "\n";
2537   }
2538
2539   /// EmitDebugARanges - Emit visible names into a debug aranges section.
2540   ///
2541   void EmitDebugARanges() {
2542     // Start the dwarf aranges section.
2543     Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
2544     
2545     // FIXME - Mock up
2546   #if 0
2547     // Process each compile unit.
2548     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
2549       CompileUnit *Unit = CompileUnits[i];
2550       
2551       if (Unit->hasContent()) {
2552         // Don't include size of length
2553         EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2554         
2555         EmitInt16(DWARF_VERSION); EOL("Dwarf Version");
2556         
2557         EmitReference("info_begin", Unit->getID());
2558         EOL("Offset of Compilation Unit Info");
2559
2560         EmitInt8(TAI->getAddressSize()); EOL("Size of Address");
2561
2562         EmitInt8(0); EOL("Size of Segment Descriptor");
2563
2564         EmitInt16(0);  EOL("Pad (1)");
2565         EmitInt16(0);  EOL("Pad (2)");
2566
2567         // Range 1
2568         EmitReference("text_begin", 0); EOL("Address");
2569         EmitDifference("text_end", 0, "text_begin", 0); EOL("Length");
2570
2571         EmitInt32(0); EOL("EOM (1)");
2572         EmitInt32(0); EOL("EOM (2)");
2573         
2574         O << "\n";
2575       }
2576     }
2577   #endif
2578   }
2579
2580   /// EmitDebugRanges - Emit visible names into a debug ranges section.
2581   ///
2582   void EmitDebugRanges() {
2583     // Start the dwarf ranges section.
2584     Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
2585     
2586     O << "\n";
2587   }
2588
2589   /// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2590   ///
2591   void EmitDebugMacInfo() {
2592     // Start the dwarf macinfo section.
2593     Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
2594     
2595     O << "\n";
2596   }
2597
2598   /// ConstructCompileUnitDIEs - Create a compile unit DIE for each source and
2599   /// header file.
2600   void ConstructCompileUnitDIEs() {
2601     const UniqueVector<CompileUnitDesc *> CUW = DebugInfo->getCompileUnits();
2602     
2603     for (unsigned i = 1, N = CUW.size(); i <= N; ++i) {
2604       CompileUnit *Unit = NewCompileUnit(CUW[i], i);
2605       CompileUnits.push_back(Unit);
2606     }
2607   }
2608
2609   /// ConstructGlobalDIEs - Create DIEs for each of the externally visible
2610   /// global variables.
2611   void ConstructGlobalDIEs() {
2612     std::vector<GlobalVariableDesc *> GlobalVariables =
2613         DebugInfo->getAnchoredDescriptors<GlobalVariableDesc>(*M);
2614     
2615     for (unsigned i = 0, N = GlobalVariables.size(); i < N; ++i) {
2616       GlobalVariableDesc *GVD = GlobalVariables[i];
2617       NewGlobalVariable(GVD);
2618     }
2619   }
2620
2621   /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
2622   /// subprograms.
2623   void ConstructSubprogramDIEs() {
2624     std::vector<SubprogramDesc *> Subprograms =
2625         DebugInfo->getAnchoredDescriptors<SubprogramDesc>(*M);
2626     
2627     for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) {
2628       SubprogramDesc *SPD = Subprograms[i];
2629       NewSubprogram(SPD);
2630     }
2631   }
2632
2633   /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
2634   ///
2635   bool ShouldEmitDwarf() const { return shouldEmit; }
2636
2637 public:
2638   //===--------------------------------------------------------------------===//
2639   // Main entry points.
2640   //
2641   Dwarf(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
2642   : O(OS)
2643   , Asm(A)
2644   , TAI(T)
2645   , TD(Asm->TM.getTargetData())
2646   , RI(Asm->TM.getRegisterInfo())
2647   , M(NULL)
2648   , MF(NULL)
2649   , DebugInfo(NULL)
2650   , didInitial(false)
2651   , shouldEmit(false)
2652   , SubprogramCount(0)
2653   , CompileUnits()
2654   , AbbreviationsSet(InitAbbreviationsSetSize)
2655   , Abbreviations()
2656   , ValuesSet(InitValuesSetSize)
2657   , Values()
2658   , StringPool()
2659   , DescToUnitMap()
2660   , SectionMap()
2661   , SectionSourceLines()
2662   {
2663   }
2664   virtual ~Dwarf() {
2665     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i)
2666       delete CompileUnits[i];
2667     for (unsigned j = 0, M = Values.size(); j < M; ++j)
2668       delete Values[j];
2669   }
2670
2671   // Accessors.
2672   //
2673   const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
2674   
2675   /// SetDebugInfo - Set DebugInfo when it's known that pass manager has
2676   /// created it.  Set by the target AsmPrinter.
2677   void SetDebugInfo(MachineDebugInfo *DI) {
2678     // Make sure initial declarations are made.
2679     if (!DebugInfo && DI->hasInfo()) {
2680       DebugInfo = DI;
2681       shouldEmit = true;
2682       
2683       // Emit initial sections
2684       EmitInitial();
2685     
2686       // Create all the compile unit DIEs.
2687       ConstructCompileUnitDIEs();
2688       
2689       // Create DIEs for each of the externally visible global variables.
2690       ConstructGlobalDIEs();
2691
2692       // Create DIEs for each of the externally visible subprograms.
2693       ConstructSubprogramDIEs();
2694       
2695       // Prime section data.
2696       SectionMap.insert(std::string("\t") + TAI->getTextSection());
2697     }
2698   }
2699
2700   /// BeginModule - Emit all Dwarf sections that should come prior to the
2701   /// content.
2702   void BeginModule(Module *M) {
2703     this->M = M;
2704     
2705     if (!ShouldEmitDwarf()) return;
2706     EOL("Dwarf Begin Module");
2707   }
2708
2709   /// EndModule - Emit all Dwarf sections that should come after the content.
2710   ///
2711   void EndModule() {
2712     if (!ShouldEmitDwarf()) return;
2713     EOL("Dwarf End Module");
2714     
2715     // Standard sections final addresses.
2716     Asm->SwitchToTextSection(TAI->getTextSection());
2717     EmitLabel("text_end", 0);
2718     Asm->SwitchToDataSection(TAI->getDataSection());
2719     EmitLabel("data_end", 0);
2720     
2721     // End text sections.
2722     for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2723       Asm->SwitchToTextSection(SectionMap[i].c_str());
2724       EmitLabel("section_end", i);
2725     }
2726     
2727     // Compute DIE offsets and sizes.
2728     SizeAndOffsets();
2729     
2730     // Emit all the DIEs into a debug info section
2731     EmitDebugInfo();
2732     
2733     // Corresponding abbreviations into a abbrev section.
2734     EmitAbbreviations();
2735     
2736     // Emit source line correspondence into a debug line section.
2737     EmitDebugLines();
2738     
2739     // Emit info into a debug pubnames section.
2740     EmitDebugPubNames();
2741     
2742     // Emit info into a debug str section.
2743     EmitDebugStr();
2744     
2745     // Emit info into a debug loc section.
2746     EmitDebugLoc();
2747     
2748     // Emit info into a debug aranges section.
2749     EmitDebugARanges();
2750     
2751     // Emit info into a debug ranges section.
2752     EmitDebugRanges();
2753     
2754     // Emit info into a debug macinfo section.
2755     EmitDebugMacInfo();
2756   }
2757
2758   /// BeginFunction - Gather pre-function debug information.  Assumes being 
2759   /// emitted immediately after the function entry point.
2760   void BeginFunction(MachineFunction *MF) {
2761     this->MF = MF;
2762     
2763     if (!ShouldEmitDwarf()) return;
2764     EOL("Dwarf Begin Function");
2765
2766     // Begin accumulating function debug information.
2767     DebugInfo->BeginFunction(MF);
2768     
2769     // Assumes in correct section after the entry point.
2770     EmitLabel("func_begin", ++SubprogramCount);
2771   }
2772
2773   /// EndFunction - Gather and emit post-function debug information.
2774   ///
2775   void EndFunction() {
2776     if (!ShouldEmitDwarf()) return;
2777     EOL("Dwarf End Function");
2778     
2779     // Define end label for subprogram.
2780     EmitLabel("func_end", SubprogramCount);
2781       
2782     // Get function line info.
2783     const std::vector<SourceLineInfo> &LineInfos = DebugInfo->getSourceLines();
2784
2785     if (!LineInfos.empty()) {
2786       // Get section line info.
2787       unsigned ID = SectionMap.insert(Asm->CurrentSection);
2788       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2789       std::vector<SourceLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2790       // Append the function info to section info.
2791       SectionLineInfos.insert(SectionLineInfos.end(),
2792                               LineInfos.begin(), LineInfos.end());
2793     }
2794     
2795     // Construct scopes for subprogram.
2796     ConstructRootScope(DebugInfo->getRootScope());
2797     
2798     // Emit function frame information.
2799     EmitFunctionDebugFrame();
2800     
2801     // Reset the line numbers for the next function.
2802     DebugInfo->ClearLineInfo();
2803
2804     // Clear function debug information.
2805     DebugInfo->EndFunction();
2806   }
2807 };
2808
2809 } // End of namespace llvm
2810
2811 //===----------------------------------------------------------------------===//
2812
2813 /// Emit - Print the abbreviation using the specified Dwarf writer.
2814 ///
2815 void DIEAbbrev::Emit(const Dwarf &DW) const {
2816   // Emit its Dwarf tag type.
2817   DW.EmitULEB128Bytes(Tag);
2818   DW.EOL(TagString(Tag));
2819   
2820   // Emit whether it has children DIEs.
2821   DW.EmitULEB128Bytes(ChildrenFlag);
2822   DW.EOL(ChildrenString(ChildrenFlag));
2823   
2824   // For each attribute description.
2825   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
2826     const DIEAbbrevData &AttrData = Data[i];
2827     
2828     // Emit attribute type.
2829     DW.EmitULEB128Bytes(AttrData.getAttribute());
2830     DW.EOL(AttributeString(AttrData.getAttribute()));
2831     
2832     // Emit form type.
2833     DW.EmitULEB128Bytes(AttrData.getForm());
2834     DW.EOL(FormEncodingString(AttrData.getForm()));
2835   }
2836
2837   // Mark end of abbreviation.
2838   DW.EmitULEB128Bytes(0); DW.EOL("EOM(1)");
2839   DW.EmitULEB128Bytes(0); DW.EOL("EOM(2)");
2840 }
2841
2842 #ifndef NDEBUG
2843 void DIEAbbrev::print(std::ostream &O) {
2844   O << "Abbreviation @"
2845     << std::hex << (intptr_t)this << std::dec
2846     << "  "
2847     << TagString(Tag)
2848     << " "
2849     << ChildrenString(ChildrenFlag)
2850     << "\n";
2851   
2852   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
2853     O << "  "
2854       << AttributeString(Data[i].getAttribute())
2855       << "  "
2856       << FormEncodingString(Data[i].getForm())
2857       << "\n";
2858   }
2859 }
2860 void DIEAbbrev::dump() { print(std::cerr); }
2861 #endif
2862
2863 //===----------------------------------------------------------------------===//
2864
2865 #ifndef NDEBUG
2866 void DIEValue::dump() {
2867   print(std::cerr);
2868 }
2869 #endif
2870
2871 //===----------------------------------------------------------------------===//
2872
2873 /// EmitValue - Emit integer of appropriate size.
2874 ///
2875 void DIEInteger::EmitValue(const Dwarf &DW, unsigned Form) const {
2876   switch (Form) {
2877   case DW_FORM_flag:  // Fall thru
2878   case DW_FORM_ref1:  // Fall thru
2879   case DW_FORM_data1: DW.EmitInt8(Integer);         break;
2880   case DW_FORM_ref2:  // Fall thru
2881   case DW_FORM_data2: DW.EmitInt16(Integer);        break;
2882   case DW_FORM_ref4:  // Fall thru
2883   case DW_FORM_data4: DW.EmitInt32(Integer);        break;
2884   case DW_FORM_ref8:  // Fall thru
2885   case DW_FORM_data8: DW.EmitInt64(Integer);        break;
2886   case DW_FORM_udata: DW.EmitULEB128Bytes(Integer); break;
2887   case DW_FORM_sdata: DW.EmitSLEB128Bytes(Integer); break;
2888   default: assert(0 && "DIE Value form not supported yet"); break;
2889   }
2890 }
2891
2892 //===----------------------------------------------------------------------===//
2893
2894 /// EmitValue - Emit string value.
2895 ///
2896 void DIEString::EmitValue(const Dwarf &DW, unsigned Form) const {
2897   DW.EmitString(String);
2898 }
2899
2900 //===----------------------------------------------------------------------===//
2901
2902 /// EmitValue - Emit label value.
2903 ///
2904 void DIEDwarfLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
2905   DW.EmitReference(Label);
2906 }
2907
2908 /// SizeOf - Determine size of label value in bytes.
2909 ///
2910 unsigned DIEDwarfLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
2911   return DW.getTargetAsmInfo()->getAddressSize();
2912 }
2913
2914 //===----------------------------------------------------------------------===//
2915
2916 /// EmitValue - Emit label value.
2917 ///
2918 void DIEObjectLabel::EmitValue(const Dwarf &DW, unsigned Form) const {
2919   DW.EmitReference(Label);
2920 }
2921
2922 /// SizeOf - Determine size of label value in bytes.
2923 ///
2924 unsigned DIEObjectLabel::SizeOf(const Dwarf &DW, unsigned Form) const {
2925   return DW.getTargetAsmInfo()->getAddressSize();
2926 }
2927     
2928 //===----------------------------------------------------------------------===//
2929
2930 /// EmitValue - Emit delta value.
2931 ///
2932 void DIEDelta::EmitValue(const Dwarf &DW, unsigned Form) const {
2933   DW.EmitDifference(LabelHi, LabelLo);
2934 }
2935
2936 /// SizeOf - Determine size of delta value in bytes.
2937 ///
2938 unsigned DIEDelta::SizeOf(const Dwarf &DW, unsigned Form) const {
2939   return DW.getTargetAsmInfo()->getAddressSize();
2940 }
2941
2942 //===----------------------------------------------------------------------===//
2943
2944 /// EmitValue - Emit debug information entry offset.
2945 ///
2946 void DIEntry::EmitValue(const Dwarf &DW, unsigned Form) const {
2947   DW.EmitInt32(Entry->getOffset());
2948 }
2949     
2950 //===----------------------------------------------------------------------===//
2951
2952 /// ComputeSize - calculate the size of the block.
2953 ///
2954 unsigned DIEBlock::ComputeSize(Dwarf &DW) {
2955   if (!Size) {
2956     const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
2957     
2958     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2959       Size += Values[i]->SizeOf(DW, AbbrevData[i].getForm());
2960     }
2961   }
2962   return Size;
2963 }
2964
2965 /// EmitValue - Emit block data.
2966 ///
2967 void DIEBlock::EmitValue(const Dwarf &DW, unsigned Form) const {
2968   switch (Form) {
2969   case DW_FORM_block1: DW.EmitInt8(Size);         break;
2970   case DW_FORM_block2: DW.EmitInt16(Size);        break;
2971   case DW_FORM_block4: DW.EmitInt32(Size);        break;
2972   case DW_FORM_block:  DW.EmitULEB128Bytes(Size); break;
2973   default: assert(0 && "Improper form for block"); break;
2974   }
2975   
2976   const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
2977
2978   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2979     DW.EOL("");
2980     Values[i]->EmitValue(DW, AbbrevData[i].getForm());
2981   }
2982 }
2983
2984 /// SizeOf - Determine size of block data in bytes.
2985 ///
2986 unsigned DIEBlock::SizeOf(const Dwarf &DW, unsigned Form) const {
2987   switch (Form) {
2988   case DW_FORM_block1: return Size + sizeof(int8_t);
2989   case DW_FORM_block2: return Size + sizeof(int16_t);
2990   case DW_FORM_block4: return Size + sizeof(int32_t);
2991   case DW_FORM_block: return Size + SizeULEB128(Size);
2992   default: assert(0 && "Improper form for block"); break;
2993   }
2994   return 0;
2995 }
2996
2997 //===----------------------------------------------------------------------===//
2998 /// DIE Implementation
2999
3000 DIE::~DIE() {
3001   for (unsigned i = 0, N = Children.size(); i < N; ++i)
3002     delete Children[i];
3003 }
3004   
3005 /// AddSiblingOffset - Add a sibling offset field to the front of the DIE.
3006 ///
3007 void DIE::AddSiblingOffset() {
3008   DIEInteger *DI = new DIEInteger(0);
3009   Values.insert(Values.begin(), DI);
3010   Abbrev.AddFirstAttribute(DW_AT_sibling, DW_FORM_ref4);
3011 }
3012
3013 /// Profile - Used to gather unique data for the value folding set.
3014 ///
3015 void DIE::Profile(FoldingSetNodeID &ID) {
3016   Abbrev.Profile(ID);
3017   
3018   for (unsigned i = 0, N = Children.size(); i < N; ++i)
3019     ID.AddPointer(Children[i]);
3020
3021   for (unsigned j = 0, M = Values.size(); j < M; ++j)
3022     ID.AddPointer(Values[j]);
3023 }
3024
3025 #ifndef NDEBUG
3026 void DIE::print(std::ostream &O, unsigned IncIndent) {
3027   static unsigned IndentCount = 0;
3028   IndentCount += IncIndent;
3029   const std::string Indent(IndentCount, ' ');
3030   bool isBlock = Abbrev.getTag() == 0;
3031   
3032   if (!isBlock) {
3033     O << Indent
3034       << "Die: "
3035       << "0x" << std::hex << (intptr_t)this << std::dec
3036       << ", Offset: " << Offset
3037       << ", Size: " << Size
3038       << "\n"; 
3039     
3040     O << Indent
3041       << TagString(Abbrev.getTag())
3042       << " "
3043       << ChildrenString(Abbrev.getChildrenFlag());
3044   } else {
3045     O << "Size: " << Size;
3046   }
3047   O << "\n";
3048
3049   const std::vector<DIEAbbrevData> &Data = Abbrev.getData();
3050   
3051   IndentCount += 2;
3052   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
3053     O << Indent;
3054     if (!isBlock) {
3055       O << AttributeString(Data[i].getAttribute());
3056     } else {
3057       O << "Blk[" << i << "]";
3058     }
3059     O <<  "  "
3060       << FormEncodingString(Data[i].getForm())
3061       << " ";
3062     Values[i]->print(O);
3063     O << "\n";
3064   }
3065   IndentCount -= 2;
3066
3067   for (unsigned j = 0, M = Children.size(); j < M; ++j) {
3068     Children[j]->print(O, 4);
3069   }
3070   
3071   if (!isBlock) O << "\n";
3072   IndentCount -= IncIndent;
3073 }
3074
3075 void DIE::dump() {
3076   print(std::cerr);
3077 }
3078 #endif
3079
3080 //===----------------------------------------------------------------------===//
3081 /// DwarfWriter Implementation
3082 ///
3083
3084 DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A,
3085                          const TargetAsmInfo *T) {
3086   DW = new Dwarf(OS, A, T);
3087 }
3088
3089 DwarfWriter::~DwarfWriter() {
3090   delete DW;
3091 }
3092
3093 /// SetDebugInfo - Set DebugInfo when it's known that pass manager has
3094 /// created it.  Set by the target AsmPrinter.
3095 void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) {
3096   DW->SetDebugInfo(DI);
3097 }
3098
3099 /// BeginModule - Emit all Dwarf sections that should come prior to the
3100 /// content.
3101 void DwarfWriter::BeginModule(Module *M) {
3102   DW->BeginModule(M);
3103 }
3104
3105 /// EndModule - Emit all Dwarf sections that should come after the content.
3106 ///
3107 void DwarfWriter::EndModule() {
3108   DW->EndModule();
3109 }
3110
3111 /// BeginFunction - Gather pre-function debug information.  Assumes being 
3112 /// emitted immediately after the function entry point.
3113 void DwarfWriter::BeginFunction(MachineFunction *MF) {
3114   DW->BeginFunction(MF);
3115 }
3116
3117 /// EndFunction - Gather and emit post-function debug information.
3118 ///
3119 void DwarfWriter::EndFunction() {
3120   DW->EndFunction();
3121 }