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