From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Johnston To: gdb-patches@sources.redhat.com Subject: [RFA]: Make class_name_from_physname part of language vector Date: Fri, 14 May 2004 23:37:00 -0000 Message-id: <40A5583B.7030802@redhat.com> X-SW-Source: 2004-05/msg00437.html The attached patch is a fix for Java support. Currently, dwarf2read.c calls class_name_from_physname to get a class name. This code currently resides in the cp-support.c file and is C++ specific as it parses looking for "::". This patch changes it so the class_name_from_physname becomes a function in the language definition. The current class_name_from_physname routine is the C++ version and is renamed. Ok to commit? 2004-05-14 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. (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. Index: ada-lang.c =================================================================== RCS file: /cvs/src/src/gdb/ada-lang.c,v retrieving revision 1.35 diff -u -p -r1.35 ada-lang.c --- ada-lang.c 23 Jan 2004 23:03:28 -0000 1.35 +++ ada-lang.c 14 May 2004 23:03:34 -0000 @@ -8021,6 +8021,7 @@ const struct language_defn ada_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 */ #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 14 May 2004 23:03:34 -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 14 May 2004 23:03:34 -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: 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 14 May 2004 23:03:34 -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: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.151 diff -u -p -r1.151 dwarf2read.c --- dwarf2read.c 7 May 2004 14:29:33 -0000 1.151 +++ dwarf2read.c 14 May 2004 23:03:34 -0000 @@ -1836,7 +1836,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 @@ -3560,7 +3561,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 14 May 2004 23:03:35 -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 14 May 2004 23:03:35 -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,78 @@ static char *java_demangle (const char * return cplus_demangle (mangled, options | DMGL_JAVA); } +/* Find the last component 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 + last component, or NULL if the name had only one component. */ + +static const char * +find_last_component (const char *name) +{ + const char *p; + int depth; + + /* 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--; + + if (p == name) + return NULL; + + /* P now points at the `)' at the end of the argument list. Walk + back to the beginning. */ + p--; + depth = 1; + while (p > name && depth > 0) + { + if (*p == '<' || *p == '(') + depth--; + else if (*p == '>' || *p == ')') + depth++; + p--; + } + + if (p == name) + return NULL; + + 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 = 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 +1123,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 14 May 2004 23:03:35 -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: 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 14 May 2004 23:03:35 -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; @@ -515,6 +518,10 @@ extern CORE_ADDR skip_language_trampolin /* Return demangled language symbol, or NULL. */ 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: 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 14 May 2004 23:03:35 -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 14 May 2004 23:03:35 -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 14 May 2004 23:03:35 -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 14 May 2004 23:03:35 -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 */ >From kevinb@redhat.com Sat May 15 00:05:00 2004 From: Kevin Buettner To: Joel Brobecker Cc: Jim Blandy , gdb-patches@sources.redhat.com Subject: Re: [RFA] Fix small problems in rs6000-tdep.c:skip_prologue() Date: Sat, 15 May 2004 00:05:00 -0000 Message-id: <20040514170539.4727eec9@saguaro> References: <20040402183637.GC871@gnat.com> <20040417051545.GO22414@gnat.com> <20040508001600.GH16083@gnat.com> X-SW-Source: 2004-05/msg00438.html Content-length: 1149 On 14 May 2004 17:18:31 -0500 Jim Blandy wrote: > > > Attached is a revised version incorporating your changes. Could you > > > give it a shot against your function, and let me know if it works for > > > you? It works for me, and doesn't introduce any regression on our > > > powerpc-aix-5.1 machine. > > > > > > 2004-04-16 Joel Brobecker > > > > > > * rs6000-tdep.c (store_param_on_stack_p): New function, > > > an improved version of some code extracted from skip_prologue(). > > > (skip_prologue): Use store_param_on_stack_p() to detect > > > instructions saving a parameter on the stack. Detect when r0 > > > is used to save a parameter. > > > Do not mark "li rx, SIMM" instructions as part of the prologue, > > > unless the following instruction is also part of the prologue. > > > > > > I'll followup with a testcase soon. > > I've finally been able to give this a shot, and it works fine on my > prologue, too. So I have no objections to the patch. Thanks for your > patience, Joel! Joel, your revised patch is approved. Kevin