From ccc04944b2847e91fda3f22fae6723394644d75a Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Sun, 13 Apr 2014 11:59:48 +0200 Subject: [PATCH] BitField: Fix alignment issues. At least one platform (ARM with NEON instructions enabled) generates SIGBUSes if BitField objects aren't aligned properly. --- Source/Core/Common/BitField.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/Core/Common/BitField.h b/Source/Core/Common/BitField.h index e1e5ba6546..f7a0a0175c 100644 --- a/Source/Core/Common/BitField.h +++ b/Source/Core/Common/BitField.h @@ -94,13 +94,23 @@ * * Caveats: * + * 1) * BitField provides automatic casting from and to the storage type where * appropriate. However, when using non-typesafe functions like printf, an * explicit cast must be performed on the BitField object to make sure it gets * passed correctly, e.g.: * printf("Value: %d", (s32)some_register.some_signed_fields); * + * 2) + * Not really a caveat, but potentially irritating: This class is used in some + * packed structures that do not guarantee proper alignment. Therefore we have + * to use #pragma pack here not to pack the members of the class, but instead + * to break GCC's assumption that the members of the class are aligned on + * sizeof(StorageType). + * TODO(neobrain): Confirm that this is a proper fix and not just masking + * symptoms. */ +#pragma pack(1) template struct BitField { @@ -160,3 +170,4 @@ private: static_assert(bits <= 8 * sizeof(T), "Invalid number of bits"); static_assert(bits > 0, "Invalid number of bits"); }; +#pragma pack()