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