Auto merge of #41611 - cramertj:metadata-queries-1, r=nikomatsakis
Queryify crate metadata Part of https://github.com/rust-lang/rust/issues/41417. r? @nikomatsakis
This commit is contained in:
commit
777ee20796
8 changed files with 56 additions and 58 deletions
|
|
@ -35,7 +35,6 @@ use session::search_paths::PathKind;
|
||||||
use util::nodemap::{NodeSet, DefIdMap};
|
use util::nodemap::{NodeSet, DefIdMap};
|
||||||
|
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
use std::collections::BTreeMap;
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
|
|
@ -250,10 +249,6 @@ pub trait CrateStore {
|
||||||
// misc. metadata
|
// misc. metadata
|
||||||
fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId)
|
fn item_body<'a, 'tcx>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId)
|
||||||
-> &'tcx hir::Body;
|
-> &'tcx hir::Body;
|
||||||
fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body>;
|
|
||||||
fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool;
|
|
||||||
|
|
||||||
fn is_item_mir_available(&self, def: DefId) -> bool;
|
|
||||||
|
|
||||||
// This is basically a 1-based range of ints, which is a little
|
// This is basically a 1-based range of ints, which is a little
|
||||||
// silly - I may fix that.
|
// silly - I may fix that.
|
||||||
|
|
@ -401,16 +396,6 @@ impl CrateStore for DummyCrateStore {
|
||||||
-> &'tcx hir::Body {
|
-> &'tcx hir::Body {
|
||||||
bug!("item_body")
|
bug!("item_body")
|
||||||
}
|
}
|
||||||
fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body> {
|
|
||||||
bug!("item_body_nested_bodies")
|
|
||||||
}
|
|
||||||
fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool {
|
|
||||||
bug!("const_is_rvalue_promotable_to_static")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_item_mir_available(&self, def: DefId) -> bool {
|
|
||||||
bug!("is_item_mir_available")
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is basically a 1-based range of ints, which is a little
|
// This is basically a 1-based range of ints, which is a little
|
||||||
// silly - I may fix that.
|
// silly - I may fix that.
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ use util::nodemap::NodeSet;
|
||||||
use rustc_data_structures::indexed_vec::IndexVec;
|
use rustc_data_structures::indexed_vec::IndexVec;
|
||||||
use std::cell::{RefCell, RefMut};
|
use std::cell::{RefCell, RefMut};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::collections::BTreeMap;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use syntax_pos::{Span, DUMMY_SP};
|
use syntax_pos::{Span, DUMMY_SP};
|
||||||
|
|
@ -291,10 +292,30 @@ impl<'tcx> QueryDescription for queries::def_span<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> QueryDescription for queries::item_body_nested_bodies<'tcx> {
|
||||||
|
fn describe(tcx: TyCtxt, def_id: DefId) -> String {
|
||||||
|
format!("nested item bodies of `{}`", tcx.item_path_str(def_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> QueryDescription for queries::const_is_rvalue_promotable_to_static<'tcx> {
|
||||||
|
fn describe(tcx: TyCtxt, def_id: DefId) -> String {
|
||||||
|
format!("const checking if rvalue is promotable to static `{}`",
|
||||||
|
tcx.item_path_str(def_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> QueryDescription for queries::is_item_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! define_maps {
|
macro_rules! define_maps {
|
||||||
(<$tcx:tt>
|
(<$tcx:tt>
|
||||||
$($(#[$attr:meta])*
|
$($(#[$attr:meta])*
|
||||||
[$($pub:tt)*] $name:ident: $node:ident($K:ty) -> $V:ty),*) => {
|
[$($pub:tt)*] $name:ident: $node:ident($K:ty) -> $V:ty,)*) => {
|
||||||
pub struct Maps<$tcx> {
|
pub struct Maps<$tcx> {
|
||||||
providers: IndexVec<CrateNum, Providers<$tcx>>,
|
providers: IndexVec<CrateNum, Providers<$tcx>>,
|
||||||
query_stack: RefCell<Vec<(Span, Query<$tcx>)>>,
|
query_stack: RefCell<Vec<(Span, Query<$tcx>)>>,
|
||||||
|
|
@ -577,7 +598,11 @@ define_maps! { <'tcx>
|
||||||
[] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName,
|
[] symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName,
|
||||||
|
|
||||||
[] describe_def: DescribeDef(DefId) -> Option<Def>,
|
[] describe_def: DescribeDef(DefId) -> Option<Def>,
|
||||||
[] def_span: DefSpan(DefId) -> Span
|
[] def_span: DefSpan(DefId) -> Span,
|
||||||
|
|
||||||
|
[] item_body_nested_bodies: metadata_dep_node(DefId) -> Rc<BTreeMap<hir::BodyId, hir::Body>>,
|
||||||
|
[] const_is_rvalue_promotable_to_static: metadata_dep_node(DefId) -> bool,
|
||||||
|
[] is_item_mir_available: metadata_dep_node(DefId) -> bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode<DefId> {
|
fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode<DefId> {
|
||||||
|
|
@ -592,6 +617,10 @@ fn reachability_dep_node(_: CrateNum) -> DepNode<DefId> {
|
||||||
DepNode::Reachability
|
DepNode::Reachability
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn metadata_dep_node(def_id: DefId) -> DepNode<DefId> {
|
||||||
|
DepNode::MetaData(def_id)
|
||||||
|
}
|
||||||
|
|
||||||
fn mir_shim_dep_node(instance: ty::InstanceDef) -> DepNode<DefId> {
|
fn mir_shim_dep_node(instance: ty::InstanceDef) -> DepNode<DefId> {
|
||||||
instance.dep_node()
|
instance.dep_node()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2332,7 +2332,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
if !did.is_local() && !self.sess.cstore.is_item_mir_available(did) {
|
if !did.is_local() && !self.is_item_mir_available(did) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,21 @@ provide! { <'tcx> tcx, def_id, cdata
|
||||||
is_foreign_item => { cdata.is_foreign_item(def_id.index) }
|
is_foreign_item => { cdata.is_foreign_item(def_id.index) }
|
||||||
describe_def => { cdata.get_def(def_id.index) }
|
describe_def => { cdata.get_def(def_id.index) }
|
||||||
def_span => { cdata.get_span(def_id.index, &tcx.sess) }
|
def_span => { cdata.get_span(def_id.index, &tcx.sess) }
|
||||||
|
item_body_nested_bodies => {
|
||||||
|
let map: BTreeMap<_, _> = cdata.entry(def_id.index).ast.into_iter().flat_map(|ast| {
|
||||||
|
ast.decode(cdata).nested_bodies.decode(cdata).map(|body| (body.id(), body))
|
||||||
|
}).collect();
|
||||||
|
|
||||||
|
Rc::new(map)
|
||||||
|
}
|
||||||
|
const_is_rvalue_promotable_to_static => {
|
||||||
|
cdata.entry(def_id.index).ast.expect("const item missing `ast`")
|
||||||
|
.decode(cdata).rvalue_promotable_to_static
|
||||||
|
}
|
||||||
|
is_item_mir_available => {
|
||||||
|
!cdata.is_proc_macro(def_id.index) &&
|
||||||
|
cdata.maybe_entry(def_id.index).and_then(|item| item.decode(cdata).mir).is_some()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CrateStore for cstore::CStore {
|
impl CrateStore for cstore::CStore {
|
||||||
|
|
@ -432,21 +447,6 @@ impl CrateStore for cstore::CStore {
|
||||||
self.get_crate_data(def_id.krate).item_body(tcx, def_id.index)
|
self.get_crate_data(def_id.krate).item_body(tcx, def_id.index)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn item_body_nested_bodies(&self, def: DefId) -> BTreeMap<hir::BodyId, hir::Body> {
|
|
||||||
self.dep_graph.read(DepNode::MetaData(def));
|
|
||||||
self.get_crate_data(def.krate).item_body_nested_bodies(def.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn const_is_rvalue_promotable_to_static(&self, def: DefId) -> bool {
|
|
||||||
self.dep_graph.read(DepNode::MetaData(def));
|
|
||||||
self.get_crate_data(def.krate).const_is_rvalue_promotable_to_static(def.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_item_mir_available(&self, def: DefId) -> bool {
|
|
||||||
self.dep_graph.read(DepNode::MetaData(def));
|
|
||||||
self.get_crate_data(def.krate).is_item_mir_available(def.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn crates(&self) -> Vec<CrateNum>
|
fn crates(&self) -> Vec<CrateNum>
|
||||||
{
|
{
|
||||||
let mut result = vec![];
|
let mut result = vec![];
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ use rustc::mir::Mir;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::cell::Ref;
|
use std::cell::Ref;
|
||||||
use std::collections::BTreeMap;
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
@ -442,16 +441,16 @@ impl<'tcx> EntryKind<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> CrateMetadata {
|
impl<'a, 'tcx> CrateMetadata {
|
||||||
fn is_proc_macro(&self, id: DefIndex) -> bool {
|
pub fn is_proc_macro(&self, id: DefIndex) -> bool {
|
||||||
self.proc_macros.is_some() && id != CRATE_DEF_INDEX
|
self.proc_macros.is_some() && id != CRATE_DEF_INDEX
|
||||||
}
|
}
|
||||||
|
|
||||||
fn maybe_entry(&self, item_id: DefIndex) -> Option<Lazy<Entry<'tcx>>> {
|
pub fn maybe_entry(&self, item_id: DefIndex) -> Option<Lazy<Entry<'tcx>>> {
|
||||||
assert!(!self.is_proc_macro(item_id));
|
assert!(!self.is_proc_macro(item_id));
|
||||||
self.root.index.lookup(self.blob.raw_bytes(), item_id)
|
self.root.index.lookup(self.blob.raw_bytes(), item_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn entry(&self, item_id: DefIndex) -> Entry<'tcx> {
|
pub fn entry(&self, item_id: DefIndex) -> Entry<'tcx> {
|
||||||
match self.maybe_entry(item_id) {
|
match self.maybe_entry(item_id) {
|
||||||
None => {
|
None => {
|
||||||
bug!("entry: id not found: {:?} in crate {:?} with number {}",
|
bug!("entry: id not found: {:?} in crate {:?} with number {}",
|
||||||
|
|
@ -773,22 +772,6 @@ impl<'a, 'tcx> CrateMetadata {
|
||||||
tcx.alloc_tables(ast.tables.decode((self, tcx)))
|
tcx.alloc_tables(ast.tables.decode((self, tcx)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn item_body_nested_bodies(&self, id: DefIndex) -> BTreeMap<hir::BodyId, hir::Body> {
|
|
||||||
self.entry(id).ast.into_iter().flat_map(|ast| {
|
|
||||||
ast.decode(self).nested_bodies.decode(self).map(|body| (body.id(), body))
|
|
||||||
}).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn const_is_rvalue_promotable_to_static(&self, id: DefIndex) -> bool {
|
|
||||||
self.entry(id).ast.expect("const item missing `ast`")
|
|
||||||
.decode(self).rvalue_promotable_to_static
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_item_mir_available(&self, id: DefIndex) -> bool {
|
|
||||||
!self.is_proc_macro(id) &&
|
|
||||||
self.maybe_entry(id).and_then(|item| item.decode(self).mir).is_some()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn maybe_get_item_mir(&self,
|
pub fn maybe_get_item_mir(&self,
|
||||||
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
id: DefIndex)
|
id: DefIndex)
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,7 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>, e: &hir::Expr, node
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
v.tcx.sess.cstore.const_is_rvalue_promotable_to_static(did)
|
v.tcx.const_is_rvalue_promotable_to_static(did)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
|
||||||
|
|
@ -659,7 +659,7 @@ fn should_trans_locally<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: &Instan
|
||||||
// in this crate
|
// in this crate
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
if !tcx.sess.cstore.is_item_mir_available(def_id) {
|
if !tcx.is_item_mir_available(def_id) {
|
||||||
bug!("Cannot create local trans-item for {:?}", def_id)
|
bug!("Cannot create local trans-item for {:?}", def_id)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::iter::once;
|
use std::iter::once;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use rustc::hir;
|
use rustc::hir;
|
||||||
|
|
@ -471,7 +472,7 @@ fn build_module(cx: &DocContext, did: DefId) -> clean::Module {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InlinedConst {
|
struct InlinedConst {
|
||||||
nested_bodies: BTreeMap<hir::BodyId, hir::Body>
|
nested_bodies: Rc<BTreeMap<hir::BodyId, hir::Body>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl hir::print::PpAnn for InlinedConst {
|
impl hir::print::PpAnn for InlinedConst {
|
||||||
|
|
@ -488,7 +489,7 @@ impl hir::print::PpAnn for InlinedConst {
|
||||||
fn print_inlined_const(cx: &DocContext, did: DefId) -> String {
|
fn print_inlined_const(cx: &DocContext, did: DefId) -> String {
|
||||||
let body = cx.tcx.sess.cstore.item_body(cx.tcx, did);
|
let body = cx.tcx.sess.cstore.item_body(cx.tcx, did);
|
||||||
let inlined = InlinedConst {
|
let inlined = InlinedConst {
|
||||||
nested_bodies: cx.tcx.sess.cstore.item_body_nested_bodies(did)
|
nested_bodies: cx.tcx.item_body_nested_bodies(did)
|
||||||
};
|
};
|
||||||
hir::print::to_string(&inlined, |s| s.print_expr(&body.value))
|
hir::print::to_string(&inlined, |s| s.print_expr(&body.value))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue