This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]