OpenVDB  12.1.0
Public Types | Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
IRFunctionSRet< SignatureT > Struct Template Reference

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

#include <openvdb_ax/codegen/FunctionTypes.h>

Inherits SRetFunction< SignatureT, IRFunction< SignatureT > >.

Public Types

using BaseT = SRetFunction< SignatureT, IRFunction< SignatureT >>
 
using Ptr = std::shared_ptr< SRetFunction< SignatureT, IRFunction< SignatureT > >>
 
using Traits = FunctionTraits< SignatureT >
 
using GeneratorNativeCb = std::function< Value(const NativeArguments &, llvm::IRBuilder<> &)>
 The IR callback function which will write the LLVM IR for this function's body. More...
 
using GeneratorArgumentsCb = std::function< Value(const Arguments &, llvm::IRBuilder<> &)>
 
using GeneratorCb = std::function< llvm::Value *(const std::vector< llvm::Value * > &, llvm::IRBuilder<> &)>
 Legacy callback, will eventually be deprecated in favour of using the GeneratorArgumentsCb. More...
 
enum  SignatureMatch {
  None = 0, Size, Implicit, Ambiguous,
  Explicit
}
 The result type from calls to Function::match. More...
 

Public Member Functions

 IRFunctionSRet (const std::string &symbol, const IRFunctionBase::GeneratorCb &gen)
 
 IRFunctionSRet (const std::string &symbol, const IRFunctionBase::GeneratorNativeCb &gen)
 
 IRFunctionSRet (const std::string &symbol, const IRFunctionBase::GeneratorArgumentsCb &gen)
 
 ~IRFunctionSRet () 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. More...
 
llvm::Type * types (std::vector< llvm::Type * > &types, llvm::LLVMContext &C) const override
 
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. More...
 
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 override
 Override of call which allocates the required SRET llvm::Value for this function. More...
 
Value call (const Arguments &args, llvm::IRBuilder<> &B) const override
 
llvm::Value * call (const std::vector< llvm::Value * > &args, llvm::IRBuilder<> &B, const bool cast) 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. More...
 
void setEmbedIR (bool on)
 Enable or disable the embedding of IR. Embedded IR is currently required for function which use parent function parameters. More...
 
bool hasEmbedIR () const
 
llvm::Function * create (llvm::LLVMContext &C, llvm::Module *M) const override
 Override for the creation of an IR function. This ensures that the body and prototype of the function are generated if a Module is provided. More...
 
llvm::Function * create (llvm::Module &M) const
 Convenience method which always uses the provided module to find the function or insert it if necessary. More...
 
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. More...
 
size_t size () const
 The number of arguments that this function has. More...
 
const char * symbol () const
 The function symbol name. More...
 
const char * argName (const size_t idx) const
 Returns the descriptive name of the given argument index. More...
 
const SmallArgumentVector< const char * > & dependencies () const
 
bool hasParamAttribute (const size_t i, const llvm::Attribute::AttrKind &kind) const
 Deprecated builder methods, no longer public. More...
 
void setArgumentNames (std::vector< const char * > names)
 
void setDependencies (std::vector< const char * > deps)
 
void setFnAttributes (const std::vector< llvm::Attribute::AttrKind > &in)
 
void setRetAttributes (const std::vector< llvm::Attribute::AttrKind > &in)
 
void setParamAttributes (const size_t i, const std::vector< llvm::Attribute::AttrKind > &in)
 

Protected Member Functions

void verifyResultType (const llvm::Type *result, const llvm::Type *expected) const
 

Static Protected Member Functions

static void cast (std::vector< llvm::Value * > &args, const std::vector< llvm::Type * > &types, llvm::IRBuilder<> &B)
 Cast the provided arguments to the given type as supported by implicit casting of function types. If the types already match OR if a cast cannot be performed, nothing is done to the argument. More...
 

Protected Attributes

const GeneratorArgumentsCb mGen
 
bool mEmbedIR
 

Detailed Description

template<typename SignatureT>
struct openvdb::v12_1::ax::codegen::IRFunctionSRet< SignatureT >

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

Member Typedef Documentation

using BaseT = SRetFunction<SignatureT, IRFunction<SignatureT>>
using GeneratorArgumentsCb = std::function<Value (const Arguments&, llvm::IRBuilder<>&)>
inherited
using GeneratorCb = std::function<llvm::Value* (const std::vector<llvm::Value*>&, llvm::IRBuilder<>&)>
inherited

Legacy callback, will eventually be deprecated in favour of using the GeneratorArgumentsCb.

using GeneratorNativeCb = std::function<Value (const NativeArguments&, llvm::IRBuilder<>&)>
inherited

The IR callback function which will write the LLVM IR for this function's body.

The first argument is the vector of functional arguments. i.e. a representation of the value that the callback has been invoked with. The last argument is the IR builder which should be used to generate the function body IR.

Note
You can return a ret void instruction, an actual value or Value::Invalid() which will cause the function framework to insert a ret void if necessary.
using Ptr = std::shared_ptr<SRetFunction<SignatureT, IRFunction< SignatureT > >>
inherited
using Traits = FunctionTraits<SignatureT>
inherited

Member Enumeration Documentation

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

IRFunctionSRet ( const std::string &  symbol,
const IRFunctionBase::GeneratorCb gen 
)
inline
IRFunctionSRet ( const std::string &  symbol,
const IRFunctionBase::GeneratorNativeCb gen 
)
inline
IRFunctionSRet ( const std::string &  symbol,
const IRFunctionBase::GeneratorArgumentsCb gen 
)
inline
~IRFunctionSRet ( )
overridedefault

Member Function Documentation

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
Value call ( const NativeArguments args,
llvm::IRBuilder<> &  B 
) const
inlineinherited
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 IRFunctionBase.

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

Reimplemented from IRFunctionBase.

llvm::Value* call ( const std::vector< llvm::Value * > &  args,
llvm::IRBuilder<> &  B,
const bool  cast 
) const
inlineoverridevirtualinherited
Note
This is deprecated! Omitting the warning as it invokes the parent function which is also deprecated. Use NativeArguments to perform argument casting

Reimplemented from IRFunctionBase.

static void cast ( std::vector< llvm::Value * > &  args,
const std::vector< llvm::Type * > &  types,
llvm::IRBuilder<> &  B 
)
staticprotectedinherited

Cast the provided arguments to the given type as supported by implicit casting of function types. If the types already match OR if a cast cannot be performed, nothing is done to the argument.

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
llvm::Function* create ( llvm::LLVMContext &  C,
llvm::Module *  M 
) const
overridevirtualinherited

Override for the creation of an IR function. This ensures that the body and prototype of the function are generated if a Module is provided.

Note
A nullptr is returned if mEmbedIR is true and no action is performed.
Throws if this function has been initialized with a nullptr generator callback. In this case, the function prototype will be created, but not the function body.
Throws if the return type of the generator callback does not match the function prototype. In this case, both the prototype and the function body will be created and inserted, but the IR will be invalid.

Reimplemented from Function.

const SmallArgumentVector<const char*>& dependencies ( ) const
inlineinherited
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
bool hasEmbedIR ( ) const
inlineinherited
bool hasParamAttribute ( const size_t  i,
const llvm::Attribute::AttrKind &  kind 
) const
inlineinherited

Deprecated builder methods, no longer public.

Deprecated:
"This method incorrectly returns the attributes " "of the function set by the FunctionBuilder, not by the codegen. To " "inspect function attributes, retrieve the created function from the " "llvm::Module."
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.

Function::SignatureMatch match ( const std::vector< llvm::Type * > &  args,
llvm::LLVMContext &  C 
) const
inlineoverridevirtualinherited
Note
This is deprecated! Omitting the warning as it invokes the parent function which is also deprecated. Use NativeArguments to perform argument casting

Reimplemented from Function.

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.

void setArgumentNames ( std::vector< const char * >  names)
inlineinherited
Deprecated:
"Use the FunctionBuilder to construct Functions"
void setDependencies ( std::vector< const char * >  deps)
inlineinherited
Deprecated:
"Use the FunctionBuilder to construct Functions"
void setEmbedIR ( bool  on)
inlineinherited

Enable or disable the embedding of IR. Embedded IR is currently required for function which use parent function parameters.

void setFnAttributes ( const std::vector< llvm::Attribute::AttrKind > &  in)
inlineinherited
Deprecated:
"Use the FunctionBuilder to construct Functions"
void setParamAttributes ( const size_t  i,
const std::vector< llvm::Attribute::AttrKind > &  in 
)
inlineinherited
Deprecated:
"Use the FunctionBuilder to construct Functions"
void setRetAttributes ( const std::vector< llvm::Attribute::AttrKind > &  in)
inlineinherited
Deprecated:
"Use the FunctionBuilder to construct Functions"
size_t size ( ) const
inlineinherited

The number of arguments that this function has.

const char* symbol ( ) const
inlineinherited

The function symbol name.

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

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 IRFunction< SignatureT >.

llvm::Type* types ( std::vector< llvm::Type * > &  ,
llvm::LLVMContext &   
) const
inlineoverridevirtualinherited
Deprecated:
"Switch to AX's internal ArgInfo types for LLVM 16 onwards"

Implements Function.

void verifyResultType ( const llvm::Type *  result,
const llvm::Type *  expected 
) const
inlineprotectedinherited

Member Data Documentation

bool mEmbedIR
protectedinherited
const GeneratorArgumentsCb mGen
protectedinherited