Halide
12.0.1
Halide compiler and libraries
|
This class emits C++ code equivalent to a halide Stmt. More...
#include <CodeGen_C.h>
Inherits Halide::Internal::IRPrinter.
Classes | |
struct | Allocation |
Public Types | |
enum | OutputKind { CHeader , CPlusPlusHeader , CImplementation , CPlusPlusImplementation , CExternDecl , CPlusPlusExternDecl } |
Public Member Functions | |
CodeGen_C (std::ostream &dest, const Target &target, OutputKind output_kind=CImplementation, const std::string &include_guard="") | |
Initialize a C code generator pointing at a particular output stream (e.g. More... | |
~CodeGen_C () override | |
void | compile (const Module &module) |
Emit the declarations contained in the module as C code. More... | |
const Target & | get_target () const |
The target we're generating code for. More... | |
![]() | |
IRPrinter (std::ostream &) | |
Construct an IRPrinter pointed at a given output stream (e.g. More... | |
void | print (const Expr &) |
emit an expression on the output stream More... | |
void | print_no_parens (const Expr &) |
Emit an expression on the output stream without enclosing parens. More... | |
void | print (const Stmt &) |
emit a statement on the output stream More... | |
void | print_list (const std::vector< Expr > &exprs) |
emit a comma delimited list of exprs, without any leading or trailing punctuation. More... | |
![]() | |
IRVisitor ()=default | |
virtual | ~IRVisitor ()=default |
Static Public Member Functions | |
static void | test () |
![]() | |
static void | test () |
Protected Types | |
enum class | IntegerSuffixStyle { PlainC = 0 , OpenCL = 1 , HLSL = 2 } |
enum | AppendSpaceIfNeeded { DoNotAppendSpace , AppendSpace } |
Protected Member Functions | |
virtual void | compile (const LoweredFunc &func) |
Emit a declaration. More... | |
virtual void | compile (const Buffer<> &buffer) |
std::string | print_expr (const Expr &) |
Emit an expression as an assignment, then return the id of the resulting var. More... | |
std::string | print_cast_expr (const Type &, const Expr &) |
Like print_expr, but cast the Expr to the given Type. More... | |
void | print_stmt (const Stmt &) |
Emit a statement. More... | |
void | create_assertion (const std::string &id_cond, const Expr &message) |
void | create_assertion (const Expr &cond, const Expr &message) |
Expr | scalarize_vector_reduce (const VectorReduce *op) |
virtual std::string | print_type (Type, AppendSpaceIfNeeded space_option=DoNotAppendSpace) |
Emit the C name for a halide type. More... | |
virtual std::string | print_reinterpret (Type, const Expr &) |
Emit a statement to reinterpret an expression as another type. More... | |
virtual std::string | print_name (const std::string &) |
Emit a version of a string that is a valid identifier in C (. More... | |
virtual void | add_vector_typedefs (const std::set< Type > &vector_types) |
Add typedefs for vector types. More... | |
virtual std::string | print_extern_call (const Call *op) |
Bottleneck to allow customization of calls to generic Extern/PureExtern calls. More... | |
std::string | print_scalarized_expr (const Expr &e) |
Convert a vector Expr into a series of scalar Exprs, then reassemble into vector of original type. More... | |
virtual std::string | print_assignment (Type t, const std::string &rhs) |
Emit an SSA-style assignment, and set id to the freshly generated name. More... | |
void | print_heap_free (const std::string &alloc_name) |
Emit free for the heap allocation. More... | |
bool | is_header () |
Return true if only generating an interface, which may be extern "C" or C++. More... | |
bool | is_extern_decl () |
Return true if only generating an interface, which may be extern "C" or C++. More... | |
bool | is_header_or_extern_decl () |
Return true if only generating an interface, which may be extern "C" or C++. More... | |
bool | is_c_plus_plus_interface () |
Return true if generating C++ linkage. More... | |
void | open_scope () |
Open a new C scope (i.e. More... | |
void | close_scope (const std::string &comment) |
Close a C scope (i.e. More... | |
void | forward_declare_type_if_needed (const Type &t) |
If the Type is a handle type, emit a forward-declaration for it if we haven't already. More... | |
void | set_name_mangling_mode (NameMangling mode) |
void | visit (const Variable *) override |
void | visit (const IntImm *) override |
void | visit (const UIntImm *) override |
void | visit (const StringImm *) override |
void | visit (const FloatImm *) override |
void | visit (const Cast *) override |
void | visit (const Add *) override |
void | visit (const Sub *) override |
void | visit (const Mul *) override |
void | visit (const Div *) override |
void | visit (const Mod *) override |
void | visit (const Max *) override |
void | visit (const Min *) override |
void | visit (const EQ *) override |
void | visit (const NE *) override |
void | visit (const LT *) override |
void | visit (const LE *) override |
void | visit (const GT *) override |
void | visit (const GE *) override |
void | visit (const And *) override |
void | visit (const Or *) override |
void | visit (const Not *) override |
void | visit (const Call *) override |
void | visit (const Select *) override |
void | visit (const Load *) override |
void | visit (const Store *) override |
void | visit (const Let *) override |
void | visit (const LetStmt *) override |
void | visit (const AssertStmt *) override |
void | visit (const ProducerConsumer *) override |
void | visit (const For *) override |
void | visit (const Ramp *) override |
void | visit (const Broadcast *) override |
void | visit (const Provide *) override |
void | visit (const Allocate *) override |
void | visit (const Free *) override |
void | visit (const Realize *) override |
void | visit (const IfThenElse *) override |
void | visit (const Evaluate *) override |
void | visit (const Shuffle *) override |
void | visit (const Prefetch *) override |
void | visit (const Fork *) override |
void | visit (const Acquire *) override |
void | visit (const Atomic *) override |
void | visit (const VectorReduce *) override |
void | visit_binop (Type t, const Expr &a, const Expr &b, const char *op) |
void | visit_relop (Type t, const Expr &a, const Expr &b, const char *scalar_op, const char *vector_op) |
void | visit (const IntImm *) override |
void | visit (const UIntImm *) override |
void | visit (const FloatImm *) override |
void | visit (const StringImm *) override |
void | visit (const Cast *) override |
void | visit (const Variable *) override |
void | visit (const Add *) override |
void | visit (const Sub *) override |
void | visit (const Mul *) override |
void | visit (const Div *) override |
void | visit (const Mod *) override |
void | visit (const Min *) override |
void | visit (const Max *) override |
void | visit (const EQ *) override |
void | visit (const NE *) override |
void | visit (const LT *) override |
void | visit (const LE *) override |
void | visit (const GT *) override |
void | visit (const GE *) override |
void | visit (const And *) override |
void | visit (const Or *) override |
void | visit (const Not *) override |
void | visit (const Select *) override |
void | visit (const Load *) override |
void | visit (const Ramp *) override |
void | visit (const Broadcast *) override |
void | visit (const Call *) override |
void | visit (const Let *) override |
void | visit (const LetStmt *) override |
void | visit (const AssertStmt *) override |
void | visit (const ProducerConsumer *) override |
void | visit (const For *) override |
void | visit (const Acquire *) override |
void | visit (const Store *) override |
void | visit (const Provide *) override |
void | visit (const Allocate *) override |
void | visit (const Free *) override |
void | visit (const Realize *) override |
void | visit (const Block *) override |
void | visit (const Fork *) override |
void | visit (const IfThenElse *) override |
void | visit (const Evaluate *) override |
void | visit (const Shuffle *) override |
void | visit (const VectorReduce *) override |
void | visit (const Prefetch *) override |
void | visit (const Atomic *) override |
![]() | |
Indentation | get_indent () const |
void | open () |
Either emits "(" or "", depending on the value of implicit_parens. More... | |
void | close () |
Either emits ")" or "", depending on the value of implicit_parens. More... | |
void | print_lets (const Let *let) |
A helper for printing a chain of lets with line breaks. More... | |
void | visit (const IntImm *) override |
void | visit (const UIntImm *) override |
void | visit (const FloatImm *) override |
void | visit (const StringImm *) override |
void | visit (const Cast *) override |
void | visit (const Variable *) override |
void | visit (const Add *) override |
void | visit (const Sub *) override |
void | visit (const Mul *) override |
void | visit (const Div *) override |
void | visit (const Mod *) override |
void | visit (const Min *) override |
void | visit (const Max *) override |
void | visit (const EQ *) override |
void | visit (const NE *) override |
void | visit (const LT *) override |
void | visit (const LE *) override |
void | visit (const GT *) override |
void | visit (const GE *) override |
void | visit (const And *) override |
void | visit (const Or *) override |
void | visit (const Not *) override |
void | visit (const Select *) override |
void | visit (const Load *) override |
void | visit (const Ramp *) override |
void | visit (const Broadcast *) override |
void | visit (const Call *) override |
void | visit (const Let *) override |
void | visit (const LetStmt *) override |
void | visit (const AssertStmt *) override |
void | visit (const ProducerConsumer *) override |
void | visit (const For *) override |
void | visit (const Acquire *) override |
void | visit (const Store *) override |
void | visit (const Provide *) override |
void | visit (const Allocate *) override |
void | visit (const Free *) override |
void | visit (const Realize *) override |
void | visit (const Block *) override |
void | visit (const Fork *) override |
void | visit (const IfThenElse *) override |
void | visit (const Evaluate *) override |
void | visit (const Shuffle *) override |
void | visit (const VectorReduce *) override |
void | visit (const Prefetch *) override |
void | visit (const Atomic *) override |
Static Protected Member Functions | |
template<typename T > | |
static std::string | with_sep (const std::vector< T > &v, const std::string &sep) |
template<typename T > | |
static std::string | with_commas (const std::vector< T > &v) |
Protected Attributes | |
IntegerSuffixStyle | integer_suffix_style = IntegerSuffixStyle::PlainC |
How to emit 64-bit integer constants. More... | |
std::string | id |
An ID for the most recently generated ssa variable. More... | |
Target | target |
The target being generated for. More... | |
OutputKind | output_kind |
Controls whether this instance is generating declarations or definitions and whether the interface us extern "C" or C++. More... | |
std::map< std::string, std::string > | cache |
A cache of generated values in scope. More... | |
Scope< Allocation > | allocations |
Track the types of allocations to avoid unnecessary casts. More... | |
Scope | heap_allocations |
Track which allocations actually went on the heap. More... | |
bool | have_user_context |
True if there is a void * __user_context parameter in the arguments. More... | |
bool | extern_c_open |
Track current calling convention scope. More... | |
bool | uses_gpu_for_loops |
True if at least one gpu-based for loop is used. More... | |
std::set< const halide_handle_cplusplus_type * > | forward_declared |
Track which handle types have been forward-declared already. More... | |
bool | inside_atomic_mutex_node |
Are we inside an atomic node that uses mutex locks? This is used for detecting deadlocks from nested atomics. More... | |
bool | emit_atomic_stores |
Emit atomic store instructions? More... | |
bool | using_vector_typedefs |
true if add_vector_typedefs() has been called. More... | |
![]() | |
std::ostream & | stream |
The stream on which we're outputting. More... | |
int | indent = 0 |
The current indentation level, useful for pretty-printing statements. More... | |
bool | implicit_parens = false |
Certain expressions do not need parens around them, e.g. More... | |
Scope | known_type |
The symbols whose types can be inferred from values printed already. More... | |
This class emits C++ code equivalent to a halide Stmt.
It's mostly the same as an IRPrinter, but it's wrapped in a function definition, and some things are handled differently to be valid C++.
Definition at line 27 of file CodeGen_C.h.
Enumerator | |
---|---|
CHeader | |
CPlusPlusHeader | |
CImplementation | |
CPlusPlusImplementation | |
CExternDecl | |
CPlusPlusExternDecl |
Definition at line 29 of file CodeGen_C.h.
|
strongprotected |
Enumerator | |
---|---|
PlainC | |
OpenCL | |
HLSL |
Definition at line 57 of file CodeGen_C.h.
|
protected |
Enumerator | |
---|---|
DoNotAppendSpace | |
AppendSpace |
Definition at line 99 of file CodeGen_C.h.
Halide::Internal::CodeGen_C::CodeGen_C | ( | std::ostream & | dest, |
const Target & | target, | ||
OutputKind | output_kind = CImplementation , |
||
const std::string & | include_guard = "" |
||
) |
Initialize a C code generator pointing at a particular output stream (e.g.
a file, or std::cout)
|
override |
void Halide::Internal::CodeGen_C::compile | ( | const Module & | module | ) |
Emit the declarations contained in the module as C code.
|
inline |
|
static |
|
protectedvirtual |
Emit a declaration.
|
protectedvirtual |
|
protected |
Emit an expression as an assignment, then return the id of the resulting var.
|
protected |
Emit a statement.
|
protected |
|
protected |
|
protected |
|
protectedvirtual |
Emit the C name for a halide type.
If space_option is AppendSpace, and there should be a space between the type and the next token, one is appended. (This allows both "int foo" and "Foo *foo" to be formatted correctly. Otherwise the latter is "Foo * foo".)
|
protectedvirtual |
Emit a statement to reinterpret an expression as another type.
|
protectedvirtual |
Emit a version of a string that is a valid identifier in C (.
is replaced with _)
|
protectedvirtual |
|
protectedvirtual |
Bottleneck to allow customization of calls to generic Extern/PureExtern calls.
|
protected |
|
protectedvirtual |
Emit an SSA-style assignment, and set id to the freshly generated name.
Return id.
|
protected |
Emit free for the heap allocation.
|
inlineprotected |
Return true if only generating an interface, which may be extern "C" or C++.
Definition at line 134 of file CodeGen_C.h.
References CHeader, CPlusPlusHeader, and output_kind.
Referenced by is_header_or_extern_decl().
|
inlineprotected |
Return true if only generating an interface, which may be extern "C" or C++.
Definition at line 140 of file CodeGen_C.h.
References CExternDecl, CPlusPlusExternDecl, and output_kind.
Referenced by is_header_or_extern_decl().
|
inlineprotected |
Return true if only generating an interface, which may be extern "C" or C++.
Definition at line 146 of file CodeGen_C.h.
References is_extern_decl(), and is_header().
|
inlineprotected |
Return true if generating C++ linkage.
Definition at line 151 of file CodeGen_C.h.
References CPlusPlusExternDecl, CPlusPlusHeader, CPlusPlusImplementation, and output_kind.
|
protected |
Open a new C scope (i.e.
throw in a brace, increase the indent)
|
protected |
Close a C scope (i.e.
throw in an end brace, decrease the indent)
|
protected |
If the Type is a handle type, emit a forward-declaration for it if we haven't already.
|
protected |
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
overrideprotectedvirtual |
Reimplemented from Halide::Internal::IRVisitor.
|
protected |
|
protected |
|
inlinestaticprotected |
Definition at line 243 of file CodeGen_C.h.
|
inlinestaticprotected |
Definition at line 255 of file CodeGen_C.h.
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
overrideprotected |
|
protected |
How to emit 64-bit integer constants.
Definition at line 64 of file CodeGen_C.h.
|
protected |
An ID for the most recently generated ssa variable.
Definition at line 73 of file CodeGen_C.h.
|
protected |
The target being generated for.
Definition at line 76 of file CodeGen_C.h.
Referenced by get_target().
|
protected |
Controls whether this instance is generating declarations or definitions and whether the interface us extern "C" or C++.
Definition at line 80 of file CodeGen_C.h.
Referenced by is_c_plus_plus_interface(), is_extern_decl(), and is_header().
|
protected |
A cache of generated values in scope.
Definition at line 83 of file CodeGen_C.h.
|
protected |
Track the types of allocations to avoid unnecessary casts.
Definition at line 168 of file CodeGen_C.h.
|
protected |
Track which allocations actually went on the heap.
Definition at line 171 of file CodeGen_C.h.
|
protected |
True if there is a void * __user_context parameter in the arguments.
Definition at line 174 of file CodeGen_C.h.
|
protected |
Track current calling convention scope.
Definition at line 177 of file CodeGen_C.h.
|
protected |
True if at least one gpu-based for loop is used.
Definition at line 180 of file CodeGen_C.h.
|
protected |
Track which handle types have been forward-declared already.
Definition at line 183 of file CodeGen_C.h.
|
protected |
Are we inside an atomic node that uses mutex locks? This is used for detecting deadlocks from nested atomics.
Definition at line 261 of file CodeGen_C.h.
|
protected |
Emit atomic store instructions?
Definition at line 264 of file CodeGen_C.h.
|
protected |
true if add_vector_typedefs() has been called.
Definition at line 267 of file CodeGen_C.h.