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