diff --git a/src/doc/nomicon b/src/doc/nomicon index 6fa139b1630a9..616b98444ff4e 160000 --- a/src/doc/nomicon +++ b/src/doc/nomicon @@ -1 +1 @@ -Subproject commit 6fa139b1630a9bb95dcd60cfc90aff9c19e54580 +Subproject commit 616b98444ff4eb5260deee95ee3e090dfd98b947 diff --git a/src/liblibc b/src/liblibc index 03562b0cb26a0..c34a802d1eb03 160000 --- a/src/liblibc +++ b/src/liblibc @@ -1 +1 @@ -Subproject commit 03562b0cb26a00f49d4eaf18ca3e49608110b0c8 +Subproject commit c34a802d1eb037b44c5252078c7270b5472e0f65 diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 16b3fcd2f8c32..937ffe3dc21e0 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -225,10 +225,7 @@ pub trait CrateStore { fn associated_item_cloned(&self, def: DefId) -> ty::AssociatedItem; // flags - fn is_const_fn(&self, did: DefId) -> bool; - fn is_default_impl(&self, impl_did: DefId) -> bool; 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; @@ -353,10 +350,7 @@ impl CrateStore for DummyCrateStore { { bug!("associated_item_cloned") } // flags - fn is_const_fn(&self, did: DefId) -> bool { bug!("is_const_fn") } - 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 } diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 82a4c1e1e626a..d2200be020cbf 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -353,13 +353,25 @@ impl<'tcx> QueryDescription for queries::const_is_rvalue_promotable_to_static<'t } } -impl<'tcx> QueryDescription for queries::is_mir_available<'tcx> { - fn describe(tcx: TyCtxt, def_id: DefId) -> String { - format!("checking if item is mir available: `{}`", - tcx.item_path_str(def_id)) +macro_rules! simple_query_description { + ($($fn_name:ident, $desc:expr),*,) => { + $( + impl<'tcx> QueryDescription for queries::$fn_name<'tcx> { + fn describe(tcx: TyCtxt, def_id: DefId) -> String { + format!(concat!($desc, "`: {}`"), + tcx.item_path_str(def_id)) + } + } + )* } } +simple_query_description! { + is_mir_available, "checking if item is mir available", + is_const_fn, "checking if item is const fn", + is_dllimport_foreign_item, "checking if item is dll import foreign item", +} + macro_rules! define_maps { (<$tcx:tt> $($(#[$attr:meta])* @@ -784,6 +796,10 @@ define_maps! { <'tcx> [] item_body_nested_bodies: metadata_dep_node(DefId) -> Rc>, [] const_is_rvalue_promotable_to_static: metadata_dep_node(DefId) -> bool, [] is_mir_available: metadata_dep_node(DefId) -> bool, + + [] is_const_fn: metadata_dep_node(DefId) -> bool, + [] is_default_impl: metadata_dep_node(DefId) -> bool, + [] is_dllimport_foreign_item: metadata_dep_node(DefId) -> bool, } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { diff --git a/src/librustc_const_eval/eval.rs b/src/librustc_const_eval/eval.rs index 8b1aa0708807b..af9458ea47d3a 100644 --- a/src/librustc_const_eval/eval.rs +++ b/src/librustc_const_eval/eval.rs @@ -352,7 +352,7 @@ fn eval_const_expr_partial<'a, 'tcx>(cx: &ConstContext<'a, 'tcx>, signal!(e, TypeckError) } } else { - if tcx.sess.cstore.is_const_fn(def_id) { + if tcx.is_const_fn(def_id) { tcx.sess.cstore.item_body(tcx, def_id) } else { signal!(e, TypeckError) diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 5f14890665cab..862a8357b0a43 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -895,9 +895,10 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, reachable::provide(&mut local_providers); rustc_const_eval::provide(&mut local_providers); middle::region::provide(&mut local_providers); + cstore::provide_local(&mut local_providers); let mut extern_providers = ty::maps::Providers::default(); - cstore::provide(&mut extern_providers); + cstore::provide_extern(&mut extern_providers); trans::provide(&mut extern_providers); ty::provide_extern(&mut extern_providers); // FIXME(eddyb) get rid of this once we replace const_eval with miri. diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index 6fa6a868605dc..b45963216ca73 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -11,7 +11,7 @@ use cstore; use encoder; use locator; -use schema; +use schema::{self, EntryKind}; use rustc::dep_graph::DepTrackingMapConfig; use rustc::middle::cstore::{CrateStore, CrateSource, LibSource, DepKind, @@ -22,7 +22,7 @@ use rustc::middle::lang_items; use rustc::session::Session; use rustc::ty::{self, TyCtxt}; use rustc::ty::maps::Providers; -use rustc::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX}; use rustc::dep_graph::{DepNode, GlobalMetaDataKind}; use rustc::hir::map::{DefKey, DefPath, DisambiguatedDefPathData}; @@ -45,7 +45,7 @@ use std::collections::BTreeMap; macro_rules! provide { (<$lt:tt> $tcx:ident, $def_id:ident, $cdata:ident $($name:ident => $compute:block)*) => { - pub fn provide<$lt>(providers: &mut Providers<$lt>) { + pub fn provide_extern<$lt>(providers: &mut Providers<$lt>) { $(fn $name<'a, $lt:$lt>($tcx: TyCtxt<'a, $lt, $lt>, $def_id: DefId) -> as DepTrackingMapConfig>::Value { @@ -128,6 +128,32 @@ provide! { <'tcx> tcx, def_id, cdata !cdata.is_proc_macro(def_id.index) && cdata.maybe_entry(def_id.index).and_then(|item| item.decode(cdata).mir).is_some() } + is_const_fn => { cdata.is_const_fn(def_id.index) } + is_default_impl => { + match cdata.entry(def_id.index).kind { + EntryKind::DefaultImpl(_) => true, + _ => false, + } + } + is_dllimport_foreign_item => { + // extern case + cdata.dllimport_foreign_items.contains(&def_id.index) + } +} + +pub fn provide_local(providers: &mut ty::maps::Providers) { + providers.is_dllimport_foreign_item = is_dllimport_foreign_item; +} + +fn is_dllimport_foreign_item_local<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) -> bool { + tcx.dep_graph.read(DepNode::MetaData(def_id)); + + let cdata = tcx.sess.cstore.crate_data_as_rc_any(def_id.krate); + let cdata = cdata.downcast_ref::() + .expect("CrateStore crated ata is not a CrateMetadata"); + + cdata.get_crate_data(def_id.krate) + .is_dllimport_foreign_item(def_id.index, &cdata.dep_graph) } impl CrateStore for cstore::CStore { @@ -195,17 +221,6 @@ impl CrateStore for cstore::CStore { self.get_crate_data(def.krate).get_associated_item(def.index) } - fn is_const_fn(&self, did: DefId) -> bool - { - self.dep_graph.read(DepNode::MetaData(did)); - self.get_crate_data(did.krate).is_const_fn(did.index) - } - - fn is_default_impl(&self, impl_did: DefId) -> bool { - self.dep_graph.read(DepNode::MetaData(impl_did)); - self.get_crate_data(impl_did.krate).is_default_impl(impl_did.index) - } - fn is_foreign_item(&self, did: DefId) -> bool { self.get_crate_data(did.krate).is_foreign_item(did.index) } @@ -223,15 +238,6 @@ impl CrateStore for cstore::CStore { .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) - } else { - self.get_crate_data(def_id.krate) - .is_dllimport_foreign_item(def_id.index, &self.dep_graph) - } - } - fn dylib_dependency_formats(&self, cnum: CrateNum) -> Vec<(CrateNum, LinkagePreference)> { diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index 0d592b4d72be5..6797fe11a6be2 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -117,7 +117,7 @@ pub fn is_const_fn(tcx: TyCtxt, def_id: DefId) -> bool { false } } else { - tcx.sess.cstore.is_const_fn(def_id) + tcx.is_const_fn(def_id) } } diff --git a/src/librustc_passes/consts.rs b/src/librustc_passes/consts.rs index a0998b1bd1bfb..af7b3a3abef3c 100644 --- a/src/librustc_passes/consts.rs +++ b/src/librustc_passes/consts.rs @@ -102,7 +102,7 @@ impl<'a, 'gcx> CheckCrateVisitor<'a, 'gcx> { fn_like.constness() == hir::Constness::Const }) } else { - self.tcx.sess.cstore.is_const_fn(def_id) + self.tcx.is_const_fn(def_id) }; } } diff --git a/src/librustc_trans/callee.rs b/src/librustc_trans/callee.rs index dc788dc4b4834..75190d3fd1cde 100644 --- a/src/librustc_trans/callee.rs +++ b/src/librustc_trans/callee.rs @@ -111,7 +111,7 @@ pub fn get_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, } if ccx.use_dll_storage_attrs() && - ccx.sess().cstore.is_dllimport_foreign_item(instance.def_id()) + ccx.tcx().is_dllimport_foreign_item(instance.def_id()) { unsafe { llvm::LLVMSetDLLStorageClass(llfn, llvm::DLLStorageClass::DllImport); diff --git a/src/librustc_trans/consts.rs b/src/librustc_trans/consts.rs index 6afb340107d66..a0a1228fd6196 100644 --- a/src/librustc_trans/consts.rs +++ b/src/librustc_trans/consts.rs @@ -199,7 +199,7 @@ pub fn get_static(ccx: &CrateContext, def_id: DefId) -> ValueRef { g }; - if ccx.use_dll_storage_attrs() && ccx.sess().cstore.is_dllimport_foreign_item(def_id) { + if ccx.use_dll_storage_attrs() && ccx.tcx().is_dllimport_foreign_item(def_id) { // For foreign (native) libs we know the exact storage type to use. unsafe { llvm::LLVMSetDLLStorageClass(g, llvm::DLLStorageClass::DllImport); diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 9dea0e3d83088..b410673c70920 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -167,7 +167,7 @@ pub fn build_external_trait(cx: &DocContext, did: DefId) -> clean::Trait { fn build_external_function(cx: &DocContext, did: DefId) -> clean::Function { let sig = cx.tcx.type_of(did).fn_sig(); - let constness = if cx.tcx.sess.cstore.is_const_fn(did) { + let constness = if cx.tcx.is_const_fn(did) { hir::Constness::Const } else { hir::Constness::NotConst @@ -306,7 +306,7 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec) { } // If this is a defaulted impl, then bail out early here - if tcx.sess.cstore.is_default_impl(did) { + if tcx.is_default_impl(did) { return ret.push(clean::Item { inner: clean::DefaultImplItem(clean::DefaultImpl { // FIXME: this should be decoded @@ -368,7 +368,7 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec) { clean::TyMethodItem(clean::TyMethod { unsafety, decl, generics, abi }) => { - let constness = if tcx.sess.cstore.is_const_fn(item.def_id) { + let constness = if tcx.is_const_fn(item.def_id) { hir::Constness::Const } else { hir::Constness::NotConst diff --git a/src/rust-installer b/src/rust-installer index 2e6417f6af521..4cf7397fb0566 160000 --- a/src/rust-installer +++ b/src/rust-installer @@ -1 +1 @@ -Subproject commit 2e6417f6af5218a29a8ee72ed17af085560b9b9c +Subproject commit 4cf7397fb0566e745f0bce4c5b009cfeb5d12c53 diff --git a/src/tools/cargo b/src/tools/cargo index cf17c9f7118f5..fa7584c1495c2 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit cf17c9f7118f544ec304ed6f50d92b3759487123 +Subproject commit fa7584c1495c2d9c04a6416f8e7b546abfa88a52