Skip to content

incr.comp.: Revert hashing optimization that caused regression. #46757

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 16, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/librustc/ich/hcx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for Span {
std_hash::Hash::hash(&TAG_VALID_SPAN, hasher);
// We truncate the stable_id hash and line and col numbers. The chances
// of causing a collision this way should be minimal.
std_hash::Hash::hash(&(file_lo.stable_id.0 as u64), hasher);
std_hash::Hash::hash(&file_lo.name, hasher);

let col = (col_lo.0 as u64) & 0xFF;
let line = ((line_lo as u64) & 0xFF_FF_FF) << 8;
Expand Down
2 changes: 0 additions & 2 deletions src/librustc/ich/impls_syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,6 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for FileMap {
// Do not hash the source as it is not encoded
src: _,
src_hash,
// The stable id is just a hash of other fields
stable_id: _,
external_src: _,
start_pos,
end_pos: _,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/ty/maps/on_disk_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ impl<'sess> OnDiskCache<'sess> {
let index = FileMapIndex(index as u32);
let file_ptr: *const FileMap = &**file as *const _;
file_to_file_index.insert(file_ptr, index);
file_index_to_stable_id.insert(index, file.stable_id);
file_index_to_stable_id.insert(index, StableFilemapId::new(&file));
}

(file_to_file_index, file_index_to_stable_id)
Expand Down
2 changes: 0 additions & 2 deletions src/librustc_metadata/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,6 @@ impl<'a, 'tcx> CrateMetadata {
let syntax_pos::FileMap { name,
name_was_remapped,
src_hash,
stable_id,
start_pos,
end_pos,
lines,
Expand Down Expand Up @@ -1156,7 +1155,6 @@ impl<'a, 'tcx> CrateMetadata {
name_was_remapped,
self.cnum.as_u32(),
src_hash,
stable_id,
source_length,
lines,
multibyte_chars,
Expand Down
26 changes: 22 additions & 4 deletions src/libsyntax/codemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ pub use syntax_pos::hygiene::{ExpnFormat, ExpnInfo, NameAndSpan};
pub use self::ExpnFormat::*;

use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::stable_hasher::StableHasher;
use std::cell::{RefCell, Ref};
use std::hash::Hash;
use std::path::{Path, PathBuf};
use std::rc::Rc;

Expand Down Expand Up @@ -100,6 +102,24 @@ impl FileLoader for RealFileLoader {
}
}

// This is a FileMap identifier that is used to correlate FileMaps between
// subsequent compilation sessions (which is something we need to do during
// incremental compilation).
#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)]
pub struct StableFilemapId(u128);

impl StableFilemapId {
pub fn new(filemap: &FileMap) -> StableFilemapId {
let mut hasher = StableHasher::new();

filemap.name.hash(&mut hasher);
filemap.name_was_remapped.hash(&mut hasher);
filemap.unmapped_path.hash(&mut hasher);

StableFilemapId(hasher.finish())
}
}

// _____________________________________________________________________________
// CodeMap
//
Expand Down Expand Up @@ -197,7 +217,7 @@ impl CodeMap {

self.stable_id_to_filemap
.borrow_mut()
.insert(filemap.stable_id, filemap.clone());
.insert(StableFilemapId::new(&filemap), filemap.clone());

filemap
}
Expand Down Expand Up @@ -226,7 +246,6 @@ impl CodeMap {
name_was_remapped: bool,
crate_of_origin: u32,
src_hash: u128,
stable_id: StableFilemapId,
source_len: usize,
mut file_local_lines: Vec<BytePos>,
mut file_local_multibyte_chars: Vec<MultiByteChar>,
Expand Down Expand Up @@ -257,7 +276,6 @@ impl CodeMap {
crate_of_origin,
src: None,
src_hash,
stable_id,
external_src: RefCell::new(ExternalSource::AbsentOk),
start_pos,
end_pos,
Expand All @@ -270,7 +288,7 @@ impl CodeMap {

self.stable_id_to_filemap
.borrow_mut()
.insert(stable_id, filemap.clone());
.insert(StableFilemapId::new(&filemap), filemap.clone());

filemap
}
Expand Down
33 changes: 0 additions & 33 deletions src/libsyntax_pos/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -678,8 +678,6 @@ pub struct FileMap {
pub src: Option<Rc<String>>,
/// The source code's hash
pub src_hash: u128,
/// The stable id used during incr. comp.
pub stable_id: StableFilemapId,
/// The external source code (used for external crates, which will have a `None`
/// value as `self.src`.
pub external_src: RefCell<ExternalSource>,
Expand All @@ -695,34 +693,12 @@ pub struct FileMap {
pub non_narrow_chars: RefCell<Vec<NonNarrowChar>>,
}

// This is a FileMap identifier that is used to correlate FileMaps between
// subsequent compilation sessions (which is something we need to do during
// incremental compilation).
#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)]
pub struct StableFilemapId(pub u128);

impl StableFilemapId {
pub fn new(name: &FileName,
name_was_remapped: bool,
unmapped_path: &FileName)
-> StableFilemapId {
use std::hash::Hash;

let mut hasher = StableHasher::new();
name.hash(&mut hasher);
name_was_remapped.hash(&mut hasher);
unmapped_path.hash(&mut hasher);
StableFilemapId(hasher.finish())
}
}

impl Encodable for FileMap {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
s.emit_struct("FileMap", 8, |s| {
s.emit_struct_field("name", 0, |s| self.name.encode(s))?;
s.emit_struct_field("name_was_remapped", 1, |s| self.name_was_remapped.encode(s))?;
s.emit_struct_field("src_hash", 2, |s| self.src_hash.encode(s))?;
s.emit_struct_field("stable_id", 3, |s| self.stable_id.encode(s))?;
s.emit_struct_field("start_pos", 4, |s| self.start_pos.encode(s))?;
s.emit_struct_field("end_pos", 5, |s| self.end_pos.encode(s))?;
s.emit_struct_field("lines", 6, |s| {
Expand Down Expand Up @@ -790,8 +766,6 @@ impl Decodable for FileMap {
d.read_struct_field("name_was_remapped", 1, |d| Decodable::decode(d))?;
let src_hash: u128 =
d.read_struct_field("src_hash", 2, |d| Decodable::decode(d))?;
let stable_id: StableFilemapId =
d.read_struct_field("stable_id", 3, |d| Decodable::decode(d))?;
let start_pos: BytePos =
d.read_struct_field("start_pos", 4, |d| Decodable::decode(d))?;
let end_pos: BytePos = d.read_struct_field("end_pos", 5, |d| Decodable::decode(d))?;
Expand Down Expand Up @@ -839,7 +813,6 @@ impl Decodable for FileMap {
end_pos,
src: None,
src_hash,
stable_id,
external_src: RefCell::new(ExternalSource::AbsentOk),
lines: RefCell::new(lines),
multibyte_chars: RefCell::new(multibyte_chars),
Expand All @@ -866,11 +839,6 @@ impl FileMap {
let mut hasher: StableHasher<u128> = StableHasher::new();
hasher.write(src.as_bytes());
let src_hash = hasher.finish();

let stable_id = StableFilemapId::new(&name,
name_was_remapped,
&unmapped_path);

let end_pos = start_pos.to_usize() + src.len();

FileMap {
Expand All @@ -880,7 +848,6 @@ impl FileMap {
crate_of_origin: 0,
src: Some(Rc::new(src)),
src_hash,
stable_id,
external_src: RefCell::new(ExternalSource::Unneeded),
start_pos,
end_pos: Pos::from_usize(end_pos),
Expand Down