Skip to content

Commit de80bb8

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 2dac0f1 + 8fa707a commit de80bb8

File tree

8 files changed

+90
-86
lines changed

8 files changed

+90
-86
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+26-24
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

@@ -1592,7 +1592,7 @@ fn add_pre_link_objects(
15921592
let opts = &sess.target;
15931593
let empty = Default::default();
15941594
let objects = if self_contained {
1595-
&opts.pre_link_objects_fallback
1595+
&opts.pre_link_objects_self_contained
15961596
} else if !(sess.target.os == "fuchsia" && flavor == LinkerFlavor::Gcc) {
15971597
&opts.pre_link_objects
15981598
} else {
@@ -1610,9 +1610,11 @@ fn add_post_link_objects(
16101610
link_output_kind: LinkOutputKind,
16111611
self_contained: bool,
16121612
) {
1613-
let opts = &sess.target;
1614-
let objects =
1615-
if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects };
1613+
let objects = if self_contained {
1614+
&sess.target.post_link_objects_self_contained
1615+
} else {
1616+
&sess.target.post_link_objects
1617+
};
16161618
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
16171619
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
16181620
}
@@ -1891,12 +1893,12 @@ fn linker_with_args<'a>(
18911893
out_filename: &Path,
18921894
codegen_results: &CodegenResults,
18931895
) -> Result<Command, ErrorGuaranteed> {
1894-
let crt_objects_fallback = crt_objects_fallback(sess, crate_type);
1896+
let self_contained = self_contained(sess, crate_type);
18951897
let cmd = &mut *super::linker::get_linker(
18961898
sess,
18971899
path,
18981900
flavor,
1899-
crt_objects_fallback,
1901+
self_contained,
19001902
&codegen_results.crate_info.target_cpu,
19011903
);
19021904
let link_output_kind = link_output_kind(sess, crate_type);
@@ -1923,7 +1925,7 @@ fn linker_with_args<'a>(
19231925
// ------------ Object code and libraries, order-dependent ------------
19241926

19251927
// Pre-link CRT objects.
1926-
add_pre_link_objects(cmd, sess, flavor, link_output_kind, crt_objects_fallback);
1928+
add_pre_link_objects(cmd, sess, flavor, link_output_kind, self_contained);
19271929

19281930
add_linked_symbol_object(
19291931
cmd,
@@ -2033,7 +2035,7 @@ fn linker_with_args<'a>(
20332035
cmd,
20342036
sess,
20352037
link_output_kind,
2036-
crt_objects_fallback,
2038+
self_contained,
20372039
flavor,
20382040
crate_type,
20392041
codegen_results,
@@ -2049,7 +2051,7 @@ fn linker_with_args<'a>(
20492051
// ------------ Object code and libraries, order-dependent ------------
20502052

20512053
// Post-link CRT objects.
2052-
add_post_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
2054+
add_post_link_objects(cmd, sess, link_output_kind, self_contained);
20532055

20542056
// ------------ Late order-dependent options ------------
20552057

@@ -2066,7 +2068,7 @@ fn add_order_independent_options(
20662068
cmd: &mut dyn Linker,
20672069
sess: &Session,
20682070
link_output_kind: LinkOutputKind,
2069-
crt_objects_fallback: bool,
2071+
self_contained: bool,
20702072
flavor: LinkerFlavor,
20712073
crate_type: CrateType,
20722074
codegen_results: &CodegenResults,
@@ -2098,7 +2100,7 @@ fn add_order_independent_options(
20982100
// Make the binary compatible with data execution prevention schemes.
20992101
cmd.add_no_exec();
21002102

2101-
if crt_objects_fallback {
2103+
if self_contained {
21022104
cmd.no_crt_objects();
21032105
}
21042106

@@ -2127,7 +2129,7 @@ fn add_order_independent_options(
21272129

21282130
cmd.linker_plugin_lto();
21292131

2130-
add_library_search_dirs(cmd, sess, crt_objects_fallback);
2132+
add_library_search_dirs(cmd, sess, self_contained);
21312133

21322134
cmd.output_filename(out_filename);
21332135

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,

compiler/rustc_target/src/spec/wasm32_wasi.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ pub fn target() -> Target {
8282
options.linker_flavor = LinkerFlavor::Lld(LldFlavor::Wasm);
8383
options.add_pre_link_args(LinkerFlavor::Gcc, &["--target=wasm32-wasi"]);
8484

85-
options.pre_link_objects_fallback = crt_objects::pre_wasi_fallback();
86-
options.post_link_objects_fallback = crt_objects::post_wasi_fallback();
85+
options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
86+
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
8787

8888
// Right now this is a bit of a workaround but we're currently saying that
8989
// the target by default has a static crt which we're taking as a signal

0 commit comments

Comments
 (0)