diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2022-04-21 08:49:53 +0200 |
---|---|---|
committer | Peter Varga <pvarga@inf.u-szeged.hu> | 2022-04-27 13:22:41 +0000 |
commit | 2bfa1c12b99035eb97a40a344462b7ac4efe770a (patch) | |
tree | e84addd730820251e417b1518610385d62b99bcd /chromium | |
parent | f1850dc7affa021fb4f9de81e3e71d0fdf20516e (diff) |
Workaround MSVC2022 ICE in constexpr functions
It happens around initialization of STL containers in a constexpr
function. In this case, aggregate initialization of std::array with
double braces seems to cause the crash.
For some reason it doesn't seem to happen in 98-based. This workaround
can be reverted after Microsoft fixes the issue:
https://developercommunity.visualstudio.com/t/fatal-error-C1001:-Internal-compiler-err/1669485
Change-Id: I6bc2c71d328691cc74bc53c6d62f3d5df519b81e
Pick-to: 90-based
Fixes: QTBUG-101917
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit 0ce5e91bdfa2cd7cac247911b9e8c4404c114937)
Diffstat (limited to 'chromium')
-rw-r--r-- | chromium/base/hash/md5_constexpr_internal.h | 62 | ||||
-rw-r--r-- | chromium/net/third_party/quiche/src/quic/core/quic_versions.h | 11 |
2 files changed, 64 insertions, 9 deletions
diff --git a/chromium/base/hash/md5_constexpr_internal.h b/chromium/base/hash/md5_constexpr_internal.h index ae76d78e02c..f165f3a46de 100644 --- a/chromium/base/hash/md5_constexpr_internal.h +++ b/chromium/base/hash/md5_constexpr_internal.h @@ -281,15 +281,63 @@ struct MD5CE { return IntermediateDataToMD5Digest(ProcessMessage(data, n)); } - static constexpr uint64_t Hash64(const char* data, uint32_t n) { - IntermediateData intermediate = ProcessMessage(data, n); - return (static_cast<uint64_t>(SwapEndian(intermediate.a)) << 32) | - static_cast<uint64_t>(SwapEndian(intermediate.b)); + static constexpr uint64_t Hash64(const char* message, uint32_t n) { + const uint32_t m = GetPaddedMessageLength(n); + IntermediateData intermediate0 = kInitialIntermediateData; + for (uint32_t offset = 0; offset < m; offset += 64) { + RoundData data = { + GetPaddedMessageWord(message, n, m, offset), + GetPaddedMessageWord(message, n, m, offset + 4), + GetPaddedMessageWord(message, n, m, offset + 8), + GetPaddedMessageWord(message, n, m, offset + 12), + GetPaddedMessageWord(message, n, m, offset + 16), + GetPaddedMessageWord(message, n, m, offset + 20), + GetPaddedMessageWord(message, n, m, offset + 24), + GetPaddedMessageWord(message, n, m, offset + 28), + GetPaddedMessageWord(message, n, m, offset + 32), + GetPaddedMessageWord(message, n, m, offset + 36), + GetPaddedMessageWord(message, n, m, offset + 40), + GetPaddedMessageWord(message, n, m, offset + 44), + GetPaddedMessageWord(message, n, m, offset + 48), + GetPaddedMessageWord(message, n, m, offset + 52), + GetPaddedMessageWord(message, n, m, offset + 56), + GetPaddedMessageWord(message, n, m, offset + 60)}; + IntermediateData intermediate1 = intermediate0; + for (uint32_t i = 0; i < 64; ++i) + intermediate1 = ApplyStep(i, data, intermediate1); + intermediate0 = Add(intermediate0, intermediate1); + } + return (static_cast<uint64_t>(SwapEndian(intermediate0.a)) << 32) | + static_cast<uint64_t>(SwapEndian(intermediate0.b)); } - static constexpr uint32_t Hash32(const char* data, uint32_t n) { - IntermediateData intermediate = ProcessMessage(data, n); - return SwapEndian(intermediate.a); + static constexpr uint32_t Hash32(const char* message, uint32_t n) { + const uint32_t m = GetPaddedMessageLength(n); + IntermediateData intermediate0 = kInitialIntermediateData; + for (uint32_t offset = 0; offset < m; offset += 64) { + RoundData data = { + GetPaddedMessageWord(message, n, m, offset), + GetPaddedMessageWord(message, n, m, offset + 4), + GetPaddedMessageWord(message, n, m, offset + 8), + GetPaddedMessageWord(message, n, m, offset + 12), + GetPaddedMessageWord(message, n, m, offset + 16), + GetPaddedMessageWord(message, n, m, offset + 20), + GetPaddedMessageWord(message, n, m, offset + 24), + GetPaddedMessageWord(message, n, m, offset + 28), + GetPaddedMessageWord(message, n, m, offset + 32), + GetPaddedMessageWord(message, n, m, offset + 36), + GetPaddedMessageWord(message, n, m, offset + 40), + GetPaddedMessageWord(message, n, m, offset + 44), + GetPaddedMessageWord(message, n, m, offset + 48), + GetPaddedMessageWord(message, n, m, offset + 52), + GetPaddedMessageWord(message, n, m, offset + 56), + GetPaddedMessageWord(message, n, m, offset + 60)}; + IntermediateData intermediate1 = intermediate0; + for (uint32_t i = 0; i < 64; ++i) + intermediate1 = ApplyStep(i, data, intermediate1); + intermediate0 = Add(intermediate0, intermediate1); + } + return SwapEndian(intermediate0.a); } }; diff --git a/chromium/net/third_party/quiche/src/quic/core/quic_versions.h b/chromium/net/third_party/quiche/src/quic/core/quic_versions.h index 77b33594f79..69845cc69f8 100644 --- a/chromium/net/third_party/quiche/src/quic/core/quic_versions.h +++ b/chromium/net/third_party/quiche/src/quic/core/quic_versions.h @@ -26,6 +26,7 @@ #include <string> #include <vector> +#include "absl/base/macros.h" #include "net/third_party/quiche/src/quic/core/quic_tag.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" @@ -181,8 +182,14 @@ QUIC_EXPORT_PRIVATE constexpr bool ParsedQuicVersionIsValid( transport_version == QUIC_VERSION_RESERVED_FOR_NEGOTIATION; if (!transport_version_is_valid) { // Iterators are not constexpr in C++14 which Chrome uses. - constexpr auto supported_transport_versions = SupportedTransportVersions(); - for (size_t i = 0; i < supported_transport_versions.size(); ++i) { + constexpr QuicTransportVersion supported_transport_versions[] = { + QUIC_VERSION_IETF_DRAFT_29, + QUIC_VERSION_IETF_DRAFT_27, + QUIC_VERSION_51, + QUIC_VERSION_50, + QUIC_VERSION_46, + QUIC_VERSION_43}; + for (size_t i = 0; i < ABSL_ARRAYSIZE(supported_transport_versions); ++i) { const QuicTransportVersion& trans_vers = supported_transport_versions[i]; if (trans_vers == transport_version) { transport_version_is_valid = true; |