1//===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
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 implements the DIBuilder.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/DIBuilder.h"
15#include "llvm/Constants.h"
16#include "llvm/DebugInfo.h"
17#include "llvm/IntrinsicInst.h"
18#include "llvm/Module.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/Support/Debug.h"
21#include "llvm/Support/Dwarf.h"
22
23using namespace llvm;
24using namespace llvm::dwarf;
25
26static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
27  assert((Tag & LLVMDebugVersionMask) == 0 &&
28         "Tag too large for debug encoding!");
29  return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
30}
31
32DIBuilder::DIBuilder(Module &m)
33  : M(m), VMContext(M.getContext()), TheCU(0), TempEnumTypes(0),
34    TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
35    ValueFn(0)
36{}
37
38/// finalize - Construct any deferred debug info descriptors.
39void DIBuilder::finalize() {
40  DIArray Enums = getOrCreateArray(AllEnumTypes);
41  DIType(TempEnumTypes).replaceAllUsesWith(Enums);
42
43  DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
44  DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
45
46  DIArray SPs = getOrCreateArray(AllSubprograms);
47  DIType(TempSubprograms).replaceAllUsesWith(SPs);
48  for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
49    DISubprogram SP(SPs.getElement(i));
50    SmallVector<Value *, 4> Variables;
51    if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
52      for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
53        Variables.push_back(NMD->getOperand(ii));
54      NMD->eraseFromParent();
55    }
56    if (MDNode *Temp = SP.getVariablesNodes()) {
57      DIArray AV = getOrCreateArray(Variables);
58      DIType(Temp).replaceAllUsesWith(AV);
59    }
60  }
61
62  DIArray GVs = getOrCreateArray(AllGVs);
63  DIType(TempGVs).replaceAllUsesWith(GVs);
64}
65
66/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
67/// N.
68static MDNode *getNonCompileUnitScope(MDNode *N) {
69  if (DIDescriptor(N).isCompileUnit())
70    return NULL;
71  return N;
72}
73
74/// createCompileUnit - A CompileUnit provides an anchor for all debugging
75/// information generated during this instance of compilation.
76void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
77                                  StringRef Directory, StringRef Producer,
78                                  bool isOptimized, StringRef Flags,
79                                  unsigned RunTimeVer) {
80  assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
81          (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
82         "Invalid Language tag");
83  assert(!Filename.empty() &&
84         "Unable to create compile unit without filename");
85  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
86  TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
87  Value *THElts[] = { TempEnumTypes };
88  MDNode *EnumHolder = MDNode::get(VMContext, THElts);
89
90  TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
91  Value *TRElts[] = { TempRetainTypes };
92  MDNode *RetainHolder = MDNode::get(VMContext, TRElts);
93
94  TempSubprograms = MDNode::getTemporary(VMContext, TElts);
95  Value *TSElts[] = { TempSubprograms };
96  MDNode *SPHolder = MDNode::get(VMContext, TSElts);
97
98  TempGVs = MDNode::getTemporary(VMContext, TElts);
99  Value *TVElts[] = { TempGVs };
100  MDNode *GVHolder = MDNode::get(VMContext, TVElts);
101
102  Value *Elts[] = {
103    GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
104    Constant::getNullValue(Type::getInt32Ty(VMContext)),
105    ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
106    MDString::get(VMContext, Filename),
107    MDString::get(VMContext, Directory),
108    MDString::get(VMContext, Producer),
109    // Deprecate isMain field.
110    ConstantInt::get(Type::getInt1Ty(VMContext), true), // isMain
111    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
112    MDString::get(VMContext, Flags),
113    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
114    EnumHolder,
115    RetainHolder,
116    SPHolder,
117    GVHolder
118  };
119  TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
120
121  // Create a named metadata so that it is easier to find cu in a module.
122  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
123  NMD->addOperand(TheCU);
124}
125
126/// createFile - Create a file descriptor to hold debugging information
127/// for a file.
128DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
129  assert(TheCU && "Unable to create DW_TAG_file_type without CompileUnit");
130  assert(!Filename.empty() && "Unable to create file without name");
131  Value *Elts[] = {
132    GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
133    MDString::get(VMContext, Filename),
134    MDString::get(VMContext, Directory),
135    NULL // TheCU
136  };
137  return DIFile(MDNode::get(VMContext, Elts));
138}
139
140/// createEnumerator - Create a single enumerator value.
141DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) {
142  assert(!Name.empty() && "Unable to create enumerator without name");
143  Value *Elts[] = {
144    GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
145    MDString::get(VMContext, Name),
146    ConstantInt::get(Type::getInt64Ty(VMContext), Val)
147  };
148  return DIEnumerator(MDNode::get(VMContext, Elts));
149}
150
151/// createNullPtrType - Create C++0x nullptr type.
152DIType DIBuilder::createNullPtrType(StringRef Name) {
153  assert(!Name.empty() && "Unable to create type without name");
154  // nullptr is encoded in DIBasicType format. Line number, filename,
155  // ,size, alignment, offset and flags are always empty here.
156  Value *Elts[] = {
157    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
158    NULL, //TheCU,
159    MDString::get(VMContext, Name),
160    NULL, // Filename
161    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
162    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
163    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
164    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
165    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
166    ConstantInt::get(Type::getInt32Ty(VMContext), 0)  // Encoding
167  };
168  return DIType(MDNode::get(VMContext, Elts));
169}
170
171/// createBasicType - Create debugging information entry for a basic
172/// type, e.g 'char'.
173DIType DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
174                                  uint64_t AlignInBits,
175                                  unsigned Encoding) {
176  assert(!Name.empty() && "Unable to create type without name");
177  // Basic types are encoded in DIBasicType format. Line number, filename,
178  // offset and flags are always empty here.
179  Value *Elts[] = {
180    GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
181    NULL, //TheCU,
182    MDString::get(VMContext, Name),
183    NULL, // Filename
184    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
185    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
186    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
187    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
188    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
189    ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
190  };
191  return DIType(MDNode::get(VMContext, Elts));
192}
193
194/// createQualifiedType - Create debugging information entry for a qualified
195/// type, e.g. 'const int'.
196DIType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
197  // Qualified types are encoded in DIDerivedType format.
198  Value *Elts[] = {
199    GetTagConstant(VMContext, Tag),
200    NULL, //TheCU,
201    MDString::get(VMContext, StringRef()), // Empty name.
202    NULL, // Filename
203    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
204    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
205    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
206    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
207    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
208    FromTy
209  };
210  return DIType(MDNode::get(VMContext, Elts));
211}
212
213/// createPointerType - Create debugging information entry for a pointer.
214DIType DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
215                                    uint64_t AlignInBits, StringRef Name) {
216  // Pointer types are encoded in DIDerivedType format.
217  Value *Elts[] = {
218    GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
219    NULL, //TheCU,
220    MDString::get(VMContext, Name),
221    NULL, // Filename
222    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
223    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
224    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
225    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
226    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
227    PointeeTy
228  };
229  return DIType(MDNode::get(VMContext, Elts));
230}
231
232/// createReferenceType - Create debugging information entry for a reference
233/// type.
234DIType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
235  assert(RTy.Verify() && "Unable to create reference type");
236  // References are encoded in DIDerivedType format.
237  Value *Elts[] = {
238    GetTagConstant(VMContext, Tag),
239    NULL, // TheCU,
240    NULL, // Name
241    NULL, // Filename
242    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
243    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
244    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
245    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
246    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
247    RTy
248  };
249  return DIType(MDNode::get(VMContext, Elts));
250}
251
252/// createTypedef - Create debugging information entry for a typedef.
253DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
254                                unsigned LineNo, DIDescriptor Context) {
255  // typedefs are encoded in DIDerivedType format.
256  assert(Ty.Verify() && "Invalid typedef type!");
257  Value *Elts[] = {
258    GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
259    getNonCompileUnitScope(Context),
260    MDString::get(VMContext, Name),
261    File,
262    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
263    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
264    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
265    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
266    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
267    Ty
268  };
269  return DIType(MDNode::get(VMContext, Elts));
270}
271
272/// createFriend - Create debugging information entry for a 'friend'.
273DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
274  // typedefs are encoded in DIDerivedType format.
275  assert(Ty.Verify() && "Invalid type!");
276  assert(FriendTy.Verify() && "Invalid friend type!");
277  Value *Elts[] = {
278    GetTagConstant(VMContext, dwarf::DW_TAG_friend),
279    Ty,
280    NULL, // Name
281    Ty.getFile(),
282    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
283    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
284    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
285    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
286    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
287    FriendTy
288  };
289  return DIType(MDNode::get(VMContext, Elts));
290}
291
292/// createInheritance - Create debugging information entry to establish
293/// inheritance relationship between two types.
294DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
295                                    uint64_t BaseOffset, unsigned Flags) {
296  assert(Ty.Verify() && "Unable to create inheritance");
297  // TAG_inheritance is encoded in DIDerivedType format.
298  Value *Elts[] = {
299    GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
300    Ty,
301    NULL, // Name
302    Ty.getFile(),
303    ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
304    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
305    ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
306    ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
307    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
308    BaseTy
309  };
310  return DIType(MDNode::get(VMContext, Elts));
311}
312
313/// createMemberType - Create debugging information entry for a member.
314DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
315                                   DIFile File, unsigned LineNumber,
316                                   uint64_t SizeInBits, uint64_t AlignInBits,
317                                   uint64_t OffsetInBits, unsigned Flags,
318                                   DIType Ty) {
319  // TAG_member is encoded in DIDerivedType format.
320  Value *Elts[] = {
321    GetTagConstant(VMContext, dwarf::DW_TAG_member),
322    getNonCompileUnitScope(Scope),
323    MDString::get(VMContext, Name),
324    File,
325    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
326    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
327    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
328    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
329    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
330    Ty
331  };
332  return DIType(MDNode::get(VMContext, Elts));
333}
334
335/// createObjCIVar - Create debugging information entry for Objective-C
336/// instance variable.
337DIType DIBuilder::createObjCIVar(StringRef Name,
338                                 DIFile File, unsigned LineNumber,
339                                 uint64_t SizeInBits, uint64_t AlignInBits,
340                                 uint64_t OffsetInBits, unsigned Flags,
341                                 DIType Ty, StringRef PropertyName,
342                                 StringRef GetterName, StringRef SetterName,
343                                 unsigned PropertyAttributes) {
344  // TAG_member is encoded in DIDerivedType format.
345  Value *Elts[] = {
346    GetTagConstant(VMContext, dwarf::DW_TAG_member),
347    getNonCompileUnitScope(File),
348    MDString::get(VMContext, Name),
349    File,
350    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
351    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
352    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
353    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
354    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
355    Ty,
356    MDString::get(VMContext, PropertyName),
357    MDString::get(VMContext, GetterName),
358    MDString::get(VMContext, SetterName),
359    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
360  };
361  return DIType(MDNode::get(VMContext, Elts));
362}
363
364/// createObjCIVar - Create debugging information entry for Objective-C
365/// instance variable.
366DIType DIBuilder::createObjCIVar(StringRef Name,
367                                 DIFile File, unsigned LineNumber,
368                                 uint64_t SizeInBits, uint64_t AlignInBits,
369                                 uint64_t OffsetInBits, unsigned Flags,
370                                 DIType Ty, MDNode *PropertyNode) {
371  // TAG_member is encoded in DIDerivedType format.
372  Value *Elts[] = {
373    GetTagConstant(VMContext, dwarf::DW_TAG_member),
374    getNonCompileUnitScope(File),
375    MDString::get(VMContext, Name),
376    File,
377    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
378    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
379    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
380    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
381    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
382    Ty,
383    PropertyNode
384  };
385  return DIType(MDNode::get(VMContext, Elts));
386}
387
388/// createObjCProperty - Create debugging information entry for Objective-C
389/// property.
390DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
391                                             DIFile File, unsigned LineNumber,
392                                             StringRef GetterName,
393                                             StringRef SetterName,
394                                             unsigned PropertyAttributes,
395                                             DIType Ty) {
396  Value *Elts[] = {
397    GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
398    MDString::get(VMContext, Name),
399    File,
400    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
401    MDString::get(VMContext, GetterName),
402    MDString::get(VMContext, SetterName),
403    ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
404    Ty
405  };
406  return DIObjCProperty(MDNode::get(VMContext, Elts));
407}
408
409/// createTemplateTypeParameter - Create debugging information for template
410/// type parameter.
411DITemplateTypeParameter
412DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
413                                       DIType Ty, MDNode *File, unsigned LineNo,
414                                       unsigned ColumnNo) {
415  Value *Elts[] = {
416    GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
417    getNonCompileUnitScope(Context),
418    MDString::get(VMContext, Name),
419    Ty,
420    File,
421    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
422    ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
423  };
424  return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
425}
426
427/// createTemplateValueParameter - Create debugging information for template
428/// value parameter.
429DITemplateValueParameter
430DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
431                                        DIType Ty, uint64_t Val,
432                                        MDNode *File, unsigned LineNo,
433                                        unsigned ColumnNo) {
434  Value *Elts[] = {
435    GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
436    getNonCompileUnitScope(Context),
437    MDString::get(VMContext, Name),
438    Ty,
439    ConstantInt::get(Type::getInt64Ty(VMContext), Val),
440    File,
441    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
442    ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
443  };
444  return DITemplateValueParameter(MDNode::get(VMContext, Elts));
445}
446
447/// createClassType - Create debugging information entry for a class.
448DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
449                                  DIFile File, unsigned LineNumber,
450                                  uint64_t SizeInBits, uint64_t AlignInBits,
451                                  uint64_t OffsetInBits, unsigned Flags,
452                                  DIType DerivedFrom, DIArray Elements,
453                                  MDNode *VTableHolder,
454                                  MDNode *TemplateParams) {
455 // TAG_class_type is encoded in DICompositeType format.
456  Value *Elts[] = {
457    GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
458    getNonCompileUnitScope(Context),
459    MDString::get(VMContext, Name),
460    File,
461    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
462    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
463    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
464    ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
465    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
466    DerivedFrom,
467    Elements,
468    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
469    VTableHolder,
470    TemplateParams
471  };
472  return DIType(MDNode::get(VMContext, Elts));
473}
474
475/// createStructType - Create debugging information entry for a struct.
476DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name,
477                                   DIFile File, unsigned LineNumber,
478                                   uint64_t SizeInBits, uint64_t AlignInBits,
479                                   unsigned Flags, DIArray Elements,
480                                   unsigned RunTimeLang) {
481 // TAG_structure_type is encoded in DICompositeType format.
482  Value *Elts[] = {
483    GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
484    getNonCompileUnitScope(Context),
485    MDString::get(VMContext, Name),
486    File,
487    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
488    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
489    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
490    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
491    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
492    NULL,
493    Elements,
494    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
495    Constant::getNullValue(Type::getInt32Ty(VMContext))
496  };
497  return DIType(MDNode::get(VMContext, Elts));
498}
499
500/// createUnionType - Create debugging information entry for an union.
501DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
502                                  DIFile File,
503                                  unsigned LineNumber, uint64_t SizeInBits,
504                                  uint64_t AlignInBits, unsigned Flags,
505                                  DIArray Elements, unsigned RunTimeLang) {
506  // TAG_union_type is encoded in DICompositeType format.
507  Value *Elts[] = {
508    GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
509    getNonCompileUnitScope(Scope),
510    MDString::get(VMContext, Name),
511    File,
512    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
513    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
514    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
515    ConstantInt::get(Type::getInt64Ty(VMContext), 0),
516    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
517    NULL,
518    Elements,
519    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
520    Constant::getNullValue(Type::getInt32Ty(VMContext))
521  };
522  return DIType(MDNode::get(VMContext, Elts));
523}
524
525/// createSubroutineType - Create subroutine type.
526DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
527  // TAG_subroutine_type is encoded in DICompositeType format.
528  Value *Elts[] = {
529    GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
530    Constant::getNullValue(Type::getInt32Ty(VMContext)),
531    MDString::get(VMContext, ""),
532    Constant::getNullValue(Type::getInt32Ty(VMContext)),
533    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
534    ConstantInt::get(Type::getInt64Ty(VMContext), 0),
535    ConstantInt::get(Type::getInt64Ty(VMContext), 0),
536    ConstantInt::get(Type::getInt64Ty(VMContext), 0),
537    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
538    NULL,
539    ParameterTypes,
540    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
541    Constant::getNullValue(Type::getInt32Ty(VMContext))
542  };
543  return DIType(MDNode::get(VMContext, Elts));
544}
545
546/// createEnumerationType - Create debugging information entry for an
547/// enumeration.
548DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name,
549                                        DIFile File, unsigned LineNumber,
550                                        uint64_t SizeInBits,
551                                        uint64_t AlignInBits,
552                                        DIArray Elements,
553                                        DIType ClassType, unsigned Flags) {
554  // TAG_enumeration_type is encoded in DICompositeType format.
555  Value *Elts[] = {
556    GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
557    getNonCompileUnitScope(Scope),
558    MDString::get(VMContext, Name),
559    File,
560    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
561    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
562    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
563    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
564    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
565    ClassType,
566    Elements,
567    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
568    Constant::getNullValue(Type::getInt32Ty(VMContext))
569  };
570  MDNode *Node = MDNode::get(VMContext, Elts);
571  AllEnumTypes.push_back(Node);
572  return DIType(Node);
573}
574
575/// createArrayType - Create debugging information entry for an array.
576DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
577                                  DIType Ty, DIArray Subscripts) {
578  // TAG_array_type is encoded in DICompositeType format.
579  Value *Elts[] = {
580    GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
581    NULL, //TheCU,
582    MDString::get(VMContext, ""),
583    NULL, //TheCU,
584    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
585    ConstantInt::get(Type::getInt64Ty(VMContext), Size),
586    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
587    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
588    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
589    Ty,
590    Subscripts,
591    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
592    Constant::getNullValue(Type::getInt32Ty(VMContext))
593  };
594  return DIType(MDNode::get(VMContext, Elts));
595}
596
597/// createVectorType - Create debugging information entry for a vector.
598DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
599                                   DIType Ty, DIArray Subscripts) {
600  // TAG_vector_type is encoded in DICompositeType format.
601  Value *Elts[] = {
602    GetTagConstant(VMContext, dwarf::DW_TAG_vector_type),
603    NULL, //TheCU,
604    MDString::get(VMContext, ""),
605    NULL, //TheCU,
606    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
607    ConstantInt::get(Type::getInt64Ty(VMContext), Size),
608    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
609    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
610    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
611    Ty,
612    Subscripts,
613    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
614    Constant::getNullValue(Type::getInt32Ty(VMContext))
615  };
616  return DIType(MDNode::get(VMContext, Elts));
617}
618
619/// createArtificialType - Create a new DIType with "artificial" flag set.
620DIType DIBuilder::createArtificialType(DIType Ty) {
621  if (Ty.isArtificial())
622    return Ty;
623
624  SmallVector<Value *, 9> Elts;
625  MDNode *N = Ty;
626  assert (N && "Unexpected input DIType!");
627  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
628    if (Value *V = N->getOperand(i))
629      Elts.push_back(V);
630    else
631      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
632  }
633
634  unsigned CurFlags = Ty.getFlags();
635  CurFlags = CurFlags | DIType::FlagArtificial;
636
637  // Flags are stored at this slot.
638  Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
639
640  return DIType(MDNode::get(VMContext, Elts));
641}
642
643/// retainType - Retain DIType in a module even if it is not referenced
644/// through debug info anchors.
645void DIBuilder::retainType(DIType T) {
646  AllRetainTypes.push_back(T);
647}
648
649/// createUnspecifiedParameter - Create unspeicified type descriptor
650/// for the subroutine type.
651DIDescriptor DIBuilder::createUnspecifiedParameter() {
652  Value *Elts[] = {
653    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
654  };
655  return DIDescriptor(MDNode::get(VMContext, Elts));
656}
657
658/// createTemporaryType - Create a temporary forward-declared type.
659DIType DIBuilder::createTemporaryType() {
660  // Give the temporary MDNode a tag. It doesn't matter what tag we
661  // use here as long as DIType accepts it.
662  Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
663  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
664  return DIType(Node);
665}
666
667/// createTemporaryType - Create a temporary forward-declared type.
668DIType DIBuilder::createTemporaryType(DIFile F) {
669  // Give the temporary MDNode a tag. It doesn't matter what tag we
670  // use here as long as DIType accepts it.
671  Value *Elts[] = {
672    GetTagConstant(VMContext, DW_TAG_base_type),
673    TheCU,
674    NULL,
675    F
676  };
677  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
678  return DIType(Node);
679}
680
681/// createForwardDecl - Create a temporary forward-declared type that
682/// can be RAUW'd if the full type is seen.
683DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
684                                    DIDescriptor Scope, DIFile F,
685                                    unsigned Line, unsigned RuntimeLang) {
686  // Create a temporary MDNode.
687  Value *Elts[] = {
688    GetTagConstant(VMContext, Tag),
689    getNonCompileUnitScope(Scope),
690    MDString::get(VMContext, Name),
691    F,
692    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
693    // To ease transition include sizes etc of 0.
694    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
695    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
696    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
697    ConstantInt::get(Type::getInt32Ty(VMContext),
698                     DIDescriptor::FlagFwdDecl),
699    NULL,
700    DIArray(),
701    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
702  };
703  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
704  return DIType(Node);
705}
706
707/// getOrCreateArray - Get a DIArray, create one if required.
708DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
709  if (Elements.empty()) {
710    Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
711    return DIArray(MDNode::get(VMContext, Null));
712  }
713  return DIArray(MDNode::get(VMContext, Elements));
714}
715
716/// getOrCreateSubrange - Create a descriptor for a value range.  This
717/// implicitly uniques the values returned.
718DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
719  Value *Elts[] = {
720    GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
721    ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
722    ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
723  };
724
725  return DISubrange(MDNode::get(VMContext, Elts));
726}
727
728/// createGlobalVariable - Create a new descriptor for the specified global.
729DIGlobalVariable DIBuilder::
730createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
731                     DIType Ty, bool isLocalToUnit, Value *Val) {
732  Value *Elts[] = {
733    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
734    Constant::getNullValue(Type::getInt32Ty(VMContext)),
735    NULL, // TheCU,
736    MDString::get(VMContext, Name),
737    MDString::get(VMContext, Name),
738    MDString::get(VMContext, Name),
739    F,
740    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
741    Ty,
742    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
743    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
744    Val
745  };
746  MDNode *Node = MDNode::get(VMContext, Elts);
747  AllGVs.push_back(Node);
748  return DIGlobalVariable(Node);
749}
750
751/// createStaticVariable - Create a new descriptor for the specified static
752/// variable.
753DIGlobalVariable DIBuilder::
754createStaticVariable(DIDescriptor Context, StringRef Name,
755                     StringRef LinkageName, DIFile F, unsigned LineNumber,
756                     DIType Ty, bool isLocalToUnit, Value *Val) {
757  Value *Elts[] = {
758    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
759    Constant::getNullValue(Type::getInt32Ty(VMContext)),
760    getNonCompileUnitScope(Context),
761    MDString::get(VMContext, Name),
762    MDString::get(VMContext, Name),
763    MDString::get(VMContext, LinkageName),
764    F,
765    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
766    Ty,
767    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
768    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
769    Val
770  };
771  MDNode *Node = MDNode::get(VMContext, Elts);
772  AllGVs.push_back(Node);
773  return DIGlobalVariable(Node);
774}
775
776/// createVariable - Create a new descriptor for the specified variable.
777DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
778                                          StringRef Name, DIFile File,
779                                          unsigned LineNo, DIType Ty,
780                                          bool AlwaysPreserve, unsigned Flags,
781                                          unsigned ArgNo) {
782  Value *Elts[] = {
783    GetTagConstant(VMContext, Tag),
784    getNonCompileUnitScope(Scope),
785    MDString::get(VMContext, Name),
786    File,
787    ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
788    Ty,
789    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
790    Constant::getNullValue(Type::getInt32Ty(VMContext))
791  };
792  MDNode *Node = MDNode::get(VMContext, Elts);
793  if (AlwaysPreserve) {
794    // The optimizer may remove local variable. If there is an interest
795    // to preserve variable info in such situation then stash it in a
796    // named mdnode.
797    DISubprogram Fn(getDISubprogram(Scope));
798    NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
799    FnLocals->addOperand(Node);
800  }
801  return DIVariable(Node);
802}
803
804/// createComplexVariable - Create a new descriptor for the specified variable
805/// which has a complex address expression for its address.
806DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
807                                            StringRef Name, DIFile F,
808                                            unsigned LineNo,
809                                            DIType Ty, ArrayRef<Value *> Addr,
810                                            unsigned ArgNo) {
811  SmallVector<Value *, 15> Elts;
812  Elts.push_back(GetTagConstant(VMContext, Tag));
813  Elts.push_back(getNonCompileUnitScope(Scope)),
814  Elts.push_back(MDString::get(VMContext, Name));
815  Elts.push_back(F);
816  Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
817                                  (LineNo | (ArgNo << 24))));
818  Elts.push_back(Ty);
819  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
820  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
821  Elts.append(Addr.begin(), Addr.end());
822
823  return DIVariable(MDNode::get(VMContext, Elts));
824}
825
826/// createFunction - Create a new descriptor for the specified function.
827DISubprogram DIBuilder::createFunction(DIDescriptor Context,
828                                       StringRef Name,
829                                       StringRef LinkageName,
830                                       DIFile File, unsigned LineNo,
831                                       DIType Ty,
832                                       bool isLocalToUnit, bool isDefinition,
833                                       unsigned ScopeLine,
834                                       unsigned Flags, bool isOptimized,
835                                       Function *Fn,
836                                       MDNode *TParams,
837                                       MDNode *Decl) {
838  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
839  MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
840  Value *TVElts[] = { Temp };
841  MDNode *THolder = MDNode::get(VMContext, TVElts);
842
843  Value *Elts[] = {
844    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
845    Constant::getNullValue(Type::getInt32Ty(VMContext)),
846    getNonCompileUnitScope(Context),
847    MDString::get(VMContext, Name),
848    MDString::get(VMContext, Name),
849    MDString::get(VMContext, LinkageName),
850    File,
851    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
852    Ty,
853    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
854    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
855    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
856    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
857    NULL,
858    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
859    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
860    Fn,
861    TParams,
862    Decl,
863    THolder,
864    ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
865  };
866  MDNode *Node = MDNode::get(VMContext, Elts);
867
868  // Create a named metadata so that we do not lose this mdnode.
869  AllSubprograms.push_back(Node);
870  return DISubprogram(Node);
871}
872
873/// createMethod - Create a new descriptor for the specified C++ method.
874DISubprogram DIBuilder::createMethod(DIDescriptor Context,
875                                     StringRef Name,
876                                     StringRef LinkageName,
877                                     DIFile F,
878                                     unsigned LineNo, DIType Ty,
879                                     bool isLocalToUnit,
880                                     bool isDefinition,
881                                     unsigned VK, unsigned VIndex,
882                                     MDNode *VTableHolder,
883                                     unsigned Flags,
884                                     bool isOptimized,
885                                     Function *Fn,
886                                     MDNode *TParam) {
887  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
888  MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
889  Value *TVElts[] = { Temp };
890  MDNode *THolder = MDNode::get(VMContext, TVElts);
891
892  Value *Elts[] = {
893    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
894    Constant::getNullValue(Type::getInt32Ty(VMContext)),
895    getNonCompileUnitScope(Context),
896    MDString::get(VMContext, Name),
897    MDString::get(VMContext, Name),
898    MDString::get(VMContext, LinkageName),
899    F,
900    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
901    Ty,
902    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
903    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
904    ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
905    ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
906    VTableHolder,
907    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
908    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
909    Fn,
910    TParam,
911    Constant::getNullValue(Type::getInt32Ty(VMContext)),
912    THolder,
913    // FIXME: Do we want to use different scope/lines?
914    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
915  };
916  MDNode *Node = MDNode::get(VMContext, Elts);
917  return DISubprogram(Node);
918}
919
920/// createNameSpace - This creates new descriptor for a namespace
921/// with the specified parent scope.
922DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
923                                       DIFile File, unsigned LineNo) {
924  Value *Elts[] = {
925    GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
926    getNonCompileUnitScope(Scope),
927    MDString::get(VMContext, Name),
928    File,
929    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
930  };
931  return DINameSpace(MDNode::get(VMContext, Elts));
932}
933
934/// createLexicalBlockFile - This creates a new MDNode that encapsulates
935/// an existing scope with a new filename.
936DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
937                                                     DIFile File) {
938  Value *Elts[] = {
939    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
940    Scope,
941    File
942  };
943  return DILexicalBlockFile(MDNode::get(VMContext, Elts));
944}
945
946DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
947                                             unsigned Line, unsigned Col) {
948  // Defeat MDNode uniqing for lexical blocks by using unique id.
949  static unsigned int unique_id = 0;
950  Value *Elts[] = {
951    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
952    getNonCompileUnitScope(Scope),
953    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
954    ConstantInt::get(Type::getInt32Ty(VMContext), Col),
955    File,
956    ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
957  };
958  return DILexicalBlock(MDNode::get(VMContext, Elts));
959}
960
961/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
962Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
963                                      Instruction *InsertBefore) {
964  assert(Storage && "no storage passed to dbg.declare");
965  assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
966  if (!DeclareFn)
967    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
968
969  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
970  return CallInst::Create(DeclareFn, Args, "", InsertBefore);
971}
972
973/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
974Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
975                                      BasicBlock *InsertAtEnd) {
976  assert(Storage && "no storage passed to dbg.declare");
977  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
978  if (!DeclareFn)
979    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
980
981  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
982
983  // If this block already has a terminator then insert this intrinsic
984  // before the terminator.
985  if (TerminatorInst *T = InsertAtEnd->getTerminator())
986    return CallInst::Create(DeclareFn, Args, "", T);
987  else
988    return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
989}
990
991/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
992Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
993                                                DIVariable VarInfo,
994                                                Instruction *InsertBefore) {
995  assert(V && "no value passed to dbg.value");
996  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
997  if (!ValueFn)
998    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
999
1000  Value *Args[] = { MDNode::get(V->getContext(), V),
1001                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1002                    VarInfo };
1003  return CallInst::Create(ValueFn, Args, "", InsertBefore);
1004}
1005
1006/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1007Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1008                                                DIVariable VarInfo,
1009                                                BasicBlock *InsertAtEnd) {
1010  assert(V && "no value passed to dbg.value");
1011  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1012  if (!ValueFn)
1013    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1014
1015  Value *Args[] = { MDNode::get(V->getContext(), V),
1016                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1017                    VarInfo };
1018  return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1019}
1020