@@ -17,7 +17,7 @@ use crate::*;
1717impl < ' mir , ' tcx > EvalContextExt < ' mir , ' tcx > for crate :: MiriEvalContext < ' mir , ' tcx > { }
1818
1919/// Gets an instance for a path.
20- fn resolve_did < ' mir , ' tcx > ( tcx : TyCtxt < ' tcx > , path : & [ & str ] ) -> InterpResult < ' tcx , DefId > {
20+ fn try_resolve_did < ' mir , ' tcx > ( tcx : TyCtxt < ' tcx > , path : & [ & str ] ) -> Option < DefId > {
2121 tcx. crates ( )
2222 . iter ( )
2323 . find ( |& & krate| tcx. original_crate_name ( krate) . as_str ( ) == path[ 0 ] )
@@ -40,18 +40,47 @@ fn resolve_did<'mir, 'tcx>(tcx: TyCtxt<'tcx>, path: &[&str]) -> InterpResult<'tc
4040 }
4141 None
4242 } )
43- . ok_or_else ( || {
44- err_unsup_format ! ( "failed to find required Rust item: {:?}" , path) . into ( )
45- } )
4643}
4744
4845pub trait EvalContextExt < ' mir , ' tcx : ' mir > : crate :: MiriEvalContextExt < ' mir , ' tcx > {
4946 /// Gets an instance for a path.
50- fn resolve_path ( & self , path : & [ & str ] ) -> InterpResult < ' tcx , ty:: Instance < ' tcx > > {
51- Ok ( ty:: Instance :: mono (
52- self . eval_context_ref ( ) . tcx . tcx ,
53- resolve_did ( self . eval_context_ref ( ) . tcx . tcx , path) ?,
54- ) )
47+ fn resolve_path ( & self , path : & [ & str ] ) -> ty:: Instance < ' tcx > {
48+ let did = try_resolve_did ( self . eval_context_ref ( ) . tcx . tcx , path)
49+ . unwrap_or_else ( || panic ! ( "failed to find required Rust item: {:?}" , path) ) ;
50+ ty:: Instance :: mono ( self . eval_context_ref ( ) . tcx . tcx , did)
51+ }
52+
53+ /// Evaluates the scalar at the specified path. Returns Some(val)
54+ /// if the path could be resolved, and None otherwise
55+ fn eval_path_scalar (
56+ & mut self ,
57+ path : & [ & str ] ,
58+ ) -> InterpResult < ' tcx , ScalarMaybeUndef < Tag > > {
59+ let this = self . eval_context_mut ( ) ;
60+ let instance = this. resolve_path ( path) ;
61+ let cid = GlobalId { instance, promoted : None } ;
62+ let const_val = this. const_eval_raw ( cid) ?;
63+ let const_val = this. read_scalar ( const_val. into ( ) ) ?;
64+ return Ok ( const_val) ;
65+ }
66+
67+ /// Helper function to get a `libc` constant as a `Scalar`.
68+ fn eval_libc ( & mut self , name : & str ) -> InterpResult < ' tcx , Scalar < Tag > > {
69+ self . eval_context_mut ( )
70+ . eval_path_scalar ( & [ "libc" , name] ) ?
71+ . not_undef ( )
72+ }
73+
74+ /// Helper function to get a `libc` constant as an `i32`.
75+ fn eval_libc_i32 ( & mut self , name : & str ) -> InterpResult < ' tcx , i32 > {
76+ self . eval_libc ( name) ?. to_i32 ( )
77+ }
78+
79+ /// Helper function to get the `TyLayout` of a `libc` type
80+ fn libc_ty_layout ( & mut self , name : & str ) -> InterpResult < ' tcx , TyLayout < ' tcx > > {
81+ let this = self . eval_context_mut ( ) ;
82+ let ty = this. resolve_path ( & [ "libc" , name] ) . monomorphic_ty ( * this. tcx ) ;
83+ this. layout_of ( ty)
5584 }
5685
5786 /// Write a 0 of the appropriate size to `dest`.
@@ -96,7 +125,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
96125 if this. machine . communicate {
97126 // Fill the buffer using the host's rng.
98127 getrandom:: getrandom ( & mut data)
99- . map_err ( |err| err_unsup_format ! ( "getrandom failed: {}" , err) ) ?;
128+ . map_err ( |err| err_unsup_format ! ( "host getrandom failed: {}" , err) ) ?;
100129 } else {
101130 let rng = this. memory . extra . rng . get_mut ( ) ;
102131 rng. fill_bytes ( & mut data) ;
@@ -311,26 +340,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
311340 }
312341 }
313342
314- /// Helper function to get a `libc` constant as a `Scalar`.
315- fn eval_libc ( & mut self , name : & str ) -> InterpResult < ' tcx , Scalar < Tag > > {
316- self . eval_context_mut ( )
317- . eval_path_scalar ( & [ "libc" , name] ) ?
318- . ok_or_else ( || err_unsup_format ! ( "Path libc::{} cannot be resolved." , name) ) ?
319- . not_undef ( )
320- }
321-
322- /// Helper function to get a `libc` constant as an `i32`.
323- fn eval_libc_i32 ( & mut self , name : & str ) -> InterpResult < ' tcx , i32 > {
324- self . eval_libc ( name) ?. to_i32 ( )
325- }
326-
327- /// Helper function to get the `TyLayout` of a `libc` type
328- fn libc_ty_layout ( & mut self , name : & str ) -> InterpResult < ' tcx , TyLayout < ' tcx > > {
329- let this = self . eval_context_mut ( ) ;
330- let ty = this. resolve_path ( & [ "libc" , name] ) ?. monomorphic_ty ( * this. tcx ) ;
331- this. layout_of ( ty)
332- }
333-
334343 // Writes several `ImmTy`s contiguosly into memory. This is useful when you have to pack
335344 // different values into a struct.
336345 fn write_packed_immediates (
@@ -529,7 +538,7 @@ pub fn immty_from_int_checked<'tcx>(
529538) -> InterpResult < ' tcx , ImmTy < ' tcx , Tag > > {
530539 let int = int. into ( ) ;
531540 Ok ( ImmTy :: try_from_int ( int, layout) . ok_or_else ( || {
532- err_unsup_format ! ( "Signed value {:#x} does not fit in {} bits" , int, layout. size. bits( ) )
541+ err_unsup_format ! ( "signed value {:#x} does not fit in {} bits" , int, layout. size. bits( ) )
533542 } ) ?)
534543}
535544
@@ -539,6 +548,6 @@ pub fn immty_from_uint_checked<'tcx>(
539548) -> InterpResult < ' tcx , ImmTy < ' tcx , Tag > > {
540549 let int = int. into ( ) ;
541550 Ok ( ImmTy :: try_from_uint ( int, layout) . ok_or_else ( || {
542- err_unsup_format ! ( "Signed value {:#x} does not fit in {} bits" , int, layout. size. bits( ) )
551+ err_unsup_format ! ( "unsigned value {:#x} does not fit in {} bits" , int, layout. size. bits( ) )
543552 } ) ?)
544553}
0 commit comments