Browse Source
Merge pull request #8560 from liamwhite/bitfield-may-alias
common: fix bitfield aliasing on GCC/Clang
pull/15/merge
bunnei
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with
9 additions and
0 deletions
-
src/common/bit_field.h
|
|
|
@ -146,7 +146,16 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
constexpr void Assign(const T& value) { |
|
|
|
#ifdef _MSC_VER |
|
|
|
storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value)); |
|
|
|
#else |
|
|
|
// Explicitly reload with memcpy to avoid compiler aliasing quirks |
|
|
|
// regarding optimization: GCC/Clang clobber chained stores to |
|
|
|
// different bitfields in the same struct with the last value. |
|
|
|
StorageTypeWithEndian storage_; |
|
|
|
std::memcpy(&storage_, &storage, sizeof(storage_)); |
|
|
|
storage = static_cast<StorageType>((storage_ & ~mask) | FormatValue(value)); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
[[nodiscard]] constexpr T Value() const { |
|
|
|
|