LLVM  6.0.0svn
Classes | Macros | Functions
Metadata.cpp File Reference
#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/Metadata.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 FunctiongetLocalFunction (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 467 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF [2/4]

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

Definition at line 467 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF [3/4]

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

Definition at line 467 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; \
}
const unsigned Kind

Definition at line 467 of file Metadata.cpp.

◆ HANDLE_MDNODE_LEAF_UNIQUABLE [1/3]

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

◆ 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:754
const unsigned Kind

◆ 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;
const unsigned Kind

◆ HANDLE_METADATA_LEAF

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

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

◆ 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 C, llvm::dyn_cast(), llvm::MDNode::get(), N, and llvm::None.

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

◆ getLocalFunction()

static Function* getLocalFunction ( Value V)
static

Definition at line 332 of file Metadata.cpp.

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

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

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

◆ hasSelfReference()

static bool hasSelfReference ( MDNode N)
static

◆ isContiguous()

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

Definition at line 933 of file Metadata.cpp.

References llvm::ConstantRange::getLower(), and llvm::ConstantRange::getUpper().

Referenced by canBeMerged().

◆ isOperandUnresolved()

static bool isOperandUnresolved ( Metadata Op)
static

◆ 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