])
dnl
-dnl GRAS_TWO_COMPLIMENT([type]): Make sure the type is two-compliment
+dnl GRAS_TWO_COMPLEMENT([type]): Make sure the type is two-complement
dnl warning, this does not work with char (quite logical)
dnl
-AC_DEFUN([GRAS_TWO_COMPLIMENT],
+AC_DEFUN([GRAS_TWO_COMPLEMENT],
[
-AC_MSG_CHECKING(whether $1 is two-compliment)
-AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include "confdefs.h"
+AC_MSG_CHECKING(whether $1 is two-complement)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include "confdefs.h"
union {
signed $1 testInt;
unsigned char bytes[sizeof($1)];
} intTester;
]],[[
intTester.testInt = -2;
- return ((unsigned int)intTester.bytes[0] +
- (unsigned int)intTester.bytes[sizeof($1) - 1]) - 509; /* should be 0 */
+ switch (0) {
+ case 0:
+ case (((unsigned int)intTester.bytes[0] +
+ (unsigned int)intTester.bytes[sizeof($1) - 1]) - 509) == 0:
+ }
]])], dnl end of AC LANG PROGRAM
-[two_compliment=yes],[two_compliment=no] )dnl end of AC COMPILE IFELSE
+[two_complement=yes],[two_complement=no] )dnl end of AC COMPILE IFELSE
-AC_MSG_RESULT($two_compliment)
-if test x$two_compliment != xyes ; then
- AC_MSG_ERROR([GRAS works only two-compliment integers (yet)])
+AC_MSG_RESULT($two_complement)
+if test x$two_complement != xyes ; then
+ AC_MSG_ERROR([GRAS works only two-complement integers (yet)])
fi
])
done
])
AC_MSG_RESULT($GRAS_STRUCT_BOUNDARY_RES)
+ if test x$GRAS_STRUCT_BOUNDARY_RES = x ; then
+ AC_MSG_ERROR([Cannot determine the minimal alignment boundary of $1 in structures])
+ fi
])
# GRAS_ARCH(): check the gras_architecture of this plateform
[
# Check for the architecture
AC_C_BIGENDIAN(endian=1,endian=0,AC_MSG_ERROR([GRAS works only for little or big endian systems (yet)]))
-dnl Make sure we don't run on a non-two-compliment arch, since we dunno convert them
-GRAS_TWO_COMPLIMENT(int)
+dnl Make sure we don't run on a non-two-complement arch, since we dunno convert them
+dnl G RAS_TWO_COMPLEMENT(int) don't do this, it breaks cross-compile and all
+dnl archs conform to this
AC_DEFINE_UNQUOTED(GRAS_BIGENDIAN,$endian,[define if big endian])
GRAS_SIGNED_SIZEOF(char) GRAS_STRUCT_BOUNDARY(char)
# sizeof float/double are not tested since IEEE 754 is assumed.
# Check README.IEEE for rational.
+
+# The numbers after the _ in the arch name are the maximal packing boundary.
+# big32_2 means that all data are aligned on a 2 bytes boundary. (ARM)
+# big32_8_4 means that some or them are aligned on 8 bytes, some are on 4 bytes (AIX)
case $trace in
- l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=0; gras_arch_name=little32;;
- l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=1; gras_arch_name=little64;;
- B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:) gras_arch=2; gras_arch_name=big32;;
- B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=3; gras_arch_name=big64;;
- B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=4; gras_arch_name=aix
- AC_MSG_ERROR([GRAS does not work on AIX because max_align != const])
- ;;
+ l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:) gras_arch=0; gras_arch_name=little32;;
+ l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=1; gras_arch_name=little32_4;;
+
+ l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=2; gras_arch_name=little64;;
+
+ B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:) gras_arch=3; gras_arch_name=big32;;
+ B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=4; gras_arch_name=big32_8_4;;
+ B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=5; gras_arch_name=big32_4;;
+ B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:) gras_arch=6; gras_arch_name=big32_2;;
+
+ B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=7; gras_arch_name=big64;;
esac
if test x$gras_arch = xunknown ; then
AC_MSG_RESULT([damnit ($trace)])