@@ -23,8 +23,8 @@ use rustc_session::{filesearch, Session};
23
23
use rustc_span:: symbol:: Symbol ;
24
24
use rustc_span:: DebuggerVisualizerFile ;
25
25
use rustc_target:: spec:: crt_objects:: { CrtObjects , LinkSelfContainedDefault } ;
26
- use rustc_target:: spec:: { LinkOutputKind , LinkerFlavor , LldFlavor , SplitDebuginfo } ;
27
- use rustc_target:: spec:: { PanicStrategy , RelocModel , RelroLevel , SanitizerSet , Target } ;
26
+ use rustc_target:: spec:: { Cc , LinkOutputKind , LinkerFlavor , LinkerFlavorCli , Lld , PanicStrategy } ;
27
+ use rustc_target:: spec:: { RelocModel , RelroLevel , SanitizerSet , SplitDebuginfo , Target } ;
28
28
29
29
use super :: archive:: { ArchiveBuilder , ArchiveBuilderBuilder } ;
30
30
use super :: command:: Command ;
@@ -748,8 +748,7 @@ fn link_natively<'a>(
748
748
// then it should not default to linking executables as pie. Different
749
749
// versions of gcc seem to use different quotes in the error message so
750
750
// don't check for them.
751
- if sess. target . linker_is_gnu
752
- && flavor != LinkerFlavor :: Ld
751
+ if matches ! ( flavor, LinkerFlavor :: Gnu ( Cc :: Yes , _) )
753
752
&& unknown_arg_regex. is_match ( & out)
754
753
&& out. contains ( "-no-pie" )
755
754
&& cmd. get_args ( ) . iter ( ) . any ( |e| e. to_string_lossy ( ) == "-no-pie" )
@@ -767,8 +766,7 @@ fn link_natively<'a>(
767
766
768
767
// Detect '-static-pie' used with an older version of gcc or clang not supporting it.
769
768
// Fallback from '-static-pie' to '-static' in that case.
770
- if sess. target . linker_is_gnu
771
- && flavor != LinkerFlavor :: Ld
769
+ if matches ! ( flavor, LinkerFlavor :: Gnu ( Cc :: Yes , _) )
772
770
&& unknown_arg_regex. is_match ( & out)
773
771
&& ( out. contains ( "-static-pie" ) || out. contains ( "--no-dynamic-linker" ) )
774
772
&& cmd. get_args ( ) . iter ( ) . any ( |e| e. to_string_lossy ( ) == "-static-pie" )
@@ -903,7 +901,7 @@ fn link_natively<'a>(
903
901
// install the Visual Studio build tools.
904
902
if let Some ( code) = prog. status . code ( ) {
905
903
if sess. target . is_like_msvc
906
- && flavor == LinkerFlavor :: Msvc
904
+ && flavor == LinkerFlavor :: Msvc ( Lld :: No )
907
905
// Respect the command line override
908
906
&& sess. opts . cg . linker . is_none ( )
909
907
// Match exactly "link.exe"
@@ -1187,7 +1185,10 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
1187
1185
// only the linker flavor is known; use the default linker for the selected flavor
1188
1186
( None , Some ( flavor) ) => Some ( (
1189
1187
PathBuf :: from ( match flavor {
1190
- LinkerFlavor :: Gcc => {
1188
+ LinkerFlavor :: Gnu ( Cc :: Yes , _)
1189
+ | LinkerFlavor :: Darwin ( Cc :: Yes , _)
1190
+ | LinkerFlavor :: WasmLld ( Cc :: Yes )
1191
+ | LinkerFlavor :: Unix ( Cc :: Yes ) => {
1191
1192
if cfg ! ( any( target_os = "solaris" , target_os = "illumos" ) ) {
1192
1193
// On historical Solaris systems, "cc" may have
1193
1194
// been Sun Studio, which is not flag-compatible
@@ -1200,9 +1201,14 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
1200
1201
"cc"
1201
1202
}
1202
1203
}
1203
- LinkerFlavor :: Ld => "ld" ,
1204
- LinkerFlavor :: Lld ( _) => "lld" ,
1205
- LinkerFlavor :: Msvc => "link.exe" ,
1204
+ LinkerFlavor :: Gnu ( _, Lld :: Yes )
1205
+ | LinkerFlavor :: Darwin ( _, Lld :: Yes )
1206
+ | LinkerFlavor :: WasmLld ( ..)
1207
+ | LinkerFlavor :: Msvc ( Lld :: Yes ) => "lld" ,
1208
+ LinkerFlavor :: Gnu ( ..) | LinkerFlavor :: Darwin ( ..) | LinkerFlavor :: Unix ( ..) => {
1209
+ "ld"
1210
+ }
1211
+ LinkerFlavor :: Msvc ( ..) => "link.exe" ,
1206
1212
LinkerFlavor :: EmCc => {
1207
1213
if cfg ! ( windows) {
1208
1214
"emcc.bat"
@@ -1227,15 +1233,20 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
1227
1233
|| stem == "clang"
1228
1234
|| stem. ends_with ( "-clang" )
1229
1235
{
1230
- LinkerFlavor :: Gcc
1236
+ LinkerFlavor :: from_cli ( LinkerFlavorCli :: Gcc , & sess . target )
1231
1237
} else if stem == "wasm-ld" || stem. ends_with ( "-wasm-ld" ) {
1232
- LinkerFlavor :: Lld ( LldFlavor :: Wasm )
1233
- } else if stem == "ld" || stem == "ld.lld" || stem. ends_with ( "-ld" ) {
1234
- LinkerFlavor :: Ld
1235
- } else if stem == "link" || stem == "lld-link" {
1236
- LinkerFlavor :: Msvc
1238
+ LinkerFlavor :: WasmLld ( Cc :: No )
1239
+ } else if stem == "ld" || stem. ends_with ( "-ld" ) {
1240
+ LinkerFlavor :: from_cli ( LinkerFlavorCli :: Ld , & sess. target )
1241
+ } else if stem == "ld.lld" {
1242
+ LinkerFlavor :: Gnu ( Cc :: No , Lld :: Yes )
1243
+ } else if stem == "link" {
1244
+ LinkerFlavor :: Msvc ( Lld :: No )
1245
+ } else if stem == "lld-link" {
1246
+ LinkerFlavor :: Msvc ( Lld :: Yes )
1237
1247
} else if stem == "lld" || stem == "rust-lld" {
1238
- LinkerFlavor :: Lld ( sess. target . lld_flavor )
1248
+ let lld_flavor = sess. target . linker_flavor . lld_flavor ( ) ;
1249
+ LinkerFlavor :: from_cli ( LinkerFlavorCli :: Lld ( lld_flavor) , & sess. target )
1239
1250
} else {
1240
1251
// fall back to the value in the target spec
1241
1252
sess. target . linker_flavor
@@ -1249,7 +1260,8 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
1249
1260
1250
1261
// linker and linker flavor specified via command line have precedence over what the target
1251
1262
// specification specifies
1252
- let linker_flavor = sess. opts . cg . linker_flavor . map ( LinkerFlavor :: from_cli) ;
1263
+ let linker_flavor =
1264
+ sess. opts . cg . linker_flavor . map ( |flavor| LinkerFlavor :: from_cli ( flavor, & sess. target ) ) ;
1253
1265
if let Some ( ret) = infer_from ( sess, sess. opts . cg . linker . clone ( ) , linker_flavor) {
1254
1266
return ret;
1255
1267
}
@@ -1320,7 +1332,7 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLib]) {
1320
1332
let verbatim = lib. verbatim . unwrap_or ( false ) ;
1321
1333
if sess. target . is_like_msvc {
1322
1334
Some ( format ! ( "{}{}" , name, if verbatim { "" } else { ".lib" } ) )
1323
- } else if sess. target . linker_is_gnu {
1335
+ } else if sess. target . linker_flavor . is_gnu ( ) {
1324
1336
Some ( format ! ( "-l{}{}" , if verbatim { ":" } else { "" } , name) )
1325
1337
} else {
1326
1338
Some ( format ! ( "-l{}" , name) )
@@ -1607,7 +1619,7 @@ fn add_pre_link_objects(
1607
1619
let empty = Default :: default ( ) ;
1608
1620
let objects = if self_contained {
1609
1621
& opts. pre_link_objects_self_contained
1610
- } else if !( sess. target . os == "fuchsia" && flavor == LinkerFlavor :: Gcc ) {
1622
+ } else if !( sess. target . os == "fuchsia" && matches ! ( flavor, LinkerFlavor :: Gnu ( Cc :: Yes , _ ) ) ) {
1611
1623
& opts. pre_link_objects
1612
1624
} else {
1613
1625
& empty
@@ -1647,7 +1659,7 @@ fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor)
1647
1659
fn add_link_script ( cmd : & mut dyn Linker , sess : & Session , tmpdir : & Path , crate_type : CrateType ) {
1648
1660
match ( crate_type, & sess. target . link_script ) {
1649
1661
( CrateType :: Cdylib | CrateType :: Executable , Some ( script) ) => {
1650
- if !sess. target . linker_is_gnu {
1662
+ if !sess. target . linker_flavor . is_gnu ( ) {
1651
1663
sess. fatal ( "can only use link script when linking with GNU-like linker" ) ;
1652
1664
}
1653
1665
@@ -1890,7 +1902,7 @@ fn add_rpath_args(
1890
1902
out_filename : out_filename. to_path_buf ( ) ,
1891
1903
has_rpath : sess. target . has_rpath ,
1892
1904
is_like_osx : sess. target . is_like_osx ,
1893
- linker_is_gnu : sess. target . linker_is_gnu ,
1905
+ linker_is_gnu : sess. target . linker_flavor . is_gnu ( ) ,
1894
1906
} ;
1895
1907
cmd. args ( & rpath:: get_rpath_flags ( & mut rpath_config) ) ;
1896
1908
}
@@ -2104,7 +2116,7 @@ fn add_order_independent_options(
2104
2116
2105
2117
if sess. target . os == "fuchsia"
2106
2118
&& crate_type == CrateType :: Executable
2107
- && flavor != LinkerFlavor :: Gcc
2119
+ && ! matches ! ( flavor, LinkerFlavor :: Gnu ( Cc :: Yes , _ ) )
2108
2120
{
2109
2121
let prefix = if sess. opts . unstable_opts . sanitizer . contains ( SanitizerSet :: ADDRESS ) {
2110
2122
"asan/"
@@ -2717,12 +2729,12 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
2717
2729
let llvm_target = & sess. target . llvm_target ;
2718
2730
if sess. target . vendor != "apple"
2719
2731
|| !matches ! ( os. as_ref( ) , "ios" | "tvos" | "watchos" | "macos" )
2720
- || ( flavor != LinkerFlavor :: Gcc && flavor != LinkerFlavor :: Lld ( LldFlavor :: Ld64 ) )
2732
+ || ! matches ! ( flavor, LinkerFlavor :: Darwin ( .. ) )
2721
2733
{
2722
2734
return ;
2723
2735
}
2724
2736
2725
- if os == "macos" && flavor != LinkerFlavor :: Lld ( LldFlavor :: Ld64 ) {
2737
+ if os == "macos" && ! matches ! ( flavor, LinkerFlavor :: Darwin ( Cc :: No , _ ) ) {
2726
2738
return ;
2727
2739
}
2728
2740
@@ -2756,10 +2768,10 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
2756
2768
} ;
2757
2769
2758
2770
match flavor {
2759
- LinkerFlavor :: Gcc => {
2771
+ LinkerFlavor :: Darwin ( Cc :: Yes , _ ) => {
2760
2772
cmd. args ( & [ "-isysroot" , & sdk_root, "-Wl,-syslibroot" , & sdk_root] ) ;
2761
2773
}
2762
- LinkerFlavor :: Lld ( LldFlavor :: Ld64 ) => {
2774
+ LinkerFlavor :: Darwin ( Cc :: No , _ ) => {
2763
2775
cmd. args ( & [ "-syslibroot" , & sdk_root] ) ;
2764
2776
}
2765
2777
_ => unreachable ! ( ) ,
@@ -2822,7 +2834,10 @@ fn get_apple_sdk_root(sdk_name: &str) -> Result<String, String> {
2822
2834
2823
2835
fn add_gcc_ld_path ( cmd : & mut dyn Linker , sess : & Session , flavor : LinkerFlavor ) {
2824
2836
if let Some ( ld_impl) = sess. opts . unstable_opts . gcc_ld {
2825
- if let LinkerFlavor :: Gcc = flavor {
2837
+ if let LinkerFlavor :: Gnu ( Cc :: Yes , _)
2838
+ | LinkerFlavor :: Darwin ( Cc :: Yes , _)
2839
+ | LinkerFlavor :: WasmLld ( Cc :: Yes ) = flavor
2840
+ {
2826
2841
match ld_impl {
2827
2842
LdImpl :: Lld => {
2828
2843
// Implement the "self-contained" part of -Zgcc-ld
@@ -2837,7 +2852,7 @@ fn add_gcc_ld_path(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
2837
2852
// Implement the "linker flavor" part of -Zgcc-ld
2838
2853
// by asking cc to use some kind of lld.
2839
2854
cmd. arg ( "-fuse-ld=lld" ) ;
2840
- if sess . target . lld_flavor != LldFlavor :: Ld {
2855
+ if !flavor . is_gnu ( ) {
2841
2856
// Tell clang to use a non-default LLD flavor.
2842
2857
// Gcc doesn't understand the target option, but we currently assume
2843
2858
// that gcc is not used for Apple and Wasm targets (#97402).
0 commit comments