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