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