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
This commit is contained in:
Richard Guenther 2012-03-12 13:04:43 +00:00 committed by Richard Biener
parent d8aba32a09
commit 7ee6fd6836
3 changed files with 59 additions and 24 deletions

View File

@ -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.

View File

@ -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)
{

View File

@ -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)