feat(library/compiler): interface with new IR compiler entry point

This commit is contained in:
Leonardo de Moura 2019-05-16 15:41:47 -07:00
parent aa138fe686
commit ac69f802e1
7 changed files with 104 additions and 36 deletions

View file

@ -26,10 +26,13 @@ end LogEntry
abbrev Log := Array LogEntry
@[export lean.ir.format_log_core]
def formatLog (log : Log) : Format :=
def Log.format (log : Log) : Format :=
log.foldl (λ fmt entry, fmt ++ Format.line ++ format entry) Format.nil
@[export lean.ir.log_to_string_core]
def Log.toString (log : Log) : String :=
log.format.pretty
structure CompilerState :=
(env : Environment) (log : Log := Array.empty)

View file

@ -240,11 +240,11 @@ environment compile(environment const & env, options const & opts, names cs) {
ds = apply(ecse, new_env, ds);
ds = apply(elim_dead_let, ds);
trace_compiler(name({"compiler", "simp_app_args"}), ds);
/* emit C++ code. */
comp_decls b_ds;
std::tie(new_env, b_ds) = to_llnf(new_env, ds, true);
new_env = save_llnf_code(new_env, b_ds);
trace_compiler(name({"compiler", "boxed"}), b_ds);
/* compile IR. */
std::tie(new_env, ds) = to_llnf(new_env, ds, true);
new_env = save_llnf_code(new_env, ds);
trace_compiler(name({"compiler", "boxed"}), ds);
// new_env = compile_ir(new_env, opts, ds); // TODO(Leo)
return new_env;
}
@ -276,6 +276,12 @@ void initialize_compiler() {
register_trace_class({"compiler", "optimize_bytecode"});
register_trace_class({"compiler", "code_gen"});
register_trace_class({"compiler", "ll_infer_type"});
register_trace_class({"compiler", "ir"});
register_trace_class({"compiler", "ir", "init"});
register_trace_class({"compiler", "ir", "push_proj"});
register_trace_class({"compiler", "ir", "reset_reuse"});
register_trace_class({"compiler", "ir", "elim_dead"});
register_trace_class({"compiler", "ir", "simp_case"});
}
void finalize_compiler() {

View file

@ -9,6 +9,7 @@ Author: Leonardo de Moura
#include "util/nat.h"
#include "kernel/instantiate.h"
#include "kernel/type_checker.h"
#include "library/trace.h"
#include "library/compiler/util.h"
#include "library/compiler/llnf.h"
@ -38,7 +39,8 @@ extern object * mk_unreachable_core;
object * mk_alt_core(object * n, object * cidx, object * size, object * usize, object * ssize, object * b);
object * mk_decl_core(object * f, object * xs, uint8 ty, object * b);
object * decl_to_string_core(object * d);
object * test_core(object * d, object * w);
object * compile_core(object * env, object * opts, object * decls);
object * log_to_string_core(object * log);
/*
inductive IRType
| float | uint8 | uint16 | uint32 | uint64 | usize
@ -115,17 +117,6 @@ std::string decl_to_string(decl const & d) {
string_ref r(decl_to_string_core(d.raw()));
return r.to_std_string();
}
void test(decl const & d) {
inc(d.raw());
object * r = test_core(d.raw(), io_mk_world());
if (io_result_is_error(r)) {
io_result_show_error(r);
dec(r);
throw exception("IR test error");
} else {
dec(r);
}
}
}
class to_ir_fn {
@ -479,7 +470,38 @@ public:
ir::decl operator()(comp_decl const & d) { return to_ir_decl(d); }
};
ir::decl to_ir_decl(environment const & env, comp_decl const & d) {
namespace ir {
decl to_ir_decl(environment const & env, comp_decl const & d) {
return to_ir_fn(env)(d);
}
/*
@[export lean.ir.compile_core]
def compile (env : Environment) (opts : Options) (decls : Array Decl) : Log × (Except String Environment) :=
*/
environment compile(environment const & env, options const & opts, comp_decls const & decls) {
buffer<decl> ir_decls;
for (comp_decl const & decl : decls) {
ir_decls.push_back(to_ir_decl(env, decl));
}
object * r = compile_core(env.to_obj_arg(), opts.to_obj_arg(), to_array(ir_decls));
object * log = cnstr_get(r, 0);
if (array_size(log) > 0) {
inc(log);
object * str = log_to_string_core(log);
tout() << string_cstr(str);
dec_ref(str);
}
object * v = cnstr_get(r, 1);
if (cnstr_tag(v) == 0) {
string_ref error(cnstr_get(v, 0), true);
dec_ref(r);
throw exception(error.data());
} else {
environment new_env(cnstr_get(v, 0), true);
dec_ref(r);
return new_env;
}
}
}
}

View file

@ -13,6 +13,6 @@ namespace ir {
typedef object_ref decl;
std::string decl_to_string(decl const & d);
void test(decl const & d);
environment compile(environment const & env, options const & opts, comp_decls const & decls);
}
ir::decl to_ir_decl(environment const & env, comp_decl const & d);
}

View file

@ -2447,6 +2447,16 @@ pair<environment, comp_decls> to_llnf(environment const & env, comp_decls const
return mk_pair(new_env, append(_rs, _bs));
}
environment compile_ir(environment const & env, options const & opts, comp_decls const & ds) {
bool unboxed = true;
buffer<comp_decl> new_ds;
for (comp_decl const & d : ds) {
expr new_v = to_lambda_pure_fn(env, unboxed)(d.snd());
new_ds.push_back(comp_decl(d.fst(), new_v));
}
return ir::compile(env, opts, new_ds);
}
void initialize_llnf() {
g_apply = new expr(mk_constant("_apply"));
g_closure = new expr(mk_constant("_closure"));

View file

@ -15,6 +15,8 @@ pair<environment, comp_decls> to_llnf(environment const & env, comp_decls const
optional<pair<environment, comp_decl>> mk_boxed_version(environment env, name const & fn, unsigned arity);
environment compile_ir(environment const & env, options const & opts, comp_decls const & ds);
bool is_llnf_apply(expr const & e);
bool is_llnf_closure(expr const & e);
bool is_llnf_cnstr(expr const & e, name & I, unsigned & cidx, unsigned & nusize, unsigned & ssz);

View file

@ -28,6 +28,7 @@ obj* l_Lean_IR_containsDecl(obj*, obj*, obj*);
obj* l_Lean_IR_LogEntry_fmt___main(obj*);
extern obj* l_Array_empty___closed__1;
obj* l_Lean_IR_logMessage___boxed(obj*);
obj* l_Lean_Format_pretty(obj*, obj*);
obj* l_Lean_IR_mkDeclMapExtension___closed__1;
extern obj* l_Lean_registerPersistentEnvExtensionUnsafe___rarg___closed__2;
obj* l___private_init_lean_compiler_ir_compilerm_3__logMessageIfAux___boxed(obj*);
@ -41,6 +42,7 @@ obj* l_HashMapImp_insert___at___private_init_lean_compiler_ir_compilerm_4__mkEnt
obj* l_mkHashMap___at___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___spec__1(obj*);
obj* l___private_init_lean_compiler_ir_compilerm_2__logDeclsAux(obj*, obj*, obj*, obj*, obj*);
obj* l_HashMapImp_find___at_Lean_IR_findDecl___spec__3(obj*, obj*);
obj* l_Lean_IR_Log_format(obj*);
obj* l_Lean_IR_logMessage___rarg___boxed(obj*, obj*, obj*, obj*, obj*);
obj* l_AssocList_foldl___main___at___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___spec__6(obj*, obj*);
obj* l_Lean_IR_findDecl(obj*, obj*, obj*);
@ -51,6 +53,8 @@ extern obj* l_Lean_Format_sbracket___closed__1;
obj* l_Array_miterateAux___main___at_Lean_IR_LogEntry_fmt___main___spec__1(obj*, obj*, obj*, obj*);
obj* l_List_redLength___main___rarg(obj*);
obj* l_Lean_IR_addDecls___boxed(obj*, obj*, obj*);
extern obj* l_Lean_Options_empty;
obj* l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1(obj*, obj*, obj*, obj*);
uint8 l_Lean_SMap_contains___main___at_Lean_IR_containsDecl___spec__1(obj*, obj*);
obj* l_Lean_SMap_find___main___at_Lean_IR_findDecl___spec__1(obj*, obj*);
obj* l_HashMapImp_expand___at___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___spec__4(obj*, obj*);
@ -78,6 +82,10 @@ obj* l_Lean_SMap_switch___at_Lean_IR_mkDeclMapExtension___spec__2(obj*);
obj* l___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___closed__1;
obj* l_Lean_IR_addDecls(obj*, obj*, obj*);
namespace lean {
namespace ir {
obj* log_to_string_core(obj*);
}}
namespace lean {
uint8 nat_dec_lt(obj*, obj*);
}
obj* l_Array_miterateAux___main___at___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___spec__10___boxed(obj*, obj*, obj*, obj*);
@ -92,7 +100,6 @@ obj* l_Lean_IR_Decl_name___main(obj*);
obj* l_Lean_IR_declMapExt___elambda__2(uint8);
obj* l_Lean_IR_LogEntry_Lean_HasFormat;
obj* l_Lean_IR_findDecl___boxed(obj*, obj*, obj*);
obj* l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1(obj*, obj*, obj*, obj*);
namespace lean {
obj* nat_add(obj*, obj*);
}
@ -106,6 +113,7 @@ uint8 l_AssocList_contains___main___at___private_init_lean_compiler_ir_compilerm
obj* l_Array_mforAux___main___at_Lean_IR_addDecls___spec__1(obj*, obj*, obj*, obj*);
uint8 l___private_init_lean_compiler_ir_compilerm_1__isLogEnabledFor(obj*, obj*);
obj* l_RBNode_ins___main___at_Lean_IR_mkDeclMapExtension___spec__5(obj*, obj*, obj*);
obj* l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1___boxed(obj*, obj*, obj*, obj*);
obj* l_Lean_IR_declMapExt___elambda__1(obj*);
extern obj* l_Lean_SMap_insert___main___at_Lean_Environment_add___spec__1___closed__2;
obj* l___private_init_lean_compiler_ir_compilerm_4__mkEntryArray(obj*);
@ -118,10 +126,6 @@ namespace lean {
usize usize_modn(usize, obj*);
}
obj* l_HashMapImp_find___at_Lean_IR_findDecl___spec__3___boxed(obj*, obj*);
namespace lean {
namespace ir {
obj* format_log_core(obj*);
}}
obj* l___private_init_lean_compiler_ir_compilerm_2__logDeclsAux___boxed(obj*, obj*, obj*, obj*, obj*);
obj* l_mkHashMapImp___rarg(obj*);
obj* l_Lean_IR_modifyEnv(obj*, obj*, obj*);
@ -130,6 +134,7 @@ obj* l___private_init_lean_compiler_ir_compilerm_3__logMessageIfAux___rarg(obj*,
uint8 l_HashMapImp_contains___at_Lean_IR_containsDecl___spec__2(obj*, obj*);
obj* l_Lean_IR_declMapExt___elambda__2___rarg(obj*, obj*);
extern obj* l_Lean_registerPersistentEnvExtensionUnsafe___rarg___closed__1;
obj* l_Lean_IR_Log_format___boxed(obj*);
extern obj* l_Lean_Name_toString___closed__1;
obj* l_Lean_IR_log___boxed(obj*, obj*, obj*);
namespace lean {
@ -142,7 +147,6 @@ obj* l_AssocList_find___main___at_Lean_IR_findDecl___spec__4___boxed(obj*, obj*)
obj* l_List_foldl___main___at___private_init_lean_compiler_ir_compilerm_4__mkEntryArray___spec__8___boxed(obj*, obj*, obj*);
obj* l_Lean_IR_addDecl(obj*, obj*, obj*);
obj* l_Lean_Name_append___main(obj*, obj*);
obj* l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1___boxed(obj*, obj*, obj*, obj*);
namespace lean {
obj* nat_mul(obj*, obj*);
}
@ -271,7 +275,7 @@ x_0 = lean::alloc_closure(reinterpret_cast<void*>(l_Lean_IR_LogEntry_fmt), 1, 0)
return x_0;
}
}
obj* l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1(obj* x_0, obj* x_1, obj* x_2, obj* x_3) {
obj* l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1(obj* x_0, obj* x_1, obj* x_2, obj* x_3) {
_start:
{
obj* x_4; uint8 x_5;
@ -309,30 +313,51 @@ goto _start;
}
}
}
namespace lean {
namespace ir {
obj* format_log_core(obj* x_0) {
obj* l_Lean_IR_Log_format(obj* x_0) {
_start:
{
obj* x_1; obj* x_2; obj* x_3;
x_1 = lean::mk_nat_obj(0ul);
x_2 = lean::box(0);
x_3 = l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1(x_0, x_0, x_1, x_2);
lean::dec(x_0);
x_3 = l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1(x_0, x_0, x_1, x_2);
return x_3;
}
}
}}
obj* l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1___boxed(obj* x_0, obj* x_1, obj* x_2, obj* x_3) {
obj* l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1___boxed(obj* x_0, obj* x_1, obj* x_2, obj* x_3) {
_start:
{
obj* x_4;
x_4 = l_Array_miterateAux___main___at_Lean_IR_formatLog___spec__1(x_0, x_1, x_2, x_3);
x_4 = l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1(x_0, x_1, x_2, x_3);
lean::dec(x_0);
lean::dec(x_1);
return x_4;
}
}
obj* l_Lean_IR_Log_format___boxed(obj* x_0) {
_start:
{
obj* x_1;
x_1 = l_Lean_IR_Log_format(x_0);
lean::dec(x_0);
return x_1;
}
}
namespace lean {
namespace ir {
obj* log_to_string_core(obj* x_0) {
_start:
{
obj* x_1; obj* x_2; obj* x_3; obj* x_5; obj* x_6;
x_1 = lean::mk_nat_obj(0ul);
x_2 = lean::box(0);
x_3 = l_Array_miterateAux___main___at_Lean_IR_Log_format___spec__1(x_0, x_0, x_1, x_2);
lean::dec(x_0);
x_5 = l_Lean_Options_empty;
x_6 = l_Lean_Format_pretty(x_3, x_5);
return x_6;
}
}
}}
obj* l_Lean_IR_log(obj* x_0, obj* x_1, obj* x_2) {
_start:
{