@@ -161,10 +161,21 @@ pub enum LinkerFlavor {
161161/// linker flavors (`LinkerFlavor`).
162162#[ derive( Clone , Copy , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
163163pub 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
418465linker_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