diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-09-19 17:55:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-19 17:55:21 +0200 |
| commit | 8c0f8a285f7fcd3ed94402ac1f72ff4c01190e13 (patch) | |
| tree | 8f2ce5e60cbed231205a5dc85bf0a05815e9725b | |
| parent | 33a224297d877633d304af62d75dd8fd29594daf (diff) | |
| parent | 9fa3171015c63edc541d45583f2a24af3fa4d2bc (diff) | |
| download | rust-8c0f8a285f7fcd3ed94402ac1f72ff4c01190e13.tar.gz rust-8c0f8a285f7fcd3ed94402ac1f72ff4c01190e13.zip | |
Rollup merge of #101985 - RalfJung:generate_stacktrace, r=oli-obk
interpret: expose generate_stacktrace without full InterpCx In Miri we sometimes want to emit diagnostics without having a full `&InterpCx` available. To avoid duplicating code, this adds a way to get a stacktrace from an arbitrary slice of interpreter frames, that Miri can use with access to just a thread manager.
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/eval_context.rs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/eval_context.rs b/compiler/rustc_const_eval/src/interpret/eval_context.rs index d37eaeed095..3177537fee2 100644 --- a/compiler/rustc_const_eval/src/interpret/eval_context.rs +++ b/compiler/rustc_const_eval/src/interpret/eval_context.rs @@ -929,11 +929,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } #[must_use] - pub fn generate_stacktrace(&self) -> Vec<FrameInfo<'tcx>> { + pub fn generate_stacktrace_from_stack( + stack: &[Frame<'mir, 'tcx, M::Provenance, M::FrameExtra>], + ) -> Vec<FrameInfo<'tcx>> { let mut frames = Vec::new(); // This deliberately does *not* honor `requires_caller_location` since it is used for much // more than just panics. - for frame in self.stack().iter().rev() { + for frame in stack.iter().rev() { let lint_root = frame.current_source_info().and_then(|source_info| { match &frame.body.source_scopes[source_info.scope].local_data { mir::ClearCrossCrate::Set(data) => Some(data.lint_root), @@ -947,6 +949,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { trace!("generate stacktrace: {:#?}", frames); frames } + + #[must_use] + pub fn generate_stacktrace(&self) -> Vec<FrameInfo<'tcx>> { + Self::generate_stacktrace_from_stack(self.stack()) + } } #[doc(hidden)] |
