Skip to content

Commit 34895fc

Browse files
committed
Auto merge of #138459 - matthiaskrgr:rollup-hddfg18, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #138126 (Add an opt-out in pretty printing for RTN rendering) - #138399 (Delegation: allow foreign fns `reuse`) - #138406 (Update mdbook to 0.4.47) - #138417 (minor interpreter cleanups) - #138420 (Adapt to LLVM dropping CfiFunctionIndex::begin()/end()) - #138423 (Don't emit error within cast function, propagate it as a `CastError`) - #138425 (Remove `feature = "hash_raw_entry"`) - #138427 (Fix RISC-V VxWorks LLVM target triples) r? `@ghost` `@rustbot` modify labels: rollup
2 parents e794bbd + 3812966 commit 34895fc

File tree

2 files changed

+60
-50
lines changed

2 files changed

+60
-50
lines changed

src/alloc_addresses/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,6 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
377377
fn get_global_alloc_bytes(
378378
&self,
379379
id: AllocId,
380-
kind: MemoryKind,
381380
bytes: &[u8],
382381
align: Align,
383382
) -> InterpResult<'tcx, MiriAllocBytes> {
@@ -386,7 +385,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
386385
// In native lib mode, MiriAllocBytes for global allocations are handled via `prepared_alloc_bytes`.
387386
// This additional call ensures that some `MiriAllocBytes` are always prepared, just in case
388387
// this function gets called before the first time `addr_from_alloc_id` gets called.
389-
this.addr_from_alloc_id(id, kind)?;
388+
this.addr_from_alloc_id(id, MiriMemoryKind::Global.into())?;
390389
// The memory we need here will have already been allocated during an earlier call to
391390
// `addr_from_alloc_id` for this allocation. So don't create a new `MiriAllocBytes` here, instead
392391
// fetch the previously prepared bytes from `prepared_alloc_bytes`.

src/machine.rs

Lines changed: 59 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,59 @@ impl<'tcx> MiriMachine<'tcx> {
814814
.and_then(|(_allocated, deallocated)| *deallocated)
815815
.map(Span::data)
816816
}
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+
}
817870
}
818871

819872
impl VisitProvenance for MiriMachine<'_> {
@@ -1200,57 +1253,15 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
12001253
}
12011254
}
12021255

1203-
fn init_alloc_extra(
1256+
fn init_local_allocation(
12041257
ecx: &MiriInterpCx<'tcx>,
12051258
id: AllocId,
12061259
kind: MemoryKind,
12071260
size: Size,
12081261
align: Align,
12091262
) -> 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)
12541265
}
12551266

12561267
fn adjust_alloc_root_pointer(
@@ -1340,13 +1351,13 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
13401351
alloc: &'b Allocation,
13411352
) -> InterpResult<'tcx, Cow<'b, Allocation<Self::Provenance, Self::AllocExtra, Self::Bytes>>>
13421353
{
1343-
let kind = Self::GLOBAL_KIND.unwrap().into();
13441354
let alloc = alloc.adjust_from_tcx(
13451355
&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),
13471357
|ptr| ecx.global_root_pointer(ptr),
13481358
)?;
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)?;
13501361
interp_ok(Cow::Owned(alloc.with_extra(extra)))
13511362
}
13521363

0 commit comments

Comments
 (0)