From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12908 invoked by alias); 27 Sep 2005 18:57:58 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 9367 invoked by uid 22791); 27 Sep 2005 18:55:07 -0000 Received: from xproxy.gmail.com (HELO xproxy.gmail.com) (66.249.82.193) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Tue, 27 Sep 2005 18:55:07 +0000 Received: by xproxy.gmail.com with SMTP id h33so781395wxd for ; Tue, 27 Sep 2005 11:55:04 -0700 (PDT) Received: by 10.70.55.7 with SMTP id d7mr176583wxa; Tue, 27 Sep 2005 11:55:04 -0700 (PDT) Received: by 10.70.58.19 with HTTP; Tue, 27 Sep 2005 11:55:04 -0700 (PDT) Message-ID: <5652dcd5050927115576a87048@mail.gmail.com> Date: Tue, 27 Sep 2005 18:57:00 -0000 From: TJ Laurenzo Reply-To: tj@laurenzo.org To: binutils@sourceware.org, gdb@sources.redhat.com Subject: [patch] Fix to gcc java/PR9861 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_8424_19841232.1127847304669" X-SW-Source: 2005-09/txt/msg00220.txt.bz2 ------=_Part_8424_19841232.1127847304669 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-length: 1599 The following forwarded patch corrects a gcj limitation restricting support for Java 5 generics. It has been discussed on the gcc-patches and java-patches mailing list. Since part of this patch involves an update to the demangler in libiberty, it was suggested that I forward it to the binutils and gdb lists for comment. The attached pr9861-base.diff and pr9861-base-cl.diff are patches to libiberty. The remaining files are patches to gcc itself. TJ Laurenzo ---------- Forwarded message ---------- From: TJ Laurenzo Date: Sep 27, 2005 11:56 AM Subject: Patch to fix PR9861 (reprise) To: gcc-patches@gcc.gnu.org, java-patches@gcc.gnu.org This is a followup to the patches discussed on the thread http://gcc.gnu.org/ml/gcc-patches/2005-09/msg01448.html The attached patches contain all changes to the original patch discussed in the above thread. I have bootstrapped the compiler on i686-pc-linux-gnu and verified that this patch does not introduce any testsuite failures. This patch contains the following files: - pr9861-base.diff : Patches to the libiberty and include directories - pr9861-base-cl.diff : ChangeLog patches for libiberty and include - pr9861-gcc.diff : Patches to gcc - pr9861-gcc-cl.diff : ChangeLog patches for gcc Andrew Haley has pointed out that application of the gcc patches needs some careful timing. Pending approval, the base patches to libiberty should be applied as soon as possible so that binutils and gdb support for the new Java mangling scheme exists in cvs snapshots by the time the gcc patches are commited. TJ ------=_Part_8424_19841232.1127847304669 Content-Type: application/octet-stream; name=pr9861-base.diff Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr9861-base.diff" Content-length: 8171 Index: libiberty/cp-demangle.c =================================================================== RCS file: /cvsroot/gcc/gcc/libiberty/cp-demangle.c,v retrieving revision 1.83 diff -c -3 -p -r1.83 cp-demangle.c *** libiberty/cp-demangle.c 1 Jul 2005 16:39:35 -0000 1.83 --- libiberty/cp-demangle.c 27 Sep 2005 17:41:39 -0000 *************** d_function_type (struct d_info *di) *** 1939,1945 **** return ret; } ! /* ::= + */ static struct demangle_component * d_bare_function_type (struct d_info *di, int has_return_type) --- 1939,1945 ---- return ret; } ! /* ::= [J]+ */ static struct demangle_component * d_bare_function_type (struct d_info *di, int has_return_type) *************** d_bare_function_type (struct d_info *di, *** 1947,1959 **** struct demangle_component *return_type; struct demangle_component *tl; struct demangle_component **ptl; return_type = NULL; tl = NULL; ptl = &tl; while (1) { - char peek; struct demangle_component *type; peek = d_peek_char (di); --- 1947,1968 ---- 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) { struct demangle_component *type; peek = d_peek_char (di); *************** d_print_comp (struct d_print_info *dpi, *** 3025,3037 **** case DEMANGLE_COMPONENT_FUNCTION_TYPE: { 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; --- 3034,3050 ---- 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; *************** d_print_comp (struct d_print_info *dpi, *** 3045,3054 **** if (dpm.printed) return; ! d_append_char (dpi, ' '); } ! d_print_function_type (dpi, dc, dpi->modifiers); return; } --- 3058,3071 ---- if (dpm.printed) return; ! /* 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, ' '); } ! if ((dpi->options & DMGL_RET_POSTFIX) == 0) ! d_print_function_type (dpi, dc, dpi->modifiers); return; } *************** java_demangle_v3 (const char* mangled) *** 4003,4009 **** char *from; char *to; ! demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS, &alc); if (demangled == NULL) return NULL; --- 4020,4027 ---- char *from; char *to; ! demangled = d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, ! &alc); if (demangled == NULL) return NULL; Index: libiberty/testsuite/test-demangle.c =================================================================== RCS file: /cvsroot/gcc/gcc/libiberty/testsuite/test-demangle.c,v retrieving revision 1.6 diff -c -3 -p -r1.6 test-demangle.c *** libiberty/testsuite/test-demangle.c 17 Aug 2005 03:31:04 -0000 1.6 --- libiberty/testsuite/test-demangle.c 27 Sep 2005 17:41:39 -0000 *************** exp: %s\n", *** 114,119 **** --- 114,120 ---- --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 *************** main(argc, argv) *** 129,134 **** --- 130,136 ---- int no_params; int is_v3_ctor; int is_v3_dtor; + int ret_postfix; struct line format; struct line input; struct line expect; *************** main(argc, argv) *** 158,163 **** --- 160,166 ---- tests++; no_params = 0; + ret_postfix = 0; is_v3_ctor = 0; is_v3_dtor = 0; if (format.data[0] == '\0') *************** main(argc, argv) *** 212,217 **** --- 215,222 ---- 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", *************** main(argc, argv) *** 255,261 **** cplus_demangle_set_style (style); result = cplus_demangle (input.data, ! DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES); if (result ? strcmp (result, expect.data) --- 260,267 ---- cplus_demangle_set_style (style); result = cplus_demangle (input.data, ! DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES| ! (ret_postfix ? DMGL_RET_POSTFIX : 0)); if (result ? strcmp (result, expect.data) Index: libiberty/testsuite/demangle-expected =================================================================== RCS file: /cvsroot/gcc/gcc/libiberty/testsuite/demangle-expected,v retrieving revision 1.33 diff -c -3 -p -r1.33 demangle-expected *** libiberty/testsuite/demangle-expected 1 Jul 2005 16:39:36 -0000 1.33 --- libiberty/testsuite/demangle-expected 27 Sep 2005 17:41:39 -0000 *************** *** 11,16 **** --- 11,17 ---- # --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 *************** _test_array__L_1__B23b___clean.6 *** 3781,3783 **** --- 3782,3807 ---- --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 + make Index: include/demangle.h =================================================================== RCS file: /cvsroot/gcc/gcc/include/demangle.h,v retrieving revision 1.29 diff -c -3 -p -r1.29 demangle.h *** include/demangle.h 25 May 2005 23:29:53 -0000 1.29 --- include/demangle.h 27 Sep 2005 17:41:39 -0000 *************** extern "C" { *** 35,40 **** --- 35,42 ---- #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) ------=_Part_8424_19841232.1127847304669 Content-Type: application/octet-stream; name=pr9861-base-cl.diff Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr9861-base-cl.diff" Content-length: 1514 Index: libiberty/ChangeLog =================================================================== RCS file: /cvsroot/gcc/gcc/libiberty/ChangeLog,v retrieving revision 1.604 diff -c -0 -r1.604 ChangeLog *** libiberty/ChangeLog 27 Sep 2005 15:21:40 -0000 1.604 --- libiberty/ChangeLog 27 Sep 2005 17:43:22 -0000 *************** *** 0 **** --- 1,14 ---- + 2005-09-27 Terry Laurenzo + + PR java/9861 + * cp-demangle.c (d_bare_function_type): Recognize new 'J' qualifier + and include return type when found. + * cp-demangle.c (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. + * cp-demangle.c (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. + Index: include/ChangeLog =================================================================== RCS file: /cvsroot/gcc/gcc/include/ChangeLog,v retrieving revision 1.200 diff -c -0 -r1.200 ChangeLog *** include/ChangeLog 17 Aug 2005 17:30:47 -0000 1.200 --- include/ChangeLog 27 Sep 2005 17:43:22 -0000 *************** *** 0 **** --- 1,6 ---- + 2005-09-27 Terry Laurenzo + + PR java/9861 + * demangle.h : Add DMGL_RET_POSTFIX define to enable alternative + output format for return types + ------=_Part_8424_19841232.1127847304669 Content-Type: application/octet-stream; name=pr9861-gcc.diff Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr9861-gcc.diff" Content-length: 6990 Index: gcc/cp/mangle.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/cp/mangle.c,v retrieving revision 1.128 diff -c -3 -p -r1.128 mangle.c *** gcc/cp/mangle.c 13 Sep 2005 15:15:31 -0000 1.128 --- gcc/cp/mangle.c 27 Sep 2005 17:44:34 -0000 *************** write_function_type (const tree type) *** 1858,1873 **** is mangled before the parameter types. If non-NULL, DECL is FUNCTION_DECL for the function whose type is being emitted. ! ::= + */ static void write_bare_function_type (const tree type, const int include_return_type_p, const tree decl) { MANGLE_TRACE_TREE ("bare-function-type", type); /* Mangle the return type, if requested. */ ! if (include_return_type_p) write_type (TREE_TYPE (type)); /* Now mangle the types of the arguments. */ --- 1858,1895 ---- is mangled before the parameter types. If non-NULL, DECL is FUNCTION_DECL for the function whose type is being emitted. ! 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. ! ! ::= [J]+ */ 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 || java_method_p) write_type (TREE_TYPE (type)); /* Now mangle the types of the arguments. */ Index: gcc/java/mangle.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/java/mangle.c,v retrieving revision 1.34 diff -c -3 -p -r1.34 mangle.c *** gcc/java/mangle.c 25 Jun 2005 00:33:04 -0000 1.34 --- gcc/java/mangle.c 27 Sep 2005 17:44:34 -0000 *************** mangle_method_decl (tree mdecl) *** 188,193 **** --- 188,201 ---- 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/builtins.c =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/java/builtins.c,v retrieving revision 1.34 diff -c -3 -p -r1.34 builtins.c *** gcc/java/builtins.c 18 Sep 2005 19:10:10 -0000 1.34 --- gcc/java/builtins.c 27 Sep 2005 17:44:34 -0000 *************** initialize_builtins (void) *** 194,236 **** float_ftype_float_float, "fmodf", BUILTIN_CONST); define_builtin (BUILT_IN_ACOS, "__builtin_acos", ! double_ftype_double, "_ZN4java4lang4Math4acosEd", BUILTIN_CONST); define_builtin (BUILT_IN_ASIN, "__builtin_asin", ! double_ftype_double, "_ZN4java4lang4Math4asinEd", BUILTIN_CONST); define_builtin (BUILT_IN_ATAN, "__builtin_atan", ! double_ftype_double, "_ZN4java4lang4Math4atanEd", BUILTIN_CONST); define_builtin (BUILT_IN_ATAN2, "__builtin_atan2", ! double_ftype_double_double, "_ZN4java4lang4Math5atan2Edd", BUILTIN_CONST); define_builtin (BUILT_IN_CEIL, "__builtin_ceil", ! double_ftype_double, "_ZN4java4lang4Math4ceilEd", BUILTIN_CONST); define_builtin (BUILT_IN_COS, "__builtin_cos", ! double_ftype_double, "_ZN4java4lang4Math3cosEd", BUILTIN_CONST); define_builtin (BUILT_IN_EXP, "__builtin_exp", ! double_ftype_double, "_ZN4java4lang4Math3expEd", BUILTIN_CONST); define_builtin (BUILT_IN_FLOOR, "__builtin_floor", ! double_ftype_double, "_ZN4java4lang4Math5floorEd", BUILTIN_CONST); define_builtin (BUILT_IN_LOG, "__builtin_log", ! double_ftype_double, "_ZN4java4lang4Math3logEd", BUILTIN_CONST); define_builtin (BUILT_IN_POW, "__builtin_pow", ! double_ftype_double_double, "_ZN4java4lang4Math3powEdd", BUILTIN_CONST); define_builtin (BUILT_IN_SIN, "__builtin_sin", ! double_ftype_double, "_ZN4java4lang4Math3sinEd", BUILTIN_CONST); define_builtin (BUILT_IN_SQRT, "__builtin_sqrt", ! double_ftype_double, "_ZN4java4lang4Math4sqrtEd", BUILTIN_CONST); define_builtin (BUILT_IN_TAN, "__builtin_tan", ! double_ftype_double, "_ZN4java4lang4Math3tanEd", BUILTIN_CONST); t = tree_cons (NULL_TREE, boolean_type_node, end_params_node); --- 194,236 ---- float_ftype_float_float, "fmodf", BUILTIN_CONST); define_builtin (BUILT_IN_ACOS, "__builtin_acos", ! double_ftype_double, "_ZN4java4lang4Math4acosEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_ASIN, "__builtin_asin", ! double_ftype_double, "_ZN4java4lang4Math4asinEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_ATAN, "__builtin_atan", ! double_ftype_double, "_ZN4java4lang4Math4atanEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_ATAN2, "__builtin_atan2", ! double_ftype_double_double, "_ZN4java4lang4Math5atan2EJddd", BUILTIN_CONST); define_builtin (BUILT_IN_CEIL, "__builtin_ceil", ! double_ftype_double, "_ZN4java4lang4Math4ceilEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_COS, "__builtin_cos", ! double_ftype_double, "_ZN4java4lang4Math3cosEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_EXP, "__builtin_exp", ! double_ftype_double, "_ZN4java4lang4Math3expEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_FLOOR, "__builtin_floor", ! double_ftype_double, "_ZN4java4lang4Math5floorEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_LOG, "__builtin_log", ! double_ftype_double, "_ZN4java4lang4Math3logEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_POW, "__builtin_pow", ! double_ftype_double_double, "_ZN4java4lang4Math3powEJddd", BUILTIN_CONST); define_builtin (BUILT_IN_SIN, "__builtin_sin", ! double_ftype_double, "_ZN4java4lang4Math3sinEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_SQRT, "__builtin_sqrt", ! double_ftype_double, "_ZN4java4lang4Math4sqrtEJdd", BUILTIN_CONST); define_builtin (BUILT_IN_TAN, "__builtin_tan", ! double_ftype_double, "_ZN4java4lang4Math3tanEJdd", BUILTIN_CONST); t = tree_cons (NULL_TREE, boolean_type_node, end_params_node); ------=_Part_8424_19841232.1127847304669 Content-Type: application/octet-stream; name=pr9861-gcc-cl.diff Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pr9861-gcc-cl.diff" Content-length: 1173 Index: gcc/cp/ChangeLog =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/cp/ChangeLog,v retrieving revision 1.4900 diff -c -0 -r1.4900 ChangeLog *** gcc/cp/ChangeLog 22 Sep 2005 00:11:18 -0000 1.4900 --- gcc/cp/ChangeLog 27 Sep 2005 17:44:59 -0000 *************** *** 0 **** --- 1,6 ---- + 2005-09-23 Terry Laurenzo + + PR java/9861 + * mangle.c (write_bare_function_type): Mangle return type for + methods of Java classes + Index: gcc/java/ChangeLog =================================================================== RCS file: /cvsroot/gcc/gcc/gcc/java/ChangeLog,v retrieving revision 1.1666 diff -c -0 -r1.1666 ChangeLog *** gcc/java/ChangeLog 21 Sep 2005 13:34:27 -0000 1.1666 --- gcc/java/ChangeLog 27 Sep 2005 17:45:03 -0000 *************** *** 0 **** --- 1,8 ---- + 2005-09-23 Terry Laurenzo + + 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 + ------=_Part_8424_19841232.1127847304669--