Просмотр исходного кода

common: fix bitfield aliasing on GCC/Clang

Liam 4 лет назад
Родитель
Сommit
a1c1ad096d
1 измененных файлов с 9 добавлено и 0 удалено
  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 {