BitField: Fix alignment issues.

At least one platform (ARM with NEON instructions enabled) generates SIGBUSes if BitField objects aren't aligned properly.
This commit is contained in:
Tony Wasserka 2014-04-13 11:59:48 +02:00
parent 12841928df
commit ccc04944b2
1 changed files with 11 additions and 0 deletions

View File

@ -94,13 +94,23 @@
* *
* Caveats: * Caveats:
* *
* 1)
* BitField provides automatic casting from and to the storage type where * BitField provides automatic casting from and to the storage type where
* appropriate. However, when using non-typesafe functions like printf, an * appropriate. However, when using non-typesafe functions like printf, an
* explicit cast must be performed on the BitField object to make sure it gets * explicit cast must be performed on the BitField object to make sure it gets
* passed correctly, e.g.: * passed correctly, e.g.:
* printf("Value: %d", (s32)some_register.some_signed_fields); * 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<std::size_t position, std::size_t bits, typename T> template<std::size_t position, std::size_t bits, typename T>
struct BitField struct BitField
{ {
@ -160,3 +170,4 @@ private:
static_assert(bits <= 8 * sizeof(T), "Invalid number of bits"); static_assert(bits <= 8 * sizeof(T), "Invalid number of bits");
static_assert(bits > 0, "Invalid number of bits"); static_assert(bits > 0, "Invalid number of bits");
}; };
#pragma pack()