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