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) {
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), 0),
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/// createArtificialType - Create a new DIType with "artificial" flag set.
644DIType DIBuilder::createObjectPointerType(DIType Ty) {
645  if (Ty.isObjectPointer())
646    return Ty;
647
648  SmallVector<Value *, 9> Elts;
649  MDNode *N = Ty;
650  assert (N && "Unexpected input DIType!");
651  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
652    if (Value *V = N->getOperand(i))
653      Elts.push_back(V);
654    else
655      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
656  }
657
658  unsigned CurFlags = Ty.getFlags();
659  CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
660
661  // Flags are stored at this slot.
662  Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
663
664  return DIType(MDNode::get(VMContext, Elts));
665}
666
667/// retainType - Retain DIType in a module even if it is not referenced
668/// through debug info anchors.
669void DIBuilder::retainType(DIType T) {
670  AllRetainTypes.push_back(T);
671}
672
673/// createUnspecifiedParameter - Create unspeicified type descriptor
674/// for the subroutine type.
675DIDescriptor DIBuilder::createUnspecifiedParameter() {
676  Value *Elts[] = {
677    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
678  };
679  return DIDescriptor(MDNode::get(VMContext, Elts));
680}
681
682/// createTemporaryType - Create a temporary forward-declared type.
683DIType DIBuilder::createTemporaryType() {
684  // Give the temporary MDNode a tag. It doesn't matter what tag we
685  // use here as long as DIType accepts it.
686  Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
687  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
688  return DIType(Node);
689}
690
691/// createTemporaryType - Create a temporary forward-declared type.
692DIType DIBuilder::createTemporaryType(DIFile F) {
693  // Give the temporary MDNode a tag. It doesn't matter what tag we
694  // use here as long as DIType accepts it.
695  Value *Elts[] = {
696    GetTagConstant(VMContext, DW_TAG_base_type),
697    TheCU,
698    NULL,
699    F
700  };
701  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
702  return DIType(Node);
703}
704
705/// createForwardDecl - Create a temporary forward-declared type that
706/// can be RAUW'd if the full type is seen.
707DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
708                                    DIDescriptor Scope, DIFile F,
709                                    unsigned Line, unsigned RuntimeLang,
710                                    uint64_t SizeInBits,
711                                    uint64_t AlignInBits) {
712  // Create a temporary MDNode.
713  Value *Elts[] = {
714    GetTagConstant(VMContext, Tag),
715    getNonCompileUnitScope(Scope),
716    MDString::get(VMContext, Name),
717    F,
718    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
719    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
720    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
721    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
722    ConstantInt::get(Type::getInt32Ty(VMContext),
723                     DIDescriptor::FlagFwdDecl),
724    NULL,
725    DIArray(),
726    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
727  };
728  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
729  return DIType(Node);
730}
731
732/// getOrCreateArray - Get a DIArray, create one if required.
733DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
734  if (Elements.empty()) {
735    Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
736    return DIArray(MDNode::get(VMContext, Null));
737  }
738  return DIArray(MDNode::get(VMContext, Elements));
739}
740
741/// getOrCreateSubrange - Create a descriptor for a value range.  This
742/// implicitly uniques the values returned.
743DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
744  Value *Elts[] = {
745    GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
746    ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
747    ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
748  };
749
750  return DISubrange(MDNode::get(VMContext, Elts));
751}
752
753/// createGlobalVariable - Create a new descriptor for the specified global.
754DIGlobalVariable DIBuilder::
755createGlobalVariable(StringRef Name, 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    NULL, // TheCU,
761    MDString::get(VMContext, Name),
762    MDString::get(VMContext, Name),
763    MDString::get(VMContext, Name),
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/// createStaticVariable - Create a new descriptor for the specified static
777/// variable.
778DIGlobalVariable DIBuilder::
779createStaticVariable(DIDescriptor Context, StringRef Name,
780                     StringRef LinkageName, DIFile F, unsigned LineNumber,
781                     DIType Ty, bool isLocalToUnit, Value *Val) {
782  Value *Elts[] = {
783    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
784    Constant::getNullValue(Type::getInt32Ty(VMContext)),
785    getNonCompileUnitScope(Context),
786    MDString::get(VMContext, Name),
787    MDString::get(VMContext, Name),
788    MDString::get(VMContext, LinkageName),
789    F,
790    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
791    Ty,
792    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
793    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
794    Val
795  };
796  MDNode *Node = MDNode::get(VMContext, Elts);
797  AllGVs.push_back(Node);
798  return DIGlobalVariable(Node);
799}
800
801/// createVariable - Create a new descriptor for the specified variable.
802DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
803                                          StringRef Name, DIFile File,
804                                          unsigned LineNo, DIType Ty,
805                                          bool AlwaysPreserve, unsigned Flags,
806                                          unsigned ArgNo) {
807  Value *Elts[] = {
808    GetTagConstant(VMContext, Tag),
809    getNonCompileUnitScope(Scope),
810    MDString::get(VMContext, Name),
811    File,
812    ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
813    Ty,
814    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
815    Constant::getNullValue(Type::getInt32Ty(VMContext))
816  };
817  MDNode *Node = MDNode::get(VMContext, Elts);
818  if (AlwaysPreserve) {
819    // The optimizer may remove local variable. If there is an interest
820    // to preserve variable info in such situation then stash it in a
821    // named mdnode.
822    DISubprogram Fn(getDISubprogram(Scope));
823    NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
824    FnLocals->addOperand(Node);
825  }
826  return DIVariable(Node);
827}
828
829/// createComplexVariable - Create a new descriptor for the specified variable
830/// which has a complex address expression for its address.
831DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
832                                            StringRef Name, DIFile F,
833                                            unsigned LineNo,
834                                            DIType Ty, ArrayRef<Value *> Addr,
835                                            unsigned ArgNo) {
836  SmallVector<Value *, 15> Elts;
837  Elts.push_back(GetTagConstant(VMContext, Tag));
838  Elts.push_back(getNonCompileUnitScope(Scope)),
839  Elts.push_back(MDString::get(VMContext, Name));
840  Elts.push_back(F);
841  Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
842                                  (LineNo | (ArgNo << 24))));
843  Elts.push_back(Ty);
844  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
845  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
846  Elts.append(Addr.begin(), Addr.end());
847
848  return DIVariable(MDNode::get(VMContext, Elts));
849}
850
851/// createFunction - Create a new descriptor for the specified function.
852DISubprogram DIBuilder::createFunction(DIDescriptor Context,
853                                       StringRef Name,
854                                       StringRef LinkageName,
855                                       DIFile File, unsigned LineNo,
856                                       DIType Ty,
857                                       bool isLocalToUnit, bool isDefinition,
858                                       unsigned ScopeLine,
859                                       unsigned Flags, bool isOptimized,
860                                       Function *Fn,
861                                       MDNode *TParams,
862                                       MDNode *Decl) {
863  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
864  MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
865  Value *TVElts[] = { Temp };
866  MDNode *THolder = MDNode::get(VMContext, TVElts);
867
868  Value *Elts[] = {
869    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
870    Constant::getNullValue(Type::getInt32Ty(VMContext)),
871    getNonCompileUnitScope(Context),
872    MDString::get(VMContext, Name),
873    MDString::get(VMContext, Name),
874    MDString::get(VMContext, LinkageName),
875    File,
876    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
877    Ty,
878    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
879    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
880    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
881    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
882    NULL,
883    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
884    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
885    Fn,
886    TParams,
887    Decl,
888    THolder,
889    ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
890  };
891  MDNode *Node = MDNode::get(VMContext, Elts);
892
893  // Create a named metadata so that we do not lose this mdnode.
894  AllSubprograms.push_back(Node);
895  return DISubprogram(Node);
896}
897
898/// createMethod - Create a new descriptor for the specified C++ method.
899DISubprogram DIBuilder::createMethod(DIDescriptor Context,
900                                     StringRef Name,
901                                     StringRef LinkageName,
902                                     DIFile F,
903                                     unsigned LineNo, DIType Ty,
904                                     bool isLocalToUnit,
905                                     bool isDefinition,
906                                     unsigned VK, unsigned VIndex,
907                                     MDNode *VTableHolder,
908                                     unsigned Flags,
909                                     bool isOptimized,
910                                     Function *Fn,
911                                     MDNode *TParam) {
912  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
913  MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
914  Value *TVElts[] = { Temp };
915  MDNode *THolder = MDNode::get(VMContext, TVElts);
916
917  Value *Elts[] = {
918    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
919    Constant::getNullValue(Type::getInt32Ty(VMContext)),
920    getNonCompileUnitScope(Context),
921    MDString::get(VMContext, Name),
922    MDString::get(VMContext, Name),
923    MDString::get(VMContext, LinkageName),
924    F,
925    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
926    Ty,
927    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
928    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
929    ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
930    ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
931    VTableHolder,
932    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
933    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
934    Fn,
935    TParam,
936    Constant::getNullValue(Type::getInt32Ty(VMContext)),
937    THolder,
938    // FIXME: Do we want to use different scope/lines?
939    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
940  };
941  MDNode *Node = MDNode::get(VMContext, Elts);
942  return DISubprogram(Node);
943}
944
945/// createNameSpace - This creates new descriptor for a namespace
946/// with the specified parent scope.
947DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
948                                       DIFile File, unsigned LineNo) {
949  Value *Elts[] = {
950    GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
951    getNonCompileUnitScope(Scope),
952    MDString::get(VMContext, Name),
953    File,
954    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
955  };
956  return DINameSpace(MDNode::get(VMContext, Elts));
957}
958
959/// createLexicalBlockFile - This creates a new MDNode that encapsulates
960/// an existing scope with a new filename.
961DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
962                                                     DIFile File) {
963  Value *Elts[] = {
964    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
965    Scope,
966    File
967  };
968  return DILexicalBlockFile(MDNode::get(VMContext, Elts));
969}
970
971DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
972                                             unsigned Line, unsigned Col) {
973  // Defeat MDNode uniqing for lexical blocks by using unique id.
974  static unsigned int unique_id = 0;
975  Value *Elts[] = {
976    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
977    getNonCompileUnitScope(Scope),
978    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
979    ConstantInt::get(Type::getInt32Ty(VMContext), Col),
980    File,
981    ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
982  };
983  return DILexicalBlock(MDNode::get(VMContext, Elts));
984}
985
986/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
987Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
988                                      Instruction *InsertBefore) {
989  assert(Storage && "no storage passed to dbg.declare");
990  assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
991  if (!DeclareFn)
992    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
993
994  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
995  return CallInst::Create(DeclareFn, Args, "", InsertBefore);
996}
997
998/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
999Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1000                                      BasicBlock *InsertAtEnd) {
1001  assert(Storage && "no storage passed to dbg.declare");
1002  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
1003  if (!DeclareFn)
1004    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1005
1006  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1007
1008  // If this block already has a terminator then insert this intrinsic
1009  // before the terminator.
1010  if (TerminatorInst *T = InsertAtEnd->getTerminator())
1011    return CallInst::Create(DeclareFn, Args, "", T);
1012  else
1013    return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1014}
1015
1016/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1017Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1018                                                DIVariable VarInfo,
1019                                                Instruction *InsertBefore) {
1020  assert(V && "no value passed to dbg.value");
1021  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1022  if (!ValueFn)
1023    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1024
1025  Value *Args[] = { MDNode::get(V->getContext(), V),
1026                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1027                    VarInfo };
1028  return CallInst::Create(ValueFn, Args, "", InsertBefore);
1029}
1030
1031/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1032Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1033                                                DIVariable VarInfo,
1034                                                BasicBlock *InsertAtEnd) {
1035  assert(V && "no value passed to dbg.value");
1036  assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1037  if (!ValueFn)
1038    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1039
1040  Value *Args[] = { MDNode::get(V->getContext(), V),
1041                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1042                    VarInfo };
1043  return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1044}
1045