Skip to content

Commit 051e94d

Browse files
committed
implement -C linker-flavor modern flavors
1 parent 1da271b commit 051e94d

File tree

1 file changed

+73
-8
lines changed
  • compiler/rustc_target/src/spec

1 file changed

+73
-8
lines changed

compiler/rustc_target/src/spec/mod.rs

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,21 @@ pub enum LinkerFlavor {
161161
/// linker flavors (`LinkerFlavor`).
162162
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
163163
pub enum LinkerFlavorCli {
164+
// New (unstable) flavors, with direct counterparts in `LinkerFlavor`.
165+
Gnu(Cc, Lld),
166+
Darwin(Cc, Lld),
167+
WasmLld(Cc),
168+
Unix(Cc),
169+
// Note: `Msvc(Lld::No)` is also a stable value.
170+
Msvc(Lld),
171+
EmCc,
172+
Bpf,
173+
Ptx,
174+
175+
// Below: the legacy stable values.
164176
Gcc,
165177
Ld,
166178
Lld(LldFlavor),
167-
Msvc,
168179
Em,
169180
BpfLinker,
170181
PtxLinker,
@@ -212,6 +223,16 @@ impl LinkerFlavor {
212223
/// of truth, other flags are used in case of ambiguities.
213224
fn from_cli_json(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
214225
match cli {
226+
LinkerFlavorCli::Gnu(cc, lld) => LinkerFlavor::Gnu(cc, lld),
227+
LinkerFlavorCli::Darwin(cc, lld) => LinkerFlavor::Darwin(cc, lld),
228+
LinkerFlavorCli::WasmLld(cc) => LinkerFlavor::WasmLld(cc),
229+
LinkerFlavorCli::Unix(cc) => LinkerFlavor::Unix(cc),
230+
LinkerFlavorCli::Msvc(lld) => LinkerFlavor::Msvc(lld),
231+
LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
232+
LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
233+
LinkerFlavorCli::Ptx => LinkerFlavor::Ptx,
234+
235+
// Below: legacy stable values
215236
LinkerFlavorCli::Gcc => match lld_flavor {
216237
LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::Yes, Lld::No),
217238
LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::Yes, Lld::No),
@@ -227,7 +248,6 @@ impl LinkerFlavor {
227248
LinkerFlavorCli::Lld(LldFlavor::Ld64) => LinkerFlavor::Darwin(Cc::No, Lld::Yes),
228249
LinkerFlavorCli::Lld(LldFlavor::Wasm) => LinkerFlavor::WasmLld(Cc::No),
229250
LinkerFlavorCli::Lld(LldFlavor::Link) => LinkerFlavor::Msvc(Lld::Yes),
230-
LinkerFlavorCli::Msvc => LinkerFlavor::Msvc(Lld::No),
231251
LinkerFlavorCli::Em => LinkerFlavor::EmCc,
232252
LinkerFlavorCli::BpfLinker => LinkerFlavor::Bpf,
233253
LinkerFlavorCli::PtxLinker => LinkerFlavor::Ptx,
@@ -247,7 +267,7 @@ impl LinkerFlavor {
247267
LinkerFlavorCli::Ld
248268
}
249269
LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Link),
250-
LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc,
270+
LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc(Lld::No),
251271
LinkerFlavor::EmCc => LinkerFlavorCli::Em,
252272
LinkerFlavor::Bpf => LinkerFlavorCli::BpfLinker,
253273
LinkerFlavor::Ptx => LinkerFlavorCli::PtxLinker,
@@ -256,9 +276,20 @@ impl LinkerFlavor {
256276

257277
fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
258278
match cli {
259-
LinkerFlavorCli::Gcc | LinkerFlavorCli::Em => (Some(Cc::Yes), None),
279+
LinkerFlavorCli::Gnu(cc, lld) | LinkerFlavorCli::Darwin(cc, lld) => {
280+
(Some(cc), Some(lld))
281+
}
282+
LinkerFlavorCli::WasmLld(cc) => (Some(cc), Some(Lld::Yes)),
283+
LinkerFlavorCli::Unix(cc) => (Some(cc), None),
284+
LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
285+
LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
286+
LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx => (None, None),
287+
288+
// Below: legacy stable values
289+
LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
290+
LinkerFlavorCli::Ld => (Some(Cc::No), Some(Lld::No)),
260291
LinkerFlavorCli::Lld(_) => (Some(Cc::No), Some(Lld::Yes)),
261-
LinkerFlavorCli::Ld | LinkerFlavorCli::Msvc => (Some(Cc::No), Some(Lld::No)),
292+
LinkerFlavorCli::Em => (Some(Cc::Yes), Some(Lld::Yes)),
262293
LinkerFlavorCli::BpfLinker | LinkerFlavorCli::PtxLinker => (None, None),
263294
}
264295
}
@@ -321,8 +352,24 @@ impl LinkerFlavor {
321352
}
322353

323354
pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
324-
// The CLI flavor should be compatible with the target if it survives this roundtrip.
325-
let compatible = |cli| cli == self.with_cli_hints(cli).to_cli();
355+
let compatible = |cli| {
356+
// The CLI flavor should be compatible with the target if:
357+
// 1. they are counterparts: they have the same principal flavor.
358+
match (self, cli) {
359+
(LinkerFlavor::Gnu(..), LinkerFlavorCli::Gnu(..))
360+
| (LinkerFlavor::Darwin(..), LinkerFlavorCli::Darwin(..))
361+
| (LinkerFlavor::WasmLld(..), LinkerFlavorCli::WasmLld(..))
362+
| (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
363+
| (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
364+
| (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
365+
| (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
366+
| (LinkerFlavor::Ptx, LinkerFlavorCli::Ptx) => return true,
367+
_ => {}
368+
}
369+
370+
// 2. or, the flavor is legacy and survives this roundtrip.
371+
cli == self.with_cli_hints(cli).to_cli()
372+
};
326373
(!compatible(cli)).then(|| {
327374
LinkerFlavorCli::all()
328375
.iter()
@@ -416,13 +463,31 @@ macro_rules! linker_flavor_cli_impls {
416463
}
417464

418465
linker_flavor_cli_impls! {
466+
(LinkerFlavorCli::Gnu(Cc::No, Lld::No)) "gnu"
467+
(LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
468+
(LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
469+
(LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
470+
(LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
471+
(LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
472+
(LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
473+
(LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
474+
(LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
475+
(LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
476+
(LinkerFlavorCli::Unix(Cc::No)) "unix"
477+
(LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
478+
(LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
479+
(LinkerFlavorCli::Msvc(Lld::No)) "msvc"
480+
(LinkerFlavorCli::EmCc) "em-cc"
481+
(LinkerFlavorCli::Bpf) "bpf"
482+
(LinkerFlavorCli::Ptx) "ptx"
483+
484+
// Below: legacy stable values
419485
(LinkerFlavorCli::Gcc) "gcc"
420486
(LinkerFlavorCli::Ld) "ld"
421487
(LinkerFlavorCli::Lld(LldFlavor::Ld)) "ld.lld"
422488
(LinkerFlavorCli::Lld(LldFlavor::Ld64)) "ld64.lld"
423489
(LinkerFlavorCli::Lld(LldFlavor::Link)) "lld-link"
424490
(LinkerFlavorCli::Lld(LldFlavor::Wasm)) "wasm-ld"
425-
(LinkerFlavorCli::Msvc) "msvc"
426491
(LinkerFlavorCli::Em) "em"
427492
(LinkerFlavorCli::BpfLinker) "bpf-linker"
428493
(LinkerFlavorCli::PtxLinker) "ptx-linker"

0 commit comments

Comments
 (0)