OpenVDB  7.2.0
ComputeGenerator.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 
10 
11 #ifndef OPENVDB_AX_COMPUTE_GENERATOR_HAS_BEEN_INCLUDED
12 #define OPENVDB_AX_COMPUTE_GENERATOR_HAS_BEEN_INCLUDED
13 
14 #include "FunctionRegistry.h"
15 #include "FunctionTypes.h"
16 #include "SymbolTable.h"
17 
18 #include "../ast/AST.h"
19 #include "../ast/Visitor.h"
20 #include "../compiler/CompilerOptions.h"
21 #include "../compiler/Logger.h"
22 
23 #include <openvdb/version.h>
24 
25 #include <llvm/Analysis/TargetLibraryInfo.h>
26 #include <llvm/IR/BasicBlock.h>
27 #include <llvm/IR/Function.h>
28 #include <llvm/IR/IRBuilder.h>
29 #include <llvm/IR/LLVMContext.h>
30 #include <llvm/IR/Module.h>
31 
32 #include <stack>
33 
34 namespace openvdb {
36 namespace OPENVDB_VERSION_NAME {
37 
38 namespace ax {
39 namespace codegen {
40 
49 {
51  static const std::string Name;
52 
54  using Signature = void(const void* const);
56  static const size_t N_ARGS = FunctionTraitsT::N_ARGS;
57 
59  static const std::array<std::string, N_ARGS>& getArgumentKeys();
60  static std::string getDefaultName();
61 };
62 
63 
66 
67 namespace codegen_internal {
68 
83 struct ComputeGenerator : public ast::Visitor<ComputeGenerator>
84 {
85  ComputeGenerator(llvm::Module& module,
86  const FunctionOptions& options,
87  FunctionRegistry& functionRegistry,
88  Logger& logger);
89 
90  virtual ~ComputeGenerator() = default;
91 
92  bool generate(const ast::Tree&);
93 
94  inline SymbolTable& globals() { return mSymbolTables.globals(); }
95  inline const SymbolTable& globals() const { return mSymbolTables.globals(); }
96 
97  // Visitor pattern
98 
101 
103  inline bool postOrderNodes() const { return true; }
104 
108  bool traverse(const ast::Block* block)
109  {
110  if (!block) return true;
111  if (!this->visit(block)) return false;
112  return true;
113  }
114 
119  bool traverse(const ast::CommaOperator* comma)
120  {
121  if (!comma) return true;
122  if (!this->visit(comma)) return false;
123  return true;
124  }
125 
126 
131  {
132  if (!cond) return true;
133  if (!this->visit(cond)) return false;
134  return true;
135  }
136 
140  bool traverse(const ast::BinaryOperator* bin)
141  {
142  if (!bin) return true;
143  if (!this->visit(bin)) return false;
144  return true;
145  }
146 
150  bool traverse(const ast::TernaryOperator* tern)
151  {
152  if (!tern) return true;
153  if (!this->visit(tern)) return false;
154  return true;
155  }
156 
161  bool traverse(const ast::Loop* loop)
162  {
163  if (!loop) return true;
164  if (!this->visit(loop)) return false;
165  return true;
166  }
167 
172  bool traverse(const ast::DeclareLocal* decl)
173  {
174  if (!decl) return true;
175  if (!this->visit(decl)) return false;
176  return true;
177  }
178 
179  virtual bool visit(const ast::CommaOperator*);
180  virtual bool visit(const ast::AssignExpression*);
181  virtual bool visit(const ast::Crement*);
182  virtual bool visit(const ast::FunctionCall*);
183  virtual bool visit(const ast::Attribute*);
184  virtual bool visit(const ast::Tree*);
185  virtual bool visit(const ast::Block*);
186  virtual bool visit(const ast::ConditionalStatement*);
187  virtual bool visit(const ast::Loop*);
188  virtual bool visit(const ast::Keyword*);
189  virtual bool visit(const ast::UnaryOperator*);
190  virtual bool visit(const ast::BinaryOperator*);
191  virtual bool visit(const ast::TernaryOperator*);
192  virtual bool visit(const ast::Cast*);
193  virtual bool visit(const ast::DeclareLocal*);
194  virtual bool visit(const ast::Local*);
195  virtual bool visit(const ast::ExternalVariable*);
196  virtual bool visit(const ast::ArrayUnpack*);
197  virtual bool visit(const ast::ArrayPack*);
198  virtual bool visit(const ast::Value<bool>*);
199  virtual bool visit(const ast::Value<int16_t>*);
200  virtual bool visit(const ast::Value<int32_t>*);
201  virtual bool visit(const ast::Value<int64_t>*);
202  virtual bool visit(const ast::Value<float>*);
203  virtual bool visit(const ast::Value<double>*);
204  virtual bool visit(const ast::Value<std::string>*);
205 
206  template <typename ValueType>
207  typename std::enable_if<std::is_integral<ValueType>::value, bool>::type
208  visit(const ast::Value<ValueType>* node);
209 
210  template <typename ValueType>
211  typename std::enable_if<std::is_floating_point<ValueType>::value, bool>::type
212  visit(const ast::Value<ValueType>* node);
213 
214 protected:
215 
216  const FunctionGroup* getFunction(const std::string& identifier,
217  const bool allowInternal = false);
218 
219  bool binaryExpression(llvm::Value*& result, llvm::Value* lhs, llvm::Value* rhs,
220  const ast::tokens::OperatorToken op, const ast::Node* node);
221  bool assignExpression(llvm::Value* lhs, llvm::Value*& rhs, const ast::Node* node);
222 
223  llvm::Module& mModule;
224  llvm::LLVMContext& mContext;
225  llvm::IRBuilder<> mBuilder;
226 
227  // The stack of accessed values
228  std::stack<llvm::Value*> mValues;
229 
230  // The stack of blocks for keyword branching
231  std::stack<std::pair<llvm::BasicBlock*, llvm::BasicBlock*>> mBreakContinueStack;
232 
233  // The current scope number used to track scoped declarations
234  size_t mScopeIndex;
235 
236  // The map of scope number to local variable names to values
238 
239  // The function used as the base code block
240  llvm::Function* mFunction;
241 
243 
245 
246 private:
247  FunctionRegistry& mFunctionRegistry;
248 };
249 
250 } // codegen_internal
251 
252 } // namespace codegen
253 } // namespace ax
254 } // namespace OPENVDB_VERSION_NAME
255 } // namespace openvdb
256 
257 #endif // OPENVDB_AX_COMPUTE_GENERATOR_HAS_BEEN_INCLUDED
258 
Options that control how functions behave.
Definition: CompilerOptions.h:24
ConditionalStatements represents all combinations of &#39;if&#39;, &#39;else&#39; and &#39;else if&#39; syntax and semantics...
Definition: AST.h:863
Templated function traits which provides compile-time index access to the types of the function signa...
Definition: ax/openvdb_ax/codegen/Types.h:279
A Tree is the highest concrete (non-abstract) node in the entire AX AST hierarchy. It represents an entire conversion of a valid AX string.
Definition: AST.h:561
Keywords represent keyword statements defining changes in execution. These include those that define ...
Definition: AST.h:1640
A BinaryOperator represents a single binary operation between a left hand side (LHS) and right hand s...
Definition: AST.h:987
size_t mScopeIndex
Definition: ComputeGenerator.h:234
std::stack< std::pair< llvm::BasicBlock *, llvm::BasicBlock * > > mBreakContinueStack
Definition: ComputeGenerator.h:231
A UnaryOperator represents a single unary operation on an expression. The operation type is stored as...
Definition: AST.h:1388
todo
Definition: FunctionTypes.h:778
bool traverse(const ast::Block *block)
Custom traversal of scoped blocks.
Definition: ComputeGenerator.h:108
bool traverse(const ast::ConditionalStatement *cond)
Custom traversal of conditional statements.
Definition: ComputeGenerator.h:130
llvm::LLVMContext & mContext
Definition: ComputeGenerator.h:224
Local AST nodes represent a single accesses to a local variable. The only store the name of the varia...
Definition: AST.h:2111
bool postOrderNodes() const
Code generation always runs post order.
Definition: ComputeGenerator.h:103
Contains frameworks for creating custom AX functions which can be registered within the FunctionRegis...
Cast nodes represent the conversion of an underlying expression to a target type. Cast nodes are typi...
Definition: AST.h:1463
bool traverse(const ast::TernaryOperator *tern)
Custom traversal of ternary operators.
Definition: ComputeGenerator.h:150
A Crement node represents a single increment &#39;++&#39; and decrement &#39;–&#39; operation. As well as it&#39;s creme...
Definition: AST.h:1293
Contains the global function registration definition which described all available user front end fun...
ArrayUnpack represent indexing operations into AX container types, primarily vectors and matrices ind...
Definition: AST.h:1685
const SymbolTable & globals() const
Definition: ComputeGenerator.h:95
ExternalVariable represent any access to external (custom) data, typically associated with the &#39;$&#39; sy...
Definition: AST.h:2001
llvm::IRBuilder mBuilder
Definition: ComputeGenerator.h:225
llvm::Function * mFunction
Definition: ComputeGenerator.h:240
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:94
The Visitor class uses the Curiously Recursive Template Pattern (CRTP) to provide a customizable inte...
Definition: Visitor.h:95
Logger & mLog
Definition: ComputeGenerator.h:244
Definition: openvdb/Exceptions.h:13
Attributes represent any access to a primitive value, typically associated with the &#39;@&#39; symbol syntax...
Definition: AST.h:1873
static const std::string Name
The name of the generated function.
Definition: ComputeGenerator.h:51
bool traverse(const ast::CommaOperator *comma)
Custom traversal of comma expression.
Definition: ComputeGenerator.h:119
Specialization of Values for strings.
Definition: AST.h:2334
The base abstract node which determines the interface and required methods for all derived concrete n...
Definition: AST.h:101
Loops represent for, while and do-while loop constructs. These all consist of a condition - evaluated...
Definition: AST.h:707
Contains the symbol table which holds mappings of variables names to llvm::Values.
Library and file format version numbers.
A map of unique ids to symbol tables which can be used to represent local variables within a program...
Definition: SymbolTable.h:111
llvm::Module & mModule
Definition: ComputeGenerator.h:223
The function registry which is used for function code generation. Each time a function is visited wit...
Definition: FunctionRegistry.h:36
bool traverse(const ast::DeclareLocal *decl)
Custom traversal of declarations.
Definition: ComputeGenerator.h:172
void(const void *const) Signature
The signature of the generated function.
Definition: ComputeGenerator.h:54
SymbolTableBlocks mSymbolTables
Definition: ComputeGenerator.h:237
ArrayPacks represent temporary container creations of arbitrary sizes, typically generated through th...
Definition: AST.h:1784
Visitor object which will generate llvm IR for a syntax tree. This provides the majority of the code ...
Definition: ComputeGenerator.h:83
A Value (literal) AST node holds either literal text or absolute value information on all numerical...
Definition: AST.h:2252
DeclareLocal AST nodes symbolize a single type declaration of a local variable. These store the local...
Definition: AST.h:2138
A symbol table which can be used to represent a single scoped set of a programs variables. This is simply an unordered map of strings to llvm::Values.
Definition: SymbolTable.h:34
const FunctionOptions mOptions
Definition: ComputeGenerator.h:242
std::stack< llvm::Value * > mValues
Definition: ComputeGenerator.h:228
AssignExpressions represents a similar object construction to a BinaryOperator. AssignExpressions can...
Definition: AST.h:1197
A Block node represents a scoped list of statements. It may comprise of 0 or more statements...
Definition: AST.h:475
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:146
FunctionCalls represent a single call to a function and any provided arguments. The argument list can...
Definition: AST.h:1540
A TernaryOperator represents a ternary (conditional) expression &#39;a ? b : c&#39; which evaluates to &#39;b&#39; if...
Definition: AST.h:1091
bool traverse(const ast::BinaryOperator *bin)
Custom traversal of binary operators.
Definition: ComputeGenerator.h:140
OperatorToken
Definition: Tokens.h:150
bool traverse(const ast::Loop *loop)
Custom traversal of loops.
Definition: ComputeGenerator.h:161
Logger for collecting errors and warnings that occur during AX compilation.
Definition: Logger.h:54
The function definition and signature which is built by the ComputeGenerator.
Definition: ComputeGenerator.h:48
SymbolTable & globals()
Definition: ComputeGenerator.h:94