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