DIBuilder.cpp revision 5930eabe0fdc48c02c5af500aa5b1c5b732848b1
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 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.generateRef() 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, 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, 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 getNonCompileUnitScope(Scope), 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 MDNode *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, 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 MDNode *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, 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 Constant::getNullValue(Type::getInt32Ty(VMContext)), 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 if (Value *V = N->getOperand(i)) 823 Elts.push_back(V); 824 else 825 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 826 } 827 828 unsigned CurFlags = Ty.getFlags(); 829 CurFlags = CurFlags | DIType::FlagArtificial; 830 831 // Flags are stored at this slot. 832 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 833 834 return DIType(MDNode::get(VMContext, Elts)); 835} 836 837/// createObjectPointerType - Create a new type with both the object pointer 838/// and artificial flags set. 839DIType DIBuilder::createObjectPointerType(DIType Ty) { 840 if (Ty.isObjectPointer()) 841 return Ty; 842 843 SmallVector<Value *, 9> Elts; 844 MDNode *N = Ty; 845 assert (N && "Unexpected input DIType!"); 846 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 847 if (Value *V = N->getOperand(i)) 848 Elts.push_back(V); 849 else 850 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 851 } 852 853 unsigned CurFlags = Ty.getFlags(); 854 CurFlags = CurFlags | (DIType::FlagObjectPointer | DIType::FlagArtificial); 855 856 // Flags are stored at this slot. 857 Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); 858 859 return DIType(MDNode::get(VMContext, Elts)); 860} 861 862/// retainType - Retain DIType in a module even if it is not referenced 863/// through debug info anchors. 864void DIBuilder::retainType(DIType T) { 865 AllRetainTypes.push_back(TrackingVH<MDNode>(T)); 866} 867 868/// createUnspecifiedParameter - Create unspeicified type descriptor 869/// for the subroutine type. 870DIDescriptor DIBuilder::createUnspecifiedParameter() { 871 Value *Elts[] = { 872 GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters) 873 }; 874 return DIDescriptor(MDNode::get(VMContext, Elts)); 875} 876 877/// createForwardDecl - Create a temporary forward-declared type that 878/// can be RAUW'd if the full type is seen. 879DICompositeType DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, 880 DIDescriptor Scope, DIFile F, 881 unsigned Line, unsigned RuntimeLang, 882 uint64_t SizeInBits, 883 uint64_t AlignInBits, 884 StringRef UniqueIdentifier) { 885 // Create a temporary MDNode. 886 Value *Elts[] = { 887 GetTagConstant(VMContext, Tag), 888 F.getFileNode(), 889 getNonCompileUnitScope(Scope), 890 MDString::get(VMContext, Name), 891 ConstantInt::get(Type::getInt32Ty(VMContext), Line), 892 ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), 893 ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), 894 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 895 ConstantInt::get(Type::getInt32Ty(VMContext), 896 DIDescriptor::FlagFwdDecl), 897 NULL, 898 DIArray(), 899 ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang), 900 NULL, 901 NULL, //TemplateParams 902 UniqueIdentifier.empty() ? NULL : MDString::get(VMContext, UniqueIdentifier) 903 }; 904 MDNode *Node = MDNode::getTemporary(VMContext, Elts); 905 DICompositeType RetTy(Node); 906 assert(RetTy.isCompositeType() && 907 "createForwardDecl result should be a DIType"); 908 if (!UniqueIdentifier.empty()) 909 retainType(RetTy); 910 return RetTy; 911} 912 913/// getOrCreateArray - Get a DIArray, create one if required. 914DIArray DIBuilder::getOrCreateArray(ArrayRef<Value *> Elements) { 915 if (Elements.empty()) { 916 Value *Null = Constant::getNullValue(Type::getInt32Ty(VMContext)); 917 return DIArray(MDNode::get(VMContext, Null)); 918 } 919 return DIArray(MDNode::get(VMContext, Elements)); 920} 921 922/// getOrCreateSubrange - Create a descriptor for a value range. This 923/// implicitly uniques the values returned. 924DISubrange DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 925 Value *Elts[] = { 926 GetTagConstant(VMContext, dwarf::DW_TAG_subrange_type), 927 ConstantInt::get(Type::getInt64Ty(VMContext), Lo), 928 ConstantInt::get(Type::getInt64Ty(VMContext), Count) 929 }; 930 931 return DISubrange(MDNode::get(VMContext, Elts)); 932} 933 934/// \brief Create a new descriptor for the specified global. 935DIGlobalVariable DIBuilder:: 936createGlobalVariable(StringRef Name, StringRef LinkageName, DIFile F, 937 unsigned LineNumber, DIType Ty, bool isLocalToUnit, 938 Value *Val) { 939 Value *Elts[] = { 940 GetTagConstant(VMContext, dwarf::DW_TAG_variable), 941 Constant::getNullValue(Type::getInt32Ty(VMContext)), 942 NULL, // TheCU, 943 MDString::get(VMContext, Name), 944 MDString::get(VMContext, Name), 945 MDString::get(VMContext, LinkageName), 946 F, 947 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 948 Ty, 949 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 950 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 951 Val, 952 DIDescriptor() 953 }; 954 MDNode *Node = MDNode::get(VMContext, Elts); 955 AllGVs.push_back(Node); 956 return DIGlobalVariable(Node); 957} 958 959/// \brief Create a new descriptor for the specified global. 960DIGlobalVariable DIBuilder:: 961createGlobalVariable(StringRef Name, DIFile F, unsigned LineNumber, 962 DIType Ty, bool isLocalToUnit, Value *Val) { 963 return createGlobalVariable(Name, Name, F, LineNumber, Ty, isLocalToUnit, 964 Val); 965} 966 967/// createStaticVariable - Create a new descriptor for the specified static 968/// variable. 969DIGlobalVariable DIBuilder:: 970createStaticVariable(DIDescriptor Context, StringRef Name, 971 StringRef LinkageName, DIFile F, unsigned LineNumber, 972 DIType Ty, bool isLocalToUnit, Value *Val, MDNode *Decl) { 973 Value *Elts[] = { 974 GetTagConstant(VMContext, dwarf::DW_TAG_variable), 975 Constant::getNullValue(Type::getInt32Ty(VMContext)), 976 getNonCompileUnitScope(Context), 977 MDString::get(VMContext, Name), 978 MDString::get(VMContext, Name), 979 MDString::get(VMContext, LinkageName), 980 F, 981 ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), 982 Ty, 983 ConstantInt::get(Type::getInt32Ty(VMContext), isLocalToUnit), 984 ConstantInt::get(Type::getInt32Ty(VMContext), 1), /* isDefinition*/ 985 Val, 986 DIDescriptor(Decl) 987 }; 988 MDNode *Node = MDNode::get(VMContext, Elts); 989 AllGVs.push_back(Node); 990 return DIGlobalVariable(Node); 991} 992 993/// createVariable - Create a new descriptor for the specified variable. 994DIVariable DIBuilder::createLocalVariable(unsigned Tag, DIDescriptor Scope, 995 StringRef Name, DIFile File, 996 unsigned LineNo, DIType Ty, 997 bool AlwaysPreserve, unsigned Flags, 998 unsigned ArgNo) { 999 DIDescriptor Context(getNonCompileUnitScope(Scope)); 1000 assert((!Context || Context.isScope()) && 1001 "createLocalVariable should be called with a valid Context"); 1002 assert(Ty.isType() && 1003 "createLocalVariable should be called with a valid type"); 1004 Value *Elts[] = { 1005 GetTagConstant(VMContext, Tag), 1006 getNonCompileUnitScope(Scope), 1007 MDString::get(VMContext, Name), 1008 File, 1009 ConstantInt::get(Type::getInt32Ty(VMContext), (LineNo | (ArgNo << 24))), 1010 Ty, 1011 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1012 Constant::getNullValue(Type::getInt32Ty(VMContext)) 1013 }; 1014 MDNode *Node = MDNode::get(VMContext, Elts); 1015 if (AlwaysPreserve) { 1016 // The optimizer may remove local variable. If there is an interest 1017 // to preserve variable info in such situation then stash it in a 1018 // named mdnode. 1019 DISubprogram Fn(getDISubprogram(Scope)); 1020 NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, Fn); 1021 FnLocals->addOperand(Node); 1022 } 1023 DIVariable RetVar(Node); 1024 assert(RetVar.isVariable() && 1025 "createLocalVariable should return a valid DIVariable"); 1026 return RetVar; 1027} 1028 1029/// createComplexVariable - Create a new descriptor for the specified variable 1030/// which has a complex address expression for its address. 1031DIVariable DIBuilder::createComplexVariable(unsigned Tag, DIDescriptor Scope, 1032 StringRef Name, DIFile F, 1033 unsigned LineNo, 1034 DIType Ty, ArrayRef<Value *> Addr, 1035 unsigned ArgNo) { 1036 SmallVector<Value *, 15> Elts; 1037 Elts.push_back(GetTagConstant(VMContext, Tag)); 1038 Elts.push_back(getNonCompileUnitScope(Scope)), 1039 Elts.push_back(MDString::get(VMContext, Name)); 1040 Elts.push_back(F); 1041 Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), 1042 (LineNo | (ArgNo << 24)))); 1043 Elts.push_back(Ty); 1044 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1045 Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); 1046 Elts.append(Addr.begin(), Addr.end()); 1047 1048 return DIVariable(MDNode::get(VMContext, Elts)); 1049} 1050 1051/// createFunction - Create a new descriptor for the specified function. 1052DISubprogram DIBuilder::createFunction(DIDescriptor Context, 1053 StringRef Name, 1054 StringRef LinkageName, 1055 DIFile File, unsigned LineNo, 1056 DICompositeType Ty, 1057 bool isLocalToUnit, bool isDefinition, 1058 unsigned ScopeLine, 1059 unsigned Flags, bool isOptimized, 1060 Function *Fn, 1061 MDNode *TParams, 1062 MDNode *Decl) { 1063 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 1064 "function types should be subroutines"); 1065 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 1066 Value *Elts[] = { 1067 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1068 File.getFileNode(), 1069 getNonCompileUnitScope(Context), 1070 MDString::get(VMContext, Name), 1071 MDString::get(VMContext, Name), 1072 MDString::get(VMContext, LinkageName), 1073 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 1074 Ty, 1075 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 1076 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 1077 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 1078 ConstantInt::get(Type::getInt32Ty(VMContext), 0), 1079 NULL, 1080 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1081 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1082 Fn, 1083 TParams, 1084 Decl, 1085 MDNode::getTemporary(VMContext, TElts), 1086 ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine) 1087 }; 1088 MDNode *Node = MDNode::get(VMContext, Elts); 1089 1090 // Create a named metadata so that we do not lose this mdnode. 1091 if (isDefinition) 1092 AllSubprograms.push_back(Node); 1093 DISubprogram S(Node); 1094 assert(S.isSubprogram() && "createFunction should return a valid DISubprogram"); 1095 return S; 1096} 1097 1098/// createMethod - Create a new descriptor for the specified C++ method. 1099DISubprogram DIBuilder::createMethod(DIDescriptor Context, 1100 StringRef Name, 1101 StringRef LinkageName, 1102 DIFile F, 1103 unsigned LineNo, DICompositeType Ty, 1104 bool isLocalToUnit, 1105 bool isDefinition, 1106 unsigned VK, unsigned VIndex, 1107 MDNode *VTableHolder, 1108 unsigned Flags, 1109 bool isOptimized, 1110 Function *Fn, 1111 MDNode *TParam) { 1112 assert(Ty.getTag() == dwarf::DW_TAG_subroutine_type && 1113 "function types should be subroutines"); 1114 Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; 1115 Value *Elts[] = { 1116 GetTagConstant(VMContext, dwarf::DW_TAG_subprogram), 1117 F.getFileNode(), 1118 getNonCompileUnitScope(Context), 1119 MDString::get(VMContext, Name), 1120 MDString::get(VMContext, Name), 1121 MDString::get(VMContext, LinkageName), 1122 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), 1123 Ty, 1124 ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), 1125 ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), 1126 ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), 1127 ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), 1128 VTableHolder, 1129 ConstantInt::get(Type::getInt32Ty(VMContext), Flags), 1130 ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), 1131 Fn, 1132 TParam, 1133 Constant::getNullValue(Type::getInt32Ty(VMContext)), 1134 MDNode::getTemporary(VMContext, TElts), 1135 // FIXME: Do we want to use different scope/lines? 1136 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1137 }; 1138 MDNode *Node = MDNode::get(VMContext, Elts); 1139 if (isDefinition) 1140 AllSubprograms.push_back(Node); 1141 DISubprogram S(Node); 1142 assert(S.isSubprogram() && "createMethod should return a valid DISubprogram"); 1143 return S; 1144} 1145 1146/// createNameSpace - This creates new descriptor for a namespace 1147/// with the specified parent scope. 1148DINameSpace DIBuilder::createNameSpace(DIDescriptor Scope, StringRef Name, 1149 DIFile File, unsigned LineNo) { 1150 Value *Elts[] = { 1151 GetTagConstant(VMContext, dwarf::DW_TAG_namespace), 1152 File.getFileNode(), 1153 getNonCompileUnitScope(Scope), 1154 MDString::get(VMContext, Name), 1155 ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) 1156 }; 1157 DINameSpace R(MDNode::get(VMContext, Elts)); 1158 assert(R.Verify() && 1159 "createNameSpace should return a verifiable DINameSpace"); 1160 return R; 1161} 1162 1163/// createLexicalBlockFile - This creates a new MDNode that encapsulates 1164/// an existing scope with a new filename. 1165DILexicalBlockFile DIBuilder::createLexicalBlockFile(DIDescriptor Scope, 1166 DIFile File) { 1167 Value *Elts[] = { 1168 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 1169 File.getFileNode(), 1170 Scope 1171 }; 1172 DILexicalBlockFile R(MDNode::get(VMContext, Elts)); 1173 assert( 1174 R.Verify() && 1175 "createLexicalBlockFile should return a verifiable DILexicalBlockFile"); 1176 return R; 1177} 1178 1179DILexicalBlock DIBuilder::createLexicalBlock(DIDescriptor Scope, DIFile File, 1180 unsigned Line, unsigned Col) { 1181 // Defeat MDNode uniquing for lexical blocks by using unique id. 1182 static unsigned int unique_id = 0; 1183 Value *Elts[] = { 1184 GetTagConstant(VMContext, dwarf::DW_TAG_lexical_block), 1185 File.getFileNode(), 1186 getNonCompileUnitScope(Scope), 1187 ConstantInt::get(Type::getInt32Ty(VMContext), Line), 1188 ConstantInt::get(Type::getInt32Ty(VMContext), Col), 1189 ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) 1190 }; 1191 DILexicalBlock R(MDNode::get(VMContext, Elts)); 1192 assert(R.Verify() && 1193 "createLexicalBlock should return a verifiable DILexicalBlock"); 1194 return R; 1195} 1196 1197/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 1198Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1199 Instruction *InsertBefore) { 1200 assert(Storage && "no storage passed to dbg.declare"); 1201 assert(VarInfo.isVariable() && 1202 "empty or invalid DIVariable passed to dbg.declare"); 1203 if (!DeclareFn) 1204 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1205 1206 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1207 return CallInst::Create(DeclareFn, Args, "", InsertBefore); 1208} 1209 1210/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call. 1211Instruction *DIBuilder::insertDeclare(Value *Storage, DIVariable VarInfo, 1212 BasicBlock *InsertAtEnd) { 1213 assert(Storage && "no storage passed to dbg.declare"); 1214 assert(VarInfo.isVariable() && 1215 "empty or invalid DIVariable passed to dbg.declare"); 1216 if (!DeclareFn) 1217 DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); 1218 1219 Value *Args[] = { MDNode::get(Storage->getContext(), Storage), VarInfo }; 1220 1221 // If this block already has a terminator then insert this intrinsic 1222 // before the terminator. 1223 if (TerminatorInst *T = InsertAtEnd->getTerminator()) 1224 return CallInst::Create(DeclareFn, Args, "", T); 1225 else 1226 return CallInst::Create(DeclareFn, Args, "", InsertAtEnd); 1227} 1228 1229/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 1230Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1231 DIVariable VarInfo, 1232 Instruction *InsertBefore) { 1233 assert(V && "no value passed to dbg.value"); 1234 assert(VarInfo.isVariable() && 1235 "empty or invalid DIVariable passed to dbg.value"); 1236 if (!ValueFn) 1237 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1238 1239 Value *Args[] = { MDNode::get(V->getContext(), V), 1240 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1241 VarInfo }; 1242 return CallInst::Create(ValueFn, Args, "", InsertBefore); 1243} 1244 1245/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. 1246Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset, 1247 DIVariable VarInfo, 1248 BasicBlock *InsertAtEnd) { 1249 assert(V && "no value passed to dbg.value"); 1250 assert(VarInfo.isVariable() && 1251 "empty or invalid DIVariable passed to dbg.value"); 1252 if (!ValueFn) 1253 ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); 1254 1255 Value *Args[] = { MDNode::get(V->getContext(), V), 1256 ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), 1257 VarInfo }; 1258 return CallInst::Create(ValueFn, Args, "", InsertAtEnd); 1259} 1260