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