mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Revert "Revert "Merge CrateDisambiguator into StableCrateId""
This reverts commit 8176ab8bc1
.
This commit is contained in:
parent
9a27044f42
commit
489ad8b8b5
@ -14,7 +14,6 @@ use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::stable_hasher::StableHasher;
|
||||
use rustc_data_structures::unhash::UnhashMap;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_span::crate_disambiguator::CrateDisambiguator;
|
||||
use rustc_span::hygiene::ExpnId;
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
|
||||
@ -330,7 +329,7 @@ impl Definitions {
|
||||
}
|
||||
|
||||
/// Adds a root definition (no parent) and a few other reserved definitions.
|
||||
pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> Definitions {
|
||||
pub fn new(stable_crate_id: StableCrateId) -> Definitions {
|
||||
let key = DefKey {
|
||||
parent: None,
|
||||
disambiguated_data: DisambiguatedDefPathData {
|
||||
@ -339,7 +338,6 @@ impl Definitions {
|
||||
},
|
||||
};
|
||||
|
||||
let stable_crate_id = StableCrateId::new(crate_name, crate_disambiguator);
|
||||
let parent_hash = DefPathHash::new(stable_crate_id, 0);
|
||||
let def_path_hash = key.compute_stable_hash(parent_hash);
|
||||
|
||||
|
@ -108,7 +108,7 @@ use rustc_data_structures::svh::Svh;
|
||||
use rustc_data_structures::{base_n, flock};
|
||||
use rustc_errors::ErrorReported;
|
||||
use rustc_fs_util::{link_or_copy, LinkOrCopy};
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
use rustc_session::{Session, StableCrateId};
|
||||
|
||||
use std::fs as std_fs;
|
||||
use std::io;
|
||||
@ -189,7 +189,7 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu
|
||||
pub fn prepare_session_directory(
|
||||
sess: &Session,
|
||||
crate_name: &str,
|
||||
crate_disambiguator: CrateDisambiguator,
|
||||
stable_crate_id: StableCrateId,
|
||||
) -> Result<(), ErrorReported> {
|
||||
if sess.opts.incremental.is_none() {
|
||||
return Ok(());
|
||||
@ -200,7 +200,7 @@ pub fn prepare_session_directory(
|
||||
debug!("prepare_session_directory");
|
||||
|
||||
// {incr-comp-dir}/{crate-name-and-disambiguator}
|
||||
let crate_dir = crate_path(sess, crate_name, crate_disambiguator);
|
||||
let crate_dir = crate_path(sess, crate_name, stable_crate_id);
|
||||
debug!("crate-dir: {}", crate_dir.display());
|
||||
create_dir(sess, &crate_dir, "crate")?;
|
||||
|
||||
@ -648,19 +648,12 @@ fn string_to_timestamp(s: &str) -> Result<SystemTime, ()> {
|
||||
Ok(UNIX_EPOCH + duration)
|
||||
}
|
||||
|
||||
fn crate_path(
|
||||
sess: &Session,
|
||||
crate_name: &str,
|
||||
crate_disambiguator: CrateDisambiguator,
|
||||
) -> PathBuf {
|
||||
fn crate_path(sess: &Session, crate_name: &str, stable_crate_id: StableCrateId) -> PathBuf {
|
||||
let incr_dir = sess.opts.incremental.as_ref().unwrap().clone();
|
||||
|
||||
// The full crate disambiguator is really long. 64 bits of it should be
|
||||
// sufficient.
|
||||
let crate_disambiguator = crate_disambiguator.to_fingerprint().to_smaller_hash();
|
||||
let crate_disambiguator = base_n::encode(crate_disambiguator as u128, INT_ENCODE_BASE);
|
||||
let stable_crate_id = base_n::encode(stable_crate_id.to_u64() as u128, INT_ENCODE_BASE);
|
||||
|
||||
let crate_name = format!("{}-{}", crate_name, crate_disambiguator);
|
||||
let crate_name = format!("{}-{}", crate_name, stable_crate_id);
|
||||
incr_dir.join(crate_name)
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,7 @@ use rustc_data_structures::sync::{par_iter, Lrc, OnceCell, ParallelIterator, Wor
|
||||
use rustc_data_structures::temp_dir::MaybeTempDir;
|
||||
use rustc_errors::{ErrorReported, PResult};
|
||||
use rustc_expand::base::ExtCtxt;
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
|
||||
use rustc_hir::Crate;
|
||||
use rustc_lint::LintStore;
|
||||
use rustc_metadata::creader::CStore;
|
||||
@ -195,9 +195,13 @@ pub fn register_plugins<'a>(
|
||||
let crate_types = util::collect_crate_types(sess, &krate.attrs);
|
||||
sess.init_crate_types(crate_types);
|
||||
|
||||
let disambiguator = util::compute_crate_disambiguator(sess);
|
||||
sess.crate_disambiguator.set(disambiguator).expect("not yet initialized");
|
||||
rustc_incremental::prepare_session_directory(sess, &crate_name, disambiguator)?;
|
||||
let stable_crate_id = StableCrateId::new(
|
||||
crate_name,
|
||||
sess.crate_types().contains(&CrateType::Executable),
|
||||
sess.opts.cg.metadata.clone(),
|
||||
);
|
||||
sess.stable_crate_id.set(stable_crate_id).expect("not yet initialized");
|
||||
rustc_incremental::prepare_session_directory(sess, &crate_name, stable_crate_id)?;
|
||||
|
||||
if sess.opts.incremental.is_some() {
|
||||
sess.time("incr_comp_garbage_collect_session_directories", || {
|
||||
|
@ -2,11 +2,9 @@ use rustc_ast::mut_visit::{visit_clobber, MutVisitor, *};
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::{self as ast, AttrVec, BlockCheckMode};
|
||||
use rustc_codegen_ssa::traits::CodegenBackend;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
#[cfg(parallel_compiler)]
|
||||
use rustc_data_structures::jobserver;
|
||||
use rustc_data_structures::stable_hasher::StableHasher;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::registry::Registry;
|
||||
use rustc_metadata::dynamic_lib::DynamicLibrary;
|
||||
@ -18,7 +16,6 @@ use rustc_session::config::{self, CrateType};
|
||||
use rustc_session::config::{ErrorOutputType, Input, OutputFilenames};
|
||||
use rustc_session::lint::{self, BuiltinLintDiagnostics, LintBuffer};
|
||||
use rustc_session::parse::CrateConfig;
|
||||
use rustc_session::CrateDisambiguator;
|
||||
use rustc_session::{early_error, filesearch, output, DiagnosticOutput, Session};
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::lev_distance::find_best_match_for_name;
|
||||
@ -487,39 +484,6 @@ pub fn get_codegen_sysroot(
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguator {
|
||||
use std::hash::Hasher;
|
||||
|
||||
// The crate_disambiguator is a 128 bit hash. The disambiguator is fed
|
||||
// into various other hashes quite a bit (symbol hashes, incr. comp. hashes,
|
||||
// debuginfo type IDs, etc), so we don't want it to be too wide. 128 bits
|
||||
// should still be safe enough to avoid collisions in practice.
|
||||
let mut hasher = StableHasher::new();
|
||||
|
||||
let mut metadata = session.opts.cg.metadata.clone();
|
||||
// We don't want the crate_disambiguator to dependent on the order
|
||||
// -C metadata arguments, so sort them:
|
||||
metadata.sort();
|
||||
// Every distinct -C metadata value is only incorporated once:
|
||||
metadata.dedup();
|
||||
|
||||
hasher.write(b"metadata");
|
||||
for s in &metadata {
|
||||
// Also incorporate the length of a metadata string, so that we generate
|
||||
// different values for `-Cmetadata=ab -Cmetadata=c` and
|
||||
// `-Cmetadata=a -Cmetadata=bc`
|
||||
hasher.write_usize(s.len());
|
||||
hasher.write(s.as_bytes());
|
||||
}
|
||||
|
||||
// Also incorporate crate type, so that we don't get symbol conflicts when
|
||||
// linking against a library of the same name, if this is an executable.
|
||||
let is_exe = session.crate_types().contains(&CrateType::Executable);
|
||||
hasher.write(if is_exe { b"exe" } else { b"lib" });
|
||||
|
||||
CrateDisambiguator::from(hasher.finish::<Fingerprint>())
|
||||
}
|
||||
|
||||
pub(crate) fn check_attr_crate_type(
|
||||
sess: &Session,
|
||||
attrs: &[ast::Attribute],
|
||||
|
@ -21,7 +21,7 @@ use rustc_session::config::{self, CrateType, ExternLocation};
|
||||
use rustc_session::lint::{self, BuiltinLintDiagnostics, ExternDepSpec};
|
||||
use rustc_session::output::validate_crate_name;
|
||||
use rustc_session::search_paths::PathKind;
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
use rustc_session::Session;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
@ -222,10 +222,8 @@ impl<'a> CrateLoader<'a> {
|
||||
metadata_loader: Box<MetadataLoaderDyn>,
|
||||
local_crate_name: &str,
|
||||
) -> Self {
|
||||
let local_crate_stable_id =
|
||||
StableCrateId::new(local_crate_name, sess.local_crate_disambiguator());
|
||||
let mut stable_crate_ids = FxHashMap::default();
|
||||
stable_crate_ids.insert(local_crate_stable_id, LOCAL_CRATE);
|
||||
stable_crate_ids.insert(sess.local_stable_crate_id(), LOCAL_CRATE);
|
||||
|
||||
CrateLoader {
|
||||
sess,
|
||||
@ -327,17 +325,14 @@ impl<'a> CrateLoader<'a> {
|
||||
|
||||
fn verify_no_symbol_conflicts(&self, root: &CrateRoot<'_>) -> Result<(), CrateError> {
|
||||
// Check for (potential) conflicts with the local crate
|
||||
if self.local_crate_name == root.name()
|
||||
&& self.sess.local_crate_disambiguator() == root.disambiguator()
|
||||
{
|
||||
if self.sess.local_stable_crate_id() == root.stable_crate_id() {
|
||||
return Err(CrateError::SymbolConflictsCurrent(root.name()));
|
||||
}
|
||||
|
||||
// Check for conflicts with any crate loaded so far
|
||||
let mut res = Ok(());
|
||||
self.cstore.iter_crate_data(|_, other| {
|
||||
if other.name() == root.name() && // same crate-name
|
||||
other.disambiguator() == root.disambiguator() && // same crate-disambiguator
|
||||
if other.stable_crate_id() == root.stable_crate_id() && // same stable crate id
|
||||
other.hash() != root.hash()
|
||||
{
|
||||
// but different SVH
|
||||
@ -411,7 +406,7 @@ impl<'a> CrateLoader<'a> {
|
||||
None => (&source, &crate_root),
|
||||
};
|
||||
let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate");
|
||||
Some(self.dlsym_proc_macros(&dlsym_dylib.0, dlsym_root.disambiguator())?)
|
||||
Some(self.dlsym_proc_macros(&dlsym_dylib.0, dlsym_root.stable_crate_id())?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
@ -664,7 +659,7 @@ impl<'a> CrateLoader<'a> {
|
||||
fn dlsym_proc_macros(
|
||||
&self,
|
||||
path: &Path,
|
||||
disambiguator: CrateDisambiguator,
|
||||
stable_crate_id: StableCrateId,
|
||||
) -> Result<&'static [ProcMacro], CrateError> {
|
||||
// Make sure the path contains a / or the linker will search for it.
|
||||
let path = env::current_dir().unwrap().join(path);
|
||||
@ -673,7 +668,7 @@ impl<'a> CrateLoader<'a> {
|
||||
Err(s) => return Err(CrateError::DlOpen(s)),
|
||||
};
|
||||
|
||||
let sym = self.sess.generate_proc_macro_decls_symbol(disambiguator);
|
||||
let sym = self.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
||||
let decls = unsafe {
|
||||
let sym = match lib.symbol(&sym) {
|
||||
Ok(f) => f,
|
||||
|
@ -226,7 +226,7 @@ use rustc_session::config::{self, CrateType};
|
||||
use rustc_session::filesearch::{FileDoesntMatch, FileMatches, FileSearch};
|
||||
use rustc_session::search_paths::PathKind;
|
||||
use rustc_session::utils::CanonicalizedPath;
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
use rustc_session::{Session, StableCrateId};
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_span::Span;
|
||||
use rustc_target::spec::{Target, TargetTriple};
|
||||
@ -787,7 +787,7 @@ pub fn find_plugin_registrar(
|
||||
metadata_loader: &dyn MetadataLoader,
|
||||
span: Span,
|
||||
name: Symbol,
|
||||
) -> (PathBuf, CrateDisambiguator) {
|
||||
) -> (PathBuf, StableCrateId) {
|
||||
match find_plugin_registrar_impl(sess, metadata_loader, name) {
|
||||
Ok(res) => res,
|
||||
// `core` is always available if we got as far as loading plugins.
|
||||
@ -799,7 +799,7 @@ fn find_plugin_registrar_impl<'a>(
|
||||
sess: &'a Session,
|
||||
metadata_loader: &dyn MetadataLoader,
|
||||
name: Symbol,
|
||||
) -> Result<(PathBuf, CrateDisambiguator), CrateError> {
|
||||
) -> Result<(PathBuf, StableCrateId), CrateError> {
|
||||
info!("find plugin registrar `{}`", name);
|
||||
let mut locator = CrateLocator::new(
|
||||
sess,
|
||||
@ -816,7 +816,7 @@ fn find_plugin_registrar_impl<'a>(
|
||||
|
||||
match locator.maybe_load_library_crate()? {
|
||||
Some(library) => match library.source.dylib {
|
||||
Some(dylib) => Ok((dylib.0, library.metadata.get_root().disambiguator())),
|
||||
Some(dylib) => Ok((dylib.0, library.metadata.get_root().stable_crate_id())),
|
||||
None => Err(CrateError::NonDylibPlugin(name)),
|
||||
},
|
||||
None => Err(locator.into_error()),
|
||||
|
@ -633,10 +633,6 @@ impl CrateRoot<'_> {
|
||||
self.name
|
||||
}
|
||||
|
||||
crate fn disambiguator(&self) -> CrateDisambiguator {
|
||||
self.disambiguator
|
||||
}
|
||||
|
||||
crate fn hash(&self) -> Svh {
|
||||
self.hash
|
||||
}
|
||||
@ -1940,8 +1936,8 @@ impl CrateMetadata {
|
||||
self.root.name
|
||||
}
|
||||
|
||||
crate fn disambiguator(&self) -> CrateDisambiguator {
|
||||
self.root.disambiguator
|
||||
crate fn stable_crate_id(&self) -> StableCrateId {
|
||||
self.root.stable_crate_id
|
||||
}
|
||||
|
||||
crate fn hash(&self) -> Svh {
|
||||
|
@ -18,7 +18,7 @@ use rustc_middle::middle::stability::DeprecationEntry;
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt, Visibility};
|
||||
use rustc_session::utils::NativeLibKind;
|
||||
use rustc_session::{CrateDisambiguator, Session};
|
||||
use rustc_session::{Session, StableCrateId};
|
||||
use rustc_span::source_map::{Span, Spanned};
|
||||
use rustc_span::symbol::Symbol;
|
||||
|
||||
@ -185,7 +185,6 @@ provide! { <'tcx> tcx, def_id, other, cdata,
|
||||
}
|
||||
native_libraries => { Lrc::new(cdata.get_native_libraries(tcx.sess)) }
|
||||
foreign_modules => { cdata.get_foreign_modules(tcx) }
|
||||
crate_disambiguator => { cdata.root.disambiguator }
|
||||
crate_hash => { cdata.root.hash }
|
||||
crate_host_hash => { cdata.host_hash }
|
||||
crate_name => { cdata.root.name }
|
||||
@ -489,8 +488,8 @@ impl CrateStore for CStore {
|
||||
self.get_crate_data(cnum).root.name
|
||||
}
|
||||
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator {
|
||||
self.get_crate_data(cnum).root.disambiguator
|
||||
fn stable_crate_id_untracked(&self, cnum: CrateNum) -> StableCrateId {
|
||||
self.get_crate_data(cnum).root.stable_crate_id
|
||||
}
|
||||
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh {
|
||||
|
@ -671,7 +671,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||
extra_filename: tcx.sess.opts.cg.extra_filename.clone(),
|
||||
triple: tcx.sess.opts.target_triple.clone(),
|
||||
hash: tcx.crate_hash(LOCAL_CRATE),
|
||||
disambiguator: tcx.sess.local_crate_disambiguator(),
|
||||
stable_crate_id: tcx.def_path_hash(LOCAL_CRATE.as_def_id()).stable_crate_id(),
|
||||
panic_strategy: tcx.sess.panic_strategy(),
|
||||
edition: tcx.sess.edition(),
|
||||
|
@ -18,7 +18,6 @@ use rustc_middle::mir;
|
||||
use rustc_middle::ty::{self, ReprOptions, Ty};
|
||||
use rustc_serialize::opaque::Encoder;
|
||||
use rustc_session::config::SymbolManglingVersion;
|
||||
use rustc_session::CrateDisambiguator;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::hygiene::MacroKind;
|
||||
use rustc_span::symbol::{Ident, Symbol};
|
||||
@ -202,7 +201,6 @@ crate struct CrateRoot<'tcx> {
|
||||
triple: TargetTriple,
|
||||
extra_filename: String,
|
||||
hash: Svh,
|
||||
disambiguator: CrateDisambiguator,
|
||||
stable_crate_id: StableCrateId,
|
||||
panic_strategy: PanicStrategy,
|
||||
edition: Edition,
|
||||
|
@ -15,6 +15,7 @@ use rustc_hir::intravisit::Visitor;
|
||||
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
||||
use rustc_hir::*;
|
||||
use rustc_index::vec::Idx;
|
||||
use rustc_span::def_id::StableCrateId;
|
||||
use rustc_span::hygiene::MacroKind;
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::{kw, Ident, Symbol};
|
||||
@ -990,25 +991,24 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Svh {
|
||||
upstream_crates.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
source_file_names.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
tcx.sess.opts.dep_tracking_hash(true).hash_stable(&mut hcx, &mut stable_hasher);
|
||||
tcx.sess.local_crate_disambiguator().to_fingerprint().hash_stable(&mut hcx, &mut stable_hasher);
|
||||
tcx.sess.local_stable_crate_id().hash_stable(&mut hcx, &mut stable_hasher);
|
||||
tcx.untracked_crate.non_exported_macro_attrs.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
|
||||
let crate_hash: Fingerprint = stable_hasher.finish();
|
||||
Svh::new(crate_hash.to_smaller_hash())
|
||||
}
|
||||
|
||||
fn upstream_crates(cstore: &dyn CrateStore) -> Vec<(Symbol, Fingerprint, Svh)> {
|
||||
fn upstream_crates(cstore: &dyn CrateStore) -> Vec<(StableCrateId, Svh)> {
|
||||
let mut upstream_crates: Vec<_> = cstore
|
||||
.crates_untracked()
|
||||
.iter()
|
||||
.map(|&cnum| {
|
||||
let name = cstore.crate_name_untracked(cnum);
|
||||
let disambiguator = cstore.crate_disambiguator_untracked(cnum).to_fingerprint();
|
||||
let stable_crate_id = cstore.stable_crate_id_untracked(cnum);
|
||||
let hash = cstore.crate_hash_untracked(cnum);
|
||||
(name, disambiguator, hash)
|
||||
(stable_crate_id, hash)
|
||||
})
|
||||
.collect();
|
||||
upstream_crates.sort_unstable_by_key(|&(name, dis, _)| (name.as_str(), dis));
|
||||
upstream_crates.sort_unstable_by_key(|&(stable_crate_id, _)| stable_crate_id);
|
||||
upstream_crates
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
|
||||
use rustc_macros::HashStable;
|
||||
use rustc_session::search_paths::PathKind;
|
||||
use rustc_session::utils::NativeLibKind;
|
||||
use rustc_session::CrateDisambiguator;
|
||||
use rustc_session::StableCrateId;
|
||||
use rustc_span::symbol::Symbol;
|
||||
use rustc_span::Span;
|
||||
use rustc_target::spec::Target;
|
||||
@ -185,7 +185,7 @@ pub trait CrateStore {
|
||||
|
||||
// "queries" used in resolve that aren't tracked for incremental compilation
|
||||
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol;
|
||||
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator;
|
||||
fn stable_crate_id_untracked(&self, cnum: CrateNum) -> StableCrateId;
|
||||
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh;
|
||||
|
||||
// This is basically a 1-based range of ints, which is a little
|
||||
|
@ -48,8 +48,8 @@ impl<'tcx> ExportedSymbol<'tcx> {
|
||||
|
||||
pub fn metadata_symbol_name(tcx: TyCtxt<'_>) -> String {
|
||||
format!(
|
||||
"rust_metadata_{}_{}",
|
||||
"rust_metadata_{}_{:08x}",
|
||||
tcx.crate_name(LOCAL_CRATE),
|
||||
tcx.crate_disambiguator(LOCAL_CRATE).to_fingerprint().to_hex()
|
||||
tcx.sess.local_stable_crate_id().to_u64(),
|
||||
)
|
||||
}
|
||||
|
@ -490,15 +490,18 @@ impl CodegenUnitNameBuilder<'tcx> {
|
||||
// local crate's ID. Otherwise there can be collisions between CGUs
|
||||
// instantiating stuff for upstream crates.
|
||||
let local_crate_id = if cnum != LOCAL_CRATE {
|
||||
let local_crate_disambiguator = format!("{}", tcx.crate_disambiguator(LOCAL_CRATE));
|
||||
format!("-in-{}.{}", tcx.crate_name(LOCAL_CRATE), &local_crate_disambiguator[0..8])
|
||||
let local_stable_crate_id = tcx.sess.local_stable_crate_id();
|
||||
format!(
|
||||
"-in-{}.{:08x}",
|
||||
tcx.crate_name(LOCAL_CRATE),
|
||||
local_stable_crate_id.to_u64()
|
||||
)
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
let crate_disambiguator = tcx.crate_disambiguator(cnum).to_string();
|
||||
// Using a shortened disambiguator of about 40 bits
|
||||
format!("{}.{}{}", tcx.crate_name(cnum), &crate_disambiguator[0..8], local_crate_id)
|
||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
||||
format!("{}.{:08x}{}", tcx.crate_name(cnum), stable_crate_id.to_u64(), local_crate_id)
|
||||
});
|
||||
|
||||
write!(cgu_name, "{}", crate_prefix).unwrap();
|
||||
|
@ -1233,10 +1233,6 @@ rustc_queries! {
|
||||
query proc_macro_decls_static(_: ()) -> Option<LocalDefId> {
|
||||
desc { "looking up the derive registrar for a crate" }
|
||||
}
|
||||
query crate_disambiguator(_: CrateNum) -> CrateDisambiguator {
|
||||
eval_always
|
||||
desc { "looking up the disambiguator a crate" }
|
||||
}
|
||||
// The macro which defines `rustc_metadata::provide_extern` depends on this query's name.
|
||||
// Changing the name should cause a compiler error, but in case that changes, be aware.
|
||||
query crate_hash(_: CrateNum) -> Svh {
|
||||
|
@ -1305,24 +1305,24 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
|
||||
pub fn def_path_debug_str(self, def_id: DefId) -> String {
|
||||
// We are explicitly not going through queries here in order to get
|
||||
// crate name and disambiguator since this code is called from debug!()
|
||||
// crate name and stable crate id since this code is called from debug!()
|
||||
// statements within the query system and we'd run into endless
|
||||
// recursion otherwise.
|
||||
let (crate_name, crate_disambiguator) = if def_id.is_local() {
|
||||
(self.crate_name, self.sess.local_crate_disambiguator())
|
||||
let (crate_name, stable_crate_id) = if def_id.is_local() {
|
||||
(self.crate_name, self.sess.local_stable_crate_id())
|
||||
} else {
|
||||
(
|
||||
self.cstore.crate_name_untracked(def_id.krate),
|
||||
self.cstore.crate_disambiguator_untracked(def_id.krate),
|
||||
self.def_path_hash(def_id.krate.as_def_id()).stable_crate_id(),
|
||||
)
|
||||
};
|
||||
|
||||
format!(
|
||||
"{}[{}]{}",
|
||||
crate_name,
|
||||
// Don't print the whole crate disambiguator. That's just
|
||||
// Don't print the whole stable crate id. That's just
|
||||
// annoying in debug output.
|
||||
&(crate_disambiguator.to_fingerprint().to_hex())[..4],
|
||||
&(format!("{:08x}", stable_crate_id.to_u64()))[..4],
|
||||
self.def_path(def_id).to_string_no_crate_verbose()
|
||||
)
|
||||
}
|
||||
|
@ -48,7 +48,6 @@ use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec};
|
||||
use rustc_serialize::opaque;
|
||||
use rustc_session::config::{EntryFnType, OptLevel, OutputFilenames, SymbolManglingVersion};
|
||||
use rustc_session::utils::NativeLibKind;
|
||||
use rustc_session::CrateDisambiguator;
|
||||
use rustc_session::Limits;
|
||||
use rustc_target::spec::PanicStrategy;
|
||||
|
||||
|
@ -1221,7 +1221,7 @@ impl<'a> Resolver<'a> {
|
||||
let mut module_map = FxHashMap::default();
|
||||
module_map.insert(root_local_def_id, graph_root);
|
||||
|
||||
let definitions = Definitions::new(crate_name, session.local_crate_disambiguator());
|
||||
let definitions = Definitions::new(session.local_stable_crate_id());
|
||||
let root = definitions.get_root_def();
|
||||
|
||||
let mut visibilities = FxHashMap::default();
|
||||
|
@ -142,12 +142,7 @@ impl<'tcx> DumpVisitor<'tcx> {
|
||||
let data = CratePreludeData {
|
||||
crate_id: GlobalCrateId {
|
||||
name: name.into(),
|
||||
disambiguator: self
|
||||
.tcx
|
||||
.sess
|
||||
.local_crate_disambiguator()
|
||||
.to_fingerprint()
|
||||
.as_value(),
|
||||
disambiguator: (self.tcx.sess.local_stable_crate_id().to_u64(), 0),
|
||||
},
|
||||
crate_root: crate_root.unwrap_or_else(|| "<no source>".to_owned()),
|
||||
external_crates: self.save_ctxt.get_external_crates(),
|
||||
|
@ -127,7 +127,10 @@ impl<'tcx> SaveContext<'tcx> {
|
||||
num: n.as_u32(),
|
||||
id: GlobalCrateId {
|
||||
name: self.tcx.crate_name(n).to_string(),
|
||||
disambiguator: self.tcx.crate_disambiguator(n).to_fingerprint().as_value(),
|
||||
disambiguator: (
|
||||
self.tcx.def_path_hash(n.as_def_id()).stable_crate_id().to_u64(),
|
||||
0,
|
||||
),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ use rustc_errors::registry::Registry;
|
||||
use rustc_errors::{Diagnostic, DiagnosticBuilder, DiagnosticId, ErrorReported};
|
||||
use rustc_lint_defs::FutureBreakage;
|
||||
use rustc_macros::HashStable_Generic;
|
||||
pub use rustc_span::crate_disambiguator::CrateDisambiguator;
|
||||
pub use rustc_span::def_id::StableCrateId;
|
||||
use rustc_span::source_map::{FileLoader, MultiSpan, RealFileLoader, SourceMap, Span};
|
||||
use rustc_span::{edition::Edition, RealFileName};
|
||||
use rustc_span::{sym, SourceFileHashAlgorithm, Symbol};
|
||||
@ -148,12 +148,12 @@ pub struct Session {
|
||||
/// in order to avoid redundantly verbose output (Issue #24690, #44953).
|
||||
pub one_time_diagnostics: Lock<FxHashSet<(DiagnosticMessageId, Option<Span>, String)>>,
|
||||
crate_types: OnceCell<Vec<CrateType>>,
|
||||
/// The `crate_disambiguator` is constructed out of all the `-C metadata`
|
||||
/// arguments passed to the compiler. Its value together with the crate-name
|
||||
/// forms a unique global identifier for the crate. It is used to allow
|
||||
/// multiple crates with the same name to coexist. See the
|
||||
/// 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_codegen_llvm::back::symbol_names` module for more information.
|
||||
pub crate_disambiguator: OnceCell<CrateDisambiguator>,
|
||||
pub stable_crate_id: OnceCell<StableCrateId>,
|
||||
|
||||
features: OnceCell<rustc_feature::Features>,
|
||||
|
||||
@ -336,8 +336,8 @@ impl Session {
|
||||
self.parse_sess.span_diagnostic.emit_future_breakage_report(diags_and_breakage);
|
||||
}
|
||||
|
||||
pub fn local_crate_disambiguator(&self) -> CrateDisambiguator {
|
||||
self.crate_disambiguator.get().copied().unwrap()
|
||||
pub fn local_stable_crate_id(&self) -> StableCrateId {
|
||||
self.stable_crate_id.get().copied().unwrap()
|
||||
}
|
||||
|
||||
pub fn crate_types(&self) -> &[CrateType] {
|
||||
@ -803,12 +803,12 @@ impl Session {
|
||||
|
||||
/// Returns the symbol name for the registrar function,
|
||||
/// given the crate `Svh` and the function `DefIndex`.
|
||||
pub fn generate_plugin_registrar_symbol(&self, disambiguator: CrateDisambiguator) -> String {
|
||||
format!("__rustc_plugin_registrar_{}__", disambiguator.to_fingerprint().to_hex())
|
||||
pub fn generate_plugin_registrar_symbol(&self, stable_crate_id: StableCrateId) -> String {
|
||||
format!("__rustc_plugin_registrar_{:08x}__", stable_crate_id.to_u64())
|
||||
}
|
||||
|
||||
pub fn generate_proc_macro_decls_symbol(&self, disambiguator: CrateDisambiguator) -> String {
|
||||
format!("__rustc_proc_macro_decls_{}__", disambiguator.to_fingerprint().to_hex())
|
||||
pub fn generate_proc_macro_decls_symbol(&self, stable_crate_id: StableCrateId) -> String {
|
||||
format!("__rustc_proc_macro_decls_{:08x}__", stable_crate_id.to_u64())
|
||||
}
|
||||
|
||||
pub fn target_filesearch(&self, kind: PathKind) -> filesearch::FileSearch<'_> {
|
||||
@ -1370,7 +1370,7 @@ pub fn build_session(
|
||||
working_dir,
|
||||
one_time_diagnostics: Default::default(),
|
||||
crate_types: OnceCell::new(),
|
||||
crate_disambiguator: OnceCell::new(),
|
||||
stable_crate_id: OnceCell::new(),
|
||||
features: OnceCell::new(),
|
||||
lint_store: OnceCell::new(),
|
||||
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
||||
|
@ -1,35 +0,0 @@
|
||||
// This is here because `rustc_session` wants to refer to it,
|
||||
// and so does `rustc_hir`, but `rustc_hir` shouldn't refer to `rustc_session`.
|
||||
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::{base_n, impl_stable_hash_via_hash};
|
||||
|
||||
use std::fmt;
|
||||
|
||||
/// Hash value constructed out of all the `-C metadata` arguments passed to the
|
||||
/// compiler. Together with the crate-name forms a unique global identifier for
|
||||
/// the crate.
|
||||
#[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Clone, Copy, Encodable, Decodable)]
|
||||
pub struct CrateDisambiguator(Fingerprint);
|
||||
|
||||
impl CrateDisambiguator {
|
||||
pub fn to_fingerprint(self) -> Fingerprint {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for CrateDisambiguator {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
|
||||
let (a, b) = self.0.as_value();
|
||||
let as_u128 = a as u128 | ((b as u128) << 64);
|
||||
f.write_str(&base_n::encode(as_u128, base_n::CASE_INSENSITIVE))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Fingerprint> for CrateDisambiguator {
|
||||
fn from(fingerprint: Fingerprint) -> CrateDisambiguator {
|
||||
CrateDisambiguator(fingerprint)
|
||||
}
|
||||
}
|
||||
|
||||
impl_stable_hash_via_hash!(CrateDisambiguator);
|
@ -1,4 +1,3 @@
|
||||
use crate::crate_disambiguator::CrateDisambiguator;
|
||||
use crate::HashStableContext;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
||||
@ -127,26 +126,51 @@ impl Borrow<Fingerprint> for DefPathHash {
|
||||
}
|
||||
}
|
||||
|
||||
/// A [StableCrateId] is a 64 bit hash of `(crate-name, crate-disambiguator)`. It
|
||||
/// is to [CrateNum] what [DefPathHash] is to [DefId]. It is stable across
|
||||
/// compilation sessions.
|
||||
/// A [StableCrateId] is a 64 bit hash of the crate name combined with all
|
||||
/// `-Cmetadata` arguments. It is to [CrateNum] what [DefPathHash] is to
|
||||
/// [DefId]. It is stable across compilation sessions.
|
||||
///
|
||||
/// Since the ID is a hash value there is a (very small) chance that two crates
|
||||
/// end up with the same [StableCrateId]. The compiler will check for such
|
||||
/// collisions when loading crates and abort compilation in order to avoid
|
||||
/// further trouble.
|
||||
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Encodable, Decodable)]
|
||||
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
|
||||
#[derive(HashStable_Generic, Encodable, Decodable)]
|
||||
pub struct StableCrateId(u64);
|
||||
|
||||
impl StableCrateId {
|
||||
pub fn to_u64(self) -> u64 {
|
||||
self.0
|
||||
}
|
||||
|
||||
/// Computes the stable ID for a crate with the given name and
|
||||
/// disambiguator.
|
||||
pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> StableCrateId {
|
||||
/// `-Cmetadata` arguments.
|
||||
pub fn new(crate_name: &str, is_exe: bool, mut metadata: Vec<String>) -> StableCrateId {
|
||||
use std::hash::Hash;
|
||||
use std::hash::Hasher;
|
||||
|
||||
let mut hasher = StableHasher::new();
|
||||
crate_name.hash(&mut hasher);
|
||||
crate_disambiguator.hash(&mut hasher);
|
||||
|
||||
// We don't want the stable crate id to dependent on the order
|
||||
// -C metadata arguments, so sort them:
|
||||
metadata.sort();
|
||||
// Every distinct -C metadata value is only incorporated once:
|
||||
metadata.dedup();
|
||||
|
||||
hasher.write(b"metadata");
|
||||
for s in &metadata {
|
||||
// Also incorporate the length of a metadata string, so that we generate
|
||||
// different values for `-Cmetadata=ab -Cmetadata=c` and
|
||||
// `-Cmetadata=a -Cmetadata=bc`
|
||||
hasher.write_usize(s.len());
|
||||
hasher.write(s.as_bytes());
|
||||
}
|
||||
|
||||
// Also incorporate crate type, so that we don't get symbol conflicts when
|
||||
// linking against a library of the same name, if this is an executable.
|
||||
hasher.write(if is_exe { b"exe" } else { b"lib" });
|
||||
|
||||
StableCrateId(hasher.finish())
|
||||
}
|
||||
}
|
||||
|
@ -45,8 +45,6 @@ pub mod lev_distance;
|
||||
mod span_encoding;
|
||||
pub use span_encoding::{Span, DUMMY_SP};
|
||||
|
||||
pub mod crate_disambiguator;
|
||||
|
||||
pub mod symbol;
|
||||
pub use symbol::{sym, Symbol};
|
||||
|
||||
|
@ -126,8 +126,9 @@ fn get_symbol_hash<'tcx>(
|
||||
substs.hash_stable(&mut hcx, &mut hasher);
|
||||
|
||||
if let Some(instantiating_crate) = instantiating_crate {
|
||||
tcx.crate_name(instantiating_crate).as_str().hash_stable(&mut hcx, &mut hasher);
|
||||
tcx.crate_disambiguator(instantiating_crate).hash_stable(&mut hcx, &mut hasher);
|
||||
tcx.def_path_hash(instantiating_crate.as_def_id())
|
||||
.stable_crate_id()
|
||||
.hash_stable(&mut hcx, &mut hasher);
|
||||
}
|
||||
|
||||
// We want to avoid accidental collision between different types of instances.
|
||||
|
@ -165,12 +165,12 @@ fn compute_symbol_name(
|
||||
// FIXME(eddyb) Precompute a custom symbol name based on attributes.
|
||||
let is_foreign = if let Some(def_id) = def_id.as_local() {
|
||||
if tcx.plugin_registrar_fn(()) == Some(def_id) {
|
||||
let disambiguator = tcx.sess.local_crate_disambiguator();
|
||||
return tcx.sess.generate_plugin_registrar_symbol(disambiguator);
|
||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
||||
return tcx.sess.generate_plugin_registrar_symbol(stable_crate_id);
|
||||
}
|
||||
if tcx.proc_macro_decls_static(()) == Some(def_id) {
|
||||
let disambiguator = tcx.sess.local_crate_disambiguator();
|
||||
return tcx.sess.generate_proc_macro_decls_symbol(disambiguator);
|
||||
let stable_crate_id = tcx.sess.local_stable_crate_id();
|
||||
return tcx.sess.generate_proc_macro_decls_symbol(stable_crate_id);
|
||||
}
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
matches!(tcx.hir().get(hir_id), Node::ForeignItem(_))
|
||||
|
@ -592,8 +592,8 @@ impl Printer<'tcx> for SymbolMangler<'tcx> {
|
||||
|
||||
fn path_crate(mut self, cnum: CrateNum) -> Result<Self::Path, Self::Error> {
|
||||
self.push("C");
|
||||
let fingerprint = self.tcx.crate_disambiguator(cnum).to_fingerprint();
|
||||
self.push_disambiguator(fingerprint.to_smaller_hash());
|
||||
let stable_crate_id = self.tcx.def_path_hash(cnum.as_def_id()).stable_crate_id();
|
||||
self.push_disambiguator(stable_crate_id.to_u64());
|
||||
let name = self.tcx.crate_name(cnum).as_str();
|
||||
self.push_ident(&name);
|
||||
Ok(self)
|
||||
|
@ -1,12 +1,11 @@
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_middle::hir::map as hir_map;
|
||||
use rustc_middle::ty::subst::Subst;
|
||||
use rustc_middle::ty::{
|
||||
self, Binder, Predicate, PredicateKind, ToPredicate, Ty, TyCtxt, WithConstness,
|
||||
};
|
||||
use rustc_session::CrateDisambiguator;
|
||||
use rustc_span::Span;
|
||||
use rustc_trait_selection::traits;
|
||||
|
||||
@ -388,11 +387,6 @@ fn param_env_reveal_all_normalized(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamE
|
||||
tcx.param_env(def_id).with_reveal_all_normalized(tcx)
|
||||
}
|
||||
|
||||
fn crate_disambiguator(tcx: TyCtxt<'_>, crate_num: CrateNum) -> CrateDisambiguator {
|
||||
assert_eq!(crate_num, LOCAL_CRATE);
|
||||
tcx.sess.local_crate_disambiguator()
|
||||
}
|
||||
|
||||
fn instance_def_size_estimate<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
instance_def: ty::InstanceDef<'tcx>,
|
||||
@ -538,7 +532,6 @@ pub fn provide(providers: &mut ty::query::Providers) {
|
||||
param_env,
|
||||
param_env_reveal_all_normalized,
|
||||
trait_of_item,
|
||||
crate_disambiguator,
|
||||
instance_def_size_estimate,
|
||||
issue33140_self_ty,
|
||||
impl_defaultness,
|
||||
|
Loading…
Reference in New Issue
Block a user