OpenVDB
12.0.0
|
Represents a concrete IR function. More...
#include <openvdb_ax/codegen/FunctionTypes.h>
Inherits IRFunctionBase.
Inherited by SRetFunction< SignatureT, IRFunction< SignatureT > >.
Public Types | |
using | Traits = FunctionTraits< SignatureT > |
using | Ptr = std::shared_ptr< IRFunction > |
using | GeneratorCb = std::function< llvm::Value *(const std::vector< llvm::Value * > &, llvm::IRBuilder<> &)> |
The IR callback function which will write the LLVM IR for this function's body. More... | |
enum | SignatureMatch { None = 0, Size, Implicit, Explicit } |
The result type from calls to Function::match. More... | |
Public Member Functions | |
IRFunction (const std::string &symbol, const GeneratorCb &gen) | |
llvm::Type * | types (std::vector< llvm::Type * > &types, llvm::LLVMContext &C) const override |
Populate a vector of llvm::Types which describe this function signature. This method is used by Function::create, Function::print and Function::match. 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::Value * | call (const std::vector< llvm::Value * > &args, llvm::IRBuilder<> &B, const bool cast) const override |
Override for call, which is only necessary if mEmbedIR is true, as the IR generation for embedded functions is delayed until the function is called. If mEmbedIR is false, this simply calls Function::call. 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... | |
virtual SignatureMatch | match (const std::vector< llvm::Type * > &inputs, llvm::LLVMContext &C) const |
The base implementation for determining how a vector of llvm arguments translates to this functions signature. Returns an enum which represents the available mapping. 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... | |
virtual void | print (llvm::LLVMContext &C, std::ostream &os, const char *name=nullptr, const bool axTypes=true) const |
Print this function's signature to the provided ostream. More... | |
bool | hasParamAttribute (const size_t i, const llvm::Attribute::AttrKind &kind) const |
Builder methods. More... | |
void | setArgumentNames (std::vector< const char * > names) |
const std::vector< const char * > & | dependencies () const |
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 GeneratorCb | mGen |
bool | mEmbedIR |
Represents a concrete IR function.
|
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.
using Ptr = std::shared_ptr<IRFunction> |
using Traits = FunctionTraits<SignatureT> |
|
inherited |
The result type from calls to Function::match.
Enumerator | |
---|---|
None | |
Size | |
Implicit | |
Explicit |
|
inline |
|
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.
idx | The index of the argument |
|
overridevirtualinherited |
Override for call, which is only necessary if mEmbedIR is true, as the IR generation for embedded functions is delayed until the function is called. If mEmbedIR is false, this simply calls Function::call.
Reimplemented from Function.
Reimplemented in SRetFunction< SignatureT, IRFunction< SignatureT > >.
|
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.
|
inlineinherited |
Convenience method which always uses the provided module to find the function or insert it if necessary.
M | The llvm::Module to use |
|
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.
Reimplemented from Function.
|
inlineinherited |
|
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.
M | The llvm::Module to use |
|
inlineinherited |
|
inlineinherited |
Builder methods.
|
virtualinherited |
The base implementation for determining how a vector of llvm arguments translates to this functions signature. Returns an enum which represents the available mapping.
This method calls types() to figure out the function signature, then compares each argument type to the type in the input vector. If the types match exactly, an Explicit match is found. If the sizes of the inputs and signature differ, no match is found and None is returned. If however, the sizes match and there exists a valid implicit cast from the input type to the signature type for every input, an Implicit match is returned. Finally, if the sizes match but there is no implicit cast mapping, Size is returned. i8 -> i32 : Implicit i32 -> i32 : Explicit str -> i32 : Size (i32,i32) -> i32 : None
inputs | The input types |
C | The LLVM Context |
Reimplemented in SRetFunction< SignatureT, CFunction< SignatureT > >, and SRetFunction< SignatureT, IRFunction< SignatureT > >.
|
virtualinherited |
Print this function's signature to the provided ostream.
This is intended to return a descriptive front end user string rather than the function's IR representation. This function is virtual so that derived classes can customize how they present frontend information.
C | The llvm context |
os | The ostream to print to |
name | The name to insert into the description. |
axTypes | Whether to print llvm IR or AX Types. |
Reimplemented in SRetFunction< SignatureT, CFunction< SignatureT > >, and SRetFunction< SignatureT, IRFunction< SignatureT > >.
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
Enable or disable the embedding of IR. Embedded IR is currently required for function which use parent function parameters.
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
The number of arguments that this function has.
|
inlineinherited |
The function symbol name.
This will be used as its identifier in IR and must be unique.
|
inlineoverridevirtual |
Populate a vector of llvm::Types which describe this function signature. This method is used by Function::create, Function::print and Function::match.
Implements Function.
|
inlineprotectedinherited |
|
protectedinherited |
|
protectedinherited |