LLVM 18.0.0git
Classes | Macros | Functions
Metadata.cpp File Reference
#include "llvm/IR/Metadata.h"
#include "LLVMContextImpl.h"
#include "MetadataImpl.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseSet.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/ProfDataUtils.h"
#include "llvm/IR/TrackingMDRef.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.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 <type_traits>
#include <utility>
#include <vector>
#include "llvm/IR/Metadata.def"

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.
 
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.
 
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 520 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 520 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 520 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 520 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); \
}
static T * uniquifyImpl(T *N, DenseSet< T *, InfoT > &Store)
Definition: Metadata.cpp:872

◆ 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

◆ canBeMerged()

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

Definition at line 1145 of file Metadata.cpp.

References A, 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 80 of file Metadata.cpp.

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

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

◆ getLocalFunctionMetadata()

static DISubprogram * getLocalFunctionMetadata ( Value V)
static

Definition at line 377 of file Metadata.cpp.

References A, assert(), 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 993 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 754 of file Metadata.cpp.

References llvm::is_contained(), and N.

◆ isContiguous()

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

Definition at line 1141 of file Metadata.cpp.

References A, and B.

Referenced by canBeMerged().

◆ isOperandUnresolved()

static bool isOperandUnresolved ( Metadata Op)
static

Definition at line 645 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 872 of file Metadata.cpp.

References llvm::getUniqued(), and N.