Skip to content

Commit bfa09e1

Browse files
committed
use LinkerFlavorCli for -C linker-flavor
1 parent 79c405a commit bfa09e1

File tree

5 files changed

+24
-12
lines changed

5 files changed

+24
-12
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,7 @@ pub fn ignored_for_lto(sess: &Session, info: &CrateInfo, cnum: CrateNum) -> bool
11361136
&& (info.compiler_builtins == Some(cnum) || info.is_no_builtins.contains(&cnum))
11371137
}
11381138

1139-
// This functions tries to determine the appropriate linker (and corresponding LinkerFlavor) to use
1139+
/// This functions tries to determine the appropriate linker (and corresponding LinkerFlavor) to use
11401140
pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
11411141
fn infer_from(
11421142
sess: &Session,
@@ -1209,9 +1209,13 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
12091209
}
12101210
}
12111211

1212-
// linker and linker flavor specified via command line have precedence over what the target
1213-
// specification specifies
1214-
if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), sess.opts.cg.linker_flavor) {
1212+
// Lower the potential `-C linker-flavor` CLI flag to its principal linker-flavor
1213+
let linker_flavor =
1214+
sess.opts.cg.linker_flavor.as_ref().map(|surface_flavor| surface_flavor.to_flavor());
1215+
1216+
// The `-C linker` and `-C linker-flavor` CLI flags have higher priority than what the target
1217+
// specification declares.
1218+
if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), linker_flavor) {
12151219
return ret;
12161220
}
12171221

compiler/rustc_interface/src/tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use rustc_session::config::{
1313
BranchProtection, Externs, OomStrategy, OutputType, OutputTypes, PAuthKey, PacRet,
1414
SymbolManglingVersion, WasiExecModel,
1515
};
16-
use rustc_session::config::{CFGuard, ExternEntry, LinkerPluginLto, LtoCli, SwitchWithOptPath};
16+
use rustc_session::config::{
17+
CFGuard, ExternEntry, LinkerFlavorCli, LinkerPluginLto, LtoCli, SwitchWithOptPath,
18+
};
1719
use rustc_session::lint::Level;
1820
use rustc_session::search_paths::SearchPath;
1921
use rustc_session::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
@@ -552,7 +554,7 @@ fn test_codegen_options_tracking_hash() {
552554
untracked!(link_args, vec![String::from("abc"), String::from("def")]);
553555
untracked!(link_self_contained, LinkSelfContained::on());
554556
untracked!(linker, Some(PathBuf::from("linker")));
555-
untracked!(linker_flavor, Some(LinkerFlavor::Gcc));
557+
untracked!(linker_flavor, Some(LinkerFlavorCli::WellKnown(LinkerFlavor::Gcc)));
556558
untracked!(no_stack_check, true);
557559
untracked!(remark, Passes::Some(vec![String::from("pass1"), String::from("pass2")]));
558560
untracked!(rpath, true);

compiler/rustc_session/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2570,7 +2570,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
25702570
}
25712571
}
25722572

2573-
if cg.linker_flavor == Some(LinkerFlavor::L4Bender)
2573+
if cg.linker_flavor == Some(LinkerFlavorCli::WellKnown(LinkerFlavor::L4Bender))
25742574
&& !nightly_options::is_unstable_enabled(matches)
25752575
{
25762576
early_error(

compiler/rustc_session/src/options.rs

Lines changed: 7 additions & 5 deletions
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, MergeFunctions, PanicStrategy, SanitizerSet};
99
use rustc_target::spec::{
1010
RelocModel, RelroLevel, SplitDebuginfo, StackProtector, TargetTriple, TlsModel,
1111
};
@@ -385,7 +385,9 @@ mod desc {
385385
"either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`";
386386
pub const parse_cfprotection: &str = "`none`|`no`|`n` (default), `branch`, `return`, or `full`|`yes`|`y` (equivalent to `branch` and `return`)";
387387
pub const parse_strip: &str = "either `none`, `debuginfo`, or `symbols`";
388-
pub const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavor::one_of();
388+
pub const parse_linker_flavor: &str = "one of: `em`, `gcc`, `l4-bender`, `ld`, `msvc`, \
389+
`ptx-linker`, `bpf-linker`, `wasm-ld`, `ld64.lld`, `ld.lld`, `lld-link`, \
390+
or a `gcc:`-prefixed linker to use with the gcc flavor, like `gcc:lld` or `gcc:gold,`";
389391
pub const parse_optimization_fuel: &str = "crate=integer";
390392
pub const parse_mir_spanview: &str = "`statement` (default), `terminator`, or `block`";
391393
pub const parse_instrument_coverage: &str =
@@ -754,8 +756,8 @@ mod parse {
754756
true
755757
}
756758

757-
crate fn parse_linker_flavor(slot: &mut Option<LinkerFlavor>, v: Option<&str>) -> bool {
758-
match v.and_then(LinkerFlavor::from_str) {
759+
crate fn parse_linker_flavor(slot: &mut Option<LinkerFlavorCli>, v: Option<&str>) -> bool {
760+
match v.and_then(|s| LinkerFlavorCli::from_str(s).ok()) {
759761
Some(lf) => *slot = Some(lf),
760762
_ => return false,
761763
}
@@ -1113,7 +1115,7 @@ options! {
11131115
on C toolchain installed in the system"),
11141116
linker: Option<PathBuf> = (None, parse_opt_pathbuf, [UNTRACKED],
11151117
"system linker to link outputs with"),
1116-
linker_flavor: Option<LinkerFlavor> = (None, parse_linker_flavor, [UNTRACKED],
1118+
linker_flavor: Option<LinkerFlavorCli> = (None, parse_linker_flavor, [UNTRACKED],
11171119
"linker flavor"),
11181120
linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
11191121
parse_linker_plugin_lto, [TRACKED],

compiler/rustc_target/src/spec/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ macro_rules! flavor_mappings {
158158
)
159159
}
160160

161+
// Note: until string concatenation can be done in const contexts, remember to update the
162+
// `parse_linker_flavor` error message in rustc_session/src/options.rs whenever adding a new allowed
163+
// value here, since it also mentions enriched CLI-allowed values like `gcc:lld` that are then
164+
// lowered to these target specs `LinkerFlavor`s.
161165
flavor_mappings! {
162166
((LinkerFlavor::Em), "em"),
163167
((LinkerFlavor::Gcc), "gcc"),

0 commit comments

Comments
 (0)