1
- use byteorder:: { NativeEndian , ReadBytesExt , WriteBytesExt } ;
1
+ use byteorder:: { ReadBytesExt , WriteBytesExt , LittleEndian , BigEndian , self } ;
2
2
use std:: collections:: Bound :: { Included , Excluded } ;
3
3
use std:: collections:: { btree_map, BTreeMap , HashMap , HashSet , VecDeque } ;
4
4
use std:: { fmt, iter, mem, ptr} ;
5
5
6
6
use rustc:: hir:: def_id:: DefId ;
7
7
use rustc:: ty:: BareFnTy ;
8
8
use rustc:: ty:: subst:: Substs ;
9
- use rustc:: ty:: layout:: TargetDataLayout ;
9
+ use rustc:: ty:: layout:: { self , TargetDataLayout } ;
10
10
11
11
use error:: { EvalError , EvalResult } ;
12
12
use primval:: PrimVal ;
@@ -159,6 +159,10 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
159
159
pub fn pointer_size ( & self ) -> usize {
160
160
self . layout . pointer_size . bytes ( ) as usize
161
161
}
162
+
163
+ pub fn endianess ( & self ) -> layout:: Endian {
164
+ self . layout . endian
165
+ }
162
166
}
163
167
164
168
/// Allocation accessors
@@ -339,8 +343,9 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
339
343
pub fn read_ptr ( & self , ptr : Pointer ) -> EvalResult < ' tcx , Pointer > {
340
344
let size = self . pointer_size ( ) ;
341
345
self . check_defined ( ptr, size) ?;
342
- let offset = self . get_bytes_unchecked ( ptr, size) ?
343
- . read_uint :: < NativeEndian > ( size) . unwrap ( ) as usize ;
346
+ let endianess = self . endianess ( ) ;
347
+ let bytes = self . get_bytes_unchecked ( ptr, size) ?;
348
+ let offset = read_target_uint ( endianess, bytes) . unwrap ( ) as usize ;
344
349
let alloc = self . get ( ptr. alloc_id ) ?;
345
350
match alloc. relocations . get ( & ptr. offset ) {
346
351
Some ( & alloc_id) => Ok ( Pointer { alloc_id : alloc_id, offset : offset } ) ,
@@ -349,11 +354,7 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
349
354
}
350
355
351
356
pub fn write_ptr ( & mut self , dest : Pointer , ptr : Pointer ) -> EvalResult < ' tcx , ( ) > {
352
- {
353
- let size = self . pointer_size ( ) ;
354
- let mut bytes = self . get_bytes_mut ( dest, size) ?;
355
- bytes. write_uint :: < NativeEndian > ( ptr. offset as u64 , size) . unwrap ( ) ;
356
- }
357
+ self . write_usize ( dest, ptr. offset as u64 ) ?;
357
358
self . get_mut ( dest. alloc_id ) ?. relocations . insert ( dest. offset , ptr. alloc_id ) ;
358
359
Ok ( ( ) )
359
360
}
@@ -391,19 +392,25 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
391
392
}
392
393
393
394
pub fn read_int ( & self , ptr : Pointer , size : usize ) -> EvalResult < ' tcx , i64 > {
394
- self . get_bytes ( ptr, size) . map ( |mut b| b . read_int :: < NativeEndian > ( size ) . unwrap ( ) )
395
+ self . get_bytes ( ptr, size) . map ( |b| read_target_int ( self . endianess ( ) , b ) . unwrap ( ) )
395
396
}
396
397
397
398
pub fn write_int ( & mut self , ptr : Pointer , n : i64 , size : usize ) -> EvalResult < ' tcx , ( ) > {
398
- self . get_bytes_mut ( ptr, size) . map ( |mut b| b. write_int :: < NativeEndian > ( n, size) . unwrap ( ) )
399
+ let endianess = self . endianess ( ) ;
400
+ let b = self . get_bytes_mut ( ptr, size) ?;
401
+ write_target_int ( endianess, b, n) . unwrap ( ) ;
402
+ Ok ( ( ) )
399
403
}
400
404
401
405
pub fn read_uint ( & self , ptr : Pointer , size : usize ) -> EvalResult < ' tcx , u64 > {
402
- self . get_bytes ( ptr, size) . map ( |mut b| b . read_uint :: < NativeEndian > ( size ) . unwrap ( ) )
406
+ self . get_bytes ( ptr, size) . map ( |b| read_target_uint ( self . endianess ( ) , b ) . unwrap ( ) )
403
407
}
404
408
405
409
pub fn write_uint ( & mut self , ptr : Pointer , n : u64 , size : usize ) -> EvalResult < ' tcx , ( ) > {
406
- self . get_bytes_mut ( ptr, size) . map ( |mut b| b. write_uint :: < NativeEndian > ( n, size) . unwrap ( ) )
410
+ let endianess = self . endianess ( ) ;
411
+ let b = self . get_bytes_mut ( ptr, size) ?;
412
+ write_target_uint ( endianess, b, n) . unwrap ( ) ;
413
+ Ok ( ( ) )
407
414
}
408
415
409
416
pub fn read_isize ( & self , ptr : Pointer ) -> EvalResult < ' tcx , i64 > {
@@ -513,6 +520,38 @@ impl<'a, 'tcx> Memory<'a, 'tcx> {
513
520
}
514
521
}
515
522
523
+ ////////////////////////////////////////////////////////////////////////////////
524
+ // Methods to access integers in the target endianess
525
+ ////////////////////////////////////////////////////////////////////////////////
526
+
527
+ fn write_target_uint ( endianess : layout:: Endian , mut target : & mut [ u8 ] , data : u64 ) -> Result < ( ) , byteorder:: Error > {
528
+ let len = target. len ( ) ;
529
+ match endianess {
530
+ layout:: Endian :: Little => target. write_uint :: < LittleEndian > ( data, len) ,
531
+ layout:: Endian :: Big => target. write_uint :: < BigEndian > ( data, len) ,
532
+ }
533
+ }
534
+ fn write_target_int ( endianess : layout:: Endian , mut target : & mut [ u8 ] , data : i64 ) -> Result < ( ) , byteorder:: Error > {
535
+ let len = target. len ( ) ;
536
+ match endianess {
537
+ layout:: Endian :: Little => target. write_int :: < LittleEndian > ( data, len) ,
538
+ layout:: Endian :: Big => target. write_int :: < BigEndian > ( data, len) ,
539
+ }
540
+ }
541
+
542
+ fn read_target_uint ( endianess : layout:: Endian , mut source : & [ u8 ] ) -> Result < u64 , byteorder:: Error > {
543
+ match endianess {
544
+ layout:: Endian :: Little => source. read_uint :: < LittleEndian > ( source. len ( ) ) ,
545
+ layout:: Endian :: Big => source. read_uint :: < BigEndian > ( source. len ( ) ) ,
546
+ }
547
+ }
548
+ fn read_target_int ( endianess : layout:: Endian , mut source : & [ u8 ] ) -> Result < i64 , byteorder:: Error > {
549
+ match endianess {
550
+ layout:: Endian :: Little => source. read_int :: < LittleEndian > ( source. len ( ) ) ,
551
+ layout:: Endian :: Big => source. read_int :: < BigEndian > ( source. len ( ) ) ,
552
+ }
553
+ }
554
+
516
555
////////////////////////////////////////////////////////////////////////////////
517
556
// Undefined byte tracking
518
557
////////////////////////////////////////////////////////////////////////////////
0 commit comments