Skip to content

Commit 13d51f4

Browse files
committed
rustc_driver: add -Z pretty-dump-dir to specify a directory for bulk --pretty dumps.
1 parent d12d316 commit 13d51f4

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

src/librustc/session/config.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
582582
"Include all dataflow analysis data in --pretty flowgraph output"),
583583
pretty_keep_going: bool = (false, parse_bool,
584584
"Do not stop after pretty-printing (use with --pretty)"),
585+
pretty_dump_dir: Option<String> = (None, parse_opt_string,
586+
"The directory where --pretty output will be saved"),
585587
print_region_graph: bool = (false, parse_bool,
586588
"Prints region inference graph. \
587589
Use with RUST_REGION_GRAPH=help for more info"),

src/librustc_driver/driver.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ pub fn compile_input(sess: Session,
108108
&sess,
109109
outdir,
110110
output,
111+
&outputs,
111112
&expanded_crate,
112113
&id[..]));
113114

@@ -122,6 +123,7 @@ pub fn compile_input(sess: Session,
122123
&sess,
123124
outdir,
124125
output,
126+
&outputs,
125127
&ast_map,
126128
&ast_map.krate(),
127129
&id[..]));
@@ -137,6 +139,7 @@ pub fn compile_input(sess: Session,
137139
&analysis.ty_cx.sess,
138140
outdir,
139141
output,
142+
&outputs,
140143
analysis.ty_cx.map.krate(),
141144
&analysis,
142145
&analysis.ty_cx));
@@ -164,6 +167,7 @@ pub fn compile_input(sess: Session,
164167
&sess,
165168
outdir,
166169
output,
170+
&outputs,
167171
&trans));
168172

169173
phase_6_link_output(&sess, &trans, &outputs);
@@ -259,17 +263,18 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
259263
fn empty(input: &'a Input,
260264
session: &'a Session,
261265
out_dir: &'a Option<Path>,
262-
output: &'a Option<Path>)
266+
output: &'a Option<Path>,
267+
output_filenames: Option<&'a OutputFilenames>)
263268
-> CompileState<'a, 'tcx> {
264269
CompileState {
265270
input: input,
266271
session: session,
267272
out_dir: out_dir.as_ref(),
268273
output: output.as_ref(),
274+
output_filenames: output_filenames,
269275
cfg: None,
270276
krate: None,
271277
crate_name: None,
272-
output_filenames: None,
273278
expanded_crate: None,
274279
ast_map: None,
275280
analysis: None,
@@ -286,28 +291,31 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
286291
-> CompileState<'a, 'tcx> {
287292
CompileState {
288293
krate: Some(krate),
289-
.. CompileState::empty(input, session, out_dir, output)
294+
.. CompileState::empty(input, session, out_dir, output, None)
290295
}
291296
}
292297

293298
fn state_after_expand(input: &'a Input,
294299
session: &'a Session,
295300
out_dir: &'a Option<Path>,
296301
output: &'a Option<Path>,
302+
output_filenames: &'a OutputFilenames,
297303
expanded_crate: &'a ast::Crate,
298304
crate_name: &'a str)
299305
-> CompileState<'a, 'tcx> {
300306
CompileState {
301307
crate_name: Some(crate_name),
302308
expanded_crate: Some(expanded_crate),
303-
.. CompileState::empty(input, session, out_dir, output)
309+
.. CompileState::empty(input, session, out_dir, output,
310+
Some(output_filenames))
304311
}
305312
}
306313

307314
fn state_after_write_deps(input: &'a Input,
308315
session: &'a Session,
309316
out_dir: &'a Option<Path>,
310317
output: &'a Option<Path>,
318+
output_filenames: &'a OutputFilenames,
311319
ast_map: &'a ast_map::Map<'tcx>,
312320
expanded_crate: &'a ast::Crate,
313321
crate_name: &'a str)
@@ -316,14 +324,16 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
316324
crate_name: Some(crate_name),
317325
ast_map: Some(ast_map),
318326
expanded_crate: Some(expanded_crate),
319-
.. CompileState::empty(input, session, out_dir, output)
327+
.. CompileState::empty(input, session, out_dir, output,
328+
Some(output_filenames))
320329
}
321330
}
322331

323332
fn state_after_analysis(input: &'a Input,
324333
session: &'a Session,
325334
out_dir: &'a Option<Path>,
326335
output: &'a Option<Path>,
336+
output_filenames: &'a OutputFilenames,
327337
expanded_crate: &'a ast::Crate,
328338
analysis: &'a ty::CrateAnalysis<'tcx>,
329339
tcx: &'a ty::ctxt<'tcx>)
@@ -332,7 +342,8 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
332342
analysis: Some(analysis),
333343
tcx: Some(tcx),
334344
expanded_crate: Some(expanded_crate),
335-
.. CompileState::empty(input, session, out_dir, output)
345+
.. CompileState::empty(input, session, out_dir, output,
346+
Some(output_filenames))
336347
}
337348
}
338349

@@ -341,11 +352,13 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> {
341352
session: &'a Session,
342353
out_dir: &'a Option<Path>,
343354
output: &'a Option<Path>,
355+
output_filenames: &'a OutputFilenames,
344356
trans: &'a trans::CrateTranslation)
345357
-> CompileState<'a, 'tcx> {
346358
CompileState {
347359
trans: Some(trans),
348-
.. CompileState::empty(input, session, out_dir, output)
360+
.. CompileState::empty(input, session, out_dir, output,
361+
Some(output_filenames))
349362
}
350363
}
351364
}

src/librustc_driver/lib.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ use std::cmp::Ordering::Equal;
7676
use std::old_io::{self, stdio};
7777
use std::iter::repeat;
7878
use std::env;
79+
use std::os;
7980
use std::sync::mpsc::channel;
8081
use std::thread;
8182

@@ -235,7 +236,8 @@ pub trait CompilerCalls<'a> {
235236
// CompilerCalls instance for a regular rustc build.
236237
pub struct RustcDefaultCalls {
237238
save_analysis: bool,
238-
pretty_print: Option<(PpMode, Option<UserIdentifiedItem>)>
239+
pretty_print: Option<(PpMode, Option<UserIdentifiedItem>)>,
240+
pretty_dump_dir: Option<Path>
239241
}
240242

241243
impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
@@ -310,6 +312,12 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
310312
}));
311313
}
312314

315+
if let Some(ref dir) = sess.opts.debugging_opts.pretty_dump_dir {
316+
let pretty_dump_dir = os::getcwd().unwrap().join(dir);
317+
assert!(pretty_dump_dir.is_absolute());
318+
self.pretty_dump_dir = Some(pretty_dump_dir);
319+
}
320+
313321
RustcDefaultCalls::print_crate_info(sess, Some(input), odir, ofile).and_then(
314322
|| RustcDefaultCalls::list_metadata(sess, matches, input))
315323
}
@@ -338,8 +346,30 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
338346
if let Some((ppm, opt_uii)) = self.pretty_print.take() {
339347
let phase = pretty::printing_phase(&mut control, ppm, opt_uii.as_ref());
340348

349+
let dump_dir = self.pretty_dump_dir.take();
341350
phase.callback = box move |state| {
342-
let output = state.output;
351+
let pretty_output_path;
352+
let output = if let Some(ref dir) = dump_dir {
353+
let file_path = if let Some(outputs) = state.output_filenames {
354+
outputs.with_extension("rs")
355+
} else {
356+
state.session.fatal(
357+
"-Z pretty-dump-dir cannot be used with --pretty \
358+
options that print before expansion");
359+
};
360+
let file_path = os::getcwd().unwrap().join(&file_path);
361+
assert!(file_path.is_absolute());
362+
363+
// Cheap isomorphism: /foo/bar--bar/baz <-> foo--bar----bar--baz.
364+
let components: Vec<_> = file_path.components().map(|bytes| {
365+
String::from_utf8_lossy(bytes).replace("--", "----")
366+
}).collect();
367+
368+
pretty_output_path = dir.join(components.connect("--"));
369+
Some(&pretty_output_path)
370+
} else {
371+
state.output
372+
};
343373
pretty::print_from_phase(state, ppm, opt_uii.as_ref(), output).unwrap();
344374
};
345375

@@ -368,7 +398,8 @@ impl RustcDefaultCalls {
368398
pub fn new() -> RustcDefaultCalls {
369399
RustcDefaultCalls {
370400
save_analysis: false,
371-
pretty_print: None
401+
pretty_print: None,
402+
pretty_dump_dir: None
372403
}
373404
}
374405

0 commit comments

Comments
 (0)