@@ -814,6 +814,59 @@ impl<'tcx> MiriMachine<'tcx> {
814
814
. and_then ( |( _allocated, deallocated) | * deallocated)
815
815
. map ( Span :: data)
816
816
}
817
+
818
+ fn init_allocation (
819
+ ecx : & MiriInterpCx < ' tcx > ,
820
+ id : AllocId ,
821
+ kind : MemoryKind ,
822
+ size : Size ,
823
+ align : Align ,
824
+ ) -> InterpResult < ' tcx , AllocExtra < ' tcx > > {
825
+ if ecx. machine . tracked_alloc_ids . contains ( & id) {
826
+ ecx. emit_diagnostic ( NonHaltingDiagnostic :: CreatedAlloc ( id, size, align, kind) ) ;
827
+ }
828
+
829
+ let borrow_tracker = ecx
830
+ . machine
831
+ . borrow_tracker
832
+ . as_ref ( )
833
+ . map ( |bt| bt. borrow_mut ( ) . new_allocation ( id, size, kind, & ecx. machine ) ) ;
834
+
835
+ let data_race = ecx. machine . data_race . as_ref ( ) . map ( |data_race| {
836
+ data_race:: AllocState :: new_allocation (
837
+ data_race,
838
+ & ecx. machine . threads ,
839
+ size,
840
+ kind,
841
+ ecx. machine . current_span ( ) ,
842
+ )
843
+ } ) ;
844
+ let weak_memory = ecx. machine . weak_memory . then ( weak_memory:: AllocState :: new_allocation) ;
845
+
846
+ // If an allocation is leaked, we want to report a backtrace to indicate where it was
847
+ // allocated. We don't need to record a backtrace for allocations which are allowed to
848
+ // leak.
849
+ let backtrace = if kind. may_leak ( ) || !ecx. machine . collect_leak_backtraces {
850
+ None
851
+ } else {
852
+ Some ( ecx. generate_stacktrace ( ) )
853
+ } ;
854
+
855
+ if matches ! ( kind, MemoryKind :: Machine ( kind) if kind. should_save_allocation_span( ) ) {
856
+ ecx. machine
857
+ . allocation_spans
858
+ . borrow_mut ( )
859
+ . insert ( id, ( ecx. machine . current_span ( ) , None ) ) ;
860
+ }
861
+
862
+ interp_ok ( AllocExtra {
863
+ borrow_tracker,
864
+ data_race,
865
+ weak_memory,
866
+ backtrace,
867
+ sync : FxHashMap :: default ( ) ,
868
+ } )
869
+ }
817
870
}
818
871
819
872
impl VisitProvenance for MiriMachine < ' _ > {
@@ -1200,57 +1253,15 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
1200
1253
}
1201
1254
}
1202
1255
1203
- fn init_alloc_extra (
1256
+ fn init_local_allocation (
1204
1257
ecx : & MiriInterpCx < ' tcx > ,
1205
1258
id : AllocId ,
1206
1259
kind : MemoryKind ,
1207
1260
size : Size ,
1208
1261
align : Align ,
1209
1262
) -> InterpResult < ' tcx , Self :: AllocExtra > {
1210
- if ecx. machine . tracked_alloc_ids . contains ( & id) {
1211
- ecx. emit_diagnostic ( NonHaltingDiagnostic :: CreatedAlloc ( id, size, align, kind) ) ;
1212
- }
1213
-
1214
- let borrow_tracker = ecx
1215
- . machine
1216
- . borrow_tracker
1217
- . as_ref ( )
1218
- . map ( |bt| bt. borrow_mut ( ) . new_allocation ( id, size, kind, & ecx. machine ) ) ;
1219
-
1220
- let data_race = ecx. machine . data_race . as_ref ( ) . map ( |data_race| {
1221
- data_race:: AllocState :: new_allocation (
1222
- data_race,
1223
- & ecx. machine . threads ,
1224
- size,
1225
- kind,
1226
- ecx. machine . current_span ( ) ,
1227
- )
1228
- } ) ;
1229
- let weak_memory = ecx. machine . weak_memory . then ( weak_memory:: AllocState :: new_allocation) ;
1230
-
1231
- // If an allocation is leaked, we want to report a backtrace to indicate where it was
1232
- // allocated. We don't need to record a backtrace for allocations which are allowed to
1233
- // leak.
1234
- let backtrace = if kind. may_leak ( ) || !ecx. machine . collect_leak_backtraces {
1235
- None
1236
- } else {
1237
- Some ( ecx. generate_stacktrace ( ) )
1238
- } ;
1239
-
1240
- if matches ! ( kind, MemoryKind :: Machine ( kind) if kind. should_save_allocation_span( ) ) {
1241
- ecx. machine
1242
- . allocation_spans
1243
- . borrow_mut ( )
1244
- . insert ( id, ( ecx. machine . current_span ( ) , None ) ) ;
1245
- }
1246
-
1247
- interp_ok ( AllocExtra {
1248
- borrow_tracker,
1249
- data_race,
1250
- weak_memory,
1251
- backtrace,
1252
- sync : FxHashMap :: default ( ) ,
1253
- } )
1263
+ assert ! ( kind != MiriMemoryKind :: Global . into( ) ) ;
1264
+ MiriMachine :: init_allocation ( ecx, id, kind, size, align)
1254
1265
}
1255
1266
1256
1267
fn adjust_alloc_root_pointer (
@@ -1340,13 +1351,13 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
1340
1351
alloc : & ' b Allocation ,
1341
1352
) -> InterpResult < ' tcx , Cow < ' b , Allocation < Self :: Provenance , Self :: AllocExtra , Self :: Bytes > > >
1342
1353
{
1343
- let kind = Self :: GLOBAL_KIND . unwrap ( ) . into ( ) ;
1344
1354
let alloc = alloc. adjust_from_tcx (
1345
1355
& ecx. tcx ,
1346
- |bytes, align| ecx. get_global_alloc_bytes ( id, kind , bytes, align) ,
1356
+ |bytes, align| ecx. get_global_alloc_bytes ( id, bytes, align) ,
1347
1357
|ptr| ecx. global_root_pointer ( ptr) ,
1348
1358
) ?;
1349
- let extra = Self :: init_alloc_extra ( ecx, id, kind, alloc. size ( ) , alloc. align ) ?;
1359
+ let kind = MiriMemoryKind :: Global . into ( ) ;
1360
+ let extra = MiriMachine :: init_allocation ( ecx, id, kind, alloc. size ( ) , alloc. align ) ?;
1350
1361
interp_ok ( Cow :: Owned ( alloc. with_extra ( extra) ) )
1351
1362
}
1352
1363
0 commit comments