LLVM  13.0.0git
Classes | Macros | Functions
Metadata.cpp File Reference
#include "llvm/IR/Metadata.h"
#include "LLVMContextImpl.h"
#include "MetadataImpl.h"
#include "SymbolTableListTraitsImpl.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/TrackingMDRef.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <tuple>
#include <type_traits>
#include <utility>
#include <vector>
#include "llvm/IR/Metadata.def"
Include dependency graph for Metadata.cpp:

Go to the source code of this file.

Classes

struct  llvm::MDNode::HasCachedHash< NodeTy >
 
struct  llvm::MDNode::HasCachedHash< NodeTy >::SFINAE< U, Val >
 

Macros

#define HANDLE_METADATA_LEAF(CLASS)
 
#define HANDLE_MDNODE_LEAF(CLASS)
 
#define HANDLE_MDNODE_LEAF(CLASS)
 
#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)
 
#define HANDLE_MDNODE_LEAF(CLASS)
 
#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)
 
#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)
 
#define HANDLE_MDNODE_LEAF(CLASS)
 

Functions

static MetadatacanonicalizeMetadataForValue (LLVMContext &Context, Metadata *MD)
 Canonicalize metadata arguments to intrinsics. More...
 
static DISubprogramgetLocalFunctionMetadata (Value *V)
 
static bool isOperandUnresolved (Metadata *Op)
 
static bool hasSelfReference (MDNode *N)
 
template<class T , class InfoT >
static TuniquifyImpl (T *N, DenseSet< T *, InfoT > &Store)
 
static MDNodegetOrSelfReference (LLVMContext &Context, ArrayRef< Metadata * > Ops)
 Get a node or a self-reference that looks like it. More...
 
static bool isContiguous (const ConstantRange &A, const ConstantRange &B)
 
static bool canBeMerged (const ConstantRange &A, const ConstantRange &B)
 
static bool tryMergeRange (SmallVectorImpl< ConstantInt * > &EndPoints, ConstantInt *Low, ConstantInt *High)
 
static void addRange (SmallVectorImpl< ConstantInt * > &EndPoints, ConstantInt *Low, ConstantInt *High)
 
static SmallVector< TrackingMDRef, 4 > & getNMDOps (void *Operands)
 

Macro Definition Documentation

◆ HANDLE_MDNODE_LEAF [1/4]

#define HANDLE_MDNODE_LEAF (   CLASS)
Value:
static_assert( \
alignof(uint64_t) >= alignof(CLASS), \
"Alignment is insufficient after objects prepended to " #CLASS);

Definition at line 488 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF [2/4]

#define HANDLE_MDNODE_LEAF (   CLASS)
Value:
case CLASS##Kind: \
return cast<CLASS>(this)->cloneImpl();

Definition at line 488 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF [3/4]

#define HANDLE_MDNODE_LEAF (   CLASS)
Value:
case CLASS##Kind: \
delete cast<CLASS>(this); \
break;

Definition at line 488 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF [4/4]

#define HANDLE_MDNODE_LEAF (   CLASS)
Value:
case CLASS##Kind: { \
std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \
break; \
}

Definition at line 488 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF_UNIQUABLE [1/3]

#define HANDLE_MDNODE_LEAF_UNIQUABLE (   CLASS)
Value:
case CLASS##Kind: \
break;

◆ HANDLE_MDNODE_LEAF_UNIQUABLE [2/3]

#define HANDLE_MDNODE_LEAF_UNIQUABLE (   CLASS)
Value:
case CLASS##Kind: { \
CLASS *SubclassThis = cast<CLASS>(this); \
std::integral_constant<bool, HasCachedHash<CLASS>::value> \
ShouldRecalculateHash; \
dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \
return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
}

◆ HANDLE_MDNODE_LEAF_UNIQUABLE [3/3]

#define HANDLE_MDNODE_LEAF_UNIQUABLE (   CLASS)
Value:
case CLASS##Kind: \
getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
break;

◆ HANDLE_METADATA_LEAF

#define HANDLE_METADATA_LEAF (   CLASS)
Value:
case Metadata::CLASS##Kind: \
cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
continue;

Function Documentation

◆ addRange()

static void addRange ( SmallVectorImpl< ConstantInt * > &  EndPoints,
ConstantInt Low,
ConstantInt High 
)
static

Definition at line 1005 of file Metadata.cpp.

References High, and tryMergeRange().

Referenced by llvm::MDNode::getMostGenericRange().

◆ canBeMerged()

static bool canBeMerged ( const ConstantRange A,
const ConstantRange B 
)
static

Definition at line 982 of file Metadata.cpp.

References B, and isContiguous().

Referenced by tryMergeRange().

◆ canonicalizeMetadataForValue()

static Metadata* canonicalizeMetadataForValue ( LLVMContext Context,
Metadata MD 
)
static

Canonicalize metadata arguments to intrinsics.

To support bitcode upgrades (and assembly semantic sugar) for MetadataAsValue, we need to canonicalize certain metadata.

  • nullptr is replaced by an empty MDNode.
  • An MDNode with a single null operand is replaced by an empty MDNode.
  • An MDNode whose only operand is a ConstantAsMetadata gets skipped.

This maintains readability of bitcode from when metadata was a type of value, and these bridges were unnecessary.

Definition at line 84 of file Metadata.cpp.

References Context, llvm::MDNode::get(), N, and llvm::None.

Referenced by llvm::MetadataAsValue::get(), and llvm::MetadataAsValue::getIfExists().

◆ getLocalFunctionMetadata()

static DISubprogram* getLocalFunctionMetadata ( Value V)
static

Definition at line 345 of file Metadata.cpp.

References assert(), BB, and getParent().

Referenced by llvm::ValueAsMetadata::handleRAUW().

◆ getNMDOps()

static SmallVector<TrackingMDRef, 4>& getNMDOps ( void *  Operands)
static

◆ getOrSelfReference()

static MDNode* getOrSelfReference ( LLVMContext Context,
ArrayRef< Metadata * >  Ops 
)
static

Get a node or a self-reference that looks like it.

Special handling for finding self-references, for use by MDNode::concatenate() and MDNode::intersect() to maintain behaviour from when self-referencing nodes were still uniqued. If the first operand has the same operands as Ops, return the first operand instead.

Definition at line 894 of file Metadata.cpp.

References Context, E, llvm::ArrayRef< T >::empty(), llvm::MDNode::get(), I, N, and llvm::ArrayRef< T >::size().

Referenced by llvm::MDNode::concatenate(), llvm::MDNode::getMostGenericAliasScope(), and llvm::MDNode::intersect().

◆ hasSelfReference()

static bool hasSelfReference ( MDNode N)
static

Definition at line 656 of file Metadata.cpp.

References llvm::is_contained(), and N.

◆ isContiguous()

static bool isContiguous ( const ConstantRange A,
const ConstantRange B 
)
static

Definition at line 978 of file Metadata.cpp.

References B.

Referenced by canBeMerged().

◆ isOperandUnresolved()

static bool isOperandUnresolved ( Metadata Op)
static

Definition at line 548 of file Metadata.cpp.

References N.

◆ tryMergeRange()

static bool tryMergeRange ( SmallVectorImpl< ConstantInt * > &  EndPoints,
ConstantInt Low,
ConstantInt High 
)
static

◆ uniquifyImpl()

template<class T , class InfoT >
static T* uniquifyImpl ( T N,
DenseSet< T *, InfoT > &  Store 
)
static

Definition at line 774 of file Metadata.cpp.

References llvm::getUniqued(), N, llvm::SPII::Store, and T.

llvm::EngineKind::Kind
Kind
Definition: ExecutionEngine.h:524
s
multiplies can be turned into SHL s
Definition: README.txt:370
uniquifyImpl
static T * uniquifyImpl(T *N, DenseSet< T *, InfoT > &Store)
Definition: Metadata.cpp:774