From 02c7b117dadcfea4416f53b4bd99828bf750871f Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Mon, 9 Jan 2017 09:46:24 -0500 Subject: [PATCH] metadata: Add is_exported_symbol() method to CrateStore. --- src/librustc/middle/cstore.rs | 2 ++ src/librustc_metadata/creader.rs | 3 +++ src/librustc_metadata/cstore.rs | 2 ++ src/librustc_metadata/cstore_impl.rs | 12 ++++++++++-- src/librustc_metadata/decoder.rs | 2 +- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 7151e5226ca..19dafcd887e 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -211,6 +211,7 @@ fn custom_coerce_unsized_kind(&self, def: DefId) fn is_foreign_item(&self, did: DefId) -> bool; fn is_dllimport_foreign_item(&self, def: DefId) -> bool; fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool; + fn is_exported_symbol(&self, def_id: DefId) -> bool; // crate metadata fn dylib_dependency_formats(&self, cnum: CrateNum) @@ -368,6 +369,7 @@ fn is_default_impl(&self, impl_did: DefId) -> bool { bug!("is_default_impl") } fn is_foreign_item(&self, did: DefId) -> bool { bug!("is_foreign_item") } fn is_dllimport_foreign_item(&self, id: DefId) -> bool { false } fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool { false } + fn is_exported_symbol(&self, def_id: DefId) -> bool { false } // crate metadata fn dylib_dependency_formats(&self, cnum: CrateNum) diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 724c164b3b4..8f7b9c24cbf 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -302,10 +302,13 @@ fn register_crate(&mut self, crate_root.def_path_table.decode(&metadata) }); + let exported_symbols = crate_root.exported_symbols.decode(&metadata).collect(); + let mut cmeta = cstore::CrateMetadata { name: name, extern_crate: Cell::new(None), def_path_table: def_path_table, + exported_symbols: exported_symbols, proc_macros: crate_root.macro_derive_registrar.map(|_| { self.load_derive_macros(&crate_root, dylib.clone().map(|p| p.0), span) }), diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index efc19abb33e..761041ad719 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -80,6 +80,8 @@ pub struct CrateMetadata { /// compilation support. pub def_path_table: DefPathTable, + pub exported_symbols: FxHashSet, + pub dep_kind: Cell, pub source: CrateSource, diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 3d025e984b0..1dcb1689d49 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -226,6 +226,10 @@ fn is_statically_included_foreign_item(&self, def_id: DefId) -> bool self.do_is_statically_included_foreign_item(def_id) } + fn is_exported_symbol(&self, def_id: DefId) -> bool { + self.get_crate_data(def_id.krate).exported_symbols.contains(&def_id.index) + } + fn is_dllimport_foreign_item(&self, def_id: DefId) -> bool { if def_id.krate == LOCAL_CRATE { self.dllimport_foreign_items.borrow().contains(&def_id.index) @@ -467,8 +471,12 @@ fn is_item_mir_available(&self, def: DefId) -> bool { } fn can_have_local_instance<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> bool { - self.dep_graph.read(DepNode::MetaData(def)); - def.is_local() || self.get_crate_data(def.krate).can_have_local_instance(tcx, def.index) + if def.is_local() { + true + } else { + self.dep_graph.read(DepNode::MetaData(def)); + self.get_crate_data(def.krate).can_have_local_instance(tcx, def.index) + } } fn crates(&self) -> Vec diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index f3a673898b2..3add92191df 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1031,7 +1031,7 @@ pub fn get_fn_arg_names(&self, id: DefIndex) -> Vec { } pub fn get_exported_symbols(&self) -> Vec { - self.root.exported_symbols.decode(self).map(|index| self.local_def_id(index)).collect() + self.exported_symbols.iter().map(|&index| self.local_def_id(index)).collect() } pub fn get_macro(&self, id: DefIndex) -> (ast::Name, MacroDef) { -- 2.44.0