15#ifndef LLVM_IR_METADATA_H
16#define LLVM_IR_METADATA_H
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"
182class MetadataAsValue :
public Value {
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);
295 LLVM_ABI void trackDebugValue(
size_t Idx);
298 LLVM_ABI void untrackDebugValue(
size_t 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");
625template <
typename U,
typename V>
628template <
typename U,
typename V>
633 static const bool value = std::is_base_of<Constant, V>::value &&
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");
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 *>
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 *>
692template <
class X,
class Y>
693inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
705template <
class X,
class Y>
706inline std::enable_if_t<detail::IsValidPointer<X, Y>::value,
X *>
772 explicit operator bool()
const {
812 Result.NoAliasAddrSpace =
824 Result.Scope =
Scope;
840 Result.Scope =
Scope;
876 nullptr,
nullptr,
nullptr);
954 assert(
static_cast<void *
>(
this) == &MD &&
"Expected same address");
982 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses)
983 : Ptr(ReplaceableUses.
release()) {
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);
1125 static bool isLarge(
size_t NumOps) {
return NumOps > MaxSmallSize; }
1127 size_t getAllocSize()
const {
1128 return getOpSize(SmallSize) +
sizeof(Header);
1130 void *getAllocation() {
1131 return reinterpret_cast<char *
>(
this + 1) -
1132 alignTo(getAllocSize(),
alignof(uint64_t));
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());
1165 reinterpret_cast<MDOperand *
>(
this) - SmallSize, SmallNumOps);
1171 return ArrayRef(
reinterpret_cast<const MDOperand *
>(
this) - SmallSize,
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;
1196 LLVM_ABI void operator delete(
void *Mem);
1222 void *
operator new(size_t) =
delete;
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) {}
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,
1511 bool ShouldCreate =
true);
1513 TempMDTuple cloneImpl()
const {
1523 return getImpl(Context, MDs,
Uniqued);
1527 return getImpl(Context, MDs,
Uniqued,
false);
1534 return getImpl(Context, MDs,
Distinct);
1544 return TempMDTuple(getImpl(Context, MDs,
Temporary));
1548 TempMDTuple
clone()
const {
return cloneImpl(); }
1590 const MDNode *Node =
nullptr;
1601 if (Node->getNumOperands() < 2)
1606 if (Node->getNumOperands() > 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);
1796 op_iterator_impl &operator--() {
1801 op_iterator_impl operator--(
int) {
1802 op_iterator_impl tmp(*
this);
1807 T1 operator*()
const {
return Node->getOperand(Idx); }
1833 bool IsForDebug =
false)
const;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
mir Rename Register Operands
bool operator==(const MergedFunctionsInfo &LHS, const MergedFunctionsInfo &RHS)
This file defines the PointerUnion class, which is a discriminated union of pointer types.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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.
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)
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)
void replaceUseWith(Metadata *MD)
Replace the use of this with MD.
friend class MetadataTracking
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:
friend class ReplaceableMetadataImpl
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={})
iterator_range< op_iterator > op_range
friend class LLVMContextImpl
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
const MDOperand * op_iterator
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
StringRef::iterator iterator
iterator end() const
Pointer to one byte past the end of the string.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
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.
friend class LLVMContextImpl
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
friend class LLVMContextImpl
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
LLVM Value Representation.
LLVM_ABI Value(Type *Ty, unsigned scid)
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
static constexpr bool HasDereference
decltype(static_cast< V >(*std::declval< U & >())) check_has_dereference
Transitional API for extracting constants from Metadata.
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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
auto cast_or_null(const Y &Val)
auto dyn_cast_or_null(const Y &Val)
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...
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.
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
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...