Skip to content

Commit 51d9a6c

Browse files
committed
Track where crate dependencies come from in creader
Introduce an enum that represents the different possible sources for dependencies, and use them where possible. This will enable more fine grained control and provides better context than passing the `dep_root` tuple. Use this to ensure that injected crates always show up as private by default.
1 parent 4e1356b commit 51d9a6c

File tree

1 file changed

+73
-20
lines changed

1 file changed

+73
-20
lines changed

Diff for: compiler/rustc_metadata/src/creader.rs

+73-20
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,39 @@ impl<'a> std::fmt::Debug for CrateDump<'a> {
162162
}
163163
}
164164

165+
/// Reason that a crate is being sourced as a dependency.
166+
#[derive(Clone, Copy)]
167+
enum CrateOrigin<'a> {
168+
/// This crate was a dependency of another crate.
169+
IndirectDependency {
170+
dep_root: &'a CratePaths,
171+
/// Dependency info about this crate.
172+
dep: &'a CrateDep,
173+
},
174+
/// Injected by `rustc`.
175+
Injected,
176+
/// Provided by `extern crate foo` or as part of the extern prelude.
177+
Extern,
178+
}
179+
180+
impl<'a> CrateOrigin<'a> {
181+
/// Return the dependency root, if any.
182+
fn dep_root(&self) -> Option<&'a CratePaths> {
183+
match self {
184+
CrateOrigin::IndirectDependency { dep_root, .. } => Some(dep_root),
185+
_ => None,
186+
}
187+
}
188+
189+
/// Return dependency information, if any.
190+
fn dep(&self) -> Option<&'a CrateDep> {
191+
match self {
192+
CrateOrigin::IndirectDependency { dep, .. } => Some(dep),
193+
_ => None,
194+
}
195+
}
196+
}
197+
165198
impl CStore {
166199
pub fn from_tcx(tcx: TyCtxt<'_>) -> FreezeReadGuard<'_, CStore> {
167200
FreezeReadGuard::map(tcx.untracked().cstore.read(), |cstore| {
@@ -497,20 +530,24 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
497530
&self,
498531
name: Symbol,
499532
private_dep: Option<bool>,
500-
dep_root: Option<&CratePaths>,
533+
origin: CrateOrigin<'_>,
501534
) -> bool {
502535
// Standard library crates are never private.
503536
if STDLIB_STABLE_CRATES.contains(&name) {
504537
tracing::info!("returning false for {name} is private");
505538
return false;
506539
}
507540

541+
if matches!(origin, CrateOrigin::Injected) {
542+
return true;
543+
}
544+
508545
let extern_private = self.sess.opts.externs.get(name.as_str()).map(|e| e.is_private_dep);
509546

510547
// Any descendants of `std` should be private. These crates are usually not marked
511548
// private in metadata, so we ignore that field.
512549
if extern_private.is_none()
513-
&& let Some(dep) = dep_root
550+
&& let Some(dep) = origin.dep_root()
514551
&& STDLIB_STABLE_CRATES.contains(&dep.name)
515552
{
516553
return true;
@@ -528,7 +565,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
528565
fn register_crate(
529566
&mut self,
530567
host_lib: Option<Library>,
531-
dep_root: Option<&CratePaths>,
568+
origin: CrateOrigin<'_>,
532569
lib: Library,
533570
dep_kind: CrateDepKind,
534571
name: Symbol,
@@ -540,7 +577,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
540577
let Library { source, metadata } = lib;
541578
let crate_root = metadata.get_root();
542579
let host_hash = host_lib.as_ref().map(|lib| lib.metadata.get_root().hash());
543-
let private_dep = self.is_private_dep(name, private_dep, dep_root);
580+
let private_dep = self.is_private_dep(name, private_dep, origin);
544581

545582
// Claim this crate number and cache it
546583
let feed = self.cstore.intern_stable_crate_id(&crate_root, self.tcx)?;
@@ -556,7 +593,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
556593
// Maintain a reference to the top most crate.
557594
// Stash paths for top-most crate locally if necessary.
558595
let crate_paths;
559-
let dep_root = if let Some(dep_root) = dep_root {
596+
let dep_root = if let Some(dep_root) = origin.dep_root() {
560597
dep_root
561598
} else {
562599
crate_paths = CratePaths::new(crate_root.name(), source.clone());
@@ -664,17 +701,19 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
664701
name: Symbol,
665702
span: Span,
666703
dep_kind: CrateDepKind,
704+
origin: CrateOrigin<'_>,
667705
) -> Option<CrateNum> {
668706
self.used_extern_options.insert(name);
669-
match self.maybe_resolve_crate(name, dep_kind, None) {
707+
match self.maybe_resolve_crate(name, dep_kind, origin) {
670708
Ok(cnum) => {
671709
self.cstore.set_used_recursively(cnum);
672710
Some(cnum)
673711
}
674712
Err(err) => {
675713
debug!("failed to resolve crate {} {:?}", name, dep_kind);
676-
let missing_core =
677-
self.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, None).is_err();
714+
let missing_core = self
715+
.maybe_resolve_crate(sym::core, CrateDepKind::Explicit, CrateOrigin::Extern)
716+
.is_err();
678717
err.report(self.sess, span, missing_core);
679718
None
680719
}
@@ -685,15 +724,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
685724
&'b mut self,
686725
name: Symbol,
687726
mut dep_kind: CrateDepKind,
688-
dep_of: Option<(&'b CratePaths, &'b CrateDep)>,
727+
origin: CrateOrigin<'b>,
689728
) -> Result<CrateNum, CrateError> {
690729
info!("resolving crate `{}`", name);
691730
if !name.as_str().is_ascii() {
692731
return Err(CrateError::NonAsciiName(name));
693732
}
694733

695-
let dep_root = dep_of.map(|d| d.0);
696-
let dep = dep_of.map(|d| d.1);
734+
let dep_root = origin.dep_root();
735+
let dep = origin.dep();
697736
let hash = dep.map(|d| d.hash);
698737
let host_hash = dep.map(|d| d.host_hash).flatten();
699738
let extra_filename = dep.map(|d| &d.extra_filename[..]);
@@ -736,7 +775,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
736775
// not specified by `--extern` on command line parameters, it may be
737776
// `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
738777
// `public-dependency` here.
739-
let private_dep = self.is_private_dep(name, private_dep, dep_root);
778+
let private_dep = self.is_private_dep(name, private_dep, origin);
740779
let data = self.cstore.get_crate_data_mut(cnum);
741780
if data.is_proc_macro_crate() {
742781
dep_kind = CrateDepKind::MacrosOnly;
@@ -747,7 +786,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
747786
}
748787
(LoadResult::Loaded(library), host_library) => {
749788
info!("register newly loaded library for `{}`", name);
750-
self.register_crate(host_library, dep_root, library, dep_kind, name, private_dep)
789+
self.register_crate(host_library, origin, library, dep_kind, name, private_dep)
751790
}
752791
_ => panic!(),
753792
}
@@ -823,7 +862,11 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
823862
CrateDepKind::MacrosOnly => CrateDepKind::MacrosOnly,
824863
_ => dep.kind,
825864
};
826-
let cnum = self.maybe_resolve_crate(dep.name, dep_kind, Some((dep_root, &dep)))?;
865+
let cnum = self.maybe_resolve_crate(
866+
dep.name,
867+
dep_kind,
868+
CrateOrigin::IndirectDependency { dep_root, dep: &dep },
869+
)?;
827870
crate_num_map.push(cnum);
828871
}
829872

@@ -917,7 +960,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
917960
};
918961
info!("panic runtime not found -- loading {}", name);
919962

920-
let Some(cnum) = self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit) else {
963+
let Some(cnum) =
964+
self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit, CrateOrigin::Injected)
965+
else {
921966
return;
922967
};
923968
let data = self.cstore.get_crate_data(cnum);
@@ -946,7 +991,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
946991
info!("loading profiler");
947992

948993
let name = Symbol::intern(&self.sess.opts.unstable_opts.profiler_runtime);
949-
let Some(cnum) = self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit) else {
994+
let Some(cnum) =
995+
self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit, CrateOrigin::Injected)
996+
else {
950997
return;
951998
};
952999
let data = self.cstore.get_crate_data(cnum);
@@ -1059,7 +1106,12 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
10591106
if entry.force {
10601107
let name_interned = Symbol::intern(name);
10611108
if !self.used_extern_options.contains(&name_interned) {
1062-
self.resolve_crate(name_interned, DUMMY_SP, CrateDepKind::Explicit);
1109+
self.resolve_crate(
1110+
name_interned,
1111+
DUMMY_SP,
1112+
CrateDepKind::Explicit,
1113+
CrateOrigin::Extern,
1114+
);
10631115
}
10641116
}
10651117
}
@@ -1185,6 +1237,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11851237
info!("{:?}", CrateDump(self.cstore));
11861238
}
11871239

1240+
/// Process an `extern crate foo` AST node.
11881241
pub fn process_extern_crate(
11891242
&mut self,
11901243
item: &ast::Item,
@@ -1210,7 +1263,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12101263
CrateDepKind::Explicit
12111264
};
12121265

1213-
let cnum = self.resolve_crate(name, item.span, dep_kind)?;
1266+
let cnum = self.resolve_crate(name, item.span, dep_kind, CrateOrigin::Extern)?;
12141267

12151268
let path_len = definitions.def_path(def_id).data.len();
12161269
self.cstore.update_extern_crate(
@@ -1229,7 +1282,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12291282
}
12301283

12311284
pub fn process_path_extern(&mut self, name: Symbol, span: Span) -> Option<CrateNum> {
1232-
let cnum = self.resolve_crate(name, span, CrateDepKind::Explicit)?;
1285+
let cnum = self.resolve_crate(name, span, CrateDepKind::Explicit, CrateOrigin::Extern)?;
12331286

12341287
self.cstore.update_extern_crate(
12351288
cnum,
@@ -1246,7 +1299,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12461299
}
12471300

12481301
pub fn maybe_process_path_extern(&mut self, name: Symbol) -> Option<CrateNum> {
1249-
self.maybe_resolve_crate(name, CrateDepKind::Explicit, None).ok()
1302+
self.maybe_resolve_crate(name, CrateDepKind::Explicit, CrateOrigin::Extern).ok()
12501303
}
12511304
}
12521305

0 commit comments

Comments
 (0)