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