Skip to content

Commit 9b4439b

Browse files
committed
Move generate_stacktrace_from_stack away from InterpCx to avoid having to know the Machine type
1 parent 01392a5 commit 9b4439b

File tree

4 files changed

+32
-37
lines changed

4 files changed

+32
-37
lines changed

compiler/rustc_const_eval/src/const_eval/error.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ use rustc_middle::ty::TyCtxt;
88
use rustc_middle::ty::{layout::LayoutError, ConstInt};
99
use rustc_span::{Span, Symbol, DUMMY_SP};
1010

11-
use super::{CompileTimeInterpreter, InterpCx};
11+
use super::CompileTimeInterpreter;
1212
use crate::errors::{self, FrameNote, ReportErrorExt};
13-
use crate::interpret::{ErrorHandled, InterpError, InterpErrorInfo, MachineStopType};
13+
use crate::interpret::{ErrorHandled, Frame, InterpError, InterpErrorInfo, MachineStopType};
1414

1515
/// The CTFE machine has some custom error kinds.
1616
#[derive(Clone, Debug)]
@@ -63,10 +63,7 @@ pub fn get_span_and_frames<'tcx, 'mir>(
6363
where
6464
'tcx: 'mir,
6565
{
66-
let mut stacktrace =
67-
InterpCx::<CompileTimeInterpreter<'mir, 'tcx>>::generate_stacktrace_from_stack(
68-
&machine.stack,
69-
);
66+
let mut stacktrace = Frame::generate_stacktrace_from_stack(&machine.stack);
7067
// Filter out `requires_caller_location` frames.
7168
stacktrace.retain(|frame| !frame.instance.def.requires_caller_location(*tcx));
7269
let span = stacktrace.first().map(|f| f.span).unwrap_or(tcx.span);

compiler/rustc_const_eval/src/const_eval/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_middle::mir::interpret::InterpErrorInfo;
55
use rustc_middle::query::TyCtxtAt;
66
use rustc_middle::ty::{self, Ty};
77

8-
use crate::interpret::{format_interp_error, InterpCx};
8+
use crate::interpret::format_interp_error;
99

1010
mod error;
1111
mod eval_queries;

compiler/rustc_const_eval/src/interpret/eval_context.rs

+27-29
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,32 @@ impl<'mir, 'tcx, Prov: Provenance, Extra> Frame<'mir, 'tcx, Prov, Extra> {
279279
}
280280
})
281281
}
282+
283+
#[must_use]
284+
pub fn generate_stacktrace_from_stack(stack: &[Self]) -> Vec<FrameInfo<'tcx>> {
285+
let mut frames = Vec::new();
286+
// This deliberately does *not* honor `requires_caller_location` since it is used for much
287+
// more than just panics.
288+
for frame in stack.iter().rev() {
289+
let span = match frame.loc {
290+
Left(loc) => {
291+
// If the stacktrace passes through MIR-inlined source scopes, add them.
292+
let mir::SourceInfo { mut span, scope } = *frame.body.source_info(loc);
293+
let mut scope_data = &frame.body.source_scopes[scope];
294+
while let Some((instance, call_span)) = scope_data.inlined {
295+
frames.push(FrameInfo { span, instance });
296+
span = call_span;
297+
scope_data = &frame.body.source_scopes[scope_data.parent_scope.unwrap()];
298+
}
299+
span
300+
}
301+
Right(span) => span,
302+
};
303+
frames.push(FrameInfo { span, instance: frame.instance });
304+
}
305+
trace!("generate stacktrace: {:#?}", frames);
306+
frames
307+
}
282308
}
283309

284310
// FIXME: only used by miri, should be removed once translatable.
@@ -1166,37 +1192,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
11661192
PlacePrinter { ecx: self, place: *place.place() }
11671193
}
11681194

1169-
#[must_use]
1170-
pub fn generate_stacktrace_from_stack(
1171-
stack: &[Frame<'mir, 'tcx, M::Provenance, M::FrameExtra>],
1172-
) -> Vec<FrameInfo<'tcx>> {
1173-
let mut frames = Vec::new();
1174-
// This deliberately does *not* honor `requires_caller_location` since it is used for much
1175-
// more than just panics.
1176-
for frame in stack.iter().rev() {
1177-
let span = match frame.loc {
1178-
Left(loc) => {
1179-
// If the stacktrace passes through MIR-inlined source scopes, add them.
1180-
let mir::SourceInfo { mut span, scope } = *frame.body.source_info(loc);
1181-
let mut scope_data = &frame.body.source_scopes[scope];
1182-
while let Some((instance, call_span)) = scope_data.inlined {
1183-
frames.push(FrameInfo { span, instance });
1184-
span = call_span;
1185-
scope_data = &frame.body.source_scopes[scope_data.parent_scope.unwrap()];
1186-
}
1187-
span
1188-
}
1189-
Right(span) => span,
1190-
};
1191-
frames.push(FrameInfo { span, instance: frame.instance });
1192-
}
1193-
trace!("generate stacktrace: {:#?}", frames);
1194-
frames
1195-
}
1196-
11971195
#[must_use]
11981196
pub fn generate_stacktrace(&self) -> Vec<FrameInfo<'tcx>> {
1199-
Self::generate_stacktrace_from_stack(self.stack())
1197+
Frame::generate_stacktrace_from_stack(self.stack())
12001198
}
12011199
}
12021200

src/tools/miri/src/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ impl<'mir, 'tcx> MiriMachine<'mir, 'tcx> {
528528
use NonHaltingDiagnostic::*;
529529

530530
let stacktrace =
531-
MiriInterpCx::generate_stacktrace_from_stack(self.threads.active_thread_stack());
531+
Frame::generate_stacktrace_from_stack(self.threads.active_thread_stack());
532532
let (stacktrace, _was_pruned) = prune_stacktrace(stacktrace, self);
533533

534534
let (title, diag_level) = match &e {

0 commit comments

Comments
 (0)