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