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