class MDNode

Declaration

class MDNode : public Metadata { /* full declaration omitted */ };

Description

Metadata node. Metadata nodes can be uniqued, like constants, or distinct. Temporary metadata nodes (with full support for RAUW) can be used to delay uniquing until forward references are known. The basic metadata node is an \a MDTuple. There is limited support for RAUW at construction time. At construction time, if any operand is a temporary node (or an unresolved uniqued node, which indicates a transitive temporary operand), the node itself will be unresolved. As soon as all operands become resolved, it will drop RAUW support permanently. If an unresolved node is part of a cycle, \a resolveCycles() needs to be called on some member of the cycle once all temporary nodes have been replaced. MDNodes can be large or small, as well as resizable or non-resizable. Large MDNodes' operands are allocated in a separate storage vector, whereas small MDNodes' operands are co-allocated. Distinct and temporary MDnodes are resizable, but only MDTuples support this capability. Clients can add operands to resizable MDNodes using push_back().

Declared at: llvm/include/llvm/IR/Metadata.h:944

Inherits from: Metadata

Member Variables

private llvm::ContextAndReplaceableUses Context

Inherited from Metadata:

protected Storage
protected SubclassData1
protected SubclassData16 = 0
protected SubclassData32 = 0

Method Overview

Inherited from Metadata:

Methods

MDNode(llvm::LLVMContext& Context,
       unsigned int ID,
       llvm::Metadata::StorageType Storage,
       ArrayRef<llvm::Metadata*> Ops1,
       ArrayRef<llvm::Metadata*> Ops2 = None)

Declared at: llvm/include/llvm/IR/Metadata.h:1058

Parameters

llvm::LLVMContext& Context
unsigned int ID
llvm::Metadata::StorageType Storage
ArrayRef<llvm::Metadata*> Ops1
ArrayRef<llvm::Metadata*> Ops2 = None

MDNode(const llvm::MDNode&)

Declared at: llvm/include/llvm/IR/Metadata.h:1087

Parameters

const llvm::MDNode&

static bool classof(const llvm::Metadata* MD)

Description

Methods for support type inquiry through isa, cast, and dyn_cast:

Declared at: llvm/include/llvm/IR/Metadata.h:1301

Parameters

const llvm::Metadata* MD

llvm::TempMDNode clone() const

Description

Create a (temporary) clone of this.

Declared at: llvm/include/llvm/IR/Metadata.h:1100

static llvm::MDNode* concatenate(llvm::MDNode* A,
                                 llvm::MDNode* B)

Description

Methods for metadata merging.

Declared at: llvm/include/llvm/IR/Metadata.h:1316

Parameters

llvm::MDNode* A
llvm::MDNode* B

void countUnresolvedOperands()

Declared at: llvm/include/llvm/IR/Metadata.h:1245

void decrementUnresolvedOperandCount()

Declared at: llvm/include/llvm/IR/Metadata.h:1244

void deleteAsSubclass()

Declared at: llvm/include/llvm/IR/Metadata.h:1260

static void deleteTemporary(llvm::MDNode* N)

Description

Deallocate a node created by getTemporary. Calls \c replaceAllUsesWith(nullptr) before deleting, so any remaining references will be reset.

Declared at: llvm/include/llvm/IR/Metadata.h:1106

Parameters

llvm::MDNode* N

template <class NodeTy>
static void dispatchRecalculateHash(
    NodeTy* N,
    std::true_type)

Declared at: llvm/include/llvm/IR/Metadata.h:1266

Templates

NodeTy

Parameters

NodeTy* N
std::true_type

template <class NodeTy>
static void dispatchRecalculateHash(
    NodeTy*,
    std::false_type)

Declared at: llvm/include/llvm/IR/Metadata.h:1270

Templates

NodeTy

Parameters

NodeTy*
std::false_type

template <class NodeTy>
static void dispatchResetHash(NodeTy* N,
                              std::true_type)

Declared at: llvm/include/llvm/IR/Metadata.h:1272

Templates

NodeTy

Parameters

NodeTy* N
std::true_type

template <class NodeTy>
static void dispatchResetHash(NodeTy*,
                              std::false_type)

Declared at: llvm/include/llvm/IR/Metadata.h:1276

Templates

NodeTy

Parameters

NodeTy*
std::false_type

void dropAllReferences()

Declared at: llvm/include/llvm/IR/Metadata.h:1075

void dropReplaceableUses()

Description

Drop RAUW support, if any.

Declared at: llvm/include/llvm/IR/Metadata.h:1241

void dumpTree(const llvm::Module* M) const

Declared at: llvm/include/llvm/IR/Metadata.h:1204

Parameters

const llvm::Module* M

void dumpTree() const

Description

User-friendly dump in tree shape. If \c M is provided, metadata nodes will be numbered canonically; otherwise, pointer addresses are substituted. Note: this uses an explicit overload instead of default arguments so that the nullptr version is easy to call from a debugger. @ {

Declared at: llvm/include/llvm/IR/Metadata.h:1203

void eraseFromStore()

Declared at: llvm/include/llvm/IR/Metadata.h:1262

static inline llvm::MDTuple* get(
    llvm::LLVMContext& Context,
    ArrayRef<llvm::Metadata*> MDs)

Declared at: llvm/include/llvm/IR/Metadata.h:1091

Parameters

llvm::LLVMContext& Context
ArrayRef<llvm::Metadata*> MDs

llvm::LLVMContext& getContext() const

Declared at: llvm/include/llvm/IR/Metadata.h:1108

static inline llvm::MDTuple* getDistinct(
    llvm::LLVMContext& Context,
    ArrayRef<llvm::Metadata*> MDs)

Declared at: llvm/include/llvm/IR/Metadata.h:1094

Parameters

llvm::LLVMContext& Context
ArrayRef<llvm::Metadata*> MDs

const llvm::MDNode::Header& getHeader() const

Declared at: llvm/include/llvm/IR/Metadata.h:1051

llvm::MDNode::Header& getHeader()

Declared at: llvm/include/llvm/IR/Metadata.h:1049

static inline llvm::MDTuple* getIfExists(
    llvm::LLVMContext& Context,
    ArrayRef<llvm::Metadata*> MDs)

Declared at: llvm/include/llvm/IR/Metadata.h:1092

Parameters

llvm::LLVMContext& Context
ArrayRef<llvm::Metadata*> MDs

static llvm::MDNode* getMostGenericAliasScope(
    llvm::MDNode* A,
    llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1321

Parameters

llvm::MDNode* A
llvm::MDNode* B

static llvm::MDNode*
getMostGenericAlignmentOrDereferenceable(
    llvm::MDNode* A,
    llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1322

Parameters

llvm::MDNode* A
llvm::MDNode* B

static llvm::MDNode* getMostGenericFPMath(
    llvm::MDNode* A,
    llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1319

Parameters

llvm::MDNode* A
llvm::MDNode* B

static llvm::MDNode* getMostGenericRange(
    llvm::MDNode* A,
    llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1320

Parameters

llvm::MDNode* A
llvm::MDNode* B

static llvm::MDNode* getMostGenericTBAA(
    llvm::MDNode* A,
    llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1318

Parameters

llvm::MDNode* A
llvm::MDNode* B

unsigned int getNumOperands() const

Description

Return number of MDNode operands.

Declared at: llvm/include/llvm/IR/Metadata.h:1298

unsigned int getNumUnresolved() const

Declared at: llvm/include/llvm/IR/Metadata.h:1218

const llvm::MDOperand& getOperand(
    unsigned int I) const

Declared at: llvm/include/llvm/IR/Metadata.h:1292

Parameters

unsigned int I

static inline llvm::TempMDTuple getTemporary(
    llvm::LLVMContext& Context,
    ArrayRef<llvm::Metadata*> MDs)

Declared at: llvm/include/llvm/IR/Metadata.h:1096

Parameters

llvm::LLVMContext& Context
ArrayRef<llvm::Metadata*> MDs

void handleChangedOperand(void* Ref,
                          llvm::Metadata* New)

Declared at: llvm/include/llvm/IR/Metadata.h:1238

Parameters

void* Ref
llvm::Metadata* New

static llvm::MDNode* intersect(llvm::MDNode* A,
                               llvm::MDNode* B)

Declared at: llvm/include/llvm/IR/Metadata.h:1317

Parameters

llvm::MDNode* A
llvm::MDNode* B

bool isDistinct() const

Declared at: llvm/include/llvm/IR/Metadata.h:1127

bool isResolved() const

Description

Check if node is fully resolved. If \a isTemporary(), this always returns \c false; if \a isDistinct(), this always returns \c true. If \a isUniqued(), returns \c true if this has already dropped RAUW support (because all operands are resolved). As forward declarations are resolved, their containers should get resolved automatically. However, if this (or one of its operands) is involved in a cycle, \a resolveCycles() needs to be called explicitly.

Declared at: llvm/include/llvm/IR/Metadata.h:1124

bool isTBAAVtableAccess() const

Description

Check whether MDNode is a vtable access.

Declared at: llvm/include/llvm/IR/Metadata.h:1313

bool isTemporary() const

Declared at: llvm/include/llvm/IR/Metadata.h:1128

bool isUniqued() const

Declared at: llvm/include/llvm/IR/Metadata.h:1126

void makeDistinct()

Description

Mutate this to be "distinct". Mutate this so that \a isDistinct().

Declared at: llvm/include/llvm/IR/Metadata.h:1258

void makeUniqued()

Description

Mutate this to be "uniqued". Mutate this so that \a isUniqued().

Declared at: llvm/include/llvm/IR/Metadata.h:1252

llvm::MDOperand* mutable_begin()

Declared at: llvm/include/llvm/IR/Metadata.h:1077

llvm::MDOperand* mutable_end()

Declared at: llvm/include/llvm/IR/Metadata.h:1078

llvm::MDNode::mutable_op_range mutable_operands()

Declared at: llvm/include/llvm/IR/Metadata.h:1082

llvm::MDNode::op_iterator op_begin() const

Declared at: llvm/include/llvm/IR/Metadata.h:1282

llvm::MDNode::op_iterator op_end() const

Declared at: llvm/include/llvm/IR/Metadata.h:1286

ArrayRef<llvm::MDOperand> operands() const

Declared at: llvm/include/llvm/IR/Metadata.h:1290

void printTree(
    llvm::raw_ostream& OS,
    llvm::ModuleSlotTracker& MST,
    const llvm::Module* M = nullptr) const

Declared at: llvm/include/llvm/IR/Metadata.h:1190

Parameters

llvm::raw_ostream& OS
llvm::ModuleSlotTracker& MST
const llvm::Module* M = nullptr

void printTree(
    llvm::raw_ostream& OS,
    const llvm::Module* M = nullptr) const

Description

Print in tree shape. Prints definition of \c this in tree shape. If \c M is provided, metadata nodes will be numbered canonically; otherwise, pointer addresses are substituted. @ {

Declared at: llvm/include/llvm/IR/Metadata.h:1189

Parameters

llvm::raw_ostream& OS
const llvm::Module* M = nullptr

void replaceAllUsesWith(llvm::Metadata* MD)

Description

RAUW a temporary.

Declared at: llvm/include/llvm/IR/Metadata.h:1133

Parameters

llvm::Metadata* MD

void replaceOperandWith(unsigned int I,
                        llvm::Metadata* New)

Description

Replace a specific operand.

Declared at: llvm/include/llvm/IR/Metadata.h:1111

Parameters

unsigned int I
llvm::Metadata* New

template <class T>
static std::enable_if_t<
    std::is_base_of<MDNode, T>::value,
    T*>
replaceWithDistinct(
    std::unique_ptr<T, TempMDNodeDeleter> N)

Description

Replace a temporary node with a distinct one. Create a distinct version of \c N -- in place, if possible -- and return it. Takes ownership of the temporary node.

Declared at: llvm/include/llvm/IR/Metadata.h:1178

Templates

T

Parameters

std::unique_ptr<T, TempMDNodeDeleter> N

llvm::MDNode* replaceWithDistinctImpl()

Declared at: llvm/include/llvm/IR/Metadata.h:1210

template <class T>
static std::enable_if_t<
    std::is_base_of<MDNode, T>::value,
    T*>
replaceWithPermanent(
    std::unique_ptr<T, TempMDNodeDeleter> N)

Description

Replace a temporary node with a permanent one. Try to create a uniqued version of \c N -- in place, if possible -- and return it. If \c N cannot be uniqued, return a distinct node instead.

Declared at: llvm/include/llvm/IR/Metadata.h:1156

Templates

T

Parameters

std::unique_ptr<T, TempMDNodeDeleter> N

llvm::MDNode* replaceWithPermanentImpl()

Description

@ }

Declared at: llvm/include/llvm/IR/Metadata.h:1208

template <class T>
static std::enable_if_t<
    std::is_base_of<MDNode, T>::value,
    T*>
replaceWithUniqued(
    std::unique_ptr<T, TempMDNodeDeleter> N)

Description

Replace a temporary node with a uniqued one. Create a uniqued version of \c N -- in place, if possible -- and return it. Takes ownership of the temporary node.

Declared at: llvm/include/llvm/IR/Metadata.h:1168

Templates

T

Parameters

std::unique_ptr<T, TempMDNodeDeleter> N

llvm::MDNode* replaceWithUniquedImpl()

Declared at: llvm/include/llvm/IR/Metadata.h:1209

void resize(size_t NumOps)

Description

Resize the node to hold \a NumOps operands.

Declared at: llvm/include/llvm/IR/Metadata.h:1230

Parameters

size_t NumOps

void resolve()

Description

Resolve a unique, unresolved node.

Declared at: llvm/include/llvm/IR/Metadata.h:1148

void resolveAfterOperandChange(
    llvm::Metadata* Old,
    llvm::Metadata* New)

Declared at: llvm/include/llvm/IR/Metadata.h:1243

Parameters

llvm::Metadata* Old
llvm::Metadata* New

void resolveCycles()

Description

Resolve cycles. Once all forward declarations have been resolved, force cycles to be resolved.

Declared at: llvm/include/llvm/IR/Metadata.h:1145

void setNumUnresolved(unsigned int N)

Declared at: llvm/include/llvm/IR/Metadata.h:1220

Parameters

unsigned int N

void setOperand(unsigned int I,
                llvm::Metadata* New)

Description

Set an operand. Sets the operand directly, without worrying about uniquing.

Declared at: llvm/include/llvm/IR/Metadata.h:1216

Parameters

unsigned int I
llvm::Metadata* New

void storeDistinctInContext()

Declared at: llvm/include/llvm/IR/Metadata.h:1221

template <class T, class StoreT>
static T* storeImpl(
    T* N,
    llvm::Metadata::StorageType Storage,
    StoreT& Store)

Declared at: llvm/include/llvm/IR/Metadata.h:1223

Templates

T
StoreT

Parameters

T* N
llvm::Metadata::StorageType Storage
StoreT& Store

template <class T>
static T* storeImpl(
    T* N,
    llvm::Metadata::StorageType Storage)

Declared at: llvm/include/llvm/IR/Metadata.h:1224

Templates

T

Parameters

T* N
llvm::Metadata::StorageType Storage

llvm::MDNode* uniquify()

Declared at: llvm/include/llvm/IR/Metadata.h:1261

~MDNode()

Declared at: llvm/include/llvm/IR/Metadata.h:1060