Endian/__BYTE_ORDER question

Geert Uytterhoeven Geert.Uytterhoeven at sonycom.com
Fri Feb 12 21:33:02 EST 2010


On Fri, 12 Feb 2010, Joakim Tjernlund wrote:
> Wolfgang Denk <wd at denx.de> wrote on 2010/02/11 22:39:00:
> > Dear Joakim Tjernlund,
> >
> > In message <OF918AA866.3ED427EB-ONC12576C7.005CBEE4-C12576C7.
> > 005CF730 at transmode.se> you wrote:
> > >
> > > > I have no idea how it is actually done in the kernel code... but gcc
> > > > defines it:
> > > >
> > > > gcc -dM -E -x c - <<<'' | grep ENDIAN
> > > > #define __BIG_ENDIAN__ 1
> > > > #define _BIG_ENDIAN 1
> > >
> > > That doesn't define __BYTE_ORDER. Try the same gcc command
> > > on a file that #includes <stdlib.h> and you will get both
> > > __BIG_ENDIAN and __LITTLE_ENDIAN
> >
> > For me this appears to work:
> >
> > On x86:
> >
> >    $ echo '#include <stdlib.h>' | gcc -dM -E -x c - | grep ENDIAN
> >    #define _ENDIAN_H 1
> >    #define PDP_ENDIAN __PDP_ENDIAN
> >    #define __PDP_ENDIAN 3412
> >    #define BIG_ENDIAN __BIG_ENDIAN
> >    #define __BYTE_ORDER __LITTLE_ENDIAN
> >    #define __LITTLE_ENDIAN 1234
> >    #define __BIG_ENDIAN 4321
> >    #define LITTLE_ENDIAN __LITTLE_ENDIAN
> >
> > On PowerPC:
> >
> >    $ echo '#include <stdlib.h>' | gcc -dM -E -x c - | grep ENDIAN
> >    #define __BIG_ENDIAN__ 1
> >    #define __PDP_ENDIAN 3412
> >    #define __LITTLE_ENDIAN 1234
> >    #define BIG_ENDIAN __BIG_ENDIAN
> >    #define _BIG_ENDIAN 1
> >    #define __BYTE_ORDER __BIG_ENDIAN
> >    #define _ENDIAN_H 1
> >    #define __BIG_ENDIAN 4321
> >    #define PDP_ENDIAN __PDP_ENDIAN
> >    #define LITTLE_ENDIAN __LITTLE_ENDIAN
> >
> > In both cases __BYTE_ORDER is set to a sane value.
> 
> Yes, but that was not what I meant. If you look closer you see that both
> __BIG_ENDIAN and __LITTLE_ENDIAN are defined in each compiler. This means
> you cannot use these two defines directly to tell if your arch is BE or LE.

The proper tests are:
  - #if __BYTE_ORDER == __BIG_ENDIAN
  - #if __BYTE_ORDER == __LITTLE_ENDIAN
i.e. don't just test for the presence of __BIG_ENDIAN or __LITTLE_ENDIAN.

With kind regards,

Geert Uytterhoeven
Software Architect
Techsoft Centre

Technology and Software Centre Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium

Phone:    +32 (0)2 700 8453
Fax:      +32 (0)2 700 8622
E-mail:   Geert.Uytterhoeven at sonycom.com
Internet: http://www.sony-europe.com/

A division of Sony Europe (Belgium) N.V.
VAT BE 0413.825.160 · RPR Brussels
Fortis · BIC GEBABEBB · IBAN BE41293037680010


More information about the Linuxppc-dev mailing list