38 cl::desc(
"Enable adding flow sensitive discriminators"));
44 cl::desc(
"Preserve line and column number when merging locations."));
52 std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::min()};
56 Fragment(DVR->getExpression()->getFragmentInfo()),
63DILocation::DILocation(
LLVMContext &
C, StorageType Storage,
unsigned Line,
64 unsigned Column, uint64_t AtomGroup,
uint8_t AtomRank,
67 :
MDNode(
C, DILocationKind, Storage, MDs), AtomGroup(AtomGroup),
68 AtomRank(AtomRank), HasIRLayers(HasIRLayers) {
69 assert(AtomRank <= 7 &&
"AtomRank number should fit in 3 bits");
70 assert(AtomGroup < (1ULL << 60) &&
"AtomGroup number should fit in 60 bits");
72 C.updateDILocationAtomGroupWaterline(AtomGroup + 1);
75 "Expected a scope and optional inlined-at + irlayers");
77 assert(Column < (1u << 16) &&
"Expected 16-bit column");
79 SubclassData32 = Line;
80 SubclassData16 = Column;
82 setImplicitCode(ImplicitCode);
87 if (Column >= (1u << 16))
93 Metadata *InlinedAt,
bool ImplicitCode,
94 uint64_t AtomGroup, uint8_t AtomRank,
95 Metadata *IRLayers, StorageType Storage,
101 if (AtomGroup >= (1ULL << 60))
106 Context.pImpl->DILocations,
113 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
125 Storage, Context.pImpl->DILocations);
129 Metadata *File,
unsigned Line,
unsigned Column,
130 StorageType Storage,
bool ShouldCreate) {
136 if (
auto *
N =
getUniqued(Context.pImpl->DILayerLocs,
137 DILayerLocInfo::KeyTy(Kind, File, Line, Column)))
144 DILayerLoc(Context,
Storage, Line, Column,
Ops),
145 Storage, Context.pImpl->DILayerLocs);
154 DILayerLocListInfo::KeyTy
Key(Layers);
159 Hash =
Key.getHash();
161 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
164 DILayerLocList(Context,
Storage, Hash, Layers),
165 Storage, Context.pImpl->DILayerLocLists);
168void DILayerLocList::recalculateHash() {
169 setHash(DILayerLocListInfo::KeyTy::calculateHash(
this));
175 if (Locs.
size() == 1)
177 auto *Merged = Locs[0];
180 if (Merged ==
nullptr)
188 TempMDNode ClonedScope = LBB->
clone();
203 return {LB->getLine(), LB->getColumn()};
205 return {SP->getLine(), 0u};
211template <
typename MatcherT>
212static std::pair<DIScope *, LineColumn>
219 LineColumn Loc1(L1->getLine(), L1->getColumn());
220 for (;
S1;
S1 =
S1->getScope()) {
222 Matcher.insert(
S1, Loc1);
227 LineColumn Loc2(L2->getLine(), L2->getColumn());
231 if (
DIScope *S = Matcher.match(S2, Loc2))
232 return std::make_pair(S, Loc2);
237 return std::make_pair(
nullptr,
LineColumn(L2->getLine(), L2->getColumn()));
247 return Scopes.contains(S) ? S :
nullptr;
264 if (ScopesAtLoc ==
Scopes.end())
268 if (ScopesAtLoc->second.contains(S))
271 if (!ScopesAtLoc->second.empty())
272 return *ScopesAtLoc->second.begin();
292 using LayerKey = std::tuple<Metadata *, Metadata *, unsigned, unsigned>;
294 return LayerKey(L->getRawKind(), L->getRawFile(), L->getLine(),
322 return LocA ? LocA : LocB;
324 auto A = std::make_tuple(LocA->getLine(), LocA->getColumn(),
325 LocA->getDiscriminator(), LocA->getFilename(),
326 LocA->getDirectory());
327 auto B = std::make_tuple(LocB->getLine(), LocB->getColumn(),
328 LocB->getDiscriminator(), LocB->getFilename(),
329 LocB->getDirectory());
330 return A <
B ? LocA : LocB;
348 for (
auto [L,
I] = std::make_pair(LocA, 0U); L; L = L->getInlinedAt(),
I++) {
351 {L->getScope()->getSubprogram(), L->getInlinedAt()},
I);
352 assert(Res.second &&
"Multiple <SP, InlinedAt> pairs in a location chain?");
356 LocVec::reverse_iterator ARIt = ALocs.rend();
357 LocVec::reverse_iterator BRIt = BLocs.rend();
363 for (
auto [L,
I] = std::make_pair(LocB, 0U); L; L = L->getInlinedAt(),
I++) {
366 if (ARIt != ALocs.rend())
370 auto IT = ALookup.
find({L->getScope()->getSubprogram(), L->getInlinedAt()});
371 if (
IT == ALookup.
end())
375 ARIt = LocVec::reverse_iterator(ALocs.begin() +
IT->second + 1);
376 BRIt = LocVec::reverse_iterator(BLocs.begin() +
I + 1);
387 auto *LocAIA = LocA->getInlinedAt();
388 auto *LocBIA = LocB->getInlinedAt();
389 auto MergeLocPair = [&
C, LocAIA,
390 LocBIA](
const DILocation *L1,
const DILocation *L2,
395 L1->getAtomGroup(), L1->getAtomRank(),
396 L1->getRawIRLayers());
400 if (L1->getScope()->getSubprogram() != L2->getScope()->getSubprogram())
409 assert(
Scope &&
"No common scope in the same subprogram?");
412 if (
Scope->getFile() != L1->getFile() || L1->getFile() != L2->getFile()) {
413 auto [CommonLocScope, CommonLoc] =
423 Scope = CommonLocScope;
427 if (
Scope->getFile() != L1->getFile() || L1->getFile() != L2->getFile())
434 bool SameLine = L1->getLine() == L2->getLine();
435 bool SameCol = L1->getColumn() == L2->getColumn();
436 unsigned Line = SameLine ? L1->getLine() : 0;
437 unsigned Col = SameLine && SameCol ? L1->getColumn() : 0;
438 bool IsImplicitCode = L1->isImplicitCode() && L2->isImplicitCode();
442 if (!SameLine || !(L1->getAtomGroup() || L2->getAtomGroup()))
450 if (LocBIA == LocAIA &&
InlinedAt == LocBIA) {
455 bool UseL1Atom = [L1, L2]() {
456 if (L1->getAtomRank() == L2->getAtomRank()) {
458 if (!L1->getAtomGroup() || !L2->getAtomGroup())
459 return !L2->getAtomGroup();
460 return L1->getAtomGroup() < L2->getAtomGroup();
463 if (!L1->getAtomRank() || !L2->getAtomRank())
464 return !L2->getAtomRank();
465 return L1->getAtomRank() < L2->getAtomRank();
467 Group = UseL1Atom ? L1->getAtomGroup() : L2->getAtomGroup();
468 Rank = UseL1Atom ? L1->getAtomRank() : L2->getAtomRank();
474 Group =
C.incNextDILocationAtomGroup();
478 Group, Rank, MergedLayers);
481 DILocation *Result = ARIt != ALocs.rend() ? (*ARIt)->getInlinedAt() :
nullptr;
485 for (; ARIt != ALocs.rend() && BRIt != BLocs.rend(); ++ARIt, ++BRIt) {
486 DILocation *Tmp = MergeLocPair(*ARIt, *BRIt, Result);
511std::optional<unsigned>
513 std::array<unsigned, 3> Components = {BD,
DF, CI};
514 uint64_t RemainingWork = 0U;
521 std::accumulate(Components.begin(), Components.end(), RemainingWork);
525 unsigned NextBitInsertionIndex = 0;
526 while (RemainingWork > 0) {
527 unsigned C = Components[
I++];
530 Ret |= (EC << NextBitInsertionIndex);
538 unsigned TBD, TDF, TCI = 0;
540 if (TBD == BD && TDF ==
DF && TCI == CI)
556#define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME)
557#include "llvm/IR/DebugInfoFlags.def"
563#define HANDLE_DI_FLAG(ID, NAME) \
565 return "DIFlag" #NAME;
566#include "llvm/IR/DebugInfoFlags.def"
577 if (
A == FlagPrivate)
579 else if (
A == FlagProtected)
586 if (R == FlagSingleInheritance)
587 SplitFlags.
push_back(FlagSingleInheritance);
588 else if (R == FlagMultipleInheritance)
589 SplitFlags.
push_back(FlagMultipleInheritance);
591 SplitFlags.
push_back(FlagVirtualInheritance);
594 if ((Flags & FlagIndirectVirtualBase) == FlagIndirectVirtualBase) {
595 Flags &= ~FlagIndirectVirtualBase;
596 SplitFlags.
push_back(FlagIndirectVirtualBase);
599#define HANDLE_DI_FLAG(ID, NAME) \
600 if (DIFlags Bit = Flags & Flag##NAME) { \
601 SplitFlags.push_back(Bit); \
604#include "llvm/IR/DebugInfoFlags.def"
610 return T->getScope();
613 return SP->getScope();
616 return LB->getScope();
619 return NS->getScope();
622 return CB->getScope();
625 return M->getScope();
628 "Unhandled type of scope.");
636 return SP->getName();
638 return NS->getName();
640 return CB->getName();
645 "Unhandled type of scope.");
659 StorageType Storage,
bool ShouldCreate) {
667 Hash =
Key.getHash();
669 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
677 Storage, Context.pImpl->GenericDINodes);
680void GenericDINode::recalculateHash() {
681 setHash(GenericDINodeInfo::KeyTy::calculateHash(
this));
684#define UNWRAP_ARGS_IMPL(...) __VA_ARGS__
685#define UNWRAP_ARGS(ARGS) UNWRAP_ARGS_IMPL ARGS
686#define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS) \
688 if (Storage == Uniqued) { \
689 if (auto *N = getUniqued(Context.pImpl->CLASS##s, \
690 CLASS##Info::KeyTy(UNWRAP_ARGS(ARGS)))) \
695 assert(ShouldCreate && \
696 "Expected non-uniqued nodes to always be created"); \
699#define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS) \
700 return storeImpl(new (std::size(OPS), Storage) \
701 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \
702 Storage, Context.pImpl->CLASS##s)
703#define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS) \
704 return storeImpl(new (0u, Storage) \
705 CLASS(Context, Storage, UNWRAP_ARGS(ARGS)), \
706 Storage, Context.pImpl->CLASS##s)
707#define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS) \
708 return storeImpl(new (std::size(OPS), Storage) CLASS(Context, Storage, OPS), \
709 Storage, Context.pImpl->CLASS##s)
710#define DEFINE_GETIMPL_STORE_N(CLASS, ARGS, OPS, NUM_OPS) \
711 return storeImpl(new (NUM_OPS, Storage) \
712 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \
713 Storage, Context.pImpl->CLASS##s)
715DISubrange::DISubrange(
LLVMContext &
C, StorageType Storage,
717 :
DINode(
C, DISubrangeKind, Storage,
dwarf::DW_TAG_subrange_type,
Ops) {}
719 StorageType Storage,
bool ShouldCreate) {
729 int64_t
Lo, StorageType Storage,
739 StorageType Storage,
bool ShouldCreate) {
752 "Count must be signed constant or DIVariable or DIExpression");
758 return BoundType(MD);
761 return BoundType(MD);
773 "LowerBound must be signed constant or DIVariable or DIExpression");
779 return BoundType(MD);
782 return BoundType(MD);
794 "UpperBound must be signed constant or DIVariable or DIExpression");
800 return BoundType(MD);
803 return BoundType(MD);
815 "Stride must be signed constant or DIVariable or DIExpression");
821 return BoundType(MD);
824 return BoundType(MD);
828DIGenericSubrange::DIGenericSubrange(
LLVMContext &
C, StorageType Storage,
830 :
DINode(
C, DIGenericSubrangeKind, Storage,
dwarf::DW_TAG_generic_subrange,
849 "Count must be signed constant or DIVariable or DIExpression");
866 "LowerBound must be signed constant or DIVariable or DIExpression");
883 "UpperBound must be signed constant or DIVariable or DIExpression");
900 "Stride must be signed constant or DIVariable or DIExpression");
911DISubrangeType::DISubrangeType(
LLVMContext &
C, StorageType Storage,
912 unsigned Line,
uint32_t AlignInBits,
914 :
DIType(
C, DISubrangeTypeKind, Storage,
dwarf::DW_TAG_subrange_type, Line,
915 AlignInBits, 0, Flags,
Ops) {}
932DISubrangeType::convertRawToBound(
Metadata *IN)
const {
954DIEnumerator::DIEnumerator(
LLVMContext &
C, StorageType Storage,
963 StorageType Storage,
bool ShouldCreate) {
985 DataSizeInBits,
Flags),
991 case dwarf::DW_ATE_signed:
992 case dwarf::DW_ATE_signed_char:
993 case dwarf::DW_ATE_signed_fixed:
995 case dwarf::DW_ATE_unsigned:
996 case dwarf::DW_ATE_unsigned_char:
997 case dwarf::DW_ATE_unsigned_fixed:
1000 return std::nullopt;
1008 unsigned Encoding, DIFlags Flags,
unsigned Kind,
1009 int Factor,
APInt Numerator,
APInt Denominator,
1010 StorageType Storage,
bool ShouldCreate) {
1023 return getEncoding() == dwarf::DW_ATE_signed_fixed;
1026std::optional<DIFixedPointType::FixedPointKind>
1052 unsigned Encoding,
Metadata *CharType,
1053 StorageType Storage,
bool ShouldCreate) {
1073 if (Tuple->getNumOperands() != 1)
1075 ED = Tuple->getOperand(0);
1084 return static_cast<uint32_t>(CI->getZExtValue());
1090 return C->getValue();
1096 getTag() == dwarf::DW_TAG_variable) &&
1099 return C->getValue();
1105 return C->getValue();
1113 std::optional<unsigned> DWARFAddressSpace,
1114 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
Metadata *ExtraData,
1128std::optional<DIDerivedType::PtrAuthData>
1129DIDerivedType::getPtrAuthData()
const {
1130 return getTag() == dwarf::DW_TAG_LLVM_ptrauth_type
1138 uint32_t AlignInBits,
Metadata *OffsetInBits, DIFlags Flags,
1139 Metadata *Elements,
unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1143 Metadata *Specification, uint32_t NumExtraInhabitants,
Metadata *BitStride,
1144 StorageType Storage,
bool ShouldCreate) {
1170 Metadata *
Elements,
unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1175 if (!Context.isODRUniquingDebugTypes())
1177 auto *&CT = (*Context.pImpl->DITypeMap)[&
Identifier];
1185 if (CT->getTag() !=
Tag)
1190 if (!CT->isForwardDecl() || (
Flags & DINode::FlagFwdDecl))
1201 assert((std::end(
Ops) - std::begin(
Ops)) == (
int)CT->getNumOperands() &&
1202 "Mismatched number of operands");
1203 for (
unsigned I = 0, E = CT->getNumOperands();
I != E; ++
I)
1204 if (
Ops[
I] != CT->getOperand(
I))
1205 CT->setOperand(
I,
Ops[
I]);
1214 Metadata *Elements,
unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1218 assert(!Identifier.getString().empty() &&
"Expected valid identifier");
1219 if (!Context.isODRUniquingDebugTypes())
1221 auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier];
1230 if (CT->getTag() != Tag)
1239 if (!Context.isODRUniquingDebugTypes())
1241 return Context.pImpl->DITypeMap->lookup(&
Identifier);
1243DISubroutineType::DISubroutineType(
LLVMContext &
C, StorageType Storage,
1246 :
DIType(
C, DISubroutineTypeKind, Storage,
dwarf::DW_TAG_subroutine_type, 0,
1252 StorageType Storage,
1253 bool ShouldCreate) {
1260 std::optional<ChecksumInfo<MDString *>> CS,
MDString *Src,
1263 Checksum(CS),
Source(Src) {}
1273StringRef DIFile::getChecksumKindAsString(ChecksumKind CSKind) {
1281std::optional<DIFile::ChecksumKind>
1293 MDString *Source, StorageType Storage,
1294 bool ShouldCreate) {
1304DICompileUnit::DICompileUnit(
LLVMContext &
C, StorageType Storage,
1306 bool IsOptimized,
unsigned RuntimeVersion,
1307 unsigned EmissionKind,
uint64_t DWOId,
1308 bool SplitDebugInlining,
1309 bool DebugInfoForProfiling,
unsigned NameTableKind,
1314 IsOptimized(IsOptimized), SplitDebugInlining(SplitDebugInlining),
1315 DebugInfoForProfiling(DebugInfoForProfiling),
1316 RangesBaseAddress(RangesBaseAddress) {
1323 unsigned RuntimeVersion,
MDString *SplitDebugFilename,
1326 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
1327 unsigned NameTableKind,
bool RangesBaseAddress,
MDString *SysRoot,
1328 MDString *SDK, StorageType Storage,
bool ShouldCreate) {
1346 Context,
Storage, SourceLanguage, IsOptimized,
1347 RuntimeVersion, EmissionKind, DWOId, SplitDebugInlining,
1348 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
1353std::optional<DICompileUnit::DebugEmissionKind>
1363std::optional<DICompileUnit::DebugNameTableKind>
1380 return "LineTablesOnly";
1382 return "DebugDirectivesOnly";
1400DISubprogram::DISubprogram(
LLVMContext &
C, StorageType Storage,
unsigned Line,
1401 unsigned ScopeLine,
unsigned VirtualIndex,
1402 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
1405 Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
1406 ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
1412 unsigned Virtuality,
bool IsMainSubprogram) {
1414 static_assert(int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) &&
1415 int(SPFlagPureVirtual) ==
1416 int(dwarf::DW_VIRTUALITY_pure_virtual),
1417 "Virtuality constant mismatch");
1420 (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) |
1421 (IsDefinition ? SPFlagDefinition : SPFlagZero) |
1422 (IsOptimized ? SPFlagOptimized : SPFlagZero) |
1423 (IsMainSubprogram ? SPFlagMainSubprogram : SPFlagZero));
1428 return Block->getScope()->getSubprogram();
1434 return File->getScope()->getNonLexicalBlockFileScope();
1442 DIScope *CachedResult =
nullptr;
1445 Scope = Scope->getScope()) {
1446 if (
auto It = Cache.find(Scope); It != Cache.end()) {
1455 DIScope *UpdatedScope = CachedResult ? CachedResult : &NewSP;
1459 Cache[ScopeToUpdate] = UpdatedScope;
1467#define HANDLE_DISP_FLAG(ID, NAME) .Case("DISPFlag" #NAME, SPFlag##NAME)
1468#include "llvm/IR/DebugInfoFlags.def"
1477#define HANDLE_DISP_FLAG(ID, NAME) \
1478 case SPFlag##NAME: \
1479 return "DISPFlag" #NAME;
1480#include "llvm/IR/DebugInfoFlags.def"
1491#define HANDLE_DISP_FLAG(ID, NAME) \
1492 if (DISPFlags Bit = Flags & SPFlag##NAME) { \
1493 SplitFlags.push_back(Bit); \
1496#include "llvm/IR/DebugInfoFlags.def"
1503 unsigned ScopeLine,
Metadata *ContainingType,
unsigned VirtualIndex,
1504 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
Metadata *Unit,
1507 bool UsesKeyInstructions, StorageType Storage,
bool ShouldCreate) {
1537 (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags,
1543 assert(
F &&
"Invalid function");
1544 return F->getSubprogram() ==
this;
1547template <
typename ScopeT,
typename NodeT>
1549 auto getScopeLambda = [](
auto *
N) {
return getScope(
N); };
1550 return DISubprogram::visitRetainedNode<ScopeT>(
1551 N, getScopeLambda, getScopeLambda, getScopeLambda, getScopeLambda,
1552 getScopeLambda, [](
auto *
N) {
return nullptr; });
1579 DISubprogram *TypeSP =
nullptr;
1582 TypeSP = LS->getSubprogram();
1584 return this == TypeSP;
1597 unsigned Column, StorageType Storage,
1598 bool ShouldCreate) {
1602 assert(Scope &&
"Expected scope");
1610 unsigned Discriminator,
1611 StorageType Storage,
1612 bool ShouldCreate) {
1625 MDString *Name,
bool ExportSymbols,
1626 StorageType Storage,
bool ShouldCreate) {
1643 StorageType Storage,
bool ShouldCreate) {
1661 unsigned LineNo,
bool IsDecl, StorageType Storage,
1662 bool ShouldCreate) {
1671 StorageType Storage,
1675 dwarf::DW_TAG_template_type_parameter, IsDefault,
1681 StorageType Storage,
bool ShouldCreate) {
1690 bool isDefault,
Metadata *
Value, StorageType Storage,
bool ShouldCreate) {
1702 Metadata *StaticDataMemberDeclaration,
1703 Metadata *TemplateParams, uint32_t AlignInBits,
1705 bool ShouldCreate) {
1728 unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
1730 bool ShouldCreate) {
1732 assert(Arg <= UINT16_MAX &&
"Expected argument number to fit in 16-bits");
1754 if (uint64_t
Size =
T->getSizeInBits())
1759 RawType = DT->getRawBaseType();
1768 return std::nullopt;
1771DILabel::DILabel(
LLVMContext &
C, StorageType Storage,
unsigned Line,
1772 unsigned Column,
bool IsArtificial,
1773 std::optional<unsigned> CoroSuspendIdx,
1777 this->Column = Column;
1778 this->IsArtificial = IsArtificial;
1779 this->CoroSuspendIdx = CoroSuspendIdx;
1782 Metadata *File,
unsigned Line,
unsigned Column,
1784 std::optional<unsigned> CoroSuspendIdx,
1785 StorageType Storage,
bool ShouldCreate) {
1786 assert(Scope &&
"Expected scope");
1797 StorageType Storage,
bool ShouldCreate) {
1803 return singleLocElts->size() > 0 &&
1810 return singleLocElts->size() > 0 &&
1811 (*singleLocElts)[0] == dwarf::DW_OP_deref;
1816 return singleLocElts->size() == 1 &&
1817 (*singleLocElts)[0] == dwarf::DW_OP_deref;
1822 bool ShouldCreate) {
1829 uint64_t Op =
getOp();
1831 if (Op >= dwarf::DW_OP_breg0 && Op <= dwarf::DW_OP_breg31)
1839 case dwarf::DW_OP_bregx:
1841 case dwarf::DW_OP_constu:
1842 case dwarf::DW_OP_consts:
1843 case dwarf::DW_OP_deref_size:
1844 case dwarf::DW_OP_xderef_size:
1845 case dwarf::DW_OP_plus_uconst:
1849 case dwarf::DW_OP_regx:
1890 return Op->is(dwarf::DW_OP_constu);
1894 return Op->is(dwarf::DW_OP_plus_uconst);
1898 return Op >= dwarf::DW_OP_lit0 &&
Op <= dwarf::DW_OP_lit31;
1904 if (
I->getSize() >
static_cast<uint64_t
>(E->get() -
I->get()))
1907 uint64_t
Op =
I->getOp();
1908 if ((
Op >= dwarf::DW_OP_reg0 &&
Op <= dwarf::DW_OP_reg31) ||
1909 (
Op >= dwarf::DW_OP_breg0 &&
Op <= dwarf::DW_OP_breg31) ||
isLitOp(
Op))
1918 return I->get() +
I->getSize() == E->get();
1919 case dwarf::DW_OP_stack_value: {
1921 if (
I->get() +
I->getSize() == E->get())
1928 case dwarf::DW_OP_swap: {
1949 if (
I->get() != FirstOp->get() ||
1954 case dwarf::DW_OP_deref_size:
1955 case dwarf::DW_OP_xderef_size:
1966 case dwarf::DW_OP_constu:
1967 case dwarf::DW_OP_plus_uconst:
1968 case dwarf::DW_OP_plus:
1969 case dwarf::DW_OP_minus:
1970 case dwarf::DW_OP_mul:
1971 case dwarf::DW_OP_div:
1972 case dwarf::DW_OP_mod:
1973 case dwarf::DW_OP_or:
1974 case dwarf::DW_OP_and:
1975 case dwarf::DW_OP_xor:
1976 case dwarf::DW_OP_shl:
1977 case dwarf::DW_OP_shr:
1978 case dwarf::DW_OP_shra:
1979 case dwarf::DW_OP_deref:
1980 case dwarf::DW_OP_xderef:
1981 case dwarf::DW_OP_not:
1982 case dwarf::DW_OP_dup:
1983 case dwarf::DW_OP_regx:
1984 case dwarf::DW_OP_bregx:
1985 case dwarf::DW_OP_push_object_address:
1986 case dwarf::DW_OP_over:
1987 case dwarf::DW_OP_rot:
1988 case dwarf::DW_OP_consts:
1989 case dwarf::DW_OP_eq:
1990 case dwarf::DW_OP_ne:
1991 case dwarf::DW_OP_gt:
1992 case dwarf::DW_OP_ge:
1993 case dwarf::DW_OP_lt:
1994 case dwarf::DW_OP_le:
1995 case dwarf::DW_OP_neg:
1996 case dwarf::DW_OP_abs:
2010 for (
const auto &It :
expr_ops()) {
2011 switch (It.getOp()) {
2014 case dwarf::DW_OP_stack_value:
2031 for (
const auto &It :
expr_ops()) {
2032 if (It.isNonEmitting())
2034 switch (It.getOp()) {
2053 auto ExprOpBegin =
expr_ops().begin();
2056 if (Arg.getIndex() != 0)
2061 return !std::any_of(ExprOpBegin, ExprOpEnd,
2065std::optional<ArrayRef<uint64_t>>
2069 return std::nullopt;
2095 return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
2105std::optional<const DIExpression *>
2108 return std::nullopt;
2113 return std::nullopt;
2117 const DIExpression *Expr,
2122 return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
2135 if (
Op.getOp() == dwarf::DW_OP_stack_value ||
2137 Ops.push_back(dwarf::DW_OP_deref);
2140 Op.appendToVector(
Ops);
2143 Ops.push_back(dwarf::DW_OP_deref);
2148 const DIExpression *SecondExpr,
2149 bool SecondIndirect) {
2155 return FirstOps == SecondOps;
2158std::optional<DIExpression::FragmentInfo>
2160 for (
auto I = Start;
I !=
End; ++
I)
2163 return std::nullopt;
2167 std::optional<uint64_t> InitialActiveBits = Var->
getSizeInBits();
2168 std::optional<uint64_t> ActiveBits = InitialActiveBits;
2169 auto NarrowActiveBits = [&](uint64_t SizeInBits) {
2170 ActiveBits = ActiveBits ? std::min(*ActiveBits, SizeInBits) : SizeInBits;
2174 switch (
Op.getOp()) {
2178 ActiveBits = InitialActiveBits;
2185 std::optional<DIBasicType::Signedness> VarSign = Var->
getSignedness();
2187 if (!VarSign || VarSigned != Extract.isSigned()) {
2188 ActiveBits = InitialActiveBits;
2191 NarrowActiveBits(Extract.getSizeInBits());
2205 Ops.push_back(dwarf::DW_OP_plus_uconst);
2208 Ops.push_back(dwarf::DW_OP_constu);
2211 uint64_t AbsMinusOne = -(
Offset+1);
2212 Ops.push_back(AbsMinusOne + 1);
2213 Ops.push_back(dwarf::DW_OP_minus);
2219 if (!SingleLocEltsOpt)
2221 auto SingleLocElts = *SingleLocEltsOpt;
2223 if (SingleLocElts.size() == 0) {
2228 if (SingleLocElts.size() == 2 &&
2229 SingleLocElts[0] == dwarf::DW_OP_plus_uconst) {
2230 Offset = SingleLocElts[1];
2234 if (SingleLocElts.size() == 3 && SingleLocElts[0] == dwarf::DW_OP_constu) {
2235 if (SingleLocElts[2] == dwarf::DW_OP_plus) {
2236 Offset = SingleLocElts[1];
2239 if (SingleLocElts[2] == dwarf::DW_OP_minus) {
2240 Offset = -SingleLocElts[1];
2252 RemainingOps.
clear();
2256 while (ExprOpIt != ExprOpEnd) {
2257 uint64_t
Op = ExprOpIt->getOp();
2258 if (
Op == dwarf::DW_OP_deref ||
Op == dwarf::DW_OP_deref_size ||
2268 if (ExprOpIt->getOp() == dwarf::DW_OP_plus)
2269 OffsetInBytes +=
Value;
2270 else if (ExprOpIt->getOp() == dwarf::DW_OP_minus)
2271 OffsetInBytes -=
Value;
2280 RemainingOps.
append(ExprOpIt.getBase(), ExprOpEnd.getBase());
2287 if (!SingleLocEltsOpt) {
2289 RemainingOps.
clear();
2300 SeenOps.
insert(Arg.getIndex());
2301 for (uint64_t Idx = 0; Idx <
N; ++Idx)
2308 unsigned &AddrClass) {
2312 if (!SingleLocEltsOpt)
2325 if (!SwapOp.
is(dwarf::DW_OP_swap) || !(XDerefOp.
is(dwarf::DW_OP_xderef) ||
2326 XDerefOp.
is(dwarf::DW_OP_xderef_size)))
2329 uint64_t
Op = AddrSpaceOp.
getOp();
2330 if (
Op == dwarf::DW_OP_constu)
2331 AddrClass = AddrSpaceOp.
getArg(0);
2333 AddrClass =
Op - dwarf::DW_OP_lit0;
2337 if (AddrSpaceOp.
get() == SingleLocElts.
begin())
2347 Ops.push_back(dwarf::DW_OP_deref);
2351 Ops.push_back(dwarf::DW_OP_deref);
2362 assert(Expr &&
"Can't add ops to this expression");
2366 [](
auto Op) { return Op.is(dwarf::DW_OP_LLVM_arg); })) {
2368 "Location Index must be 0 for a non-variadic expression.");
2377 if (
Op.getOp() == dwarf::DW_OP_stack_value)
2380 NewOps.
push_back(dwarf::DW_OP_stack_value);
2384 Op.appendToVector(NewOps);
2389 NewOps.
push_back(dwarf::DW_OP_stack_value);
2395 uint64_t OldArg, uint64_t NewArg) {
2396 assert(Expr &&
"Can't replace args in this expression");
2402 if (!Arg || Arg.getIndex() < OldArg) {
2403 Op.appendToVector(NewOps);
2407 uint64_t ArgIndex = Arg.getIndex() == OldArg ? NewArg : Arg.getIndex();
2410 if (ArgIndex > OldArg)
2420 assert(Expr &&
"Can't prepend ops to this expression");
2436 if (
Op.getOp() == dwarf::DW_OP_stack_value)
2439 Ops.push_back(dwarf::DW_OP_stack_value);
2443 Op.appendToVector(
Ops);
2446 Ops.push_back(dwarf::DW_OP_stack_value);
2452 assert(Expr && !
Ops.empty() &&
"Can't append ops to this expression");
2458 if (
Op.getOp() == dwarf::DW_OP_stack_value ||
2465 Op.appendToVector(NewOps);
2470 assert(result->isValid() &&
"concatenated expression is not valid");
2476 assert(Expr && !
Ops.empty() &&
"Can't append ops to this expression");
2480 return Op.getOp() == dwarf::DW_OP_stack_value ||
2481 Op.getOp() == dwarf::DW_OP_LLVM_fragment;
2483 "Can't append this op");
2488 std::optional<uint64_t> LastValueOp;
2492 LastValueOp =
Op.getOp();
2494 bool NeedsDeref = LastValueOp && *LastValueOp != dwarf::DW_OP_stack_value;
2495 bool NeedsStackValue = NeedsDeref || !LastValueOp;
2503 if (NeedsStackValue)
2504 NewOps.
push_back(dwarf::DW_OP_stack_value);
2509 const DIExpression *Expr,
unsigned OffsetInBits,
unsigned SizeInBits) {
2513 bool CanSplitValue =
true;
2515 bool EmitFragment =
true;
2519 switch (
Op.getOp()) {
2522 case dwarf::DW_OP_shr:
2523 case dwarf::DW_OP_shra:
2524 case dwarf::DW_OP_shl:
2525 case dwarf::DW_OP_plus:
2526 case dwarf::DW_OP_plus_uconst:
2527 case dwarf::DW_OP_minus:
2533 CanSplitValue =
false;
2535 case dwarf::DW_OP_deref:
2536 case dwarf::DW_OP_deref_size:
2537 case dwarf::DW_OP_deref_type:
2538 case dwarf::DW_OP_xderef:
2539 case dwarf::DW_OP_xderef_size:
2540 case dwarf::DW_OP_xderef_type:
2543 CanSplitValue =
true;
2545 case dwarf::DW_OP_stack_value:
2548 return std::nullopt;
2556 return std::nullopt;
2558 uint64_t FragmentOffsetInBits =
Fragment.getOffsetInBits();
2559 uint64_t FragmentSizeInBits =
Fragment.getSizeInBits();
2560 (void)FragmentSizeInBits;
2561 assert((OffsetInBits + SizeInBits <= FragmentSizeInBits) &&
2562 "new fragment outside of original fragment");
2563 OffsetInBits += FragmentOffsetInBits;
2572 uint64_t ExtractOffsetInBits = Extract.getOffsetInBits();
2573 uint64_t ExtractSizeInBits = Extract.getSizeInBits();
2574 if (ExtractOffsetInBits >= OffsetInBits &&
2575 ExtractOffsetInBits + ExtractSizeInBits <=
2576 OffsetInBits + SizeInBits) {
2577 Ops.push_back(
Op.getOp());
2578 Ops.push_back(ExtractOffsetInBits - OffsetInBits);
2579 Ops.push_back(ExtractSizeInBits);
2580 EmitFragment =
false;
2586 return std::nullopt;
2589 Op.appendToVector(
Ops);
2593 assert(Expr &&
"Unknown DIExpression");
2596 Ops.push_back(OffsetInBits);
2597 Ops.push_back(SizeInBits);
2605 uint64_t SliceSizeInBits,
const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
2607 std::optional<DIExpression::FragmentInfo> &Result,
2608 int64_t &OffsetFromLocationInBits) {
2620 int64_t MemStartRelToDbgStartInBits;
2623 if (!MemOffsetFromDbgInBytes)
2626 MemStartRelToDbgStartInBits = *MemOffsetFromDbgInBytes * 8;
2628 MemStartRelToDbgStartInBits +=
2629 SliceOffsetInBits - (DbgPtrOffsetInBits + DbgExtractOffsetInBits);
2633 OffsetFromLocationInBits = -MemStartRelToDbgStartInBits;
2636 int64_t MemEndRelToDbgStart = MemStartRelToDbgStartInBits + SliceSizeInBits;
2637 if (MemEndRelToDbgStart < 0) {
2649 int64_t MemStartRelToVarInBits =
2651 int64_t MemEndRelToVarInBits = MemStartRelToVarInBits + SliceSizeInBits;
2656 int64_t MemFragStart = std::max<int64_t>(0, MemStartRelToVarInBits);
2657 int64_t MemFragSize =
2658 std::max<int64_t>(0, MemEndRelToVarInBits - MemFragStart);
2664 if (TrimmedSliceOfVariable == VarFrag)
2665 Result = std::nullopt;
2667 Result = TrimmedSliceOfVariable;
2671std::pair<DIExpression *, const ConstantInt *>
2681 switch (
Op.getOp()) {
2695 if (Convert.getEncoding() == dwarf::DW_ATE_signed)
2696 NewInt = NewInt.
sextOrTrunc(Convert.getBitSize());
2698 assert(Convert.getEncoding() == dwarf::DW_ATE_unsigned &&
2699 "Unexpected operand");
2700 NewInt = NewInt.
zextOrTrunc(Convert.getBitSize());
2705 Op.appendToVector(
Ops);
2714 uint64_t Result = 0;
2717 Result = std::max(Result, Arg.getIndex() + 1);
2719 "Expression is missing one or more location operands.");
2723std::optional<DIExpression::SignedOrUnsignedConstant>
2734 return std::nullopt;
2736 if (
Op != dwarf::DW_OP_consts &&
Op != dwarf::DW_OP_constu && !
isLitOp(
Op))
2737 return std::nullopt;
2745 if (NumElements != ConstSize && NumElements != ConstSize + 1 &&
2746 NumElements != ConstSize + 4)
2747 return std::nullopt;
2749 if (NumElements == ConstSize &&
Op == dwarf::DW_OP_consts)
2752 if ((NumElements == ConstSize + 1 &&
2753 getElement(ConstSize) != dwarf::DW_OP_stack_value) ||
2754 (NumElements == ConstSize + 4 &&
2755 (
getElement(ConstSize) != dwarf::DW_OP_stack_value ||
2757 return std::nullopt;
2766 return Op - dwarf::DW_OP_lit0;
2779 unsigned FromSize,
unsigned ToSize,
2787 bool ShouldCreate) {
2795 : DINode(
C, DIObjCPropertyKind,
Storage, dwarf::DW_TAG_APPLE_property,
Ops),
2801 Metadata *
Type, StorageType Storage,
bool ShouldCreate) {
2811DIProperty::DIProperty(
LLVMContext &
C, StorageType Storage,
unsigned Line,
2818 Metadata *BackingStorage, StorageType Storage,
2819 bool ShouldCreate) {
2830 StorageType Storage,
2831 bool ShouldCreate) {
2841 bool ShouldCreate) {
2850 Metadata *Elements, StorageType Storage,
2851 bool ShouldCreate) {
2859 auto ExistingIt = Context.pImpl->DIArgLists.find_as(
DIArgListKeyInfo(Args));
2860 if (ExistingIt != Context.pImpl->DIArgLists.end())
2862 DIArgList *NewArgList =
new DIArgList(Context, Args);
2863 Context.pImpl->DIArgLists.insert(NewArgList);
2870 "DIArgList must be passed a ValueAsMetadata");
2877 if (&VM == OldVMPtr) {
2889 if (ExistingArgList) {
2899void DIArgList::track() {
2904void DIArgList::untrack() {
2909void DIArgList::dropAllReferences(
bool Untrack) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
This file defines the DenseSet and SmallDenseSet classes.
static unsigned encodingBits(unsigned C)
static unsigned encodeComponent(unsigned C)
static unsigned getNextComponentInDiscriminator(unsigned D)
Returns the next component stored in discriminator.
static unsigned getUnsignedFromPrefixEncoding(unsigned U)
Reverse transformation as getPrefixEncodingFromUnsigned.
This file contains constants used for implementing Dwarf debug support.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first DebugLoc that has line number information, given a range of instructions.
static constexpr StringLiteral Filename
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file implements a set that has insertion order iteration characteristics.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Class for arbitrary precision integers.
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Annotations lets you mark points and ranges inside source code, for tests:
Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
This is the shared class of boolean and integer constants.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
const APInt & getValue() const
Return the constant as an APInt value reference.
This is an important base class in LLVM.
LLVM_ABI void handleChangedOperand(void *Ref, Metadata *New)
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, unsigned LineNo, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, ArrayRef< Metadata * > Ops)
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t DIFlags Flags unsigned StringRef DIFile * File
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t DIFlags Flags unsigned StringRef DIFile unsigned DIScope * Scope
unsigned StringRef uint64_t SizeInBits
LLVM_ABI std::optional< Signedness > getSignedness() const
Return the signedness of this type, or std::nullopt if this type is neither signed nor unsigned.
unsigned getEncoding() const
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t NumExtraInhabitants
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File, unsigned LineNo, DIScope *Scope, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags, StorageType Storage, bool ShouldCreate=true)
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t AlignInBits
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t DIFlags Flags unsigned StringRef DIFile unsigned LineNo
Metadata Metadata MDString Metadata unsigned LineNo
Metadata Metadata MDString * Name
Metadata Metadata MDString Metadata * File
static LLVM_ABI const char * nameTableKindString(DebugNameTableKind PK)
static LLVM_ABI const char * emissionKindString(DebugEmissionKind EK)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString * SysRoot
DISourceLanguageName Metadata MDString bool MDString * Flags
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString * SDK
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata * GlobalVariables
DebugEmissionKind getEmissionKind() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata * EnumTypes
DISourceLanguageName Metadata MDString * Producer
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata * RetainedTypes
DISourceLanguageName Metadata MDString bool MDString unsigned MDString * SplitDebugFilename
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata * ImportedEntities
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata * Macros
DebugNameTableKind getNameTableKind() const
DISourceLanguageName Metadata * File
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t AlignInBits
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > EnumKind
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata * DataLocation
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
unsigned MDString Metadata unsigned Line
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata * Elements
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned RuntimeLang
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata * Annotations
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString * Identifier
static LLVM_ABI DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata * Discriminator
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata * TemplateParams
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t OffsetInBits
unsigned MDString Metadata unsigned Metadata * Scope
unsigned MDString Metadata * File
unsigned MDString Metadata unsigned Metadata Metadata * BaseType
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Flags
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata * Allocated
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata * Specification
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata * VTableHolder
unsigned MDString Metadata unsigned Metadata Metadata uint64_t SizeInBits
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata * Associated
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t NumExtraInhabitants
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata * Rank
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t Metadata * BitStride
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata * OffsetInBits
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t AlignInBits
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > PtrAuthData
Metadata * getExtraData() const
Get extra data associated with this derived type.
unsigned StringRef DIFile * File
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > DWARFAddressSpace
LLVM_ABI DIType * getClassType() const
Get casted version of extra data.
LLVM_ABI Constant * getConstant() const
unsigned StringRef DIFile unsigned DIScope DIType Metadata * SizeInBits
LLVM_ABI Constant * getStorageOffsetInBits() const
LLVM_ABI Constant * getDiscriminantValue() const
LLVM_ABI uint32_t getVBPtrOffset() const
int64_t bool MDString * Name
static LLVM_ABI bool classof(const ExprOperand *Op)
static LLVM_ABI bool classof(const ExprOperand *Op)
static LLVM_ABI bool classof(const ExprOperand *Op)
static LLVM_ABI bool classof(const ExprOperand *Op)
A lightweight wrapper around an expression operand.
LLVM_ABI bool isNonEmitting() const
Return true if CodeGen handles this operand without adding bytes to the DWARF expression.
LLVM_ABI unsigned getSize() const
Return the size of the operand.
uint64_t getArg(unsigned I) const
Get an argument to the operand.
bool is(uint64_t Opcode) const
Return true if this is Opcode.
uint64_t getOp() const
Get the operand code.
const uint64_t * get() const
static LLVM_ABI bool classof(const ExprOperand *Op)
static LLVM_ABI bool classof(const ExprOperand *Op)
static LLVM_ABI bool classof(const ExprOperand *Op)
An iterator for expression operands.
element_iterator elements_end() const
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
iterator_range< expr_op_iterator > expr_ops() const
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
std::array< uint64_t, 6 > ExtOps
unsigned getNumElements() const
static LLVM_ABI bool isLitOp(uint64_t Op)
Return true if Op is one of DW_OP_lit0 through DW_OP_lit31.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
expr_op_iterator expr_op_begin() const
Visit the elements via ExprOperand wrappers.
LLVM_ABI bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
DbgVariableFragmentInfo FragmentInfo
LLVM_ABI bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
static LLVM_ABI bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
expr_op_iterator expr_op_end() const
LLVM_ABI bool isImplicit() const
Return whether this is an implicit location description.
static LLVM_ABI bool calculateFragmentIntersect(const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits, int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag, std::optional< DIExpression::FragmentInfo > &Result, int64_t &OffsetFromLocationInBits)
Computes a fragment, bit-extract operation if needed, and new constant offset to describe a part of a...
element_iterator elements_begin() const
LLVM_ABI bool hasAllLocationOps(unsigned N) const
Returns true iff this DIExpression contains at least one instance of DW_OP_LLVM_arg,...
std::optional< FragmentInfo > getFragmentInfo() const
Retrieve the details of this fragment expression.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
LLVM_ABI uint64_t getConstantValue() const
Return the value of a constant expression, as recognized by isConstant().
LLVM_ABI bool isComplex() const
Return whether the location is computed on the expression stack, meaning it cannot be a simple regist...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
LLVM_ABI std::pair< DIExpression *, const ConstantInt * > constantFold(const ConstantInt *CI)
Try to shorten an expression with an initial constant operand.
LLVM_ABI bool isDeref() const
Return whether there is exactly one operator and it is a DW_OP_deref;.
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
ArrayRef< uint64_t > getElements() const
static LLVM_ABI DIExpression * replaceArg(const DIExpression *Expr, uint64_t OldArg, uint64_t NewArg)
Create a copy of Expr with each instance of DW_OP_LLVM_arg, \p OldArg replaced with DW_OP_LLVM_arg,...
LLVM_ABI std::optional< uint64_t > getActiveBits(DIVariable *Var)
Return the number of bits that have an active value, i.e.
static LLVM_ABI void canonicalizeExpressionOps(SmallVectorImpl< uint64_t > &Ops, const DIExpression *Expr, bool IsIndirect)
Inserts the elements of Expr into Ops modified to a canonical form, which uses DW_OP_LLVM_arg (i....
uint64_t getElement(unsigned I) const
static LLVM_ABI bool extractLeadingOffset(ArrayRef< uint64_t > Ops, int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps)
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * appendToStack(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Convert DIExpr into a stack value if it isn't one already by appending DW_OP_deref if needed,...
static LLVM_ABI DIExpression * appendExt(const DIExpression *Expr, unsigned FromSize, unsigned ToSize, bool Signed)
Append a zero- or sign-extension to Expr.
LLVM_ABI std::optional< ArrayRef< uint64_t > > getSingleLocationExpressionElements() const
Returns a reference to the elements contained in this expression, skipping past the leading DW_OP_LLV...
LLVM_ABI bool isSingleLocationExpression() const
Return whether the evaluated expression makes use of a single location at the start of the expression...
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
LLVM_ABI bool isValid() const
static LLVM_ABI const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the expression ends with <DWARF Address Space> DW_OP_swap DW_OP_xderef[_size],...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
MDString MDString * Directory
MDString MDString std::optional< ChecksumInfo< MDString * > > MDString * Source
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
MDString MDString std::optional< ChecksumInfo< MDString * > > CS
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int APInt Numerator
unsigned StringRef DIFile unsigned LineNo
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned Encoding
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int APInt APInt Denominator
unsigned StringRef DIFile unsigned DIScope uint64_t SizeInBits
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t AlignInBits
LLVM_ABI bool isSigned() const
unsigned StringRef DIFile unsigned DIScope uint64_t uint32_t unsigned DIFlags unsigned int Factor
@ FixedPointBinary
Scale factor 2^Factor.
@ FixedPointDecimal
Scale factor 10^Factor.
@ FixedPointRational
Arbitrary rational scale factor.
unsigned StringRef DIFile * File
Metadata * getRawLowerBound() const
Metadata * getRawCountNode() const
Metadata * getRawStride() const
LLVM_ABI BoundType getLowerBound() const
Metadata * getRawUpperBound() const
LLVM_ABI BoundType getCount() const
LLVM_ABI BoundType getUpperBound() const
PointerUnion< DIVariable *, DIExpression * > BoundType
LLVM_ABI BoundType getStride() const
A pair of DIGlobalVariable and DIExpression.
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata * TemplateParams
Metadata MDString MDString Metadata unsigned Line
Metadata MDString MDString Metadata unsigned Metadata * Type
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t Metadata * Annotations
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata * StaticDataMemberDeclaration
Metadata MDString MDString * LinkageName
Metadata MDString MDString Metadata * File
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t AlignInBits
An imported module (C++ using directive or similar).
unsigned Metadata Metadata * Entity
unsigned Metadata Metadata Metadata unsigned Line
unsigned Metadata Metadata Metadata unsigned MDString * Name
unsigned Metadata Metadata Metadata * File
unsigned Metadata * Scope
Metadata MDString Metadata unsigned unsigned bool std::optional< unsigned > CoroSuspendIdx
Metadata MDString Metadata unsigned unsigned Column
Metadata MDString Metadata unsigned unsigned bool IsArtificial
Metadata MDString Metadata unsigned Line
Metadata MDString Metadata * File
A sequence of DILayerLoc entries.
iterator_range< layer_iterator > layers() const
A single intermediate-IR layer location.
LLVM_ABI DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops)
Metadata Metadata unsigned Discriminator
Metadata Metadata unsigned unsigned Column
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
LLVM_ABI DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
static LLVM_ABI DILocalScope * cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "...
Metadata MDString Metadata unsigned Metadata * Type
Metadata MDString Metadata * File
Metadata MDString Metadata unsigned Line
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t Metadata * Annotations
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t AlignInBits
unsigned unsigned DILocalScope * Scope
static LLVM_ABI DILocation * getMergedLocations(ArrayRef< DILocation * > Locs)
Try to combine the vector of locations passed as input in a single one.
DILayerLocList * getIRLayers() const
unsigned unsigned DILocalScope DILocation bool uint64_t uint8_t Metadata * IRLayers
static LLVM_ABI std::optional< unsigned > encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI)
Raw encoding of the discriminator.
unsigned unsigned DILocalScope DILocation bool ImplicitCode
static LLVM_ABI void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, unsigned &CI)
Raw decoder for values in an encoded discriminator D.
static LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
unsigned unsigned DILocalScope DILocation * InlinedAt
unsigned unsigned Metadata * File
unsigned unsigned Metadata Metadata * Elements
unsigned unsigned MDString MDString * Value
unsigned unsigned MDString * Name
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Metadata Metadata * Scope
Metadata Metadata MDString * Name
Metadata Metadata MDString MDString MDString MDString * APINotesFile
Metadata Metadata MDString MDString MDString * IncludePath
Metadata Metadata MDString MDString * ConfigurationMacros
Metadata Metadata MDString MDString MDString MDString unsigned LineNo
Metadata MDString bool ExportSymbols
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
static LLVM_ABI DIFlags getFlag(StringRef Flag)
static LLVM_ABI DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
static LLVM_ABI StringRef getFlagString(DIFlags Flag)
MDString Metadata unsigned MDString MDString unsigned Metadata * Type
MDString Metadata unsigned MDString * GetterName
MDString Metadata unsigned MDString MDString * SetterName
A property of a class or structure.
MDString Metadata unsigned Metadata * Type
MDString Metadata unsigned Metadata Metadata * BackingStorage
Base class for scope-like contexts.
LLVM_ABI StringRef getName() const
LLVM_ABI DIScope * getScope() const
DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
Wrapper structure that holds source language identity metadata that includes language name,...
String type, Fortran CHARACTER(n)
unsigned MDString Metadata Metadata Metadata uint64_t SizeInBits
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t AlignInBits
unsigned MDString Metadata Metadata Metadata * StringLocationExp
unsigned MDString Metadata Metadata * StringLengthExp
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t unsigned Encoding
unsigned MDString Metadata * StringLength
Subprogram description. Uses SubclassData1.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString bool UsesKeyInstructions
LLVM_ABI void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
Metadata MDString MDString Metadata unsigned Metadata unsigned ScopeLine
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags SPFlags
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata * ContainingType
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata * TemplateParams
static LLVM_ABI DILocalScope * getRetainedNodeScope(MDNode *N)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString * TargetFuncName
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static LLVM_ABI const DIScope * getRawRetainedNodeScope(const MDNode *N)
void cleanupRetainedNodesIf(T &&Pred)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata * ThrownTypes
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
Metadata MDString MDString Metadata * File
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned VirtualIndex
static LLVM_ABI DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static LLVM_ABI StringRef getFlagString(DISPFlags Flag)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata * RetainedNodes
DISPFlags
Debug info subprogram flags.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int ThisAdjustment
LLVM_ABI bool describes(const Function *F) const
Check if this subprogram describes the given function.
StringRef DIFile unsigned Line
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata * UpperBound
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata Metadata * Bias
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata * Stride
StringRef DIFile unsigned DIScope uint64_t SizeInBits
PointerUnion< ConstantInt *, DIVariable *, DIExpression *, DIDerivedType * > BoundType
StringRef DIFile unsigned DIScope uint64_t uint32_t AlignInBits
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata * LowerBound
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags Flags
LLVM_ABI BoundType getUpperBound() const
LLVM_ABI BoundType getStride() const
LLVM_ABI BoundType getLowerBound() const
LLVM_ABI BoundType getCount() const
Type array for a subprogram.
DIFlags uint8_t Metadata * TypeArray
Base class for template parameters.
unsigned MDString Metadata * Type
unsigned MDString Metadata bool Metadata * Value
bool isStaticMember() const
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants, DIFlags Flags, ArrayRef< Metadata * > Ops)
LLVM_ABI uint32_t getAlignInBits() const
Base class for variables.
std::optional< DIBasicType::Signedness > getSignedness() const
Return the signedness of this variable's type, or std::nullopt if this type is neither signed nor uns...
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
Metadata * getRawType() const
LLVM_ABI DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, signed Line, ArrayRef< Metadata * > Ops, uint32_t AlignInBits=0)
A parsed version of the target data layout string in and methods for querying it.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI DebugVariableAggregate(const DbgVariableRecord *DVR)
const DILocation * getInlinedAt() const
const DILocalVariable * getVariable() const
LLVM_ABI DebugVariable(const DbgVariableRecord *DVR)
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Class representing an expression and its matching format.
Generic tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
unsigned MDString * Header
unsigned MDString ArrayRef< Metadata * > DwarfOps
DenseSet< DIArgList *, DIArgListInfo > DIArgLists
This is an important class for using LLVM in a threaded context.
LLVMContextImpl *const pImpl
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithUniqued(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a uniqued one.
Tracking metadata reference owned by Metadata.
LLVM_ABI StringRef getString() const
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
LLVMContext & getContext() const
LLVM_ABI void resolveAllUses(bool ResolveUsers=true)
Resolve all uses of this.
LLVM_ABI void replaceAllUsesWith(Metadata *MD)
Replace all uses of this with MD.
Implements a dense probed hash-table based set with some number of buckets stored inline.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
LLVM Value Representation.
LLVM_ABI std::optional< int64_t > getPointerOffsetFrom(const Value *Other, const DataLayout &DL) const
If this ptr is provably equal to Other plus a constant offset, return that offset in bytes.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
Calculates the starting offsets for various sections within the .debug_names section.
@ DW_OP_LLVM_entry_value
Only used in LLVM metadata.
@ DW_OP_LLVM_implicit_pointer
Only used in LLVM metadata.
@ DW_OP_LLVM_extract_bits_zext
Only used in LLVM metadata.
@ DW_OP_LLVM_tag_offset
Only used in LLVM metadata.
@ DW_OP_LLVM_fragment
Only used in LLVM metadata.
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
@ DW_OP_LLVM_convert
Only used in LLVM metadata.
@ DW_OP_LLVM_extract_bits_sext
Only used in LLVM metadata.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
static T * getUniqued(DenseSet< T *, InfoT > &Store, const typename InfoT::KeyTy &Key)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto cast_or_null(const Y &Val)
static const DIScope * getScope(const NodeT *N)
auto dyn_cast_or_null(const Y &Val)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
auto reverse(ContainerTy &&C)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Ref
The access may reference the value stored in memory.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI cl::opt< bool > PickMergedSourceLocations("pick-merged-source-locations", cl::init(false), cl::Hidden, cl::desc("Preserve line and column number when merging locations."))
@ End
Run the machine verifier once, at the end of the pipeline.
@ Keep
No function return thunk.
Implement std::hash so that hash_code can be used in STL containers.
SmallPtrSet< DIScope *, 8 > Scopes
void insert(DIScope *S, LineColumn Loc)
DIScope * match(DIScope *S, LineColumn Loc)
void insert(DIScope *S, LineColumn Loc)
DIScope * match(DIScope *S, LineColumn Loc)
SmallMapVector< std::pair< DIFile *, LineColumn >, SmallSetVector< DIScope *, 8 >, 8 > Scopes
A single checksum, represented by a Kind and a Value (a string).
static DbgVariableFragmentInfo intersect(DbgVariableFragmentInfo A, DbgVariableFragmentInfo B)
Returns a zero-sized fragment if A and B don't intersect.
A MapVector that performs no allocations if smaller than a certain size.