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