11#ifndef OPENVDB_AX_COMPUTE_GENERATOR_HAS_BEEN_INCLUDED
12#define OPENVDB_AX_COMPUTE_GENERATOR_HAS_BEEN_INCLUDED
24#include <openvdb/version.h>
26#include <llvm/Analysis/TargetLibraryInfo.h>
27#include <llvm/IR/BasicBlock.h>
28#include <llvm/IR/Function.h>
29#include <llvm/IR/IRBuilder.h>
30#include <llvm/IR/LLVMContext.h>
31#include <llvm/IR/Module.h>
52 static const std::string
Name;
57 static const size_t N_ARGS = FunctionTraitsT::N_ARGS;
68namespace codegen_internal {
89 ComputeGenerator(llvm::Module& module,
94 virtual ~ComputeGenerator();
99 inline const SymbolTable<llvm::Value*>& globals()
const {
return mSymbolTables.globals(); }
103 using ast::Visitor<ComputeGenerator>::traverse;
104 using ast::Visitor<ComputeGenerator>::visit;
107 inline bool postOrderNodes()
const {
return true; }
112 bool traverse(
const ast::Block* block)
114 if (!block)
return true;
115 if (!this->visit(block))
return false;
123 bool traverse(
const ast::CommaOperator* comma)
125 if (!comma)
return true;
126 if (!this->visit(comma))
return false;
134 bool traverse(
const ast::ConditionalStatement* cond)
136 if (!cond)
return true;
137 if (!this->visit(cond))
return false;
144 bool traverse(
const ast::BinaryOperator* bin)
146 if (!bin)
return true;
147 if (!this->visit(bin))
return false;
154 bool traverse(
const ast::TernaryOperator* tern)
156 if (!tern)
return true;
157 if (!this->visit(tern))
return false;
165 bool traverse(
const ast::Loop* loop)
167 if (!loop)
return true;
168 if (!this->visit(loop))
return false;
176 bool traverse(
const ast::DeclareLocal* decl)
178 if (!decl)
return true;
179 if (!this->visit(decl))
return false;
185 virtual bool visit(
const ast::CommaOperator*);
186 virtual bool visit(
const ast::AssignExpression*);
187 virtual bool visit(
const ast::Crement*);
188 virtual bool visit(
const ast::FunctionCall*);
189 virtual bool visit(
const ast::Attribute*);
190 virtual bool visit(
const ast::Tree*);
191 virtual bool visit(
const ast::Block*);
192 virtual bool visit(
const ast::ConditionalStatement*);
193 virtual bool visit(
const ast::Loop*);
194 virtual bool visit(
const ast::Keyword*);
195 virtual bool visit(
const ast::UnaryOperator*);
196 virtual bool visit(
const ast::BinaryOperator*);
197 virtual bool visit(
const ast::TernaryOperator*);
198 virtual bool visit(
const ast::Cast*);
199 virtual bool visit(
const ast::DeclareLocal*);
200 virtual bool visit(
const ast::Local*);
201 virtual bool visit(
const ast::ExternalVariable*);
202 virtual bool visit(
const ast::ArrayUnpack*);
203 virtual bool visit(
const ast::ArrayPack*);
204 virtual bool visit(
const ast::Value<bool>*);
205 virtual bool visit(
const ast::Value<int16_t>*);
206 virtual bool visit(
const ast::Value<int32_t>*);
207 virtual bool visit(
const ast::Value<int64_t>*);
208 virtual bool visit(
const ast::Value<float>*);
209 virtual bool visit(
const ast::Value<double>*);
210 virtual bool visit(
const ast::Value<std::string>*);
212 template <
typename ValueType>
213 typename std::enable_if<std::is_integral<ValueType>::value,
bool>::type
214 visit(
const ast::Value<ValueType>* node);
215 template <
typename ValueType>
217 typename std::enable_if<std::is_floating_point<ValueType>::value,
bool>::type
218 visit(
const ast::Value<ValueType>* node);
222 const FunctionGroup* getFunction(
const std::string& identifier,
223 const bool allowInternal =
false);
230 void createFreeSymbolStrings(llvm::IRBuilder<>&);
232 llvm::Module& mModule;
233 llvm::LLVMContext& mContext;
234 llvm::IRBuilder<> mBuilder;
237 std::stack<Value> mValues;
240 std::stack<std::pair<llvm::BasicBlock*, llvm::BasicBlock*>> mBreakContinueStack;
246 SymbolTableBlocks mSymbolTables;
249 llvm::Function* mFunction;
251 const FunctionOptions mOptions;
256 FunctionRegistry& mFunctionRegistry;
Provides the definition for every abstract and concrete derived class which represent a particular ab...
OpenVDB AX Compiler Options.
Contains the global function registration definition which described all available user front end fun...
Contains frameworks for creating custom AX functions which can be registered within the FunctionRegis...
Logging system to collect errors and warnings throughout the different stages of parsing and compilat...
Contains the symbol table which holds mappings of variables names to llvm::Values.
Intermediate representation of supported AX values.
Contains the AX AST Node Visitor, providing default and customizable traversal and visitation methods...
Logger for collecting errors and warnings that occur during AX compilation.
Definition Logger.h:58
The function registry which is used for function code generation. Each time a function is visited wit...
Definition FunctionRegistry.h:42
Definition Exceptions.h:13
Options that control how functions behave.
Definition CompilerOptions.h:25
A Tree is the highest concrete (non-abstract) node in the entire AX AST hierarchy....
Definition AST.h:563
The Visitor class uses the Curiously Recursive Template Pattern (CRTP) to provide a customizable inte...
Definition Visitor.h:96
The function definition and signature which is built by the ComputeGenerator.
Definition ComputeGenerator.h:50
codegen::FunctionTraits< Signature > FunctionTraitsT
Definition ComputeGenerator.h:56
static std::string getDefaultName()
static const size_t N_ARGS
Definition ComputeGenerator.h:57
void(const void *const) Signature
The signature of the generated function.
Definition ComputeGenerator.h:55
static const std::string Name
The name of the generated function.
Definition ComputeGenerator.h:52
static const std::array< std::string, N_ARGS > & getArgumentKeys()
The argument key names available during code generation.
Templated function traits which provides compile-time index access to the types of the function signa...
Definition Types.h:311
A symbol table which can be used to represent a single scoped set of a programs variables....
Definition SymbolTable.h:38
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218