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