DwarfCompileUnit.cpp revision e9ae06ca987b6c3b6cfbcd50ab85386565a4e0ca
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, 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  DIDescriptor Context = Ty.getContext();
613  if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl()
614      && (Context.isCompileUnit() || Context.isFile() || Context.isNameSpace()))
615    addGlobalType(Ty.getName(), Entry->getEntry());
616}
617
618/// addPubTypes - Add type for pubtypes section.
619void CompileUnit::addPubTypes(DISubprogram SP) {
620  DICompositeType SPTy = SP.getType();
621  unsigned SPTag = SPTy.getTag();
622  if (SPTag != dwarf::DW_TAG_subroutine_type)
623    return;
624
625  DIArray Args = SPTy.getTypeArray();
626  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
627    DIType ATy(Args.getElement(i));
628    if (!ATy.Verify())
629      continue;
630    DICompositeType CATy = getDICompositeType(ATy);
631    if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
632        && !CATy.isForwardDecl()) {
633      if (DIEEntry *Entry = getDIEEntry(CATy))
634        addGlobalType(CATy.getName(), Entry->getEntry());
635    }
636  }
637}
638
639/// constructTypeDIE - Construct basic type die from DIBasicType.
640void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
641  // Get core information.
642  StringRef Name = BTy.getName();
643  Buffer.setTag(dwarf::DW_TAG_base_type);
644  addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
645          BTy.getEncoding());
646
647  // Add name if not anonymous or intermediate type.
648  if (!Name.empty())
649    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
650  uint64_t Size = BTy.getSizeInBits() >> 3;
651  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
652}
653
654/// constructTypeDIE - Construct derived type die from DIDerivedType.
655void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
656  // Get core information.
657  StringRef Name = DTy.getName();
658  uint64_t Size = DTy.getSizeInBits() >> 3;
659  unsigned Tag = DTy.getTag();
660
661  // FIXME - Workaround for templates.
662  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
663
664  Buffer.setTag(Tag);
665
666  // Map to main type, void will not have a type.
667  DIType FromTy = DTy.getTypeDerivedFrom();
668  addType(&Buffer, FromTy);
669
670  // Add name if not anonymous or intermediate type.
671  if (!Name.empty())
672    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
673
674  // Add size if non-zero (derived types might be zero-sized.)
675  if (Size)
676    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
677
678  // Add source line info if available and TyDesc is not a forward declaration.
679  if (!DTy.isForwardDecl())
680    addSourceLine(&Buffer, DTy);
681}
682
683/// constructTypeDIE - Construct type DIE from DICompositeType.
684void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
685  // Get core information.
686  StringRef Name = CTy.getName();
687
688  uint64_t Size = CTy.getSizeInBits() >> 3;
689  unsigned Tag = CTy.getTag();
690  Buffer.setTag(Tag);
691
692  switch (Tag) {
693  case dwarf::DW_TAG_vector_type:
694  case dwarf::DW_TAG_array_type:
695    constructArrayTypeDIE(Buffer, &CTy);
696    break;
697  case dwarf::DW_TAG_enumeration_type: {
698    DIArray Elements = CTy.getTypeArray();
699
700    // Add enumerators to enumeration type.
701    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
702      DIE *ElemDie = NULL;
703      DIDescriptor Enum(Elements.getElement(i));
704      if (Enum.isEnumerator()) {
705        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
706        Buffer.addChild(ElemDie);
707      }
708    }
709  }
710    break;
711  case dwarf::DW_TAG_subroutine_type: {
712    // Add return type.
713    DIArray Elements = CTy.getTypeArray();
714    DIDescriptor RTy = Elements.getElement(0);
715    addType(&Buffer, DIType(RTy));
716
717    bool isPrototyped = true;
718    // Add arguments.
719    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
720      DIDescriptor Ty = Elements.getElement(i);
721      if (Ty.isUnspecifiedParameter()) {
722        DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
723        Buffer.addChild(Arg);
724        isPrototyped = false;
725      } else {
726        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
727        addType(Arg, DIType(Ty));
728        Buffer.addChild(Arg);
729      }
730    }
731    // Add prototype flag.
732    if (isPrototyped)
733      addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
734  }
735    break;
736  case dwarf::DW_TAG_structure_type:
737  case dwarf::DW_TAG_union_type:
738  case dwarf::DW_TAG_class_type: {
739    // Add elements to structure type.
740    DIArray Elements = CTy.getTypeArray();
741
742    // A forward struct declared type may not have elements available.
743    unsigned N = Elements.getNumElements();
744    if (N == 0)
745      break;
746
747    // Add elements to structure type.
748    for (unsigned i = 0; i < N; ++i) {
749      DIDescriptor Element = Elements.getElement(i);
750      DIE *ElemDie = NULL;
751      if (Element.isSubprogram()) {
752        DISubprogram SP(Element);
753        ElemDie = DD->createSubprogramDIE(DISubprogram(Element));
754        if (SP.isProtected())
755          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
756                  dwarf::DW_ACCESS_protected);
757        else if (SP.isPrivate())
758          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
759                  dwarf::DW_ACCESS_private);
760        else
761          addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
762            dwarf::DW_ACCESS_public);
763        if (SP.isExplicit())
764          addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
765      }
766      else if (Element.isVariable()) {
767        DIVariable DV(Element);
768        ElemDie = new DIE(dwarf::DW_TAG_variable);
769        addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
770                  DV.getName());
771        addType(ElemDie, DV.getType());
772        addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
773        addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
774        addSourceLine(ElemDie, DV);
775      } else if (Element.isDerivedType())
776        ElemDie = createMemberDIE(DIDerivedType(Element));
777      else
778        continue;
779      Buffer.addChild(ElemDie);
780    }
781
782    if (CTy.isAppleBlockExtension())
783      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
784
785    unsigned RLang = CTy.getRunTimeLang();
786    if (RLang)
787      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
788              dwarf::DW_FORM_data1, RLang);
789
790    DICompositeType ContainingType = CTy.getContainingType();
791    if (DIDescriptor(ContainingType).isCompositeType())
792      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
793                  getOrCreateTypeDIE(DIType(ContainingType)));
794    else {
795      DIDescriptor Context = CTy.getContext();
796      addToContextOwner(&Buffer, Context);
797    }
798
799    if (CTy.isObjcClassComplete())
800      addUInt(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type,
801              dwarf::DW_FORM_flag, 1);
802
803    if (Tag == dwarf::DW_TAG_class_type)
804      addTemplateParams(Buffer, CTy.getTemplateParams());
805
806    break;
807  }
808  default:
809    break;
810  }
811
812  // Add name if not anonymous or intermediate type.
813  if (!Name.empty())
814    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
815
816  if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
817      || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
818    {
819    // Add size if non-zero (derived types might be zero-sized.)
820    if (Size)
821      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
822    else {
823      // Add zero size if it is not a forward declaration.
824      if (CTy.isForwardDecl())
825        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
826      else
827        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
828    }
829
830    // Add source line info if available.
831    if (!CTy.isForwardDecl())
832      addSourceLine(&Buffer, CTy);
833  }
834}
835
836/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
837/// for the given DITemplateTypeParameter.
838DIE *
839CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
840  DIE *ParamDIE = getDIE(TP);
841  if (ParamDIE)
842    return ParamDIE;
843
844  ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
845  addType(ParamDIE, TP.getType());
846  addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
847  return ParamDIE;
848}
849
850/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
851/// for the given DITemplateValueParameter.
852DIE *
853CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
854  DIE *ParamDIE = getDIE(TPV);
855  if (ParamDIE)
856    return ParamDIE;
857
858  ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
859  addType(ParamDIE, TPV.getType());
860  if (!TPV.getName().empty())
861    addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
862  addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
863          TPV.getValue());
864  return ParamDIE;
865}
866
867/// getOrCreateNameSpace - Create a DIE for DINameSpace.
868DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
869  DIE *NDie = getDIE(NS);
870  if (NDie)
871    return NDie;
872  NDie = new DIE(dwarf::DW_TAG_namespace);
873  insertDIE(NS, NDie);
874  if (!NS.getName().empty())
875    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
876  addSourceLine(NDie, NS);
877  addToContextOwner(NDie, NS.getContext());
878  return NDie;
879}
880
881/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
882void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
883  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
884  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
885  int64_t L = SR.getLo();
886  int64_t H = SR.getHi();
887
888  // The L value defines the lower bounds which is typically zero for C/C++. The
889  // H value is the upper bounds.  Values are 64 bit.  H - L + 1 is the size
890  // of the array. If L > H then do not emit DW_AT_lower_bound and
891  // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
892  // array has one element and in such case do not emit lower bound.
893
894  if (L > H) {
895    Buffer.addChild(DW_Subrange);
896    return;
897  }
898  if (L)
899    addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
900  addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
901  Buffer.addChild(DW_Subrange);
902}
903
904/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
905void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
906                                        DICompositeType *CTy) {
907  Buffer.setTag(dwarf::DW_TAG_array_type);
908  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
909    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
910
911  // Emit derived type.
912  addType(&Buffer, CTy->getTypeDerivedFrom());
913  DIArray Elements = CTy->getTypeArray();
914
915  // Get an anonymous type for index type.
916  DIE *IdxTy = getIndexTyDie();
917  if (!IdxTy) {
918    // Construct an anonymous type for index type.
919    IdxTy = new DIE(dwarf::DW_TAG_base_type);
920    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
921    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
922            dwarf::DW_ATE_signed);
923    addDie(IdxTy);
924    setIndexTyDie(IdxTy);
925  }
926
927  // Add subranges to array type.
928  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
929    DIDescriptor Element = Elements.getElement(i);
930    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
931      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
932  }
933}
934
935/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
936DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {
937  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
938  StringRef Name = ETy.getName();
939  addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
940  int64_t Value = ETy.getEnumValue();
941  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
942  return Enumerator;
943}
944
945/// createMemberDIE - Create new member DIE.
946DIE *CompileUnit::createMemberDIE(DIDerivedType DT) {
947  DIE *MemberDie = new DIE(DT.getTag());
948  StringRef Name = DT.getName();
949  if (!Name.empty())
950    addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
951
952  addType(MemberDie, DT.getTypeDerivedFrom());
953
954  addSourceLine(MemberDie, DT);
955
956  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
957  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
958
959  uint64_t Size = DT.getSizeInBits();
960  uint64_t FieldSize = DT.getOriginalTypeSize();
961
962  if (Size != FieldSize) {
963    // Handle bitfield.
964    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
965    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
966
967    uint64_t Offset = DT.getOffsetInBits();
968    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
969    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
970    uint64_t FieldOffset = (HiMark - FieldSize);
971    Offset -= FieldOffset;
972
973    // Maybe we need to work from the other end.
974    if (Asm->getTargetData().isLittleEndian())
975      Offset = FieldSize - (Offset + Size);
976    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
977
978    // Here WD_AT_data_member_location points to the anonymous
979    // field that includes this bit field.
980    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
981
982  } else
983    // This is not a bitfield.
984    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
985
986  if (DT.getTag() == dwarf::DW_TAG_inheritance
987      && DT.isVirtual()) {
988
989    // For C++, virtual base classes are not at fixed offset. Use following
990    // expression to extract appropriate offset from vtable.
991    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
992
993    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
994    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
995    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
996    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
997    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
998    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
999    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1000    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1001
1002    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1003             VBaseLocationDie);
1004  } else
1005    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1006
1007  if (DT.isProtected())
1008    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1009            dwarf::DW_ACCESS_protected);
1010  else if (DT.isPrivate())
1011    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1012            dwarf::DW_ACCESS_private);
1013  // Otherwise C++ member and base classes are considered public.
1014  else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1015    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1016            dwarf::DW_ACCESS_public);
1017  if (DT.isVirtual())
1018    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1019            dwarf::DW_VIRTUALITY_virtual);
1020
1021  // Objective-C properties.
1022  StringRef PropertyName = DT.getObjCPropertyName();
1023  if (!PropertyName.empty()) {
1024    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,
1025              PropertyName);
1026    StringRef GetterName = DT.getObjCPropertyGetterName();
1027    if (!GetterName.empty())
1028      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,
1029                dwarf::DW_FORM_string, GetterName);
1030    StringRef SetterName = DT.getObjCPropertySetterName();
1031    if (!SetterName.empty())
1032      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,
1033                dwarf::DW_FORM_string, SetterName);
1034    unsigned PropertyAttributes = 0;
1035    if (DT.isReadOnlyObjCProperty())
1036      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;
1037    if (DT.isReadWriteObjCProperty())
1038      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite;
1039    if (DT.isAssignObjCProperty())
1040      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign;
1041    if (DT.isRetainObjCProperty())
1042      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain;
1043    if (DT.isCopyObjCProperty())
1044      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy;
1045    if (DT.isNonAtomicObjCProperty())
1046      PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic;
1047    if (PropertyAttributes)
1048      addUInt(MemberDie, dwarf::DW_AT_APPLE_property_attribute, 0,
1049              PropertyAttributes);
1050  }
1051  return MemberDie;
1052}
1053