From e36020cdb33a1c56ec4ff8c9fbb0bf331ade428a Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 1 May 2023 11:51:00 -0700 Subject: rustc_metadata: inherit dependency privacy flag --- compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'compiler/rustc_metadata/src/rmeta/decoder') diff --git a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs index 7425963d30f..9bc25e3e0b7 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs @@ -285,7 +285,10 @@ provide! { tcx, def_id, other, cdata, is_ctfe_mir_available => { cdata.is_ctfe_mir_available(def_id.index) } dylib_dependency_formats => { cdata.get_dylib_dependency_formats(tcx) } - is_private_dep => { cdata.private_dep } + is_private_dep => { + let r = *cdata.private_dep.lock(); + r + } is_panic_runtime => { cdata.root.panic_runtime } is_compiler_builtins => { cdata.root.compiler_builtins } has_global_allocator => { cdata.root.has_global_allocator } -- cgit 1.4.1-3-g733a5 From 5a7fffee7150639ba1c68fe41c9365227929f299 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 8 May 2023 14:12:54 -0700 Subject: rustc_metadata: use AtomicBool for privateness instead of Lock --- compiler/rustc_metadata/src/rmeta/decoder.rs | 12 ++++++++---- compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs | 7 +++++-- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'compiler/rustc_metadata/src/rmeta/decoder') diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index ccba77d7aa7..ae8423af112 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -40,6 +40,7 @@ use proc_macro::bridge::client::ProcMacro; use std::iter::TrustedLen; use std::num::NonZeroUsize; use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; use std::{io, iter, mem}; pub(super) use cstore_impl::provide; @@ -114,7 +115,7 @@ pub(crate) struct CrateMetadata { /// Whether or not this crate should be consider a private dependency. /// Used by the 'exported_private_dependencies' lint, and for determining /// whether to emit suggestions that reference this crate. - private_dep: Lock, + private_dep: AtomicBool, /// The hash for the host proc macro. Used to support `-Z dual-proc-macro`. host_hash: Option, @@ -1619,7 +1620,7 @@ impl CrateMetadata { dependencies, dep_kind: Lock::new(dep_kind), source: Lrc::new(source), - private_dep: Lock::new(private_dep), + private_dep: AtomicBool::new(private_dep), host_hash, extern_crate: Lock::new(None), hygiene_context: Default::default(), @@ -1667,8 +1668,11 @@ impl CrateMetadata { self.dep_kind.with_lock(|dep_kind| *dep_kind = f(*dep_kind)) } - pub(crate) fn update_private_dep(&self, f: impl FnOnce(bool) -> bool) { - self.private_dep.with_lock(|private_dep| *private_dep = f(*private_dep)) + /// `f` must not perform any I/O or take any locks. It may be called more than once. + pub(crate) fn update_private_dep(&self, mut f: impl FnMut(bool) -> bool) { + self.private_dep + .fetch_update(Ordering::Release, Ordering::Acquire, |private_dep| Some(f(private_dep))) + .expect("fetch_update only returns Err if `f` returns None`, which it doesn't"); } pub(crate) fn required_panic_strategy(&self) -> Option { diff --git a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs index 9bc25e3e0b7..24fbc2f64b7 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs @@ -286,8 +286,11 @@ provide! { tcx, def_id, other, cdata, dylib_dependency_formats => { cdata.get_dylib_dependency_formats(tcx) } is_private_dep => { - let r = *cdata.private_dep.lock(); - r + // Parallel compiler needs to synchronize type checking and linting (which use this flag) + // so that they happen strictly crate loading. Otherwise, the full list of available + // impls aren't loaded yet. + use std::sync::atomic::Ordering; + cdata.private_dep.load(Ordering::Acquire) } is_panic_runtime => { cdata.root.panic_runtime } is_compiler_builtins => { cdata.root.compiler_builtins } -- cgit 1.4.1-3-g733a5