diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-07-16 09:40:47 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-07-16 13:07:17 +0100 |
commit | ff137b6261c1fdbc2e49a439fb5872ec673e7447 (patch) | |
tree | fada843894d31cdefe6ddbcfa973efe9ddd928e8 /gcc | |
parent | f813b3309837f8fea19a0924f22a3f20a3ac8304 (diff) | |
download | gcc-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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.h | 4 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 24 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.h | 5 |
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; |