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]>
Tested on x86_64-pc-linux-gnu.
---
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 423df15c2ca..6937492cc23 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 12b200a11d9..9aa78fd4b1a 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 d0ed9da1ef6..b2a24f385fd 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 26f13f8d22e..76a94906278 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 1a594bf9f0b..913505f066f 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 b7e75a7d501..8bd3c4e4e7f 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 b82ba1514f3..22ff986f18f 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 c99c365dd92..0685c442bee 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 023cba0c938..414af54103d 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 1d55632e690..ddf866952f8 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 3b36ea36c25..cb5409e5fa6 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 61a3f10c3fd..4ab3ed56f7f 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 828d0065fa7..ad9a0090d84 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 ¶m : fn->get_function_params ())
{
- mappings.insert_hir_param (¶m);
+ mappings.hir.function_param.insert (¶m);
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 ¶m : trait_item->get_decl ().get_function_params ())
{
- mappings.insert_hir_param (¶m);
+ mappings.hir.function_param.insert (¶m);
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 546ba6fb848..56171ef882e 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 ¶m : fn->get_function_params ())
{
- mappings.insert_hir_param (¶m);
+ mappings.hir.function_param.insert (¶m);
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 21544ff2664..ed5c68e71a8 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 2f5eede1203..7fe7d3bc5ad 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 903f2abd75b..225e5843bf3 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 7bc9c6b9719..031c137daec 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 ¶m)
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 f31cc92cdb0..64ce2ef709b 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 f33af84f349..6a1031457a3 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 b694521533d..5ae31122ad4 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 27d7d55e595..665ec0054ce 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 b5f336b42a6..287a903e12f 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 7ff160b148b..0d4b735c9fe 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 96367df5cb5..85fafdea070 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 617963e73b4..47ccc540af0 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 20d2ceb96f5..3b02d83ab63 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 00000000000..1d924957452
--- /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