@@ -125,15 +125,15 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
125125 self . write_null ( dest) ?;
126126 } else {
127127 let align = self . tcx . data_layout . pointer_align ;
128- let ptr = self . memory . allocate ( Size :: from_bytes ( size) , align, MiriMemoryKind :: C . into ( ) ) ?;
129- self . write_scalar ( Scalar :: Ptr ( ptr) , dest) ?;
128+ let ptr = self . memory_mut ( ) . allocate ( Size :: from_bytes ( size) , align, MiriMemoryKind :: C . into ( ) ) ?;
129+ self . write_scalar ( Scalar :: Ptr ( ptr. with_default_tag ( ) ) , dest) ?;
130130 }
131131 }
132132
133133 "free" => {
134134 let ptr = self . read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?. erase_tag ( ) ; // raw ptr operation, no tag
135135 if !ptr. is_null_ptr ( & self ) {
136- self . memory . deallocate (
136+ self . memory_mut ( ) . deallocate (
137137 ptr. to_ptr ( ) ?. with_default_tag ( ) ,
138138 None ,
139139 MiriMemoryKind :: C . into ( ) ,
@@ -150,9 +150,13 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
150150 if !align. is_power_of_two ( ) {
151151 return err ! ( HeapAllocNonPowerOfTwoAlignment ( align) ) ;
152152 }
153- let ptr = self . memory . allocate ( Size :: from_bytes ( size) ,
154- Align :: from_bytes ( align, align) . unwrap ( ) ,
155- MiriMemoryKind :: Rust . into ( ) ) ?;
153+ let ptr = self . memory_mut ( )
154+ . allocate (
155+ Size :: from_bytes ( size) ,
156+ Align :: from_bytes ( align, align) . unwrap ( ) ,
157+ MiriMemoryKind :: Rust . into ( )
158+ ) ?
159+ . with_default_tag ( ) ;
156160 self . write_scalar ( Scalar :: Ptr ( ptr) , dest) ?;
157161 }
158162 "__rust_alloc_zeroed" => {
@@ -164,10 +168,14 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
164168 if !align. is_power_of_two ( ) {
165169 return err ! ( HeapAllocNonPowerOfTwoAlignment ( align) ) ;
166170 }
167- let ptr = self . memory . allocate ( Size :: from_bytes ( size) ,
168- Align :: from_bytes ( align, align) . unwrap ( ) ,
169- MiriMemoryKind :: Rust . into ( ) ) ?;
170- self . memory . write_repeat ( ptr. into ( ) , 0 , Size :: from_bytes ( size) ) ?;
171+ let ptr = self . memory_mut ( )
172+ . allocate (
173+ Size :: from_bytes ( size) ,
174+ Align :: from_bytes ( align, align) . unwrap ( ) ,
175+ MiriMemoryKind :: Rust . into ( )
176+ ) ?
177+ . with_default_tag ( ) ;
178+ self . memory_mut ( ) . write_repeat ( ptr. into ( ) , 0 , Size :: from_bytes ( size) ) ?;
171179 self . write_scalar ( Scalar :: Ptr ( ptr) , dest) ?;
172180 }
173181 "__rust_dealloc" => {
@@ -180,7 +188,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
180188 if !align. is_power_of_two ( ) {
181189 return err ! ( HeapAllocNonPowerOfTwoAlignment ( align) ) ;
182190 }
183- self . memory . deallocate (
191+ self . memory_mut ( ) . deallocate (
184192 ptr. with_default_tag ( ) ,
185193 Some ( ( Size :: from_bytes ( old_size) , Align :: from_bytes ( align, align) . unwrap ( ) ) ) ,
186194 MiriMemoryKind :: Rust . into ( ) ,
@@ -197,15 +205,15 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
197205 if !align. is_power_of_two ( ) {
198206 return err ! ( HeapAllocNonPowerOfTwoAlignment ( align) ) ;
199207 }
200- let new_ptr = self . memory . reallocate (
208+ let new_ptr = self . memory_mut ( ) . reallocate (
201209 ptr. with_default_tag ( ) ,
202210 Size :: from_bytes ( old_size) ,
203211 Align :: from_bytes ( align, align) . unwrap ( ) ,
204212 Size :: from_bytes ( new_size) ,
205213 Align :: from_bytes ( align, align) . unwrap ( ) ,
206214 MiriMemoryKind :: Rust . into ( ) ,
207215 ) ?;
208- self . write_scalar ( Scalar :: Ptr ( new_ptr) , dest) ?;
216+ self . write_scalar ( Scalar :: Ptr ( new_ptr. with_default_tag ( ) ) , dest) ?;
209217 }
210218
211219 "syscall" => {
@@ -231,7 +239,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
231239 "dlsym" => {
232240 let _handle = self . read_scalar ( args[ 0 ] ) ?;
233241 let symbol = self . read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?. erase_tag ( ) ;
234- let symbol_name = self . memory . read_c_str ( symbol. with_default_tag ( ) ) ?;
242+ let symbol_name = self . memory ( ) . read_c_str ( symbol. with_default_tag ( ) ) ?;
235243 let err = format ! ( "bad c unicode symbol: {:?}" , symbol_name) ;
236244 let symbol_name = :: std:: str:: from_utf8 ( symbol_name) . unwrap_or ( & err) ;
237245 return err ! ( Unimplemented ( format!(
@@ -245,7 +253,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
245253 // We abort on panic, so not much is going on here, but we still have to call the closure
246254 let f = self . read_scalar ( args[ 0 ] ) ?. to_ptr ( ) ?;
247255 let data = self . read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?;
248- let f_instance = self . memory . get_fn ( f) ?;
256+ let f_instance = self . memory ( ) . get_fn ( f) ?;
249257 self . write_null ( dest) ?;
250258 trace ! ( "__rust_maybe_catch_panic: {:?}" , f_instance) ;
251259
@@ -289,8 +297,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
289297 let n = Size :: from_bytes ( self . read_scalar ( args[ 2 ] ) ?. to_usize ( & self ) ?) ;
290298
291299 let result = {
292- let left_bytes = self . memory . read_bytes ( left. with_default_tag ( ) , n) ?;
293- let right_bytes = self . memory . read_bytes ( right. with_default_tag ( ) , n) ?;
300+ let left_bytes = self . memory ( ) . read_bytes ( left. with_default_tag ( ) , n) ?;
301+ let right_bytes = self . memory ( ) . read_bytes ( right. with_default_tag ( ) , n) ?;
294302
295303 use std:: cmp:: Ordering :: * ;
296304 match left_bytes. cmp ( right_bytes) {
@@ -311,7 +319,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
311319 let ptr = ptr. with_default_tag ( ) ;
312320 let val = self . read_scalar ( args[ 1 ] ) ?. to_bytes ( ) ? as u8 ;
313321 let num = self . read_scalar ( args[ 2 ] ) ?. to_usize ( & self ) ?;
314- if let Some ( idx) = self . memory . read_bytes ( ptr, Size :: from_bytes ( num) ) ?
322+ if let Some ( idx) = self . memory ( ) . read_bytes ( ptr, Size :: from_bytes ( num) ) ?
315323 . iter ( ) . rev ( ) . position ( |& c| c == val)
316324 {
317325 let new_ptr = ptr. ptr_offset ( Size :: from_bytes ( num - idx as u64 - 1 ) , & self ) ?;
@@ -326,7 +334,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
326334 let ptr = ptr. with_default_tag ( ) ;
327335 let val = self . read_scalar ( args[ 1 ] ) ?. to_bytes ( ) ? as u8 ;
328336 let num = self . read_scalar ( args[ 2 ] ) ?. to_usize ( & self ) ?;
329- if let Some ( idx) = self . memory . read_bytes ( ptr, Size :: from_bytes ( num) ) ?. iter ( ) . position (
337+ if let Some ( idx) = self . memory ( ) . read_bytes ( ptr, Size :: from_bytes ( num) ) ?. iter ( ) . position (
330338 |& c| c == val,
331339 )
332340 {
@@ -340,7 +348,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
340348 "getenv" => {
341349 let result = {
342350 let name_ptr = self . read_scalar ( args[ 0 ] ) ?. to_ptr ( ) ?. erase_tag ( ) ; // raw ptr operation
343- let name = self . memory . read_c_str ( name_ptr. with_default_tag ( ) ) ?;
351+ let name = self . memory ( ) . read_c_str ( name_ptr. with_default_tag ( ) ) ?;
344352 match self . machine . env_vars . get ( name) {
345353 Some ( & var) => Scalar :: Ptr ( var) ,
346354 None => Scalar :: ptr_null ( * self . tcx ) ,
@@ -354,15 +362,16 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
354362 {
355363 let name_ptr = self . read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?. erase_tag ( ) ; // raw ptr operation
356364 if !name_ptr. is_null_ptr ( & self ) {
357- let name = self . memory . read_c_str ( name_ptr. to_ptr ( ) ?. with_default_tag ( ) ) ?;
365+ let name = self . memory ( ) . read_c_str ( name_ptr. to_ptr ( ) ?
366+ . with_default_tag ( ) ) ?. to_owned ( ) ;
358367 if !name. is_empty ( ) && !name. contains ( & b'=' ) {
359- success = Some ( self . machine . env_vars . remove ( name) ) ;
368+ success = Some ( self . machine . env_vars . remove ( & name) ) ;
360369 }
361370 }
362371 }
363372 if let Some ( old) = success {
364373 if let Some ( var) = old {
365- self . memory . deallocate ( var, None , MiriMemoryKind :: Env . into ( ) ) ?;
374+ self . memory_mut ( ) . deallocate ( var, None , MiriMemoryKind :: Env . into ( ) ) ?;
366375 }
367376 self . write_null ( dest) ?;
368377 } else {
@@ -375,30 +384,30 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
375384 {
376385 let name_ptr = self . read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?. erase_tag ( ) ; // raw ptr operation
377386 let value_ptr = self . read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?. erase_tag ( ) ; // raw ptr operation
378- let value = self . memory . read_c_str ( value_ptr. with_default_tag ( ) ) ?;
387+ let value = self . memory ( ) . read_c_str ( value_ptr. with_default_tag ( ) ) ?;
379388 if !name_ptr. is_null_ptr ( & self ) {
380- let name = self . memory . read_c_str ( name_ptr. to_ptr ( ) ?. with_default_tag ( ) ) ?;
389+ let name = self . memory ( ) . read_c_str ( name_ptr. to_ptr ( ) ?. with_default_tag ( ) ) ?;
381390 if !name. is_empty ( ) && !name. contains ( & b'=' ) {
382391 new = Some ( ( name. to_owned ( ) , value. to_owned ( ) ) ) ;
383392 }
384393 }
385394 }
386395 if let Some ( ( name, value) ) = new {
387396 // +1 for the null terminator
388- let value_copy = self . memory . allocate (
397+ let value_copy = self . memory_mut ( ) . allocate (
389398 Size :: from_bytes ( ( value. len ( ) + 1 ) as u64 ) ,
390399 Align :: from_bytes ( 1 , 1 ) . unwrap ( ) ,
391400 MiriMemoryKind :: Env . into ( ) ,
392- ) ?;
393- self . memory . write_bytes ( value_copy. into ( ) , & value) ?;
401+ ) ?. with_default_tag ( ) ;
402+ self . memory_mut ( ) . write_bytes ( value_copy. into ( ) , & value) ?;
394403 let trailing_zero_ptr = value_copy. offset ( Size :: from_bytes ( value. len ( ) as u64 ) , & self ) ?. into ( ) ;
395- self . memory . write_bytes ( trailing_zero_ptr, & [ 0 ] ) ?;
404+ self . memory_mut ( ) . write_bytes ( trailing_zero_ptr, & [ 0 ] ) ?;
396405 if let Some ( var) = self . machine . env_vars . insert (
397406 name. to_owned ( ) ,
398407 value_copy,
399408 )
400409 {
401- self . memory . deallocate ( var, None , MiriMemoryKind :: Env . into ( ) ) ?;
410+ self . memory_mut ( ) . deallocate ( var, None , MiriMemoryKind :: Env . into ( ) ) ?;
402411 }
403412 self . write_null ( dest) ?;
404413 } else {
@@ -415,7 +424,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
415424 // stdout/stderr
416425 use std:: io:: { self , Write } ;
417426
418- let buf_cont = self . memory . read_bytes ( buf. with_default_tag ( ) , Size :: from_bytes ( n) ) ?;
427+ let buf_cont = self . memory ( ) . read_bytes ( buf. with_default_tag ( ) , Size :: from_bytes ( n) ) ?;
419428 let res = if fd == 1 {
420429 io:: stdout ( ) . write ( buf_cont)
421430 } else {
@@ -437,7 +446,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
437446
438447 "strlen" => {
439448 let ptr = self . read_scalar ( args[ 0 ] ) ?. to_ptr ( ) ?. erase_tag ( ) ;
440- let n = self . memory . read_c_str ( ptr. with_default_tag ( ) ) ?. len ( ) ;
449+ let n = self . memory ( ) . read_c_str ( ptr. with_default_tag ( ) ) ?. len ( ) ;
441450 self . write_scalar ( Scalar :: from_uint ( n as u64 , dest. layout . size ) , dest) ?;
442451 }
443452
@@ -487,9 +496,9 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
487496
488497 // Extract the function type out of the signature (that seems easier than constructing it ourselves...)
489498 let dtor = match self . read_scalar ( args[ 1 ] ) ?. not_undef ( ) ? {
490- Scalar :: Ptr ( dtor_ptr) => Some ( self . memory . get_fn ( dtor_ptr) ?) ,
499+ Scalar :: Ptr ( dtor_ptr) => Some ( self . memory ( ) . get_fn ( dtor_ptr) ?) ,
491500 Scalar :: Bits { bits : 0 , size } => {
492- assert_eq ! ( size as u64 , self . memory. pointer_size( ) . bytes( ) ) ;
501+ assert_eq ! ( size as u64 , self . memory( ) . pointer_size( ) . bytes( ) ) ;
493502 None
494503 } ,
495504 Scalar :: Bits { .. } => return err ! ( ReadBytesAsPointer ) ,
@@ -505,7 +514,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
505514 if key_layout. size . bits ( ) < 128 && key >= ( 1u128 << key_layout. size . bits ( ) as u128 ) {
506515 return err ! ( OutOfTls ) ;
507516 }
508- self . memory . write_scalar (
517+ self . memory_mut ( ) . write_scalar (
509518 key_ptr. with_default_tag ( ) ,
510519 key_layout. align ,
511520 Scalar :: from_uint ( key, key_layout. size ) . into ( ) ,
0 commit comments