@@ -52,7 +52,7 @@ pub struct CrateLoader<'a> {
52
52
pub sess : & ' a Session ,
53
53
cstore : & ' a CStore ,
54
54
next_crate_num : CrateNum ,
55
- foreign_item_map : FxHashMap < String , Vec < ast :: NodeId > > ,
55
+ foreign_item_map : FxHashMap < String , Vec < DefIndex > > ,
56
56
local_crate_name : Symbol ,
57
57
}
58
58
@@ -310,6 +310,7 @@ impl<'a> CrateLoader<'a> {
310
310
rlib : rlib,
311
311
rmeta : rmeta,
312
312
} ,
313
+ dllimport_foreign_items : RefCell :: new ( None ) ,
313
314
} ) ;
314
315
315
316
self . cstore . set_crate_data ( cnum, cmeta. clone ( ) ) ;
@@ -640,18 +641,36 @@ impl<'a> CrateLoader<'a> {
640
641
}
641
642
}
642
643
643
- fn register_statically_included_foreign_items ( & mut self ) {
644
+ fn get_foreign_items_of_kind ( & self , kind : cstore:: NativeLibraryKind ) -> Vec < DefIndex > {
645
+ let mut items = vec ! [ ] ;
644
646
let libs = self . cstore . get_used_libraries ( ) ;
647
+ for lib in libs. borrow ( ) . iter ( ) {
648
+ if lib. kind == kind {
649
+ items. extend ( & lib. foreign_items ) ;
650
+ }
651
+ }
645
652
for ( foreign_lib, list) in self . foreign_item_map . iter ( ) {
646
- let is_static = libs. borrow ( ) . iter ( ) . any ( |lib| {
647
- lib. name == & * * foreign_lib && lib. kind == cstore :: NativeStatic
653
+ let kind_matches = libs. borrow ( ) . iter ( ) . any ( |lib| {
654
+ lib. name == & * * foreign_lib && lib. kind == kind
648
655
} ) ;
649
- if is_static {
650
- for id in list {
651
- self . cstore . add_statically_included_foreign_item ( * id) ;
652
- }
656
+ if kind_matches {
657
+ items. extend ( list)
653
658
}
654
659
}
660
+ items
661
+ }
662
+
663
+ fn register_statically_included_foreign_items ( & mut self ) {
664
+ for id in self . get_foreign_items_of_kind ( cstore:: NativeStatic ) {
665
+ self . cstore . add_statically_included_foreign_item ( id) ;
666
+ }
667
+ }
668
+
669
+ fn register_dllimport_foreign_items ( & mut self ) {
670
+ let mut dllimports = self . cstore . dllimport_foreign_items . borrow_mut ( ) ;
671
+ for id in self . get_foreign_items_of_kind ( cstore:: NativeUnknown ) {
672
+ dllimports. insert ( id) ;
673
+ }
655
674
}
656
675
657
676
fn inject_panic_runtime ( & mut self , krate : & ast:: Crate ) {
@@ -861,7 +880,8 @@ impl<'a> CrateLoader<'a> {
861
880
}
862
881
}
863
882
864
- fn process_foreign_mod ( & mut self , i : & ast:: Item , fm : & ast:: ForeignMod ) {
883
+ fn process_foreign_mod ( & mut self , i : & ast:: Item , fm : & ast:: ForeignMod ,
884
+ definitions : & Definitions ) {
865
885
if fm. abi == Abi :: Rust || fm. abi == Abi :: RustIntrinsic || fm. abi == Abi :: PlatformIntrinsic {
866
886
return ;
867
887
}
@@ -912,10 +932,14 @@ impl<'a> CrateLoader<'a> {
912
932
let cfg = cfg. map ( |list| {
913
933
list[ 0 ] . meta_item ( ) . unwrap ( ) . clone ( )
914
934
} ) ;
935
+ let foreign_items = fm. items . iter ( )
936
+ . map ( |it| definitions. opt_def_index ( it. id ) . unwrap ( ) )
937
+ . collect ( ) ;
915
938
let lib = NativeLibrary {
916
939
name : n,
917
940
kind : kind,
918
941
cfg : cfg,
942
+ foreign_items : foreign_items,
919
943
} ;
920
944
register_native_lib ( self . sess , self . cstore , Some ( m. span ) , lib) ;
921
945
}
@@ -928,7 +952,7 @@ impl<'a> CrateLoader<'a> {
928
952
} ;
929
953
let list = self . foreign_item_map . entry ( lib_name. to_string ( ) )
930
954
. or_insert ( Vec :: new ( ) ) ;
931
- list. extend ( fm. items . iter ( ) . map ( |it| it. id ) ) ;
955
+ list. extend ( fm. items . iter ( ) . map ( |it| definitions . opt_def_index ( it. id ) . unwrap ( ) ) ) ;
932
956
}
933
957
}
934
958
}
@@ -947,30 +971,34 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
947
971
name : Symbol :: intern ( name) ,
948
972
kind : kind,
949
973
cfg : None ,
974
+ foreign_items : Vec :: new ( ) ,
950
975
} ;
951
976
register_native_lib ( self . sess , self . cstore , None , lib) ;
952
977
}
953
978
self . register_statically_included_foreign_items ( ) ;
979
+ self . register_dllimport_foreign_items ( ) ;
954
980
}
955
981
956
982
fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
957
983
match item. node {
958
- ast:: ItemKind :: ExternCrate ( _) => { }
959
- ast:: ItemKind :: ForeignMod ( ref fm) => return self . process_foreign_mod ( item, fm) ,
960
- _ => return ,
961
- }
962
-
963
- let info = self . extract_crate_info ( item) . unwrap ( ) ;
964
- let ( cnum, ..) = self . resolve_crate (
965
- & None , info. ident , info. name , None , item. span , PathKind :: Crate , info. dep_kind ,
966
- ) ;
984
+ ast:: ItemKind :: ForeignMod ( ref fm) => {
985
+ self . process_foreign_mod ( item, fm, definitions)
986
+ } ,
987
+ ast:: ItemKind :: ExternCrate ( _) => {
988
+ let info = self . extract_crate_info ( item) . unwrap ( ) ;
989
+ let ( cnum, ..) = self . resolve_crate (
990
+ & None , info. ident , info. name , None , item. span , PathKind :: Crate , info. dep_kind ,
991
+ ) ;
967
992
968
- let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
969
- let len = definitions. def_path ( def_id. index ) . data . len ( ) ;
993
+ let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
994
+ let len = definitions. def_path ( def_id. index ) . data . len ( ) ;
970
995
971
- let extern_crate =
972
- ExternCrate { def_id : def_id, span : item. span , direct : true , path_len : len } ;
973
- self . update_extern_crate ( cnum, extern_crate, & mut FxHashSet ( ) ) ;
974
- self . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
996
+ let extern_crate =
997
+ ExternCrate { def_id : def_id, span : item. span , direct : true , path_len : len } ;
998
+ self . update_extern_crate ( cnum, extern_crate, & mut FxHashSet ( ) ) ;
999
+ self . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
1000
+ }
1001
+ _ => { }
1002
+ }
975
1003
}
976
1004
}
0 commit comments