-
Notifications
You must be signed in to change notification settings - Fork 13.2k
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
Get rid of the Scalar
and ScalarPair
variants of ConstValue
...
#55260
Changes from 1 commit
edf94c5
856eaed
fe4e950
04fc561
b11b3cb
3aecb0d
8d42376
847f5b9
e52644c
8246dd4
5620d68
fc6472c
336094f
b4ba332
dfc5d26
c50d77d
1d14a84
9fbce39
1f2fcee
e3bbe6d
6ff70da
7b526d8
9df63e9
a7a92e2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,7 +34,8 @@ use middle::region; | |
use std::iter; | ||
use std::io; | ||
use std::ops::{Deref, DerefMut}; | ||
use std::hash::Hash; | ||
use std::cmp; | ||
use std::hash::{Hash, Hasher}; | ||
use syntax::ast::Mutability; | ||
use rustc_serialize::{Encoder, Decodable, Encodable}; | ||
use rustc_data_structures::sorted_map::SortedMap; | ||
|
@@ -217,9 +218,56 @@ impl<'tcx, Tag> Pointer<Tag> { | |
} | ||
|
||
|
||
#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd, Debug)] | ||
#[derive(Copy, Clone, Debug)] | ||
pub struct AllocId(pub u64); | ||
|
||
impl Eq for AllocId {} | ||
|
||
impl Hash for AllocId { | ||
fn hash<H: Hasher>(&self, state: &mut H) { | ||
ty::tls::with(|tcx| { | ||
let alloc_type = tcx.alloc_map.lock().get(*self); | ||
match alloc_type { | ||
Some(alloc_type) => alloc_type.hash(state), | ||
None => self.0.hash(state), | ||
} | ||
}) | ||
} | ||
} | ||
|
||
impl PartialEq for AllocId { | ||
fn eq(&self, other: &Self) -> bool { | ||
ty::tls::with(|tcx| { | ||
let (s, o) = { | ||
let map = tcx.alloc_map.lock(); | ||
(map.get(*self), map.get(*other)) | ||
}; | ||
s == o | ||
}) | ||
} | ||
} | ||
|
||
impl Ord for AllocId { | ||
fn cmp(&self, other: &Self) -> cmp::Ordering { | ||
match self.partial_cmp(other) { | ||
Some(ord) => ord, | ||
None => self.0.cmp(&other.0) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is it okay to fall back to comparing the integers here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This happens only for non-interned allocations |
||
} | ||
} | ||
} | ||
|
||
impl PartialOrd for AllocId { | ||
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> { | ||
ty::tls::with(|tcx| { | ||
let (s, o) = { | ||
let map = tcx.alloc_map.lock(); | ||
(map.get(*self)?, map.get(*other)?) | ||
}; | ||
s.partial_cmp(&o) | ||
}) | ||
} | ||
} | ||
|
||
impl ::rustc_serialize::UseSpecializedEncodable for AllocId {} | ||
impl ::rustc_serialize::UseSpecializedDecodable for AllocId {} | ||
|
||
|
@@ -427,7 +475,7 @@ impl fmt::Display for AllocId { | |
} | ||
} | ||
|
||
#[derive(Debug, Clone, Eq, PartialEq, Hash, RustcDecodable, RustcEncodable)] | ||
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, RustcDecodable, RustcEncodable)] | ||
pub enum AllocType<'tcx, M> { | ||
/// The alloc id is used as a function pointer | ||
Function(Instance<'tcx>), | ||
|
@@ -440,7 +488,7 @@ pub enum AllocType<'tcx, M> { | |
|
||
pub struct AllocMap<'tcx, M> { | ||
/// Lets you know what an AllocId refers to | ||
id_to_type: FxHashMap<AllocId, AllocType<'tcx, M>>, | ||
id_to_type: FxHashMap<u64, AllocType<'tcx, M>>, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Now we lose the newtype protection for not mixing up IDs. I don't understand the purpose of this entire commit, at all. It also suffers from an astute lack of comments :) |
||
|
||
/// Used to ensure that functions and statics only get one associated AllocId | ||
type_interner: FxHashMap<AllocType<'tcx, M>, AllocId>, | ||
|
@@ -479,7 +527,7 @@ impl<'tcx, M: fmt::Debug + Eq + Hash + Clone> AllocMap<'tcx, M> { | |
} | ||
let id = self.reserve(); | ||
debug!("creating alloc_type {:?} with id {}", alloc_type, id); | ||
self.id_to_type.insert(id, alloc_type.clone()); | ||
self.id_to_type.insert(id.0, alloc_type.clone()); | ||
self.type_interner.insert(alloc_type, id); | ||
id | ||
} | ||
|
@@ -492,7 +540,7 @@ impl<'tcx, M: fmt::Debug + Eq + Hash + Clone> AllocMap<'tcx, M> { | |
} | ||
|
||
pub fn get(&self, id: AllocId) -> Option<AllocType<'tcx, M>> { | ||
self.id_to_type.get(&id).cloned() | ||
self.id_to_type.get(&id.0).cloned() | ||
} | ||
|
||
pub fn unwrap_memory(&self, id: AllocId) -> M { | ||
|
@@ -513,13 +561,13 @@ impl<'tcx, M: fmt::Debug + Eq + Hash + Clone> AllocMap<'tcx, M> { | |
} | ||
|
||
pub fn set_id_memory(&mut self, id: AllocId, mem: M) { | ||
if let Some(old) = self.id_to_type.insert(id, AllocType::Memory(mem)) { | ||
if let Some(old) = self.id_to_type.insert(id.0, AllocType::Memory(mem)) { | ||
bug!("tried to set allocation id {}, but it was already existing as {:#?}", id, old); | ||
} | ||
} | ||
|
||
pub fn set_id_same_memory(&mut self, id: AllocId, mem: M) { | ||
self.id_to_type.insert_same(id, AllocType::Memory(mem)); | ||
self.id_to_type.insert_same(id.0, AllocType::Memory(mem)); | ||
} | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uh, wait, what? That doesn't seem right to me.
Certainly, ptr comparison in miri should compare the actual IDs, the the content that's stored behind these IDs. What is the type of
s
ando
here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This only applies to
AllocId
s that refer to global allocations. Comparing by id is inherently wrong. We never ran into any trouble, because we never used aConstValue
containing anAllocId
in comparisons that mattered. Now that everything isByRef
, pattern match exhaustiveness checks failed because they couldn't figure out that two const patterns are the same if theirAllocId
differs.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is still grossly wrong in the context of the miri engine. Ptr equality wants to compare the IDs, not the allocations they point to, and the IDs should be newtyped to not mix them up with other integers.
Then it shouldn't use the same equality as the miri engine. If you want to overwrite equality and hashing for
ConstValue
, I can support that, but doing it for a type used inside the engine makes me really nervous.