public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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;

  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).