Templated interface class for SRET functions. This struct provides the interface for functions that wish to return arrays (vectors or matrices) by internally remapping the first argument for the user. As far as LLVM and any bindings are concerned, the function signature remains unchanged - however the first argument becomes "invisible" to the user and is instead allocated by LLVM before the function is executed. Importantly, the argument has no impact on the user facing AX signature and doesn't affect declaration selection.
More...
#include <openvdb_ax/codegen/FunctionTypes.h>
Inherits DerivedFunction.
|
Function::SignatureMatch | match (const std::vector< llvm::Type * > &args, llvm::LLVMContext &C) const override |
| Override of match which inserts the SRET type such that the base class methods ignore it. More...
|
|
llvm::Value * | call (const std::vector< llvm::Value * > &args, llvm::IRBuilder<> &B, const bool cast) const override |
| Override of call which allocates the required SRET llvm::Value for this function. More...
|
|
void | print (llvm::LLVMContext &C, std::ostream &os, const char *name=nullptr, const bool axTypes=true) const override |
| Override of print to avoid printing out the SRET type. More...
|
|
|
template<typename... Args> |
| SRetFunction (Args &&...ts) |
| Forward all arguments to the derived class. More...
|
|
template<typename SignatureT, typename DerivedFunction>
struct openvdb::v9_0::ax::codegen::SRetFunction< SignatureT, DerivedFunction >
Templated interface class for SRET functions. This struct provides the interface for functions that wish to return arrays (vectors or matrices) by internally remapping the first argument for the user. As far as LLVM and any bindings are concerned, the function signature remains unchanged - however the first argument becomes "invisible" to the user and is instead allocated by LLVM before the function is executed. Importantly, the argument has no impact on the user facing AX signature and doesn't affect declaration selection.
- Note
- This class is not intended to be instantiated directly, but instead used by derived implementation which hold a valid implementations of member functions required to create a llvm::Function (such as Function::types and Function::call). This exists as an interface to avoid virtual inheritance.
Forward all arguments to the derived class.
llvm::Value* call |
( |
const std::vector< llvm::Value * > & |
args, |
|
|
llvm::IRBuilder<> & |
B, |
|
|
const bool |
cast |
|
) |
| const |
|
inlineoverride |
Override of call which allocates the required SRET llvm::Value for this function.
- Note
- Unlike other function where the returned llvm::Value* is a llvm::CallInst (which also represents the return value), SRET functions return the allocated 1st argument i.e. not a llvm::CallInst
Override of match which inserts the SRET type such that the base class methods ignore it.
void print |
( |
llvm::LLVMContext & |
C, |
|
|
std::ostream & |
os, |
|
|
const char * |
name = nullptr , |
|
|
const bool |
axTypes = true |
|
) |
| const |
|
inlineoverride |
Override of print to avoid printing out the SRET type.