From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12559 invoked by alias); 5 Jul 2004 23:50:41 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 12550 invoked from network); 5 Jul 2004 23:50:39 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 5 Jul 2004 23:50:39 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i65Node1019237 for ; Mon, 5 Jul 2004 19:50:39 -0400 Received: from pobox.toronto.redhat.com (pobox.toronto.redhat.com [172.16.14.4]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i65Noc003230; Mon, 5 Jul 2004 19:50:38 -0400 Received: from touchme.toronto.redhat.com (IDENT:postfix@touchme.toronto.redhat.com [172.16.14.9]) by pobox.toronto.redhat.com (8.12.8/8.12.8) with ESMTP id i65NocvU004928; Mon, 5 Jul 2004 19:50:38 -0400 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id 438A58003D4; Mon, 5 Jul 2004 19:50:38 -0400 (EDT) Message-ID: <40E9E94E.1010104@redhat.com> Date: Mon, 05 Jul 2004 23:50:00 -0000 From: Jeff Johnston User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 MIME-Version: 1.0 To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: Make class_name_from_physname part of language vector References: <40E9B840.8040102@redhat.com> <20040705215028.GA8372@nevyn.them.org> In-Reply-To: <20040705215028.GA8372@nevyn.them.org> Content-Type: multipart/mixed; boundary="------------050504010908070901030500" X-SW-Source: 2004-07/txt/msg00036.txt.bz2 This is a multi-part message in MIME format. --------------050504010908070901030500 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 3592 Daniel Jacobowitz wrote: > On Mon, Jul 05, 2004 at 04:21:20PM -0400, Jeff Johnston wrote: > >>>You've left in a lot of hokery from the C++ support which I'm >>>reasonably confident Java does not need. I don't believe that Java >>>mangled names will ever have templates, or classes nested inside of >>>functions, or multiple argument lists - no depth at all. Also, I'd >>>appreciate it if you called it something other than >>>find_last_component; the C++ version shouldn't have such a generic name >>>either, IMO. >>> >>>Otherwise this looks fine. > > >>I have made the changes you recommended. The function now only looks for >>the opening parenthesis. I renamed it to "find_member_function_name" as >>well. > > > Sorry I wasn't clear - I was hoping for something that said it was for > Java. Maybe java_find_last_component? Also: > Oops. I thought you meant the functional description was too generic. Anyway, changed to java_find_last_component. > >>+/* Find the member function name of the demangled name NAME. NAME >>+ must be a method name including arguments, in order to correctly >>+ locate the last component. >>+ >>+ This function return a pointer to the first dot before the >>+ member function name, or NULL if the name was not of the >>+ expected form. */ >>+ >>+static const char * >>+find_member_function_name (const char *name) >>+{ >>+ const char *p; >>+ int depth; > > > DEPTH is now write-only. > Deleted. > >>+ >>+ /* Functions can have local classes, so we need to find the >>+ beginning of the last argument list, not the end of the first >>+ one. */ >>+ p = name + strlen (name) - 1; >>+ while (p > name && *p != ')') >>+ p--; > > > Is this true for Java? > > I don't think it is. If it isn't, you can just search forward for the > first '(' (and use strchr, even - I'm not sure why the old code doesn't > use strrchr). > No, you're correct. I have simplified the code. New ChangeLog with name change: 2004-07-05 Jeff Johnston * language.h (struct_language_defn): Add new function pointer: la_class_name_from_physname. Also add new prototype for language_class_name_from_physname. * language.c (language_class_name_from_physname): New function. (unk_lang_class_name): Ditto. (unknown_language_defn, auto_language_defn): Change to add unk_lang_class_name function pointer for la_class_name_from_physname. (local_language_defn): Ditto. * dwarf2read.c (guess_structure_name): Change to call language_class_name_from_physname. (determine_class_name): Ditto. * cp-support.c (class_name_from_physname): Renamed. (cp_class_name_from_physname): New name of function. * cp-support.h: Ditto. * c-lang.c (c_language_defn): Change to add NULL for class_name_from_physname function pointer. (cplus_language_defn): Change to add cp_class_name_from_physname. * jv-lang.c (java_class_name_physname): New function. (java_find_last_component): New static routine. (java_language_defn): Add java_class_name_from_physname pointer. * ada-lang.c (ada_language_defn): Change to add NULL for class_name_from_physname function pointer. * f-lang.c (f_language_defn): Ditto. * m2-lang.c (m2_language_defn): Ditto. * objc-lang.c (objc_language_defn): Ditto. * p-lang.c (pascal_language_defn): Ditto. * scm-lang.c (scm_language_defn): Ditto. -- Jeff J. > --------------050504010908070901030500 Content-Type: text/plain; name="class_name.patch2" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="class_name.patch2" Content-length: 14774 Index: cp-support.h =================================================================== RCS file: /cvs/src/src/gdb/cp-support.h,v retrieving revision 1.13 diff -u -p -r1.13 cp-support.h --- cp-support.h 2 Feb 2004 20:44:52 -0000 1.13 +++ cp-support.h 5 Jul 2004 23:44:36 -0000 @@ -52,7 +52,7 @@ struct using_direct /* Functions from cp-support.c. */ -extern char *class_name_from_physname (const char *physname); +extern char *cp_class_name_from_physname (const char *physname); extern char *method_name_from_physname (const char *physname); Index: language.h =================================================================== RCS file: /cvs/src/src/gdb/language.h,v retrieving revision 1.26 diff -u -p -r1.26 language.h --- language.h 10 Apr 2004 22:10:01 -0000 1.26 +++ language.h 5 Jul 2004 23:44:36 -0000 @@ -247,6 +247,9 @@ struct language_defn /* Return demangled language symbol, or NULL. */ char *(*la_demangle) (const char *mangled, int options); + /* Return class name of a mangled method name or NULL. */ + char *(*la_class_name_from_physname) (const char *physname); + /* Base 2 (binary) formats. */ struct language_format_info la_binary_format; @@ -516,6 +519,10 @@ extern CORE_ADDR skip_language_trampolin extern char *language_demangle (const struct language_defn *current_language, const char *mangled, int options); +/* Return class name from physname, or NULL. */ +extern char *language_class_name_from_physname (const struct language_defn *, + const char *physname); + /* Splitting strings into words. */ extern char *default_word_break_characters (void); Index: ada-lang.c =================================================================== RCS file: /cvs/src/src/gdb/ada-lang.c,v retrieving revision 1.46 diff -u -p -r1.46 ada-lang.c --- ada-lang.c 1 Jul 2004 10:30:57 -0000 1.46 +++ ada-lang.c 5 Jul 2004 23:44:36 -0000 @@ -10144,6 +10144,7 @@ const struct language_defn ada_language_ ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */ basic_lookup_transparent_type, /* lookup_transparent_type */ ada_la_decode, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ #if 0 {"8#%lo#", "8#", "o", "#"}, /* Octal format info */ Index: c-lang.c =================================================================== RCS file: /cvs/src/src/gdb/c-lang.c,v retrieving revision 1.27 diff -u -p -r1.27 c-lang.c --- c-lang.c 10 Apr 2004 22:10:00 -0000 1.27 +++ c-lang.c 5 Jul 2004 23:44:36 -0000 @@ -559,6 +559,7 @@ const struct language_defn c_language_de basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -618,6 +619,7 @@ const struct language_defn cplus_languag cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ cp_lookup_transparent_type, /* lookup_transparent_type */ cplus_demangle, /* Language specific symbol demangler */ + cp_class_name_from_physname, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -654,6 +656,7 @@ const struct language_defn asm_language_ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -695,6 +698,7 @@ const struct language_defn minimal_langu basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: cp-support.c =================================================================== RCS file: /cvs/src/src/gdb/cp-support.c,v retrieving revision 1.12 diff -u -p -r1.12 cp-support.c --- cp-support.c 2 Feb 2004 20:44:52 -0000 1.12 +++ cp-support.c 5 Jul 2004 23:44:36 -0000 @@ -148,7 +148,7 @@ find_last_component (const char *name) /* Return the name of the class containing method PHYSNAME. */ char * -class_name_from_physname (const char *physname) +cp_class_name_from_physname (const char *physname) { char *ret = NULL; const char *end; Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.155 diff -u -p -r1.155 dwarf2read.c --- dwarf2read.c 24 Jun 2004 20:42:42 -0000 1.155 +++ dwarf2read.c 5 Jul 2004 23:44:37 -0000 @@ -1840,7 +1840,8 @@ guess_structure_name (struct partial_die if (child_pdi->tag == DW_TAG_subprogram) { char *actual_class_name - = class_name_from_physname (child_pdi->name); + = language_class_name_from_physname (cu->language_defn, + child_pdi->name); if (actual_class_name != NULL) { struct_pdi->name @@ -3557,7 +3558,9 @@ determine_class_name (struct die_info *d { if (child->tag == DW_TAG_subprogram) { - new_prefix = class_name_from_physname (dwarf2_linkage_name + new_prefix + = language_class_name_from_physname (cu->language_defn, + dwarf2_linkage_name (child, cu)); if (new_prefix != NULL) Index: f-lang.c =================================================================== RCS file: /cvs/src/src/gdb/f-lang.c,v retrieving revision 1.23 diff -u -p -r1.23 f-lang.c --- f-lang.c 10 Apr 2004 22:10:00 -0000 1.23 +++ f-lang.c 5 Jul 2004 23:44:37 -0000 @@ -478,6 +478,7 @@ const struct language_defn f_language_de basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%o", "0", "o", ""}, /* Octal format info */ {"%d", "", "d", ""}, /* Decimal format info */ Index: jv-lang.c =================================================================== RCS file: /cvs/src/src/gdb/jv-lang.c,v retrieving revision 1.30 diff -u -p -r1.30 jv-lang.c --- jv-lang.c 10 Apr 2004 22:10:00 -0000 1.30 +++ jv-lang.c 5 Jul 2004 23:44:37 -0000 @@ -62,6 +62,8 @@ static struct value *java_value_string ( static void java_emit_char (int c, struct ui_file * stream, int quoter); +static char *java_class_name_from_physname (const char *physname); + /* This objfile contains symtabs that have been dynamically created to record dynamically loaded Java classes and dynamically compiled java methods. */ @@ -975,6 +977,59 @@ static char *java_demangle (const char * return cplus_demangle (mangled, options | DMGL_JAVA); } +/* Find the member function name of the demangled name NAME. NAME + must be a method name including arguments, in order to correctly + locate the last component. + + This function return a pointer to the first dot before the + member function name, or NULL if the name was not of the + expected form. */ + +static const char * +java_find_last_component (const char *name) +{ + const char *p; + + /* Find argument list. */ + p = strchr (name, '('); + + if (p == NULL) + return NULL; + + /* Back up and find first dot prior to argument list. */ + while (p > name && *p != '.') + p--; + + if (p == name) + return NULL; + + return p; +} + +/* Return the name of the class containing method PHYSNAME. */ + +static char * +java_class_name_from_physname (const char *physname) +{ + char *ret = NULL; + const char *end; + int depth = 0; + char *demangled_name = java_demangle (physname, DMGL_PARAMS | DMGL_ANSI); + + if (demangled_name == NULL) + return NULL; + + end = java_find_last_component (demangled_name); + if (end != NULL) + { + ret = xmalloc (end - demangled_name + 1); + memcpy (ret, demangled_name, end - demangled_name); + ret[end - demangled_name] = '\0'; + } + + xfree (demangled_name); + return ret; +} /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ @@ -1049,6 +1104,7 @@ const struct language_defn java_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ java_demangle, /* Language specific symbol demangler */ + java_class_name_from_physname,/* Language specific class name */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: language.c =================================================================== RCS file: /cvs/src/src/gdb/language.c,v retrieving revision 1.44 diff -u -p -r1.44 language.c --- language.c 10 Apr 2004 22:10:00 -0000 1.44 +++ language.c 5 Jul 2004 23:44:37 -0000 @@ -1176,6 +1176,16 @@ language_demangle (const struct language return NULL; } +/* Return class name from physname or NULL. */ +char * +language_class_name_from_physname (const struct language_defn *current_language, + const char *physname) +{ + if (current_language != NULL && current_language->la_class_name_from_physname) + return current_language->la_class_name_from_physname (physname); + return NULL; +} + /* Return the default string containing the list of characters delimiting words. This is a reasonable default value that most languages should be able to use. */ @@ -1258,6 +1268,10 @@ static char *unk_lang_demangle (const ch return cplus_demangle (mangled, options); } +static char *unk_lang_class_name (const char *mangled) +{ + return NULL; +} static struct type **const (unknown_builtin_types[]) = { @@ -1292,6 +1306,7 @@ const struct language_defn unknown_langu basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1329,6 +1344,7 @@ const struct language_defn auto_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1365,6 +1381,7 @@ const struct language_defn local_languag basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: m2-lang.c =================================================================== RCS file: /cvs/src/src/gdb/m2-lang.c,v retrieving revision 1.16 diff -u -p -r1.16 m2-lang.c --- m2-lang.c 10 Apr 2004 22:10:01 -0000 1.16 +++ m2-lang.c 5 Jul 2004 23:44:37 -0000 @@ -431,6 +431,7 @@ const struct language_defn m2_language_d basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"%loB", "", "o", "B"}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: objc-lang.c =================================================================== RCS file: /cvs/src/src/gdb/objc-lang.c,v retrieving revision 1.35 diff -u -p -r1.35 objc-lang.c --- objc-lang.c 10 Apr 2004 22:10:01 -0000 1.35 +++ objc-lang.c 5 Jul 2004 23:44:37 -0000 @@ -675,6 +675,7 @@ const struct language_defn objc_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ objc_demangle, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.18 diff -u -p -r1.18 p-lang.c --- p-lang.c 10 Apr 2004 22:09:59 -0000 1.18 +++ p-lang.c 5 Jul 2004 23:44:37 -0000 @@ -467,6 +467,7 @@ const struct language_defn pascal_langua basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "%", "b", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: scm-lang.c =================================================================== RCS file: /cvs/src/src/gdb/scm-lang.c,v retrieving revision 1.23 diff -u -p -r1.23 scm-lang.c --- scm-lang.c 10 Apr 2004 22:10:01 -0000 1.23 +++ scm-lang.c 5 Jul 2004 23:44:37 -0000 @@ -266,6 +266,7 @@ const struct language_defn scm_language_ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"#o%lo", "#o", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ --------------050504010908070901030500--