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