Skip to content

Commit 76fbc12

Browse files
committed
rustc_target: Add clang linker flavors
1 parent ce1f2cc commit 76fbc12

File tree

4 files changed

+41
-20
lines changed

4 files changed

+41
-20
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ fn link_natively<'a>(
788788
// then it should not default to linking executables as pie. Different
789789
// versions of gcc seem to use different quotes in the error message so
790790
// don't check for them.
791-
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))
791+
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _))
792792
&& unknown_arg_regex.is_match(&out)
793793
&& out.contains("-no-pie")
794794
&& cmd.get_args().iter().any(|e| e.to_string_lossy() == "-no-pie")
@@ -806,7 +806,7 @@ fn link_natively<'a>(
806806

807807
// Detect '-static-pie' used with an older version of gcc or clang not supporting it.
808808
// Fallback from '-static-pie' to '-static' in that case.
809-
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))
809+
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _))
810810
&& unknown_arg_regex.is_match(&out)
811811
&& (out.contains("-static-pie") || out.contains("--no-dynamic-linker"))
812812
&& cmd.get_args().iter().any(|e| e.to_string_lossy() == "-static-pie")
@@ -1318,6 +1318,10 @@ pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
13181318
"cc"
13191319
}
13201320
}
1321+
LinkerFlavor::Gnu(Cc::Clang, _)
1322+
| LinkerFlavor::Darwin(Cc::Clang, _)
1323+
| LinkerFlavor::WasmLld(Cc::Clang)
1324+
| LinkerFlavor::Unix(Cc::Clang) => "clang",
13211325
LinkerFlavor::Gnu(_, Lld::Yes)
13221326
| LinkerFlavor::Darwin(_, Lld::Yes)
13231327
| LinkerFlavor::WasmLld(..)
@@ -1778,7 +1782,9 @@ fn add_pre_link_objects(
17781782
let empty = Default::default();
17791783
let objects = if self_contained {
17801784
&opts.pre_link_objects_self_contained
1781-
} else if !(sess.target.os == "fuchsia" && matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))) {
1785+
} else if !(sess.target.os == "fuchsia"
1786+
&& matches!(flavor, LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _)))
1787+
{
17821788
&opts.pre_link_objects
17831789
} else {
17841790
&empty
@@ -2287,7 +2293,7 @@ fn add_order_independent_options(
22872293

22882294
if sess.target.os == "fuchsia"
22892295
&& crate_type == CrateType::Executable
2290-
&& !matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))
2296+
&& !matches!(flavor, LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _))
22912297
{
22922298
let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
22932299
"asan/"
@@ -2923,7 +2929,7 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
29232929
};
29242930

29252931
match flavor {
2926-
LinkerFlavor::Darwin(Cc::Yes, _) => {
2932+
LinkerFlavor::Darwin(Cc::Yes | Cc::Clang, _) => {
29272933
cmd.args(&["-isysroot", &sdk_root, "-Wl,-syslibroot", &sdk_root]);
29282934
}
29292935
LinkerFlavor::Darwin(Cc::No, _) => {

compiler/rustc_target/src/spec/mod.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub use base::avr_gnu::ef_avr_arch;
6565
/// Linker is called through a C/C++ compiler.
6666
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
6767
pub enum Cc {
68+
Clang,
6869
Yes,
6970
No,
7071
}
@@ -244,10 +245,10 @@ impl LinkerFlavor {
244245
/// Returns the corresponding backwards-compatible CLI flavor.
245246
fn to_cli(self) -> LinkerFlavorCli {
246247
match self {
247-
LinkerFlavor::Gnu(Cc::Yes, _)
248-
| LinkerFlavor::Darwin(Cc::Yes, _)
249-
| LinkerFlavor::WasmLld(Cc::Yes)
250-
| LinkerFlavor::Unix(Cc::Yes) => LinkerFlavorCli::Gcc,
248+
LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _)
249+
| LinkerFlavor::Darwin(Cc::Yes | Cc::Clang, _)
250+
| LinkerFlavor::WasmLld(Cc::Yes | Cc::Clang)
251+
| LinkerFlavor::Unix(Cc::Yes | Cc::Clang) => LinkerFlavorCli::Gcc,
251252
LinkerFlavor::Gnu(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld),
252253
LinkerFlavor::Darwin(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld64),
253254
LinkerFlavor::WasmLld(..) => LinkerFlavorCli::Lld(LldFlavor::Wasm),
@@ -308,12 +309,14 @@ impl LinkerFlavor {
308309
|| stem.ends_with("-gcc")
309310
|| stem == "g++"
310311
|| stem.ends_with("-g++")
311-
|| stem == "clang"
312+
{
313+
(Some(Cc::Yes), Some(Lld::No))
314+
} else if stem == "clang"
312315
|| stem.ends_with("-clang")
313316
|| stem == "clang++"
314317
|| stem.ends_with("-clang++")
315318
{
316-
(Some(Cc::Yes), Some(Lld::No))
319+
(Some(Cc::Clang), Some(Lld::No))
317320
} else if stem == "wasm-ld"
318321
|| stem.ends_with("-wasm-ld")
319322
|| stem == "ld.lld"
@@ -420,10 +423,10 @@ impl LinkerFlavor {
420423
pub fn uses_cc(self) -> bool {
421424
// Exhaustive match in case new flavors are added in the future.
422425
match self {
423-
LinkerFlavor::Gnu(Cc::Yes, _)
424-
| LinkerFlavor::Darwin(Cc::Yes, _)
425-
| LinkerFlavor::WasmLld(Cc::Yes)
426-
| LinkerFlavor::Unix(Cc::Yes)
426+
LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, _)
427+
| LinkerFlavor::Darwin(Cc::Yes | Cc::Clang, _)
428+
| LinkerFlavor::WasmLld(Cc::Yes | Cc::Clang)
429+
| LinkerFlavor::Unix(Cc::Yes | Cc::Clang)
427430
| LinkerFlavor::EmCc => true,
428431
LinkerFlavor::Gnu(..)
429432
| LinkerFlavor::Darwin(..)
@@ -468,14 +471,20 @@ linker_flavor_cli_impls! {
468471
(LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
469472
(LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
470473
(LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
474+
(LinkerFlavorCli::Gnu(Cc::Clang, Lld::No)) "gnu-clang"
475+
(LinkerFlavorCli::Gnu(Cc::Clang, Lld::Yes)) "gnu-lld-clang"
471476
(LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
472477
(LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
473478
(LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
474479
(LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
480+
(LinkerFlavorCli::Darwin(Cc::Clang, Lld::No)) "darwin-clang"
481+
(LinkerFlavorCli::Darwin(Cc::Clang, Lld::Yes)) "darwin-lld-clang"
475482
(LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
476483
(LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
484+
(LinkerFlavorCli::WasmLld(Cc::Clang)) "wasm-lld-clang"
477485
(LinkerFlavorCli::Unix(Cc::No)) "unix"
478486
(LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
487+
(LinkerFlavorCli::Unix(Cc::Clang)) "unix-clang"
479488
(LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
480489
(LinkerFlavorCli::Msvc(Lld::No)) "msvc"
481490
(LinkerFlavorCli::EmCc) "em-cc"

compiler/rustc_target/src/spec/tests/tests_impl.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,21 @@ impl Target {
7373
};
7474

7575
match self.linker_flavor {
76-
LinkerFlavor::Gnu(Cc::Yes, lld) => check_noncc(LinkerFlavor::Gnu(Cc::No, lld)),
77-
LinkerFlavor::WasmLld(Cc::Yes) => check_noncc(LinkerFlavor::WasmLld(Cc::No)),
78-
LinkerFlavor::Unix(Cc::Yes) => check_noncc(LinkerFlavor::Unix(Cc::No)),
76+
LinkerFlavor::Gnu(Cc::Yes | Cc::Clang, lld) => {
77+
check_noncc(LinkerFlavor::Gnu(Cc::No, lld))
78+
}
79+
LinkerFlavor::WasmLld(Cc::Yes | Cc::Clang) => {
80+
check_noncc(LinkerFlavor::WasmLld(Cc::No))
81+
}
82+
LinkerFlavor::Unix(Cc::Yes | Cc::Clang) => {
83+
check_noncc(LinkerFlavor::Unix(Cc::No))
84+
}
7985
_ => {}
8086
}
8187
}
8288

8389
// Check that link args for lld and non-lld versions of flavors are consistent.
84-
for cc in [Cc::No, Cc::Yes] {
90+
for cc in [Cc::No, Cc::Yes, Cc::Clang] {
8591
assert_eq!(
8692
args.get(&LinkerFlavor::Gnu(cc, Lld::No)),
8793
args.get(&LinkerFlavor::Gnu(cc, Lld::Yes)),
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
error: linker flavor `msvc` is incompatible with the current target
22
|
3-
= note: compatible flavors are: gnu, gnu-lld, gnu-cc, gnu-lld-cc, gcc, ld, ld.lld
3+
= note: compatible flavors are: gnu, gnu-lld, gnu-cc, gnu-lld-cc, gnu-clang, gnu-lld-clang, gcc, ld, ld.lld
44

55
error: aborting due to 1 previous error
66

0 commit comments

Comments
 (0)