@@ -18,7 +18,7 @@ use crate::*;
18
18
impl < ' mir , ' tcx > EvalContextExt < ' mir , ' tcx > for crate :: MiriEvalContext < ' mir , ' tcx > { }
19
19
20
20
/// 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 > {
22
22
tcx. crates ( )
23
23
. iter ( )
24
24
. 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
41
41
}
42
42
None
43
43
} )
44
- . ok_or_else ( || {
45
- err_unsup_format ! ( "failed to find required Rust item: {:?}" , path) . into ( )
46
- } )
47
44
}
48
45
49
46
pub trait EvalContextExt < ' mir , ' tcx : ' mir > : crate :: MiriEvalContextExt < ' mir , ' tcx > {
50
47
/// 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)
56
85
}
57
86
58
87
/// Write a 0 of the appropriate size to `dest`.
@@ -97,7 +126,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
97
126
if this. machine . communicate {
98
127
// Fill the buffer using the host's rng.
99
128
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) ) ?;
101
130
} else {
102
131
let rng = this. memory . extra . rng . get_mut ( ) ;
103
132
rng. fill_bytes ( & mut data) ;
@@ -312,26 +341,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
312
341
}
313
342
}
314
343
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
-
335
344
// Writes several `ImmTy`s contiguosly into memory. This is useful when you have to pack
336
345
// different values into a struct.
337
346
fn write_packed_immediates (
@@ -530,7 +539,7 @@ pub fn immty_from_int_checked<'tcx>(
530
539
) -> InterpResult < ' tcx , ImmTy < ' tcx , Tag > > {
531
540
let int = int. into ( ) ;
532
541
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( ) )
534
543
} ) ?)
535
544
}
536
545
@@ -540,6 +549,6 @@ pub fn immty_from_uint_checked<'tcx>(
540
549
) -> InterpResult < ' tcx , ImmTy < ' tcx , Tag > > {
541
550
let int = int. into ( ) ;
542
551
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( ) )
544
553
} ) ?)
545
554
}
0 commit comments