DwarfCompileUnit.cpp revision 663e0cf73dcf2bfbbfc22b49c739d54916652d1c
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
32using namespace llvm;
33
34/// CompileUnit - Compile unit constructor.
35CompileUnit::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.
42CompileUnit::~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.
49DIEEntry *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///
56void 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///
66void 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.
76void 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///
90void 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///
98void 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///
106void 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///
113void 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.
122void 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.
139void 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.
155void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
156  // Verify subprogram.
157  if (!SP.Verify())
158    return;
159
160  // If the line number is 0, don't add it.
161  unsigned Line = SP.getLineNumber();
162  if (Line == 0)
163    return;
164
165  unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(),
166                                            SP.getDirectory());
167  assert(FileID && "Invalid file id");
168  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
169  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
170}
171
172/// addSourceLine - Add location information to specified debug information
173/// entry.
174void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
175  // Verify type.
176  if (!Ty.Verify())
177    return;
178
179  unsigned Line = Ty.getLineNumber();
180  if (Line == 0)
181    return;
182  unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(),
183                                            Ty.getDirectory());
184  assert(FileID && "Invalid file id");
185  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
186  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
187}
188
189/// addSourceLine - Add location information to specified debug information
190/// entry.
191void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
192  // Verify namespace.
193  if (!NS.Verify())
194    return;
195
196  unsigned Line = NS.getLineNumber();
197  if (Line == 0)
198    return;
199  StringRef FN = NS.getFilename();
200
201  unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
202  assert(FileID && "Invalid file id");
203  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
204  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
205}
206
207/// addVariableAddress - Add DW_AT_location attribute for a
208/// DbgVariable based on provided MachineLocation.
209void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
210                                     MachineLocation Location) {
211  if (DV->variableHasComplexAddress())
212    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
213  else if (DV->isBlockByrefVariable())
214    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
215  else
216    addAddress(Die, dwarf::DW_AT_location, Location);
217}
218
219/// addRegisterOp - Add register operand.
220void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
221  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
222  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
223  if (DWReg < 32)
224    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
225  else {
226    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
227    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
228  }
229}
230
231/// addRegisterOffset - Add register offset.
232void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
233                                    int64_t Offset) {
234  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
235  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
236  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
237  if (Reg == TRI->getFrameRegister(*Asm->MF))
238    // If variable offset is based in frame register then use fbreg.
239    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
240  else if (DWReg < 32)
241    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
242  else {
243    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
244    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
245  }
246  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
247}
248
249/// addAddress - Add an address attribute to a die based on the location
250/// provided.
251void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
252                             const MachineLocation &Location) {
253  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
254
255  if (Location.isReg())
256    addRegisterOp(Block, Location.getReg());
257  else
258    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
259
260  // Now attach the location information to the DIE.
261  addBlock(Die, Attribute, 0, Block);
262}
263
264/// addComplexAddress - Start with the address based on the location provided,
265/// and generate the DWARF information necessary to find the actual variable
266/// given the extra address information encoded in the DIVariable, starting from
267/// the starting location.  Add the DWARF information to the die.
268///
269void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
270                                    unsigned Attribute,
271                                    const MachineLocation &Location) {
272  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
273  unsigned N = DV->getNumAddrElements();
274  unsigned i = 0;
275  if (Location.isReg()) {
276    if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
277      // If first address element is OpPlus then emit
278      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
279      addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
280      i = 2;
281    } else
282      addRegisterOp(Block, Location.getReg());
283  }
284  else
285    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
286
287  for (;i < N; ++i) {
288    uint64_t Element = DV->getAddrElement(i);
289    if (Element == DIBuilder::OpPlus) {
290      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
291      addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
292    } else if (Element == DIBuilder::OpDeref) {
293      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
294    } else llvm_unreachable("unknown DIBuilder Opcode");
295  }
296
297  // Now attach the location information to the DIE.
298  addBlock(Die, Attribute, 0, Block);
299}
300
301/* Byref variables, in Blocks, are declared by the programmer as "SomeType
302   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
303   gives the variable VarName either the struct, or a pointer to the struct, as
304   its type.  This is necessary for various behind-the-scenes things the
305   compiler needs to do with by-reference variables in Blocks.
306
307   However, as far as the original *programmer* is concerned, the variable
308   should still have type 'SomeType', as originally declared.
309
310   The function getBlockByrefType dives into the __Block_byref_x_VarName
311   struct to find the original type of the variable, which is then assigned to
312   the variable's Debug Information Entry as its real type.  So far, so good.
313   However now the debugger will expect the variable VarName to have the type
314   SomeType.  So we need the location attribute for the variable to be an
315   expression that explains to the debugger how to navigate through the
316   pointers and struct to find the actual variable of type SomeType.
317
318   The following function does just that.  We start by getting
319   the "normal" location for the variable. This will be the location
320   of either the struct __Block_byref_x_VarName or the pointer to the
321   struct __Block_byref_x_VarName.
322
323   The struct will look something like:
324
325   struct __Block_byref_x_VarName {
326     ... <various fields>
327     struct __Block_byref_x_VarName *forwarding;
328     ... <various other fields>
329     SomeType VarName;
330     ... <maybe more fields>
331   };
332
333   If we are given the struct directly (as our starting point) we
334   need to tell the debugger to:
335
336   1).  Add the offset of the forwarding field.
337
338   2).  Follow that pointer to get the real __Block_byref_x_VarName
339   struct to use (the real one may have been copied onto the heap).
340
341   3).  Add the offset for the field VarName, to find the actual variable.
342
343   If we started with a pointer to the struct, then we need to
344   dereference that pointer first, before the other steps.
345   Translating this into DWARF ops, we will need to append the following
346   to the current location description for the variable:
347
348   DW_OP_deref                    -- optional, if we start with a pointer
349   DW_OP_plus_uconst <forward_fld_offset>
350   DW_OP_deref
351   DW_OP_plus_uconst <varName_fld_offset>
352
353   That is what this function does.  */
354
355/// addBlockByrefAddress - Start with the address based on the location
356/// provided, and generate the DWARF information necessary to find the
357/// actual Block variable (navigating the Block struct) based on the
358/// starting location.  Add the DWARF information to the die.  For
359/// more information, read large comment just above here.
360///
361void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
362                                       unsigned Attribute,
363                                       const MachineLocation &Location) {
364  DIType Ty = DV->getType();
365  DIType TmpTy = Ty;
366  unsigned Tag = Ty.getTag();
367  bool isPointer = false;
368
369  StringRef varName = DV->getName();
370
371  if (Tag == dwarf::DW_TAG_pointer_type) {
372    DIDerivedType DTy = DIDerivedType(Ty);
373    TmpTy = DTy.getTypeDerivedFrom();
374    isPointer = true;
375  }
376
377  DICompositeType blockStruct = DICompositeType(TmpTy);
378
379  // Find the __forwarding field and the variable field in the __Block_byref
380  // struct.
381  DIArray Fields = blockStruct.getTypeArray();
382  DIDescriptor varField = DIDescriptor();
383  DIDescriptor forwardingField = DIDescriptor();
384
385  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
386    DIDescriptor Element = Fields.getElement(i);
387    DIDerivedType DT = DIDerivedType(Element);
388    StringRef fieldName = DT.getName();
389    if (fieldName == "__forwarding")
390      forwardingField = Element;
391    else if (fieldName == varName)
392      varField = Element;
393  }
394
395  // Get the offsets for the forwarding field and the variable field.
396  unsigned forwardingFieldOffset =
397    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
398  unsigned varFieldOffset =
399    DIDerivedType(varField).getOffsetInBits() >> 3;
400
401  // Decode the original location, and use that as the start of the byref
402  // variable's location.
403  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
404  unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
405  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
406
407  if (Location.isReg()) {
408    if (Reg < 32)
409      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
410    else {
411      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
412      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
413    }
414  } else {
415    if (Reg < 32)
416      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
417    else {
418      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
419      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
420    }
421
422    addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
423  }
424
425  // If we started with a pointer to the __Block_byref... struct, then
426  // the first thing we need to do is dereference the pointer (DW_OP_deref).
427  if (isPointer)
428    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
429
430  // Next add the offset for the '__forwarding' field:
431  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
432  // adding the offset if it's 0.
433  if (forwardingFieldOffset > 0) {
434    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
435    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
436  }
437
438  // Now dereference the __forwarding field to get to the real __Block_byref
439  // struct:  DW_OP_deref.
440  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
441
442  // Now that we've got the real __Block_byref... struct, add the offset
443  // for the variable's field to get to the location of the actual variable:
444  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
445  if (varFieldOffset > 0) {
446    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
447    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
448  }
449
450  // Now attach the location information to the DIE.
451  addBlock(Die, Attribute, 0, Block);
452}
453
454/// isTypeSigned - Return true if the type is signed.
455static bool isTypeSigned(DIType Ty, int *SizeInBits) {
456  if (Ty.isDerivedType())
457    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits);
458  if (Ty.isBasicType())
459    if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
460        || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
461      *SizeInBits = Ty.getSizeInBits();
462      return true;
463    }
464  return false;
465}
466
467/// addConstantValue - Add constant value entry in variable DIE.
468bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
469                                   DIType Ty) {
470  assert(MO.isImm() && "Invalid machine operand!");
471  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
472  int SizeInBits = -1;
473  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
474  unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata;
475  switch (SizeInBits) {
476    case 8:  Form = dwarf::DW_FORM_data1; break;
477    case 16: Form = dwarf::DW_FORM_data2; break;
478    case 32: Form = dwarf::DW_FORM_data4; break;
479    case 64: Form = dwarf::DW_FORM_data8; break;
480    default: break;
481  }
482  SignedConstant ? addSInt(Block, 0, Form, MO.getImm())
483    : addUInt(Block, 0, Form, MO.getImm());
484
485  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
486  return true;
487}
488
489/// addConstantFPValue - Add constant value entry in variable DIE.
490bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
491  assert (MO.isFPImm() && "Invalid machine operand!");
492  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
493  APFloat FPImm = MO.getFPImm()->getValueAPF();
494
495  // Get the raw data form of the floating point.
496  const APInt FltVal = FPImm.bitcastToAPInt();
497  const char *FltPtr = (const char*)FltVal.getRawData();
498
499  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
500  bool LittleEndian = Asm->getTargetData().isLittleEndian();
501  int Incr = (LittleEndian ? 1 : -1);
502  int Start = (LittleEndian ? 0 : NumBytes - 1);
503  int Stop = (LittleEndian ? NumBytes : -1);
504
505  // Output the constant to DWARF one byte at a time.
506  for (; Start != Stop; Start += Incr)
507    addUInt(Block, 0, dwarf::DW_FORM_data1,
508            (unsigned char)0xFF & FltPtr[Start]);
509
510  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
511  return true;
512}
513
514/// addConstantValue - Add constant value entry in variable DIE.
515bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
516                                   bool Unsigned) {
517  unsigned CIBitWidth = CI->getBitWidth();
518  if (CIBitWidth <= 64) {
519    unsigned form = 0;
520    switch (CIBitWidth) {
521    case 8: form = dwarf::DW_FORM_data1; break;
522    case 16: form = dwarf::DW_FORM_data2; break;
523    case 32: form = dwarf::DW_FORM_data4; break;
524    case 64: form = dwarf::DW_FORM_data8; break;
525    default:
526      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
527    }
528    if (Unsigned)
529      addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
530    else
531      addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
532    return true;
533  }
534
535  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
536
537  // Get the raw data form of the large APInt.
538  const APInt Val = CI->getValue();
539  const uint64_t *Ptr64 = Val.getRawData();
540
541  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
542  bool LittleEndian = Asm->getTargetData().isLittleEndian();
543
544  // Output the constant to DWARF one byte at a time.
545  for (int i = 0; i < NumBytes; i++) {
546    uint8_t c;
547    if (LittleEndian)
548      c = Ptr64[i / 8] >> (8 * (i & 7));
549    else
550      c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7));
551    addUInt(Block, 0, dwarf::DW_FORM_data1, c);
552  }
553
554  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
555  return true;
556}
557
558/// addTemplateParams - Add template parameters in buffer.
559void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
560  // Add template parameters.
561  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
562    DIDescriptor Element = TParams.getElement(i);
563    if (Element.isTemplateTypeParameter())
564      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
565                        DITemplateTypeParameter(Element)));
566    else if (Element.isTemplateValueParameter())
567      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
568                        DITemplateValueParameter(Element)));
569  }
570}
571
572/// addToContextOwner - Add Die into the list of its context owner's children.
573void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
574  if (Context.isType()) {
575    DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
576    ContextDIE->addChild(Die);
577  } else if (Context.isNameSpace()) {
578    DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
579    ContextDIE->addChild(Die);
580  } else if (Context.isSubprogram()) {
581    DIE *ContextDIE = getOrCreateSubprogramDIE(DISubprogram(Context));
582    ContextDIE->addChild(Die);
583  } else if (DIE *ContextDIE = getDIE(Context))
584    ContextDIE->addChild(Die);
585  else
586    addDie(Die);
587}
588
589/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
590/// given DIType.
591DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
592  DIType Ty(TyNode);
593  if (!Ty.Verify())
594    return NULL;
595  DIE *TyDIE = getDIE(Ty);
596  if (TyDIE)
597    return TyDIE;
598
599  // Create new type.
600  TyDIE = new DIE(dwarf::DW_TAG_base_type);
601  insertDIE(Ty, TyDIE);
602  if (Ty.isBasicType())
603    constructTypeDIE(*TyDIE, DIBasicType(Ty));
604  else if (Ty.isCompositeType())
605    constructTypeDIE(*TyDIE, DICompositeType(Ty));
606  else {
607    assert(Ty.isDerivedType() && "Unknown kind of DIType");
608    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
609  }
610  // If this is a named finished type then include it in the list of types
611  // for the accelerator tables.
612  if (!Ty.getName().empty() && !Ty.isForwardDecl()) {
613    bool IsImplementation = 0;
614    if (Ty.isCompositeType()) {
615      DICompositeType CT(Ty);
616      // A runtime language of 0 actually means C/C++ and that any
617      // non-negative value is some version of Objective-C/C++.
618      IsImplementation = (CT.getRunTimeLang() == 0) ||
619        CT.isObjcClassComplete();
620    }
621    unsigned Flags = IsImplementation ?
622                     DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
623    addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
624  }
625
626  addToContextOwner(TyDIE, Ty.getContext());
627  return TyDIE;
628}
629
630/// addType - Add a new type attribute to the specified entity.
631void CompileUnit::addType(DIE *Entity, DIType Ty,
632			  unsigned Attribute) {
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(Attribute, 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(Attribute, 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///
659void 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.
669void 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.
685void 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.
707void 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.
736void 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	DIDerivedType DDTy(Element);
832	if (DDTy.getTag() == dwarf::DW_TAG_friend) {
833	  ElemDie = new DIE(dwarf::DW_TAG_friend);
834	  addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend);
835	} else
836	  ElemDie = createMemberDIE(DIDerivedType(Element));
837      } else if (Element.isObjCProperty()) {
838        DIObjCProperty Property(Element);
839        ElemDie = new DIE(Property.getTag());
840        StringRef PropertyName = Property.getObjCPropertyName();
841        addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
842        StringRef GetterName = Property.getObjCPropertyGetterName();
843        if (!GetterName.empty())
844          addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
845        StringRef SetterName = Property.getObjCPropertySetterName();
846        if (!SetterName.empty())
847          addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
848        unsigned PropertyAttributes = 0;
849        if (Property.isReadOnlyObjCProperty())
850          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
851        if (Property.isReadWriteObjCProperty())
852          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
853        if (Property.isAssignObjCProperty())
854          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
855        if (Property.isRetainObjCProperty())
856          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
857        if (Property.isCopyObjCProperty())
858          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
859        if (Property.isNonAtomicObjCProperty())
860          PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
861        if (PropertyAttributes)
862          addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0,
863                 PropertyAttributes);
864
865        DIEEntry *Entry = getDIEEntry(Element);
866        if (!Entry) {
867          Entry = createDIEEntry(ElemDie);
868          insertDIEEntry(Element, Entry);
869        }
870      } else
871        continue;
872      Buffer.addChild(ElemDie);
873    }
874
875    if (CTy.isAppleBlockExtension())
876      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
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    // No harm in adding the runtime language to the declaration.
927    unsigned RLang = CTy.getRunTimeLang();
928    if (RLang)
929      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
930              dwarf::DW_FORM_data1, RLang);
931  }
932}
933
934/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
935/// for the given DITemplateTypeParameter.
936DIE *
937CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
938  DIE *ParamDIE = getDIE(TP);
939  if (ParamDIE)
940    return ParamDIE;
941
942  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
943  addType(ParamDIE, TP.getType());
944  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
945  return ParamDIE;
946}
947
948/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
949/// for the given DITemplateValueParameter.
950DIE *
951CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
952  DIE *ParamDIE = getDIE(TPV);
953  if (ParamDIE)
954    return ParamDIE;
955
956  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
957  addType(ParamDIE, TPV.getType());
958  if (!TPV.getName().empty())
959    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
960  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
961          TPV.getValue());
962  return ParamDIE;
963}
964
965/// getOrCreateNameSpace - Create a DIE for DINameSpace.
966DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
967  DIE *NDie = getDIE(NS);
968  if (NDie)
969    return NDie;
970  NDie = new DIE(dwarf::DW_TAG_namespace);
971  insertDIE(NS, NDie);
972  if (!NS.getName().empty()) {
973    addString(NDie, dwarf::DW_AT_name, NS.getName());
974    addAccelNamespace(NS.getName(), NDie);
975  } else
976    addAccelNamespace("(anonymous namespace)", NDie);
977  addSourceLine(NDie, NS);
978  addToContextOwner(NDie, NS.getContext());
979  return NDie;
980}
981
982/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
983/// printer to not emit usual symbol prefix before the symbol name is used then
984/// return linkage name after skipping this special LLVM prefix.
985static StringRef getRealLinkageName(StringRef LinkageName) {
986  char One = '\1';
987  if (LinkageName.startswith(StringRef(&One, 1)))
988    return LinkageName.substr(1);
989  return LinkageName;
990}
991
992/// getOrCreateSubprogramDIE - Create new DIE using SP.
993DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
994  DIE *SPDie = getDIE(SP);
995  if (SPDie)
996    return SPDie;
997
998  DISubprogram SPDecl = SP.getFunctionDeclaration();
999  DIE *DeclDie = NULL;
1000  if (SPDecl.isSubprogram()) {
1001    DeclDie = getOrCreateSubprogramDIE(SPDecl);
1002  }
1003
1004  SPDie = new DIE(dwarf::DW_TAG_subprogram);
1005
1006  // DW_TAG_inlined_subroutine may refer to this DIE.
1007  insertDIE(SP, SPDie);
1008
1009  // Add to context owner.
1010  addToContextOwner(SPDie, SP.getContext());
1011
1012  // Add function template parameters.
1013  addTemplateParams(*SPDie, SP.getTemplateParams());
1014
1015  // Unfortunately this code needs to stay here to work around
1016  // a bug in older gdbs that requires the linkage name to resolve
1017  // multiple template functions.
1018  StringRef LinkageName = SP.getLinkageName();
1019  if (!LinkageName.empty())
1020    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
1021              getRealLinkageName(LinkageName));
1022
1023  // If this DIE is going to refer declaration info using AT_specification
1024  // then there is no need to add other attributes.
1025  if (DeclDie) {
1026    // Refer function declaration directly.
1027    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1028                DeclDie);
1029
1030    return SPDie;
1031  }
1032
1033  // Constructors and operators for anonymous aggregates do not have names.
1034  if (!SP.getName().empty())
1035    addString(SPDie, dwarf::DW_AT_name, SP.getName());
1036
1037  addSourceLine(SPDie, SP);
1038
1039  // Add the prototype if we have a prototype and we have a C like
1040  // language.
1041  if (SP.isPrototyped() &&
1042      (Language == dwarf::DW_LANG_C89 ||
1043       Language == dwarf::DW_LANG_C99 ||
1044       Language == dwarf::DW_LANG_ObjC))
1045    addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1046
1047  // Add Return Type.
1048  DICompositeType SPTy = SP.getType();
1049  DIArray Args = SPTy.getTypeArray();
1050  unsigned SPTag = SPTy.getTag();
1051
1052  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1053    addType(SPDie, SPTy);
1054  else
1055    addType(SPDie, DIType(Args.getElement(0)));
1056
1057  unsigned VK = SP.getVirtuality();
1058  if (VK) {
1059    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1060    DIEBlock *Block = getDIEBlock();
1061    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1062    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1063    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1064    ContainingTypeMap.insert(std::make_pair(SPDie,
1065                                            SP.getContainingType()));
1066  }
1067
1068  if (!SP.isDefinition()) {
1069    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1070
1071    // Add arguments. Do not add arguments for subprogram definition. They will
1072    // be handled while processing variables.
1073    DICompositeType SPTy = SP.getType();
1074    DIArray Args = SPTy.getTypeArray();
1075    unsigned SPTag = SPTy.getTag();
1076
1077    if (SPTag == dwarf::DW_TAG_subroutine_type)
1078      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1079        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1080        DIType ATy = DIType(DIType(Args.getElement(i)));
1081        addType(Arg, ATy);
1082        if (ATy.isArtificial())
1083          addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1084        SPDie->addChild(Arg);
1085      }
1086  }
1087
1088  if (SP.isArtificial())
1089    addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1090
1091  if (!SP.isLocalToUnit())
1092    addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1093
1094  if (SP.isOptimized())
1095    addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1096
1097  if (unsigned isa = Asm->getISAEncoding()) {
1098    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1099  }
1100
1101  return SPDie;
1102}
1103
1104// Return const expression if value is a GEP to access merged global
1105// constant. e.g.
1106// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1107static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1108  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1109  if (!CE || CE->getNumOperands() != 3 ||
1110      CE->getOpcode() != Instruction::GetElementPtr)
1111    return NULL;
1112
1113  // First operand points to a global struct.
1114  Value *Ptr = CE->getOperand(0);
1115  if (!isa<GlobalValue>(Ptr) ||
1116      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1117    return NULL;
1118
1119  // Second operand is zero.
1120  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1121  if (!CI || !CI->isZero())
1122    return NULL;
1123
1124  // Third operand is offset.
1125  if (!isa<ConstantInt>(CE->getOperand(2)))
1126    return NULL;
1127
1128  return CE;
1129}
1130
1131/// createGlobalVariableDIE - create global variable DIE.
1132void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
1133  // Check for pre-existence.
1134  if (getDIE(N))
1135    return;
1136
1137  DIGlobalVariable GV(N);
1138  if (!GV.Verify())
1139    return;
1140
1141  DIE *VariableDIE = new DIE(GV.getTag());
1142  // Add to map.
1143  insertDIE(N, VariableDIE);
1144
1145  // Add name.
1146  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1147  StringRef LinkageName = GV.getLinkageName();
1148  bool isGlobalVariable = GV.getGlobal() != NULL;
1149  if (!LinkageName.empty() && isGlobalVariable)
1150    addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1151              getRealLinkageName(LinkageName));
1152  // Add type.
1153  DIType GTy = GV.getType();
1154  addType(VariableDIE, GTy);
1155
1156  // Add scoping info.
1157  if (!GV.isLocalToUnit())
1158    addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1159
1160  // Add line number info.
1161  addSourceLine(VariableDIE, GV);
1162  // Add to context owner.
1163  DIDescriptor GVContext = GV.getContext();
1164  addToContextOwner(VariableDIE, GVContext);
1165  // Add location.
1166  bool addToAccelTable = false;
1167  DIE *VariableSpecDIE = NULL;
1168  if (isGlobalVariable) {
1169    addToAccelTable = true;
1170    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1171    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1172    addLabel(Block, 0, dwarf::DW_FORM_udata,
1173             Asm->Mang->getSymbol(GV.getGlobal()));
1174    // Do not create specification DIE if context is either compile unit
1175    // or a subprogram.
1176    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
1177        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1178      // Create specification DIE.
1179      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1180      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1181                  dwarf::DW_FORM_ref4, VariableDIE);
1182      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1183      addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1184                     1);
1185      addDie(VariableSpecDIE);
1186    } else {
1187      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1188    }
1189  } else if (const ConstantInt *CI =
1190             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1191    addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1192  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1193    addToAccelTable = true;
1194    // GV is a merged global.
1195    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1196    Value *Ptr = CE->getOperand(0);
1197    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1198    addLabel(Block, 0, dwarf::DW_FORM_udata,
1199                    Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1200    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1201    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1202    addUInt(Block, 0, dwarf::DW_FORM_udata,
1203                   Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1204    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1205    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1206  }
1207
1208  if (addToAccelTable) {
1209    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1210    addAccelName(GV.getName(), AddrDIE);
1211
1212    // If the linkage name is different than the name, go ahead and output
1213    // that as well into the name table.
1214    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1215      addAccelName(GV.getLinkageName(), AddrDIE);
1216  }
1217
1218  return;
1219}
1220
1221/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1222void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1223  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1224  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1225  uint64_t L = SR.getLo();
1226  uint64_t H = SR.getHi();
1227
1228  // The L value defines the lower bounds which is typically zero for C/C++. The
1229  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
1230  // of the array. If L > H then do not emit DW_AT_lower_bound and
1231  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1232  // array has one element and in such case do not emit lower bound.
1233
1234  if (L > H) {
1235    Buffer.addChild(DW_Subrange);
1236    return;
1237  }
1238  if (L)
1239    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1240  addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1241  Buffer.addChild(DW_Subrange);
1242}
1243
1244/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1245void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1246                                        DICompositeType *CTy) {
1247  Buffer.setTag(dwarf::DW_TAG_array_type);
1248  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1249    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1250
1251  // Emit derived type.
1252  addType(&Buffer, CTy->getTypeDerivedFrom());
1253  DIArray Elements = CTy->getTypeArray();
1254
1255  // Get an anonymous type for index type.
1256  DIE *IdxTy = getIndexTyDie();
1257  if (!IdxTy) {
1258    // Construct an anonymous type for index type.
1259    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1260    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1261    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1262            dwarf::DW_ATE_signed);
1263    addDie(IdxTy);
1264    setIndexTyDie(IdxTy);
1265  }
1266
1267  // Add subranges to array type.
1268  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1269    DIDescriptor Element = Elements.getElement(i);
1270    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1271      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1272  }
1273}
1274
1275/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1276DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1277  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1278  StringRef Name = ETy.getName();
1279  addString(Enumerator, dwarf::DW_AT_name, Name);
1280  int64_t Value = ETy.getEnumValue();
1281  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1282  return Enumerator;
1283}
1284
1285/// constructContainingTypeDIEs - Construct DIEs for types that contain
1286/// vtables.
1287void CompileUnit::constructContainingTypeDIEs() {
1288  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1289         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1290    DIE *SPDie = CI->first;
1291    const MDNode *N = CI->second;
1292    if (!N) continue;
1293    DIE *NDie = getDIE(N);
1294    if (!NDie) continue;
1295    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1296  }
1297}
1298
1299/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1300DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1301  StringRef Name = DV->getName();
1302  if (Name.empty())
1303    return NULL;
1304
1305  // Translate tag to proper Dwarf tag.
1306  unsigned Tag = DV->getTag();
1307
1308  // Define variable debug information entry.
1309  DIE *VariableDie = new DIE(Tag);
1310  DbgVariable *AbsVar = DV->getAbstractVariable();
1311  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1312  if (AbsDIE)
1313    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1314                            dwarf::DW_FORM_ref4, AbsDIE);
1315  else {
1316    addString(VariableDie, dwarf::DW_AT_name, Name);
1317    addSourceLine(VariableDie, DV->getVariable());
1318    addType(VariableDie, DV->getType());
1319  }
1320
1321  if (DV->isArtificial())
1322    addUInt(VariableDie, dwarf::DW_AT_artificial,
1323                        dwarf::DW_FORM_flag, 1);
1324
1325  if (isScopeAbstract) {
1326    DV->setDIE(VariableDie);
1327    return VariableDie;
1328  }
1329
1330  // Add variable address.
1331
1332  unsigned Offset = DV->getDotDebugLocOffset();
1333  if (Offset != ~0U) {
1334    addLabel(VariableDie, dwarf::DW_AT_location,
1335                         dwarf::DW_FORM_data4,
1336                         Asm->GetTempSymbol("debug_loc", Offset));
1337    DV->setDIE(VariableDie);
1338    return VariableDie;
1339  }
1340
1341  // Check if variable is described by a DBG_VALUE instruction.
1342  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1343    bool updated = false;
1344    if (DVInsn->getNumOperands() == 3) {
1345      if (DVInsn->getOperand(0).isReg()) {
1346        const MachineOperand RegOp = DVInsn->getOperand(0);
1347        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1348        if (DVInsn->getOperand(1).isImm() &&
1349            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1350          unsigned FrameReg = 0;
1351          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1352          int Offset =
1353            TFI->getFrameIndexReference(*Asm->MF,
1354                                        DVInsn->getOperand(1).getImm(),
1355                                        FrameReg);
1356          MachineLocation Location(FrameReg, Offset);
1357          addVariableAddress(DV, VariableDie, Location);
1358
1359        } else if (RegOp.getReg())
1360          addVariableAddress(DV, VariableDie,
1361                                         MachineLocation(RegOp.getReg()));
1362        updated = true;
1363      }
1364      else if (DVInsn->getOperand(0).isImm())
1365        updated =
1366          addConstantValue(VariableDie, DVInsn->getOperand(0),
1367                                       DV->getType());
1368      else if (DVInsn->getOperand(0).isFPImm())
1369        updated =
1370          addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1371      else if (DVInsn->getOperand(0).isCImm())
1372        updated =
1373          addConstantValue(VariableDie,
1374                                       DVInsn->getOperand(0).getCImm(),
1375                                       DV->getType().isUnsignedDIType());
1376    } else {
1377      addVariableAddress(DV, VariableDie,
1378                                     Asm->getDebugValueLocation(DVInsn));
1379      updated = true;
1380    }
1381    if (!updated) {
1382      // If variableDie is not updated then DBG_VALUE instruction does not
1383      // have valid variable info.
1384      delete VariableDie;
1385      return NULL;
1386    }
1387    DV->setDIE(VariableDie);
1388    return VariableDie;
1389  } else {
1390    // .. else use frame index.
1391    int FI = DV->getFrameIndex();
1392    if (FI != ~0) {
1393      unsigned FrameReg = 0;
1394      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1395      int Offset =
1396        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1397      MachineLocation Location(FrameReg, Offset);
1398      addVariableAddress(DV, VariableDie, Location);
1399    }
1400  }
1401
1402  DV->setDIE(VariableDie);
1403  return VariableDie;
1404}
1405
1406/// createMemberDIE - Create new member DIE.
1407DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1408  DIE *MemberDie = new DIE(DT.getTag());
1409  StringRef Name = DT.getName();
1410  if (!Name.empty())
1411    addString(MemberDie, dwarf::DW_AT_name, Name);
1412
1413  addType(MemberDie, DT.getTypeDerivedFrom());
1414
1415  addSourceLine(MemberDie, DT);
1416
1417  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1418  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1419
1420  uint64_t Size = DT.getSizeInBits();
1421  uint64_t FieldSize = DT.getOriginalTypeSize();
1422
1423  if (Size != FieldSize) {
1424    // Handle bitfield.
1425    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1426    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1427
1428    uint64_t Offset = DT.getOffsetInBits();
1429    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1430    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1431    uint64_t FieldOffset = (HiMark - FieldSize);
1432    Offset -= FieldOffset;
1433
1434    // Maybe we need to work from the other end.
1435    if (Asm->getTargetData().isLittleEndian())
1436      Offset = FieldSize - (Offset + Size);
1437    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1438
1439    // Here WD_AT_data_member_location points to the anonymous
1440    // field that includes this bit field.
1441    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1442
1443  } else
1444    // This is not a bitfield.
1445    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1446
1447  if (DT.getTag() == dwarf::DW_TAG_inheritance
1448      && DT.isVirtual()) {
1449
1450    // For C++, virtual base classes are not at fixed offset. Use following
1451    // expression to extract appropriate offset from vtable.
1452    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1453
1454    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1455    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1456    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1457    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1458    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1459    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1460    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1461    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1462
1463    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1464             VBaseLocationDie);
1465  } else
1466    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1467
1468  if (DT.isProtected())
1469    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1470            dwarf::DW_ACCESS_protected);
1471  else if (DT.isPrivate())
1472    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1473            dwarf::DW_ACCESS_private);
1474  // Otherwise C++ member and base classes are considered public.
1475  else
1476    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1477            dwarf::DW_ACCESS_public);
1478  if (DT.isVirtual())
1479    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1480            dwarf::DW_VIRTUALITY_virtual);
1481
1482  // Objective-C properties.
1483  if (MDNode *PNode = DT.getObjCProperty())
1484    if (DIEEntry *PropertyDie = getDIEEntry(PNode))
1485      MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4,
1486                          PropertyDie);
1487
1488  // This is only for backward compatibility.
1489  StringRef PropertyName = DT.getObjCPropertyName();
1490  if (!PropertyName.empty()) {
1491    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1492    StringRef GetterName = DT.getObjCPropertyGetterName();
1493    if (!GetterName.empty())
1494      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1495    StringRef SetterName = DT.getObjCPropertySetterName();
1496    if (!SetterName.empty())
1497      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1498    unsigned PropertyAttributes = 0;
1499    if (DT.isReadOnlyObjCProperty())
1500      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1501    if (DT.isReadWriteObjCProperty())
1502      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1503    if (DT.isAssignObjCProperty())
1504      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1505    if (DT.isRetainObjCProperty())
1506      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1507    if (DT.isCopyObjCProperty())
1508      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1509    if (DT.isNonAtomicObjCProperty())
1510      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1511    if (PropertyAttributes)
1512      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1513              PropertyAttributes);
1514  }
1515  return MemberDie;
1516}
1517