@@ -11,7 +11,6 @@ use std::str;
11
11
use crate :: llvm:: archive_ro:: { ArchiveRO , Child } ;
12
12
use crate :: llvm:: { self , ArchiveKind , LLVMMachineType , LLVMRustCOFFShortExport } ;
13
13
use rustc_codegen_ssa:: back:: archive:: ArchiveBuilder ;
14
- use rustc_data_structures:: temp_dir:: MaybeTempDir ;
15
14
use rustc_session:: cstore:: { DllCallingConvention , DllImport } ;
16
15
use rustc_session:: Session ;
17
16
@@ -96,19 +95,23 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
96
95
}
97
96
}
98
97
99
- fn inject_dll_import_lib (
100
- & mut self ,
98
+ fn sess ( & self ) -> & Session {
99
+ self . sess
100
+ }
101
+
102
+ fn create_dll_import_lib (
103
+ sess : & Session ,
101
104
lib_name : & str ,
102
105
dll_imports : & [ DllImport ] ,
103
- tmpdir : & MaybeTempDir ,
104
- ) {
106
+ tmpdir : & Path ,
107
+ ) -> PathBuf {
105
108
let output_path = {
106
- let mut output_path: PathBuf = tmpdir. as_ref ( ) . to_path_buf ( ) ;
109
+ let mut output_path: PathBuf = tmpdir. to_path_buf ( ) ;
107
110
output_path. push ( format ! ( "{}_imports" , lib_name) ) ;
108
111
output_path. with_extension ( "lib" )
109
112
} ;
110
113
111
- let target = & self . sess . target ;
114
+ let target = & sess. target ;
112
115
let mingw_gnu_toolchain = target. vendor == "pc"
113
116
&& target. os == "windows"
114
117
&& target. env == "gnu"
@@ -117,7 +120,7 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
117
120
let import_name_and_ordinal_vector: Vec < ( String , Option < u16 > ) > = dll_imports
118
121
. iter ( )
119
122
. map ( |import : & DllImport | {
120
- if self . sess . target . arch == "x86" {
123
+ if sess. target . arch == "x86" {
121
124
(
122
125
LlvmArchiveBuilder :: i686_decorated_name ( import, mingw_gnu_toolchain) ,
123
126
import. ordinal ,
@@ -134,8 +137,7 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
134
137
// that loaded but crashed with an AV upon calling one of the imported
135
138
// functions. Therefore, use binutils to create the import library instead,
136
139
// by writing a .DEF file to the temp dir and calling binutils's dlltool.
137
- let def_file_path =
138
- tmpdir. as_ref ( ) . join ( format ! ( "{}_imports" , lib_name) ) . with_extension ( "def" ) ;
140
+ let def_file_path = tmpdir. join ( format ! ( "{}_imports" , lib_name) ) . with_extension ( "def" ) ;
139
141
140
142
let def_file_content = format ! (
141
143
"EXPORTS\n {}" ,
@@ -154,11 +156,11 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
154
156
match std:: fs:: write ( & def_file_path, def_file_content) {
155
157
Ok ( _) => { }
156
158
Err ( e) => {
157
- self . sess . fatal ( & format ! ( "Error writing .DEF file: {}" , e) ) ;
159
+ sess. fatal ( & format ! ( "Error writing .DEF file: {}" , e) ) ;
158
160
}
159
161
} ;
160
162
161
- let dlltool = find_binutils_dlltool ( self . sess ) ;
163
+ let dlltool = find_binutils_dlltool ( sess) ;
162
164
let result = std:: process:: Command :: new ( dlltool)
163
165
. args ( [
164
166
"-d" ,
@@ -172,9 +174,9 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
172
174
173
175
match result {
174
176
Err ( e) => {
175
- self . sess . fatal ( & format ! ( "Error calling dlltool: {}" , e) ) ;
177
+ sess. fatal ( & format ! ( "Error calling dlltool: {}" , e) ) ;
176
178
}
177
- Ok ( output) if !output. status . success ( ) => self . sess . fatal ( & format ! (
179
+ Ok ( output) if !output. status . success ( ) => sess. fatal ( & format ! (
178
180
"Dlltool could not create import library: {}\n {}" ,
179
181
String :: from_utf8_lossy( & output. stdout) ,
180
182
String :: from_utf8_lossy( & output. stderr)
@@ -220,27 +222,21 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
220
222
output_path_z. as_ptr ( ) ,
221
223
ffi_exports. as_ptr ( ) ,
222
224
ffi_exports. len ( ) ,
223
- llvm_machine_type ( & self . sess . target . arch ) as u16 ,
224
- !self . sess . target . is_like_msvc ,
225
+ llvm_machine_type ( & sess. target . arch ) as u16 ,
226
+ !sess. target . is_like_msvc ,
225
227
)
226
228
} ;
227
229
228
230
if result == crate :: llvm:: LLVMRustResult :: Failure {
229
- self . sess . fatal ( & format ! (
231
+ sess. fatal ( & format ! (
230
232
"Error creating import library for {}: {}" ,
231
233
lib_name,
232
234
llvm:: last_error( ) . unwrap_or( "unknown LLVM error" . to_string( ) )
233
235
) ) ;
234
236
}
235
237
} ;
236
238
237
- self . add_archive ( & output_path, |_| false ) . unwrap_or_else ( |e| {
238
- self . sess . fatal ( & format ! (
239
- "failed to add native library {}: {}" ,
240
- output_path. display( ) ,
241
- e
242
- ) ) ;
243
- } ) ;
239
+ output_path
244
240
}
245
241
}
246
242
0 commit comments