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,