Only add DW_AT_prototyped if we're working with a C-like language.
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfCompileUnit.cpp
1 //===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
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 compile unit.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "dwarfdebug"
15
16 #include "DwarfAccelTable.h"
17 #include "DwarfCompileUnit.h"
18 #include "DwarfDebug.h"
19 #include "llvm/Constants.h"
20 #include "llvm/GlobalVariable.h"
21 #include "llvm/Instructions.h"
22 #include "llvm/Analysis/DIBuilder.h"
23 #include "llvm/Support/Debug.h"
24 #include "llvm/Target/Mangler.h"
25 #include "llvm/Target/TargetData.h"
26 #include "llvm/Target/TargetFrameLowering.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/Target/TargetRegisterInfo.h"
29 #include "llvm/ADT/APFloat.h"
30 #include "llvm/Support/ErrorHandling.h"
31
32 using namespace llvm;
33
34 /// CompileUnit - Compile unit constructor.
35 CompileUnit::CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A,
36                          DwarfDebug *DW)
37   : ID(I), Language(L), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
38   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
39 }
40
41 /// ~CompileUnit - Destructor for compile unit.
42 CompileUnit::~CompileUnit() {
43   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
44     DIEBlocks[j]->~DIEBlock();
45 }
46
47 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
48 /// information entry.
49 DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
50   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
51   return Value;
52 }
53
54 /// addUInt - Add an unsigned integer attribute data and value.
55 ///
56 void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
57                           unsigned Form, uint64_t Integer) {
58   if (!Form) Form = DIEInteger::BestForm(false, Integer);
59   DIEValue *Value = Integer == 1 ?
60     DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
61   Die->addValue(Attribute, Form, Value);
62 }
63
64 /// addSInt - Add an signed integer attribute data and value.
65 ///
66 void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
67                           unsigned Form, int64_t Integer) {
68   if (!Form) Form = DIEInteger::BestForm(true, Integer);
69   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
70   Die->addValue(Attribute, Form, Value);
71 }
72
73 /// addString - Add a string attribute data and value. We always emit a
74 /// reference to the string pool instead of immediate strings so that DIEs have
75 /// more predictable sizes.
76 void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
77   MCSymbol *Symb = DD->getStringPoolEntry(String);
78   DIEValue *Value;
79   if (Asm->needsRelocationsForDwarfStringPool())
80     Value = new (DIEValueAllocator) DIELabel(Symb);
81   else {
82     MCSymbol *StringPool = DD->getStringPool();
83     Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
84   }
85   Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
86 }
87
88 /// addLabel - Add a Dwarf label attribute data and value.
89 ///
90 void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
91                            const MCSymbol *Label) {
92   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
93   Die->addValue(Attribute, Form, Value);
94 }
95
96 /// addDelta - Add a label delta attribute data and value.
97 ///
98 void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
99                            const MCSymbol *Hi, const MCSymbol *Lo) {
100   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
101   Die->addValue(Attribute, Form, Value);
102 }
103
104 /// addDIEEntry - Add a DIE attribute data and value.
105 ///
106 void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
107                               DIE *Entry) {
108   Die->addValue(Attribute, Form, createDIEEntry(Entry));
109 }
110
111 /// addBlock - Add block data.
112 ///
113 void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
114                            DIEBlock *Block) {
115   Block->ComputeSize(Asm);
116   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
117   Die->addValue(Attribute, Block->BestForm(), Block);
118 }
119
120 /// addSourceLine - Add location information to specified debug information
121 /// entry.
122 void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
123   // Verify variable.
124   if (!V.Verify())
125     return;
126   
127   unsigned Line = V.getLineNumber();
128   if (Line == 0)
129     return;
130   unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
131                                             V.getContext().getDirectory());
132   assert(FileID && "Invalid file id");
133   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
134   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
135 }
136
137 /// addSourceLine - Add location information to specified debug information
138 /// entry.
139 void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
140   // Verify global variable.
141   if (!G.Verify())
142     return;
143
144   unsigned Line = G.getLineNumber();
145   if (Line == 0)
146     return;
147   unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
148   assert(FileID && "Invalid file id");
149   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
150   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
151 }
152
153 /// addSourceLine - Add location information to specified debug information
154 /// entry.
155 void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
156   // Verify subprogram.
157   if (!SP.Verify())
158     return;
159   // If the line number is 0, don't add it.
160   if (SP.getLineNumber() == 0)
161     return;
162
163   unsigned Line = SP.getLineNumber();
164   if (!SP.getContext().Verify())
165     return;
166   unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
167                                             SP.getDirectory());
168   assert(FileID && "Invalid file id");
169   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
170   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
171 }
172
173 /// addSourceLine - Add location information to specified debug information
174 /// entry.
175 void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
176   // Verify type.
177   if (!Ty.Verify())
178     return;
179
180   unsigned Line = Ty.getLineNumber();
181   if (Line == 0 || !Ty.getContext().Verify())
182     return;
183   unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
184                                             Ty.getDirectory());
185   assert(FileID && "Invalid file id");
186   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
187   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
188 }
189
190 /// addSourceLine - Add location information to specified debug information
191 /// entry.
192 void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
193   // Verify namespace.
194   if (!NS.Verify())
195     return;
196
197   unsigned Line = NS.getLineNumber();
198   if (Line == 0)
199     return;
200   StringRef FN = NS.getFilename();
201
202   unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
203   assert(FileID && "Invalid file id");
204   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
205   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
206 }
207
208 /// addVariableAddress - Add DW_AT_location attribute for a 
209 /// DbgVariable based on provided MachineLocation.
210 void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die, 
211                                      MachineLocation Location) {
212   if (DV->variableHasComplexAddress())
213     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
214   else if (DV->isBlockByrefVariable())
215     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
216   else
217     addAddress(Die, dwarf::DW_AT_location, Location);
218 }
219
220 /// addRegisterOp - Add register operand.
221 void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
222   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
223   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
224   if (DWReg < 32)
225     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
226   else {
227     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
228     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
229   }
230 }
231
232 /// addRegisterOffset - Add register offset.
233 void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
234                                     int64_t Offset) {
235   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
236   unsigned DWReg = RI->getDwarfRegNum(Reg, false);
237   const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
238   if (Reg == TRI->getFrameRegister(*Asm->MF))
239     // If variable offset is based in frame register then use fbreg.
240     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
241   else if (DWReg < 32)
242     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
243   else {
244     addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
245     addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
246   }
247   addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
248 }
249
250 /// addAddress - Add an address attribute to a die based on the location
251 /// provided.
252 void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
253                              const MachineLocation &Location) {
254   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
255
256   if (Location.isReg())
257     addRegisterOp(Block, Location.getReg());
258   else
259     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
260
261   // Now attach the location information to the DIE.
262   addBlock(Die, Attribute, 0, Block);
263 }
264
265 /// addComplexAddress - Start with the address based on the location provided,
266 /// and generate the DWARF information necessary to find the actual variable
267 /// given the extra address information encoded in the DIVariable, starting from
268 /// the starting location.  Add the DWARF information to the die.
269 ///
270 void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
271                                     unsigned Attribute,
272                                     const MachineLocation &Location) {
273   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
274   unsigned N = DV->getNumAddrElements();
275   unsigned i = 0;
276   if (Location.isReg()) {
277     if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
278       // If first address element is OpPlus then emit
279       // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
280       addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
281       i = 2;
282     } else
283       addRegisterOp(Block, Location.getReg());
284   }
285   else
286     addRegisterOffset(Block, Location.getReg(), Location.getOffset());
287
288   for (;i < N; ++i) {
289     uint64_t Element = DV->getAddrElement(i);
290     if (Element == DIBuilder::OpPlus) {
291       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
292       addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
293     } else if (Element == DIBuilder::OpDeref) {
294       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
295     } else llvm_unreachable("unknown DIBuilder Opcode");
296   }
297
298   // Now attach the location information to the DIE.
299   addBlock(Die, Attribute, 0, Block);
300 }
301
302 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
303    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
304    gives the variable VarName either the struct, or a pointer to the struct, as
305    its type.  This is necessary for various behind-the-scenes things the
306    compiler needs to do with by-reference variables in Blocks.
307
308    However, as far as the original *programmer* is concerned, the variable
309    should still have type 'SomeType', as originally declared.
310
311    The function getBlockByrefType dives into the __Block_byref_x_VarName
312    struct to find the original type of the variable, which is then assigned to
313    the variable's Debug Information Entry as its real type.  So far, so good.
314    However now the debugger will expect the variable VarName to have the type
315    SomeType.  So we need the location attribute for the variable to be an
316    expression that explains to the debugger how to navigate through the
317    pointers and struct to find the actual variable of type SomeType.
318
319    The following function does just that.  We start by getting
320    the "normal" location for the variable. This will be the location
321    of either the struct __Block_byref_x_VarName or the pointer to the
322    struct __Block_byref_x_VarName.
323
324    The struct will look something like:
325
326    struct __Block_byref_x_VarName {
327      ... <various fields>
328      struct __Block_byref_x_VarName *forwarding;
329      ... <various other fields>
330      SomeType VarName;
331      ... <maybe more fields>
332    };
333
334    If we are given the struct directly (as our starting point) we
335    need to tell the debugger to:
336
337    1).  Add the offset of the forwarding field.
338
339    2).  Follow that pointer to get the real __Block_byref_x_VarName
340    struct to use (the real one may have been copied onto the heap).
341
342    3).  Add the offset for the field VarName, to find the actual variable.
343
344    If we started with a pointer to the struct, then we need to
345    dereference that pointer first, before the other steps.
346    Translating this into DWARF ops, we will need to append the following
347    to the current location description for the variable:
348
349    DW_OP_deref                    -- optional, if we start with a pointer
350    DW_OP_plus_uconst <forward_fld_offset>
351    DW_OP_deref
352    DW_OP_plus_uconst <varName_fld_offset>
353
354    That is what this function does.  */
355
356 /// addBlockByrefAddress - Start with the address based on the location
357 /// provided, and generate the DWARF information necessary to find the
358 /// actual Block variable (navigating the Block struct) based on the
359 /// starting location.  Add the DWARF information to the die.  For
360 /// more information, read large comment just above here.
361 ///
362 void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
363                                        unsigned Attribute,
364                                        const MachineLocation &Location) {
365   DIType Ty = DV->getType();
366   DIType TmpTy = Ty;
367   unsigned Tag = Ty.getTag();
368   bool isPointer = false;
369
370   StringRef varName = DV->getName();
371
372   if (Tag == dwarf::DW_TAG_pointer_type) {
373     DIDerivedType DTy = DIDerivedType(Ty);
374     TmpTy = DTy.getTypeDerivedFrom();
375     isPointer = true;
376   }
377
378   DICompositeType blockStruct = DICompositeType(TmpTy);
379
380   // Find the __forwarding field and the variable field in the __Block_byref
381   // struct.
382   DIArray Fields = blockStruct.getTypeArray();
383   DIDescriptor varField = DIDescriptor();
384   DIDescriptor forwardingField = DIDescriptor();
385
386   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
387     DIDescriptor Element = Fields.getElement(i);
388     DIDerivedType DT = DIDerivedType(Element);
389     StringRef fieldName = DT.getName();
390     if (fieldName == "__forwarding")
391       forwardingField = Element;
392     else if (fieldName == varName)
393       varField = Element;
394   }
395
396   // Get the offsets for the forwarding field and the variable field.
397   unsigned forwardingFieldOffset =
398     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
399   unsigned varFieldOffset =
400     DIDerivedType(varField).getOffsetInBits() >> 3;
401
402   // Decode the original location, and use that as the start of the byref
403   // variable's location.
404   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
405   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
406   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
407
408   if (Location.isReg()) {
409     if (Reg < 32)
410       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
411     else {
412       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
413       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
414     }
415   } else {
416     if (Reg < 32)
417       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
418     else {
419       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
420       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
421     }
422
423     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
424   }
425
426   // If we started with a pointer to the __Block_byref... struct, then
427   // the first thing we need to do is dereference the pointer (DW_OP_deref).
428   if (isPointer)
429     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
430
431   // Next add the offset for the '__forwarding' field:
432   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
433   // adding the offset if it's 0.
434   if (forwardingFieldOffset > 0) {
435     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
436     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
437   }
438
439   // Now dereference the __forwarding field to get to the real __Block_byref
440   // struct:  DW_OP_deref.
441   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
442
443   // Now that we've got the real __Block_byref... struct, add the offset
444   // for the variable's field to get to the location of the actual variable:
445   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
446   if (varFieldOffset > 0) {
447     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
448     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
449   }
450
451   // Now attach the location information to the DIE.
452   addBlock(Die, Attribute, 0, Block);
453 }
454
455 /// isTypeSigned - Return true if the type is signed.
456 static bool isTypeSigned(DIType Ty, int *SizeInBits) {
457   if (Ty.isDerivedType())
458     return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
459   if (Ty.isBasicType())
460     if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
461         || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
462       *SizeInBits = Ty.getSizeInBits();
463       return true;
464     }
465   return false;
466 }
467
468 /// addConstantValue - Add constant value entry in variable DIE.
469 bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
470                                    DIType Ty) {
471   assert(MO.isImm() && "Invalid machine operand!");
472   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
473   int SizeInBits = -1;
474   bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
475   unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
476   switch (SizeInBits) {
477     case 8:  Form = dwarf::DW_FORM_data1; break;
478     case 16: Form = dwarf::DW_FORM_data2; break;
479     case 32: Form = dwarf::DW_FORM_data4; break;
480     case 64: Form = dwarf::DW_FORM_data8; break;
481     default: break;
482   }
483   SignedConstant ? addSInt(Block, 0, Form, MO.getImm()) 
484     : addUInt(Block, 0, Form, MO.getImm());
485
486   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
487   return true;
488 }
489
490 /// addConstantFPValue - Add constant value entry in variable DIE.
491 bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
492   assert (MO.isFPImm() && "Invalid machine operand!");
493   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
494   APFloat FPImm = MO.getFPImm()->getValueAPF();
495
496   // Get the raw data form of the floating point.
497   const APInt FltVal = FPImm.bitcastToAPInt();
498   const char *FltPtr = (const char*)FltVal.getRawData();
499
500   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
501   bool LittleEndian = Asm->getTargetData().isLittleEndian();
502   int Incr = (LittleEndian ? 1 : -1);
503   int Start = (LittleEndian ? 0 : NumBytes - 1);
504   int Stop = (LittleEndian ? NumBytes : -1);
505
506   // Output the constant to DWARF one byte at a time.
507   for (; Start != Stop; Start += Incr)
508     addUInt(Block, 0, dwarf::DW_FORM_data1,
509             (unsigned char)0xFF & FltPtr[Start]);
510
511   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
512   return true;
513 }
514
515 /// addConstantValue - Add constant value entry in variable DIE.
516 bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
517                                    bool Unsigned) {
518   unsigned CIBitWidth = CI->getBitWidth();
519   if (CIBitWidth <= 64) {
520     unsigned form = 0;
521     switch (CIBitWidth) {
522     case 8: form = dwarf::DW_FORM_data1; break;
523     case 16: form = dwarf::DW_FORM_data2; break;
524     case 32: form = dwarf::DW_FORM_data4; break;
525     case 64: form = dwarf::DW_FORM_data8; break;
526     default: 
527       form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
528     }
529     if (Unsigned)
530       addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
531     else
532       addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
533     return true;
534   }
535
536   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
537
538   // Get the raw data form of the large APInt.
539   const APInt Val = CI->getValue();
540   const uint64_t *Ptr64 = Val.getRawData();
541
542   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
543   bool LittleEndian = Asm->getTargetData().isLittleEndian();
544
545   // Output the constant to DWARF one byte at a time.
546   for (int i = 0; i < NumBytes; i++) {
547     uint8_t c;
548     if (LittleEndian)
549       c = Ptr64[i / 8] >> (8 * (i & 7));
550     else
551       c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
552     addUInt(Block, 0, dwarf::DW_FORM_data1, c);
553   }
554
555   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
556   return true;
557 }
558
559 /// addTemplateParams - Add template parameters in buffer.
560 void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
561   // Add template parameters.
562   for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
563     DIDescriptor Element = TParams.getElement(i);
564     if (Element.isTemplateTypeParameter())
565       Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
566                         DITemplateTypeParameter(Element)));
567     else if (Element.isTemplateValueParameter())
568       Buffer.addChild(getOrCreateTemplateValueParameterDIE(
569                         DITemplateValueParameter(Element)));
570   }
571 }
572
573 /// addToContextOwner - Add Die into the list of its context owner's children.
574 void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
575   if (Context.isType()) {
576     DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
577     ContextDIE->addChild(Die);
578   } else if (Context.isNameSpace()) {
579     DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
580     ContextDIE->addChild(Die);
581   } else if (Context.isSubprogram()) {
582     DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
583     ContextDIE->addChild(Die);
584   } else if (DIE *ContextDIE = getDIE(Context))
585     ContextDIE->addChild(Die);
586   else
587     addDie(Die);
588 }
589
590 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
591 /// given DIType.
592 DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
593   DIType Ty(TyNode);
594   if (!Ty.Verify())
595     return NULL;
596   DIE *TyDIE = getDIE(Ty);
597   if (TyDIE)
598     return TyDIE;
599
600   // Create new type.
601   TyDIE = new DIE(dwarf::DW_TAG_base_type);
602   insertDIE(Ty, TyDIE);
603   if (Ty.isBasicType())
604     constructTypeDIE(*TyDIE, DIBasicType(Ty));
605   else if (Ty.isCompositeType())
606     constructTypeDIE(*TyDIE, DICompositeType(Ty));
607   else {
608     assert(Ty.isDerivedType() && "Unknown kind of DIType");
609     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
610   }
611   // If this is a named finished type then include it in the list of types
612   // for the accelerator tables.
613   if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
614     bool IsImplementation = 0;
615     if (Ty.isCompositeType()) {
616       DICompositeType CT(Ty);
617       // A runtime language of 0 actually means C/C++ and that any
618       // non-negative value is some version of Objective-C/C++.
619       IsImplementation = (CT.getRunTimeLang() == 0) ||
620         CT.isObjcClassComplete();
621     }
622     unsigned Flags = IsImplementation ?
623                      DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
624     addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
625   }
626   
627   addToContextOwner(TyDIE, Ty.getContext());
628   return TyDIE;
629 }
630
631 /// addType - Add a new type attribute to the specified entity.
632 void CompileUnit::addType(DIE *Entity, DIType Ty) {
633   if (!Ty.Verify())
634     return;
635
636   // Check for pre-existence.
637   DIEEntry *Entry = getDIEEntry(Ty);
638   // If it exists then use the existing value.
639   if (Entry) {
640     Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
641     return;
642   }
643
644   // Construct type.
645   DIE *Buffer = getOrCreateTypeDIE(Ty);
646
647   // Set up proxy.
648   Entry = createDIEEntry(Buffer);
649   insertDIEEntry(Ty, Entry);
650   Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
651
652   // If this is a complete composite type then include it in the
653   // list of global types.
654   addGlobalType(Ty);
655 }
656
657 /// addGlobalType - Add a new global type to the compile unit.
658 ///
659 void CompileUnit::addGlobalType(DIType Ty) {
660   DIDescriptor Context = Ty.getContext();
661   if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl() 
662       && (!Context || Context.isCompileUnit() || Context.isFile() 
663           || Context.isNameSpace()))
664     if (DIEEntry *Entry = getDIEEntry(Ty))
665       GlobalTypes[Ty.getName()] = Entry->getEntry();
666 }
667
668 /// addPubTypes - Add type for pubtypes section.
669 void CompileUnit::addPubTypes(DISubprogram SP) {
670   DICompositeType SPTy = SP.getType();
671   unsigned SPTag = SPTy.getTag();
672   if (SPTag != dwarf::DW_TAG_subroutine_type)
673     return;
674
675   DIArray Args = SPTy.getTypeArray();
676   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
677     DIType ATy(Args.getElement(i));
678     if (!ATy.Verify())
679       continue;
680     addGlobalType(ATy);
681   }
682 }
683
684 /// constructTypeDIE - Construct basic type die from DIBasicType.
685 void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
686   // Get core information.
687   StringRef Name = BTy.getName();
688   // Add name if not anonymous or intermediate type.
689   if (!Name.empty())
690     addString(&Buffer, dwarf::DW_AT_name, Name);
691
692   if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
693     Buffer.setTag(dwarf::DW_TAG_unspecified_type);
694     // Unspecified types has only name, nothing else.
695     return;
696   }
697
698   Buffer.setTag(dwarf::DW_TAG_base_type);
699   addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
700           BTy.getEncoding());
701
702   uint64_t Size = BTy.getSizeInBits() >> 3;
703   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
704 }
705
706 /// constructTypeDIE - Construct derived type die from DIDerivedType.
707 void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
708   // Get core information.
709   StringRef Name = DTy.getName();
710   uint64_t Size = DTy.getSizeInBits() >> 3;
711   unsigned Tag = DTy.getTag();
712
713   // FIXME - Workaround for templates.
714   if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
715
716   Buffer.setTag(Tag);
717
718   // Map to main type, void will not have a type.
719   DIType FromTy = DTy.getTypeDerivedFrom();
720   addType(&Buffer, FromTy);
721
722   // Add name if not anonymous or intermediate type.
723   if (!Name.empty())
724     addString(&Buffer, dwarf::DW_AT_name, Name);
725
726   // Add size if non-zero (derived types might be zero-sized.)
727   if (Size && Tag != dwarf::DW_TAG_pointer_type)
728     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
729
730   // Add source line info if available and TyDesc is not a forward declaration.
731   if (!DTy.isForwardDecl())
732     addSourceLine(&Buffer, DTy);
733 }
734
735 /// constructTypeDIE - Construct type DIE from DICompositeType.
736 void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
737   // Get core information.
738   StringRef Name = CTy.getName();
739
740   uint64_t Size = CTy.getSizeInBits() >> 3;
741   unsigned Tag = CTy.getTag();
742   Buffer.setTag(Tag);
743
744   switch (Tag) {
745   case dwarf::DW_TAG_vector_type:
746   case dwarf::DW_TAG_array_type:
747     constructArrayTypeDIE(Buffer, &CTy);
748     break;
749   case dwarf::DW_TAG_enumeration_type: {
750     DIArray Elements = CTy.getTypeArray();
751
752     // Add enumerators to enumeration type.
753     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
754       DIE *ElemDie = NULL;
755       DIDescriptor Enum(Elements.getElement(i));
756       if (Enum.isEnumerator()) {
757         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
758         Buffer.addChild(ElemDie);
759       }
760     }
761   }
762     break;
763   case dwarf::DW_TAG_subroutine_type: {
764     // Add return type.
765     DIArray Elements = CTy.getTypeArray();
766     DIDescriptor RTy = Elements.getElement(0);
767     addType(&Buffer, DIType(RTy));
768
769     bool isPrototyped = true;
770     // Add arguments.
771     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
772       DIDescriptor Ty = Elements.getElement(i);
773       if (Ty.isUnspecifiedParameter()) {
774         DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
775         Buffer.addChild(Arg);
776         isPrototyped = false;
777       } else {
778         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
779         addType(Arg, DIType(Ty));
780         Buffer.addChild(Arg);
781       }
782     }
783     // Add prototype flag if we're dealing with a C language and the
784     // function has been prototyped.
785     if (isPrototyped &&
786         (Language == dwarf::DW_LANG_C89 ||
787          Language == dwarf::DW_LANG_C99 ||
788          Language == dwarf::DW_LANG_ObjC))
789       addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
790   }
791     break;
792   case dwarf::DW_TAG_structure_type:
793   case dwarf::DW_TAG_union_type:
794   case dwarf::DW_TAG_class_type: {
795     // Add elements to structure type.
796     DIArray Elements = CTy.getTypeArray();
797
798     // A forward struct declared type may not have elements available.
799     unsigned N = Elements.getNumElements();
800     if (N == 0)
801       break;
802
803     // Add elements to structure type.
804     for (unsigned i = 0; i < N; ++i) {
805       DIDescriptor Element = Elements.getElement(i);
806       DIE *ElemDie = NULL;
807       if (Element.isSubprogram()) {
808         DISubprogram SP(Element);
809         ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
810         if (SP.isProtected())
811           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
812                   dwarf::DW_ACCESS_protected);
813         else if (SP.isPrivate())
814           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
815                   dwarf::DW_ACCESS_private);
816         else 
817           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
818             dwarf::DW_ACCESS_public);
819         if (SP.isExplicit())
820           addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
821       }
822       else if (Element.isVariable()) {
823         DIVariable DV(Element);
824         ElemDie = new DIE(dwarf::DW_TAG_variable);
825         addString(ElemDie, dwarf::DW_AT_name, DV.getName());
826         addType(ElemDie, DV.getType());
827         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
828         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
829         addSourceLine(ElemDie, DV);
830       } else if (Element.isDerivedType())
831         ElemDie = createMemberDIE(DIDerivedType(Element));
832       else if (Element.isObjCProperty()) {
833         DIObjCProperty Property(Element);
834         ElemDie = new DIE(Property.getTag());
835         StringRef PropertyName = Property.getObjCPropertyName();
836         addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
837         StringRef GetterName = Property.getObjCPropertyGetterName();
838         if (!GetterName.empty())
839           addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
840         StringRef SetterName = Property.getObjCPropertySetterName();
841         if (!SetterName.empty())
842           addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
843         unsigned PropertyAttributes = 0;
844         if (Property.isReadOnlyObjCProperty())
845           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
846         if (Property.isReadWriteObjCProperty())
847           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
848         if (Property.isAssignObjCProperty())
849           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
850         if (Property.isRetainObjCProperty())
851           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
852         if (Property.isCopyObjCProperty())
853           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
854         if (Property.isNonAtomicObjCProperty())
855           PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
856         if (PropertyAttributes)
857           addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0, 
858                  PropertyAttributes);
859
860         DIEEntry *Entry = getDIEEntry(Element);
861         if (!Entry) {
862           Entry = createDIEEntry(ElemDie);
863           insertDIEEntry(Element, Entry);
864         }
865       } else
866         continue;
867       Buffer.addChild(ElemDie);
868     }
869
870     if (CTy.isAppleBlockExtension())
871       addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
872
873     unsigned RLang = CTy.getRunTimeLang();
874     if (RLang)
875       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
876               dwarf::DW_FORM_data1, RLang);
877
878     DICompositeType ContainingType = CTy.getContainingType();
879     if (DIDescriptor(ContainingType).isCompositeType())
880       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
881                   getOrCreateTypeDIE(DIType(ContainingType)));
882     else {
883       DIDescriptor Context = CTy.getContext();
884       addToContextOwner(&Buffer, Context);
885     }
886
887     if (CTy.isObjcClassComplete())
888       addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
889               dwarf::DW_FORM_flag, 1);
890
891     // Add template parameters to a class, structure or union types.
892     // FIXME: The support isn't in the metadata for this yet.
893     if (Tag == dwarf::DW_TAG_class_type ||
894         Tag == dwarf::DW_TAG_structure_type ||
895         Tag == dwarf::DW_TAG_union_type)
896       addTemplateParams(Buffer, CTy.getTemplateParams());
897
898     break;
899   }
900   default:
901     break;
902   }
903
904   // Add name if not anonymous or intermediate type.
905   if (!Name.empty())
906     addString(&Buffer, dwarf::DW_AT_name, Name);
907
908   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
909       || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
910   {
911     // Add size if non-zero (derived types might be zero-sized.)
912     if (Size)
913       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
914     else {
915       // Add zero size if it is not a forward declaration.
916       if (CTy.isForwardDecl())
917         addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
918       else
919         addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
920     }
921
922     // Add source line info if available.
923     if (!CTy.isForwardDecl())
924       addSourceLine(&Buffer, CTy);
925   }
926 }
927
928 /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 
929 /// for the given DITemplateTypeParameter.
930 DIE *
931 CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
932   DIE *ParamDIE = getDIE(TP);
933   if (ParamDIE)
934     return ParamDIE;
935
936   ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
937   addType(ParamDIE, TP.getType());
938   addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
939   return ParamDIE;
940 }
941
942 /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 
943 /// for the given DITemplateValueParameter.
944 DIE *
945 CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
946   DIE *ParamDIE = getDIE(TPV);
947   if (ParamDIE)
948     return ParamDIE;
949
950   ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
951   addType(ParamDIE, TPV.getType());
952   if (!TPV.getName().empty())
953     addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
954   addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, 
955           TPV.getValue());
956   return ParamDIE;
957 }
958
959 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
960 DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
961   DIE *NDie = getDIE(NS);
962   if (NDie)
963     return NDie;
964   NDie = new DIE(dwarf::DW_TAG_namespace);
965   insertDIE(NS, NDie);
966   if (!NS.getName().empty()) {
967     addString(NDie, dwarf::DW_AT_name, NS.getName());
968     addAccelNamespace(NS.getName(), NDie);
969   } else
970     addAccelNamespace("(anonymous namespace)", NDie);
971   addSourceLine(NDie, NS);
972   addToContextOwner(NDie, NS.getContext());
973   return NDie;
974 }
975
976 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
977 /// printer to not emit usual symbol prefix before the symbol name is used then
978 /// return linkage name after skipping this special LLVM prefix.
979 static StringRef getRealLinkageName(StringRef LinkageName) {
980   char One = '\1';
981   if (LinkageName.startswith(StringRef(&One, 1)))
982     return LinkageName.substr(1);
983   return LinkageName;
984 }
985
986 /// getOrCreateSubprogramDIE - Create new DIE using SP.
987 DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
988   DIE *SPDie = getDIE(SP);
989   if (SPDie)
990     return SPDie;
991
992   DISubprogram SPDecl = SP.getFunctionDeclaration();
993   DIE *DeclDie = NULL;
994   if (SPDecl.isSubprogram()) {
995     DeclDie = getOrCreateSubprogramDIE(SPDecl);
996   }
997
998   SPDie = new DIE(dwarf::DW_TAG_subprogram);
999   
1000   // DW_TAG_inlined_subroutine may refer to this DIE.
1001   insertDIE(SP, SPDie);
1002   
1003   // Add to context owner.
1004   addToContextOwner(SPDie, SP.getContext());
1005
1006   // Add function template parameters.
1007   addTemplateParams(*SPDie, SP.getTemplateParams());
1008
1009   StringRef LinkageName = SP.getLinkageName();
1010   if (!LinkageName.empty())
1011     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1012               getRealLinkageName(LinkageName));
1013
1014   // If this DIE is going to refer declaration info using AT_specification
1015   // then there is no need to add other attributes.
1016   if (DeclDie) {
1017     // Refer function declaration directly.
1018     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1019                 DeclDie);
1020
1021     return SPDie;
1022   }
1023
1024   // Constructors and operators for anonymous aggregates do not have names.
1025   if (!SP.getName().empty())
1026     addString(SPDie, dwarf::DW_AT_name, SP.getName());
1027
1028   addSourceLine(SPDie, SP);
1029
1030   // Add the prototype if we have a prototype and we have a C like
1031   // language.
1032   if (SP.isPrototyped() &&
1033       (Language == dwarf::DW_LANG_C89 ||
1034        Language == dwarf::DW_LANG_C99 ||
1035        Language == dwarf::DW_LANG_ObjC))
1036     addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1037
1038   // Add Return Type.
1039   DICompositeType SPTy = SP.getType();
1040   DIArray Args = SPTy.getTypeArray();
1041   unsigned SPTag = SPTy.getTag();
1042
1043   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1044     addType(SPDie, SPTy);
1045   else
1046     addType(SPDie, DIType(Args.getElement(0)));
1047
1048   unsigned VK = SP.getVirtuality();
1049   if (VK) {
1050     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1051     DIEBlock *Block = getDIEBlock();
1052     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1053     addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1054     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1055     ContainingTypeMap.insert(std::make_pair(SPDie,
1056                                             SP.getContainingType()));
1057   }
1058
1059   if (!SP.isDefinition()) {
1060     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1061     
1062     // Add arguments. Do not add arguments for subprogram definition. They will
1063     // be handled while processing variables.
1064     DICompositeType SPTy = SP.getType();
1065     DIArray Args = SPTy.getTypeArray();
1066     unsigned SPTag = SPTy.getTag();
1067
1068     if (SPTag == dwarf::DW_TAG_subroutine_type)
1069       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1070         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1071         DIType ATy = DIType(DIType(Args.getElement(i)));
1072         addType(Arg, ATy);
1073         if (ATy.isArtificial())
1074           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1075         SPDie->addChild(Arg);
1076       }
1077   }
1078
1079   if (SP.isArtificial())
1080     addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1081
1082   if (!SP.isLocalToUnit())
1083     addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1084
1085   if (SP.isOptimized())
1086     addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1087
1088   if (unsigned isa = Asm->getISAEncoding()) {
1089     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1090   }
1091
1092   return SPDie;
1093 }
1094
1095 // Return const expression if value is a GEP to access merged global
1096 // constant. e.g.
1097 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1098 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1099   const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1100   if (!CE || CE->getNumOperands() != 3 ||
1101       CE->getOpcode() != Instruction::GetElementPtr)
1102     return NULL;
1103
1104   // First operand points to a global struct.
1105   Value *Ptr = CE->getOperand(0);
1106   if (!isa<GlobalValue>(Ptr) ||
1107       !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1108     return NULL;
1109
1110   // Second operand is zero.
1111   const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1112   if (!CI || !CI->isZero())
1113     return NULL;
1114
1115   // Third operand is offset.
1116   if (!isa<ConstantInt>(CE->getOperand(2)))
1117     return NULL;
1118
1119   return CE;
1120 }
1121
1122 /// createGlobalVariableDIE - create global variable DIE.
1123 void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
1124   // Check for pre-existence.
1125   if (getDIE(N))
1126     return;
1127
1128   DIGlobalVariable GV(N);
1129   if (!GV.Verify())
1130     return;
1131
1132   DIE *VariableDIE = new DIE(GV.getTag());
1133   // Add to map.
1134   insertDIE(N, VariableDIE);
1135
1136   // Add name.
1137   addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1138   StringRef LinkageName = GV.getLinkageName();
1139   bool isGlobalVariable = GV.getGlobal() != NULL;
1140   if (!LinkageName.empty() && isGlobalVariable)
1141     addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1142               getRealLinkageName(LinkageName));
1143   // Add type.
1144   DIType GTy = GV.getType();
1145   addType(VariableDIE, GTy);
1146
1147   // Add scoping info.
1148   if (!GV.isLocalToUnit())
1149     addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1150
1151   // Add line number info.
1152   addSourceLine(VariableDIE, GV);
1153   // Add to context owner.
1154   DIDescriptor GVContext = GV.getContext();
1155   addToContextOwner(VariableDIE, GVContext);
1156   // Add location.
1157   bool addToAccelTable = false;
1158   DIE *VariableSpecDIE = NULL;
1159   if (isGlobalVariable) {
1160     addToAccelTable = true;
1161     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1162     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1163     addLabel(Block, 0, dwarf::DW_FORM_udata,
1164              Asm->Mang->getSymbol(GV.getGlobal()));
1165     // Do not create specification DIE if context is either compile unit
1166     // or a subprogram.
1167     if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
1168         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1169       // Create specification DIE.
1170       VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1171       addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1172                   dwarf::DW_FORM_ref4, VariableDIE);
1173       addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1174       addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1175                      1);
1176       addDie(VariableSpecDIE);
1177     } else {
1178       addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1179     }
1180   } else if (const ConstantInt *CI = 
1181              dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1182     addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1183   else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1184     addToAccelTable = true;
1185     // GV is a merged global.
1186     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1187     Value *Ptr = CE->getOperand(0);
1188     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1189     addLabel(Block, 0, dwarf::DW_FORM_udata,
1190                     Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1191     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1192     SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1193     addUInt(Block, 0, dwarf::DW_FORM_udata, 
1194                    Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1195     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1196     addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1197   }
1198
1199   if (addToAccelTable) {
1200     DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1201     addAccelName(GV.getName(), AddrDIE);
1202
1203     // If the linkage name is different than the name, go ahead and output
1204     // that as well into the name table.
1205     if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1206       addAccelName(GV.getLinkageName(), AddrDIE);
1207   }
1208
1209   return;
1210 }
1211
1212 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1213 void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1214   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1215   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1216   uint64_t L = SR.getLo();
1217   uint64_t H = SR.getHi();
1218
1219   // The L value defines the lower bounds which is typically zero for C/C++. The
1220   // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
1221   // of the array. If L > H then do not emit DW_AT_lower_bound and 
1222   // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1223   // array has one element and in such case do not emit lower bound.
1224
1225   if (L > H) {
1226     Buffer.addChild(DW_Subrange);
1227     return;
1228   }
1229   if (L)
1230     addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1231   addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1232   Buffer.addChild(DW_Subrange);
1233 }
1234
1235 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1236 void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1237                                         DICompositeType *CTy) {
1238   Buffer.setTag(dwarf::DW_TAG_array_type);
1239   if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1240     addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1241
1242   // Emit derived type.
1243   addType(&Buffer, CTy->getTypeDerivedFrom());
1244   DIArray Elements = CTy->getTypeArray();
1245
1246   // Get an anonymous type for index type.
1247   DIE *IdxTy = getIndexTyDie();
1248   if (!IdxTy) {
1249     // Construct an anonymous type for index type.
1250     IdxTy = new DIE(dwarf::DW_TAG_base_type);
1251     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1252     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1253             dwarf::DW_ATE_signed);
1254     addDie(IdxTy);
1255     setIndexTyDie(IdxTy);
1256   }
1257
1258   // Add subranges to array type.
1259   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1260     DIDescriptor Element = Elements.getElement(i);
1261     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1262       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1263   }
1264 }
1265
1266 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1267 DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1268   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1269   StringRef Name = ETy.getName();
1270   addString(Enumerator, dwarf::DW_AT_name, Name);
1271   int64_t Value = ETy.getEnumValue();
1272   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1273   return Enumerator;
1274 }
1275
1276 /// constructContainingTypeDIEs - Construct DIEs for types that contain
1277 /// vtables.
1278 void CompileUnit::constructContainingTypeDIEs() {
1279   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1280          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1281     DIE *SPDie = CI->first;
1282     const MDNode *N = CI->second;
1283     if (!N) continue;
1284     DIE *NDie = getDIE(N);
1285     if (!NDie) continue;
1286     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1287   }
1288 }
1289
1290 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1291 DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1292   StringRef Name = DV->getName();
1293   if (Name.empty())
1294     return NULL;
1295
1296   // Translate tag to proper Dwarf tag.
1297   unsigned Tag = DV->getTag();
1298
1299   // Define variable debug information entry.
1300   DIE *VariableDie = new DIE(Tag);
1301   DbgVariable *AbsVar = DV->getAbstractVariable();
1302   DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1303   if (AbsDIE)
1304     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1305                             dwarf::DW_FORM_ref4, AbsDIE);
1306   else {
1307     addString(VariableDie, dwarf::DW_AT_name, Name);
1308     addSourceLine(VariableDie, DV->getVariable());
1309     addType(VariableDie, DV->getType());
1310   }
1311
1312   if (DV->isArtificial())
1313     addUInt(VariableDie, dwarf::DW_AT_artificial,
1314                         dwarf::DW_FORM_flag, 1);
1315
1316   if (isScopeAbstract) {
1317     DV->setDIE(VariableDie);
1318     return VariableDie;
1319   }
1320
1321   // Add variable address.
1322
1323   unsigned Offset = DV->getDotDebugLocOffset();
1324   if (Offset != ~0U) {
1325     addLabel(VariableDie, dwarf::DW_AT_location,
1326                          dwarf::DW_FORM_data4,
1327                          Asm->GetTempSymbol("debug_loc", Offset));
1328     DV->setDIE(VariableDie);
1329     return VariableDie;
1330   }
1331
1332   // Check if variable is described by a DBG_VALUE instruction.
1333   if (const MachineInstr *DVInsn = DV->getMInsn()) {
1334     bool updated = false;
1335     if (DVInsn->getNumOperands() == 3) {
1336       if (DVInsn->getOperand(0).isReg()) {
1337         const MachineOperand RegOp = DVInsn->getOperand(0);
1338         const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1339         if (DVInsn->getOperand(1).isImm() &&
1340             TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1341           unsigned FrameReg = 0;
1342           const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1343           int Offset = 
1344             TFI->getFrameIndexReference(*Asm->MF, 
1345                                         DVInsn->getOperand(1).getImm(), 
1346                                         FrameReg);
1347           MachineLocation Location(FrameReg, Offset);
1348           addVariableAddress(DV, VariableDie, Location);
1349           
1350         } else if (RegOp.getReg())
1351           addVariableAddress(DV, VariableDie, 
1352                                          MachineLocation(RegOp.getReg()));
1353         updated = true;
1354       }
1355       else if (DVInsn->getOperand(0).isImm())
1356         updated = 
1357           addConstantValue(VariableDie, DVInsn->getOperand(0),
1358                                        DV->getType());
1359       else if (DVInsn->getOperand(0).isFPImm())
1360         updated =
1361           addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1362       else if (DVInsn->getOperand(0).isCImm())
1363         updated =
1364           addConstantValue(VariableDie, 
1365                                        DVInsn->getOperand(0).getCImm(),
1366                                        DV->getType().isUnsignedDIType());
1367     } else {
1368       addVariableAddress(DV, VariableDie, 
1369                                      Asm->getDebugValueLocation(DVInsn));
1370       updated = true;
1371     }
1372     if (!updated) {
1373       // If variableDie is not updated then DBG_VALUE instruction does not
1374       // have valid variable info.
1375       delete VariableDie;
1376       return NULL;
1377     }
1378     DV->setDIE(VariableDie);
1379     return VariableDie;
1380   } else {
1381     // .. else use frame index.
1382     int FI = DV->getFrameIndex();
1383     if (FI != ~0) {
1384       unsigned FrameReg = 0;
1385       const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1386       int Offset = 
1387         TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1388       MachineLocation Location(FrameReg, Offset);
1389       addVariableAddress(DV, VariableDie, Location);
1390     }
1391   }
1392
1393   DV->setDIE(VariableDie);
1394   return VariableDie;
1395 }
1396
1397 /// createMemberDIE - Create new member DIE.
1398 DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1399   DIE *MemberDie = new DIE(DT.getTag());
1400   StringRef Name = DT.getName();
1401   if (!Name.empty())
1402     addString(MemberDie, dwarf::DW_AT_name, Name);
1403
1404   addType(MemberDie, DT.getTypeDerivedFrom());
1405
1406   addSourceLine(MemberDie, DT);
1407
1408   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1409   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1410
1411   uint64_t Size = DT.getSizeInBits();
1412   uint64_t FieldSize = DT.getOriginalTypeSize();
1413
1414   if (Size != FieldSize) {
1415     // Handle bitfield.
1416     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1417     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1418
1419     uint64_t Offset = DT.getOffsetInBits();
1420     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1421     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1422     uint64_t FieldOffset = (HiMark - FieldSize);
1423     Offset -= FieldOffset;
1424
1425     // Maybe we need to work from the other end.
1426     if (Asm->getTargetData().isLittleEndian())
1427       Offset = FieldSize - (Offset + Size);
1428     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1429
1430     // Here WD_AT_data_member_location points to the anonymous
1431     // field that includes this bit field.
1432     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1433
1434   } else
1435     // This is not a bitfield.
1436     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1437
1438   if (DT.getTag() == dwarf::DW_TAG_inheritance
1439       && DT.isVirtual()) {
1440
1441     // For C++, virtual base classes are not at fixed offset. Use following
1442     // expression to extract appropriate offset from vtable.
1443     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1444
1445     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1446     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1447     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1448     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1449     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1450     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1451     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1452     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1453
1454     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1455              VBaseLocationDie);
1456   } else
1457     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1458
1459   if (DT.isProtected())
1460     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1461             dwarf::DW_ACCESS_protected);
1462   else if (DT.isPrivate())
1463     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1464             dwarf::DW_ACCESS_private);
1465   // Otherwise C++ member and base classes are considered public.
1466   else 
1467     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1468             dwarf::DW_ACCESS_public);
1469   if (DT.isVirtual())
1470     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1471             dwarf::DW_VIRTUALITY_virtual);
1472
1473   // Objective-C properties.
1474   if (MDNode *PNode = DT.getObjCProperty())
1475     if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1476       MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 
1477                           PropertyDie);
1478
1479   // This is only for backward compatibility.
1480   StringRef PropertyName = DT.getObjCPropertyName();
1481   if (!PropertyName.empty()) {
1482     addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1483     StringRef GetterName = DT.getObjCPropertyGetterName();
1484     if (!GetterName.empty())
1485       addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1486     StringRef SetterName = DT.getObjCPropertySetterName();
1487     if (!SetterName.empty())
1488       addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1489     unsigned PropertyAttributes = 0;
1490     if (DT.isReadOnlyObjCProperty())
1491       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1492     if (DT.isReadWriteObjCProperty())
1493       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1494     if (DT.isAssignObjCProperty())
1495       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1496     if (DT.isRetainObjCProperty())
1497       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1498     if (DT.isCopyObjCProperty())
1499       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1500     if (DT.isNonAtomicObjCProperty())
1501       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1502     if (PropertyAttributes)
1503       addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0, 
1504               PropertyAttributes);
1505   }
1506   return MemberDie;
1507 }