@@ -311,16 +311,32 @@ impl LinkerFlavor {
311311 }
312312 }
313313
314- fn infer_linker_hints ( linker_stem : & str ) -> ( Option < Cc > , Option < Lld > ) {
314+ fn infer_linker_hints ( linker_stem : & str ) -> Result < Self , ( Option < Cc > , Option < Lld > ) > {
315315 // Remove any version postfix.
316316 let stem = linker_stem
317317 . rsplit_once ( '-' )
318318 . and_then ( |( lhs, rhs) | rhs. chars ( ) . all ( char:: is_numeric) . then_some ( lhs) )
319319 . unwrap_or ( linker_stem) ;
320320
321- // GCC/Clang can have an optional target prefix.
322- if stem == "emcc"
323- || stem == "gcc"
321+ if stem == "ld.lld" {
322+ Ok ( Self :: Gnu ( Cc :: No , Lld :: Yes ) )
323+ } else if stem == "ld64.lld" {
324+ Ok ( Self :: Darwin ( Cc :: No , Lld :: Yes ) )
325+ } else if stem == "lld-link" {
326+ Ok ( Self :: Msvc ( Lld :: Yes ) )
327+ } else if stem == "wasm-ld" || stem == "wasm-component-ld" {
328+ Ok ( Self :: WasmLld ( Cc :: No ) )
329+ } else if stem == "lld" || stem == "rust-lld" {
330+ Err ( ( Some ( Cc :: No ) , Some ( Lld :: Yes ) ) )
331+ } else if stem == "emcc" {
332+ Ok ( Self :: EmCc )
333+ } else if stem == "bpf-linker" {
334+ Ok ( Self :: Bpf )
335+ } else if stem == "llvm-bitcode-linker" {
336+ Ok ( Self :: Llbc )
337+ } else if stem == "rust-ptx-linker" {
338+ Ok ( Self :: Ptx )
339+ } else if stem == "gcc" // GCC/Clang can have an optional target prefix.
324340 || stem. ends_with ( "-gcc" )
325341 || stem == "g++"
326342 || stem. ends_with ( "-g++" )
@@ -329,19 +345,11 @@ impl LinkerFlavor {
329345 || stem == "clang++"
330346 || stem. ends_with ( "-clang++" )
331347 {
332- ( Some ( Cc :: Yes ) , Some ( Lld :: No ) )
333- } else if stem == "wasm-ld"
334- || stem. ends_with ( "-wasm-ld" )
335- || stem == "ld.lld"
336- || stem == "lld"
337- || stem == "rust-lld"
338- || stem == "lld-link"
339- {
340- ( Some ( Cc :: No ) , Some ( Lld :: Yes ) )
348+ Err ( ( Some ( Cc :: Yes ) , Some ( Lld :: No ) ) )
341349 } else if stem == "ld" || stem. ends_with ( "-ld" ) || stem == "link" {
342- ( Some ( Cc :: No ) , Some ( Lld :: No ) )
350+ Err ( ( Some ( Cc :: No ) , Some ( Lld :: No ) ) )
343351 } else {
344- ( None , None )
352+ Err ( ( None , None ) )
345353 }
346354 }
347355
@@ -365,7 +373,10 @@ impl LinkerFlavor {
365373 }
366374
367375 pub fn with_linker_hints ( self , linker_stem : & str ) -> LinkerFlavor {
368- self . with_hints ( LinkerFlavor :: infer_linker_hints ( linker_stem) )
376+ match LinkerFlavor :: infer_linker_hints ( linker_stem) {
377+ Ok ( linker_flavor) => linker_flavor,
378+ Err ( hints) => self . with_hints ( hints) ,
379+ }
369380 }
370381
371382 pub fn check_compatibility ( self , cli : LinkerFlavorCli ) -> Option < String > {
0 commit comments