aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-09-16 16:50:41 -0700
committerGraydon Hoare <[email protected]>2010-09-16 16:59:37 -0700
commit5536af3d48da5176bf4b473b54cb6b060c6eee68 (patch)
tree343f56056661cb5bab5f3f291238ed74b0d4dac4
parentCheck for infinitely sized tags. Un-XFAIL test/compile-fail/infinite-tag-type... (diff)
downloadrust-5536af3d48da5176bf4b473b54cb6b060c6eee68.tar.xz
rust-5536af3d48da5176bf4b473b54cb6b060c6eee68.zip
Beginnings of post-resolve simplify pass.
-rw-r--r--src/Makefile4
-rw-r--r--src/boot/driver/llvm/glue.ml1
-rw-r--r--src/boot/driver/main.ml4
-rw-r--r--src/boot/driver/session.ml1
-rw-r--r--src/boot/me/simplify.ml110
5 files changed, 118 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index 631798c7..673e5e75 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -233,8 +233,8 @@ BE_MLS := $(addprefix boot/be/, x86.ml ra.ml pe.ml elf.ml \
macho.ml)
IL_MLS := $(addprefix boot/be/, asm.ml il.ml abi.ml)
ME_MLS := $(addprefix boot/me/, walk.ml semant.ml resolve.ml alias.ml \
- type.ml dead.ml effect.ml typestate.ml loop.ml layout.ml \
- transutil.ml trans.ml dwarf.ml)
+ simplify.ml type.ml dead.ml effect.ml typestate.ml loop.ml \
+ layout.ml transutil.ml trans.ml dwarf.ml)
FE_MLS := $(addprefix boot/fe/, ast.ml token.ml lexer.ml parser.ml pexp.ml \
item.ml cexp.ml fuzz.ml)
DRIVER_TOP_MLS := $(addprefix boot/driver/, lib.ml $(VARIANT)/glue.ml main.ml)
diff --git a/src/boot/driver/llvm/glue.ml b/src/boot/driver/llvm/glue.ml
index 30fce0cd..03baf04d 100644
--- a/src/boot/driver/llvm/glue.ml
+++ b/src/boot/driver/llvm/glue.ml
@@ -15,6 +15,7 @@ let alt_pipeline sess sem_cx crate =
Array.iter process
[|
Resolve.process_crate;
+ Simplify.process_crate;
Type.process_crate;
Typestate.process_crate;
Effect.process_crate;
diff --git a/src/boot/driver/main.ml b/src/boot/driver/main.ml
index 32c70be6..e80e7682 100644
--- a/src/boot/driver/main.ml
+++ b/src/boot/driver/main.ml
@@ -34,6 +34,7 @@ let (sess:Session.sess) =
Session.sess_log_ast = false;
Session.sess_log_resolve = false;
Session.sess_log_type = false;
+ Session.sess_log_simplify = false;
Session.sess_log_effect = false;
Session.sess_log_typestate = false;
Session.sess_log_loop = false;
@@ -162,6 +163,8 @@ let argspecs =
"-lresolve" "log resolution");
(flag (fun _ -> sess.Session.sess_log_type <- true)
"-ltype" "log type checking");
+ (flag (fun _ -> sess.Session.sess_log_simplify <- true)
+ "-lsimplify" "log simplification");
(flag (fun _ -> sess.Session.sess_log_effect <- true)
"-leffect" "log effect checking");
(flag (fun _ -> sess.Session.sess_log_typestate <- true)
@@ -352,6 +355,7 @@ let main_pipeline _ =
proc sem_cx crate;
exit_if_failed ())
[| Resolve.process_crate;
+ Simplify.process_crate;
Type.process_crate;
Typestate.process_crate;
Effect.process_crate;
diff --git a/src/boot/driver/session.ml b/src/boot/driver/session.ml
index beb551bb..2f81e4f5 100644
--- a/src/boot/driver/session.ml
+++ b/src/boot/driver/session.ml
@@ -20,6 +20,7 @@ type sess =
mutable sess_log_ast: bool;
mutable sess_log_resolve: bool;
mutable sess_log_type: bool;
+ mutable sess_log_simplify: bool;
mutable sess_log_effect: bool;
mutable sess_log_typestate: bool;
mutable sess_log_dead: bool;
diff --git a/src/boot/me/simplify.ml b/src/boot/me/simplify.ml
new file mode 100644
index 00000000..ddc17e92
--- /dev/null
+++ b/src/boot/me/simplify.ml
@@ -0,0 +1,110 @@
+open Common;;
+open Semant;;
+
+let log cx =
+ Session.log
+ "simplify"
+ cx.Semant.ctxt_sess.Session.sess_log_simplify
+ cx.Semant.ctxt_sess.Session.sess_log_out
+
+let iflog cx thunk =
+ if cx.Semant.ctxt_sess.Session.sess_log_simplify
+ then thunk ()
+ else ()
+;;
+
+
+let plval_const_marking_visitor
+ (cx:Semant.ctxt)
+ (inner:Walk.visitor)
+ : Walk.visitor =
+ let visit_pexp_pre pexp =
+ begin
+ match pexp.node with
+ Ast.PEXP_lval pl ->
+ begin
+ let id = lval_base_id_to_defn_base_id cx pexp.id in
+ let is_const =
+ if defn_id_is_item cx id
+ then match (get_item cx id).Ast.decl_item with
+ Ast.MOD_ITEM_const _ -> true
+ | _ -> false
+ else false
+ in
+ iflog cx (fun _ -> log cx "plval %a refers to %s"
+ Ast.sprintf_plval pl
+ (if is_const then "const item" else "non-const"));
+ htab_put cx.ctxt_plval_const pexp.id is_const
+ end
+ | _ -> ()
+ end;
+ inner.Walk.visit_pexp_pre pexp
+ in
+
+ let visit_pexp_post p =
+ inner.Walk.visit_pexp_post p;
+ iflog cx (fun _ -> log cx "pexp %a is %s"
+ Ast.sprintf_pexp p
+ (if pexp_is_const cx p
+ then "constant"
+ else "non-constant"))
+ in
+
+ { inner with
+ Walk.visit_pexp_pre = visit_pexp_pre;
+ Walk.visit_pexp_post = visit_pexp_post;
+ }
+;;
+
+
+let pexp_simplifying_visitor
+ (_:Semant.ctxt)
+ (inner:Walk.visitor)
+ : Walk.visitor =
+
+ let walk_atom at =
+ match at with
+ Ast.ATOM_pexp _ ->
+ begin
+ (* FIXME: move desugaring code from frontend to here. *)
+ ()
+ end
+ | _ -> ()
+ in
+
+ let visit_stmt_pre s =
+ begin
+ match s.node with
+ Ast.STMT_copy (_, Ast.EXPR_atom a) -> walk_atom a
+ | _ -> ()
+ end;
+ inner.Walk.visit_stmt_pre s;
+ in
+ { inner with
+ Walk.visit_stmt_pre = visit_stmt_pre;
+ }
+;;
+
+
+let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
+ let path = Stack.create () in
+
+ let passes =
+ [|
+ (plval_const_marking_visitor cx Walk.empty_visitor);
+ (pexp_simplifying_visitor cx Walk.empty_visitor)
+ |]
+ in
+ let log_flag = cx.Semant.ctxt_sess.Session.sess_log_simplify in
+ Semant.run_passes cx "simplify" path passes log_flag log crate
+;;
+
+(*
+ * Local Variables:
+ * fill-column: 78;
+ * indent-tabs-mode: nil
+ * buffer-file-coding-system: utf-8-unix
+ * compile-command: "make -k -C ../.. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
+ * End:
+ *)
+