15#ifndef LLVM_IR_METADATA_H
16#define LLVM_IR_METADATA_H
45class ModuleSlotTracker;
47class DbgVariableRecord;
48template <
typename T>
class StringMapEntry;
49template <
typename ValueTy>
class StringMapEntryStorage;
67 const unsigned char SubclassID;
82#define HANDLE_METADATA_LEAF(CLASS) CLASS##Kind,
83#include "llvm/IR/Metadata.def"
89 static_assert(
sizeof(*this) == 8,
"Metadata fields poorly packed");
126 bool IsForDebug =
false)
const;
128 const Module *M =
nullptr,
bool IsForDebug =
false)
const;
139 const Module *M =
nullptr)
const;
141 const Module *M =
nullptr)
const;
146 LLVMContext::MD_range, LLVMContext::MD_nonnull, LLVMContext::MD_align};
154 return reinterpret_cast<Metadata**
>(MDs);
157#define HANDLE_METADATA(CLASS) class CLASS;
158#include "llvm/IR/Metadata.def"
162#define HANDLE_METADATA_LEAF(CLASS) \
163 template <> struct isa_impl<CLASS, Metadata> { \
164 static inline bool doit(const Metadata &MD) { \
165 return MD.getMetadataID() == Metadata::CLASS##Kind; \
168#include "llvm/IR/Metadata.def"
191 void dropUse() { MD =
nullptr; }
203 return V->getValueID() == MetadataAsValueVal;
207 void handleChangedMetadata(
Metadata *MD);
246 retrackDebugValues(
X);
257 untrackDebugValues();
259 retrackDebugValues(
X);
267 untrackDebugValues();
276 untrackDebugValues();
281 assert(
Idx < 3 &&
"Invalid debug value index.");
282 untrackDebugValue(
Idx);
284 trackDebugValue(
Idx);
368 return retrack(&MD, *MD, &New);
404 assert(UseMap.
empty() &&
"Cannot destroy in-use replaceable metadata");
431 void dropRef(
void *
Ref);
432 void moveRef(
void *
Ref,
void *New,
const Metadata &MD);
446 static bool isReplaceable(
const Metadata &MD);
471 assert(V &&
"Expected valid value");
480 return cast<ConstantAsMetadata>(
get(
C));
484 return cast<LocalAsMetadata>(
get(
Local));
490 return cast_or_null<ConstantAsMetadata>(
getIfExists(
C));
557 assert(!isa<Constant>(
Local) &&
"Expected local value");
625template <
typename U,
typename V>
628template <
typename U,
typename V>
633 static const bool value = std::is_base_of<Constant, V>::value &&
634 HasDereference<M, const Metadata &>;
637 static const bool value = std::is_base_of<Constant, V>::value &&
638 std::is_convertible<M, const Metadata &>::value;
647template <
class X,
class Y>
648inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
bool>
650 assert(MD &&
"Null pointer sent into hasa");
651 if (
auto *V = dyn_cast<ConstantAsMetadata>(MD))
652 return isa<X>(V->getValue());
655template <
class X,
class Y>
656inline std::enable_if_t<detail::IsValidReference<X, Y &>::value,
bool>
664template <
class X,
class Y>
665inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
667 return cast<X>(cast<ConstantAsMetadata>(MD)->getValue());
669template <
class X,
class Y>
670inline std::enable_if_t<detail::IsValidReference<X, Y &>::value,
X *>
679template <
class X,
class Y>
680inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
682 if (
auto *V = cast_or_null<ConstantAsMetadata>(MD))
683 return cast<X>(V->getValue());
692template <
class X,
class Y>
693inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
695 if (
auto *V = dyn_cast<ConstantAsMetadata>(MD))
696 return dyn_cast<X>(V->getValue());
705template <
class X,
class Y>
706inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
708 if (
auto *V = dyn_cast_or_null<ConstantAsMetadata>(MD))
709 return dyn_cast<X>(V->getValue());
772 explicit operator bool()
const {
812 Result.NoAliasAddrSpace =
824 Result.Scope =
Scope;
840 Result.Scope =
Scope;
876 nullptr,
nullptr,
nullptr);
922 return isa<MDString>(this->
get()) &&
923 cast<MDString>(this->
get())->getString() == Str;
954 assert(
static_cast<void *
>(
this) == &MD &&
"Expected same address");
982 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses)
998 return isa<ReplaceableMetadataImpl *>(
Ptr);
1004 return *cast<LLVMContext *>(
Ptr);
1009 return cast<ReplaceableMetadataImpl *>(
Ptr);
1026 assert(ReplaceableUses &&
"Expected non-null replaceable uses");
1028 "Expected same context");
1030 Ptr = ReplaceableUses.release();
1038 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses(
1040 Ptr = &ReplaceableUses->getContext();
1041 return ReplaceableUses;
1049#define HANDLE_MDNODE_LEAF(CLASS) \
1050 using Temp##CLASS = std::unique_ptr<CLASS, TempMDNodeDeleter>;
1051#define HANDLE_MDNODE_BRANCH(CLASS) HANDLE_MDNODE_LEAF(CLASS)
1052#include "llvm/IR/Metadata.def"
1089 struct alignas(alignof(size_t)) Header {
1090 size_t IsResizable : 1;
1092 size_t SmallSize : 4;
1093 size_t SmallNumOps : 4;
1094 size_t :
sizeof(size_t) * CHAR_BIT - 10;
1096 unsigned NumUnresolved = 0;
1099 static constexpr size_t NumOpsFitInVector =
1100 sizeof(LargeStorageVector) /
sizeof(
MDOperand);
1102 NumOpsFitInVector *
sizeof(
MDOperand) ==
sizeof(LargeStorageVector),
1103 "sizeof(LargeStorageVector) must be a multiple of sizeof(MDOperand)");
1105 static constexpr size_t MaxSmallSize = 15;
1107 static constexpr size_t getOpSize(
unsigned NumOps) {
1112 static size_t getSmallSize(
size_t NumOps,
bool IsResizable,
bool IsLarge) {
1113 return IsLarge ? NumOpsFitInVector
1114 : std::max(NumOps, NumOpsFitInVector * IsResizable);
1119 getSmallSize(NumOps, isResizable(
Storage), isLarge(NumOps))) +
1125 static bool isLarge(
size_t NumOps) {
return NumOps > MaxSmallSize; }
1128 return getOpSize(SmallSize) +
sizeof(Header);
1130 void *getAllocation() {
1131 return reinterpret_cast<char *
>(
this + 1) -
1135 void *getLargePtr()
const {
1136 static_assert(
alignof(LargeStorageVector) <=
alignof(Header),
1137 "LargeStorageVector too strongly aligned");
1138 return reinterpret_cast<char *
>(
const_cast<Header *
>(
this)) -
1139 sizeof(LargeStorageVector);
1144 LargeStorageVector &getLarge() {
1146 return *
reinterpret_cast<LargeStorageVector *
>(getLargePtr());
1149 const LargeStorageVector &getLarge()
const {
1151 return *
reinterpret_cast<const LargeStorageVector *
>(getLargePtr());
1154 LLVM_ABI void resizeSmall(
size_t NumOps);
1155 LLVM_ABI void resizeSmallToLarge(
size_t NumOps);
1156 LLVM_ABI void resize(
size_t NumOps);
1161 MutableArrayRef<MDOperand> operands() {
1165 reinterpret_cast<MDOperand *
>(
this) - SmallSize, SmallNumOps);
1168 ArrayRef<MDOperand> operands()
const {
1171 return ArrayRef(
reinterpret_cast<const MDOperand *
>(
this) - SmallSize,
1175 unsigned getNumOperands()
const {
1178 return getLarge().size();
1182 Header &getHeader() {
return *(
reinterpret_cast<Header *
>(
this) - 1); }
1184 const Header &getHeader()
const {
1185 return *(
reinterpret_cast<const Header *
>(
this) - 1);
1188 ContextAndReplaceableUses Context;
1192 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = {});
1196 LLVM_ABI void operator delete(
void *Mem);
1222 void *
operator new(size_t) =
delete;
1270 return cast<MDString>(
getOperand(1))->getString().ends_with(
".generalized");
1275 return Context.getReplaceableUses()->getNumUses();
1283 if (
Context.hasReplaceableUses())
1284 Context.getReplaceableUses()->replaceAllUsesWith(MD);
1303 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1305 return cast<T>(
N.release()->replaceWithPermanentImpl());
1315 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1317 return cast<T>(
N.release()->replaceWithUniquedImpl());
1325 static std::enable_if_t<std::is_base_of<MDNode, T>::value,
T *>
1327 return cast<T>(
N.release()->replaceWithDistinctImpl());
1339 const Module *M =
nullptr)
const;
1370 template <
class T,
class StoreT>
1379 assert(!
isUniqued() &&
"Resizing is not supported for uniqued nodes");
1381 "Resizing is not supported for this node kind");
1382 getHeader().resize(NumOps);
1386 void handleChangedOperand(
void *
Ref,
Metadata *New);
1389 void dropReplaceableUses();
1392 void decrementUnresolvedOperandCount();
1393 void countUnresolvedOperands();
1406 void makeDistinct();
1408 void deleteAsSubclass();
1410 void eraseFromStore();
1412 template <
class NodeTy>
struct HasCachedHash;
1413 template <
class NodeTy>
1414 static void dispatchRecalculateHash(NodeTy *
N, std::true_type) {
1415 N->recalculateHash();
1417 template <
class NodeTy>
1418 static void dispatchRecalculateHash(NodeTy *, std::false_type) {}
1419 template <
class NodeTy>
1420 static void dispatchResetHash(NodeTy *
N, std::true_type) {
1423 template <
class NodeTy>
1424 static void dispatchResetHash(NodeTy *, std::false_type) {}
1427 static MDNode *mergeDirectCallProfMetadata(MDNode *
A, MDNode *
B,
1428 const Instruction *AInstr,
1429 const Instruction *BInstr);
1447 return getHeader().operands()[
I];
1458#define HANDLE_MDNODE_LEAF(CLASS) \
1461#include "llvm/IR/Metadata.def"
1506 void recalculateHash();
1508 LLVM_ABI static MDTuple *getImpl(LLVMContext &Context,
1509 ArrayRef<Metadata *> MDs,
1511 bool ShouldCreate =
true);
1513 TempMDTuple cloneImpl()
const {
1548 TempMDTuple
clone()
const {
return cloneImpl(); }
1601 if (
Node->getNumOperands() < 2)
1603 return dyn_cast_or_null<MDNode>(
Node->getOperand(1));
1606 if (
Node->getNumOperands() > 2)
1607 if (
MDString *
N = dyn_cast_or_null<MDString>(
Node->getOperand(2)))
1608 return N->getString();
1661 std::enable_if_t<std::is_convertible<U *, T *>::value> * =
nullptr)
1667 std::enable_if_t<!std::is_convertible<U *, T *>::value> * =
nullptr)
1678 unsigned size()
const {
return N ?
N->getNumOperands() : 0u; }
1679 bool empty()
const {
return N ?
N->getNumOperands() == 0 :
true; }
1689#define HANDLE_METADATA(CLASS) \
1690 using CLASS##Array = MDTupleTypedArrayWrapper<CLASS>;
1691#include "llvm/IR/Metadata.def"
1741 assert(!
Use &&
"Use is still being tracked despite being untracked!");
1758 Module *Parent =
nullptr;
1761 void setParent(
Module *M) { Parent = M; }
1765 template <
class T1>
class op_iterator_impl {
1774 using iterator_category = std::bidirectional_iterator_tag;
1775 using value_type =
T1;
1776 using difference_type = std::ptrdiff_t;
1777 using pointer = value_type *;
1778 using reference = value_type;
1780 op_iterator_impl() =
default;
1782 bool operator==(
const op_iterator_impl &o)
const {
return Idx == o.Idx; }
1783 bool operator!=(
const op_iterator_impl &o)
const {
return Idx !=
o.Idx; }
1785 op_iterator_impl &operator++() {
1790 op_iterator_impl operator++(
int) {
1791 op_iterator_impl tmp(*
this);
1802 op_iterator_impl tmp(*
this);
1833 bool IsForDebug =
false)
const;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
mir Rename Register Operands
Machine Check Debug Module
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
This file defines the PointerUnion class, which is a discriminated union of pointer types.
This file defines the SmallVector class.
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
AliasScopeNode(const MDNode *N)
const MDNode * getNode() const
Get the MDNode for this AliasScopeNode.
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
StringRef getName() const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This is an important base class in LLVM.
Pointer to the context, with optional RAUW support.
ContextAndReplaceableUses & operator=(const ContextAndReplaceableUses &)=delete
ReplaceableMetadataImpl * getReplaceableUses() const
std::unique_ptr< ReplaceableMetadataImpl > takeReplaceableUses()
Drop RAUW support.
ContextAndReplaceableUses & operator=(ContextAndReplaceableUses &&)=delete
ReplaceableMetadataImpl * getOrCreateReplaceableUses()
Ensure that this has RAUW support, and then return it.
void makeReplaceable(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
Assign RAUW support to this.
ContextAndReplaceableUses(ContextAndReplaceableUses &&)=delete
ContextAndReplaceableUses(const ContextAndReplaceableUses &)=delete
LLVMContext & getContext() const
~ContextAndReplaceableUses()
bool hasReplaceableUses() const
Whether this contains RAUW support.
ContextAndReplaceableUses()=delete
ContextAndReplaceableUses(LLVMContext &Context)
ContextAndReplaceableUses(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
This class represents an Operation in the Expression.
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....
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
DebugValueUser(const DebugValueUser &X)
DebugValueUser & operator=(DebugValueUser &&X)
LLVM_ABI void handleChangedValue(void *Old, Metadata *NewDebugValue)
To be called by ReplaceableMetadataImpl::replaceAllUsesWith, where Old is a pointer to one of the poi...
bool operator!=(const DebugValueUser &X) const
DebugValueUser(std::array< Metadata *, 3 > DebugValues)
bool operator==(const DebugValueUser &X) const
ArrayRef< Metadata * > getDebugValues() const
DebugValueUser & operator=(const DebugValueUser &X)
std::array< Metadata *, 3 > DebugValues
void resetDebugValue(size_t Idx, Metadata *DebugValue)
LLVM_ABI DbgVariableRecord * getUser()
DebugValueUser(DebugValueUser &&X)
Placeholder metadata for operands of distinct MDNodes.
void replaceUseWith(Metadata *MD)
Replace the use of this with MD.
DistinctMDOperandPlaceholder()=delete
~DistinctMDOperandPlaceholder()
DistinctMDOperandPlaceholder(const DistinctMDOperandPlaceholder &)=delete
DistinctMDOperandPlaceholder(unsigned ID)
DistinctMDOperandPlaceholder(DistinctMDOperandPlaceholder &&)=delete
This is an important class for using LLVM in a threaded context.
static LLVM_ABI MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
static LLVM_ABI MDNode * getMergedCallsiteMetadata(MDNode *A, MDNode *B)
LLVM_ABI void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
iterator_range< MDOperand * > mutable_op_range
LLVM_ABI void resolveCycles()
Resolve cycles.
LLVM_ABI bool isTBAAVtableAccess() const
Check whether MDNode is a vtable access.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
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.
static LLVM_ABI MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
const MDOperand & getOperand(unsigned I) const
static LLVM_ABI MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
LLVM_ABI void storeDistinctInContext()
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
ArrayRef< MDOperand > operands() const
op_iterator op_end() const
bool hasGeneralizedMDString()
Check if this is a valid generalized type metadata node.
MDNode(const MDNode &)=delete
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithDistinct(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a distinct one.
static LLVM_ABI MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast:
static LLVM_ABI MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
void setNumUnresolved(unsigned N)
void resize(size_t NumOps)
Resize the node to hold NumOps operands.
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)
unsigned getNumTemporaryUses() const
static LLVM_ABI MDNode * getMergedMemProfMetadata(MDNode *A, MDNode *B)
bool isReplaceable() const
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
MDOperand * mutable_end()
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithPermanent(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a permanent one.
LLVM_ABI void dropAllReferences()
void operator=(const MDNode &)=delete
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.
LLVM_ABI void dumpTree() const
User-friendly dump in tree shape.
static LLVM_ABI MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
unsigned getNumUnresolved() const
bool isAlwaysReplaceable() const
Tracking metadata reference owned by Metadata.
bool equalsStr(StringRef Str) const
void reset(Metadata *MD, Metadata *Owner)
Metadata * operator->() const
MDOperand & operator=(const MDOperand &)=delete
Metadata & operator*() const
MDOperand(const MDOperand &)=delete
MDOperand & operator=(MDOperand &&Op)
MDOperand(MDOperand &&Op)
unsigned getLength() const
const unsigned char * bytes_begin() const
MDString(const MDString &)=delete
static MDString * get(LLVMContext &Context, const char *Str)
MDString & operator=(MDString &&)=delete
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast.
const unsigned char * bytes_end() const
iterator begin() const
Pointer to the first byte of the string.
MDString & operator=(const MDString &)=delete
LLVM_ABI StringRef getString() const
iterator end() const
Pointer to one byte past the end of the string.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Typed, array-like tuple of metadata.
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t<!std::is_convertible< U *, T * >::value > *=nullptr)
MDTupleTypedArrayWrapper()=default
MDTupleTypedArrayWrapper(const MDTuple *N)
T * operator[](unsigned I) const
MDTuple * operator->() const
MDTuple & operator*() const
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t< std::is_convertible< U *, T * >::value > *=nullptr)
TypedMDOperandIterator< T > iterator
TempMDTuple clone() const
Return a (temporary) clone of this.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
static bool classof(const Metadata *MD)
void push_back(Metadata *MD)
Append an element to the tuple. This will resize the node.
unsigned getHash() const
Get the hash, if any.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
void pop_back()
Shrink the operands by 1.
Manage lifetime of a slot tracker for printing IR.
A Module instance is used to store all the information related to an LLVM module.
const_op_iterator op_begin() const
NamedMDNode(const NamedMDNode &)=delete
op_iterator_impl< const MDNode * > const_op_iterator
LLVM_ABI void dump() const
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 print(raw_ostream &ROS, bool IsForDebug=false) const
LLVM_ABI void eraseFromParent()
Drop all references and remove the node from parent module.
const_op_iterator op_end() const
iterator_range< const_op_iterator > operands() const
LLVM_ABI MDNode * getOperand(unsigned i) const
op_iterator_impl< MDNode * > op_iterator
LLVM_ABI unsigned getNumOperands() const
const Module * getParent() const
LLVM_ABI void clearOperands()
Drop all references to this node's operands.
iterator_range< op_iterator > operands()
Module * getParent()
Get the module that holds this named metadata collection.
LLVM_ABI void addOperand(MDNode *M)
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMapEntryStorage - Holds the value in a StringMapEntry.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
const unsigned char * bytes_end() const
constexpr size_t size() const
size - Get the string size.
const unsigned char * bytes_begin() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
Typed iterator through MDNode operands.
TypedMDOperandIterator operator++(int)
std::ptrdiff_t difference_type
TypedMDOperandIterator()=default
std::input_iterator_tag iterator_category
bool operator==(const TypedMDOperandIterator &X) const
TypedMDOperandIterator & operator++()
TypedMDOperandIterator(MDNode::op_iterator I)
bool operator!=(const TypedMDOperandIterator &X) const
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
struct LLVMOpaqueNamedMDNode * LLVMNamedMDNodeRef
Represents an LLVM Named Metadata Node.
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ArchKind & operator--(ArchKind &Kind)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
decltype(static_cast< V >(*std::declval< U & >())) check_has_dereference
static constexpr bool HasDereference
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, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
This is an optimization pass for GlobalISel generic memory operations.
APInt operator*(APInt a, uint64_t RHS)
bool operator!=(uint64_t V1, const APInt &V2)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
@ Ref
The access may reference the value stored in memory.
Attribute unwrap(LLVMAttributeRef Attr)
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI std::optional< APInt > getAllocSize(const CallBase *CB, const TargetLibraryInfo *TLI, function_ref< const Value *(const Value *)> Mapper=[](const Value *V) { return V;})
Return the size of the requested allocation.
const uint64_t NOMORE_ICP_MAGICNUM
Magic number in the value profile metadata showing a target has been promoted for the instruction and...
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
LLVM_ABI AAMDNodes concat(const AAMDNodes &Other) const
Determine the best AAMDNodes after concatenating two different locations together.
static LLVM_ABI MDNode * shiftTBAAStruct(MDNode *M, size_t off)
bool operator!=(const AAMDNodes &A) const
MDNode * NoAliasAddrSpace
The tag specifying the noalias address spaces.
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
MDNode * Scope
The tag for alias scope specification (used with noalias).
static LLVM_ABI MDNode * extendToTBAA(MDNode *TBAA, ssize_t len)
MDNode * TBAA
The tag for type-based alias analysis.
AAMDNodes shift(size_t Offset) const
Create a new AAMDNode that describes this AAMDNode after applying a constant offset to the start of t...
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
MDNode * NoAlias
The tag specifying the noalias scope.
AAMDNodes intersect(const AAMDNodes &Other) const
Given two sets of AAMDNodes that apply to the same pointer, give the best AAMDNodes that are compatib...
LLVM_ABI AAMDNodes adjustForAccess(unsigned AccessSize)
Create a new AAMDNode for accessing AccessSize bytes of this AAMDNode.
AAMDNodes(MDNode *T, MDNode *TS, MDNode *S, MDNode *N, MDNode *NAS)
AAMDNodes extendTo(ssize_t Len) const
Create a new AAMDNode that describes this AAMDNode after extending it to apply to a series of bytes o...
bool operator==(const AAMDNodes &A) const
static LLVM_ABI MDNode * shiftTBAA(MDNode *M, size_t off)
static AAMDNodes getEmptyKey()
static unsigned getHashValue(const AAMDNodes &Val)
static AAMDNodes getTombstoneKey()
static bool isEqual(const AAMDNodes &LHS, const AAMDNodes &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
void operator()(MDNode *Node) const
static SimpleType getSimplifiedValue(MDOperand &MD)
static SimpleType getSimplifiedValue(const MDOperand &MD)
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...