rustc: Move stable_crate_id
from Session
to GlobalCtxt
Removes a piece of mutable state. Follow up to #114578.
This commit is contained in:
parent
0b89aac08d
commit
907aa440cf
10 changed files with 25 additions and 27 deletions
|
@ -1703,7 +1703,7 @@ fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<String> {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
let stable_crate_id = tcx.stable_crate_id(LOCAL_CRATE);
|
||||||
let proc_macro_decls_name = tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
let proc_macro_decls_name = tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
||||||
let metadata_symbol_name = exported_symbols::metadata_symbol_name(tcx);
|
let metadata_symbol_name = exported_symbols::metadata_symbol_name(tcx);
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
|
||||||
use rustc_errors::PResult;
|
use rustc_errors::PResult;
|
||||||
use rustc_expand::base::{ExtCtxt, LintStoreExpand};
|
use rustc_expand::base::{ExtCtxt, LintStoreExpand};
|
||||||
use rustc_fs_util::try_canonicalize;
|
use rustc_fs_util::try_canonicalize;
|
||||||
use rustc_hir::def_id::LOCAL_CRATE;
|
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
|
||||||
use rustc_lint::{unerased_lint_store, BufferedEarlyLint, EarlyCheckNode, LintStore};
|
use rustc_lint::{unerased_lint_store, BufferedEarlyLint, EarlyCheckNode, LintStore};
|
||||||
use rustc_metadata::creader::CStore;
|
use rustc_metadata::creader::CStore;
|
||||||
use rustc_middle::arena::Arena;
|
use rustc_middle::arena::Arena;
|
||||||
|
@ -666,6 +666,7 @@ pub static DEFAULT_EXTERN_QUERY_PROVIDERS: LazyLock<ExternProviders> = LazyLock:
|
||||||
pub fn create_global_ctxt<'tcx>(
|
pub fn create_global_ctxt<'tcx>(
|
||||||
compiler: &'tcx Compiler,
|
compiler: &'tcx Compiler,
|
||||||
crate_types: Vec<CrateType>,
|
crate_types: Vec<CrateType>,
|
||||||
|
stable_crate_id: StableCrateId,
|
||||||
lint_store: Lrc<LintStore>,
|
lint_store: Lrc<LintStore>,
|
||||||
dep_graph: DepGraph,
|
dep_graph: DepGraph,
|
||||||
untracked: Untracked,
|
untracked: Untracked,
|
||||||
|
@ -699,6 +700,7 @@ pub fn create_global_ctxt<'tcx>(
|
||||||
TyCtxt::create_global_ctxt(
|
TyCtxt::create_global_ctxt(
|
||||||
sess,
|
sess,
|
||||||
crate_types,
|
crate_types,
|
||||||
|
stable_crate_id,
|
||||||
lint_store,
|
lint_store,
|
||||||
arena,
|
arena,
|
||||||
hir_arena,
|
hir_arena,
|
||||||
|
|
|
@ -234,13 +234,13 @@ impl<'tcx> Queries<'tcx> {
|
||||||
debug_assert_eq!(_id, CRATE_DEF_ID);
|
debug_assert_eq!(_id, CRATE_DEF_ID);
|
||||||
let untracked = Untracked { cstore, source_span, definitions };
|
let untracked = Untracked { cstore, source_span, definitions };
|
||||||
|
|
||||||
// FIXME: Move these fields from session to tcx and make them immutable.
|
// FIXME: Move features from session to tcx and make them immutable.
|
||||||
sess.stable_crate_id.set(stable_crate_id).expect("not yet initialized");
|
|
||||||
sess.init_features(rustc_expand::config::features(sess, &pre_configured_attrs));
|
sess.init_features(rustc_expand::config::features(sess, &pre_configured_attrs));
|
||||||
|
|
||||||
let qcx = passes::create_global_ctxt(
|
let qcx = passes::create_global_ctxt(
|
||||||
self.compiler,
|
self.compiler,
|
||||||
crate_types,
|
crate_types,
|
||||||
|
stable_crate_id,
|
||||||
lint_store,
|
lint_store,
|
||||||
self.dep_graph(dep_graph_future),
|
self.dep_graph(dep_graph_future),
|
||||||
untracked,
|
untracked,
|
||||||
|
|
|
@ -60,7 +60,7 @@ use crate::mir::mono::MonoItem;
|
||||||
use crate::ty::TyCtxt;
|
use crate::ty::TyCtxt;
|
||||||
|
|
||||||
use rustc_data_structures::fingerprint::Fingerprint;
|
use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
|
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE};
|
||||||
use rustc_hir::definitions::DefPathHash;
|
use rustc_hir::definitions::DefPathHash;
|
||||||
use rustc_hir::{HirId, ItemLocalId, OwnerId};
|
use rustc_hir::{HirId, ItemLocalId, OwnerId};
|
||||||
use rustc_query_system::dep_graph::FingerprintStyle;
|
use rustc_query_system::dep_graph::FingerprintStyle;
|
||||||
|
@ -371,7 +371,7 @@ impl<'tcx> DepNodeParams<TyCtxt<'tcx>> for HirId {
|
||||||
fn recover(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option<Self> {
|
fn recover(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option<Self> {
|
||||||
if tcx.fingerprint_style(dep_node.kind) == FingerprintStyle::HirId {
|
if tcx.fingerprint_style(dep_node.kind) == FingerprintStyle::HirId {
|
||||||
let (local_hash, local_id) = Fingerprint::from(dep_node.hash).split();
|
let (local_hash, local_id) = Fingerprint::from(dep_node.hash).split();
|
||||||
let def_path_hash = DefPathHash::new(tcx.sess.local_stable_crate_id(), local_hash);
|
let def_path_hash = DefPathHash::new(tcx.stable_crate_id(LOCAL_CRATE), local_hash);
|
||||||
let def_id = tcx
|
let def_id = tcx
|
||||||
.def_path_hash_to_def_id(def_path_hash, &mut || {
|
.def_path_hash_to_def_id(def_path_hash, &mut || {
|
||||||
panic!("Failed to extract HirId: {:?} {}", dep_node.kind, dep_node.hash)
|
panic!("Failed to extract HirId: {:?} {}", dep_node.kind, dep_node.hash)
|
||||||
|
|
|
@ -1210,7 +1210,7 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, _: LocalCrate) -> Svh {
|
||||||
owner_spans.hash_stable(&mut hcx, &mut stable_hasher);
|
owner_spans.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
}
|
}
|
||||||
tcx.sess.opts.dep_tracking_hash(true).hash_stable(&mut hcx, &mut stable_hasher);
|
tcx.sess.opts.dep_tracking_hash(true).hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
tcx.sess.local_stable_crate_id().hash_stable(&mut hcx, &mut stable_hasher);
|
tcx.stable_crate_id(LOCAL_CRATE).hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
// Hash visibility information since it does not appear in HIR.
|
// Hash visibility information since it does not appear in HIR.
|
||||||
resolutions.visibilities.hash_stable(&mut hcx, &mut stable_hasher);
|
resolutions.visibilities.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
resolutions.has_pub_restricted.hash_stable(&mut hcx, &mut stable_hasher);
|
resolutions.has_pub_restricted.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
|
|
@ -72,6 +72,6 @@ pub fn metadata_symbol_name(tcx: TyCtxt<'_>) -> String {
|
||||||
format!(
|
format!(
|
||||||
"rust_metadata_{}_{:08x}",
|
"rust_metadata_{}_{:08x}",
|
||||||
tcx.crate_name(LOCAL_CRATE),
|
tcx.crate_name(LOCAL_CRATE),
|
||||||
tcx.sess.local_stable_crate_id(),
|
tcx.stable_crate_id(LOCAL_CRATE),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -524,13 +524,13 @@ impl<'tcx> CodegenUnitNameBuilder<'tcx> {
|
||||||
// local crate's ID. Otherwise there can be collisions between CGUs
|
// local crate's ID. Otherwise there can be collisions between CGUs
|
||||||
// instantiating stuff for upstream crates.
|
// instantiating stuff for upstream crates.
|
||||||
let local_crate_id = if cnum != LOCAL_CRATE {
|
let local_crate_id = if cnum != LOCAL_CRATE {
|
||||||
let local_stable_crate_id = tcx.sess.local_stable_crate_id();
|
let local_stable_crate_id = tcx.stable_crate_id(LOCAL_CRATE);
|
||||||
format!("-in-{}.{:08x}", tcx.crate_name(LOCAL_CRATE), local_stable_crate_id)
|
format!("-in-{}.{:08x}", tcx.crate_name(LOCAL_CRATE), local_stable_crate_id)
|
||||||
} else {
|
} else {
|
||||||
String::new()
|
String::new()
|
||||||
};
|
};
|
||||||
|
|
||||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
let stable_crate_id = tcx.stable_crate_id(LOCAL_CRATE);
|
||||||
format!("{}.{:08x}{}", tcx.crate_name(cnum), stable_crate_id, local_crate_id)
|
format!("{}.{:08x}{}", tcx.crate_name(cnum), stable_crate_id, local_crate_id)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -527,6 +527,12 @@ pub struct GlobalCtxt<'tcx> {
|
||||||
|
|
||||||
pub sess: &'tcx Session,
|
pub sess: &'tcx Session,
|
||||||
crate_types: Vec<CrateType>,
|
crate_types: Vec<CrateType>,
|
||||||
|
/// The `stable_crate_id` is constructed out of the crate name and all the
|
||||||
|
/// `-C metadata` arguments passed to the compiler. Its value forms a unique
|
||||||
|
/// global identifier for the crate. It is used to allow multiple crates
|
||||||
|
/// with the same name to coexist. See the
|
||||||
|
/// `rustc_symbol_mangling` crate for more information.
|
||||||
|
stable_crate_id: StableCrateId,
|
||||||
|
|
||||||
/// This only ever stores a `LintStore` but we don't want a dependency on that type here.
|
/// This only ever stores a `LintStore` but we don't want a dependency on that type here.
|
||||||
///
|
///
|
||||||
|
@ -688,6 +694,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn create_global_ctxt(
|
pub fn create_global_ctxt(
|
||||||
s: &'tcx Session,
|
s: &'tcx Session,
|
||||||
crate_types: Vec<CrateType>,
|
crate_types: Vec<CrateType>,
|
||||||
|
stable_crate_id: StableCrateId,
|
||||||
lint_store: Lrc<dyn Any + sync::DynSend + sync::DynSync>,
|
lint_store: Lrc<dyn Any + sync::DynSend + sync::DynSync>,
|
||||||
arena: &'tcx WorkerLocal<Arena<'tcx>>,
|
arena: &'tcx WorkerLocal<Arena<'tcx>>,
|
||||||
hir_arena: &'tcx WorkerLocal<hir::Arena<'tcx>>,
|
hir_arena: &'tcx WorkerLocal<hir::Arena<'tcx>>,
|
||||||
|
@ -707,6 +714,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
GlobalCtxt {
|
GlobalCtxt {
|
||||||
sess: s,
|
sess: s,
|
||||||
crate_types,
|
crate_types,
|
||||||
|
stable_crate_id,
|
||||||
lint_store,
|
lint_store,
|
||||||
arena,
|
arena,
|
||||||
hir_arena,
|
hir_arena,
|
||||||
|
@ -842,7 +850,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn stable_crate_id(self, crate_num: CrateNum) -> StableCrateId {
|
pub fn stable_crate_id(self, crate_num: CrateNum) -> StableCrateId {
|
||||||
if crate_num == LOCAL_CRATE {
|
if crate_num == LOCAL_CRATE {
|
||||||
self.sess.local_stable_crate_id()
|
self.stable_crate_id
|
||||||
} else {
|
} else {
|
||||||
self.cstore_untracked().stable_crate_id(crate_num)
|
self.cstore_untracked().stable_crate_id(crate_num)
|
||||||
}
|
}
|
||||||
|
@ -852,7 +860,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// that the crate in question has already been loaded by the CrateStore.
|
/// that the crate in question has already been loaded by the CrateStore.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn stable_crate_id_to_crate_num(self, stable_crate_id: StableCrateId) -> CrateNum {
|
pub fn stable_crate_id_to_crate_num(self, stable_crate_id: StableCrateId) -> CrateNum {
|
||||||
if stable_crate_id == self.sess.local_stable_crate_id() {
|
if stable_crate_id == self.stable_crate_id(LOCAL_CRATE) {
|
||||||
LOCAL_CRATE
|
LOCAL_CRATE
|
||||||
} else {
|
} else {
|
||||||
self.cstore_untracked().stable_crate_id_to_crate_num(stable_crate_id)
|
self.cstore_untracked().stable_crate_id_to_crate_num(stable_crate_id)
|
||||||
|
@ -869,7 +877,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
||||||
// If this is a DefPathHash from the local crate, we can look up the
|
// If this is a DefPathHash from the local crate, we can look up the
|
||||||
// DefId in the tcx's `Definitions`.
|
// DefId in the tcx's `Definitions`.
|
||||||
if stable_crate_id == self.sess.local_stable_crate_id() {
|
if stable_crate_id == self.stable_crate_id(LOCAL_CRATE) {
|
||||||
self.untracked.definitions.read().local_def_path_hash_to_def_id(hash, err).to_def_id()
|
self.untracked.definitions.read().local_def_path_hash_to_def_id(hash, err).to_def_id()
|
||||||
} else {
|
} else {
|
||||||
// If this is a DefPathHash from an upstream crate, let the CrateStore map
|
// If this is a DefPathHash from an upstream crate, let the CrateStore map
|
||||||
|
@ -886,7 +894,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
// statements within the query system and we'd run into endless
|
// statements within the query system and we'd run into endless
|
||||||
// recursion otherwise.
|
// recursion otherwise.
|
||||||
let (crate_name, stable_crate_id) = if def_id.is_local() {
|
let (crate_name, stable_crate_id) = if def_id.is_local() {
|
||||||
(self.crate_name(LOCAL_CRATE), self.sess.local_stable_crate_id())
|
(self.crate_name(LOCAL_CRATE), self.stable_crate_id(LOCAL_CRATE))
|
||||||
} else {
|
} else {
|
||||||
let cstore = &*self.cstore_untracked();
|
let cstore = &*self.cstore_untracked();
|
||||||
(cstore.crate_name(def_id.krate), cstore.stable_crate_id(def_id.krate))
|
(cstore.crate_name(def_id.krate), cstore.stable_crate_id(def_id.krate))
|
||||||
|
|
|
@ -152,13 +152,6 @@ pub struct Session {
|
||||||
/// Input, input file path and output file path to this compilation process.
|
/// Input, input file path and output file path to this compilation process.
|
||||||
pub io: CompilerIO,
|
pub io: CompilerIO,
|
||||||
|
|
||||||
/// The `stable_crate_id` is constructed out of the crate name and all the
|
|
||||||
/// `-C metadata` arguments passed to the compiler. Its value forms a unique
|
|
||||||
/// global identifier for the crate. It is used to allow multiple crates
|
|
||||||
/// with the same name to coexist. See the
|
|
||||||
/// `rustc_symbol_mangling` crate for more information.
|
|
||||||
pub stable_crate_id: OnceCell<StableCrateId>,
|
|
||||||
|
|
||||||
features: OnceCell<rustc_feature::Features>,
|
features: OnceCell<rustc_feature::Features>,
|
||||||
|
|
||||||
incr_comp_session: OneThread<RefCell<IncrCompSession>>,
|
incr_comp_session: OneThread<RefCell<IncrCompSession>>,
|
||||||
|
@ -309,10 +302,6 @@ impl Session {
|
||||||
self.parse_sess.span_diagnostic.emit_future_breakage_report(diags);
|
self.parse_sess.span_diagnostic.emit_future_breakage_report(diags);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn local_stable_crate_id(&self) -> StableCrateId {
|
|
||||||
self.stable_crate_id.get().copied().unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if the crate is a testing one.
|
/// Returns true if the crate is a testing one.
|
||||||
pub fn is_test_crate(&self) -> bool {
|
pub fn is_test_crate(&self) -> bool {
|
||||||
self.opts.test
|
self.opts.test
|
||||||
|
@ -1475,7 +1464,6 @@ pub fn build_session(
|
||||||
parse_sess,
|
parse_sess,
|
||||||
sysroot,
|
sysroot,
|
||||||
io,
|
io,
|
||||||
stable_crate_id: OnceCell::new(),
|
|
||||||
features: OnceCell::new(),
|
features: OnceCell::new(),
|
||||||
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
||||||
cgu_reuse_tracker,
|
cgu_reuse_tracker,
|
||||||
|
|
|
@ -180,7 +180,7 @@ fn compute_symbol_name<'tcx>(
|
||||||
|
|
||||||
if let Some(def_id) = def_id.as_local() {
|
if let Some(def_id) = def_id.as_local() {
|
||||||
if tcx.proc_macro_decls_static(()) == Some(def_id) {
|
if tcx.proc_macro_decls_static(()) == Some(def_id) {
|
||||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
let stable_crate_id = tcx.stable_crate_id(LOCAL_CRATE);
|
||||||
return tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
return tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue