diff options
author | Chris Weir <chrisweir@google.com> | 2023-04-14 20:39:14 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-14 20:39:14 +0000 |
commit | befe487bd913051a1ccc7599fa05fc50aa9054cc (patch) | |
tree | 686ddc9c657ee26a11302901c88f166557189643 | |
parent | 7a901bb79f183b19f24bc35f052ba5076fdc0a1c (diff) | |
parent | 12c66c7c8cf363c80a7471cb1fa17b74e005345b (diff) | |
download | protobuf-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.h | 15 |
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). |