65 :
Value(Ty, MetadataAsValueVal), MD(MD) {
93 if (!
N ||
N->getNumOperands() != 1)
96 if (!
N->getOperand(0))
109 auto *&Entry = Context.pImpl->MetadataAsValues[MD];
118 auto &
Store = Context.pImpl->MetadataAsValues;
119 return Store.lookup(MD);
122void MetadataAsValue::handleChangedMetadata(
Metadata *MD) {
125 auto &
Store = Context.pImpl->MetadataAsValues;
128 Store.erase(this->MD);
133 auto *&Entry =
Store[MD];
145void MetadataAsValue::track() {
150void MetadataAsValue::untrack() {
165 auto OldMD =
static_cast<Metadata **
>(Old);
176void DebugValueUser::trackDebugValue(
size_t Idx) {
177 assert(Idx < 3 &&
"Invalid debug value index.");
183 ID->Records.push_back(
getUser());
186void DebugValueUser::trackDebugValues() {
191void DebugValueUser::untrackDebugValue(
size_t Idx) {
192 assert(Idx < 3 &&
"Invalid debug value index.");
201void DebugValueUser::untrackDebugValues() {
203 untrackDebugValue(
I);
207 assert(DebugValueUser::operator==(
X) &&
"Expected values to match");
213 X.DebugValues.fill(
nullptr);
217 assert(
Ref &&
"Expected live reference");
219 "Reference without owner must be direct");
220 if (
auto *R = ReplaceableUses::getOrCreate(MD)) {
225 assert(!PH->Use &&
"Placeholders can only be used once");
234 assert(
Ref &&
"Expected live reference");
235 if (
auto *R = ReplaceableUses::getIfExists(MD))
242 assert(
Ref &&
"Expected live reference");
243 assert(New &&
"Expected live reference");
245 if (
auto *R = ReplaceableUses::getIfExists(MD)) {
246 R->moveRef(
Ref, New, MD);
250 "Unexpected move of an MDOperand");
252 "Expected un-replaceable metadata, since we didn't move a reference");
257 return ReplaceableUses::isReplaceable(MD);
262 for (
auto Pair : UseMap) {
270 MDUsersWithID.
push_back(&UseMap[Pair.first]);
272 llvm::sort(MDUsersWithID, [](
auto UserA,
auto UserB) {
273 return UserA->second < UserB->second;
276 for (
auto *UserWithID : MDUsersWithID)
284 for (
auto Pair : UseMap) {
290 DVRUsersWithID.
push_back(&UseMap[Pair.first]);
297 llvm::sort(DVRUsersWithID, [](
auto UserA,
auto UserB) {
298 return UserA->second > UserB->second;
301 for (
auto UserWithID : DVRUsersWithID)
306void ReplaceableUses::addRef(
void *
Ref, OwnerTy
Owner) {
308 UseMap.insert(std::make_pair(
Ref, std::make_pair(
Owner, NextIndex)))
311 assert(WasInserted &&
"Expected to add a reference");
314 assert(NextIndex != 0 &&
"Unexpected overflow");
317void ReplaceableUses::dropRef(
void *
Ref) {
318 bool WasErased = UseMap.erase(
Ref);
320 assert(WasErased &&
"Expected to drop a reference");
323void ReplaceableUses::moveRef(
void *
Ref,
void *New,
const Metadata &MD) {
324 auto I = UseMap.find(
Ref);
325 assert(
I != UseMap.end() &&
"Expected to move a reference");
326 auto OwnerAndIndex =
I->second;
328 bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
330 assert(WasInserted &&
"Expected to add a reference");
335 "Reference without owner must be direct");
336 assert((OwnerAndIndex.first || *
static_cast<Metadata **
>(New) == &MD) &&
337 "Reference without owner must be direct");
341 if (!
C.isUsedByMetadata()) {
346 auto &
Store = Context.pImpl->ValuesAsMetadata;
350 std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
355 for (
const auto &Pair :
Uses) {
371 OwnerMD->handleChangedOperand(
382 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
385 return L.second.second < R.second.second;
387 for (
const auto &Pair :
Uses) {
390 if (!UseMap.count(Pair.first))
400 UseMap.erase(Pair.first);
411 DVU->handleChangedValue(Pair.first, MD);
418#define HANDLE_METADATA_LEAF(CLASS) \
419 case Metadata::CLASS##Kind: \
420 cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
422#include "llvm/IR/Metadata.def"
427 assert(UseMap.empty() &&
"Expected all uses to be replaced");
440 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
443 return L.second.second < R.second.second;
446 for (
const auto &Pair :
Uses) {
447 auto Owner = Pair.second.first;
457 if (OwnerMD->isResolved())
459 OwnerMD->decrementUnresolvedOperandCount();
467 return VAM && VAM->getValue()->hasUseList();
475 return N->isResolved() ? nullptr :
N->Context.getOrCreateReplaceableUses();
484 return N->isResolved() ? nullptr :
N->Context.getReplaceableUses();
491bool ReplaceableUses::isReplaceable(
const Metadata &MD) {
493 return !
N->isResolved();
498 assert(V &&
"Expected value");
500 if (
auto *Fn =
A->getParent())
501 return Fn->getSubprogram();
506 if (
auto *Fn = BB->getParent())
507 return Fn->getSubprogram();
515 assert(V &&
"Unexpected null Value");
517 auto &Context = V->getContext();
518 auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
521 "Expected constant or function-local value");
522 assert(!V->IsUsedByMD &&
"Expected this to be the only metadata use");
523 V->IsUsedByMD =
true;
534 assert(V &&
"Unexpected null Value");
535 return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
539 assert(V &&
"Expected valid value");
541 auto &
Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
548 assert(MD &&
"Expected valid metadata");
558 assert(From &&
"Expected valid value");
559 assert(To &&
"Expected valid value");
560 assert(From != To &&
"Expected changed value");
565 auto I =
Store.find(From);
574 assert(MD &&
"Expected valid metadata");
586 if (!FromSP || !ToSP || FromSP == ToSP)
598 auto &
Store = Context.pImpl->MDStringCache;
599 auto I =
Store.try_emplace(Str);
600 auto &MapEntry =
I.first->getValue();
603 MapEntry.Entry = &*
I.first;
608 auto &
Store = Context.pImpl->MDStringCache;
612 return &
I->getValue();
616 assert(Entry &&
"Expected to find string map entry");
617 return Entry->first();
626#define HANDLE_MDNODE_LEAF(CLASS) \
628 alignof(uint64_t) >= alignof(CLASS), \
629 "Alignment is insufficient after objects prepended to " #CLASS);
630#include "llvm/IR/Metadata.def"
635 static_assert(
sizeof(Header) ==
sizeof(size_t) + 2 *
sizeof(
uint32_t),
636 "MDNode header fields poorly packed");
639 char *Mem =
reinterpret_cast<char *
>(::operator
new(AllocSize +
Size));
640 Header *
H =
new (Mem + AllocSize -
sizeof(Header)) Header(
NumOps,
Storage);
641 return reinterpret_cast<void *
>(
H + 1);
644void MDNode::operator
delete(
void *
N) {
645 Header *
H =
reinterpret_cast<Header *
>(
N) - 1;
646 void *Mem =
H->getAllocation();
648 ::operator
delete(Mem);
654 getHeader().MetadataPrintID = Context.pImpl->allocateMetadataPrintID();
667 countUnresolvedOperands();
674#define HANDLE_MDNODE_LEAF(CLASS) \
676 return cast<CLASS>(this)->cloneImpl();
677#include "llvm/IR/Metadata.def"
681MDNode::Header::Header(
size_t NumOps, StorageType Storage) {
682 IsLarge = isLarge(
NumOps);
683 IsResizable = isResizable(
Storage);
684 SmallSize = getSmallSize(
NumOps, IsResizable, IsLarge);
687 new (getLargePtr()) LargeStorageVector();
697MDNode::Header::~Header() {
699 getLarge().~LargeStorageVector();
702 MDOperand *
O =
reinterpret_cast<MDOperand *
>(
this);
703 for (MDOperand *
E = O - SmallSize;
O !=
E; --
O)
704 (O - 1)->~MDOperand();
707void *MDNode::Header::getSmallPtr() {
708 static_assert(
alignof(MDOperand) <=
alignof(Header),
709 "MDOperand too strongly aligned");
710 return reinterpret_cast<char *
>(
const_cast<Header *
>(
this)) -
711 sizeof(MDOperand) * SmallSize;
714void MDNode::Header::resize(
size_t NumOps) {
715 assert(IsResizable &&
"Node is not resizable");
720 getLarge().resize(
NumOps);
721 else if (
NumOps <= SmallSize)
724 resizeSmallToLarge(
NumOps);
727void MDNode::Header::resizeSmall(
size_t NumOps) {
728 assert(!IsLarge &&
"Expected a small MDNode");
729 assert(
NumOps <= SmallSize &&
"NumOps too large for small resize");
734 int NumNew = (int)
NumOps - (
int)ExistingOps.
size();
735 MDOperand *
O = ExistingOps.
end();
736 for (
int I = 0,
E = NumNew;
I <
E; ++
I)
738 for (
int I = 0,
E = NumNew;
I >
E; --
I)
744void MDNode::Header::resizeSmallToLarge(
size_t NumOps) {
745 assert(!IsLarge &&
"Expected a small MDNode");
746 assert(
NumOps > SmallSize &&
"Expected NumOps to be larger than allocation");
747 LargeStorageVector NewOps;
751 new (getLargePtr()) LargeStorageVector(std::move(NewOps));
757 return !
N->isResolved();
761void MDNode::countUnresolvedOperands() {
767void MDNode::makeUniqued() {
771 assert(WasTracked &&
"Temporary node not tracked");
776 Op.reset(
Op.get(),
this);
780 countUnresolvedOperands();
782 dropReplaceableUses();
789void MDNode::makeDistinct() {
794 dropReplaceableUses();
806 dropReplaceableUses();
811void MDNode::dropReplaceableUses() {
815 if (Context.hasReplaceableUses())
816 Context.takeReplaceableUses()->resolveAllUses();
829 decrementUnresolvedOperandCount();
832void MDNode::decrementUnresolvedOperandCount() {
843 dropReplaceableUses();
861 "Expected all forward declarations to be resolved");
862 if (!
N->isResolved())
871MDNode *MDNode::replaceWithPermanentImpl() {
875 return replaceWithDistinctImpl();
877#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
880#include "llvm/IR/Metadata.def"
885 return replaceWithDistinctImpl();
886 return replaceWithUniquedImpl();
889MDNode *MDNode::replaceWithUniquedImpl() {
891 MDNode *UniquedNode = uniquify();
893 if (UniquedNode ==
this) {
904MDNode *MDNode::replaceWithDistinctImpl() {
909void MDTuple::recalculateHash() {
910 setHash(MDTupleInfo::KeyTy::calculateHash(
this));
916 if (Context.hasReplaceableUses()) {
917 Context.getReplaceableUses()->resolveAllUses(
false);
918 (void)Context.takeReplaceableUses();
922void MDNode::handleChangedOperand(
void *
Ref,
Metadata *New) {
950 resolveAfterOperandChange(Old, New);
962 if (Context.hasReplaceableUses())
963 Context.getReplaceableUses()->replaceAllUsesWith(
Uniqued);
972void MDNode::deleteAsSubclass() {
975 assert(WasTracked &&
"Temporary node not tracked");
981#define HANDLE_MDNODE_LEAF(CLASS) \
983 delete cast<CLASS>(this); \
985#include "llvm/IR/Metadata.def"
989template <
class T,
class InfoT>
998template <
class NodeTy>
struct MDNode::HasCachedHash {
1001 template <
class U>
static std::false_type
check(...);
1006MDNode *MDNode::uniquify() {
1013#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1014 case CLASS##Kind: { \
1015 CLASS *SubclassThis = cast<CLASS>(this); \
1016 dispatchRecalculateHash(SubclassThis); \
1017 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
1019#include "llvm/IR/Metadata.def"
1023void MDNode::eraseFromStore() {
1027#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1029 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
1031#include "llvm/IR/Metadata.def"
1039 MDTupleInfo::KeyTy
Key(MDs);
1044 Hash =
Key.getHash();
1046 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
1050 MDTuple(Context,
Storage, Hash, MDs),
1051 Storage, Context.pImpl->MDTuples);
1055 assert(
N->isTemporary() &&
"Expected temporary node");
1056 N->replaceAllUsesWith(
nullptr);
1057 N->deleteAsSubclass();
1061 assert(!Context.hasReplaceableUses() &&
"Unexpected replaceable uses");
1065 assert(WasTracked &&
"Temporary node not tracked");
1075#define HANDLE_MDNODE_LEAF(CLASS) \
1076 case CLASS##Kind: { \
1077 dispatchResetHash(cast<CLASS>(this)); \
1080#include "llvm/IR/Metadata.def"
1113 if (
N->getNumOperands() ==
Ops.size() &&
N ==
N->getOperand(0)) {
1114 for (
unsigned I = 1,
E =
Ops.size();
I !=
E; ++
I)
1115 if (
Ops[
I] !=
N->getOperand(
I))
1130 MDs.
insert(
B->op_begin(),
B->op_end());
1178 return MDs.
empty() ? nullptr
1199 assert(
A &&
B && AInstr && BInstr &&
"Caller should guarantee");
1204 assert(
A->getNumOperands() >= 2 &&
B->getNumOperands() >= 2 &&
1205 "!prof annotations should have no less than 2 operands");
1209 assert(AMDS !=
nullptr && BMDS !=
nullptr &&
1210 "first operand should be a non-null MDString");
1219 assert(AInstrWeight && BInstrWeight &&
"verified by LLVM verifier");
1222 MDHelper.createConstant(ConstantInt::get(
1237 switch (
I.getOpcode()) {
1238 case Instruction::Invoke:
1239 case Instruction::CondBr:
1240 case Instruction::Switch:
1241 case Instruction::Call:
1242 case Instruction::IndirectBr:
1243 case Instruction::Select:
1244 case Instruction::CallBr:
1250 if (AInstr && !IsLegal(*AInstr))
1252 if (BInstr && !IsLegal(*BInstr))
1260 "Caller should guarantee");
1262 "Caller should guarantee");
1270 return mergeDirectCallProfMetadata(
A,
B, AInstr, BInstr);
1281 return A.getUpper() ==
B.getLower() ||
A.getLower() ==
B.getUpper();
1292 const APInt &LB = EndPoints[
Size - 2]->getValue();
1293 const APInt &LE = EndPoints[
Size - 1]->getValue();
1298 EndPoints[
Size - 2] =
1300 EndPoints[
Size - 1] =
1309 if (!EndPoints.
empty())
1324 auto AddUniqueCallees = [&AB, &MergedCallees](
const MDNode *
N) {
1326 if (MergedCallees.
insert(MD).second)
1330 AddUniqueCallees(
A);
1331 AddUniqueCallees(
B);
1354 return const_cast<MDNode *
>(
A);
1355 if (
A->getNumOperands() != 2 ||
B->getNumOperands() != 2)
1364 if (!NameA || !NameB)
1368 return CIA->isOne() ?
const_cast<MDNode *
>(
A) :
const_cast<MDNode *
>(
B);
1380 bool MergedContainsPointer = CIA->isOne() || CIB->isOne();
1403 unsigned AN =
A->getNumOperands() / 2;
1404 unsigned BN =
B->getNumOperands() / 2;
1405 while (AI < AN && BI < BN) {
1438 for (
unsigned i = 0; i <
Size - 2; ++i) {
1439 EndPoints[i] = EndPoints[i + 2];
1447 if (EndPoints.
size() == 2) {
1449 if (
Range.isFullSet())
1455 for (
auto *
I : EndPoints)
1474 AVal->
getType(), Intersect)));
1485 for (
unsigned I = 0, E =
A->getNumOperands() / 2;
I != E; ++
I) {
1491 for (
unsigned I = 0, E =
B->getNumOperands() / 2;
I != E; ++
I) {
1506 ConstantInt::get(
A->getContext(), CR.getLower())));
1508 ConstantInt::get(
A->getContext(), CR.getUpper())));
1567NamedMDNode::NamedMDNode(
const Twine &
N)
1576 return (
unsigned)
getNMDOps(Operands).size();
1602unsigned &Value::getMetadataIndex() {
1604 return I->MetadataIndex;
1608unsigned Value::getMetadataIndex()
const {
1609 return const_cast<Value *
>(
this)->getMetadataIndex();
1619 unsigned Idx = getMetadataIndex();
1622 if (
A.MDKind == KindID)
1635 if (
A.MDKind == KindID)
1640 std::reverse(MDs.
begin(), MDs.
end());
1651 unsigned Idx = getMetadataIndex();
1654 MDs.emplace_back(
A.MDKind,
A.Node);
1659 if (MDs.
size() > 1) {
1660 std::reverse(MDs.
begin(), MDs.
end());
1668 if (getMetadataIndex() != 0)
1675 if (!
Node && getMetadataIndex() == 0)
1682 unsigned &Idx = getMetadataIndex();
1683 unsigned NewIdx = Ctx.pImpl->MetadataRecycleHead;
1685 NewIdx = Ctx.pImpl->Metadatas.size();
1688 Ctx.pImpl->Metadatas.resize(NewIdx + 1);
1690 Ctx.pImpl->MetadataRecycleHead = Ctx.pImpl->Metadatas[NewIdx].Next;
1692 Ctx.pImpl->MetadataRecycleSize -= 1;
1695 Ctx.pImpl->Metadatas[NewIdx] =
1708 return MDKind == KindID;
1714 unsigned *Idx = &getMetadataIndex();
1718 if (Pred(
A.MDKind,
A.Node)) {
1720 unsigned FreeIdx = *Idx;
1722 A.Next = Ctx.pImpl->MetadataRecycleHead;
1723 Ctx.pImpl->MetadataRecycleHead = FreeIdx;
1725 Ctx.pImpl->MetadataRecycleSize += 1;
1738 if (!
Node && MetadataIndex == 0)
1745 unsigned KindID = Ctx.getMDKindID(Kind);
1746 if (KindID == LLVMContext::MD_dbg)
1752 if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
1765 KnownSet.
insert(LLVMContext::MD_DIAssignID);
1768 return !KnownSet.
count(MDKind);
1772void Instruction::updateDIAssignIDMapping(
DIAssignID *ID) {
1773 if (
auto *CurrentID =
1775 if (ID == CurrentID)
1777 CurrentID->Instrs.erase(
llvm::find(CurrentID->Instrs,
this));
1780 ID->Instrs.push_back(
this);
1788 if (KindID == LLVMContext::MD_dbg) {
1794 if (KindID == LLVMContext::MD_DIAssignID) {
1799 "Temporary DIAssignIDs are invalid");
1808 if (
auto *Existing =
getMetadata(LLVMContext::MD_annotation)) {
1812 for (
auto &
N : Tuple->operands()) {
1818 if (
any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](
auto &
Op) {
1819 return AnnotationsSet.contains(cast<MDString>(Op)->getString());
1838 if (
auto *Existing =
getMetadata(LLVMContext::MD_annotation)) {
1840 for (
auto &
N : Tuple->operands()) {
1857 unsigned Idx = MetadataIndex;
1862 case LLVMContext::MD_tbaa:
1863 Result.TBAA =
A.Node;
1865 case LLVMContext::MD_tbaa_struct:
1866 Result.TBAAStruct =
A.Node;
1868 case LLVMContext::MD_alias_scope:
1869 Result.Scope =
A.Node;
1871 case LLVMContext::MD_noalias:
1872 Result.NoAlias =
A.Node;
1874 case LLVMContext::MD_noalias_addrspace:
1875 Result.NoAliasAddrSpace =
A.Node;
1886 setMetadata(LLVMContext::MD_tbaa_struct,
N.TBAAStruct);
1889 setMetadata(LLVMContext::MD_noalias_addrspace,
N.NoAliasAddrSpace);
1897void Instruction::getAllMetadataImpl(
1904 std::make_pair((
unsigned)LLVMContext::MD_dbg, DbgLoc.
getAsMDNode()));
1914 getOpcode() == Instruction::IndirectBr ||
1916 "Looking for branch weights on something besides branch");
1918 return ::extractProfTotalWeight(*
this, TotalVal);
1923 Other->getAllMetadata(MDs);
1924 for (
auto &MD : MDs) {
1926 if (
Offset != 0 && MD.first == LLVMContext::MD_type) {
1929 Metadata *TypeId = MD.second->getOperand(1);
1931 OffsetConst->getType(), OffsetConst->getValue() +
Offset));
1939 auto *Attachment = MD.second;
1940 if (
Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1945 GV = GVE->getVariable();
1946 E = GVE->getExpression();
1950 OrigElements = E->getElements();
1951 std::vector<uint64_t> Elements(OrigElements.
size() + 2);
1952 Elements[0] = dwarf::DW_OP_plus_uconst;
1954 llvm::copy(OrigElements, Elements.begin() + 2);
1964 LLVMContext::MD_type,
1986 assert(Val <= 2 &&
"unknown vcall visibility!");
2003 return CU->getDebugInfoForProfiling();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static const Function * getParent(const Value *V)
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< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static ManagedStatic< DebugCounterOwner > Owner
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains the declarations for profiling metadata utility functions.
Remove Loads Into Fake Uses
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
Class for arbitrary precision integers.
bool slt(const APInt &RHS) const
Signed less than comparison.
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
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),...
size_t size() const
Get the array size.
LLVM Basic Block Representation.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
This class represents a function call, abstracting a target machine's calling convention.
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
const APInt & getValue() const
Return the constant as an APInt value reference.
This class represents a list of constant ranges.
LLVM_ABI ConstantRangeList intersectWith(const ConstantRangeList &CRL) const
Return the range list that results from the intersection of this ConstantRangeList with another Const...
This class represents a range of values.
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
This is an important base class in LLVM.
A pair of DIGlobalVariable and DIExpression.
Subprogram description. Uses SubclassData1.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI MDNode * getAsMDNode() const
Return this as a bar MDNode.
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
static constexpr size_t AssignIDIdx
LLVM_ABI void handleChangedValue(void *Old, Metadata *NewDebugValue)
To be called by ReplaceableUses::replaceAllUsesWith, where Old is a pointer to one of the pointers in...
std::array< Metadata *, 3 > DebugValues
void resetDebugValue(size_t Idx, Metadata *DebugValue)
LLVM_ABI DbgVariableRecord * getUser()
Implements a dense probed hash-table based set.
void setSubprogram(DISubprogram *SP)
Set the attached subprogram.
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool shouldEmitDebugInfoForProfiling() const
Returns true if we should emit debug info for profiling.
LLVM_ABI void addTypeMetadata(unsigned Offset, Metadata *TypeID)
unsigned MetadataIndex
Index of first metadata attachment in context, or zero.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
GlobalObject(Type *Ty, ValueTy VTy, AllocInfo AllocInfo, LinkageTypes Linkage, const Twine &Name, unsigned AddressSpace=0)
LLVM_ABI void copyMetadata(const GlobalObject *Src, unsigned Offset)
Copy metadata from Src, adjusting offsets by Offset.
LLVM_ABI VCallVisibility getVCallVisibility() const
LLVM_ABI bool eraseMetadata(unsigned KindID)
Erase all metadata attachments with the given kind.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
LLVM_ABI void setVCallVisibilityMetadata(VCallVisibility Visibility)
LLVM_ABI void getDebugInfo(SmallVectorImpl< DIGlobalVariableExpression * > &GVs) const
Fill the vector with all debug info attachements.
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI bool extractProfTotalWeight(uint64_t &TotalVal) const
Retrieve total raw weight values of a branch.
bool hasMetadataOtherThanDebugLoc() const
Return true if this instruction has metadata attached to it other than a debug location.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI void addAnnotationMetadata(StringRef Annotation)
Adds an !annotation metadata node with Annotation to this instruction.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI void setNoSanitizeMetadata()
Sets the nosanitize metadata on this instruction.
LLVM_ABI void dropUnknownNonDebugMetadata(ArrayRef< unsigned > KnownIDs={})
Drop all unknown metadata except for debug locations.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void eraseMetadataIf(function_ref< bool(unsigned, MDNode *)> Pred)
Erase all metadata that matches the predicate.
DenseMap< Metadata *, MetadataAsValue * > MetadataAsValues
SmallVector< MDAttachment, 0 > Metadatas
Collection of metadata attachments in this context.
std::vector< MDNode * > DistinctMDNodes
DenseMap< Value *, ValueAsMetadata * > ValuesAsMetadata
DenseSet< MDNode * > TemporaryMDNodes
This is an important class for using LLVM in a threaded context.
LLVM_ABI unsigned getMDKindID(StringRef Name) const
getMDKindID - Return a unique non-zero ID for the specified metadata kind.
LLVMContextImpl *const pImpl
LLVM_ABI MDString * createString(StringRef Str)
Return the given string as metadata.
static LLVM_ABI MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
LLVM_ABI void resolveCycles()
Resolve cycles.
static LLVM_ABI CaptureComponents toCaptureComponents(const MDNode *MD)
Convert !captures metadata to CaptureComponents. MD may be nullptr.
mutable_op_range mutable_operands()
static LLVM_ABI MDNode * getMergedCalleeTypeMetadata(const MDNode *A, const MDNode *B)
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
static LLVM_ABI MDNode * concatenate(MDNode *A, MDNode *B)
Methods for metadata merging.
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
LLVM_ABI void resolve()
Resolve a unique, unresolved node.
const MDOperand & getOperand(unsigned I) const
static LLVM_ABI MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
LLVM_ABI void storeDistinctInContext()
ArrayRef< MDOperand > operands() const
static LLVM_ABI MDNode * getMergedCalleesMetadata(MDNode *A, MDNode *B)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
static LLVM_ABI MDNode * getMergedAllocTokenMetadata(const MDNode *A, const MDNode *B)
static LLVM_ABI MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
void setNumUnresolved(unsigned N)
unsigned getNumOperands() const
Return number of MDNode operands.
MDOperand * mutable_begin()
LLVM_ABI MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
static LLVM_ABI MDNode * getMostGenericRange(MDNode *A, MDNode *B)
LLVM_ABI void setOperand(unsigned I, Metadata *New)
Set an operand.
bool isResolved() const
Check if node is fully resolved.
op_iterator op_begin() const
static LLVM_ABI MDNode * intersect(MDNode *A, MDNode *B)
static LLVM_ABI MDNode * getMostGenericNoFPClass(MDNode *A, MDNode *B)
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
static LLVM_ABI MDNode * fromCaptureComponents(LLVMContext &Ctx, CaptureComponents CC)
Convert CaptureComponents to !captures metadata.
LLVM_ABI void dropAllReferences()
static LLVM_ABI MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
unsigned getNumUnresolved() const
Tracking metadata reference owned by Metadata.
LLVM_ABI StringRef getString() const
static LLVM_ABI MDString * getIfExists(LLVMContext &Context, StringRef Str)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
void eraseNamedMetadata(NamedMDNode *NMD)
Remove the given NamedMDNode from this module and delete it.
LLVM_ABI void setOperand(unsigned I, MDNode *New)
LLVM_ABI StringRef getName() const
void dropAllReferences()
Remove all uses and clear node vector.
LLVM_ABI void eraseFromParent()
Drop all references and remove the node from parent module.
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
LLVM_ABI void clearOperands()
Drop all references to this node's operands.
Module * getParent()
Get the module that holds this named metadata collection.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Shared implementation of use-lists for replaceable metadata.
MetadataTracking::OwnerTy OwnerTy
LLVM_ABI SmallVector< Metadata * > getAllArgListUsers()
Returns the list of all DIArgList users of this.
LLVM_ABI SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Returns the list of all DbgVariableRecord users of this.
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.
static LLVM_ABI void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
ArrayRef< value_type > getArrayRef() const
bool remove_if(UnaryPredicate P)
Remove items from the set vector based on a predicate function.
void insert_range(Range &&R)
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
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.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void append(StringRef RHS)
Append from a StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
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 size_t size() const
Get the string size.
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)
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
bool hasUseList() const
Check if this Value has a use-list.
LLVM_ABI MDNode * getMetadataImpl(unsigned KindID) const LLVM_READONLY
Get metadata for the given kind, if any.
LLVM_ABI bool eraseMetadata(unsigned KindID)
Erase all metadata attachments with the given kind.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI MDNode * getMetadata(StringRef Kind) const LLVM_READONLY
Get the current metadata attachments for the given kind, if any.
LLVM_ABI void eraseMetadataIf(function_ref< bool(unsigned, MDNode *)> Pred)
Erase all metadata attachments matching the given predicate.
LLVM_ABI void clearMetadata()
Erase all metadata attached to this Value.
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
bool capturesReadProvenanceOnly(CaptureComponents CC)
void stable_sort(R &&Range)
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
bool capturesAddressIsNullOnly(CaptureComponents CC)
TypedTrackingMDRef< MDNode > TrackingMDNodeRef
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
static T * getUniqued(DenseSet< T *, InfoT > &Store, const typename InfoT::KeyTy &Key)
bool capturesAddress(CaptureComponents CC)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
@ Store
The extracted value is stored (ExtractElement only).
constexpr from_range_t from_range
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
auto cast_or_null(const Y &Val)
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.
bool capturesFullProvenance(CaptureComponents CC)
void sort(IteratorTy Start, IteratorTy End)
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
CaptureComponents
Components of the pointer that may be captured.
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
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
@ Ref
The access may reference the value stored in memory.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool capturesAll(CaptureComponents CC)
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)
Add two unsigned integers, X and Y, of type T.
bool capturesNothing(CaptureComponents CC)
static constexpr bool value
static std::false_type check(...)
static std::true_type check(SameType< void(U::*)(unsigned), &U::setHash > *)
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Single metadata attachment, forms linked list ended by index 0.
static LLVM_ABI const char * BranchWeights
Function object to check whether the first component of a container supported by std::get (like std::...