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

HIR map is getting bigger and most lookup/insert functions are similar,
this commit regroup all simple HIR related mappings under one field.

gcc/rust/ChangeLog:

        * backend/rust-compile-item.cc (CompileItem::visit): Use new hir
        category.
        * backend/rust-compile-resolve-path.cc (HIRCompileBase::query_compile):
        Likewise.
        * backend/rust-mangle-v0.cc (v0_path): Likewise.
        * checks/errors/privacy/rust-visibility-resolver.cc
        (VisibilityResolver::resolve_module_path): Likewise.
        * checks/errors/rust-const-checker.cc 
(ConstChecker::check_function_call):
        Likewise.
        * checks/errors/rust-readonly-check.cc (ReadonlyChecker::visit):
        Likewise.
        * checks/errors/rust-unsafe-checker.cc 
(UnsafeChecker::check_use_of_static):
        Likewise.
        (UnsafeChecker::check_function_call): Likewise.
        (UnsafeChecker::check_function_attr): Likewise.
        * checks/lints/rust-lint-marklive.cc (MarkLive::go): Likewise.
        (MarkLive::visit): Likewise.
        * checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit):
        Likewise.
        * hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_extern_block):
        Likewise.
        * hir/rust-ast-lower-block.h: Likewise.
        * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::translate): Likewise.
        * hir/rust-ast-lower-implitem.cc (ASTLowerImplItem::visit): Likewise.
        (ASTLowerTraitItem::translate): Likewise.
        (ASTLowerTraitItem::visit): Likewise.
        * hir/rust-ast-lower-item.cc (ASTLoweringItem::translate): Likewise.
        (ASTLoweringItem::visit): Likewise.
        * hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::translate):
        Likewise.
        * hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::translate): Likewise.
        * hir/rust-ast-lower-struct-field-expr.h: Likewise.
        * hir/rust-ast-lower-type.cc (ASTLoweringType::translate): Likewise.
        (ASTLowerGenericParam::translate): Likewise.
        * hir/rust-ast-lower.cc (ASTLowerPathInExpression::visit): Likewise.
        (ASTLowerQualPathInExpression::visit): Likewise.
        * hir/tree/rust-hir-pattern-abstract.cc (PathPattern::is_refutable):
        Likewise.
        * typecheck/rust-hir-trait-resolve.cc 
(TraitResolver::resolve_path_to_trait):
        Likewise.
        * typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::visit):
        Likewise.
        (TypeCheckExpr::resolve_root_path): Likewise.
        * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
        Likewise.
        * typecheck/rust-hir-type-check-type.cc 
(TypeCheckType::resolve_root_path):
        Likewise.
        * typecheck/rust-type-util.cc (query_type): Likewise.
        * util/rust-hir-map.cc (Mappings::insert_hir_item): Move to dedicated
        mappings within the hir category.
        (Mappings::lookup_hir_item): Likewise.
        (Mappings::insert_hir_trait_item): Likewise.
        (Mappings::lookup_hir_trait_item): Likewise.
        (Mappings::insert_hir_extern_block): Likewise.
        (Mappings::lookup_hir_extern_block): Likewise.
        (Mappings::insert_module): Likewise.
        (Mappings::lookup_module): Likewise.
        (Mappings::insert_hir_expr): Likewise.
        (Mappings::lookup_hir_expr): Likewise.
        (Mappings::insert_hir_path_expr_seg): Likewise.
        (Mappings::lookup_hir_path_expr_seg): Likewise.
        (Mappings::insert_hir_generic_param): Likewise.
        (Mappings::lookup_hir_generic_param): Likewise.
        (Mappings::insert_hir_type): Likewise.
        (Mappings::lookup_hir_type): Likewise.
        (Mappings::insert_hir_stmt): Likewise.
        (Mappings::lookup_hir_stmt): Likewise.
        (Mappings::insert_hir_param): Likewise.
        (Mappings::lookup_hir_param): Likewise.
        (Mappings::insert_hir_self_param): Likewise.
        (Mappings::lookup_hir_self_param): Likewise.
        (Mappings::insert_hir_struct_field): Likewise.
        (Mappings::lookup_hir_struct_field): Likewise.
        (Mappings::insert_hir_pattern): Likewise.
        (Mappings::lookup_hir_pattern): Likewise.
        (Mappings::resolve_nodeid_to_stmt): Likewise.
        (Mappings::build_impl_indexes): Likewise.
        (Mappings::insert_trait_item_mapping): Likewise.
        * util/rust-hir-map.h (class HIRMappings): Add new class for all hir
        related mappings.
        * util/rust-hir-map.hxx: New file.

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/c0f3b9fc5808c1278cd55c683d62b28bf9d74ede

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

 gcc/rust/backend/rust-compile-item.cc         |   2 +-
 gcc/rust/backend/rust-compile-resolve-path.cc |   4 +-
 gcc/rust/backend/rust-mangle-v0.cc            |   6 +-
 .../privacy/rust-visibility-resolver.cc       |   2 +-
 gcc/rust/checks/errors/rust-const-checker.cc  |   2 +-
 gcc/rust/checks/errors/rust-readonly-check.cc |   4 +-
 gcc/rust/checks/errors/rust-unsafe-checker.cc |   8 +-
 gcc/rust/checks/lints/rust-lint-marklive.cc   |   4 +-
 .../lints/unused/rust-unused-checker.cc       |   2 +-
 gcc/rust/hir/rust-ast-lower-base.cc           |   2 +-
 gcc/rust/hir/rust-ast-lower-block.h           |  10 +-
 gcc/rust/hir/rust-ast-lower-expr.cc           |   2 +-
 gcc/rust/hir/rust-ast-lower-implitem.cc       |  10 +-
 gcc/rust/hir/rust-ast-lower-item.cc           |   6 +-
 gcc/rust/hir/rust-ast-lower-pattern.cc        |   2 +-
 gcc/rust/hir/rust-ast-lower-stmt.cc           |   2 +-
 .../hir/rust-ast-lower-struct-field-expr.h    |   2 +-
 gcc/rust/hir/rust-ast-lower-type.cc           |   4 +-
 gcc/rust/hir/rust-ast-lower.cc                |   4 +-
 .../hir/tree/rust-hir-pattern-abstract.cc     |   2 +-
 gcc/rust/typecheck/rust-hir-trait-resolve.cc  |   2 +-
 .../typecheck/rust-hir-type-check-path.cc     |   6 +-
 .../typecheck/rust-hir-type-check-pattern.cc  |   2 +-
 .../typecheck/rust-hir-type-check-type.cc     |   2 +-
 gcc/rust/typecheck/rust-type-util.cc          |   4 +-
 gcc/rust/util/rust-hir-map.cc                 | 267 +-----------------
 gcc/rust/util/rust-hir-map.h                  |  90 +++---
 gcc/rust/util/rust-hir-map.hxx                |  77 +++++
 28 files changed, 179 insertions(+), 351 deletions(-)
 create mode 100644 gcc/rust/util/rust-hir-map.hxx

diff --git a/gcc/rust/backend/rust-compile-item.cc 
b/gcc/rust/backend/rust-compile-item.cc
index 423df15c2..6937492cc 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -228,7 +228,7 @@ CompileItem::visit (HIR::Function &function)
   if (function.get_qualifiers ().is_const ())
     ctx->push_const_context ();
 
-  auto lookup_root_item = ctx->get_mappings ().lookup_hir_item (
+  auto lookup_root_item = ctx->get_mappings ().hir.item.lookup (
     function.get_mappings ().get_hirid ());
   bool is_root_item = lookup_root_item.has_value ();
   tree fndecl
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc 
b/gcc/rust/backend/rust-compile-resolve-path.cc
index 12b200a11..9aa78fd4b 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -259,7 +259,7 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType 
*lookup,
                               location_t expr_locus, bool is_qualified_path)
 {
   bool is_fn = lookup->get_kind () == TyTy::TypeKind::FNDEF;
-  if (auto resolved_item = ctx->get_mappings ().lookup_hir_item (ref))
+  if (auto resolved_item = ctx->get_mappings ().hir.item.lookup (ref))
     {
       if (!lookup->has_substitutions_defined ())
        return CompileItem::compile (*resolved_item, ctx, nullptr, expr_locus);
@@ -303,7 +303,7 @@ HIRCompileBase::query_compile (HirId ref, TyTy::BaseType 
*lookup,
                                                     lookup, expr_locus);
        }
       else if (auto trait_item
-              = ctx->get_mappings ().lookup_hir_trait_item (ref))
+              = ctx->get_mappings ().hir.trait_item.lookup (ref))
        {
          HIR::Trait *trait = ctx->get_mappings ().lookup_trait_item_mapping (
            trait_item.value ()->get_mappings ().get_hirid ());
diff --git a/gcc/rust/backend/rust-mangle-v0.cc 
b/gcc/rust/backend/rust-mangle-v0.cc
index d0ed9da1e..b2a24f385 100644
--- a/gcc/rust/backend/rust-mangle-v0.cc
+++ b/gcc/rust/backend/rust-mangle-v0.cc
@@ -406,7 +406,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType 
*ty,
            break;
          }
       }
-    else if (auto trait_item = mappings.lookup_hir_trait_item (hir_id))
+    else if (auto trait_item = mappings.hir.trait_item.lookup (hir_id))
       {
        switch (trait_item.value ()->get_item_kind ())
          {
@@ -428,7 +428,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType 
*ty,
            break;
          }
       }
-    else if (auto item = mappings.lookup_hir_item (hir_id))
+    else if (auto item = mappings.hir.item.lookup (hir_id))
       switch (item.value ()->get_item_kind ())
        {
        case HIR::Item::ItemKind::Function:
@@ -468,7 +468,7 @@ v0_path (Rust::Compile::Context *ctx, const TyTy::BaseType 
*ty,
                                  cpath.get ().c_str ());
          break;
        }
-    else if (auto expr = mappings.lookup_hir_expr (hir_id))
+    else if (auto expr = mappings.hir.expr.lookup (hir_id))
       {
        rust_assert (expr.value ()->get_expression_type ()
                     == HIR::Expr::ExprType::Closure);
diff --git a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc 
b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
index 26f13f8d2..76a949062 100644
--- a/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
+++ b/gcc/rust/checks/errors/privacy/rust-visibility-resolver.cc
@@ -93,7 +93,7 @@ VisibilityResolver::resolve_module_path (const 
HIR::SimplePath &restriction,
     // these items as private?
     return true;
 
-  if (auto module = mappings.lookup_module (ref))
+  if (auto module = mappings.hir.module.lookup (ref))
     {
       // Fill in the resolved `DefId`
       id = module.value ()->get_mappings ().get_defid ();
diff --git a/gcc/rust/checks/errors/rust-const-checker.cc 
b/gcc/rust/checks/errors/rust-const-checker.cc
index 1a594bf9f..913505f06 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -309,7 +309,7 @@ ConstChecker::check_function_call (HirId fn_id, location_t 
locus)
   if (!const_context.is_in_context ())
     return;
 
-  auto maybe_fn = mappings.lookup_hir_item (fn_id);
+  auto maybe_fn = mappings.hir.item.lookup (fn_id);
   if (maybe_fn
       && maybe_fn.value ()->get_item_kind () != Item::ItemKind::Function)
     return;
diff --git a/gcc/rust/checks/errors/rust-readonly-check.cc 
b/gcc/rust/checks/errors/rust-readonly-check.cc
index b7e75a7d5..8bd3c4e4e 100644
--- a/gcc/rust/checks/errors/rust-readonly-check.cc
+++ b/gcc/rust/checks/errors/rust-readonly-check.cc
@@ -75,7 +75,7 @@ ReadonlyChecker::visit (PathInExpression &expr)
     return;
 
   // Check if the local variable is mutable.
-  auto maybe_pattern = mappings.lookup_hir_pattern (*hir_id);
+  auto maybe_pattern = mappings.hir.pattern.lookup (*hir_id);
   if (maybe_pattern
       && maybe_pattern.value ()->get_pattern_type ()
           == HIR::Pattern::PatternType::IDENTIFIER)
@@ -83,7 +83,7 @@ ReadonlyChecker::visit (PathInExpression &expr)
                    expr.get_locus ());
 
   // Check if the static item is mutable.
-  auto maybe_item = mappings.lookup_hir_item (*hir_id);
+  auto maybe_item = mappings.hir.item.lookup (*hir_id);
   if (maybe_item
       && maybe_item.value ()->get_item_kind () == HIR::Item::ItemKind::Static)
     {
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc 
b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index b82ba1514..22ff986f1 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -92,7 +92,7 @@ UnsafeChecker::check_use_of_static (HirId node_id, location_t 
locus)
   bool in_context = unsafe_context.is_in_context ();
   bool unsafe_op = false;
 
-  if (auto maybe_static_mut = mappings.lookup_hir_item (node_id))
+  if (auto maybe_static_mut = mappings.hir.item.lookup (node_id))
     unsafe_op |= check_static_mut (*maybe_static_mut, locus, in_context);
 
   if (auto maybe_extern_static = mappings.lookup_hir_extern_item (node_id))
@@ -198,7 +198,7 @@ UnsafeChecker::check_function_call (HirId node_id, 
location_t locus)
   bool in_context = unsafe_context.is_in_context ();
   bool unsafe_op = false;
 
-  auto maybe_fn = mappings.lookup_hir_item (node_id);
+  auto maybe_fn = mappings.hir.item.lookup (node_id);
 
   if (maybe_fn
       && maybe_fn.value ()->get_item_kind () == Item::ItemKind::Function)
@@ -208,7 +208,7 @@ UnsafeChecker::check_function_call (HirId node_id, 
location_t locus)
   if (auto maybe_extern = mappings.lookup_hir_extern_item (node_id))
     unsafe_op
       |= check_extern_call (static_cast<ExternalItem *> (maybe_extern->first),
-                           *mappings.lookup_hir_extern_block (
+                           *mappings.hir.extern_block.lookup (
                              maybe_extern->second),
                            locus, in_context);
 
@@ -240,7 +240,7 @@ UnsafeChecker::check_function_attr (HirId node_id, 
location_t locus)
 {
   bool in_context = unsafe_context.is_in_context ();
 
-  auto maybe_fn = mappings.lookup_hir_item (node_id);
+  auto maybe_fn = mappings.hir.item.lookup (node_id);
 
   if (maybe_fn
       && maybe_fn.value ()->get_item_kind () == Item::ItemKind::Function
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc 
b/gcc/rust/checks/lints/rust-lint-marklive.cc
index c99c365dd..0685c442b 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -91,7 +91,7 @@ MarkLive::go (HIR::Crate &)
       worklist.pop_back ();
       scannedSymbols.emplace (hirId);
       liveSymbols.emplace (hirId);
-      if (auto item = mappings.lookup_hir_item (hirId))
+      if (auto item = mappings.hir.item.lookup (hirId))
        item.value ()->accept_vis (*this);
       else if (auto implItem = mappings.lookup_hir_implitem (hirId))
        implItem->first->accept_vis (*this);
@@ -125,7 +125,7 @@ MarkLive::visit (HIR::PathInExpression &expr)
   auto ref = hid.value ();
 
   // it must resolve to some kind of HIR::Item or HIR::InheritImplItem
-  if (auto resolved_item = mappings.lookup_hir_item (ref))
+  if (auto resolved_item = mappings.hir.item.lookup (ref))
     mark_hir_id (resolved_item.value ()->get_mappings ().get_hirid ());
   else if (auto resolved_item = mappings.lookup_hir_implitem (ref))
     mark_hir_id (resolved_item->first->get_impl_mappings ().get_hirid ());
diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.cc 
b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
index 023cba0c9..414af5410 100644
--- a/gcc/rust/checks/lints/unused/rust-unused-checker.cc
+++ b/gcc/rust/checks/lints/unused/rust-unused-checker.cc
@@ -358,7 +358,7 @@ UnusedChecker::visit (HIR::BorrowExpr &expr)
   if (auto def
       = nr_context.lookup (ast_node_id, Resolver2_0::Namespace::Values))
     if (auto id = mappings.lookup_node_to_hir (*def))
-      if (auto item = mappings.lookup_hir_item (*id))
+      if (auto item = mappings.hir.item.lookup (*id))
        if (item.value ()->get_item_kind () == HIR::Item::ItemKind::Static)
          {
            auto &static_item = static_cast<HIR::StaticItem &> (*item.value ());
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc 
b/gcc/rust/hir/rust-ast-lower-base.cc
index 1d55632e6..ddf866952 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -1077,7 +1077,7 @@ ASTLoweringBase::lower_extern_block (AST::ExternBlock 
&extern_block)
                            extern_block.get_outer_attrs (),
                            extern_block.get_locus ());
 
-  mappings.insert_hir_extern_block (hir_extern_block);
+  mappings.hir.extern_block.insert (hir_extern_block);
 
   return hir_extern_block;
 }
diff --git a/gcc/rust/hir/rust-ast-lower-block.h 
b/gcc/rust/hir/rust-ast-lower-block.h
index 3b36ea36c..cb5409e5f 100644
--- a/gcc/rust/hir/rust-ast-lower-block.h
+++ b/gcc/rust/hir/rust-ast-lower-block.h
@@ -37,7 +37,7 @@ public:
     expr.accept_vis (resolver);
     if (resolver.translated != nullptr)
       {
-       resolver.mappings.insert_hir_expr (resolver.translated);
+       resolver.mappings.hir.expr.insert (resolver.translated);
       }
 
     *terminated = resolver.terminated;
@@ -62,7 +62,7 @@ public:
                                  std::unique_ptr<HIR::BlockExpr> (block),
                                  expr.get_outer_attrs (), expr.get_locus ());
 
-    resolver.mappings.insert_hir_expr (translated);
+    resolver.mappings.hir.expr.insert (translated);
 
     return translated;
   }
@@ -89,7 +89,7 @@ public:
     expr.accept_vis (resolver);
     if (resolver.translated != nullptr)
       {
-       resolver.mappings.insert_hir_expr (resolver.translated);
+       resolver.mappings.hir.expr.insert (resolver.translated);
       }
     *terminated = resolver.terminated;
     return resolver.translated;
@@ -121,7 +121,7 @@ public:
     expr.accept_vis (resolver);
     if (resolver.translated != nullptr)
       {
-       resolver.mappings.insert_hir_expr (resolver.translated);
+       resolver.mappings.hir.expr.insert (resolver.translated);
       }
     return resolver.translated;
   }
@@ -152,7 +152,7 @@ public:
     ASTLoweringExprWithBlock resolver;
     expr.accept_vis (resolver);
     if (resolver.translated != nullptr)
-      resolver.mappings.insert_hir_expr (resolver.translated);
+      resolver.mappings.hir.expr.insert (resolver.translated);
 
     *terminated = resolver.terminated;
     return resolver.translated;
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc 
b/gcc/rust/hir/rust-ast-lower-expr.cc
index 61a3f10c3..4ab3ed56f 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -50,7 +50,7 @@ ASTLoweringExpr::translate (AST::Expr &expr, bool *terminated)
       return nullptr;
     }
 
-  resolver.mappings.insert_hir_expr (resolver.translated);
+  resolver.mappings.hir.expr.insert (resolver.translated);
   resolver.mappings.insert_location (
     resolver.translated->get_mappings ().get_hirid (), expr.get_locus ());
 
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.cc 
b/gcc/rust/hir/rust-ast-lower-implitem.cc
index 828d0065f..ad9a0090d 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.cc
+++ b/gcc/rust/hir/rust-ast-lower-implitem.cc
@@ -192,7 +192,7 @@ ASTLowerImplItem::visit (AST::Function &function)
   if (fn->is_method ())
     {
       // insert mappings for self
-      mappings.insert_hir_self_param (&fn->get_self_param_unchecked ());
+      mappings.hir.self_param.insert (&fn->get_self_param_unchecked ());
       mappings.insert_location (
        fn->get_self_param_unchecked ().get_mappings ().get_hirid (),
        fn->get_self_param_unchecked ().get_locus ());
@@ -201,7 +201,7 @@ ASTLowerImplItem::visit (AST::Function &function)
   // add the mappings for the function params at the end
   for (auto &param : fn->get_function_params ())
     {
-      mappings.insert_hir_param (&param);
+      mappings.hir.function_param.insert (&param);
       mappings.insert_location (mapping.get_hirid (), param.get_locus ());
     }
 
@@ -222,7 +222,7 @@ ASTLowerTraitItem::translate (AST::AssociatedItem &item)
       auto locus = resolver.translated->get_trait_locus ();
 
       resolver.handle_outer_attributes (*resolver.translated);
-      resolver.mappings.insert_hir_trait_item (resolver.translated);
+      resolver.mappings.hir.trait_item.insert (resolver.translated);
       resolver.mappings.insert_location (id, locus);
       resolver.mappings.insert_defid_mapping (defid, resolver.translated);
     }
@@ -285,7 +285,7 @@ ASTLowerTraitItem::visit (AST::Function &func)
     {
       // insert mappings for self
       // TODO: Is this correct ? Looks fishy
-      mappings.insert_hir_self_param (&*self_param);
+      mappings.hir.self_param.insert (&*self_param);
       mappings.insert_location (self_param->get_mappings ().get_hirid (),
                                self_param->get_locus ());
     }
@@ -317,7 +317,7 @@ ASTLowerTraitItem::visit (AST::Function &func)
   // add the mappings for the function params at the end
   for (auto &param : trait_item->get_decl ().get_function_params ())
     {
-      mappings.insert_hir_param (&param);
+      mappings.hir.function_param.insert (&param);
       mappings.insert_location (mapping.get_hirid (), param.get_locus ());
     }
 }
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc 
b/gcc/rust/hir/rust-ast-lower-item.cc
index 546ba6fb8..56171ef88 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -45,7 +45,7 @@ ASTLoweringItem::translate (AST::Item &item)
 
       resolver.handle_outer_attributes (*resolver.translated);
       resolver.mappings.insert_ast_item (&item);
-      resolver.mappings.insert_hir_item (resolver.translated);
+      resolver.mappings.hir.item.insert (resolver.translated);
       resolver.mappings.insert_location (id, locus);
       resolver.mappings.insert_defid_mapping (defid, resolver.translated);
     }
@@ -83,7 +83,7 @@ ASTLoweringItem::visit (AST::Module &module)
     = new HIR::Module (mapping, module.get_name (), module.get_locus (),
                       std::move (items), std::move (vis),
                       std::move (inner_attrs), std::move (outer_attrs));
-  mappings.insert_module (static_cast<Module *> (translated));
+  mappings.hir.module.insert (static_cast<Module *> (translated));
 }
 
 void
@@ -507,7 +507,7 @@ ASTLoweringItem::visit (AST::Function &function)
   // add the mappings for the function params at the end
   for (auto &param : fn->get_function_params ())
     {
-      mappings.insert_hir_param (&param);
+      mappings.hir.function_param.insert (&param);
       mappings.insert_location (mapping.get_hirid (), param.get_locus ());
     }
 
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc 
b/gcc/rust/hir/rust-ast-lower-pattern.cc
index 21544ff26..ed5c68e71 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.cc
+++ b/gcc/rust/hir/rust-ast-lower-pattern.cc
@@ -36,7 +36,7 @@ ASTLoweringPattern::translate (AST::Pattern &pattern, bool 
is_let_top_level)
 
   rust_assert (resolver.translated != nullptr);
 
-  resolver.mappings.insert_hir_pattern (resolver.translated);
+  resolver.mappings.hir.pattern.insert (resolver.translated);
   resolver.mappings.insert_location (
     resolver.translated->get_mappings ().get_hirid (), pattern.get_locus ());
 
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc 
b/gcc/rust/hir/rust-ast-lower-stmt.cc
index 2f5eede12..7fe7d3bc5 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.cc
+++ b/gcc/rust/hir/rust-ast-lower-stmt.cc
@@ -39,7 +39,7 @@ ASTLoweringStmt::translate (AST::Stmt *stmt, bool *terminated)
   resolver.mappings.insert_location (
     resolver.translated->get_mappings ().get_hirid (),
     resolver.translated->get_locus ());
-  resolver.mappings.insert_hir_stmt (resolver.translated);
+  resolver.mappings.hir.stmt.insert (resolver.translated);
 
   return resolver.translated;
 }
diff --git a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h 
b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
index 903f2abd7..225e5843b 100644
--- a/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-struct-field-expr.h
@@ -36,7 +36,7 @@ public:
     field.accept_vis (compiler);
     rust_assert (compiler.translated != nullptr);
 
-    compiler.mappings.insert_hir_struct_field (compiler.translated);
+    compiler.mappings.hir.struct_expr_field.insert (compiler.translated);
     compiler.mappings.insert_location (
       compiler.translated->get_mappings ().get_hirid (), field.get_locus ());
 
diff --git a/gcc/rust/hir/rust-ast-lower-type.cc 
b/gcc/rust/hir/rust-ast-lower-type.cc
index 7bc9c6b97..031c137da 100644
--- a/gcc/rust/hir/rust-ast-lower-type.cc
+++ b/gcc/rust/hir/rust-ast-lower-type.cc
@@ -223,7 +223,7 @@ ASTLoweringType::translate (AST::Type &type, bool 
default_to_static_lifetime,
   type.accept_vis (resolver);
 
   rust_assert (resolver.translated != nullptr);
-  resolver.mappings.insert_hir_type (resolver.translated);
+  resolver.mappings.hir.type.insert (resolver.translated);
   resolver.mappings.insert_location (
     resolver.translated->get_mappings ().get_hirid (),
     resolver.translated->get_locus ());
@@ -549,7 +549,7 @@ ASTLowerGenericParam::translate (AST::GenericParam &param)
   rust_assert (resolver.translated != nullptr);
   resolver.mappings.insert_location (
     resolver.translated->get_mappings ().get_hirid (), param.get_locus ());
-  resolver.mappings.insert_hir_generic_param (resolver.translated);
+  resolver.mappings.hir.generic_param.insert (resolver.translated);
 
   return resolver.translated;
 }
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index f31cc92cd..64ce2ef70 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -487,7 +487,7 @@ ASTLowerPathInExpression::visit (AST::PathInExpression 
&expr)
 
       // insert the mappings for the segment
       HIR::PathExprSegment *lowered_seg = &path_segments.back ();
-      mappings.insert_hir_path_expr_seg (lowered_seg);
+      mappings.hir.path_expr_segment.insert (lowered_seg);
     }
 
   translated = new HIR::PathInExpression (mapping, std::move (path_segments),
@@ -531,7 +531,7 @@ ASTLowerQualPathInExpression::visit 
(AST::QualifiedPathInExpression &expr)
 
       // insert the mappings for the segment
       HIR::PathExprSegment *lowered_seg = &path_segments.back ();
-      mappings.insert_hir_path_expr_seg (lowered_seg);
+      mappings.hir.path_expr_segment.insert (lowered_seg);
     }
 
   auto crate_num = mappings.crate_mapping.get_current_crate ();
diff --git a/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc 
b/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc
index f33af84f3..6a1031457 100644
--- a/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc
+++ b/gcc/rust/hir/tree/rust-hir-pattern-abstract.cc
@@ -58,7 +58,7 @@ PathPattern::is_refutable (const TyTy::BaseType &scrutinee) 
const
   HirId hir_id = get_final_segment ().get_mappings ().get_hirid ();
   if (hir_id)
     {
-      auto item = mappings.lookup_hir_item (hir_id);
+      auto item = mappings.hir.item.lookup (hir_id);
       if (item && item.value ()->get_item_kind () == Item::ItemKind::Constant)
        {
          return true;
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc 
b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index b69452153..5ae31122a 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -227,7 +227,7 @@ TraitResolver::resolve_path_to_trait (const HIR::TypePath 
&path,
       return false;
     }
 
-  auto resolved_item = mappings.lookup_hir_item (hid.value ());
+  auto resolved_item = mappings.hir.item.lookup (hid.value ());
   if (!resolved_item.has_value ())
     {
       rust_error_at (path.get_locus (),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index 27d7d55e5..665ec0054 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -208,7 +208,7 @@ TypeCheckExpr::visit (HIR::PathInExpression &expr)
       else
        {
          TyTy::BaseType *resolved = nullptr;
-         auto trait_item = mappings.lookup_hir_trait_item (*hir_id);
+         auto trait_item = mappings.hir.trait_item.lookup (*hir_id);
          if (trait_item.has_value ())
            {
              HIR::Trait *trait = mappings.lookup_trait_item_mapping (*hir_id);
@@ -308,9 +308,9 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression 
&expr, size_t *offset,
        }
       auto ref = hid.value ();
 
-      auto seg_is_module = mappings.lookup_module (ref).has_value ();
+      auto seg_is_module = mappings.hir.module.lookup (ref).has_value ();
       auto seg_is_crate = mappings.is_local_hirid_crate (ref);
-      auto seg_is_pattern = mappings.lookup_hir_pattern (ref).has_value ();
+      auto seg_is_pattern = mappings.hir.pattern.lookup (ref).has_value ();
       auto seg_is_self = is_root && !have_more_segments
                         && seg.get_segment ().to_string () == "self";
       if (seg_is_module || seg_is_crate)
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index b5f336b42..287a903e1 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -74,7 +74,7 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
       rust_assert (definition_id.has_value ());
       HirId def_id = definition_id.value ();
 
-      tl::optional<HIR::Item *> hir_item = mappings.lookup_hir_item (def_id);
+      tl::optional<HIR::Item *> hir_item = mappings.hir.item.lookup (def_id);
       // If the path references an item, it must be constants or structs.
       if (hir_item.has_value ())
        {
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 7ff160b14..0d4b735c9 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -387,7 +387,7 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, 
size_t *offset,
        }
       auto ref = hid.value ();
 
-      auto seg_is_module = mappings.lookup_module (ref).has_value ();
+      auto seg_is_module = mappings.hir.module.lookup (ref).has_value ();
       auto seg_is_crate = mappings.is_local_hirid_crate (ref);
       if (seg_is_module || seg_is_crate)
        {
diff --git a/gcc/rust/typecheck/rust-type-util.cc 
b/gcc/rust/typecheck/rust-type-util.cc
index 96367df5c..85fafdea0 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -70,7 +70,7 @@ query_type (HirId reference, TyTy::BaseType **result)
       return true;
     }
 
-  if (auto item = mappings.lookup_hir_item (reference))
+  if (auto item = mappings.hir.item.lookup (reference))
     {
       rust_debug_loc (item.value ()->get_locus (), "resolved item {%u} to",
                      reference);
@@ -233,7 +233,7 @@ query_type (HirId reference, TyTy::BaseType **result)
   // is it an extern item?
   if (auto extern_item = mappings.lookup_hir_extern_item (reference))
     {
-      auto block = mappings.lookup_hir_extern_block (extern_item->second);
+      auto block = mappings.hir.extern_block.lookup (extern_item->second);
       rust_assert (block.has_value ());
 
       *result
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 617963e73..47ccc540a 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -369,25 +369,6 @@ Mappings::lookup_trait_item_defid (DefId id)
   return it->second;
 }
 
-void
-Mappings::insert_hir_item (HIR::Item *item)
-{
-  auto id = item->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_item (id).has_value ());
-
-  hirItemMappings[id] = item;
-  insert_node_to_hir (item->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::Item *>
-Mappings::lookup_hir_item (HirId id)
-{
-  auto it = hirItemMappings.find (id);
-  if (it == hirItemMappings.end ())
-    return tl::nullopt;
-  return it->second;
-}
-
 void
 Mappings::insert_hir_enumitem (HIR::Enum *parent, HIR::EnumItem *item)
 {
@@ -409,46 +390,6 @@ Mappings::lookup_hir_enumitem (HirId id)
   return it->second;
 }
 
-void
-Mappings::insert_hir_trait_item (HIR::TraitItem *item)
-{
-  auto id = item->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_trait_item (id).has_value ());
-
-  hirTraitItemMappings[id] = item;
-  insert_node_to_hir (item->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::TraitItem *>
-Mappings::lookup_hir_trait_item (HirId id)
-{
-  auto it = hirTraitItemMappings.find (id);
-  if (it == hirTraitItemMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_extern_block (HIR::ExternBlock *block)
-{
-  auto id = block->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_extern_block (id).has_value ());
-
-  hirExternBlockMappings[id] = block;
-  insert_node_to_hir (block->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::ExternBlock *>
-Mappings::lookup_hir_extern_block (HirId id)
-{
-  auto it = hirExternBlockMappings.find (id);
-  if (it == hirExternBlockMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
 void
 Mappings::insert_hir_extern_item (HIR::ExternalItem *item, HirId parent_block)
 {
@@ -520,26 +461,6 @@ Mappings::lookup_impl_block_type (HirId id)
   return it->second;
 }
 
-void
-Mappings::insert_module (HIR::Module *module)
-{
-  auto id = module->get_mappings ().get_hirid ();
-  rust_assert (!lookup_module (id));
-
-  hirModuleMappings[id] = module;
-  insert_node_to_hir (module->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::Module *>
-Mappings::lookup_module (HirId id)
-{
-  auto it = hirModuleMappings.find (id);
-  if (it == hirModuleMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
 void
 Mappings::insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item)
 {
@@ -561,188 +482,6 @@ Mappings::lookup_hir_implitem (HirId id)
   return std::make_pair (it->second.second, it->second.first);
 }
 
-void
-Mappings::insert_hir_expr (HIR::Expr *expr)
-{
-  auto id = expr->get_mappings ().get_hirid ();
-  hirExprMappings[id] = expr;
-
-  insert_node_to_hir (expr->get_mappings ().get_nodeid (), id);
-  insert_location (id, expr->get_locus ());
-}
-
-tl::optional<HIR::Expr *>
-Mappings::lookup_hir_expr (HirId id)
-{
-  auto it = hirExprMappings.find (id);
-  if (it == hirExprMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_path_expr_seg (HIR::PathExprSegment *expr)
-{
-  auto id = expr->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_path_expr_seg (id));
-
-  hirPathSegMappings[id] = expr;
-  insert_node_to_hir (expr->get_mappings ().get_nodeid (), id);
-  insert_location (id, expr->get_locus ());
-}
-
-tl::optional<HIR::PathExprSegment *>
-Mappings::lookup_hir_path_expr_seg (HirId id)
-{
-  auto it = hirPathSegMappings.find (id);
-  if (it == hirPathSegMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_generic_param (HIR::GenericParam *param)
-{
-  auto id = param->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_generic_param (id));
-
-  hirGenericParamMappings[id] = param;
-  insert_node_to_hir (param->get_mappings ().get_nodeid (), id);
-  insert_location (id, param->get_locus ());
-}
-
-tl::optional<HIR::GenericParam *>
-Mappings::lookup_hir_generic_param (HirId id)
-{
-  auto it = hirGenericParamMappings.find (id);
-  if (it == hirGenericParamMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_type (HIR::Type *type)
-{
-  auto id = type->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_type (id));
-
-  hirTypeMappings[id] = type;
-  insert_node_to_hir (type->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::Type *>
-Mappings::lookup_hir_type (HirId id)
-{
-  auto it = hirTypeMappings.find (id);
-  if (it == hirTypeMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_stmt (HIR::Stmt *stmt)
-{
-  auto id = stmt->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_stmt (id));
-
-  hirStmtMappings[id] = stmt;
-  insert_node_to_hir (stmt->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::Stmt *>
-Mappings::lookup_hir_stmt (HirId id)
-{
-  auto it = hirStmtMappings.find (id);
-  if (it == hirStmtMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_param (HIR::FunctionParam *param)
-{
-  auto id = param->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_param (id));
-
-  hirParamMappings[id] = param;
-  insert_node_to_hir (param->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::FunctionParam *>
-Mappings::lookup_hir_param (HirId id)
-{
-  auto it = hirParamMappings.find (id);
-  if (it == hirParamMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_self_param (HIR::SelfParam *param)
-{
-  auto id = param->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_self_param (id));
-
-  hirSelfParamMappings[id] = param;
-  insert_node_to_hir (param->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::SelfParam *>
-Mappings::lookup_hir_self_param (HirId id)
-{
-  auto it = hirSelfParamMappings.find (id);
-  if (it == hirSelfParamMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_struct_field (HIR::StructExprField *field)
-{
-  auto id = field->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_struct_field (id));
-
-  hirStructFieldMappings[id] = field;
-  insert_node_to_hir (field->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::StructExprField *>
-Mappings::lookup_hir_struct_field (HirId id)
-{
-  auto it = hirStructFieldMappings.find (id);
-  if (it == hirStructFieldMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
-void
-Mappings::insert_hir_pattern (HIR::Pattern *pattern)
-{
-  auto id = pattern->get_mappings ().get_hirid ();
-  rust_assert (!lookup_hir_pattern (id));
-
-  hirPatternMappings[id] = pattern;
-  insert_node_to_hir (pattern->get_mappings ().get_nodeid (), id);
-}
-
-tl::optional<HIR::Pattern *>
-Mappings::lookup_hir_pattern (HirId id)
-{
-  auto it = hirPatternMappings.find (id);
-  if (it == hirPatternMappings.end ())
-    return tl::nullopt;
-
-  return it->second;
-}
-
 void
 Mappings::insert_local_defid_mapping (CrateNum crateNum, LocalDefId id,
                                      HIR::Item *item)
@@ -831,7 +570,7 @@ Mappings::resolve_nodeid_to_stmt (NodeId id)
     return tl::nullopt;
 
   HirId resolved = it->second;
-  return lookup_hir_stmt (resolved);
+  return hir.stmt.lookup (resolved);
 }
 
 void
@@ -877,7 +616,7 @@ Mappings::build_impl_indexes ()
     if (!hir_id.has_value ())
       return nullptr;
 
-    auto item = lookup_hir_item (hir_id.value ());
+    auto item = hir.item.lookup (hir_id.value ());
     return item.has_value () ? item.value () : nullptr;
   };
 
@@ -972,7 +711,7 @@ Mappings::insert_trait_item_mapping (HirId trait_item_id, 
HIR::Trait *trait)
               == hirTraitItemsToTraitMappings.end ());
   hirTraitItemsToTraitMappings[trait_item_id] = trait;
 
-  auto item = lookup_hir_trait_item (trait_item_id);
+  auto item = hir.trait_item.lookup (trait_item_id);
   rust_assert (item.has_value ());
   if (item.value ()->get_item_kind () != HIR::TraitItem::TraitItemKind::FUNC)
     return;
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index 20d2ceb96..3b02d83ab 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -172,12 +172,60 @@ public:
   void insert (Id id, Item item) { storage.insert ({id, item}); }
 };
 
+enum class InsertionPolicy
+{
+  FORBID_DUPLICATES,
+  ALLOW_DUPLICATES,
+};
+
+enum class InsertLocation
+{
+  YES,
+  NO,
+};
+
+template <typename Item,
+         InsertionPolicy policy = InsertionPolicy::FORBID_DUPLICATES,
+         InsertLocation insert_location = InsertLocation::NO>
+class PtrMapping
+{
+  std::unordered_map<HirId, Item *> storage;
+
+public:
+  tl::optional<Item *> lookup (HirId id);
+  void insert (Item *item);
+};
+
 class ASTMappings
 {
 public:
   Mapping<NodeId, Privacy::ModuleVisibility> module_visibility;
 };
 
+class HIRMappings
+{
+public:
+  PtrMapping<HIR::Item> item;
+  PtrMapping<HIR::TraitItem> trait_item;
+  PtrMapping<HIR::ExternBlock> extern_block;
+  PtrMapping<HIR::Module> module;
+  PtrMapping<HIR::Expr, InsertionPolicy::ALLOW_DUPLICATES, InsertLocation::YES>
+    expr;
+  PtrMapping<HIR::PathExprSegment, InsertionPolicy::FORBID_DUPLICATES,
+            InsertLocation::YES>
+    path_expr_segment;
+  PtrMapping<HIR::GenericParam, InsertionPolicy::FORBID_DUPLICATES,
+            InsertLocation::YES>
+    generic_param;
+  PtrMapping<HIR::Type> type;
+  PtrMapping<HIR::Stmt> stmt;
+  PtrMapping<HIR::FunctionParam, InsertionPolicy::ALLOW_DUPLICATES>
+    function_param;
+  PtrMapping<HIR::SelfParam> self_param;
+  PtrMapping<HIR::StructExprField> struct_expr_field;
+  PtrMapping<HIR::Pattern> pattern;
+};
+
 class Mappings
 {
 public:
@@ -187,6 +235,7 @@ public:
   CrateMappings crate_mapping;
   ProcMacroMappings pmacro_mappings;
   ASTMappings ast;
+  HIRMappings hir;
 
   NodeId get_next_node_id ();
   HirId get_next_hir_id ()
@@ -216,18 +265,9 @@ public:
   tl::optional<HIR::Item *> lookup_local_defid (CrateNum crateNum,
                                                LocalDefId id);
 
-  void insert_hir_item (HIR::Item *item);
-  tl::optional<HIR::Item *> lookup_hir_item (HirId id);
-
   void insert_hir_enumitem (HIR::Enum *parent, HIR::EnumItem *item);
   std::pair<HIR::Enum *, HIR::EnumItem *> lookup_hir_enumitem (HirId id);
 
-  void insert_hir_trait_item (HIR::TraitItem *item);
-  tl::optional<HIR::TraitItem *> lookup_hir_trait_item (HirId id);
-
-  void insert_hir_extern_block (HIR::ExternBlock *block);
-  tl::optional<HIR::ExternBlock *> lookup_hir_extern_block (HirId id);
-
   void insert_hir_extern_item (HIR::ExternalItem *item, HirId parent_block);
 
   // std::pair<hir_extern_item, parent hirid>
@@ -238,41 +278,11 @@ public:
   tl::optional<HIR::ImplBlock *> lookup_hir_impl_block (HirId id);
   tl::optional<HIR::ImplBlock *> lookup_impl_block_type (HirId id);
 
-  void insert_module (HIR::Module *module);
-  tl::optional<HIR::Module *> lookup_module (HirId id);
-
   void insert_hir_implitem (HirId parent_impl_id, HIR::ImplItem *item);
   // Optional<ImpItem, ParentImpl Hir id>
   tl::optional<std::pair<HIR::ImplItem *, HirId>>
   lookup_hir_implitem (HirId id);
 
-  void insert_hir_expr (HIR::Expr *expr);
-  tl::optional<HIR::Expr *> lookup_hir_expr (HirId id);
-
-  void insert_hir_path_expr_seg (HIR::PathExprSegment *expr);
-  tl::optional<HIR::PathExprSegment *> lookup_hir_path_expr_seg (HirId id);
-
-  void insert_hir_generic_param (HIR::GenericParam *expr);
-  tl::optional<HIR::GenericParam *> lookup_hir_generic_param (HirId id);
-
-  void insert_hir_type (HIR::Type *type);
-  tl::optional<HIR::Type *> lookup_hir_type (HirId id);
-
-  void insert_hir_stmt (HIR::Stmt *stmt);
-  tl::optional<HIR::Stmt *> lookup_hir_stmt (HirId id);
-
-  void insert_hir_param (HIR::FunctionParam *type);
-  tl::optional<HIR::FunctionParam *> lookup_hir_param (HirId id);
-
-  void insert_hir_self_param (HIR::SelfParam *type);
-  tl::optional<HIR::SelfParam *> lookup_hir_self_param (HirId id);
-
-  void insert_hir_struct_field (HIR::StructExprField *type);
-  tl::optional<HIR::StructExprField *> lookup_hir_struct_field (HirId id);
-
-  void insert_hir_pattern (HIR::Pattern *pattern);
-  tl::optional<HIR::Pattern *> lookup_hir_pattern (HirId id);
-
   void walk_local_defids_for_crate (CrateNum crateNum,
                                    std::function<bool (HIR::Item *)> cb);
 
@@ -553,4 +563,6 @@ private:
 } // namespace Analysis
 } // namespace Rust
 
+#include "rust-hir-map.hxx"
+
 #endif // RUST_HIR_MAP_H
diff --git a/gcc/rust/util/rust-hir-map.hxx b/gcc/rust/util/rust-hir-map.hxx
new file mode 100644
index 000000000..1d9249574
--- /dev/null
+++ b/gcc/rust/util/rust-hir-map.hxx
@@ -0,0 +1,77 @@
+// Copyright (C) 2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include "rust-hir-map.h"
+#include "optional.h"
+
+namespace Rust {
+namespace Analysis {
+
+template <typename Item, InsertionPolicy policy, InsertLocation 
insert_location>
+tl::optional<Item *>
+PtrMapping<Item, policy, insert_location>::lookup (HirId id)
+{
+  auto it = storage.find (id);
+  if (it == storage.cend ())
+    return tl::nullopt;
+  return it->second;
+}
+
+/* Helper required because of GCC 5 baseline
+ * We need to check if we should include location and then compile
+ * `item->get_locus()` only if `get_locus` exists within the target item.
+ *
+ * With a more recent compiler this would be written as:
+ * if constexpr(InsertLocation::YES == location) {
+ *   // insert location
+ * }
+ * but this is not available on cpp14 with gcc5.
+ */
+template <typename Item, InsertLocation location /* InsertLocation::YES */>
+struct InsertLocationHelper
+{
+  void insert_location (Item *item, HirId hir_id)
+  {
+    Analysis::Mappings::get ().insert_location (hir_id, item->get_locus ());
+  }
+};
+
+template <typename Item> struct InsertLocationHelper<Item, InsertLocation::NO>
+{
+  void insert_location (Item *item, HirId hir_id) {}
+};
+
+template <typename Item, InsertionPolicy policy, InsertLocation 
insert_location>
+void
+PtrMapping<Item, policy, insert_location>::insert (Item *item)
+{
+  auto hir_id = item->get_mappings ().get_hirid ();
+
+  if (policy == InsertionPolicy::FORBID_DUPLICATES)
+    rust_assert (!lookup (hir_id).has_value ());
+
+  storage.insert ({hir_id, item});
+
+  Analysis::Mappings::get ().insert_node_to_hir (
+    item->get_mappings ().get_nodeid (), hir_id);
+
+  InsertLocationHelper<Item, insert_location> location_helper;
+  location_helper.insert_location (item, hir_id);
+}
+} // namespace Analysis
+} // namespace Rust
-- 
2.55.0

Reply via email to