diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-12 10:19:11 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-04-12 15:26:11 +0200 |
commit | ece3809c505c8a474b81f6c00fbe6fc83718a2cf (patch) | |
tree | 93ad5387b4075d53f5a3e9e9dc8ff711e0419f64 | |
parent | a376e1939e5ced1fc457d6a35c64c5f75d3da976 (diff) | |
download | gcc-ece3809c505c8a474b81f6c00fbe6fc83718a2cf.zip gcc-ece3809c505c8a474b81f6c00fbe6fc83718a2cf.tar.gz gcc-ece3809c505c8a474b81f6c00fbe6fc83718a2cf.tar.bz2 |
privacy: Keep DefIds in reachability map instead
This commit also specialized `std::hash<DefId>` to be able to use it as
key in {unordered_}maps
-rw-r--r-- | gcc/rust/privacy/rust-privacy-ctx.cc | 9 | ||||
-rw-r--r-- | gcc/rust/privacy/rust-privacy-ctx.h | 2 | ||||
-rw-r--r-- | gcc/rust/util/rust-mapping-common.h | 13 |
3 files changed, 19 insertions, 5 deletions
diff --git a/gcc/rust/privacy/rust-privacy-ctx.cc b/gcc/rust/privacy/rust-privacy-ctx.cc index 629944a..9ebc869 100644 --- a/gcc/rust/privacy/rust-privacy-ctx.cc +++ b/gcc/rust/privacy/rust-privacy-ctx.cc @@ -24,7 +24,7 @@ namespace Privacy { static ReachLevel insert_if_higher (ReachLevel new_level, - std::unordered_map<HirId, ReachLevel>::iterator &existing) + std::unordered_map<DefId, ReachLevel>::iterator &existing) { if (new_level > existing->second) existing->second = new_level; @@ -36,18 +36,19 @@ ReachLevel PrivacyContext::update_reachability (const Analysis::NodeMapping &mapping, ReachLevel reach) { - auto existing_reach = reachability_map.find (mapping.get_hirid ()); + auto def_id = mapping.get_defid (); + auto existing_reach = reachability_map.find (def_id); if (existing_reach != reachability_map.end ()) return insert_if_higher (reach, existing_reach); - reachability_map.insert ({mapping.get_hirid (), reach}); + reachability_map.insert ({def_id, reach}); return reach; } const ReachLevel * PrivacyContext::lookup_reachability (const Analysis::NodeMapping &mapping) { - auto existing_reach = reachability_map.find (mapping.get_hirid ()); + auto existing_reach = reachability_map.find (mapping.get_defid ()); if (existing_reach == reachability_map.end ()) return nullptr; diff --git a/gcc/rust/privacy/rust-privacy-ctx.h b/gcc/rust/privacy/rust-privacy-ctx.h index 7626df3..52d790e 100644 --- a/gcc/rust/privacy/rust-privacy-ctx.h +++ b/gcc/rust/privacy/rust-privacy-ctx.h @@ -64,7 +64,7 @@ public: const ReachLevel *lookup_reachability (const Analysis::NodeMapping &mapping); private: - std::unordered_map<HirId, ReachLevel> reachability_map; + std::unordered_map<DefId, ReachLevel> reachability_map; }; } // namespace Privacy } // namespace Rust diff --git a/gcc/rust/util/rust-mapping-common.h b/gcc/rust/util/rust-mapping-common.h index 27faa7f..c440ae9 100644 --- a/gcc/rust/util/rust-mapping-common.h +++ b/gcc/rust/util/rust-mapping-common.h @@ -69,4 +69,17 @@ struct DefId } // namespace Rust +namespace std { +template <> struct hash<Rust::DefId> +{ + size_t operator() (const Rust::DefId &id) const noexcept + { + // TODO: Check if we can improve performance by having a better hash + // algorithm for `DefId`s + return hash<uint32_t> () (hash<uint32_t> () (id.crateNum) + + hash<uint32_t> () (id.localDefId)); + } +}; +} // namespace std + #endif // RUST_MAPPING_COMMON |