]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
stor-layout.c (mode_for_size_tree): Remove restiction on type sizes by correctly...
authorRoger Sayle <roger@eyesopen.com>
Wed, 29 Mar 2006 22:40:17 +0000 (22:40 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 29 Mar 2006 22:40:17 +0000 (22:40 +0000)
* stor-layout.c (mode_for_size_tree): Remove restiction on type
sizes by correctly testing whether the size fits a host integer.
(initialize_sizetypes): Use set_min_and_max_values_for_integral_type
to correctly set TYPE_MIN_VALUE and TYPE_MAX_VALUE to the full
SImode range for the default sizetype and bitsizetype.

From-SVN: r112513

gcc/ChangeLog
gcc/stor-layout.c

index b028b30aa7da54ef1cd232e1d0e09218272f6e10..3448d7b6670922e9c9d4e7c268733e72efa81dd0 100644 (file)
@@ -1,3 +1,11 @@
+2006-03-29  Roger Sayle  <roger@eyesopen.com>
+
+       * stor-layout.c (mode_for_size_tree): Remove restiction on type
+       sizes by correctly testing whether the size fits a host integer.
+       (initialize_sizetypes): Use set_min_and_max_values_for_integral_type
+       to correctly set TYPE_MIN_VALUE and TYPE_MAX_VALUE to the full
+       SImode range for the default sizetype and bitsizetype.
+
 2006-03-29  Roger Sayle  <roger@eyesopen.com>
 
        * convert.c (convert_to_pointer): Preserve the TREE_OVERFLOW
index 5617d27290e650c0369a9094943b7540bc4dce2c..723e06892015f5c4a41ae96eac60518a185ab76e 100644 (file)
@@ -190,15 +190,16 @@ mode_for_size (unsigned int size, enum mode_class class, int limit)
 enum machine_mode
 mode_for_size_tree (tree size, enum mode_class class, int limit)
 {
-  if (TREE_CODE (size) != INTEGER_CST
-      || TREE_OVERFLOW (size)
-      /* What we really want to say here is that the size can fit in a
-        host integer, but we know there's no way we'd find a mode for
-        this many bits, so there's no point in doing the precise test.  */
-      || compare_tree_int (size, 1000) > 0)
+  unsigned HOST_WIDE_INT uhwi;
+  unsigned int ui;
+
+  if (!host_integerp (size, 1))
     return BLKmode;
-  else
-    return mode_for_size (tree_low_cst (size, 1), class, limit);
+  uhwi = tree_low_cst (size, 1);
+  ui = uhwi;
+  if (uhwi != ui)
+    return BLKmode;
+  return mode_for_size (ui, class, limit);
 }
 
 /* Similar, but never return BLKmode; return the narrowest mode that
@@ -1938,20 +1939,19 @@ void
 initialize_sizetypes (bool signed_p)
 {
   tree t = make_node (INTEGER_TYPE);
+  int precision = GET_MODE_BITSIZE (SImode);
 
   TYPE_MODE (t) = SImode;
   TYPE_ALIGN (t) = GET_MODE_ALIGNMENT (SImode);
   TYPE_USER_ALIGN (t) = 0;
   TYPE_IS_SIZETYPE (t) = 1;
   TYPE_UNSIGNED (t) = !signed_p;
-  TYPE_SIZE (t) = build_int_cst (t, GET_MODE_BITSIZE (SImode));
+  TYPE_SIZE (t) = build_int_cst (t, precision);
   TYPE_SIZE_UNIT (t) = build_int_cst (t, GET_MODE_SIZE (SImode));
-  TYPE_PRECISION (t) = GET_MODE_BITSIZE (SImode);
-  TYPE_MIN_VALUE (t) = build_int_cst (t, 0);
+  TYPE_PRECISION (t) = precision;
 
-  /* 1000 avoids problems with possible overflow and is certainly
-     larger than any size value we'd want to be storing.  */
-  TYPE_MAX_VALUE (t) = build_int_cst (t, 1000);
+  /* Set TYPE_MIN_VALUE and TYPE_MAX_VALUE.  */
+  set_min_and_max_values_for_integral_type (t, precision, !signed_p);
 
   sizetype = t;
   bitsizetype = build_distinct_type_copy (t);