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