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