Merge CrateDisambiguator into StableCrateId
This commit is contained in:
parent
d93b6a4598
commit
d0ec85d3fb
30 changed files with 125 additions and 207 deletions
|
@ -12,7 +12,7 @@ use rustc_data_structures::temp_dir::MaybeTempDir;
|
|||
use rustc_data_structures::{box_region_allow_access, declare_box_region_type, parallel};
|
||||
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;
|
||||
|
@ -170,9 +170,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;
|
||||
|
@ -496,39 +493,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],
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue