X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_codegen_ssa%2Fback%2Fwrite.rs;h=841827d15fef41c52d37affe57374f3055a447d1;hb=0c366cdeaf6cfc2780bae118268eec5c675d6c43;hp=4d09e23ee7f7a498e51c06240e6f4c6b02c49d4d;hpb=4eee796679bd13e0935c16f41a5e6e2ab0d5c018;p=rust.git diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs index 4d09e23ee7f..841827d15fe 100644 --- a/src/librustc_codegen_ssa/back/write.rs +++ b/src/librustc_codegen_ssa/back/write.rs @@ -2,7 +2,8 @@ use super::link::{self, get_linker, remove}; use super::linker::LinkerInfo; use super::lto::{self, SerializedModule}; -use super::symbol_export::ExportedSymbols; +use super::symbol_export::symbol_name_for_instance_in_crate; + use crate::{ CachedModuleCodegen, CodegenResults, CompiledModule, CrateInfo, ModuleCodegen, ModuleKind, RLIB_BYTECODE_EXTENSION, @@ -12,6 +13,7 @@ use jobserver::{Acquired, Client}; use rustc::dep_graph::{WorkProduct, WorkProductFileKind, WorkProductId}; use rustc::middle::cstore::EncodedMetadata; +use rustc::middle::exported_symbols::SymbolExportLevel; use rustc::session::config::{ self, Lto, OutputFilenames, OutputType, Passes, Sanitizer, SwitchWithOptPath, }; @@ -205,6 +207,8 @@ fn clone(&self) -> Self { } } +pub type ExportedSymbols = FxHashMap>>; + /// Additional resources used by optimize_and_codegen (not module specific) #[derive(Clone)] pub struct CodegenContext { @@ -902,7 +906,7 @@ pub enum Message { worker_id: usize, }, Done { - result: Result, + result: Result>, worker_id: usize, }, CodegenDone { @@ -956,7 +960,7 @@ fn start_executing_work( let symbols = tcx .exported_symbols(cnum) .iter() - .map(|&(s, lvl)| (s.symbol_name(tcx).to_string(), lvl)) + .map(|&(s, lvl)| (symbol_name_for_instance_in_crate(tcx, s, cnum), lvl)) .collect(); Arc::new(symbols) }; @@ -1474,9 +1478,12 @@ fn start_executing_work( main_thread_worker_state = MainThreadWorkerState::Idle; } // If the thread failed that means it panicked, so we abort immediately. - Message::Done { result: Err(()), worker_id: _ } => { + Message::Done { result: Err(None), worker_id: _ } => { bug!("worker thread panicked"); } + Message::Done { result: Err(Some(WorkerFatalError)), worker_id: _ } => { + return Err(()); + } Message::CodegenItem => bug!("the coordinator should not receive codegen requests"), } } @@ -1520,29 +1527,36 @@ fn maybe_start_llvm_timer<'a>( pub const CODEGEN_WORKER_ID: usize = ::std::usize::MAX; +/// `FatalError` is explicitly not `Send`. +#[must_use] +pub struct WorkerFatalError; + fn spawn_work(cgcx: CodegenContext, work: WorkItem) { thread::spawn(move || { // Set up a destructor which will fire off a message that we're done as // we exit. struct Bomb { coordinator_send: Sender>, - result: Option>, + result: Option, FatalError>>, worker_id: usize, } impl Drop for Bomb { fn drop(&mut self) { let worker_id = self.worker_id; let msg = match self.result.take() { - Some(WorkItemResult::Compiled(m)) => { + Some(Ok(WorkItemResult::Compiled(m))) => { Message::Done:: { result: Ok(m), worker_id } } - Some(WorkItemResult::NeedsFatLTO(m)) => { + Some(Ok(WorkItemResult::NeedsFatLTO(m))) => { Message::NeedsFatLTO:: { result: m, worker_id } } - Some(WorkItemResult::NeedsThinLTO(name, thin_buffer)) => { + Some(Ok(WorkItemResult::NeedsThinLTO(name, thin_buffer))) => { Message::NeedsThinLTO:: { name, thin_buffer, worker_id } } - None => Message::Done:: { result: Err(()), worker_id }, + Some(Err(FatalError)) => { + Message::Done:: { result: Err(Some(WorkerFatalError)), worker_id } + } + None => Message::Done:: { result: Err(None), worker_id }, }; drop(self.coordinator_send.send(Box::new(msg))); } @@ -1562,7 +1576,7 @@ fn drop(&mut self) { // surface that there was an error in this worker. bomb.result = { let _prof_timer = cgcx.prof.generic_activity(work.profiling_event_id()); - execute_work_item(&cgcx, work).ok() + Some(execute_work_item(&cgcx, work)) }; }); }