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]>
Tested on x86_64-pc-linux-gnu.
---
.../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 5531328ba4b..d747e1ed04e 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 54c96ef844d..15c758651ae 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 d7c1955f8ad..26f13f8d22e 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 a5eefa9e867..617963e73b4 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 c0041399fc6..20d2ceb96f5 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