Skip to content

Commit 959c870

Browse files
committed
Make privacy checking, intrinsic checking and liveness checking incremental
1 parent 2fadb0a commit 959c870

File tree

9 files changed

+121
-18
lines changed

9 files changed

+121
-18
lines changed

src/librustc/dep_graph/dep_node.rs

+3
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@ define_dep_nodes!( <'tcx>
476476
[] CheckModLoops(DefId),
477477
[] CheckModUnstableApiUsage(DefId),
478478
[] CheckModItemTypes(DefId),
479+
[] CheckModPrivacy(DefId),
480+
[] CheckModIntrinsics(DefId),
481+
[] CheckModLiveness(DefId),
479482
[] CollectModItemTypes(DefId),
480483

481484
[] Reachability,

src/librustc/hir/map/mod.rs

+15
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,21 @@ impl<'hir> Map<'hir> {
507507
&self.forest.krate.attrs
508508
}
509509

510+
pub fn get_module(&self, module: DefId) -> (&'hir Mod, Span, NodeId)
511+
{
512+
let node_id = self.as_local_node_id(module).unwrap();
513+
self.read(node_id);
514+
match self.find_entry(node_id).unwrap().node {
515+
Node::Item(&Item {
516+
span,
517+
node: ItemKind::Mod(ref m),
518+
..
519+
}) => (m, span, node_id),
520+
Node::Crate => (&self.forest.krate.module, self.forest.krate.span, node_id),
521+
_ => panic!("not a module")
522+
}
523+
}
524+
510525
pub fn visit_item_likes_in_module<V>(&self, module: DefId, visitor: &mut V)
511526
where V: ItemLikeVisitor<'hir>
512527
{

src/librustc/middle/intrinsicck.rs

+17-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use hir::def::Def;
22
use hir::def_id::DefId;
33
use ty::{self, Ty, TyCtxt};
44
use ty::layout::{LayoutError, Pointer, SizeSkeleton, VariantIdx};
5+
use ty::query::{Providers, queries};
56

67
use rustc_target::spec::abi::Abi::RustIntrinsic;
78
use rustc_data_structures::indexed_vec::Idx;
@@ -10,10 +11,23 @@ use hir::intravisit::{self, Visitor, NestedVisitorMap};
1011
use hir;
1112

1213
pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
13-
let mut visitor = ItemVisitor {
14-
tcx,
14+
for &module in tcx.hir().krate().modules.keys() {
15+
queries::check_mod_intrinsics::ensure(tcx, tcx.hir().local_def_id(module));
16+
}
17+
}
18+
19+
fn check_mod_intrinsics<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
20+
tcx.hir().visit_item_likes_in_module(
21+
module_def_id,
22+
&mut ItemVisitor { tcx }.as_deep_visitor()
23+
);
24+
}
25+
26+
pub fn provide(providers: &mut Providers<'_>) {
27+
*providers = Providers {
28+
check_mod_intrinsics,
29+
..*providers
1530
};
16-
tcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor());
1731
}
1832

1933
struct ItemVisitor<'a, 'tcx: 'a> {

src/librustc/middle/liveness.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ use self::VarKind::*;
100100
use hir::def::*;
101101
use hir::Node;
102102
use ty::{self, TyCtxt};
103+
use ty::query::{Providers, queries};
103104
use lint;
104105
use errors::Applicability;
105106
use util::nodemap::{NodeMap, HirIdMap, HirIdSet};
@@ -114,8 +115,9 @@ use syntax::ptr::P;
114115
use syntax::symbol::keywords;
115116
use syntax_pos::Span;
116117

117-
use hir::{Expr, HirId};
118118
use hir;
119+
use hir::{Expr, HirId};
120+
use hir::def_id::DefId;
119121
use hir::intravisit::{self, Visitor, FnKind, NestedVisitorMap};
120122

121123
/// For use with `propagate_through_loop`.
@@ -179,11 +181,24 @@ impl<'a, 'tcx> Visitor<'tcx> for IrMaps<'a, 'tcx> {
179181
fn visit_arm(&mut self, a: &'tcx hir::Arm) { visit_arm(self, a); }
180182
}
181183

184+
fn check_mod_liveness<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
185+
tcx.hir().visit_item_likes_in_module(module_def_id, &mut IrMaps::new(tcx).as_deep_visitor());
186+
}
187+
182188
pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
183-
tcx.hir().krate().visit_all_item_likes(&mut IrMaps::new(tcx).as_deep_visitor());
189+
for &module in tcx.hir().krate().modules.keys() {
190+
queries::check_mod_liveness::ensure(tcx, tcx.hir().local_def_id(module));
191+
}
184192
tcx.sess.abort_if_errors();
185193
}
186194

195+
pub fn provide(providers: &mut Providers<'_>) {
196+
*providers = Providers {
197+
check_mod_liveness,
198+
..*providers
199+
};
200+
}
201+
187202
impl fmt::Debug for LiveNode {
188203
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
189204
write!(f, "ln({})", self.get())

src/librustc/ty/query/config.rs

+27
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,33 @@ impl<'tcx> QueryDescription<'tcx> for queries::check_mod_item_types<'tcx> {
109109
}
110110
}
111111

112+
impl<'tcx> QueryDescription<'tcx> for queries::check_mod_privacy<'tcx> {
113+
fn describe(
114+
tcx: TyCtxt<'_, '_, '_>,
115+
key: DefId,
116+
) -> Cow<'static, str> {
117+
format!("checking privacy in {}", key.describe_as_module(tcx)).into()
118+
}
119+
}
120+
121+
impl<'tcx> QueryDescription<'tcx> for queries::check_mod_intrinsics<'tcx> {
122+
fn describe(
123+
tcx: TyCtxt<'_, '_, '_>,
124+
key: DefId,
125+
) -> Cow<'static, str> {
126+
format!("checking intrinsics in {}", key.describe_as_module(tcx)).into()
127+
}
128+
}
129+
130+
impl<'tcx> QueryDescription<'tcx> for queries::check_mod_liveness<'tcx> {
131+
fn describe(
132+
tcx: TyCtxt<'_, '_, '_>,
133+
key: DefId,
134+
) -> Cow<'static, str> {
135+
format!("checking liveness of variables in {}", key.describe_as_module(tcx)).into()
136+
}
137+
}
138+
112139
impl<'tcx> QueryDescription<'tcx> for queries::collect_mod_item_types<'tcx> {
113140
fn describe(
114141
tcx: TyCtxt<'_, '_, '_>,

src/librustc/ty/query/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ define_queries! { <'tcx>
264264

265265
[] fn check_mod_item_types: CheckModItemTypes(DefId) -> (),
266266

267+
[] fn check_mod_privacy: CheckModPrivacy(DefId) -> (),
268+
269+
[] fn check_mod_intrinsics: CheckModIntrinsics(DefId) -> (),
270+
271+
[] fn check_mod_liveness: CheckModLiveness(DefId) -> (),
272+
267273
[] fn collect_mod_item_types: CollectModItemTypes(DefId) -> (),
268274

269275
/// Caches CoerceUnsized kinds for impls on custom types.

src/librustc/ty/query/plumbing.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,9 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>,
12661266
DepKind::CheckModLoops => { force!(check_mod_loops, def_id!()); }
12671267
DepKind::CheckModUnstableApiUsage => { force!(check_mod_unstable_api_usage, def_id!()); }
12681268
DepKind::CheckModItemTypes => { force!(check_mod_item_types, def_id!()); }
1269+
DepKind::CheckModPrivacy => { force!(check_mod_privacy, def_id!()); }
1270+
DepKind::CheckModIntrinsics => { force!(check_mod_intrinsics, def_id!()); }
1271+
DepKind::CheckModLiveness => { force!(check_mod_liveness, def_id!()); }
12691272
DepKind::CollectModItemTypes => { force!(collect_mod_item_types, def_id!()); }
12701273
DepKind::Reachability => { force!(reachable_set, LOCAL_CRATE); }
12711274
DepKind::MirKeys => { force!(mir_keys, LOCAL_CRATE); }

src/librustc_driver/driver.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,8 @@ pub fn default_provide(providers: &mut ty::query::Providers) {
11681168
ty::provide(providers);
11691169
traits::provide(providers);
11701170
stability::provide(providers);
1171+
middle::intrinsicck::provide(providers);
1172+
middle::liveness::provide(providers);
11711173
reachable::provide(providers);
11721174
rustc_passes::provide(providers);
11731175
rustc_traits::provide(providers);

src/librustc_privacy/lib.rs

+31-13
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ use rustc::lint;
2222
use rustc::middle::privacy::{AccessLevel, AccessLevels};
2323
use rustc::ty::{self, TyCtxt, Ty, TraitRef, TypeFoldable, GenericParamDefKind};
2424
use rustc::ty::fold::TypeVisitor;
25-
use rustc::ty::query::Providers;
25+
use rustc::ty::query::{Providers, queries};
2626
use rustc::ty::subst::Substs;
2727
use rustc::util::nodemap::NodeSet;
2828
use rustc_data_structures::fx::FxHashSet;
2929
use rustc_data_structures::sync::Lrc;
30-
use syntax::ast::{self, CRATE_NODE_ID, Ident};
30+
use syntax::ast::{self, DUMMY_NODE_ID, Ident};
3131
use syntax::attr;
3232
use syntax::symbol::keywords;
3333
use syntax_pos::Span;
@@ -782,6 +782,10 @@ impl<'a, 'tcx> Visitor<'tcx> for NamePrivacyVisitor<'a, 'tcx> {
782782
NestedVisitorMap::All(&self.tcx.hir())
783783
}
784784

785+
fn visit_mod(&mut self, _m: &'tcx hir::Mod, _s: Span, _n: ast::NodeId) {
786+
// Don't visit modules inside
787+
}
788+
785789
fn visit_nested_body(&mut self, body: hir::BodyId) {
786790
let orig_tables = mem::replace(&mut self.tables, self.tcx.body_tables(body));
787791
let body = self.tcx.hir().body(body);
@@ -917,6 +921,10 @@ impl<'a, 'tcx> Visitor<'tcx> for TypePrivacyVisitor<'a, 'tcx> {
917921
NestedVisitorMap::All(&self.tcx.hir())
918922
}
919923

924+
fn visit_mod(&mut self, _m: &'tcx hir::Mod, _s: Span, _n: ast::NodeId) {
925+
// Don't visit modules inside
926+
}
927+
920928
fn visit_nested_body(&mut self, body: hir::BodyId) {
921929
let orig_tables = mem::replace(&mut self.tables, self.tcx.body_tables(body));
922930
let orig_in_body = mem::replace(&mut self.in_body, true);
@@ -1654,6 +1662,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx>
16541662
pub fn provide(providers: &mut Providers) {
16551663
*providers = Providers {
16561664
privacy_access_levels,
1665+
check_mod_privacy,
16571666
..*providers
16581667
};
16591668
}
@@ -1662,34 +1671,43 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Lrc<AccessLevels> {
16621671
tcx.privacy_access_levels(LOCAL_CRATE)
16631672
}
16641673

1665-
fn privacy_access_levels<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1666-
krate: CrateNum)
1667-
-> Lrc<AccessLevels> {
1668-
assert_eq!(krate, LOCAL_CRATE);
1669-
1670-
let krate = tcx.hir().krate();
1674+
fn check_mod_privacy<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
16711675
let empty_tables = ty::TypeckTables::empty(None);
16721676

16731677
// Check privacy of names not checked in previous compilation stages.
16741678
let mut visitor = NamePrivacyVisitor {
16751679
tcx,
16761680
tables: &empty_tables,
1677-
current_item: CRATE_NODE_ID,
1681+
current_item: DUMMY_NODE_ID,
16781682
empty_tables: &empty_tables,
16791683
};
1680-
intravisit::walk_crate(&mut visitor, krate);
1684+
let (module, span, node_id) = tcx.hir().get_module(module_def_id);
1685+
intravisit::walk_mod(&mut visitor, module, node_id);
16811686

16821687
// Check privacy of explicitly written types and traits as well as
16831688
// inferred types of expressions and patterns.
16841689
let mut visitor = TypePrivacyVisitor {
16851690
tcx,
16861691
tables: &empty_tables,
1687-
current_item: DefId::local(CRATE_DEF_INDEX),
1692+
current_item: module_def_id,
16881693
in_body: false,
1689-
span: krate.span,
1694+
span,
16901695
empty_tables: &empty_tables,
16911696
};
1692-
intravisit::walk_crate(&mut visitor, krate);
1697+
intravisit::walk_mod(&mut visitor, module, node_id);
1698+
}
1699+
1700+
fn privacy_access_levels<'tcx>(
1701+
tcx: TyCtxt<'_, 'tcx, 'tcx>,
1702+
krate: CrateNum,
1703+
) -> Lrc<AccessLevels> {
1704+
assert_eq!(krate, LOCAL_CRATE);
1705+
1706+
let krate = tcx.hir().krate();
1707+
1708+
for &module in tcx.hir().krate().modules.keys() {
1709+
queries::check_mod_privacy::ensure(tcx, tcx.hir().local_def_id(module));
1710+
}
16931711

16941712
// Build up a set of all exported items in the AST. This is a set of all
16951713
// items which are reachable from external crates based on visibility.

0 commit comments

Comments
 (0)