aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-16 09:40:47 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-07-16 13:07:17 +0100
commitff137b6261c1fdbc2e49a439fb5872ec673e7447 (patch)
treefada843894d31cdefe6ddbcfa973efe9ddd928e8
parentf813b3309837f8fea19a0924f22a3f20a3ac8304 (diff)
downloadgcc-ff137b6261c1fdbc2e49a439fb5872ec673e7447.zip
gcc-ff137b6261c1fdbc2e49a439fb5872ec673e7447.tar.gz
gcc-ff137b6261c1fdbc2e49a439fb5872ec673e7447.tar.bz2
Keep track of impl blocks via mappings
If we keep track of the impl blocks within the crate's we can use this as another way to stream line looking up of specific HIR::Items. This will be used to find possible bounds for a receiver in a path probe.
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h4
-rw-r--r--gcc/rust/util/rust-hir-map.cc24
-rw-r--r--gcc/rust/util/rust-hir-map.h5
3 files changed, 33 insertions, 0 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h
index 68324c7..5ba5918 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -396,6 +396,8 @@ public:
mappings->insert_defid_mapping (mapping.get_defid (), translated);
mappings->insert_hir_item (mapping.get_crate_num (), mapping.get_hirid (),
translated);
+ mappings->insert_hir_impl_block (mapping.get_crate_num (),
+ mapping.get_hirid (), hir_impl_block);
mappings->insert_location (crate_num, mapping.get_hirid (),
impl_block.get_locus ());
@@ -540,6 +542,8 @@ public:
mappings->insert_defid_mapping (mapping.get_defid (), translated);
mappings->insert_hir_item (mapping.get_crate_num (), mapping.get_hirid (),
translated);
+ mappings->insert_hir_impl_block (mapping.get_crate_num (),
+ mapping.get_hirid (), hir_impl_block);
mappings->insert_location (crate_num, mapping.get_hirid (),
impl_block.get_locus ());
diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc
index fb8070a..33ba8d0 100644
--- a/gcc/rust/util/rust-hir-map.cc
+++ b/gcc/rust/util/rust-hir-map.cc
@@ -260,6 +260,30 @@ Mappings::lookup_hir_item (CrateNum crateNum, HirId id)
}
void
+Mappings::insert_hir_impl_block (CrateNum crateNum, HirId id,
+ HIR::ImplBlock *item)
+{
+ rust_assert (lookup_hir_impl_block (crateNum, id) == nullptr);
+
+ hirImplBlockMappings[crateNum][id] = item;
+ nodeIdToHirMappings[crateNum][item->get_mappings ().get_nodeid ()] = id;
+}
+
+HIR::ImplBlock *
+Mappings::lookup_hir_impl_block (CrateNum crateNum, HirId id)
+{
+ auto it = hirImplBlockMappings.find (crateNum);
+ if (it == hirImplBlockMappings.end ())
+ return nullptr;
+
+ auto iy = it->second.find (id);
+ if (iy == it->second.end ())
+ return nullptr;
+
+ return iy->second;
+}
+
+void
Mappings::insert_hir_implitem (CrateNum crateNum, HirId id,
HirId parent_impl_id, HIR::ImplItem *item)
{
diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h
index 9b67928..98c15a2 100644
--- a/gcc/rust/util/rust-hir-map.h
+++ b/gcc/rust/util/rust-hir-map.h
@@ -128,6 +128,10 @@ public:
void insert_hir_item (CrateNum crateNum, HirId id, HIR::Item *item);
HIR::Item *lookup_hir_item (CrateNum crateNum, HirId id);
+ void insert_hir_impl_block (CrateNum crateNum, HirId id,
+ HIR::ImplBlock *item);
+ HIR::ImplBlock *lookup_hir_impl_block (CrateNum crateNum, HirId id);
+
void insert_hir_implitem (CrateNum crateNum, HirId id, HirId parent_impl_id,
HIR::ImplItem *item);
HIR::ImplItem *lookup_hir_implitem (CrateNum crateNum, HirId id,
@@ -227,6 +231,7 @@ private:
hirImplItemMappings;
std::map<CrateNum, std::map<HirId, HIR::SelfParam *> > hirSelfParamMappings;
std::map<HirId, HIR::ImplBlock *> hirImplItemsToImplMappings;
+ std::map<CrateNum, std::map<HirId, HIR::ImplBlock *> > hirImplBlockMappings;
// location info
std::map<CrateNum, std::map<NodeId, Location> > locations;