OpenVDB 14.0.0
Loading...
Searching...
No Matches
CFunctionSRet< SignatureT > Struct Template Reference

Represents a concrete C function binding with the first argument as its return type. More...

#include <openvdb_ax/codegen/FunctionTypes.h>

Public Types

using BaseT = SRetFunction<SignatureT, CFunction<SignatureT>>
using Ptr
using Traits
using CFunctionT = CFunction<SignatureT>
enum  SignatureMatch {
  None = 0 , Size , Implicit , Ambiguous ,
  Explicit
}
 The result type from calls to Function::match. More...

Public Member Functions

 CFunctionSRet (const std::string &symbol, const SignatureT function)
 ~CFunctionSRet () override=default
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
Value call (const NativeArguments &args, llvm::IRBuilder<> &B) const
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.
uint64_t address () const override final
 Returns the global address of this function.
llvm::Constant * fold (const llvm::ArrayRef< llvm::Value * > &args, llvm::LLVMContext &C) const override final
void setConstantFold (bool on)
bool hasConstantFold () const
virtual llvm::Function * create (llvm::LLVMContext &C, llvm::Module *M=nullptr) const
 Converts and creates this AX function into a llvm Function.
llvm::Function * create (llvm::Module &M) const
 Convenience method which always uses the provided module to find the function or insert it if necessary.
llvm::Function * get (const llvm::Module &M) const
 Convenience method for calling M.getFunction(symbol). Returns a nullptr if the function has not yet been created or if it is embedded IR.
size_t size () const
 The number of arguments that this function has.
const char * symbol () const
 The function symbol name.
const char * argName (const size_t idx) const
 Returns the descriptive name of the given argument index.
const SmallArgumentVector< const char * > & dependencies () const

Detailed Description

template<typename SignatureT>
struct openvdb::v14_0::ax::codegen::CFunctionSRet< SignatureT >

Represents a concrete C function binding with the first argument as its return type.

Member Typedef Documentation

◆ BaseT

template<typename SignatureT>
using BaseT = SRetFunction<SignatureT, CFunction<SignatureT>>

◆ CFunctionT

template<typename SignatureT>
using CFunctionT = CFunction<SignatureT>
inherited

◆ Ptr

using Ptr
inherited

◆ Traits

using Traits
inherited

Member Enumeration Documentation

◆ SignatureMatch

enum SignatureMatch
inherited

The result type from calls to Function::match.

Note
Function::match cannot return Ambiguous - this is only returned by the FunctionGroup API.
Enumerator
None 
Size 
Implicit 
Ambiguous 
Explicit 

Constructor & Destructor Documentation

◆ CFunctionSRet()

template<typename SignatureT>
CFunctionSRet ( const std::string & symbol,
const SignatureT function )
inline

◆ ~CFunctionSRet()

template<typename SignatureT>
~CFunctionSRet ( )
overridedefault

Member Function Documentation

◆ address()

template<typename SignatureT>
uint64_t address ( ) const
inlinefinaloverridevirtualinherited

Returns the global address of this function.

Note
This is only required for C bindings.

Implements CFunctionBase.

◆ argName()

const char * argName ( const size_t idx) const
inlineinherited

Returns the descriptive name of the given argument index.

If the index is greater than the number of arguments, an empty string is returned.

Parameters
idxThe index of the argument

◆ call() [1/3]

Value call ( const NativeArguments & args,
llvm::IRBuilder<> & B ) const
inlineinherited

◆ call() [2/3]

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

Reimplemented from CFunction< SignatureT >.

◆ call() [3/3]

llvm::Value * call ( const std::vector< llvm::Value * > & args,
llvm::IRBuilder<> & B ) const
inlineoverridevirtualinherited

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

Reimplemented from CFunction< SignatureT >.

◆ create() [1/2]

virtual llvm::Function * create ( llvm::LLVMContext & C,
llvm::Module * M = nullptr ) const
virtualinherited

Converts and creates this AX function into a llvm Function.

This method uses the result from Function::types() to construct a llvm::FunctionType and a subsequent a llvm::Function. Any parameter, return or function attributes are also added to the function. If a module is provided, the module if first checked to see if the function already exists. If it does, it is immediately returned. If the function doesn't exist in the module, its prototype is created and also inserted into the end of the modules function list. If no module is provided, the function is left detached and must be added to a valid Module to be callable.

Warning
If a module is not provided, the caller takes ownership of the returned function and is responsible for deallocating it.
Note
The body of the function is left to derived classes to implement. As you need a Module to generate the prototype/body, this function serves two purposes. The first is to return the detached function signature if only a context is provided. The second is to ensure the function prototype and body (if required) is inserted into the module prior to returning.
It is possible to end up with function symbol collisions if you do not have unique function symbols in your module
Parameters
CThe LLVM Context
MThe Module to write the function to

Reimplemented in IRFunctionBase.

◆ create() [2/2]

llvm::Function * create ( llvm::Module & M) const
inlineinherited

Convenience method which always uses the provided module to find the function or insert it if necessary.

Parameters
MThe llvm::Module to use

◆ dependencies()

const SmallArgumentVector< const char * > & dependencies ( ) const
inlineinherited

◆ fold()

template<typename SignatureT>
llvm::Constant * fold ( const llvm::ArrayRef< llvm::Value * > & args,
llvm::LLVMContext & C ) const
inlinefinaloverridevirtualinherited

Reimplemented from CFunctionBase.

◆ get()

llvm::Function * get ( const llvm::Module & M) const
inherited

Convenience method for calling M.getFunction(symbol). Returns a nullptr if the function has not yet been created or if it is embedded IR.

Parameters
MThe llvm::Module to use

◆ hasConstantFold()

bool hasConstantFold ( ) const
inlineinherited

◆ match()

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

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

Reimplemented from Function.

◆ print()

void print ( llvm::LLVMContext & C,
std::ostream & os,
const char * name = nullptr,
const bool axTypes = true ) const
inlineoverridevirtualinherited

Override of print to avoid printing out the SRET type.

Reimplemented from Function.

◆ setConstantFold()

void setConstantFold ( bool on)
inlineinherited

◆ size()

size_t size ( ) const
inlineinherited

The number of arguments that this function has.

◆ symbol()

const char * symbol ( ) const
inlineinherited

The function symbol name.

This will be used as its identifier in IR and must be unique.

◆ types()

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

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.

Reimplemented from CFunction< SignatureT >.