13#ifndef LLVM_CLANG_AST_INTERP_TYPE_H
14#define LLVM_CLANG_AST_INTERP_TYPE_H
16#include "llvm/Support/raw_ostream.h"
31template <
bool Signed>
class Char;
32template <
unsigned Bits,
bool Signed>
class Integral;
76 static constexpr uint8_t None = 0xFF;
84 explicit constexpr operator bool()
const {
return V != None; }
86 assert(
operator bool());
99 return V ==
static_cast<unsigned>(PT);
105static_assert(
sizeof(OptPrimType) ==
sizeof(PrimType));
120 OS <<
"reinterpret_cast";
123 OS <<
"reinterpret_like";
136 return std::is_same_v<T, IntegralAP<false>> ||
137 std::is_same_v<T, IntegralAP<true>> || std::is_same_v<T, Floating> ||
138 std::is_same_v<T, MemberPointer>;
145 return std::is_same_v<T, Integral<16, false>> ||
146 std::is_same_v<T, Integral<16, true>> ||
147 std::is_same_v<T, Integral<32, false>> ||
148 std::is_same_v<T, Integral<32, true>> ||
149 std::is_same_v<T, Integral<64, false>> ||
150 std::is_same_v<T, Integral<64, true>>;
154 return std::is_same_v<T, Char<false>> || std::is_same_v<T, Char<true>> ||
155 std::is_same_v<T, Integral<16, false>> ||
156 std::is_same_v<T, Integral<16, true>> ||
157 std::is_same_v<T, Integral<32, false>> ||
158 std::is_same_v<T, Integral<32, true>> ||
159 std::is_same_v<T, Integral<64, false>> ||
160 std::is_same_v<T, Integral<64, true>>;
218constexpr size_t align(
size_t Size) {
219 return ((Size +
alignof(
void *) - 1) /
alignof(
void *)) *
alignof(
void *);
223static_assert(
aligned(
sizeof(
void *)));
234#define TYPE_SWITCH_CASE(Name, B) \
236 using T = PrimConv<Name>::T; \
240#define TYPE_SWITCH(Expr, B) \
243 TYPE_SWITCH_CASE(PT_Sint8, B) \
244 TYPE_SWITCH_CASE(PT_Uint8, B) \
245 TYPE_SWITCH_CASE(PT_Sint16, B) \
246 TYPE_SWITCH_CASE(PT_Uint16, B) \
247 TYPE_SWITCH_CASE(PT_Sint32, B) \
248 TYPE_SWITCH_CASE(PT_Uint32, B) \
249 TYPE_SWITCH_CASE(PT_Sint64, B) \
250 TYPE_SWITCH_CASE(PT_Uint64, B) \
251 TYPE_SWITCH_CASE(PT_IntAP, B) \
252 TYPE_SWITCH_CASE(PT_IntAPS, B) \
253 TYPE_SWITCH_CASE(PT_Float, B) \
254 TYPE_SWITCH_CASE(PT_Bool, B) \
255 TYPE_SWITCH_CASE(PT_Ptr, B) \
256 TYPE_SWITCH_CASE(PT_MemberPtr, B) \
257 TYPE_SWITCH_CASE(PT_FixedPoint, B) \
258 TYPE_SWITCH_CASE(PT_Reflect, B) \
262#define INT_TYPE_SWITCH(Expr, B) \
265 TYPE_SWITCH_CASE(PT_Sint8, B) \
266 TYPE_SWITCH_CASE(PT_Uint8, B) \
267 TYPE_SWITCH_CASE(PT_Sint16, B) \
268 TYPE_SWITCH_CASE(PT_Uint16, B) \
269 TYPE_SWITCH_CASE(PT_Sint32, B) \
270 TYPE_SWITCH_CASE(PT_Uint32, B) \
271 TYPE_SWITCH_CASE(PT_Sint64, B) \
272 TYPE_SWITCH_CASE(PT_Uint64, B) \
273 TYPE_SWITCH_CASE(PT_IntAP, B) \
274 TYPE_SWITCH_CASE(PT_IntAPS, B) \
275 TYPE_SWITCH_CASE(PT_Bool, B) \
277 llvm_unreachable("Not an integer value"); \
281#define FIXED_SIZE_INT_TYPE_SWITCH(Expr, B) \
284 TYPE_SWITCH_CASE(PT_Sint8, B) \
285 TYPE_SWITCH_CASE(PT_Uint8, B) \
286 TYPE_SWITCH_CASE(PT_Sint16, B) \
287 TYPE_SWITCH_CASE(PT_Uint16, B) \
288 TYPE_SWITCH_CASE(PT_Sint32, B) \
289 TYPE_SWITCH_CASE(PT_Uint32, B) \
290 TYPE_SWITCH_CASE(PT_Sint64, B) \
291 TYPE_SWITCH_CASE(PT_Uint64, B) \
293 llvm_unreachable("Not an integer value"); \
297#define INT_TYPE_SWITCH_NO_BOOL(Expr, B) \
300 TYPE_SWITCH_CASE(PT_Sint8, B) \
301 TYPE_SWITCH_CASE(PT_Uint8, B) \
302 TYPE_SWITCH_CASE(PT_Sint16, B) \
303 TYPE_SWITCH_CASE(PT_Uint16, B) \
304 TYPE_SWITCH_CASE(PT_Sint32, B) \
305 TYPE_SWITCH_CASE(PT_Uint32, B) \
306 TYPE_SWITCH_CASE(PT_Sint64, B) \
307 TYPE_SWITCH_CASE(PT_Uint64, B) \
308 TYPE_SWITCH_CASE(PT_IntAP, B) \
309 TYPE_SWITCH_CASE(PT_IntAPS, B) \
311 llvm_unreachable("Not an integer value"); \
315#define TYPE_SWITCH_ALLOC(Expr, B) \
318 TYPE_SWITCH_CASE(PT_Float, B) \
319 TYPE_SWITCH_CASE(PT_IntAP, B) \
320 TYPE_SWITCH_CASE(PT_IntAPS, B) \
321 TYPE_SWITCH_CASE(PT_MemberPtr, B) \
The base class of the type hierarchy.
Wrapper around boolean types.
Wrapper around fixed point types.
If a Floating is constructed from Memory, it DOES NOT OWN THAT MEMORY.
If an IntegralAP is constructed from Memory, it DOES NOT OWN THAT MEMORY.
Wrapper around numeric types.
OptPrimType(std::nullopt_t)
bool operator!=(PrimType PT) const
PrimType operator*() const
bool operator==(OptPrimType OPT) const
bool operator!=(OptPrimType OPT) const
PrimType value_or(PrimType PT) const
bool operator==(PrimType PT) const
A pointer to a memory block, live or dead.
constexpr bool isSignedType(PrimType T)
constexpr bool aligned(uintptr_t Value)
constexpr bool isIntegralOrPointer()
constexpr bool isPtrType(PrimType T)
constexpr size_t align(size_t Size)
Aligns a size to the pointer alignment.
constexpr bool isIntegerOrBoolType(PrimType T)
constexpr bool isFixedSizeIntegralType()
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const Boolean &B)
PrimType
Enumeration of the primitive types of the VM.
constexpr bool needsAlloc()
size_t primSize(PrimType Type)
Returns the size of a primitive type in bytes.
constexpr bool isIntegerType(PrimType T)
Top level wrappers for InstallAPI frontend operations.
const FunctionProtoType * T
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 uint8_t
Mapping from primitive types to their representation.