Backporting this patch to 4.7 fixes a problem building Fedora 17.
Bootstrapped and regression tested on powerpc64-unknown-linux-gnu.  Is
the backport OK?

Thanks,
Bill


2012-05-10  Bill Schmidt  <wschm...@vnet.linux.ibm.com>

        Backport from trunk:
        2012-03-12  Richard Guenther  <rguent...@suse.de>

        * tree.c (signed_or_unsigned_type_for): Use
        build_nonstandard_integer_type.
        (signed_type_for): Adjust documentation.
        (unsigned_type_for): Likewise.
        * tree-pretty-print.c (dump_generic_node): Use standard names
        for non-standard integer types if available.


Index: gcc/tree-pretty-print.c
===================================================================
--- gcc/tree-pretty-print.c     (revision 187368)
+++ gcc/tree-pretty-print.c     (working copy)
@@ -723,11 +723,41 @@ dump_generic_node (pretty_printer *buffer, tree no
              }
            else if (TREE_CODE (node) == INTEGER_TYPE)
              {
-               pp_string (buffer, (TYPE_UNSIGNED (node)
-                                   ? "<unnamed-unsigned:"
-                                   : "<unnamed-signed:"));
-               pp_decimal_int (buffer, TYPE_PRECISION (node));
-               pp_string (buffer, ">");
+               if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
+                 pp_string (buffer, (TYPE_UNSIGNED (node)
+                                     ? "unsigned char"
+                                     : "signed char"));
+               else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
+                 pp_string (buffer, (TYPE_UNSIGNED (node)
+                                     ? "unsigned short"
+                                     : "signed short"));
+               else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
+                 pp_string (buffer, (TYPE_UNSIGNED (node)
+                                     ? "unsigned int"
+                                     : "signed int"));
+               else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
+                 pp_string (buffer, (TYPE_UNSIGNED (node)
+                                     ? "unsigned long"
+                                     : "signed long"));
+               else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
+                 pp_string (buffer, (TYPE_UNSIGNED (node)
+                                     ? "unsigned long long"
+                                     : "signed long long"));
+               else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
+                        && exact_log2 (TYPE_PRECISION (node)))
+                 {
+                   pp_string (buffer, (TYPE_UNSIGNED (node) ? "uint" : "int"));
+                   pp_decimal_int (buffer, TYPE_PRECISION (node));
+                   pp_string (buffer, "_t");
+                 }
+               else
+                 {
+                   pp_string (buffer, (TYPE_UNSIGNED (node)
+                                       ? "<unnamed-unsigned:"
+                                       : "<unnamed-signed:"));
+                   pp_decimal_int (buffer, TYPE_PRECISION (node));
+                   pp_string (buffer, ">");
+                 }
              }
            else if (TREE_CODE (node) == COMPLEX_TYPE)
              {
Index: gcc/tree.c
===================================================================
--- gcc/tree.c  (revision 187368)
+++ gcc/tree.c  (working copy)
@@ -10162,32 +10162,26 @@ widest_int_cst_value (const_tree x)
   return val;
 }
 
-/* If TYPE is an integral type, return an equivalent type which is
-    unsigned iff UNSIGNEDP is true.  If TYPE is not an integral type,
-    return TYPE itself.  */
+/* If TYPE is an integral or pointer type, return an integer type with
+   the same precision which is unsigned iff UNSIGNEDP is true, or itself
+   if TYPE is already an integer type of signedness UNSIGNEDP.  */
 
 tree
 signed_or_unsigned_type_for (int unsignedp, tree type)
 {
-  tree t = type;
-  if (POINTER_TYPE_P (type))
-    {
-      /* If the pointer points to the normal address space, use the
-        size_type_node.  Otherwise use an appropriate size for the pointer
-        based on the named address space it points to.  */
-      if (!TYPE_ADDR_SPACE (TREE_TYPE (t)))
-       t = size_type_node;
-      else
-       return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
-    }
+  if (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type) == unsignedp)
+    return type;
 
-  if (!INTEGRAL_TYPE_P (t) || TYPE_UNSIGNED (t) == unsignedp)
-    return t;
+  if (!INTEGRAL_TYPE_P (type)
+      && !POINTER_TYPE_P (type))
+    return NULL_TREE;
 
-  return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
+  return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
 }
 
-/* Returns unsigned variant of TYPE.  */
+/* If TYPE is an integral or pointer type, return an integer type with
+   the same precision which is unsigned, or itself if TYPE is already an
+   unsigned integer type.  */
 
 tree
 unsigned_type_for (tree type)
@@ -10195,7 +10189,9 @@ unsigned_type_for (tree type)
   return signed_or_unsigned_type_for (1, type);
 }
 
-/* Returns signed variant of TYPE.  */
+/* If TYPE is an integral or pointer type, return an integer type with
+   the same precision which is signed, or itself if TYPE is already a
+   signed integer type.  */
 
 tree
 signed_type_for (tree type)


Reply via email to