Skip to content

Commit 2f952b8

Browse files
authored
Rollup merge of rust-lang#100126 - petrochenkov:screname, r=davidtwco
rustc_target: Update some old naming around self contained linking The "fallback" naming pre-dates introduction of `-Clink-self-contained`. Noticed when reviewing rust-lang#99500. This PR doesn't break any json target spec, but supporting per-linker-flavor startup objects needed by rust-lang#99500 will break them, so maybe next time I'll remove the compatibility names.
2 parents 6a27120 + e74299b commit 2f952b8

File tree

8 files changed

+94
-88
lines changed

8 files changed

+94
-88
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+30-26
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rustc_session::utils::NativeLibKind;
2020
use rustc_session::{filesearch, Session};
2121
use rustc_span::symbol::Symbol;
2222
use rustc_span::DebuggerVisualizerFile;
23-
use rustc_target::spec::crt_objects::{CrtObjects, CrtObjectsFallback};
23+
use rustc_target::spec::crt_objects::{CrtObjects, LinkSelfContainedDefault};
2424
use rustc_target::spec::{LinkOutputKind, LinkerFlavor, LldFlavor, SplitDebuginfo};
2525
use rustc_target::spec::{PanicStrategy, RelocModel, RelroLevel, SanitizerSet, Target};
2626

@@ -764,15 +764,15 @@ fn link_natively<'a>(
764764
"Linker does not support -static-pie command line option. Retrying with -static instead."
765765
);
766766
// Mirror `add_(pre,post)_link_objects` to replace CRT objects.
767-
let self_contained = crt_objects_fallback(sess, crate_type);
767+
let self_contained = self_contained(sess, crate_type);
768768
let opts = &sess.target;
769769
let pre_objects = if self_contained {
770-
&opts.pre_link_objects_fallback
770+
&opts.pre_link_objects_self_contained
771771
} else {
772772
&opts.pre_link_objects
773773
};
774774
let post_objects = if self_contained {
775-
&opts.post_link_objects_fallback
775+
&opts.post_link_objects_self_contained
776776
} else {
777777
&opts.post_link_objects
778778
};
@@ -1556,26 +1556,26 @@ fn detect_self_contained_mingw(sess: &Session) -> bool {
15561556
true
15571557
}
15581558

1559-
/// Whether we link to our own CRT objects instead of relying on gcc to pull them.
1559+
/// Various toolchain components used during linking are used from rustc distribution
1560+
/// instead of being found somewhere on the host system.
15601561
/// We only provide such support for a very limited number of targets.
1561-
fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
1562+
fn self_contained(sess: &Session, crate_type: CrateType) -> bool {
15621563
if let Some(self_contained) = sess.opts.cg.link_self_contained {
15631564
return self_contained;
15641565
}
15651566

1566-
match sess.target.crt_objects_fallback {
1567+
match sess.target.link_self_contained {
1568+
LinkSelfContainedDefault::False => false,
1569+
LinkSelfContainedDefault::True => true,
15671570
// FIXME: Find a better heuristic for "native musl toolchain is available",
15681571
// based on host and linker path, for example.
15691572
// (https://github.com/rust-lang/rust/pull/71769#issuecomment-626330237).
1570-
Some(CrtObjectsFallback::Musl) => sess.crt_static(Some(crate_type)),
1571-
Some(CrtObjectsFallback::Mingw) => {
1573+
LinkSelfContainedDefault::Musl => sess.crt_static(Some(crate_type)),
1574+
LinkSelfContainedDefault::Mingw => {
15721575
sess.host == sess.target
15731576
&& sess.target.vendor != "uwp"
15741577
&& detect_self_contained_mingw(&sess)
15751578
}
1576-
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
1577-
Some(CrtObjectsFallback::Wasm) => true,
1578-
None => false,
15791579
}
15801580
}
15811581

@@ -1586,9 +1586,11 @@ fn add_pre_link_objects(
15861586
link_output_kind: LinkOutputKind,
15871587
self_contained: bool,
15881588
) {
1589-
let opts = &sess.target;
1590-
let objects =
1591-
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects };
1589+
let objects = if self_contained {
1590+
&sess.target.pre_link_objects_self_contained
1591+
} else {
1592+
&sess.target.pre_link_objects
1593+
};
15921594
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
15931595
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
15941596
}
@@ -1601,9 +1603,11 @@ fn add_post_link_objects(
16011603
link_output_kind: LinkOutputKind,
16021604
self_contained: bool,
16031605
) {
1604-
let opts = &sess.target;
1605-
let objects =
1606-
if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects };
1606+
let objects = if self_contained {
1607+
&sess.target.post_link_objects_self_contained
1608+
} else {
1609+
&sess.target.post_link_objects
1610+
};
16071611
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
16081612
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
16091613
}
@@ -1882,12 +1886,12 @@ fn linker_with_args<'a>(
18821886
out_filename: &Path,
18831887
codegen_results: &CodegenResults,
18841888
) -> Result<Command, ErrorGuaranteed> {
1885-
let crt_objects_fallback = crt_objects_fallback(sess, crate_type);
1889+
let self_contained = self_contained(sess, crate_type);
18861890
let cmd = &mut *super::linker::get_linker(
18871891
sess,
18881892
path,
18891893
flavor,
1890-
crt_objects_fallback,
1894+
self_contained,
18911895
&codegen_results.crate_info.target_cpu,
18921896
);
18931897
let link_output_kind = link_output_kind(sess, crate_type);
@@ -1914,7 +1918,7 @@ fn linker_with_args<'a>(
19141918
// ------------ Object code and libraries, order-dependent ------------
19151919

19161920
// Pre-link CRT objects.
1917-
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
1921+
add_pre_link_objects(cmd, sess, link_output_kind, self_contained);
19181922

19191923
add_linked_symbol_object(
19201924
cmd,
@@ -2024,7 +2028,7 @@ fn linker_with_args<'a>(
20242028
cmd,
20252029
sess,
20262030
link_output_kind,
2027-
crt_objects_fallback,
2031+
self_contained,
20282032
flavor,
20292033
crate_type,
20302034
codegen_results,
@@ -2040,7 +2044,7 @@ fn linker_with_args<'a>(
20402044
// ------------ Object code and libraries, order-dependent ------------
20412045

20422046
// Post-link CRT objects.
2043-
add_post_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
2047+
add_post_link_objects(cmd, sess, link_output_kind, self_contained);
20442048

20452049
// ------------ Late order-dependent options ------------
20462050

@@ -2057,7 +2061,7 @@ fn add_order_independent_options(
20572061
cmd: &mut dyn Linker,
20582062
sess: &Session,
20592063
link_output_kind: LinkOutputKind,
2060-
crt_objects_fallback: bool,
2064+
self_contained: bool,
20612065
flavor: LinkerFlavor,
20622066
crate_type: CrateType,
20632067
codegen_results: &CodegenResults,
@@ -2086,7 +2090,7 @@ fn add_order_independent_options(
20862090
// Make the binary compatible with data execution prevention schemes.
20872091
cmd.add_no_exec();
20882092

2089-
if crt_objects_fallback {
2093+
if self_contained {
20902094
cmd.no_crt_objects();
20912095
}
20922096

@@ -2115,7 +2119,7 @@ fn add_order_independent_options(
21152119

21162120
cmd.linker_plugin_lto();
21172121

2118-
add_library_search_dirs(cmd, sess, crt_objects_fallback);
2122+
add_library_search_dirs(cmd, sess, self_contained);
21192123

21202124
cmd.output_filename(out_filename);
21212125

compiler/rustc_target/src/spec/crt_objects.rs

+22-18
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pub(super) fn all(obj: &'static str) -> CrtObjects {
6363
])
6464
}
6565

66-
pub(super) fn pre_musl_fallback() -> CrtObjects {
66+
pub(super) fn pre_musl_self_contained() -> CrtObjects {
6767
new(&[
6868
(LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]),
6969
(LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]),
@@ -74,7 +74,7 @@ pub(super) fn pre_musl_fallback() -> CrtObjects {
7474
])
7575
}
7676

77-
pub(super) fn post_musl_fallback() -> CrtObjects {
77+
pub(super) fn post_musl_self_contained() -> CrtObjects {
7878
new(&[
7979
(LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]),
8080
(LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]),
@@ -85,7 +85,7 @@ pub(super) fn post_musl_fallback() -> CrtObjects {
8585
])
8686
}
8787

88-
pub(super) fn pre_mingw_fallback() -> CrtObjects {
88+
pub(super) fn pre_mingw_self_contained() -> CrtObjects {
8989
new(&[
9090
(LinkOutputKind::DynamicNoPicExe, &["crt2.o", "rsbegin.o"]),
9191
(LinkOutputKind::DynamicPicExe, &["crt2.o", "rsbegin.o"]),
@@ -96,7 +96,7 @@ pub(super) fn pre_mingw_fallback() -> CrtObjects {
9696
])
9797
}
9898

99-
pub(super) fn post_mingw_fallback() -> CrtObjects {
99+
pub(super) fn post_mingw_self_contained() -> CrtObjects {
100100
all("rsend.o")
101101
}
102102

@@ -108,7 +108,7 @@ pub(super) fn post_mingw() -> CrtObjects {
108108
all("rsend.o")
109109
}
110110

111-
pub(super) fn pre_wasi_fallback() -> CrtObjects {
111+
pub(super) fn pre_wasi_self_contained() -> CrtObjects {
112112
// Use crt1-command.o instead of crt1.o to enable support for new-style
113113
// commands. See https://reviews.llvm.org/D81689 for more info.
114114
new(&[
@@ -120,37 +120,41 @@ pub(super) fn pre_wasi_fallback() -> CrtObjects {
120120
])
121121
}
122122

123-
pub(super) fn post_wasi_fallback() -> CrtObjects {
123+
pub(super) fn post_wasi_self_contained() -> CrtObjects {
124124
new(&[])
125125
}
126126

127-
/// Which logic to use to determine whether to fall back to the "self-contained" mode or not.
127+
/// Which logic to use to determine whether to use self-contained linking mode
128+
/// if `-Clink-self-contained` is not specified explicitly.
128129
#[derive(Clone, Copy, PartialEq, Hash, Debug)]
129-
pub enum CrtObjectsFallback {
130+
pub enum LinkSelfContainedDefault {
131+
False,
132+
True,
130133
Musl,
131134
Mingw,
132-
Wasm,
133135
}
134136

135-
impl FromStr for CrtObjectsFallback {
137+
impl FromStr for LinkSelfContainedDefault {
136138
type Err = ();
137139

138-
fn from_str(s: &str) -> Result<CrtObjectsFallback, ()> {
140+
fn from_str(s: &str) -> Result<LinkSelfContainedDefault, ()> {
139141
Ok(match s {
140-
"musl" => CrtObjectsFallback::Musl,
141-
"mingw" => CrtObjectsFallback::Mingw,
142-
"wasm" => CrtObjectsFallback::Wasm,
142+
"false" => LinkSelfContainedDefault::False,
143+
"true" | "wasm" => LinkSelfContainedDefault::True,
144+
"musl" => LinkSelfContainedDefault::Musl,
145+
"mingw" => LinkSelfContainedDefault::Mingw,
143146
_ => return Err(()),
144147
})
145148
}
146149
}
147150

148-
impl ToJson for CrtObjectsFallback {
151+
impl ToJson for LinkSelfContainedDefault {
149152
fn to_json(&self) -> Json {
150153
match *self {
151-
CrtObjectsFallback::Musl => "musl",
152-
CrtObjectsFallback::Mingw => "mingw",
153-
CrtObjectsFallback::Wasm => "wasm",
154+
LinkSelfContainedDefault::False => "false",
155+
LinkSelfContainedDefault::True => "true",
156+
LinkSelfContainedDefault::Musl => "musl",
157+
LinkSelfContainedDefault::Mingw => "mingw",
154158
}
155159
.to_json()
156160
}

compiler/rustc_target/src/spec/linux_musl_base.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
use crate::spec::crt_objects::{self, CrtObjectsFallback};
1+
use crate::spec::crt_objects::{self, LinkSelfContainedDefault};
22
use crate::spec::TargetOptions;
33

44
pub fn opts() -> TargetOptions {
55
let mut base = super::linux_base::opts();
66

77
base.env = "musl".into();
8-
base.pre_link_objects_fallback = crt_objects::pre_musl_fallback();
9-
base.post_link_objects_fallback = crt_objects::post_musl_fallback();
10-
base.crt_objects_fallback = Some(CrtObjectsFallback::Musl);
8+
base.pre_link_objects_self_contained = crt_objects::pre_musl_self_contained();
9+
base.post_link_objects_self_contained = crt_objects::post_musl_self_contained();
10+
base.link_self_contained = LinkSelfContainedDefault::Musl;
1111

1212
// These targets statically link libc by default
1313
base.crt_static_default = true;

compiler/rustc_target/src/spec/mod.rs

+26-29
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
use crate::abi::Endian;
3838
use crate::json::{Json, ToJson};
3939
use crate::spec::abi::{lookup as lookup_abi, Abi};
40-
use crate::spec::crt_objects::{CrtObjects, CrtObjectsFallback};
40+
use crate::spec::crt_objects::{CrtObjects, LinkSelfContainedDefault};
4141
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
4242
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
4343
use rustc_span::symbol::{sym, Symbol};
@@ -1172,13 +1172,10 @@ pub struct TargetOptions {
11721172
/// Objects to link before and after all other object code.
11731173
pub pre_link_objects: CrtObjects,
11741174
pub post_link_objects: CrtObjects,
1175-
/// Same as `(pre|post)_link_objects`, but when we fail to pull the objects with help of the
1176-
/// target's native gcc and fall back to the "self-contained" mode and pull them manually.
1177-
/// See `crt_objects.rs` for some more detailed documentation.
1178-
pub pre_link_objects_fallback: CrtObjects,
1179-
pub post_link_objects_fallback: CrtObjects,
1180-
/// Which logic to use to determine whether to fall back to the "self-contained" mode or not.
1181-
pub crt_objects_fallback: Option<CrtObjectsFallback>,
1175+
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
1176+
pub pre_link_objects_self_contained: CrtObjects,
1177+
pub post_link_objects_self_contained: CrtObjects,
1178+
pub link_self_contained: LinkSelfContainedDefault,
11821179

11831180
/// Linker arguments that are unconditionally passed after any
11841181
/// user-defined but before post-link objects. Standard platform
@@ -1554,9 +1551,9 @@ impl Default for TargetOptions {
15541551
relro_level: RelroLevel::None,
15551552
pre_link_objects: Default::default(),
15561553
post_link_objects: Default::default(),
1557-
pre_link_objects_fallback: Default::default(),
1558-
post_link_objects_fallback: Default::default(),
1559-
crt_objects_fallback: None,
1554+
pre_link_objects_self_contained: Default::default(),
1555+
post_link_objects_self_contained: Default::default(),
1556+
link_self_contained: LinkSelfContainedDefault::False,
15601557
late_link_args: LinkArgs::new(),
15611558
late_link_args_dynamic: LinkArgs::new(),
15621559
late_link_args_static: LinkArgs::new(),
@@ -1977,20 +1974,20 @@ impl Target {
19771974
Ok::<(), String>(())
19781975
} );
19791976

1980-
($key_name:ident, crt_objects_fallback) => ( {
1981-
let name = (stringify!($key_name)).replace("_", "-");
1982-
obj.remove(&name).and_then(|o| o.as_str().and_then(|s| {
1983-
match s.parse::<CrtObjectsFallback>() {
1984-
Ok(fallback) => base.$key_name = Some(fallback),
1985-
_ => return Some(Err(format!("'{}' is not a valid CRT objects fallback. \
1986-
Use 'musl', 'mingw' or 'wasm'", s))),
1977+
($key_name:ident = $json_name:expr, link_self_contained) => ( {
1978+
let name = $json_name;
1979+
obj.remove(name).and_then(|o| o.as_str().and_then(|s| {
1980+
match s.parse::<LinkSelfContainedDefault>() {
1981+
Ok(lsc_default) => base.$key_name = lsc_default,
1982+
_ => return Some(Err(format!("'{}' is not a valid `-Clink-self-contained` default. \
1983+
Use 'false', 'true', 'musl' or 'mingw'", s))),
19871984
}
19881985
Some(Ok(()))
19891986
})).unwrap_or(Ok(()))
19901987
} );
1991-
($key_name:ident, link_objects) => ( {
1992-
let name = (stringify!($key_name)).replace("_", "-");
1993-
if let Some(val) = obj.remove(&name) {
1988+
($key_name:ident = $json_name:expr, link_objects) => ( {
1989+
let name = $json_name;
1990+
if let Some(val) = obj.remove(name) {
19941991
let obj = val.as_object().ok_or_else(|| format!("{}: expected a \
19951992
JSON object with fields per CRT object kind.", name))?;
19961993
let mut args = CrtObjects::new();
@@ -2112,11 +2109,11 @@ impl Target {
21122109
key!(linker_flavor, LinkerFlavor)?;
21132110
key!(linker, optional);
21142111
key!(lld_flavor, LldFlavor)?;
2115-
key!(pre_link_objects, link_objects);
2116-
key!(post_link_objects, link_objects);
2117-
key!(pre_link_objects_fallback, link_objects);
2118-
key!(post_link_objects_fallback, link_objects);
2119-
key!(crt_objects_fallback, crt_objects_fallback)?;
2112+
key!(pre_link_objects = "pre-link-objects", link_objects);
2113+
key!(post_link_objects = "post-link-objects", link_objects);
2114+
key!(pre_link_objects_self_contained = "pre-link-objects-fallback", link_objects);
2115+
key!(post_link_objects_self_contained = "post-link-objects-fallback", link_objects);
2116+
key!(link_self_contained = "crt-objects-fallback", link_self_contained)?;
21202117
key!(pre_link_args, link_args);
21212118
key!(late_link_args, link_args);
21222119
key!(late_link_args_dynamic, link_args);
@@ -2357,9 +2354,9 @@ impl ToJson for Target {
23572354
target_option_val!(lld_flavor);
23582355
target_option_val!(pre_link_objects);
23592356
target_option_val!(post_link_objects);
2360-
target_option_val!(pre_link_objects_fallback);
2361-
target_option_val!(post_link_objects_fallback);
2362-
target_option_val!(crt_objects_fallback);
2357+
target_option_val!(pre_link_objects_self_contained, "pre-link-objects-fallback");
2358+
target_option_val!(post_link_objects_self_contained, "post-link-objects-fallback");
2359+
target_option_val!(link_self_contained, "crt-objects-fallback");
23632360
target_option_val!(link_args - pre_link_args);
23642361
target_option_val!(link_args - late_link_args);
23652362
target_option_val!(link_args - late_link_args_dynamic);

compiler/rustc_target/src/spec/tests/tests_impl.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ impl Target {
110110
}
111111

112112
assert!(
113-
(self.pre_link_objects_fallback.is_empty()
114-
&& self.post_link_objects_fallback.is_empty())
115-
|| self.crt_objects_fallback.is_some()
113+
(self.pre_link_objects_self_contained.is_empty()
114+
&& self.post_link_objects_self_contained.is_empty())
115+
|| self.link_self_contained != LinkSelfContainedDefault::False
116116
);
117117

118118
// If your target really needs to deviate from the rules below,

0 commit comments

Comments
 (0)