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> 22 namespace logging::debug {
23 inline const DebugStream CodeGen(
"codegen");
32 enum class TypeUsage { Storage, CopyParameter, InParameter, InOutParameter, FunctionResult, Ctor, None };
35 std::optional<cxx::Type> base_type;
36 std::optional<cxx::Type> storage;
37 std::optional<cxx::Type> result;
38 std::optional<cxx::Type> param_copy;
39 std::optional<cxx::Type> param_in;
40 std::optional<cxx::Type> param_inout;
41 std::optional<cxx::Type> ctor;
42 std::optional<cxx::Expression> default_;
50 std::optional<cxx::declaration::Constant>
forward;
62 CodeGen(
const std::shared_ptr<Context>& context) : _context(context) {}
66 bool include_implementation);
71 std::shared_ptr<Context> context()
const {
return _context.lock(); }
72 const Options& options()
const {
return context()->options(); }
75 std::optional<cxx::declaration::Type> typeDeclaration(
const hilti::Type& t);
76 std::list<cxx::declaration::Type> typeDependencies(
const hilti::Type& t);
80 cxx::Expression compile(
const hilti::expression::ResolvedOperator& o,
bool lhs =
false);
83 function::CallingConvention cc = function::CallingConvention::Standard,
84 const std::optional<AttributeSet>& fattrs = {},
85 std::optional<cxx::ID> namespace_ = {});
90 std::optional<cxx::Expression> typeDefaultValue(
const hilti::Type& t);
91 codegen::TypeUsage parameterKindToTypeUsage(declaration::parameter::Kind);
97 cxx::Expression pack(
const Expression& data,
const std::vector<Expression>& args);
100 bool throw_on_error);
102 bool throw_on_error);
103 void addDeclarationFor(
const hilti::Type& t) { _need_decls.push_back(t); }
116 cxx::ID uniqueID(
const std::string& prefix,
const Node& n);
120 return {
"__dd", cxx::Side::LHS};
123 void popSelf() { _self.pop_back(); }
125 auto cxxBlock()
const {
return ! _cxx_blocks.empty() ? _cxx_blocks.back() :
nullptr; }
126 void pushCxxBlock(
cxx::Block* b) { _cxx_blocks.push_back(b); }
127 void popCxxBlock() { _cxx_blocks.pop_back(); }
129 void enablePrioritizeTypes() { ++_prioritize_types; }
130 void disablePrioritizeTypes() { --_prioritize_types; }
131 bool prioritizeTypes()
const {
return _prioritize_types > 0; }
144 std::unique_ptr<cxx::Unit> _cxx_unit;
146 std::weak_ptr<Context> _context;
147 std::vector<detail::cxx::Expression> _self = {{
"__self", cxx::Side::LHS}};
148 std::vector<detail::cxx::Block*> _cxx_blocks;
149 std::vector<detail::cxx::declaration::Local> _tmps;
150 std::map<std::string, int> _tmp_counters;
151 std::vector<hilti::Type> _need_decls;
155 int _prioritize_types = 0;
Definition: function.h:71
Definition: elements.h:275
Definition: elements.h:223
bool predefined
Definition: codegen.h:47
std::optional< cxx::declaration::Constant > declaration
Definition: codegen.h:51
cxx::Expression reference
Definition: codegen.h:49
Definition: elements.h:69
std::optional< cxx::declaration::Constant > forward
Definition: codegen.h:50
Definition: elements.h:91