• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/Analysis/DIBuilder.h"
15 #include "llvm/Analysis/DebugInfo.h"
16 #include "llvm/Constants.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Module.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/Support/Dwarf.h"
21 
22 using namespace llvm;
23 using namespace llvm::dwarf;
24 
GetTagConstant(LLVMContext & VMContext,unsigned Tag)25 static Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) {
26   assert((Tag & LLVMDebugVersionMask) == 0 &&
27          "Tag too large for debug encoding!");
28   return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion);
29 }
30 
DIBuilder(Module & m)31 DIBuilder::DIBuilder(Module &m)
32   : M(m), VMContext(M.getContext()), TheCU(0), TempEnumTypes(0),
33     TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
34     ValueFn(0)
35 {}
36 
37 /// finalize - Construct any deferred debug info descriptors.
finalize()38 void DIBuilder::finalize() {
39   DIArray Enums = getOrCreateArray(AllEnumTypes);
40   DIType(TempEnumTypes).replaceAllUsesWith(Enums);
41 
42   DIArray RetainTypes = getOrCreateArray(AllRetainTypes);
43   DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
44 
45   DIArray SPs = getOrCreateArray(AllSubprograms);
46   DIType(TempSubprograms).replaceAllUsesWith(SPs);
47   for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
48     DISubprogram SP(SPs.getElement(i));
49     if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
50       SmallVector<Value *, 4> Variables;
51       for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
52         Variables.push_back(NMD->getOperand(ii));
53       if (MDNode *Temp = SP.getVariablesNodes()) {
54         DIArray AV = getOrCreateArray(Variables);
55         DIType(Temp).replaceAllUsesWith(AV);
56       }
57       NMD->eraseFromParent();
58     }
59   }
60 
61   DIArray GVs = getOrCreateArray(AllGVs);
62   DIType(TempGVs).replaceAllUsesWith(GVs);
63 }
64 
65 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
66 /// N.
getNonCompileUnitScope(MDNode * N)67 static MDNode *getNonCompileUnitScope(MDNode *N) {
68   if (DIDescriptor(N).isCompileUnit())
69     return NULL;
70   return N;
71 }
72 
73 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
74 /// information generated during this instance of compilation.
createCompileUnit(unsigned Lang,StringRef Filename,StringRef Directory,StringRef Producer,bool isOptimized,StringRef Flags,unsigned RunTimeVer)75 void DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
76                                   StringRef Directory, StringRef Producer,
77                                   bool isOptimized, StringRef Flags,
78                                   unsigned RunTimeVer) {
79   assert (Lang <= dwarf::DW_LANG_D && Lang >= dwarf::DW_LANG_C89
80 	  && "Invalid Language tag");
81   assert (!Filename.empty()
82 	  && "Unable to create compile unit without filename");
83   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
84   TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
85   Value *THElts[] = { TempEnumTypes };
86   MDNode *EnumHolder = MDNode::get(VMContext, THElts);
87 
88   TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
89   Value *TRElts[] = { TempRetainTypes };
90   MDNode *RetainHolder = MDNode::get(VMContext, TRElts);
91 
92   TempSubprograms = MDNode::getTemporary(VMContext, TElts);
93   Value *TSElts[] = { TempSubprograms };
94   MDNode *SPHolder = MDNode::get(VMContext, TSElts);
95 
96   TempGVs = MDNode::getTemporary(VMContext, TElts);
97   Value *TVElts[] = { TempGVs };
98   MDNode *GVHolder = MDNode::get(VMContext, TVElts);
99 
100   Value *Elts[] = {
101     GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
102     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
103     ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
104     MDString::get(VMContext, Filename),
105     MDString::get(VMContext, Directory),
106     MDString::get(VMContext, Producer),
107     // Deprecate isMain field.
108     ConstantInt::get(Type::getInt1Ty(VMContext), true), // isMain
109     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
110     MDString::get(VMContext, Flags),
111     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
112     EnumHolder,
113     RetainHolder,
114     SPHolder,
115     GVHolder
116   };
117   TheCU = DICompileUnit(MDNode::get(VMContext, Elts));
118 
119   // Create a named metadata so that it is easier to find cu in a module.
120   NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
121   NMD->addOperand(TheCU);
122 }
123 
124 /// createFile - Create a file descriptor to hold debugging information
125 /// for a file.
createFile(StringRef Filename,StringRef Directory)126 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
127   assert(TheCU && "Unable to create DW_TAG_file_type without CompileUnit");
128   assert(!Filename.empty() && "Unable to create file without name");
129   Value *Elts[] = {
130     GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
131     MDString::get(VMContext, Filename),
132     MDString::get(VMContext, Directory),
133     NULL // TheCU
134   };
135   return DIFile(MDNode::get(VMContext, Elts));
136 }
137 
138 /// createEnumerator - Create a single enumerator value.
createEnumerator(StringRef Name,uint64_t Val)139 DIEnumerator DIBuilder::createEnumerator(StringRef Name, uint64_t Val) {
140   assert(!Name.empty() && "Unable to create enumerator without name");
141   Value *Elts[] = {
142     GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
143     MDString::get(VMContext, Name),
144     ConstantInt::get(Type::getInt64Ty(VMContext), Val)
145   };
146   return DIEnumerator(MDNode::get(VMContext, Elts));
147 }
148 
149 /// createNullPtrType - Create C++0x nullptr type.
createNullPtrType(StringRef Name)150 DIType DIBuilder::createNullPtrType(StringRef Name) {
151   assert(!Name.empty() && "Unable to create type without name");
152   // nullptr is encoded in DIBasicType format. Line number, filename,
153   // ,size, alignment, offset and flags are always empty here.
154   Value *Elts[] = {
155     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
156     NULL, //TheCU,
157     MDString::get(VMContext, Name),
158     NULL, // Filename
159     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
160     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
161     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
162     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
163     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
164     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Encoding
165   };
166   return DIType(MDNode::get(VMContext, Elts));
167 }
168 
169 /// createBasicType - Create debugging information entry for a basic
170 /// type, e.g 'char'.
createBasicType(StringRef Name,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Encoding)171 DIType DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
172                                   uint64_t AlignInBits,
173                                   unsigned Encoding) {
174   assert(!Name.empty() && "Unable to create type without name");
175   // Basic types are encoded in DIBasicType format. Line number, filename,
176   // offset and flags are always empty here.
177   Value *Elts[] = {
178     GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
179     NULL, //TheCU,
180     MDString::get(VMContext, Name),
181     NULL, // Filename
182     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
183     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
184     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
185     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
186     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
187     ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
188   };
189   return DIType(MDNode::get(VMContext, Elts));
190 }
191 
192 /// createQaulifiedType - Create debugging information entry for a qualified
193 /// type, e.g. 'const int'.
createQualifiedType(unsigned Tag,DIType FromTy)194 DIType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
195   // Qualified types are encoded in DIDerivedType format.
196   Value *Elts[] = {
197     GetTagConstant(VMContext, Tag),
198     NULL, //TheCU,
199     MDString::get(VMContext, StringRef()), // Empty name.
200     NULL, // Filename
201     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
202     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
203     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
204     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
205     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
206     FromTy
207   };
208   return DIType(MDNode::get(VMContext, Elts));
209 }
210 
211 /// createPointerType - Create debugging information entry for a pointer.
createPointerType(DIType PointeeTy,uint64_t SizeInBits,uint64_t AlignInBits,StringRef Name)212 DIType DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
213                                     uint64_t AlignInBits, StringRef Name) {
214   // Pointer types are encoded in DIDerivedType format.
215   Value *Elts[] = {
216     GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
217     NULL, //TheCU,
218     MDString::get(VMContext, Name),
219     NULL, // Filename
220     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
221     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
222     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
223     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
224     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
225     PointeeTy
226   };
227   return DIType(MDNode::get(VMContext, Elts));
228 }
229 
230 /// createReferenceType - Create debugging information entry for a reference.
createReferenceType(DIType RTy)231 DIType DIBuilder::createReferenceType(DIType RTy) {
232   assert(RTy.Verify() && "Unable to create reference type");
233   // References are encoded in DIDerivedType format.
234   Value *Elts[] = {
235     GetTagConstant(VMContext, dwarf::DW_TAG_reference_type),
236     NULL, // TheCU,
237     NULL, // Name
238     NULL, // Filename
239     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
240     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
241     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
242     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
243     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
244     RTy
245   };
246   return DIType(MDNode::get(VMContext, Elts));
247 }
248 
249 /// createTypedef - Create debugging information entry for a typedef.
createTypedef(DIType Ty,StringRef Name,DIFile File,unsigned LineNo,DIDescriptor Context)250 DIType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
251                                 unsigned LineNo, DIDescriptor Context) {
252   // typedefs are encoded in DIDerivedType format.
253   assert(Ty.Verify() && "Invalid typedef type!");
254   Value *Elts[] = {
255     GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
256     getNonCompileUnitScope(Context),
257     MDString::get(VMContext, Name),
258     File,
259     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
260     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
261     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
262     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
263     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
264     Ty
265   };
266   return DIType(MDNode::get(VMContext, Elts));
267 }
268 
269 /// createFriend - Create debugging information entry for a 'friend'.
createFriend(DIType Ty,DIType FriendTy)270 DIType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
271   // typedefs are encoded in DIDerivedType format.
272   assert(Ty.Verify() && "Invalid type!");
273   assert(FriendTy.Verify() && "Invalid friend type!");
274   Value *Elts[] = {
275     GetTagConstant(VMContext, dwarf::DW_TAG_friend),
276     Ty,
277     NULL, // Name
278     Ty.getFile(),
279     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
280     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
281     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
282     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
283     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
284     FriendTy
285   };
286   return DIType(MDNode::get(VMContext, Elts));
287 }
288 
289 /// createInheritance - Create debugging information entry to establish
290 /// inheritance relationship between two types.
createInheritance(DIType Ty,DIType BaseTy,uint64_t BaseOffset,unsigned Flags)291 DIType DIBuilder::createInheritance(DIType Ty, DIType BaseTy,
292                                     uint64_t BaseOffset, unsigned Flags) {
293   assert(Ty.Verify() && "Unable to create inheritance");
294   // TAG_inheritance is encoded in DIDerivedType format.
295   Value *Elts[] = {
296     GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
297     Ty,
298     NULL, // Name
299     Ty.getFile(),
300     ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
301     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
302     ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
303     ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
304     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
305     BaseTy
306   };
307   return DIType(MDNode::get(VMContext, Elts));
308 }
309 
310 /// createMemberType - Create debugging information entry for a member.
createMemberType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType Ty)311 DIType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name,
312                                    DIFile File, unsigned LineNumber,
313                                    uint64_t SizeInBits, uint64_t AlignInBits,
314                                    uint64_t OffsetInBits, unsigned Flags,
315                                    DIType Ty) {
316   // TAG_member is encoded in DIDerivedType format.
317   Value *Elts[] = {
318     GetTagConstant(VMContext, dwarf::DW_TAG_member),
319     getNonCompileUnitScope(Scope),
320     MDString::get(VMContext, Name),
321     File,
322     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
323     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
324     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
325     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
326     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
327     Ty
328   };
329   return DIType(MDNode::get(VMContext, Elts));
330 }
331 
332 /// createObjCIVar - Create debugging information entry for Objective-C
333 /// instance variable.
createObjCIVar(StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType Ty,StringRef PropertyName,StringRef GetterName,StringRef SetterName,unsigned PropertyAttributes)334 DIType DIBuilder::createObjCIVar(StringRef Name,
335                                  DIFile File, unsigned LineNumber,
336                                  uint64_t SizeInBits, uint64_t AlignInBits,
337                                  uint64_t OffsetInBits, unsigned Flags,
338                                  DIType Ty, StringRef PropertyName,
339                                  StringRef GetterName, StringRef SetterName,
340                                  unsigned PropertyAttributes) {
341   // TAG_member is encoded in DIDerivedType format.
342   Value *Elts[] = {
343     GetTagConstant(VMContext, dwarf::DW_TAG_member),
344     getNonCompileUnitScope(File),
345     MDString::get(VMContext, Name),
346     File,
347     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
348     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
349     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
350     ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
351     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
352     Ty,
353     MDString::get(VMContext, PropertyName),
354     MDString::get(VMContext, GetterName),
355     MDString::get(VMContext, SetterName),
356     ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
357   };
358   return DIType(MDNode::get(VMContext, Elts));
359 }
360 
361 /// createClassType - Create debugging information entry for a class.
createClassType(DIDescriptor Context,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType DerivedFrom,DIArray Elements,MDNode * VTableHoder,MDNode * TemplateParams)362 DIType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
363                                   DIFile File, unsigned LineNumber,
364                                   uint64_t SizeInBits, uint64_t AlignInBits,
365                                   uint64_t OffsetInBits, unsigned Flags,
366                                   DIType DerivedFrom, DIArray Elements,
367                                   MDNode *VTableHoder, MDNode *TemplateParams) {
368  // TAG_class_type is encoded in DICompositeType format.
369   Value *Elts[] = {
370     GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
371     getNonCompileUnitScope(Context),
372     MDString::get(VMContext, Name),
373     File,
374     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
375     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
376     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
377     ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
378     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
379     DerivedFrom,
380     Elements,
381     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
382     VTableHoder,
383     TemplateParams
384   };
385   return DIType(MDNode::get(VMContext, Elts));
386 }
387 
388 /// createTemplateTypeParameter - Create debugging information for template
389 /// type parameter.
390 DITemplateTypeParameter
createTemplateTypeParameter(DIDescriptor Context,StringRef Name,DIType Ty,MDNode * File,unsigned LineNo,unsigned ColumnNo)391 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
392                                        DIType Ty, MDNode *File, unsigned LineNo,
393                                        unsigned ColumnNo) {
394   Value *Elts[] = {
395     GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
396     getNonCompileUnitScope(Context),
397     MDString::get(VMContext, Name),
398     Ty,
399     File,
400     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
401     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
402   };
403   return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
404 }
405 
406 /// createTemplateValueParameter - Create debugging information for template
407 /// value parameter.
408 DITemplateValueParameter
createTemplateValueParameter(DIDescriptor Context,StringRef Name,DIType Ty,uint64_t Val,MDNode * File,unsigned LineNo,unsigned ColumnNo)409 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
410                                         DIType Ty, uint64_t Val,
411                                         MDNode *File, unsigned LineNo,
412                                         unsigned ColumnNo) {
413   Value *Elts[] = {
414     GetTagConstant(VMContext, dwarf::DW_TAG_template_value_parameter),
415     getNonCompileUnitScope(Context),
416     MDString::get(VMContext, Name),
417     Ty,
418     ConstantInt::get(Type::getInt64Ty(VMContext), Val),
419     File,
420     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
421     ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
422   };
423   return DITemplateValueParameter(MDNode::get(VMContext, Elts));
424 }
425 
426 /// createStructType - Create debugging information entry for a struct.
createStructType(DIDescriptor Context,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DIArray Elements,unsigned RunTimeLang)427 DIType DIBuilder::createStructType(DIDescriptor Context, StringRef Name,
428                                    DIFile File, unsigned LineNumber,
429                                    uint64_t SizeInBits, uint64_t AlignInBits,
430                                    unsigned Flags, DIArray Elements,
431                                    unsigned RunTimeLang) {
432  // TAG_structure_type is encoded in DICompositeType format.
433   Value *Elts[] = {
434     GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
435     getNonCompileUnitScope(Context),
436     MDString::get(VMContext, Name),
437     File,
438     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
439     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
440     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
441     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
442     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
443     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
444     Elements,
445     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
446     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
447   };
448   return DIType(MDNode::get(VMContext, Elts));
449 }
450 
451 /// createUnionType - Create debugging information entry for an union.
createUnionType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DIArray Elements,unsigned RunTimeLang)452 DIType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
453                                   DIFile File,
454                                   unsigned LineNumber, uint64_t SizeInBits,
455                                   uint64_t AlignInBits, unsigned Flags,
456                                   DIArray Elements, unsigned RunTimeLang) {
457   // TAG_union_type is encoded in DICompositeType format.
458   Value *Elts[] = {
459     GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
460     getNonCompileUnitScope(Scope),
461     MDString::get(VMContext, Name),
462     File,
463     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
464     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
465     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
466     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
467     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
468     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
469     Elements,
470     ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
471     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
472   };
473   return DIType(MDNode::get(VMContext, Elts));
474 }
475 
476 /// createSubroutineType - Create subroutine type.
createSubroutineType(DIFile File,DIArray ParameterTypes)477 DIType DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
478   // TAG_subroutine_type is encoded in DICompositeType format.
479   Value *Elts[] = {
480     GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
481     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
482     MDString::get(VMContext, ""),
483     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
484     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
485     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
486     ConstantInt::get(Type::getInt64Ty(VMContext), 0),
487     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
488     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
489     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
490     ParameterTypes,
491     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
492     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
493   };
494   return DIType(MDNode::get(VMContext, Elts));
495 }
496 
497 /// createEnumerationType - Create debugging information entry for an
498 /// enumeration.
createEnumerationType(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,DIArray Elements)499 DIType DIBuilder::createEnumerationType(DIDescriptor Scope, StringRef Name,
500                                         DIFile File, unsigned LineNumber,
501                                         uint64_t SizeInBits,
502                                         uint64_t AlignInBits,
503 					DIArray Elements) {
504   // TAG_enumeration_type is encoded in DICompositeType format.
505   Value *Elts[] = {
506     GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
507     getNonCompileUnitScope(Scope),
508     MDString::get(VMContext, Name),
509     File,
510     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
511     ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
512     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
513     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
514     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
515     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
516     Elements,
517     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
518     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
519   };
520   MDNode *Node = MDNode::get(VMContext, Elts);
521   AllEnumTypes.push_back(Node);
522   return DIType(Node);
523 }
524 
525 /// createArrayType - Create debugging information entry for an array.
createArrayType(uint64_t Size,uint64_t AlignInBits,DIType Ty,DIArray Subscripts)526 DIType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
527                                   DIType Ty, DIArray Subscripts) {
528   // TAG_array_type is encoded in DICompositeType format.
529   Value *Elts[] = {
530     GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
531     NULL, //TheCU,
532     MDString::get(VMContext, ""),
533     NULL, //TheCU,
534     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
535     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
536     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
537     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
538     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
539     Ty,
540     Subscripts,
541     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
542     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
543   };
544   return DIType(MDNode::get(VMContext, Elts));
545 }
546 
547 /// createVectorType - Create debugging information entry for a vector.
createVectorType(uint64_t Size,uint64_t AlignInBits,DIType Ty,DIArray Subscripts)548 DIType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
549                                    DIType Ty, DIArray Subscripts) {
550   // TAG_vector_type is encoded in DICompositeType format.
551   Value *Elts[] = {
552     GetTagConstant(VMContext, dwarf::DW_TAG_vector_type),
553     NULL, //TheCU,
554     MDString::get(VMContext, ""),
555     NULL, //TheCU,
556     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
557     ConstantInt::get(Type::getInt64Ty(VMContext), Size),
558     ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
559     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
560     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
561     Ty,
562     Subscripts,
563     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
564     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
565   };
566   return DIType(MDNode::get(VMContext, Elts));
567 }
568 
569 /// createArtificialType - Create a new DIType with "artificial" flag set.
createArtificialType(DIType Ty)570 DIType DIBuilder::createArtificialType(DIType Ty) {
571   if (Ty.isArtificial())
572     return Ty;
573 
574   SmallVector<Value *, 9> Elts;
575   MDNode *N = Ty;
576   assert (N && "Unexpected input DIType!");
577   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
578     if (Value *V = N->getOperand(i))
579       Elts.push_back(V);
580     else
581       Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
582   }
583 
584   unsigned CurFlags = Ty.getFlags();
585   CurFlags = CurFlags | DIType::FlagArtificial;
586 
587   // Flags are stored at this slot.
588   Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
589 
590   return DIType(MDNode::get(VMContext, Elts));
591 }
592 
593 /// retainType - Retain DIType in a module even if it is not referenced
594 /// through debug info anchors.
retainType(DIType T)595 void DIBuilder::retainType(DIType T) {
596   AllRetainTypes.push_back(T);
597 }
598 
599 /// createUnspecifiedParameter - Create unspeicified type descriptor
600 /// for the subroutine type.
createUnspecifiedParameter()601 DIDescriptor DIBuilder::createUnspecifiedParameter() {
602   Value *Elts[] = {
603     GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
604   };
605   return DIDescriptor(MDNode::get(VMContext, Elts));
606 }
607 
608 /// createTemporaryType - Create a temporary forward-declared type.
createTemporaryType()609 DIType DIBuilder::createTemporaryType() {
610   // Give the temporary MDNode a tag. It doesn't matter what tag we
611   // use here as long as DIType accepts it.
612   Value *Elts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
613   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
614   return DIType(Node);
615 }
616 
617 /// createTemporaryType - Create a temporary forward-declared type.
createTemporaryType(DIFile F)618 DIType DIBuilder::createTemporaryType(DIFile F) {
619   // Give the temporary MDNode a tag. It doesn't matter what tag we
620   // use here as long as DIType accepts it.
621   Value *Elts[] = {
622     GetTagConstant(VMContext, DW_TAG_base_type),
623     TheCU,
624     NULL,
625     F
626   };
627   MDNode *Node = MDNode::getTemporary(VMContext, Elts);
628   return DIType(Node);
629 }
630 
631 /// getOrCreateArray - Get a DIArray, create one if required.
getOrCreateArray(ArrayRef<Value * > Elements)632 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
633   if (Elements.empty()) {
634     Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext));
635     return DIArray(MDNode::get(VMContext, Null));
636   }
637   return DIArray(MDNode::get(VMContext, Elements));
638 }
639 
640 /// getOrCreateSubrange - Create a descriptor for a value range.  This
641 /// implicitly uniques the values returned.
getOrCreateSubrange(int64_t Lo,int64_t Hi)642 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Hi) {
643   Value *Elts[] = {
644     GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
645     ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
646     ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
647   };
648 
649   return DISubrange(MDNode::get(VMContext, Elts));
650 }
651 
652 /// createGlobalVariable - Create a new descriptor for the specified global.
653 DIGlobalVariable DIBuilder::
createGlobalVariable(StringRef Name,DIFile F,unsigned LineNumber,DIType Ty,bool isLocalToUnit,llvm::Value * Val)654 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
655                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
656   Value *Elts[] = {
657     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
658     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
659     NULL, // TheCU,
660     MDString::get(VMContext, Name),
661     MDString::get(VMContext, Name),
662     MDString::get(VMContext, Name),
663     F,
664     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
665     Ty,
666     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
667     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
668     Val
669   };
670   MDNode *Node = MDNode::get(VMContext, Elts);
671   AllGVs.push_back(Node);
672   return DIGlobalVariable(Node);
673 }
674 
675 /// createStaticVariable - Create a new descriptor for the specified static
676 /// variable.
677 DIGlobalVariable DIBuilder::
createStaticVariable(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile F,unsigned LineNumber,DIType Ty,bool isLocalToUnit,llvm::Value * Val)678 createStaticVariable(DIDescriptor Context, StringRef Name,
679                      StringRef LinkageName, DIFile F, unsigned LineNumber,
680                      DIType Ty, bool isLocalToUnit, llvm::Value *Val) {
681   Value *Elts[] = {
682     GetTagConstant(VMContext, dwarf::DW_TAG_variable),
683     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
684     getNonCompileUnitScope(Context),
685     MDString::get(VMContext, Name),
686     MDString::get(VMContext, Name),
687     MDString::get(VMContext, LinkageName),
688     F,
689     ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
690     Ty,
691     ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
692     ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
693     Val
694   };
695   MDNode *Node = MDNode::get(VMContext, Elts);
696   AllGVs.push_back(Node);
697   return DIGlobalVariable(Node);
698 }
699 
700 /// createVariable - Create a new descriptor for the specified variable.
createLocalVariable(unsigned Tag,DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNo,DIType Ty,bool AlwaysPreserve,unsigned Flags,unsigned ArgNo)701 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
702                                           StringRef Name, DIFile File,
703                                           unsigned LineNo, DIType Ty,
704                                           bool AlwaysPreserve, unsigned Flags,
705                                           unsigned ArgNo) {
706   Value *Elts[] = {
707     GetTagConstant(VMContext, Tag),
708     getNonCompileUnitScope(Scope),
709     MDString::get(VMContext, Name),
710     File,
711     ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
712     Ty,
713     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
714     Constant::getNullValue(Type::getInt32Ty(VMContext)),
715   };
716   MDNode *Node = MDNode::get(VMContext, Elts);
717   if (AlwaysPreserve) {
718     // The optimizer may remove local variable. If there is an interest
719     // to preserve variable info in such situation then stash it in a
720     // named mdnode.
721     DISubprogram Fn(getDISubprogram(Scope));
722     NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
723     FnLocals->addOperand(Node);
724   }
725   return DIVariable(Node);
726 }
727 
728 /// createComplexVariable - Create a new descriptor for the specified variable
729 /// which has a complex address expression for its address.
createComplexVariable(unsigned Tag,DIDescriptor Scope,StringRef Name,DIFile F,unsigned LineNo,DIType Ty,ArrayRef<Value * > Addr,unsigned ArgNo)730 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
731                                             StringRef Name, DIFile F,
732                                             unsigned LineNo,
733                                             DIType Ty, ArrayRef<Value *> Addr,
734                                             unsigned ArgNo) {
735   SmallVector<Value *, 15> Elts;
736   Elts.push_back(GetTagConstant(VMContext, Tag));
737   Elts.push_back(getNonCompileUnitScope(Scope)),
738   Elts.push_back(MDString::get(VMContext, Name));
739   Elts.push_back(F);
740   Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
741 				  (LineNo | (ArgNo << 24))));
742   Elts.push_back(Ty);
743   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
744   Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)));
745   Elts.append(Addr.begin(), Addr.end());
746 
747   return DIVariable(MDNode::get(VMContext, Elts));
748 }
749 
750 /// createFunction - Create a new descriptor for the specified function.
createFunction(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile File,unsigned LineNo,DIType Ty,bool isLocalToUnit,bool isDefinition,unsigned Flags,bool isOptimized,Function * Fn,MDNode * TParams,MDNode * Decl)751 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
752                                        StringRef Name,
753                                        StringRef LinkageName,
754                                        DIFile File, unsigned LineNo,
755                                        DIType Ty,
756                                        bool isLocalToUnit, bool isDefinition,
757                                        unsigned Flags, bool isOptimized,
758                                        Function *Fn,
759                                        MDNode *TParams,
760                                        MDNode *Decl) {
761   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
762   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
763   Value *TVElts[] = { Temp };
764   MDNode *THolder = MDNode::get(VMContext, TVElts);
765 
766   Value *Elts[] = {
767     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
768     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
769     getNonCompileUnitScope(Context),
770     MDString::get(VMContext, Name),
771     MDString::get(VMContext, Name),
772     MDString::get(VMContext, LinkageName),
773     File,
774     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
775     Ty,
776     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
777     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
778     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
779     ConstantInt::get(Type::getInt32Ty(VMContext), 0),
780     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
781     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
782     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
783     Fn,
784     TParams,
785     Decl,
786     THolder
787   };
788   MDNode *Node = MDNode::get(VMContext, Elts);
789 
790   // Create a named metadata so that we do not lose this mdnode.
791   AllSubprograms.push_back(Node);
792   return DISubprogram(Node);
793 }
794 
795 /// createMethod - Create a new descriptor for the specified C++ method.
createMethod(DIDescriptor Context,StringRef Name,StringRef LinkageName,DIFile F,unsigned LineNo,DIType Ty,bool isLocalToUnit,bool isDefinition,unsigned VK,unsigned VIndex,MDNode * VTableHolder,unsigned Flags,bool isOptimized,Function * Fn,MDNode * TParam)796 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
797                                      StringRef Name,
798                                      StringRef LinkageName,
799                                      DIFile F,
800                                      unsigned LineNo, DIType Ty,
801                                      bool isLocalToUnit,
802                                      bool isDefinition,
803                                      unsigned VK, unsigned VIndex,
804                                      MDNode *VTableHolder,
805                                      unsigned Flags,
806                                      bool isOptimized,
807                                      Function *Fn,
808                                      MDNode *TParam) {
809   Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
810   MDNode *Temp = MDNode::getTemporary(VMContext, TElts);
811   Value *TVElts[] = { Temp };
812   MDNode *THolder = MDNode::get(VMContext, TVElts);
813 
814   Value *Elts[] = {
815     GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
816     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
817     getNonCompileUnitScope(Context),
818     MDString::get(VMContext, Name),
819     MDString::get(VMContext, Name),
820     MDString::get(VMContext, LinkageName),
821     F,
822     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
823     Ty,
824     ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
825     ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
826     ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
827     ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
828     VTableHolder,
829     ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
830     ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
831     Fn,
832     TParam,
833     llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
834     THolder
835   };
836   MDNode *Node = MDNode::get(VMContext, Elts);
837   return DISubprogram(Node);
838 }
839 
840 /// createNameSpace - This creates new descriptor for a namespace
841 /// with the specified parent scope.
createNameSpace(DIDescriptor Scope,StringRef Name,DIFile File,unsigned LineNo)842 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
843                                        DIFile File, unsigned LineNo) {
844   Value *Elts[] = {
845     GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
846     getNonCompileUnitScope(Scope),
847     MDString::get(VMContext, Name),
848     File,
849     ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
850   };
851   return DINameSpace(MDNode::get(VMContext, Elts));
852 }
853 
854 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
855 /// an existing scope with a new filename.
createLexicalBlockFile(DIDescriptor Scope,DIFile File)856 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
857 						     DIFile File) {
858   Value *Elts[] = {
859     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
860     Scope,
861     File
862   };
863   return DILexicalBlockFile(MDNode::get(VMContext, Elts));
864 }
865 
createLexicalBlock(DIDescriptor Scope,DIFile File,unsigned Line,unsigned Col)866 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
867                                              unsigned Line, unsigned Col) {
868   // Defeat MDNode uniqing for lexical blocks by using unique id.
869   static unsigned int unique_id = 0;
870   Value *Elts[] = {
871     GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
872     getNonCompileUnitScope(Scope),
873     ConstantInt::get(Type::getInt32Ty(VMContext), Line),
874     ConstantInt::get(Type::getInt32Ty(VMContext), Col),
875     File,
876     ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
877   };
878   return DILexicalBlock(MDNode::get(VMContext, Elts));
879 }
880 
881 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
insertDeclare(Value * Storage,DIVariable VarInfo,Instruction * InsertBefore)882 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
883                                       Instruction *InsertBefore) {
884   assert(Storage && "no storage passed to dbg.declare");
885   assert(VarInfo.Verify() && "empty DIVariable passed to dbg.declare");
886   if (!DeclareFn)
887     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
888 
889   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
890   return CallInst::Create(DeclareFn, Args, "", InsertBefore);
891 }
892 
893 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
insertDeclare(Value * Storage,DIVariable VarInfo,BasicBlock * InsertAtEnd)894 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
895                                       BasicBlock *InsertAtEnd) {
896   assert(Storage && "no storage passed to dbg.declare");
897   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.declare");
898   if (!DeclareFn)
899     DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
900 
901   Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
902 
903   // If this block already has a terminator then insert this intrinsic
904   // before the terminator.
905   if (TerminatorInst *T = InsertAtEnd->getTerminator())
906     return CallInst::Create(DeclareFn, Args, "", T);
907   else
908     return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
909 }
910 
911 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DIVariable VarInfo,Instruction * InsertBefore)912 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
913                                                 DIVariable VarInfo,
914                                                 Instruction *InsertBefore) {
915   assert(V && "no value passed to dbg.value");
916   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
917   if (!ValueFn)
918     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
919 
920   Value *Args[] = { MDNode::get(V->getContext(), V),
921                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
922                     VarInfo };
923   return CallInst::Create(ValueFn, Args, "", InsertBefore);
924 }
925 
926 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DIVariable VarInfo,BasicBlock * InsertAtEnd)927 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
928                                                 DIVariable VarInfo,
929                                                 BasicBlock *InsertAtEnd) {
930   assert(V && "no value passed to dbg.value");
931   assert(VarInfo.Verify() && "invalid DIVariable passed to dbg.value");
932   if (!ValueFn)
933     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
934 
935   Value *Args[] = { MDNode::get(V->getContext(), V),
936                     ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
937                     VarInfo };
938   return CallInst::Create(ValueFn, Args, "", InsertAtEnd);
939 }
940