From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 95415 invoked by alias); 20 Dec 2015 22:35:24 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 94500 invoked by uid 89); 20 Dec 2015 22:35:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=finder, comp, 35746 X-HELO: mail-lf0-f65.google.com Received: from mail-lf0-f65.google.com (HELO mail-lf0-f65.google.com) (209.85.215.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sun, 20 Dec 2015 22:35:18 +0000 Received: by mail-lf0-f65.google.com with SMTP id z124so10144096lfa.2 for ; Sun, 20 Dec 2015 14:35:17 -0800 (PST) X-Received: by 10.25.81.13 with SMTP id f13mr5744827lfb.126.1450650914789; Sun, 20 Dec 2015 14:35:14 -0800 (PST) Received: from localhost.localdomain ([37.204.1.155]) by smtp.gmail.com with ESMTPSA id m75sm4420435lfg.15.2015.12.20.14.35.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 20 Dec 2015 14:35:13 -0800 (PST) From: Artemiy Volkov To: gdb-patches@sourceware.org Cc: Artemiy Volkov Subject: [PATCH 05/11] [PR gdb/14441] gdb: demangle: implement demangling for rvalue reference typenames Date: Sun, 20 Dec 2015 22:35:00 -0000 Message-Id: <1450661481-31178-6-git-send-email-artemiyv@acm.org> In-Reply-To: <1450661481-31178-1-git-send-email-artemiyv@acm.org> References: <1450661481-31178-1-git-send-email-artemiyv@acm.org> X-IsSubscribed: yes X-SW-Source: 2015-12/txt/msg00415.txt.bz2 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 * 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 * 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(-) 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, ")"); -- 2.6.4