@@ -45,7 +45,7 @@ use tempfile::Builder as TempFileBuilder;
4545
4646use itertools:: Itertools ;
4747use std:: collections:: BTreeSet ;
48- use std:: ffi:: { OsStr , OsString } ;
48+ use std:: ffi:: OsString ;
4949use std:: fs:: { read, File , OpenOptions } ;
5050use std:: io:: { BufWriter , Write } ;
5151use std:: ops:: Deref ;
@@ -1306,12 +1306,12 @@ fn link_sanitizer_runtime(
13061306 let filename = format ! ( "rustc{channel}_rt.{name}" ) ;
13071307 let path = find_sanitizer_runtime ( sess, & filename) ;
13081308 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] ) ;
13101310 linker. link_dylib_by_name ( & filename, false , true ) ;
13111311 } else if sess. target . is_like_msvc && flavor == LinkerFlavor :: Msvc ( Lld :: No ) && name == "asan" {
13121312 // MSVC provides the `/INFERASANLIBS` argument to automatically find the
13131313 // compatible ASAN library.
1314- linker. arg ( "/INFERASANLIBS" ) ;
1314+ linker. link_arg ( "/INFERASANLIBS" ) ;
13151315 } else {
13161316 let filename = format ! ( "librustc{channel}_rt.{name}.a" ) ;
13171317 let path = find_sanitizer_runtime ( sess, & filename) . join ( & filename) ;
@@ -1888,9 +1888,9 @@ fn add_post_link_objects(
18881888/// FIXME: Determine where exactly these args need to be inserted.
18891889fn add_pre_link_args ( cmd : & mut dyn Linker , sess : & Session , flavor : LinkerFlavor ) {
18901890 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) ) ;
18921892 }
1893- cmd. args ( & sess. opts . unstable_opts . pre_link_args ) ;
1893+ cmd. verbatim_args ( & sess. opts . unstable_opts . pre_link_args ) ;
18941894}
18951895
18961896/// 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
19081908 sess. dcx ( ) . emit_fatal ( errors:: LinkScriptWriteFailure { path, error } ) ;
19091909 }
19101910
1911- cmd. arg ( "--script" ) ;
1912- cmd. arg ( path) ;
1911+ cmd. link_arg ( "--script" ) . link_arg ( path) ;
19131912 }
19141913 _ => { }
19151914 }
@@ -1918,7 +1917,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty
19181917/// Add arbitrary "user defined" args defined from command line.
19191918/// FIXME: Determine where exactly these args need to be inserted.
19201919fn 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 ) ;
19221921}
19231922
19241923/// Add arbitrary "late link" args defined by the target spec.
@@ -1936,23 +1935,23 @@ fn add_late_link_args(
19361935 } ) ;
19371936 if any_dynamic_crate {
19381937 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) ) ;
19401939 }
19411940 } else {
19421941 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) ) ;
19441943 }
19451944 }
19461945 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) ) ;
19481947 }
19491948}
19501949
19511950/// Add arbitrary "post-link" args defined by the target spec.
19521951/// FIXME: Determine where exactly these args need to be inserted.
19531952fn add_post_link_args ( cmd : & mut dyn Linker , sess : & Session , flavor : LinkerFlavor ) {
19541953 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) ) ;
19561955 }
19571956}
19581957
@@ -2097,6 +2096,10 @@ fn add_rpath_args(
20972096 codegen_results : & CodegenResults ,
20982097 out_filename : & Path ,
20992098) {
2099+ if !sess. target . has_rpath {
2100+ return ;
2101+ }
2102+
21002103 // FIXME (#2397): At some point we want to rpath our guesses as to
21012104 // where extern libraries might live, based on the
21022105 // add_lib_search_paths
@@ -2115,11 +2118,10 @@ fn add_rpath_args(
21152118 let rpath_config = RPathConfig {
21162119 libs : & * libs,
21172120 out_filename : out_filename. to_path_buf ( ) ,
2118- has_rpath : sess. target . has_rpath ,
21192121 is_like_osx : sess. target . is_like_osx ,
21202122 linker_is_gnu : sess. target . linker_flavor . is_gnu ( ) ,
21212123 } ;
2122- cmd. args ( & rpath:: get_rpath_flags ( & rpath_config) ) ;
2124+ cmd. cc_args ( & rpath:: get_rpath_flags ( & rpath_config) ) ;
21232125 }
21242126}
21252127
@@ -2378,7 +2380,7 @@ fn add_order_independent_options(
23782380 } else {
23792381 ""
23802382 } ;
2381- cmd. arg ( format ! ( "--dynamic-linker={prefix}ld.so.1" ) ) ;
2383+ cmd. link_arg ( format ! ( "--dynamic-linker={prefix}ld.so.1" ) ) ;
23822384 }
23832385
23842386 if sess. target . eh_frame_header {
@@ -2393,31 +2395,29 @@ fn add_order_independent_options(
23932395 }
23942396
23952397 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 {
23982399 "DISABLE_EXCEPTION_CATCHING=1"
23992400 } else {
24002401 "DISABLE_EXCEPTION_CATCHING=0"
24012402 } ) ;
24022403 }
24032404
24042405 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+ ] ) ;
24092412 } 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 ] ) ;
24122414 } 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 ] ) ;
24152416 if let Some ( feat) = [ sess. opts . cg . target_feature . as_str ( ) , & sess. target . options . features ]
24162417 . into_iter ( )
24172418 . find ( |feat| !feat. is_empty ( ) )
24182419 {
2419- cmd. arg ( "--cpu-features" ) ;
2420- cmd. arg ( feat) ;
2420+ cmd. link_args ( & [ "--cpu-features" , feat] ) ;
24212421 }
24222422 }
24232423
@@ -2618,7 +2618,11 @@ fn add_native_libs_from_crate(
26182618 NativeLibKind :: WasmImportModule => { }
26192619 NativeLibKind :: LinkArg => {
26202620 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+ }
26222626 }
26232627 }
26242628 }
@@ -3012,10 +3016,10 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30123016 // This is admittedly a bit strange, as on most targets
30133017 // `-isysroot` only applies to include header files, but on Apple
30143018 // targets this also applies to libraries and frameworks.
3015- cmd. args ( & [ "-isysroot" , & sdk_root] ) ;
3019+ cmd. cc_args ( & [ "-isysroot" , & sdk_root] ) ;
30163020 }
30173021 LinkerFlavor :: Darwin ( Cc :: No , _) => {
3018- cmd. args ( & [ "-syslibroot" , & sdk_root] ) ;
3022+ cmd. link_args ( & [ "-syslibroot" , & sdk_root] ) ;
30193023 }
30203024 _ => unreachable ! ( ) ,
30213025 }
@@ -3026,8 +3030,9 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30263030 // search path.
30273031
30283032 // 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" ) ) ;
30313036 }
30323037}
30333038
@@ -3142,7 +3147,7 @@ fn add_lld_args(
31423147 for path in sess. get_tools_search_paths ( false ) {
31433148 let linker_path = path. join ( "gcc-ld" ) ;
31443149 linker_path_exists |= linker_path. exists ( ) ;
3145- cmd. arg ( {
3150+ cmd. cc_arg ( {
31463151 let mut arg = OsString :: from ( "-B" ) ;
31473152 arg. push ( linker_path) ;
31483153 arg
@@ -3162,7 +3167,7 @@ fn add_lld_args(
31623167 // is to use LLD but the `wasm32-wasip2` target relies on a wrapper around
31633168 // this, `wasm-component-ld`, which is overridden if this option is passed.
31643169 if !sess. target . is_like_wasm {
3165- cmd. arg ( "-fuse-ld=lld" ) ;
3170+ cmd. cc_arg ( "-fuse-ld=lld" ) ;
31663171 }
31673172
31683173 if !flavor. is_gnu ( ) {
@@ -3186,7 +3191,7 @@ fn add_lld_args(
31863191 // targeting a different linker flavor on macOS, and that's also always
31873192 // the case when targeting WASM.
31883193 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) ) ;
31903195 }
31913196 }
31923197}
0 commit comments