@@ -48,7 +48,6 @@ impl<'mir, 'tcx> GlobalStateInner {
48
48
// or `None` if the addr is out of bounds
49
49
fn alloc_id_from_addr ( ecx : & MiriEvalContext < ' mir , ' tcx > , addr : u64 ) -> Option < AllocId > {
50
50
let global_state = ecx. machine . intptrcast . borrow ( ) ;
51
- assert ! ( global_state. provenance_mode != ProvenanceMode :: Strict ) ;
52
51
53
52
let pos = global_state. int_to_ptr_map . binary_search_by_key ( & addr, |( addr, _) | * addr) ;
54
53
@@ -77,30 +76,43 @@ impl<'mir, 'tcx> GlobalStateInner {
77
76
}
78
77
} ?;
79
78
80
- match global_state. provenance_mode {
81
- ProvenanceMode :: Legacy => Some ( alloc_id) ,
82
- ProvenanceMode :: Permissive if global_state. exposed . contains ( & alloc_id) =>
83
- Some ( alloc_id) ,
84
- _ => None ,
79
+ // In legacy mode, we consider all allocations exposed.
80
+ if global_state. provenance_mode == ProvenanceMode :: Legacy
81
+ || global_state. exposed . contains ( & alloc_id)
82
+ {
83
+ Some ( alloc_id)
84
+ } else {
85
+ None
85
86
}
86
87
}
87
88
88
89
pub fn expose_addr ( ecx : & MiriEvalContext < ' mir , ' tcx > , alloc_id : AllocId ) {
89
90
trace ! ( "Exposing allocation id {:?}" , alloc_id) ;
90
91
91
92
let mut global_state = ecx. machine . intptrcast . borrow_mut ( ) ;
92
- global_state. exposed . insert ( alloc_id) ;
93
+ if global_state. provenance_mode == ProvenanceMode :: Permissive {
94
+ global_state. exposed . insert ( alloc_id) ;
95
+ }
93
96
}
94
97
95
- pub fn ptr_from_addr ( ecx : & MiriEvalContext < ' mir , ' tcx > , addr : u64 ) -> Pointer < Option < Tag > > {
98
+ pub fn ptr_from_addr_transmute (
99
+ ecx : & MiriEvalContext < ' mir , ' tcx > ,
100
+ addr : u64 ,
101
+ ) -> Pointer < Option < Tag > > {
96
102
trace ! ( "Transmuting 0x{:x} to a pointer" , addr) ;
97
103
98
- // TODO: fix this at some point once we deal with function pointers
99
- // Pointer::new(None, Size::from_bytes(addr))
100
- Self :: ptr_from_casted_addr ( ecx, addr)
104
+ let global_state = ecx. machine . intptrcast . borrow ( ) ;
105
+
106
+ // In legacy mode, we have to support int2ptr transmutes,
107
+ // so just pretend they do the same thing as a cast.
108
+ if global_state. provenance_mode == ProvenanceMode :: Legacy {
109
+ Self :: ptr_from_addr_cast ( ecx, addr)
110
+ } else {
111
+ Pointer :: new ( None , Size :: from_bytes ( addr) )
112
+ }
101
113
}
102
114
103
- pub fn ptr_from_casted_addr (
115
+ pub fn ptr_from_addr_cast (
104
116
ecx : & MiriEvalContext < ' mir , ' tcx > ,
105
117
addr : u64 ,
106
118
) -> Pointer < Option < Tag > > {
0 commit comments