@@ -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
}
0 commit comments