Skip to content

Commit 3f646f5

Browse files
committed
Remove dependency injection for the panic runtime
This used to be necessary for a correct linker order, but ever since the introduction of symbols.o adding the symbols in question to symbols.o would work just as well. We do still add dependencies on the panic runtime to the local crate, but not for #![needs_panic_runtime] crates. This also removes the runtime-depends-on-needs-runtime test. inject_dependency_if used to emit this error, but with symbols.o it is no longer important that there is no dependency and in fact it may be nice to have panic_abort and panic_unwind directly depend on libstd in the future for calling std::process::abort().
1 parent 7177afd commit 3f646f5

File tree

5 files changed

+3
-96
lines changed

5 files changed

+3
-96
lines changed

compiler/rustc_metadata/src/creader.rs

+3-69
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Validates all used crates and extern libraries and loads their metadata
22
33
use std::error::Error;
4-
use std::ops::Fn;
54
use std::path::Path;
65
use std::str::FromStr;
76
use std::time::Duration;
@@ -275,12 +274,6 @@ impl CStore {
275274
.filter_map(|(cnum, data)| data.as_deref().map(|data| (cnum, data)))
276275
}
277276

278-
fn iter_crate_data_mut(&mut self) -> impl Iterator<Item = (CrateNum, &mut CrateMetadata)> {
279-
self.metas
280-
.iter_enumerated_mut()
281-
.filter_map(|(cnum, data)| data.as_deref_mut().map(|data| (cnum, data)))
282-
}
283-
284277
fn push_dependencies_in_postorder(&self, deps: &mut Vec<CrateNum>, cnum: CrateNum) {
285278
if !deps.contains(&cnum) {
286279
let data = self.get_crate_data(cnum);
@@ -306,12 +299,6 @@ impl CStore {
306299
deps
307300
}
308301

309-
fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
310-
let mut deps = self.crate_dependencies_in_postorder(cnum);
311-
deps.reverse();
312-
deps
313-
}
314-
315302
pub(crate) fn injected_panic_runtime(&self) -> Option<CrateNum> {
316303
self.injected_panic_runtime
317304
}
@@ -943,27 +930,16 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
943930
// If we need a panic runtime, we try to find an existing one here. At
944931
// the same time we perform some general validation of the DAG we've got
945932
// going such as ensuring everything has a compatible panic strategy.
946-
//
947-
// The logic for finding the panic runtime here is pretty much the same
948-
// as the allocator case with the only addition that the panic strategy
949-
// compilation mode also comes into play.
950933
let desired_strategy = self.sess.panic_strategy();
951934
let mut runtime_found = false;
952935
let mut needs_panic_runtime = attr::contains_name(&krate.attrs, sym::needs_panic_runtime);
953936

954-
let mut panic_runtimes = Vec::new();
955-
for (cnum, data) in self.cstore.iter_crate_data() {
937+
for (_cnum, data) in self.cstore.iter_crate_data() {
956938
needs_panic_runtime = needs_panic_runtime || data.needs_panic_runtime();
957939
if data.is_panic_runtime() {
958-
// Inject a dependency from all #![needs_panic_runtime] to this
959-
// #![panic_runtime] crate.
960-
panic_runtimes.push(cnum);
961940
runtime_found = runtime_found || data.dep_kind() == CrateDepKind::Explicit;
962941
}
963942
}
964-
for cnum in panic_runtimes {
965-
self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime());
966-
}
967943

968944
// If an explicitly linked and matching panic runtime was found, or if
969945
// we just don't need one at all, then we're done here and there's
@@ -974,12 +950,10 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
974950

975951
// By this point we know that we (a) need a panic runtime and (b) no
976952
// panic runtime was explicitly linked. Here we just load an appropriate
977-
// default runtime for our panic strategy and then inject the
978-
// dependencies.
953+
// default runtime for our panic strategy.
979954
//
980955
// We may resolve to an already loaded crate (as the crate may not have
981-
// been explicitly linked prior to this) and we may re-inject
982-
// dependencies again, but both of those situations are fine.
956+
// been explicitly linked prior to this), but this is fine.
983957
//
984958
// Also note that we have yet to perform validation of the crate graph
985959
// in terms of everyone has a compatible panic runtime format, that's
@@ -1008,7 +982,6 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1008982
}
1009983

1010984
self.cstore.injected_panic_runtime = Some(cnum);
1011-
self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime());
1012985
}
1013986

1014987
fn inject_profiler_runtime(&mut self) {
@@ -1189,45 +1162,6 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11891162
}
11901163
}
11911164

1192-
fn inject_dependency_if(
1193-
&mut self,
1194-
krate: CrateNum,
1195-
what: &str,
1196-
needs_dep: &dyn Fn(&CrateMetadata) -> bool,
1197-
) {
1198-
// Don't perform this validation if the session has errors, as one of
1199-
// those errors may indicate a circular dependency which could cause
1200-
// this to stack overflow.
1201-
if self.dcx().has_errors().is_some() {
1202-
return;
1203-
}
1204-
1205-
// Before we inject any dependencies, make sure we don't inject a
1206-
// circular dependency by validating that this crate doesn't
1207-
// transitively depend on any crates satisfying `needs_dep`.
1208-
for dep in self.cstore.crate_dependencies_in_reverse_postorder(krate) {
1209-
let data = self.cstore.get_crate_data(dep);
1210-
if needs_dep(&data) {
1211-
self.dcx().emit_err(errors::NoTransitiveNeedsDep {
1212-
crate_name: self.cstore.get_crate_data(krate).name(),
1213-
needs_crate_name: what,
1214-
deps_crate_name: data.name(),
1215-
});
1216-
}
1217-
}
1218-
1219-
// All crates satisfying `needs_dep` do not explicitly depend on the
1220-
// crate provided for this compile, but in order for this compilation to
1221-
// be successfully linked we need to inject a dependency (to order the
1222-
// crates on the command line correctly).
1223-
for (cnum, data) in self.cstore.iter_crate_data_mut() {
1224-
if needs_dep(data) {
1225-
info!("injecting a dep from {} to {}", cnum, krate);
1226-
data.add_dependency(krate);
1227-
}
1228-
}
1229-
}
1230-
12311165
fn report_unused_deps(&mut self, krate: &ast::Crate) {
12321166
// Make a point span rather than covering the whole file
12331167
let span = krate.spans.inner_span.shrink_to_lo();

compiler/rustc_metadata/src/rmeta/decoder.rs

-4
Original file line numberDiff line numberDiff line change
@@ -1895,10 +1895,6 @@ impl CrateMetadata {
18951895
self.dependencies.iter().copied()
18961896
}
18971897

1898-
pub(crate) fn add_dependency(&mut self, cnum: CrateNum) {
1899-
self.dependencies.push(cnum);
1900-
}
1901-
19021898
pub(crate) fn target_modifiers(&self) -> TargetModifiers {
19031899
self.root.decode_target_modifiers(&self.blob).collect()
19041900
}

tests/ui/panic-runtime/auxiliary/depends.rs

-8
This file was deleted.

tests/ui/panic-runtime/auxiliary/needs-panic-runtime.rs

-6
This file was deleted.

tests/ui/panic-runtime/runtime-depend-on-needs-runtime.rs

-9
This file was deleted.

0 commit comments

Comments
 (0)