Skip to content

Commit b7357de

Browse files
authored
Merge 0dfacc7 into 3d86494
2 parents 3d86494 + 0dfacc7 commit b7357de

File tree

14 files changed

+44
-142
lines changed

14 files changed

+44
-142
lines changed

compiler/rustc_codegen_ssa/src/back/linker.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ pub(crate) fn linked_symbols(
18291829
for_each_exported_symbols_include_dep(tcx, crate_type, |symbol, info, cnum| {
18301830
if info.level.is_below_threshold(export_threshold) && !tcx.is_compiler_builtins(cnum)
18311831
|| info.used
1832+
|| info.rustc_std_internal_symbol
18321833
{
18331834
symbols.push((
18341835
symbol_export::linking_symbol_name_for_instance_in_crate(tcx, symbol, cnum),

compiler/rustc_codegen_ssa/src/back/symbol_export.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, _: LocalCrate) -> DefIdMap<S
131131
used: codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_COMPILER)
132132
|| codegen_attrs.flags.contains(CodegenFnAttrFlags::USED_LINKER)
133133
|| used,
134+
rustc_std_internal_symbol: codegen_attrs
135+
.flags
136+
.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL),
134137
};
135138
(def_id.to_def_id(), info)
136139
})
@@ -143,6 +146,7 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, _: LocalCrate) -> DefIdMap<S
143146
level: SymbolExportLevel::C,
144147
kind: SymbolExportKind::Data,
145148
used: false,
149+
rustc_std_internal_symbol: false,
146150
},
147151
);
148152
}
@@ -191,6 +195,7 @@ fn exported_symbols_provider_local<'tcx>(
191195
level: info.level,
192196
kind: SymbolExportKind::Text,
193197
used: info.used,
198+
rustc_std_internal_symbol: info.rustc_std_internal_symbol,
194199
},
195200
)
196201
})
@@ -207,6 +212,7 @@ fn exported_symbols_provider_local<'tcx>(
207212
level: SymbolExportLevel::C,
208213
kind: SymbolExportKind::Text,
209214
used: false,
215+
rustc_std_internal_symbol: false,
210216
},
211217
));
212218
}
@@ -229,6 +235,7 @@ fn exported_symbols_provider_local<'tcx>(
229235
level: SymbolExportLevel::Rust,
230236
kind: SymbolExportKind::Text,
231237
used: false,
238+
rustc_std_internal_symbol: true,
232239
},
233240
));
234241
}
@@ -243,6 +250,7 @@ fn exported_symbols_provider_local<'tcx>(
243250
level: SymbolExportLevel::Rust,
244251
kind: SymbolExportKind::Data,
245252
used: false,
253+
rustc_std_internal_symbol: true,
246254
},
247255
))
248256
}
@@ -262,6 +270,7 @@ fn exported_symbols_provider_local<'tcx>(
262270
level: SymbolExportLevel::C,
263271
kind: SymbolExportKind::Data,
264272
used: false,
273+
rustc_std_internal_symbol: false,
265274
},
266275
)
267276
}));
@@ -287,6 +296,7 @@ fn exported_symbols_provider_local<'tcx>(
287296
level: SymbolExportLevel::C,
288297
kind: SymbolExportKind::Data,
289298
used: false,
299+
rustc_std_internal_symbol: false,
290300
},
291301
)
292302
}));
@@ -304,6 +314,7 @@ fn exported_symbols_provider_local<'tcx>(
304314
level: SymbolExportLevel::C,
305315
kind: SymbolExportKind::Data,
306316
used: true,
317+
rustc_std_internal_symbol: false,
307318
},
308319
));
309320
}
@@ -379,6 +390,8 @@ fn exported_symbols_provider_local<'tcx>(
379390
}
380391
}
381392

393+
// Note: These all set rustc_std_internal_symbol to false as generic functions must not
394+
// be marked with this attribute and we are only handling generic functions here.
382395
match *mono_item {
383396
MonoItem::Fn(Instance { def: InstanceKind::Item(def), args }) => {
384397
let has_generics = args.non_erasable_generics().next().is_some();
@@ -394,6 +407,7 @@ fn exported_symbols_provider_local<'tcx>(
394407
level: SymbolExportLevel::Rust,
395408
kind: SymbolExportKind::Text,
396409
used: false,
410+
rustc_std_internal_symbol: false,
397411
},
398412
));
399413
}
@@ -416,6 +430,7 @@ fn exported_symbols_provider_local<'tcx>(
416430
level: SymbolExportLevel::Rust,
417431
kind: SymbolExportKind::Text,
418432
used: false,
433+
rustc_std_internal_symbol: false,
419434
},
420435
));
421436
}
@@ -432,6 +447,7 @@ fn exported_symbols_provider_local<'tcx>(
432447
level: SymbolExportLevel::Rust,
433448
kind: SymbolExportKind::Text,
434449
used: false,
450+
rustc_std_internal_symbol: false,
435451
},
436452
));
437453
}
@@ -442,6 +458,7 @@ fn exported_symbols_provider_local<'tcx>(
442458
level: SymbolExportLevel::Rust,
443459
kind: SymbolExportKind::Text,
444460
used: false,
461+
rustc_std_internal_symbol: false,
445462
},
446463
));
447464
}

compiler/rustc_codegen_ssa/src/base.rs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::time::{Duration, Instant};
66
use itertools::Itertools;
77
use rustc_abi::FIRST_VARIANT;
88
use rustc_ast as ast;
9-
use rustc_ast::expand::allocator::{ALLOCATOR_METHODS, AllocatorKind, global_fn_name};
9+
use rustc_ast::expand::allocator::AllocatorKind;
1010
use rustc_attr_data_structures::OptimizeAttr;
1111
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
1212
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
@@ -1074,26 +1074,6 @@ impl CrateInfo {
10741074
.collect::<Vec<_>>();
10751075
symbols.sort_unstable_by(|a, b| a.0.cmp(&b.0));
10761076
linked_symbols.extend(symbols);
1077-
if tcx.allocator_kind(()).is_some() {
1078-
// At least one crate needs a global allocator. This crate may be placed
1079-
// after the crate that defines it in the linker order, in which case some
1080-
// linkers return an error. By adding the global allocator shim methods to
1081-
// the linked_symbols list, linking the generated symbols.o will ensure that
1082-
// circular dependencies involving the global allocator don't lead to linker
1083-
// errors.
1084-
linked_symbols.extend(ALLOCATOR_METHODS.iter().map(|method| {
1085-
(
1086-
format!(
1087-
"{prefix}{}",
1088-
mangle_internal_symbol(
1089-
tcx,
1090-
global_fn_name(method.name).as_str()
1091-
)
1092-
),
1093-
SymbolExportKind::Text,
1094-
)
1095-
}));
1096-
}
10971077
});
10981078
}
10991079

compiler/rustc_metadata/src/creader.rs

Lines changed: 9 additions & 82 deletions
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
}
@@ -964,47 +951,27 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
964951
// If we need a panic runtime, we try to find an existing one here. At
965952
// the same time we perform some general validation of the DAG we've got
966953
// going such as ensuring everything has a compatible panic strategy.
967-
//
968-
// The logic for finding the panic runtime here is pretty much the same
969-
// as the allocator case with the only addition that the panic strategy
970-
// compilation mode also comes into play.
971-
let desired_strategy = self.sess.panic_strategy();
972-
let mut runtime_found = false;
973954
let mut needs_panic_runtime = attr::contains_name(&krate.attrs, sym::needs_panic_runtime);
974-
975-
let mut panic_runtimes = Vec::new();
976-
for (cnum, data) in self.cstore.iter_crate_data() {
977-
needs_panic_runtime = needs_panic_runtime || data.needs_panic_runtime();
978-
if data.is_panic_runtime() {
979-
// Inject a dependency from all #![needs_panic_runtime] to this
980-
// #![panic_runtime] crate.
981-
panic_runtimes.push(cnum);
982-
runtime_found = runtime_found || data.dep_kind() == CrateDepKind::Explicit;
983-
}
984-
}
985-
for cnum in panic_runtimes {
986-
self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime());
955+
for (_cnum, data) in self.cstore.iter_crate_data() {
956+
needs_panic_runtime |= data.needs_panic_runtime();
987957
}
988958

989-
// If an explicitly linked and matching panic runtime was found, or if
990-
// we just don't need one at all, then we're done here and there's
991-
// nothing else to do.
992-
if !needs_panic_runtime || runtime_found {
959+
// If we just don't need a panic runtime at all, then we're done here
960+
// and there's nothing else to do.
961+
if !needs_panic_runtime {
993962
return;
994963
}
995964

996-
// By this point we know that we (a) need a panic runtime and (b) no
997-
// panic runtime was explicitly linked. Here we just load an appropriate
998-
// default runtime for our panic strategy and then inject the
999-
// dependencies.
965+
// By this point we know that we need a panic runtime. Here we just load
966+
// an appropriate default runtime for our panic strategy.
1000967
//
1001968
// We may resolve to an already loaded crate (as the crate may not have
1002-
// been explicitly linked prior to this) and we may re-inject
1003-
// dependencies again, but both of those situations are fine.
969+
// been explicitly linked prior to this), but this is fine.
1004970
//
1005971
// Also note that we have yet to perform validation of the crate graph
1006972
// in terms of everyone has a compatible panic runtime format, that's
1007973
// performed later as part of the `dependency_format` module.
974+
let desired_strategy = self.sess.panic_strategy();
1008975
let name = match desired_strategy {
1009976
PanicStrategy::Unwind => sym::panic_unwind,
1010977
PanicStrategy::Abort => sym::panic_abort,
@@ -1029,7 +996,6 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1029996
}
1030997

1031998
self.cstore.injected_panic_runtime = Some(cnum);
1032-
self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime());
1033999
}
10341000

10351001
fn inject_profiler_runtime(&mut self) {
@@ -1210,45 +1176,6 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
12101176
}
12111177
}
12121178

1213-
fn inject_dependency_if(
1214-
&mut self,
1215-
krate: CrateNum,
1216-
what: &str,
1217-
needs_dep: &dyn Fn(&CrateMetadata) -> bool,
1218-
) {
1219-
// Don't perform this validation if the session has errors, as one of
1220-
// those errors may indicate a circular dependency which could cause
1221-
// this to stack overflow.
1222-
if self.dcx().has_errors().is_some() {
1223-
return;
1224-
}
1225-
1226-
// Before we inject any dependencies, make sure we don't inject a
1227-
// circular dependency by validating that this crate doesn't
1228-
// transitively depend on any crates satisfying `needs_dep`.
1229-
for dep in self.cstore.crate_dependencies_in_reverse_postorder(krate) {
1230-
let data = self.cstore.get_crate_data(dep);
1231-
if needs_dep(&data) {
1232-
self.dcx().emit_err(errors::NoTransitiveNeedsDep {
1233-
crate_name: self.cstore.get_crate_data(krate).name(),
1234-
needs_crate_name: what,
1235-
deps_crate_name: data.name(),
1236-
});
1237-
}
1238-
}
1239-
1240-
// All crates satisfying `needs_dep` do not explicitly depend on the
1241-
// crate provided for this compile, but in order for this compilation to
1242-
// be successfully linked we need to inject a dependency (to order the
1243-
// crates on the command line correctly).
1244-
for (cnum, data) in self.cstore.iter_crate_data_mut() {
1245-
if needs_dep(data) {
1246-
info!("injecting a dep from {} to {}", cnum, krate);
1247-
data.add_dependency(krate);
1248-
}
1249-
}
1250-
}
1251-
12521179
fn report_unused_deps(&mut self, krate: &ast::Crate) {
12531180
// Make a point span rather than covering the whole file
12541181
let span = krate.spans.inner_span.shrink_to_lo();

compiler/rustc_metadata/src/dependency_format.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,15 +370,15 @@ fn attempt_static(tcx: TyCtxt<'_>, unavailable: &mut Vec<CrateNum>) -> Option<De
370370
Some(ret)
371371
}
372372

373-
// Given a list of how to link upstream dependencies so far, ensure that an
374-
// injected dependency is activated. This will not do anything if one was
375-
// transitively included already (e.g., via a dylib or explicitly so).
376-
//
377-
// If an injected dependency was not found then we're guaranteed the
378-
// metadata::creader module has injected that dependency (not listed as
379-
// a required dependency) in one of the session's field. If this field is not
380-
// set then this compilation doesn't actually need the dependency and we can
381-
// also skip this step entirely.
373+
/// Given a list of how to link upstream dependencies so far, ensure that an
374+
/// injected dependency is activated. This will not do anything if one was
375+
/// transitively included already (e.g., via a dylib or explicitly so).
376+
///
377+
/// If an injected dependency was not found then we're guaranteed the
378+
/// metadata::creader module has injected that dependency (not listed as
379+
/// a required dependency) in one of the session's field. If this field is not
380+
/// set then this compilation doesn't actually need the dependency and we can
381+
/// also skip this step entirely.
382382
fn activate_injected_dep(
383383
injected: Option<CrateNum>,
384384
list: &mut DependencyList,

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 0 additions & 4 deletions
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
}

compiler/rustc_middle/src/middle/exported_symbols.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ pub enum SymbolExportKind {
3535
pub struct SymbolExportInfo {
3636
pub level: SymbolExportLevel,
3737
pub kind: SymbolExportKind,
38+
/// Was the symbol marked as `#[used(compiler)]` or `#[used(linker)]`?
3839
pub used: bool,
40+
/// Was the symbol marked as `#[rustc_std_internal_symbol]`?
41+
pub rustc_std_internal_symbol: bool,
3942
}
4043

4144
#[derive(Eq, PartialEq, Debug, Copy, Clone, TyEncodable, TyDecodable, HashStable)]

library/std/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ backtrace = [
9393
'miniz_oxide/rustc-dep-of-std',
9494
]
9595

96-
panic-unwind = ["panic_unwind"]
96+
panic-unwind = ["dep:panic_unwind"]
9797
compiler-builtins-c = ["alloc/compiler-builtins-c"]
9898
compiler-builtins-mem = ["alloc/compiler-builtins-mem"]
9999
compiler-builtins-no-asm = ["alloc/compiler-builtins-no-asm"]

library/sysroot/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ debug_typeid = ["std/debug_typeid"]
2626
llvm-libunwind = ["std/llvm-libunwind"]
2727
system-llvm-libunwind = ["std/system-llvm-libunwind"]
2828
optimize_for_size = ["std/optimize_for_size"]
29-
panic-unwind = ["std/panic_unwind"]
29+
panic-unwind = ["std/panic-unwind"]
3030
panic_immediate_abort = ["std/panic_immediate_abort"]
3131
profiler = ["dep:profiler_builtins"]
3232
std_detect_file_io = ["std/std_detect_file_io"]

src/tools/miri/cargo-miri/src/setup.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub fn setup(
8383
SysrootConfig::NoStd
8484
} else {
8585
SysrootConfig::WithStd {
86-
std_features: ["panic_unwind", "backtrace"].into_iter().map(Into::into).collect(),
86+
std_features: ["panic-unwind", "backtrace"].into_iter().map(Into::into).collect(),
8787
}
8888
};
8989
let cargo_cmd = {

src/tools/miri/src/bin/miri.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ impl rustc_driver::Callbacks for MiriBeRustCompilerCalls {
293293
level: SymbolExportLevel::C,
294294
kind: SymbolExportKind::Text,
295295
used: false,
296+
rustc_std_internal_symbol: false,
296297
},
297298
))
298299
} else {

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

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)