Skip to content

Commit b4a3fe2

Browse files
committed
librustc: drop AST before running LLVM, frees 400mb on a librustc build
1 parent 6264df5 commit b4a3fe2

File tree

4 files changed

+60
-56
lines changed

4 files changed

+60
-56
lines changed

src/librustc/driver/driver.rs

+54-51
Original file line numberDiff line numberDiff line change
@@ -172,73 +172,75 @@ pub enum compile_upto {
172172

173173
// For continuing compilation after a parsed crate has been
174174
// modified
175+
176+
175177
#[fixed_stack_segment]
176178
pub fn compile_rest(sess: Session,
177179
cfg: ast::crate_cfg,
178180
upto: compile_upto,
179181
outputs: Option<@OutputFilenames>,
180182
curr: Option<@ast::crate>)
181-
-> (@ast::crate, Option<ty::ctxt>) {
183+
-> (Option<@ast::crate>, Option<ty::ctxt>) {
184+
182185
let time_passes = sess.time_passes();
183-
let mut crate = curr.get();
184186

185-
*sess.building_library = session::building_library(
186-
sess.opts.crate_type, crate, sess.opts.test);
187+
let (llmod, link_meta) = {
187188

188-
crate = time(time_passes, ~"expansion", ||
189-
syntax::ext::expand::expand_crate(sess.parse_sess, copy cfg,
190-
crate));
189+
let mut crate = curr.unwrap();
191190

192-
crate = time(time_passes, ~"configuration", ||
193-
front::config::strip_unconfigured_items(crate));
191+
*sess.building_library = session::building_library(
192+
sess.opts.crate_type, crate, sess.opts.test);
194193

195-
crate = time(time_passes, ~"maybe building test harness", ||
196-
front::test::modify_for_testing(sess, crate));
194+
crate = time(time_passes, ~"expansion", ||
195+
syntax::ext::expand::expand_crate(sess.parse_sess, copy cfg,
196+
crate));
197197

198-
if upto == cu_expand { return (crate, None); }
198+
crate = time(time_passes, ~"configuration", ||
199+
front::config::strip_unconfigured_items(crate));
199200

200-
crate = time(time_passes, ~"intrinsic injection", ||
201-
front::intrinsic_inject::inject_intrinsic(sess, crate));
201+
crate = time(time_passes, ~"maybe building test harness", ||
202+
front::test::modify_for_testing(sess, crate));
202203

203-
crate = time(time_passes, ~"extra injection", ||
204-
front::std_inject::maybe_inject_libstd_ref(sess, crate));
204+
if upto == cu_expand { return (Some(crate), None); }
205205

206-
let ast_map = time(time_passes, ~"ast indexing", ||
207-
syntax::ast_map::map_crate(sess.diagnostic(), crate));
206+
crate = time(time_passes, ~"intrinsic injection", ||
207+
front::intrinsic_inject::inject_intrinsic(sess, crate));
208208

209-
time(time_passes, ~"external crate/lib resolution", ||
210-
creader::read_crates(sess.diagnostic(), crate, sess.cstore,
211-
sess.filesearch,
212-
session::sess_os_to_meta_os(sess.targ_cfg.os),
213-
sess.opts.is_static,
214-
sess.parse_sess.interner));
209+
crate = time(time_passes, ~"extra injection", ||
210+
front::std_inject::maybe_inject_libstd_ref(sess, crate));
215211

216-
let lang_items = time(time_passes, ~"language item collection", ||
217-
middle::lang_items::collect_language_items(crate, sess));
212+
let ast_map = time(time_passes, ~"ast indexing", ||
213+
syntax::ast_map::map_crate(sess.diagnostic(), crate));
218214

219-
let middle::resolve::CrateMap {
220-
def_map: def_map,
221-
exp_map2: exp_map2,
222-
trait_map: trait_map
223-
} =
224-
time(time_passes, ~"resolution", ||
225-
middle::resolve::resolve_crate(sess, lang_items, crate));
215+
time(time_passes, ~"external crate/lib resolution", ||
216+
creader::read_crates(sess.diagnostic(), crate, sess.cstore,
217+
sess.filesearch,
218+
session::sess_os_to_meta_os(sess.targ_cfg.os),
219+
sess.opts.is_static,
220+
sess.parse_sess.interner));
226221

227-
time(time_passes, ~"looking for entry point",
228-
|| middle::entry::find_entry_point(sess, crate, ast_map));
222+
let lang_items = time(time_passes, ~"language item collection", ||
223+
middle::lang_items::collect_language_items(crate, sess));
229224

230-
let freevars = time(time_passes, ~"freevar finding", ||
231-
freevars::annotate_freevars(def_map, crate));
225+
let middle::resolve::CrateMap {
226+
def_map: def_map,
227+
exp_map2: exp_map2,
228+
trait_map: trait_map
229+
} =
230+
time(time_passes, ~"resolution", ||
231+
middle::resolve::resolve_crate(sess, lang_items, crate));
232232

233-
let region_map = time(time_passes, ~"region resolution", ||
234-
middle::region::resolve_crate(sess, def_map, crate));
233+
time(time_passes, ~"looking for entry point",
234+
|| middle::entry::find_entry_point(sess, crate, ast_map));
235235

236-
let rp_set = time(time_passes, ~"region parameterization inference", ||
237-
middle::region::determine_rp_in_crate(sess, ast_map, def_map, crate));
236+
let freevars = time(time_passes, ~"freevar finding", ||
237+
freevars::annotate_freevars(def_map, crate));
238238

239-
let outputs = outputs.get();
239+
let region_map = time(time_passes, ~"region resolution", ||
240+
middle::region::resolve_crate(sess, def_map, crate));
240241

241-
let (llmod, link_meta) = {
242+
let rp_set = time(time_passes, ~"region parameterization inference", ||
243+
middle::region::determine_rp_in_crate(sess, ast_map, def_map, crate));
242244

243245
let ty_cx = ty::mk_ctxt(sess, def_map, ast_map, freevars,
244246
region_map, rp_set, lang_items);
@@ -255,7 +257,7 @@ pub fn compile_rest(sess: Session,
255257
middle::check_const::check_crate(sess, crate, ast_map, def_map,
256258
method_map, ty_cx));
257259

258-
if upto == cu_typeck { return (crate, Some(ty_cx)); }
260+
if upto == cu_typeck { return (Some(crate), Some(ty_cx)); }
259261

260262
time(time_passes, ~"privacy checking", ||
261263
middle::privacy::check_crate(ty_cx, &method_map, crate));
@@ -289,7 +291,7 @@ pub fn compile_rest(sess: Session,
289291
time(time_passes, ~"lint checking", ||
290292
lint::check_crate(ty_cx, crate));
291293

292-
if upto == cu_no_trans { return (crate, Some(ty_cx)); }
294+
if upto == cu_no_trans { return (Some(crate), Some(ty_cx)); }
293295

294296
let maps = astencode::Maps {
295297
root_map: root_map,
@@ -300,13 +302,14 @@ pub fn compile_rest(sess: Session,
300302
capture_map: capture_map
301303
};
302304

305+
let outputs = outputs.get_ref();
303306
time(time_passes, ~"translation", ||
304307
trans::base::trans_crate(sess, crate, ty_cx,
305308
&outputs.obj_filename,
306309
exp_map2, maps))
307-
308310
};
309311

312+
let outputs = outputs.get_ref();
310313
if (sess.opts.debugging_opts & session::print_link_args) != 0 {
311314
io::println(str::connect(link::link_args(sess,
312315
&outputs.obj_filename, &outputs.out_filename, link_meta), " "));
@@ -335,24 +338,24 @@ pub fn compile_rest(sess: Session,
335338
(sess.opts.is_static && *sess.building_library) ||
336339
sess.opts.jit;
337340

338-
if stop_after_codegen { return (crate, None); }
341+
if stop_after_codegen { return (None, None); }
339342

340343
time(time_passes, ~"linking", ||
341344
link::link_binary(sess,
342345
&outputs.obj_filename,
343346
&outputs.out_filename, link_meta));
344347

345-
return (crate, None);
348+
return (None, None);
346349
}
347350

348351
pub fn compile_upto(sess: Session, cfg: ast::crate_cfg,
349352
input: &input, upto: compile_upto,
350353
outputs: Option<@OutputFilenames>)
351-
-> (@ast::crate, Option<ty::ctxt>) {
354+
-> (Option<@ast::crate>, Option<ty::ctxt>) {
352355
let time_passes = sess.time_passes();
353356
let crate = time(time_passes, ~"parsing",
354357
|| parse_input(sess, copy cfg, input) );
355-
if upto == cu_parse { return (crate, None); }
358+
if upto == cu_parse { return (Some(crate), None); }
356359

357360
compile_rest(sess, cfg, upto, outputs, Some(crate))
358361
}
@@ -437,7 +440,7 @@ pub fn pretty_print_input(sess: Session, cfg: ast::crate_cfg, input: &input,
437440
let src = sess.codemap.get_filemap(source_name(input)).src;
438441
do io::with_str_reader(*src) |rdr| {
439442
pprust::print_crate(sess.codemap, sess.parse_sess.interner,
440-
sess.span_diagnostic, crate,
443+
sess.span_diagnostic, crate.unwrap(),
441444
source_name(input),
442445
rdr, io::stdout(), ann, is_expanded);
443446
}

src/librusti/rusti.rc

+4-3
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,10 @@ fn run(repl: Repl, input: ~str) -> Repl {
144144

145145
let outputs = driver::build_output_filenames(&wrapped, &None, &None, sess);
146146
debug!("calling compile_upto");
147-
let (crate, _) = driver::compile_upto(sess, cfg, &wrapped,
148-
driver::cu_everything,
149-
Some(outputs));
147+
148+
let crate = driver::parse_input(sess, copy cfg, &wrapped);
149+
driver::compile_rest(sess, cfg, driver::cu_everything,
150+
Some(outputs), Some(crate));
150151

151152
let mut opt = None;
152153

src/librustpkg/rustpkg.rc

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl<'self> PkgScript<'self> {
101101
input: input,
102102
sess: sess,
103103
cfg: cfg,
104-
crate: crate,
104+
crate: crate.unwrap(),
105105
build_dir: work_dir
106106
}
107107
}

src/librustpkg/util.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ pub fn compile_crate_from_input(input: &driver::input,
426426
debug!("Calling compile_upto, outputs = %?", outputs);
427427
let (crate, _) = driver::compile_upto(sess, copy cfg, input,
428428
driver::cu_parse, Some(outputs));
429-
let mut crate = crate;
429+
let mut crate = crate.unwrap();
430430

431431
debug!("About to inject link_meta info...");
432432
// Inject the inferred link_meta info if it's not already there

0 commit comments

Comments
 (0)