@@ -161,10 +161,21 @@ pub enum LinkerFlavor {
161
161
/// linker flavors (`LinkerFlavor`).
162
162
#[ derive( Clone , Copy , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
163
163
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.
164
176
Gcc ,
165
177
Ld ,
166
178
Lld ( LldFlavor ) ,
167
- Msvc ,
168
179
Em ,
169
180
BpfLinker ,
170
181
PtxLinker ,
@@ -212,6 +223,16 @@ impl LinkerFlavor {
212
223
/// of truth, other flags are used in case of ambiguities.
213
224
fn from_cli_json ( cli : LinkerFlavorCli , lld_flavor : LldFlavor , is_gnu : bool ) -> LinkerFlavor {
214
225
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
215
236
LinkerFlavorCli :: Gcc => match lld_flavor {
216
237
LldFlavor :: Ld if is_gnu => LinkerFlavor :: Gnu ( Cc :: Yes , Lld :: No ) ,
217
238
LldFlavor :: Ld64 => LinkerFlavor :: Darwin ( Cc :: Yes , Lld :: No ) ,
@@ -227,7 +248,6 @@ impl LinkerFlavor {
227
248
LinkerFlavorCli :: Lld ( LldFlavor :: Ld64 ) => LinkerFlavor :: Darwin ( Cc :: No , Lld :: Yes ) ,
228
249
LinkerFlavorCli :: Lld ( LldFlavor :: Wasm ) => LinkerFlavor :: WasmLld ( Cc :: No ) ,
229
250
LinkerFlavorCli :: Lld ( LldFlavor :: Link ) => LinkerFlavor :: Msvc ( Lld :: Yes ) ,
230
- LinkerFlavorCli :: Msvc => LinkerFlavor :: Msvc ( Lld :: No ) ,
231
251
LinkerFlavorCli :: Em => LinkerFlavor :: EmCc ,
232
252
LinkerFlavorCli :: BpfLinker => LinkerFlavor :: Bpf ,
233
253
LinkerFlavorCli :: PtxLinker => LinkerFlavor :: Ptx ,
@@ -247,7 +267,7 @@ impl LinkerFlavor {
247
267
LinkerFlavorCli :: Ld
248
268
}
249
269
LinkerFlavor :: Msvc ( Lld :: Yes ) => LinkerFlavorCli :: Lld ( LldFlavor :: Link ) ,
250
- LinkerFlavor :: Msvc ( ..) => LinkerFlavorCli :: Msvc ,
270
+ LinkerFlavor :: Msvc ( ..) => LinkerFlavorCli :: Msvc ( Lld :: No ) ,
251
271
LinkerFlavor :: EmCc => LinkerFlavorCli :: Em ,
252
272
LinkerFlavor :: Bpf => LinkerFlavorCli :: BpfLinker ,
253
273
LinkerFlavor :: Ptx => LinkerFlavorCli :: PtxLinker ,
@@ -256,9 +276,20 @@ impl LinkerFlavor {
256
276
257
277
fn infer_cli_hints ( cli : LinkerFlavorCli ) -> ( Option < Cc > , Option < Lld > ) {
258
278
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 ) ) ,
260
291
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 ) ) ,
262
293
LinkerFlavorCli :: BpfLinker | LinkerFlavorCli :: PtxLinker => ( None , None ) ,
263
294
}
264
295
}
@@ -321,8 +352,24 @@ impl LinkerFlavor {
321
352
}
322
353
323
354
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
+ } ;
326
373
( !compatible ( cli) ) . then ( || {
327
374
LinkerFlavorCli :: all ( )
328
375
. iter ( )
@@ -416,13 +463,31 @@ macro_rules! linker_flavor_cli_impls {
416
463
}
417
464
418
465
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
419
485
( LinkerFlavorCli :: Gcc ) "gcc"
420
486
( LinkerFlavorCli :: Ld ) "ld"
421
487
( LinkerFlavorCli :: Lld ( LldFlavor :: Ld ) ) "ld.lld"
422
488
( LinkerFlavorCli :: Lld ( LldFlavor :: Ld64 ) ) "ld64.lld"
423
489
( LinkerFlavorCli :: Lld ( LldFlavor :: Link ) ) "lld-link"
424
490
( LinkerFlavorCli :: Lld ( LldFlavor :: Wasm ) ) "wasm-ld"
425
- ( LinkerFlavorCli :: Msvc ) "msvc"
426
491
( LinkerFlavorCli :: Em ) "em"
427
492
( LinkerFlavorCli :: BpfLinker ) "bpf-linker"
428
493
( LinkerFlavorCli :: PtxLinker ) "ptx-linker"
0 commit comments