From: Igor Matuszewski Date: Mon, 23 Oct 2017 16:44:58 +0000 (+0200) Subject: Use 128 bit instead of Symbol for crate disambiguator X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=d017466d103d2b155d3ef645c538c03e3008ac95;p=rust.git Use 128 bit instead of Symbol for crate disambiguator --- diff --git a/src/librustc/hir/map/collector.rs b/src/librustc/hir/map/collector.rs index 80fadcda277..10900624d92 100644 --- a/src/librustc/hir/map/collector.rs +++ b/src/librustc/hir/map/collector.rs @@ -11,6 +11,7 @@ use super::*; use dep_graph::{DepGraph, DepKind, DepNodeIndex}; +use ich::Fingerprint; use hir::intravisit::{Visitor, NestedVisitorMap}; use std::iter::repeat; use syntax::ast::{NodeId, CRATE_NODE_ID}; @@ -118,7 +119,7 @@ pub(super) fn root(krate: &'hir Crate, } pub(super) fn finalize_and_compute_crate_hash(self, - crate_disambiguator: &str) + crate_disambiguator: &Fingerprint) -> Vec> { let mut node_hashes: Vec<_> = self .hir_body_nodes diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 8ce2feab06c..6da612fbaa6 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -1014,7 +1014,7 @@ pub fn map_crate<'hir>(sess: &::session::Session, hcx); intravisit::walk_crate(&mut collector, &forest.krate); - let crate_disambiguator = sess.local_crate_disambiguator().as_str(); + let crate_disambiguator = sess.local_crate_disambiguator(); collector.finalize_and_compute_crate_hash(&crate_disambiguator) }; diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index a97bfa05369..39b2162bd32 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -267,7 +267,7 @@ pub trait CrateStore { fn export_macros_untracked(&self, cnum: CrateNum); fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind; fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol; - fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> Symbol; + fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> ich::Fingerprint; fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh; fn struct_field_names_untracked(&self, def: DefId) -> Vec; fn item_children_untracked(&self, did: DefId, sess: &Session) -> Vec; @@ -338,7 +338,7 @@ fn associated_item_cloned_untracked(&self, def: DefId) -> ty::AssociatedItem fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind { bug!("is_explicitly_linked") } fn export_macros_untracked(&self, cnum: CrateNum) { bug!("export_macros") } fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol { bug!("crate_name") } - fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> Symbol { + fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> ich::Fingerprint { bug!("crate_disambiguator") } fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh { bug!("crate_hash") } diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 2634ab10007..23fea747f76 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -12,6 +12,7 @@ pub use self::code_stats::{SizeKind, TypeSizeInfo, VariantInfo}; use hir::def_id::{CrateNum, DefIndex}; +use ich::Fingerprint; use lint; use middle::allocator::AllocatorKind; @@ -29,7 +30,6 @@ use syntax::feature_gate; use syntax::parse; use syntax::parse::ParseSess; -use syntax::symbol::Symbol; use syntax::{ast, codemap}; use syntax::feature_gate::AttributeType; use syntax_pos::{Span, MultiSpan}; @@ -88,7 +88,7 @@ pub struct Session { /// forms a unique global identifier for the crate. It is used to allow /// multiple crates with the same name to coexist. See the /// trans::back::symbol_names module for more information. - pub crate_disambiguator: RefCell>, + pub crate_disambiguator: RefCell>, pub features: RefCell, /// The maximum recursion limit for potentially infinitely recursive @@ -165,7 +165,7 @@ enum DiagnosticBuilderMethod { } impl Session { - pub fn local_crate_disambiguator(&self) -> Symbol { + pub fn local_crate_disambiguator(&self) -> Fingerprint { match *self.crate_disambiguator.borrow() { Some(sym) => sym, None => bug!("accessing disambiguator before initialization"), @@ -471,14 +471,17 @@ pub fn must_not_eliminate_frame_pointers(&self) -> bool { /// Returns the symbol name for the registrar function, /// given the crate Svh and the function DefIndex. - pub fn generate_plugin_registrar_symbol(&self, disambiguator: Symbol, index: DefIndex) + pub fn generate_plugin_registrar_symbol(&self, disambiguator: Fingerprint, + index: DefIndex) -> String { - format!("__rustc_plugin_registrar__{}_{}", disambiguator, index.as_usize()) + format!("__rustc_plugin_registrar__{}_{}", disambiguator.to_hex(), + index.as_usize()) } - pub fn generate_derive_registrar_symbol(&self, disambiguator: Symbol, index: DefIndex) + pub fn generate_derive_registrar_symbol(&self, disambiguator: Fingerprint, index: DefIndex) -> String { - format!("__rustc_derive_registrar__{}_{}", disambiguator, index.as_usize()) + format!("__rustc_derive_registrar__{}_{}", disambiguator.to_hex(), + index.as_usize()) } pub fn sysroot<'a>(&'a self) -> &'a Path { diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 3d5e8ea583c..51e924bd08b 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -1251,7 +1251,7 @@ pub fn def_path_debug_str(self, def_id: DefId) -> String { crate_name, // Don't print the whole crate disambiguator. That's just // annoying in debug output. - &(crate_disambiguator.as_str())[..4], + &(crate_disambiguator.to_hex())[..4], self.def_path(def_id).to_string_no_crate()) } diff --git a/src/librustc/ty/maps/mod.rs b/src/librustc/ty/maps/mod.rs index 839042bf229..3c2630bb33a 100644 --- a/src/librustc/ty/maps/mod.rs +++ b/src/librustc/ty/maps/mod.rs @@ -10,6 +10,7 @@ use dep_graph::{DepConstructor, DepNode}; use errors::DiagnosticBuilder; +use ich::Fingerprint; use hir::def_id::{CrateNum, DefId, DefIndex}; use hir::def::{Def, Export}; use hir::{self, TraitCandidate, ItemLocalId}; @@ -283,7 +284,7 @@ [] fn native_libraries: NativeLibraries(CrateNum) -> Rc>, [] fn plugin_registrar_fn: PluginRegistrarFn(CrateNum) -> Option, [] fn derive_registrar_fn: DeriveRegistrarFn(CrateNum) -> Option, - [] fn crate_disambiguator: CrateDisambiguator(CrateNum) -> Symbol, + [] fn crate_disambiguator: CrateDisambiguator(CrateNum) -> Fingerprint, [] fn crate_hash: CrateHash(CrateNum) -> Svh, [] fn original_crate_name: OriginalCrateName(CrateNum) -> Symbol, diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 129c81c5cd6..3b49cceee90 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -19,7 +19,7 @@ use hir::def::{Def, CtorKind, ExportMap}; use hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; use hir::map::DefPathData; -use ich::StableHashingContext; +use ich::{Fingerprint, StableHashingContext}; use middle::const_val::ConstVal; use middle::lang_items::{FnTraitLangItem, FnMutTraitLangItem, FnOnceTraitLangItem}; use middle::privacy::AccessLevels; @@ -2562,7 +2562,7 @@ fn param_env<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } fn crate_disambiguator<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, - crate_num: CrateNum) -> Symbol { + crate_num: CrateNum) -> Fingerprint { assert_eq!(crate_num, LOCAL_CRATE); tcx.sess.local_crate_disambiguator() } diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 7dbf93da385..6849cbbb062 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -58,7 +58,6 @@ use syntax::attr; use syntax::ext::base::ExtCtxt; use syntax::parse::{self, PResult}; -use syntax::symbol::Symbol; use syntax::util::node_count::NodeCounter; use syntax; use syntax_ext; @@ -633,12 +632,12 @@ pub fn phase_2_configure_and_expand(sess: &Session, *sess.crate_types.borrow_mut() = collect_crate_types(sess, &krate.attrs); - let disambiguator = Symbol::intern(&compute_crate_disambiguator(sess)); + let disambiguator = compute_crate_disambiguator(sess); *sess.crate_disambiguator.borrow_mut() = Some(disambiguator); rustc_incremental::prepare_session_directory( sess, &crate_name, - &disambiguator.as_str(), + &disambiguator, ); let dep_graph = if sess.opts.build_dep_graph() { @@ -1312,16 +1311,13 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec String { +pub fn compute_crate_disambiguator(session: &Session) -> Fingerprint { 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. - // FIXME(mw): It seems that the crate_disambiguator is used everywhere as - // a hex-string instead of raw bytes. We should really use the - // smaller representation. let mut hasher = StableHasher::::new(); let mut metadata = session.opts.cg.metadata.clone(); @@ -1340,11 +1336,13 @@ pub fn compute_crate_disambiguator(session: &Session) -> String { hasher.write(s.as_bytes()); } - // If this is an executable, add a special suffix, so that we don't get - // symbol conflicts when linking against a library of the same name. + // 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.borrow().contains(&config::CrateTypeExecutable); + hasher.write(if is_exe { b"exe" } else { b"lib" }); + + hasher.finish() - format!("{}{}", hasher.finish().to_hex(), if is_exe { "-exe" } else {""}) } pub fn build_output_filenames(input: &Input, diff --git a/src/librustc_incremental/persist/fs.rs b/src/librustc_incremental/persist/fs.rs index d53ee5c804f..bbca0aef600 100644 --- a/src/librustc_incremental/persist/fs.rs +++ b/src/librustc_incremental/persist/fs.rs @@ -114,6 +114,7 @@ //! unsupported file system and emit a warning in that case. This is not yet //! implemented. +use rustc::ich::Fingerprint; use rustc::hir::svh::Svh; use rustc::session::Session; use rustc::util::fs as fs_util; @@ -188,7 +189,7 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu /// The garbage collection will take care of it. pub fn prepare_session_directory(sess: &Session, crate_name: &str, - crate_disambiguator: &str) { + crate_disambiguator: &Fingerprint) { if sess.opts.incremental.is_none() { return } @@ -614,21 +615,15 @@ fn string_to_timestamp(s: &str) -> Result { fn crate_path(sess: &Session, crate_name: &str, - crate_disambiguator: &str) + crate_disambiguator: &Fingerprint) -> PathBuf { - use std::hash::{Hasher, Hash}; - use std::collections::hash_map::DefaultHasher; let incr_dir = sess.opts.incremental.as_ref().unwrap().clone(); - // The full crate disambiguator is really long. A hash of it should be - // sufficient. - let mut hasher = DefaultHasher::new(); - crate_disambiguator.hash(&mut hasher); - + let crate_disambiguator = crate_disambiguator.to_smaller_hash(); let crate_name = format!("{}-{}", crate_name, - base_n::encode(hasher.finish(), INT_ENCODE_BASE)); + base_n::encode(crate_disambiguator, INT_ENCODE_BASE)); incr_dir.join(crate_name) } diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 39bdf88925e..475f0fac36a 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -15,6 +15,7 @@ use native_libs::relevant_lib; use schema::CrateRoot; +use rustc::ich::Fingerprint; use rustc::hir::def_id::{CrateNum, DefIndex, CRATE_DEF_INDEX}; use rustc::hir::svh::Svh; use rustc::middle::allocator::AllocatorKind; @@ -626,7 +627,7 @@ fn register_bang_proc_macro(&mut self, pub fn find_plugin_registrar(&mut self, span: Span, name: &str) - -> Option<(PathBuf, Symbol, DefIndex)> { + -> Option<(PathBuf, Fingerprint, DefIndex)> { let ekrate = self.read_extension_crate(span, &ExternCrateInfo { name: Symbol::intern(name), ident: Symbol::intern(name), diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 9e47e96aee4..22af9d7c33a 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -13,6 +13,7 @@ use schema; +use rustc::ich::Fingerprint; use rustc::hir::def_id::{CRATE_DEF_INDEX, CrateNum, DefIndex}; use rustc::hir::map::definitions::DefPathTable; use rustc::hir::svh::Svh; @@ -171,7 +172,7 @@ pub fn name(&self) -> Symbol { pub fn hash(&self) -> Svh { self.root.hash } - pub fn disambiguator(&self) -> Symbol { + pub fn disambiguator(&self) -> Fingerprint { self.root.disambiguator } diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 8eacc21ab00..023ce209038 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -20,6 +20,7 @@ LoadedMacro, EncodedMetadata, EncodedMetadataHashes, NativeLibraryKind}; use rustc::middle::stability::DeprecationEntry; +use rustc::ich::Fingerprint; use rustc::hir::def; use rustc::session::Session; use rustc::ty::{self, TyCtxt}; @@ -384,7 +385,7 @@ fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol self.get_crate_data(cnum).name } - fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> Symbol + fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> Fingerprint { self.get_crate_data(cnum).disambiguator() } diff --git a/src/librustc_metadata/schema.rs b/src/librustc_metadata/schema.rs index dad0d26d271..baea919db66 100644 --- a/src/librustc_metadata/schema.rs +++ b/src/librustc_metadata/schema.rs @@ -14,7 +14,7 @@ use rustc::hir; use rustc::hir::def::{self, CtorKind}; use rustc::hir::def_id::{DefIndex, DefId, CrateNum}; -use rustc::ich::StableHashingContext; +use rustc::ich::{Fingerprint, StableHashingContext}; use rustc::middle::cstore::{DepKind, LinkagePreference, NativeLibrary}; use rustc::middle::lang_items; use rustc::mir; @@ -191,7 +191,7 @@ pub struct CrateRoot { pub name: Symbol, pub triple: String, pub hash: hir::svh::Svh, - pub disambiguator: Symbol, + pub disambiguator: Fingerprint, pub panic_strategy: PanicStrategy, pub has_global_allocator: bool, pub has_default_lib_allocator: bool, diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index c7ec1d072d0..4b8b9c57da7 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1417,7 +1417,7 @@ pub fn new(session: &'a Session, let mut definitions = Definitions::new(); DefCollector::new(&mut definitions, Mark::root()) - .collect_root(crate_name, &session.local_crate_disambiguator().as_str()); + .collect_root(crate_name, &session.local_crate_disambiguator().to_hex()); let mut invocations = FxHashMap(); invocations.insert(Mark::root(), diff --git a/src/librustc_trans/back/symbol_export.rs b/src/librustc_trans/back/symbol_export.rs index 4996972a645..f518e5b8b8d 100644 --- a/src/librustc_trans/back/symbol_export.rs +++ b/src/librustc_trans/back/symbol_export.rs @@ -34,7 +34,7 @@ pub fn threshold(tcx: TyCtxt) -> SymbolExportLevel { pub fn metadata_symbol_name(tcx: TyCtxt) -> String { format!("rust_metadata_{}_{}", tcx.crate_name(LOCAL_CRATE), - tcx.crate_disambiguator(LOCAL_CRATE)) + tcx.crate_disambiguator(LOCAL_CRATE).to_hex()) } fn crate_export_threshold(crate_type: config::CrateType) -> SymbolExportLevel { diff --git a/src/librustc_trans/back/symbol_names.rs b/src/librustc_trans/back/symbol_names.rs index 0ebfe4daad1..695950e6727 100644 --- a/src/librustc_trans/back/symbol_names.rs +++ b/src/librustc_trans/back/symbol_names.rs @@ -220,7 +220,7 @@ fn get_symbol_hash<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, if avoid_cross_crate_conflicts { hasher.hash(tcx.crate_name.as_str()); - hasher.hash(tcx.sess.local_crate_disambiguator().as_str()); + hasher.hash(tcx.sess.local_crate_disambiguator()); } });