aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-03-12 13:04:43 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-03-12 13:04:43 +0000
commit7ee6fd6836b487a0229b69821c71b6878b529870 (patch)
tree6c55d1468abe6bfcb3d90e9788f768fef21263d8
parentd8aba32a0959169d00b9d89b28f6d4ccc4763be8 (diff)
downloadgcc-7ee6fd6836b487a0229b69821c71b6878b529870.zip
gcc-7ee6fd6836b487a0229b69821c71b6878b529870.tar.gz
gcc-7ee6fd6836b487a0229b69821c71b6878b529870.tar.bz2
tree.c (signed_or_unsigned_type_for): Use build_nonstandard_integer_type.
2012-03-12 Richard Guenther <rguenther@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. From-SVN: r185226
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-pretty-print.c40
-rw-r--r--gcc/tree.c34
3 files changed, 59 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index faddb0b..76ec87d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2012-03-12 Richard Guenther <rguenther@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.
+
2012-03-12 Tristan Gingold <gingold@adacore.com>
* config/vms/vms.opt: Add vms-opts.h header.
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 4b9b453..227999c 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -723,11 +723,41 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
}
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)
{
diff --git a/gcc/tree.c b/gcc/tree.c
index c5d10f9..3989a9b 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -10197,32 +10197,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)
@@ -10230,7 +10224,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)