Auto merge of #101988 - petrochenkov:flavor2, r=lqd · rust-lang/rust@cf0fa76 (original) (raw)
`@@ -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).
`