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
763  // A vector is an array type with the FlagVector flag applied.
764  Value *Elts[] = {
765    GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
766    NULL, // Filename/Directory,
767    NULL, // Unused
768    MDString::get(VMContext, ""),
769    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
770    ConstantInt::get(Type::getInt64Ty(VMContext), Size),
771    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
772    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
773    ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
774    Ty,
775    Subscripts,
776    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
777    Constant::getNullValue(Type::getInt32Ty(VMContext))
778  };
779  return DICompositeType(MDNode::get(VMContext, Elts));
780}
781
782/// createArtificialType - Create a new DIType with "artificial" flag set.
783DIType DIBuilder::createArtificialType(DIType Ty) {
784  if (Ty.isArtificial())
785    return Ty;
786
787  SmallVector<Value *, 9> Elts;
788  MDNode *N = Ty;
789  assert (N && "Unexpected input DIType!");
790  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
791    if (Value *V = N->getOperand(i))
792      Elts.push_back(V);
793    else
794      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
795  }
796
797  unsigned CurFlags = Ty.getFlags();
798  CurFlags = CurFlags | DIType::FlagArtificial;
799
800  // Flags are stored at this slot.
801  Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
802
803  return DIType(MDNode::get(VMContext, Elts));
804}
805
806/// createObjectPointerType - Create a new type with both the object pointer
807/// and artificial flags set.
808DIType DIBuilder::createObjectPointerType(DIType Ty) {
809  if (Ty.isObjectPointer())
810    return Ty;
811
812  SmallVector<Value *, 9> Elts;
813  MDNode *N = Ty;
814  assert (N && "Unexpected input DIType!");
815  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
816    if (Value *V = N->getOperand(i))
817      Elts.push_back(V);
818    else
819      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
820  }
821
822  unsigned CurFlags = Ty.getFlags();
823  CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
824
825  // Flags are stored at this slot.
826  Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
827
828  return DIType(MDNode::get(VMContext, Elts));
829}
830
831/// retainType - Retain DIType in a module even if it is not referenced
832/// through debug info anchors.
833void DIBuilder::retainType(DIType T) {
834  AllRetainTypes.push_back(T);
835}
836
837/// createUnspecifiedParameter - Create unspeicified type descriptor
838/// for the subroutine type.
839DIDescriptor DIBuilder::createUnspecifiedParameter() {
840  Value *Elts[] = {
841    GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
842  };
843  return DIDescriptor(MDNode::get(VMContext, Elts));
844}
845
846/// createForwardDecl - Create a temporary forward-declared type that
847/// can be RAUW'd if the full type is seen.
848DIType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
849                                    DIDescriptor Scope, DIFile F,
850                                    unsigned Line, unsigned RuntimeLang,
851                                    uint64_t SizeInBits,
852                                    uint64_t AlignInBits) {
853  // Create a temporary MDNode.
854  Value *Elts[] = {
855    GetTagConstant(VMContext, Tag),
856    F.getFileNode(),
857    getNonCompileUnitScope(Scope),
858    MDString::get(VMContext, Name),
859    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
860    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
861    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
862    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
863    ConstantInt::get(Type::getInt32Ty(VMContext),
864                     DIDescriptor::FlagFwdDecl),
865    NULL,
866    DIArray(),
867    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)
868  };
869  MDNode *Node = MDNode::getTemporary(VMContext, Elts);
870  DIType RetTy(Node);
871  assert(RetTy.isType() &&
872         "createForwardDecl result should be a DIType");
873  return RetTy;
874}
875
876/// getOrCreateArray - Get a DIArray, create one if required.
877DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
878  if (Elements.empty()) {
879    Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
880    return DIArray(MDNode::get(VMContext, Null));
881  }
882  return DIArray(MDNode::get(VMContext, Elements));
883}
884
885/// getOrCreateSubrange - Create a descriptor for a value range.  This
886/// implicitly uniques the values returned.
887DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
888  Value *Elts[] = {
889    GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
890    ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
891    ConstantInt::get(Type::getInt64Ty(VMContext), Count)
892  };
893
894  return DISubrange(MDNode::get(VMContext, Elts));
895}
896
897/// \brief Create a new descriptor for the specified global.
898DIGlobalVariable DIBuilder::
899createGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F,
900                     unsigned LineNumber, DIType Ty, bool isLocalToUnit,
901                     Value *Val) {
902  Value *Elts[] = {
903    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
904    Constant::getNullValue(Type::getInt32Ty(VMContext)),
905    NULL, // TheCU,
906    MDString::get(VMContext, Name),
907    MDString::get(VMContext, Name),
908    MDString::get(VMContext, LinkageName),
909    F,
910    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
911    Ty,
912    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
913    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
914    Val,
915    DIDescriptor()
916  };
917  MDNode *Node = MDNode::get(VMContext, Elts);
918  AllGVs.push_back(Node);
919  return DIGlobalVariable(Node);
920}
921
922/// \brief Create a new descriptor for the specified global.
923DIGlobalVariable DIBuilder::
924createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
925                     DIType Ty, bool isLocalToUnit, Value *Val) {
926  return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit,
927                              Val);
928}
929
930/// createStaticVariable - Create a new descriptor for the specified static
931/// variable.
932DIGlobalVariable DIBuilder::
933createStaticVariable(DIDescriptor Context, StringRef Name,
934                     StringRef LinkageName, DIFile F, unsigned LineNumber,
935                     DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) {
936  Value *Elts[] = {
937    GetTagConstant(VMContext, dwarf::DW_TAG_variable),
938    Constant::getNullValue(Type::getInt32Ty(VMContext)),
939    getNonCompileUnitScope(Context),
940    MDString::get(VMContext, Name),
941    MDString::get(VMContext, Name),
942    MDString::get(VMContext, LinkageName),
943    F,
944    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
945    Ty,
946    ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
947    ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
948    Val,
949    DIDescriptor(Decl)
950  };
951  MDNode *Node = MDNode::get(VMContext, Elts);
952  AllGVs.push_back(Node);
953  return DIGlobalVariable(Node);
954}
955
956/// createVariable - Create a new descriptor for the specified variable.
957DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
958                                          StringRef Name, DIFile File,
959                                          unsigned LineNo, DIType Ty,
960                                          bool AlwaysPreserve, unsigned Flags,
961                                          unsigned ArgNo) {
962  DIDescriptor Context(getNonCompileUnitScope(Scope));
963  assert((!Context || Context.isScope()) &&
964         "createLocalVariable should be called with a valid Context");
965  assert(Ty.isType() &&
966         "createLocalVariable should be called with a valid type");
967  Value *Elts[] = {
968    GetTagConstant(VMContext, Tag),
969    getNonCompileUnitScope(Scope),
970    MDString::get(VMContext, Name),
971    File,
972    ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
973    Ty,
974    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
975    Constant::getNullValue(Type::getInt32Ty(VMContext))
976  };
977  MDNode *Node = MDNode::get(VMContext, Elts);
978  if (AlwaysPreserve) {
979    // The optimizer may remove local variable. If there is an interest
980    // to preserve variable info in such situation then stash it in a
981    // named mdnode.
982    DISubprogram Fn(getDISubprogram(Scope));
983    NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
984    FnLocals->addOperand(Node);
985  }
986  DIVariable RetVar(Node);
987  assert(RetVar.isVariable() &&
988         "createLocalVariable should return a valid DIVariable");
989  return RetVar;
990}
991
992/// createComplexVariable - Create a new descriptor for the specified variable
993/// which has a complex address expression for its address.
994DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
995                                            StringRef Name, DIFile F,
996                                            unsigned LineNo,
997                                            DIType Ty, ArrayRef<Value *> Addr,
998                                            unsigned ArgNo) {
999  SmallVector<Value *, 15> Elts;
1000  Elts.push_back(GetTagConstant(VMContext, Tag));
1001  Elts.push_back(getNonCompileUnitScope(Scope)),
1002  Elts.push_back(MDString::get(VMContext, Name));
1003  Elts.push_back(F);
1004  Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
1005                                  (LineNo | (ArgNo << 24))));
1006  Elts.push_back(Ty);
1007  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1008  Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1009  Elts.append(Addr.begin(), Addr.end());
1010
1011  return DIVariable(MDNode::get(VMContext, Elts));
1012}
1013
1014/// createFunction - Create a new descriptor for the specified function.
1015DISubprogram DIBuilder::createFunction(DIDescriptor Context,
1016                                       StringRef Name,
1017                                       StringRef LinkageName,
1018                                       DIFile File, unsigned LineNo,
1019                                       DICompositeType Ty,
1020                                       bool isLocalToUnit, bool isDefinition,
1021                                       unsigned ScopeLine,
1022                                       unsigned Flags, bool isOptimized,
1023                                       Function *Fn,
1024                                       MDNode *TParams,
1025                                       MDNode *Decl) {
1026  assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1027         "function types should be subroutines");
1028  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1029  Value *Elts[] = {
1030    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1031    File.getFileNode(),
1032    getNonCompileUnitScope(Context),
1033    MDString::get(VMContext, Name),
1034    MDString::get(VMContext, Name),
1035    MDString::get(VMContext, LinkageName),
1036    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1037    Ty,
1038    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1039    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1040    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1041    ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1042    NULL,
1043    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1044    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1045    Fn,
1046    TParams,
1047    Decl,
1048    MDNode::getTemporary(VMContext, TElts),
1049    ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
1050  };
1051  MDNode *Node = MDNode::get(VMContext, Elts);
1052
1053  // Create a named metadata so that we do not lose this mdnode.
1054  if (isDefinition)
1055    AllSubprograms.push_back(Node);
1056  DISubprogram S(Node);
1057  assert(S.isSubprogram() && "createFunction should return a valid DISubprogram");
1058  return S;
1059}
1060
1061/// createMethod - Create a new descriptor for the specified C++ method.
1062DISubprogram DIBuilder::createMethod(DIDescriptor Context,
1063                                     StringRef Name,
1064                                     StringRef LinkageName,
1065                                     DIFile F,
1066                                     unsigned LineNo, DICompositeType Ty,
1067                                     bool isLocalToUnit,
1068                                     bool isDefinition,
1069                                     unsigned VK, unsigned VIndex,
1070                                     MDNode *VTableHolder,
1071                                     unsigned Flags,
1072                                     bool isOptimized,
1073                                     Function *Fn,
1074                                     MDNode *TParam) {
1075  assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1076         "function types should be subroutines");
1077  Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1078  Value *Elts[] = {
1079    GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1080    F.getFileNode(),
1081    getNonCompileUnitScope(Context),
1082    MDString::get(VMContext, Name),
1083    MDString::get(VMContext, Name),
1084    MDString::get(VMContext, LinkageName),
1085    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1086    Ty,
1087    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1088    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1089    ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
1090    ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
1091    VTableHolder,
1092    ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1093    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1094    Fn,
1095    TParam,
1096    Constant::getNullValue(Type::getInt32Ty(VMContext)),
1097    MDNode::getTemporary(VMContext, TElts),
1098    // FIXME: Do we want to use different scope/lines?
1099    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1100  };
1101  MDNode *Node = MDNode::get(VMContext, Elts);
1102  if (isDefinition)
1103    AllSubprograms.push_back(Node);
1104  DISubprogram S(Node);
1105  assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
1106  return S;
1107}
1108
1109/// createNameSpace - This creates new descriptor for a namespace
1110/// with the specified parent scope.
1111DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
1112                                       DIFile File, unsigned LineNo) {
1113  Value *Elts[] = {
1114    GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
1115    File.getFileNode(),
1116    getNonCompileUnitScope(Scope),
1117    MDString::get(VMContext, Name),
1118    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1119  };
1120  DINameSpace R(MDNode::get(VMContext, Elts));
1121  assert(R.Verify() &&
1122         "createNameSpace should return a verifiable DINameSpace");
1123  return R;
1124}
1125
1126/// createLexicalBlockFile - This creates a new MDNode that encapsulates
1127/// an existing scope with a new filename.
1128DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1129                                                     DIFile File) {
1130  Value *Elts[] = {
1131    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1132    File.getFileNode(),
1133    Scope
1134  };
1135  DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1136  assert(
1137      R.Verify() &&
1138      "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1139  return R;
1140}
1141
1142DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1143                                             unsigned Line, unsigned Col) {
1144  // Defeat MDNode uniquing for lexical blocks by using unique id.
1145  static unsigned int unique_id = 0;
1146  Value *Elts[] = {
1147    GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1148    File.getFileNode(),
1149    getNonCompileUnitScope(Scope),
1150    ConstantInt::get(Type::getInt32Ty(VMContext), Line),
1151    ConstantInt::get(Type::getInt32Ty(VMContext), Col),
1152    ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
1153  };
1154  DILexicalBlock R(MDNode::get(VMContext, Elts));
1155  assert(R.Verify() &&
1156         "createLexicalBlock should return a verifiable DILexicalBlock");
1157  return R;
1158}
1159
1160/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1161Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1162                                      Instruction *InsertBefore) {
1163  assert(Storage && "no storage passed to dbg.declare");
1164  assert(VarInfo.isVariable() &&
1165         "empty or invalid DIVariable passed to dbg.declare");
1166  if (!DeclareFn)
1167    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1168
1169  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1170  return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1171}
1172
1173/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1174Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1175                                      BasicBlock *InsertAtEnd) {
1176  assert(Storage && "no storage passed to dbg.declare");
1177  assert(VarInfo.isVariable() &&
1178         "empty or invalid DIVariable passed to dbg.declare");
1179  if (!DeclareFn)
1180    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1181
1182  Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1183
1184  // If this block already has a terminator then insert this intrinsic
1185  // before the terminator.
1186  if (TerminatorInst *T = InsertAtEnd->getTerminator())
1187    return CallInst::Create(DeclareFn, Args, "", T);
1188  else
1189    return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1190}
1191
1192/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1193Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1194                                                DIVariable VarInfo,
1195                                                Instruction *InsertBefore) {
1196  assert(V && "no value passed to dbg.value");
1197  assert(VarInfo.isVariable() &&
1198         "empty or invalid DIVariable passed to dbg.value");
1199  if (!ValueFn)
1200    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1201
1202  Value *Args[] = { MDNode::get(V->getContext(), V),
1203                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1204                    VarInfo };
1205  return CallInst::Create(ValueFn, Args, "", InsertBefore);
1206}
1207
1208/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1209Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1210                                                DIVariable VarInfo,
1211                                                BasicBlock *InsertAtEnd) {
1212  assert(V && "no value passed to dbg.value");
1213  assert(VarInfo.isVariable() &&
1214         "empty or invalid DIVariable passed to dbg.value");
1215  if (!ValueFn)
1216    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1217
1218  Value *Args[] = { MDNode::get(V->getContext(), V),
1219                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1220                    VarInfo };
1221  return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1222}
1223