Construct subprogram 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   /// ConstructCompileUnits - 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   /// ConstructGlobalVariableDIEs - Create DIEs for each of the externally 
3159   /// visible global variables.
3160   void ConstructGlobalVariableDIEs() {
3161     std::string GVName = "llvm.dbg.global_variables";
3162     std::vector<GlobalVariable*> Result;
3163     getGlobalVariablesUsing(*M, GVName, Result);
3164     for (std::vector<GlobalVariable *>::iterator GVI = Result.begin(),
3165            GVE = Result.end(); GVI != GVE; ++GVI) {
3166       DIGlobalVariable *DI_GV = new DIGlobalVariable(*GVI);
3167       CompileUnit *DW_Unit = FindCompileUnit(DI_GV->getCompileUnit());
3168
3169       // Check for pre-existence.
3170       DIE *&Slot = DW_Unit->getDieMapSlotFor(DI_GV->getGV());
3171       if (Slot) continue;
3172
3173       DIE *VariableDie = new DIE(DW_TAG_variable);
3174       AddString(VariableDie, DW_AT_name, DW_FORM_string, DI_GV->getName());
3175       const std::string &LinkageName  = DI_GV->getLinkageName();
3176       if (!LinkageName.empty())
3177         AddString(VariableDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
3178                   LinkageName);
3179       AddType(DW_Unit, VariableDie, DI_GV->getType());
3180
3181       if (!DI_GV->isLocalToUnit())
3182         AddUInt(VariableDie, DW_AT_external, DW_FORM_flag, 1);              
3183
3184       // Add source line info, if available.
3185       AddSourceLine(VariableDie, DI_GV);
3186
3187       // Add address.
3188       DIEBlock *Block = new DIEBlock();
3189       AddUInt(Block, 0, DW_FORM_data1, DW_OP_addr);
3190       AddObjectLabel(Block, 0, DW_FORM_udata,
3191                      Asm->getGlobalLinkName(DI_GV->getGV()));
3192       AddBlock(VariableDie, DW_AT_location, 0, Block);
3193
3194       //Add to map.
3195       Slot = VariableDie;
3196
3197       //Add to context owner.
3198       DW_Unit->getDie()->AddChild(VariableDie);
3199
3200       //Expose as global. FIXME - need to check external flag.
3201       DW_Unit->AddGlobal(DI_GV->getName(), VariableDie);
3202     }
3203   }
3204
3205   /// ConstructGlobalDIEs - Create DIEs for each of the externally visible
3206   /// global variables.
3207   void ConstructGlobalDIEs() {
3208     std::vector<GlobalVariableDesc *> GlobalVariables;
3209     MMI->getAnchoredDescriptors<GlobalVariableDesc>(*M, GlobalVariables);
3210
3211     for (unsigned i = 0, N = GlobalVariables.size(); i < N; ++i) {
3212       GlobalVariableDesc *GVD = GlobalVariables[i];
3213       NewGlobalVariable(GVD);
3214     }
3215   }
3216
3217   /// ConstructSubprograms - Create DIEs for each of the externally visible
3218   /// subprograms.
3219   void ConstructSubprograms() {
3220
3221     std::string SPName = "llvm.dbg.subprograms";
3222     std::vector<GlobalVariable*> Result;
3223     getGlobalVariablesUsing(*M, SPName, Result);
3224     for (std::vector<GlobalVariable *>::iterator RI = Result.begin(),
3225            RE = Result.end(); RI != RE; ++RI) {
3226
3227       DISubprogram *SP = new DISubprogram(*RI);
3228       CompileUnit *Unit = FindCompileUnit(SP->getCompileUnit());
3229
3230       // Check for pre-existence.                                                         
3231       DIE *&Slot = Unit->getDieMapSlotFor(SP->getGV());
3232       if (Slot) continue;
3233
3234       DIE *SubprogramDie = new DIE(DW_TAG_subprogram);
3235       AddString(SubprogramDie, DW_AT_name, DW_FORM_string, SP->getName());
3236       const std::string &LinkageName = SP->getLinkageName();
3237       if (!LinkageName.empty())
3238         AddString(SubprogramDie, DW_AT_MIPS_linkage_name, DW_FORM_string,
3239                   LinkageName);
3240       DIType SPTy = SP->getType();
3241       AddType(Unit, SubprogramDie, SPTy);
3242       if (!SP->isLocalToUnit())
3243         AddUInt(SubprogramDie, DW_AT_external, DW_FORM_flag, 1);
3244       AddUInt(SubprogramDie, DW_AT_prototyped, DW_FORM_flag, 1);
3245
3246       AddSourceLine(SubprogramDie, SP);
3247       //Add to map.
3248       Slot = SubprogramDie;
3249       //Add to context owner.
3250       Unit->getDie()->AddChild(SubprogramDie);
3251       //Expose as global.
3252       Unit->AddGlobal(SP->getName(), SubprogramDie);
3253     }
3254   }
3255
3256   /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
3257   /// subprograms.
3258   void ConstructSubprogramDIEs() {
3259     std::vector<SubprogramDesc *> Subprograms;
3260     MMI->getAnchoredDescriptors<SubprogramDesc>(*M, Subprograms);
3261
3262     for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) {
3263       SubprogramDesc *SPD = Subprograms[i];
3264       NewSubprogram(SPD);
3265     }
3266   }
3267
3268 public:
3269   //===--------------------------------------------------------------------===//
3270   // Main entry points.
3271   //
3272   DwarfDebug(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
3273   : Dwarf(OS, A, T, "dbg")
3274   , CompileUnits()
3275   , AbbreviationsSet(InitAbbreviationsSetSize)
3276   , Abbreviations()
3277   , ValuesSet(InitValuesSetSize)
3278   , Values()
3279   , StringPool()
3280   , DescToUnitMap()
3281   , SectionMap()
3282   , SectionSourceLines()
3283   , didInitial(false)
3284   , shouldEmit(false)
3285   {
3286   }
3287   virtual ~DwarfDebug() {
3288     for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i)
3289       delete CompileUnits[i];
3290     for (unsigned j = 0, M = Values.size(); j < M; ++j)
3291       delete Values[j];
3292   }
3293
3294   /// SetModuleInfo - Set machine module information when it's known that pass
3295   /// manager has created it.  Set by the target AsmPrinter.
3296   void SetModuleInfo(MachineModuleInfo *mmi) {
3297     // Make sure initial declarations are made.
3298     if (!MMI && mmi->hasDebugInfo()) {
3299       MMI = mmi;
3300       shouldEmit = true;
3301
3302       // Create all the compile unit DIEs.
3303       ConstructCompileUnitDIEs();
3304
3305       // Create DIEs for each of the externally visible global variables.
3306       ConstructGlobalDIEs();
3307
3308       // Create DIEs for each of the externally visible subprograms.
3309       ConstructSubprogramDIEs();
3310
3311       // Prime section data.
3312       SectionMap.insert(TAI->getTextSection());
3313
3314       // Print out .file directives to specify files for .loc directives. These
3315       // are printed out early so that they precede any .loc directives.
3316       if (TAI->hasDotLocAndDotFile()) {
3317         const UniqueVector<SourceFileInfo> &SourceFiles = MMI->getSourceFiles();
3318         const UniqueVector<std::string> &Directories = MMI->getDirectories();
3319         for (unsigned i = 1, e = SourceFiles.size(); i <= e; ++i) {
3320           sys::Path FullPath(Directories[SourceFiles[i].getDirectoryID()]);
3321           bool AppendOk = FullPath.appendComponent(SourceFiles[i].getName());
3322           assert(AppendOk && "Could not append filename to directory!");
3323           AppendOk = false;
3324           Asm->EmitFile(i, FullPath.toString());
3325           Asm->EOL();
3326         }
3327       }
3328
3329       // Emit initial sections
3330       EmitInitial();
3331     }
3332   }
3333
3334   /// BeginModule - Emit all Dwarf sections that should come prior to the
3335   /// content.
3336   void BeginModule(Module *M) {
3337     this->M = M;
3338   }
3339
3340   /// EndModule - Emit all Dwarf sections that should come after the content.
3341   ///
3342   void EndModule() {
3343     if (!ShouldEmitDwarf()) return;
3344
3345     // Standard sections final addresses.
3346     Asm->SwitchToSection(TAI->getTextSection());
3347     EmitLabel("text_end", 0);
3348     Asm->SwitchToSection(TAI->getDataSection());
3349     EmitLabel("data_end", 0);
3350
3351     // End text sections.
3352     for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
3353       Asm->SwitchToSection(SectionMap[i]);
3354       EmitLabel("section_end", i);
3355     }
3356
3357     // Emit common frame information.
3358     EmitCommonDebugFrame();
3359
3360     // Emit function debug frame information
3361     for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
3362            E = DebugFrames.end(); I != E; ++I)
3363       EmitFunctionDebugFrame(*I);
3364
3365     // Compute DIE offsets and sizes.
3366     SizeAndOffsets();
3367
3368     // Emit all the DIEs into a debug info section
3369     EmitDebugInfo();
3370
3371     // Corresponding abbreviations into a abbrev section.
3372     EmitAbbreviations();
3373
3374     // Emit source line correspondence into a debug line section.
3375     EmitDebugLines();
3376
3377     // Emit info into a debug pubnames section.
3378     EmitDebugPubNames();
3379
3380     // Emit info into a debug str section.
3381     EmitDebugStr();
3382
3383     // Emit info into a debug loc section.
3384     EmitDebugLoc();
3385
3386     // Emit info into a debug aranges section.
3387     EmitDebugARanges();
3388
3389     // Emit info into a debug ranges section.
3390     EmitDebugRanges();
3391
3392     // Emit info into a debug macinfo section.
3393     EmitDebugMacInfo();
3394   }
3395
3396   /// BeginFunction - Gather pre-function debug information.  Assumes being
3397   /// emitted immediately after the function entry point.
3398   void BeginFunction(MachineFunction *MF) {
3399     this->MF = MF;
3400
3401     if (!ShouldEmitDwarf()) return;
3402
3403     // Begin accumulating function debug information.
3404     MMI->BeginFunction(MF);
3405
3406     // Assumes in correct section after the entry point.
3407     EmitLabel("func_begin", ++SubprogramCount);
3408
3409     // Emit label for the implicitly defined dbg.stoppoint at the start of
3410     // the function.
3411     const std::vector<SourceLineInfo> &LineInfos = MMI->getSourceLines();
3412     if (!LineInfos.empty()) {
3413       const SourceLineInfo &LineInfo = LineInfos[0];
3414       Asm->printLabel(LineInfo.getLabelID());
3415     }
3416   }
3417
3418   /// EndFunction - Gather and emit post-function debug information.
3419   ///
3420   void EndFunction(MachineFunction *MF) {
3421     if (!ShouldEmitDwarf()) return;
3422
3423     // Define end label for subprogram.
3424     EmitLabel("func_end", SubprogramCount);
3425
3426     // Get function line info.
3427     const std::vector<SourceLineInfo> &LineInfos = MMI->getSourceLines();
3428
3429     if (!LineInfos.empty()) {
3430       // Get section line info.
3431       unsigned ID = SectionMap.insert(Asm->CurrentSection_);
3432       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
3433       std::vector<SourceLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
3434       // Append the function info to section info.
3435       SectionLineInfos.insert(SectionLineInfos.end(),
3436                               LineInfos.begin(), LineInfos.end());
3437     }
3438
3439     // Construct scopes for subprogram.
3440     if (MMI->getRootScope())
3441       ConstructRootScope(MMI->getRootScope());
3442     else
3443       // FIXME: This is wrong. We are essentially getting past a problem with
3444       // debug information not being able to handle unreachable blocks that have
3445       // debug information in them. In particular, those unreachable blocks that
3446       // have "region end" info in them. That situation results in the "root
3447       // scope" not being created. If that's the case, then emit a "default"
3448       // scope, i.e., one that encompasses the whole function. This isn't
3449       // desirable. And a better way of handling this (and all of the debugging
3450       // information) needs to be explored.
3451       ConstructDefaultScope(MF);
3452
3453     DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
3454                                                  MMI->getFrameMoves()));
3455   }
3456 };
3457
3458 //===----------------------------------------------------------------------===//
3459 /// DwarfException - Emits Dwarf exception handling directives.
3460 ///
3461 class DwarfException : public Dwarf  {
3462
3463 private:
3464   struct FunctionEHFrameInfo {
3465     std::string FnName;
3466     unsigned Number;
3467     unsigned PersonalityIndex;
3468     bool hasCalls;
3469     bool hasLandingPads;
3470     std::vector<MachineMove> Moves;
3471     const Function * function;
3472
3473     FunctionEHFrameInfo(const std::string &FN, unsigned Num, unsigned P,
3474                         bool hC, bool hL,
3475                         const std::vector<MachineMove> &M,
3476                         const Function *f):
3477       FnName(FN), Number(Num), PersonalityIndex(P),
3478       hasCalls(hC), hasLandingPads(hL), Moves(M), function (f) { }
3479   };
3480
3481   std::vector<FunctionEHFrameInfo> EHFrames;
3482
3483   /// shouldEmitTable - Per-function flag to indicate if EH tables should
3484   /// be emitted.
3485   bool shouldEmitTable;
3486
3487   /// shouldEmitMoves - Per-function flag to indicate if frame moves info
3488   /// should be emitted.
3489   bool shouldEmitMoves;
3490
3491   /// shouldEmitTableModule - Per-module flag to indicate if EH tables
3492   /// should be emitted.
3493   bool shouldEmitTableModule;
3494
3495   /// shouldEmitFrameModule - Per-module flag to indicate if frame moves
3496   /// should be emitted.
3497   bool shouldEmitMovesModule;
3498
3499   /// EmitCommonEHFrame - Emit the common eh unwind frame.
3500   ///
3501   void EmitCommonEHFrame(const Function *Personality, unsigned Index) {
3502     // Size and sign of stack growth.
3503     int stackGrowth =
3504         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3505           TargetFrameInfo::StackGrowsUp ?
3506         TD->getPointerSize() : -TD->getPointerSize();
3507
3508     // Begin eh frame section.
3509     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
3510
3511     if (!TAI->doesRequireNonLocalEHFrameLabel())
3512       O << TAI->getEHGlobalPrefix();
3513     O << "EH_frame" << Index << ":\n";
3514     EmitLabel("section_eh_frame", Index);
3515
3516     // Define base labels.
3517     EmitLabel("eh_frame_common", Index);
3518
3519     // Define the eh frame length.
3520     EmitDifference("eh_frame_common_end", Index,
3521                    "eh_frame_common_begin", Index, true);
3522     Asm->EOL("Length of Common Information Entry");
3523
3524     // EH frame header.
3525     EmitLabel("eh_frame_common_begin", Index);
3526     Asm->EmitInt32((int)0);
3527     Asm->EOL("CIE Identifier Tag");
3528     Asm->EmitInt8(DW_CIE_VERSION);
3529     Asm->EOL("CIE Version");
3530
3531     // The personality presence indicates that language specific information
3532     // will show up in the eh frame.
3533     Asm->EmitString(Personality ? "zPLR" : "zR");
3534     Asm->EOL("CIE Augmentation");
3535
3536     // Round out reader.
3537     Asm->EmitULEB128Bytes(1);
3538     Asm->EOL("CIE Code Alignment Factor");
3539     Asm->EmitSLEB128Bytes(stackGrowth);
3540     Asm->EOL("CIE Data Alignment Factor");
3541     Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
3542     Asm->EOL("CIE Return Address Column");
3543
3544     // If there is a personality, we need to indicate the functions location.
3545     if (Personality) {
3546       Asm->EmitULEB128Bytes(7);
3547       Asm->EOL("Augmentation Size");
3548
3549       if (TAI->getNeedsIndirectEncoding()) {
3550         Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect);
3551         Asm->EOL("Personality (pcrel sdata4 indirect)");
3552       } else {
3553         Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3554         Asm->EOL("Personality (pcrel sdata4)");
3555       }
3556
3557       PrintRelDirective(true);
3558       O << TAI->getPersonalityPrefix();
3559       Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
3560       O << TAI->getPersonalitySuffix();
3561       if (strcmp(TAI->getPersonalitySuffix(), "+4@GOTPCREL"))
3562         O << "-" << TAI->getPCSymbol();
3563       Asm->EOL("Personality");
3564
3565       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3566       Asm->EOL("LSDA Encoding (pcrel sdata4)");
3567
3568       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3569       Asm->EOL("FDE Encoding (pcrel sdata4)");
3570    } else {
3571       Asm->EmitULEB128Bytes(1);
3572       Asm->EOL("Augmentation Size");
3573
3574       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
3575       Asm->EOL("FDE Encoding (pcrel sdata4)");
3576     }
3577
3578     // Indicate locations of general callee saved registers in frame.
3579     std::vector<MachineMove> Moves;
3580     RI->getInitialFrameState(Moves);
3581     EmitFrameMoves(NULL, 0, Moves, true);
3582
3583     // On Darwin the linker honors the alignment of eh_frame, which means it
3584     // must be 8-byte on 64-bit targets to match what gcc does.  Otherwise
3585     // you get holes which confuse readers of eh_frame.
3586     Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
3587                        0, 0, false);
3588     EmitLabel("eh_frame_common_end", Index);
3589
3590     Asm->EOL();
3591   }
3592
3593   /// EmitEHFrame - Emit function exception frame information.
3594   ///
3595   void EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
3596     Function::LinkageTypes linkage = EHFrameInfo.function->getLinkage();
3597
3598     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
3599
3600     // Externally visible entry into the functions eh frame info.
3601     // If the corresponding function is static, this should not be
3602     // externally visible.
3603     if (linkage != Function::InternalLinkage) {
3604       if (const char *GlobalEHDirective = TAI->getGlobalEHDirective())
3605         O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
3606     }
3607
3608     // If corresponding function is weak definition, this should be too.
3609     if ((linkage == Function::WeakLinkage ||
3610          linkage == Function::LinkOnceLinkage) &&
3611         TAI->getWeakDefDirective())
3612       O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
3613
3614     // If there are no calls then you can't unwind.  This may mean we can
3615     // omit the EH Frame, but some environments do not handle weak absolute
3616     // symbols.
3617     // If UnwindTablesMandatory is set we cannot do this optimization; the
3618     // unwind info is to be available for non-EH uses.
3619     if (!EHFrameInfo.hasCalls &&
3620         !UnwindTablesMandatory &&
3621         ((linkage != Function::WeakLinkage &&
3622           linkage != Function::LinkOnceLinkage) ||
3623          !TAI->getWeakDefDirective() ||
3624          TAI->getSupportsWeakOmittedEHFrame()))
3625     {
3626       O << EHFrameInfo.FnName << " = 0\n";
3627       // This name has no connection to the function, so it might get
3628       // dead-stripped when the function is not, erroneously.  Prohibit
3629       // dead-stripping unconditionally.
3630       if (const char *UsedDirective = TAI->getUsedDirective())
3631         O << UsedDirective << EHFrameInfo.FnName << "\n\n";
3632     } else {
3633       O << EHFrameInfo.FnName << ":\n";
3634
3635       // EH frame header.
3636       EmitDifference("eh_frame_end", EHFrameInfo.Number,
3637                      "eh_frame_begin", EHFrameInfo.Number, true);
3638       Asm->EOL("Length of Frame Information Entry");
3639
3640       EmitLabel("eh_frame_begin", EHFrameInfo.Number);
3641
3642       if (TAI->doesRequireNonLocalEHFrameLabel()) {
3643         PrintRelDirective(true, true);
3644         PrintLabelName("eh_frame_begin", EHFrameInfo.Number);
3645
3646         if (!TAI->isAbsoluteEHSectionOffsets())
3647           O << "-EH_frame" << EHFrameInfo.PersonalityIndex;
3648       } else {
3649         EmitSectionOffset("eh_frame_begin", "eh_frame_common",
3650                           EHFrameInfo.Number, EHFrameInfo.PersonalityIndex,
3651                           true, true, false);
3652       }
3653
3654       Asm->EOL("FDE CIE offset");
3655
3656       EmitReference("eh_func_begin", EHFrameInfo.Number, true);
3657       Asm->EOL("FDE initial location");
3658       EmitDifference("eh_func_end", EHFrameInfo.Number,
3659                      "eh_func_begin", EHFrameInfo.Number);
3660       Asm->EOL("FDE address range");
3661
3662       // If there is a personality and landing pads then point to the language
3663       // specific data area in the exception table.
3664       if (EHFrameInfo.PersonalityIndex) {
3665         Asm->EmitULEB128Bytes(4);
3666         Asm->EOL("Augmentation size");
3667
3668         if (EHFrameInfo.hasLandingPads)
3669           EmitReference("exception", EHFrameInfo.Number, true, true);
3670         else
3671           Asm->EmitInt32((int)0);
3672         Asm->EOL("Language Specific Data Area");
3673       } else {
3674         Asm->EmitULEB128Bytes(0);
3675         Asm->EOL("Augmentation size");
3676       }
3677
3678       // Indicate locations of function specific  callee saved registers in
3679       // frame.
3680       EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves, true);
3681
3682       // On Darwin the linker honors the alignment of eh_frame, which means it
3683       // must be 8-byte on 64-bit targets to match what gcc does.  Otherwise
3684       // you get holes which confuse readers of eh_frame.
3685       Asm->EmitAlignment(TD->getPointerSize() == sizeof(int32_t) ? 2 : 3,
3686                          0, 0, false);
3687       EmitLabel("eh_frame_end", EHFrameInfo.Number);
3688
3689       // If the function is marked used, this table should be also.  We cannot
3690       // make the mark unconditional in this case, since retaining the table
3691       // also retains the function in this case, and there is code around
3692       // that depends on unused functions (calling undefined externals) being
3693       // dead-stripped to link correctly.  Yes, there really is.
3694       if (MMI->getUsedFunctions().count(EHFrameInfo.function))
3695         if (const char *UsedDirective = TAI->getUsedDirective())
3696           O << UsedDirective << EHFrameInfo.FnName << "\n\n";
3697     }
3698   }
3699
3700   /// EmitExceptionTable - Emit landing pads and actions.
3701   ///
3702   /// The general organization of the table is complex, but the basic concepts
3703   /// are easy.  First there is a header which describes the location and
3704   /// organization of the three components that follow.
3705   ///  1. The landing pad site information describes the range of code covered
3706   ///     by the try.  In our case it's an accumulation of the ranges covered
3707   ///     by the invokes in the try.  There is also a reference to the landing
3708   ///     pad that handles the exception once processed.  Finally an index into
3709   ///     the actions table.
3710   ///  2. The action table, in our case, is composed of pairs of type ids
3711   ///     and next action offset.  Starting with the action index from the
3712   ///     landing pad site, each type Id is checked for a match to the current
3713   ///     exception.  If it matches then the exception and type id are passed
3714   ///     on to the landing pad.  Otherwise the next action is looked up.  This
3715   ///     chain is terminated with a next action of zero.  If no type id is
3716   ///     found the the frame is unwound and handling continues.
3717   ///  3. Type id table contains references to all the C++ typeinfo for all
3718   ///     catches in the function.  This tables is reversed indexed base 1.
3719
3720   /// SharedTypeIds - How many leading type ids two landing pads have in common.
3721   static unsigned SharedTypeIds(const LandingPadInfo *L,
3722                                 const LandingPadInfo *R) {
3723     const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
3724     unsigned LSize = LIds.size(), RSize = RIds.size();
3725     unsigned MinSize = LSize < RSize ? LSize : RSize;
3726     unsigned Count = 0;
3727
3728     for (; Count != MinSize; ++Count)
3729       if (LIds[Count] != RIds[Count])
3730         return Count;
3731
3732     return Count;
3733   }
3734
3735   /// PadLT - Order landing pads lexicographically by type id.
3736   static bool PadLT(const LandingPadInfo *L, const LandingPadInfo *R) {
3737     const std::vector<int> &LIds = L->TypeIds, &RIds = R->TypeIds;
3738     unsigned LSize = LIds.size(), RSize = RIds.size();
3739     unsigned MinSize = LSize < RSize ? LSize : RSize;
3740
3741     for (unsigned i = 0; i != MinSize; ++i)
3742       if (LIds[i] != RIds[i])
3743         return LIds[i] < RIds[i];
3744
3745     return LSize < RSize;
3746   }
3747
3748   struct KeyInfo {
3749     static inline unsigned getEmptyKey() { return -1U; }
3750     static inline unsigned getTombstoneKey() { return -2U; }
3751     static unsigned getHashValue(const unsigned &Key) { return Key; }
3752     static bool isEqual(unsigned LHS, unsigned RHS) { return LHS == RHS; }
3753     static bool isPod() { return true; }
3754   };
3755
3756   /// ActionEntry - Structure describing an entry in the actions table.
3757   struct ActionEntry {
3758     int ValueForTypeID; // The value to write - may not be equal to the type id.
3759     int NextAction;
3760     struct ActionEntry *Previous;
3761   };
3762
3763   /// PadRange - Structure holding a try-range and the associated landing pad.
3764   struct PadRange {
3765     // The index of the landing pad.
3766     unsigned PadIndex;
3767     // The index of the begin and end labels in the landing pad's label lists.
3768     unsigned RangeIndex;
3769   };
3770
3771   typedef DenseMap<unsigned, PadRange, KeyInfo> RangeMapType;
3772
3773   /// CallSiteEntry - Structure describing an entry in the call-site table.
3774   struct CallSiteEntry {
3775     // The 'try-range' is BeginLabel .. EndLabel.
3776     unsigned BeginLabel; // zero indicates the start of the function.
3777     unsigned EndLabel;   // zero indicates the end of the function.
3778     // The landing pad starts at PadLabel.
3779     unsigned PadLabel;   // zero indicates that there is no landing pad.
3780     unsigned Action;
3781   };
3782
3783   void EmitExceptionTable() {
3784     const std::vector<GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
3785     const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
3786     const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads();
3787     if (PadInfos.empty()) return;
3788
3789     // Sort the landing pads in order of their type ids.  This is used to fold
3790     // duplicate actions.
3791     SmallVector<const LandingPadInfo *, 64> LandingPads;
3792     LandingPads.reserve(PadInfos.size());
3793     for (unsigned i = 0, N = PadInfos.size(); i != N; ++i)
3794       LandingPads.push_back(&PadInfos[i]);
3795     std::sort(LandingPads.begin(), LandingPads.end(), PadLT);
3796
3797     // Negative type ids index into FilterIds, positive type ids index into
3798     // TypeInfos.  The value written for a positive type id is just the type
3799     // id itself.  For a negative type id, however, the value written is the
3800     // (negative) byte offset of the corresponding FilterIds entry.  The byte
3801     // offset is usually equal to the type id, because the FilterIds entries
3802     // are written using a variable width encoding which outputs one byte per
3803     // entry as long as the value written is not too large, but can differ.
3804     // This kind of complication does not occur for positive type ids because
3805     // type infos are output using a fixed width encoding.
3806     // FilterOffsets[i] holds the byte offset corresponding to FilterIds[i].
3807     SmallVector<int, 16> FilterOffsets;
3808     FilterOffsets.reserve(FilterIds.size());
3809     int Offset = -1;
3810     for(std::vector<unsigned>::const_iterator I = FilterIds.begin(),
3811         E = FilterIds.end(); I != E; ++I) {
3812       FilterOffsets.push_back(Offset);
3813       Offset -= TargetAsmInfo::getULEB128Size(*I);
3814     }
3815
3816     // Compute the actions table and gather the first action index for each
3817     // landing pad site.
3818     SmallVector<ActionEntry, 32> Actions;
3819     SmallVector<unsigned, 64> FirstActions;
3820     FirstActions.reserve(LandingPads.size());
3821
3822     int FirstAction = 0;
3823     unsigned SizeActions = 0;
3824     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
3825       const LandingPadInfo *LP = LandingPads[i];
3826       const std::vector<int> &TypeIds = LP->TypeIds;
3827       const unsigned NumShared = i ? SharedTypeIds(LP, LandingPads[i-1]) : 0;
3828       unsigned SizeSiteActions = 0;
3829
3830       if (NumShared < TypeIds.size()) {
3831         unsigned SizeAction = 0;
3832         ActionEntry *PrevAction = 0;
3833
3834         if (NumShared) {
3835           const unsigned SizePrevIds = LandingPads[i-1]->TypeIds.size();
3836           assert(Actions.size());
3837           PrevAction = &Actions.back();
3838           SizeAction = TargetAsmInfo::getSLEB128Size(PrevAction->NextAction) +
3839             TargetAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
3840           for (unsigned j = NumShared; j != SizePrevIds; ++j) {
3841             SizeAction -=
3842               TargetAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID);
3843             SizeAction += -PrevAction->NextAction;
3844             PrevAction = PrevAction->Previous;
3845           }
3846         }
3847
3848         // Compute the actions.
3849         for (unsigned I = NumShared, M = TypeIds.size(); I != M; ++I) {
3850           int TypeID = TypeIds[I];
3851           assert(-1-TypeID < (int)FilterOffsets.size() && "Unknown filter id!");
3852           int ValueForTypeID = TypeID < 0 ? FilterOffsets[-1 - TypeID] : TypeID;
3853           unsigned SizeTypeID = TargetAsmInfo::getSLEB128Size(ValueForTypeID);
3854
3855           int NextAction = SizeAction ? -(SizeAction + SizeTypeID) : 0;
3856           SizeAction = SizeTypeID + TargetAsmInfo::getSLEB128Size(NextAction);
3857           SizeSiteActions += SizeAction;
3858
3859           ActionEntry Action = {ValueForTypeID, NextAction, PrevAction};
3860           Actions.push_back(Action);
3861
3862           PrevAction = &Actions.back();
3863         }
3864
3865         // Record the first action of the landing pad site.
3866         FirstAction = SizeActions + SizeSiteActions - SizeAction + 1;
3867       } // else identical - re-use previous FirstAction
3868
3869       FirstActions.push_back(FirstAction);
3870
3871       // Compute this sites contribution to size.
3872       SizeActions += SizeSiteActions;
3873     }
3874
3875     // Compute the call-site table.  The entry for an invoke has a try-range
3876     // containing the call, a non-zero landing pad and an appropriate action.
3877     // The entry for an ordinary call has a try-range containing the call and
3878     // zero for the landing pad and the action.  Calls marked 'nounwind' have
3879     // no entry and must not be contained in the try-range of any entry - they
3880     // form gaps in the table.  Entries must be ordered by try-range address.
3881     SmallVector<CallSiteEntry, 64> CallSites;
3882
3883     RangeMapType PadMap;
3884     // Invokes and nounwind calls have entries in PadMap (due to being bracketed
3885     // by try-range labels when lowered).  Ordinary calls do not, so appropriate
3886     // try-ranges for them need be deduced.
3887     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
3888       const LandingPadInfo *LandingPad = LandingPads[i];
3889       for (unsigned j = 0, E = LandingPad->BeginLabels.size(); j != E; ++j) {
3890         unsigned BeginLabel = LandingPad->BeginLabels[j];
3891         assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!");
3892         PadRange P = { i, j };
3893         PadMap[BeginLabel] = P;
3894       }
3895     }
3896
3897     // The end label of the previous invoke or nounwind try-range.
3898     unsigned LastLabel = 0;
3899
3900     // Whether there is a potentially throwing instruction (currently this means
3901     // an ordinary call) between the end of the previous try-range and now.
3902     bool SawPotentiallyThrowing = false;
3903
3904     // Whether the last callsite entry was for an invoke.
3905     bool PreviousIsInvoke = false;
3906
3907     // Visit all instructions in order of address.
3908     for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
3909          I != E; ++I) {
3910       for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
3911            MI != E; ++MI) {
3912         if (!MI->isLabel()) {
3913           SawPotentiallyThrowing |= MI->getDesc().isCall();
3914           continue;
3915         }
3916
3917         unsigned BeginLabel = MI->getOperand(0).getImm();
3918         assert(BeginLabel && "Invalid label!");
3919
3920         // End of the previous try-range?
3921         if (BeginLabel == LastLabel)
3922           SawPotentiallyThrowing = false;
3923
3924         // Beginning of a new try-range?
3925         RangeMapType::iterator L = PadMap.find(BeginLabel);
3926         if (L == PadMap.end())
3927           // Nope, it was just some random label.
3928           continue;
3929
3930         PadRange P = L->second;
3931         const LandingPadInfo *LandingPad = LandingPads[P.PadIndex];
3932
3933         assert(BeginLabel == LandingPad->BeginLabels[P.RangeIndex] &&
3934                "Inconsistent landing pad map!");
3935
3936         // If some instruction between the previous try-range and this one may
3937         // throw, create a call-site entry with no landing pad for the region
3938         // between the try-ranges.
3939         if (SawPotentiallyThrowing) {
3940           CallSiteEntry Site = {LastLabel, BeginLabel, 0, 0};
3941           CallSites.push_back(Site);
3942           PreviousIsInvoke = false;
3943         }
3944
3945         LastLabel = LandingPad->EndLabels[P.RangeIndex];
3946         assert(BeginLabel && LastLabel && "Invalid landing pad!");
3947
3948         if (LandingPad->LandingPadLabel) {
3949           // This try-range is for an invoke.
3950           CallSiteEntry Site = {BeginLabel, LastLabel,
3951             LandingPad->LandingPadLabel, FirstActions[P.PadIndex]};
3952
3953           // Try to merge with the previous call-site.
3954           if (PreviousIsInvoke) {
3955             CallSiteEntry &Prev = CallSites.back();
3956             if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) {
3957               // Extend the range of the previous entry.
3958               Prev.EndLabel = Site.EndLabel;
3959               continue;
3960             }
3961           }
3962
3963           // Otherwise, create a new call-site.
3964           CallSites.push_back(Site);
3965           PreviousIsInvoke = true;
3966         } else {
3967           // Create a gap.
3968           PreviousIsInvoke = false;
3969         }
3970       }
3971     }
3972     // If some instruction between the previous try-range and the end of the
3973     // function may throw, create a call-site entry with no landing pad for the
3974     // region following the try-range.
3975     if (SawPotentiallyThrowing) {
3976       CallSiteEntry Site = {LastLabel, 0, 0, 0};
3977       CallSites.push_back(Site);
3978     }
3979
3980     // Final tallies.
3981
3982     // Call sites.
3983     const unsigned SiteStartSize  = sizeof(int32_t); // DW_EH_PE_udata4
3984     const unsigned SiteLengthSize = sizeof(int32_t); // DW_EH_PE_udata4
3985     const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
3986     unsigned SizeSites = CallSites.size() * (SiteStartSize +
3987                                              SiteLengthSize +
3988                                              LandingPadSize);
3989     for (unsigned i = 0, e = CallSites.size(); i < e; ++i)
3990       SizeSites += TargetAsmInfo::getULEB128Size(CallSites[i].Action);
3991
3992     // Type infos.
3993     const unsigned TypeInfoSize = TD->getPointerSize(); // DW_EH_PE_absptr
3994     unsigned SizeTypes = TypeInfos.size() * TypeInfoSize;
3995
3996     unsigned TypeOffset = sizeof(int8_t) + // Call site format
3997            TargetAsmInfo::getULEB128Size(SizeSites) + // Call-site table length
3998                           SizeSites + SizeActions + SizeTypes;
3999
4000     unsigned TotalSize = sizeof(int8_t) + // LPStart format
4001                          sizeof(int8_t) + // TType format
4002            TargetAsmInfo::getULEB128Size(TypeOffset) + // TType base offset
4003                          TypeOffset;
4004
4005     unsigned SizeAlign = (4 - TotalSize) & 3;
4006
4007     // Begin the exception table.
4008     Asm->SwitchToDataSection(TAI->getDwarfExceptionSection());
4009     Asm->EmitAlignment(2, 0, 0, false);
4010     O << "GCC_except_table" << SubprogramCount << ":\n";
4011     for (unsigned i = 0; i != SizeAlign; ++i) {
4012       Asm->EmitInt8(0);
4013       Asm->EOL("Padding");
4014     }
4015     EmitLabel("exception", SubprogramCount);
4016
4017     // Emit the header.
4018     Asm->EmitInt8(DW_EH_PE_omit);
4019     Asm->EOL("LPStart format (DW_EH_PE_omit)");
4020     Asm->EmitInt8(DW_EH_PE_absptr);
4021     Asm->EOL("TType format (DW_EH_PE_absptr)");
4022     Asm->EmitULEB128Bytes(TypeOffset);
4023     Asm->EOL("TType base offset");
4024     Asm->EmitInt8(DW_EH_PE_udata4);
4025     Asm->EOL("Call site format (DW_EH_PE_udata4)");
4026     Asm->EmitULEB128Bytes(SizeSites);
4027     Asm->EOL("Call-site table length");
4028
4029     // Emit the landing pad site information.
4030     for (unsigned i = 0; i < CallSites.size(); ++i) {
4031       CallSiteEntry &S = CallSites[i];
4032       const char *BeginTag;
4033       unsigned BeginNumber;
4034
4035       if (!S.BeginLabel) {
4036         BeginTag = "eh_func_begin";
4037         BeginNumber = SubprogramCount;
4038       } else {
4039         BeginTag = "label";
4040         BeginNumber = S.BeginLabel;
4041       }
4042
4043       EmitSectionOffset(BeginTag, "eh_func_begin", BeginNumber, SubprogramCount,
4044                         true, true);
4045       Asm->EOL("Region start");
4046
4047       if (!S.EndLabel) {
4048         EmitDifference("eh_func_end", SubprogramCount, BeginTag, BeginNumber,
4049                        true);
4050       } else {
4051         EmitDifference("label", S.EndLabel, BeginTag, BeginNumber, true);
4052       }
4053       Asm->EOL("Region length");
4054
4055       if (!S.PadLabel)
4056         Asm->EmitInt32(0);
4057       else
4058         EmitSectionOffset("label", "eh_func_begin", S.PadLabel, SubprogramCount,
4059                           true, true);
4060       Asm->EOL("Landing pad");
4061
4062       Asm->EmitULEB128Bytes(S.Action);
4063       Asm->EOL("Action");
4064     }
4065
4066     // Emit the actions.
4067     for (unsigned I = 0, N = Actions.size(); I != N; ++I) {
4068       ActionEntry &Action = Actions[I];
4069
4070       Asm->EmitSLEB128Bytes(Action.ValueForTypeID);
4071       Asm->EOL("TypeInfo index");
4072       Asm->EmitSLEB128Bytes(Action.NextAction);
4073       Asm->EOL("Next action");
4074     }
4075
4076     // Emit the type ids.
4077     for (unsigned M = TypeInfos.size(); M; --M) {
4078       GlobalVariable *GV = TypeInfos[M - 1];
4079
4080       PrintRelDirective();
4081
4082       if (GV)
4083         O << Asm->getGlobalLinkName(GV);
4084       else
4085         O << "0";
4086
4087       Asm->EOL("TypeInfo");
4088     }
4089
4090     // Emit the filter typeids.
4091     for (unsigned j = 0, M = FilterIds.size(); j < M; ++j) {
4092       unsigned TypeID = FilterIds[j];
4093       Asm->EmitULEB128Bytes(TypeID);
4094       Asm->EOL("Filter TypeInfo index");
4095     }
4096
4097     Asm->EmitAlignment(2, 0, 0, false);
4098   }
4099
4100 public:
4101   //===--------------------------------------------------------------------===//
4102   // Main entry points.
4103   //
4104   DwarfException(raw_ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
4105   : Dwarf(OS, A, T, "eh")
4106   , shouldEmitTable(false)
4107   , shouldEmitMoves(false)
4108   , shouldEmitTableModule(false)
4109   , shouldEmitMovesModule(false)
4110   {}
4111
4112   virtual ~DwarfException() {}
4113
4114   /// SetModuleInfo - Set machine module information when it's known that pass
4115   /// manager has created it.  Set by the target AsmPrinter.
4116   void SetModuleInfo(MachineModuleInfo *mmi) {
4117     MMI = mmi;
4118   }
4119
4120   /// BeginModule - Emit all exception information that should come prior to the
4121   /// content.
4122   void BeginModule(Module *M) {
4123     this->M = M;
4124   }
4125
4126   /// EndModule - Emit all exception information that should come after the
4127   /// content.
4128   void EndModule() {
4129     if (shouldEmitMovesModule || shouldEmitTableModule) {
4130       const std::vector<Function *> Personalities = MMI->getPersonalities();
4131       for (unsigned i =0; i < Personalities.size(); ++i)
4132         EmitCommonEHFrame(Personalities[i], i);
4133
4134       for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(),
4135              E = EHFrames.end(); I != E; ++I)
4136         EmitEHFrame(*I);
4137     }
4138   }
4139
4140   /// BeginFunction - Gather pre-function exception information.  Assumes being
4141   /// emitted immediately after the function entry point.
4142   void BeginFunction(MachineFunction *MF) {
4143     this->MF = MF;
4144     shouldEmitTable = shouldEmitMoves = false;
4145     if (MMI && TAI->doesSupportExceptionHandling()) {
4146
4147       // Map all labels and get rid of any dead landing pads.
4148       MMI->TidyLandingPads();
4149       // If any landing pads survive, we need an EH table.
4150       if (MMI->getLandingPads().size())
4151         shouldEmitTable = true;
4152
4153       // See if we need frame move info.
4154       if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory)
4155         shouldEmitMoves = true;
4156
4157       if (shouldEmitMoves || shouldEmitTable)
4158         // Assumes in correct section after the entry point.
4159         EmitLabel("eh_func_begin", ++SubprogramCount);
4160     }
4161     shouldEmitTableModule |= shouldEmitTable;
4162     shouldEmitMovesModule |= shouldEmitMoves;
4163   }
4164
4165   /// EndFunction - Gather and emit post-function exception information.
4166   ///
4167   void EndFunction() {
4168     if (shouldEmitMoves || shouldEmitTable) {
4169       EmitLabel("eh_func_end", SubprogramCount);
4170       EmitExceptionTable();
4171
4172       // Save EH frame information
4173       EHFrames.
4174         push_back(FunctionEHFrameInfo(getAsm()->getCurrentFunctionEHName(MF),
4175                                     SubprogramCount,
4176                                     MMI->getPersonalityIndex(),
4177                                     MF->getFrameInfo()->hasCalls(),
4178                                     !MMI->getLandingPads().empty(),
4179                                     MMI->getFrameMoves(),
4180                                     MF->getFunction()));
4181       }
4182   }
4183 };
4184
4185 } // End of namespace llvm
4186
4187 //===----------------------------------------------------------------------===//
4188
4189 /// Emit - Print the abbreviation using the specified Dwarf writer.
4190 ///
4191 void DIEAbbrev::Emit(const DwarfDebug &DD) const {
4192   // Emit its Dwarf tag type.
4193   DD.getAsm()->EmitULEB128Bytes(Tag);
4194   DD.getAsm()->EOL(TagString(Tag));
4195
4196   // Emit whether it has children DIEs.
4197   DD.getAsm()->EmitULEB128Bytes(ChildrenFlag);
4198   DD.getAsm()->EOL(ChildrenString(ChildrenFlag));
4199
4200   // For each attribute description.
4201   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
4202     const DIEAbbrevData &AttrData = Data[i];
4203
4204     // Emit attribute type.
4205     DD.getAsm()->EmitULEB128Bytes(AttrData.getAttribute());
4206     DD.getAsm()->EOL(AttributeString(AttrData.getAttribute()));
4207
4208     // Emit form type.
4209     DD.getAsm()->EmitULEB128Bytes(AttrData.getForm());
4210     DD.getAsm()->EOL(FormEncodingString(AttrData.getForm()));
4211   }
4212
4213   // Mark end of abbreviation.
4214   DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(1)");
4215   DD.getAsm()->EmitULEB128Bytes(0); DD.getAsm()->EOL("EOM(2)");
4216 }
4217
4218 #ifndef NDEBUG
4219 void DIEAbbrev::print(std::ostream &O) {
4220   O << "Abbreviation @"
4221     << std::hex << (intptr_t)this << std::dec
4222     << "  "
4223     << TagString(Tag)
4224     << " "
4225     << ChildrenString(ChildrenFlag)
4226     << "\n";
4227
4228   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
4229     O << "  "
4230       << AttributeString(Data[i].getAttribute())
4231       << "  "
4232       << FormEncodingString(Data[i].getForm())
4233       << "\n";
4234   }
4235 }
4236 void DIEAbbrev::dump() { print(cerr); }
4237 #endif
4238
4239 //===----------------------------------------------------------------------===//
4240
4241 #ifndef NDEBUG
4242 void DIEValue::dump() {
4243   print(cerr);
4244 }
4245 #endif
4246
4247 //===----------------------------------------------------------------------===//
4248
4249 /// EmitValue - Emit integer of appropriate size.
4250 ///
4251 void DIEInteger::EmitValue(DwarfDebug &DD, unsigned Form) {
4252   switch (Form) {
4253   case DW_FORM_flag:  // Fall thru
4254   case DW_FORM_ref1:  // Fall thru
4255   case DW_FORM_data1: DD.getAsm()->EmitInt8(Integer);         break;
4256   case DW_FORM_ref2:  // Fall thru
4257   case DW_FORM_data2: DD.getAsm()->EmitInt16(Integer);        break;
4258   case DW_FORM_ref4:  // Fall thru
4259   case DW_FORM_data4: DD.getAsm()->EmitInt32(Integer);        break;
4260   case DW_FORM_ref8:  // Fall thru
4261   case DW_FORM_data8: DD.getAsm()->EmitInt64(Integer);        break;
4262   case DW_FORM_udata: DD.getAsm()->EmitULEB128Bytes(Integer); break;
4263   case DW_FORM_sdata: DD.getAsm()->EmitSLEB128Bytes(Integer); break;
4264   default: assert(0 && "DIE Value form not supported yet");   break;
4265   }
4266 }
4267
4268 /// SizeOf - Determine size of integer value in bytes.
4269 ///
4270 unsigned DIEInteger::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4271   switch (Form) {
4272   case DW_FORM_flag:  // Fall thru
4273   case DW_FORM_ref1:  // Fall thru
4274   case DW_FORM_data1: return sizeof(int8_t);
4275   case DW_FORM_ref2:  // Fall thru
4276   case DW_FORM_data2: return sizeof(int16_t);
4277   case DW_FORM_ref4:  // Fall thru
4278   case DW_FORM_data4: return sizeof(int32_t);
4279   case DW_FORM_ref8:  // Fall thru
4280   case DW_FORM_data8: return sizeof(int64_t);
4281   case DW_FORM_udata: return TargetAsmInfo::getULEB128Size(Integer);
4282   case DW_FORM_sdata: return TargetAsmInfo::getSLEB128Size(Integer);
4283   default: assert(0 && "DIE Value form not supported yet"); break;
4284   }
4285   return 0;
4286 }
4287
4288 //===----------------------------------------------------------------------===//
4289
4290 /// EmitValue - Emit string value.
4291 ///
4292 void DIEString::EmitValue(DwarfDebug &DD, unsigned Form) {
4293   DD.getAsm()->EmitString(String);
4294 }
4295
4296 //===----------------------------------------------------------------------===//
4297
4298 /// EmitValue - Emit label value.
4299 ///
4300 void DIEDwarfLabel::EmitValue(DwarfDebug &DD, unsigned Form) {
4301   bool IsSmall = Form == DW_FORM_data4;
4302   DD.EmitReference(Label, false, IsSmall);
4303 }
4304
4305 /// SizeOf - Determine size of label value in bytes.
4306 ///
4307 unsigned DIEDwarfLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4308   if (Form == DW_FORM_data4) return 4;
4309   return DD.getTargetData()->getPointerSize();
4310 }
4311
4312 //===----------------------------------------------------------------------===//
4313
4314 /// EmitValue - Emit label value.
4315 ///
4316 void DIEObjectLabel::EmitValue(DwarfDebug &DD, unsigned Form) {
4317   bool IsSmall = Form == DW_FORM_data4;
4318   DD.EmitReference(Label, false, IsSmall);
4319 }
4320
4321 /// SizeOf - Determine size of label value in bytes.
4322 ///
4323 unsigned DIEObjectLabel::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4324   if (Form == DW_FORM_data4) return 4;
4325   return DD.getTargetData()->getPointerSize();
4326 }
4327
4328 //===----------------------------------------------------------------------===//
4329
4330 /// EmitValue - Emit delta value.
4331 ///
4332 void DIESectionOffset::EmitValue(DwarfDebug &DD, unsigned Form) {
4333   bool IsSmall = Form == DW_FORM_data4;
4334   DD.EmitSectionOffset(Label.Tag, Section.Tag,
4335                        Label.Number, Section.Number, IsSmall, IsEH, UseSet);
4336 }
4337
4338 /// SizeOf - Determine size of delta value in bytes.
4339 ///
4340 unsigned DIESectionOffset::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4341   if (Form == DW_FORM_data4) return 4;
4342   return DD.getTargetData()->getPointerSize();
4343 }
4344
4345 //===----------------------------------------------------------------------===//
4346
4347 /// EmitValue - Emit delta value.
4348 ///
4349 void DIEDelta::EmitValue(DwarfDebug &DD, unsigned Form) {
4350   bool IsSmall = Form == DW_FORM_data4;
4351   DD.EmitDifference(LabelHi, LabelLo, IsSmall);
4352 }
4353
4354 /// SizeOf - Determine size of delta value in bytes.
4355 ///
4356 unsigned DIEDelta::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4357   if (Form == DW_FORM_data4) return 4;
4358   return DD.getTargetData()->getPointerSize();
4359 }
4360
4361 //===----------------------------------------------------------------------===//
4362
4363 /// EmitValue - Emit debug information entry offset.
4364 ///
4365 void DIEntry::EmitValue(DwarfDebug &DD, unsigned Form) {
4366   DD.getAsm()->EmitInt32(Entry->getOffset());
4367 }
4368
4369 //===----------------------------------------------------------------------===//
4370
4371 /// ComputeSize - calculate the size of the block.
4372 ///
4373 unsigned DIEBlock::ComputeSize(DwarfDebug &DD) {
4374   if (!Size) {
4375     const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
4376
4377     for (unsigned i = 0, N = Values.size(); i < N; ++i) {
4378       Size += Values[i]->SizeOf(DD, AbbrevData[i].getForm());
4379     }
4380   }
4381   return Size;
4382 }
4383
4384 /// EmitValue - Emit block data.
4385 ///
4386 void DIEBlock::EmitValue(DwarfDebug &DD, unsigned Form) {
4387   switch (Form) {
4388   case DW_FORM_block1: DD.getAsm()->EmitInt8(Size);         break;
4389   case DW_FORM_block2: DD.getAsm()->EmitInt16(Size);        break;
4390   case DW_FORM_block4: DD.getAsm()->EmitInt32(Size);        break;
4391   case DW_FORM_block:  DD.getAsm()->EmitULEB128Bytes(Size); break;
4392   default: assert(0 && "Improper form for block");          break;
4393   }
4394
4395   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
4396
4397   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
4398     DD.getAsm()->EOL();
4399     Values[i]->EmitValue(DD, AbbrevData[i].getForm());
4400   }
4401 }
4402
4403 /// SizeOf - Determine size of block data in bytes.
4404 ///
4405 unsigned DIEBlock::SizeOf(const DwarfDebug &DD, unsigned Form) const {
4406   switch (Form) {
4407   case DW_FORM_block1: return Size + sizeof(int8_t);
4408   case DW_FORM_block2: return Size + sizeof(int16_t);
4409   case DW_FORM_block4: return Size + sizeof(int32_t);
4410   case DW_FORM_block: return Size + TargetAsmInfo::getULEB128Size(Size);
4411   default: assert(0 && "Improper form for block"); break;
4412   }
4413   return 0;
4414 }
4415
4416 //===----------------------------------------------------------------------===//
4417 /// DIE Implementation
4418
4419 DIE::~DIE() {
4420   for (unsigned i = 0, N = Children.size(); i < N; ++i)
4421     delete Children[i];
4422 }
4423
4424 /// AddSiblingOffset - Add a sibling offset field to the front of the DIE.
4425 ///
4426 void DIE::AddSiblingOffset() {
4427   DIEInteger *DI = new DIEInteger(0);
4428   Values.insert(Values.begin(), DI);
4429   Abbrev.AddFirstAttribute(DW_AT_sibling, DW_FORM_ref4);
4430 }
4431
4432 /// Profile - Used to gather unique data for the value folding set.
4433 ///
4434 void DIE::Profile(FoldingSetNodeID &ID) {
4435   Abbrev.Profile(ID);
4436
4437   for (unsigned i = 0, N = Children.size(); i < N; ++i)
4438     ID.AddPointer(Children[i]);
4439
4440   for (unsigned j = 0, M = Values.size(); j < M; ++j)
4441     ID.AddPointer(Values[j]);
4442 }
4443
4444 #ifndef NDEBUG
4445 void DIE::print(std::ostream &O, unsigned IncIndent) {
4446   static unsigned IndentCount = 0;
4447   IndentCount += IncIndent;
4448   const std::string Indent(IndentCount, ' ');
4449   bool isBlock = Abbrev.getTag() == 0;
4450
4451   if (!isBlock) {
4452     O << Indent
4453       << "Die: "
4454       << "0x" << std::hex << (intptr_t)this << std::dec
4455       << ", Offset: " << Offset
4456       << ", Size: " << Size
4457       << "\n";
4458
4459     O << Indent
4460       << TagString(Abbrev.getTag())
4461       << " "
4462       << ChildrenString(Abbrev.getChildrenFlag());
4463   } else {
4464     O << "Size: " << Size;
4465   }
4466   O << "\n";
4467
4468   const SmallVector<DIEAbbrevData, 8> &Data = Abbrev.getData();
4469
4470   IndentCount += 2;
4471   for (unsigned i = 0, N = Data.size(); i < N; ++i) {
4472     O << Indent;
4473
4474     if (!isBlock)
4475       O << AttributeString(Data[i].getAttribute());
4476     else
4477       O << "Blk[" << i << "]";
4478
4479     O <<  "  "
4480       << FormEncodingString(Data[i].getForm())
4481       << " ";
4482     Values[i]->print(O);
4483     O << "\n";
4484   }
4485   IndentCount -= 2;
4486
4487   for (unsigned j = 0, M = Children.size(); j < M; ++j) {
4488     Children[j]->print(O, 4);
4489   }
4490
4491   if (!isBlock) O << "\n";
4492   IndentCount -= IncIndent;
4493 }
4494
4495 void DIE::dump() {
4496   print(cerr);
4497 }
4498 #endif
4499
4500 //===----------------------------------------------------------------------===//
4501 /// DwarfWriter Implementation
4502 ///
4503
4504 DwarfWriter::DwarfWriter(raw_ostream &OS, AsmPrinter *A,
4505                          const TargetAsmInfo *T) {
4506   DE = new DwarfException(OS, A, T);
4507   DD = new DwarfDebug(OS, A, T);
4508 }
4509
4510 DwarfWriter::~DwarfWriter() {
4511   delete DE;
4512   delete DD;
4513 }
4514
4515 /// SetModuleInfo - Set machine module info when it's known that pass manager
4516 /// has created it.  Set by the target AsmPrinter.
4517 void DwarfWriter::SetModuleInfo(MachineModuleInfo *MMI) {
4518   DD->SetModuleInfo(MMI);
4519   DE->SetModuleInfo(MMI);
4520 }
4521
4522 /// BeginModule - Emit all Dwarf sections that should come prior to the
4523 /// content.
4524 void DwarfWriter::BeginModule(Module *M) {
4525   DE->BeginModule(M);
4526   DD->BeginModule(M);
4527 }
4528
4529 /// EndModule - Emit all Dwarf sections that should come after the content.
4530 ///
4531 void DwarfWriter::EndModule() {
4532   DE->EndModule();
4533   DD->EndModule();
4534 }
4535
4536 /// BeginFunction - Gather pre-function debug information.  Assumes being
4537 /// emitted immediately after the function entry point.
4538 void DwarfWriter::BeginFunction(MachineFunction *MF) {
4539   DE->BeginFunction(MF);
4540   DD->BeginFunction(MF);
4541 }
4542
4543 /// EndFunction - Gather and emit post-function debug information.
4544 ///
4545 void DwarfWriter::EndFunction(MachineFunction *MF) {
4546   DD->EndFunction(MF);
4547   DE->EndFunction();
4548
4549   if (MachineModuleInfo *MMI = DD->getMMI() ? DD->getMMI() : DE->getMMI())
4550     // Clear function debug information.
4551     MMI->EndFunction();
4552 }