aboutsummaryrefslogtreecommitdiff
path: root/gcc/stor-layout.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2009-04-06 21:16:00 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2009-04-06 21:16:00 +0000
commitfe0a25ec79f35eb3ae2ecf31e4fd2ba91a6294fa (patch)
treef415142c581a669bd3c74758395dd97a88d662ee /gcc/stor-layout.c
parent0c011bc3b382df7cdb9e444ebba4db0ba01495e1 (diff)
downloadgcc-fe0a25ec79f35eb3ae2ecf31e4fd2ba91a6294fa.zip
gcc-fe0a25ec79f35eb3ae2ecf31e4fd2ba91a6294fa.tar.gz
gcc-fe0a25ec79f35eb3ae2ecf31e4fd2ba91a6294fa.tar.bz2
stor-layout.c (set_sizetype): Use the full precision of their machine mode for bitsize types.
* stor-layout.c (set_sizetype): Use the full precision of their machine mode for bitsize types. From-SVN: r145631
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r--gcc/stor-layout.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index e703682..c2d367f 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));