Move codegen_and_build_linker from Queries to Linker
This commit is contained in:
parent
8127461b0e
commit
bd2ff518ce
4 changed files with 40 additions and 34 deletions
|
@ -30,7 +30,7 @@ use rustc_errors::{
|
||||||
};
|
};
|
||||||
use rustc_feature::find_gated_cfg;
|
use rustc_feature::find_gated_cfg;
|
||||||
use rustc_interface::util::{self, get_codegen_backend};
|
use rustc_interface::util::{self, get_codegen_backend};
|
||||||
use rustc_interface::{interface, passes, Queries};
|
use rustc_interface::{interface, passes, Linker, Queries};
|
||||||
use rustc_lint::unerased_lint_store;
|
use rustc_lint::unerased_lint_store;
|
||||||
use rustc_metadata::creader::MetadataLoader;
|
use rustc_metadata::creader::MetadataLoader;
|
||||||
use rustc_metadata::locator;
|
use rustc_metadata::locator;
|
||||||
|
@ -447,7 +447,9 @@ fn run_compiler(
|
||||||
return early_exit();
|
return early_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(queries.codegen_and_build_linker()?))
|
queries.global_ctxt()?.enter(|tcx| {
|
||||||
|
Ok(Some(Linker::codegen_and_build_linker(tcx, &*compiler.codegen_backend)?))
|
||||||
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Linking is done outside the `compiler.enter()` so that the
|
// Linking is done outside the `compiler.enter()` so that the
|
||||||
|
|
|
@ -16,7 +16,7 @@ pub mod util;
|
||||||
pub use callbacks::setup_callbacks;
|
pub use callbacks::setup_callbacks;
|
||||||
pub use interface::{run_compiler, Config};
|
pub use interface::{run_compiler, Config};
|
||||||
pub use passes::DEFAULT_QUERY_PROVIDERS;
|
pub use passes::DEFAULT_QUERY_PROVIDERS;
|
||||||
pub use queries::Queries;
|
pub use queries::{Linker, Queries};
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
|
@ -116,35 +116,6 @@ impl<'tcx> Queries<'tcx> {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn codegen_and_build_linker(&'tcx self) -> Result<Linker> {
|
|
||||||
self.global_ctxt()?.enter(|tcx| {
|
|
||||||
let ongoing_codegen = passes::start_codegen(&*self.compiler.codegen_backend, tcx)?;
|
|
||||||
|
|
||||||
// This must run after monomorphization so that all generic types
|
|
||||||
// have been instantiated.
|
|
||||||
if tcx.sess.opts.unstable_opts.print_type_sizes {
|
|
||||||
tcx.sess.code_stats.print_type_sizes();
|
|
||||||
}
|
|
||||||
|
|
||||||
if tcx.sess.opts.unstable_opts.print_vtable_sizes {
|
|
||||||
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
|
||||||
|
|
||||||
tcx.sess.code_stats.print_vtable_sizes(crate_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Linker {
|
|
||||||
dep_graph: tcx.dep_graph.clone(),
|
|
||||||
output_filenames: tcx.output_filenames(()).clone(),
|
|
||||||
crate_hash: if tcx.needs_crate_hash() {
|
|
||||||
Some(tcx.crate_hash(LOCAL_CRATE))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
},
|
|
||||||
ongoing_codegen,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Linker {
|
pub struct Linker {
|
||||||
|
@ -156,6 +127,36 @@ pub struct Linker {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Linker {
|
impl Linker {
|
||||||
|
pub fn codegen_and_build_linker(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
codegen_backend: &dyn CodegenBackend,
|
||||||
|
) -> Result<Linker> {
|
||||||
|
let ongoing_codegen = passes::start_codegen(codegen_backend, tcx)?;
|
||||||
|
|
||||||
|
// This must run after monomorphization so that all generic types
|
||||||
|
// have been instantiated.
|
||||||
|
if tcx.sess.opts.unstable_opts.print_type_sizes {
|
||||||
|
tcx.sess.code_stats.print_type_sizes();
|
||||||
|
}
|
||||||
|
|
||||||
|
if tcx.sess.opts.unstable_opts.print_vtable_sizes {
|
||||||
|
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
||||||
|
|
||||||
|
tcx.sess.code_stats.print_vtable_sizes(crate_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Linker {
|
||||||
|
dep_graph: tcx.dep_graph.clone(),
|
||||||
|
output_filenames: tcx.output_filenames(()).clone(),
|
||||||
|
crate_hash: if tcx.needs_crate_hash() {
|
||||||
|
Some(tcx.crate_hash(LOCAL_CRATE))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
ongoing_codegen,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn link(self, sess: &Session, codegen_backend: &dyn CodegenBackend) -> Result<()> {
|
pub fn link(self, sess: &Session, codegen_backend: &dyn CodegenBackend) -> Result<()> {
|
||||||
let (codegen_results, work_products) =
|
let (codegen_results, work_products) =
|
||||||
codegen_backend.join_codegen(self.ongoing_codegen, sess, &self.output_filenames);
|
codegen_backend.join_codegen(self.ongoing_codegen, sess, &self.output_filenames);
|
||||||
|
|
|
@ -17,6 +17,7 @@ extern crate rustc_span;
|
||||||
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use rustc_interface::Linker;
|
||||||
use rustc_interface::interface;
|
use rustc_interface::interface;
|
||||||
use rustc_session::config::{Input, Options, OutFileName, OutputType, OutputTypes};
|
use rustc_session::config::{Input, Options, OutFileName, OutputType, OutputTypes};
|
||||||
use rustc_span::FileName;
|
use rustc_span::FileName;
|
||||||
|
@ -78,8 +79,10 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf, linker: Option<&Path
|
||||||
|
|
||||||
interface::run_compiler(config, |compiler| {
|
interface::run_compiler(config, |compiler| {
|
||||||
let linker = compiler.enter(|queries| {
|
let linker = compiler.enter(|queries| {
|
||||||
queries.global_ctxt()?.enter(|tcx| tcx.analysis(()))?;
|
queries.global_ctxt()?.enter(|tcx| {
|
||||||
queries.codegen_and_build_linker()
|
tcx.analysis(())?;
|
||||||
|
Linker::codegen_and_build_linker(tcx, &*compiler.codegen_backend)
|
||||||
|
})
|
||||||
});
|
});
|
||||||
linker.unwrap().link(&compiler.sess, &*compiler.codegen_backend).unwrap();
|
linker.unwrap().link(&compiler.sess, &*compiler.codegen_backend).unwrap();
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue