Przeglądaj źródła

Merge pull request #8560 from liamwhite/bitfield-may-alias

common: fix bitfield aliasing on GCC/Clang
bunnei 4 lat temu
rodzic
commit
93a4ca11fa
1 zmienionych plików z 9 dodań i 0 usunięć
  1. 9 0
      src/common/bit_field.h

+ 9 - 0
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 {