Skip to content

Commit 0a16e4b

Browse files
committed
infer linker flavor by linker name if it's sufficiently specific
1 parent 6dd75f0 commit 0a16e4b

File tree

1 file changed

+27
-16
lines changed
  • compiler/rustc_target/src/spec

1 file changed

+27
-16
lines changed

compiler/rustc_target/src/spec/mod.rs

+27-16
Original file line numberDiff line numberDiff line change
@@ -311,16 +311,32 @@ impl LinkerFlavor {
311311
}
312312
}
313313

314-
fn infer_linker_hints(linker_stem: &str) -> (Option<Cc>, Option<Lld>) {
314+
fn infer_linker_hints(linker_stem: &str) -> Result<Self, (Option<Cc>, Option<Lld>)> {
315315
// Remove any version postfix.
316316
let stem = linker_stem
317317
.rsplit_once('-')
318318
.and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
319319
.unwrap_or(linker_stem);
320320

321-
// GCC/Clang can have an optional target prefix.
322-
if stem == "emcc"
323-
|| stem == "gcc"
321+
if stem == "ld.lld" {
322+
Ok(Self::Gnu(Cc::No, Lld::Yes))
323+
} else if stem == "ld64.lld" {
324+
Ok(Self::Darwin(Cc::No, Lld::Yes))
325+
} else if stem == "lld-link" {
326+
Ok(Self::Msvc(Lld::Yes))
327+
} else if stem == "wasm-ld" || stem == "wasm-component-ld" {
328+
Ok(Self::WasmLld(Cc::No))
329+
} else if stem == "lld" || stem == "rust-lld" {
330+
Err((Some(Cc::No), Some(Lld::Yes)))
331+
} else if stem == "emcc" {
332+
Ok(Self::EmCc)
333+
} else if stem == "bpf-linker" {
334+
Ok(Self::Bpf)
335+
} else if stem == "llvm-bitcode-linker" {
336+
Ok(Self::Llbc)
337+
} else if stem == "rust-ptx-linker" {
338+
Ok(Self::Ptx)
339+
} else if stem == "gcc" // GCC/Clang can have an optional target prefix.
324340
|| stem.ends_with("-gcc")
325341
|| stem == "g++"
326342
|| stem.ends_with("-g++")
@@ -329,19 +345,11 @@ impl LinkerFlavor {
329345
|| stem == "clang++"
330346
|| stem.ends_with("-clang++")
331347
{
332-
(Some(Cc::Yes), Some(Lld::No))
333-
} else if stem == "wasm-ld"
334-
|| stem.ends_with("-wasm-ld")
335-
|| stem == "ld.lld"
336-
|| stem == "lld"
337-
|| stem == "rust-lld"
338-
|| stem == "lld-link"
339-
{
340-
(Some(Cc::No), Some(Lld::Yes))
348+
Err((Some(Cc::Yes), Some(Lld::No)))
341349
} else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
342-
(Some(Cc::No), Some(Lld::No))
350+
Err((Some(Cc::No), Some(Lld::No)))
343351
} else {
344-
(None, None)
352+
Err((None, None))
345353
}
346354
}
347355

@@ -365,7 +373,10 @@ impl LinkerFlavor {
365373
}
366374

367375
pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
368-
self.with_hints(LinkerFlavor::infer_linker_hints(linker_stem))
376+
match LinkerFlavor::infer_linker_hints(linker_stem) {
377+
Ok(linker_flavor) => linker_flavor,
378+
Err(hints) => self.with_hints(hints),
379+
}
369380
}
370381

371382
pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {

0 commit comments

Comments
 (0)