Skip to content

Commit db9fea5

Browse files
committed
Avoid more invocations of hir_crate query.
1 parent 1149193 commit db9fea5

File tree

41 files changed

+123
-141
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+123
-141
lines changed

compiler/rustc_hir/src/hir.rs

+2-49
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::def::{CtorKind, DefKind, Res};
22
use crate::def_id::{DefId, CRATE_DEF_ID};
33
crate use crate::hir_id::{HirId, ItemLocalId};
4-
use crate::{itemlikevisit, LangItem};
4+
use crate::LangItem;
55

66
use rustc_ast::util::parser::ExprPrecedence;
77
use rustc_ast::{self as ast, CrateSugar, LlvmAsmDialect};
@@ -10,7 +10,6 @@ pub use rustc_ast::{BorrowKind, ImplPolarity, IsAuto};
1010
pub use rustc_ast::{CaptureBy, Movability, Mutability};
1111
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
1212
use rustc_data_structures::fx::FxHashMap;
13-
use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
1413
use rustc_index::vec::IndexVec;
1514
use rustc_macros::HashStable_Generic;
1615
use rustc_span::source_map::Spanned;
@@ -672,7 +671,7 @@ pub struct Crate<'hir> {
672671
pub attrs: BTreeMap<HirId, &'hir [Attribute]>,
673672
}
674673

675-
impl Crate<'hir> {
674+
impl<'hir> Crate<'hir> {
676675
pub fn module(&self) -> &'hir Mod<'hir> {
677676
if let Some(OwnerNode::Crate(m)) = self.owners[CRATE_DEF_ID] { m } else { panic!() }
678677
}
@@ -698,52 +697,6 @@ impl Crate<'hir> {
698697
}
699698
}
700699

701-
impl Crate<'_> {
702-
/// Visits all items in the crate in some deterministic (but
703-
/// unspecified) order. If you just need to process every item,
704-
/// but don't care about nesting, this method is the best choice.
705-
///
706-
/// If you do care about nesting -- usually because your algorithm
707-
/// follows lexical scoping rules -- then you want a different
708-
/// approach. You should override `visit_nested_item` in your
709-
/// visitor and then call `intravisit::walk_crate` instead.
710-
pub fn visit_all_item_likes<'hir, V>(&'hir self, visitor: &mut V)
711-
where
712-
V: itemlikevisit::ItemLikeVisitor<'hir>,
713-
{
714-
for owner in self.owners.iter().filter_map(Option::as_ref) {
715-
match owner {
716-
OwnerNode::Item(item) => visitor.visit_item(item),
717-
OwnerNode::ForeignItem(item) => visitor.visit_foreign_item(item),
718-
OwnerNode::ImplItem(item) => visitor.visit_impl_item(item),
719-
OwnerNode::TraitItem(item) => visitor.visit_trait_item(item),
720-
OwnerNode::Crate(_) => {}
721-
}
722-
}
723-
}
724-
725-
/// A parallel version of `visit_all_item_likes`.
726-
pub fn par_visit_all_item_likes<'hir, V>(&'hir self, visitor: &V)
727-
where
728-
V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send,
729-
{
730-
par_for_each_in(&self.owners.raw, |owner| match owner {
731-
Some(OwnerNode::Item(item)) => visitor.visit_item(item),
732-
Some(OwnerNode::ForeignItem(item)) => visitor.visit_foreign_item(item),
733-
Some(OwnerNode::ImplItem(item)) => visitor.visit_impl_item(item),
734-
Some(OwnerNode::TraitItem(item)) => visitor.visit_trait_item(item),
735-
Some(OwnerNode::Crate(_)) | None => {}
736-
})
737-
}
738-
739-
pub fn items<'hir>(&'hir self) -> impl Iterator<Item = &'hir Item<'hir>> + 'hir {
740-
self.owners.iter().filter_map(|owner| match owner {
741-
Some(OwnerNode::Item(item)) => Some(*item),
742-
_ => None,
743-
})
744-
}
745-
}
746-
747700
/// A block of statements `{ .. }`, which may have a label (in this case the
748701
/// `targeted_by_break` field will be `true`) and may be `unsafe` by means of
749702
/// the `rules` being anything but `DefaultBlock`.

compiler/rustc_hir_pretty/src/lib.rs

-13
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,6 @@ pub struct NoAnn;
5151
impl PpAnn for NoAnn {}
5252
pub const NO_ANN: &dyn PpAnn = &NoAnn;
5353

54-
impl PpAnn for hir::Crate<'_> {
55-
fn nested(&self, state: &mut State<'_>, nested: Nested) {
56-
match nested {
57-
Nested::Item(id) => state.print_item(self.item(id)),
58-
Nested::TraitItem(id) => state.print_trait_item(self.trait_item(id)),
59-
Nested::ImplItem(id) => state.print_impl_item(self.impl_item(id)),
60-
Nested::ForeignItem(id) => state.print_foreign_item(self.foreign_item(id)),
61-
Nested::Body(id) => state.print_expr(&self.body(id).value),
62-
Nested::BodyParamPat(id, i) => state.print_pat(&self.body(id).params[i].pat),
63-
}
64-
}
65-
}
66-
6754
/// Identical to the `PpAnn` implementation for `hir::Crate`,
6855
/// except it avoids creating a dependency on the whole crate.
6956
impl PpAnn for &dyn rustc_hir::intravisit::Map<'_> {

compiler/rustc_incremental/src/assert_dep_graph.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub fn assert_dep_graph(tcx: TyCtxt<'_>) {
7474
let mut visitor =
7575
IfThisChanged { tcx, if_this_changed: vec![], then_this_would_need: vec![] };
7676
visitor.process_attrs(hir::CRATE_HIR_ID);
77-
tcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor());
77+
tcx.hir().visit_all_item_likes(&mut visitor.as_deep_visitor());
7878
(visitor.if_this_changed, visitor.then_this_would_need)
7979
};
8080

compiler/rustc_incremental/src/persist/dirty_clean.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,8 @@ pub fn check_dirty_clean_annotations(tcx: TyCtxt<'_>) {
137137
}
138138

139139
tcx.dep_graph.with_ignore(|| {
140-
let krate = tcx.hir().krate();
141140
let mut dirty_clean_visitor = DirtyCleanVisitor { tcx, checked_attrs: Default::default() };
142-
krate.visit_all_item_likes(&mut dirty_clean_visitor);
141+
tcx.hir().visit_all_item_likes(&mut dirty_clean_visitor);
143142

144143
let mut all_attrs = FindAllAttrs { tcx, found_attrs: vec![] };
145144
tcx.hir().walk_attributes(&mut all_attrs);

compiler/rustc_interface/src/proc_macro_decls.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rustc_span::symbol::sym;
77

88
fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option<LocalDefId> {
99
let mut finder = Finder { tcx, decls: None };
10-
tcx.hir().krate().visit_all_item_likes(&mut finder);
10+
tcx.hir().visit_all_item_likes(&mut finder);
1111

1212
finder.decls.map(|id| tcx.hir().local_def_id(id))
1313
}

compiler/rustc_lint/src/builtin.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,14 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc {
584584
self.doc_hidden_stack.pop().expect("empty doc_hidden_stack");
585585
}
586586

587-
fn check_crate(&mut self, cx: &LateContext<'_>, krate: &hir::Crate<'_>) {
588-
self.check_missing_docs_attrs(cx, CRATE_DEF_ID, krate.module().inner, "the", "crate");
587+
fn check_crate(&mut self, cx: &LateContext<'_>, _: &hir::Crate<'_>) {
588+
self.check_missing_docs_attrs(
589+
cx,
590+
CRATE_DEF_ID,
591+
cx.tcx.def_span(CRATE_DEF_ID),
592+
"the",
593+
"crate",
594+
);
589595
}
590596

591597
fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) {

compiler/rustc_metadata/src/foreign_modules.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_middle::ty::TyCtxt;
55

66
crate fn collect(tcx: TyCtxt<'_>) -> Vec<ForeignModule> {
77
let mut collector = Collector { modules: Vec::new() };
8-
tcx.hir().krate().visit_all_item_likes(&mut collector);
8+
tcx.hir().visit_all_item_likes(&mut collector);
99
collector.modules
1010
}
1111

compiler/rustc_metadata/src/native_libs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use rustc_target::spec::abi::Abi;
1414

1515
crate fn collect(tcx: TyCtxt<'_>) -> Vec<NativeLib> {
1616
let mut collector = Collector { tcx, libs: Vec::new() };
17-
tcx.hir().krate().visit_all_item_likes(&mut collector);
17+
tcx.hir().visit_all_item_likes(&mut collector);
1818
collector.process_command_line();
1919
collector.libs
2020
}

compiler/rustc_metadata/src/rmeta/encoder.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -440,16 +440,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
440440
}
441441

442442
fn encode_info_for_items(&mut self) {
443-
let krate = self.tcx.hir().krate();
444-
self.encode_info_for_mod(CRATE_DEF_ID, krate.module());
443+
self.encode_info_for_mod(CRATE_DEF_ID, self.tcx.hir().root_module());
445444

446445
// Proc-macro crates only export proc-macro items, which are looked
447446
// up using `proc_macro_data`
448447
if self.is_proc_macro {
449448
return;
450449
}
451450

452-
krate.visit_all_item_likes(&mut self.as_deep_visitor());
451+
self.tcx.hir().visit_all_item_likes(&mut self.as_deep_visitor());
453452
}
454453

455454
fn encode_def_path_table(&mut self) {
@@ -1782,7 +1781,7 @@ impl EncodeContext<'a, 'tcx> {
17821781
debug!("EncodeContext::encode_impls()");
17831782
let tcx = self.tcx;
17841783
let mut visitor = ImplVisitor { tcx, impls: FxHashMap::default() };
1785-
tcx.hir().krate().visit_all_item_likes(&mut visitor);
1784+
tcx.hir().visit_all_item_likes(&mut visitor);
17861785

17871786
let mut all_impls: Vec<_> = visitor.impls.into_iter().collect();
17881787

compiler/rustc_middle/src/hir/map/mod.rs

+55
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_ast as ast;
66
use rustc_data_structures::fingerprint::Fingerprint;
77
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
88
use rustc_data_structures::svh::Svh;
9+
use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
910
use rustc_hir::def::{DefKind, Res};
1011
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
1112
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
@@ -156,6 +157,21 @@ impl<'hir> Map<'hir> {
156157
self.tcx.hir_crate(())
157158
}
158159

160+
pub fn root_module(&self) -> &'hir Mod<'hir> {
161+
match self.tcx.hir_owner(CRATE_DEF_ID).map(|o| o.node) {
162+
Some(OwnerNode::Crate(item)) => item,
163+
_ => panic!(),
164+
}
165+
}
166+
167+
crate fn items(&self) -> impl Iterator<Item = &'hir Item<'hir>> + 'hir {
168+
let krate = self.krate();
169+
krate.owners.iter().filter_map(|owner| match owner.as_ref()? {
170+
OwnerNode::Item(item) => Some(*item),
171+
_ => None,
172+
})
173+
}
174+
159175
pub fn def_key(&self, def_id: LocalDefId) -> DefKey {
160176
// Accessing the DefKey is ok, since it is part of DefPathHash.
161177
self.tcx.untracked_resolutions.definitions.def_key(def_id)
@@ -531,6 +547,45 @@ impl<'hir> Map<'hir> {
531547
}
532548
}
533549

550+
/// Visits all items in the crate in some deterministic (but
551+
/// unspecified) order. If you just need to process every item,
552+
/// but don't care about nesting, this method is the best choice.
553+
///
554+
/// If you do care about nesting -- usually because your algorithm
555+
/// follows lexical scoping rules -- then you want a different
556+
/// approach. You should override `visit_nested_item` in your
557+
/// visitor and then call `intravisit::walk_crate` instead.
558+
pub fn visit_all_item_likes<V>(&self, visitor: &mut V)
559+
where
560+
V: itemlikevisit::ItemLikeVisitor<'hir>,
561+
{
562+
let krate = self.krate();
563+
for owner in krate.owners.iter().filter_map(Option::as_ref) {
564+
match owner {
565+
OwnerNode::Item(item) => visitor.visit_item(item),
566+
OwnerNode::ForeignItem(item) => visitor.visit_foreign_item(item),
567+
OwnerNode::ImplItem(item) => visitor.visit_impl_item(item),
568+
OwnerNode::TraitItem(item) => visitor.visit_trait_item(item),
569+
OwnerNode::Crate(_) => {}
570+
}
571+
}
572+
}
573+
574+
/// A parallel version of `visit_all_item_likes`.
575+
pub fn par_visit_all_item_likes<V>(&self, visitor: &V)
576+
where
577+
V: itemlikevisit::ParItemLikeVisitor<'hir> + Sync + Send,
578+
{
579+
let krate = self.krate();
580+
par_for_each_in(&krate.owners.raw, |owner| match owner.as_ref() {
581+
Some(OwnerNode::Item(item)) => visitor.visit_item(item),
582+
Some(OwnerNode::ForeignItem(item)) => visitor.visit_foreign_item(item),
583+
Some(OwnerNode::ImplItem(item)) => visitor.visit_impl_item(item),
584+
Some(OwnerNode::TraitItem(item)) => visitor.visit_trait_item(item),
585+
Some(OwnerNode::Crate(_)) | None => {}
586+
})
587+
}
588+
534589
pub fn visit_item_likes_in_module<V>(&self, module: LocalDefId, visitor: &mut V)
535590
where
536591
V: ItemLikeVisitor<'hir>,

compiler/rustc_middle/src/ty/print/pretty.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2340,7 +2340,7 @@ define_print_and_forward_display! {
23402340
fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, Namespace, DefId)) {
23412341
// Iterate all local crate items no matter where they are defined.
23422342
let hir = tcx.hir();
2343-
for item in hir.krate().items() {
2343+
for item in hir.items() {
23442344
if item.ident.name.as_str().is_empty() || matches!(item.kind, ItemKind::Use(_, _)) {
23452345
continue;
23462346
}

compiler/rustc_mir_transform/src/lib.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,7 @@ fn mir_keys(tcx: TyCtxt<'_>, (): ()) -> FxHashSet<LocalDefId> {
160160
NestedVisitorMap::None
161161
}
162162
}
163-
tcx.hir()
164-
.krate()
165-
.visit_all_item_likes(&mut GatherCtors { tcx, set: &mut set }.as_deep_visitor());
163+
tcx.hir().visit_all_item_likes(&mut GatherCtors { tcx, set: &mut set }.as_deep_visitor());
166164

167165
set
168166
}

compiler/rustc_monomorphize/src/collector.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ fn collect_roots(tcx: TyCtxt<'_>, mode: MonoItemCollectionMode) -> Vec<MonoItem<
330330

331331
let mut visitor = RootCollector { tcx, mode, entry_fn, output: &mut roots };
332332

333-
tcx.hir().krate().visit_all_item_likes(&mut visitor);
333+
tcx.hir().visit_all_item_likes(&mut visitor);
334334

335335
visitor.push_extra_entry_roots();
336336
}

compiler/rustc_passes/src/dead.rs

+7-12
Original file line numberDiff line numberDiff line change
@@ -510,15 +510,14 @@ fn has_allow_dead_code_or_lang_attr(tcx: TyCtxt<'_>, id: hir::HirId) -> bool {
510510
// or
511511
// 2) We are not sure to be live or not
512512
// * Implementations of traits and trait methods
513-
struct LifeSeeder<'k, 'tcx> {
513+
struct LifeSeeder<'tcx> {
514514
worklist: Vec<LocalDefId>,
515-
krate: &'k hir::Crate<'k>,
516515
tcx: TyCtxt<'tcx>,
517516
// see `MarkSymbolVisitor::struct_constructors`
518517
struct_constructors: FxHashMap<LocalDefId, LocalDefId>,
519518
}
520519

521-
impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
520+
impl<'v, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'tcx> {
522521
fn visit_item(&mut self, item: &hir::Item<'_>) {
523522
let allow_dead_code = has_allow_dead_code_or_lang_attr(self.tcx, item.hir_id());
524523
if allow_dead_code {
@@ -545,7 +544,7 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
545544
self.worklist.push(item.def_id);
546545
}
547546
for impl_item_ref in items {
548-
let impl_item = self.krate.impl_item(impl_item_ref.id);
547+
let impl_item = self.tcx.hir().impl_item(impl_item_ref.id);
549548
if of_trait.is_some()
550549
|| has_allow_dead_code_or_lang_attr(self.tcx, impl_item.hir_id())
551550
{
@@ -589,7 +588,6 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> {
589588
fn create_and_seed_worklist<'tcx>(
590589
tcx: TyCtxt<'tcx>,
591590
access_levels: &privacy::AccessLevels,
592-
krate: &hir::Crate<'_>,
593591
) -> (Vec<LocalDefId>, FxHashMap<LocalDefId, LocalDefId>) {
594592
let worklist = access_levels
595593
.map
@@ -604,19 +602,17 @@ fn create_and_seed_worklist<'tcx>(
604602
.collect::<Vec<_>>();
605603

606604
// Seed implemented trait items
607-
let mut life_seeder =
608-
LifeSeeder { worklist, krate, tcx, struct_constructors: Default::default() };
609-
krate.visit_all_item_likes(&mut life_seeder);
605+
let mut life_seeder = LifeSeeder { worklist, tcx, struct_constructors: Default::default() };
606+
tcx.hir().visit_all_item_likes(&mut life_seeder);
610607

611608
(life_seeder.worklist, life_seeder.struct_constructors)
612609
}
613610

614611
fn find_live<'tcx>(
615612
tcx: TyCtxt<'tcx>,
616613
access_levels: &privacy::AccessLevels,
617-
krate: &hir::Crate<'_>,
618614
) -> FxHashSet<LocalDefId> {
619-
let (worklist, struct_constructors) = create_and_seed_worklist(tcx, access_levels, krate);
615+
let (worklist, struct_constructors) = create_and_seed_worklist(tcx, access_levels);
620616
let mut symbol_visitor = MarkSymbolVisitor {
621617
worklist,
622618
tcx,
@@ -834,8 +830,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
834830

835831
pub fn check_crate(tcx: TyCtxt<'_>) {
836832
let access_levels = &tcx.privacy_access_levels(());
837-
let krate = tcx.hir().krate();
838-
let live_symbols = find_live(tcx, access_levels, krate);
833+
let live_symbols = find_live(tcx, access_levels);
839834
let mut visitor = DeadVisitor { tcx, live_symbols };
840835
tcx.hir().walk_toplevel_module(&mut visitor);
841836
}

compiler/rustc_passes/src/diagnostic_items.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn diagnostic_items<'tcx>(tcx: TyCtxt<'tcx>, cnum: CrateNum) -> FxHashMap<Symbol
105105
let mut collector = DiagnosticItemCollector::new(tcx);
106106

107107
// Collect diagnostic items in this crate.
108-
tcx.hir().krate().visit_all_item_likes(&mut collector);
108+
tcx.hir().visit_all_item_likes(&mut collector);
109109

110110
collector.items
111111
}

compiler/rustc_passes/src/entry.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_ast::entry::EntryPointType;
22
use rustc_errors::struct_span_err;
3-
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
3+
use rustc_hir::def_id::{DefId, CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE};
44
use rustc_hir::itemlikevisit::ItemLikeVisitor;
55
use rustc_hir::{ForeignItem, HirId, ImplItem, Item, ItemKind, Node, TraitItem, CRATE_HIR_ID};
66
use rustc_middle::hir::map::Map;
@@ -68,7 +68,7 @@ fn entry_fn(tcx: TyCtxt<'_>, (): ()) -> Option<(DefId, EntryFnType)> {
6868
non_main_fns: Vec::new(),
6969
};
7070

71-
tcx.hir().krate().visit_all_item_likes(&mut ctxt);
71+
tcx.hir().visit_all_item_likes(&mut ctxt);
7272

7373
configure_main(tcx, &ctxt)
7474
}
@@ -183,7 +183,7 @@ fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) -> Option<(De
183183
}
184184

185185
fn no_main_err(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) {
186-
let sp = tcx.hir().krate().module().inner;
186+
let sp = tcx.def_span(CRATE_DEF_ID);
187187
if *tcx.sess.parse_sess.reached_eof.borrow() {
188188
// There's an unclosed brace that made the parser reach `Eof`, we shouldn't complain about
189189
// the missing `fn main()` then as it might have been hidden inside an unclosed block.

0 commit comments

Comments
 (0)