LLVM 20.0.0git
|
Transitional API for extracting constants from Metadata. More...
Namespaces | |
namespace | detail |
Functions | |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > | hasa (Y &&MD) |
Check whether Metadata has a Value. | |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidReference< X, Y & >::value, bool > | hasa (Y &MD) |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > | extract (Y &&MD) |
Extract a Value from Metadata. | |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidReference< X, Y & >::value, X * > | extract (Y &MD) |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > | extract_or_null (Y &&MD) |
Extract a Value from Metadata, allowing null. | |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > | dyn_extract (Y &&MD) |
Extract a Value from Metadata, if any. | |
template<class X , class Y > | |
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > | dyn_extract_or_null (Y &&MD) |
Extract a Value from Metadata, if any, allowing null. | |
Transitional API for extracting constants from Metadata.
This namespace contains transitional functions for metadata that points to Constants.
In prehistory – when metadata was a subclass of Value – MDNode operands could refer to any Value. There's was a lot of code like this:
Now that Value and Metadata are in separate hierarchies, maintaining the semantics for isa(), cast(), dyn_cast() (etc.) requires three steps: cast in the Metadata hierarchy, extraction of the Value, and cast in the Value hierarchy. Besides creating boiler-plate, this requires subtle control flow changes.
The end-goal is to create a new type of metadata, called (e.g.) MDInt, so that metadata can refer to numbers without traversing a bridge to the Value hierarchy. In this final state, the code above would look like this:
The API in this namespace supports the transition. MDInt doesn't exist yet, and even once it does, changing each metadata schema to use it is its own mini-project. In the meantime this API prevents us from introducing complex and bug-prone control flow that will disappear in the end. In particular, the above code looks like this:
The full set of provided functions includes:
mdconst::hasa <=> isa mdconst::extract <=> cast mdconst::extract_or_null <=> cast_or_null mdconst::dyn_extract <=> dyn_cast mdconst::dyn_extract_or_null <=> dyn_cast_or_null
The target of the cast must be a subclass of Constant.
|
inline |
Extract a Value from Metadata, if any.
As an analogue to dyn_cast_or_null(), extract the Value subclass X
from MD
, return null if MD
doesn't contain a Value or if the Value it does contain is of the wrong subclass.
Definition at line 694 of file Metadata.h.
|
inline |
Extract a Value from Metadata, if any, allowing null.
As an analogue to dyn_cast_or_null(), extract the Value subclass X
from MD
, return null if MD
doesn't contain a Value or if the Value it does contain is of the wrong subclass, allowing MD
to be null.
Definition at line 707 of file Metadata.h.
|
inline |
Definition at line 671 of file Metadata.h.
References extract.
|
inline |
Extract a Value from Metadata, allowing null.
As an analogue to cast_or_null(), extract the Value subclass X
from MD
, allowing MD
to be null.
Definition at line 681 of file Metadata.h.