From 205bc9a80ab214244d44ac4c8c8f155520d00989 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 28 Aug 2017 17:06:03 -0700 Subject: [PATCH] rustc: Migrate `CStore::native_libraries` to a query --- src/librustc/dep_graph/dep_node.rs | 1 + src/librustc/middle/cstore.rs | 3 --- src/librustc/ty/maps.rs | 9 ++++++++- src/librustc_metadata/cstore_impl.rs | 6 +----- src/librustc_trans/back/link.rs | 15 +++++++++------ src/librustc_trans/base.rs | 2 ++ src/librustc_trans/lib.rs | 7 ++++++- 7 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 995bbd65388..cb5680956bb 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -536,6 +536,7 @@ define_dep_nodes!( <'tcx> [] IsNoBuiltins(CrateNum), [] ImplDefaultness(DefId), [] ExportedSymbols(CrateNum), + [] NativeLibraries(CrateNum), ); trait DepNodeParams<'a, 'gcx: 'tcx + 'a, 'tcx: 'a> : fmt::Debug { diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 26577a94ffc..edc046a1225 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -257,7 +257,6 @@ pub trait CrateStore { fn crate_disambiguator(&self, cnum: CrateNum) -> Symbol; fn plugin_registrar_fn(&self, cnum: CrateNum) -> Option; fn derive_registrar_fn(&self, cnum: CrateNum) -> Option; - fn native_libraries(&self, cnum: CrateNum) -> Vec; // resolve fn def_key(&self, def: DefId) -> DefKey; @@ -364,8 +363,6 @@ impl CrateStore for DummyCrateStore { { bug!("plugin_registrar_fn") } fn derive_registrar_fn(&self, cnum: CrateNum) -> Option { bug!("derive_registrar_fn") } - fn native_libraries(&self, cnum: CrateNum) -> Vec - { bug!("native_libraries") } // resolve fn def_key(&self, def: DefId) -> DefKey { bug!("def_key") } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 2da806870f0..c8ec111828e 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -15,7 +15,7 @@ use hir::def::{Def, Export}; use hir::{self, TraitCandidate, HirId}; use lint; use middle::const_val; -use middle::cstore::{ExternCrate, LinkagePreference}; +use middle::cstore::{ExternCrate, LinkagePreference, NativeLibrary}; use middle::privacy::AccessLevels; use middle::region; use mir; @@ -593,6 +593,12 @@ impl<'tcx> QueryDescription for queries::exported_symbols<'tcx> { } } +impl<'tcx> QueryDescription for queries::native_libraries<'tcx> { + fn describe(_tcx: TyCtxt, _: CrateNum) -> String { + format!("looking up the native libraries of a linked crate") + } +} + // If enabled, send a message to the profile-queries thread macro_rules! profq_msg { ($tcx:expr, $msg:expr) => { @@ -1170,6 +1176,7 @@ define_maps! { <'tcx> [] fn impl_defaultness: ImplDefaultness(DefId) -> hir::Defaultness, [] fn exported_symbols: ExportedSymbols(CrateNum) -> Rc>, + [] fn native_libraries: NativeLibraries(CrateNum) -> Rc>, } fn type_param_predicates<'tcx>((item_id, param_id): (DefId, DefId)) -> DepConstructor<'tcx> { diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 22a1205bbfc..537154b4a4c 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -164,6 +164,7 @@ provide! { <'tcx> tcx, def_id, cdata, is_no_builtins => { cdata.is_no_builtins(&tcx.dep_graph) } impl_defaultness => { cdata.get_impl_defaultness(def_id.index) } exported_symbols => { Rc::new(cdata.get_exported_symbols(&tcx.dep_graph)) } + native_libraries => { Rc::new(cdata.get_native_libraries(&tcx.dep_graph)) } } pub fn provide_local<'tcx>(providers: &mut Providers<'tcx>) { @@ -298,11 +299,6 @@ impl CrateStore for cstore::CStore { }) } - fn native_libraries(&self, cnum: CrateNum) -> Vec - { - self.get_crate_data(cnum).get_native_libraries(&self.dep_graph) - } - /// Returns the `DefKey` for a given `DefId`. This indicates the /// parent `DefId` as well as some idea of what kind of data the /// `DefId` refers to. diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index e69a2322aaa..20c5b082101 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -613,7 +613,7 @@ fn link_staticlib(sess: &Session, let res = each_linked_rlib(sess, &mut |cnum, path| { let name = sess.cstore.crate_name(cnum); - let native_libs = sess.cstore.native_libraries(cnum); + let native_libs = &trans.crate_info.native_libraries[&cnum]; // Here when we include the rlib into our staticlib we need to make a // decision whether to include the extra object files along the way. @@ -637,7 +637,7 @@ fn link_staticlib(sess: &Session, sess.lto() && !ignored_for_lto(&trans.crate_info, cnum), skip_object_files).unwrap(); - all_native_libs.extend(sess.cstore.native_libraries(cnum)); + all_native_libs.extend(trans.crate_info.native_libraries[&cnum].iter().cloned()); }); if let Err(e) = res { sess.fatal(&e); @@ -1002,7 +1002,7 @@ fn link_args(cmd: &mut Linker, // on other dylibs (e.g. other native deps). add_local_native_libraries(cmd, sess); add_upstream_rust_crates(cmd, sess, trans, crate_type, tmpdir); - add_upstream_native_libraries(cmd, sess, crate_type); + add_upstream_native_libraries(cmd, sess, trans, crate_type); // Tell the linker what we're doing. if crate_type != config::CrateTypeExecutable { @@ -1239,7 +1239,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // See the comment above in `link_staticlib` and `link_rlib` for why if // there's a static library that's not relevant we skip all object // files. - let native_libs = sess.cstore.native_libraries(cnum); + let native_libs = &trans.crate_info.native_libraries[&cnum]; let skip_native = native_libs.iter().any(|lib| { lib.kind == NativeLibraryKind::NativeStatic && !relevant_lib(sess, lib) }); @@ -1352,7 +1352,10 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // generic function calls a native function, then the generic function must // be instantiated in the target crate, meaning that the native symbol must // also be resolved in the target crate. -fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session, crate_type: config::CrateType) { +fn add_upstream_native_libraries(cmd: &mut Linker, + sess: &Session, + trans: &CrateTranslation, + crate_type: config::CrateType) { // Be sure to use a topological sorting of crates because there may be // interdependencies between native libraries. When passing -nodefaultlibs, // for example, almost all native libraries depend on libc, so we have to @@ -1367,7 +1370,7 @@ fn add_upstream_native_libraries(cmd: &mut Linker, sess: &Session, crate_type: c let crates = sess.cstore.used_crates(LinkagePreference::RequireStatic); for (cnum, _) in crates { - for lib in sess.cstore.native_libraries(cnum) { + for lib in trans.crate_info.native_libraries[&cnum].iter() { if !relevant_lib(sess, &lib) { continue } diff --git a/src/librustc_trans/base.rs b/src/librustc_trans/base.rs index 3da8d07f9d7..ccbd2a7550a 100644 --- a/src/librustc_trans/base.rs +++ b/src/librustc_trans/base.rs @@ -1515,9 +1515,11 @@ impl CrateInfo { profiler_runtime: None, sanitizer_runtime: None, is_no_builtins: FxHashSet(), + native_libraries: FxHashMap(), }; for cnum in tcx.sess.cstore.crates() { + info.native_libraries.insert(cnum, tcx.native_libraries(cnum)); if tcx.is_panic_runtime(cnum) { info.panic_runtime = Some(cnum); } diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs index 42aa47436c8..876870914be 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -65,8 +65,12 @@ pub use back::symbol_names::provide; pub use metadata::LlvmMetadataLoader; pub use llvm_util::{init, target_features, print_version, print_passes, print, enable_llvm_debug}; + +use std::rc::Rc; + use rustc::hir::def_id::CrateNum; -use rustc::util::nodemap::FxHashSet; +use rustc::util::nodemap::{FxHashSet, FxHashMap}; +use rustc::middle::cstore::NativeLibrary; pub mod back { mod archive; @@ -229,6 +233,7 @@ pub struct CrateInfo { profiler_runtime: Option, sanitizer_runtime: Option, is_no_builtins: FxHashSet, + native_libraries: FxHashMap>>, } __build_diagnostic_array! { librustc_trans, DIAGNOSTICS }