aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Weir <chrisweir@google.com>2023-04-14 20:39:14 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-14 20:39:14 +0000
commitbefe487bd913051a1ccc7599fa05fc50aa9054cc (patch)
tree686ddc9c657ee26a11302901c88f166557189643
parent7a901bb79f183b19f24bc35f052ba5076fdc0a1c (diff)
parent12c66c7c8cf363c80a7471cb1fa17b74e005345b (diff)
downloadprotobuf-android14-dev.tar.gz
Merge "Use builtin multiplication for overflow" am: 27805c3b27 am: c981a5623b am: 12c66c7c8candroid14-dev
Original change: https://android-review.googlesource.com/c/platform/external/protobuf/+/2538230 Change-Id: I67a51b25d7445aca1dc27cb603cb77ecdbae7158 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--src/google/protobuf/map.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h
index 008c19225..5634f50bb 100644
--- a/src/google/protobuf/map.h
+++ b/src/google/protobuf/map.h
@@ -331,6 +331,18 @@ size_t SpaceUsedInValues(const Map* map) {
inline size_t SpaceUsedInValues(const void*) { return 0; }
+// Multiply two numbers where overflow is expected.
+template <typename N>
+N MultiplyWithOverflow(N a, N b) {
+#if __has_builtin(__builtin_mul_overflow)
+ N res;
+ (void)__builtin_mul_overflow(a, b, &res);
+ return res;
+#else
+ return a * b;
+#endif
+}
+
} // namespace internal
// This is the class for Map's internal value_type. Instead of using
@@ -1099,7 +1111,8 @@ class Map {
// the hash value. The constant kPhi (suggested by Knuth) is roughly
// (sqrt(5) - 1) / 2 * 2^64.
constexpr uint64_t kPhi = uint64_t{0x9e3779b97f4a7c15};
- return ((kPhi * h) >> 32) & (num_buckets_ - 1);
+ return (internal::MultiplyWithOverflow(kPhi, h) >> 32) &
+ (num_buckets_ - 1);
}
// Return a power of two no less than max(kMinTableSize, n).