LLVM 20.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/DebugProgramInstruction.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 627 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 627 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 627 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 627 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:979

◆ 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 1251 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 81 of file Metadata.cpp.

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

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

◆ getLocalFunctionMetadata()

static DISubprogram * getLocalFunctionMetadata ( Value V)
static

Definition at line 484 of file Metadata.cpp.

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

◆ 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 1100 of file Metadata.cpp.

References 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 861 of file Metadata.cpp.

References llvm::is_contained(), and N.

◆ isContiguous()

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

Definition at line 1247 of file Metadata.cpp.

References A, and B.

Referenced by canBeMerged().

◆ isOperandUnresolved()

static bool isOperandUnresolved ( Metadata Op)
static

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

References llvm::getUniqued(), and N.