1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the DIBuilder.
12 //===----------------------------------------------------------------------===//
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"
24 using namespace llvm::dwarf;
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);
32 DIBuilder::DIBuilder(Module &m)
33 : M(m), VMContext(M.getContext()), TempEnumTypes(0),
34 TempRetainTypes(0), TempSubprograms(0), TempGVs(0), DeclareFn(0),
38 /// finalize - Construct any deferred debug info descriptors.
39 void DIBuilder::finalize() {
40 DIArray Enums = getOrCreateArray(AllEnumTypes);
41 DIType(TempEnumTypes).replaceAllUsesWith(Enums);
43 SmallVector<Value *, 16> RetainValues;
44 // Declarations and definitions of the same type may be retained. Some
45 // clients RAUW these pairs, leaving duplicates in the retained types
46 // list. Use a set to remove the duplicates while we transform the
47 // TrackingVHs back into Values.
48 SmallPtrSet<Value *, 16> RetainSet;
49 for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
50 if (RetainSet.insert(AllRetainTypes[I]))
51 RetainValues.push_back(AllRetainTypes[I]);
52 DIArray RetainTypes = getOrCreateArray(RetainValues);
53 DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes);
55 DIArray SPs = getOrCreateArray(AllSubprograms);
56 DIType(TempSubprograms).replaceAllUsesWith(SPs);
57 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) {
58 DISubprogram SP(SPs.getElement(i));
59 SmallVector<Value *, 4> Variables;
60 if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) {
61 for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii)
62 Variables.push_back(NMD->getOperand(ii));
63 NMD->eraseFromParent();
65 if (MDNode *Temp = SP.getVariablesNodes()) {
66 DIArray AV = getOrCreateArray(Variables);
67 DIType(Temp).replaceAllUsesWith(AV);
71 DIArray GVs = getOrCreateArray(AllGVs);
72 DIType(TempGVs).replaceAllUsesWith(GVs);
74 DIArray IMs = getOrCreateArray(AllImportedModules);
75 DIType(TempImportedModules).replaceAllUsesWith(IMs);
78 /// getNonCompileUnitScope - If N is compile unit return NULL otherwise return
80 static MDNode *getNonCompileUnitScope(MDNode *N) {
81 if (DIDescriptor(N).isCompileUnit())
86 static MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename,
87 StringRef Directory) {
88 assert(!Filename.empty() && "Unable to create file without name");
90 MDString::get(VMContext, Filename),
91 MDString::get(VMContext, Directory),
93 return MDNode::get(VMContext, Pair);
96 /// createCompileUnit - A CompileUnit provides an anchor for all debugging
97 /// information generated during this instance of compilation.
98 DICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename,
100 StringRef Producer, bool isOptimized,
101 StringRef Flags, unsigned RunTimeVer,
102 StringRef SplitName) {
103 assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) ||
104 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
105 "Invalid Language tag");
106 assert(!Filename.empty() &&
107 "Unable to create compile unit without filename");
108 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
109 TempEnumTypes = MDNode::getTemporary(VMContext, TElts);
111 TempRetainTypes = MDNode::getTemporary(VMContext, TElts);
113 TempSubprograms = MDNode::getTemporary(VMContext, TElts);
115 TempGVs = MDNode::getTemporary(VMContext, TElts);
117 TempImportedModules = MDNode::getTemporary(VMContext, TElts);
120 GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit),
121 createFilePathPair(VMContext, Filename, Directory),
122 ConstantInt::get(Type::getInt32Ty(VMContext), Lang),
123 MDString::get(VMContext, Producer),
124 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
125 MDString::get(VMContext, Flags),
126 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer),
132 MDString::get(VMContext, SplitName)
135 MDNode *CUNode = MDNode::get(VMContext, Elts);
137 // Create a named metadata so that it is easier to find cu in a module.
138 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
139 NMD->addOperand(CUNode);
141 return DICompileUnit(CUNode);
144 static DIImportedEntity
145 createImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS,
146 unsigned Line, StringRef Name,
147 SmallVectorImpl<Value *> &AllImportedModules) {
151 GetTagConstant(C, dwarf::DW_TAG_imported_module),
154 ConstantInt::get(Type::getInt32Ty(C), Line),
156 R = MDNode::get(C, Elts);
159 GetTagConstant(C, dwarf::DW_TAG_imported_module),
162 ConstantInt::get(Type::getInt32Ty(C), Line),
163 MDString::get(C, Name)
165 R = MDNode::get(C, Elts);
167 DIImportedEntity M(R);
168 assert(M.Verify() && "Imported module should be valid");
169 AllImportedModules.push_back(M);
173 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
174 DINameSpace NS, unsigned Line,
176 return ::createImportedModule(VMContext, Context, NS, Line, Name,
180 DIImportedEntity DIBuilder::createImportedModule(DIScope Context,
184 return ::createImportedModule(VMContext, Context, NS, Line, Name,
188 DIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context,
192 GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration),
195 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
197 DIImportedEntity M(MDNode::get(VMContext, Elts));
198 assert(M.Verify() && "Imported module should be valid");
199 AllImportedModules.push_back(M);
203 /// createFile - Create a file descriptor to hold debugging information
205 DIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) {
207 GetTagConstant(VMContext, dwarf::DW_TAG_file_type),
208 createFilePathPair(VMContext, Filename, Directory)
210 return DIFile(MDNode::get(VMContext, Elts));
213 /// createEnumerator - Create a single enumerator value.
214 DIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
215 assert(!Name.empty() && "Unable to create enumerator without name");
217 GetTagConstant(VMContext, dwarf::DW_TAG_enumerator),
218 MDString::get(VMContext, Name),
219 ConstantInt::get(Type::getInt64Ty(VMContext), Val)
221 return DIEnumerator(MDNode::get(VMContext, Elts));
224 /// \brief Create a DWARF unspecified type.
225 DIBasicType DIBuilder::createUnspecifiedType(StringRef Name) {
226 assert(!Name.empty() && "Unable to create type without name");
227 // Unspecified types are encoded in DIBasicType format. Line number, filename,
228 // size, alignment, offset and flags are always empty here.
230 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type),
233 MDString::get(VMContext, Name),
234 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
235 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
236 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
237 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
238 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
239 ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding
241 return DIBasicType(MDNode::get(VMContext, Elts));
244 /// \brief Create C++11 nullptr type.
245 DIBasicType DIBuilder::createNullPtrType() {
246 return createUnspecifiedType("decltype(nullptr)");
249 /// createBasicType - Create debugging information entry for a basic
250 /// type, e.g 'char'.
252 DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
253 uint64_t AlignInBits, unsigned Encoding) {
254 assert(!Name.empty() && "Unable to create type without name");
255 // Basic types are encoded in DIBasicType format. Line number, filename,
256 // offset and flags are always empty here.
258 GetTagConstant(VMContext, dwarf::DW_TAG_base_type),
259 NULL, // File/directory name
261 MDString::get(VMContext, Name),
262 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
263 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
264 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
265 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
266 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags;
267 ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
269 return DIBasicType(MDNode::get(VMContext, Elts));
272 /// createQualifiedType - Create debugging information entry for a qualified
273 /// type, e.g. 'const int'.
274 DIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) {
275 // Qualified types are encoded in DIDerivedType format.
277 GetTagConstant(VMContext, Tag),
280 MDString::get(VMContext, StringRef()), // Empty name.
281 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
282 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
283 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
284 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
285 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
288 return DIDerivedType(MDNode::get(VMContext, Elts));
291 /// createPointerType - Create debugging information entry for a pointer.
293 DIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits,
294 uint64_t AlignInBits, StringRef Name) {
295 // Pointer types are encoded in DIDerivedType format.
297 GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type),
300 MDString::get(VMContext, Name),
301 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
302 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
303 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
304 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
305 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
308 return DIDerivedType(MDNode::get(VMContext, Elts));
311 DIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy,
313 // Pointer types are encoded in DIDerivedType format.
315 GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type),
319 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
320 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
321 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
322 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
323 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
327 return DIDerivedType(MDNode::get(VMContext, Elts));
330 /// createReferenceType - Create debugging information entry for a reference
332 DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
333 assert(RTy.isType() && "Unable to create reference type");
334 // References are encoded in DIDerivedType format.
336 GetTagConstant(VMContext, Tag),
340 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
341 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
342 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
343 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
344 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
347 return DIDerivedType(MDNode::get(VMContext, Elts));
350 /// createTypedef - Create debugging information entry for a typedef.
351 DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
352 unsigned LineNo, DIDescriptor Context) {
353 // typedefs are encoded in DIDerivedType format.
354 assert(Ty.isType() && "Invalid typedef type!");
356 GetTagConstant(VMContext, dwarf::DW_TAG_typedef),
358 getNonCompileUnitScope(Context),
359 MDString::get(VMContext, Name),
360 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
361 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
362 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
363 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
364 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
367 return DIDerivedType(MDNode::get(VMContext, Elts));
370 /// createFriend - Create debugging information entry for a 'friend'.
371 DIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) {
372 // typedefs are encoded in DIDerivedType format.
373 assert(Ty.isType() && "Invalid type!");
374 assert(FriendTy.isType() && "Invalid friend type!");
376 GetTagConstant(VMContext, dwarf::DW_TAG_friend),
380 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
381 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
382 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
383 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
384 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
387 return DIDerivedType(MDNode::get(VMContext, Elts));
390 /// createInheritance - Create debugging information entry to establish
391 /// inheritance relationship between two types.
392 DIDerivedType DIBuilder::createInheritance(
393 DIType Ty, DIType BaseTy, uint64_t BaseOffset, unsigned Flags) {
394 assert(Ty.isType() && "Unable to create inheritance");
395 // TAG_inheritance is encoded in DIDerivedType format.
397 GetTagConstant(VMContext, dwarf::DW_TAG_inheritance),
401 ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line
402 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size
403 ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align
404 ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset),
405 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
408 return DIDerivedType(MDNode::get(VMContext, Elts));
411 /// createMemberType - Create debugging information entry for a member.
412 DIDerivedType DIBuilder::createMemberType(
413 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
414 uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
415 unsigned Flags, DIType Ty) {
416 // TAG_member is encoded in DIDerivedType format.
418 GetTagConstant(VMContext, dwarf::DW_TAG_member),
420 getNonCompileUnitScope(Scope),
421 MDString::get(VMContext, Name),
422 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
423 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
424 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
425 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
426 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
429 return DIDerivedType(MDNode::get(VMContext, Elts));
432 /// createStaticMemberType - Create debugging information entry for a
433 /// C++ static data member.
435 DIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name,
436 DIFile File, unsigned LineNumber,
437 DIType Ty, unsigned Flags,
439 // TAG_member is encoded in DIDerivedType format.
440 Flags |= DIDescriptor::FlagStaticMember;
442 GetTagConstant(VMContext, dwarf::DW_TAG_member),
444 getNonCompileUnitScope(Scope),
445 MDString::get(VMContext, Name),
446 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
447 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*SizeInBits*/),
448 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*AlignInBits*/),
449 ConstantInt::get(Type::getInt64Ty(VMContext), 0/*OffsetInBits*/),
450 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
454 return DIDerivedType(MDNode::get(VMContext, Elts));
457 /// createObjCIVar - Create debugging information entry for Objective-C
458 /// instance variable.
460 DIBuilder::createObjCIVar(StringRef Name,
461 DIFile File, unsigned LineNumber,
462 uint64_t SizeInBits, uint64_t AlignInBits,
463 uint64_t OffsetInBits, unsigned Flags,
464 DIType Ty, StringRef PropertyName,
465 StringRef GetterName, StringRef SetterName,
466 unsigned PropertyAttributes) {
467 // TAG_member is encoded in DIDerivedType format.
469 GetTagConstant(VMContext, dwarf::DW_TAG_member),
471 getNonCompileUnitScope(File),
472 MDString::get(VMContext, Name),
473 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
474 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
475 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
476 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
477 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
479 MDString::get(VMContext, PropertyName),
480 MDString::get(VMContext, GetterName),
481 MDString::get(VMContext, SetterName),
482 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes)
484 return DIDerivedType(MDNode::get(VMContext, Elts));
487 /// createObjCIVar - Create debugging information entry for Objective-C
488 /// instance variable.
490 DIBuilder::createObjCIVar(StringRef Name,
491 DIFile File, unsigned LineNumber,
492 uint64_t SizeInBits, uint64_t AlignInBits,
493 uint64_t OffsetInBits, unsigned Flags,
494 DIType Ty, MDNode *PropertyNode) {
495 // TAG_member is encoded in DIDerivedType format.
497 GetTagConstant(VMContext, dwarf::DW_TAG_member),
499 getNonCompileUnitScope(File),
500 MDString::get(VMContext, Name),
501 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
502 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
503 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
504 ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
505 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
509 return DIDerivedType(MDNode::get(VMContext, Elts));
512 /// createObjCProperty - Create debugging information entry for Objective-C
514 DIObjCProperty DIBuilder::createObjCProperty(StringRef Name,
515 DIFile File, unsigned LineNumber,
516 StringRef GetterName,
517 StringRef SetterName,
518 unsigned PropertyAttributes,
521 GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property),
522 MDString::get(VMContext, Name),
524 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
525 MDString::get(VMContext, GetterName),
526 MDString::get(VMContext, SetterName),
527 ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes),
530 return DIObjCProperty(MDNode::get(VMContext, Elts));
533 /// createTemplateTypeParameter - Create debugging information for template
535 DITemplateTypeParameter
536 DIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name,
537 DIType Ty, MDNode *File, unsigned LineNo,
540 GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter),
541 getNonCompileUnitScope(Context),
542 MDString::get(VMContext, Name),
545 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
546 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
548 return DITemplateTypeParameter(MDNode::get(VMContext, Elts));
551 DITemplateValueParameter
552 DIBuilder::createTemplateValueParameter(unsigned Tag, DIDescriptor Context,
553 StringRef Name, DIType Ty,
554 Value *Val, MDNode *File,
558 GetTagConstant(VMContext, Tag),
559 getNonCompileUnitScope(Context),
560 MDString::get(VMContext, Name),
564 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
565 ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo)
567 return DITemplateValueParameter(MDNode::get(VMContext, Elts));
570 /// createTemplateValueParameter - Create debugging information for template
572 DITemplateValueParameter
573 DIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name,
574 DIType Ty, Value *Val,
575 MDNode *File, unsigned LineNo,
577 return createTemplateValueParameter(dwarf::DW_TAG_template_value_parameter,
578 Context, Name, Ty, Val, File, LineNo,
582 DITemplateValueParameter
583 DIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name,
584 DIType Ty, StringRef Val,
585 MDNode *File, unsigned LineNo,
587 return createTemplateValueParameter(
588 dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
589 MDString::get(VMContext, Val), File, LineNo, ColumnNo);
592 DITemplateValueParameter
593 DIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name,
594 DIType Ty, DIArray Val,
595 MDNode *File, unsigned LineNo,
597 return createTemplateValueParameter(dwarf::DW_TAG_GNU_template_parameter_pack,
598 Context, Name, Ty, Val, File, LineNo,
602 /// createClassType - Create debugging information entry for a class.
603 DICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name,
604 DIFile File, unsigned LineNumber,
606 uint64_t AlignInBits,
607 uint64_t OffsetInBits,
608 unsigned Flags, DIType DerivedFrom,
610 MDNode *VTableHolder,
611 MDNode *TemplateParams,
612 StringRef UniqueIdentifier) {
613 assert((!Context || Context.isScope() || Context.isType()) &&
614 "createClassType should be called with a valid Context");
615 // TAG_class_type is encoded in DICompositeType format.
617 GetTagConstant(VMContext, dwarf::DW_TAG_class_type),
619 getNonCompileUnitScope(Context),
620 MDString::get(VMContext, Name),
621 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
622 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
623 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
624 ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits),
625 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
628 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
631 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
633 DICompositeType R(MDNode::get(VMContext, Elts));
634 assert(R.isCompositeType() &&
635 "createClassType should return a DICompositeType");
636 if (!UniqueIdentifier.empty())
641 /// createStructType - Create debugging information entry for a struct.
642 DICompositeType DIBuilder::createStructType(DIDescriptor Context,
643 StringRef Name, DIFile File,
646 uint64_t AlignInBits,
647 unsigned Flags, DIType DerivedFrom,
649 unsigned RunTimeLang,
650 MDNode *VTableHolder,
651 StringRef UniqueIdentifier) {
652 // TAG_structure_type is encoded in DICompositeType format.
654 GetTagConstant(VMContext, dwarf::DW_TAG_structure_type),
656 getNonCompileUnitScope(Context),
657 MDString::get(VMContext, Name),
658 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
659 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
660 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
661 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
662 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
665 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
668 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
670 DICompositeType R(MDNode::get(VMContext, Elts));
671 assert(R.isCompositeType() &&
672 "createStructType should return a DICompositeType");
673 if (!UniqueIdentifier.empty())
678 /// createUnionType - Create debugging information entry for an union.
679 DICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name,
680 DIFile File, unsigned LineNumber,
682 uint64_t AlignInBits, unsigned Flags,
684 unsigned RunTimeLang,
685 StringRef UniqueIdentifier) {
686 // TAG_union_type is encoded in DICompositeType format.
688 GetTagConstant(VMContext, dwarf::DW_TAG_union_type),
690 getNonCompileUnitScope(Scope),
691 MDString::get(VMContext, Name),
692 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
693 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
694 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
695 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
696 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
699 ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang),
702 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
704 DICompositeType R(MDNode::get(VMContext, Elts));
705 if (!UniqueIdentifier.empty())
710 /// createSubroutineType - Create subroutine type.
712 DIBuilder::createSubroutineType(DIFile File, DIArray ParameterTypes) {
713 // TAG_subroutine_type is encoded in DICompositeType format.
715 GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type),
716 Constant::getNullValue(Type::getInt32Ty(VMContext)),
717 Constant::getNullValue(Type::getInt32Ty(VMContext)),
718 MDString::get(VMContext, ""),
719 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
720 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
721 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
722 ConstantInt::get(Type::getInt64Ty(VMContext), 0),
723 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
726 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
729 NULL // Type Identifer
731 return DICompositeType(MDNode::get(VMContext, Elts));
734 /// createEnumerationType - Create debugging information entry for an
736 DICompositeType DIBuilder::createEnumerationType(
737 DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber,
738 uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements,
739 DIType UnderlyingType, StringRef UniqueIdentifier) {
740 // TAG_enumeration_type is encoded in DICompositeType format.
742 GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type),
744 getNonCompileUnitScope(Scope),
745 MDString::get(VMContext, Name),
746 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
747 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
748 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
749 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
750 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
753 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
756 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
758 MDNode *Node = MDNode::get(VMContext, Elts);
759 AllEnumTypes.push_back(Node);
760 if (!UniqueIdentifier.empty())
762 return DICompositeType(Node);
765 /// createArrayType - Create debugging information entry for an array.
766 DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
767 DIType Ty, DIArray Subscripts) {
768 // TAG_array_type is encoded in DICompositeType format.
770 GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
771 NULL, // Filename/Directory,
773 MDString::get(VMContext, ""),
774 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
775 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
776 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
777 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
778 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
781 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
784 NULL // Type Identifer
786 return DICompositeType(MDNode::get(VMContext, Elts));
789 /// createVectorType - Create debugging information entry for a vector.
790 DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
791 DIType Ty, DIArray Subscripts) {
792 // A vector is an array type with the FlagVector flag applied.
794 GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
795 NULL, // Filename/Directory,
797 MDString::get(VMContext, ""),
798 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
799 ConstantInt::get(Type::getInt64Ty(VMContext), Size),
800 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
801 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
802 ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector),
805 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
808 NULL // Type Identifer
810 return DICompositeType(MDNode::get(VMContext, Elts));
813 /// createArtificialType - Create a new DIType with "artificial" flag set.
814 DIType DIBuilder::createArtificialType(DIType Ty) {
815 if (Ty.isArtificial())
818 SmallVector<Value *, 9> Elts;
820 assert (N && "Unexpected input DIType!");
821 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
822 if (Value *V = N->getOperand(i))
825 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
828 unsigned CurFlags = Ty.getFlags();
829 CurFlags = CurFlags | DIType::FlagArtificial;
831 // Flags are stored at this slot.
832 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
834 return DIType(MDNode::get(VMContext, Elts));
837 /// createObjectPointerType - Create a new type with both the object pointer
838 /// and artificial flags set.
839 DIType DIBuilder::createObjectPointerType(DIType Ty) {
840 if (Ty.isObjectPointer())
843 SmallVector<Value *, 9> Elts;
845 assert (N && "Unexpected input DIType!");
846 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
847 if (Value *V = N->getOperand(i))
850 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
853 unsigned CurFlags = Ty.getFlags();
854 CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial);
856 // Flags are stored at this slot.
857 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
859 return DIType(MDNode::get(VMContext, Elts));
862 /// retainType - Retain DIType in a module even if it is not referenced
863 /// through debug info anchors.
864 void DIBuilder::retainType(DIType T) {
865 AllRetainTypes.push_back(TrackingVH<MDNode>(T));
868 /// createUnspecifiedParameter - Create unspeicified type descriptor
869 /// for the subroutine type.
870 DIDescriptor DIBuilder::createUnspecifiedParameter() {
872 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
874 return DIDescriptor(MDNode::get(VMContext, Elts));
877 /// createForwardDecl - Create a temporary forward-declared type that
878 /// can be RAUW'd if the full type is seen.
879 DICompositeType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name,
880 DIDescriptor Scope, DIFile F,
881 unsigned Line, unsigned RuntimeLang,
883 uint64_t AlignInBits,
884 StringRef UniqueIdentifier) {
885 // Create a temporary MDNode.
887 GetTagConstant(VMContext, Tag),
889 getNonCompileUnitScope(Scope),
890 MDString::get(VMContext, Name),
891 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
892 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
893 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
894 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
895 ConstantInt::get(Type::getInt32Ty(VMContext),
896 DIDescriptor::FlagFwdDecl),
899 ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang),
901 NULL, //TemplateParams
902 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier)
904 MDNode *Node = MDNode::getTemporary(VMContext, Elts);
905 DICompositeType RetTy(Node);
906 assert(RetTy.isCompositeType() &&
907 "createForwardDecl result should be a DIType");
908 if (!UniqueIdentifier.empty())
913 /// getOrCreateArray - Get a DIArray, create one if required.
914 DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) {
915 if (Elements.empty()) {
916 Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext));
917 return DIArray(MDNode::get(VMContext, Null));
919 return DIArray(MDNode::get(VMContext, Elements));
922 /// getOrCreateSubrange - Create a descriptor for a value range. This
923 /// implicitly uniques the values returned.
924 DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
926 GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type),
927 ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
928 ConstantInt::get(Type::getInt64Ty(VMContext), Count)
931 return DISubrange(MDNode::get(VMContext, Elts));
934 /// \brief Create a new descriptor for the specified global.
935 DIGlobalVariable DIBuilder::
936 createGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F,
937 unsigned LineNumber, DIType Ty, bool isLocalToUnit,
940 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
941 Constant::getNullValue(Type::getInt32Ty(VMContext)),
943 MDString::get(VMContext, Name),
944 MDString::get(VMContext, Name),
945 MDString::get(VMContext, LinkageName),
947 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
949 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
950 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
954 MDNode *Node = MDNode::get(VMContext, Elts);
955 AllGVs.push_back(Node);
956 return DIGlobalVariable(Node);
959 /// \brief Create a new descriptor for the specified global.
960 DIGlobalVariable DIBuilder::
961 createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber,
962 DIType Ty, bool isLocalToUnit, Value *Val) {
963 return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit,
967 /// createStaticVariable - Create a new descriptor for the specified static
969 DIGlobalVariable DIBuilder::
970 createStaticVariable(DIDescriptor Context, StringRef Name,
971 StringRef LinkageName, DIFile F, unsigned LineNumber,
972 DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) {
974 GetTagConstant(VMContext, dwarf::DW_TAG_variable),
975 Constant::getNullValue(Type::getInt32Ty(VMContext)),
976 getNonCompileUnitScope(Context),
977 MDString::get(VMContext, Name),
978 MDString::get(VMContext, Name),
979 MDString::get(VMContext, LinkageName),
981 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
983 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit),
984 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/
988 MDNode *Node = MDNode::get(VMContext, Elts);
989 AllGVs.push_back(Node);
990 return DIGlobalVariable(Node);
993 /// createVariable - Create a new descriptor for the specified variable.
994 DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope,
995 StringRef Name, DIFile File,
996 unsigned LineNo, DIType Ty,
997 bool AlwaysPreserve, unsigned Flags,
999 DIDescriptor Context(getNonCompileUnitScope(Scope));
1000 assert((!Context || Context.isScope()) &&
1001 "createLocalVariable should be called with a valid Context");
1002 assert(Ty.isType() &&
1003 "createLocalVariable should be called with a valid type");
1005 GetTagConstant(VMContext, Tag),
1006 getNonCompileUnitScope(Scope),
1007 MDString::get(VMContext, Name),
1009 ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))),
1011 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1012 Constant::getNullValue(Type::getInt32Ty(VMContext))
1014 MDNode *Node = MDNode::get(VMContext, Elts);
1015 if (AlwaysPreserve) {
1016 // The optimizer may remove local variable. If there is an interest
1017 // to preserve variable info in such situation then stash it in a
1019 DISubprogram Fn(getDISubprogram(Scope));
1020 NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn);
1021 FnLocals->addOperand(Node);
1023 DIVariable RetVar(Node);
1024 assert(RetVar.isVariable() &&
1025 "createLocalVariable should return a valid DIVariable");
1029 /// createComplexVariable - Create a new descriptor for the specified variable
1030 /// which has a complex address expression for its address.
1031 DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope,
1032 StringRef Name, DIFile F,
1034 DIType Ty, ArrayRef<Value *> Addr,
1036 SmallVector<Value *, 15> Elts;
1037 Elts.push_back(GetTagConstant(VMContext, Tag));
1038 Elts.push_back(getNonCompileUnitScope(Scope)),
1039 Elts.push_back(MDString::get(VMContext, Name));
1041 Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext),
1042 (LineNo | (ArgNo << 24))));
1044 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1045 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
1046 Elts.append(Addr.begin(), Addr.end());
1048 return DIVariable(MDNode::get(VMContext, Elts));
1051 /// createFunction - Create a new descriptor for the specified function.
1052 DISubprogram DIBuilder::createFunction(DIDescriptor Context,
1054 StringRef LinkageName,
1055 DIFile File, unsigned LineNo,
1057 bool isLocalToUnit, bool isDefinition,
1059 unsigned Flags, bool isOptimized,
1063 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1064 "function types should be subroutines");
1065 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1067 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1069 getNonCompileUnitScope(Context),
1070 MDString::get(VMContext, Name),
1071 MDString::get(VMContext, Name),
1072 MDString::get(VMContext, LinkageName),
1073 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1075 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1076 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1077 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1078 ConstantInt::get(Type::getInt32Ty(VMContext), 0),
1080 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1081 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1085 MDNode::getTemporary(VMContext, TElts),
1086 ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
1088 MDNode *Node = MDNode::get(VMContext, Elts);
1090 // Create a named metadata so that we do not lose this mdnode.
1092 AllSubprograms.push_back(Node);
1093 DISubprogram S(Node);
1094 assert(S.isSubprogram() && "createFunction should return a valid DISubprogram");
1098 /// createMethod - Create a new descriptor for the specified C++ method.
1099 DISubprogram DIBuilder::createMethod(DIDescriptor Context,
1101 StringRef LinkageName,
1103 unsigned LineNo, DICompositeType Ty,
1106 unsigned VK, unsigned VIndex,
1107 MDNode *VTableHolder,
1112 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type &&
1113 "function types should be subroutines");
1114 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) };
1116 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram),
1118 getNonCompileUnitScope(Context),
1119 MDString::get(VMContext, Name),
1120 MDString::get(VMContext, Name),
1121 MDString::get(VMContext, LinkageName),
1122 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
1124 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
1125 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
1126 ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
1127 ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
1129 ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
1130 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
1133 Constant::getNullValue(Type::getInt32Ty(VMContext)),
1134 MDNode::getTemporary(VMContext, TElts),
1135 // FIXME: Do we want to use different scope/lines?
1136 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1138 MDNode *Node = MDNode::get(VMContext, Elts);
1140 AllSubprograms.push_back(Node);
1141 DISubprogram S(Node);
1142 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram");
1146 /// createNameSpace - This creates new descriptor for a namespace
1147 /// with the specified parent scope.
1148 DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name,
1149 DIFile File, unsigned LineNo) {
1151 GetTagConstant(VMContext, dwarf::DW_TAG_namespace),
1153 getNonCompileUnitScope(Scope),
1154 MDString::get(VMContext, Name),
1155 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
1157 DINameSpace R(MDNode::get(VMContext, Elts));
1158 assert(R.Verify() &&
1159 "createNameSpace should return a verifiable DINameSpace");
1163 /// createLexicalBlockFile - This creates a new MDNode that encapsulates
1164 /// an existing scope with a new filename.
1165 DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope,
1168 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1172 DILexicalBlockFile R(MDNode::get(VMContext, Elts));
1175 "createLexicalBlockFile should return a verifiable DILexicalBlockFile");
1179 DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File,
1180 unsigned Line, unsigned Col) {
1181 // Defeat MDNode uniquing for lexical blocks by using unique id.
1182 static unsigned int unique_id = 0;
1184 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block),
1186 getNonCompileUnitScope(Scope),
1187 ConstantInt::get(Type::getInt32Ty(VMContext), Line),
1188 ConstantInt::get(Type::getInt32Ty(VMContext), Col),
1189 ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
1191 DILexicalBlock R(MDNode::get(VMContext, Elts));
1192 assert(R.Verify() &&
1193 "createLexicalBlock should return a verifiable DILexicalBlock");
1197 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1198 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1199 Instruction *InsertBefore) {
1200 assert(Storage && "no storage passed to dbg.declare");
1201 assert(VarInfo.isVariable() &&
1202 "empty or invalid DIVariable passed to dbg.declare");
1204 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1206 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1207 return CallInst::Create(DeclareFn, Args, "", InsertBefore);
1210 /// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
1211 Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo,
1212 BasicBlock *InsertAtEnd) {
1213 assert(Storage && "no storage passed to dbg.declare");
1214 assert(VarInfo.isVariable() &&
1215 "empty or invalid DIVariable passed to dbg.declare");
1217 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
1219 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo };
1221 // If this block already has a terminator then insert this intrinsic
1222 // before the terminator.
1223 if (TerminatorInst *T = InsertAtEnd->getTerminator())
1224 return CallInst::Create(DeclareFn, Args, "", T);
1226 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd);
1229 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1230 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1232 Instruction *InsertBefore) {
1233 assert(V && "no value passed to dbg.value");
1234 assert(VarInfo.isVariable() &&
1235 "empty or invalid DIVariable passed to dbg.value");
1237 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1239 Value *Args[] = { MDNode::get(V->getContext(), V),
1240 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1242 return CallInst::Create(ValueFn, Args, "", InsertBefore);
1245 /// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
1246 Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
1248 BasicBlock *InsertAtEnd) {
1249 assert(V && "no value passed to dbg.value");
1250 assert(VarInfo.isVariable() &&
1251 "empty or invalid DIVariable passed to dbg.value");
1253 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
1255 Value *Args[] = { MDNode::get(V->getContext(), V),
1256 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
1258 return CallInst::Create(ValueFn, Args, "", InsertAtEnd);