13 #include <hilti/ast/function.h> 14 #include <hilti/base/cache.h> 15 #include <hilti/compiler/context.h> 16 #include <hilti/compiler/detail/cxx/elements.h> 17 #include <hilti/compiler/detail/cxx/unit.h> 27 enum class TypeUsage { Storage, CopyParameter, InParameter, InOutParameter, FunctionResult, Ctor, None };
30 std::optional<cxx::Type> base_type;
31 std::optional<cxx::Type> storage;
32 std::optional<cxx::Type> result;
33 std::optional<cxx::Type> param_copy;
34 std::optional<cxx::Type> param_in;
35 std::optional<cxx::Type> param_inout;
36 std::optional<cxx::Type> ctor;
37 std::optional<cxx::Expression> default_;
38 std::optional<cxx::Expression> type_info;
46 std::optional<cxx::declaration::Constant>
forward;
58 CodeGen(std::shared_ptr<Context> context) : _context(std::move(context)) {}
62 bool include_implementation);
67 std::shared_ptr<Context> context()
const {
return _context; }
68 const Options& options()
const {
return _context->options(); }
71 std::optional<cxx::declaration::Type> typeDeclaration(
const hilti::Type& t);
72 std::list<cxx::declaration::Type> typeDependencies(
const hilti::Type& t);
73 cxx::Type compile(
const hilti::Type& t, codegen::TypeUsage usage);
76 cxx::Expression compile(
const hilti::expression::ResolvedOperator& o,
bool lhs =
false);
79 function::CallingConvention cc = function::CallingConvention::Standard,
80 const std::optional<AttributeSet>& fattrs = {},
81 std::optional<cxx::ID> namespace_ = {});
82 std::vector<cxx::Expression> compileCallArguments(
const std::vector<Expression>& args,
83 const std::vector<declaration::Parameter>& params);
84 std::optional<cxx::Expression> typeDefaultValue(
const hilti::Type& t);
87 void addTypeInfoDefinition(
const hilti::Type& t);
90 cxx::Expression unpack(
const hilti::Type& t,
const Expression& data,
const std::vector<Expression>& args);
92 void addDeclarationFor(
const hilti::Type& t) { _need_decls.push_back(t); }
105 cxx::ID uniqueID(
const std::string& prefix,
const Node& n);
112 void popSelf() { _selfs.pop_back(); }
114 auto cxxBlock()
const {
return ! _cxx_blocks.empty() ? _cxx_blocks.back() :
nullptr; }
115 void pushCxxBlock(
cxx::Block* b) { _cxx_blocks.push_back(b); }
116 void popCxxBlock() { _cxx_blocks.pop_back(); }
118 void enablePrioritizeTypes() { ++_prioritize_types; }
119 void disablePrioritizeTypes() { --_prioritize_types; }
120 bool prioritizeTypes()
const {
return _prioritize_types > 0; }
128 std::unique_ptr<cxx::Unit> _cxx_unit;
130 std::shared_ptr<Context> _context;
131 std::vector<detail::cxx::Expression> _selfs = {
"__self"};
132 std::vector<detail::cxx::Block*> _cxx_blocks;
133 std::vector<detail::cxx::declaration::Local> _tmps;
134 std::map<std::string, int> _tmp_counters;
135 std::vector<hilti::Type> _need_decls;
139 int _prioritize_types = 0;
Definition: function.h:69
Definition: elements.h:229
Definition: elements.h:177
Definition: elements.h:28
bool predefined
Definition: codegen.h:43
std::optional< cxx::declaration::Constant > declaration
Definition: codegen.h:47
cxx::Expression reference
Definition: codegen.h:45
std::optional< cxx::declaration::Constant > forward
Definition: codegen.h:46
Definition: elements.h:66