Skip to content

Commit ead3580

Browse files
committed
Autodetect endianness.
In configure we set NXT_HAVE_LITTLE_ENDIAN for i386, amd64 and x86_64. However that misses at least AArch64 (arm64) where it's usually run in little endian mode. However none of that really matters as NXT_HAVE_LITTLE_ENDIAN isn't used anywhere. So why this patch? The only place we need to explicitly know about endianness is the nxt_websocket_header_t structure where we lay it out differently depending on endianness. This is currently done using BYTE_ORDER, LITTLE_ENDIAN and BIG_ENDIAN macros. However on at least illumos (OpenSolaris / OpenIndiana) those macros are not defined and we get compiler errors due to duplicate structure members. So let's use our own NXT_HAVE_{BIG,LITTLE}_ENDIAN macros. However it would be better to detect endianness programmatically as some architectures can run in either mode, e.g Linux used to run in big endian on PowerPC but has since switched to little endian (to match x86). This commit adds an auto/endian script (using a slightly modified version of the test program from nginx's auto script), that checks for the endianness of the platform being built on. E.g checking for endianness ... little endian The next commit will switch the nxt_websocket_header_t structure over to these new macros. Link: <#298> Link: <https://developer.ibm.com/articles/l-power-little-endian-faq-trs/> Tested-by: Alejandro Colomar <alx@nginx.com> Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
1 parent f3d05bb commit ead3580

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

auto/endian

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Copyright (C) Igor Sysoev
2+
# Copyright (C) Andrew Clayton
3+
# Copyright (C) Nginx, Inc.
4+
5+
6+
nxt_feature="endianness"
7+
nxt_feature_name=
8+
nxt_feature_run=value
9+
nxt_feature_incs=
10+
nxt_feature_libs=
11+
nxt_feature_test="#include <stdint.h>
12+
#include <stdio.h>
13+
14+
int main(void) {
15+
int i = 0x11223344;
16+
uint8_t *p;
17+
18+
p = (uint8_t *)&i;
19+
if (*p == 0x44)
20+
printf(\"little endian\");
21+
else
22+
printf(\"big endian\");
23+
return 0;
24+
}"
25+
. auto/feature
26+
27+
if [ "$nxt_feature_value" = "little endian" ]; then
28+
nxt_have=NXT_HAVE_LITTLE_ENDIAN . auto/have
29+
else
30+
nxt_have=NXT_HAVE_BIG_ENDIAN . auto/have
31+
fi

configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ fi
109109

110110
NXT_LIBRT=
111111

112+
. auto/endian
112113
. auto/types
113114
. auto/clang
114115
. auto/atomic
@@ -136,7 +137,6 @@ fi
136137

137138
case "$NXT_SYSTEM_PLATFORM" in
138139
i386 | amd64 | x86_64)
139-
nxt_have=NXT_HAVE_LITTLE_ENDIAN . auto/have
140140
nxt_have=NXT_HAVE_NONALIGNED . auto/have
141141
;;
142142
esac

0 commit comments

Comments
 (0)