2
2
3
3
use std:: path:: PathBuf ;
4
4
5
- use rustc_middle :: bug ;
5
+ use rustc_codegen_ssa :: back :: link :: linker_and_flavor ;
6
6
use rustc_session:: Session ;
7
- use rustc_target:: spec:: LinkerFlavor ;
8
7
9
8
/// Tries to infer the path of a binary for the target toolchain from the linker name.
10
9
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 {
30
29
31
30
linker
32
31
}
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
- }
0 commit comments