DwarfCompileUnit.cpp revision 8594d429e02c688d428036f8563f09572da3fbff
1//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf compile unit.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15
16#include "DwarfCompileUnit.h"
17#include "DwarfDebug.h"
18#include "llvm/Constants.h"
19#include "llvm/Analysis/DIBuilder.h"
20#include "llvm/Target/TargetData.h"
21#include "llvm/Target/TargetFrameLowering.h"
22#include "llvm/Target/TargetMachine.h"
23#include "llvm/Target/TargetRegisterInfo.h"
24#include "llvm/ADT/APFloat.h"
25#include "llvm/Support/ErrorHandling.h"
26
27using namespace llvm;
28
29/// CompileUnit - Compile unit constructor.
30CompileUnit::CompileUnit(unsigned I, DIE *D, AsmPrinter *A, DwarfDebug *DW)
31  : ID(I), CUDie(D), Asm(A), DD(DW), IndexTyDie(0) {
32  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
33}
34
35/// ~CompileUnit - Destructor for compile unit.
36CompileUnit::~CompileUnit() {
37  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
38    DIEBlocks[j]->~DIEBlock();
39}
40
41/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
42/// information entry.
43DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
44  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
45  return Value;
46}
47
48/// addUInt - Add an unsigned integer attribute data and value.
49///
50void CompileUnit::addUInt(DIE *Die, unsigned Attribute,
51                          unsigned Form, uint64_t Integer) {
52  if (!Form) Form = DIEInteger::BestForm(false, Integer);
53  DIEValue *Value = Integer == 1 ?
54    DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
55  Die->addValue(Attribute, Form, Value);
56}
57
58/// addSInt - Add an signed integer attribute data and value.
59///
60void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
61                          unsigned Form, int64_t Integer) {
62  if (!Form) Form = DIEInteger::BestForm(true, Integer);
63  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
64  Die->addValue(Attribute, Form, Value);
65}
66
67/// addString - Add a string attribute data and value. DIEString only
68/// keeps string reference.
69void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,
70                            StringRef String) {
71  DIEValue *Value = new (DIEValueAllocator) DIEString(String);
72  Die->addValue(Attribute, Form, Value);
73}
74
75/// addLabel - Add a Dwarf label attribute data and value.
76///
77void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
78                           const MCSymbol *Label) {
79  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
80  Die->addValue(Attribute, Form, Value);
81}
82
83/// addDelta - Add a label delta attribute data and value.
84///
85void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
86                           const MCSymbol *Hi, const MCSymbol *Lo) {
87  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
88  Die->addValue(Attribute, Form, Value);
89}
90
91/// addDIEEntry - Add a DIE attribute data and value.
92///
93void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
94                              DIE *Entry) {
95  Die->addValue(Attribute, Form, createDIEEntry(Entry));
96}
97
98
99/// addBlock - Add block data.
100///
101void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
102                           DIEBlock *Block) {
103  Block->ComputeSize(Asm);
104  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
105  Die->addValue(Attribute, Block->BestForm(), Block);
106}
107
108/// addSourceLine - Add location information to specified debug information
109/// entry.
110void CompileUnit::addSourceLine(DIE *Die, DIVariable V) {
111  // Verify variable.
112  if (!V.Verify())
113    return;
114
115  unsigned Line = V.getLineNumber();
116  if (Line == 0)
117    return;
118  unsigned FileID = DD->GetOrCreateSourceID(V.getContext().getFilename(),
119                                            V.getContext().getDirectory());
120  assert(FileID && "Invalid file id");
121  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
122  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
123}
124
125/// addSourceLine - Add location information to specified debug information
126/// entry.
127void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) {
128  // Verify global variable.
129  if (!G.Verify())
130    return;
131
132  unsigned Line = G.getLineNumber();
133  if (Line == 0)
134    return;
135  unsigned FileID = DD->GetOrCreateSourceID(G.getContext().getFilename(),
136                                            G.getContext().getDirectory());
137  assert(FileID && "Invalid file id");
138  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
139  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
140}
141
142/// addSourceLine - Add location information to specified debug information
143/// entry.
144void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) {
145  // Verify subprogram.
146  if (!SP.Verify())
147    return;
148  // If the line number is 0, don't add it.
149  if (SP.getLineNumber() == 0)
150    return;
151
152  unsigned Line = SP.getLineNumber();
153  if (!SP.getContext().Verify())
154    return;
155  unsigned FileID = DD->GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
156  assert(FileID && "Invalid file id");
157  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
158  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
159}
160
161/// addSourceLine - Add location information to specified debug information
162/// entry.
163void CompileUnit::addSourceLine(DIE *Die, DIType Ty) {
164  // Verify type.
165  if (!Ty.Verify())
166    return;
167
168  unsigned Line = Ty.getLineNumber();
169  if (Line == 0 || !Ty.getContext().Verify())
170    return;
171  unsigned FileID = DD->GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
172  assert(FileID && "Invalid file id");
173  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
174  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
175}
176
177/// addSourceLine - Add location information to specified debug information
178/// entry.
179void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) {
180  // Verify namespace.
181  if (!NS.Verify())
182    return;
183
184  unsigned Line = NS.getLineNumber();
185  if (Line == 0)
186    return;
187  StringRef FN = NS.getFilename();
188
189  unsigned FileID = DD->GetOrCreateSourceID(FN, NS.getDirectory());
190  assert(FileID && "Invalid file id");
191  addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
192  addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
193}
194
195/// addVariableAddress - Add DW_AT_location attribute for a
196/// DbgVariable based on provided MachineLocation.
197void CompileUnit::addVariableAddress(DbgVariable *&DV, DIE *Die,
198                                     MachineLocation Location) {
199  if (DV->variableHasComplexAddress())
200    addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
201  else if (DV->isBlockByrefVariable())
202    addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
203  else
204    addAddress(Die, dwarf::DW_AT_location, Location);
205}
206
207/// addRegisterOp - Add register operand.
208void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) {
209  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
210  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
211  if (DWReg < 32)
212    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg);
213  else {
214    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
215    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
216  }
217}
218
219/// addRegisterOffset - Add register offset.
220void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg,
221                                    int64_t Offset) {
222  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
223  unsigned DWReg = RI->getDwarfRegNum(Reg, false);
224  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
225  if (Reg == TRI->getFrameRegister(*Asm->MF))
226    // If variable offset is based in frame register then use fbreg.
227    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
228  else if (DWReg < 32)
229    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg);
230  else {
231    addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
232    addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg);
233  }
234  addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset);
235}
236
237/// addAddress - Add an address attribute to a die based on the location
238/// provided.
239void CompileUnit::addAddress(DIE *Die, unsigned Attribute,
240                             const MachineLocation &Location) {
241  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
242
243  if (Location.isReg())
244    addRegisterOp(Block, Location.getReg());
245  else
246    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
247
248  // Now attach the location information to the DIE.
249  addBlock(Die, Attribute, 0, Block);
250}
251
252/// addComplexAddress - Start with the address based on the location provided,
253/// and generate the DWARF information necessary to find the actual variable
254/// given the extra address information encoded in the DIVariable, starting from
255/// the starting location.  Add the DWARF information to the die.
256///
257void CompileUnit::addComplexAddress(DbgVariable *&DV, DIE *Die,
258                                    unsigned Attribute,
259                                    const MachineLocation &Location) {
260  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
261  unsigned N = DV->getNumAddrElements();
262  unsigned i = 0;
263  if (Location.isReg()) {
264    if (N >= 2 && DV->getAddrElement(0) == DIBuilder::OpPlus) {
265      // If first address element is OpPlus then emit
266      // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
267      addRegisterOffset(Block, Location.getReg(), DV->getAddrElement(1));
268      i = 2;
269    } else
270      addRegisterOp(Block, Location.getReg());
271  }
272  else
273    addRegisterOffset(Block, Location.getReg(), Location.getOffset());
274
275  for (;i < N; ++i) {
276    uint64_t Element = DV->getAddrElement(i);
277    if (Element == DIBuilder::OpPlus) {
278      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
279      addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
280    } else if (Element == DIBuilder::OpDeref) {
281      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
282    } else llvm_unreachable("unknown DIBuilder Opcode");
283  }
284
285  // Now attach the location information to the DIE.
286  addBlock(Die, Attribute, 0, Block);
287}
288
289/* Byref variables, in Blocks, are declared by the programmer as "SomeType
290   VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
291   gives the variable VarName either the struct, or a pointer to the struct, as
292   its type.  This is necessary for various behind-the-scenes things the
293   compiler needs to do with by-reference variables in Blocks.
294
295   However, as far as the original *programmer* is concerned, the variable
296   should still have type 'SomeType', as originally declared.
297
298   The function getBlockByrefType dives into the __Block_byref_x_VarName
299   struct to find the original type of the variable, which is then assigned to
300   the variable's Debug Information Entry as its real type.  So far, so good.
301   However now the debugger will expect the variable VarName to have the type
302   SomeType.  So we need the location attribute for the variable to be an
303   expression that explains to the debugger how to navigate through the
304   pointers and struct to find the actual variable of type SomeType.
305
306   The following function does just that.  We start by getting
307   the "normal" location for the variable. This will be the location
308   of either the struct __Block_byref_x_VarName or the pointer to the
309   struct __Block_byref_x_VarName.
310
311   The struct will look something like:
312
313   struct __Block_byref_x_VarName {
314     ... <various fields>
315     struct __Block_byref_x_VarName *forwarding;
316     ... <various other fields>
317     SomeType VarName;
318     ... <maybe more fields>
319   };
320
321   If we are given the struct directly (as our starting point) we
322   need to tell the debugger to:
323
324   1).  Add the offset of the forwarding field.
325
326   2).  Follow that pointer to get the real __Block_byref_x_VarName
327   struct to use (the real one may have been copied onto the heap).
328
329   3).  Add the offset for the field VarName, to find the actual variable.
330
331   If we started with a pointer to the struct, then we need to
332   dereference that pointer first, before the other steps.
333   Translating this into DWARF ops, we will need to append the following
334   to the current location description for the variable:
335
336   DW_OP_deref                    -- optional, if we start with a pointer
337   DW_OP_plus_uconst <forward_fld_offset>
338   DW_OP_deref
339   DW_OP_plus_uconst <varName_fld_offset>
340
341   That is what this function does.  */
342
343/// addBlockByrefAddress - Start with the address based on the location
344/// provided, and generate the DWARF information necessary to find the
345/// actual Block variable (navigating the Block struct) based on the
346/// starting location.  Add the DWARF information to the die.  For
347/// more information, read large comment just above here.
348///
349void CompileUnit::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
350                                       unsigned Attribute,
351                                       const MachineLocation &Location) {
352  DIType Ty = DV->getType();
353  DIType TmpTy = Ty;
354  unsigned Tag = Ty.getTag();
355  bool isPointer = false;
356
357  StringRef varName = DV->getName();
358
359  if (Tag == dwarf::DW_TAG_pointer_type) {
360    DIDerivedType DTy = DIDerivedType(Ty);
361    TmpTy = DTy.getTypeDerivedFrom();
362    isPointer = true;
363  }
364
365  DICompositeType blockStruct = DICompositeType(TmpTy);
366
367  // Find the __forwarding field and the variable field in the __Block_byref
368  // struct.
369  DIArray Fields = blockStruct.getTypeArray();
370  DIDescriptor varField = DIDescriptor();
371  DIDescriptor forwardingField = DIDescriptor();
372
373  for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
374    DIDescriptor Element = Fields.getElement(i);
375    DIDerivedType DT = DIDerivedType(Element);
376    StringRef fieldName = DT.getName();
377    if (fieldName == "__forwarding")
378      forwardingField = Element;
379    else if (fieldName == varName)
380      varField = Element;
381  }
382
383  // Get the offsets for the forwarding field and the variable field.
384  unsigned forwardingFieldOffset =
385    DIDerivedType(forwardingField).getOffsetInBits() >> 3;
386  unsigned varFieldOffset =
387    DIDerivedType(varField).getOffsetInBits() >> 3;
388
389  // Decode the original location, and use that as the start of the byref
390  // variable's location.
391  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
392  unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
393  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
394
395  if (Location.isReg()) {
396    if (Reg < 32)
397      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
398    else {
399      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
400      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
401    }
402  } else {
403    if (Reg < 32)
404      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
405    else {
406      addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
407      addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
408    }
409
410    addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
411  }
412
413  // If we started with a pointer to the __Block_byref... struct, then
414  // the first thing we need to do is dereference the pointer (DW_OP_deref).
415  if (isPointer)
416    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
417
418  // Next add the offset for the '__forwarding' field:
419  // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
420  // adding the offset if it's 0.
421  if (forwardingFieldOffset > 0) {
422    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
423    addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
424  }
425
426  // Now dereference the __forwarding field to get to the real __Block_byref
427  // struct:  DW_OP_deref.
428  addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
429
430  // Now that we've got the real __Block_byref... struct, add the offset
431  // for the variable's field to get to the location of the actual variable:
432  // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
433  if (varFieldOffset > 0) {
434    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
435    addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
436  }
437
438  // Now attach the location information to the DIE.
439  addBlock(Die, Attribute, 0, Block);
440}
441
442/// addConstantValue - Add constant value entry in variable DIE.
443bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
444                                   DIType Ty) {
445  assert (MO.isImm() && "Invalid machine operand!");
446  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
447  unsigned form = dwarf::DW_FORM_udata;
448  switch (Ty.getSizeInBits()) {
449    case 8: form = dwarf::DW_FORM_data1; break;
450    case 16: form = dwarf::DW_FORM_data2; break;
451    case 32: form = dwarf::DW_FORM_data4; break;
452    case 64: form = dwarf::DW_FORM_data8; break;
453    default: break;
454  }
455
456  DIBasicType BTy(Ty);
457  if (BTy.Verify() &&
458      (BTy.getEncoding()  == dwarf::DW_ATE_signed
459       || BTy.getEncoding() == dwarf::DW_ATE_signed_char))
460    addSInt(Block, 0, form, MO.getImm());
461  else
462    addUInt(Block, 0, form, MO.getImm());
463
464  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
465  return true;
466}
467
468/// addConstantFPValue - Add constant value entry in variable DIE.
469bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
470  assert (MO.isFPImm() && "Invalid machine operand!");
471  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
472  APFloat FPImm = MO.getFPImm()->getValueAPF();
473
474  // Get the raw data form of the floating point.
475  const APInt FltVal = FPImm.bitcastToAPInt();
476  const char *FltPtr = (const char*)FltVal.getRawData();
477
478  int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
479  bool LittleEndian = Asm->getTargetData().isLittleEndian();
480  int Incr = (LittleEndian ? 1 : -1);
481  int Start = (LittleEndian ? 0 : NumBytes - 1);
482  int Stop = (LittleEndian ? NumBytes : -1);
483
484  // Output the constant to DWARF one byte at a time.
485  for (; Start != Stop; Start += Incr)
486    addUInt(Block, 0, dwarf::DW_FORM_data1,
487            (unsigned char)0xFF & FltPtr[Start]);
488
489  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
490  return true;
491}
492
493/// addConstantValue - Add constant value entry in variable DIE.
494bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI,
495                                   bool Unsigned) {
496  unsigned CIBitWidth = CI->getBitWidth();
497  if (CIBitWidth <= 64) {
498    unsigned form = 0;
499    switch (CIBitWidth) {
500    case 8: form = dwarf::DW_FORM_data1; break;
501    case 16: form = dwarf::DW_FORM_data2; break;
502    case 32: form = dwarf::DW_FORM_data4; break;
503    case 64: form = dwarf::DW_FORM_data8; break;
504    default:
505      form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata;
506    }
507    if (Unsigned)
508      addUInt(Die, dwarf::DW_AT_const_value, form, CI->getZExtValue());
509    else
510      addSInt(Die, dwarf::DW_AT_const_value, form, CI->getSExtValue());
511    return true;
512  }
513
514  DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
515
516  // Get the raw data form of the large APInt.
517  const APInt Val = CI->getValue();
518  const char *Ptr = (const char*)Val.getRawData();
519
520  int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
521  bool LittleEndian = Asm->getTargetData().isLittleEndian();
522  int Incr = (LittleEndian ? 1 : -1);
523  int Start = (LittleEndian ? 0 : NumBytes - 1);
524  int Stop = (LittleEndian ? NumBytes : -1);
525
526  // Output the constant to DWARF one byte at a time.
527  for (; Start != Stop; Start += Incr)
528    addUInt(Block, 0, dwarf::DW_FORM_data1,
529            (unsigned char)0xFF & Ptr[Start]);
530
531  addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
532  return true;
533}
534
535/// addTemplateParams - Add template parameters in buffer.
536void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) {
537  // Add template parameters.
538  for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
539    DIDescriptor Element = TParams.getElement(i);
540    if (Element.isTemplateTypeParameter())
541      Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
542                        DITemplateTypeParameter(Element)));
543    else if (Element.isTemplateValueParameter())
544      Buffer.addChild(getOrCreateTemplateValueParameterDIE(
545                        DITemplateValueParameter(Element)));
546  }
547
548}
549/// addToContextOwner - Add Die into the list of its context owner's children.
550void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) {
551  if (Context.isType()) {
552    DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
553    ContextDIE->addChild(Die);
554  } else if (Context.isNameSpace()) {
555    DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
556    ContextDIE->addChild(Die);
557  } else if (Context.isSubprogram()) {
558    DIE *ContextDIE = DD->createSubprogramDIE(DISubprogram(Context));
559    ContextDIE->addChild(Die);
560  } else if (DIE *ContextDIE = getDIE(Context))
561    ContextDIE->addChild(Die);
562  else
563    addDie(Die);
564}
565
566/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
567/// given DIType.
568DIE *CompileUnit::getOrCreateTypeDIE(DIType Ty) {
569  DIE *TyDIE = getDIE(Ty);
570  if (TyDIE)
571    return TyDIE;
572
573  // Create new type.
574  TyDIE = new DIE(dwarf::DW_TAG_base_type);
575  insertDIE(Ty, TyDIE);
576  if (Ty.isBasicType())
577    constructTypeDIE(*TyDIE, DIBasicType(Ty));
578  else if (Ty.isCompositeType())
579    constructTypeDIE(*TyDIE, DICompositeType(Ty));
580  else {
581    assert(Ty.isDerivedType() && "Unknown kind of DIType");
582    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
583  }
584
585  addToContextOwner(TyDIE, Ty.getContext());
586  return TyDIE;
587}
588
589/// addType - Add a new type attribute to the specified entity.
590void CompileUnit::addType(DIE *Entity, DIType Ty) {
591  if (!Ty.Verify())
592    return;
593
594  // Check for pre-existence.
595  DIEEntry *Entry = getDIEEntry(Ty);
596  // If it exists then use the existing value.
597  if (Entry) {
598    Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
599    return;
600  }
601
602  // Construct type.
603  DIE *Buffer = getOrCreateTypeDIE(Ty);
604
605  // Set up proxy.
606  Entry = createDIEEntry(Buffer);
607  insertDIEEntry(Ty, Entry);
608  Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
609
610  // If this is a complete composite type then include it in the
611  // list of global types.
612  addGlobalType(Ty);
613}
614
615/// addGlobalType - Add a new global type to the compile unit.
616///
617void CompileUnit::addGlobalType(DIType Ty) {
618  DIDescriptor Context = Ty.getContext();
619  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
620      && (Context.isCompileUnit() || Context.isFile() || Context.isNameSpace()))
621    if (DIEEntry *Entry = getDIEEntry(Ty))
622      GlobalTypes[Ty.getName()] = Entry->getEntry();
623}
624
625/// addPubTypes - Add type for pubtypes section.
626void CompileUnit::addPubTypes(DISubprogram SP) {
627  DICompositeType SPTy = SP.getType();
628  unsigned SPTag = SPTy.getTag();
629  if (SPTag != dwarf::DW_TAG_subroutine_type)
630    return;
631
632  DIArray Args = SPTy.getTypeArray();
633  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
634    DIType ATy(Args.getElement(i));
635    if (!ATy.Verify())
636      continue;
637    addGlobalType(ATy);
638  }
639}
640
641/// constructTypeDIE - Construct basic type die from DIBasicType.
642void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
643  // Get core information.
644  StringRef Name = BTy.getName();
645  Buffer.setTag(dwarf::DW_TAG_base_type);
646  addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
647          BTy.getEncoding());
648
649  // Add name if not anonymous or intermediate type.
650  if (!Name.empty())
651    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
652  uint64_t Size = BTy.getSizeInBits() >> 3;
653  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
654}
655
656/// constructTypeDIE - Construct derived type die from DIDerivedType.
657void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
658  // Get core information.
659  StringRef Name = DTy.getName();
660  uint64_t Size = DTy.getSizeInBits() >> 3;
661  unsigned Tag = DTy.getTag();
662
663  // FIXME - Workaround for templates.
664  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
665
666  Buffer.setTag(Tag);
667
668  // Map to main type, void will not have a type.
669  DIType FromTy = DTy.getTypeDerivedFrom();
670  addType(&Buffer, FromTy);
671
672  // Add name if not anonymous or intermediate type.
673  if (!Name.empty())
674    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
675
676  // Add size if non-zero (derived types might be zero-sized.)
677  if (Size)
678    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
679
680  // Add source line info if available and TyDesc is not a forward declaration.
681  if (!DTy.isForwardDecl())
682    addSourceLine(&Buffer, DTy);
683}
684
685/// constructTypeDIE - Construct type DIE from DICompositeType.
686void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
687  // Get core information.
688  StringRef Name = CTy.getName();
689
690  uint64_t Size = CTy.getSizeInBits() >> 3;
691  unsigned Tag = CTy.getTag();
692  Buffer.setTag(Tag);
693
694  switch (Tag) {
695  case dwarf::DW_TAG_vector_type:
696  case dwarf::DW_TAG_array_type:
697    constructArrayTypeDIE(Buffer, &CTy);
698    break;
699  case dwarf::DW_TAG_enumeration_type: {
700    DIArray Elements = CTy.getTypeArray();
701
702    // Add enumerators to enumeration type.
703    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
704      DIE *ElemDie = NULL;
705      DIDescriptor Enum(Elements.getElement(i));
706      if (Enum.isEnumerator()) {
707        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
708        Buffer.addChild(ElemDie);
709      }
710    }
711  }
712    break;
713  case dwarf::DW_TAG_subroutine_type: {
714    // Add return type.
715    DIArray Elements = CTy.getTypeArray();
716    DIDescriptor RTy = Elements.getElement(0);
717    addType(&Buffer, DIType(RTy));
718
719    bool isPrototyped = true;
720    // Add arguments.
721    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
722      DIDescriptor Ty = Elements.getElement(i);
723      if (Ty.isUnspecifiedParameter()) {
724        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
725        Buffer.addChild(Arg);
726        isPrototyped = false;
727      } else {
728        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
729        addType(Arg, DIType(Ty));
730        Buffer.addChild(Arg);
731      }
732    }
733    // Add prototype flag.
734    if (isPrototyped)
735      addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
736  }
737    break;
738  case dwarf::DW_TAG_structure_type:
739  case dwarf::DW_TAG_union_type:
740  case dwarf::DW_TAG_class_type: {
741    // Add elements to structure type.
742    DIArray Elements = CTy.getTypeArray();
743
744    // A forward struct declared type may not have elements available.
745    unsigned N = Elements.getNumElements();
746    if (N == 0)
747      break;
748
749    // Add elements to structure type.
750    for (unsigned i = 0; i < N; ++i) {
751      DIDescriptor Element = Elements.getElement(i);
752      DIE *ElemDie = NULL;
753      if (Element.isSubprogram()) {
754        DISubprogram SP(Element);
755        ElemDie = DD->createSubprogramDIE(DISubprogram(Element));
756        if (SP.isProtected())
757          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
758                  dwarf::DW_ACCESS_protected);
759        else if (SP.isPrivate())
760          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
761                  dwarf::DW_ACCESS_private);
762        else
763          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
764            dwarf::DW_ACCESS_public);
765        if (SP.isExplicit())
766          addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
767      }
768      else if (Element.isVariable()) {
769        DIVariable DV(Element);
770        ElemDie = new DIE(dwarf::DW_TAG_variable);
771        addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
772                  DV.getName());
773        addType(ElemDie, DV.getType());
774        addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
775        addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
776        addSourceLine(ElemDie, DV);
777      } else if (Element.isDerivedType())
778        ElemDie = createMemberDIE(DIDerivedType(Element));
779      else
780        continue;
781      Buffer.addChild(ElemDie);
782    }
783
784    if (CTy.isAppleBlockExtension())
785      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
786
787    unsigned RLang = CTy.getRunTimeLang();
788    if (RLang)
789      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
790              dwarf::DW_FORM_data1, RLang);
791
792    DICompositeType ContainingType = CTy.getContainingType();
793    if (DIDescriptor(ContainingType).isCompositeType())
794      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
795                  getOrCreateTypeDIE(DIType(ContainingType)));
796    else {
797      DIDescriptor Context = CTy.getContext();
798      addToContextOwner(&Buffer, Context);
799    }
800
801    if (CTy.isObjcClassComplete())
802      addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
803              dwarf::DW_FORM_flag, 1);
804
805    if (Tag == dwarf::DW_TAG_class_type)
806      addTemplateParams(Buffer, CTy.getTemplateParams());
807
808    break;
809  }
810  default:
811    break;
812  }
813
814  // Add name if not anonymous or intermediate type.
815  if (!Name.empty())
816    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
817
818  if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
819      || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
820    {
821    // Add size if non-zero (derived types might be zero-sized.)
822    if (Size)
823      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
824    else {
825      // Add zero size if it is not a forward declaration.
826      if (CTy.isForwardDecl())
827        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
828      else
829        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
830    }
831
832    // Add source line info if available.
833    if (!CTy.isForwardDecl())
834      addSourceLine(&Buffer, CTy);
835  }
836}
837
838/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
839/// for the given DITemplateTypeParameter.
840DIE *
841CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
842  DIE *ParamDIE = getDIE(TP);
843  if (ParamDIE)
844    return ParamDIE;
845
846  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
847  addType(ParamDIE, TP.getType());
848  addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
849  return ParamDIE;
850}
851
852/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
853/// for the given DITemplateValueParameter.
854DIE *
855CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
856  DIE *ParamDIE = getDIE(TPV);
857  if (ParamDIE)
858    return ParamDIE;
859
860  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
861  addType(ParamDIE, TPV.getType());
862  if (!TPV.getName().empty())
863    addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
864  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
865          TPV.getValue());
866  return ParamDIE;
867}
868
869/// getOrCreateNameSpace - Create a DIE for DINameSpace.
870DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
871  DIE *NDie = getDIE(NS);
872  if (NDie)
873    return NDie;
874  NDie = new DIE(dwarf::DW_TAG_namespace);
875  insertDIE(NS, NDie);
876  if (!NS.getName().empty())
877    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
878  addSourceLine(NDie, NS);
879  addToContextOwner(NDie, NS.getContext());
880  return NDie;
881}
882
883/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
884void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
885  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
886  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
887  int64_t L = SR.getLo();
888  int64_t H = SR.getHi();
889
890  // The L value defines the lower bounds which is typically zero for C/C++. The
891  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
892  // of the array. If L > H then do not emit DW_AT_lower_bound and
893  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
894  // array has one element and in such case do not emit lower bound.
895
896  if (L > H) {
897    Buffer.addChild(DW_Subrange);
898    return;
899  }
900  if (L)
901    addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
902  addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
903  Buffer.addChild(DW_Subrange);
904}
905
906/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
907void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
908                                        DICompositeType *CTy) {
909  Buffer.setTag(dwarf::DW_TAG_array_type);
910  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
911    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
912
913  // Emit derived type.
914  addType(&Buffer, CTy->getTypeDerivedFrom());
915  DIArray Elements = CTy->getTypeArray();
916
917  // Get an anonymous type for index type.
918  DIE *IdxTy = getIndexTyDie();
919  if (!IdxTy) {
920    // Construct an anonymous type for index type.
921    IdxTy = new DIE(dwarf::DW_TAG_base_type);
922    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
923    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
924            dwarf::DW_ATE_signed);
925    addDie(IdxTy);
926    setIndexTyDie(IdxTy);
927  }
928
929  // Add subranges to array type.
930  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
931    DIDescriptor Element = Elements.getElement(i);
932    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
933      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
934  }
935}
936
937/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
938DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
939  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
940  StringRef Name = ETy.getName();
941  addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
942  int64_t Value = ETy.getEnumValue();
943  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
944  return Enumerator;
945}
946
947/// createMemberDIE - Create new member DIE.
948DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
949  DIE *MemberDie = new DIE(DT.getTag());
950  StringRef Name = DT.getName();
951  if (!Name.empty())
952    addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
953
954  addType(MemberDie, DT.getTypeDerivedFrom());
955
956  addSourceLine(MemberDie, DT);
957
958  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
959  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
960
961  uint64_t Size = DT.getSizeInBits();
962  uint64_t FieldSize = DT.getOriginalTypeSize();
963
964  if (Size != FieldSize) {
965    // Handle bitfield.
966    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
967    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
968
969    uint64_t Offset = DT.getOffsetInBits();
970    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
971    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
972    uint64_t FieldOffset = (HiMark - FieldSize);
973    Offset -= FieldOffset;
974
975    // Maybe we need to work from the other end.
976    if (Asm->getTargetData().isLittleEndian())
977      Offset = FieldSize - (Offset + Size);
978    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
979
980    // Here WD_AT_data_member_location points to the anonymous
981    // field that includes this bit field.
982    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
983
984  } else
985    // This is not a bitfield.
986    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
987
988  if (DT.getTag() == dwarf::DW_TAG_inheritance
989      && DT.isVirtual()) {
990
991    // For C++, virtual base classes are not at fixed offset. Use following
992    // expression to extract appropriate offset from vtable.
993    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
994
995    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
996    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
997    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
998    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
999    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1000    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1001    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1002    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1003
1004    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1005             VBaseLocationDie);
1006  } else
1007    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1008
1009  if (DT.isProtected())
1010    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1011            dwarf::DW_ACCESS_protected);
1012  else if (DT.isPrivate())
1013    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1014            dwarf::DW_ACCESS_private);
1015  // Otherwise C++ member and base classes are considered public.
1016  else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1017    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1018            dwarf::DW_ACCESS_public);
1019  if (DT.isVirtual())
1020    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1021            dwarf::DW_VIRTUALITY_virtual);
1022
1023  // Objective-C properties.
1024  StringRef PropertyName = DT.getObjCPropertyName();
1025  if (!PropertyName.empty()) {
1026    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
1027              PropertyName);
1028    StringRef GetterName = DT.getObjCPropertyGetterName();
1029    if (!GetterName.empty())
1030      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
1031                dwarf::DW_FORM_string, GetterName);
1032    StringRef SetterName = DT.getObjCPropertySetterName();
1033    if (!SetterName.empty())
1034      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
1035                dwarf::DW_FORM_string, SetterName);
1036    unsigned PropertyAttributes = 0;
1037    if (DT.isReadOnlyObjCProperty())
1038      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1039    if (DT.isReadWriteObjCProperty())
1040      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1041    if (DT.isAssignObjCProperty())
1042      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1043    if (DT.isRetainObjCProperty())
1044      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1045    if (DT.isCopyObjCProperty())
1046      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1047    if (DT.isNonAtomicObjCProperty())
1048      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1049    if (PropertyAttributes)
1050      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1051              PropertyAttributes);
1052  }
1053  return MemberDie;
1054}
1055