2 #ifndef HOBBES_EVAL_CC_HPP_INCLUDED 3 #define HOBBES_EVAL_CC_HPP_INCLUDED 24 #include <unordered_map> 32 typedef std::function<ExprPtr(const std::string&)>
ExprParser;
34 template <
typename ... NamesAndExpr>
45 static ExprPtr expr(
const ExprParser& p,
const std::string& e) {
return p(e); }
50 static ExprPtr expr(
const ExprParser& p,
const char* e) {
return p(std::string(e)); }
52 template <
typename ... NamesAndExpr>
53 struct PArgl<const char*, NamesAndExpr...> {
57 template <
typename ... NamesAndExpr>
70 typedef ModulePtr (*readModuleFileFn)(
cc*,
const std::string&);
71 ModulePtr readModuleFile(
const std::string&);
72 void setReadModuleFileFn(readModuleFileFn);
74 typedef ModulePtr (*readModuleFn)(cc*,
const std::string&);
76 void setReadModuleFn(readModuleFn);
78 typedef std::pair<std::string, ExprPtr> (*readExprDefnFn)(cc*,
const std::string&);
79 std::pair<std::string, ExprPtr> readExprDefn(
const std::string&);
80 void setReadExprDefnFn(readExprDefnFn);
82 typedef ExprPtr (*readExprFn)(cc*,
const std::string&);
83 ExprPtr readExpr(
const std::string&);
84 void setReadExprFn(readExprFn);
92 template <
typename RFn,
typename ... NamesAndExpr>
94 static_assert(
func<RFn>::arity ==
sizeof...(NamesAndExpr)-1,
"Formal parameter list and expected function type arity mismatch");
108 ExprPtr unsweetenExpression(
const std::string& vname,
const ExprPtr& e);
112 llvm::IRBuilder<>* builder()
const;
113 llvm::Module* module()
const;
116 void dumpTypeEnv()
const;
118 std::string showTypeEnv()
const;
120 const TEnvPtr& typeEnv()
const;
123 void forwardDeclare(
const std::string& vname,
const QualTypePtr& qt);
126 bool hasValueBinding(
const std::string& vname);
134 void define(
const std::string& vname,
const ExprPtr& e);
135 void define(
const std::string& vname,
const std::string& expr);
138 void overload(
const std::string&,
const MonoTypes&);
140 void overload(
const std::string&,
const MonoTypes&,
const std::string&);
149 typedef std::vector<unsigned char>
bytes;
150 bytes machineCodeForExpr(
const std::string& expr);
153 template <
typename T>
155 this->objs->add<T>();
159 template <
typename T>
164 template <
typename T>
170 void bind(
const PolyTypePtr& tn,
const std::string& vn,
void* x);
172 template <
typename T>
173 void bind(
const std::string& vn, T* x) {
177 template <
typename T,
int N>
183 template <
typename R,
typename ...
Args>
185 bindExternFunction(fn,
lift<R(
Args...)>::type(*
this), (
void*)pfn);
188 typedef std::pair<str::seq, MonoTypePtr>
TTyDef;
189 typedef std::unordered_map<std::string, TTyDef>
TTyDefs;
194 void defineTypeAlias(
const std::string& name,
const str::seq& argNames,
const MonoTypePtr& ty);
195 bool isTypeAliasName(
const std::string& name)
const;
199 PolyTypePtr opaquePtrPolyType(
const std::type_info& ti,
unsigned int sz,
bool inStruct);
200 MonoTypePtr opaquePtrMonoType(
const std::type_info& ti,
unsigned int sz,
bool inStruct);
205 bool isTypeName(
const std::string&)
const;
206 MonoTypePtr namedTypeRepresentation(
const std::string&)
const;
212 void* unsafeCompileFn(
const MonoTypePtr& fnTy,
const str::seq& names,
const std::string& exp);
213 void releaseMachineCode(
void*);
216 void enableModuleInlining(
bool f);
217 bool enableModuleInlining()
const;
218 void buildInterpretedMatches(
bool f);
219 bool buildInterpretedMatches()
const;
220 void requireMatchReachability(
bool f);
221 bool requireMatchReachability()
const;
222 void alwaysLowerPrimMatchTables(
bool);
223 bool alwaysLowerPrimMatchTables()
const;
229 void bindLLFunc(
const std::string&,
op*);
232 void bindExternFunction(
const std::string& fname,
const MonoTypePtr& fty,
void* fn);
236 bool preludeLoaded()
const;
251 PolyTypePtr lookupVarType(
const std::string& vname)
const;
254 void definePolyValue(
const std::string& vname,
const ExprPtr& unsweetExp);
264 void operator=(
const cc&);
267 #define LIFTCTY(cc, e) (cc).liftMonoType<decltype(e)>() 269 template <
typename T>
272 throw std::runtime_error(
"Internal error, unsupported compilation target type");
276 template <
typename R,
typename ...
Args>
284 template <
typename T>
292 #define memberfn(e) &hobbes::mfnThunk< decltype(e), decltype(e), e >::fn std::shared_ptr< PolyType > PolyTypePtr
Definition: type.H:23
Types types(const Constants &cs)
Definition: llvm.H:357
std::shared_ptr< TCInstance > TCInstancePtr
Definition: class.H:24
static str::seq names(const char *x, const NamesAndExpr &... args)
Definition: cc.H:54
PolyTypePtr generalize(const QualTypePtr &qt)
Definition: type.C:2016
TEnvPtr tenv
Definition: cc.H:248
readModuleFileFn readModuleFileF
Definition: cc.H:86
MonoTypePtr arrayty(const MonoTypePtr &ty, size_t n)
Definition: type.H:1155
static ExprPtr expr(const ExprParser &p, const std::string &, const NamesAndExpr &... args)
Definition: cc.H:60
static ExprPtr expr(const ExprParser &p, const char *e)
Definition: cc.H:50
std::map< std::string, MonoTypePtr > MonoTypeAliasMap
Definition: cc.H:29
std::shared_ptr< std::vector< std::pair< size_t, PatternRow > > > UnreachableMatchRowsPtr
Definition: pattern.H:32
std::unordered_map< std::string, TTyDef > TTyDefs
Definition: cc.H:189
UnreachableMatchRowsPtr unreachableMatchRowsPtr
Definition: cc.H:226
void bind(const std::string &vn, T *x)
Definition: cc.H:173
Definition: pattern.H:281
static str::seq names(const std::string &x, const NamesAndExpr &... args)
Definition: cc.H:59
jitcc jit
Definition: cc.H:239
static str::seq names(const ExprPtr &)
Definition: cc.H:39
PolyTypePtr liftType()
Definition: cc.H:160
void bind(const std::string &fn, R(*pfn)(Args...))
Definition: cc.H:184
QualTypePtr qualtype(const Constraints &cs, const MonoTypePtr &p)
Definition: type.H:1016
static str::seq names(const char *)
Definition: cc.H:49
static ExprPtr expr(const ExprParser &, const ExprPtr &e)
Definition: cc.H:40
ObjsPtr objs
Definition: cc.H:260
bool booted
Definition: cc.H:257
bool checkMatchReachability
Definition: cc.H:244
MonoType::ptr MonoTypePtr
Definition: type.H:71
TTyDefs ttyDefs
Definition: cc.H:190
bool genInterpretedMatch
Definition: cc.H:243
void bindArr(const std::string &vn, T x[N])
Definition: cc.H:178
readExprDefnFn readExprDefnF
Definition: cc.H:88
std::map< std::string, PolyTypePtr > TypeAliasMap
Definition: cc.H:28
readModuleFn readModuleF
Definition: cc.H:87
bool drainingDefs
Definition: cc.H:129
static ExprPtr expr(const ExprParser &p, const char *, const NamesAndExpr &... args)
Definition: cc.H:55
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
LetRec::Bindings drainDefs
Definition: cc.H:130
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
MonoTypePtr liftMonoType()
Definition: cc.H:165
std::shared_ptr< Module > ModulePtr
Definition: module.H:171
std::shared_ptr< TEnv > TEnvPtr
Definition: type.H:80
func< RFn >::type compileFn(NamesAndExpr ... args)
Definition: cc.H:93
std::vector< std::string > seq
Definition: str.H:19
bool runModInlinePass
Definition: cc.H:242
bool lowerPrimMatchTables
Definition: cc.H:245
static str::seq names(const std::string &)
Definition: cc.H:44
ExprPtr fn(const str::seq &vns, const ExprPtr &b, const LexicalAnnotation &la)
Definition: expr.H:837
static ExprPtr expr(const ExprParser &p, const std::string &e)
Definition: cc.H:45
std::vector< Definition > Definitions
Definition: expr.H:62
std::vector< unsigned char > bytes
Definition: cc.H:149
PolyTypePtr polytype(int tvs, const QualTypePtr &qt)
Definition: type.H:1036
void addObj()
Definition: cc.H:154
std::shared_ptr< TClass > TClassPtr
Definition: class.H:102
static MonoTypePtr type(typedb &tenv)
Definition: tylift.H:136
std::map< std::string, llvm::Value * > Args
Definition: dfa.C:1276
std::vector< MonoTypePtr > MonoTypes
Definition: type.H:72
std::shared_ptr< QualType > QualTypePtr
Definition: type.H:28
std::vector< Binding > Bindings
Definition: expr.H:327
std::shared_ptr< Objs > ObjsPtr
Definition: obj.H:93
std::function< ExprPtr(const std::string &)> ExprParser
Definition: cc.H:32
static T compile(cc *c, const str::seq &vns, const std::string &expr)
Definition: cc.H:271
readExprFn readExprF
Definition: cc.H:89
std::pair< str::seq, MonoTypePtr > TTyDef
Definition: cc.H:188
void * unsafeCompileFn(const MonoTypePtr &retTy, const str::seq &names, const MonoTypes &argTys, const ExprPtr &exp)
Definition: cc.C:558
T compileTo(cc *c, const str::seq &vns, const std::string &expr)
Definition: cc.H:285
TypeAliasMap typeAliases
Definition: cc.H:249
static cbF compile(cc *c, const str::seq &vns, const std::string &expr)
Definition: cc.H:279