From: Bruno Haible Date: Fri, 16 Jun 2006 13:15:45 +0000 (+0000) Subject: Make it work when cross-compiling. X-Git-Tag: cvs-readonly~2362 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=bb6bc10c6f54bfefbe2b015a491031efa18640ae;p=gnulib.git Make it work when cross-compiling. --- diff --git a/m4/ChangeLog b/m4/ChangeLog index 99e030019..9299d2570 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,6 +1,10 @@ +2006-06-15 Bruno Haible + + * size_max.m4 (gl_SIZE_MAX): Make it work also when cross-compiling. + 2006-06-15 Eric Blake - * m4/ssize_t.m4 (gt_TYPE_SSIZE_T): Work in spite of -Werror. + * ssize_t.m4 (gt_TYPE_SSIZE_T): Work in spite of -Werror. 2006-05-30 Ralf Wildenhues Bruno Haible diff --git a/m4/size_max.m4 b/m4/size_max.m4 index 0336f3af5..029e47195 100644 --- a/m4/size_max.m4 +++ b/m4/size_max.m4 @@ -1,5 +1,5 @@ -# size_max.m4 serial 3 -dnl Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# size_max.m4 serial 4 +dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -23,28 +23,29 @@ Found it ], result=yes) if test -z "$result"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider - dnl than the type 'unsigned long'. - dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', - dnl which is guaranteed to work from LONG_MIN to LONG_MAX. - _AC_COMPUTE_INT([(size_t)~(size_t)0 / 10], res_hi, - [#include ], result=?) - _AC_COMPUTE_INT([(size_t)~(size_t)0 % 10], res_lo, - [#include ], result=?) + dnl than the type 'unsigned long'. Try hard to find a definition that can + dnl be used in a preprocessor #if, i.e. doesn't contain a cast. + _AC_COMPUTE_INT([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1, + [#include +#include ], size_t_bits_minus_1=) _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, - [#include ], result=?) - if test "$fits_in_uint" = 1; then - dnl Even though SIZE_MAX fits in an unsigned int, it must be of type - dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. - AC_TRY_COMPILE([#include - extern size_t foo; - extern unsigned long foo; - ], [], fits_in_uint=0) - fi - if test -z "$result"; then - if test "$fits_in_uint" = 1; then - result="$res_hi$res_lo"U + [#include ], fits_in_uint=) + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + dnl We cannot use 'expr' to simplify this expression, because 'expr' + dnl works only with 'long' integers in the host environment, while we + dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. + if test $fits_in_uint = 1; then + result="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" else - result="$res_hi$res_lo"UL + result="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" fi else dnl Shouldn't happen, but who knows...