From 2c7e3b548d1b1e57dfc3eec8bf82d9589cf25fe8 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sun, 16 Feb 2020 20:32:25 -0500 Subject: [PATCH] WIP --- src/librustc/mir/interpret/error.rs | 34 ++++++++++++++++++----------- src/librustc_session/session.rs | 16 ++++++++++++++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index df3971a5ac3f1..4d668d22333e7 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -4,17 +4,20 @@ use crate::hir::map::definitions::DefPathData; use crate::mir; use crate::ty::layout::{Align, LayoutError, Size}; use crate::ty::query::TyCtxtAt; +use crate::ty::tls; use crate::ty::{self, layout, Ty}; use backtrace::Backtrace; use hir::GeneratorKind; +use rustc_data_structures::sync::Lock; use rustc_errors::{struct_span_err, DiagnosticBuilder}; use rustc_hir as hir; use rustc_macros::HashStable; +use rustc_session::CtfeBacktrace; use rustc_span::symbol::Symbol; use rustc_span::{Pos, Span}; use rustc_target::spec::abi::Abi; -use std::{any::Any, env, fmt}; +use std::{any::Any, fmt}; #[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable)] pub enum ErrorHandled { @@ -241,21 +244,26 @@ impl From for InterpErrorInfo<'tcx> { impl<'tcx> From> for InterpErrorInfo<'tcx> { fn from(kind: InterpError<'tcx>) -> Self { - let backtrace = match env::var("RUSTC_CTFE_BACKTRACE") { - // Matching `RUST_BACKTRACE` -- we treat "0" the same as "not present". - Ok(ref val) if val != "0" => { - let mut backtrace = Backtrace::new_unresolved(); + let capture_backtrace = tls::with_context_opt(|ctxt| { + if let Some(ctxt) = ctxt { + let l = Lock::borrow(&ctxt.tcx.sess.ctfe_backtrace); + *l + } else { + CtfeBacktrace::Disabled + } + }); - if val == "immediate" { - // Print it now. - print_backtrace(&mut backtrace); - None - } else { - Some(Box::new(backtrace)) - } + let backtrace = match capture_backtrace { + CtfeBacktrace::Disabled => None, + CtfeBacktrace::Capture => Some(Box::new(Backtrace::new_unresolved())), + CtfeBacktrace::Immediate => { + // Print it now. + let mut backtrace = Backtrace::new_unresolved(); + print_backtrace(&mut backtrace); + None } - _ => None, }; + InterpErrorInfo { kind, backtrace } } } diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs index 6f003043aa95c..69bea01a56cb5 100644 --- a/src/librustc_session/session.rs +++ b/src/librustc_session/session.rs @@ -49,6 +49,13 @@ pub struct OptimizationFuel { out_of_fuel: bool, } +#[derive(Clone, Copy)] +pub enum CtfeBacktrace { + Disabled, + Capture, + Immediate, +} + /// Represents the data associated with a compilation /// session for a single crate. pub struct Session { @@ -136,6 +143,8 @@ pub struct Session { /// Path for libraries that will take preference over libraries shipped by Rust. /// Used by windows-gnu targets to priortize system mingw-w64 libraries. pub system_library_path: OneThread>>>, + + pub ctfe_backtrace: Lock, } pub struct PerfStats { @@ -1036,6 +1045,12 @@ fn build_session_( sopts.debugging_opts.time_passes, ); + let ctfe_backtrace = Lock::new(match env::var("RUSTC_CTFE_BACKTRACE") { + Ok(ref val) if val == "immediate" => CtfeBacktrace::Immediate, + Ok(ref val) if val != "0" => CtfeBacktrace::Capture, + _ => CtfeBacktrace::Disabled, + }); + let sess = Session { target: target_cfg, host, @@ -1073,6 +1088,7 @@ fn build_session_( trait_methods_not_found: Lock::new(Default::default()), confused_type_with_std_module: Lock::new(Default::default()), system_library_path: OneThread::new(RefCell::new(Default::default())), + ctfe_backtrace, }; validate_commandline_args_with_session_available(&sess);