diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 995bbd65388d9167273065b18b2a49b0a88d1808..cb5680956bbda8dc6eea9e6f51a17373d2aa4e0d 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -536,6 +536,7 @@ pub fn to_dep_node(self, tcx: TyCtxt, kind: DepKind) -> DepNode { [] 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 26577a94ffc9e4958094ee41eae3b830ee3cf265..edc046a1225078da48ebdd6e219b08747e182eeb 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 @@ fn plugin_registrar_fn(&self, cnum: CrateNum) -> Option { 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 2da806870f0137465a3c63e156495ad109b49d71..c8ec111828e3a50aae545eb93b317716bbb85d30 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -15,7 +15,7 @@ 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 @@ fn describe(_tcx: TyCtxt, _: CrateNum) -> String { } } +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 @@ fn default() -> Self { [] 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 22a1205bbfc38c3c4e534cd41f2e82a7c39c6b30..537154b4a4cac30354aa590767f3235d3d3577f1 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -164,6 +164,7 @@ fn into_def_id(self) -> DefId { self.as_def_id() } 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 @@ fn derive_registrar_fn(&self, cnum: CrateNum) -> Option }) } - 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 e69a2322aaaab70ffeb0e6cdc55ac90438070502..20c5b082101f2fdc72c69549f3b5598ac7c0fe2e 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_static_crate(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_dynamic_crate(cmd: &mut Linker, sess: &Session, cratepath: &Path) { // 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 3da8d07f9d796da422ef5752ba6163a39c0a22c6..ccbd2a7550a2511ce888c276b44775173621005c 100644 --- a/src/librustc_trans/base.rs +++ b/src/librustc_trans/base.rs @@ -1515,9 +1515,11 @@ pub fn new(tcx: TyCtxt) -> 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 42aa47436c8b5f8d88fd11b6cfff2b6d514e1019..876870914be81b0e7d7a520b0e6e2151f724c825 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -65,8 +65,12 @@ 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 }