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