DwarfCompileUnit.cpp revision e016789b7380b2a452f81ce15c2e382e62ede120
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, DIE *D, AsmPrinter *A, DwarfDebug *DW)
36  : ID(I), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
37  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
38}
39
40/// ~CompileUnit - Destructor for compile unit.
41CompileUnit::~CompileUnit() {
42  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
43    DIEBlocks[j]->~DIEBlock();
44}
45
46/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
47/// information entry.
48DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
49  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
50  return Value;
51}
52
53/// addUInt - Add an unsigned integer attribute data and value.
54///
55void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
56                          unsigned Form, uint64_t Integer) {
57  if (!Form) Form = DIEInteger::BestForm(false, Integer);
58  DIEValue *Value = Integer == 1 ?
59    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
60  Die->addValue(Attribute, Form, Value);
61}
62
63/// addSInt - Add an signed integer attribute data and value.
64///
65void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
66                          unsigned Form, int64_t Integer) {
67  if (!Form) Form = DIEInteger::BestForm(true, Integer);
68  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
69  Die->addValue(Attribute, Form, Value);
70}
71
72/// addString - Add a string attribute data and value. We always emit a
73/// reference to the string pool instead of immediate strings so that DIEs have
74/// more predictable sizes.
75void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
76  MCSymbol *Symb = DD->getStringPoolEntry(String);
77  DIEValue *Value;
78  if (Asm->needsRelocationsForDwarfStringPool())
79    Value = new (DIEValueAllocator) DIELabel(Symb);
80  else {
81    MCSymbol *StringPool = DD->getStringPool();
82    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
83  }
84  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
85}
86
87/// addLabel - Add a Dwarf label attribute data and value.
88///
89void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
90                           const MCSymbol *Label) {
91  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
92  Die->addValue(Attribute, Form, Value);
93}
94
95/// addDelta - Add a label delta attribute data and value.
96///
97void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
98                           const MCSymbol *Hi, const MCSymbol *Lo) {
99  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
100  Die->addValue(Attribute, Form, Value);
101}
102
103/// addDIEEntry - Add a DIE attribute data and value.
104///
105void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
106                              DIE *Entry) {
107  Die->addValue(Attribute, Form, createDIEEntry(Entry));
108}
109
110/// addBlock - Add block data.
111///
112void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
113                           DIEBlock *Block) {
114  Block->ComputeSize(Asm);
115  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
116  Die->addValue(Attribute, Block->BestForm(), Block);
117}
118
119/// addSourceLine - Add location information to specified debug information
120/// entry.
121void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
122  // Verify variable.
123  if (!V.Verify())
124    return;
125
126  unsigned Line = V.getLineNumber();
127  if (Line == 0)
128    return;
129  unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
130                                            V.getContext().getDirectory());
131  assert(FileID && "Invalid file id");
132  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
133  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
134}
135
136/// addSourceLine - Add location information to specified debug information
137/// entry.
138void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
139  // Verify global variable.
140  if (!G.Verify())
141    return;
142
143  unsigned Line = G.getLineNumber();
144  if (Line == 0)
145    return;
146  unsigned FileID = DD->GetOrCreateSourceID(G.getFilename(), G.getDirectory());
147  assert(FileID && "Invalid file id");
148  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
149  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
150}
151
152/// addSourceLine - Add location information to specified debug information
153/// entry.
154void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
155  // Verify subprogram.
156  if (!SP.Verify())
157    return;
158  // If the line number is 0, don't add it.
159  if (SP.getLineNumber() == 0)
160    return;
161
162  unsigned Line = SP.getLineNumber();
163  if (!SP.getContext().Verify())
164    return;
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 || !Ty.getContext().Verify())
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  if (!Ty.Verify())
633    return;
634
635  // Check for pre-existence.
636  DIEEntry *Entry = getDIEEntry(Ty);
637  // If it exists then use the existing value.
638  if (Entry) {
639    Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
640    return;
641  }
642
643  // Construct type.
644  DIE *Buffer = getOrCreateTypeDIE(Ty);
645
646  // Set up proxy.
647  Entry = createDIEEntry(Buffer);
648  insertDIEEntry(Ty, Entry);
649  Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
650
651  // If this is a complete composite type then include it in the
652  // list of global types.
653  addGlobalType(Ty);
654}
655
656/// addGlobalType - Add a new global type to the compile unit.
657///
658void CompileUnit::addGlobalType(DIType Ty) {
659  DIDescriptor Context = Ty.getContext();
660  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
661      && (!Context || Context.isCompileUnit() || Context.isFile()
662          || Context.isNameSpace()))
663    if (DIEEntry *Entry = getDIEEntry(Ty))
664      GlobalTypes[Ty.getName()] = Entry->getEntry();
665}
666
667/// addPubTypes - Add type for pubtypes section.
668void CompileUnit::addPubTypes(DISubprogram SP) {
669  DICompositeType SPTy = SP.getType();
670  unsigned SPTag = SPTy.getTag();
671  if (SPTag != dwarf::DW_TAG_subroutine_type)
672    return;
673
674  DIArray Args = SPTy.getTypeArray();
675  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
676    DIType ATy(Args.getElement(i));
677    if (!ATy.Verify())
678      continue;
679    addGlobalType(ATy);
680  }
681}
682
683/// constructTypeDIE - Construct basic type die from DIBasicType.
684void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
685  // Get core information.
686  StringRef Name = BTy.getName();
687  // Add name if not anonymous or intermediate type.
688  if (!Name.empty())
689    addString(&Buffer, dwarf::DW_AT_name, Name);
690
691  if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {
692    Buffer.setTag(dwarf::DW_TAG_unspecified_type);
693    // Unspecified types has only name, nothing else.
694    return;
695  }
696
697  Buffer.setTag(dwarf::DW_TAG_base_type);
698  addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
699	  BTy.getEncoding());
700
701  uint64_t Size = BTy.getSizeInBits() >> 3;
702  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
703}
704
705/// constructTypeDIE - Construct derived type die from DIDerivedType.
706void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
707  // Get core information.
708  StringRef Name = DTy.getName();
709  uint64_t Size = DTy.getSizeInBits() >> 3;
710  unsigned Tag = DTy.getTag();
711
712  // FIXME - Workaround for templates.
713  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
714
715  Buffer.setTag(Tag);
716
717  // Map to main type, void will not have a type.
718  DIType FromTy = DTy.getTypeDerivedFrom();
719  addType(&Buffer, FromTy);
720
721  // Add name if not anonymous or intermediate type.
722  if (!Name.empty())
723    addString(&Buffer, dwarf::DW_AT_name, Name);
724
725  // Add size if non-zero (derived types might be zero-sized.)
726  if (Size)
727    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
728
729  // Add source line info if available and TyDesc is not a forward declaration.
730  if (!DTy.isForwardDecl())
731    addSourceLine(&Buffer, DTy);
732}
733
734/// constructTypeDIE - Construct type DIE from DICompositeType.
735void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
736  // Get core information.
737  StringRef Name = CTy.getName();
738
739  uint64_t Size = CTy.getSizeInBits() >> 3;
740  unsigned Tag = CTy.getTag();
741  Buffer.setTag(Tag);
742
743  switch (Tag) {
744  case dwarf::DW_TAG_vector_type:
745  case dwarf::DW_TAG_array_type:
746    constructArrayTypeDIE(Buffer, &CTy);
747    break;
748  case dwarf::DW_TAG_enumeration_type: {
749    DIArray Elements = CTy.getTypeArray();
750
751    // Add enumerators to enumeration type.
752    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
753      DIE *ElemDie = NULL;
754      DIDescriptor Enum(Elements.getElement(i));
755      if (Enum.isEnumerator()) {
756        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
757        Buffer.addChild(ElemDie);
758      }
759    }
760  }
761    break;
762  case dwarf::DW_TAG_subroutine_type: {
763    // Add return type.
764    DIArray Elements = CTy.getTypeArray();
765    DIDescriptor RTy = Elements.getElement(0);
766    addType(&Buffer, DIType(RTy));
767
768    bool isPrototyped = true;
769    // Add arguments.
770    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
771      DIDescriptor Ty = Elements.getElement(i);
772      if (Ty.isUnspecifiedParameter()) {
773        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
774        Buffer.addChild(Arg);
775        isPrototyped = false;
776      } else {
777        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
778        addType(Arg, DIType(Ty));
779        Buffer.addChild(Arg);
780      }
781    }
782    // Add prototype flag.
783    if (isPrototyped)
784      addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
785  }
786    break;
787  case dwarf::DW_TAG_structure_type:
788  case dwarf::DW_TAG_union_type:
789  case dwarf::DW_TAG_class_type: {
790    // Add elements to structure type.
791    DIArray Elements = CTy.getTypeArray();
792
793    // A forward struct declared type may not have elements available.
794    unsigned N = Elements.getNumElements();
795    if (N == 0)
796      break;
797
798    // Add elements to structure type.
799    for (unsigned i = 0; i < N; ++i) {
800      DIDescriptor Element = Elements.getElement(i);
801      DIE *ElemDie = NULL;
802      if (Element.isSubprogram()) {
803        DISubprogram SP(Element);
804        ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element));
805        if (SP.isProtected())
806          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
807                  dwarf::DW_ACCESS_protected);
808        else if (SP.isPrivate())
809          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
810                  dwarf::DW_ACCESS_private);
811        else
812          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
813            dwarf::DW_ACCESS_public);
814        if (SP.isExplicit())
815          addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
816      }
817      else if (Element.isVariable()) {
818        DIVariable DV(Element);
819        ElemDie = new DIE(dwarf::DW_TAG_variable);
820        addString(ElemDie, dwarf::DW_AT_name, DV.getName());
821        addType(ElemDie, DV.getType());
822        addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
823        addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
824        addSourceLine(ElemDie, DV);
825      } else if (Element.isDerivedType())
826        ElemDie = createMemberDIE(DIDerivedType(Element));
827      else
828        continue;
829      Buffer.addChild(ElemDie);
830    }
831
832    if (CTy.isAppleBlockExtension())
833      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
834
835    unsigned RLang = CTy.getRunTimeLang();
836    if (RLang)
837      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
838              dwarf::DW_FORM_data1, RLang);
839
840    DICompositeType ContainingType = CTy.getContainingType();
841    if (DIDescriptor(ContainingType).isCompositeType())
842      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
843                  getOrCreateTypeDIE(DIType(ContainingType)));
844    else {
845      DIDescriptor Context = CTy.getContext();
846      addToContextOwner(&Buffer, Context);
847    }
848
849    if (CTy.isObjcClassComplete())
850      addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
851              dwarf::DW_FORM_flag, 1);
852
853    // Add template parameters to a class, structure or union types.
854    // FIXME: The support isn't in the metadata for this yet.
855    if (Tag == dwarf::DW_TAG_class_type ||
856        Tag == dwarf::DW_TAG_structure_type ||
857        Tag == dwarf::DW_TAG_union_type)
858      addTemplateParams(Buffer, CTy.getTemplateParams());
859
860    break;
861  }
862  default:
863    break;
864  }
865
866  // Add name if not anonymous or intermediate type.
867  if (!Name.empty())
868    addString(&Buffer, dwarf::DW_AT_name, Name);
869
870  if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
871      || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
872  {
873    // Add size if non-zero (derived types might be zero-sized.)
874    if (Size)
875      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
876    else {
877      // Add zero size if it is not a forward declaration.
878      if (CTy.isForwardDecl())
879        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
880      else
881        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
882    }
883
884    // Add source line info if available.
885    if (!CTy.isForwardDecl())
886      addSourceLine(&Buffer, CTy);
887  }
888}
889
890/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
891/// for the given DITemplateTypeParameter.
892DIE *
893CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
894  DIE *ParamDIE = getDIE(TP);
895  if (ParamDIE)
896    return ParamDIE;
897
898  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
899  addType(ParamDIE, TP.getType());
900  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());
901  return ParamDIE;
902}
903
904/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
905/// for the given DITemplateValueParameter.
906DIE *
907CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
908  DIE *ParamDIE = getDIE(TPV);
909  if (ParamDIE)
910    return ParamDIE;
911
912  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
913  addType(ParamDIE, TPV.getType());
914  if (!TPV.getName().empty())
915    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());
916  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
917          TPV.getValue());
918  return ParamDIE;
919}
920
921/// getOrCreateNameSpace - Create a DIE for DINameSpace.
922DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
923  DIE *NDie = getDIE(NS);
924  if (NDie)
925    return NDie;
926  NDie = new DIE(dwarf::DW_TAG_namespace);
927  insertDIE(NS, NDie);
928  if (!NS.getName().empty()) {
929    addString(NDie, dwarf::DW_AT_name, NS.getName());
930    addAccelNamespace(NS.getName(), NDie);
931  } else
932    addAccelNamespace("(anonymous namespace)", NDie);
933  addSourceLine(NDie, NS);
934  addToContextOwner(NDie, NS.getContext());
935  return NDie;
936}
937
938/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
939/// printer to not emit usual symbol prefix before the symbol name is used then
940/// return linkage name after skipping this special LLVM prefix.
941static StringRef getRealLinkageName(StringRef LinkageName) {
942  char One = '\1';
943  if (LinkageName.startswith(StringRef(&One, 1)))
944    return LinkageName.substr(1);
945  return LinkageName;
946}
947
948/// getOrCreateSubprogramDIE - Create new DIE using SP.
949DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
950  DIE *SPDie = getDIE(SP);
951  if (SPDie)
952    return SPDie;
953
954  DISubprogram SPDecl = SP.getFunctionDeclaration();
955  DIE *DeclDie = NULL;
956  if (SPDecl.isSubprogram()) {
957    DeclDie = getOrCreateSubprogramDIE(SPDecl);
958  }
959
960  SPDie = new DIE(dwarf::DW_TAG_subprogram);
961
962  // DW_TAG_inlined_subroutine may refer to this DIE.
963  insertDIE(SP, SPDie);
964
965  // Add to context owner.
966  addToContextOwner(SPDie, SP.getContext());
967
968  // Add function template parameters.
969  addTemplateParams(*SPDie, SP.getTemplateParams());
970
971  StringRef LinkageName = SP.getLinkageName();
972  if (!LinkageName.empty())
973    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,
974              getRealLinkageName(LinkageName));
975
976  // If this DIE is going to refer declaration info using AT_specification
977  // then there is no need to add other attributes.
978  if (DeclDie) {
979    // Refer function declaration directly.
980    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
981                DeclDie);
982
983    return SPDie;
984  }
985
986  // Constructors and operators for anonymous aggregates do not have names.
987  if (!SP.getName().empty())
988    addString(SPDie, dwarf::DW_AT_name, SP.getName());
989
990  addSourceLine(SPDie, SP);
991
992  if (SP.isPrototyped())
993    addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
994
995  // Add Return Type.
996  DICompositeType SPTy = SP.getType();
997  DIArray Args = SPTy.getTypeArray();
998  unsigned SPTag = SPTy.getTag();
999
1000  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1001    addType(SPDie, SPTy);
1002  else
1003    addType(SPDie, DIType(Args.getElement(0)));
1004
1005  unsigned VK = SP.getVirtuality();
1006  if (VK) {
1007    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK);
1008    DIEBlock *Block = getDIEBlock();
1009    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1010    addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1011    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1012    ContainingTypeMap.insert(std::make_pair(SPDie,
1013                                            SP.getContainingType()));
1014  }
1015
1016  if (!SP.isDefinition()) {
1017    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1018
1019    // Add arguments. Do not add arguments for subprogram definition. They will
1020    // be handled while processing variables.
1021    DICompositeType SPTy = SP.getType();
1022    DIArray Args = SPTy.getTypeArray();
1023    unsigned SPTag = SPTy.getTag();
1024
1025    if (SPTag == dwarf::DW_TAG_subroutine_type)
1026      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1027        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1028        DIType ATy = DIType(DIType(Args.getElement(i)));
1029        addType(Arg, ATy);
1030        if (ATy.isArtificial())
1031          addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1032        SPDie->addChild(Arg);
1033      }
1034  }
1035
1036  if (SP.isArtificial())
1037    addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1038
1039  if (!SP.isLocalToUnit())
1040    addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1041
1042  if (SP.isOptimized())
1043    addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1044
1045  if (unsigned isa = Asm->getISAEncoding()) {
1046    addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1047  }
1048
1049  return SPDie;
1050}
1051
1052// Return const expression if value is a GEP to access merged global
1053// constant. e.g.
1054// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1055static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1056  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1057  if (!CE || CE->getNumOperands() != 3 ||
1058      CE->getOpcode() != Instruction::GetElementPtr)
1059    return NULL;
1060
1061  // First operand points to a global struct.
1062  Value *Ptr = CE->getOperand(0);
1063  if (!isa<GlobalValue>(Ptr) ||
1064      !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
1065    return NULL;
1066
1067  // Second operand is zero.
1068  const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
1069  if (!CI || !CI->isZero())
1070    return NULL;
1071
1072  // Third operand is offset.
1073  if (!isa<ConstantInt>(CE->getOperand(2)))
1074    return NULL;
1075
1076  return CE;
1077}
1078
1079/// createGlobalVariableDIE - create global variable DIE.
1080void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
1081  // Check for pre-existence.
1082  if (getDIE(N))
1083    return;
1084
1085  DIGlobalVariable GV(N);
1086  if (!GV.Verify())
1087    return;
1088
1089  DIE *VariableDIE = new DIE(GV.getTag());
1090  // Add to map.
1091  insertDIE(N, VariableDIE);
1092
1093  // Add name.
1094  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
1095  StringRef LinkageName = GV.getLinkageName();
1096  bool isGlobalVariable = GV.getGlobal() != NULL;
1097  if (!LinkageName.empty() && isGlobalVariable)
1098    addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1099              getRealLinkageName(LinkageName));
1100  // Add type.
1101  DIType GTy = GV.getType();
1102  addType(VariableDIE, GTy);
1103
1104  // Add scoping info.
1105  if (!GV.isLocalToUnit())
1106    addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1107
1108  // Add line number info.
1109  addSourceLine(VariableDIE, GV);
1110  // Add to context owner.
1111  DIDescriptor GVContext = GV.getContext();
1112  addToContextOwner(VariableDIE, GVContext);
1113  // Add location.
1114  bool addToAccelTable = false;
1115  DIE *VariableSpecDIE = NULL;
1116  if (isGlobalVariable) {
1117    addToAccelTable = true;
1118    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1119    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1120    addLabel(Block, 0, dwarf::DW_FORM_udata,
1121             Asm->Mang->getSymbol(GV.getGlobal()));
1122    // Do not create specification DIE if context is either compile unit
1123    // or a subprogram.
1124    if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() &&
1125        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1126      // Create specification DIE.
1127      VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1128      addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1129                  dwarf::DW_FORM_ref4, VariableDIE);
1130      addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1131      addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag,
1132                     1);
1133      addDie(VariableSpecDIE);
1134    } else {
1135      addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1136    }
1137  } else if (const ConstantInt *CI =
1138             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1139    addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
1140  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1141    addToAccelTable = true;
1142    // GV is a merged global.
1143    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1144    Value *Ptr = CE->getOperand(0);
1145    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1146    addLabel(Block, 0, dwarf::DW_FORM_udata,
1147                    Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
1148    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1149    SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
1150    addUInt(Block, 0, dwarf::DW_FORM_udata,
1151                   Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
1152    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1153    addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1154  }
1155
1156  if (addToAccelTable) {
1157    DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE;
1158    addAccelName(GV.getName(), AddrDIE);
1159
1160    // If the linkage name is different than the name, go ahead and output
1161    // that as well into the name table.
1162    if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
1163      addAccelName(GV.getLinkageName(), AddrDIE);
1164  }
1165
1166  return;
1167}
1168
1169/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1170void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1171  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1172  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1173  uint64_t L = SR.getLo();
1174  uint64_t H = SR.getHi();
1175
1176  // The L value defines the lower bounds which is typically zero for C/C++. The
1177  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
1178  // of the array. If L > H then do not emit DW_AT_lower_bound and
1179  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
1180  // array has one element and in such case do not emit lower bound.
1181
1182  if (L > H) {
1183    Buffer.addChild(DW_Subrange);
1184    return;
1185  }
1186  if (L)
1187    addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1188  addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1189  Buffer.addChild(DW_Subrange);
1190}
1191
1192/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1193void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
1194                                        DICompositeType *CTy) {
1195  Buffer.setTag(dwarf::DW_TAG_array_type);
1196  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1197    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1198
1199  // Emit derived type.
1200  addType(&Buffer, CTy->getTypeDerivedFrom());
1201  DIArray Elements = CTy->getTypeArray();
1202
1203  // Get an anonymous type for index type.
1204  DIE *IdxTy = getIndexTyDie();
1205  if (!IdxTy) {
1206    // Construct an anonymous type for index type.
1207    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1208    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1209    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1210            dwarf::DW_ATE_signed);
1211    addDie(IdxTy);
1212    setIndexTyDie(IdxTy);
1213  }
1214
1215  // Add subranges to array type.
1216  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1217    DIDescriptor Element = Elements.getElement(i);
1218    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1219      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1220  }
1221}
1222
1223/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1224DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
1225  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1226  StringRef Name = ETy.getName();
1227  addString(Enumerator, dwarf::DW_AT_name, Name);
1228  int64_t Value = ETy.getEnumValue();
1229  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1230  return Enumerator;
1231}
1232
1233/// constructContainingTypeDIEs - Construct DIEs for types that contain
1234/// vtables.
1235void CompileUnit::constructContainingTypeDIEs() {
1236  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1237         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1238    DIE *SPDie = CI->first;
1239    const MDNode *N = CI->second;
1240    if (!N) continue;
1241    DIE *NDie = getDIE(N);
1242    if (!NDie) continue;
1243    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1244  }
1245}
1246
1247/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1248DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, bool isScopeAbstract) {
1249  StringRef Name = DV->getName();
1250  if (Name.empty())
1251    return NULL;
1252
1253  // Translate tag to proper Dwarf tag.
1254  unsigned Tag = DV->getTag();
1255
1256  // Define variable debug information entry.
1257  DIE *VariableDie = new DIE(Tag);
1258  DbgVariable *AbsVar = DV->getAbstractVariable();
1259  DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL;
1260  if (AbsDIE)
1261    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1262                            dwarf::DW_FORM_ref4, AbsDIE);
1263  else {
1264    addString(VariableDie, dwarf::DW_AT_name, Name);
1265    addSourceLine(VariableDie, DV->getVariable());
1266    addType(VariableDie, DV->getType());
1267  }
1268
1269  if (DV->isArtificial())
1270    addUInt(VariableDie, dwarf::DW_AT_artificial,
1271                        dwarf::DW_FORM_flag, 1);
1272
1273  if (isScopeAbstract) {
1274    DV->setDIE(VariableDie);
1275    return VariableDie;
1276  }
1277
1278  // Add variable address.
1279
1280  unsigned Offset = DV->getDotDebugLocOffset();
1281  if (Offset != ~0U) {
1282    addLabel(VariableDie, dwarf::DW_AT_location,
1283                         dwarf::DW_FORM_data4,
1284                         Asm->GetTempSymbol("debug_loc", Offset));
1285    DV->setDIE(VariableDie);
1286    return VariableDie;
1287  }
1288
1289  // Check if variable is described by a DBG_VALUE instruction.
1290  if (const MachineInstr *DVInsn = DV->getMInsn()) {
1291    bool updated = false;
1292    if (DVInsn->getNumOperands() == 3) {
1293      if (DVInsn->getOperand(0).isReg()) {
1294        const MachineOperand RegOp = DVInsn->getOperand(0);
1295        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1296        if (DVInsn->getOperand(1).isImm() &&
1297            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1298          unsigned FrameReg = 0;
1299          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1300          int Offset =
1301            TFI->getFrameIndexReference(*Asm->MF,
1302                                        DVInsn->getOperand(1).getImm(),
1303                                        FrameReg);
1304          MachineLocation Location(FrameReg, Offset);
1305          addVariableAddress(DV, VariableDie, Location);
1306
1307        } else if (RegOp.getReg())
1308          addVariableAddress(DV, VariableDie,
1309                                         MachineLocation(RegOp.getReg()));
1310        updated = true;
1311      }
1312      else if (DVInsn->getOperand(0).isImm())
1313        updated =
1314          addConstantValue(VariableDie, DVInsn->getOperand(0),
1315                                       DV->getType());
1316      else if (DVInsn->getOperand(0).isFPImm())
1317        updated =
1318          addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1319      else if (DVInsn->getOperand(0).isCImm())
1320        updated =
1321          addConstantValue(VariableDie,
1322                                       DVInsn->getOperand(0).getCImm(),
1323                                       DV->getType().isUnsignedDIType());
1324    } else {
1325      addVariableAddress(DV, VariableDie,
1326                                     Asm->getDebugValueLocation(DVInsn));
1327      updated = true;
1328    }
1329    if (!updated) {
1330      // If variableDie is not updated then DBG_VALUE instruction does not
1331      // have valid variable info.
1332      delete VariableDie;
1333      return NULL;
1334    }
1335    DV->setDIE(VariableDie);
1336    return VariableDie;
1337  } else {
1338    // .. else use frame index.
1339    int FI = DV->getFrameIndex();
1340    if (FI != ~0) {
1341      unsigned FrameReg = 0;
1342      const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
1343      int Offset =
1344        TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1345      MachineLocation Location(FrameReg, Offset);
1346      addVariableAddress(DV, VariableDie, Location);
1347    }
1348  }
1349
1350  DV->setDIE(VariableDie);
1351  return VariableDie;
1352}
1353
1354/// createMemberDIE - Create new member DIE.
1355DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
1356  DIE *MemberDie = new DIE(DT.getTag());
1357  StringRef Name = DT.getName();
1358  if (!Name.empty())
1359    addString(MemberDie, dwarf::DW_AT_name, Name);
1360
1361  addType(MemberDie, DT.getTypeDerivedFrom());
1362
1363  addSourceLine(MemberDie, DT);
1364
1365  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1366  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1367
1368  uint64_t Size = DT.getSizeInBits();
1369  uint64_t FieldSize = DT.getOriginalTypeSize();
1370
1371  if (Size != FieldSize) {
1372    // Handle bitfield.
1373    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1374    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1375
1376    uint64_t Offset = DT.getOffsetInBits();
1377    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1378    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1379    uint64_t FieldOffset = (HiMark - FieldSize);
1380    Offset -= FieldOffset;
1381
1382    // Maybe we need to work from the other end.
1383    if (Asm->getTargetData().isLittleEndian())
1384      Offset = FieldSize - (Offset + Size);
1385    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1386
1387    // Here WD_AT_data_member_location points to the anonymous
1388    // field that includes this bit field.
1389    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1390
1391  } else
1392    // This is not a bitfield.
1393    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1394
1395  if (DT.getTag() == dwarf::DW_TAG_inheritance
1396      && DT.isVirtual()) {
1397
1398    // For C++, virtual base classes are not at fixed offset. Use following
1399    // expression to extract appropriate offset from vtable.
1400    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1401
1402    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1403    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1404    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1405    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1406    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1407    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1408    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1409    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1410
1411    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1412             VBaseLocationDie);
1413  } else
1414    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1415
1416  if (DT.isProtected())
1417    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1418            dwarf::DW_ACCESS_protected);
1419  else if (DT.isPrivate())
1420    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1421            dwarf::DW_ACCESS_private);
1422  // Otherwise C++ member and base classes are considered public.
1423  else
1424    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1,
1425            dwarf::DW_ACCESS_public);
1426  if (DT.isVirtual())
1427    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1,
1428            dwarf::DW_VIRTUALITY_virtual);
1429
1430  // Objective-C properties.
1431  StringRef PropertyName = DT.getObjCPropertyName();
1432  if (!PropertyName.empty()) {
1433    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);
1434    StringRef GetterName = DT.getObjCPropertyGetterName();
1435    if (!GetterName.empty())
1436      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);
1437    StringRef SetterName = DT.getObjCPropertySetterName();
1438    if (!SetterName.empty())
1439      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);
1440    unsigned PropertyAttributes = 0;
1441    if (DT.isReadOnlyObjCProperty())
1442      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1443    if (DT.isReadWriteObjCProperty())
1444      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1445    if (DT.isAssignObjCProperty())
1446      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1447    if (DT.isRetainObjCProperty())
1448      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1449    if (DT.isCopyObjCProperty())
1450      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1451    if (DT.isNonAtomicObjCProperty())
1452      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1453    if (PropertyAttributes)
1454      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1455              PropertyAttributes);
1456  }
1457  return MemberDie;
1458}
1459