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