@@ -7,31 +7,57 @@ fn main() {
77
88 // check vanilla symbols
99 not_dynamic_symbol ( & rdylib_name, "private_vanilla_rust_function_from_rust_dylib" ) ;
10- dynamic_symbol ( & rdylib_name, "public_vanilla_rust_function_from_rust_dylib" ) ;
10+ global_function ( & rdylib_name, "public_vanilla_rust_function_from_rust_dylib" ) ;
1111 not_dynamic_symbol ( & rdylib_name, "public_vanilla_generic_function_from_rust_dylib" ) ;
1212
13+ weak_function ( & rdylib_name, "vanilla_weak_linkage" ) ;
14+ global_function ( & rdylib_name, "vanilla_external_linkage" ) ;
15+
1316 // naked should mirror vanilla
1417 not_dynamic_symbol ( & rdylib_name, "private_naked_rust_function_from_rust_dylib" ) ;
15- dynamic_symbol ( & rdylib_name, "public_naked_rust_function_from_rust_dylib" ) ;
18+ global_function ( & rdylib_name, "public_naked_rust_function_from_rust_dylib" ) ;
1619 not_dynamic_symbol ( & rdylib_name, "public_naked_generic_function_from_rust_dylib" ) ;
1720
21+ weak_function ( & rdylib_name, "naked_weak_linkage" ) ;
22+ global_function ( & rdylib_name, "naked_external_linkage" ) ;
23+
1824 // share generics should expose the generic functions
1925 rustc ( ) . arg ( "-Zshare-generics=yes" ) . input ( "a_rust_dylib.rs" ) . run ( ) ;
20- dynamic_symbol ( & rdylib_name, "public_vanilla_generic_function_from_rust_dylib" ) ;
21- dynamic_symbol ( & rdylib_name, "public_naked_generic_function_from_rust_dylib" ) ;
26+ global_function ( & rdylib_name, "public_vanilla_generic_function_from_rust_dylib" ) ;
27+ global_function ( & rdylib_name, "public_naked_generic_function_from_rust_dylib" ) ;
2228}
2329
2430#[ track_caller]
25- fn dynamic_symbol ( path : & str , symbol_name : & str ) {
26- assert_eq ! ( find_dynamic_symbol( path, symbol_name) , 1 )
31+ fn global_function ( path : & str , symbol_name : & str ) {
32+ let lines = find_dynamic_symbol ( path, symbol_name) ;
33+ let [ line] = lines. as_slice ( ) else {
34+ panic ! ( "symbol {symbol_name} occurs {} times" , lines. len( ) )
35+ } ;
36+
37+ assert ! ( line. contains( "FUNC" ) , "`{symbol_name}` is not a function" ) ;
38+ assert ! ( line. contains( "GLOBAL" ) , "`{symbol_name}` is not marked as global" ) ;
39+ }
40+
41+ #[ track_caller]
42+ fn weak_function ( path : & str , symbol_name : & str ) {
43+ let lines = find_dynamic_symbol ( path, symbol_name) ;
44+ let [ line] = lines. as_slice ( ) else {
45+ panic ! ( "symbol {symbol_name} occurs {} times" , lines. len( ) )
46+ } ;
47+
48+ assert ! ( line. contains( "FUNC" ) , "`{symbol_name}` is not a function" ) ;
49+ assert ! ( line. contains( "WEAK" ) , "`{symbol_name}` is not marked as weak" ) ;
2750}
2851
2952#[ track_caller]
3053fn not_dynamic_symbol ( path : & str , symbol_name : & str ) {
31- assert_eq ! ( find_dynamic_symbol( path, symbol_name) , 0 )
54+ assert_eq ! ( find_dynamic_symbol( path, symbol_name) . len ( ) , 0 )
3255}
3356
34- fn find_dynamic_symbol ( path : & str , symbol_name : & str ) -> usize {
57+ fn find_dynamic_symbol < ' a > ( path : & str , symbol_name : & str ) -> Vec < String > {
3558 let out = llvm_readobj ( ) . arg ( "--dyn-symbols" ) . input ( path) . run ( ) . stdout_utf8 ( ) ;
36- out. lines ( ) . filter ( |& line| !line. contains ( "__imp_" ) && line. contains ( symbol_name) ) . count ( )
59+ out. lines ( )
60+ . filter ( |& line| !line. contains ( "__imp_" ) && line. contains ( symbol_name) )
61+ . map ( |line| line. to_string ( ) )
62+ . collect ( )
3763}
0 commit comments