This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

libiberty patch to add demangling for decltype, T(), calls, parm stubs


To work with the late return type patch I recently checked into the compiler.

Tested i686-pc-linux-gnu, applied to trunk.
2008-09-09  Jason Merrill  <jason@redhat.com>

	* include/demangle.h (enum demangle_component_type): Add
	DEMANGLE_COMPONENT_DECLTYPE.
	* libiberty/cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_DECLTYPE.
	(d_make_comp): Likewise.
	(cplus_demangle_type): Handle decltype and DFP types.
	(cplus_demangle_operators): Call operator takes 2 args.
	(cplus_demangle_builtin_types): Add DFP types.
	(d_exprlist): New fn.
	(d_expression): Handle parm placeholders, T() and calls.
	(d_print_comp): Handle decltype, T() and calls.
	* libiberty/testsuite/demangle-expected: Test the above.

Index: include/demangle.h
===================================================================
RCS file: /cvs/src/src/include/demangle.h,v
retrieving revision 1.26
diff -c -p -r1.26 demangle.h
*** include/demangle.h	27 Jan 2008 06:25:45 -0000	1.26
--- include/demangle.h	9 Sep 2008 17:32:45 -0000
*************** enum demangle_component_type
*** 370,376 ****
       subtree is the first part and the right subtree the second.  */
    DEMANGLE_COMPONENT_COMPOUND_NAME,
    /* A name formed by a single character.  */
!   DEMANGLE_COMPONENT_CHARACTER
  };
  
  /* Types which are only used internally.  */
--- 370,378 ----
       subtree is the first part and the right subtree the second.  */
    DEMANGLE_COMPONENT_COMPOUND_NAME,
    /* A name formed by a single character.  */
!   DEMANGLE_COMPONENT_CHARACTER,
!   /* A decltype type.  */
!   DEMANGLE_COMPONENT_DECLTYPE
  };
  
  /* Types which are only used internally.  */
Index: libiberty/cp-demangle.c
===================================================================
RCS file: /cvs/src/src/libiberty/cp-demangle.c,v
retrieving revision 1.71
diff -c -p -r1.71 cp-demangle.c
*** libiberty/cp-demangle.c	31 Mar 2008 18:11:50 -0000	1.71
--- libiberty/cp-demangle.c	9 Sep 2008 17:32:48 -0000
*************** d_dump (struct demangle_component *dc, i
*** 660,665 ****
--- 660,668 ----
      case DEMANGLE_COMPONENT_CHARACTER:
        printf ("character '%c'\n",  dc->u.s_character.character);
        return;
+     case DEMANGLE_COMPONENT_DECLTYPE:
+       printf ("decltype\n");
+       break;
      }
  
    d_dump (d_left (dc), indent + 2);
*************** d_make_comp (struct d_info *di, enum dem
*** 807,812 ****
--- 810,816 ----
      case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
      case DEMANGLE_COMPONENT_CAST:
      case DEMANGLE_COMPONENT_JAVA_RESOURCE:
+     case DEMANGLE_COMPONENT_DECLTYPE:
        if (left == NULL)
  	return NULL;
        break;
*************** const struct demangle_operator_info cplu
*** 1422,1428 ****
    { "aa", NL ("&&"),        2 },
    { "ad", NL ("&"),         1 },
    { "an", NL ("&"),         2 },
!   { "cl", NL ("()"),        0 },
    { "cm", NL (","),         2 },
    { "co", NL ("~"),         1 },
    { "dV", NL ("/="),        2 },
--- 1426,1432 ----
    { "aa", NL ("&&"),        2 },
    { "ad", NL ("&"),         1 },
    { "an", NL ("&"),         2 },
!   { "cl", NL ("()"),        2 },
    { "cm", NL (","),         2 },
    { "co", NL ("~"),         1 },
    { "dV", NL ("/="),        2 },
*************** cplus_demangle_builtin_types[D_BUILTIN_T
*** 1871,1882 ****
    /* n */ { NL ("__int128"),	NL ("__int128"),	D_PRINT_DEFAULT },
    /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
  	    D_PRINT_DEFAULT },
!   /* p */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
!   /* q */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
!   /* r */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
    /* s */ { NL ("short"),	NL ("short"),		D_PRINT_DEFAULT },
    /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
!   /* u */ { NULL, 0,		NULL, 0,		D_PRINT_DEFAULT },
    /* v */ { NL ("void"),	NL ("void"),		D_PRINT_VOID },
    /* w */ { NL ("wchar_t"),	NL ("char"),		D_PRINT_DEFAULT },
    /* x */ { NL ("long long"),	NL ("long"),		D_PRINT_LONG_LONG },
--- 1875,1889 ----
    /* n */ { NL ("__int128"),	NL ("__int128"),	D_PRINT_DEFAULT },
    /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"),
  	    D_PRINT_DEFAULT },
!   /* The decimal floating point and half-precision floating point types
!      don't use the normal builtin type encoding, they're just stuck into
!      holes in the table for convenience.  */
!   /* p */ { NL ("decimal32"),	NL ("decimal32"),	D_PRINT_DEFAULT },
!   /* q */ { NL ("decimal64"),	NL ("decimal64"),	D_PRINT_DEFAULT },
!   /* r */ { NL ("decimal128"),	NL ("decimal128"),	D_PRINT_DEFAULT },
    /* s */ { NL ("short"),	NL ("short"),		D_PRINT_DEFAULT },
    /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT },
!   /* u */ { NL ("half"),	NL ("half"),		D_PRINT_FLOAT },
    /* v */ { NL ("void"),	NL ("void"),		D_PRINT_VOID },
    /* w */ { NL ("wchar_t"),	NL ("char"),		D_PRINT_DEFAULT },
    /* x */ { NL ("long long"),	NL ("long"),		D_PRINT_LONG_LONG },
*************** cplus_demangle_type (struct d_info *di)
*** 2046,2051 ****
--- 2053,2104 ----
  			 cplus_demangle_type (di), ret);
        break;
  
+     case 'D':
+       can_subst = 0;
+       d_advance (di, 1);
+       peek = d_next_char (di);
+       switch (peek)
+ 	{
+ 	case 'T':
+ 	case 't':
+ 	  /* decltype (expression) */
+ 	  ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE,
+ 			     d_expression (di), NULL);
+ 	  if (ret && d_next_char (di) != 'E')
+ 	    ret = NULL;
+ 	  break;
+ 	  
+ 	case 'p':
+ 	  /* Pack expansion.  */
+ 	  return NULL;
+ 	  
+ 	case 'f':
+ 	  /* 32-bit DFP */
+ 	  ret = d_make_builtin_type (di,
+ 				     &cplus_demangle_builtin_types['p' - 'a']);
+ 	  di->expansion += ret->u.s_builtin.type->len;
+ 	  break;
+ 	case 'd':
+ 	  /* 64-bit decimal floating point */
+ 	  ret = d_make_builtin_type (di,
+ 				     &cplus_demangle_builtin_types['q' - 'a']);
+ 	  di->expansion += ret->u.s_builtin.type->len;
+ 	  break;
+ 	case 'e':
+ 	  /* 128-bit DFP */
+ 	  ret = d_make_builtin_type (di,
+ 				     &cplus_demangle_builtin_types['r' - 'a']);
+ 	  di->expansion += ret->u.s_builtin.type->len;
+ 	  break;
+ 	case 'h':
+ 	  /* 16-bit half-precision FP */
+ 	  ret = d_make_builtin_type (di,
+ 				     &cplus_demangle_builtin_types['u' - 'a']);
+ 	  di->expansion += ret->u.s_builtin.type->len;
+ 	  break;
+ 	}
+       break;
+ 
      default:
        return NULL;
      }
*************** d_template_arg (struct d_info *di)
*** 2391,2399 ****
--- 2444,2482 ----
      }
  }
  
+ /* Subroutine of <expression> ::= cl <expression>+ E */
+ 
+ static struct demangle_component *
+ d_exprlist (struct d_info *di)
+ {
+   struct demangle_component *list = NULL;
+   struct demangle_component **p = &list;
+ 
+   while (1)
+     {
+       struct demangle_component *arg = d_expression (di);
+       if (arg == NULL)
+ 	return NULL;
+ 
+       *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL);
+       if (*p == NULL)
+ 	return NULL;
+       p = &d_right (*p);
+ 
+       if (d_peek_char (di) == 'E')
+ 	{
+ 	  d_advance (di, 1);
+ 	  break;
+ 	}
+     }
+ 
+   return list;
+ }
+ 
  /* <expression> ::= <(unary) operator-name> <expression>
                  ::= <(binary) operator-name> <expression> <expression>
                  ::= <(trinary) operator-name> <expression> <expression> <expression>
+ 		::= cl <expression>+ E
                  ::= st <type>
                  ::= <template-param>
                  ::= sr <type> <unqualified-name>
*************** d_expression (struct d_info *di)
*** 2426,2431 ****
--- 2509,2520 ----
  			    d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
  					 d_template_args (di)));
      }
+   else if (peek == 's' && d_peek_next_char (di) == 'T')
+     {
+       /* Just demangle a parameter placeholder as its type.  */
+       d_advance (di, 2);
+       return cplus_demangle_type (di);
+     }
    else
      {
        struct demangle_component *op;
*************** d_expression (struct d_info *di)
*** 2454,2460 ****
  	  args = op->u.s_extended_operator.args;
  	  break;
  	case DEMANGLE_COMPONENT_CAST:
! 	  args = 1;
  	  break;
  	}
  
--- 2543,2554 ----
  	  args = op->u.s_extended_operator.args;
  	  break;
  	case DEMANGLE_COMPONENT_CAST:
! 	  if (d_peek_char (di) == 'v')
! 	    /* T() encoded as an operand of void.  */
! 	    return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op,
! 				cplus_demangle_type (di));
! 	  else
! 	    args = 1;
  	  break;
  	}
  
*************** d_expression (struct d_info *di)
*** 2466,2478 ****
  	case 2:
  	  {
  	    struct demangle_component *left;
  
  	    left = d_expression (di);
  	    return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
  				d_make_comp (di,
  					     DEMANGLE_COMPONENT_BINARY_ARGS,
! 					     left,
! 					     d_expression (di)));
  	  }
  	case 3:
  	  {
--- 2560,2577 ----
  	case 2:
  	  {
  	    struct demangle_component *left;
+ 	    struct demangle_component *right;
  
  	    left = d_expression (di);
+ 	    if (!strcmp (op->u.s_operator.op->code, "cl"))
+ 	      right = d_exprlist (di);
+ 	    else
+ 	      right = d_expression (di);
+ 
  	    return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op,
  				d_make_comp (di,
  					     DEMANGLE_COMPONENT_BINARY_ARGS,
! 					     left, right));
  	  }
  	case 3:
  	  {
*************** d_print_comp (struct d_print_info *dpi,
*** 3520,3526 ****
  	  d_append_char (dpi, ')');
  	}
        d_append_char (dpi, '(');
!       d_print_comp (dpi, d_right (dc));
        d_append_char (dpi, ')');
        return;
  
--- 3619,3627 ----
  	  d_append_char (dpi, ')');
  	}
        d_append_char (dpi, '(');
!       if (d_left (dc)->type != DEMANGLE_COMPONENT_CAST
! 	  || d_right (dc)->type != DEMANGLE_COMPONENT_BUILTIN_TYPE)
! 	d_print_comp (dpi, d_right (dc));
        d_append_char (dpi, ')');
        return;
  
*************** d_print_comp (struct d_print_info *dpi,
*** 3531,3536 ****
--- 3632,3646 ----
  	  return;
  	}
  
+       if (!strcmp (d_left (dc)->u.s_operator.op->code, "cl"))
+ 	{
+ 	  d_print_comp (dpi, d_left (d_right (dc)));
+ 	  d_append_string (dpi, " (");
+ 	  d_print_comp (dpi, d_right (d_right (dc)));
+ 	  d_append_char (dpi, ')');
+ 	  return;
+ 	}
+ 
        /* We wrap an expression which uses the greater-than operator in
  	 an extra layer of parens so that it does not get confused
  	 with the '>' which ends the template parameters.  */
*************** d_print_comp (struct d_print_info *dpi,
*** 3681,3686 ****
--- 3791,3802 ----
        d_append_char (dpi, dc->u.s_character.character);
        return;
  
+     case DEMANGLE_COMPONENT_DECLTYPE:
+       d_append_string (dpi, "decltype (");
+       d_print_comp (dpi, d_left (dc));
+       d_append_char (dpi, ')');
+       return;
+ 
      default:
        d_print_error (dpi);
        return;
Index: libiberty/testsuite/demangle-expected
===================================================================
RCS file: /cvs/src/src/libiberty/testsuite/demangle-expected,v
retrieving revision 1.39
diff -c -p -r1.39 demangle-expected
*** libiberty/testsuite/demangle-expected	18 Apr 2008 15:14:13 -0000	1.39
--- libiberty/testsuite/demangle-expected	9 Sep 2008 17:32:48 -0000
*************** myspace::foo()::localstruct::f(myspace::
*** 3882,3884 ****
--- 3882,3900 ----
  --format=gnu-v3
  _ZGr32_java$Sutil$Siso4217$_properties
  java resource java/util/iso4217.properties
+ # decltype/param placeholder test
+ --format=gnu-v3
+ _Z3addIidEDTplsTT_sTT0_ES0_S1_
+ decltype ((int) + (double)) add<int, double>(int, double)
+ # decltype/T() test
+ --format=gnu-v3
+ _Z4add2IidEDTplcvT_vcvT0_vES0_S1_
+ decltype (((int)()) + ((double)())) add2<int, double>(int, double)
+ # decltype/fn call test
+ --format=gnu-v3
+ _Z4add3IidEDTclL_Z1gEsTT_sTT0_EES0_S1_
+ decltype (g (int, double)) add3<int, double>(int, double)
+ # Extended floating point types test
+ --format=gnu-v3
+ _Z1fDfDdDeDh
+ f(decimal32, decimal64, decimal128, half)

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