1 //===--- DIBuilder.cpp - Debug Information Builder ------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the DIBuilder. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/IR/DIBuilder.h" 14 #include "LLVMContextImpl.h" 15 #include "llvm/ADT/APInt.h" 16 #include "llvm/ADT/APSInt.h" 17 #include "llvm/BinaryFormat/Dwarf.h" 18 #include "llvm/IR/Constants.h" 19 #include "llvm/IR/DebugInfo.h" 20 #include "llvm/IR/IRBuilder.h" 21 #include "llvm/IR/Module.h" 22 #include <optional> 23 24 using namespace llvm; 25 using namespace llvm::dwarf; 26 27 DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes, DICompileUnit *CU) 28 : M(m), VMContext(M.getContext()), CUNode(CU), 29 AllowUnresolvedNodes(AllowUnresolvedNodes) { 30 if (CUNode) { 31 if (const auto &ETs = CUNode->getEnumTypes()) 32 AllEnumTypes.assign(ETs.begin(), ETs.end()); 33 if (const auto &RTs = CUNode->getRetainedTypes()) 34 AllRetainTypes.assign(RTs.begin(), RTs.end()); 35 if (const auto &GVs = CUNode->getGlobalVariables()) 36 AllGVs.assign(GVs.begin(), GVs.end()); 37 if (const auto &IMs = CUNode->getImportedEntities()) 38 ImportedModules.assign(IMs.begin(), IMs.end()); 39 if (const auto &MNs = CUNode->getMacros()) 40 AllMacrosPerParent.insert({nullptr, {llvm::from_range, MNs}}); 41 } 42 } 43 44 void DIBuilder::trackIfUnresolved(MDNode *N) { 45 if (!N) 46 return; 47 if (N->isResolved()) 48 return; 49 50 assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes"); 51 UnresolvedNodes.emplace_back(N); 52 } 53 54 void DIBuilder::finalizeSubprogram(DISubprogram *SP) { 55 auto PN = SubprogramTrackedNodes.find(SP); 56 if (PN != SubprogramTrackedNodes.end()) 57 SP->replaceRetainedNodes( 58 MDTuple::get(VMContext, SmallVector<Metadata *, 16>(PN->second.begin(), 59 PN->second.end()))); 60 } 61 62 void DIBuilder::finalize() { 63 if (!CUNode) { 64 assert(!AllowUnresolvedNodes && 65 "creating type nodes without a CU is not supported"); 66 return; 67 } 68 69 if (!AllEnumTypes.empty()) 70 CUNode->replaceEnumTypes(MDTuple::get( 71 VMContext, SmallVector<Metadata *, 16>(AllEnumTypes.begin(), 72 AllEnumTypes.end()))); 73 74 SmallVector<Metadata *, 16> RetainValues; 75 // Declarations and definitions of the same type may be retained. Some 76 // clients RAUW these pairs, leaving duplicates in the retained types 77 // list. Use a set to remove the duplicates while we transform the 78 // TrackingVHs back into Values. 79 SmallPtrSet<Metadata *, 16> RetainSet; 80 for (const TrackingMDNodeRef &N : AllRetainTypes) 81 if (RetainSet.insert(N).second) 82 RetainValues.push_back(N); 83 84 if (!RetainValues.empty()) 85 CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues)); 86 87 for (auto *SP : AllSubprograms) 88 finalizeSubprogram(SP); 89 for (auto *N : RetainValues) 90 if (auto *SP = dyn_cast<DISubprogram>(N)) 91 finalizeSubprogram(SP); 92 93 if (!AllGVs.empty()) 94 CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs)); 95 96 if (!ImportedModules.empty()) 97 CUNode->replaceImportedEntities(MDTuple::get( 98 VMContext, SmallVector<Metadata *, 16>(ImportedModules.begin(), 99 ImportedModules.end()))); 100 101 for (const auto &I : AllMacrosPerParent) { 102 // DIMacroNode's with nullptr parent are DICompileUnit direct children. 103 if (!I.first) { 104 CUNode->replaceMacros(MDTuple::get(VMContext, I.second.getArrayRef())); 105 continue; 106 } 107 // Otherwise, it must be a temporary DIMacroFile that need to be resolved. 108 auto *TMF = cast<DIMacroFile>(I.first); 109 auto *MF = DIMacroFile::get(VMContext, dwarf::DW_MACINFO_start_file, 110 TMF->getLine(), TMF->getFile(), 111 getOrCreateMacroArray(I.second.getArrayRef())); 112 replaceTemporary(llvm::TempDIMacroNode(TMF), MF); 113 } 114 115 // Now that all temp nodes have been replaced or deleted, resolve remaining 116 // cycles. 117 for (const auto &N : UnresolvedNodes) 118 if (N && !N->isResolved()) 119 N->resolveCycles(); 120 UnresolvedNodes.clear(); 121 122 // Can't handle unresolved nodes anymore. 123 AllowUnresolvedNodes = false; 124 } 125 126 /// If N is compile unit return NULL otherwise return N. 127 static DIScope *getNonCompileUnitScope(DIScope *N) { 128 if (!N || isa<DICompileUnit>(N)) 129 return nullptr; 130 return cast<DIScope>(N); 131 } 132 133 DICompileUnit *DIBuilder::createCompileUnit( 134 unsigned Lang, DIFile *File, StringRef Producer, bool isOptimized, 135 StringRef Flags, unsigned RunTimeVer, StringRef SplitName, 136 DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId, 137 bool SplitDebugInlining, bool DebugInfoForProfiling, 138 DICompileUnit::DebugNameTableKind NameTableKind, bool RangesBaseAddress, 139 StringRef SysRoot, StringRef SDK) { 140 141 assert(((Lang <= dwarf::DW_LANG_Metal && Lang >= dwarf::DW_LANG_C89) || 142 (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && 143 "Invalid Language tag"); 144 145 assert(!CUNode && "Can only make one compile unit per DIBuilder instance"); 146 CUNode = DICompileUnit::getDistinct( 147 VMContext, Lang, File, Producer, isOptimized, Flags, RunTimeVer, 148 SplitName, Kind, nullptr, nullptr, nullptr, nullptr, nullptr, DWOId, 149 SplitDebugInlining, DebugInfoForProfiling, NameTableKind, 150 RangesBaseAddress, SysRoot, SDK); 151 152 // Create a named metadata so that it is easier to find cu in a module. 153 NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); 154 NMD->addOperand(CUNode); 155 trackIfUnresolved(CUNode); 156 return CUNode; 157 } 158 159 static DIImportedEntity * 160 createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, 161 Metadata *NS, DIFile *File, unsigned Line, StringRef Name, 162 DINodeArray Elements, 163 SmallVectorImpl<TrackingMDNodeRef> &ImportedModules) { 164 if (Line) 165 assert(File && "Source location has line number but no file"); 166 unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size(); 167 auto *M = DIImportedEntity::get(C, Tag, Context, cast_or_null<DINode>(NS), 168 File, Line, Name, Elements); 169 if (EntitiesCount < C.pImpl->DIImportedEntitys.size()) 170 // A new Imported Entity was just added to the context. 171 // Add it to the Imported Modules list. 172 ImportedModules.emplace_back(M); 173 return M; 174 } 175 176 DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, 177 DINamespace *NS, DIFile *File, 178 unsigned Line, 179 DINodeArray Elements) { 180 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module, 181 Context, NS, File, Line, StringRef(), Elements, 182 getImportTrackingVector(Context)); 183 } 184 185 DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, 186 DIImportedEntity *NS, 187 DIFile *File, unsigned Line, 188 DINodeArray Elements) { 189 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module, 190 Context, NS, File, Line, StringRef(), Elements, 191 getImportTrackingVector(Context)); 192 } 193 194 DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M, 195 DIFile *File, unsigned Line, 196 DINodeArray Elements) { 197 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module, 198 Context, M, File, Line, StringRef(), Elements, 199 getImportTrackingVector(Context)); 200 } 201 202 DIImportedEntity * 203 DIBuilder::createImportedDeclaration(DIScope *Context, DINode *Decl, 204 DIFile *File, unsigned Line, 205 StringRef Name, DINodeArray Elements) { 206 // Make sure to use the unique identifier based metadata reference for 207 // types that have one. 208 return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration, 209 Context, Decl, File, Line, Name, Elements, 210 getImportTrackingVector(Context)); 211 } 212 213 DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory, 214 std::optional<DIFile::ChecksumInfo<StringRef>> CS, 215 std::optional<StringRef> Source) { 216 return DIFile::get(VMContext, Filename, Directory, CS, Source); 217 } 218 219 DIMacro *DIBuilder::createMacro(DIMacroFile *Parent, unsigned LineNumber, 220 unsigned MacroType, StringRef Name, 221 StringRef Value) { 222 assert(!Name.empty() && "Unable to create macro without name"); 223 assert((MacroType == dwarf::DW_MACINFO_undef || 224 MacroType == dwarf::DW_MACINFO_define) && 225 "Unexpected macro type"); 226 auto *M = DIMacro::get(VMContext, MacroType, LineNumber, Name, Value); 227 AllMacrosPerParent[Parent].insert(M); 228 return M; 229 } 230 231 DIMacroFile *DIBuilder::createTempMacroFile(DIMacroFile *Parent, 232 unsigned LineNumber, DIFile *File) { 233 auto *MF = DIMacroFile::getTemporary(VMContext, dwarf::DW_MACINFO_start_file, 234 LineNumber, File, DIMacroNodeArray()) 235 .release(); 236 AllMacrosPerParent[Parent].insert(MF); 237 // Add the new temporary DIMacroFile to the macro per parent map as a parent. 238 // This is needed to assure DIMacroFile with no children to have an entry in 239 // the map. Otherwise, it will not be resolved in DIBuilder::finalize(). 240 AllMacrosPerParent.insert({MF, {}}); 241 return MF; 242 } 243 244 DIEnumerator *DIBuilder::createEnumerator(StringRef Name, uint64_t Val, 245 bool IsUnsigned) { 246 assert(!Name.empty() && "Unable to create enumerator without name"); 247 return DIEnumerator::get(VMContext, APInt(64, Val, !IsUnsigned), IsUnsigned, 248 Name); 249 } 250 251 DIEnumerator *DIBuilder::createEnumerator(StringRef Name, const APSInt &Value) { 252 assert(!Name.empty() && "Unable to create enumerator without name"); 253 return DIEnumerator::get(VMContext, APInt(Value), Value.isUnsigned(), Name); 254 } 255 256 DIBasicType *DIBuilder::createUnspecifiedType(StringRef Name) { 257 assert(!Name.empty() && "Unable to create type without name"); 258 return DIBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name); 259 } 260 261 DIBasicType *DIBuilder::createNullPtrType() { 262 return createUnspecifiedType("decltype(nullptr)"); 263 } 264 265 DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits, 266 unsigned Encoding, 267 DINode::DIFlags Flags, 268 uint32_t NumExtraInhabitants) { 269 assert(!Name.empty() && "Unable to create type without name"); 270 return DIBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits, 271 0, Encoding, NumExtraInhabitants, Flags); 272 } 273 274 DIFixedPointType * 275 DIBuilder::createBinaryFixedPointType(StringRef Name, uint64_t SizeInBits, 276 uint32_t AlignInBits, unsigned Encoding, 277 DINode::DIFlags Flags, int Factor) { 278 return DIFixedPointType::get(VMContext, dwarf::DW_TAG_base_type, Name, 279 SizeInBits, AlignInBits, Encoding, Flags, 280 DIFixedPointType::FixedPointBinary, Factor, 281 APInt(), APInt()); 282 } 283 284 DIFixedPointType * 285 DIBuilder::createDecimalFixedPointType(StringRef Name, uint64_t SizeInBits, 286 uint32_t AlignInBits, unsigned Encoding, 287 DINode::DIFlags Flags, int Factor) { 288 return DIFixedPointType::get(VMContext, dwarf::DW_TAG_base_type, Name, 289 SizeInBits, AlignInBits, Encoding, Flags, 290 DIFixedPointType::FixedPointDecimal, Factor, 291 APInt(), APInt()); 292 } 293 294 DIFixedPointType * 295 DIBuilder::createRationalFixedPointType(StringRef Name, uint64_t SizeInBits, 296 uint32_t AlignInBits, unsigned Encoding, 297 DINode::DIFlags Flags, APInt Numerator, 298 APInt Denominator) { 299 return DIFixedPointType::get(VMContext, dwarf::DW_TAG_base_type, Name, 300 SizeInBits, AlignInBits, Encoding, Flags, 301 DIFixedPointType::FixedPointRational, 0, 302 Numerator, Denominator); 303 } 304 305 DIStringType *DIBuilder::createStringType(StringRef Name, uint64_t SizeInBits) { 306 assert(!Name.empty() && "Unable to create type without name"); 307 return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name, 308 SizeInBits, 0); 309 } 310 311 DIStringType *DIBuilder::createStringType(StringRef Name, 312 DIVariable *StringLength, 313 DIExpression *StrLocationExp) { 314 assert(!Name.empty() && "Unable to create type without name"); 315 return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name, 316 StringLength, nullptr, StrLocationExp, 0, 0, 0); 317 } 318 319 DIStringType *DIBuilder::createStringType(StringRef Name, 320 DIExpression *StringLengthExp, 321 DIExpression *StrLocationExp) { 322 assert(!Name.empty() && "Unable to create type without name"); 323 return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name, nullptr, 324 StringLengthExp, StrLocationExp, 0, 0, 0); 325 } 326 327 DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType *FromTy) { 328 return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, FromTy, 329 (uint64_t)0, 0, (uint64_t)0, std::nullopt, 330 std::nullopt, DINode::FlagZero); 331 } 332 333 DIDerivedType *DIBuilder::createPtrAuthQualifiedType( 334 DIType *FromTy, unsigned Key, bool IsAddressDiscriminated, 335 unsigned ExtraDiscriminator, bool IsaPointer, 336 bool AuthenticatesNullValues) { 337 return DIDerivedType::get( 338 VMContext, dwarf::DW_TAG_LLVM_ptrauth_type, "", nullptr, 0, nullptr, 339 FromTy, (uint64_t)0, 0, (uint64_t)0, std::nullopt, 340 std::optional<DIDerivedType::PtrAuthData>( 341 std::in_place, Key, IsAddressDiscriminated, ExtraDiscriminator, 342 IsaPointer, AuthenticatesNullValues), 343 DINode::FlagZero); 344 } 345 346 DIDerivedType * 347 DIBuilder::createPointerType(DIType *PointeeTy, uint64_t SizeInBits, 348 uint32_t AlignInBits, 349 std::optional<unsigned> DWARFAddressSpace, 350 StringRef Name, DINodeArray Annotations) { 351 // FIXME: Why is there a name here? 352 return DIDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name, 353 nullptr, 0, nullptr, PointeeTy, SizeInBits, 354 AlignInBits, 0, DWARFAddressSpace, std::nullopt, 355 DINode::FlagZero, nullptr, Annotations); 356 } 357 358 DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy, 359 DIType *Base, 360 uint64_t SizeInBits, 361 uint32_t AlignInBits, 362 DINode::DIFlags Flags) { 363 return DIDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "", 364 nullptr, 0, nullptr, PointeeTy, SizeInBits, 365 AlignInBits, 0, std::nullopt, std::nullopt, Flags, 366 Base); 367 } 368 369 DIDerivedType * 370 DIBuilder::createReferenceType(unsigned Tag, DIType *RTy, uint64_t SizeInBits, 371 uint32_t AlignInBits, 372 std::optional<unsigned> DWARFAddressSpace) { 373 assert(RTy && "Unable to create reference type"); 374 return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, RTy, 375 SizeInBits, AlignInBits, 0, DWARFAddressSpace, {}, 376 DINode::FlagZero); 377 } 378 379 DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name, 380 DIFile *File, unsigned LineNo, 381 DIScope *Context, uint32_t AlignInBits, 382 DINode::DIFlags Flags, 383 DINodeArray Annotations) { 384 return DIDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name, File, 385 LineNo, getNonCompileUnitScope(Context), Ty, 386 (uint64_t)0, AlignInBits, (uint64_t)0, std::nullopt, 387 std::nullopt, Flags, nullptr, Annotations); 388 } 389 390 DIDerivedType * 391 DIBuilder::createTemplateAlias(DIType *Ty, StringRef Name, DIFile *File, 392 unsigned LineNo, DIScope *Context, 393 DINodeArray TParams, uint32_t AlignInBits, 394 DINode::DIFlags Flags, DINodeArray Annotations) { 395 return DIDerivedType::get(VMContext, dwarf::DW_TAG_template_alias, Name, File, 396 LineNo, getNonCompileUnitScope(Context), Ty, 397 (uint64_t)0, AlignInBits, (uint64_t)0, std::nullopt, 398 std::nullopt, Flags, TParams.get(), Annotations); 399 } 400 401 DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) { 402 assert(Ty && "Invalid type!"); 403 assert(FriendTy && "Invalid friend type!"); 404 return DIDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0, Ty, 405 FriendTy, (uint64_t)0, 0, (uint64_t)0, std::nullopt, 406 std::nullopt, DINode::FlagZero); 407 } 408 409 DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy, 410 uint64_t BaseOffset, 411 uint32_t VBPtrOffset, 412 DINode::DIFlags Flags) { 413 assert(Ty && "Unable to create inheritance"); 414 Metadata *ExtraData = ConstantAsMetadata::get( 415 ConstantInt::get(IntegerType::get(VMContext, 32), VBPtrOffset)); 416 return DIDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr, 417 0, Ty, BaseTy, 0, 0, BaseOffset, std::nullopt, 418 std::nullopt, Flags, ExtraData); 419 } 420 421 DIDerivedType *DIBuilder::createMemberType( 422 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 423 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, 424 DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { 425 return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File, 426 LineNumber, getNonCompileUnitScope(Scope), Ty, 427 SizeInBits, AlignInBits, OffsetInBits, std::nullopt, 428 std::nullopt, Flags, nullptr, Annotations); 429 } 430 431 DIDerivedType *DIBuilder::createMemberType( 432 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 433 Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, 434 DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { 435 return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File, 436 LineNumber, getNonCompileUnitScope(Scope), Ty, 437 SizeInBits, AlignInBits, OffsetInBits, std::nullopt, 438 std::nullopt, Flags, nullptr, Annotations); 439 } 440 441 static ConstantAsMetadata *getConstantOrNull(Constant *C) { 442 if (C) 443 return ConstantAsMetadata::get(C); 444 return nullptr; 445 } 446 447 DIDerivedType *DIBuilder::createVariantMemberType( 448 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 449 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, 450 Constant *Discriminant, DINode::DIFlags Flags, DIType *Ty) { 451 // "ExtraData" is overloaded for bit fields and for variants, so 452 // make sure to disallow this. 453 assert((Flags & DINode::FlagBitField) == 0); 454 return DIDerivedType::get( 455 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber, 456 getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits, OffsetInBits, 457 std::nullopt, std::nullopt, Flags, getConstantOrNull(Discriminant)); 458 } 459 460 DIDerivedType *DIBuilder::createVariantMemberType(DIScope *Scope, 461 DINodeArray Elements, 462 Constant *Discriminant, 463 DIType *Ty) { 464 auto *V = DICompositeType::get(VMContext, dwarf::DW_TAG_variant, {}, nullptr, 465 0, getNonCompileUnitScope(Scope), {}, 466 (uint64_t)0, 0, (uint64_t)0, DINode::FlagZero, 467 Elements, 0, {}, nullptr); 468 469 trackIfUnresolved(V); 470 return createVariantMemberType(Scope, {}, nullptr, 0, 0, 0, 0, Discriminant, 471 DINode::FlagZero, V); 472 } 473 474 DIDerivedType *DIBuilder::createBitFieldMemberType( 475 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 476 Metadata *SizeInBits, Metadata *OffsetInBits, uint64_t StorageOffsetInBits, 477 DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { 478 Flags |= DINode::FlagBitField; 479 return DIDerivedType::get( 480 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber, 481 getNonCompileUnitScope(Scope), Ty, SizeInBits, /*AlignInBits=*/0, 482 OffsetInBits, std::nullopt, std::nullopt, Flags, 483 ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext, 64), 484 StorageOffsetInBits)), 485 Annotations); 486 } 487 488 DIDerivedType *DIBuilder::createBitFieldMemberType( 489 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 490 uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, 491 DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { 492 Flags |= DINode::FlagBitField; 493 return DIDerivedType::get( 494 VMContext, dwarf::DW_TAG_member, Name, File, LineNumber, 495 getNonCompileUnitScope(Scope), Ty, SizeInBits, /*AlignInBits=*/0, 496 OffsetInBits, std::nullopt, std::nullopt, Flags, 497 ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext, 64), 498 StorageOffsetInBits)), 499 Annotations); 500 } 501 502 DIDerivedType * 503 DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name, DIFile *File, 504 unsigned LineNumber, DIType *Ty, 505 DINode::DIFlags Flags, llvm::Constant *Val, 506 unsigned Tag, uint32_t AlignInBits) { 507 Flags |= DINode::FlagStaticMember; 508 return DIDerivedType::get(VMContext, Tag, Name, File, LineNumber, 509 getNonCompileUnitScope(Scope), Ty, (uint64_t)0, 510 AlignInBits, (uint64_t)0, std::nullopt, 511 std::nullopt, Flags, getConstantOrNull(Val)); 512 } 513 514 DIDerivedType * 515 DIBuilder::createObjCIVar(StringRef Name, DIFile *File, unsigned LineNumber, 516 uint64_t SizeInBits, uint32_t AlignInBits, 517 uint64_t OffsetInBits, DINode::DIFlags Flags, 518 DIType *Ty, MDNode *PropertyNode) { 519 return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File, 520 LineNumber, getNonCompileUnitScope(File), Ty, 521 SizeInBits, AlignInBits, OffsetInBits, std::nullopt, 522 std::nullopt, Flags, PropertyNode); 523 } 524 525 DIObjCProperty * 526 DIBuilder::createObjCProperty(StringRef Name, DIFile *File, unsigned LineNumber, 527 StringRef GetterName, StringRef SetterName, 528 unsigned PropertyAttributes, DIType *Ty) { 529 return DIObjCProperty::get(VMContext, Name, File, LineNumber, GetterName, 530 SetterName, PropertyAttributes, Ty); 531 } 532 533 DITemplateTypeParameter * 534 DIBuilder::createTemplateTypeParameter(DIScope *Context, StringRef Name, 535 DIType *Ty, bool isDefault) { 536 assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit"); 537 return DITemplateTypeParameter::get(VMContext, Name, Ty, isDefault); 538 } 539 540 static DITemplateValueParameter * 541 createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag, 542 DIScope *Context, StringRef Name, DIType *Ty, 543 bool IsDefault, Metadata *MD) { 544 assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit"); 545 return DITemplateValueParameter::get(VMContext, Tag, Name, Ty, IsDefault, MD); 546 } 547 548 DITemplateValueParameter * 549 DIBuilder::createTemplateValueParameter(DIScope *Context, StringRef Name, 550 DIType *Ty, bool isDefault, 551 Constant *Val) { 552 return createTemplateValueParameterHelper( 553 VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty, 554 isDefault, getConstantOrNull(Val)); 555 } 556 557 DITemplateValueParameter * 558 DIBuilder::createTemplateTemplateParameter(DIScope *Context, StringRef Name, 559 DIType *Ty, StringRef Val, 560 bool IsDefault) { 561 return createTemplateValueParameterHelper( 562 VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty, 563 IsDefault, MDString::get(VMContext, Val)); 564 } 565 566 DITemplateValueParameter * 567 DIBuilder::createTemplateParameterPack(DIScope *Context, StringRef Name, 568 DIType *Ty, DINodeArray Val) { 569 return createTemplateValueParameterHelper( 570 VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty, 571 false, Val.get()); 572 } 573 574 DICompositeType *DIBuilder::createClassType( 575 DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber, 576 uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, 577 DINode::DIFlags Flags, DIType *DerivedFrom, DINodeArray Elements, 578 unsigned RunTimeLang, DIType *VTableHolder, MDNode *TemplateParams, 579 StringRef UniqueIdentifier) { 580 assert((!Context || isa<DIScope>(Context)) && 581 "createClassType should be called with a valid Context"); 582 583 auto *R = DICompositeType::get( 584 VMContext, dwarf::DW_TAG_class_type, Name, File, LineNumber, 585 getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 586 OffsetInBits, Flags, Elements, RunTimeLang, /*EnumKind=*/std::nullopt, 587 VTableHolder, cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier); 588 trackIfUnresolved(R); 589 return R; 590 } 591 592 DICompositeType *DIBuilder::createStructType( 593 DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber, 594 Metadata *SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags, 595 DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang, 596 DIType *VTableHolder, StringRef UniqueIdentifier, DIType *Specification, 597 uint32_t NumExtraInhabitants) { 598 auto *R = DICompositeType::get( 599 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber, 600 getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0, 601 Flags, Elements, RunTimeLang, /*EnumKind=*/std::nullopt, VTableHolder, 602 nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, nullptr, nullptr, 603 nullptr, Specification, NumExtraInhabitants); 604 trackIfUnresolved(R); 605 return R; 606 } 607 608 DICompositeType *DIBuilder::createStructType( 609 DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber, 610 uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags, 611 DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang, 612 DIType *VTableHolder, StringRef UniqueIdentifier, DIType *Specification, 613 uint32_t NumExtraInhabitants) { 614 auto *R = DICompositeType::get( 615 VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber, 616 getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0, 617 Flags, Elements, RunTimeLang, /*EnumKind=*/std::nullopt, VTableHolder, 618 nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, nullptr, nullptr, 619 nullptr, Specification, NumExtraInhabitants); 620 trackIfUnresolved(R); 621 return R; 622 } 623 624 DICompositeType *DIBuilder::createUnionType( 625 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 626 uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags, 627 DINodeArray Elements, unsigned RunTimeLang, StringRef UniqueIdentifier) { 628 auto *R = DICompositeType::get( 629 VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber, 630 getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags, 631 Elements, RunTimeLang, /*EnumKind=*/std::nullopt, nullptr, nullptr, 632 UniqueIdentifier); 633 trackIfUnresolved(R); 634 return R; 635 } 636 637 DICompositeType * 638 DIBuilder::createVariantPart(DIScope *Scope, StringRef Name, DIFile *File, 639 unsigned LineNumber, uint64_t SizeInBits, 640 uint32_t AlignInBits, DINode::DIFlags Flags, 641 DIDerivedType *Discriminator, DINodeArray Elements, 642 StringRef UniqueIdentifier) { 643 auto *R = DICompositeType::get( 644 VMContext, dwarf::DW_TAG_variant_part, Name, File, LineNumber, 645 getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags, 646 Elements, 0, /*EnumKind=*/std::nullopt, nullptr, nullptr, 647 UniqueIdentifier, Discriminator); 648 trackIfUnresolved(R); 649 return R; 650 } 651 652 DISubroutineType *DIBuilder::createSubroutineType(DITypeRefArray ParameterTypes, 653 DINode::DIFlags Flags, 654 unsigned CC) { 655 return DISubroutineType::get(VMContext, Flags, CC, ParameterTypes); 656 } 657 658 DICompositeType *DIBuilder::createEnumerationType( 659 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 660 uint64_t SizeInBits, uint32_t AlignInBits, DINodeArray Elements, 661 DIType *UnderlyingType, unsigned RunTimeLang, StringRef UniqueIdentifier, 662 bool IsScoped, std::optional<uint32_t> EnumKind) { 663 auto *CTy = DICompositeType::get( 664 VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber, 665 getNonCompileUnitScope(Scope), UnderlyingType, SizeInBits, AlignInBits, 0, 666 IsScoped ? DINode::FlagEnumClass : DINode::FlagZero, Elements, 667 RunTimeLang, EnumKind, nullptr, nullptr, UniqueIdentifier); 668 AllEnumTypes.emplace_back(CTy); 669 trackIfUnresolved(CTy); 670 return CTy; 671 } 672 673 DIDerivedType *DIBuilder::createSetType(DIScope *Scope, StringRef Name, 674 DIFile *File, unsigned LineNo, 675 uint64_t SizeInBits, 676 uint32_t AlignInBits, DIType *Ty) { 677 auto *R = DIDerivedType::get(VMContext, dwarf::DW_TAG_set_type, Name, File, 678 LineNo, getNonCompileUnitScope(Scope), Ty, 679 SizeInBits, AlignInBits, 0, std::nullopt, 680 std::nullopt, DINode::FlagZero); 681 trackIfUnresolved(R); 682 return R; 683 } 684 685 DICompositeType * 686 DIBuilder::createArrayType(uint64_t Size, uint32_t AlignInBits, DIType *Ty, 687 DINodeArray Subscripts, 688 PointerUnion<DIExpression *, DIVariable *> DL, 689 PointerUnion<DIExpression *, DIVariable *> AS, 690 PointerUnion<DIExpression *, DIVariable *> AL, 691 PointerUnion<DIExpression *, DIVariable *> RK) { 692 return createArrayType(nullptr, StringRef(), nullptr, 0, Size, AlignInBits, 693 Ty, Subscripts, DL, AS, AL, RK); 694 } 695 696 DICompositeType *DIBuilder::createArrayType( 697 DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber, 698 uint64_t Size, uint32_t AlignInBits, DIType *Ty, DINodeArray Subscripts, 699 PointerUnion<DIExpression *, DIVariable *> DL, 700 PointerUnion<DIExpression *, DIVariable *> AS, 701 PointerUnion<DIExpression *, DIVariable *> AL, 702 PointerUnion<DIExpression *, DIVariable *> RK, Metadata *BitStride) { 703 auto *R = DICompositeType::get( 704 VMContext, dwarf::DW_TAG_array_type, Name, File, LineNumber, 705 getNonCompileUnitScope(Scope), Ty, Size, AlignInBits, 0, DINode::FlagZero, 706 Subscripts, 0, /*EnumKind=*/std::nullopt, nullptr, nullptr, "", nullptr, 707 isa<DIExpression *>(DL) ? (Metadata *)cast<DIExpression *>(DL) 708 : (Metadata *)cast<DIVariable *>(DL), 709 isa<DIExpression *>(AS) ? (Metadata *)cast<DIExpression *>(AS) 710 : (Metadata *)cast<DIVariable *>(AS), 711 isa<DIExpression *>(AL) ? (Metadata *)cast<DIExpression *>(AL) 712 : (Metadata *)cast<DIVariable *>(AL), 713 isa<DIExpression *>(RK) ? (Metadata *)cast<DIExpression *>(RK) 714 : (Metadata *)cast<DIVariable *>(RK), 715 nullptr, nullptr, 0, BitStride); 716 trackIfUnresolved(R); 717 return R; 718 } 719 720 DICompositeType *DIBuilder::createVectorType(uint64_t Size, 721 uint32_t AlignInBits, DIType *Ty, 722 DINodeArray Subscripts) { 723 auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "", 724 nullptr, 0, nullptr, Ty, Size, AlignInBits, 0, 725 DINode::FlagVector, Subscripts, 0, 726 /*EnumKind=*/std::nullopt, nullptr); 727 trackIfUnresolved(R); 728 return R; 729 } 730 731 DISubprogram *DIBuilder::createArtificialSubprogram(DISubprogram *SP) { 732 auto NewSP = SP->cloneWithFlags(SP->getFlags() | DINode::FlagArtificial); 733 return MDNode::replaceWithDistinct(std::move(NewSP)); 734 } 735 736 static DIType *createTypeWithFlags(const DIType *Ty, 737 DINode::DIFlags FlagsToSet) { 738 auto NewTy = Ty->cloneWithFlags(Ty->getFlags() | FlagsToSet); 739 return MDNode::replaceWithUniqued(std::move(NewTy)); 740 } 741 742 DIType *DIBuilder::createArtificialType(DIType *Ty) { 743 // FIXME: Restrict this to the nodes where it's valid. 744 if (Ty->isArtificial()) 745 return Ty; 746 return createTypeWithFlags(Ty, DINode::FlagArtificial); 747 } 748 749 DIType *DIBuilder::createObjectPointerType(DIType *Ty, bool Implicit) { 750 // FIXME: Restrict this to the nodes where it's valid. 751 if (Ty->isObjectPointer()) 752 return Ty; 753 DINode::DIFlags Flags = DINode::FlagObjectPointer; 754 755 if (Implicit) 756 Flags |= DINode::FlagArtificial; 757 758 return createTypeWithFlags(Ty, Flags); 759 } 760 761 void DIBuilder::retainType(DIScope *T) { 762 assert(T && "Expected non-null type"); 763 assert((isa<DIType>(T) || (isa<DISubprogram>(T) && 764 cast<DISubprogram>(T)->isDefinition() == false)) && 765 "Expected type or subprogram declaration"); 766 AllRetainTypes.emplace_back(T); 767 } 768 769 DIBasicType *DIBuilder::createUnspecifiedParameter() { return nullptr; } 770 771 DICompositeType *DIBuilder::createForwardDecl( 772 unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line, 773 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, 774 StringRef UniqueIdentifier, std::optional<uint32_t> EnumKind) { 775 // FIXME: Define in terms of createReplaceableForwardDecl() by calling 776 // replaceWithUniqued(). 777 auto *RetTy = DICompositeType::get( 778 VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr, 779 SizeInBits, AlignInBits, 0, DINode::FlagFwdDecl, nullptr, RuntimeLang, 780 /*EnumKind=*/EnumKind, nullptr, nullptr, UniqueIdentifier); 781 trackIfUnresolved(RetTy); 782 return RetTy; 783 } 784 785 DICompositeType *DIBuilder::createReplaceableCompositeType( 786 unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line, 787 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, 788 DINode::DIFlags Flags, StringRef UniqueIdentifier, DINodeArray Annotations, 789 std::optional<uint32_t> EnumKind) { 790 auto *RetTy = 791 DICompositeType::getTemporary( 792 VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr, 793 SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, EnumKind, 794 nullptr, nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, 795 nullptr, nullptr, Annotations) 796 .release(); 797 trackIfUnresolved(RetTy); 798 return RetTy; 799 } 800 801 DINodeArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) { 802 return MDTuple::get(VMContext, Elements); 803 } 804 805 DIMacroNodeArray 806 DIBuilder::getOrCreateMacroArray(ArrayRef<Metadata *> Elements) { 807 return MDTuple::get(VMContext, Elements); 808 } 809 810 DITypeRefArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) { 811 SmallVector<llvm::Metadata *, 16> Elts; 812 for (Metadata *E : Elements) { 813 if (isa_and_nonnull<MDNode>(E)) 814 Elts.push_back(cast<DIType>(E)); 815 else 816 Elts.push_back(E); 817 } 818 return DITypeRefArray(MDNode::get(VMContext, Elts)); 819 } 820 821 DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { 822 auto *LB = ConstantAsMetadata::get( 823 ConstantInt::getSigned(Type::getInt64Ty(VMContext), Lo)); 824 auto *CountNode = ConstantAsMetadata::get( 825 ConstantInt::getSigned(Type::getInt64Ty(VMContext), Count)); 826 return DISubrange::get(VMContext, CountNode, LB, nullptr, nullptr); 827 } 828 829 DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, Metadata *CountNode) { 830 auto *LB = ConstantAsMetadata::get( 831 ConstantInt::getSigned(Type::getInt64Ty(VMContext), Lo)); 832 return DISubrange::get(VMContext, CountNode, LB, nullptr, nullptr); 833 } 834 835 DISubrange *DIBuilder::getOrCreateSubrange(Metadata *CountNode, Metadata *LB, 836 Metadata *UB, Metadata *Stride) { 837 return DISubrange::get(VMContext, CountNode, LB, UB, Stride); 838 } 839 840 DIGenericSubrange *DIBuilder::getOrCreateGenericSubrange( 841 DIGenericSubrange::BoundType CountNode, DIGenericSubrange::BoundType LB, 842 DIGenericSubrange::BoundType UB, DIGenericSubrange::BoundType Stride) { 843 auto ConvToMetadata = [&](DIGenericSubrange::BoundType Bound) -> Metadata * { 844 return isa<DIExpression *>(Bound) ? (Metadata *)cast<DIExpression *>(Bound) 845 : (Metadata *)cast<DIVariable *>(Bound); 846 }; 847 return DIGenericSubrange::get(VMContext, ConvToMetadata(CountNode), 848 ConvToMetadata(LB), ConvToMetadata(UB), 849 ConvToMetadata(Stride)); 850 } 851 852 DISubrangeType *DIBuilder::createSubrangeType( 853 StringRef Name, DIFile *File, unsigned LineNo, DIScope *Scope, 854 uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags, 855 DIType *Ty, Metadata *LowerBound, Metadata *UpperBound, Metadata *Stride, 856 Metadata *Bias) { 857 return DISubrangeType::get(VMContext, Name, File, LineNo, Scope, SizeInBits, 858 AlignInBits, Flags, Ty, LowerBound, UpperBound, 859 Stride, Bias); 860 } 861 862 static void checkGlobalVariableScope(DIScope *Context) { 863 #ifndef NDEBUG 864 if (auto *CT = 865 dyn_cast_or_null<DICompositeType>(getNonCompileUnitScope(Context))) 866 assert(CT->getIdentifier().empty() && 867 "Context of a global variable should not be a type with identifier"); 868 #endif 869 } 870 871 DIGlobalVariableExpression *DIBuilder::createGlobalVariableExpression( 872 DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F, 873 unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, bool isDefined, 874 DIExpression *Expr, MDNode *Decl, MDTuple *TemplateParams, 875 uint32_t AlignInBits, DINodeArray Annotations) { 876 checkGlobalVariableScope(Context); 877 878 auto *GV = DIGlobalVariable::getDistinct( 879 VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F, 880 LineNumber, Ty, IsLocalToUnit, isDefined, 881 cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits, 882 Annotations); 883 if (!Expr) 884 Expr = createExpression(); 885 auto *N = DIGlobalVariableExpression::get(VMContext, GV, Expr); 886 AllGVs.push_back(N); 887 return N; 888 } 889 890 DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl( 891 DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F, 892 unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, MDNode *Decl, 893 MDTuple *TemplateParams, uint32_t AlignInBits) { 894 checkGlobalVariableScope(Context); 895 896 return DIGlobalVariable::getTemporary( 897 VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F, 898 LineNumber, Ty, IsLocalToUnit, false, 899 cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits, 900 nullptr) 901 .release(); 902 } 903 904 static DILocalVariable *createLocalVariable( 905 LLVMContext &VMContext, 906 SmallVectorImpl<TrackingMDNodeRef> &PreservedNodes, 907 DIScope *Context, StringRef Name, unsigned ArgNo, DIFile *File, 908 unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags, 909 uint32_t AlignInBits, DINodeArray Annotations = nullptr) { 910 // FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT 911 // the only valid scopes)? 912 auto *Scope = cast<DILocalScope>(Context); 913 auto *Node = DILocalVariable::get(VMContext, Scope, Name, File, LineNo, Ty, 914 ArgNo, Flags, AlignInBits, Annotations); 915 if (AlwaysPreserve) { 916 // The optimizer may remove local variables. If there is an interest 917 // to preserve variable info in such situation then stash it in a 918 // named mdnode. 919 PreservedNodes.emplace_back(Node); 920 } 921 return Node; 922 } 923 924 DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef Name, 925 DIFile *File, unsigned LineNo, 926 DIType *Ty, bool AlwaysPreserve, 927 DINode::DIFlags Flags, 928 uint32_t AlignInBits) { 929 assert(Scope && isa<DILocalScope>(Scope) && 930 "Unexpected scope for a local variable."); 931 return createLocalVariable( 932 VMContext, getSubprogramNodesTrackingVector(Scope), Scope, Name, 933 /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve, Flags, AlignInBits); 934 } 935 936 DILocalVariable *DIBuilder::createParameterVariable( 937 DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File, 938 unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags, 939 DINodeArray Annotations) { 940 assert(ArgNo && "Expected non-zero argument number for parameter"); 941 assert(Scope && isa<DILocalScope>(Scope) && 942 "Unexpected scope for a local variable."); 943 return createLocalVariable( 944 VMContext, getSubprogramNodesTrackingVector(Scope), Scope, Name, ArgNo, 945 File, LineNo, Ty, AlwaysPreserve, Flags, /*AlignInBits=*/0, Annotations); 946 } 947 948 DILabel *DIBuilder::createLabel(DIScope *Context, StringRef Name, DIFile *File, 949 unsigned LineNo, unsigned Column, 950 bool IsArtificial, 951 std::optional<unsigned> CoroSuspendIdx, 952 bool AlwaysPreserve) { 953 auto *Scope = cast<DILocalScope>(Context); 954 auto *Node = DILabel::get(VMContext, Scope, Name, File, LineNo, Column, 955 IsArtificial, CoroSuspendIdx); 956 957 if (AlwaysPreserve) { 958 /// The optimizer may remove labels. If there is an interest 959 /// to preserve label info in such situation then append it to 960 /// the list of retained nodes of the DISubprogram. 961 getSubprogramNodesTrackingVector(Scope).emplace_back(Node); 962 } 963 return Node; 964 } 965 966 DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) { 967 return DIExpression::get(VMContext, Addr); 968 } 969 970 template <class... Ts> 971 static DISubprogram *getSubprogram(bool IsDistinct, Ts &&...Args) { 972 if (IsDistinct) 973 return DISubprogram::getDistinct(std::forward<Ts>(Args)...); 974 return DISubprogram::get(std::forward<Ts>(Args)...); 975 } 976 977 DISubprogram *DIBuilder::createFunction( 978 DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File, 979 unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine, 980 DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags, 981 DITemplateParameterArray TParams, DISubprogram *Decl, 982 DITypeArray ThrownTypes, DINodeArray Annotations, StringRef TargetFuncName, 983 bool UseKeyInstructions) { 984 bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition; 985 auto *Node = getSubprogram( 986 /*IsDistinct=*/IsDefinition, VMContext, getNonCompileUnitScope(Context), 987 Name, LinkageName, File, LineNo, Ty, ScopeLine, nullptr, 0, 0, Flags, 988 SPFlags, IsDefinition ? CUNode : nullptr, TParams, Decl, nullptr, 989 ThrownTypes, Annotations, TargetFuncName, UseKeyInstructions); 990 991 AllSubprograms.push_back(Node); 992 trackIfUnresolved(Node); 993 return Node; 994 } 995 996 DISubprogram *DIBuilder::createTempFunctionFwdDecl( 997 DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File, 998 unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine, 999 DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags, 1000 DITemplateParameterArray TParams, DISubprogram *Decl, 1001 DITypeArray ThrownTypes) { 1002 bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition; 1003 return DISubprogram::getTemporary(VMContext, getNonCompileUnitScope(Context), 1004 Name, LinkageName, File, LineNo, Ty, 1005 ScopeLine, nullptr, 0, 0, Flags, SPFlags, 1006 IsDefinition ? CUNode : nullptr, TParams, 1007 Decl, nullptr, ThrownTypes) 1008 .release(); 1009 } 1010 1011 DISubprogram *DIBuilder::createMethod( 1012 DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F, 1013 unsigned LineNo, DISubroutineType *Ty, unsigned VIndex, int ThisAdjustment, 1014 DIType *VTableHolder, DINode::DIFlags Flags, 1015 DISubprogram::DISPFlags SPFlags, DITemplateParameterArray TParams, 1016 DITypeArray ThrownTypes, bool UseKeyInstructions) { 1017 assert(getNonCompileUnitScope(Context) && 1018 "Methods should have both a Context and a context that isn't " 1019 "the compile unit."); 1020 // FIXME: Do we want to use different scope/lines? 1021 bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition; 1022 auto *SP = getSubprogram( 1023 /*IsDistinct=*/IsDefinition, VMContext, cast<DIScope>(Context), Name, 1024 LinkageName, F, LineNo, Ty, LineNo, VTableHolder, VIndex, ThisAdjustment, 1025 Flags, SPFlags, IsDefinition ? CUNode : nullptr, TParams, nullptr, 1026 nullptr, ThrownTypes, nullptr, "", IsDefinition && UseKeyInstructions); 1027 1028 AllSubprograms.push_back(SP); 1029 trackIfUnresolved(SP); 1030 return SP; 1031 } 1032 1033 DICommonBlock *DIBuilder::createCommonBlock(DIScope *Scope, 1034 DIGlobalVariable *Decl, 1035 StringRef Name, DIFile *File, 1036 unsigned LineNo) { 1037 return DICommonBlock::get(VMContext, Scope, Decl, Name, File, LineNo); 1038 } 1039 1040 DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name, 1041 bool ExportSymbols) { 1042 1043 // It is okay to *not* make anonymous top-level namespaces distinct, because 1044 // all nodes that have an anonymous namespace as their parent scope are 1045 // guaranteed to be unique and/or are linked to their containing 1046 // DICompileUnit. This decision is an explicit tradeoff of link time versus 1047 // memory usage versus code simplicity and may get revisited in the future. 1048 return DINamespace::get(VMContext, getNonCompileUnitScope(Scope), Name, 1049 ExportSymbols); 1050 } 1051 1052 DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name, 1053 StringRef ConfigurationMacros, 1054 StringRef IncludePath, StringRef APINotesFile, 1055 DIFile *File, unsigned LineNo, bool IsDecl) { 1056 return DIModule::get(VMContext, File, getNonCompileUnitScope(Scope), Name, 1057 ConfigurationMacros, IncludePath, APINotesFile, LineNo, 1058 IsDecl); 1059 } 1060 1061 DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope, 1062 DIFile *File, 1063 unsigned Discriminator) { 1064 return DILexicalBlockFile::get(VMContext, Scope, File, Discriminator); 1065 } 1066 1067 DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File, 1068 unsigned Line, unsigned Col) { 1069 // Make these distinct, to avoid merging two lexical blocks on the same 1070 // file/line/column. 1071 return DILexicalBlock::getDistinct(VMContext, getNonCompileUnitScope(Scope), 1072 File, Line, Col); 1073 } 1074 1075 DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, 1076 DIExpression *Expr, const DILocation *DL, 1077 BasicBlock *InsertAtEnd) { 1078 // If this block already has a terminator then insert this intrinsic before 1079 // the terminator. Otherwise, put it at the end of the block. 1080 Instruction *InsertBefore = InsertAtEnd->getTerminator(); 1081 return insertDeclare(Storage, VarInfo, Expr, DL, 1082 InsertBefore ? InsertBefore->getIterator() 1083 : InsertAtEnd->end()); 1084 } 1085 1086 DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, 1087 DILocalVariable *SrcVar, 1088 DIExpression *ValExpr, Value *Addr, 1089 DIExpression *AddrExpr, 1090 const DILocation *DL) { 1091 auto *Link = cast_or_null<DIAssignID>( 1092 LinkedInstr->getMetadata(LLVMContext::MD_DIAssignID)); 1093 assert(Link && "Linked instruction must have DIAssign metadata attached"); 1094 1095 DbgVariableRecord *DVR = DbgVariableRecord::createDVRAssign( 1096 Val, SrcVar, ValExpr, Link, Addr, AddrExpr, DL); 1097 // Insert after LinkedInstr. 1098 BasicBlock::iterator NextIt = std::next(LinkedInstr->getIterator()); 1099 NextIt.setHeadBit(true); 1100 insertDbgVariableRecord(DVR, NextIt); 1101 return DVR; 1102 } 1103 1104 /// Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics. 1105 /// This abstracts over the various ways to specify an insert position. 1106 static void initIRBuilder(IRBuilder<> &Builder, const DILocation *DL, 1107 InsertPosition InsertPt) { 1108 Builder.SetInsertPoint(InsertPt.getBasicBlock(), InsertPt); 1109 Builder.SetCurrentDebugLocation(DL); 1110 } 1111 1112 static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) { 1113 assert(V && "no value passed to dbg intrinsic"); 1114 return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V)); 1115 } 1116 1117 DbgInstPtr DIBuilder::insertDbgValueIntrinsic(llvm::Value *Val, 1118 DILocalVariable *VarInfo, 1119 DIExpression *Expr, 1120 const DILocation *DL, 1121 InsertPosition InsertPt) { 1122 DbgVariableRecord *DVR = 1123 DbgVariableRecord::createDbgVariableRecord(Val, VarInfo, Expr, DL); 1124 insertDbgVariableRecord(DVR, InsertPt); 1125 return DVR; 1126 } 1127 1128 DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, 1129 DIExpression *Expr, const DILocation *DL, 1130 InsertPosition InsertPt) { 1131 assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare"); 1132 assert(DL && "Expected debug loc"); 1133 assert(DL->getScope()->getSubprogram() == 1134 VarInfo->getScope()->getSubprogram() && 1135 "Expected matching subprograms"); 1136 1137 DbgVariableRecord *DVR = 1138 DbgVariableRecord::createDVRDeclare(Storage, VarInfo, Expr, DL); 1139 insertDbgVariableRecord(DVR, InsertPt); 1140 return DVR; 1141 } 1142 1143 void DIBuilder::insertDbgVariableRecord(DbgVariableRecord *DVR, 1144 InsertPosition InsertPt) { 1145 assert(InsertPt.isValid()); 1146 trackIfUnresolved(DVR->getVariable()); 1147 trackIfUnresolved(DVR->getExpression()); 1148 if (DVR->isDbgAssign()) 1149 trackIfUnresolved(DVR->getAddressExpression()); 1150 1151 auto *BB = InsertPt.getBasicBlock(); 1152 BB->insertDbgRecordBefore(DVR, InsertPt); 1153 } 1154 1155 Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn, 1156 Value *V, DILocalVariable *VarInfo, 1157 DIExpression *Expr, 1158 const DILocation *DL, 1159 InsertPosition InsertPt) { 1160 assert(IntrinsicFn && "must pass a non-null intrinsic function"); 1161 assert(V && "must pass a value to a dbg intrinsic"); 1162 assert(VarInfo && 1163 "empty or invalid DILocalVariable* passed to debug intrinsic"); 1164 assert(DL && "Expected debug loc"); 1165 assert(DL->getScope()->getSubprogram() == 1166 VarInfo->getScope()->getSubprogram() && 1167 "Expected matching subprograms"); 1168 1169 trackIfUnresolved(VarInfo); 1170 trackIfUnresolved(Expr); 1171 Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V), 1172 MetadataAsValue::get(VMContext, VarInfo), 1173 MetadataAsValue::get(VMContext, Expr)}; 1174 1175 IRBuilder<> B(DL->getContext()); 1176 initIRBuilder(B, DL, InsertPt); 1177 return B.CreateCall(IntrinsicFn, Args); 1178 } 1179 1180 DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, 1181 InsertPosition InsertPt) { 1182 assert(LabelInfo && "empty or invalid DILabel* passed to dbg.label"); 1183 assert(DL && "Expected debug loc"); 1184 assert(DL->getScope()->getSubprogram() == 1185 LabelInfo->getScope()->getSubprogram() && 1186 "Expected matching subprograms"); 1187 1188 trackIfUnresolved(LabelInfo); 1189 DbgLabelRecord *DLR = new DbgLabelRecord(LabelInfo, DL); 1190 if (InsertPt.isValid()) { 1191 auto *BB = InsertPt.getBasicBlock(); 1192 BB->insertDbgRecordBefore(DLR, InsertPt); 1193 } 1194 return DLR; 1195 } 1196 1197 void DIBuilder::replaceVTableHolder(DICompositeType *&T, DIType *VTableHolder) { 1198 { 1199 TypedTrackingMDRef<DICompositeType> N(T); 1200 N->replaceVTableHolder(VTableHolder); 1201 T = N.get(); 1202 } 1203 1204 // If this didn't create a self-reference, just return. 1205 if (T != VTableHolder) 1206 return; 1207 1208 // Look for unresolved operands. T will drop RAUW support, orphaning any 1209 // cycles underneath it. 1210 if (T->isResolved()) 1211 for (const MDOperand &O : T->operands()) 1212 if (auto *N = dyn_cast_or_null<MDNode>(O)) 1213 trackIfUnresolved(N); 1214 } 1215 1216 void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements, 1217 DINodeArray TParams) { 1218 { 1219 TypedTrackingMDRef<DICompositeType> N(T); 1220 if (Elements) 1221 N->replaceElements(Elements); 1222 if (TParams) 1223 N->replaceTemplateParams(DITemplateParameterArray(TParams)); 1224 T = N.get(); 1225 } 1226 1227 // If T isn't resolved, there's no problem. 1228 if (!T->isResolved()) 1229 return; 1230 1231 // If T is resolved, it may be due to a self-reference cycle. Track the 1232 // arrays explicitly if they're unresolved, or else the cycles will be 1233 // orphaned. 1234 if (Elements) 1235 trackIfUnresolved(Elements.get()); 1236 if (TParams) 1237 trackIfUnresolved(TParams.get()); 1238 } 1239