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);

Reply via email to