1249259Sdim//===--- DIBuilder.cpp - Debug Information Builder ------------------------===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim// 10249259Sdim// This file implements the DIBuilder. 11249259Sdim// 12249259Sdim//===----------------------------------------------------------------------===// 13249259Sdim 14249259Sdim#include "llvm/DIBuilder.h" 15249259Sdim#include "llvm/ADT/STLExtras.h" 16249259Sdim#include "llvm/DebugInfo.h" 17249259Sdim#include "llvm/IR/Constants.h" 18249259Sdim#include "llvm/IR/IntrinsicInst.h" 19249259Sdim#include "llvm/IR/Module.h" 20249259Sdim#include "llvm/Support/Debug.h" 21249259Sdim#include "llvm/Support/Dwarf.h" 22249259Sdim 23249259Sdimusing namespace llvm; 24249259Sdimusing namespace llvm::dwarf; 25249259Sdim 26249259Sdimstatic Constant *GetTagConstant(LLVMContext &VMContext, unsigned Tag) { 27249259Sdim assert((Tag & LLVMDebugVersionMask) == 0 && 28249259Sdim "Tag too large for debug encoding!"); 29249259Sdim return ConstantInt::get(Type::getInt32Ty(VMContext), Tag | LLVMDebugVersion); 30249259Sdim} 31249259Sdim 32249259SdimDIBuilder::DIBuilder(Module &m) 33263509Sdim : M(m), VMContext(M.getContext()), TempEnumTypes(0), TempRetainTypes(0), 34263509Sdim TempSubprograms(0), TempGVs(0), DeclareFn(0), ValueFn(0) {} 35249259Sdim 36249259Sdim/// finalize - Construct any deferred debug info descriptors. 37249259Sdimvoid DIBuilder::finalize() { 38249259Sdim DIArray Enums = getOrCreateArray(AllEnumTypes); 39249259Sdim DIType(TempEnumTypes).replaceAllUsesWith(Enums); 40249259Sdim 41263509Sdim SmallVector<Value *, 16> RetainValues; 42263509Sdim // Declarations and definitions of the same type may be retained. Some 43263509Sdim // clients RAUW these pairs, leaving duplicates in the retained types 44263509Sdim // list. Use a set to remove the duplicates while we transform the 45263509Sdim // TrackingVHs back into Values. 46263509Sdim SmallPtrSet<Value *, 16> RetainSet; 47263509Sdim for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++) 48263509Sdim if (RetainSet.insert(AllRetainTypes[I])) 49263509Sdim RetainValues.push_back(AllRetainTypes[I]); 50263509Sdim DIArray RetainTypes = getOrCreateArray(RetainValues); 51249259Sdim DIType(TempRetainTypes).replaceAllUsesWith(RetainTypes); 52249259Sdim 53249259Sdim DIArray SPs = getOrCreateArray(AllSubprograms); 54249259Sdim DIType(TempSubprograms).replaceAllUsesWith(SPs); 55249259Sdim for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { 56249259Sdim DISubprogram SP(SPs.getElement(i)); 57249259Sdim SmallVector<Value *, 4> Variables; 58249259Sdim if (NamedMDNode *NMD = getFnSpecificMDNode(M, SP)) { 59249259Sdim for (unsigned ii = 0, ee = NMD->getNumOperands(); ii != ee; ++ii) 60249259Sdim Variables.push_back(NMD->getOperand(ii)); 61249259Sdim NMD->eraseFromParent(); 62249259Sdim } 63249259Sdim if (MDNode *Temp = SP.getVariablesNodes()) { 64249259Sdim DIArray AV = getOrCreateArray(Variables); 65249259Sdim DIType(Temp).replaceAllUsesWith(AV); 66249259Sdim } 67249259Sdim } 68249259Sdim 69249259Sdim DIArray GVs = getOrCreateArray(AllGVs); 70249259Sdim DIType(TempGVs).replaceAllUsesWith(GVs); 71252723Sdim 72252723Sdim DIArray IMs = getOrCreateArray(AllImportedModules); 73252723Sdim DIType(TempImportedModules).replaceAllUsesWith(IMs); 74249259Sdim} 75249259Sdim 76249259Sdim/// getNonCompileUnitScope - If N is compile unit return NULL otherwise return 77249259Sdim/// N. 78249259Sdimstatic MDNode *getNonCompileUnitScope(MDNode *N) { 79249259Sdim if (DIDescriptor(N).isCompileUnit()) 80249259Sdim return NULL; 81249259Sdim return N; 82249259Sdim} 83249259Sdim 84249259Sdimstatic MDNode *createFilePathPair(LLVMContext &VMContext, StringRef Filename, 85249259Sdim StringRef Directory) { 86249259Sdim assert(!Filename.empty() && "Unable to create file without name"); 87249259Sdim Value *Pair[] = { 88249259Sdim MDString::get(VMContext, Filename), 89263509Sdim MDString::get(VMContext, Directory) 90249259Sdim }; 91249259Sdim return MDNode::get(VMContext, Pair); 92249259Sdim} 93249259Sdim 94249259Sdim/// createCompileUnit - A CompileUnit provides an anchor for all debugging 95249259Sdim/// information generated during this instance of compilation. 96263509SdimDICompileUnit DIBuilder::createCompileUnit(unsigned Lang, StringRef Filename, 97263509Sdim StringRef Directory, 98263509Sdim StringRef Producer, bool isOptimized, 99263509Sdim StringRef Flags, unsigned RunTimeVer, 100263509Sdim StringRef SplitName) { 101249259Sdim assert(((Lang <= dwarf::DW_LANG_Python && Lang >= dwarf::DW_LANG_C89) || 102249259Sdim (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 103249259Sdim "Invalid Language tag"); 104249259Sdim assert(!Filename.empty() && 105249259Sdim "Unable to create compile unit without filename"); 106249259Sdim Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 107249259Sdim TempEnumTypes = MDNode::getTemporary(VMContext, TElts); 108249259Sdim 109249259Sdim TempRetainTypes = MDNode::getTemporary(VMContext, TElts); 110249259Sdim 111249259Sdim TempSubprograms = MDNode::getTemporary(VMContext, TElts); 112249259Sdim 113249259Sdim TempGVs = MDNode::getTemporary(VMContext, TElts); 114249259Sdim 115252723Sdim TempImportedModules = MDNode::getTemporary(VMContext, TElts); 116252723Sdim 117249259Sdim Value *Elts[] = { 118249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_compile_unit), 119249259Sdim createFilePathPair(VMContext, Filename, Directory), 120249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Lang), 121249259Sdim MDString::get(VMContext, Producer), 122249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 123249259Sdim MDString::get(VMContext, Flags), 124249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer), 125249259Sdim TempEnumTypes, 126249259Sdim TempRetainTypes, 127249259Sdim TempSubprograms, 128249259Sdim TempGVs, 129252723Sdim TempImportedModules, 130249259Sdim MDString::get(VMContext, SplitName) 131249259Sdim }; 132249259Sdim 133263509Sdim MDNode *CUNode = MDNode::get(VMContext, Elts); 134263509Sdim 135249259Sdim // Create a named metadata so that it is easier to find cu in a module. 136249259Sdim NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 137263509Sdim NMD->addOperand(CUNode); 138263509Sdim 139263509Sdim return DICompileUnit(CUNode); 140249259Sdim} 141249259Sdim 142263509Sdimstatic DIImportedEntity 143263509SdimcreateImportedModule(LLVMContext &C, DIScope Context, DIDescriptor NS, 144263509Sdim unsigned Line, StringRef Name, 145263509Sdim SmallVectorImpl<Value *> &AllImportedModules) { 146263509Sdim const MDNode *R; 147263509Sdim if (Name.empty()) { 148263509Sdim Value *Elts[] = { 149263509Sdim GetTagConstant(C, dwarf::DW_TAG_imported_module), 150263509Sdim Context, 151263509Sdim NS, 152263509Sdim ConstantInt::get(Type::getInt32Ty(C), Line), 153263509Sdim }; 154263509Sdim R = MDNode::get(C, Elts); 155263509Sdim } else { 156263509Sdim Value *Elts[] = { 157263509Sdim GetTagConstant(C, dwarf::DW_TAG_imported_module), 158263509Sdim Context, 159263509Sdim NS, 160263509Sdim ConstantInt::get(Type::getInt32Ty(C), Line), 161263509Sdim MDString::get(C, Name) 162263509Sdim }; 163263509Sdim R = MDNode::get(C, Elts); 164263509Sdim } 165263509Sdim DIImportedEntity M(R); 166263509Sdim assert(M.Verify() && "Imported module should be valid"); 167263509Sdim AllImportedModules.push_back(M); 168263509Sdim return M; 169263509Sdim} 170263509Sdim 171263509SdimDIImportedEntity DIBuilder::createImportedModule(DIScope Context, 172263509Sdim DINameSpace NS, unsigned Line, 173263509Sdim StringRef Name) { 174263509Sdim return ::createImportedModule(VMContext, Context, NS, Line, Name, 175263509Sdim AllImportedModules); 176263509Sdim} 177263509Sdim 178263509SdimDIImportedEntity DIBuilder::createImportedModule(DIScope Context, 179263509Sdim DIImportedEntity NS, 180263509Sdim unsigned Line, 181263509Sdim StringRef Name) { 182263509Sdim return ::createImportedModule(VMContext, Context, NS, Line, Name, 183263509Sdim AllImportedModules); 184263509Sdim} 185263509Sdim 186263509SdimDIImportedEntity DIBuilder::createImportedDeclaration(DIScope Context, 187263509Sdim DIDescriptor Decl, 188263509Sdim unsigned Line) { 189252723Sdim Value *Elts[] = { 190263509Sdim GetTagConstant(VMContext, dwarf::DW_TAG_imported_declaration), 191252723Sdim Context, 192263509Sdim Decl, 193252723Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Line), 194252723Sdim }; 195263509Sdim DIImportedEntity M(MDNode::get(VMContext, Elts)); 196252723Sdim assert(M.Verify() && "Imported module should be valid"); 197252723Sdim AllImportedModules.push_back(M); 198252723Sdim return M; 199252723Sdim} 200252723Sdim 201249259Sdim/// createFile - Create a file descriptor to hold debugging information 202249259Sdim/// for a file. 203249259SdimDIFile DIBuilder::createFile(StringRef Filename, StringRef Directory) { 204249259Sdim Value *Elts[] = { 205249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_file_type), 206249259Sdim createFilePathPair(VMContext, Filename, Directory) 207249259Sdim }; 208249259Sdim return DIFile(MDNode::get(VMContext, Elts)); 209249259Sdim} 210249259Sdim 211249259Sdim/// createEnumerator - Create a single enumerator value. 212263509SdimDIEnumerator DIBuilder::createEnumerator(StringRef Name, int64_t Val) { 213249259Sdim assert(!Name.empty() && "Unable to create enumerator without name"); 214249259Sdim Value *Elts[] = { 215249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_enumerator), 216249259Sdim MDString::get(VMContext, Name), 217249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), Val) 218249259Sdim }; 219249259Sdim return DIEnumerator(MDNode::get(VMContext, Elts)); 220249259Sdim} 221249259Sdim 222263509Sdim/// \brief Create a DWARF unspecified type. 223263509SdimDIBasicType DIBuilder::createUnspecifiedType(StringRef Name) { 224249259Sdim assert(!Name.empty() && "Unable to create type without name"); 225263509Sdim // Unspecified types are encoded in DIBasicType format. Line number, filename, 226263509Sdim // size, alignment, offset and flags are always empty here. 227249259Sdim Value *Elts[] = { 228249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_type), 229249259Sdim NULL, // Filename 230263509Sdim NULL, // Unused 231249259Sdim MDString::get(VMContext, Name), 232249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 233249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 234249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 235249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 236249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 237249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0) // Encoding 238249259Sdim }; 239263509Sdim return DIBasicType(MDNode::get(VMContext, Elts)); 240249259Sdim} 241249259Sdim 242263509Sdim/// \brief Create C++11 nullptr type. 243263509SdimDIBasicType DIBuilder::createNullPtrType() { 244263509Sdim return createUnspecifiedType("decltype(nullptr)"); 245263509Sdim} 246263509Sdim 247249259Sdim/// createBasicType - Create debugging information entry for a basic 248249259Sdim/// type, e.g 'char'. 249249259SdimDIBasicType 250249259SdimDIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 251249259Sdim uint64_t AlignInBits, unsigned Encoding) { 252249259Sdim assert(!Name.empty() && "Unable to create type without name"); 253249259Sdim // Basic types are encoded in DIBasicType format. Line number, filename, 254249259Sdim // offset and flags are always empty here. 255249259Sdim Value *Elts[] = { 256249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_base_type), 257249259Sdim NULL, // File/directory name 258263509Sdim NULL, // Unused 259249259Sdim MDString::get(VMContext, Name), 260249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 261249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 262249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 263249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 264249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags; 265249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) 266249259Sdim }; 267249259Sdim return DIBasicType(MDNode::get(VMContext, Elts)); 268249259Sdim} 269249259Sdim 270249259Sdim/// createQualifiedType - Create debugging information entry for a qualified 271249259Sdim/// type, e.g. 'const int'. 272249259SdimDIDerivedType DIBuilder::createQualifiedType(unsigned Tag, DIType FromTy) { 273249259Sdim // Qualified types are encoded in DIDerivedType format. 274249259Sdim Value *Elts[] = { 275249259Sdim GetTagConstant(VMContext, Tag), 276249259Sdim NULL, // Filename 277263509Sdim NULL, // Unused 278249259Sdim MDString::get(VMContext, StringRef()), // Empty name. 279249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 280249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 281249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 282249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 283249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 284263509Sdim FromTy.getRef() 285249259Sdim }; 286249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 287249259Sdim} 288249259Sdim 289249259Sdim/// createPointerType - Create debugging information entry for a pointer. 290249259SdimDIDerivedType 291249259SdimDIBuilder::createPointerType(DIType PointeeTy, uint64_t SizeInBits, 292249259Sdim uint64_t AlignInBits, StringRef Name) { 293249259Sdim // Pointer types are encoded in DIDerivedType format. 294249259Sdim Value *Elts[] = { 295249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_pointer_type), 296249259Sdim NULL, // Filename 297263509Sdim NULL, // Unused 298249259Sdim MDString::get(VMContext, Name), 299249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 300249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 301249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 302249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 303249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 304263509Sdim PointeeTy.getRef() 305249259Sdim }; 306249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 307249259Sdim} 308249259Sdim 309252723SdimDIDerivedType DIBuilder::createMemberPointerType(DIType PointeeTy, 310252723Sdim DIType Base) { 311249259Sdim // Pointer types are encoded in DIDerivedType format. 312249259Sdim Value *Elts[] = { 313249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_ptr_to_member_type), 314249259Sdim NULL, // Filename 315263509Sdim NULL, // Unused 316249259Sdim NULL, 317249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 318263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 319263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 320249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 321249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 322263509Sdim PointeeTy.getRef(), 323263509Sdim Base.getRef() 324249259Sdim }; 325249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 326249259Sdim} 327249259Sdim 328249259Sdim/// createReferenceType - Create debugging information entry for a reference 329249259Sdim/// type. 330249259SdimDIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) { 331263509Sdim assert(RTy.isType() && "Unable to create reference type"); 332249259Sdim // References are encoded in DIDerivedType format. 333249259Sdim Value *Elts[] = { 334249259Sdim GetTagConstant(VMContext, Tag), 335249259Sdim NULL, // Filename 336249259Sdim NULL, // TheCU, 337249259Sdim NULL, // Name 338249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 339249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 340249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 341249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 342249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 343263509Sdim RTy.getRef() 344249259Sdim }; 345249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 346249259Sdim} 347249259Sdim 348249259Sdim/// createTypedef - Create debugging information entry for a typedef. 349249259SdimDIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File, 350249259Sdim unsigned LineNo, DIDescriptor Context) { 351249259Sdim // typedefs are encoded in DIDerivedType format. 352263509Sdim assert(Ty.isType() && "Invalid typedef type!"); 353249259Sdim Value *Elts[] = { 354249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_typedef), 355249259Sdim File.getFileNode(), 356263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 357249259Sdim MDString::get(VMContext, Name), 358249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 359249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 360249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 361249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 362249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 363263509Sdim Ty.getRef() 364249259Sdim }; 365249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 366249259Sdim} 367249259Sdim 368249259Sdim/// createFriend - Create debugging information entry for a 'friend'. 369263509SdimDIDerivedType DIBuilder::createFriend(DIType Ty, DIType FriendTy) { 370249259Sdim // typedefs are encoded in DIDerivedType format. 371263509Sdim assert(Ty.isType() && "Invalid type!"); 372263509Sdim assert(FriendTy.isType() && "Invalid friend type!"); 373249259Sdim Value *Elts[] = { 374249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_friend), 375249259Sdim NULL, 376263509Sdim Ty.getRef(), 377249259Sdim NULL, // Name 378249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 379249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 380249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 381249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 382249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 383263509Sdim FriendTy.getRef() 384249259Sdim }; 385263509Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 386249259Sdim} 387249259Sdim 388249259Sdim/// createInheritance - Create debugging information entry to establish 389249259Sdim/// inheritance relationship between two types. 390263509SdimDIDerivedType DIBuilder::createInheritance(DIType Ty, DIType BaseTy, 391263509Sdim uint64_t BaseOffset, 392263509Sdim unsigned Flags) { 393263509Sdim assert(Ty.isType() && "Unable to create inheritance"); 394249259Sdim // TAG_inheritance is encoded in DIDerivedType format. 395249259Sdim Value *Elts[] = { 396249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_inheritance), 397249259Sdim NULL, 398263509Sdim Ty.getRef(), 399249259Sdim NULL, // Name 400249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 401249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 402249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 403249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), BaseOffset), 404249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 405263509Sdim BaseTy.getRef() 406249259Sdim }; 407249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 408249259Sdim} 409249259Sdim 410249259Sdim/// createMemberType - Create debugging information entry for a member. 411263509SdimDIDerivedType DIBuilder::createMemberType(DIDescriptor Scope, StringRef Name, 412263509Sdim DIFile File, unsigned LineNumber, 413263509Sdim uint64_t SizeInBits, 414263509Sdim uint64_t AlignInBits, 415263509Sdim uint64_t OffsetInBits, unsigned Flags, 416263509Sdim DIType Ty) { 417249259Sdim // TAG_member is encoded in DIDerivedType format. 418249259Sdim Value *Elts[] = { 419249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_member), 420249259Sdim File.getFileNode(), 421263509Sdim DIScope(getNonCompileUnitScope(Scope)).getRef(), 422249259Sdim MDString::get(VMContext, Name), 423249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 424249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 425249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 426249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 427249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 428263509Sdim Ty.getRef() 429249259Sdim }; 430249259Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 431249259Sdim} 432249259Sdim 433249259Sdim/// createStaticMemberType - Create debugging information entry for a 434249259Sdim/// C++ static data member. 435263509SdimDIDerivedType 436263509SdimDIBuilder::createStaticMemberType(DIDescriptor Scope, StringRef Name, 437263509Sdim DIFile File, unsigned LineNumber, 438263509Sdim DIType Ty, unsigned Flags, 439263509Sdim llvm::Value *Val) { 440249259Sdim // TAG_member is encoded in DIDerivedType format. 441249259Sdim Flags |= DIDescriptor::FlagStaticMember; 442249259Sdim Value *Elts[] = { 443249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_member), 444249259Sdim File.getFileNode(), 445263509Sdim DIScope(getNonCompileUnitScope(Scope)).getRef(), 446249259Sdim MDString::get(VMContext, Name), 447249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 448263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 449263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 450263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 451249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 452263509Sdim Ty.getRef(), 453249259Sdim Val 454249259Sdim }; 455263509Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 456249259Sdim} 457249259Sdim 458249259Sdim/// createObjCIVar - Create debugging information entry for Objective-C 459249259Sdim/// instance variable. 460263509SdimDIDerivedType 461263509SdimDIBuilder::createObjCIVar(StringRef Name, DIFile File, unsigned LineNumber, 462263509Sdim uint64_t SizeInBits, uint64_t AlignInBits, 463263509Sdim uint64_t OffsetInBits, unsigned Flags, DIType Ty, 464263509Sdim StringRef PropertyName, StringRef GetterName, 465263509Sdim StringRef SetterName, unsigned PropertyAttributes) { 466249259Sdim // TAG_member is encoded in DIDerivedType format. 467249259Sdim Value *Elts[] = { 468249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_member), 469249259Sdim File.getFileNode(), 470249259Sdim getNonCompileUnitScope(File), 471249259Sdim MDString::get(VMContext, Name), 472249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 473249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 474249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 475249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 476249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 477249259Sdim Ty, 478249259Sdim MDString::get(VMContext, PropertyName), 479249259Sdim MDString::get(VMContext, GetterName), 480249259Sdim MDString::get(VMContext, SetterName), 481249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes) 482249259Sdim }; 483263509Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 484249259Sdim} 485249259Sdim 486249259Sdim/// createObjCIVar - Create debugging information entry for Objective-C 487249259Sdim/// instance variable. 488263509SdimDIDerivedType DIBuilder::createObjCIVar(StringRef Name, DIFile File, 489263509Sdim unsigned LineNumber, 490263509Sdim uint64_t SizeInBits, 491263509Sdim uint64_t AlignInBits, 492263509Sdim uint64_t OffsetInBits, unsigned Flags, 493263509Sdim DIType Ty, MDNode *PropertyNode) { 494249259Sdim // TAG_member is encoded in DIDerivedType format. 495249259Sdim Value *Elts[] = { 496249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_member), 497249259Sdim File.getFileNode(), 498249259Sdim getNonCompileUnitScope(File), 499249259Sdim MDString::get(VMContext, Name), 500249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 501249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 502249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 503249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), 504249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 505249259Sdim Ty, 506249259Sdim PropertyNode 507249259Sdim }; 508263509Sdim return DIDerivedType(MDNode::get(VMContext, Elts)); 509249259Sdim} 510249259Sdim 511249259Sdim/// createObjCProperty - Create debugging information entry for Objective-C 512249259Sdim/// property. 513263509SdimDIObjCProperty 514263509SdimDIBuilder::createObjCProperty(StringRef Name, DIFile File, unsigned LineNumber, 515263509Sdim StringRef GetterName, StringRef SetterName, 516263509Sdim unsigned PropertyAttributes, DIType Ty) { 517249259Sdim Value *Elts[] = { 518249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_APPLE_property), 519249259Sdim MDString::get(VMContext, Name), 520249259Sdim File, 521249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 522249259Sdim MDString::get(VMContext, GetterName), 523249259Sdim MDString::get(VMContext, SetterName), 524249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), PropertyAttributes), 525249259Sdim Ty 526249259Sdim }; 527249259Sdim return DIObjCProperty(MDNode::get(VMContext, Elts)); 528249259Sdim} 529249259Sdim 530249259Sdim/// createTemplateTypeParameter - Create debugging information for template 531249259Sdim/// type parameter. 532249259SdimDITemplateTypeParameter 533249259SdimDIBuilder::createTemplateTypeParameter(DIDescriptor Context, StringRef Name, 534249259Sdim DIType Ty, MDNode *File, unsigned LineNo, 535249259Sdim unsigned ColumnNo) { 536249259Sdim Value *Elts[] = { 537249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_template_type_parameter), 538263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 539249259Sdim MDString::get(VMContext, Name), 540263509Sdim Ty.getRef(), 541249259Sdim File, 542249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 543249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 544249259Sdim }; 545249259Sdim return DITemplateTypeParameter(MDNode::get(VMContext, Elts)); 546249259Sdim} 547249259Sdim 548249259SdimDITemplateValueParameter 549263509SdimDIBuilder::createTemplateValueParameter(unsigned Tag, DIDescriptor Context, 550263509Sdim StringRef Name, DIType Ty, 551263509Sdim Value *Val, MDNode *File, 552263509Sdim unsigned LineNo, 553249259Sdim unsigned ColumnNo) { 554249259Sdim Value *Elts[] = { 555263509Sdim GetTagConstant(VMContext, Tag), 556263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 557249259Sdim MDString::get(VMContext, Name), 558263509Sdim Ty.getRef(), 559263509Sdim Val, 560249259Sdim File, 561249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 562249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo) 563249259Sdim }; 564249259Sdim return DITemplateValueParameter(MDNode::get(VMContext, Elts)); 565249259Sdim} 566249259Sdim 567263509Sdim/// createTemplateValueParameter - Create debugging information for template 568263509Sdim/// value parameter. 569263509SdimDITemplateValueParameter 570263509SdimDIBuilder::createTemplateValueParameter(DIDescriptor Context, StringRef Name, 571263509Sdim DIType Ty, Value *Val, 572263509Sdim MDNode *File, unsigned LineNo, 573263509Sdim unsigned ColumnNo) { 574263509Sdim return createTemplateValueParameter(dwarf::DW_TAG_template_value_parameter, 575263509Sdim Context, Name, Ty, Val, File, LineNo, 576263509Sdim ColumnNo); 577263509Sdim} 578263509Sdim 579263509SdimDITemplateValueParameter 580263509SdimDIBuilder::createTemplateTemplateParameter(DIDescriptor Context, StringRef Name, 581263509Sdim DIType Ty, StringRef Val, 582263509Sdim MDNode *File, unsigned LineNo, 583263509Sdim unsigned ColumnNo) { 584263509Sdim return createTemplateValueParameter( 585263509Sdim dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty, 586263509Sdim MDString::get(VMContext, Val), File, LineNo, ColumnNo); 587263509Sdim} 588263509Sdim 589263509SdimDITemplateValueParameter 590263509SdimDIBuilder::createTemplateParameterPack(DIDescriptor Context, StringRef Name, 591263509Sdim DIType Ty, DIArray Val, 592263509Sdim MDNode *File, unsigned LineNo, 593263509Sdim unsigned ColumnNo) { 594263509Sdim return createTemplateValueParameter(dwarf::DW_TAG_GNU_template_parameter_pack, 595263509Sdim Context, Name, Ty, Val, File, LineNo, 596263509Sdim ColumnNo); 597263509Sdim} 598263509Sdim 599249259Sdim/// createClassType - Create debugging information entry for a class. 600249259SdimDICompositeType DIBuilder::createClassType(DIDescriptor Context, StringRef Name, 601249259Sdim DIFile File, unsigned LineNumber, 602249259Sdim uint64_t SizeInBits, 603249259Sdim uint64_t AlignInBits, 604249259Sdim uint64_t OffsetInBits, 605249259Sdim unsigned Flags, DIType DerivedFrom, 606249259Sdim DIArray Elements, 607263509Sdim DIType VTableHolder, 608263509Sdim MDNode *TemplateParams, 609263509Sdim StringRef UniqueIdentifier) { 610263509Sdim assert((!Context || Context.isScope() || Context.isType()) && 611249259Sdim "createClassType should be called with a valid Context"); 612249259Sdim // TAG_class_type is encoded in DICompositeType format. 613249259Sdim Value *Elts[] = { 614249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_class_type), 615249259Sdim File.getFileNode(), 616263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 617249259Sdim MDString::get(VMContext, Name), 618249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 619249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 620249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 621249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), OffsetInBits), 622249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 623263509Sdim DerivedFrom.getRef(), 624249259Sdim Elements, 625249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 626263509Sdim VTableHolder.getRef(), 627263509Sdim TemplateParams, 628263509Sdim UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 629249259Sdim }; 630249259Sdim DICompositeType R(MDNode::get(VMContext, Elts)); 631263509Sdim assert(R.isCompositeType() && 632263509Sdim "createClassType should return a DICompositeType"); 633263509Sdim if (!UniqueIdentifier.empty()) 634263509Sdim retainType(R); 635249259Sdim return R; 636249259Sdim} 637249259Sdim 638249259Sdim/// createStructType - Create debugging information entry for a struct. 639249259SdimDICompositeType DIBuilder::createStructType(DIDescriptor Context, 640249259Sdim StringRef Name, DIFile File, 641249259Sdim unsigned LineNumber, 642249259Sdim uint64_t SizeInBits, 643249259Sdim uint64_t AlignInBits, 644249259Sdim unsigned Flags, DIType DerivedFrom, 645249259Sdim DIArray Elements, 646249259Sdim unsigned RunTimeLang, 647263509Sdim DIType VTableHolder, 648263509Sdim StringRef UniqueIdentifier) { 649249259Sdim // TAG_structure_type is encoded in DICompositeType format. 650249259Sdim Value *Elts[] = { 651249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_structure_type), 652249259Sdim File.getFileNode(), 653263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 654249259Sdim MDString::get(VMContext, Name), 655249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 656249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 657249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 658249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 659249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 660263509Sdim DerivedFrom.getRef(), 661249259Sdim Elements, 662249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 663263509Sdim VTableHolder.getRef(), 664249259Sdim NULL, 665263509Sdim UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 666249259Sdim }; 667249259Sdim DICompositeType R(MDNode::get(VMContext, Elts)); 668263509Sdim assert(R.isCompositeType() && 669263509Sdim "createStructType should return a DICompositeType"); 670263509Sdim if (!UniqueIdentifier.empty()) 671263509Sdim retainType(R); 672249259Sdim return R; 673249259Sdim} 674249259Sdim 675249259Sdim/// createUnionType - Create debugging information entry for an union. 676249259SdimDICompositeType DIBuilder::createUnionType(DIDescriptor Scope, StringRef Name, 677249259Sdim DIFile File, unsigned LineNumber, 678249259Sdim uint64_t SizeInBits, 679249259Sdim uint64_t AlignInBits, unsigned Flags, 680249259Sdim DIArray Elements, 681263509Sdim unsigned RunTimeLang, 682263509Sdim StringRef UniqueIdentifier) { 683249259Sdim // TAG_union_type is encoded in DICompositeType format. 684249259Sdim Value *Elts[] = { 685249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_union_type), 686249259Sdim File.getFileNode(), 687263509Sdim DIScope(getNonCompileUnitScope(Scope)).getRef(), 688249259Sdim MDString::get(VMContext, Name), 689249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 690249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 691249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 692263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 693249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 694249259Sdim NULL, 695249259Sdim Elements, 696249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeLang), 697263509Sdim NULL, 698263509Sdim NULL, 699263509Sdim UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 700249259Sdim }; 701263509Sdim DICompositeType R(MDNode::get(VMContext, Elts)); 702263509Sdim if (!UniqueIdentifier.empty()) 703263509Sdim retainType(R); 704263509Sdim return R; 705249259Sdim} 706249259Sdim 707249259Sdim/// createSubroutineType - Create subroutine type. 708263509SdimDICompositeType DIBuilder::createSubroutineType(DIFile File, 709263509Sdim DIArray ParameterTypes) { 710249259Sdim // TAG_subroutine_type is encoded in DICompositeType format. 711249259Sdim Value *Elts[] = { 712249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_subroutine_type), 713249259Sdim Constant::getNullValue(Type::getInt32Ty(VMContext)), 714263509Sdim NULL, 715249259Sdim MDString::get(VMContext, ""), 716263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 717263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Size 718263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Align 719263509Sdim ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset 720263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 721249259Sdim NULL, 722249259Sdim ParameterTypes, 723249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 724263509Sdim NULL, 725263509Sdim NULL, 726263509Sdim NULL // Type Identifer 727249259Sdim }; 728249259Sdim return DICompositeType(MDNode::get(VMContext, Elts)); 729249259Sdim} 730249259Sdim 731249259Sdim/// createEnumerationType - Create debugging information entry for an 732249259Sdim/// enumeration. 733249259SdimDICompositeType DIBuilder::createEnumerationType( 734249259Sdim DIDescriptor Scope, StringRef Name, DIFile File, unsigned LineNumber, 735249259Sdim uint64_t SizeInBits, uint64_t AlignInBits, DIArray Elements, 736263509Sdim DIType UnderlyingType, StringRef UniqueIdentifier) { 737249259Sdim // TAG_enumeration_type is encoded in DICompositeType format. 738249259Sdim Value *Elts[] = { 739249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_enumeration_type), 740249259Sdim File.getFileNode(), 741263509Sdim DIScope(getNonCompileUnitScope(Scope)).getRef(), 742249259Sdim MDString::get(VMContext, Name), 743249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 744249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 745249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 746263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset 747263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 748263509Sdim UnderlyingType.getRef(), 749249259Sdim Elements, 750249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 751263509Sdim NULL, 752263509Sdim NULL, 753263509Sdim UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 754249259Sdim }; 755263509Sdim DICompositeType CTy(MDNode::get(VMContext, Elts)); 756263509Sdim AllEnumTypes.push_back(CTy); 757263509Sdim if (!UniqueIdentifier.empty()) 758263509Sdim retainType(CTy); 759263509Sdim return CTy; 760249259Sdim} 761249259Sdim 762249259Sdim/// createArrayType - Create debugging information entry for an array. 763249259SdimDICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits, 764249259Sdim DIType Ty, DIArray Subscripts) { 765249259Sdim // TAG_array_type is encoded in DICompositeType format. 766249259Sdim Value *Elts[] = { 767249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 768249259Sdim NULL, // Filename/Directory, 769263509Sdim NULL, // Unused 770249259Sdim MDString::get(VMContext, ""), 771263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 772249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), Size), 773249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 774263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset 775263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags 776263509Sdim Ty.getRef(), 777249259Sdim Subscripts, 778249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 779263509Sdim NULL, 780263509Sdim NULL, 781263509Sdim NULL // Type Identifer 782249259Sdim }; 783249259Sdim return DICompositeType(MDNode::get(VMContext, Elts)); 784249259Sdim} 785249259Sdim 786249259Sdim/// createVectorType - Create debugging information entry for a vector. 787263509SdimDICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits, 788263509Sdim DIType Ty, DIArray Subscripts) { 789249259Sdim // A vector is an array type with the FlagVector flag applied. 790249259Sdim Value *Elts[] = { 791249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_array_type), 792249259Sdim NULL, // Filename/Directory, 793263509Sdim NULL, // Unused 794249259Sdim MDString::get(VMContext, ""), 795263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Line 796249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), Size), 797249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 798263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset 799249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), DIType::FlagVector), 800263509Sdim Ty.getRef(), 801249259Sdim Subscripts, 802249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 803263509Sdim NULL, 804263509Sdim NULL, 805263509Sdim NULL // Type Identifer 806249259Sdim }; 807263509Sdim return DICompositeType(MDNode::get(VMContext, Elts)); 808249259Sdim} 809249259Sdim 810249259Sdim/// createArtificialType - Create a new DIType with "artificial" flag set. 811249259SdimDIType DIBuilder::createArtificialType(DIType Ty) { 812249259Sdim if (Ty.isArtificial()) 813249259Sdim return Ty; 814249259Sdim 815249259Sdim SmallVector<Value *, 9> Elts; 816249259Sdim MDNode *N = Ty; 817249259Sdim assert (N && "Unexpected input DIType!"); 818263509Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 819263509Sdim Elts.push_back(N->getOperand(i)); 820249259Sdim 821249259Sdim unsigned CurFlags = Ty.getFlags(); 822249259Sdim CurFlags = CurFlags | DIType::FlagArtificial; 823249259Sdim 824249259Sdim // Flags are stored at this slot. 825263509Sdim // FIXME: Add an enum for this magic value. 826249259Sdim Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 827249259Sdim 828249259Sdim return DIType(MDNode::get(VMContext, Elts)); 829249259Sdim} 830249259Sdim 831249259Sdim/// createObjectPointerType - Create a new type with both the object pointer 832249259Sdim/// and artificial flags set. 833249259SdimDIType DIBuilder::createObjectPointerType(DIType Ty) { 834249259Sdim if (Ty.isObjectPointer()) 835249259Sdim return Ty; 836249259Sdim 837249259Sdim SmallVector<Value *, 9> Elts; 838249259Sdim MDNode *N = Ty; 839249259Sdim assert (N && "Unexpected input DIType!"); 840263509Sdim for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 841263509Sdim Elts.push_back(N->getOperand(i)); 842249259Sdim 843249259Sdim unsigned CurFlags = Ty.getFlags(); 844249259Sdim CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial); 845249259Sdim 846249259Sdim // Flags are stored at this slot. 847263509Sdim // FIXME: Add an enum for this magic value. 848249259Sdim Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 849249259Sdim 850249259Sdim return DIType(MDNode::get(VMContext, Elts)); 851249259Sdim} 852249259Sdim 853249259Sdim/// retainType - Retain DIType in a module even if it is not referenced 854249259Sdim/// through debug info anchors. 855249259Sdimvoid DIBuilder::retainType(DIType T) { 856263509Sdim AllRetainTypes.push_back(TrackingVH<MDNode>(T)); 857249259Sdim} 858249259Sdim 859249259Sdim/// createUnspecifiedParameter - Create unspeicified type descriptor 860249259Sdim/// for the subroutine type. 861249259SdimDIDescriptor DIBuilder::createUnspecifiedParameter() { 862249259Sdim Value *Elts[] = { 863249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 864249259Sdim }; 865249259Sdim return DIDescriptor(MDNode::get(VMContext, Elts)); 866249259Sdim} 867249259Sdim 868249259Sdim/// createForwardDecl - Create a temporary forward-declared type that 869249259Sdim/// can be RAUW'd if the full type is seen. 870263509SdimDICompositeType 871263509SdimDIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIDescriptor Scope, 872263509Sdim DIFile F, unsigned Line, unsigned RuntimeLang, 873263509Sdim uint64_t SizeInBits, uint64_t AlignInBits, 874263509Sdim StringRef UniqueIdentifier) { 875249259Sdim // Create a temporary MDNode. 876249259Sdim Value *Elts[] = { 877249259Sdim GetTagConstant(VMContext, Tag), 878249259Sdim F.getFileNode(), 879263509Sdim DIScope(getNonCompileUnitScope(Scope)).getRef(), 880249259Sdim MDString::get(VMContext, Name), 881249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Line), 882249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 883249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 884263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Offset 885263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), DIDescriptor::FlagFwdDecl), 886249259Sdim NULL, 887249259Sdim DIArray(), 888263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang), 889263509Sdim NULL, 890263509Sdim NULL, //TemplateParams 891263509Sdim UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 892249259Sdim }; 893249259Sdim MDNode *Node = MDNode::getTemporary(VMContext, Elts); 894263509Sdim DICompositeType RetTy(Node); 895263509Sdim assert(RetTy.isCompositeType() && 896263509Sdim "createForwardDecl result should be a DIType"); 897263509Sdim if (!UniqueIdentifier.empty()) 898263509Sdim retainType(RetTy); 899263509Sdim return RetTy; 900249259Sdim} 901249259Sdim 902249259Sdim/// getOrCreateArray - Get a DIArray, create one if required. 903249259SdimDIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 904249259Sdim if (Elements.empty()) { 905249259Sdim Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 906249259Sdim return DIArray(MDNode::get(VMContext, Null)); 907249259Sdim } 908249259Sdim return DIArray(MDNode::get(VMContext, Elements)); 909249259Sdim} 910249259Sdim 911249259Sdim/// getOrCreateSubrange - Create a descriptor for a value range. This 912249259Sdim/// implicitly uniques the values returned. 913249259SdimDISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 914249259Sdim Value *Elts[] = { 915249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 916249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 917249259Sdim ConstantInt::get(Type::getInt64Ty(VMContext), Count) 918249259Sdim }; 919249259Sdim 920249259Sdim return DISubrange(MDNode::get(VMContext, Elts)); 921249259Sdim} 922249259Sdim 923249259Sdim/// \brief Create a new descriptor for the specified global. 924263509SdimDIGlobalVariable DIBuilder::createGlobalVariable(StringRef Name, 925263509Sdim StringRef LinkageName, 926263509Sdim DIFile F, unsigned LineNumber, 927263509Sdim DIType Ty, bool isLocalToUnit, 928263509Sdim Value *Val) { 929249259Sdim Value *Elts[] = { 930249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_variable), 931249259Sdim Constant::getNullValue(Type::getInt32Ty(VMContext)), 932249259Sdim NULL, // TheCU, 933249259Sdim MDString::get(VMContext, Name), 934249259Sdim MDString::get(VMContext, Name), 935249259Sdim MDString::get(VMContext, LinkageName), 936249259Sdim F, 937249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 938249259Sdim Ty, 939249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 940249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 941249259Sdim Val, 942249259Sdim DIDescriptor() 943249259Sdim }; 944249259Sdim MDNode *Node = MDNode::get(VMContext, Elts); 945249259Sdim AllGVs.push_back(Node); 946249259Sdim return DIGlobalVariable(Node); 947249259Sdim} 948249259Sdim 949249259Sdim/// \brief Create a new descriptor for the specified global. 950263509SdimDIGlobalVariable DIBuilder::createGlobalVariable(StringRef Name, DIFile F, 951263509Sdim unsigned LineNumber, DIType Ty, 952263509Sdim bool isLocalToUnit, 953263509Sdim Value *Val) { 954249259Sdim return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit, 955249259Sdim Val); 956249259Sdim} 957249259Sdim 958249259Sdim/// createStaticVariable - Create a new descriptor for the specified static 959249259Sdim/// variable. 960263509SdimDIGlobalVariable DIBuilder::createStaticVariable(DIDescriptor Context, 961263509Sdim StringRef Name, 962263509Sdim StringRef LinkageName, 963263509Sdim DIFile F, unsigned LineNumber, 964263509Sdim DIType Ty, bool isLocalToUnit, 965263509Sdim Value *Val, MDNode *Decl) { 966249259Sdim Value *Elts[] = { 967249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_variable), 968249259Sdim Constant::getNullValue(Type::getInt32Ty(VMContext)), 969249259Sdim getNonCompileUnitScope(Context), 970249259Sdim MDString::get(VMContext, Name), 971249259Sdim MDString::get(VMContext, Name), 972249259Sdim MDString::get(VMContext, LinkageName), 973249259Sdim F, 974249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 975249259Sdim Ty, 976249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 977249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 978249259Sdim Val, 979249259Sdim DIDescriptor(Decl) 980249259Sdim }; 981249259Sdim MDNode *Node = MDNode::get(VMContext, Elts); 982249259Sdim AllGVs.push_back(Node); 983249259Sdim return DIGlobalVariable(Node); 984249259Sdim} 985249259Sdim 986249259Sdim/// createVariable - Create a new descriptor for the specified variable. 987249259SdimDIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 988249259Sdim StringRef Name, DIFile File, 989249259Sdim unsigned LineNo, DIType Ty, 990249259Sdim bool AlwaysPreserve, unsigned Flags, 991249259Sdim unsigned ArgNo) { 992249259Sdim DIDescriptor Context(getNonCompileUnitScope(Scope)); 993263509Sdim assert((!Context || Context.isScope()) && 994249259Sdim "createLocalVariable should be called with a valid Context"); 995263509Sdim assert(Ty.isType() && 996249259Sdim "createLocalVariable should be called with a valid type"); 997249259Sdim Value *Elts[] = { 998249259Sdim GetTagConstant(VMContext, Tag), 999249259Sdim getNonCompileUnitScope(Scope), 1000249259Sdim MDString::get(VMContext, Name), 1001249259Sdim File, 1002249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 1003249259Sdim Ty, 1004249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1005249259Sdim Constant::getNullValue(Type::getInt32Ty(VMContext)) 1006249259Sdim }; 1007249259Sdim MDNode *Node = MDNode::get(VMContext, Elts); 1008249259Sdim if (AlwaysPreserve) { 1009249259Sdim // The optimizer may remove local variable. If there is an interest 1010249259Sdim // to preserve variable info in such situation then stash it in a 1011249259Sdim // named mdnode. 1012249259Sdim DISubprogram Fn(getDISubprogram(Scope)); 1013249259Sdim NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 1014249259Sdim FnLocals->addOperand(Node); 1015249259Sdim } 1016263509Sdim DIVariable RetVar(Node); 1017263509Sdim assert(RetVar.isVariable() && 1018263509Sdim "createLocalVariable should return a valid DIVariable"); 1019263509Sdim return RetVar; 1020249259Sdim} 1021249259Sdim 1022249259Sdim/// createComplexVariable - Create a new descriptor for the specified variable 1023249259Sdim/// which has a complex address expression for its address. 1024249259SdimDIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 1025249259Sdim StringRef Name, DIFile F, 1026249259Sdim unsigned LineNo, 1027249259Sdim DIType Ty, ArrayRef<Value *> Addr, 1028249259Sdim unsigned ArgNo) { 1029249259Sdim SmallVector<Value *, 15> Elts; 1030249259Sdim Elts.push_back(GetTagConstant(VMContext, Tag)); 1031249259Sdim Elts.push_back(getNonCompileUnitScope(Scope)), 1032249259Sdim Elts.push_back(MDString::get(VMContext, Name)); 1033249259Sdim Elts.push_back(F); 1034249259Sdim Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 1035249259Sdim (LineNo | (ArgNo << 24)))); 1036249259Sdim Elts.push_back(Ty); 1037249259Sdim Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1038249259Sdim Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1039249259Sdim Elts.append(Addr.begin(), Addr.end()); 1040249259Sdim 1041249259Sdim return DIVariable(MDNode::get(VMContext, Elts)); 1042249259Sdim} 1043249259Sdim 1044249259Sdim/// createFunction - Create a new descriptor for the specified function. 1045263509Sdim/// FIXME: this is added for dragonegg. Once we update dragonegg 1046263509Sdim/// to call resolve function, this will be removed. 1047263509SdimDISubprogram DIBuilder::createFunction(DIScopeRef Context, StringRef Name, 1048263509Sdim StringRef LinkageName, DIFile File, 1049263509Sdim unsigned LineNo, DICompositeType Ty, 1050249259Sdim bool isLocalToUnit, bool isDefinition, 1051263509Sdim unsigned ScopeLine, unsigned Flags, 1052263509Sdim bool isOptimized, Function *Fn, 1053263509Sdim MDNode *TParams, MDNode *Decl) { 1054263509Sdim // dragonegg does not generate identifier for types, so using an empty map 1055263509Sdim // to resolve the context should be fine. 1056263509Sdim DITypeIdentifierMap EmptyMap; 1057263509Sdim return createFunction(Context.resolve(EmptyMap), Name, LinkageName, File, 1058263509Sdim LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine, 1059263509Sdim Flags, isOptimized, Fn, TParams, Decl); 1060263509Sdim} 1061263509Sdim 1062263509Sdim/// createFunction - Create a new descriptor for the specified function. 1063263509SdimDISubprogram DIBuilder::createFunction(DIDescriptor Context, StringRef Name, 1064263509Sdim StringRef LinkageName, DIFile File, 1065263509Sdim unsigned LineNo, DICompositeType Ty, 1066263509Sdim bool isLocalToUnit, bool isDefinition, 1067263509Sdim unsigned ScopeLine, unsigned Flags, 1068263509Sdim bool isOptimized, Function *Fn, 1069263509Sdim MDNode *TParams, MDNode *Decl) { 1070263509Sdim assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 1071263509Sdim "function types should be subroutines"); 1072249259Sdim Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 1073249259Sdim Value *Elts[] = { 1074249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1075249259Sdim File.getFileNode(), 1076263509Sdim DIScope(getNonCompileUnitScope(Context)).getRef(), 1077249259Sdim MDString::get(VMContext, Name), 1078249259Sdim MDString::get(VMContext, Name), 1079249259Sdim MDString::get(VMContext, LinkageName), 1080249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 1081249259Sdim Ty, 1082249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 1083249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 1084249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 1085249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), 0), 1086249259Sdim NULL, 1087249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1088249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1089249259Sdim Fn, 1090249259Sdim TParams, 1091249259Sdim Decl, 1092249259Sdim MDNode::getTemporary(VMContext, TElts), 1093249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 1094249259Sdim }; 1095249259Sdim MDNode *Node = MDNode::get(VMContext, Elts); 1096249259Sdim 1097249259Sdim // Create a named metadata so that we do not lose this mdnode. 1098249259Sdim if (isDefinition) 1099249259Sdim AllSubprograms.push_back(Node); 1100249259Sdim DISubprogram S(Node); 1101263509Sdim assert(S.isSubprogram() && "createFunction should return a valid DISubprogram"); 1102249259Sdim return S; 1103249259Sdim} 1104249259Sdim 1105249259Sdim/// createMethod - Create a new descriptor for the specified C++ method. 1106263509SdimDISubprogram DIBuilder::createMethod(DIDescriptor Context, StringRef Name, 1107263509Sdim StringRef LinkageName, DIFile F, 1108263509Sdim unsigned LineNo, DICompositeType Ty, 1109263509Sdim bool isLocalToUnit, bool isDefinition, 1110249259Sdim unsigned VK, unsigned VIndex, 1111263509Sdim DIType VTableHolder, unsigned Flags, 1112263509Sdim bool isOptimized, Function *Fn, 1113249259Sdim MDNode *TParam) { 1114263509Sdim assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 1115263509Sdim "function types should be subroutines"); 1116263509Sdim assert(getNonCompileUnitScope(Context) && 1117263509Sdim "Methods should have both a Context and a context that isn't " 1118263509Sdim "the compile unit."); 1119249259Sdim Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 1120249259Sdim Value *Elts[] = { 1121249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1122249259Sdim F.getFileNode(), 1123263509Sdim DIScope(Context).getRef(), 1124249259Sdim MDString::get(VMContext, Name), 1125249259Sdim MDString::get(VMContext, Name), 1126249259Sdim MDString::get(VMContext, LinkageName), 1127249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 1128249259Sdim Ty, 1129249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 1130249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 1131263509Sdim ConstantInt::get(Type::getInt32Ty(VMContext), VK), 1132249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 1133263509Sdim VTableHolder.getRef(), 1134249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1135249259Sdim ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1136249259Sdim Fn, 1137249259Sdim TParam, 1138249259Sdim Constant::getNullValue(Type::getInt32Ty(VMContext)), 1139249259Sdim MDNode::getTemporary(VMContext, TElts), 1140249259Sdim // FIXME: Do we want to use different scope/lines? 1141249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1142249259Sdim }; 1143249259Sdim MDNode *Node = MDNode::get(VMContext, Elts); 1144249259Sdim if (isDefinition) 1145249259Sdim AllSubprograms.push_back(Node); 1146249259Sdim DISubprogram S(Node); 1147263509Sdim assert(S.isSubprogram() && "createMethod should return a valid DISubprogram"); 1148249259Sdim return S; 1149249259Sdim} 1150249259Sdim 1151249259Sdim/// createNameSpace - This creates new descriptor for a namespace 1152249259Sdim/// with the specified parent scope. 1153249259SdimDINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 1154249259Sdim DIFile File, unsigned LineNo) { 1155249259Sdim Value *Elts[] = { 1156249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 1157249259Sdim File.getFileNode(), 1158249259Sdim getNonCompileUnitScope(Scope), 1159249259Sdim MDString::get(VMContext, Name), 1160249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1161249259Sdim }; 1162249259Sdim DINameSpace R(MDNode::get(VMContext, Elts)); 1163249259Sdim assert(R.Verify() && 1164249259Sdim "createNameSpace should return a verifiable DINameSpace"); 1165249259Sdim return R; 1166249259Sdim} 1167249259Sdim 1168249259Sdim/// createLexicalBlockFile - This creates a new MDNode that encapsulates 1169249259Sdim/// an existing scope with a new filename. 1170249259SdimDILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 1171249259Sdim DIFile File) { 1172249259Sdim Value *Elts[] = { 1173249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 1174249259Sdim File.getFileNode(), 1175249259Sdim Scope 1176249259Sdim }; 1177249259Sdim DILexicalBlockFile R(MDNode::get(VMContext, Elts)); 1178249259Sdim assert( 1179249259Sdim R.Verify() && 1180249259Sdim "createLexicalBlockFile should return a verifiable DILexicalBlockFile"); 1181249259Sdim return R; 1182249259Sdim} 1183249259Sdim 1184249259SdimDILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 1185249259Sdim unsigned Line, unsigned Col) { 1186263509Sdim // Defeat MDNode uniquing for lexical blocks by using unique id. 1187249259Sdim static unsigned int unique_id = 0; 1188249259Sdim Value *Elts[] = { 1189249259Sdim GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 1190249259Sdim File.getFileNode(), 1191249259Sdim getNonCompileUnitScope(Scope), 1192249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Line), 1193249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), Col), 1194249259Sdim ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 1195249259Sdim }; 1196249259Sdim DILexicalBlock R(MDNode::get(VMContext, Elts)); 1197249259Sdim assert(R.Verify() && 1198249259Sdim "createLexicalBlock should return a verifiable DILexicalBlock"); 1199249259Sdim return R; 1200249259Sdim} 1201249259Sdim 1202249259Sdim/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 1203249259SdimInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1204249259Sdim Instruction *InsertBefore) { 1205249259Sdim assert(Storage && "no storage passed to dbg.declare"); 1206263509Sdim assert(VarInfo.isVariable() && 1207263509Sdim "empty or invalid DIVariable passed to dbg.declare"); 1208249259Sdim if (!DeclareFn) 1209249259Sdim DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1210249259Sdim 1211249259Sdim Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1212249259Sdim return CallInst::Create(DeclareFn, Args, "", InsertBefore); 1213249259Sdim} 1214249259Sdim 1215249259Sdim/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 1216249259SdimInstruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1217249259Sdim BasicBlock *InsertAtEnd) { 1218249259Sdim assert(Storage && "no storage passed to dbg.declare"); 1219263509Sdim assert(VarInfo.isVariable() && 1220263509Sdim "empty or invalid DIVariable passed to dbg.declare"); 1221249259Sdim if (!DeclareFn) 1222249259Sdim DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1223249259Sdim 1224249259Sdim Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1225249259Sdim 1226249259Sdim // If this block already has a terminator then insert this intrinsic 1227249259Sdim // before the terminator. 1228249259Sdim if (TerminatorInst *T = InsertAtEnd->getTerminator()) 1229249259Sdim return CallInst::Create(DeclareFn, Args, "", T); 1230249259Sdim else 1231249259Sdim return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 1232249259Sdim} 1233249259Sdim 1234249259Sdim/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 1235249259SdimInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1236249259Sdim DIVariable VarInfo, 1237249259Sdim Instruction *InsertBefore) { 1238249259Sdim assert(V && "no value passed to dbg.value"); 1239263509Sdim assert(VarInfo.isVariable() && 1240263509Sdim "empty or invalid DIVariable passed to dbg.value"); 1241249259Sdim if (!ValueFn) 1242249259Sdim ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1243249259Sdim 1244249259Sdim Value *Args[] = { MDNode::get(V->getContext(), V), 1245249259Sdim ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1246249259Sdim VarInfo }; 1247249259Sdim return CallInst::Create(ValueFn, Args, "", InsertBefore); 1248249259Sdim} 1249249259Sdim 1250249259Sdim/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 1251249259SdimInstruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1252249259Sdim DIVariable VarInfo, 1253249259Sdim BasicBlock *InsertAtEnd) { 1254249259Sdim assert(V && "no value passed to dbg.value"); 1255263509Sdim assert(VarInfo.isVariable() && 1256263509Sdim "empty or invalid DIVariable passed to dbg.value"); 1257249259Sdim if (!ValueFn) 1258249259Sdim ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1259249259Sdim 1260249259Sdim Value *Args[] = { MDNode::get(V->getContext(), V), 1261249259Sdim ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1262249259Sdim VarInfo }; 1263249259Sdim return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1264249259Sdim} 1265