Use LocalDefIdSet instead of FxHashSet for reachable_set query.
This commit is contained in:
parent
5ff00f96e6
commit
f0eadbafd4
5 changed files with 12 additions and 9 deletions
|
@ -58,7 +58,7 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
|
|||
|
||||
let mut reachable_non_generics: DefIdMap<_> = tcx
|
||||
.reachable_set(())
|
||||
.iter()
|
||||
.items()
|
||||
.filter_map(|&def_id| {
|
||||
// We want to ignore some FFI functions that are not exposed from
|
||||
// this crate. Reachable FFI functions can be lumped into two
|
||||
|
@ -136,7 +136,7 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
|
|||
};
|
||||
(def_id.to_def_id(), info)
|
||||
})
|
||||
.collect();
|
||||
.into();
|
||||
|
||||
if let Some(id) = tcx.proc_macro_decls_static(()) {
|
||||
reachable_non_generics.insert(
|
||||
|
|
|
@ -1113,7 +1113,7 @@ rustc_queries! {
|
|||
desc { "checking for private elements in public interfaces" }
|
||||
}
|
||||
|
||||
query reachable_set(_: ()) -> &'tcx FxHashSet<LocalDefId> {
|
||||
query reachable_set(_: ()) -> &'tcx LocalDefIdSet {
|
||||
arena_cache
|
||||
desc { "reachability" }
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ use rustc_data_structures::unord::UnordSet;
|
|||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, DocLinkResMap};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LocalDefIdSet};
|
||||
use rustc_hir::hir_id::OwnerId;
|
||||
use rustc_hir::lang_items::{LangItem, LanguageItems};
|
||||
use rustc_hir::{Crate, ItemLocalId, TraitCandidate};
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
// makes all other generics or inline functions that it references
|
||||
// reachable as well.
|
||||
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use hir::def_id::LocalDefIdSet;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
|
@ -63,7 +63,7 @@ struct ReachableContext<'tcx> {
|
|||
tcx: TyCtxt<'tcx>,
|
||||
maybe_typeck_results: Option<&'tcx ty::TypeckResults<'tcx>>,
|
||||
// The set of items which must be exported in the linkage sense.
|
||||
reachable_symbols: FxHashSet<LocalDefId>,
|
||||
reachable_symbols: LocalDefIdSet,
|
||||
// A worklist of item IDs. Each item ID in this worklist will be inlined
|
||||
// and will be scanned for further references.
|
||||
// FIXME(eddyb) benchmark if this would be faster as a `VecDeque`.
|
||||
|
@ -175,7 +175,7 @@ impl<'tcx> ReachableContext<'tcx> {
|
|||
|
||||
// Step 2: Mark all symbols that the symbols on the worklist touch.
|
||||
fn propagate(&mut self) {
|
||||
let mut scanned = FxHashSet::default();
|
||||
let mut scanned = LocalDefIdSet::default();
|
||||
while let Some(search_item) = self.worklist.pop() {
|
||||
if !scanned.insert(search_item) {
|
||||
continue;
|
||||
|
@ -361,7 +361,7 @@ fn has_custom_linkage(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
|||
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
|
||||
}
|
||||
|
||||
fn reachable_set(tcx: TyCtxt<'_>, (): ()) -> FxHashSet<LocalDefId> {
|
||||
fn reachable_set(tcx: TyCtxt<'_>, (): ()) -> LocalDefIdSet {
|
||||
let effective_visibilities = &tcx.effective_visibilities(());
|
||||
|
||||
let any_library =
|
||||
|
|
|
@ -109,11 +109,14 @@ impl rustc_driver::Callbacks for MiriBeRustCompilerCalls {
|
|||
// an empty result if `tcx.sess.opts.output_types.should_codegen()` is false.
|
||||
local_providers.exported_symbols = |tcx, cnum| {
|
||||
assert_eq!(cnum, LOCAL_CRATE);
|
||||
let reachable_set = tcx.with_stable_hashing_context(|hcx| {
|
||||
tcx.reachable_set(()).to_sorted(&hcx, true)
|
||||
});
|
||||
tcx.arena.alloc_from_iter(
|
||||
// This is based on:
|
||||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L62-L63
|
||||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L174
|
||||
tcx.reachable_set(()).iter().filter_map(|&local_def_id| {
|
||||
reachable_set.into_iter().filter_map(|&local_def_id| {
|
||||
// Do the same filtering that rustc does:
|
||||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L84-L102
|
||||
// Otherwise it may cause unexpected behaviours and ICEs
|
||||
|
|
Loading…
Add table
Reference in a new issue