From: Pierre-Emmanuel Patry <[email protected]>

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]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/e6da4afac5303fe3919ca87768dd8254a849209d

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4878

 .../errors/privacy/rust-privacy-reporter.cc   |  2 +-
 .../privacy/rust-pub-restricted-visitor.cc    |  2 +-
 .../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 5531328ba..d747e1ed0 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 54c96ef84..15c758651 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 d7c1955f8..26f13f8d2 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 a5eefa9e8..617963e73 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 c0041399f..20d2ceb96 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);
 
-- 
2.55.0

Reply via email to