Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 8ae1638

Browse files
authoredJun 6, 2021
Rollup merge of rust-lang#86016 - luqmana:infer-linker-flavor, r=petrochenkov
Unify duplicate linker_and_flavor methods in rustc_codegen_{cranelift,ssa}. The two methods were exactly the same so this removes the cranelift copy. This will help make sure both they don't get out of sync.
2 parents 2ab7433 + a26f003 commit 8ae1638

File tree

2 files changed

+3
-90
lines changed

2 files changed

+3
-90
lines changed
 

Diff for: ‎compiler/rustc_codegen_cranelift/src/toolchain.rs

+1-89
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
33
use std::path::PathBuf;
44

5-
use rustc_middle::bug;
5+
use rustc_codegen_ssa::back::link::linker_and_flavor;
66
use rustc_session::Session;
7-
use rustc_target::spec::LinkerFlavor;
87

98
/// Tries to infer the path of a binary for the target toolchain from the linker name.
109
pub(crate) fn get_toolchain_binary(sess: &Session, tool: &str) -> PathBuf {
@@ -30,90 +29,3 @@ pub(crate) fn get_toolchain_binary(sess: &Session, tool: &str) -> PathBuf {
3029

3130
linker
3231
}
33-
34-
// Adapted from https://github.com/rust-lang/rust/blob/5db778affee7c6600c8e7a177c48282dab3f6292/src/librustc_codegen_ssa/back/link.rs#L848-L931
35-
fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
36-
fn infer_from(
37-
sess: &Session,
38-
linker: Option<PathBuf>,
39-
flavor: Option<LinkerFlavor>,
40-
) -> Option<(PathBuf, LinkerFlavor)> {
41-
match (linker, flavor) {
42-
(Some(linker), Some(flavor)) => Some((linker, flavor)),
43-
// only the linker flavor is known; use the default linker for the selected flavor
44-
(None, Some(flavor)) => Some((
45-
PathBuf::from(match flavor {
46-
LinkerFlavor::Em => {
47-
if cfg!(windows) {
48-
"emcc.bat"
49-
} else {
50-
"emcc"
51-
}
52-
}
53-
LinkerFlavor::Gcc => {
54-
if cfg!(any(target_os = "solaris", target_os = "illumos")) {
55-
// On historical Solaris systems, "cc" may have
56-
// been Sun Studio, which is not flag-compatible
57-
// with "gcc". This history casts a long shadow,
58-
// and many modern illumos distributions today
59-
// ship GCC as "gcc" without also making it
60-
// available as "cc".
61-
"gcc"
62-
} else {
63-
"cc"
64-
}
65-
}
66-
LinkerFlavor::Ld => "ld",
67-
LinkerFlavor::Msvc => "link.exe",
68-
LinkerFlavor::Lld(_) => "lld",
69-
LinkerFlavor::PtxLinker => "rust-ptx-linker",
70-
LinkerFlavor::BpfLinker => "bpf-linker",
71-
}),
72-
flavor,
73-
)),
74-
(Some(linker), None) => {
75-
let stem = linker.file_stem().and_then(|stem| stem.to_str()).unwrap_or_else(|| {
76-
sess.fatal("couldn't extract file stem from specified linker")
77-
});
78-
79-
let flavor = if stem == "emcc" {
80-
LinkerFlavor::Em
81-
} else if stem == "gcc"
82-
|| stem.ends_with("-gcc")
83-
|| stem == "clang"
84-
|| stem.ends_with("-clang")
85-
{
86-
LinkerFlavor::Gcc
87-
} else if stem == "ld" || stem == "ld.lld" || stem.ends_with("-ld") {
88-
LinkerFlavor::Ld
89-
} else if stem == "link" || stem == "lld-link" {
90-
LinkerFlavor::Msvc
91-
} else if stem == "lld" || stem == "rust-lld" {
92-
LinkerFlavor::Lld(sess.target.lld_flavor)
93-
} else {
94-
// fall back to the value in the target spec
95-
sess.target.linker_flavor
96-
};
97-
98-
Some((linker, flavor))
99-
}
100-
(None, None) => None,
101-
}
102-
}
103-
104-
// linker and linker flavor specified via command line have precedence over what the target
105-
// specification specifies
106-
if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), sess.opts.cg.linker_flavor) {
107-
return ret;
108-
}
109-
110-
if let Some(ret) = infer_from(
111-
sess,
112-
sess.target.linker.clone().map(PathBuf::from),
113-
Some(sess.target.linker_flavor),
114-
) {
115-
return ret;
116-
}
117-
118-
bug!("Not enough information provided to determine how to invoke the linker");
119-
}

Diff for: ‎compiler/rustc_codegen_ssa/src/back/link.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,8 @@ pub fn ignored_for_lto(sess: &Session, info: &CrateInfo, cnum: CrateNum) -> bool
11471147
&& (info.compiler_builtins == Some(cnum) || info.is_no_builtins.contains(&cnum))
11481148
}
11491149

1150-
fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
1150+
// This functions tries to determine the appropriate linker (and corresponding LinkerFlavor) to use
1151+
pub fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
11511152
fn infer_from(
11521153
sess: &Session,
11531154
linker: Option<PathBuf>,

0 commit comments

Comments
 (0)
Please sign in to comment.