@@ -12,7 +12,6 @@ pub use self::error::{EvalError, EvalResult, EvalErrorKind, AssertMessage};
1212
1313pub use self :: value:: { PrimVal , PrimValKind , Value , Pointer , ConstValue } ;
1414
15- use std:: collections:: BTreeMap ;
1615use std:: fmt;
1716use mir;
1817use hir:: def_id:: DefId ;
@@ -21,8 +20,10 @@ use ty::layout::{self, Align, HasDataLayout};
2120use middle:: region;
2221use std:: iter;
2322use std:: io;
23+ use std:: ops:: { Deref , DerefMut } ;
2424use syntax:: ast:: Mutability ;
2525use rustc_serialize:: { Encoder , Decoder , Decodable , Encodable } ;
26+ use rustc_data_structures:: sorted_map:: SortedMap ;
2627use byteorder:: { WriteBytesExt , ReadBytesExt , LittleEndian , BigEndian } ;
2728
2829#[ derive( Clone , Debug , PartialEq , RustcEncodable , RustcDecodable ) ]
@@ -244,7 +245,7 @@ pub struct Allocation {
244245 pub bytes : Vec < u8 > ,
245246 /// Maps from byte addresses to allocations.
246247 /// Only the first byte of a pointer is inserted into the map.
247- pub relocations : BTreeMap < u64 , AllocId > ,
248+ pub relocations : Relocations ,
248249 /// Denotes undefined memory. Reading from undefined memory is forbidden in miri
249250 pub undef_mask : UndefMask ,
250251 /// The alignment of the allocation to detect unaligned reads.
@@ -261,7 +262,7 @@ impl Allocation {
261262 undef_mask. grow ( slice. len ( ) as u64 , true ) ;
262263 Self {
263264 bytes : slice. to_owned ( ) ,
264- relocations : BTreeMap :: new ( ) ,
265+ relocations : Relocations :: new ( ) ,
265266 undef_mask,
266267 align,
267268 runtime_mutability : Mutability :: Immutable ,
@@ -276,7 +277,7 @@ impl Allocation {
276277 assert_eq ! ( size as usize as u64 , size) ;
277278 Allocation {
278279 bytes : vec ! [ 0 ; size as usize ] ,
279- relocations : BTreeMap :: new ( ) ,
280+ relocations : Relocations :: new ( ) ,
280281 undef_mask : UndefMask :: new ( size) ,
281282 align,
282283 runtime_mutability : Mutability :: Immutable ,
@@ -286,6 +287,35 @@ impl Allocation {
286287
287288impl < ' tcx > :: serialize:: UseSpecializedDecodable for & ' tcx Allocation { }
288289
290+ #[ derive( Clone , PartialEq , Eq , Hash , Debug , RustcEncodable , RustcDecodable ) ]
291+ pub struct Relocations ( SortedMap < u64 , AllocId > ) ;
292+
293+ impl Relocations {
294+ pub fn new ( ) -> Relocations {
295+ Relocations ( SortedMap :: new ( ) )
296+ }
297+
298+ // The caller must guarantee that the given relocations are already sorted
299+ // by address and contain no duplicates.
300+ pub fn from_presorted ( r : Vec < ( u64 , AllocId ) > ) -> Relocations {
301+ Relocations ( SortedMap :: from_presorted_elements ( r) )
302+ }
303+ }
304+
305+ impl Deref for Relocations {
306+ type Target = SortedMap < u64 , AllocId > ;
307+
308+ fn deref ( & self ) -> & Self :: Target {
309+ & self . 0
310+ }
311+ }
312+
313+ impl DerefMut for Relocations {
314+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
315+ & mut self . 0
316+ }
317+ }
318+
289319////////////////////////////////////////////////////////////////////////////////
290320// Methods to access integers in the target endianness
291321////////////////////////////////////////////////////////////////////////////////
0 commit comments