Skip to content

Commit adfacc5

Browse files
committed
rustc: Add a --time-passes option
1 parent f0d24ff commit adfacc5

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

src/comp/driver/rustc.rs

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import front.creader;
44
import front.parser;
55
import front.token;
66
import front.eval;
7+
import front.ast;
78
import middle.trans;
89
import middle.resolve;
910
import middle.capture;
@@ -19,6 +20,7 @@ import std.option.none;
1920
import std._str;
2021
import std._vec;
2122
import std.io;
23+
import std.Time;
2224

2325
import std.GetOpts;
2426
import std.GetOpts.optopt;
@@ -52,7 +54,7 @@ fn default_environment(session.session sess,
5254

5355
fn parse_input(session.session sess,
5456
parser.parser p,
55-
str input) -> @front.ast.crate {
57+
str input) -> @ast.crate {
5658
if (_str.ends_with(input, ".rc")) {
5759
ret parser.parse_crate_from_crate_file(p);
5860
} else if (_str.ends_with(input, ".rs")) {
@@ -62,6 +64,18 @@ fn parse_input(session.session sess,
6264
fail;
6365
}
6466

67+
fn time[T](bool do_it, str what, fn()->T thunk) -> T {
68+
if (!do_it) { ret thunk(); }
69+
70+
auto start = Time.get_time();
71+
auto rv = thunk();
72+
auto end = Time.get_time();
73+
74+
// FIXME: Actually do timeval math.
75+
log_err #fmt("time: %s took %u s", what, (end.sec - start.sec) as uint);
76+
ret rv;
77+
}
78+
6579
fn compile_input(session.session sess,
6680
eval.env env,
6781
str input, str output,
@@ -70,23 +84,34 @@ fn compile_input(session.session sess,
7084
bool verify,
7185
bool save_temps,
7286
trans.output_type ot,
87+
bool time_passes,
7388
vec[str] library_search_paths) {
7489
auto def = tup(0, 0);
7590
auto p = parser.new_parser(sess, env, def, input, 0u);
76-
auto crate = parse_input(sess, p, input);
91+
auto crate = time[@ast.crate](time_passes, "parsing",
92+
bind parse_input(sess, p, input));
7793
if (ot == trans.output_type_none) {ret;}
7894

79-
crate = creader.read_crates(sess, crate, library_search_paths);
80-
crate = resolve.resolve_crate(sess, crate);
81-
capture.check_for_captures(sess, crate);
95+
crate = time[@ast.crate](time_passes, "external crate reading",
96+
bind creader.read_crates(sess, crate, library_search_paths));
97+
crate = time[@ast.crate](time_passes, "resolution",
98+
bind resolve.resolve_crate(sess, crate));
99+
time[()](time_passes, "capture checking",
100+
bind capture.check_for_captures(sess, crate));
82101

83102
auto ty_cx = ty.mk_ctxt(sess);
84-
auto typeck_result = typeck.check_crate(ty_cx, crate);
103+
auto typeck_result =
104+
time[typeck.typecheck_result](time_passes, "typechecking",
105+
bind typeck.check_crate(ty_cx, crate));
85106
crate = typeck_result._0;
86107
auto type_cache = typeck_result._1;
87-
crate = typestate_check.check_crate(crate);
88-
trans.trans_crate(sess, crate, ty_cx, type_cache, output, shared,
89-
optimize, verify, save_temps, ot);
108+
109+
crate = time[@ast.crate](time_passes, "typestate checking",
110+
bind typestate_check.check_crate(crate));
111+
112+
time[()](time_passes, "translation",
113+
bind trans.trans_crate(sess, crate, ty_cx, type_cache, output, shared,
114+
optimize, verify, save_temps, ot));
90115
}
91116

92117
fn pretty_print_input(session.session sess,
@@ -114,6 +139,7 @@ options:
114139
-S compile only; do not assemble or link
115140
-c compile and assemble, but do not link
116141
--save-temps write intermediate files in addition to normal output
142+
--time-passes time the individual phases of the compiler
117143
-h display this message\n\n");
118144
}
119145

@@ -135,15 +161,16 @@ fn main(vec[str] args) {
135161

136162
auto crate_cache = common.new_int_hash[session.crate_metadata]();
137163
auto target_crate_num = 0;
138-
let vec[@front.ast.meta_item] md = vec();
164+
let vec[@ast.meta_item] md = vec();
139165
auto sess = session.session(target_crate_num, target_cfg, crate_cache,
140166
md, front.codemap.new_codemap());
141167

142168
auto opts = vec(optflag("h"), optflag("glue"),
143169
optflag("pretty"), optflag("ls"), optflag("parse-only"),
144170
optflag("O"), optflag("shared"), optmulti("L"),
145171
optflag("S"), optflag("c"), optopt("o"),
146-
optflag("save-temps"), optflag("noverify"));
172+
optflag("save-temps"), optflag("time-passes"),
173+
optflag("noverify"));
147174
auto binary = _vec.shift[str](args);
148175
auto match;
149176
alt (GetOpts.getopts(args, opts)) {
@@ -173,6 +200,7 @@ fn main(vec[str] args) {
173200
auto save_temps = opt_present(match, "save-temps");
174201
// FIXME: Maybe we should support -O0, -O1, -Os, etc
175202
auto optimize = opt_present(match, "O");
203+
auto time_passes = opt_present(match, "time-passes");
176204
auto n_inputs = _vec.len[str](match.free);
177205

178206
if (glue) {
@@ -205,12 +233,12 @@ fn main(vec[str] args) {
205233
auto ofile = _str.concat(parts);
206234
compile_input(sess, env, ifile, ofile, shared,
207235
optimize, verify, save_temps, ot,
208-
library_search_paths);
236+
time_passes, library_search_paths);
209237
}
210238
case (some[str](?ofile)) {
211239
compile_input(sess, env, ifile, ofile, shared,
212240
optimize, verify, save_temps, ot,
213-
library_search_paths);
241+
time_passes, library_search_paths);
214242
}
215243
}
216244
}

src/comp/middle/trans.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7661,7 +7661,7 @@ fn create_crate_map(@crate_ctxt ccx) -> ValueRef {
76617661
}
76627662

76637663
fn trans_crate(session.session sess, @ast.crate crate, ty.ctxt tcx,
7664-
&ty.type_cache type_cache, str output, bool shared,
7664+
ty.type_cache type_cache, str output, bool shared,
76657665
bool optimize, bool verify, bool save_temps, output_type ot) {
76667666
auto llmod =
76677667
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),

0 commit comments

Comments
 (0)