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