diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ac9e95eb57..493b7ec3e90 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-04-06 Eric Botcazou + + * stor-layout.c (set_sizetype): Use the full precision of their + machine mode for bitsize types. + 2009-04-06 H.J. Lu * config/i386/i386.md: Revert 2 accidental checkins. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index e7036827a0c..c2d367f38a7 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -2046,15 +2046,18 @@ initialize_sizetypes (bool signed_p) void set_sizetype (tree type) { + tree t; int oprecision = TYPE_PRECISION (type); /* The *bitsizetype types use a precision that avoids overflows when calculating signed sizes / offsets in bits. However, when cross-compiling from a 32 bit to a 64 bit host, we are limited to 64 bit precision. */ - int precision = MIN (MIN (oprecision + BITS_PER_UNIT_LOG + 1, - MAX_FIXED_MODE_SIZE), - 2 * HOST_BITS_PER_WIDE_INT); - tree t; + int precision + = MIN (oprecision + BITS_PER_UNIT_LOG + 1, MAX_FIXED_MODE_SIZE); + precision + = GET_MODE_PRECISION (smallest_mode_for_size (precision, MODE_INT)); + if (precision > HOST_BITS_PER_WIDE_INT * 2) + precision = HOST_BITS_PER_WIDE_INT * 2; gcc_assert (TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));