aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-04-12 10:19:11 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2022-04-12 15:26:11 +0200
commitece3809c505c8a474b81f6c00fbe6fc83718a2cf (patch)
tree93ad5387b4075d53f5a3e9e9dc8ff711e0419f64
parenta376e1939e5ced1fc457d6a35c64c5f75d3da976 (diff)
downloadgcc-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.cc9
-rw-r--r--gcc/rust/privacy/rust-privacy-ctx.h2
-rw-r--r--gcc/rust/util/rust-mapping-common.h13
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