Skip to content

Commit 7d05d1e

Browse files
committed
Consider only libs that aren't excluded by #[link(cfg=...)]
1 parent b700dd3 commit 7d05d1e

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

src/librustc_metadata/creader.rs

+20-4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ fn register_native_lib(sess: &Session,
113113
cstore.add_used_library(lib);
114114
}
115115

116+
fn relevant_lib(sess: &Session, lib: &NativeLibrary) -> bool {
117+
match lib.cfg {
118+
Some(ref cfg) => attr::cfg_matches(cfg, &sess.parse_sess, None),
119+
None => true,
120+
}
121+
}
122+
116123
// Extra info about a crate loaded for plugins or exported macros.
117124
struct ExtensionCrate {
118125
metadata: PMDSource,
@@ -290,7 +297,7 @@ impl<'a> CrateLoader<'a> {
290297

291298
let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind);
292299

293-
let cmeta = Rc::new(cstore::CrateMetadata {
300+
let mut cmeta = cstore::CrateMetadata {
294301
name: name,
295302
extern_crate: Cell::new(None),
296303
key_map: metadata.load_key_map(crate_root.index),
@@ -308,9 +315,18 @@ impl<'a> CrateLoader<'a> {
308315
rlib: rlib,
309316
rmeta: rmeta,
310317
},
311-
dllimport_foreign_items: RefCell::new(None),
312-
});
318+
dllimport_foreign_items: FxHashSet(),
319+
};
320+
321+
let dllimports: Vec<_> = cmeta.get_native_libraries().iter()
322+
.filter(|lib| relevant_lib(self.sess, lib) &&
323+
lib.kind == cstore::NativeLibraryKind::NativeUnknown)
324+
.flat_map(|lib| &lib.foreign_items)
325+
.map(|id| *id)
326+
.collect();
327+
cmeta.dllimport_foreign_items.extend(dllimports);
313328

329+
let cmeta = Rc::new(cmeta);
314330
self.cstore.set_crate_data(cnum, cmeta.clone());
315331
(cnum, cmeta)
316332
}
@@ -643,7 +659,7 @@ impl<'a> CrateLoader<'a> {
643659
let mut items = vec![];
644660
let libs = self.cstore.get_used_libraries();
645661
for lib in libs.borrow().iter() {
646-
if lib.kind == kind {
662+
if relevant_lib(self.sess, lib) && lib.kind == kind {
647663
items.extend(&lib.foreign_items);
648664
}
649665
}

src/librustc_metadata/cstore.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ pub struct CrateMetadata {
8585

8686
pub proc_macros: Option<Vec<(ast::Name, Rc<SyntaxExtension>)>>,
8787
// Foreign items imported from a dylib (Windows only)
88-
pub dllimport_foreign_items: RefCell<Option<FxHashSet<DefIndex>>>,
88+
pub dllimport_foreign_items: FxHashSet<DefIndex>,
8989
}
9090

9191
pub struct CachedInlinedItem {

src/librustc_metadata/decoder.rs

+3-12
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
// Decoding metadata from a single crate's metadata
1212

1313
use astencode::decode_inlined_item;
14-
use cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary, NativeLibraryKind};
14+
use cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary};
1515
use index::Index;
1616
use schema::*;
1717

1818
use rustc::hir::map as hir_map;
1919
use rustc::hir::map::{DefKey, DefPathData};
20-
use rustc::util::nodemap::{FxHashMap, FxHashSet};
20+
use rustc::util::nodemap::FxHashMap;
2121
use rustc::hir;
2222
use rustc::hir::intravisit::IdRange;
2323

@@ -36,7 +36,6 @@ use rustc::mir::Mir;
3636
use std::borrow::Cow;
3737
use std::cell::Ref;
3838
use std::io;
39-
use std::iter::FromIterator;
4039
use std::mem;
4140
use std::str;
4241
use std::u32;
@@ -1089,15 +1088,7 @@ impl<'a, 'tcx> CrateMetadata {
10891088
}
10901089

10911090
pub fn is_dllimport_foreign_item(&self, id: DefIndex) -> bool {
1092-
if self.dllimport_foreign_items.borrow().is_none() {
1093-
*self.dllimport_foreign_items.borrow_mut() = Some(FxHashSet::from_iter(
1094-
self.get_native_libraries().iter()
1095-
.filter(|lib| lib.kind == NativeLibraryKind::NativeUnknown)
1096-
.flat_map(|lib| &lib.foreign_items)
1097-
.map(|id| *id)
1098-
));
1099-
}
1100-
self.dllimport_foreign_items.borrow().as_ref().unwrap().contains(&id)
1091+
self.dllimport_foreign_items.contains(&id)
11011092
}
11021093

11031094
pub fn is_defaulted_trait(&self, trait_id: DefIndex) -> bool {

0 commit comments

Comments
 (0)