Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix broken file name.
[simgrid.git] / acmacro / gras_arch.m4
index 7540598..c10677c 100644 (file)
@@ -39,27 +39,30 @@ AC_MSG_RESULT($GRAS_CHECK_SIZEOF_RES)
 ])
 
 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
 ])
 
@@ -111,7 +114,7 @@ AC_DEFUN([GRAS_STRUCT_BOUNDARY],
  AC_MSG_CHECKING(for the minimal structure boundary of $1)
 
  AC_CACHE_VAL(GRAS_STRUCT_BOUNDARY_RES, 
- [for ac_size in 1 2 4 8 16 32 64 ; do # List sizes in rough order of prevalence. 
+ [for ac_size in 1 2 4 8 16 32 64 ; do # List sizes in rough order of prevalence. 
    AC_COMPILE_IFELSE(AC_LANG_PROGRAM([#include "confdefs.h" 
      #include <sys/types.h> 
      struct s { char c; $1 i; };
@@ -120,6 +123,9 @@ AC_DEFUN([GRAS_STRUCT_BOUNDARY],
   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
@@ -130,8 +136,9 @@ AC_DEFUN([GRAS_ARCH],
 [
 # 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)
@@ -169,14 +176,25 @@ trace="${trace}_D:4/${ac_cv_struct_boundary_float}:8/${ac_cv_struct_boundary_dou
 
 # 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/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1:) gras_arch=0; gras_size=32; gras_arch_name=little32_1;;
+  l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:) gras_arch=1; gras_size=32; gras_arch_name=little32_2;;
+  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=2; gras_size=32; gras_arch_name=little32_4;;
+  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=3; gras_size=32; gras_arch_name=little32_8;;
+
+  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=4; gras_size=64; 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=5; gras_size=32; 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=6; gras_size=32; 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=7; gras_size=32; 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=8; gras_size=32; 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=9; gras_size=64; gras_arch_name=big64;;
+  B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:) gras_arch=10;gras_size=64; gras_arch_name=big64_8_4;;
 esac
 if test x$gras_arch = xunknown ; then
   AC_MSG_RESULT([damnit ($trace)])
@@ -186,6 +204,23 @@ fi
 echo "$as_me:$LINENO: GRAS trace of this machine: $trace" >&AS_MESSAGE_LOG_FD
 AC_DEFINE_UNQUOTED(GRAS_THISARCH,$gras_arch,[defines the GRAS architecture signature of this machine])
 AC_MSG_RESULT($gras_arch ($gras_arch_name))
+
+AM_CONDITIONAL(GRAS_ARCH_32_BITS,[test "$gras_size" = 32])
+
+AC_MSG_CHECKING(the maximal size of scalar)
+ac_cv_sizeof_max=0
+for s in $ac_cv_sizeof_char \
+         $ac_cv_sizeof_short_int $ac_cv_sizeof_int $ac_cv_sizeof_long_int $ac_cv_sizeof_long_long_int \
+         $ac_cv_sizeof_void_p $ac_cv_sizeof_void_LpR_LvoidR \
+        4 8; do
+        
+  if test $ac_cv_sizeof_max -lt $s ; then 
+    ac_cv_sizeof_max=$s
+  fi
+done
+AC_MSG_RESULT($ac_cv_sizeof_max)
+AC_DEFINE_UNQUOTED([SIZEOF_MAX],$ac_cv_sizeof_max,[The maximal size of any scalar on this arch])
+
 ])
 # END OF GRAS ARCH CHECK