]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[i386] Fix building on older versions of gcc
authorMichael Brown <mcb30@ipxe.org>
Sun, 4 Mar 2012 21:09:40 +0000 (21:09 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 4 Mar 2012 21:34:46 +0000 (21:34 +0000)
Fix a strict-aliasing error on certain versions of gcc.

Reported-by: Marko Myllynen <myllynen@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/include/bits/byteswap.h

index 381e695fb78163124e459b98425662d2cfd3a128..d40771354b46da823b3cebb33bdf6238754637d2 100644 (file)
@@ -52,7 +52,10 @@ __bswap_variable_64 ( uint64_t x ) {
 
 static inline __attribute__ (( always_inline )) void
 __bswap_64s ( uint64_t *x ) {
-       uint32_t __attribute__ (( may_alias )) *dwords = ( ( void * ) x );
+       struct {
+               uint32_t low;
+               uint32_t high;
+       } __attribute__ (( may_alias )) *dwords = ( ( void * ) x );
        uint32_t discard;
 
        __asm__ ( "movl %0,%2\n\t"
@@ -60,8 +63,9 @@ __bswap_64s ( uint64_t *x ) {
                  "xchgl %2,%1\n\t"
                  "bswapl %2\n\t"
                  "movl %2,%0\n\t"
-                 : "=g" ( dwords[0] ), "=g" ( dwords[1] ), "=r" ( discard )
-                 : "0" ( dwords[0] ), "1" ( dwords[1] ) );
+                 : "=g" ( dwords->low ), "=g" ( dwords->high ),
+                   "=r" ( discard )
+                 : "0" ( dwords->low ), "1" ( dwords->high ) );
 }
 
 #endif /* _BITS_BYTESWAP_H */