lean4-htt/library/init/native/pass.lean
Jared Roesch e65d90ac79 feat(*): C++ code generator
in progress move of Lean.native to init
2016-12-05 16:11:41 -08:00

53 lines
1.8 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2016 Jared Roesch. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jared Roesch
-/
prelude
import init.meta.expr
import init.meta.format
import init.native.internal
import init.native.procedure
import init.native.config
namespace native
meta structure pass :=
(name : string)
(transform : config → procedure → procedure)
meta def file_name_for_dump (p : pass) :=
(pass.name p)
-- Unit functions get optimized away, need to talk to Leo about this one.
meta def run_pass (conf : config) (p : pass) (proc : procedure) : (format × procedure × format) :=
let result := pass.transform p conf proc in
(to_string proc, result, to_string result)
meta def collect_dumps {A : Type} : list (format × A × format) → format × list A × format
| [] := (format.nil, [], format.nil)
| ((pre, body, post) :: fs) :=
let (pre', bodies, post') := collect_dumps fs
in (pre ++ format.line ++ format.line ++ pre',
body :: bodies,
post ++ format.line ++ format.line ++ post')
meta def inner_loop_debug (conf : config) (p : pass) (es : list procedure) : list procedure :=
let (pre, bodies, post) := collect_dumps (list.map (fun e, run_pass conf p e) es) in
match native.dump_format (file_name_for_dump p ++ ".pre") pre with
| n := match native.dump_format (file_name_for_dump p ++ ".post") post with
| m := if n = m then bodies else bodies
end
end
meta def inner_loop (conf : config) (p : pass) (es : list procedure) : list procedure :=
if config.debug conf
then inner_loop_debug conf p es
else list.map (fun proc, pass.transform p conf proc) es
meta def run_passes (conf : config) (passes : list pass) (procs : list procedure) : list procedure :=
list.foldl (fun pass procs, inner_loop conf procs pass) procs passes
end native