diff mbox

[05/11,PR,gdb/14441] gdb: demangle: implement demangling for rvalue reference typenames

Message ID 1450661481-31178-6-git-send-email-artemiyv@acm.org
State New
Headers show

Commit Message

Artemiy Volkov Dec. 21, 2015, 1:31 a.m. UTC
This patch fixes demangling of names containing rvalue reference typenames by
handling DEMANGLE_COMPONENT_RVALUE_REFERENCE in gdb and handling the 'O' type
code in libiberty.

./ChangeLog:

2015-12-20  Artemiy Volkov  <artemiyv@acm.org>

        * gdb/cp-name-parser.y: Handle the '&&' token in typename.
        * gdb/cp-support.c (replace_typedefs): Handle
        DEMANGLE_COMPONENT_RVALUE_REFERENCE.
        * gdb/python/py-type.c (typy_lookup_type): Likewise.

libiberty/ChangeLog:

2015-12-20  Artemiy Volkov  <artemiyv@acm.org>

        * cplus-dem.c (enum type_kind_t): Add tk_rvalue_reference
        constant.
        (demangle_template_value_parm): Handle tk_rvalue_reference
        type kind.
        (do_type): Support 'O' type id (rvalue references).
---
 gdb/cp-name-parser.y  |  4 ++++
 gdb/cp-support.c      |  1 +
 gdb/python/py-type.c  |  6 +++++-
 libiberty/cplus-dem.c | 14 +++++++++++---
 4 files changed, 21 insertions(+), 4 deletions(-)

Comments

Pedro Alves Dec. 30, 2015, 7:17 p.m. UTC | #1
Hi Artemiy,

Thanks much for working on this.  Just a quick note below.

On 12/21/2015 01:31 AM, Artemiy Volkov wrote:

> libiberty/ChangeLog:
> 
> 2015-12-20  Artemiy Volkov  <artemiyv@acm.org>
> 
>         * cplus-dem.c (enum type_kind_t): Add tk_rvalue_reference
>         constant.
>         (demangle_template_value_parm): Handle tk_rvalue_reference
>         type kind.
>         (do_type): Support 'O' type id (rvalue references).

It'd be nice to have a few tests in libiberty/testsuite/ to cover
this.

Note that libiberty is maintained by gcc.  You need to send this
to the gcc-patches list.  Once it is approved upstream, we can
merge it.

Thanks,
Pedro Alves
diff mbox

Patch

diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y
index c7a3f12..b5601b9 100644
--- a/gdb/cp-name-parser.y
+++ b/gdb/cp-name-parser.y
@@ -769,6 +769,10 @@  ptr_operator	:	'*' qualifiers_opt
 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_REFERENCE);
 			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
 			  $$.last = &d_left ($$.comp); }
+		|	ANDAND
+			{ $$.comp = make_empty (DEMANGLE_COMPONENT_RVALUE_REFERENCE);
+			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
+			  $$.last = &d_left ($$.comp); }
 		|	nested_name '*' qualifiers_opt
 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
 			  $$.comp->u.s_binary.left = $1.comp;
diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index a14455a..6f85c4c 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -520,6 +520,7 @@  replace_typedefs (struct demangle_parse_info *info,
 	case DEMANGLE_COMPONENT_RESTRICT_THIS:
 	case DEMANGLE_COMPONENT_POINTER:
 	case DEMANGLE_COMPONENT_REFERENCE:
+	case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
 	  replace_typedefs (info, d_left (ret_comp), finder, data);
 	  break;
 
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 676ab63..ad2f952 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -811,6 +811,7 @@  typy_lookup_type (struct demangle_component *demangled,
 
   if (demangled_type == DEMANGLE_COMPONENT_POINTER
       || demangled_type == DEMANGLE_COMPONENT_REFERENCE
+      || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
       || demangled_type == DEMANGLE_COMPONENT_CONST
       || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
     {
@@ -827,7 +828,10 @@  typy_lookup_type (struct demangle_component *demangled,
 	  switch (demangled_type)
 	    {
 	    case DEMANGLE_COMPONENT_REFERENCE:
-             rtype = lookup_lvalue_reference_type (type);
+              rtype = lookup_lvalue_reference_type (type);
+	      break;
+	    case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
+              rtype = lookup_rvalue_reference_type (type);
 	      break;
 	    case DEMANGLE_COMPONENT_POINTER:
 	      rtype = lookup_pointer_type (type);
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index c68b981..89baf07 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -237,6 +237,7 @@  typedef enum type_kind_t
   tk_none,
   tk_pointer,
   tk_reference,
+  tk_rvalue_reference,
   tk_integral,
   tk_bool,
   tk_char,
@@ -2033,7 +2034,8 @@  demangle_template_value_parm (struct work_stuff *work, const char **mangled,
     }
   else if (tk == tk_real)
     success = demangle_real_value (work, mangled, s);
-  else if (tk == tk_pointer || tk == tk_reference)
+  else if (tk == tk_pointer || tk == tk_reference
+           || tk == tk_rvalue_reference)
     {
       if (**mangled == 'Q')
 	success = demangle_qualified (work, mangled, s,
@@ -3574,6 +3576,14 @@  do_type (struct work_stuff *work, const char **mangled, string *result)
 	    tk = tk_reference;
 	  break;
 
+          /* An rvalue reference type */
+	case 'O':
+          (*mangled)++;
+          string_prepend (&decl, "&&");
+          if (tk == tk_none)
+            tk = tk_rvalue_reference;
+          break;
+
 	  /* An array */
 	case 'A':
 	  {
@@ -3631,11 +3641,9 @@  do_type (struct work_stuff *work, const char **mangled, string *result)
 	  break;
 
 	case 'M':
-	case 'O':
 	  {
 	    type_quals = TYPE_UNQUALIFIED;
 
-	    member = **mangled == 'M';
 	    (*mangled)++;
 
 	    string_append (&decl, ")");