Skip to content

Commit 7fa64bc

Browse files
committed
Introduce CrateDisambiguator newtype and fix tests
1 parent d017466 commit 7fa64bc

File tree

21 files changed

+87
-59
lines changed

21 files changed

+87
-59
lines changed

src/librustc/hir/map/collector.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
use super::*;
1212

1313
use dep_graph::{DepGraph, DepKind, DepNodeIndex};
14-
use ich::Fingerprint;
1514
use hir::intravisit::{Visitor, NestedVisitorMap};
15+
use session::CrateDisambiguator;
1616
use std::iter::repeat;
1717
use syntax::ast::{NodeId, CRATE_NODE_ID};
1818
use syntax_pos::Span;
@@ -119,7 +119,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
119119
}
120120

121121
pub(super) fn finalize_and_compute_crate_hash(self,
122-
crate_disambiguator: &Fingerprint)
122+
crate_disambiguator: CrateDisambiguator)
123123
-> Vec<MapEntry<'hir>> {
124124
let mut node_hashes: Vec<_> = self
125125
.hir_body_nodes
@@ -134,7 +134,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
134134

135135
self.dep_graph.with_task(DepNode::new_no_params(DepKind::Krate),
136136
&self.hcx,
137-
(node_hashes, crate_disambiguator),
137+
(node_hashes, crate_disambiguator.to_fingerprint()),
138138
identity_fn);
139139
self.map
140140
}

src/librustc/hir/map/def_collector.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use hir::map::definitions::*;
1212
use hir::def_id::{CRATE_DEF_INDEX, DefIndex, DefIndexAddressSpace};
13+
use session::CrateDisambiguator;
1314

1415
use syntax::ast::*;
1516
use syntax::ext::hygiene::Mark;
@@ -43,7 +44,9 @@ impl<'a> DefCollector<'a> {
4344
}
4445
}
4546

46-
pub fn collect_root(&mut self, crate_name: &str, crate_disambiguator: &str) {
47+
pub fn collect_root(&mut self,
48+
crate_name: &str,
49+
crate_disambiguator: CrateDisambiguator) {
4750
let root = self.definitions.create_root_def(crate_name,
4851
crate_disambiguator);
4952
assert_eq!(root, CRATE_DEF_INDEX);

src/librustc/hir/map/definitions.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use rustc_data_structures::fx::FxHashMap;
2222
use rustc_data_structures::indexed_vec::IndexVec;
2323
use rustc_data_structures::stable_hasher::StableHasher;
2424
use serialize::{Encodable, Decodable, Encoder, Decoder};
25+
use session::CrateDisambiguator;
2526
use std::fmt::Write;
2627
use std::hash::Hash;
2728
use syntax::ast;
@@ -231,7 +232,9 @@ impl DefKey {
231232
DefPathHash(hasher.finish())
232233
}
233234

234-
fn root_parent_stable_hash(crate_name: &str, crate_disambiguator: &str) -> DefPathHash {
235+
fn root_parent_stable_hash(crate_name: &str,
236+
crate_disambiguator: CrateDisambiguator)
237+
-> DefPathHash {
235238
let mut hasher = StableHasher::new();
236239
// Disambiguate this from a regular DefPath hash,
237240
// see compute_stable_hash() above.
@@ -467,7 +470,7 @@ impl Definitions {
467470
/// Add a definition with a parent definition.
468471
pub fn create_root_def(&mut self,
469472
crate_name: &str,
470-
crate_disambiguator: &str)
473+
crate_disambiguator: CrateDisambiguator)
471474
-> DefIndex {
472475
let key = DefKey {
473476
parent: None,

src/librustc/hir/map/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ pub fn map_crate<'hir>(sess: &::session::Session,
10151015
intravisit::walk_crate(&mut collector, &forest.krate);
10161016

10171017
let crate_disambiguator = sess.local_crate_disambiguator();
1018-
collector.finalize_and_compute_crate_hash(&crate_disambiguator)
1018+
collector.finalize_and_compute_crate_hash(crate_disambiguator)
10191019
};
10201020

10211021
if log_enabled!(::log::LogLevel::Debug) {

src/librustc/middle/cstore.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use hir::map::definitions::{Definitions, DefKey, DefPathTable};
3030
use hir::svh::Svh;
3131
use ich;
3232
use ty::{self, TyCtxt};
33-
use session::Session;
33+
use session::{Session, CrateDisambiguator};
3434
use session::search_paths::PathKind;
3535
use util::nodemap::NodeSet;
3636

@@ -267,7 +267,7 @@ pub trait CrateStore {
267267
fn export_macros_untracked(&self, cnum: CrateNum);
268268
fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind;
269269
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol;
270-
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> ich::Fingerprint;
270+
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator;
271271
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh;
272272
fn struct_field_names_untracked(&self, def: DefId) -> Vec<ast::Name>;
273273
fn item_children_untracked(&self, did: DefId, sess: &Session) -> Vec<def::Export>;
@@ -338,7 +338,7 @@ impl CrateStore for DummyCrateStore {
338338
fn dep_kind_untracked(&self, cnum: CrateNum) -> DepKind { bug!("is_explicitly_linked") }
339339
fn export_macros_untracked(&self, cnum: CrateNum) { bug!("export_macros") }
340340
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol { bug!("crate_name") }
341-
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> ich::Fingerprint {
341+
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator {
342342
bug!("crate_disambiguator")
343343
}
344344
fn crate_hash_untracked(&self, cnum: CrateNum) -> Svh { bug!("crate_hash") }

src/librustc/session/mod.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ pub struct Session {
8383
pub plugin_attributes: RefCell<Vec<(String, AttributeType)>>,
8484
pub crate_types: RefCell<Vec<config::CrateType>>,
8585
pub dependency_formats: RefCell<dependency_format::Dependencies>,
86-
/// The crate_disambiguator is constructed out of all the `-C metadata`
86+
/// The crate_disambiguator is constructed out of all the `-C metadata`
8787
/// arguments passed to the compiler. Its value together with the crate-name
8888
/// forms a unique global identifier for the crate. It is used to allow
8989
/// multiple crates with the same name to coexist. See the
9090
/// trans::back::symbol_names module for more information.
91-
pub crate_disambiguator: RefCell<Option<Fingerprint>>,
91+
pub crate_disambiguator: RefCell<Option<CrateDisambiguator>>,
9292
pub features: RefCell<feature_gate::Features>,
9393

9494
/// The maximum recursion limit for potentially infinitely recursive
@@ -165,9 +165,9 @@ enum DiagnosticBuilderMethod {
165165
}
166166

167167
impl Session {
168-
pub fn local_crate_disambiguator(&self) -> Fingerprint {
168+
pub fn local_crate_disambiguator(&self) -> CrateDisambiguator {
169169
match *self.crate_disambiguator.borrow() {
170-
Some(sym) => sym,
170+
Some(value) => value,
171171
None => bug!("accessing disambiguator before initialization"),
172172
}
173173
}
@@ -471,16 +471,17 @@ impl Session {
471471

472472
/// Returns the symbol name for the registrar function,
473473
/// given the crate Svh and the function DefIndex.
474-
pub fn generate_plugin_registrar_symbol(&self, disambiguator: Fingerprint,
474+
pub fn generate_plugin_registrar_symbol(&self, disambiguator: CrateDisambiguator,
475475
index: DefIndex)
476476
-> String {
477-
format!("__rustc_plugin_registrar__{}_{}", disambiguator.to_hex(),
477+
format!("__rustc_plugin_registrar__{}_{}", disambiguator.to_fingerprint().to_hex(),
478478
index.as_usize())
479479
}
480480

481-
pub fn generate_derive_registrar_symbol(&self, disambiguator: Fingerprint, index: DefIndex)
481+
pub fn generate_derive_registrar_symbol(&self, disambiguator: CrateDisambiguator,
482+
index: DefIndex)
482483
-> String {
483-
format!("__rustc_derive_registrar__{}_{}", disambiguator.to_hex(),
484+
format!("__rustc_derive_registrar__{}_{}", disambiguator.to_fingerprint().to_hex(),
484485
index.as_usize())
485486
}
486487

@@ -841,6 +842,26 @@ pub fn build_session_(sopts: config::Options,
841842
sess
842843
}
843844

845+
/// Hash value constructed out of all the `-C metadata` arguments passed to the
846+
/// compiler. Together with the crate-name forms a unique global identifier for
847+
/// the crate.
848+
#[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Clone, Copy, RustcEncodable, RustcDecodable)]
849+
pub struct CrateDisambiguator(Fingerprint);
850+
851+
impl CrateDisambiguator {
852+
pub fn to_fingerprint(self) -> Fingerprint {
853+
self.0
854+
}
855+
}
856+
857+
impl From<Fingerprint> for CrateDisambiguator {
858+
fn from(fingerprint: Fingerprint) -> CrateDisambiguator {
859+
CrateDisambiguator(fingerprint)
860+
}
861+
}
862+
863+
impl_stable_hash_for!(tuple_struct CrateDisambiguator { fingerprint });
864+
844865
/// Holds data on the current incremental compilation session, if there is one.
845866
#[derive(Debug)]
846867
pub enum IncrCompSession {

src/librustc/ty/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
12511251
crate_name,
12521252
// Don't print the whole crate disambiguator. That's just
12531253
// annoying in debug output.
1254-
&(crate_disambiguator.to_hex())[..4],
1254+
&(crate_disambiguator.to_fingerprint().to_hex())[..4],
12551255
self.def_path(def_id).to_string_no_crate())
12561256
}
12571257

src/librustc/ty/maps/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
use dep_graph::{DepConstructor, DepNode};
1212
use errors::DiagnosticBuilder;
13-
use ich::Fingerprint;
1413
use hir::def_id::{CrateNum, DefId, DefIndex};
1514
use hir::def::{Def, Export};
1615
use hir::{self, TraitCandidate, ItemLocalId};
@@ -30,7 +29,7 @@ use middle::lang_items::{LanguageItems, LangItem};
3029
use middle::exported_symbols::SymbolExportLevel;
3130
use middle::trans::{CodegenUnit, Stats};
3231
use mir;
33-
use session::CompileResult;
32+
use session::{CompileResult, CrateDisambiguator};
3433
use session::config::OutputFilenames;
3534
use traits::Vtable;
3635
use traits::specialization_graph;
@@ -284,7 +283,7 @@ define_maps! { <'tcx>
284283
[] fn native_libraries: NativeLibraries(CrateNum) -> Rc<Vec<NativeLibrary>>,
285284
[] fn plugin_registrar_fn: PluginRegistrarFn(CrateNum) -> Option<DefId>,
286285
[] fn derive_registrar_fn: DeriveRegistrarFn(CrateNum) -> Option<DefId>,
287-
[] fn crate_disambiguator: CrateDisambiguator(CrateNum) -> Fingerprint,
286+
[] fn crate_disambiguator: CrateDisambiguator(CrateNum) -> CrateDisambiguator,
288287
[] fn crate_hash: CrateHash(CrateNum) -> Svh,
289288
[] fn original_crate_name: OriginalCrateName(CrateNum) -> Symbol,
290289

src/librustc/ty/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ use hir::{map as hir_map, FreevarMap, TraitMap};
1919
use hir::def::{Def, CtorKind, ExportMap};
2020
use hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE};
2121
use hir::map::DefPathData;
22-
use ich::{Fingerprint, StableHashingContext};
22+
use ich::StableHashingContext;
2323
use middle::const_val::ConstVal;
2424
use middle::lang_items::{FnTraitLangItem, FnMutTraitLangItem, FnOnceTraitLangItem};
2525
use middle::privacy::AccessLevels;
2626
use middle::resolve_lifetime::ObjectLifetimeDefault;
2727
use mir::Mir;
2828
use mir::GeneratorLayout;
29+
use session::CrateDisambiguator;
2930
use traits;
3031
use ty;
3132
use ty::subst::{Subst, Substs};
@@ -2562,7 +2563,7 @@ fn param_env<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
25622563
}
25632564

25642565
fn crate_disambiguator<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
2565-
crate_num: CrateNum) -> Fingerprint {
2566+
crate_num: CrateNum) -> CrateDisambiguator {
25662567
assert_eq!(crate_num, LOCAL_CRATE);
25672568
tcx.sess.local_crate_disambiguator()
25682569
}

src/librustc_driver/driver.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use rustc::hir::lowering::lower_crate;
1414
use rustc::ich::Fingerprint;
1515
use rustc_data_structures::stable_hasher::StableHasher;
1616
use rustc_mir as mir;
17-
use rustc::session::{Session, CompileResult};
17+
use rustc::session::{Session, CompileResult, CrateDisambiguator};
1818
use rustc::session::CompileIncomplete;
1919
use rustc::session::config::{self, Input, OutputFilenames, OutputType};
2020
use rustc::session::search_paths::PathKind;
@@ -637,7 +637,7 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
637637
rustc_incremental::prepare_session_directory(
638638
sess,
639639
&crate_name,
640-
&disambiguator,
640+
disambiguator,
641641
);
642642

643643
let dep_graph = if sess.opts.build_dep_graph() {
@@ -1311,7 +1311,7 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec<c
13111311
.collect()
13121312
}
13131313

1314-
pub fn compute_crate_disambiguator(session: &Session) -> Fingerprint {
1314+
pub fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguator {
13151315
use std::hash::Hasher;
13161316

13171317
// The crate_disambiguator is a 128 bit hash. The disambiguator is fed
@@ -1341,7 +1341,7 @@ pub fn compute_crate_disambiguator(session: &Session) -> Fingerprint {
13411341
let is_exe = session.crate_types.borrow().contains(&config::CrateTypeExecutable);
13421342
hasher.write(if is_exe { b"exe" } else { b"lib" });
13431343

1344-
hasher.finish()
1344+
CrateDisambiguator::from(hasher.finish())
13451345

13461346
}
13471347

src/librustc_incremental/persist/fs.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,8 @@
114114
//! unsupported file system and emit a warning in that case. This is not yet
115115
//! implemented.
116116
117-
use rustc::ich::Fingerprint;
118117
use rustc::hir::svh::Svh;
119-
use rustc::session::Session;
118+
use rustc::session::{Session, CrateDisambiguator};
120119
use rustc::util::fs as fs_util;
121120
use rustc_data_structures::{flock, base_n};
122121
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
@@ -189,7 +188,7 @@ pub fn in_incr_comp_dir(incr_comp_session_dir: &Path, file_name: &str) -> PathBu
189188
/// The garbage collection will take care of it.
190189
pub fn prepare_session_directory(sess: &Session,
191190
crate_name: &str,
192-
crate_disambiguator: &Fingerprint) {
191+
crate_disambiguator: CrateDisambiguator) {
193192
if sess.opts.incremental.is_none() {
194193
return
195194
}
@@ -615,15 +614,17 @@ fn string_to_timestamp(s: &str) -> Result<SystemTime, ()> {
615614

616615
fn crate_path(sess: &Session,
617616
crate_name: &str,
618-
crate_disambiguator: &Fingerprint)
617+
crate_disambiguator: CrateDisambiguator)
619618
-> PathBuf {
620619

621620
let incr_dir = sess.opts.incremental.as_ref().unwrap().clone();
622621

623-
let crate_disambiguator = crate_disambiguator.to_smaller_hash();
624-
let crate_name = format!("{}-{}",
625-
crate_name,
626-
base_n::encode(crate_disambiguator, INT_ENCODE_BASE));
622+
// The full crate disambiguator is really long. 64 bits of it should be
623+
// sufficient.
624+
let crate_disambiguator = crate_disambiguator.to_fingerprint().to_smaller_hash();
625+
let crate_disambiguator = base_n::encode(crate_disambiguator, INT_ENCODE_BASE);
626+
627+
let crate_name = format!("{}-{}", crate_name, crate_disambiguator);
627628
incr_dir.join(crate_name)
628629
}
629630

src/librustc_metadata/creader.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ use locator::{self, CratePaths};
1515
use native_libs::relevant_lib;
1616
use schema::CrateRoot;
1717

18-
use rustc::ich::Fingerprint;
1918
use rustc::hir::def_id::{CrateNum, DefIndex, CRATE_DEF_INDEX};
2019
use rustc::hir::svh::Svh;
2120
use rustc::middle::allocator::AllocatorKind;
2221
use rustc::middle::cstore::DepKind;
23-
use rustc::session::Session;
22+
use rustc::session::{Session, CrateDisambiguator};
2423
use rustc::session::config::{Sanitizer, self};
2524
use rustc_back::PanicStrategy;
2625
use rustc::session::search_paths::PathKind;
@@ -627,7 +626,7 @@ impl<'a> CrateLoader<'a> {
627626
pub fn find_plugin_registrar(&mut self,
628627
span: Span,
629628
name: &str)
630-
-> Option<(PathBuf, Fingerprint, DefIndex)> {
629+
-> Option<(PathBuf, CrateDisambiguator, DefIndex)> {
631630
let ekrate = self.read_extension_crate(span, &ExternCrateInfo {
632631
name: Symbol::intern(name),
633632
ident: Symbol::intern(name),

src/librustc_metadata/cstore.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313

1414
use schema;
1515

16-
use rustc::ich::Fingerprint;
1716
use rustc::hir::def_id::{CRATE_DEF_INDEX, CrateNum, DefIndex};
1817
use rustc::hir::map::definitions::DefPathTable;
1918
use rustc::hir::svh::Svh;
2019
use rustc::middle::cstore::{DepKind, ExternCrate, MetadataLoader};
20+
use rustc::session::CrateDisambiguator;
2121
use rustc_back::PanicStrategy;
2222
use rustc_data_structures::indexed_vec::IndexVec;
2323
use rustc::util::nodemap::{FxHashMap, FxHashSet, NodeMap};
@@ -172,7 +172,7 @@ impl CrateMetadata {
172172
pub fn hash(&self) -> Svh {
173173
self.root.hash
174174
}
175-
pub fn disambiguator(&self) -> Fingerprint {
175+
pub fn disambiguator(&self) -> CrateDisambiguator {
176176
self.root.disambiguator
177177
}
178178

src/librustc_metadata/cstore_impl.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ use rustc::middle::cstore::{CrateStore, DepKind,
2020
LoadedMacro, EncodedMetadata,
2121
EncodedMetadataHashes, NativeLibraryKind};
2222
use rustc::middle::stability::DeprecationEntry;
23-
use rustc::ich::Fingerprint;
2423
use rustc::hir::def;
25-
use rustc::session::Session;
24+
use rustc::session::{CrateDisambiguator, Session};
2625
use rustc::ty::{self, TyCtxt};
2726
use rustc::ty::maps::Providers;
2827
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE, CRATE_DEF_INDEX};
@@ -385,7 +384,7 @@ impl CrateStore for cstore::CStore {
385384
self.get_crate_data(cnum).name
386385
}
387386

388-
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> Fingerprint
387+
fn crate_disambiguator_untracked(&self, cnum: CrateNum) -> CrateDisambiguator
389388
{
390389
self.get_crate_data(cnum).disambiguator()
391390
}

0 commit comments

Comments
 (0)