diff options
author | Richard Henderson <rth@cygnus.com> | 1998-04-04 09:46:06 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1998-04-04 09:46:06 -0800 |
commit | 896cced482d766c5d1d07ce1c71c191ac8864dd3 (patch) | |
tree | 732571c84a2af807ac7242046fc7cc2b2ae49b19 | |
parent | 8983c7160410e7b865cd27a02b34fa506c8c2620 (diff) | |
download | gcc-896cced482d766c5d1d07ce1c71c191ac8864dd3.zip gcc-896cced482d766c5d1d07ce1c71c191ac8864dd3.tar.gz gcc-896cced482d766c5d1d07ce1c71c191ac8864dd3.tar.bz2 |
tree.h (sizetype_tab[2], [...]): Merge all of these into a single struct, with additional [us]sizetype entries.
* tree.h (sizetype_tab[2], sbitsizetype, ubitsizetype): Merge all
of these into a single struct, with additional [us]sizetype entries.
* stor-layout.c (set_sizetype): Initialize [us]sizetype.
* fold-const.c (size_int_wide): Don't rely on sizetype_tab being
an array.
From-SVN: r18994
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 4 | ||||
-rw-r--r-- | gcc/stor-layout.c | 33 | ||||
-rw-r--r-- | gcc/tree.h | 18 |
4 files changed, 48 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 789c87c..4cd6303 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Sat Apr 4 17:42:05 1998 Richard Henderson <rth@cygnus.com> + + * tree.h (sizetype_tab[2], sbitsizetype, ubitsizetype): Merge all + of these into a single struct, with additional [us]sizetype entries. + * stor-layout.c (set_sizetype): Initialize [us]sizetype. + * fold-const.c (size_int_wide): Don't rely on sizetype_tab being + an array. + Sat Apr 4 17:04:41 1998 Richard Henderson <rth@cygnus.com> * configure.in (alpha-*-linux-*): Undo tm_file changes from gcc2 merge. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 648dc3b..afdd26b 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -1444,14 +1444,14 @@ size_int_wide (number, high, bit_p) /* Make this a permanent node. */ end_temporary_allocation (); t = build_int_2 (number, 0); - TREE_TYPE (t) = sizetype_tab[bit_p]; + TREE_TYPE (t) = bit_p ? bitsizetype : sizetype; size_table[number][bit_p] = t; pop_obstacks (); } else { t = build_int_2 (number, high); - TREE_TYPE (t) = sizetype_tab[bit_p]; + TREE_TYPE (t) = bit_p ? bitsizetype : sizetype; TREE_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (t) = force_fit_type (t, 0); } return t; diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 8aaf2f6..365826d 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -32,10 +32,9 @@ Boston, MA 02111-1307, USA. */ #define CEIL(x,y) (((x) + (y) - 1) / (y)) /* Data type for the expressions representing sizes of data types. - It is the first integer type laid out. - In C, this is int. */ + It is the first integer type laid out. */ -tree sizetype_tab[2], sbitsizetype, ubitsizetype; +struct sizetype_tab sizetype_tab; /* An integer constant with value 0 whose type is sizetype. */ @@ -1103,14 +1102,14 @@ make_unsigned_type (precision) return type; } -/* Set sizetype to TYPE, and initialize *bitsizetype accordingly. +/* Set sizetype to TYPE, and initialize *sizetype accordingly. Also update the type of any standard type's sizes made so far. */ void set_sizetype (type) tree type; { - int precision = TYPE_PRECISION (type); + int oprecision = TYPE_PRECISION (type), precision; sizetype = type; @@ -1124,18 +1123,32 @@ set_sizetype (type) if (! bitsizetype) bitsizetype = make_node (INTEGER_TYPE); - precision += BITS_PER_UNIT_LOG + 1; + precision = oprecision + BITS_PER_UNIT_LOG + 1; /* However, when cross-compiling from a 32 bit to a 64 bit host, we are limited to 64 bit precision. */ if (precision > 2 * HOST_BITS_PER_WIDE_INT) precision = 2 * HOST_BITS_PER_WIDE_INT; TYPE_PRECISION (bitsizetype) = precision; - (TREE_UNSIGNED (type) ? fixup_unsigned_type : fixup_signed_type) - (bitsizetype); + if (TREE_UNSIGNED (type)) + fixup_unsigned_type (bitsizetype); + else + fixup_signed_type (bitsizetype); layout_type (bitsizetype); - sbitsizetype = make_signed_type (precision); - ubitsizetype = make_unsigned_type (precision); + if (TREE_UNSIGNED (type)) + { + usizetype = sizetype; + ubitsizetype = bitsizetype; + ssizetype = make_signed_type (oprecision); + sbitsizetype = make_signed_type (precision); + } + else + { + ssizetype = sizetype; + sbitsizetype = bitsizetype; + usizetype = make_unsigned_type (oprecision); + ubitsizetype = make_unsigned_type (precision); + } } /* Set the extreme values of TYPE based on its precision in bits, @@ -1435,9 +1435,21 @@ extern void put_pending_sizes PROTO((tree)); + (BITS_PER_UNIT > 8) + (BITS_PER_UNIT > 16) + (BITS_PER_UNIT > 32) \ + (BITS_PER_UNIT > 64) + (BITS_PER_UNIT > 128) + (BITS_PER_UNIT > 256)) -extern tree sizetype_tab[2], sbitsizetype, ubitsizetype; -#define sizetype sizetype_tab[0] -#define bitsizetype sizetype_tab[1] +struct sizetype_tab +{ + tree xsizetype, xbitsizetype; + tree ssizetype, usizetype; + tree sbitsizetype, ubitsizetype; +}; + +extern struct sizetype_tab sizetype_tab; + +#define sizetype sizetype_tab.xsizetype +#define bitsizetype sizetype_tab.xbitsizetype +#define ssizetype sizetype_tab.ssizetype +#define usizetype sizetype_tab.usizetype +#define sbitsizetype sizetype_tab.sbitsizetype +#define ubitsizetype sizetype_tab.ubitsizetype /* If nonzero, an upper limit on alignment of structure fields, in bits. */ extern int maximum_field_alignment; |