Home | History | Annotate | Download | only in m4
      1 # longlong.m4 serial 14
      2 dnl Copyright (C) 1999-2007, 2009 Free Software Foundation, Inc.
      3 dnl This file is free software; the Free Software Foundation
      4 dnl gives unlimited permission to copy and/or distribute it,
      5 dnl with or without modifications, as long as this notice is preserved.
      6 
      7 dnl From Paul Eggert.
      8 
      9 # Define HAVE_LONG_LONG_INT if 'long long int' works.
     10 # This fixes a bug in Autoconf 2.61, but can be removed once we
     11 # assume 2.62 everywhere.
     12 
     13 # Note: If the type 'long long int' exists but is only 32 bits large
     14 # (as on some very old compilers), HAVE_LONG_LONG_INT will not be
     15 # defined. In this case you can treat 'long long int' like 'long int'.
     16 
     17 AC_DEFUN([AC_TYPE_LONG_LONG_INT],
     18 [
     19   AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
     20     [AC_LINK_IFELSE(
     21        [_AC_TYPE_LONG_LONG_SNIPPET],
     22        [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
     23 	dnl If cross compiling, assume the bug isn't important, since
     24 	dnl nobody cross compiles for this platform as far as we know.
     25 	AC_RUN_IFELSE(
     26 	  [AC_LANG_PROGRAM(
     27 	     [[@%:@include <limits.h>
     28 	       @%:@ifndef LLONG_MAX
     29 	       @%:@ define HALF \
     30 			(1LL << (sizeof (long long int) * CHAR_BIT - 2))
     31 	       @%:@ define LLONG_MAX (HALF - 1 + HALF)
     32 	       @%:@endif]],
     33 	     [[long long int n = 1;
     34 	       int i;
     35 	       for (i = 0; ; i++)
     36 		 {
     37 		   long long int m = n << i;
     38 		   if (m >> i != n)
     39 		     return 1;
     40 		   if (LLONG_MAX / 2 < m)
     41 		     break;
     42 		 }
     43 	       return 0;]])],
     44 	  [ac_cv_type_long_long_int=yes],
     45 	  [ac_cv_type_long_long_int=no],
     46 	  [ac_cv_type_long_long_int=yes])],
     47        [ac_cv_type_long_long_int=no])])
     48   if test $ac_cv_type_long_long_int = yes; then
     49     AC_DEFINE([HAVE_LONG_LONG_INT], [1],
     50       [Define to 1 if the system has the type `long long int'.])
     51   fi
     52 ])
     53 
     54 # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
     55 # This fixes a bug in Autoconf 2.61, but can be removed once we
     56 # assume 2.62 everywhere.
     57 
     58 # Note: If the type 'unsigned long long int' exists but is only 32 bits
     59 # large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
     60 # will not be defined. In this case you can treat 'unsigned long long int'
     61 # like 'unsigned long int'.
     62 
     63 AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
     64 [
     65   AC_CACHE_CHECK([for unsigned long long int],
     66     [ac_cv_type_unsigned_long_long_int],
     67     [AC_LINK_IFELSE(
     68        [_AC_TYPE_LONG_LONG_SNIPPET],
     69        [ac_cv_type_unsigned_long_long_int=yes],
     70        [ac_cv_type_unsigned_long_long_int=no])])
     71   if test $ac_cv_type_unsigned_long_long_int = yes; then
     72     AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
     73       [Define to 1 if the system has the type `unsigned long long int'.])
     74   fi
     75 ])
     76 
     77 # Expands to a C program that can be used to test for simultaneous support
     78 # of 'long long' and 'unsigned long long'. We don't want to say that
     79 # 'long long' is available if 'unsigned long long' is not, or vice versa,
     80 # because too many programs rely on the symmetry between signed and unsigned
     81 # integer types (excluding 'bool').
     82 AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
     83 [
     84   AC_LANG_PROGRAM(
     85     [[/* For now, do not test the preprocessor; as of 2007 there are too many
     86 	 implementations with broken preprocessors.  Perhaps this can
     87 	 be revisited in 2012.  In the meantime, code should not expect
     88 	 #if to work with literals wider than 32 bits.  */
     89       /* Test literals.  */
     90       long long int ll = 9223372036854775807ll;
     91       long long int nll = -9223372036854775807LL;
     92       unsigned long long int ull = 18446744073709551615ULL;
     93       /* Test constant expressions.   */
     94       typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
     95 		     ? 1 : -1)];
     96       typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
     97 		     ? 1 : -1)];
     98       int i = 63;]],
     99     [[/* Test availability of runtime routines for shift and division.  */
    100       long long int llmax = 9223372036854775807ll;
    101       unsigned long long int ullmax = 18446744073709551615ull;
    102       return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
    103 	      | (llmax / ll) | (llmax % ll)
    104 	      | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
    105 	      | (ullmax / ull) | (ullmax % ull));]])
    106 ])
    107