From 3d19869935eef770914bc09743da7a8980eb8c4b Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 22 Jun 2026 10:05:57 +0300 Subject: [PATCH] Refactor `proc_macro_decls_static` --- compiler/rustc_hir/src/hir.rs | 1 + compiler/rustc_interface/src/lib.rs | 1 - compiler/rustc_interface/src/passes.rs | 4 +- .../rustc_interface/src/proc_macro_decls.rs | 20 -------- compiler/rustc_middle/src/hir/map.rs | 51 ++++++++++--------- compiler/rustc_middle/src/hir/mod.rs | 8 +++ 6 files changed, 39 insertions(+), 46 deletions(-) delete mode 100644 compiler/rustc_interface/src/proc_macro_decls.rs diff --git a/compiler/rustc_hir/src/hir.rs b/compiler/rustc_hir/src/hir.rs index 5fbd57bbb5c32..2a10245d3d2e8 100644 --- a/compiler/rustc_hir/src/hir.rs +++ b/compiler/rustc_hir/src/hir.rs @@ -4570,6 +4570,7 @@ impl<'hir> Item<'hir> { HirId::make_owner(self.owner_id.def_id) } + #[inline] pub fn item_id(&self) -> ItemId { ItemId { owner_id: self.owner_id } } diff --git a/compiler/rustc_interface/src/lib.rs b/compiler/rustc_interface/src/lib.rs index 77ee7b8896beb..3bbe790af2e71 100644 --- a/compiler/rustc_interface/src/lib.rs +++ b/compiler/rustc_interface/src/lib.rs @@ -10,7 +10,6 @@ pub mod diagnostics; pub mod interface; mod limits; pub mod passes; -mod proc_macro_decls; mod queries; pub mod util; diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 060083e3bb59b..38ab1ef8dedf7 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -49,7 +49,7 @@ use rustc_trait_selection::{solve, traits}; use tracing::{info, instrument}; use crate::interface::Compiler; -use crate::{diagnostics, limits, proc_macro_decls, util}; +use crate::{diagnostics, limits, util}; pub fn parse<'a>(sess: &'a Session) -> ast::Crate { let mut krate = sess @@ -897,9 +897,9 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock = LazyLock::new(|| { providers.queries.resolutions = |tcx, ()| tcx.resolver_for_lowering_raw(()).2; providers.queries.early_lint_checks = early_lint_checks; providers.queries.env_var_os = env_var_os; + providers.queries.proc_macro_decls_static = |tcx, _| tcx.hir_crate_items(()).proc_macro_decls(); rustc_ast_lowering::provide(&mut providers.queries); limits::provide(&mut providers.queries); - proc_macro_decls::provide(&mut providers.queries); rustc_expand::provide(&mut providers.queries); rustc_const_eval::provide(providers); rustc_middle::hir::provide(&mut providers.queries); diff --git a/compiler/rustc_interface/src/proc_macro_decls.rs b/compiler/rustc_interface/src/proc_macro_decls.rs deleted file mode 100644 index eb60c61b0af71..0000000000000 --- a/compiler/rustc_interface/src/proc_macro_decls.rs +++ /dev/null @@ -1,20 +0,0 @@ -use rustc_hir::def_id::LocalDefId; -use rustc_hir::find_attr; -use rustc_middle::query::Providers; -use rustc_middle::ty::TyCtxt; - -fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option { - let mut decls = None; - - for id in tcx.hir_free_items() { - if find_attr!(tcx, id.hir_id(), RustcProcMacroDecls) { - decls = Some(id.owner_id.def_id); - } - } - - decls -} - -pub(crate) fn provide(providers: &mut Providers) { - *providers = Providers { proc_macro_decls_static, ..*providers }; -} diff --git a/compiler/rustc_middle/src/hir/map.rs b/compiler/rustc_middle/src/hir/map.rs index 4a625ef3a5d98..444433dcb6c54 100644 --- a/compiler/rustc_middle/src/hir/map.rs +++ b/compiler/rustc_middle/src/hir/map.rs @@ -1275,8 +1275,10 @@ pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalModDefId) -> Mod opaques, nested_bodies, eiis, + proc_macro_decls, .. } = collector; + ModuleItems { add_root: false, submodules: submodules.into_boxed_slice(), @@ -1288,6 +1290,7 @@ pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalModDefId) -> Mod opaques: opaques.into_boxed_slice(), nested_bodies: nested_bodies.into_boxed_slice(), eiis: eiis.into_boxed_slice(), + proc_macro_decls, } } @@ -1310,6 +1313,7 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems { opaques, nested_bodies, eiis, + proc_macro_decls, .. } = collector; @@ -1324,40 +1328,32 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems { opaques: opaques.into_boxed_slice(), nested_bodies: nested_bodies.into_boxed_slice(), eiis: eiis.into_boxed_slice(), + proc_macro_decls, } } struct ItemCollector<'tcx> { // When true, it collects all items in the create, // otherwise it collects items in some module. + // Converting this to generic const didn't lead to significant perf improvements + // (see ). crate_collector: bool, tcx: TyCtxt<'tcx>, - submodules: Vec, - items: Vec, - trait_items: Vec, - impl_items: Vec, - foreign_items: Vec, - body_owners: Vec, - opaques: Vec, - nested_bodies: Vec, - eiis: Vec, + submodules: Vec = vec![], + items: Vec = vec![], + trait_items: Vec = vec![], + impl_items: Vec = vec![], + foreign_items: Vec = vec![], + body_owners: Vec = vec![], + opaques: Vec = vec![], + nested_bodies: Vec = vec![], + eiis: Vec = vec![], + proc_macro_decls: Option = None, } impl<'tcx> ItemCollector<'tcx> { fn new(tcx: TyCtxt<'tcx>, crate_collector: bool) -> ItemCollector<'tcx> { - ItemCollector { - crate_collector, - tcx, - submodules: Vec::default(), - items: Vec::default(), - trait_items: Vec::default(), - impl_items: Vec::default(), - foreign_items: Vec::default(), - body_owners: Vec::default(), - opaques: Vec::default(), - nested_bodies: Vec::default(), - eiis: Vec::default(), - } + ItemCollector { crate_collector, tcx, .. } } } @@ -1373,7 +1369,16 @@ impl<'hir> Visitor<'hir> for ItemCollector<'hir> { self.body_owners.push(item.owner_id.def_id); } - self.items.push(item.item_id()); + let item_id = item.item_id(); + + if self.crate_collector + && self.proc_macro_decls.is_none() + && find_attr!(self.tcx, item_id.hir_id(), RustcProcMacroDecls) + { + self.proc_macro_decls = Some(item_id.owner_id.def_id); + } + + self.items.push(item_id); if let ItemKind::Static(..) | ItemKind::Fn { .. } | ItemKind::Macro(..) = &item.kind && item.eii diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs index 4a413a71872bb..e0c1482af72ba 100644 --- a/compiler/rustc_middle/src/hir/mod.rs +++ b/compiler/rustc_middle/src/hir/mod.rs @@ -39,6 +39,9 @@ pub struct ModuleItems { /// Statics and functions with an `EiiImpls` or `EiiExternTarget` attribute eiis: Box<[LocalDefId]>, + + // only filled with hir_crate_items, not with hir_module_items + proc_macro_decls: Option, } impl ModuleItems { @@ -56,6 +59,11 @@ impl ModuleItems { self.trait_items.iter().copied() } + #[inline] + pub fn proc_macro_decls(&self) -> Option { + self.proc_macro_decls + } + pub fn eiis(&self) -> impl Iterator { self.eiis.iter().copied() }