]> git.lizzy.rs Git - rust.git/blobdiff - src/eval.rs
fix diagnostics printing when triggered during TLS dtor scheduling
[rust.git] / src / eval.rs
index ee429dd3143ed5cbfc2ee6df9bedda2dac6d02de..cc5a6eb21fabac1083490440533eda642d9683f7 100644 (file)
@@ -5,6 +5,7 @@
 
 use rand::rngs::StdRng;
 use rand::SeedableRng;
+use log::info;
 
 use rustc_hir::def_id::DefId;
 use rustc_middle::ty::{self, layout::LayoutCx, TyCtxt};
@@ -195,8 +196,8 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
 /// Returns `Some(return_code)` if program executed completed.
 /// Returns `None` if an evaluation error occured.
 pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) -> Option<i64> {
-    // FIXME: on Windows, we ignore leaks (https://github.com/rust-lang/miri/issues/1302).
-    let ignore_leaks = config.ignore_leaks || tcx.sess.target.target.target_os == "windows";
+    // Copy setting before we move `config`.
+    let ignore_leaks = config.ignore_leaks;
 
     let (mut ecx, ret_place) = match create_ecx(tcx, main_id, config) {
         Ok(v) => v,
@@ -210,6 +211,7 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) ->
     let res: InterpResult<'_, i64> = (|| {
         // Main loop.
         loop {
+            let info = ecx.preprocess_diagnostics();
             match ecx.schedule()? {
                 SchedulingAction::ExecuteStep => {
                     assert!(ecx.step()?, "a terminated thread was scheduled for execution");
@@ -230,9 +232,9 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) ->
                     break;
                 }
             }
-            ecx.process_diagnostics();
+            ecx.process_diagnostics(info);
         }
-        let return_code = ecx.read_scalar(ret_place.into())?.not_undef()?.to_machine_isize(&ecx)?;
+        let return_code = ecx.read_scalar(ret_place.into())?.check_init()?.to_machine_isize(&ecx)?;
         Ok(return_code)
     })();
 
@@ -243,7 +245,8 @@ pub fn eval_main<'tcx>(tcx: TyCtxt<'tcx>, main_id: DefId, config: MiriConfig) ->
     match res {
         Ok(return_code) => {
             if !ignore_leaks {
-                let leaks = ecx.memory.leak_report();
+                info!("Additonal static roots: {:?}", ecx.machine.static_roots);
+                let leaks = ecx.memory.leak_report(&ecx.machine.static_roots);
                 if leaks != 0 {
                     tcx.sess.err("the evaluated program leaked memory");
                     // Ignore the provided return code - let the reported error