Clarify comment.
[oota-llvm.git] / lib / Analysis / DIBuilder.cpp
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/Analysis/DIBuilder.h"
15 #include "llvm/Analysis/DebugInfo.h"
16 #include "llvm/Constants.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
23 using namespace llvm;
24 using namespace llvm::dwarf;
25
26 static 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
32 DIBuilder::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.
39 void 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.
68 static 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.
76 void 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     llvm::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.
128 DIFile 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.
141 DIEnumerator 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.
152 DIType 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'.
173 DIType 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'.
196 DIType 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.
214 DIType 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 DIType DIBuilder::createReferenceType(DIType RTy) {
234   assert(RTy.Verify() && "Unable to create reference type");
235   // References are encoded in DIDerivedType format.
236   Value *Elts[] = {
237     GetTagConstant(VMContext, dwarf::DW_TAG_reference_type),
238     NULL, // TheCU,
239     NULL, // Name
240     NULL, // Filename
241     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
242     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
243     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
244     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
245     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
246     RTy
247   };
248   return DIType(MDNode::get(VMContext, Elts));
249 }
250
251 /// createTypedef - Create debugging information entry for a typedef.
252 DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
253                                 unsigned LineNo, DIDescriptor Context) {
254   // typedefs are encoded in DIDerivedType format.
255   assert(Ty.Verify() && "Invalid typedef type!");
256   Value *Elts[] = {
257     GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
258     getNonCompileUnitScope(Context),
259     MDString::get(VMContext, Name),
260     File,
261     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
262     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
263     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
264     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
265     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
266     Ty
267   };
268   return DIType(MDNode::get(VMContext, Elts));
269 }
270
271 /// createFriend - Create debugging information entry for a 'friend'.
272 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
273   // typedefs are encoded in DIDerivedType format.
274   assert(Ty.Verify() && "Invalid type!");
275   assert(FriendTy.Verify() && "Invalid friend type!");
276   Value *Elts[] = {
277     GetTagConstant(VMContext, dwarf::DW_TAG_friend),
278     Ty,
279     NULL, // Name
280     Ty.getFile(),
281     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
282     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
283     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
284     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
285     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
286     FriendTy
287   };
288   return DIType(MDNode::get(VMContext, Elts));
289 }
290
291 /// createInheritance - Create debugging information entry to establish
292 /// inheritance relationship between two types.
293 DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
294                                     uint64_t BaseOffset, unsigned Flags) {
295   assert(Ty.Verify() && "Unable to create inheritance");
296   // TAG_inheritance is encoded in DIDerivedType format.
297   Value *Elts[] = {
298     GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
299     Ty,
300     NULL, // Name
301     Ty.getFile(),
302     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
303     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
304     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
305     ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
306     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
307     BaseTy
308   };
309   return DIType(MDNode::get(VMContext, Elts));
310 }
311
312 /// createMemberType - Create debugging information entry for a member.
313 DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
314                                    DIFile File, unsigned LineNumber,
315                                    uint64_t SizeInBits, uint64_t AlignInBits,
316                                    uint64_t OffsetInBits, unsigned Flags,
317                                    DIType Ty) {
318   // TAG_member is encoded in DIDerivedType format.
319   Value *Elts[] = {
320     GetTagConstant(VMContext, dwarf::DW_TAG_member),
321     getNonCompileUnitScope(Scope),
322     MDString::get(VMContext, Name),
323     File,
324     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
325     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
326     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
327     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
328     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
329     Ty
330   };
331   return DIType(MDNode::get(VMContext, Elts));
332 }
333
334 /// createObjCIVar - Create debugging information entry for Objective-C
335 /// instance variable.
336 DIType DIBuilder::createObjCIVar(StringRef Name,
337                                  DIFile File, unsigned LineNumber,
338                                  uint64_t SizeInBits, uint64_t AlignInBits,
339                                  uint64_t OffsetInBits, unsigned Flags,
340                                  DIType Ty, StringRef PropertyName,
341                                  StringRef GetterName, StringRef SetterName,
342                                  unsigned PropertyAttributes) {
343   // TAG_member is encoded in DIDerivedType format.
344   Value *Elts[] = {
345     GetTagConstant(VMContext, dwarf::DW_TAG_member),
346     getNonCompileUnitScope(File),
347     MDString::get(VMContext, Name),
348     File,
349     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
350     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
351     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
352     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
353     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
354     Ty,
355     MDString::get(VMContext, PropertyName),
356     MDString::get(VMContext, GetterName),
357     MDString::get(VMContext, SetterName),
358     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
359   };
360   return DIType(MDNode::get(VMContext, Elts));
361 }
362
363 /// createObjCIVar - Create debugging information entry for Objective-C
364 /// instance variable.
365 DIType DIBuilder::createObjCIVar(StringRef Name,
366                                  DIFile File, unsigned LineNumber,
367                                  uint64_t SizeInBits, uint64_t AlignInBits,
368                                  uint64_t OffsetInBits, unsigned Flags,
369                                  DIType Ty, MDNode *PropertyNode) {
370   // TAG_member is encoded in DIDerivedType format.
371   Value *Elts[] = {
372     GetTagConstant(VMContext, dwarf::DW_TAG_member),
373     getNonCompileUnitScope(File),
374     MDString::get(VMContext, Name),
375     File,
376     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
377     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
378     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
379     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
380     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
381     Ty,
382     PropertyNode
383   };
384   return DIType(MDNode::get(VMContext, Elts));
385 }
386
387 /// createObjCProperty - Create debugging information entry for Objective-C
388 /// property.
389 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
390                                              DIFile File, unsigned LineNumber,
391                                              StringRef GetterName,
392                                              StringRef SetterName, 
393                                              unsigned PropertyAttributes,
394                                              DIType Ty) {
395   Value *Elts[] = {
396     GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
397     MDString::get(VMContext, Name),
398     File,
399     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
400     MDString::get(VMContext, GetterName),
401     MDString::get(VMContext, SetterName),
402     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
403     Ty
404   };
405   return DIObjCProperty(MDNode::get(VMContext, Elts));
406 }
407
408 /// createClassType - Create debugging information entry for a class.
409 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
410                                   DIFile File, unsigned LineNumber,
411                                   uint64_t SizeInBits, uint64_t AlignInBits,
412                                   uint64_t OffsetInBits, unsigned Flags,
413                                   DIType DerivedFrom, DIArray Elements,
414                                   MDNode *VTableHolder, MDNode *TemplateParams) {
415  // TAG_class_type is encoded in DICompositeType format.
416   Value *Elts[] = {
417     GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
418     getNonCompileUnitScope(Context),
419     MDString::get(VMContext, Name),
420     File,
421     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
422     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
423     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
424     ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
425     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
426     DerivedFrom,
427     Elements,
428     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
429     VTableHolder,
430     TemplateParams
431   };
432   return DIType(MDNode::get(VMContext, Elts));
433 }
434
435 /// createTemplateTypeParameter - Create debugging information for template
436 /// type parameter.
437 DITemplateTypeParameter
438 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
439                                        DIType Ty, MDNode *File, unsigned LineNo,
440                                        unsigned ColumnNo) {
441   Value *Elts[] = {
442     GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
443     getNonCompileUnitScope(Context),
444     MDString::get(VMContext, Name),
445     Ty,
446     File,
447     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
448     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
449   };
450   return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
451 }
452
453 /// createTemplateValueParameter - Create debugging information for template
454 /// value parameter.
455 DITemplateValueParameter
456 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
457                                         DIType Ty, uint64_t Val,
458                                         MDNode *File, unsigned LineNo,
459                                         unsigned ColumnNo) {
460   Value *Elts[] = {
461     GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
462     getNonCompileUnitScope(Context),
463     MDString::get(VMContext, Name),
464     Ty,
465     ConstantInt::get(Type::getInt64Ty(VMContext), Val),
466     File,
467     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
468     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
469   };
470   return DITemplateValueParameter(MDNode::get(VMContext, Elts));
471 }
472
473 /// createStructType - Create debugging information entry for a struct.
474 DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name,
475                                    DIFile File, unsigned LineNumber,
476                                    uint64_t SizeInBits, uint64_t AlignInBits,
477                                    unsigned Flags, DIArray Elements,
478                                    unsigned RunTimeLang) {
479  // TAG_structure_type is encoded in DICompositeType format.
480   Value *Elts[] = {
481     GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
482     getNonCompileUnitScope(Context),
483     MDString::get(VMContext, Name),
484     File,
485     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
486     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
487     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
488     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
489     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
490     NULL,
491     Elements,
492     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
493     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
494   };
495   return DIType(MDNode::get(VMContext, Elts));
496 }
497
498 /// createUnionType - Create debugging information entry for an union.
499 DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
500                                   DIFile File,
501                                   unsigned LineNumber, uint64_t SizeInBits,
502                                   uint64_t AlignInBits, unsigned Flags,
503                                   DIArray Elements, unsigned RunTimeLang) {
504   // TAG_union_type is encoded in DICompositeType format.
505   Value *Elts[] = {
506     GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
507     getNonCompileUnitScope(Scope),
508     MDString::get(VMContext, Name),
509     File,
510     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
511     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
512     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
513     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
514     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
515     NULL,
516     Elements,
517     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
518     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
519   };
520   return DIType(MDNode::get(VMContext, Elts));
521 }
522
523 /// createSubroutineType - Create subroutine type.
524 DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
525   // TAG_subroutine_type is encoded in DICompositeType format.
526   Value *Elts[] = {
527     GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
528     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
529     MDString::get(VMContext, ""),
530     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
531     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
532     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
533     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
534     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
535     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
536     NULL,
537     ParameterTypes,
538     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
539     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
540   };
541   return DIType(MDNode::get(VMContext, Elts));
542 }
543
544 /// createEnumerationType - Create debugging information entry for an
545 /// enumeration.
546 DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name,
547                                         DIFile File, unsigned LineNumber,
548                                         uint64_t SizeInBits,
549                                         uint64_t AlignInBits,
550                                         DIArray Elements) {
551   // TAG_enumeration_type is encoded in DICompositeType format.
552   Value *Elts[] = {
553     GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
554     getNonCompileUnitScope(Scope),
555     MDString::get(VMContext, Name),
556     File,
557     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
558     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
559     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
560     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
561     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
562     NULL,
563     Elements,
564     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
565     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
566   };
567   MDNode *Node = MDNode::get(VMContext, Elts);
568   AllEnumTypes.push_back(Node);
569   return DIType(Node);
570 }
571
572 /// createArrayType - Create debugging information entry for an array.
573 DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
574                                   DIType Ty, DIArray Subscripts) {
575   // TAG_array_type is encoded in DICompositeType format.
576   Value *Elts[] = {
577     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
578     NULL, //TheCU,
579     MDString::get(VMContext, ""),
580     NULL, //TheCU,
581     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
582     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
583     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
584     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
585     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
586     Ty,
587     Subscripts,
588     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
589     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
590   };
591   return DIType(MDNode::get(VMContext, Elts));
592 }
593
594 /// createVectorType - Create debugging information entry for a vector.
595 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
596                                    DIType Ty, DIArray Subscripts) {
597   // TAG_vector_type is encoded in DICompositeType format.
598   Value *Elts[] = {
599     GetTagConstant(VMContext, dwarf::DW_TAG_vector_type),
600     NULL, //TheCU,
601     MDString::get(VMContext, ""),
602     NULL, //TheCU,
603     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
604     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
605     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
606     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
607     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
608     Ty,
609     Subscripts,
610     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
611     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
612   };
613   return DIType(MDNode::get(VMContext, Elts));
614 }
615
616 /// createArtificialType - Create a new DIType with "artificial" flag set.
617 DIType DIBuilder::createArtificialType(DIType Ty) {
618   if (Ty.isArtificial())
619     return Ty;
620
621   SmallVector<Value *, 9> Elts;
622   MDNode *N = Ty;
623   assert (N && "Unexpected input DIType!");
624   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
625     if (Value *V = N->getOperand(i))
626       Elts.push_back(V);
627     else
628       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
629   }
630
631   unsigned CurFlags = Ty.getFlags();
632   CurFlags = CurFlags | DIType::FlagArtificial;
633
634   // Flags are stored at this slot.
635   Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
636
637   return DIType(MDNode::get(VMContext, Elts));
638 }
639
640 /// retainType - Retain DIType in a module even if it is not referenced
641 /// through debug info anchors.
642 void DIBuilder::retainType(DIType T) {
643   AllRetainTypes.push_back(T);
644 }
645
646 /// createUnspecifiedParameter - Create unspeicified type descriptor
647 /// for the subroutine type.
648 DIDescriptor DIBuilder::createUnspecifiedParameter() {
649   Value *Elts[] = {
650     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
651   };
652   return DIDescriptor(MDNode::get(VMContext, Elts));
653 }
654
655 /// createTemporaryType - Create a temporary forward-declared type.
656 DIType DIBuilder::createTemporaryType() {
657   // Give the temporary MDNode a tag. It doesn't matter what tag we
658   // use here as long as DIType accepts it.
659   Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
660   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
661   return DIType(Node);
662 }
663
664 /// createTemporaryType - Create a temporary forward-declared type.
665 DIType DIBuilder::createTemporaryType(DIFile F) {
666   // Give the temporary MDNode a tag. It doesn't matter what tag we
667   // use here as long as DIType accepts it.
668   Value *Elts[] = {
669     GetTagConstant(VMContext, DW_TAG_base_type),
670     TheCU,
671     NULL,
672     F
673   };
674   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
675   return DIType(Node);
676 }
677
678 /// createForwardDecl - Create a temporary forward-declared type that
679 /// can be RAUW'd if the full type is seen.
680 DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
681                                     DIDescriptor Scope, DIFile F,
682                                     unsigned Line, unsigned RuntimeLang) {
683   // Create a temporary MDNode.
684   Value *Elts[] = {
685     GetTagConstant(VMContext, Tag),
686     getNonCompileUnitScope(Scope),
687     MDString::get(VMContext, Name),
688     F,
689     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
690     // To ease transition include sizes etc of 0.
691     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
692     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
693     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
694     ConstantInt::get(Type::getInt32Ty(VMContext),
695                      DIDescriptor::FlagFwdDecl),
696     NULL,
697     DIArray(),
698     ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
699   };
700   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
701   return DIType(Node);
702 }
703
704 /// getOrCreateArray - Get a DIArray, create one if required.
705 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
706   if (Elements.empty()) {
707     Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext));
708     return DIArray(MDNode::get(VMContext, Null));
709   }
710   return DIArray(MDNode::get(VMContext, Elements));
711 }
712
713 /// getOrCreateSubrange - Create a descriptor for a value range.  This
714 /// implicitly uniques the values returned.
715 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
716   Value *Elts[] = {
717     GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
718     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
719     ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
720   };
721
722   return DISubrange(MDNode::get(VMContext, Elts));
723 }
724
725 /// createGlobalVariable - Create a new descriptor for the specified global.
726 DIGlobalVariable DIBuilder::
727 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
728                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
729   Value *Elts[] = {
730     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
731     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
732     NULL, // TheCU,
733     MDString::get(VMContext, Name),
734     MDString::get(VMContext, Name),
735     MDString::get(VMContext, Name),
736     F,
737     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
738     Ty,
739     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
740     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
741     Val
742   };
743   MDNode *Node = MDNode::get(VMContext, Elts);
744   AllGVs.push_back(Node);
745   return DIGlobalVariable(Node);
746 }
747
748 /// createStaticVariable - Create a new descriptor for the specified static
749 /// variable.
750 DIGlobalVariable DIBuilder::
751 createStaticVariable(DIDescriptor Context, StringRef Name,
752                      StringRef LinkageName, DIFile F, unsigned LineNumber,
753                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
754   Value *Elts[] = {
755     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
756     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
757     getNonCompileUnitScope(Context),
758     MDString::get(VMContext, Name),
759     MDString::get(VMContext, Name),
760     MDString::get(VMContext, LinkageName),
761     F,
762     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
763     Ty,
764     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
765     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
766     Val
767   };
768   MDNode *Node = MDNode::get(VMContext, Elts);
769   AllGVs.push_back(Node);
770   return DIGlobalVariable(Node);
771 }
772
773 /// createVariable - Create a new descriptor for the specified variable.
774 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
775                                           StringRef Name, DIFile File,
776                                           unsigned LineNo, DIType Ty,
777                                           bool AlwaysPreserve, unsigned Flags,
778                                           unsigned ArgNo) {
779   Value *Elts[] = {
780     GetTagConstant(VMContext, Tag),
781     getNonCompileUnitScope(Scope),
782     MDString::get(VMContext, Name),
783     File,
784     ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
785     Ty,
786     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
787     Constant::getNullValue(Type::getInt32Ty(VMContext)),
788   };
789   MDNode *Node = MDNode::get(VMContext, Elts);
790   if (AlwaysPreserve) {
791     // The optimizer may remove local variable. If there is an interest
792     // to preserve variable info in such situation then stash it in a
793     // named mdnode.
794     DISubprogram Fn(getDISubprogram(Scope));
795     NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
796     FnLocals->addOperand(Node);
797   }
798   return DIVariable(Node);
799 }
800
801 /// createComplexVariable - Create a new descriptor for the specified variable
802 /// which has a complex address expression for its address.
803 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
804                                             StringRef Name, DIFile F,
805                                             unsigned LineNo,
806                                             DIType Ty, ArrayRef<Value *> Addr,
807                                             unsigned ArgNo) {
808   SmallVector<Value *, 15> Elts;
809   Elts.push_back(GetTagConstant(VMContext, Tag));
810   Elts.push_back(getNonCompileUnitScope(Scope)),
811   Elts.push_back(MDString::get(VMContext, Name));
812   Elts.push_back(F);
813   Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
814                                   (LineNo | (ArgNo << 24))));
815   Elts.push_back(Ty);
816   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
817   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
818   Elts.append(Addr.begin(), Addr.end());
819
820   return DIVariable(MDNode::get(VMContext, Elts));
821 }
822
823 /// createFunction - Create a new descriptor for the specified function.
824 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
825                                        StringRef Name,
826                                        StringRef LinkageName,
827                                        DIFile File, unsigned LineNo,
828                                        DIType Ty,
829                                        bool isLocalToUnit, bool isDefinition,
830                                        unsigned ScopeLine,
831                                        unsigned Flags, bool isOptimized,
832                                        Function *Fn,
833                                        MDNode *TParams,
834                                        MDNode *Decl) {
835   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
836   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
837   Value *TVElts[] = { Temp };
838   MDNode *THolder = MDNode::get(VMContext, TVElts);
839
840   Value *Elts[] = {
841     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
842     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
843     getNonCompileUnitScope(Context),
844     MDString::get(VMContext, Name),
845     MDString::get(VMContext, Name),
846     MDString::get(VMContext, LinkageName),
847     File,
848     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
849     Ty,
850     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
851     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
852     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
853     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
854     NULL,
855     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
856     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
857     Fn,
858     TParams,
859     Decl,
860     THolder,
861     ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
862   };
863   MDNode *Node = MDNode::get(VMContext, Elts);
864
865   // Create a named metadata so that we do not lose this mdnode.
866   AllSubprograms.push_back(Node);
867   return DISubprogram(Node);
868 }
869
870 /// createMethod - Create a new descriptor for the specified C++ method.
871 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
872                                      StringRef Name,
873                                      StringRef LinkageName,
874                                      DIFile F,
875                                      unsigned LineNo, DIType Ty,
876                                      bool isLocalToUnit,
877                                      bool isDefinition,
878                                      unsigned VK, unsigned VIndex,
879                                      MDNode *VTableHolder,
880                                      unsigned Flags,
881                                      bool isOptimized,
882                                      Function *Fn,
883                                      MDNode *TParam) {
884   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
885   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
886   Value *TVElts[] = { Temp };
887   MDNode *THolder = MDNode::get(VMContext, TVElts);
888
889   Value *Elts[] = {
890     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
891     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
892     getNonCompileUnitScope(Context),
893     MDString::get(VMContext, Name),
894     MDString::get(VMContext, Name),
895     MDString::get(VMContext, LinkageName),
896     F,
897     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
898     Ty,
899     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
900     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
901     ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
902     ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
903     VTableHolder,
904     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
905     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
906     Fn,
907     TParam,
908     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
909     THolder,
910     // FIXME: Do we want to use different scope/lines?
911     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
912   };
913   MDNode *Node = MDNode::get(VMContext, Elts);
914   return DISubprogram(Node);
915 }
916
917 /// createNameSpace - This creates new descriptor for a namespace
918 /// with the specified parent scope.
919 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
920                                        DIFile File, unsigned LineNo) {
921   Value *Elts[] = {
922     GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
923     getNonCompileUnitScope(Scope),
924     MDString::get(VMContext, Name),
925     File,
926     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
927   };
928   return DINameSpace(MDNode::get(VMContext, Elts));
929 }
930
931 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
932 /// an existing scope with a new filename.
933 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
934                                                      DIFile File) {
935   Value *Elts[] = {
936     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
937     Scope,
938     File
939   };
940   return DILexicalBlockFile(MDNode::get(VMContext, Elts));
941 }
942
943 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
944                                              unsigned Line, unsigned Col) {
945   // Defeat MDNode uniqing for lexical blocks by using unique id.
946   static unsigned int unique_id = 0;
947   Value *Elts[] = {
948     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
949     getNonCompileUnitScope(Scope),
950     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
951     ConstantInt::get(Type::getInt32Ty(VMContext), Col),
952     File,
953     ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
954   };
955   return DILexicalBlock(MDNode::get(VMContext, Elts));
956 }
957
958 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
959 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
960                                       Instruction *InsertBefore) {
961   assert(Storage && "no storage passed to dbg.declare");
962   assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
963   if (!DeclareFn)
964     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
965
966   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
967   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
968 }
969
970 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
971 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
972                                       BasicBlock *InsertAtEnd) {
973   assert(Storage && "no storage passed to dbg.declare");
974   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
975   if (!DeclareFn)
976     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
977
978   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
979
980   // If this block already has a terminator then insert this intrinsic
981   // before the terminator.
982   if (TerminatorInst *T = InsertAtEnd->getTerminator())
983     return CallInst::Create(DeclareFn, Args, "", T);
984   else
985     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
986 }
987
988 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
989 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
990                                                 DIVariable VarInfo,
991                                                 Instruction *InsertBefore) {
992   assert(V && "no value passed to dbg.value");
993   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
994   if (!ValueFn)
995     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
996
997   Value *Args[] = { MDNode::get(V->getContext(), V),
998                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
999                     VarInfo };
1000   return CallInst::Create(ValueFn, Args, "", InsertBefore);
1001 }
1002
1003 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1004 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1005                                                 DIVariable VarInfo,
1006                                                 BasicBlock *InsertAtEnd) {
1007   assert(V && "no value passed to dbg.value");
1008   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
1009   if (!ValueFn)
1010     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1011
1012   Value *Args[] = { MDNode::get(V->getContext(), V),
1013                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1014                     VarInfo };
1015   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1016 }