Patchwork : Uncouple size_t and sizetype

login
register
mail settings
Submitter Tristan Gingold
Date March 19, 2012, 3:43 p.m.
Message ID <68175B2D-5E8B-4222-95FC-EE17AC32E004@adacore.com>
Download mbox | patch
Permalink /patch/147560/
State New
Headers show

Comments

Tristan Gingold - March 19, 2012, 3:43 p.m.
On Mar 19, 2012, at 1:36 PM, Richard Guenther wrote:

> On Mon, Mar 19, 2012 at 1:02 PM, Tristan Gingold <gingold@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.

Sure.  Here is what I will commit (I have just checked that the compiler still bootstrap).

Thank you for the review and the discussion.
Tristan.

2012-03-19  Tristan Gingold  <gingold@adacore.com>

	* tree.h (enum size_type_kind): Add stk_ prefix to constants,
	convert in lowercase.
	(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.

Patch

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..2d3f92e 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..f7c1517 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..62ee454 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -4787,18 +4787,19 @@  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 +4809,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);