Skip to content

Commit fa5ba19

Browse files
authored
Rollup merge of rust-lang#100552 - petrochenkov:flavorcompat, r=lqd
rustc_target: Add a compatibility layer to separate internal and user-facing linker flavors I want to do some refactorings in `rustc_target` - merge `lld_flavor` and `linker_is_gnu` into `linker_flavor`, support combination gcc+lld (rust-lang#96827). This PR adds some compatibility infra that makes that possible without making any changes to user-facing interfaces - `-Clinker-flavor` values and json target specs. (For json target specs this infra may eventually go away since they are not very stable.) The second commit does some light refactoring of internal linker flavors (applies changes from petrochenkov@53eca42 that don't require mass-editing target specs).
2 parents 2e4b24e + 667eb18 commit fa5ba19

File tree

12 files changed

+211
-148
lines changed

12 files changed

+211
-148
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -1173,13 +1173,6 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
11731173
// only the linker flavor is known; use the default linker for the selected flavor
11741174
(None, Some(flavor)) => Some((
11751175
PathBuf::from(match flavor {
1176-
LinkerFlavor::Em => {
1177-
if cfg!(windows) {
1178-
"emcc.bat"
1179-
} else {
1180-
"emcc"
1181-
}
1182-
}
11831176
LinkerFlavor::Gcc => {
11841177
if cfg!(any(target_os = "solaris", target_os = "illumos")) {
11851178
// On historical Solaris systems, "cc" may have
@@ -1194,11 +1187,17 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
11941187
}
11951188
}
11961189
LinkerFlavor::Ld => "ld",
1197-
LinkerFlavor::Msvc => "link.exe",
11981190
LinkerFlavor::Lld(_) => "lld",
1199-
LinkerFlavor::PtxLinker => "rust-ptx-linker",
1200-
LinkerFlavor::BpfLinker => "bpf-linker",
1201-
LinkerFlavor::L4Bender => "l4-bender",
1191+
LinkerFlavor::Msvc => "link.exe",
1192+
LinkerFlavor::EmCc => {
1193+
if cfg!(windows) {
1194+
"emcc.bat"
1195+
} else {
1196+
"emcc"
1197+
}
1198+
}
1199+
LinkerFlavor::Bpf => "bpf-linker",
1200+
LinkerFlavor::Ptx => "rust-ptx-linker",
12021201
}),
12031202
flavor,
12041203
)),
@@ -1208,7 +1207,7 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
12081207
});
12091208

12101209
let flavor = if stem == "emcc" {
1211-
LinkerFlavor::Em
1210+
LinkerFlavor::EmCc
12121211
} else if stem == "gcc"
12131212
|| stem.ends_with("-gcc")
12141213
|| stem == "clang"
@@ -1236,7 +1235,8 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
12361235

12371236
// linker and linker flavor specified via command line have precedence over what the target
12381237
// specification specifies
1239-
if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), sess.opts.cg.linker_flavor) {
1238+
let linker_flavor = sess.opts.cg.linker_flavor.map(LinkerFlavor::from_cli);
1239+
if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), linker_flavor) {
12401240
return ret;
12411241
}
12421242

@@ -2113,11 +2113,11 @@ fn add_order_independent_options(
21132113
});
21142114
}
21152115

2116-
if flavor == LinkerFlavor::PtxLinker {
2116+
if flavor == LinkerFlavor::Ptx {
21172117
// Provide the linker with fallback to internal `target-cpu`.
21182118
cmd.arg("--fallback-arch");
21192119
cmd.arg(&codegen_results.crate_info.target_cpu);
2120-
} else if flavor == LinkerFlavor::BpfLinker {
2120+
} else if flavor == LinkerFlavor::Bpf {
21212121
cmd.arg("--cpu");
21222122
cmd.arg(&codegen_results.crate_info.target_cpu);
21232123
cmd.arg("--cpu-features");

compiler/rustc_codegen_ssa/src/back/linker.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -126,29 +126,26 @@ pub fn get_linker<'a>(
126126
// to the linker args construction.
127127
assert!(cmd.get_args().is_empty() || sess.target.vendor == "uwp");
128128
match flavor {
129-
LinkerFlavor::Lld(LldFlavor::Link) | LinkerFlavor::Msvc => {
130-
Box::new(MsvcLinker { cmd, sess }) as Box<dyn Linker>
131-
}
132-
LinkerFlavor::Em => Box::new(EmLinker { cmd, sess }) as Box<dyn Linker>,
133129
LinkerFlavor::Gcc => {
134130
Box::new(GccLinker { cmd, sess, target_cpu, hinted_static: false, is_ld: false })
135131
as Box<dyn Linker>
136132
}
137-
133+
LinkerFlavor::Ld if sess.target.os == "l4re" => {
134+
Box::new(L4Bender::new(cmd, sess)) as Box<dyn Linker>
135+
}
138136
LinkerFlavor::Lld(LldFlavor::Ld)
139137
| LinkerFlavor::Lld(LldFlavor::Ld64)
140138
| LinkerFlavor::Ld => {
141139
Box::new(GccLinker { cmd, sess, target_cpu, hinted_static: false, is_ld: true })
142140
as Box<dyn Linker>
143141
}
144-
142+
LinkerFlavor::Lld(LldFlavor::Link) | LinkerFlavor::Msvc => {
143+
Box::new(MsvcLinker { cmd, sess }) as Box<dyn Linker>
144+
}
145145
LinkerFlavor::Lld(LldFlavor::Wasm) => Box::new(WasmLd::new(cmd, sess)) as Box<dyn Linker>,
146-
147-
LinkerFlavor::PtxLinker => Box::new(PtxLinker { cmd, sess }) as Box<dyn Linker>,
148-
149-
LinkerFlavor::BpfLinker => Box::new(BpfLinker { cmd, sess }) as Box<dyn Linker>,
150-
151-
LinkerFlavor::L4Bender => Box::new(L4Bender::new(cmd, sess)) as Box<dyn Linker>,
146+
LinkerFlavor::EmCc => Box::new(EmLinker { cmd, sess }) as Box<dyn Linker>,
147+
LinkerFlavor::Bpf => Box::new(BpfLinker { cmd, sess }) as Box<dyn Linker>,
148+
LinkerFlavor::Ptx => Box::new(PtxLinker { cmd, sess }) as Box<dyn Linker>,
152149
}
153150
}
154151

compiler/rustc_interface/src/tests.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ use rustc_session::{build_session, getopts, DiagnosticOutput, Session};
2121
use rustc_span::edition::{Edition, DEFAULT_EDITION};
2222
use rustc_span::symbol::sym;
2323
use rustc_span::SourceFileHashAlgorithm;
24-
use rustc_target::spec::{CodeModel, LinkerFlavor, MergeFunctions, PanicStrategy};
25-
use rustc_target::spec::{
26-
RelocModel, RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, TlsModel,
27-
};
24+
use rustc_target::spec::{CodeModel, LinkerFlavorCli, MergeFunctions, PanicStrategy, RelocModel};
25+
use rustc_target::spec::{RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, TlsModel};
2826

2927
use std::collections::{BTreeMap, BTreeSet};
3028
use std::iter::FromIterator;
@@ -552,7 +550,7 @@ fn test_codegen_options_tracking_hash() {
552550
untracked!(link_args, vec![String::from("abc"), String::from("def")]);
553551
untracked!(link_self_contained, Some(true));
554552
untracked!(linker, Some(PathBuf::from("linker")));
555-
untracked!(linker_flavor, Some(LinkerFlavor::Gcc));
553+
untracked!(linker_flavor, Some(LinkerFlavorCli::Gcc));
556554
untracked!(no_stack_check, true);
557555
untracked!(remark, Passes::Some(vec![String::from("pass1"), String::from("pass2")]));
558556
untracked!(rpath, true);

compiler/rustc_session/src/config.rs

+2-12
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1212

1313
use rustc_data_structures::stable_hasher::ToStableHashKey;
1414
use rustc_target::abi::{Align, TargetDataLayout};
15-
use rustc_target::spec::{LinkerFlavor, SplitDebuginfo, Target, TargetTriple, TargetWarnings};
16-
use rustc_target::spec::{PanicStrategy, SanitizerSet, TARGETS};
15+
use rustc_target::spec::{PanicStrategy, SanitizerSet, SplitDebuginfo};
16+
use rustc_target::spec::{Target, TargetTriple, TargetWarnings, TARGETS};
1717

1818
use crate::parse::{CrateCheckConfig, CrateConfig};
1919
use rustc_feature::UnstableFeatures;
@@ -2379,16 +2379,6 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
23792379
}
23802380
}
23812381

2382-
if cg.linker_flavor == Some(LinkerFlavor::L4Bender)
2383-
&& !nightly_options::is_unstable_enabled(matches)
2384-
{
2385-
early_error(
2386-
error_format,
2387-
"`l4-bender` linker flavor is unstable, `-Z unstable-options` \
2388-
flag must also be passed to explicitly use it",
2389-
);
2390-
}
2391-
23922382
let prints = collect_print_requests(&mut cg, &mut unstable_opts, matches, error_format);
23932383

23942384
let cg = cg;

compiler/rustc_session/src/options.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::lint;
55
use crate::search_paths::SearchPath;
66
use crate::utils::NativeLib;
77
use rustc_errors::LanguageIdentifier;
8-
use rustc_target::spec::{CodeModel, LinkerFlavor, MergeFunctions, PanicStrategy, SanitizerSet};
8+
use rustc_target::spec::{CodeModel, LinkerFlavorCli, MergeFunctions, PanicStrategy, SanitizerSet};
99
use rustc_target::spec::{
1010
RelocModel, RelroLevel, SplitDebuginfo, StackProtector, TargetTriple, TlsModel,
1111
};
@@ -382,7 +382,7 @@ mod desc {
382382
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`";
383383
pub const parse_cfprotection: &str = "`none`|`no`|`n` (default), `branch`, `return`, or `full`|`yes`|`y` (equivalent to `branch` and `return`)";
384384
pub const parse_strip: &str = "either `none`, `debuginfo`, or `symbols`";
385-
pub const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavor::one_of();
385+
pub const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavorCli::one_of();
386386
pub const parse_optimization_fuel: &str = "crate=integer";
387387
pub const parse_mir_spanview: &str = "`statement` (default), `terminator`, or `block`";
388388
pub const parse_instrument_coverage: &str =
@@ -763,8 +763,8 @@ mod parse {
763763
true
764764
}
765765

766-
pub(crate) fn parse_linker_flavor(slot: &mut Option<LinkerFlavor>, v: Option<&str>) -> bool {
767-
match v.and_then(LinkerFlavor::from_str) {
766+
pub(crate) fn parse_linker_flavor(slot: &mut Option<LinkerFlavorCli>, v: Option<&str>) -> bool {
767+
match v.and_then(LinkerFlavorCli::from_str) {
768768
Some(lf) => *slot = Some(lf),
769769
_ => return false,
770770
}
@@ -1139,7 +1139,7 @@ options! {
11391139
on C toolchain installed in the system"),
11401140
linker: Option<PathBuf> = (None, parse_opt_pathbuf, [UNTRACKED],
11411141
"system linker to link outputs with"),
1142-
linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
1142+
linker_flavor: Option<LinkerFlavorCli> = (None, parse_linker_flavor, [UNTRACKED],
11431143
"linker flavor"),
11441144
linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
11451145
parse_linker_plugin_lto, [TRACKED],

compiler/rustc_target/src/spec/asmjs_unknown_emscripten.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ use super::{wasm32_unknown_emscripten, LinkerFlavor, Target};
22

33
pub fn target() -> Target {
44
let mut target = wasm32_unknown_emscripten::target();
5-
target.add_post_link_args(LinkerFlavor::Em, &["-sWASM=0", "--memory-init-file", "0"]);
5+
target.add_post_link_args(LinkerFlavor::EmCc, &["-sWASM=0", "--memory-init-file", "0"]);
66
target
77
}

compiler/rustc_target/src/spec/bpf_base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pub fn opts(endian: Endian) -> TargetOptions {
55
TargetOptions {
66
allow_asm: true,
77
endian,
8-
linker_flavor: LinkerFlavor::BpfLinker,
8+
linker_flavor: LinkerFlavor::Bpf,
99
atomic_cas: false,
1010
dynamic_linking: true,
1111
no_builtins: true,

compiler/rustc_target/src/spec/l4re_base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub fn opts() -> TargetOptions {
44
TargetOptions {
55
os: "l4re".into(),
66
env: "uclibc".into(),
7-
linker_flavor: LinkerFlavor::L4Bender,
7+
linker_flavor: LinkerFlavor::Ld,
88
panic_strategy: PanicStrategy::Abort,
99
linker: Some("l4-bender".into()),
1010
linker_is_gnu: false,

0 commit comments

Comments
 (0)