From 911d95bfe3076f2ed61798a1cf7373db9852c64f Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers <aidanhs@cantab.net> Date: Sun, 8 Oct 2017 21:57:03 +0100 Subject: [PATCH] Don't panic in the coordinator thread, bubble up the failure Fixes #43402 (take 2) --- src/librustc_trans/back/write.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index 1988b9f76e4..de07ee8b36f 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -1192,7 +1192,7 @@ fn start_executing_work(tcx: TyCtxt, modules_config: Arc<ModuleConfig>, metadata_config: Arc<ModuleConfig>, allocator_config: Arc<ModuleConfig>) - -> thread::JoinHandle<CompiledModules> { + -> thread::JoinHandle<Result<CompiledModules, ()>> { let coordinator_send = tcx.tx_to_llvm_workers.clone(); let mut exported_symbols = FxHashMap(); exported_symbols.insert(LOCAL_CRATE, tcx.exported_symbols(LOCAL_CRATE)); @@ -1638,7 +1638,7 @@ fn start_executing_work(tcx: TyCtxt, Message::Done { result: Err(()), worker_id: _ } => { shared_emitter.fatal("aborting due to worker thread failure"); // Exit the coordinator thread - panic!("aborting due to worker thread failure") + return Err(()) } Message::TranslateItem => { bug!("the coordinator should not receive translation requests") @@ -1664,11 +1664,11 @@ fn start_executing_work(tcx: TyCtxt, let compiled_metadata_module = compiled_metadata_module .expect("Metadata module not compiled?"); - CompiledModules { + Ok(CompiledModules { modules: compiled_modules, metadata_module: compiled_metadata_module, allocator_module: compiled_allocator_module, - } + }) }); // A heuristic that determines if we have enough LLVM WorkItems in the @@ -1960,7 +1960,7 @@ pub struct OngoingCrateTranslation { coordinator_send: Sender<Box<Any + Send>>, trans_worker_receive: Receiver<Message>, shared_emitter_main: SharedEmitterMain, - future: thread::JoinHandle<CompiledModules>, + future: thread::JoinHandle<Result<CompiledModules, ()>>, output_filenames: Arc<OutputFilenames>, } @@ -1968,7 +1968,11 @@ impl OngoingCrateTranslation { pub fn join(self, sess: &Session, dep_graph: &DepGraph) -> CrateTranslation { self.shared_emitter_main.check(sess, true); let compiled_modules = match self.future.join() { - Ok(compiled_modules) => compiled_modules, + Ok(Ok(compiled_modules)) => compiled_modules, + Ok(Err(())) => { + sess.abort_if_errors(); + panic!("expected abort due to worker thread errors") + }, Err(_) => { sess.fatal("Error during translation/LLVM phase."); }