LLVM  4.0.0
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Friends | List of all members
llvm::MDNode Class Reference

Metadata node. More...

#include <Metadata.h>

Inheritance diagram for llvm::MDNode:
[legend]
Collaboration diagram for llvm::MDNode:
[legend]

Classes

struct  HasCachedHash
 

Public Types

typedef const MDOperandop_iterator
 
typedef iterator_range
< op_iterator
op_range
 

Public Member Functions

 MDNode (const MDNode &)=delete
 
void operator= (const MDNode &)=delete
 
void * operator new (size_t)=delete
 
TempMDNode clone () const
 Create a (temporary) clone of this. More...
 
LLVMContextgetContext () const
 
void replaceOperandWith (unsigned I, Metadata *New)
 Replace a specific operand. More...
 
bool isResolved () const
 Check if node is fully resolved. More...
 
bool isUniqued () const
 
bool isDistinct () const
 
bool isTemporary () const
 
void replaceAllUsesWith (Metadata *MD)
 RAUW a temporary. More...
 
void resolveCycles ()
 Resolve cycles. More...
 
op_iterator op_begin () const
 
op_iterator op_end () const
 
op_range operands () const
 
const MDOperandgetOperand (unsigned I) const
 
unsigned getNumOperands () const
 Return number of MDNode operands. More...
 
bool isTBAAVtableAccess () const
 Check whether MDNode is a vtable access. More...
 

Static Public Member Functions

static MDTupleget (LLVMContext &Context, ArrayRef< Metadata * > MDs)
 
static MDTuplegetIfExists (LLVMContext &Context, ArrayRef< Metadata * > MDs)
 
static MDTuplegetDistinct (LLVMContext &Context, ArrayRef< Metadata * > MDs)
 
static TempMDTuple getTemporary (LLVMContext &Context, ArrayRef< Metadata * > MDs)
 
static void deleteTemporary (MDNode *N)
 Deallocate a node created by getTemporary. More...
 
template<class T >
static std::enable_if
< std::is_base_of< MDNode, T >
::value, T * >::type 
replaceWithPermanent (std::unique_ptr< T, TempMDNodeDeleter > N)
 Replace a temporary node with a permanent one. More...
 
template<class T >
static std::enable_if
< std::is_base_of< MDNode, T >
::value, T * >::type 
replaceWithUniqued (std::unique_ptr< T, TempMDNodeDeleter > N)
 Replace a temporary node with a uniqued one. More...
 
template<class T >
static std::enable_if
< std::is_base_of< MDNode, T >
::value, T * >::type 
replaceWithDistinct (std::unique_ptr< T, TempMDNodeDeleter > N)
 Replace a temporary node with a distinct one. More...
 
static bool classof (const Metadata *MD)
 Methods for support type inquiry through isa, cast, and dyn_cast: More...
 
static MDNodeconcatenate (MDNode *A, MDNode *B)
 Methods for metadata merging. More...
 
static MDNodeintersect (MDNode *A, MDNode *B)
 
static MDNodegetMostGenericTBAA (MDNode *A, MDNode *B)
 
static MDNodegetMostGenericFPMath (MDNode *A, MDNode *B)
 
static MDNodegetMostGenericRange (MDNode *A, MDNode *B)
 
static MDNodegetMostGenericAliasScope (MDNode *A, MDNode *B)
 
static MDNodegetMostGenericAlignmentOrDereferenceable (MDNode *A, MDNode *B)
 

Protected Types

typedef iterator_range
< MDOperand * > 
mutable_op_range
 
 Active type of storage. More...

Protected Member Functions

void * operator new (size_t Size, unsigned NumOps)
 
void operator delete (void *Mem)
 
void operator delete (void *, unsigned)
 Required by std, but never called. More...
 
void operator delete (void *, unsigned, bool)
 Required by std, but never called. More...
 
 MDNode (LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2=None)
 
 ~MDNode ()=default
 
void dropAllReferences ()
 
MDOperandmutable_begin ()
 
MDOperandmutable_end ()
 
mutable_op_range mutable_operands ()
 
void setOperand (unsigned I, Metadata *New)
 Set an operand. More...
 
void storeDistinctInContext ()
 

Static Protected Member Functions

template<class T , class StoreT >
static TstoreImpl (T *N, StorageType Storage, StoreT &Store)
 
template<class T >
static TstoreImpl (T *N, StorageType Storage)
 

Friends

class ReplaceableMetadataImpl
 
class LLVMContextImpl
 

Additional Inherited Members

Detailed 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 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, resolveCycles() needs to be called on some member of the cycle once all temporary nodes have been replaced.

Definition at line 830 of file Metadata.h.

Member Typedef Documentation

Definition at line 862 of file Metadata.h.

Definition at line 1021 of file Metadata.h.

Definition at line 1022 of file Metadata.h.

Constructor & Destructor Documentation

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

Definition at line 464 of file Metadata.cpp.

References isUniqued(), and setOperand().

llvm::MDNode::~MDNode ( )
protecteddefault
llvm::MDNode::MDNode ( const MDNode )
delete

Member Function Documentation

static bool llvm::MDNode::classof ( const Metadata MD)
inlinestatic

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

Definition at line 1043 of file Metadata.h.

References llvm::Metadata::getMetadataID().

TempMDNode MDNode::clone ( ) const

Create a (temporary) clone of this.

Definition at line 482 of file Metadata.cpp.

References llvm::Metadata::getMetadataID(), and llvm_unreachable.

Referenced by llvm::DIType::clone().

MDNode * MDNode::concatenate ( MDNode A,
MDNode B 
)
static
void MDNode::deleteTemporary ( MDNode N)
static

Deallocate a node created by getTemporary.

Calls replaceAllUsesWith(nullptr) before deleting, so any remaining references will be reset.

Definition at line 791 of file Metadata.cpp.

References assert(), isTemporary(), and replaceAllUsesWith().

Referenced by llvm::TempMDNodeDeleter::operator()().

void MDNode::dropAllReferences ( )
protected

Definition at line 650 of file Metadata.cpp.

References E, I, and setOperand().

MDTuple * llvm::MDNode::get ( LLVMContext Context,
ArrayRef< Metadata * >  MDs 
)
inlinestatic

Definition at line 1132 of file Metadata.h.

References llvm::MDTuple::get().

Referenced by AddAliasScopeMetadata(), llvm::Module::addModuleFlag(), AddRuntimeUnrollDisableMetaData(), llvm::addStringMetadataToLoop(), llvm::LoopVersioning::annotateInstWithNoAlias(), llvm::annotateValueSite(), canonicalizeMetadataForValue(), CloneAliasScopeMetadata(), CloneLoopBlocks(), llvm::DILocation::cloneWithDiscriminator(), combineLoadToNewType(), llvm::GlobalObject::copyMetadata(), llvm::MDBuilder::createAliasScope(), llvm::MDBuilder::createAliasScopeDomain(), llvm::MDBuilder::createAnonymousAARoot(), llvm::DIBuilder::createArrayType(), llvm::DIBuilder::createBasicType(), llvm::DIBuilder::createBitFieldMemberType(), llvm::MDBuilder::createBranchWeights(), llvm::DIBuilder::createClassType(), llvm::DIBuilder::createConstantValueExpression(), llvm::DIBuilder::createEnumerationType(), llvm::DIBuilder::createEnumerator(), llvm::DIBuilder::createExpression(), llvm::DIBuilder::createExternalTypeRef(), llvm::DIBuilder::createFile(), llvm::DIBuilder::createForwardDecl(), llvm::MDBuilder::createFPMath(), llvm::DIBuilder::createFragmentExpression(), llvm::DIBuilder::createFriend(), llvm::MDBuilder::createFunctionEntryCount(), llvm::MDBuilder::createFunctionSectionPrefix(), llvm::DIBuilder::createGlobalVariableExpression(), createImportedModule(), llvm::DIBuilder::createInheritance(), llvm::DIBuilder::createLexicalBlockFile(), createLocalVariable(), llvm::DIBuilder::createMacro(), llvm::DIBuilder::createMemberPointerType(), llvm::DIBuilder::createMemberType(), llvm::DIBuilder::createModule(), llvm::DIBuilder::createNameSpace(), llvm::DIBuilder::createObjCIVar(), llvm::DIBuilder::createObjCProperty(), llvm::createPGOFuncNameMetadata(), llvm::DIBuilder::createPointerType(), llvm::DIBuilder::createQualifiedType(), llvm::MDBuilder::createRange(), llvm::DIBuilder::createReferenceType(), llvm::DIBuilder::createStaticMemberType(), createStringMetadata(), llvm::DIBuilder::createStructType(), llvm::DIBuilder::createSubroutineType(), llvm::MDBuilder::createTBAANode(), llvm::MDBuilder::createTBAARoot(), llvm::MDBuilder::createTBAAScalarTypeNode(), llvm::MDBuilder::createTBAAStructNode(), llvm::MDBuilder::createTBAAStructTagNode(), llvm::MDBuilder::createTBAAStructTypeNode(), llvm::DIBuilder::createTemplateParameterPack(), llvm::DIBuilder::createTemplateTypeParameter(), createTemplateValueParameterHelper(), llvm::DIBuilder::createTypedef(), llvm::DIBuilder::createUnionType(), llvm::MDBuilder::createUnpredictable(), llvm::DIBuilder::createUnspecifiedType(), llvm::DIBuilder::createVectorType(), DisableAllLoopOptsOnLoop(), llvm::SIFrameLowering::emitPrologue(), llvm::SystemZFrameLowering::emitPrologue(), extractMDNode(), llvm::DIBuilder::finalize(), findBasePointer(), llvm::DebugLoc::get(), getMostGenericRange(), getMostGenericTBAA(), llvm::DIBuilder::getOrCreateSubrange(), llvm::DIBuilder::getOrCreateTypeArray(), getOrSelfReference(), getSubprogram(), llvm::FunctionImporter::importFunctions(), LLVMMDNodeInContext(), llvm::SIRegisterInfo::materializeFrameBaseRegister(), llvm::LoopVersioning::prepareNoAliasMetadata(), llvm::DIBuilder::replaceTemporary(), llvm::SIRegisterInfo::restoreSGPR(), SetLoopAlreadyUnrolled(), setNoClobberMetadata(), setUniformMetadata(), llvm::SIRegisterInfo::spillSGPR(), llvm::Instruction::swapProfMetadata(), llvm::UpgradeIntrinsicCall(), and llvm::InstCombiner::visitCallInst().

LLVMContext& llvm::MDNode::getContext ( ) const
inline
MDTuple * llvm::MDNode::getDistinct ( LLVMContext Context,
ArrayRef< Metadata * >  MDs 
)
inlinestatic
MDTuple * llvm::MDNode::getIfExists ( LLVMContext Context,
ArrayRef< Metadata * >  MDs 
)
inlinestatic

Definition at line 1136 of file Metadata.h.

References llvm::MDTuple::getIfExists().

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

Definition at line 1010 of file Metadata.cpp.

References B, getOperand(), and llvm::ConstantInt::getZExtValue().

Referenced by llvm::combineMetadata().

MDNode * MDNode::getMostGenericFPMath ( MDNode A,
MDNode B 
)
static
MDNode * MDNode::getMostGenericRange ( MDNode A,
MDNode B 
)
static
MDNode * MDNode::getMostGenericTBAA ( MDNode A,
MDNode B 
)
static
unsigned llvm::MDNode::getNumOperands ( ) const
inline
const MDOperand& llvm::MDNode::getOperand ( unsigned  I) const
inline

Definition at line 1034 of file Metadata.h.

References assert(), I, and op_begin().

Referenced by AccessQualFromMD(), llvm::Module::addModuleFlag(), AddRuntimeUnrollDisableMetaData(), llvm::addStringMetadataToLoop(), ArgTypeFromMD(), llvm::cacheAnnotationFromMD(), CloneAliasScopeMetadata(), CloneLoopBlocks(), llvm::computeKnownBitsFromRangeMetadata(), llvm::ConstantFoldTerminator(), llvm::MachineInstr::emitError(), llvm::findStringMetadataForLoop(), GetArgMD(), GetBranchWeights(), llvm::getConstantRangeFromMetadata(), llvm::GenericDINode::getDwarfOperand(), llvm::DOTGraphTraits< const Function * >::getEdgeAttributes(), llvm::Function::getEntryCount(), llvm::FPMathOperator::getFPAccuracy(), llvm::ProfileSummary::getFromMD(), GetFunctionFromMDNode(), getHiPELiteral(), llvm::Loop::getLoopID(), getMDNodeOperandImpl(), getMostGenericAlignmentOrDereferenceable(), getMostGenericFPMath(), getMostGenericRange(), llvm::DINode::getOperandAs(), llvm::DIMacroNode::getOperandAs(), llvm::DICompositeType::getRawBaseType(), llvm::DICompositeType::getRawElements(), llvm::DIMacroFile::getRawElements(), llvm::DIImportedEntity::getRawEntity(), llvm::DICompileUnit::getRawEnumTypes(), llvm::DIGlobalVariableExpression::getRawExpression(), llvm::DIScope::getRawFile(), llvm::DIVariable::getRawFile(), llvm::DIObjCProperty::getRawFile(), llvm::DIMacroFile::getRawFile(), llvm::DICompileUnit::getRawGlobalVariables(), llvm::DICompileUnit::getRawImportedEntities(), llvm::DILocation::getRawInlinedAt(), llvm::DICompileUnit::getRawMacros(), llvm::DICompileUnit::getRawRetainedTypes(), llvm::DIType::getRawScope(), llvm::DILocation::getRawScope(), llvm::DILexicalBlockBase::getRawScope(), llvm::DINamespace::getRawScope(), llvm::DIModule::getRawScope(), llvm::DIVariable::getRawScope(), llvm::DIImportedEntity::getRawScope(), llvm::DIGlobalVariable::getRawStaticDataMemberDeclaration(), llvm::DICompositeType::getRawTemplateParams(), llvm::DITemplateParameter::getRawType(), llvm::DIVariable::getRawType(), llvm::DIObjCProperty::getRawType(), llvm::DISubroutineType::getRawTypeArray(), llvm::DIGlobalVariableExpression::getRawVariable(), llvm::DICompositeType::getRawVTableHolder(), getRuntimeMDForKernel(), getSummaryFromMD(), llvm::GetUnrollMetadata(), getVal(), llvm::DITemplateValueParameter::getValue(), llvm::getValueProfDataFromInst(), HasBranchWeights(), isKeyValuePair(), IsScalarTBAANodeImpl(), isStructPathTBAA(), isTBAAVtableAccess(), llvm::DITypeRefArray::operator[](), rangeMetadataExcludesValue(), replaceOperandWith(), SetLoopAlreadyUnrolled(), llvm::Loop::setLoopID(), llvm::Instruction::swapProfMetadata(), UnrollCountPragmaValue(), llvm::UpgradeModuleFlags(), llvm::UpgradeTBAANode(), and llvm::TBAAVerifier::visitTBAAMetadata().

TempMDTuple llvm::MDNode::getTemporary ( LLVMContext Context,
ArrayRef< Metadata * >  MDs 
)
inlinestatic
MDNode * MDNode::intersect ( MDNode A,
MDNode B 
)
static
bool llvm::MDNode::isDistinct ( ) const
inline

Definition at line 908 of file Metadata.h.

References llvm::Metadata::Distinct, and llvm::Metadata::Storage.

Referenced by getMetadataTypeOrder(), and llvm::DIType::mutate().

bool llvm::MDNode::isResolved ( ) const
inline

Check if node is fully resolved.

If isTemporary(), this always returns false; if isDistinct(), this always returns true.

If isUniqued(), returns 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, resolveCycles() needs to be called explicitly.

Definition at line 905 of file Metadata.h.

References isTemporary().

Referenced by llvm::DIBuilder::finalize(), llvm::LexicalScope::LexicalScope(), llvm::DIBuilder::replaceArrays(), llvm::DIBuilder::replaceVTableHolder(), resolveCycles(), and storeDistinctInContext().

bool MDNode::isTBAAVtableAccess ( ) const

Check whether MDNode is a vtable access.

Definition at line 388 of file TypeBasedAliasAnalysis.cpp.

References getNumOperands(), getOperand(), and isStructPathTBAA().

bool llvm::MDNode::isTemporary ( ) const
inline
bool llvm::MDNode::isUniqued ( ) const
inline
MDOperand* llvm::MDNode::mutable_begin ( )
inlineprotected

Definition at line 859 of file Metadata.h.

References mutable_end().

Referenced by mutable_operands(), op_begin(), replaceOperandWith(), and setOperand().

MDOperand* llvm::MDNode::mutable_end ( )
inlineprotected

Definition at line 860 of file Metadata.h.

Referenced by mutable_begin(), mutable_operands(), and op_end().

mutable_op_range llvm::MDNode::mutable_operands ( )
inlineprotected

Definition at line 863 of file Metadata.h.

References mutable_begin(), and mutable_end().

op_iterator llvm::MDNode::op_begin ( ) const
inline
op_iterator llvm::MDNode::op_end ( ) const
inline
op_range llvm::MDNode::operands ( ) const
inline
void MDNode::operator delete ( void *  Mem)
protected

Definition at line 453 of file Metadata.cpp.

References llvm::alignTo(), E, and N.

void llvm::MDNode::operator delete ( void *  ,
unsigned   
)
inlineprotected

Required by std, but never called.

Definition at line 844 of file Metadata.h.

References llvm_unreachable.

void llvm::MDNode::operator delete ( void *  ,
unsigned  ,
bool   
)
inlineprotected

Required by std, but never called.

Definition at line 849 of file Metadata.h.

References llvm_unreachable.

void * MDNode::operator new ( size_t  Size,
unsigned  NumOps 
)
protected

Definition at line 441 of file Metadata.cpp.

References llvm::alignTo(), E, and Ptr.

void* llvm::MDNode::operator new ( size_t  )
delete
void llvm::MDNode::operator= ( const MDNode )
delete
void llvm::MDNode::replaceAllUsesWith ( Metadata MD)
inline

RAUW a temporary.

Precondition
isTemporary() must be true.

Definition at line 914 of file Metadata.h.

References assert(), Context, and isTemporary().

Referenced by deleteTemporary(), and llvm::DIBuilder::replaceTemporary().

void MDNode::replaceOperandWith ( unsigned  I,
Metadata New 
)
template<class T >
static std::enable_if<std::is_base_of<MDNode, T>::value, T *>::type llvm::MDNode::replaceWithDistinct ( std::unique_ptr< T, TempMDNodeDeleter N)
inlinestatic

Replace a temporary node with a distinct one.

Create a distinct version of N – in place, if possible – and return it. Takes ownership of the temporary node.

Definition at line 956 of file Metadata.h.

template<class T >
static std::enable_if<std::is_base_of<MDNode, T>::value, T *>::type llvm::MDNode::replaceWithPermanent ( std::unique_ptr< T, TempMDNodeDeleter N)
inlinestatic

Replace a temporary node with a permanent one.

Try to create a uniqued version of N – in place, if possible – and return it. If N cannot be uniqued, return a distinct node instead.

Definition at line 934 of file Metadata.h.

template<class T >
static std::enable_if<std::is_base_of<MDNode, T>::value, T *>::type llvm::MDNode::replaceWithUniqued ( std::unique_ptr< T, TempMDNodeDeleter N)
inlinestatic

Replace a temporary node with a uniqued one.

Create a uniqued version of N – in place, if possible – and return it. Takes ownership of the temporary node.

Precondition
N does not self-reference.

Definition at line 946 of file Metadata.h.

Referenced by createTypeWithFlags(), and llvm::DIBuilder::replaceTemporary().

void MDNode::resolveCycles ( )

Resolve cycles.

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

Precondition
No operands (or operands' operands, etc.) have isTemporary().

Definition at line 581 of file Metadata.cpp.

References assert(), isResolved(), N, and operands().

Referenced by llvm::DIBuilder::finalize().

void MDNode::setOperand ( unsigned  I,
Metadata New 
)
protected

Set an operand.

Sets the operand directly, without worrying about uniquing.

Definition at line 831 of file Metadata.cpp.

References assert(), I, isUniqued(), mutable_begin(), and llvm::MDOperand::reset().

Referenced by dropAllReferences(), MDNode(), and replaceOperandWith().

void MDNode::storeDistinctInContext ( )
protected
template<class T , class StoreT >
T * llvm::MDNode::storeImpl ( T N,
StorageType  Storage,
StoreT &  Store 
)
staticprotected
template<class T >
T * llvm::MDNode::storeImpl ( T N,
StorageType  Storage 
)
staticprotected

Friends And Related Function Documentation

friend class LLVMContextImpl
friend

Definition at line 832 of file Metadata.h.

friend class ReplaceableMetadataImpl
friend

Definition at line 831 of file Metadata.h.


The documentation for this class was generated from the following files: