aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-30 17:29:04 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-08-05 18:20:56 +0100
commit0db1c804562aff23344cd5882db6fc65596e0966 (patch)
tree7dc1a15dcb48e44fc56e3c0cf0a0b06e2962db2d /gcc
parent4845c776841fc408fa7aadde21db18270b6b1b12 (diff)
downloadgcc-0db1c804562aff23344cd5882db6fc65596e0966.zip
gcc-0db1c804562aff23344cd5882db6fc65596e0966.tar.gz
gcc-0db1c804562aff23344cd5882db6fc65596e0966.tar.bz2
Add missing mappings required for type resolution
Add Trait item mappings for trait resolving purposes. This allows us to lookup the trait with a trait item belongs to and vice versa.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h19
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.h3
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc6
-rw-r--r--gcc/rust/util/rust-hir-map.cc50
-rw-r--r--gcc/rust/util/rust-hir-map.h27
5 files changed, 100 insertions, 5 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h
index d49d2b2..3083554 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -496,10 +496,12 @@ public:
std::vector<std::unique_ptr<HIR::TypeParamBound> > type_param_bounds;
std::vector<std::unique_ptr<HIR::TraitItem> > trait_items;
+ std::vector<HirId> trait_item_ids;
for (auto &item : trait.get_trait_items ())
{
HIR::TraitItem *lowered = ASTLowerTraitItem::translate (item.get ());
trait_items.push_back (std::unique_ptr<HIR::TraitItem> (lowered));
+ trait_item_ids.push_back (lowered->get_mappings ().get_hirid ());
}
auto crate_num = mappings->get_current_crate ();
@@ -507,17 +509,24 @@ public:
mappings->get_next_hir_id (crate_num),
mappings->get_next_localdef_id (crate_num));
- translated = new HIR::Trait (mapping, trait.get_identifier (),
- trait.is_unsafe (), std::move (generic_params),
- std::move (type_param_bounds), where_clause,
- std::move (trait_items), vis,
- trait.get_outer_attrs (), trait.get_locus ());
+ HIR::Trait *hir_trait
+ = new HIR::Trait (mapping, trait.get_identifier (), trait.is_unsafe (),
+ std::move (generic_params),
+ std::move (type_param_bounds), where_clause,
+ std::move (trait_items), vis, trait.get_outer_attrs (),
+ trait.get_locus ());
+ translated = hir_trait;
mappings->insert_defid_mapping (mapping.get_defid (), translated);
mappings->insert_hir_item (mapping.get_crate_num (), mapping.get_hirid (),
translated);
mappings->insert_location (crate_num, mapping.get_hirid (),
trait.get_locus ());
+
+ for (auto trait_item_id : trait_item_ids)
+ {
+ mappings->insert_trait_item_mapping (trait_item_id, hir_trait);
+ }
}
void visit (AST::TraitImpl &impl_block) override
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index 8db8637..9b5ec0a 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -284,6 +284,9 @@ public:
resolver.translated->get_mappings ().get_crate_num (),
resolver.translated->get_mappings ().get_hirid (),
param->get_locus_slow ());
+ resolver.mappings->insert_hir_generic_param (
+ resolver.translated->get_mappings ().get_crate_num (),
+ resolver.translated->get_mappings ().get_hirid (), resolver.translated);
return resolver.translated;
}
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index 23914f8..ed59777 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -263,6 +263,12 @@ ASTLowerPathInExpression::visit (AST::PathInExpression &expr)
std::vector<HIR::PathExprSegment> path_segments;
expr.iterate_path_segments ([&] (AST::PathExprSegment &s) mutable -> bool {
path_segments.push_back (lower_path_expr_seg (s));
+
+ // insert the mappings for the segment
+ HIR::PathExprSegment *lowered_seg = &path_segments.back ();
+ mappings->insert_hir_path_expr_seg (
+ lowered_seg->get_mappings ().get_crate_num (),
+ lowered_seg->get_mappings ().get_hirid (), lowered_seg);
return true;
});
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index 69fbe25..4ffbff0 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -383,6 +383,56 @@ Mappings::lookup_hir_expr (CrateNum crateNum, HirId id)
}
void
+Mappings::insert_hir_path_expr_seg (CrateNum crateNum, HirId id,
+ HIR::PathExprSegment *expr)
+{
+ rust_assert (lookup_hir_path_expr_seg (crateNum, id) == nullptr);
+
+ hirPathSegMappings[crateNum][id] = expr;
+ nodeIdToHirMappings[crateNum][expr->get_mappings ().get_nodeid ()] = id;
+ insert_location (crateNum, id, expr->get_locus ());
+}
+
+HIR::PathExprSegment *
+Mappings::lookup_hir_path_expr_seg (CrateNum crateNum, HirId id)
+{
+ auto it = hirPathSegMappings.find (crateNum);
+ if (it == hirPathSegMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
+Mappings::insert_hir_generic_param (CrateNum crateNum, HirId id,
+ HIR::GenericParam *param)
+{
+ rust_assert (lookup_hir_generic_param (crateNum, id) == nullptr);
+
+ hirGenericParamMappings[crateNum][id] = param;
+ nodeIdToHirMappings[crateNum][param->get_mappings ().get_nodeid ()] = id;
+ insert_location (crateNum, id, param->get_locus_slow ());
+}
+
+HIR::GenericParam *
+Mappings::lookup_hir_generic_param (CrateNum crateNum, HirId id)
+{
+ auto it = hirGenericParamMappings.find (crateNum);
+ if (it == hirGenericParamMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
Mappings::insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type)
{
rust_assert (lookup_hir_type (crateNum, id) == nullptr);
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index 7e5449c..ccc873b 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -148,6 +148,14 @@ public:
void insert_hir_expr (CrateNum crateNum, HirId id, HIR::Expr *expr);
HIR::Expr *lookup_hir_expr (CrateNum crateNum, HirId id);
+ void insert_hir_path_expr_seg (CrateNum crateNum, HirId id,
+ HIR::PathExprSegment *expr);
+ HIR::PathExprSegment *lookup_hir_path_expr_seg (CrateNum crateNum, HirId id);
+
+ void insert_hir_generic_param (CrateNum crateNum, HirId id,
+ HIR::GenericParam *expr);
+ HIR::GenericParam *lookup_hir_generic_param (CrateNum crateNum, HirId id);
+
void insert_hir_type (CrateNum crateNum, HirId id, HIR::Type *type);
HIR::Type *lookup_hir_type (CrateNum crateNum, HirId id);
@@ -215,6 +223,20 @@ public:
!= nullptr;
}
+ void insert_trait_item_mapping (HirId trait_item_id, HIR::Trait *trait)
+ {
+ rust_assert (hirTraitItemsToTraitMappings.find (trait_item_id)
+ == hirTraitItemsToTraitMappings.end ());
+ hirTraitItemsToTraitMappings[trait_item_id] = trait;
+ }
+
+ HIR::Trait *lookup_trait_item_mapping (HirId trait_item_id)
+ {
+ auto lookup = hirTraitItemsToTraitMappings.find (trait_item_id);
+ rust_assert (lookup != hirTraitItemsToTraitMappings.end ());
+ return lookup->second;
+ }
+
private:
Mappings ();
@@ -245,6 +267,11 @@ private:
std::map<CrateNum, std::map<HirId, HIR::TraitItem *> > hirTraitItemMappings;
std::map<CrateNum, std::map<HirId, HIR::ExternalItem *> >
hirExternItemMappings;
+ std::map<CrateNum, std::map<HirId, HIR::PathExprSegment *> >
+ hirPathSegMappings;
+ std::map<CrateNum, std::map<HirId, HIR::GenericParam *> >
+ hirGenericParamMappings;
+ std::map<HirId, HIR::Trait *> hirTraitItemsToTraitMappings;
// location info
std::map<CrateNum, std::map<NodeId, Location> > locations;