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