From: Marc Glisse <marc.glisse@inria.fr>
To: gcc-patches@gcc.gnu.org
Cc: iant@google.com
Subject: Ping: demangle C++ extern "C" functions
Date: Fri, 21 Oct 2011 19:29:00 -0000 [thread overview]
Message-ID: <alpine.DEB.2.02.1110212053030.6478@laptop-mg.saclay.inria.fr> (raw)
In-Reply-To: <alpine.DEB.2.02.1109032229590.6207@laptop-mg.saclay.inria.fr>
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1458 bytes --]
Ping (changing the Cc to bother a different person...).
On Sat, 3 Sep 2011, Marc Glisse wrote:
> Hello,
>
> this patch is obviously related to PR c++/2316 ("g++ fails to overload on
> language linkage") but seems fairly independent. Currently, the demangler
> recognizes 'Y' for extern "C" functions and ignores it. The patch makes it
> print extern "C" after the function type:
> _Z1aIFYviEEvPT_
> void a<void (int) extern "C">(void (*)(int) extern "C")
>
> Writing it before the return type seems more natural, but it is ambiguous. I
> guess it could also be printed in the middle (next to the star that indicates
> a function pointer), but placing it like the cv-qualifiers of member
> functions seemed good (plus, that's where Oracle puts it in its
> implementation of c++filt).
>
> Since g++ doesn't generate such mangling, the effect should be hard to notice
> ;-)
>
> (Even if the patch was ok, I am not a committer)
>
> 2011-09-03 Marc Glisse <marc.glisse@inria.fr>
>
> * include/demangle.h (demangle_component_type)
> [DEMANGLE_COMPONENT_EXTERN_C]: Handle extern "C".
> * libiberty/cp-demangle.c (d_dump): Likewise.
> (d_make_comp): Likewise.
> (d_function_type): Likewise.
> (d_print_comp): Likewise.
> (d_print_mod_list): Likewise.
> (d_print_mod): Likewise.
> (d_print_function_type): Likewise.
> * libiberty/testsuite/demangle-expected: Test it.
--
Marc Glisse
[-- Attachment #2: Type: TEXT/PLAIN, Size: 4536 bytes --]
Index: include/demangle.h
===================================================================
--- include/demangle.h (revision 178498)
+++ include/demangle.h (working copy)
@@ -288,6 +288,9 @@
/* The const qualifier. The one subtree is the type which is being
qualified. */
DEMANGLE_COMPONENT_CONST,
+ /* extern "C" linkage. The one subtree is the function type which
+ is being qualified. */
+ DEMANGLE_COMPONENT_EXTERN_C,
/* The restrict qualifier modifying a member function. The one
subtree is the type which is being qualified. */
DEMANGLE_COMPONENT_RESTRICT_THIS,
Index: libiberty/testsuite/demangle-expected
===================================================================
--- libiberty/testsuite/demangle-expected (revision 178498)
+++ libiberty/testsuite/demangle-expected (working copy)
@@ -4151,3 +4151,8 @@
--format=auto
_ZN3Psi7VariantIIcPKcEE5visitIIRZN11VariantTest9TestVisit11test_methodEvEUlS2_E0_RZNS6_11test_methodEvEUlcE1_RZNS6_11test_methodEvEUlNS_4NoneEE_EEENS_13VariantDetail19SelectVisitorResultIIDpT_EE4typeEDpOSG_
Psi::VariantDetail::SelectVisitorResult<VariantTest::TestVisit::test_method()::{lambda(char const*)#2}&, VariantTest::TestVisit::test_method()::{lambda(char)#3}&, VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&>::type Psi::Variant<char, char const*>::visit<VariantTest::TestVisit::test_method()::{lambda(char const*)#2}&, VariantTest::TestVisit::test_method()::{lambda(char)#3}&, VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&>((VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&)...)
+#
+# extern "C" linkage for function types.
+--format=gnu-v3
+_Z1aIFYviEEvPT_
+void a<void (int) extern "C">(void (*)(int) extern "C")
Index: libiberty/cp-demangle.c
===================================================================
--- libiberty/cp-demangle.c (revision 178498)
+++ libiberty/cp-demangle.c (working copy)
@@ -591,6 +591,9 @@
case DEMANGLE_COMPONENT_CONST:
printf ("const\n");
break;
+ case DEMANGLE_COMPONENT_EXTERN_C:
+ printf ("extern \"C\"\n");
+ break;
case DEMANGLE_COMPONENT_RESTRICT_THIS:
printf ("restrict this\n");
break;
@@ -807,6 +810,7 @@
break;
/* These types only require one parameter. */
+ case DEMANGLE_COMPONENT_EXTERN_C:
case DEMANGLE_COMPONENT_VTABLE:
case DEMANGLE_COMPONENT_VTT:
case DEMANGLE_COMPONENT_TYPEINFO:
@@ -2324,18 +2328,22 @@
d_function_type (struct d_info *di)
{
struct demangle_component *ret;
+ int is_extern_c = 0;
if (! d_check_char (di, 'F'))
return NULL;
if (d_peek_char (di) == 'Y')
{
- /* Function has C linkage. We don't print this information.
- FIXME: We should print it in verbose mode. */
+ /* Function has C linkage. */
+ is_extern_c = 1;
d_advance (di, 1);
+ di->expansion += sizeof "extern \"C\"";
}
ret = d_bare_function_type (di, 1);
if (! d_check_char (di, 'E'))
return NULL;
+ if (is_extern_c)
+ ret = d_make_comp (di, DEMANGLE_COMPONENT_EXTERN_C, ret, NULL);
return ret;
}
@@ -3925,6 +3933,7 @@
case DEMANGLE_COMPONENT_RESTRICT_THIS:
case DEMANGLE_COMPONENT_VOLATILE_THIS:
case DEMANGLE_COMPONENT_CONST_THIS:
+ case DEMANGLE_COMPONENT_EXTERN_C:
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
case DEMANGLE_COMPONENT_POINTER:
case DEMANGLE_COMPONENT_COMPLEX:
@@ -4537,7 +4546,8 @@
|| (! suffix
&& (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS
|| mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS
- || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS)))
+ || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS
+ || mods->mod->type == DEMANGLE_COMPONENT_EXTERN_C)))
{
d_print_mod_list (dpi, options, mods->next, suffix);
return;
@@ -4628,6 +4638,9 @@
case DEMANGLE_COMPONENT_CONST_THIS:
d_append_string (dpi, " const");
return;
+ case DEMANGLE_COMPONENT_EXTERN_C:
+ d_append_string (dpi, " extern \"C\"");
+ return;
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
d_append_char (dpi, ' ');
d_print_comp (dpi, options, d_right (mod));
@@ -4711,6 +4724,7 @@
case DEMANGLE_COMPONENT_RESTRICT_THIS:
case DEMANGLE_COMPONENT_VOLATILE_THIS:
case DEMANGLE_COMPONENT_CONST_THIS:
+ case DEMANGLE_COMPONENT_EXTERN_C:
break;
default:
break;
next prev parent reply other threads:[~2011-10-21 18:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-03 21:05 Marc Glisse
2011-10-21 19:29 ` Marc Glisse [this message]
2011-10-22 5:54 ` Ping: " Ian Lance Taylor
2011-10-22 8:03 ` Marc Glisse
2011-10-22 17:51 ` Ian Lance Taylor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.02.1110212053030.6478@laptop-mg.saclay.inria.fr \
--to=marc.glisse@inria.fr \
--cc=gcc-patches@gcc.gnu.org \
--cc=iant@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).