68 :
Value(Ty, MetadataAsValueVal), MD(MD) {
96 if (!
N ||
N->getNumOperands() != 1)
99 if (!
N->getOperand(0))
112 auto *&Entry = Context.pImpl->MetadataAsValues[MD];
121 auto &Store = Context.pImpl->MetadataAsValues;
122 return Store.lookup(MD);
125void MetadataAsValue::handleChangedMetadata(
Metadata *MD) {
128 auto &Store = Context.pImpl->MetadataAsValues;
131 Store.erase(this->MD);
136 auto *&Entry = Store[MD];
148void MetadataAsValue::track() {
153void MetadataAsValue::untrack() {
168 auto OldMD =
static_cast<Metadata **
>(Old);
179void DebugValueUser::trackDebugValue(
size_t Idx) {
180 assert(Idx < 3 &&
"Invalid debug value index.");
186void DebugValueUser::trackDebugValues() {
192void DebugValueUser::untrackDebugValue(
size_t Idx) {
193 assert(Idx < 3 &&
"Invalid debug value index.");
199void DebugValueUser::untrackDebugValues() {
206 assert(DebugValueUser::operator==(
X) &&
"Expected values to match");
210 X.DebugValues.fill(
nullptr);
214 assert(
Ref &&
"Expected live reference");
216 "Reference without owner must be direct");
217 if (
auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
222 assert(!PH->Use &&
"Placeholders can only be used once");
231 assert(
Ref &&
"Expected live reference");
232 if (
auto *R = ReplaceableMetadataImpl::getIfExists(MD))
239 assert(
Ref &&
"Expected live reference");
240 assert(New &&
"Expected live reference");
242 if (
auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
243 R->moveRef(
Ref, New, MD);
247 "Unexpected move of an MDOperand");
249 "Expected un-replaceable metadata, since we didn't move a reference");
254 return ReplaceableMetadataImpl::isReplaceable(MD);
259 for (
auto Pair : UseMap) {
267 MDUsersWithID.
push_back(&UseMap[Pair.first]);
269 llvm::sort(MDUsersWithID, [](
auto UserA,
auto UserB) {
270 return UserA->second < UserB->second;
273 for (
auto *UserWithID : MDUsersWithID)
281 for (
auto Pair : UseMap) {
287 DVRUsersWithID.
push_back(&UseMap[Pair.first]);
294 llvm::sort(DVRUsersWithID, [](
auto UserA,
auto UserB) {
295 return UserA->second > UserB->second;
298 for (
auto UserWithID : DVRUsersWithID)
303void ReplaceableMetadataImpl::addRef(
void *
Ref, OwnerTy
Owner) {
305 UseMap.insert(std::make_pair(
Ref, std::make_pair(
Owner, NextIndex)))
308 assert(WasInserted &&
"Expected to add a reference");
311 assert(NextIndex != 0 &&
"Unexpected overflow");
314void ReplaceableMetadataImpl::dropRef(
void *
Ref) {
315 bool WasErased = UseMap.erase(
Ref);
317 assert(WasErased &&
"Expected to drop a reference");
320void ReplaceableMetadataImpl::moveRef(
void *
Ref,
void *New,
322 auto I = UseMap.find(
Ref);
323 assert(
I != UseMap.end() &&
"Expected to move a reference");
324 auto OwnerAndIndex =
I->second;
326 bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
328 assert(WasInserted &&
"Expected to add a reference");
333 "Reference without owner must be direct");
334 assert((OwnerAndIndex.first || *
static_cast<Metadata **
>(New) == &MD) &&
335 "Reference without owner must be direct");
339 if (!
C.isUsedByMetadata()) {
344 auto &Store = Context.pImpl->ValuesAsMetadata;
345 auto I = Store.find(&
C);
348 std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
353 for (
const auto &Pair :
Uses) {
369 OwnerMD->handleChangedOperand(
380 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
383 return L.second.second < R.second.second;
385 for (
const auto &Pair :
Uses) {
388 if (!UseMap.count(Pair.first))
398 UseMap.erase(Pair.first);
409 DVU->handleChangedValue(Pair.first, MD);
416#define HANDLE_METADATA_LEAF(CLASS) \
417 case Metadata::CLASS##Kind: \
418 cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
420#include "llvm/IR/Metadata.def"
425 assert(UseMap.empty() &&
"Expected all uses to be replaced");
438 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
441 return L.second.second < R.second.second;
444 for (
const auto &Pair :
Uses) {
445 auto Owner = Pair.second.first;
455 if (OwnerMD->isResolved())
457 OwnerMD->decrementUnresolvedOperandCount();
466 return !
N->isResolved() ||
N->isAlwaysReplaceable()
467 ?
N->Context.getOrCreateReplaceableUses()
477 return !
N->isResolved() ||
N->isAlwaysReplaceable()
478 ?
N->Context.getReplaceableUses()
486bool ReplaceableMetadataImpl::isReplaceable(
const Metadata &MD) {
488 return !
N->isResolved() ||
N->isAlwaysReplaceable();
493 assert(V &&
"Expected value");
495 if (
auto *Fn =
A->getParent())
496 return Fn->getSubprogram();
501 if (
auto *Fn = BB->getParent())
502 return Fn->getSubprogram();
510 assert(V &&
"Unexpected null Value");
512 auto &Context = V->getContext();
513 auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
516 "Expected constant or function-local value");
517 assert(!V->IsUsedByMD &&
"Expected this to be the only metadata use");
518 V->IsUsedByMD =
true;
529 assert(V &&
"Unexpected null Value");
530 return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
534 assert(V &&
"Expected valid value");
536 auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
537 auto I = Store.find(V);
538 if (
I == Store.end())
543 assert(MD &&
"Expected valid metadata");
553 assert(From &&
"Expected valid value");
554 assert(To &&
"Expected valid value");
555 assert(From != To &&
"Expected changed value");
559 auto &Store = Context.pImpl->ValuesAsMetadata;
560 auto I = Store.find(From);
561 if (
I == Store.end()) {
570 assert(MD &&
"Expected valid metadata");
595 auto *&Entry = Store[To];
615 auto &Store = Context.pImpl->MDStringCache;
616 auto I = Store.try_emplace(Str);
617 auto &MapEntry =
I.first->getValue();
620 MapEntry.Entry = &*
I.first;
625 assert(Entry &&
"Expected to find string map entry");
626 return Entry->first();
635#define HANDLE_MDNODE_LEAF(CLASS) \
637 alignof(uint64_t) >= alignof(CLASS), \
638 "Alignment is insufficient after objects prepended to " #CLASS);
639#include "llvm/IR/Metadata.def"
646 char *Mem =
reinterpret_cast<char *
>(::operator
new(AllocSize +
Size));
647 Header *
H =
new (Mem + AllocSize -
sizeof(Header)) Header(
NumOps,
Storage);
648 return reinterpret_cast<void *
>(
H + 1);
651void MDNode::operator
delete(
void *
N) {
652 Header *
H =
reinterpret_cast<Header *
>(
N) - 1;
653 void *Mem =
H->getAllocation();
655 ::operator
delete(Mem);
672 countUnresolvedOperands();
679#define HANDLE_MDNODE_LEAF(CLASS) \
681 return cast<CLASS>(this)->cloneImpl();
682#include "llvm/IR/Metadata.def"
686MDNode::Header::Header(
size_t NumOps, StorageType Storage) {
687 IsLarge = isLarge(
NumOps);
688 IsResizable = isResizable(
Storage);
689 SmallSize = getSmallSize(
NumOps, IsResizable, IsLarge);
692 new (getLargePtr()) LargeStorageVector();
702MDNode::Header::~Header() {
704 getLarge().~LargeStorageVector();
707 MDOperand *
O =
reinterpret_cast<MDOperand *
>(
this);
708 for (MDOperand *
E = O - SmallSize;
O !=
E; --
O)
709 (O - 1)->~MDOperand();
712void *MDNode::Header::getSmallPtr() {
713 static_assert(
alignof(MDOperand) <=
alignof(Header),
714 "MDOperand too strongly aligned");
715 return reinterpret_cast<char *
>(
const_cast<Header *
>(
this)) -
716 sizeof(MDOperand) * SmallSize;
719void MDNode::Header::resize(
size_t NumOps) {
720 assert(IsResizable &&
"Node is not resizable");
725 getLarge().resize(
NumOps);
726 else if (
NumOps <= SmallSize)
729 resizeSmallToLarge(
NumOps);
732void MDNode::Header::resizeSmall(
size_t NumOps) {
733 assert(!IsLarge &&
"Expected a small MDNode");
734 assert(
NumOps <= SmallSize &&
"NumOps too large for small resize");
739 int NumNew = (int)
NumOps - (
int)ExistingOps.
size();
740 MDOperand *
O = ExistingOps.
end();
741 for (
int I = 0,
E = NumNew;
I <
E; ++
I)
743 for (
int I = 0,
E = NumNew;
I >
E; --
I)
749void MDNode::Header::resizeSmallToLarge(
size_t NumOps) {
750 assert(!IsLarge &&
"Expected a small MDNode");
751 assert(
NumOps > SmallSize &&
"Expected NumOps to be larger than allocation");
752 LargeStorageVector NewOps;
756 new (getLargePtr()) LargeStorageVector(std::move(NewOps));
762 return !
N->isResolved();
766void MDNode::countUnresolvedOperands() {
772void MDNode::makeUniqued() {
778 Op.reset(
Op.get(),
this);
782 countUnresolvedOperands();
784 dropReplaceableUses();
791void MDNode::makeDistinct() {
796 dropReplaceableUses();
808 dropReplaceableUses();
813void MDNode::dropReplaceableUses() {
817 if (Context.hasReplaceableUses())
818 Context.takeReplaceableUses()->resolveAllUses();
831 decrementUnresolvedOperandCount();
834void MDNode::decrementUnresolvedOperandCount() {
845 dropReplaceableUses();
863 "Expected all forward declarations to be resolved");
864 if (!
N->isResolved())
873MDNode *MDNode::replaceWithPermanentImpl() {
877 return replaceWithDistinctImpl();
879#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
882#include "llvm/IR/Metadata.def"
887 return replaceWithDistinctImpl();
888 return replaceWithUniquedImpl();
891MDNode *MDNode::replaceWithUniquedImpl() {
893 MDNode *UniquedNode = uniquify();
895 if (UniquedNode ==
this) {
906MDNode *MDNode::replaceWithDistinctImpl() {
911void MDTuple::recalculateHash() {
912 setHash(MDTupleInfo::KeyTy::calculateHash(
this));
918 if (Context.hasReplaceableUses()) {
919 Context.getReplaceableUses()->resolveAllUses(
false);
920 (void)Context.takeReplaceableUses();
924void MDNode::handleChangedOperand(
void *
Ref,
Metadata *New) {
952 resolveAfterOperandChange(Old, New);
964 if (Context.hasReplaceableUses())
965 Context.getReplaceableUses()->replaceAllUsesWith(
Uniqued);
974void MDNode::deleteAsSubclass() {
978#define HANDLE_MDNODE_LEAF(CLASS) \
980 delete cast<CLASS>(this); \
982#include "llvm/IR/Metadata.def"
986template <
class T,
class InfoT>
995template <
class NodeTy>
struct MDNode::HasCachedHash {
997 static std::true_type
check(
SameType<
void (U::*)(
unsigned), &U::setHash> *);
998 template <
class U>
static std::false_type
check(...);
1003MDNode *MDNode::uniquify() {
1010#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1011 case CLASS##Kind: { \
1012 CLASS *SubclassThis = cast<CLASS>(this); \
1013 dispatchRecalculateHash(SubclassThis); \
1014 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
1016#include "llvm/IR/Metadata.def"
1020void MDNode::eraseFromStore() {
1024#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1026 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
1028#include "llvm/IR/Metadata.def"
1036 MDTupleInfo::KeyTy
Key(MDs);
1041 Hash =
Key.getHash();
1043 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
1047 MDTuple(Context,
Storage, Hash, MDs),
1048 Storage, Context.pImpl->MDTuples);
1052 assert(
N->isTemporary() &&
"Expected temporary node");
1053 N->replaceAllUsesWith(
nullptr);
1054 N->deleteAsSubclass();
1058 assert(!Context.hasReplaceableUses() &&
"Unexpected replaceable uses");
1067#define HANDLE_MDNODE_LEAF(CLASS) \
1068 case CLASS##Kind: { \
1069 dispatchResetHash(cast<CLASS>(this)); \
1072#include "llvm/IR/Metadata.def"
1105 if (
N->getNumOperands() ==
Ops.size() &&
N ==
N->getOperand(0)) {
1106 for (
unsigned I = 1,
E =
Ops.size();
I !=
E; ++
I)
1107 if (
Ops[
I] !=
N->getOperand(
I))
1122 MDs.
insert(
B->op_begin(),
B->op_end());
1170 return MDs.
empty() ? nullptr
1191 assert(
A &&
B && AInstr && BInstr &&
"Caller should guarantee");
1196 assert(
A->getNumOperands() >= 2 &&
B->getNumOperands() >= 2 &&
1197 "!prof annotations should have no less than 2 operands");
1201 assert(AMDS !=
nullptr && BMDS !=
nullptr &&
1202 "first operand should be a non-null MDString");
1211 assert(AInstrWeight && BInstrWeight &&
"verified by LLVM verifier");
1214 MDHelper.createConstant(ConstantInt::get(
1229 switch (
I.getOpcode()) {
1230 case Instruction::Invoke:
1231 case Instruction::Br:
1232 case Instruction::Switch:
1233 case Instruction::Call:
1234 case Instruction::IndirectBr:
1235 case Instruction::Select:
1236 case Instruction::CallBr:
1242 if (AInstr && !IsLegal(*AInstr))
1244 if (BInstr && !IsLegal(*BInstr))
1252 "Caller should guarantee");
1254 "Caller should guarantee");
1262 return mergeDirectCallProfMetadata(
A,
B, AInstr, BInstr);
1273 return A.getUpper() ==
B.getLower() ||
A.getLower() ==
B.getUpper();
1284 const APInt &LB = EndPoints[
Size - 2]->getValue();
1285 const APInt &LE = EndPoints[
Size - 1]->getValue();
1290 EndPoints[
Size - 2] =
1292 EndPoints[
Size - 1] =
1301 if (!EndPoints.
empty())
1316 auto AddUniqueCallees = [&AB, &MergedCallees](
const MDNode *
N) {
1318 if (MergedCallees.
insert(MD).second)
1322 AddUniqueCallees(
A);
1323 AddUniqueCallees(
B);
1343 unsigned AN =
A->getNumOperands() / 2;
1344 unsigned BN =
B->getNumOperands() / 2;
1345 while (AI < AN && BI < BN) {
1378 for (
unsigned i = 0; i <
Size - 2; ++i) {
1379 EndPoints[i] = EndPoints[i + 2];
1387 if (EndPoints.
size() == 2) {
1389 if (
Range.isFullSet())
1395 for (
auto *
I : EndPoints)
1408 for (
unsigned I = 0, E =
A->getNumOperands() / 2;
I != E; ++
I) {
1414 for (
unsigned I = 0, E =
B->getNumOperands() / 2;
I != E; ++
I) {
1429 ConstantInt::get(
A->getContext(), CR.getLower())));
1431 ConstantInt::get(
A->getContext(), CR.getUpper())));
1490NamedMDNode::NamedMDNode(
const Twine &
N)
1499 return (
unsigned)
getNMDOps(Operands).size();
1526 for (
const auto &
A : Attachments)
1533 for (
const auto &
A : Attachments)
1535 Result.push_back(
A.Node);
1540 for (
const auto &
A : Attachments)
1541 Result.emplace_back(
A.MDKind,
A.Node);
1545 if (Result.size() > 1)
1564 if (Attachments.size() == 1 && Attachments.back().MDKind ==
ID) {
1565 Attachments.pop_back();
1569 auto OldSize = Attachments.size();
1572 return OldSize != Attachments.size();
1584 const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(
this);
1585 return Attachements.
lookup(KindID);
1602 "bit out of sync with hash table");
1617 Info.set(KindID,
Node);
1623 "bit out of sync with hash table");
1659 bool Changed = Store.erase(KindID);
1671 assert(!Info.empty() &&
"bit out of sync with hash table");
1673 return Pred(
I.MDKind,
I.Node);
1684 "bit out of sync with hash table");
1697 unsigned KindID = Ctx.getMDKindID(Kind);
1698 if (KindID == LLVMContext::MD_dbg)
1704 if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
1717 KnownSet.
insert(LLVMContext::MD_DIAssignID);
1720 return !KnownSet.
count(MDKind);
1724void Instruction::updateDIAssignIDMapping(
DIAssignID *
ID) {
1729 if (
ID == CurrentID)
1733 auto InstrsIt = IDToInstrs.find(CurrentID);
1734 assert(InstrsIt != IDToInstrs.end() &&
1735 "Expect existing attachment to be mapped");
1737 auto &InstVec = InstrsIt->second;
1739 assert(InstIt != InstVec.end() &&
1740 "Expect instruction to be mapped to attachment");
1744 if (InstVec.size() == 1)
1745 IDToInstrs.erase(InstrsIt);
1747 InstVec.erase(InstIt);
1752 IDToInstrs[
ID].push_back(
this);
1760 if (KindID == LLVMContext::MD_dbg) {
1766 if (KindID == LLVMContext::MD_DIAssignID) {
1771 "Temporary DIAssignIDs are invalid");
1780 if (
auto *Existing =
getMetadata(LLVMContext::MD_annotation)) {
1784 for (
auto &
N : Tuple->operands()) {
1790 if (
any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](
auto &
Op) {
1791 return AnnotationsSet.contains(cast<MDString>(Op)->getString());
1810 if (
auto *Existing =
getMetadata(LLVMContext::MD_annotation)) {
1812 for (
auto &
N : Tuple->operands()) {
1832 Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1833 Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1834 Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1835 Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1836 Result.NoAliasAddrSpace = Info.lookup(LLVMContext::MD_noalias_addrspace);
1843 setMetadata(LLVMContext::MD_tbaa_struct,
N.TBAAStruct);
1846 setMetadata(LLVMContext::MD_noalias_addrspace,
N.NoAliasAddrSpace);
1854void Instruction::getAllMetadataImpl(
1861 std::make_pair((
unsigned)LLVMContext::MD_dbg, DbgLoc.
getAsMDNode()));
1870 getOpcode() == Instruction::IndirectBr ||
1872 "Looking for branch weights on something besides branch");
1874 return ::extractProfTotalWeight(*
this, TotalVal);
1879 Other->getAllMetadata(MDs);
1880 for (
auto &MD : MDs) {
1882 if (
Offset != 0 && MD.first == LLVMContext::MD_type) {
1885 Metadata *TypeId = MD.second->getOperand(1);
1887 OffsetConst->getType(), OffsetConst->getValue() +
Offset));
1895 auto *Attachment = MD.second;
1896 if (
Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1901 GV = GVE->getVariable();
1902 E = GVE->getExpression();
1906 OrigElements = E->getElements();
1907 std::vector<uint64_t> Elements(OrigElements.
size() + 2);
1908 Elements[0] = dwarf::DW_OP_plus_uconst;
1910 llvm::copy(OrigElements, Elements.begin() + 2);
1920 LLVMContext::MD_type,
1942 assert(Val <= 2 &&
"unknown vcall visibility!");
1959 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< 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.
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 SmallVector class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton 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:
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - 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....
MDNode * getAsMDNode() const
Return this as a bar MDNode.
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
LLVM_ABI void handleChangedValue(void *Old, Metadata *NewDebugValue)
To be called by ReplaceableMetadataImpl::replaceAllUsesWith, where Old is a pointer to one of the poi...
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)
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 current metadata attachments for the given kind, if any.
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 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
DenseMap< DIAssignID *, SmallVector< Instruction *, 1 > > AssignmentIDToInstrs
Map DIAssignID -> Instructions with that attachment.
std::vector< MDNode * > DistinctMDNodes
DenseMap< const Value *, MDAttachments > ValueMetadata
Collection of metadata used in this context.
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
Multimap-like storage for metadata attachments.
void insert(unsigned ID, MDNode &MD)
Adds an attachment to a particular node.
void get(unsigned ID, SmallVectorImpl< MDNode * > &Result) const
Appends all attachments with the given ID to Result in insertion order.
void getAll(SmallVectorImpl< std::pair< unsigned, MDNode * > > &Result) const
Appends all attachments for the global to Result, sorting by attachment ID.
void set(unsigned ID, MDNode *MD)
Set an attachment to a particular node.
MDNode * lookup(unsigned ID) const
Returns the first attachment with the given ID or nullptr if no such attachment exists.
bool erase(unsigned ID)
Remove attachments with the given ID.
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 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 * 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 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 * 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.
ArrayRef< value_type > getArrayRef() const
bool remove_if(UnaryPredicate P)
Remove items from the set vector based on a predicate function.
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.
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.
StringRef - Represent a constant reference to a string, i.e.
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.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasMetadata() const
Return true if this value has any metadata attached to it.
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.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI MDNode * getMetadataImpl(unsigned KindID) const
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 void eraseMetadataIf(function_ref< bool(unsigned, MDNode *)> Pred)
Erase all metadata attachments matching the given predicate.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI void clearMetadata()
Erase all metadata attached to this Value.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
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.
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)
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.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
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.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
cl::opt< bool > ProfcheckDisableMetadataFixes("profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false), cl::desc("Disable metadata propagation fixes discovered through Issue #147390"))
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...
static LLVM_ABI const char * BranchWeights
Function object to check whether the first component of a container supported by std::get (like std::...