This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[JAVA] Avoid use of CHAR_TYPE tree codes.
- From: Roger Sayle <roger at eyesopen dot com>
- To: java-patches at gcc dot gnu dot org
- Cc: Tom Tromey <tromey at redhat dot com>, <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 4 Feb 2006 10:42:24 -0700 (MST)
- Subject: [JAVA] Avoid use of CHAR_TYPE tree codes.
On 27 Jan 2006, Tom Tromey wrote:
> The last time removing CHAR_TYPE came up, Jim Wilson pointed out that
> this affects debug information..
Now that the handling of dwarf2 debug information for character types
has been cleaned up in the middle-end, there's no longer a reason for
the Java front-end to use CHAR_TYPE nodes, as the same information can
be represented using TYPE_STRING_FLAG on INTEGER_TYPE nodes.
The following patch is a repost of the original to eradicate the use
of CHAR_TYPE from the Java front-end, updated to set and preserve
TYPE_STRING_FLAG appropriately. For testing to show why this is
safe see: http://gcc.gnu.org/ml/gcc-patches/2006-01/msg01974.html
Tested on x86_64-unknown-linux-gnu with a full "make bootstrap",
including java, and regression tested with a top-level "make -k check"
with no new failures.
Ok for mainline?
2006-02-04 Roger Sayle <roger@eyesopen.com>
* decl.c (java_init_decl_processing): Create char_type_node as a
regular INTEGER_TYPE node.
(push_promoted_type): Preserve TYPE_STRING_FLAG on types.
* typeck.c (convert): No longer check for CHAR_TYPEs but instead
test for char_type_node and promoted_char_type_node as special
instances of INTEGER_TYPE tree codes.
(promote_type,build_java_signature): Likewise.
* jcf-write.c (adjust_typed_op): Likewise.
* mangle.c (mangle_type): Likewise.
* parse.y (do_unary_numeric_promotion): No longer handle CHAR_TYPE.
* parse.h (JINTEGRAL_TYPE_P): Likewise.
Index: typeck.c
===================================================================
*** typeck.c (revision 110536)
--- typeck.c (working copy)
*************** convert (tree type, tree expr)
*** 126,135 ****
return error_mark_node;
if (code == VOID_TYPE)
return build1 (CONVERT_EXPR, type, expr);
! if (code == BOOLEAN_TYPE || code == CHAR_TYPE)
return fold_convert (type, expr);
if (code == INTEGER_TYPE)
{
if ((really_constant_p (expr)
|| (! flag_unsafe_math_optimizations
&& ! flag_emit_class_files))
--- 126,137 ----
return error_mark_node;
if (code == VOID_TYPE)
return build1 (CONVERT_EXPR, type, expr);
! if (code == BOOLEAN_TYPE)
return fold_convert (type, expr);
if (code == INTEGER_TYPE)
{
+ if (type == char_type_node || type == promoted_char_type_node)
+ return fold_convert (type, expr);
if ((really_constant_p (expr)
|| (! flag_unsafe_math_optimizations
&& ! flag_emit_class_files))
*************** promote_type (tree type)
*** 431,441 ****
if (type == boolean_type_node)
return promoted_boolean_type_node;
goto handle_int;
! case CHAR_TYPE:
if (type == char_type_node)
return promoted_char_type_node;
- goto handle_int;
- case INTEGER_TYPE:
handle_int:
if (TYPE_PRECISION (type) < TYPE_PRECISION (int_type_node))
{
--- 433,441 ----
if (type == boolean_type_node)
return promoted_boolean_type_node;
goto handle_int;
! case INTEGER_TYPE:
if (type == char_type_node)
return promoted_char_type_node;
handle_int:
if (TYPE_PRECISION (type) < TYPE_PRECISION (int_type_node))
{
*************** build_java_signature (tree type)
*** 605,613 ****
switch (TREE_CODE (type))
{
case BOOLEAN_TYPE: sg[0] = 'Z'; goto native;
- case CHAR_TYPE: sg[0] = 'C'; goto native;
case VOID_TYPE: sg[0] = 'V'; goto native;
case INTEGER_TYPE:
switch (TYPE_PRECISION (type))
{
case 8: sg[0] = 'B'; goto native;
--- 605,617 ----
switch (TREE_CODE (type))
{
case BOOLEAN_TYPE: sg[0] = 'Z'; goto native;
case VOID_TYPE: sg[0] = 'V'; goto native;
case INTEGER_TYPE:
+ if (type == char_type_node || type == promoted_char_type_node)
+ {
+ sg[0] = 'C';
+ goto native;
+ }
switch (TYPE_PRECISION (type))
{
case 8: sg[0] = 'B'; goto native;
Index: parse.y
===================================================================
*** parse.y (revision 110536)
--- parse.y (working copy)
*************** static tree
*** 13331,13338 ****
do_unary_numeric_promotion (tree arg)
{
tree type = TREE_TYPE (arg);
! if ((TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
! || TREE_CODE (type) == CHAR_TYPE)
arg = convert (int_type_node, arg);
return arg;
}
--- 13331,13337 ----
do_unary_numeric_promotion (tree arg)
{
tree type = TREE_TYPE (arg);
! if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PRECISION (type) < 32)
arg = convert (int_type_node, arg);
return arg;
}
Index: decl.c
===================================================================
*** decl.c (revision 110536)
--- decl.c (working copy)
*************** push_promoted_type (const char *name, tr
*** 543,548 ****
--- 543,549 ----
TYPE_MAX_VALUE (type) = copy_node (in_max);
TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
TYPE_PRECISION (type) = TYPE_PRECISION (int_type_node);
+ TYPE_STRING_FLAG (type) = TYPE_STRING_FLAG (actual_type);
layout_type (type);
pushdecl (build_decl (TYPE_DECL, get_identifier (name), type));
return type;
*************** java_init_decl_processing (void)
*** 743,749 ****
initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
short_array_type_node = build_prim_array_type (short_type_node, 200);
#endif
! char_type_node = make_node (CHAR_TYPE);
TYPE_PRECISION (char_type_node) = 16;
fixup_unsigned_type (char_type_node);
pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
--- 744,751 ----
initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
short_array_type_node = build_prim_array_type (short_type_node, 200);
#endif
! char_type_node = make_node (INTEGER_TYPE);
! TYPE_STRING_FLAG (char_type_node) = 1;
TYPE_PRECISION (char_type_node) = 16;
fixup_unsigned_type (char_type_node);
pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), char_type_node));
Index: jcf-write.c
===================================================================
*** jcf-write.c (revision 110536)
--- jcf-write.c (working copy)
*************** adjust_typed_op (tree type, int max)
*** 881,889 ****
case RECORD_TYPE: return 4;
case BOOLEAN_TYPE:
return TYPE_PRECISION (type) == 32 || max < 5 ? 0 : 5;
- case CHAR_TYPE:
- return TYPE_PRECISION (type) == 32 || max < 6 ? 0 : 6;
case INTEGER_TYPE:
switch (TYPE_PRECISION (type))
{
case 8: return max < 5 ? 0 : 5;
--- 881,889 ----
case RECORD_TYPE: return 4;
case BOOLEAN_TYPE:
return TYPE_PRECISION (type) == 32 || max < 5 ? 0 : 5;
case INTEGER_TYPE:
+ if (type == char_type_node || type == promoted_char_type_node)
+ return TYPE_PRECISION (type) == 32 || max < 6 ? 0 : 6;
switch (TYPE_PRECISION (type))
{
case 8: return max < 5 ? 0 : 5;
Index: mangle.c
===================================================================
*** mangle.c (revision 110536)
--- mangle.c (working copy)
*************** mangle_type (tree type)
*** 243,251 ****
{
char code;
case BOOLEAN_TYPE: code = 'b'; goto primitive;
- case CHAR_TYPE: code = 'w'; goto primitive;
case VOID_TYPE: code = 'v'; goto primitive;
case INTEGER_TYPE:
/* Get the original type instead of the arguments promoted type.
Avoid symbol name clashes. Should call a function to do that.
FIXME. */
--- 243,255 ----
{
char code;
case BOOLEAN_TYPE: code = 'b'; goto primitive;
case VOID_TYPE: code = 'v'; goto primitive;
case INTEGER_TYPE:
+ if (type == char_type_node || type == promoted_char_type_node)
+ {
+ code = 'w';
+ goto primitive;
+ }
/* Get the original type instead of the arguments promoted type.
Avoid symbol name clashes. Should call a function to do that.
FIXME. */
Index: parse.h
===================================================================
*** parse.h (revision 110536)
--- parse.h (working copy)
*************** extern void parse_error_context (tree cl
*** 196,203 ****
/* Types classification, according to the JLS, section 4.2 */
#define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE)
#define JINTEGRAL_TYPE_P(TYPE) ((TYPE) \
! && (TREE_CODE ((TYPE)) == INTEGER_TYPE \
! || TREE_CODE ((TYPE)) == CHAR_TYPE))
#define JNUMERIC_TYPE_P(TYPE) ((TYPE) \
&& (JFLOAT_TYPE_P ((TYPE)) \
|| JINTEGRAL_TYPE_P ((TYPE))))
--- 196,202 ----
/* Types classification, according to the JLS, section 4.2 */
#define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE)
#define JINTEGRAL_TYPE_P(TYPE) ((TYPE) \
! && (TREE_CODE ((TYPE)) == INTEGER_TYPE))
#define JNUMERIC_TYPE_P(TYPE) ((TYPE) \
&& (JFLOAT_TYPE_P ((TYPE)) \
|| JINTEGRAL_TYPE_P ((TYPE))))
Roger
--