Auto merge of #126832 - petrochenkov:linkarg, r= · rust-lang/rust@89280e1 (original) (raw)

`@@ -45,7 +45,7 @@ use tempfile::Builder as TempFileBuilder;

`

45

45

``

46

46

`use itertools::Itertools;

`

47

47

`use std::collections::BTreeSet;

`

48

``

`-

use std::ffi::{OsStr, OsString};

`

``

48

`+

use std::ffi::OsString;

`

49

49

`use std::fs::{read, File, OpenOptions};

`

50

50

`use std::io::{BufWriter, Write};

`

51

51

`use std::ops::Deref;

`

`@@ -1306,12 +1306,12 @@ fn link_sanitizer_runtime(

`

1306

1306

`let filename = format!("rustc{channel}_rt.{name}");

`

1307

1307

`let path = find_sanitizer_runtime(sess, &filename);

`

1308

1308

`let rpath = path.to_str().expect("non-utf8 component in path");

`

1309

``

`-

linker.args(&["-Wl,-rpath", "-Xlinker", rpath]);

`

``

1309

`+

linker.cc_args(&["-Wl,-rpath", "-Xlinker", rpath]);

`

1310

1310

` linker.link_dylib_by_name(&filename, false, true);

`

1311

1311

`} else if sess.target.is_like_msvc && flavor == LinkerFlavor::Msvc(Lld::No) && name == "asan" {

`

1312

1312

`` // MSVC provides the /INFERASANLIBS argument to automatically find the

``

1313

1313

`// compatible ASAN library.

`

1314

``

`-

linker.arg("/INFERASANLIBS");

`

``

1314

`+

linker.link_arg("/INFERASANLIBS");

`

1315

1315

`} else {

`

1316

1316

`let filename = format!("librustc{channel}_rt.{name}.a");

`

1317

1317

`let path = find_sanitizer_runtime(sess, &filename).join(&filename);

`

`@@ -1888,9 +1888,9 @@ fn add_post_link_objects(

`

1888

1888

`/// FIXME: Determine where exactly these args need to be inserted.

`

1889

1889

`fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {

`

1890

1890

`if let Some(args) = sess.target.pre_link_args.get(&flavor) {

`

1891

``

`-

cmd.args(args.iter().map(Deref::deref));

`

``

1891

`+

cmd.verbatim_args(args.iter().map(Deref::deref));

`

1892

1892

`}

`

1893

``

`-

cmd.args(&sess.opts.unstable_opts.pre_link_args);

`

``

1893

`+

cmd.verbatim_args(&sess.opts.unstable_opts.pre_link_args);

`

1894

1894

`}

`

1895

1895

``

1896

1896

`/// Add a link script embedded in the target, if applicable.

`

`@@ -1908,8 +1908,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty

`

1908

1908

` sess.dcx().emit_fatal(errors::LinkScriptWriteFailure { path, error });

`

1909

1909

`}

`

1910

1910

``

1911

``

`-

cmd.arg("--script");

`

1912

``

`-

cmd.arg(path);

`

``

1911

`+

cmd.link_arg("--script").link_arg(path);

`

1913

1912

`}

`

1914

1913

` _ => {}

`

1915

1914

`}

`

`@@ -1918,7 +1917,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty

`

1918

1917

`/// Add arbitrary "user defined" args defined from command line.

`

1919

1918

`/// FIXME: Determine where exactly these args need to be inserted.

`

1920

1919

`fn add_user_defined_link_args(cmd: &mut dyn Linker, sess: &Session) {

`

1921

``

`-

cmd.args(&sess.opts.cg.link_args);

`

``

1920

`+

cmd.verbatim_args(&sess.opts.cg.link_args);

`

1922

1921

`}

`

1923

1922

``

1924

1923

`/// Add arbitrary "late link" args defined by the target spec.

`

`@@ -1936,23 +1935,23 @@ fn add_late_link_args(

`

1936

1935

`});

`

1937

1936

`if any_dynamic_crate {

`

1938

1937

`if let Some(args) = sess.target.late_link_args_dynamic.get(&flavor) {

`

1939

``

`-

cmd.args(args.iter().map(Deref::deref));

`

``

1938

`+

cmd.verbatim_args(args.iter().map(Deref::deref));

`

1940

1939

`}

`

1941

1940

`} else {

`

1942

1941

`if let Some(args) = sess.target.late_link_args_static.get(&flavor) {

`

1943

``

`-

cmd.args(args.iter().map(Deref::deref));

`

``

1942

`+

cmd.verbatim_args(args.iter().map(Deref::deref));

`

1944

1943

`}

`

1945

1944

`}

`

1946

1945

`if let Some(args) = sess.target.late_link_args.get(&flavor) {

`

1947

``

`-

cmd.args(args.iter().map(Deref::deref));

`

``

1946

`+

cmd.verbatim_args(args.iter().map(Deref::deref));

`

1948

1947

`}

`

1949

1948

`}

`

1950

1949

``

1951

1950

`/// Add arbitrary "post-link" args defined by the target spec.

`

1952

1951

`/// FIXME: Determine where exactly these args need to be inserted.

`

1953

1952

`fn add_post_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {

`

1954

1953

`if let Some(args) = sess.target.post_link_args.get(&flavor) {

`

1955

``

`-

cmd.args(args.iter().map(Deref::deref));

`

``

1954

`+

cmd.verbatim_args(args.iter().map(Deref::deref));

`

1956

1955

`}

`

1957

1956

`}

`

1958

1957

``

`@@ -2097,6 +2096,10 @@ fn add_rpath_args(

`

2097

2096

`codegen_results: &CodegenResults,

`

2098

2097

`out_filename: &Path,

`

2099

2098

`) {

`

``

2099

`+

if !sess.target.has_rpath {

`

``

2100

`+

return;

`

``

2101

`+

}

`

``

2102

+

2100

2103

`// FIXME (#2397): At some point we want to rpath our guesses as to

`

2101

2104

`// where extern libraries might live, based on the

`

2102

2105

`// add_lib_search_paths

`

`@@ -2115,11 +2118,10 @@ fn add_rpath_args(

`

2115

2118

`let rpath_config = RPathConfig {

`

2116

2119

`libs: &*libs,

`

2117

2120

`out_filename: out_filename.to_path_buf(),

`

2118

``

`-

has_rpath: sess.target.has_rpath,

`

2119

2121

`is_like_osx: sess.target.is_like_osx,

`

2120

2122

`linker_is_gnu: sess.target.linker_flavor.is_gnu(),

`

2121

2123

`};

`

2122

``

`-

cmd.args(&rpath::get_rpath_flags(&rpath_config));

`

``

2124

`+

cmd.cc_args(&rpath::get_rpath_flags(&rpath_config));

`

2123

2125

`}

`

2124

2126

`}

`

2125

2127

``

`@@ -2378,7 +2380,7 @@ fn add_order_independent_options(

`

2378

2380

`} else {

`

2379

2381

`""

`

2380

2382

`};

`

2381

``

`-

cmd.arg(format!("--dynamic-linker={prefix}ld.so.1"));

`

``

2383

`+

cmd.link_arg(format!("--dynamic-linker={prefix}ld.so.1"));

`

2382

2384

`}

`

2383

2385

``

2384

2386

`if sess.target.eh_frame_header {

`

`@@ -2393,31 +2395,29 @@ fn add_order_independent_options(

`

2393

2395

`}

`

2394

2396

``

2395

2397

`if sess.target.os == "emscripten" {

`

2396

``

`-

cmd.arg("-s");

`

2397

``

`-

cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort {

`

``

2398

`+

cmd.cc_arg("-s").cc_arg(if sess.panic_strategy() == PanicStrategy::Abort {

`

2398

2399

`"DISABLE_EXCEPTION_CATCHING=1"

`

2399

2400

`} else {

`

2400

2401

`"DISABLE_EXCEPTION_CATCHING=0"

`

2401

2402

`});

`

2402

2403

`}

`

2403

2404

``

2404

2405

`if flavor == LinkerFlavor::Llbc {

`

2405

``

`-

cmd.arg("--target");

`

2406

``

`-

cmd.arg(sess.target.llvm_target.as_ref());

`

2407

``

`-

cmd.arg("--target-cpu");

`

2408

``

`-

cmd.arg(&codegen_results.crate_info.target_cpu);

`

``

2406

`+

cmd.link_args(&[

`

``

2407

`+

"--target",

`

``

2408

`+

sess.target.llvm_target.as_ref(),

`

``

2409

`+

"--target-cpu",

`

``

2410

`+

&codegen_results.crate_info.target_cpu,

`

``

2411

`+

]);

`

2409

2412

`} else if flavor == LinkerFlavor::Ptx {

`

2410

``

`-

cmd.arg("--fallback-arch");

`

2411

``

`-

cmd.arg(&codegen_results.crate_info.target_cpu);

`

``

2413

`+

cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);

`

2412

2414

`} else if flavor == LinkerFlavor::Bpf {

`

2413

``

`-

cmd.arg("--cpu");

`

2414

``

`-

cmd.arg(&codegen_results.crate_info.target_cpu);

`

``

2415

`+

cmd.link_args(&["--cpu", &codegen_results.crate_info.target_cpu]);

`

2415

2416

`if let Some(feat) = [sess.opts.cg.target_feature.as_str(), &sess.target.options.features]

`

2416

2417

`.into_iter()

`

2417

2418

`.find(|feat| !feat.is_empty())

`

2418

2419

`{

`

2419

``

`-

cmd.arg("--cpu-features");

`

2420

``

`-

cmd.arg(feat);

`

``

2420

`+

cmd.link_args(&["--cpu-features", feat]);

`

2421

2421

`}

`

2422

2422

`}

`

2423

2423

``

`@@ -2618,7 +2618,11 @@ fn add_native_libs_from_crate(

`

2618

2618

`NativeLibKind::WasmImportModule => {}

`

2619

2619

`NativeLibKind::LinkArg => {

`

2620

2620

`if link_static {

`

2621

``

`-

cmd.linker_arg(OsStr::new(name), verbatim);

`

``

2621

`+

if verbatim {

`

``

2622

`+

cmd.verbatim_arg(name);

`

``

2623

`+

} else {

`

``

2624

`+

cmd.link_arg(name);

`

``

2625

`+

}

`

2622

2626

`}

`

2623

2627

`}

`

2624

2628

`}

`

`@@ -3012,10 +3016,10 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {

`

3012

3016

`// This is admittedly a bit strange, as on most targets

`

3013

3017

`` // -isysroot only applies to include header files, but on Apple

``

3014

3018

`// targets this also applies to libraries and frameworks.

`

3015

``

`-

cmd.args(&["-isysroot", &sdk_root]);

`

``

3019

`+

cmd.cc_args(&["-isysroot", &sdk_root]);

`

3016

3020

`}

`

3017

3021

`LinkerFlavor::Darwin(Cc::No, _) => {

`

3018

``

`-

cmd.args(&["-syslibroot", &sdk_root]);

`

``

3022

`+

cmd.link_args(&["-syslibroot", &sdk_root]);

`

3019

3023

`}

`

3020

3024

` _ => unreachable!(),

`

3021

3025

`}

`

`@@ -3026,8 +3030,9 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {

`

3026

3030

`// search path.

`

3027

3031

``

3028

3032

`` // The flags are called -L and -F both in Clang, ld64 and ldd.

``

3029

``

`-

cmd.arg(format!("-L{sdk_root}/System/iOSSupport/usr/lib"));

`

3030

``

`-

cmd.arg(format!("-F{sdk_root}/System/iOSSupport/System/Library/Frameworks"));

`

``

3033

`+

let sdk_root = Path::new(&sdk_root);

`

``

3034

`+

cmd.include_path(&sdk_root.join("System/iOSSupport/usr/lib"));

`

``

3035

`+

cmd.framework_path(&sdk_root.join("System/iOSSupport/System/Library/Frameworks"));

`

3031

3036

`}

`

3032

3037

`}

`

3033

3038

``

`@@ -3142,7 +3147,7 @@ fn add_lld_args(

`

3142

3147

`for path in sess.get_tools_search_paths(false) {

`

3143

3148

`let linker_path = path.join("gcc-ld");

`

3144

3149

` linker_path_exists |= linker_path.exists();

`

3145

``

`-

cmd.arg({

`

``

3150

`+

cmd.cc_arg({

`

3146

3151

`let mut arg = OsString::from("-B");

`

3147

3152

` arg.push(linker_path);

`

3148

3153

` arg

`

`@@ -3162,7 +3167,7 @@ fn add_lld_args(

`

3162

3167

`` // is to use LLD but the wasm32-wasip2 target relies on a wrapper around

``

3163

3168

`` // this, wasm-component-ld, which is overridden if this option is passed.

``

3164

3169

`if !sess.target.is_like_wasm {

`

3165

``

`-

cmd.arg("-fuse-ld=lld");

`

``

3170

`+

cmd.cc_arg("-fuse-ld=lld");

`

3166

3171

`}

`

3167

3172

``

3168

3173

`if !flavor.is_gnu() {

`

`@@ -3186,7 +3191,7 @@ fn add_lld_args(

`

3186

3191

`// targeting a different linker flavor on macOS, and that's also always

`

3187

3192

`// the case when targeting WASM.

`

3188

3193

`if sess.target.linker_flavor != sess.host.linker_flavor {

`

3189

``

`-

cmd.arg(format!("--target={}", sess.target.llvm_target));

`

``

3194

`+

cmd.cc_arg(format!("--target={}", sess.target.llvm_target));

`

3190

3195

`}

`

3191

3196

`}

`

3192

3197

`}

`