On Mon, Mar 19, 2012 at 1:02 PM, Tristan Gingold <ging...@adacore.com> wrote: > > On Mar 16, 2012, at 12:38 PM, Richard Guenther wrote: > […] > >> Well, this setup is not well supported by the middle-end (and indeed m32c >> has existing issues with that). So in your case decoupling sizetype from >> size_t sounds like the more appropriate solution. >> >>>> Btw, while we are transitioning to target hooks in this case I'd prefer >>>> a target macro alongside the existing SIZE_TYPE, etc. ones. >>> >>> Ok. >> >> I'd choose SIZETYPE (for confusion, heh), defaulting to SIZE_TYPE. >> >> Richard. > > Hi, > > here is the patch. As SIZETYPE was already used as a size_type_kind > enumeration constant, I made a little renaming work. > > Bootstrapped, no regressions on x86_64-darwin. Tested on ia64-hp-openvms. > > Ok for trunk ?
Ok with a minor nit - can you make STK_* lower-case now, similar to itk_ and ti_? They are not macros after all. Thanks, Richard. > Tristan. > > 2012-03-19 Tristan Gingold <ging...@adacore.com> > > * tree.h (enum size_type_kind): Add STK_ prefix to constants. > (sizetype_tab, sizetype, bitsizetype, ssizetype, sbitsizetype) > (size_int, ssize_int, bitsize_int, sbitsize_int): Adjust. > * stor-layout.c (sizetype_tab): Adjust. > (initialize_sizetypes): Use SIZETYPE instead of SIZE_TYPE. > * tree-streamer.c (preload_common_nodes): Use STK_TYPE_KIND_LAST > instead of TYPE_KIND_LAST. > * tree-scalar-evolution.c (interpret_rhs_expr): Use size_int > instead of size_int_kind. > * doc/tm.texi.in (Type Layout): Document SIZETYPE. > * doc/tm.texi: Regenerate. > * defaults.h (SIZETYPE): Provide a default value. > * config/vms/vms.h (SIZE_TYPE): Define as "unsigned int". > (SIZETYPE): Define. > > diff --git a/gcc/config/vms/vms.h b/gcc/config/vms/vms.h > index f2bc354..47028c8 100644 > --- a/gcc/config/vms/vms.h > +++ b/gcc/config/vms/vms.h > @@ -60,15 +60,18 @@ extern void vms_c_register_includes (const char *, const > char *, int); > #define POINTER_SIZE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? 32 : > 64) > #define POINTERS_EXTEND_UNSIGNED 0 > > -/* FIXME: It should always be a 32 bit type. */ > +/* Always a 32 bit type. */ > #undef SIZE_TYPE > -#define SIZE_TYPE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? \ > - "unsigned int" : "long long unsigned int") > +#define SIZE_TYPE "unsigned int" > + > /* ???: Defined as a 'int' by dec-c, but obstack.h doesn't like it. */ > #undef PTRDIFF_TYPE > #define PTRDIFF_TYPE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? \ > "int" : "long long int") > > +#define SIZETYPE (flag_vms_pointer_size == VMS_POINTER_SIZE_NONE ? \ > + "unsigned int" : "long long unsigned int") > + > #define C_COMMON_OVERRIDE_OPTIONS vms_c_common_override_options () > > /* VMS doesn't support other sections than .text for code. */ > diff --git a/gcc/defaults.h b/gcc/defaults.h > index 1780dda..296bb6a 100644 > --- a/gcc/defaults.h > +++ b/gcc/defaults.h > @@ -582,6 +582,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. > If not, see > #define SIZE_TYPE "long unsigned int" > #endif > > +#ifndef SIZETYPE > +#define SIZETYPE SIZE_TYPE > +#endif > + > #ifndef PID_TYPE > #define PID_TYPE "int" > #endif > diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi > index 69f8aba..2891bb6 100644 > --- a/gcc/doc/tm.texi > +++ b/gcc/doc/tm.texi > @@ -1642,6 +1642,18 @@ If you don't define this macro, the default is > @code{"long unsigned > int"}. > @end defmac > > +@defmac SIZETYPE > +GCC defines internal types (@code{sizetype}, @code{ssizetype}, > +@code{bitsizetype} and @code{sbitsizetype}) for expressions > +dealing with size. This macro is a C expression for a string describing > +the name of the data type from which the precision of @code{sizetype} > +is extracted. > + > +The string has the same restrictions as @code{SIZE_TYPE} string. > + > +If you don't define this macro, the default is @code{SIZE_TYPE}. > +@end defmac > + > @defmac PTRDIFF_TYPE > A C expression for a string describing the name of the data type to use > for the result of subtracting two pointers. The typedef name > diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in > index c24cf1e..a222654 100644 > --- a/gcc/doc/tm.texi.in > +++ b/gcc/doc/tm.texi.in > @@ -1630,6 +1630,18 @@ If you don't define this macro, the default is > @code{"long unsigned > int"}. > @end defmac > > +@defmac SIZETYPE > +GCC defines internal types (@code{sizetype}, @code{ssizetype}, > +@code{bitsizetype} and @code{sbitsizetype}) for expressions > +dealing with size. This macro is a C expression for a string describing > +the name of the data type from which the precision of @code{sizetype} > +is extracted. > + > +The string has the same restrictions as @code{SIZE_TYPE} string. > + > +If you don't define this macro, the default is @code{SIZE_TYPE}. > +@end defmac > + > @defmac PTRDIFF_TYPE > A C expression for a string describing the name of the data type to use > for the result of subtracting two pointers. The typedef name > diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c > index 98b7886..479c407 100644 > --- a/gcc/stor-layout.c > +++ b/gcc/stor-layout.c > @@ -44,7 +44,7 @@ along with GCC; see the file COPYING3. If not see > > /* Data type for the expressions representing sizes of data types. > It is the first integer type laid out. */ > -tree sizetype_tab[(int) TYPE_KIND_LAST]; > +tree sizetype_tab[(int) STK_TYPE_KIND_LAST]; > > /* If nonzero, this is an upper limit on alignment of structure fields. > The value is measured in bits. */ > @@ -2389,13 +2389,13 @@ initialize_sizetypes (void) > int precision, bprecision; > > /* Get sizetypes precision from the SIZE_TYPE target macro. */ > - if (strcmp (SIZE_TYPE, "unsigned int") == 0) > + if (strcmp (SIZETYPE, "unsigned int") == 0) > precision = INT_TYPE_SIZE; > - else if (strcmp (SIZE_TYPE, "long unsigned int") == 0) > + else if (strcmp (SIZETYPE, "long unsigned int") == 0) > precision = LONG_TYPE_SIZE; > - else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0) > + else if (strcmp (SIZETYPE, "long long unsigned int") == 0) > precision = LONG_LONG_TYPE_SIZE; > - else if (strcmp (SIZE_TYPE, "short unsigned int") == 0) > + else if (strcmp (SIZETYPE, "short unsigned int") == 0) > precision = SHORT_TYPE_SIZE; > else > gcc_unreachable (); > diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c > index c719984..c6631b8 100644 > --- a/gcc/tree-scalar-evolution.c > +++ b/gcc/tree-scalar-evolution.c > @@ -1758,7 +1758,7 @@ interpret_rhs_expr (struct loop *loop, gimple at_stmt, > { > gcc_assert ((bitpos % BITS_PER_UNIT) == 0); > > - unitpos = size_int_kind (bitpos / BITS_PER_UNIT, SIZETYPE); > + unitpos = size_int (bitpos / BITS_PER_UNIT); > chrec3 = analyze_scalar_evolution (loop, unitpos); > chrec3 = chrec_convert (TREE_TYPE (unitpos), chrec3, at_stmt); > res = chrec_fold_plus (type, res, chrec3); > diff --git a/gcc/tree-streamer.c b/gcc/tree-streamer.c > index 94d540b..fd7fae4 100644 > --- a/gcc/tree-streamer.c > +++ b/gcc/tree-streamer.c > @@ -293,7 +293,7 @@ preload_common_nodes (struct streamer_tree_cache_d *cache) > if (i != itk_char) > record_common_node (cache, integer_types[i]); > > - for (i = 0; i < TYPE_KIND_LAST; i++) > + for (i = 0; i < STK_TYPE_KIND_LAST; i++) > record_common_node (cache, sizetype_tab[i]); > > for (i = 0; i < TI_MAX; i++) > diff --git a/gcc/tree.h b/gcc/tree.h > index c0340aa..46556e7 100644 > --- a/gcc/tree.h > +++ b/gcc/tree.h > @@ -4787,18 +4787,18 @@ extern HOST_WIDE_INT int_byte_position (const_tree); > > enum size_type_kind > { > - SIZETYPE, /* Normal representation of sizes in bytes. */ > - SSIZETYPE, /* Signed representation of sizes in bytes. */ > - BITSIZETYPE, /* Normal representation of sizes in bits. */ > - SBITSIZETYPE, /* Signed representation of sizes in bits. */ > - TYPE_KIND_LAST}; > + STK_SIZETYPE, /* Normal representation of sizes in bytes. > */ > + STK_SSIZETYPE, /* Signed representation of sizes in bytes. */ > + STK_BITSIZETYPE, /* Normal representation of sizes in bits. */ > + STK_SBITSIZETYPE, /* Signed representation of sizes in bits. */ > + STK_TYPE_KIND_LAST}; > > -extern GTY(()) tree sizetype_tab[(int) TYPE_KIND_LAST]; > +extern GTY(()) tree sizetype_tab[(int) STK_TYPE_KIND_LAST]; > > -#define sizetype sizetype_tab[(int) SIZETYPE] > -#define bitsizetype sizetype_tab[(int) BITSIZETYPE] > -#define ssizetype sizetype_tab[(int) SSIZETYPE] > -#define sbitsizetype sizetype_tab[(int) SBITSIZETYPE] > +#define sizetype sizetype_tab[(int) STK_SIZETYPE] > +#define bitsizetype sizetype_tab[(int) STK_BITSIZETYPE] > +#define ssizetype sizetype_tab[(int) STK_SSIZETYPE] > +#define sbitsizetype sizetype_tab[(int) STK_SBITSIZETYPE] > > extern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind); > #define size_binop(CODE,T1,T2)\ > @@ -4808,10 +4808,10 @@ extern tree size_binop_loc (location_t, enum > tree_code, tree, tree); > size_diffop_loc (UNKNOWN_LOCATION, T1, T2) > extern tree size_diffop_loc (location_t, tree, tree); > > -#define size_int(L) size_int_kind (L, SIZETYPE) > -#define ssize_int(L) size_int_kind (L, SSIZETYPE) > -#define bitsize_int(L) size_int_kind (L, BITSIZETYPE) > -#define sbitsize_int(L) size_int_kind (L, SBITSIZETYPE) > +#define size_int(L) size_int_kind (L, STK_SIZETYPE) > +#define ssize_int(L) size_int_kind (L, STK_SSIZETYPE) > +#define bitsize_int(L) size_int_kind (L, STK_BITSIZETYPE) > +#define sbitsize_int(L) size_int_kind (L, STK_SBITSIZETYPE) > > #define round_up(T,N) round_up_loc (UNKNOWN_LOCATION, T, N) > extern tree round_up_loc (location_t, tree, int); >