summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_interface/src/passes.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_interface/src/passes.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_interface/src/passes.rs')
-rw-r--r--compiler/rustc_interface/src/passes.rs86
1 files changed, 31 insertions, 55 deletions
diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs
index 0e8f93cef..7d14d088e 100644
--- a/compiler/rustc_interface/src/passes.rs
+++ b/compiler/rustc_interface/src/passes.rs
@@ -23,11 +23,10 @@ use rustc_middle::util::Providers;
use rustc_mir_build as mir_build;
use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_attr};
use rustc_passes::{self, abi_test, hir_stats, layout_test};
-use rustc_plugin_impl as plugin;
use rustc_resolve::Resolver;
use rustc_session::code_stats::VTableSizeInfo;
use rustc_session::config::{CrateType, Input, OutFileName, OutputFilenames, OutputType};
-use rustc_session::cstore::{MetadataLoader, Untracked};
+use rustc_session::cstore::Untracked;
use rustc_session::output::filename_for_input;
use rustc_session::search_paths::PathKind;
use rustc_session::{Limit, Session};
@@ -75,25 +74,12 @@ fn count_nodes(krate: &ast::Crate) -> usize {
pub(crate) fn create_lint_store(
sess: &Session,
- metadata_loader: &dyn MetadataLoader,
register_lints: Option<impl Fn(&Session, &mut LintStore)>,
- pre_configured_attrs: &[ast::Attribute],
) -> LintStore {
let mut lint_store = rustc_lint::new_lint_store(sess.enable_internal_lints());
if let Some(register_lints) = register_lints {
register_lints(sess, &mut lint_store);
}
-
- let registrars = sess.time("plugin_loading", || {
- plugin::load::load_plugins(sess, metadata_loader, pre_configured_attrs)
- });
- sess.time("plugin_registration", || {
- let mut registry = plugin::Registry { lint_store: &mut lint_store };
- for registrar in registrars {
- registrar(&mut registry);
- }
- });
-
lint_store
}
@@ -392,34 +378,16 @@ fn generated_output_paths(
out_filenames
}
-// Runs `f` on every output file path and returns the first non-None result, or None if `f`
-// returns None for every file path.
-fn check_output<F, T>(output_paths: &[PathBuf], f: F) -> Option<T>
-where
- F: Fn(&PathBuf) -> Option<T>,
-{
- for output_path in output_paths {
- if let Some(result) = f(output_path) {
- return Some(result);
- }
- }
- None
-}
-
fn output_contains_path(output_paths: &[PathBuf], input_path: &Path) -> bool {
let input_path = try_canonicalize(input_path).ok();
if input_path.is_none() {
return false;
}
- let check = |output_path: &PathBuf| {
- if try_canonicalize(output_path).ok() == input_path { Some(()) } else { None }
- };
- check_output(output_paths, check).is_some()
+ output_paths.iter().any(|output_path| try_canonicalize(output_path).ok() == input_path)
}
-fn output_conflicts_with_dir(output_paths: &[PathBuf]) -> Option<PathBuf> {
- let check = |output_path: &PathBuf| output_path.is_dir().then(|| output_path.clone());
- check_output(output_paths, check)
+fn output_conflicts_with_dir(output_paths: &[PathBuf]) -> Option<&PathBuf> {
+ output_paths.iter().find(|output_path| output_path.is_dir())
}
fn escape_dep_filename(filename: &str) -> String {
@@ -602,9 +570,7 @@ fn output_filenames(tcx: TyCtxt<'_>, (): ()) -> Arc<OutputFilenames> {
let (_, krate) = &*tcx.resolver_for_lowering(()).borrow();
let crate_name = tcx.crate_name(LOCAL_CRATE);
- // FIXME: rustdoc passes &[] instead of &krate.attrs here
let outputs = util::build_output_filenames(&krate.attrs, sess);
-
let output_paths =
generated_output_paths(tcx, &outputs, sess.io.output_file.is_some(), crate_name);
@@ -775,12 +741,16 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
rustc_hir_analysis::check_crate(tcx)?;
sess.time("MIR_borrow_checking", || {
- tcx.hir().par_body_owners(|def_id| tcx.ensure().mir_borrowck(def_id));
+ tcx.hir().par_body_owners(|def_id| {
+ // Run THIR unsafety check because it's responsible for stealing
+ // and deallocating THIR when enabled.
+ tcx.ensure().thir_check_unsafety(def_id);
+ tcx.ensure().mir_borrowck(def_id)
+ });
});
sess.time("MIR_effect_checking", || {
for def_id in tcx.hir().body_owners() {
- tcx.ensure().thir_check_unsafety(def_id);
if !tcx.sess.opts.unstable_opts.thir_unsafeck {
rustc_mir_transform::check_unsafety::check_unsafety(tcx, def_id);
}
@@ -799,9 +769,9 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
});
tcx.hir().par_body_owners(|def_id| {
- if let rustc_hir::def::DefKind::Generator = tcx.def_kind(def_id) {
- tcx.ensure().mir_generator_witnesses(def_id);
- tcx.ensure().check_generator_obligations(def_id);
+ if let rustc_hir::def::DefKind::Coroutine = tcx.def_kind(def_id) {
+ tcx.ensure().mir_coroutine_witnesses(def_id);
+ tcx.ensure().check_coroutine_obligations(def_id);
}
});
@@ -852,6 +822,11 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
// This check has to be run after all lints are done processing. We don't
// define a lint filter, as all lint checks should have finished at this point.
sess.time("check_lint_expectations", || tcx.ensure().check_expectations(None));
+
+ // This query is only invoked normally if a diagnostic is emitted that needs any
+ // diagnostic item. If the crate compiles without checking any diagnostic items,
+ // we will fail to emit overlap diagnostics. Thus we invoke it here unconditionally.
+ let _ = tcx.all_diagnostic_items(());
});
if sess.opts.unstable_opts.print_vtable_sizes {
@@ -873,16 +848,18 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
let trait_ref = ty::Binder::dummy(ty::TraitRef::identity(tcx, tr));
- // A slightly edited version of the code in `rustc_trait_selection::traits::vtable::vtable_entries`,
- // that works without self type and just counts number of entries.
+ // A slightly edited version of the code in
+ // `rustc_trait_selection::traits::vtable::vtable_entries`, that works without self
+ // type and just counts number of entries.
//
- // Note that this is technically wrong, for traits which have associated types in supertraits:
+ // Note that this is technically wrong, for traits which have associated types in
+ // supertraits:
//
// trait A: AsRef<Self::T> + AsRef<()> { type T; }
//
- // Without self type we can't normalize `Self::T`, so we can't know if `AsRef<Self::T>` and
- // `AsRef<()>` are the same trait, thus we assume that those are different, and potentially
- // over-estimate how many vtable entries there are.
+ // Without self type we can't normalize `Self::T`, so we can't know if `AsRef<Self::T>`
+ // and `AsRef<()>` are the same trait, thus we assume that those are different, and
+ // potentially over-estimate how many vtable entries there are.
//
// Similarly this is wrong for traits that have methods with possibly-impossible bounds.
// For example:
@@ -909,10 +886,10 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
let own_existential_entries =
tcx.own_existential_vtable_entries(trait_ref.def_id());
- // The original code here ignores the method if its predicates are impossible.
- // We can't really do that as, for example, all not trivial bounds on generic
- // parameters are impossible (since we don't know the parameters...),
- // see the comment above.
+ // The original code here ignores the method if its predicates are
+ // impossible. We can't really do that as, for example, all not trivial
+ // bounds on generic parameters are impossible (since we don't know the
+ // parameters...), see the comment above.
entries_ignoring_upcasting += own_existential_entries.len();
if emit_vptr {
@@ -957,10 +934,9 @@ pub fn start_codegen<'tcx>(
codegen_backend.codegen_crate(tcx, metadata, need_metadata_module)
});
- // Don't run these test assertions when not doing codegen. Compiletest tries to build
+ // Don't run this test assertions when not doing codegen. Compiletest tries to build
// build-fail tests in check mode first and expects it to not give an error in that case.
if tcx.sess.opts.output_types.should_codegen() {
- rustc_incremental::assert_module_sources::assert_module_sources(tcx);
rustc_symbol_mangling::test::report_symbol_names(tcx);
}