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