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).

`