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