Skip to content

Commit 5098ba6

Browse files
committed
Move linking ouside the interface queries.
1 parent 266ede1 commit 5098ba6

File tree

2 files changed

+67
-32
lines changed

2 files changed

+67
-32
lines changed

src/librustc_driver/lib.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ pub fn run_compiler(
283283
return sess.compile_status();
284284
}
285285

286-
compiler.enter(|queries| {
286+
let linker = compiler.enter(|queries| {
287287
queries.parse()?;
288288

289289
if let Some(ppm) = &sess.opts.pretty {
@@ -309,17 +309,20 @@ pub fn run_compiler(
309309
compiler.output_file().as_ref().map(|p| &**p),
310310
);
311311
}
312-
return sess.compile_status();
312+
sess.compile_status()?;
313+
return Ok(None);
313314
}
314315

315316
if callbacks.after_parsing(compiler) == Compilation::Stop {
316-
return sess.compile_status();
317+
sess.compile_status()?;
318+
return Ok(None);
317319
}
318320

319321
if sess.opts.debugging_opts.parse_only ||
320322
sess.opts.debugging_opts.show_span.is_some() ||
321323
sess.opts.debugging_opts.ast_json_noexpand {
322-
return sess.compile_status();
324+
sess.compile_status()?;
325+
return Ok(None);
323326
}
324327

325328
{
@@ -328,28 +331,32 @@ pub fn run_compiler(
328331
// Lint plugins are registered; now we can process command line flags.
329332
if sess.opts.describe_lints {
330333
describe_lints(&sess, &lint_store, true);
331-
return sess.compile_status();
334+
sess.compile_status()?;
335+
return Ok(None);
332336
}
333337
}
334338

335339
queries.expansion()?;
336340
if callbacks.after_expansion(compiler) == Compilation::Stop {
337-
return sess.compile_status();
341+
sess.compile_status()?;
342+
return Ok(None);
338343
}
339344

340345
queries.prepare_outputs()?;
341346

342347
if sess.opts.output_types.contains_key(&OutputType::DepInfo)
343348
&& sess.opts.output_types.len() == 1
344349
{
345-
return sess.compile_status();
350+
sess.compile_status()?;
351+
return Ok(None);
346352
}
347353

348354
queries.global_ctxt()?;
349355

350356
if sess.opts.debugging_opts.no_analysis ||
351357
sess.opts.debugging_opts.ast_json {
352-
return sess.compile_status();
358+
sess.compile_status()?;
359+
return Ok(None);
353360
}
354361

355362
if sess.opts.debugging_opts.save_analysis {
@@ -381,7 +388,8 @@ pub fn run_compiler(
381388
queries.global_ctxt()?.peek_mut().enter(|tcx| tcx.analysis(LOCAL_CRATE))?;
382389

383390
if callbacks.after_analysis(compiler) == Compilation::Stop {
384-
return sess.compile_status();
391+
sess.compile_status()?;
392+
return Ok(None);
385393
}
386394

387395
if sess.opts.debugging_opts.save_analysis {
@@ -397,11 +405,14 @@ pub fn run_compiler(
397405
sess.code_stats.print_type_sizes();
398406
}
399407

400-
queries.link()?;
401-
402-
Ok(())
408+
let linker = queries.linker()?;
409+
Ok(Some(linker))
403410
})?;
404411

412+
if let Some(linker) = linker {
413+
linker.link()?
414+
}
415+
405416
if sess.opts.debugging_opts.perf_stats {
406417
sess.print_perf_stats();
407418
}

src/librustc_interface/queries.rs

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ pub struct Queries<'comp> {
8181
prepare_outputs: Query<OutputFilenames>,
8282
global_ctxt: Query<BoxedGlobalCtxt>,
8383
ongoing_codegen: Query<Box<dyn Any>>,
84-
link: Query<()>,
8584
}
8685

8786
impl<'comp> Queries<'comp> {
@@ -98,7 +97,6 @@ impl<'comp> Queries<'comp> {
9897
prepare_outputs: Default::default(),
9998
global_ctxt: Default::default(),
10099
ongoing_codegen: Default::default(),
101-
link: Default::default(),
102100
}
103101
}
104102

@@ -278,35 +276,54 @@ impl<'comp> Queries<'comp> {
278276
})
279277
}
280278

281-
pub fn link(&self) -> Result<&Query<()>> {
282-
self.link.compute(|| {
283-
let sess = self.session();
279+
pub fn linker(self) -> Result<Linker> {
280+
let dep_graph = self.dep_graph()?;
281+
let prepare_outputs = self.prepare_outputs()?;
282+
let ongoing_codegen = self.ongoing_codegen()?;
284283

285-
let ongoing_codegen = self.ongoing_codegen()?.take();
284+
let sess = self.session().clone();
285+
let codegen_backend = self.codegen_backend().clone();
286286

287-
self.codegen_backend().join_codegen_and_link(
288-
ongoing_codegen,
289-
sess,
290-
&*self.dep_graph()?.peek(),
291-
&*self.prepare_outputs()?.peek(),
292-
).map_err(|_| ErrorReported)?;
293-
294-
Ok(())
287+
Ok(Linker {
288+
sess,
289+
dep_graph: dep_graph.take(),
290+
prepare_outputs: prepare_outputs.take(),
291+
ongoing_codegen: ongoing_codegen.take(),
292+
codegen_backend,
295293
})
296294
}
297295
}
298296

297+
pub struct Linker {
298+
sess: Lrc<Session>,
299+
dep_graph: DepGraph,
300+
prepare_outputs: OutputFilenames,
301+
ongoing_codegen: Box<dyn Any>,
302+
codegen_backend: Lrc<Box<dyn CodegenBackend>>,
303+
}
304+
305+
impl Linker {
306+
pub fn link(self) -> Result<()> {
307+
self.codegen_backend.join_codegen_and_link(
308+
self.ongoing_codegen,
309+
&self.sess,
310+
&self.dep_graph,
311+
&self.prepare_outputs,
312+
).map_err(|_| ErrorReported)
313+
}
314+
}
315+
299316
impl Compiler {
300317
// This method is different to all the other methods in `Compiler` because
301318
// it lacks a `Queries` entry. It's also not currently used. It does serve
302319
// as an example of how `Compiler` can be used, with additional steps added
303320
// between some passes. And see `rustc_driver::run_compiler` for a more
304321
// complex example.
305322
pub fn enter<'c, F, T>(&'c self, f: F) -> Result<T>
306-
where F: for<'q> FnOnce(&'q Queries<'c>) -> Result<T>
323+
where F: FnOnce(Queries<'c>) -> Result<T>
307324
{
308325
let queries = Queries::new(&self);
309-
f(&queries)
326+
f(queries)
310327
}
311328

312329
// This method is different to all the other methods in `Compiler` because
@@ -315,13 +332,13 @@ impl Compiler {
315332
// between some passes. And see `rustc_driver::run_compiler` for a more
316333
// complex example.
317334
pub fn compile(&self) -> Result<()> {
318-
self.enter(|queries| {
335+
let linker = self.enter(|queries| {
319336
queries.prepare_outputs()?;
320337

321338
if self.session().opts.output_types.contains_key(&OutputType::DepInfo)
322339
&& self.session().opts.output_types.len() == 1
323340
{
324-
return Ok(())
341+
return Ok(None)
325342
}
326343

327344
queries.global_ctxt()?;
@@ -334,7 +351,14 @@ impl Compiler {
334351
// Drop GlobalCtxt after starting codegen to free memory.
335352
mem::drop(queries.global_ctxt()?.take());
336353

337-
queries.link().map(|_| ())
338-
})
354+
let linker = queries.linker()?;
355+
Ok(Some(linker))
356+
})?;
357+
358+
if let Some(linker) = linker {
359+
linker.link()?
360+
}
361+
362+
Ok(())
339363
}
340364
}

0 commit comments

Comments
 (0)