#ifndef HALIDE_CODEGEN_C_H
#define HALIDE_CODEGEN_C_H
#include "IRPrinter.h"
#include "Module.h"
#include "Scope.h"
namespace Halide {
struct Argument;
namespace Internal {
class CodeGen_C : public IRPrinter {
public:
enum OutputKind {
CHeader,
CPlusPlusHeader,
CImplementation,
CPlusPlusImplementation,
};
CodeGen_C(std::ostream &dest,
Target target,
OutputKind output_kind = CImplementation,
const std::string &include_guard = "");
~CodeGen_C();
void compile(const Module &module);
EXPORT static void test();
protected:
virtual void compile(const LoweredFunc &func);
virtual void compile(const Buffer<> &buffer);
std::string id;
Target target;
OutputKind output_kind;
std::map<std::string, std::string> cache;
std::set<std::string> emitted;
std::string print_expr(Expr);
void print_stmt(Stmt);
enum AppendSpaceIfNeeded {
DoNotAppendSpace,
AppendSpace,
};
virtual std::string print_type(Type, AppendSpaceIfNeeded space_option = DoNotAppendSpace);
virtual std::string print_reinterpret(Type, Expr);
virtual std::string print_name(const std::string &);
std::string print_assignment(Type t, const std::string &rhs);
bool is_header() {
return output_kind == CHeader ||
output_kind == CPlusPlusHeader;
}
bool is_c_plus_plus_interface() {
return output_kind == CPlusPlusHeader ||
output_kind == CPlusPlusImplementation;
}
void open_scope();
void close_scope(const std::string &comment);
struct Allocation {
Type type;
std::string free_function;
};
Scope<Allocation> allocations;
Scope<int> heap_allocations;
bool have_user_context;
bool extern_c_open;
std::set<const halide_handle_cplusplus_type *> forward_declared;
void set_name_mangling_mode(NameMangling mode);
using IRPrinter::visit;
void visit(const Variable *);
void visit(const IntImm *);
void visit(const UIntImm *);
void visit(const StringImm *);
void visit(const FloatImm *);
void visit(const Cast *);
void visit(const Add *);
void visit(const Sub *);
void visit(const Mul *);
void visit(const Div *);
void visit(const Mod *);
void visit(const Max *);
void visit(const Min *);
void visit(const EQ *);
void visit(const NE *);
void visit(const LT *);
void visit(const LE *);
void visit(const GT *);
void visit(const GE *);
void visit(const And *);
void visit(const Or *);
void visit(const Not *);
void visit(const Call *);
void visit(const Select *);
void visit(const Load *);
void visit(const Store *);
void visit(const Let *);
void visit(const LetStmt *);
void visit(const AssertStmt *);
void visit(const ProducerConsumer *);
void visit(const For *);
void visit(const Provide *);
void visit(const Allocate *);
void visit(const Free *);
void visit(const Realize *);
void visit(const IfThenElse *);
void visit(const Evaluate *);
void visit(const Shuffle *);
void visit(const Prefetch *);
void visit_binop(Type t, Expr a, Expr b, const char *op);
};
}
}
#endif