about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/comp/driver/rustc.rs33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 46865d10fa2..8f8b9d85d9b 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -98,6 +98,19 @@ fn time<@T>(do_it: bool, what: str, thunk: fn() -> T) -> T {
     ret rv;
 }
 
+// FIXME (issue #1005): Needed to work around a segfault. If |time| is used
+// instead, we crash.
+fn time_unit(do_it: bool, what: str, thunk: fn()) {
+    if !do_it { ret thunk(); }
+    let start = std::time::precise_time_s();
+    let rv = thunk();
+    let end = std::time::precise_time_s();
+    log_err #fmt["time: %s took %s s", what,
+                 common::float_to_str(end - start, 3u)];
+    ret rv;
+}
+
+
 fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
                  output: str) {
     let time_passes = sess.get_opts().time_passes;
@@ -119,8 +132,8 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
     let ast_map =
         time(time_passes, "ast indexing",
              bind middle::ast_map::map_crate(*crate));
-    time(time_passes, "external crate/lib resolution",
-         bind creader::read_crates(sess, *crate));
+    time_unit(time_passes, "external crate/lib resolution",
+              bind creader::read_crates(sess, *crate));
     let {def_map: def_map, ext_map: ext_map} =
         time(time_passes, "resolution",
              bind resolve::resolve_crate(sess, ast_map, crate));
@@ -128,12 +141,13 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
         time(time_passes, "freevar finding",
              bind freevars::annotate_freevars(def_map, crate));
     let ty_cx = ty::mk_ctxt(sess, def_map, ext_map, ast_map, freevars);
-    time(time_passes, "typechecking", bind typeck::check_crate(ty_cx, crate));
-    time(time_passes, "alt checking",
+    time_unit(time_passes, "typechecking", bind
+        typeck::check_crate(ty_cx, crate));
+    time_unit(time_passes, "alt checking",
          bind middle::check_alt::check_crate(ty_cx, crate));
     if sess.get_opts().run_typestate {
-        time(time_passes, "typestate checking",
-             bind middle::tstate::ck::check_crate(ty_cx, crate));
+        time_unit(time_passes, "typestate checking",
+                  bind middle::tstate::ck::check_crate(ty_cx, crate));
     }
     let mut_map =
         time(time_passes, "mutability checking",
@@ -141,14 +155,15 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
     let copy_map =
         time(time_passes, "alias checking",
              bind middle::alias::check_crate(ty_cx, crate));
-    time(time_passes, "kind checking", bind kind::check_crate(ty_cx, crate));
+    time_unit(time_passes, "kind checking",
+           bind kind::check_crate(ty_cx, crate));
     if sess.get_opts().no_trans { ret; }
     let llmod =
         time(time_passes, "translation",
              bind trans::trans_crate(sess, crate, ty_cx, output, ast_map,
                                      mut_map, copy_map));
-    time(time_passes, "LLVM passes",
-         bind link::write::run_passes(sess, llmod, output));
+    time_unit(time_passes, "LLVM passes",
+              bind link::write::run_passes(sess, llmod, output));
 }
 
 fn pretty_print_input(sess: session::session, cfg: ast::crate_cfg, input: str,