public inbox for java-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: TJ Laurenzo <tlaurenzo@gmail.com>
To: java-patches@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: PATCH: Fix for java/PR9861
Date: Sun, 11 Dec 2005 01:33:00 -0000	[thread overview]
Message-ID: <5652dcd50512101732w776d3301u72c8a132a71b4870@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 760 bytes --]

This patch has been discussed extensively on the mailing lists:
   http://gcc.gnu.org/ml/gcc-patches/2005-09/msg01716.html
Modifications have been made to formatting per Ian Taylor and I am
commiting the patch now.    The remainder of the patch was approved by
Andrew Haley.

The test suite looked good when bootstrapped on i686-pc-linux-gnu.

Note that this patch changes the name mangling behavior for Java
methods (as defined by gcj and g++ when compiling CNI classes) so as
to allow return type mangling.  Existing Java libraries will need to
be rebuilt to account for the change.  In addition, existing
binutils/gdb will not be able to properly decode the names until
rebuilt with the libiberty changes commited as part of this patch.

TJ

[-- Attachment #2: pr9861.diff --]
[-- Type: text/x-patch, Size: 13232 bytes --]

Index: libiberty/ChangeLog
===================================================================
--- libiberty/ChangeLog	(revision 108355)
+++ libiberty/ChangeLog	(working copy)
@@ -1,3 +1,17 @@
+2005-12-10  Terry Laurenzo  <tlaurenzo@gmail.com>
+
+	PR java/9861
+	* cp-demangle.c (d_bare_function_type): Recognize new 'J' qualifer
+	and include return type when found.
+	(d_print_comp)[DEMANGLE_COMPONENT_FUNCTION_TYPE]: Add
+	conditional logic to change printing order of return type.when
+	the DMGL_RET_POSTFIX option is present.
+	(java_demangle_v3): Add DMGL_RET_POSTFIX option to d_demangle
+	call.
+	* testsuite/test-demangle.c (main): Recognize option --ret-postfix
+	* testsuite/demangle-expected: Test cases to verify extended encoding.
+	Updated comment to document --ret-postfix option.
+	
 2005-11-06  Richard Guenther  <rguenther@suse.de>
 
 	* splay-tree.c (rotate_left): New function.
Index: include/ChangeLog
===================================================================
--- include/ChangeLog	(revision 108355)
+++ include/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2005-12-10  Terry Laurenzo  <tlaurenzo@gmail.com>
+
+	PR java/9861
+	* demangle.h : Add DMGL_RET_POSTFIX define to enable alternative
+	output format for return types
+
 2005-10-31  Mark Kettenis  <kettenis@gnu.org>
 
 	* floatformat.h (enum floatformat_byteorders): Add
Index: libiberty/cp-demangle.c
===================================================================
--- libiberty/cp-demangle.c	(revision 108355)
+++ libiberty/cp-demangle.c	(working copy)
@@ -1939,7 +1939,7 @@
   return ret;
 }
 
-/* <bare-function-type> ::= <type>+  */
+/* <bare-function-type> ::= [J]<type>+  */
 
 static struct demangle_component *
 d_bare_function_type (struct d_info *di, int has_return_type)
@@ -1947,13 +1947,22 @@
   struct demangle_component *return_type;
   struct demangle_component *tl;
   struct demangle_component **ptl;
+  char peek;
 
+  /* Detect special qualifier indicating that the first argument
+     is the return type.  */
+  peek = d_peek_char (di);
+  if (peek == 'J')
+    {
+      d_advance (di, 1);
+      has_return_type = 1;
+    }
+
   return_type = NULL;
   tl = NULL;
   ptl = &tl;
   while (1)
     {
-      char peek;
       struct demangle_component *type;
 
       peek = d_peek_char (di);
@@ -3025,13 +3034,16 @@
 
     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
       {
+	if ((dpi->options & DMGL_RET_POSTFIX) != 0)
+	  d_print_function_type (dpi, dc, dpi->modifiers);
+
+	/* Print return type if present */
 	if (d_left (dc) != NULL)
 	  {
 	    struct d_print_mod dpm;
 
 	    /* We must pass this type down as a modifier in order to
 	       print it in the right location.  */
-
 	    dpm.next = dpi->modifiers;
 	    dpi->modifiers = &dpm;
 	    dpm.mod = dc;
@@ -3045,10 +3057,14 @@
 	    if (dpm.printed)
 	      return;
 
-	    d_append_char (dpi, ' ');
+	    /* In standard prefix notation, there is a space between the
+	       return type and the function signature.  */
+	    if ((dpi->options & DMGL_RET_POSTFIX) == 0)
+	      d_append_char (dpi, ' ');
 	  }
 
-	d_print_function_type (dpi, dc, dpi->modifiers);
+	if ((dpi->options & DMGL_RET_POSTFIX) == 0) 
+	  d_print_function_type (dpi, dc, dpi->modifiers);
 
 	return;
       }
@@ -4003,7 +4019,8 @@
   char *from;
   char *to;
 
-  demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc);
+  demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, 
+			  &alc);
 
   if (demangled == NULL)
     return NULL;
Index: libiberty/testsuite/test-demangle.c
===================================================================
--- libiberty/testsuite/test-demangle.c	(revision 108355)
+++ libiberty/testsuite/test-demangle.c	(working copy)
@@ -114,6 +114,7 @@
      --is-v3-ctor        Calls is_gnu_v3_mangled_ctor on input; expected
                          output is an integer representing ctor_kind.
      --is-v3-dtor        Likewise, but for dtors.
+     --ret-postfix       Passes the DMGL_RET_POSTFIX option
 
    For compatibility, just in case it matters, the options line may be
    empty, to mean --format=auto.  If it doesn't start with --, then it
@@ -129,6 +130,7 @@
   int no_params;
   int is_v3_ctor;
   int is_v3_dtor;
+  int ret_postfix;
   struct line format;
   struct line input;
   struct line expect;
@@ -158,6 +160,7 @@
       tests++;
 
       no_params = 0;
+      ret_postfix = 0;
       is_v3_ctor = 0;
       is_v3_dtor = 0;
       if (format.data[0] == '\0')
@@ -212,6 +215,8 @@
 		is_v3_ctor = 1;
 	      else if (strcmp (opt, "--is-v3-dtor") == 0)
 		is_v3_dtor = 1;
+	      else if (strcmp (opt, "--ret-postfix") == 0)
+		ret_postfix = 1;
 	      else
 		{
 		  printf ("FAIL at line %d: unrecognized option %s\n",
@@ -255,7 +260,8 @@
       cplus_demangle_set_style (style);
 
       result = cplus_demangle (input.data,
-			       DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES);
+			       DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES
+			       |(ret_postfix ? DMGL_RET_POSTFIX : 0));
 
       if (result
 	  ? strcmp (result, expect.data)
Index: libiberty/testsuite/demangle-expected
===================================================================
--- libiberty/testsuite/demangle-expected	(revision 108355)
+++ libiberty/testsuite/demangle-expected	(working copy)
@@ -11,6 +11,7 @@
 #    --is-v3-ctor        Calls is_gnu_v3_mangled_ctor on input; expected
 #                        output is an integer representing ctor_kind.
 #    --is-v3-dtor        Likewise, but for dtors.
+#    --ret-postfix       Passes the DMGL_RET_POSTFIX option
 #
 #  For compatibility, just in case it matters, the options line may be
 #  empty, to mean --format=auto.  If it doesn't start with --, then it
@@ -3781,3 +3782,26 @@
 --format=java
 _ZGAN4java4lang5Class7forNameEPNS0_6StringE
 hidden alias for java.lang.Class.forName(java.lang.String)
+#
+# Test cases to verify encoding that determines if a return type is present
+# Related to PR9861
+--format=java
+_ZN4java4lang4Math4acosEJdd
+java.lang.Math.acos(double)double
+#
+--format=auto
+_ZN4java4lang4Math4acosEJdd
+double java::lang::Math::acos(double)
+#
+--format=auto
+_ZN4java4lang4Math4acosEJvd
+void java::lang::Math::acos(double)
+#
+--format=auto --ret-postfix
+_ZN4java4lang4Math4acosEJdd
+java::lang::Math::acos(double)double
+#
+--format=gnu-v3 --no-params --ret-postfix
+_Z4makeI7FactoryiET_IT0_Ev
+make<Factory, int>()Factory<int>
+make<Factory, int>
Index: include/demangle.h
===================================================================
--- include/demangle.h	(revision 108355)
+++ include/demangle.h	(working copy)
@@ -35,6 +35,8 @@
 #define DMGL_JAVA	 (1 << 2)	/* Demangle as Java rather than C++. */
 #define DMGL_VERBOSE	 (1 << 3)	/* Include implementation details.  */
 #define DMGL_TYPES	 (1 << 4)	/* Also try to demangle type encodings.  */
+#define DMGL_RET_POSTFIX (1 << 5)       /* Print function return types (when
+                                           present) after function signature */
 
 #define DMGL_AUTO	 (1 << 8)
 #define DMGL_GNU	 (1 << 9)
Index: gcc/cp/mangle.c
===================================================================
--- gcc/cp/mangle.c	(revision 108355)
+++ gcc/cp/mangle.c	(working copy)
@@ -1858,16 +1858,38 @@
    is mangled before the parameter types.  If non-NULL, DECL is
    FUNCTION_DECL for the function whose type is being emitted.
 
-     <bare-function-type> ::= </signature/ type>+  */
+   If DECL is a member of a Java type, then a literal 'J'
+   is output and the return type is mangled as if INCLUDE_RETURN_TYPE
+   were nonzero.
 
+     <bare-function-type> ::= [J]</signature/ type>+  */
+
 static void
 write_bare_function_type (const tree type, const int include_return_type_p,
 			  const tree decl)
 {
+  int java_method_p;
+
   MANGLE_TRACE_TREE ("bare-function-type", type);
 
+  /* Detect Java methods and emit special encoding.  */
+  if (decl != NULL
+      && DECL_FUNCTION_MEMBER_P (decl)
+      && TYPE_FOR_JAVA (DECL_CONTEXT (decl))
+      && !DECL_CONSTRUCTOR_P (decl)
+      && !DECL_DESTRUCTOR_P (decl)
+      && !DECL_CONV_FN_P (decl))
+    {
+      java_method_p = 1;
+      write_char ('J');
+    }
+  else
+    {
+      java_method_p = 0;
+    }
+
   /* Mangle the return type, if requested.  */
-  if (include_return_type_p)
+  if (include_return_type_p || java_method_p)
     write_type (TREE_TYPE (type));
 
   /* Now mangle the types of the arguments.  */
Index: gcc/cp/ChangeLog
===================================================================
--- gcc/cp/ChangeLog	(revision 108355)
+++ gcc/cp/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2005-12-10  Terry Laurenzo  <tlaurenzo@gmail.com>
+
+	PR java/9861
+	* mangle.c (write_bare_function_type): Mangle return type for
+	methods of Java classes
+
 2005-12-08  Théodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
 	
 	* call.c (build_conditional_expr): Print types in error messages.
Index: gcc/java/mangle.c
===================================================================
--- gcc/java/mangle.c	(revision 108355)
+++ gcc/java/mangle.c	(working copy)
@@ -188,6 +188,14 @@
   if (TREE_CODE (TREE_TYPE (mdecl)) == METHOD_TYPE)
     arglist = TREE_CHAIN (arglist);
   
+  /* Output literal 'J' and mangle the return type IF not a 
+     constructor.  */
+  if (!ID_INIT_P (method_name))
+    {
+      obstack_1grow (mangle_obstack, 'J');
+      mangle_type(TREE_TYPE(TREE_TYPE(mdecl)));
+    }
+  
   /* No arguments is easy. We shortcut it. */
   if (arglist == end_params_node)
     obstack_1grow (mangle_obstack, 'v');
Index: gcc/java/ChangeLog
===================================================================
--- gcc/java/ChangeLog	(revision 108355)
+++ gcc/java/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2005-12-10  Terry Laurenzo  <tlaurenzo@gmail.com>
+
+	PR java/9861
+	* mangle.c (mangle_method_decl): Mangle Java methods by prepending 'J'
+	to bare_function_type and including the return type
+	* builtins.c (initialize_builtins) : Change builtin mangled name
+	constants to conform to new mangling scheme
+
 2005-12-08  Andrew Haley  <aph@redhat.com>
 
 	PR libgcj/25265
Index: gcc/java/builtins.c
===================================================================
--- gcc/java/builtins.c	(revision 108355)
+++ gcc/java/builtins.c	(working copy)
@@ -194,43 +194,43 @@
 		  float_ftype_float_float, "fmodf", BUILTIN_CONST);
 
   define_builtin (BUILT_IN_ACOS, "__builtin_acos",
-		  double_ftype_double, "_ZN4java4lang4Math4acosEd",
+		  double_ftype_double, "_ZN4java4lang4Math4acosEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_ASIN, "__builtin_asin",
-		  double_ftype_double, "_ZN4java4lang4Math4asinEd",
+		  double_ftype_double, "_ZN4java4lang4Math4asinEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_ATAN, "__builtin_atan",
-		  double_ftype_double, "_ZN4java4lang4Math4atanEd",
+		  double_ftype_double, "_ZN4java4lang4Math4atanEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_ATAN2, "__builtin_atan2",
-		  double_ftype_double_double, "_ZN4java4lang4Math5atan2Edd",
+		  double_ftype_double_double, "_ZN4java4lang4Math5atan2EJddd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_CEIL, "__builtin_ceil",
-		  double_ftype_double, "_ZN4java4lang4Math4ceilEd",
+		  double_ftype_double, "_ZN4java4lang4Math4ceilEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_COS, "__builtin_cos",
-		  double_ftype_double, "_ZN4java4lang4Math3cosEd",
+		  double_ftype_double, "_ZN4java4lang4Math3cosEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_EXP, "__builtin_exp",
-		  double_ftype_double, "_ZN4java4lang4Math3expEd",
+		  double_ftype_double, "_ZN4java4lang4Math3expEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_FLOOR, "__builtin_floor",
-		  double_ftype_double, "_ZN4java4lang4Math5floorEd",
+		  double_ftype_double, "_ZN4java4lang4Math5floorEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_LOG, "__builtin_log",
-		  double_ftype_double, "_ZN4java4lang4Math3logEd",
+		  double_ftype_double, "_ZN4java4lang4Math3logEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_POW, "__builtin_pow",
-		  double_ftype_double_double, "_ZN4java4lang4Math3powEdd",
+		  double_ftype_double_double, "_ZN4java4lang4Math3powEJddd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_SIN, "__builtin_sin",
-		  double_ftype_double, "_ZN4java4lang4Math3sinEd",
+		  double_ftype_double, "_ZN4java4lang4Math3sinEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_SQRT, "__builtin_sqrt",
-		  double_ftype_double, "_ZN4java4lang4Math4sqrtEd",
+		  double_ftype_double, "_ZN4java4lang4Math4sqrtEJdd",
 		  BUILTIN_CONST);
   define_builtin (BUILT_IN_TAN, "__builtin_tan",
-		  double_ftype_double, "_ZN4java4lang4Math3tanEd",
+		  double_ftype_double, "_ZN4java4lang4Math3tanEJdd",
 		  BUILTIN_CONST);
   
   t = tree_cons (NULL_TREE, boolean_type_node, end_params_node);

                 reply	other threads:[~2005-12-11  1:33 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=5652dcd50512101732w776d3301u72c8a132a71b4870@mail.gmail.com \
    --to=tlaurenzo@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=java-patches@gcc.gnu.org \
    --cc=tj@laurenzo.org \
    /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).