From db1fbd4a11db579436f68be3a8f5fe03484aa45d Mon Sep 17 00:00:00 2001 From: Mohsen Zohrevandi Date: Wed, 25 Mar 2020 19:28:14 -0700 Subject: [PATCH 1/6] Process termination tests Related issues: - https://github.com/fortanix/rust-sgx/issues/109 --- .../process-termination-blocking-io.rs | 18 ++++++++++++++++++ .../process-termination-simple.rs | 12 ++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/test/ui/process-termination/process-termination-blocking-io.rs create mode 100644 src/test/ui/process-termination/process-termination-simple.rs diff --git a/src/test/ui/process-termination/process-termination-blocking-io.rs b/src/test/ui/process-termination/process-termination-blocking-io.rs new file mode 100644 index 0000000000000..d9027fc89e299 --- /dev/null +++ b/src/test/ui/process-termination/process-termination-blocking-io.rs @@ -0,0 +1,18 @@ +// program should terminate even if a thread is blocked on I/O. +// https://github.com/fortanix/rust-sgx/issues/109 + +// run-pass + +use std::{net::TcpListener, sync::mpsc, thread}; + +fn main() { + let (tx, rx) = mpsc::channel(); + thread::spawn(move || { + let listen = TcpListener::bind("0:0").unwrap(); + tx.send(()).unwrap(); + while let Ok(_) = listen.accept() {} + }); + rx.recv().unwrap(); + for _ in 0..3 { thread::yield_now(); } + println!("Exiting main thread"); +} diff --git a/src/test/ui/process-termination/process-termination-simple.rs b/src/test/ui/process-termination/process-termination-simple.rs new file mode 100644 index 0000000000000..7098a34512ee3 --- /dev/null +++ b/src/test/ui/process-termination/process-termination-simple.rs @@ -0,0 +1,12 @@ +// program should terminate when std::process::exit is called from any thread + +// run-pass + +use std::{process, thread}; + +fn main() { + let h = thread::spawn(|| { + process::exit(0); + }); + let _ = h.join(); +} From 9d8f1170b1fa923373766e26a2847390e0a2ea91 Mon Sep 17 00:00:00 2001 From: Mohsen Zohrevandi Date: Wed, 29 Apr 2020 10:36:56 -0700 Subject: [PATCH 2/6] Ignore wasm in process termination tests --- .../ui/process-termination/process-termination-blocking-io.rs | 1 + src/test/ui/process-termination/process-termination-simple.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/test/ui/process-termination/process-termination-blocking-io.rs b/src/test/ui/process-termination/process-termination-blocking-io.rs index d9027fc89e299..864fb776e867d 100644 --- a/src/test/ui/process-termination/process-termination-blocking-io.rs +++ b/src/test/ui/process-termination/process-termination-blocking-io.rs @@ -2,6 +2,7 @@ // https://github.com/fortanix/rust-sgx/issues/109 // run-pass +// ignore-wasm no threads support use std::{net::TcpListener, sync::mpsc, thread}; diff --git a/src/test/ui/process-termination/process-termination-simple.rs b/src/test/ui/process-termination/process-termination-simple.rs index 7098a34512ee3..3660f95b05bc1 100644 --- a/src/test/ui/process-termination/process-termination-simple.rs +++ b/src/test/ui/process-termination/process-termination-simple.rs @@ -1,6 +1,7 @@ // program should terminate when std::process::exit is called from any thread // run-pass +// ignore-wasm no threads support use std::{process, thread}; From 30b32c6570ded694362e21fc35101c106c4cd8b8 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 Apr 2020 18:24:43 +0200 Subject: [PATCH 3/6] Miri: port error backtraces to std::backtrace --- Cargo.lock | 1 - src/librustc_middle/Cargo.toml | 1 - src/librustc_middle/lib.rs | 1 + src/librustc_middle/mir/interpret/error.rs | 20 +++++++++----------- src/librustc_mir/const_eval/error.rs | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8db306ffd5455..c8639a933f15d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3977,7 +3977,6 @@ name = "rustc_middle" version = "0.0.0" dependencies = [ "arena", - "backtrace", "bitflags", "byteorder", "log", diff --git a/src/librustc_middle/Cargo.toml b/src/librustc_middle/Cargo.toml index 8e27e03ea4ffe..398ba4d72d449 100644 --- a/src/librustc_middle/Cargo.toml +++ b/src/librustc_middle/Cargo.toml @@ -30,7 +30,6 @@ rustc_index = { path = "../librustc_index" } rustc_serialize = { path = "../libserialize", package = "serialize" } rustc_ast = { path = "../librustc_ast" } rustc_span = { path = "../librustc_span" } -backtrace = "0.3.40" byteorder = { version = "1.3" } smallvec = { version = "1.0", features = ["union", "may_dangle"] } measureme = "0.7.1" diff --git a/src/librustc_middle/lib.rs b/src/librustc_middle/lib.rs index 4ed03fd21ad18..9b38b43c93ae2 100644 --- a/src/librustc_middle/lib.rs +++ b/src/librustc_middle/lib.rs @@ -23,6 +23,7 @@ //! This API is completely unstable and subject to change. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")] +#![feature(backtrace)] #![feature(bool_to_option)] #![feature(box_patterns)] #![feature(box_syntax)] diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs index e6557c9fbd59d..32576b6bbb366 100644 --- a/src/librustc_middle/mir/interpret/error.rs +++ b/src/librustc_middle/mir/interpret/error.rs @@ -6,7 +6,6 @@ use crate::ty::query::TyCtxtAt; use crate::ty::tls; use crate::ty::{self, layout, Ty}; -use backtrace::Backtrace; use rustc_data_structures::sync::Lock; use rustc_errors::{struct_span_err, DiagnosticBuilder, ErrorReported}; use rustc_hir as hir; @@ -15,7 +14,7 @@ use rustc_macros::HashStable; use rustc_session::CtfeBacktrace; use rustc_span::{def_id::DefId, Pos, Span}; use rustc_target::abi::{Align, Size}; -use std::{any::Any, fmt, mem}; +use std::{any::Any, backtrace::Backtrace, fmt, mem}; #[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, RustcEncodable, RustcDecodable)] pub enum ErrorHandled { @@ -219,16 +218,15 @@ impl fmt::Display for InterpErrorInfo<'_> { } impl InterpErrorInfo<'_> { - pub fn print_backtrace(&mut self) { - if let Some(ref mut backtrace) = self.backtrace { - print_backtrace(&mut *backtrace); + pub fn print_backtrace(&self) { + if let Some(backtrace) = self.backtrace.as_ref() { + print_backtrace(backtrace); } } } -fn print_backtrace(backtrace: &mut Backtrace) { - backtrace.resolve(); - eprintln!("\n\nAn error occurred in miri:\n{:?}", backtrace); +fn print_backtrace(backtrace: &Backtrace) { + eprintln!("\n\nAn error occurred in miri:\n{}", backtrace); } impl From for InterpErrorInfo<'_> { @@ -255,11 +253,11 @@ impl<'tcx> From> for InterpErrorInfo<'tcx> { let backtrace = match capture_backtrace { CtfeBacktrace::Disabled => None, - CtfeBacktrace::Capture => Some(Box::new(Backtrace::new_unresolved())), + CtfeBacktrace::Capture => Some(Box::new(Backtrace::force_capture())), CtfeBacktrace::Immediate => { // Print it now. - let mut backtrace = Backtrace::new_unresolved(); - print_backtrace(&mut backtrace); + let backtrace = Backtrace::force_capture(); + print_backtrace(&backtrace); None } }; diff --git a/src/librustc_mir/const_eval/error.rs b/src/librustc_mir/const_eval/error.rs index 3c3618f390c61..b165a69433db1 100644 --- a/src/librustc_mir/const_eval/error.rs +++ b/src/librustc_mir/const_eval/error.rs @@ -52,7 +52,7 @@ impl Error for ConstEvalErrKind {} /// Should be called only if the error is actually going to to be reported! pub fn error_to_const_error<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>>( ecx: &InterpCx<'mir, 'tcx, M>, - mut error: InterpErrorInfo<'tcx>, + error: InterpErrorInfo<'tcx>, ) -> ConstEvalErr<'tcx> { error.print_backtrace(); let stacktrace = ecx.generate_stacktrace(); From 8abfb685b317aee6525107bf70b0824ea82a57ca Mon Sep 17 00:00:00 2001 From: Tshepang Lekhonkhobe Date: Fri, 1 May 2020 11:45:05 +0200 Subject: [PATCH 4/6] remove obsolete comment Referenced was removed in 9f492fefef8d9a75f6dc27c834561fe977ca70c5 --- src/librustc_trait_selection/traits/util.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc_trait_selection/traits/util.rs b/src/librustc_trait_selection/traits/util.rs index 4aceccf64ce65..eff73cf4a2d8a 100644 --- a/src/librustc_trait_selection/traits/util.rs +++ b/src/librustc_trait_selection/traits/util.rs @@ -217,7 +217,6 @@ pub fn impl_trait_ref_and_oblig<'a, 'tcx>( (impl_trait_ref, impl_obligations) } -/// See [`super::obligations_for_generics`]. pub fn predicates_for_generics<'tcx>( cause: ObligationCause<'tcx>, recursion_depth: usize, From 8bdf988be21471fb56a484e7f32379e42cecc0a5 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 1 May 2020 09:30:46 -0300 Subject: [PATCH 5/6] Remove deadcode in eval_mir_constant_to_operand --- src/librustc_codegen_ssa/mir/constant.rs | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/librustc_codegen_ssa/mir/constant.rs b/src/librustc_codegen_ssa/mir/constant.rs index 298aa25f0321f..d2629b771c2af 100644 --- a/src/librustc_codegen_ssa/mir/constant.rs +++ b/src/librustc_codegen_ssa/mir/constant.rs @@ -16,25 +16,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { bx: &mut Bx, constant: &mir::Constant<'tcx>, ) -> Result, ErrorHandled> { - match constant.literal.val { - // Special case unevaluated statics, because statics have an identity and thus should - // use `get_static` to get at their id. - // FIXME(oli-obk): can we unify this somehow, maybe by making const eval of statics - // always produce `&STATIC`. This may also simplify how const eval works with statics. - ty::ConstKind::Unevaluated(def_id, substs, None) if self.cx.tcx().is_static(def_id) => { - assert!(substs.is_empty(), "we don't support generic statics yet"); - let static_ = bx.get_static(def_id); - // we treat operands referring to statics as if they were `&STATIC` instead - let ptr_ty = self.cx.tcx().mk_mut_ptr(self.monomorphize(&constant.literal.ty)); - let layout = bx.layout_of(ptr_ty); - Ok(OperandRef::from_immediate_or_packed_pair(bx, static_, layout)) - } - _ => { - let val = self.eval_mir_constant(constant)?; - let ty = self.monomorphize(&constant.literal.ty); - Ok(OperandRef::from_const(bx, val, ty)) - } - } + let val = self.eval_mir_constant(constant)?; + let ty = self.monomorphize(&constant.literal.ty); + Ok(OperandRef::from_const(bx, val, ty)) } pub fn eval_mir_constant( From 1bab6a4db788abae8c06cfa3cb19b0027e9cd8bf Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Fri, 1 May 2020 14:39:41 +0200 Subject: [PATCH 6/6] fix Miri error message padding --- src/librustc_middle/mir/interpret/error.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs index 40454ce3b2db8..0ab14b53e1b1f 100644 --- a/src/librustc_middle/mir/interpret/error.rs +++ b/src/librustc_middle/mir/interpret/error.rs @@ -439,10 +439,10 @@ impl fmt::Display for UndefinedBehaviorInfo { DerefFunctionPointer(a) => write!(f, "accessing {} which contains a function", a), ValidationFailure(ref err) => write!(f, "type validation failed: {}", err), InvalidBool(b) => { - write!(f, "interpreting an invalid 8-bit value as a bool: 0x{:2x}", b) + write!(f, "interpreting an invalid 8-bit value as a bool: 0x{:02x}", b) } InvalidChar(c) => { - write!(f, "interpreting an invalid 32-bit value as a char: 0x{:8x}", c) + write!(f, "interpreting an invalid 32-bit value as a char: 0x{:08x}", c) } InvalidDiscriminant(val) => write!(f, "enum value has invalid discriminant: {}", val), InvalidFunctionPointer(p) => {