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);
94 void addDeclarationFor(
const hilti::Type& t) { _need_decls.push_back(t); }
107 cxx::ID uniqueID(
const std::string& prefix,
const Node& n);
114 void popSelf() { _selfs.pop_back(); }
116 auto cxxBlock()
const {
return ! _cxx_blocks.empty() ? _cxx_blocks.back() :
nullptr; }
117 void pushCxxBlock(
cxx::Block* b) { _cxx_blocks.push_back(b); }
118 void popCxxBlock() { _cxx_blocks.pop_back(); }
120 void enablePrioritizeTypes() { ++_prioritize_types; }
121 void disablePrioritizeTypes() { --_prioritize_types; }
122 bool prioritizeTypes()
const {
return _prioritize_types > 0; }
130 std::unique_ptr<cxx::Unit> _cxx_unit;
132 std::weak_ptr<Context> _context;
133 std::vector<detail::cxx::Expression> _selfs = {
"__self"};
134 std::vector<detail::cxx::Block*> _cxx_blocks;
135 std::vector<detail::cxx::declaration::Local> _tmps;
136 std::map<std::string, int> _tmp_counters;
137 std::vector<hilti::Type> _need_decls;
141 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