11#ifndef OPENVDB_AX_CODEGEN_TYPES_HAS_BEEN_INCLUDED
12#define OPENVDB_AX_CODEGEN_TYPES_HAS_BEEN_INCLUDED
18#include <openvdb/version.h>
24#include <llvm/IR/Constants.h>
25#include <llvm/IR/IRBuilder.h>
26#include <llvm/IR/LLVMContext.h>
37template <
size_t Bits>
struct int_t;
38template <>
struct int_t<8> {
using type = int8_t; };
39template <>
struct int_t<16> {
using type = int16_t; };
40template <>
struct int_t<32> {
using type = int32_t; };
41template <>
struct int_t<64> {
using type = int64_t; };
57 "Reference types/arguments are not supported for automatic "
58 "LLVM Type conversion. Use pointers instead.");
60 "Object types/arguments are not supported for automatic "
61 "LLVM Type conversion.");
65 static inline llvm::Type*
66 get(llvm::LLVMContext& C)
71 return llvm::Type::getInt1Ty(C);
74#if LLVM_VERSION_MAJOR > 6
75 return llvm::Type::getScalarTy<T>(C);
77 int bits =
sizeof(T) * CHAR_BIT;
79 return llvm::Type::getIntNTy(C, bits);
83 case 32:
return llvm::Type::getFloatTy(C);
84 case 64:
return llvm::Type::getDoubleTy(C);
88 std::string(typeNameAsString<T>()) +
"\".");
97 static inline llvm::Constant*
98 get(llvm::LLVMContext& C,
const T V)
101 llvm::Constant* constant =
nullptr;
104 assert(llvm::ConstantFP::isValueValidForType(type,
105 llvm::APFloat(
static_cast<typename std::conditional
107 constant = llvm::ConstantFP::get(type,
static_cast<double>(V));
111 assert((isSigned && llvm::ConstantInt::isValueValidForType(type,
static_cast<int64_t
>(V))) ||
112 (!isSigned && llvm::ConstantInt::isValueValidForType(type,
static_cast<uint64_t
>(V))));
113 constant = llvm::ConstantInt::get(type,
static_cast<uint64_t
>(V), isSigned);
124 static inline llvm::Constant*
125 get(llvm::LLVMContext& C,
const T*
const V)
128 reinterpret_cast<uintptr_t
>(V));
132template <
typename T,
size_t S>
135 static_assert(S != 0,
136 "Zero size array types are not supported for automatic LLVM "
139 static inline llvm::Type*
140 get(llvm::LLVMContext& C) {
143 static inline llvm::Constant*
144 get(llvm::LLVMContext& C,
const T(&array)[S]) {
145 return llvm::ConstantDataArray::get(C, array);
147 static inline llvm::Constant*
148 get(llvm::LLVMContext& C,
const T(*array)[S])
151 reinterpret_cast<uintptr_t
>(array));
158 static inline llvm::PointerType*
159 get(llvm::LLVMContext& C) {
168 "This library requires std::uint8_t to be implemented as unsigned char.");
174 static inline llvm::StructType*
175 get(llvm::LLVMContext& C) {
176 const std::vector<llvm::Type*> types {
181 return llvm::StructType::get(C, types);
183 static inline llvm::Constant*
187 reinterpret_cast<uintptr_t
>(
string));
194 static inline llvm::Type*
195 get(llvm::LLVMContext& C) {
196 return llvm::Type::getVoidTy(C);
217template <
typename T1,
typename T2>
222 static_assert(
sizeof(T1) ==
sizeof(T2),
223 "T1 differs in size to T2 during alias mapping. Types should have "
224 "the same memory layout.");
226 "T1 in instantiation of an AliasTypeMap does not have a standard layout. "
227 "This will most likely cause undefined behaviour when attempting to map "
230 static inline llvm::Type*
231 get(llvm::LLVMContext& C) {
232 return LLVMTypeT::get(C);
234 static inline llvm::Constant*
236 return LLVMTypeT::get(C,
reinterpret_cast<const T2&
>(
value));
238 static inline llvm::Constant*
240 return LLVMTypeT::get(C,
reinterpret_cast<const T2* const
>(
value));
258template<
typename SignatureT>
261template<
typename R,
typename... Args>
264template<
typename R,
typename... Args>
270#if __cplusplus >= 201703L
271template<
typename R,
typename... Args>
274template<
typename R,
typename... Args>
275struct FunctionTraits<R(*)(Args...) noexcept> : public FunctionTraits<R(Args...)> {};
278template<
typename ReturnT,
typename ...Args>
283 static const size_t N_ARGS =
sizeof...(Args);
289 static_assert(I < N_ARGS,
290 "Invalid index specified for function argument access");
291 using Type =
typename std::tuple_element<I, std::tuple<Args...>>::type;
293 "Reference types/arguments are not supported for automatic "
294 "LLVM Type conversion. Use pointers instead.");
307inline llvm::Constant*
311 "T type for llvmConstant must be a floating point or integral type.");
313 if (type->isIntegerTy()) {
314 return llvm::ConstantInt::get(type,
static_cast<uint64_t
>(t),
true);
317 assert(type->isFloatingPointTy());
318 return llvm::ConstantFP::get(type,
static_cast<double>(t));
326llvm::IntegerType*
llvmIntType(
const uint32_t size, llvm::LLVMContext& C);
ValueT value
Definition: GridBuilder.h:1287
Provides the class definition for the equivalent IR representation and logic for strings in AX.
Various function and operator tokens used throughout the AST and code generation.
Definition: Exceptions.h:36
3x3 matrix class.
Definition: Mat3.h:29
4x4 -matrix class.
Definition: Mat4.h:24
CoreType
Definition: Tokens.h:32
llvm::IntegerType * llvmIntType(const uint32_t size, llvm::LLVMContext &C)
Returns an llvm IntegerType given a requested size and context.
llvm::Constant * llvmConstant(const T t, llvm::Type *type)
Returns an llvm Constant holding a scalar value.
Definition: Types.h:308
ast::tokens::CoreType tokenFromLLVMType(const llvm::Type *type)
Return a corresponding AX token which represents the given LLVM Type.
llvm::Type * llvmTypeFromToken(const ast::tokens::CoreType &type, llvm::LLVMContext &C)
Returns an llvm type representing a type defined by a string.
llvm::Type * llvmFloatType(const uint32_t size, llvm::LLVMContext &C)
Returns an llvm floating point Type given a requested size and context.
Definition: Exceptions.h:13
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:74
Alias mapping between two types, a frontend type T1 and a backend type T2. This class is the intended...
Definition: Types.h:219
static llvm::Constant * get(llvm::LLVMContext &C, const T1 *const value)
Definition: Types.h:239
static llvm::Constant * get(llvm::LLVMContext &C, const T1 &value)
Definition: Types.h:235
static llvm::Type * get(llvm::LLVMContext &C)
Definition: Types.h:231
typename std::tuple_element< I, std::tuple< Args... > >::type Type
Definition: Types.h:291
ReturnT ReturnType
Definition: Types.h:281
ReturnType(Args...) SignatureType
Definition: Types.h:282
Templated function traits which provides compile-time index access to the types of the function signa...
Definition: Types.h:259
static llvm::PointerType * get(llvm::LLVMContext &C)
Definition: Types.h:159
static llvm::Constant * get(llvm::LLVMContext &C, const T(&array)[S])
Definition: Types.h:144
static llvm::Constant * get(llvm::LLVMContext &C, const T(*array)[S])
Definition: Types.h:148
static llvm::Type * get(llvm::LLVMContext &C)
Definition: Types.h:140
static llvm::StructType * get(llvm::LLVMContext &C)
Definition: Types.h:175
static llvm::Constant * get(llvm::LLVMContext &C, const codegen::String *const string)
Definition: Types.h:184
static llvm::Type * get(llvm::LLVMContext &C)
Definition: Types.h:195
LLVM type mapping from pod types.
Definition: Types.h:55
static llvm::Constant * get(llvm::LLVMContext &C, const T V)
Return an LLVM constant Value which represents T value.
Definition: Types.h:98
static llvm::Constant * get(llvm::LLVMContext &C, const T *const V)
Return an LLVM constant which holds an uintptr_t, representing the current address of the given value...
Definition: Types.h:125
static llvm::Type * get(llvm::LLVMContext &C)
Return an LLVM type which represents T.
Definition: Types.h:66
An extremely basic but native representation of a string class with SSO support. This exists to provi...
Definition: String.h:34
int16_t type
Definition: Types.h:39
int32_t type
Definition: Types.h:40
int64_t type
Definition: Types.h:41
int8_t type
Definition: Types.h:38
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:116
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:202