14 #include <hilti/ast/function.h> 15 #include <hilti/base/cache.h> 16 #include <hilti/compiler/context.h> 17 #include <hilti/compiler/detail/cxx/elements.h> 18 #include <hilti/compiler/detail/cxx/unit.h> 28 enum class TypeUsage { Storage, CopyParameter, InParameter, InOutParameter, FunctionResult, Ctor, None };
31 std::optional<cxx::Type> base_type;
32 std::optional<cxx::Type> storage;
33 std::optional<cxx::Type> result;
34 std::optional<cxx::Type> param_copy;
35 std::optional<cxx::Type> param_in;
36 std::optional<cxx::Type> param_inout;
37 std::optional<cxx::Type> ctor;
38 std::optional<cxx::Expression> default_;
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.lock(); }
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);
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_ = {});
86 std::optional<cxx::Expression> typeDefaultValue(
const hilti::Type& t);
87 codegen::TypeUsage parameterKindToTypeUsage(declaration::parameter::Kind);
95 void addDeclarationFor(
const hilti::Type& t) { _need_decls.push_back(t); }
108 cxx::ID uniqueID(
const std::string& prefix,
const Node& n);
115 void popSelf() { _self.pop_back(); }
117 auto cxxBlock()
const {
return ! _cxx_blocks.empty() ? _cxx_blocks.back() :
nullptr; }
118 void pushCxxBlock(
cxx::Block* b) { _cxx_blocks.push_back(b); }
119 void popCxxBlock() { _cxx_blocks.pop_back(); }
121 void enablePrioritizeTypes() { ++_prioritize_types; }
122 void disablePrioritizeTypes() { --_prioritize_types; }
123 bool prioritizeTypes()
const {
return _prioritize_types > 0; }
131 std::unique_ptr<cxx::Unit> _cxx_unit;
133 std::weak_ptr<Context> _context;
134 std::vector<detail::cxx::Expression> _self = {
"__self"};
135 std::vector<detail::cxx::Block*> _cxx_blocks;
136 std::vector<detail::cxx::declaration::Local> _tmps;
137 std::map<std::string, int> _tmp_counters;
138 std::vector<hilti::Type> _need_decls;
142 int _prioritize_types = 0;
Definition: function.h:71
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