OpenVDB: SRetFunction< SignatureT, DerivedFunction > Struct Template Reference

OpenVDB 12.1.1

Loading...
Searching...
No Matches
SRetFunction< SignatureT, DerivedFunction > Struct Template Reference

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>`

Inheritance diagram for SRetFunction< SignatureT, DerivedFunction >:

## Public Types
using | Ptr = std::shared_ptr<SRetFunction<SignatureT, DerivedFunction>>
using | Traits = FunctionTraits<SignatureT>

## Public Member Functions
ArgInfo | types (ArgInfoVector &args, llvm::LLVMContext &C) const override
| Overide the ArgInfo type method. This does NOT change the arg order, it simply marks the first argument as a return argument. Note that the void ret type is also left as a return type.
Function::SignatureMatch | match (const ArgInfoVector &args, llvm::LLVMContext &C) const override
| Override of match which inserts the SRET type such that the base class methods ignore it.
llvm::Value * | call (const std::vector< llvm::Value * > &args, llvm::IRBuilder<> &B) const override
| Override of call which allocates the required SRET llvm::Value for this function.
Value | call (const Arguments &args, llvm::IRBuilder<> &B) const override
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.
Function::SignatureMatch | match (const std::vector< llvm::Type * > &args, llvm::LLVMContext &C) const override
llvm::Value * | call (const std::vector< llvm::Value * > &args, llvm::IRBuilder<> &B, const bool cast) const override
virtual llvm::Type * | types (std::vector< llvm::Type * > &, llvm::LLVMContext &) const=0

## Protected Member Functions
template<typename ... Args>
| SRetFunction (Args &&... ts)
| Forward all arguments to the derived class.

## Detailed Description

template<typename SignatureT, typename DerivedFunction>
struct openvdb::v12_1::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.

## Member Typedef Documentation

## ◆ Ptr

template<typename SignatureT, typename DerivedFunction>

using Ptr = std::shared_ptr<SRetFunction<SignatureT, DerivedFunction>>

## ◆ Traits

template<typename SignatureT, typename DerivedFunction>

using Traits = FunctionTraits<SignatureT>

## Constructor & Destructor Documentation

## ◆ SRetFunction()

template<typename SignatureT, typename DerivedFunction>
template<typename ... Args>

SRetFunction | ( | Args &&... | ts | ) |
| inlineprotected

Forward all arguments to the derived class.

## Member Function Documentation

## ◆ call() [1/3]

template<typename SignatureT, typename DerivedFunction>

Value call | ( | const Arguments & | args,
|  | llvm::IRBuilder<> & | B ) const
| inlineoverride

## ◆ call() [2/3]

template<typename SignatureT, typename DerivedFunction>

llvm::Value * call | ( | const std::vector< llvm::Value * > & | args,
|  | llvm::IRBuilder<> & | B ) 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

## ◆ call() [3/3]

template<typename SignatureT, typename DerivedFunction>

llvm::Value * call | ( | const std::vector< llvm::Value * > & | args,
|  | llvm::IRBuilder<> & | B,
|  | const bool | cast ) const
| inlineoverride

Note
  This is deprecated! Omitting the warning as it invokes the parent function which is also deprecated. Use NativeArguments to perform argument casting

## ◆ match() [1/2]

template<typename SignatureT, typename DerivedFunction>

Function::SignatureMatch match | ( | const ArgInfoVector & | args,
|  | llvm::LLVMContext & | C ) const
| inlineoverride

Override of match which inserts the SRET type such that the base class methods ignore it.

## ◆ match() [2/2]

template<typename SignatureT, typename DerivedFunction>

Function::SignatureMatch match | ( | const std::vector< llvm::Type * > & | args,
|  | llvm::LLVMContext & | C ) const
| inlineoverride

Note
  This is deprecated! Omitting the warning as it invokes the parent function which is also deprecated. Use NativeArguments to perform argument casting

## ◆ print()

template<typename SignatureT, typename DerivedFunction>

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.

## ◆ types() [1/2]

template<typename SignatureT, typename DerivedFunction>

ArgInfo types | ( | ArgInfoVector & | args,
|  | llvm::LLVMContext & | C ) const
| inlineoverride

Overide the ArgInfo type method. This does NOT change the arg order, it simply marks the first argument as a return argument. Note that the void ret type is also left as a return type.

## ◆ types() [2/2]

template<typename SignatureT, typename DerivedFunction>

virtual llvm::Type * types | ( | std::vector< llvm::Type * > & | ,
|  | llvm::LLVMContext & | ) const

Note
  Bring in deprecated type methods