https://gcc.gnu.org/g:dfbdaf2f709a98748a1db719a31ea3f5ab3729a1
commit r17-5161-gdfbdaf2f709a98748a1db719a31ea3f5ab3729a1 Author: Pierre-Emmanuel Patry <[email protected]> Date: Thu Sep 10 21:39:53 2026 +0200 gccrs: Add ASTMapping to regroup all AST items mappings Rust hir map is too big, regroup some of ast item mappings within a specialized class. gcc/rust/ChangeLog: * checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::check_violation_inner): Use ast category. * checks/errors/privacy/rust-pub-restricted-visitor.cc (PubRestrictedVisitor::is_restriction_valid): Likewise. * checks/errors/privacy/rust-visibility-resolver.cc (VisibilityResolver::go): Likewise. (VisibilityResolver::resolve_and_update): Likewise. (VisibilityResolver::visit): Likewise. * util/rust-hir-map.cc (Mappings::insert_visibility): Move to ASTMappings. (Mappings::lookup_visibility): Likewise. * util/rust-hir-map.h (class ASTMappings): Add a mapping class dedicated to mapping an id to an Item. Add a specialized ASTMappings class to hold all ast related mappings. Signed-off-by: Pierre-Emmanuel Patry <[email protected]> Diff: --- .../checks/errors/privacy/rust-privacy-reporter.cc | 2 +- .../errors/privacy/rust-pub-restricted-visitor.cc | 2 +- .../errors/privacy/rust-visibility-resolver.cc | 18 +++++++++------ gcc/rust/util/rust-hir-map.cc | 16 ------------- gcc/rust/util/rust-hir-map.h | 26 +++++++++++++++++++--- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc index 5531328ba4b4..d747e1ed04ed 100644 --- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc +++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc @@ -97,7 +97,7 @@ void PrivacyReporter::check_violation_inner (NodeId ref_node_id, const location_t locus) { - auto vis = mappings.lookup_visibility (ref_node_id); + auto vis = mappings.ast.module_visibility.lookup (ref_node_id); // FIXME: Can we really return here if the item has no visibility? if (!vis) diff --git a/gcc/rust/checks/errors/privacy/rust-pub-restricted-visitor.cc b/gcc/rust/checks/errors/privacy/rust-pub-restricted-visitor.cc index 54c96ef844d2..15c758651ae9 100644 --- a/gcc/rust/checks/errors/privacy/rust-pub-restricted-visitor.cc +++ b/gcc/rust/checks/errors/privacy/rust-pub-restricted-visitor.cc @@ -27,7 +27,7 @@ bool PubRestrictedVisitor::is_restriction_valid (NodeId item_id, const location_t locus) { - auto visibility = mappings.lookup_visibility (item_id); + auto visibility = mappings.ast.module_visibility.lookup (item_id); // If there is no visibility in the mappings, then the item is private and // does not contain any restriction diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc index d7c1955f8add..26f13f8d22e1 100644 --- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc +++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc @@ -35,8 +35,8 @@ VisibilityResolver::VisibilityResolver ( void VisibilityResolver::go (HIR::Crate &crate) { - mappings.insert_visibility (crate.get_mappings ().get_nodeid (), - ModuleVisibility::create_public ()); + mappings.ast.module_visibility.insert (crate.get_mappings ().get_nodeid (), + ModuleVisibility::create_public ()); current_module = crate.get_mappings ().get_defid (); @@ -137,7 +137,8 @@ VisibilityResolver::resolve_and_update (const HIR::VisItem *item) if (!resolve_visibility (item->get_visibility (), module_vis)) return; // we will already have emitted errors - mappings.insert_visibility (item->get_mappings ().get_nodeid (), module_vis); + mappings.ast.module_visibility.insert (item->get_mappings ().get_nodeid (), + module_vis); } void @@ -197,9 +198,11 @@ VisibilityResolver::visit (HIR::Enum &enum_item) if (!resolve_visibility (enum_item.get_visibility (), vis)) return; - mappings.insert_visibility (enum_item.get_mappings ().get_nodeid (), vis); + auto &mod_vis_mapping = mappings.ast.module_visibility; + + mod_vis_mapping.insert (enum_item.get_mappings ().get_nodeid (), vis); for (auto &variant : enum_item.get_variants ()) - mappings.insert_visibility (variant->get_mappings ().get_nodeid (), vis); + mod_vis_mapping.insert (variant->get_mappings ().get_nodeid (), vis); } void @@ -225,9 +228,10 @@ VisibilityResolver::visit (HIR::Trait &trait) if (!resolve_visibility (trait.get_visibility (), vis)) return; - mappings.insert_visibility (trait.get_mappings ().get_nodeid (), vis); + auto &mod_vis_mapping = mappings.ast.module_visibility; + mod_vis_mapping.insert (trait.get_mappings ().get_nodeid (), vis); for (auto &item : trait.get_trait_items ()) - mappings.insert_visibility (item->get_mappings ().get_nodeid (), vis); + mod_vis_mapping.insert (item->get_mappings ().get_nodeid (), vis); } void diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index a5eefa9e8673..617963e73b43 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -1310,22 +1310,6 @@ ProcMacroMappings::lookup_attribute_invocation (AST::SimplePath &invoc) return it->second; } -void -Mappings::insert_visibility (NodeId id, Privacy::ModuleVisibility visibility) -{ - visibility_map.insert ({id, visibility}); -} - -tl::optional<Privacy::ModuleVisibility &> -Mappings::lookup_visibility (NodeId id) -{ - auto it = visibility_map.find (id); - if (it == visibility_map.end ()) - return tl::nullopt; - - return it->second; -} - void Mappings::insert_module_child (NodeId module, NodeId child) { diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index c0041399fc65..20d2ceb96f5e 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -157,6 +157,27 @@ public: AttributeProcMacro def); }; +template <typename Id, typename Item> class Mapping +{ + std::unordered_map<Id, Item> storage; + +public: + tl::optional<Item &> lookup (Id id) + { + auto it = storage.find (id); + if (it == storage.cend ()) + return tl::nullopt; + return it->second; + } + void insert (Id id, Item item) { storage.insert ({id, item}); } +}; + +class ASTMappings +{ +public: + Mapping<NodeId, Privacy::ModuleVisibility> module_visibility; +}; + class Mappings { public: @@ -165,6 +186,7 @@ public: CrateMappings crate_mapping; ProcMacroMappings pmacro_mappings; + ASTMappings ast; NodeId get_next_node_id (); HirId get_next_hir_id () @@ -179,6 +201,7 @@ public: LocalDefId get_next_localdef_id (CrateNum crateNum); AST::Crate &get_ast_crate_by_node_id (NodeId id); + HIR::Crate &insert_hir_crate (std::unique_ptr<HIR::Crate> &&crate); HIR::Crate &get_hir_crate (CrateNum crateNum); bool is_local_hirid_crate (HirId crateNum); @@ -394,9 +417,6 @@ public: void insert_exported_macro (AST::MacroRulesDefinition &def); std::vector<AST::MacroRulesDefinition> get_exported_macros (); - void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility); - tl::optional<Privacy::ModuleVisibility &> lookup_visibility (NodeId id); - void insert_glob_container (NodeId, AST::GlobContainer *); tl::optional<AST::GlobContainer *> lookup_glob_container (NodeId id);
