DIBuilder: take an optional StringRef to pass in unique identifier.
[oota-llvm.git] / lib / IR / DIBuilder.cpp
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
23 using namespace llvm;
24 using namespace llvm::dwarf;
25
26 static 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
32 DIBuilder::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.
39 void 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.
71 static MDNode *getNonCompileUnitScope(MDNode *N) {
72   if (DIDescriptor(N).isCompileUnit())
73     return NULL;
74   return N;
75 }
76
77 static 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.
89 DICompileUnit 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
135 static DIImportedEntity
136 createImportedModule(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
164 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
165                                                  DINameSpace NS, unsigned Line,
166                                                  StringRef Name) {
167   return ::createImportedModule(VMContext, Context, NS, Line, Name,
168                                 AllImportedModules);
169 }
170
171 DIImportedEntity 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
179 DIImportedEntity 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.
196 DIFile 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.
205 DIEnumerator 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.
216 DIBasicType 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.
236 DIBasicType DIBuilder::createNullPtrType() {
237   return createUnspecifiedType("decltype(nullptr)");
238 }
239
240 /// createBasicType - Create debugging information entry for a basic
241 /// type, e.g 'char'.
242 DIBasicType
243 DIBuilder::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'.
265 DIDerivedType 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.
283 DIDerivedType
284 DIBuilder::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
302 DIDerivedType 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.
323 DIDerivedType 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.
342 DIDerivedType 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'.
362 DIDerivedType 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.
383 DIDerivedType 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.
403 DIDerivedType 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.
425 DIDerivedType
426 DIBuilder::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.
450 DIDerivedType
451 DIBuilder::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.
480 DIDerivedType
481 DIBuilder::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.
505 DIObjCProperty 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.
526 DITemplateTypeParameter
527 DIBuilder::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
542 DITemplateValueParameter
543 DIBuilder::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.
563 DITemplateValueParameter
564 DIBuilder::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
573 DITemplateValueParameter
574 DIBuilder::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
583 DITemplateValueParameter
584 DIBuilder::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.
594 DICompositeType 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                                            StringRef UniqueIdentifier) {
604   assert((!Context || Context.isScope() || Context.isType()) &&
605          "createClassType should be called with a valid Context");
606   // TAG_class_type is encoded in DICompositeType format.
607   Value *Elts[] = {
608     GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
609     File.getFileNode(),
610     getNonCompileUnitScope(Context),
611     MDString::get(VMContext, Name),
612     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
613     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
614     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
615     ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
616     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
617     DerivedFrom,
618     Elements,
619     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
620     VTableHolder,
621     TemplateParams,
622     UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
623   };
624   DICompositeType R(MDNode::get(VMContext, Elts));
625   assert(R.isCompositeType() &&
626          "createClassType should return a DICompositeType");
627   return R;
628 }
629
630 /// createStructType - Create debugging information entry for a struct.
631 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
632                                             StringRef Name, DIFile File,
633                                             unsigned LineNumber,
634                                             uint64_t SizeInBits,
635                                             uint64_t AlignInBits,
636                                             unsigned Flags, DIType DerivedFrom,
637                                             DIArray Elements,
638                                             unsigned RunTimeLang,
639                                             MDNode *VTableHolder,
640                                             StringRef UniqueIdentifier) {
641  // TAG_structure_type is encoded in DICompositeType format.
642   Value *Elts[] = {
643     GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
644     File.getFileNode(),
645     getNonCompileUnitScope(Context),
646     MDString::get(VMContext, Name),
647     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
648     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
649     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
650     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
651     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
652     DerivedFrom,
653     Elements,
654     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
655     VTableHolder,
656     NULL,
657     UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
658   };
659   DICompositeType R(MDNode::get(VMContext, Elts));
660   assert(R.isCompositeType() &&
661          "createStructType should return a DICompositeType");
662   return R;
663 }
664
665 /// createUnionType - Create debugging information entry for an union.
666 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
667                                            DIFile File, unsigned LineNumber,
668                                            uint64_t SizeInBits,
669                                            uint64_t AlignInBits, unsigned Flags,
670                                            DIArray Elements,
671                                            unsigned RunTimeLang,
672                                            StringRef UniqueIdentifier) {
673   // TAG_union_type is encoded in DICompositeType format.
674   Value *Elts[] = {
675     GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
676     File.getFileNode(),
677     getNonCompileUnitScope(Scope),
678     MDString::get(VMContext, Name),
679     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
680     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
681     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
682     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
683     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
684     NULL,
685     Elements,
686     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
687     NULL,
688     NULL,
689     UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
690   };
691   return DICompositeType(MDNode::get(VMContext, Elts));
692 }
693
694 /// createSubroutineType - Create subroutine type.
695 DICompositeType
696 DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
697   // TAG_subroutine_type is encoded in DICompositeType format.
698   Value *Elts[] = {
699     GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
700     Constant::getNullValue(Type::getInt32Ty(VMContext)),
701     Constant::getNullValue(Type::getInt32Ty(VMContext)),
702     MDString::get(VMContext, ""),
703     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
704     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
705     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
706     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
707     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
708     NULL,
709     ParameterTypes,
710     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
711     NULL,
712     NULL,
713     NULL  // Type Identifer
714   };
715   return DICompositeType(MDNode::get(VMContext, Elts));
716 }
717
718 /// createEnumerationType - Create debugging information entry for an
719 /// enumeration.
720 DICompositeType DIBuilder::createEnumerationType(
721     DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
722     uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
723     DIType UnderlyingType, StringRef UniqueIdentifier) {
724   // TAG_enumeration_type is encoded in DICompositeType format.
725   Value *Elts[] = {
726     GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
727     File.getFileNode(),
728     getNonCompileUnitScope(Scope),
729     MDString::get(VMContext, Name),
730     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
731     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
732     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
733     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
734     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
735     UnderlyingType,
736     Elements,
737     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
738     NULL,
739     NULL,
740     UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
741   };
742   MDNode *Node = MDNode::get(VMContext, Elts);
743   AllEnumTypes.push_back(Node);
744   return DICompositeType(Node);
745 }
746
747 /// createArrayType - Create debugging information entry for an array.
748 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
749                                            DIType Ty, DIArray Subscripts) {
750   // TAG_array_type is encoded in DICompositeType format.
751   Value *Elts[] = {
752     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
753     NULL, // Filename/Directory,
754     NULL, // Unused
755     MDString::get(VMContext, ""),
756     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
757     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
758     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
759     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
760     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
761     Ty,
762     Subscripts,
763     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
764     NULL,
765     NULL,
766     NULL  // Type Identifer
767   };
768   return DICompositeType(MDNode::get(VMContext, Elts));
769 }
770
771 /// createVectorType - Create debugging information entry for a vector.
772 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
773                                             DIType Ty, DIArray Subscripts) {
774   // A vector is an array type with the FlagVector flag applied.
775   Value *Elts[] = {
776     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
777     NULL, // Filename/Directory,
778     NULL, // Unused
779     MDString::get(VMContext, ""),
780     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
781     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
782     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
783     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
784     ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
785     Ty,
786     Subscripts,
787     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
788     NULL,
789     NULL,
790     NULL  // Type Identifer
791   };
792   return DICompositeType(MDNode::get(VMContext, Elts));
793 }
794
795 /// createArtificialType - Create a new DIType with "artificial" flag set.
796 DIType DIBuilder::createArtificialType(DIType Ty) {
797   if (Ty.isArtificial())
798     return Ty;
799
800   SmallVector<Value *, 9> Elts;
801   MDNode *N = Ty;
802   assert (N && "Unexpected input DIType!");
803   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
804     if (Value *V = N->getOperand(i))
805       Elts.push_back(V);
806     else
807       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
808   }
809
810   unsigned CurFlags = Ty.getFlags();
811   CurFlags = CurFlags | DIType::FlagArtificial;
812
813   // Flags are stored at this slot.
814   Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
815
816   return DIType(MDNode::get(VMContext, Elts));
817 }
818
819 /// createObjectPointerType - Create a new type with both the object pointer
820 /// and artificial flags set.
821 DIType DIBuilder::createObjectPointerType(DIType Ty) {
822   if (Ty.isObjectPointer())
823     return Ty;
824
825   SmallVector<Value *, 9> Elts;
826   MDNode *N = Ty;
827   assert (N && "Unexpected input DIType!");
828   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
829     if (Value *V = N->getOperand(i))
830       Elts.push_back(V);
831     else
832       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
833   }
834
835   unsigned CurFlags = Ty.getFlags();
836   CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
837
838   // Flags are stored at this slot.
839   Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
840
841   return DIType(MDNode::get(VMContext, Elts));
842 }
843
844 /// retainType - Retain DIType in a module even if it is not referenced
845 /// through debug info anchors.
846 void DIBuilder::retainType(DIType T) {
847   AllRetainTypes.push_back(T);
848 }
849
850 /// createUnspecifiedParameter - Create unspeicified type descriptor
851 /// for the subroutine type.
852 DIDescriptor DIBuilder::createUnspecifiedParameter() {
853   Value *Elts[] = {
854     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
855   };
856   return DIDescriptor(MDNode::get(VMContext, Elts));
857 }
858
859 /// createForwardDecl - Create a temporary forward-declared type that
860 /// can be RAUW'd if the full type is seen.
861 DICompositeType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
862                                     DIDescriptor Scope, DIFile F,
863                                     unsigned Line, unsigned RuntimeLang,
864                                     uint64_t SizeInBits,
865                                     uint64_t AlignInBits,
866                                     StringRef UniqueIdentifier) {
867   // Create a temporary MDNode.
868   Value *Elts[] = {
869     GetTagConstant(VMContext, Tag),
870     F.getFileNode(),
871     getNonCompileUnitScope(Scope),
872     MDString::get(VMContext, Name),
873     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
874     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
875     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
876     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
877     ConstantInt::get(Type::getInt32Ty(VMContext),
878                      DIDescriptor::FlagFwdDecl),
879     NULL,
880     DIArray(),
881     ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang),
882     NULL,
883     NULL, //TemplateParams
884     UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
885   };
886   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
887   DICompositeType RetTy(Node);
888   assert(RetTy.isCompositeType() &&
889          "createForwardDecl result should be a DIType");
890   return RetTy;
891 }
892
893 /// getOrCreateArray - Get a DIArray, create one if required.
894 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
895   if (Elements.empty()) {
896     Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
897     return DIArray(MDNode::get(VMContext, Null));
898   }
899   return DIArray(MDNode::get(VMContext, Elements));
900 }
901
902 /// getOrCreateSubrange - Create a descriptor for a value range.  This
903 /// implicitly uniques the values returned.
904 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
905   Value *Elts[] = {
906     GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
907     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
908     ConstantInt::get(Type::getInt64Ty(VMContext), Count)
909   };
910
911   return DISubrange(MDNode::get(VMContext, Elts));
912 }
913
914 /// \brief Create a new descriptor for the specified global.
915 DIGlobalVariable DIBuilder::
916 createGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F,
917                      unsigned LineNumber, DIType Ty, bool isLocalToUnit,
918                      Value *Val) {
919   Value *Elts[] = {
920     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
921     Constant::getNullValue(Type::getInt32Ty(VMContext)),
922     NULL, // TheCU,
923     MDString::get(VMContext, Name),
924     MDString::get(VMContext, Name),
925     MDString::get(VMContext, LinkageName),
926     F,
927     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
928     Ty,
929     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
930     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
931     Val,
932     DIDescriptor()
933   };
934   MDNode *Node = MDNode::get(VMContext, Elts);
935   AllGVs.push_back(Node);
936   return DIGlobalVariable(Node);
937 }
938
939 /// \brief Create a new descriptor for the specified global.
940 DIGlobalVariable DIBuilder::
941 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
942                      DIType Ty, bool isLocalToUnit, Value *Val) {
943   return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit,
944                               Val);
945 }
946
947 /// createStaticVariable - Create a new descriptor for the specified static
948 /// variable.
949 DIGlobalVariable DIBuilder::
950 createStaticVariable(DIDescriptor Context, StringRef Name,
951                      StringRef LinkageName, DIFile F, unsigned LineNumber,
952                      DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) {
953   Value *Elts[] = {
954     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
955     Constant::getNullValue(Type::getInt32Ty(VMContext)),
956     getNonCompileUnitScope(Context),
957     MDString::get(VMContext, Name),
958     MDString::get(VMContext, Name),
959     MDString::get(VMContext, LinkageName),
960     F,
961     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
962     Ty,
963     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
964     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
965     Val,
966     DIDescriptor(Decl)
967   };
968   MDNode *Node = MDNode::get(VMContext, Elts);
969   AllGVs.push_back(Node);
970   return DIGlobalVariable(Node);
971 }
972
973 /// createVariable - Create a new descriptor for the specified variable.
974 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
975                                           StringRef Name, DIFile File,
976                                           unsigned LineNo, DIType Ty,
977                                           bool AlwaysPreserve, unsigned Flags,
978                                           unsigned ArgNo) {
979   DIDescriptor Context(getNonCompileUnitScope(Scope));
980   assert((!Context || Context.isScope()) &&
981          "createLocalVariable should be called with a valid Context");
982   assert(Ty.isType() &&
983          "createLocalVariable should be called with a valid type");
984   Value *Elts[] = {
985     GetTagConstant(VMContext, Tag),
986     getNonCompileUnitScope(Scope),
987     MDString::get(VMContext, Name),
988     File,
989     ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
990     Ty,
991     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
992     Constant::getNullValue(Type::getInt32Ty(VMContext))
993   };
994   MDNode *Node = MDNode::get(VMContext, Elts);
995   if (AlwaysPreserve) {
996     // The optimizer may remove local variable. If there is an interest
997     // to preserve variable info in such situation then stash it in a
998     // named mdnode.
999     DISubprogram Fn(getDISubprogram(Scope));
1000     NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
1001     FnLocals->addOperand(Node);
1002   }
1003   DIVariable RetVar(Node);
1004   assert(RetVar.isVariable() &&
1005          "createLocalVariable should return a valid DIVariable");
1006   return RetVar;
1007 }
1008
1009 /// createComplexVariable - Create a new descriptor for the specified variable
1010 /// which has a complex address expression for its address.
1011 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
1012                                             StringRef Name, DIFile F,
1013                                             unsigned LineNo,
1014                                             DIType Ty, ArrayRef<Value *> Addr,
1015                                             unsigned ArgNo) {
1016   SmallVector<Value *, 15> Elts;
1017   Elts.push_back(GetTagConstant(VMContext, Tag));
1018   Elts.push_back(getNonCompileUnitScope(Scope)),
1019   Elts.push_back(MDString::get(VMContext, Name));
1020   Elts.push_back(F);
1021   Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
1022                                   (LineNo | (ArgNo << 24))));
1023   Elts.push_back(Ty);
1024   Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1025   Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1026   Elts.append(Addr.begin(), Addr.end());
1027
1028   return DIVariable(MDNode::get(VMContext, Elts));
1029 }
1030
1031 /// createFunction - Create a new descriptor for the specified function.
1032 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
1033                                        StringRef Name,
1034                                        StringRef LinkageName,
1035                                        DIFile File, unsigned LineNo,
1036                                        DICompositeType Ty,
1037                                        bool isLocalToUnit, bool isDefinition,
1038                                        unsigned ScopeLine,
1039                                        unsigned Flags, bool isOptimized,
1040                                        Function *Fn,
1041                                        MDNode *TParams,
1042                                        MDNode *Decl) {
1043   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1044          "function types should be subroutines");
1045   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1046   Value *Elts[] = {
1047     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1048     File.getFileNode(),
1049     getNonCompileUnitScope(Context),
1050     MDString::get(VMContext, Name),
1051     MDString::get(VMContext, Name),
1052     MDString::get(VMContext, LinkageName),
1053     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1054     Ty,
1055     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1056     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1057     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1058     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1059     NULL,
1060     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1061     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1062     Fn,
1063     TParams,
1064     Decl,
1065     MDNode::getTemporary(VMContext, TElts),
1066     ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
1067   };
1068   MDNode *Node = MDNode::get(VMContext, Elts);
1069
1070   // Create a named metadata so that we do not lose this mdnode.
1071   if (isDefinition)
1072     AllSubprograms.push_back(Node);
1073   DISubprogram S(Node);
1074   assert(S.isSubprogram() && "createFunction should return a valid DISubprogram");
1075   return S;
1076 }
1077
1078 /// createMethod - Create a new descriptor for the specified C++ method.
1079 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
1080                                      StringRef Name,
1081                                      StringRef LinkageName,
1082                                      DIFile F,
1083                                      unsigned LineNo, DICompositeType Ty,
1084                                      bool isLocalToUnit,
1085                                      bool isDefinition,
1086                                      unsigned VK, unsigned VIndex,
1087                                      MDNode *VTableHolder,
1088                                      unsigned Flags,
1089                                      bool isOptimized,
1090                                      Function *Fn,
1091                                      MDNode *TParam) {
1092   assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1093          "function types should be subroutines");
1094   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1095   Value *Elts[] = {
1096     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1097     F.getFileNode(),
1098     getNonCompileUnitScope(Context),
1099     MDString::get(VMContext, Name),
1100     MDString::get(VMContext, Name),
1101     MDString::get(VMContext, LinkageName),
1102     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1103     Ty,
1104     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1105     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1106     ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
1107     ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
1108     VTableHolder,
1109     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1110     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1111     Fn,
1112     TParam,
1113     Constant::getNullValue(Type::getInt32Ty(VMContext)),
1114     MDNode::getTemporary(VMContext, TElts),
1115     // FIXME: Do we want to use different scope/lines?
1116     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1117   };
1118   MDNode *Node = MDNode::get(VMContext, Elts);
1119   if (isDefinition)
1120     AllSubprograms.push_back(Node);
1121   DISubprogram S(Node);
1122   assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
1123   return S;
1124 }
1125
1126 /// createNameSpace - This creates new descriptor for a namespace
1127 /// with the specified parent scope.
1128 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
1129                                        DIFile File, unsigned LineNo) {
1130   Value *Elts[] = {
1131     GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
1132     File.getFileNode(),
1133     getNonCompileUnitScope(Scope),
1134     MDString::get(VMContext, Name),
1135     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1136   };
1137   DINameSpace R(MDNode::get(VMContext, Elts));
1138   assert(R.Verify() &&
1139          "createNameSpace should return a verifiable DINameSpace");
1140   return R;
1141 }
1142
1143 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
1144 /// an existing scope with a new filename.
1145 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1146                                                      DIFile File) {
1147   Value *Elts[] = {
1148     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1149     File.getFileNode(),
1150     Scope
1151   };
1152   DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1153   assert(
1154       R.Verify() &&
1155       "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1156   return R;
1157 }
1158
1159 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1160                                              unsigned Line, unsigned Col) {
1161   // Defeat MDNode uniquing for lexical blocks by using unique id.
1162   static unsigned int unique_id = 0;
1163   Value *Elts[] = {
1164     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1165     File.getFileNode(),
1166     getNonCompileUnitScope(Scope),
1167     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
1168     ConstantInt::get(Type::getInt32Ty(VMContext), Col),
1169     ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
1170   };
1171   DILexicalBlock R(MDNode::get(VMContext, Elts));
1172   assert(R.Verify() &&
1173          "createLexicalBlock should return a verifiable DILexicalBlock");
1174   return R;
1175 }
1176
1177 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1178 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1179                                       Instruction *InsertBefore) {
1180   assert(Storage && "no storage passed to dbg.declare");
1181   assert(VarInfo.isVariable() &&
1182          "empty or invalid DIVariable passed to dbg.declare");
1183   if (!DeclareFn)
1184     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1185
1186   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1187   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1188 }
1189
1190 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1191 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1192                                       BasicBlock *InsertAtEnd) {
1193   assert(Storage && "no storage passed to dbg.declare");
1194   assert(VarInfo.isVariable() &&
1195          "empty or invalid DIVariable passed to dbg.declare");
1196   if (!DeclareFn)
1197     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1198
1199   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1200
1201   // If this block already has a terminator then insert this intrinsic
1202   // before the terminator.
1203   if (TerminatorInst *T = InsertAtEnd->getTerminator())
1204     return CallInst::Create(DeclareFn, Args, "", T);
1205   else
1206     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1207 }
1208
1209 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1210 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1211                                                 DIVariable VarInfo,
1212                                                 Instruction *InsertBefore) {
1213   assert(V && "no value passed to dbg.value");
1214   assert(VarInfo.isVariable() &&
1215          "empty or invalid DIVariable passed to dbg.value");
1216   if (!ValueFn)
1217     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1218
1219   Value *Args[] = { MDNode::get(V->getContext(), V),
1220                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1221                     VarInfo };
1222   return CallInst::Create(ValueFn, Args, "", InsertBefore);
1223 }
1224
1225 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1226 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1227                                                 DIVariable VarInfo,
1228                                                 BasicBlock *InsertAtEnd) {
1229   assert(V && "no value passed to dbg.value");
1230   assert(VarInfo.isVariable() &&
1231          "empty or invalid DIVariable passed to dbg.value");
1232   if (!ValueFn)
1233     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1234
1235   Value *Args[] = { MDNode::get(V->getContext(), V),
1236                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1237                     VarInfo };
1238   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
1239 }