diff options
| author | Vadim Chugunov <vadimcn@gmail.com> | 2016-12-05 10:15:14 -0800 |
|---|---|---|
| committer | Vadim Chugunov <vadimcn@gmail.com> | 2016-12-05 16:44:27 -0800 |
| commit | 7d05d1e7f0add9e5151d48d51d92b6fb5885e257 (patch) | |
| tree | 96d6ce1c413c605d8c1b4d1121283171cc41767d /src | |
| parent | b700dd35e7fe9f3a987cca47a00ac0bdd1cfd425 (diff) | |
| download | rust-7d05d1e7f0add9e5151d48d51d92b6fb5885e257.tar.gz rust-7d05d1e7f0add9e5151d48d51d92b6fb5885e257.zip | |
Consider only libs that aren't excluded by #[link(cfg=...)]
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_metadata/creader.rs | 24 | ||||
| -rw-r--r-- | src/librustc_metadata/cstore.rs | 2 | ||||
| -rw-r--r-- | src/librustc_metadata/decoder.rs | 15 |
3 files changed, 24 insertions, 17 deletions
diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 691bec19994..d36242537b8 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -113,6 +113,13 @@ fn register_native_lib(sess: &Session, cstore.add_used_library(lib); } +fn relevant_lib(sess: &Session, lib: &NativeLibrary) -> bool { + match lib.cfg { + Some(ref cfg) => attr::cfg_matches(cfg, &sess.parse_sess, None), + None => true, + } +} + // Extra info about a crate loaded for plugins or exported macros. struct ExtensionCrate { metadata: PMDSource, @@ -290,7 +297,7 @@ impl<'a> CrateLoader<'a> { let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind); - let cmeta = Rc::new(cstore::CrateMetadata { + let mut cmeta = cstore::CrateMetadata { name: name, extern_crate: Cell::new(None), key_map: metadata.load_key_map(crate_root.index), @@ -308,9 +315,18 @@ impl<'a> CrateLoader<'a> { rlib: rlib, rmeta: rmeta, }, - dllimport_foreign_items: RefCell::new(None), - }); + dllimport_foreign_items: FxHashSet(), + }; + + let dllimports: Vec<_> = cmeta.get_native_libraries().iter() + .filter(|lib| relevant_lib(self.sess, lib) && + lib.kind == cstore::NativeLibraryKind::NativeUnknown) + .flat_map(|lib| &lib.foreign_items) + .map(|id| *id) + .collect(); + cmeta.dllimport_foreign_items.extend(dllimports); + let cmeta = Rc::new(cmeta); self.cstore.set_crate_data(cnum, cmeta.clone()); (cnum, cmeta) } @@ -643,7 +659,7 @@ impl<'a> CrateLoader<'a> { let mut items = vec![]; let libs = self.cstore.get_used_libraries(); for lib in libs.borrow().iter() { - if lib.kind == kind { + if relevant_lib(self.sess, lib) && lib.kind == kind { items.extend(&lib.foreign_items); } } diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 279ef5bfb72..7700ebde181 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -85,7 +85,7 @@ pub struct CrateMetadata { pub proc_macros: Option<Vec<(ast::Name, Rc<SyntaxExtension>)>>, // Foreign items imported from a dylib (Windows only) - pub dllimport_foreign_items: RefCell<Option<FxHashSet<DefIndex>>>, + pub dllimport_foreign_items: FxHashSet<DefIndex>, } pub struct CachedInlinedItem { diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index f8f80a60c16..5bd1dea1d79 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -11,13 +11,13 @@ // Decoding metadata from a single crate's metadata use astencode::decode_inlined_item; -use cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary, NativeLibraryKind}; +use cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary}; use index::Index; use schema::*; use rustc::hir::map as hir_map; use rustc::hir::map::{DefKey, DefPathData}; -use rustc::util::nodemap::{FxHashMap, FxHashSet}; +use rustc::util::nodemap::FxHashMap; use rustc::hir; use rustc::hir::intravisit::IdRange; @@ -36,7 +36,6 @@ use rustc::mir::Mir; use std::borrow::Cow; use std::cell::Ref; use std::io; -use std::iter::FromIterator; use std::mem; use std::str; use std::u32; @@ -1089,15 +1088,7 @@ impl<'a, 'tcx> CrateMetadata { } pub fn is_dllimport_foreign_item(&self, id: DefIndex) -> bool { - if self.dllimport_foreign_items.borrow().is_none() { - *self.dllimport_foreign_items.borrow_mut() = Some(FxHashSet::from_iter( - self.get_native_libraries().iter() - .filter(|lib| lib.kind == NativeLibraryKind::NativeUnknown) - .flat_map(|lib| &lib.foreign_items) - .map(|id| *id) - )); - } - self.dllimport_foreign_items.borrow().as_ref().unwrap().contains(&id) + self.dllimport_foreign_items.contains(&id) } pub fn is_defaulted_trait(&self, trait_id: DefIndex) -> bool { |
