resolve: Scale back unloading of speculatively loaded crates
This commit is contained in:
parent
8b21296b5d
commit
24cffbf703
7 changed files with 26 additions and 18 deletions
|
@ -1070,16 +1070,6 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
||||||
pub fn maybe_process_path_extern(&mut self, name: Symbol) -> Option<CrateNum> {
|
pub fn maybe_process_path_extern(&mut self, name: Symbol) -> Option<CrateNum> {
|
||||||
self.maybe_resolve_crate(name, CrateDepKind::Explicit, None).ok()
|
self.maybe_resolve_crate(name, CrateDepKind::Explicit, None).ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unload_unused_crates(&mut self) {
|
|
||||||
for opt_cdata in &mut self.cstore.metas {
|
|
||||||
if let Some(cdata) = opt_cdata
|
|
||||||
&& !cdata.used()
|
|
||||||
{
|
|
||||||
*opt_cdata = None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn global_allocator_spans(krate: &ast::Crate) -> Vec<Span> {
|
fn global_allocator_spans(krate: &ast::Crate) -> Vec<Span> {
|
||||||
|
|
|
@ -519,6 +519,16 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
|
||||||
tcx.untracked().cstore.freeze();
|
tcx.untracked().cstore.freeze();
|
||||||
tcx.arena.alloc_from_iter(CStore::from_tcx(tcx).iter_crate_data().map(|(cnum, _)| cnum))
|
tcx.arena.alloc_from_iter(CStore::from_tcx(tcx).iter_crate_data().map(|(cnum, _)| cnum))
|
||||||
},
|
},
|
||||||
|
used_crates: |tcx, ()| {
|
||||||
|
// The list of loaded crates is now frozen in query cache,
|
||||||
|
// so make sure cstore is not mutably accessed from here on.
|
||||||
|
tcx.untracked().cstore.freeze();
|
||||||
|
tcx.arena.alloc_from_iter(
|
||||||
|
CStore::from_tcx(tcx)
|
||||||
|
.iter_crate_data()
|
||||||
|
.filter_map(|(cnum, data)| data.used().then_some(cnum)),
|
||||||
|
)
|
||||||
|
},
|
||||||
..providers.queries
|
..providers.queries
|
||||||
};
|
};
|
||||||
provide_extern(&mut providers.extern_queries);
|
provide_extern(&mut providers.extern_queries);
|
||||||
|
|
|
@ -1872,6 +1872,13 @@ rustc_queries! {
|
||||||
eval_always
|
eval_always
|
||||||
desc { "fetching all foreign CrateNum instances" }
|
desc { "fetching all foreign CrateNum instances" }
|
||||||
}
|
}
|
||||||
|
// Crates that are loaded non-speculatively (not for diagnostics or doc links).
|
||||||
|
// FIXME: This is currently only used for collecting lang items, but should be used instead of
|
||||||
|
// `crates` in most other cases too.
|
||||||
|
query used_crates(_: ()) -> &'tcx [CrateNum] {
|
||||||
|
eval_always
|
||||||
|
desc { "fetching `CrateNum`s for all crates loaded non-speculatively" }
|
||||||
|
}
|
||||||
|
|
||||||
/// A list of all traits in a crate, used by rustdoc and error reporting.
|
/// A list of all traits in a crate, used by rustdoc and error reporting.
|
||||||
query traits(_: CrateNum) -> &'tcx [DefId] {
|
query traits(_: CrateNum) -> &'tcx [DefId] {
|
||||||
|
|
|
@ -250,7 +250,7 @@ fn get_lang_items(tcx: TyCtxt<'_>, (): ()) -> LanguageItems {
|
||||||
let mut collector = LanguageItemCollector::new(tcx, resolver);
|
let mut collector = LanguageItemCollector::new(tcx, resolver);
|
||||||
|
|
||||||
// Collect lang items in other crates.
|
// Collect lang items in other crates.
|
||||||
for &cnum in tcx.crates(()).iter() {
|
for &cnum in tcx.used_crates(()).iter() {
|
||||||
for &(def_id, lang_item) in tcx.defined_lang_items(cnum).iter() {
|
for &(def_id, lang_item) in tcx.defined_lang_items(cnum).iter() {
|
||||||
collector.collect_item(lang_item, def_id, None);
|
collector.collect_item(lang_item, def_id, None);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ use rustc_hir::def::Namespace::{self, *};
|
||||||
use rustc_hir::def::{self, CtorKind, DefKind, LifetimeRes, NonMacroAttrKind, PartialRes, PerNS};
|
use rustc_hir::def::{self, CtorKind, DefKind, LifetimeRes, NonMacroAttrKind, PartialRes, PerNS};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
|
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
|
||||||
use rustc_hir::{PrimTy, TraitCandidate};
|
use rustc_hir::{PrimTy, TraitCandidate};
|
||||||
use rustc_metadata::creader::CStore;
|
|
||||||
use rustc_middle::middle::resolve_bound_vars::Set1;
|
use rustc_middle::middle::resolve_bound_vars::Set1;
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_session::config::{CrateType, ResolveDocLinks};
|
use rustc_session::config::{CrateType, ResolveDocLinks};
|
||||||
|
@ -4574,10 +4573,6 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||||
// Encoding foreign def ids in proc macro crate metadata will ICE.
|
// Encoding foreign def ids in proc macro crate metadata will ICE.
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
// Doc paths should be resolved speculatively and should not produce any
|
|
||||||
// diagnostics, but if they are indeed resolved, then we need to keep the
|
|
||||||
// corresponding crate alive.
|
|
||||||
CStore::from_tcx_mut(self.r.tcx).set_used_recursively(def_id.krate);
|
|
||||||
}
|
}
|
||||||
res
|
res
|
||||||
});
|
});
|
||||||
|
|
|
@ -1651,7 +1651,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
.sess
|
.sess
|
||||||
.time("resolve_postprocess", || self.crate_loader(|c| c.postprocess(krate)));
|
.time("resolve_postprocess", || self.crate_loader(|c| c.postprocess(krate)));
|
||||||
self.crate_loader(|c| c.unload_unused_crates());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Make sure we don't mutate the cstore from here on.
|
// Make sure we don't mutate the cstore from here on.
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
error: extern location for std does not exist:
|
error: extern location for std does not exist:
|
||||||
|
|
||||||
|
error: `#[panic_handler]` function required, but not found
|
||||||
|
|
||||||
|
error: unwinding panics are not supported without std
|
||||||
|
|
|
||||||
|
= help: using nightly cargo, use -Zbuild-std with panic="abort" to avoid unwinding
|
||||||
|
= note: since the core library is usually precompiled with panic="unwind", rebuilding your crate with panic="abort" may not be enough to fix the problem
|
||||||
|
|
||||||
error: requires `sized` lang_item
|
error: requires `sized` lang_item
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue