Fix config.h endianess detection to work on Linux / PPC64.

Config.h performs endianess detection including OS-specific headers to
define the endianess macros, or when this is not possible, checking the
processor type via ifdefs.

Sometimes when the OS-specific macro is included, only __BYTE_ORDER is
defined, while BYTE_ORDER remains undefined. There is code at the end of
config.h endianess detection in order to define the macros without the
underscore, but it was not working correctly.

This commit fixes endianess detection fixing Redis on Linux / PPC64 and
possibly other systems.
This commit is contained in:
antirez 2012-12-11 17:01:00 +01:00
parent bf0852e5ed
commit 705874e31d
2 changed files with 16 additions and 2 deletions

View File

@ -139,13 +139,27 @@
#endif /* BSD */ #endif /* BSD */
#endif /* BYTE_ORDER */ #endif /* BYTE_ORDER */
#if defined(__BYTE_ORDER) && !defined(BYTE_ORDER) /* Sometimes after including an OS-specific header that defines the
* endianess we end with __BYTE_ORDER but not with BYTE_ORDER that is what
* the Redis code uses. In this case let's define everything without the
* underscores. */
#ifndef BYTE_ORDER
#ifdef __BYTE_ORDER
#if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN __LITTLE_ENDIAN
#endif
#ifndef BIG_ENDIAN
#define BIG_ENDIAN __BIG_ENDIAN
#endif
#if (__BYTE_ORDER == __LITTLE_ENDIAN) #if (__BYTE_ORDER == __LITTLE_ENDIAN)
#define BYTE_ORDER LITTLE_ENDIAN #define BYTE_ORDER LITTLE_ENDIAN
#else #else
#define BYTE_ORDER BIG_ENDIAN #define BYTE_ORDER BIG_ENDIAN
#endif #endif
#endif #endif
#endif
#endif
#if !defined(BYTE_ORDER) || \ #if !defined(BYTE_ORDER) || \
(BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN) (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN)
@ -164,5 +178,4 @@
#endif #endif
#endif #endif
#endif #endif

View File

@ -33,6 +33,7 @@
#ifndef __ENDIANCONV_H #ifndef __ENDIANCONV_H
#define __ENDIANCONV_H #define __ENDIANCONV_H
#include "config.h"
#include <stdint.h> #include <stdint.h>
void memrev16(void *p); void memrev16(void *p);