6
6
7
7
//@ ignore-windows-msvc
8
8
9
- use run_make_support:: { bin_name, dynamic_lib_name, is_windows, llvm_readobj, regex, rustc} ;
9
+ //FIXME(Oneirical): This currently uses llvm-nm for symbol detection. However,
10
+ // the custom Rust-based solution of #128314 may prove to be an interesting alternative.
11
+
12
+ use run_make_support:: { bin_name, dynamic_lib_name, is_darwin, is_windows, llvm_nm, regex, rustc} ;
10
13
11
14
fn main ( ) {
12
- let mut cdylib_name = dynamic_lib_name ( "a_cdylib" ) ;
13
- let mut rdylib_name = dynamic_lib_name ( "a_rust_dylib" ) ;
15
+ let cdylib_name = dynamic_lib_name ( "a_cdylib" ) ;
16
+ let rdylib_name = dynamic_lib_name ( "a_rust_dylib" ) ;
14
17
let exe_name = bin_name ( "an_executable" ) ;
15
- let mut combined_cdylib_name = dynamic_lib_name ( "combined_rlib_dylib" ) ;
18
+ let combined_cdylib_name = dynamic_lib_name ( "combined_rlib_dylib" ) ;
16
19
rustc ( ) . arg ( "-Zshare-generics=no" ) . input ( "an_rlib.rs" ) . run ( ) ;
17
20
rustc ( ) . arg ( "-Zshare-generics=no" ) . input ( "a_cdylib.rs" ) . run ( ) ;
18
21
rustc ( ) . arg ( "-Zshare-generics=no" ) . input ( "a_rust_dylib.rs" ) . run ( ) ;
@@ -74,13 +77,13 @@ fn main() {
74
77
75
78
// Check the combined case, where we generate a cdylib and an rlib in the same
76
79
// compilation session:
77
- // Check that a cdylib exports its public // [no_mangle] functions
80
+ // Check that a cdylib exports its public # [no_mangle] functions
78
81
symbols_check (
79
82
& combined_cdylib_name,
80
83
SymbolCheckType :: StrSymbol ( "public_c_function_from_cdylib" ) ,
81
84
true ,
82
85
) ;
83
- // Check that a cdylib exports the public // [no_mangle] functions of dependencies
86
+ // Check that a cdylib exports the public # [no_mangle] functions of dependencies
84
87
symbols_check (
85
88
& combined_cdylib_name,
86
89
SymbolCheckType :: StrSymbol ( "public_c_function_from_rlib" ) ,
@@ -94,9 +97,9 @@ fn main() {
94
97
rustc ( ) . arg ( "-Zshare-generics=yes" ) . input ( "a_rust_dylib.rs" ) . run ( ) ;
95
98
rustc ( ) . arg ( "-Zshare-generics=yes" ) . input ( "an_executable.rs" ) . run ( ) ;
96
99
97
- // Check that a cdylib exports its public // [no_mangle] functions
100
+ // Check that a cdylib exports its public # [no_mangle] functions
98
101
symbols_check ( & cdylib_name, SymbolCheckType :: StrSymbol ( "public_c_function_from_cdylib" ) , true ) ;
99
- // Check that a cdylib exports the public // [no_mangle] functions of dependencies
102
+ // Check that a cdylib exports the public # [no_mangle] functions of dependencies
100
103
symbols_check ( & cdylib_name, SymbolCheckType :: StrSymbol ( "public_c_function_from_rlib" ) , true ) ;
101
104
// Check that a cdylib DOES NOT export any public Rust functions
102
105
symbols_check ( & cdylib_name, SymbolCheckType :: AnyRustSymbol , false ) ;
@@ -142,7 +145,15 @@ fn main() {
142
145
143
146
#[ track_caller]
144
147
fn symbols_check ( path : & str , symbol_check_type : SymbolCheckType , exists_once : bool ) {
145
- let out = llvm_readobj ( ) . arg ( "--dyn-symbols" ) . input ( path) . run ( ) . invalid_stdout_utf8 ( ) ;
148
+ let mut nm = llvm_nm ( ) ;
149
+ if is_windows ( ) {
150
+ nm. arg ( "--extern-only" ) ;
151
+ } else if is_darwin ( ) {
152
+ nm. arg ( "--extern-only" ) . arg ( "--defined-only" ) ;
153
+ } else {
154
+ nm. arg ( "--dynamic" ) ;
155
+ }
156
+ let out = nm. input ( path) . run ( ) . stdout_utf8 ( ) ;
146
157
assert_eq ! (
147
158
out. lines( )
148
159
. filter( |& line| !line. contains( "__imp_" ) && has_symbol( line, symbol_check_type) )
0 commit comments