Skip to content

Commit 104e41f

Browse files
authored
Rollup merge of rust-lang#57253 - Zoxc:incr-passes2, r=michaelwoerister
Make privacy checking, intrinsic checking and liveness checking incremental Blocked on rust-lang#51487 r? @michaelwoerister
2 parents 33e6df4 + 959c870 commit 104e41f

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
@@ -509,6 +509,21 @@ impl<'hir> Map<'hir> {
509509
&self.forest.krate.attrs
510510
}
511511

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

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
@@ -1281,6 +1281,9 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>,
12811281
DepKind::CheckModLoops => { force!(check_mod_loops, def_id!()); }
12821282
DepKind::CheckModUnstableApiUsage => { force!(check_mod_unstable_api_usage, def_id!()); }
12831283
DepKind::CheckModItemTypes => { force!(check_mod_item_types, def_id!()); }
1284+
DepKind::CheckModPrivacy => { force!(check_mod_privacy, def_id!()); }
1285+
DepKind::CheckModIntrinsics => { force!(check_mod_intrinsics, def_id!()); }
1286+
DepKind::CheckModLiveness => { force!(check_mod_liveness, def_id!()); }
12841287
DepKind::CollectModItemTypes => { force!(collect_mod_item_types, def_id!()); }
12851288
DepKind::Reachability => { force!(reachable_set, LOCAL_CRATE); }
12861289
DepKind::MirKeys => { force!(mir_keys, LOCAL_CRATE); }

src/librustc_driver/driver.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,8 @@ pub fn default_provide(providers: &mut ty::query::Providers) {
11701170
ty::provide(providers);
11711171
traits::provide(providers);
11721172
stability::provide(providers);
1173+
middle::intrinsicck::provide(providers);
1174+
middle::liveness::provide(providers);
11731175
reachable::provide(providers);
11741176
rustc_passes::provide(providers);
11751177
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);
@@ -1659,6 +1667,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx>
16591667
pub fn provide(providers: &mut Providers) {
16601668
*providers = Providers {
16611669
privacy_access_levels,
1670+
check_mod_privacy,
16621671
..*providers
16631672
};
16641673
}
@@ -1667,34 +1676,43 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Lrc<AccessLevels> {
16671676
tcx.privacy_access_levels(LOCAL_CRATE)
16681677
}
16691678

1670-
fn privacy_access_levels<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1671-
krate: CrateNum)
1672-
-> Lrc<AccessLevels> {
1673-
assert_eq!(krate, LOCAL_CRATE);
1674-
1675-
let krate = tcx.hir().krate();
1679+
fn check_mod_privacy<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>, module_def_id: DefId) {
16761680
let empty_tables = ty::TypeckTables::empty(None);
16771681

16781682
// Check privacy of names not checked in previous compilation stages.
16791683
let mut visitor = NamePrivacyVisitor {
16801684
tcx,
16811685
tables: &empty_tables,
1682-
current_item: CRATE_NODE_ID,
1686+
current_item: DUMMY_NODE_ID,
16831687
empty_tables: &empty_tables,
16841688
};
1685-
intravisit::walk_crate(&mut visitor, krate);
1689+
let (module, span, node_id) = tcx.hir().get_module(module_def_id);
1690+
intravisit::walk_mod(&mut visitor, module, node_id);
16861691

16871692
// Check privacy of explicitly written types and traits as well as
16881693
// inferred types of expressions and patterns.
16891694
let mut visitor = TypePrivacyVisitor {
16901695
tcx,
16911696
tables: &empty_tables,
1692-
current_item: DefId::local(CRATE_DEF_INDEX),
1697+
current_item: module_def_id,
16931698
in_body: false,
1694-
span: krate.span,
1699+
span,
16951700
empty_tables: &empty_tables,
16961701
};
1697-
intravisit::walk_crate(&mut visitor, krate);
1702+
intravisit::walk_mod(&mut visitor, module, node_id);
1703+
}
1704+
1705+
fn privacy_access_levels<'tcx>(
1706+
tcx: TyCtxt<'_, 'tcx, 'tcx>,
1707+
krate: CrateNum,
1708+
) -> Lrc<AccessLevels> {
1709+
assert_eq!(krate, LOCAL_CRATE);
1710+
1711+
let krate = tcx.hir().krate();
1712+
1713+
for &module in tcx.hir().krate().modules.keys() {
1714+
queries::check_mod_privacy::ensure(tcx, tcx.hir().local_def_id(module));
1715+
}
16981716

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

0 commit comments

Comments
 (0)