From 31c27f7773b93ce606153e0248b513384077cb61 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 6 Jul 2004 19:29:31 +0000 Subject: [PATCH] 2004-07-06 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. --- gdb/ChangeLog | 31 +++++++++++++++++++++++++++ gdb/ada-lang.c | 1 + gdb/c-lang.c | 4 ++++ gdb/cp-support.c | 2 +- gdb/cp-support.h | 2 +- gdb/dwarf2read.c | 7 ++++-- gdb/f-lang.c | 1 + gdb/jv-lang.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ gdb/language.c | 17 +++++++++++++++ gdb/language.h | 7 ++++++ gdb/m2-lang.c | 1 + gdb/objc-lang.c | 1 + gdb/p-lang.c | 1 + gdb/scm-lang.c | 1 + 14 files changed, 128 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d16379d4994..8f694501ce4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,34 @@ +2004-07-06 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. + 2004-07-06 Andrew Cagney Patch from Bart Robinson. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index b99e19786ff..ad5ec1c1365 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10144,6 +10144,7 @@ const struct language_defn ada_language_defn = { 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 */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 3b52890309a..19c08dc4415 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -559,6 +559,7 @@ const struct language_defn c_language_defn = 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_language_defn = 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_defn = 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_language_defn = 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 */ diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 4344545c3e9..a182dd9a232 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -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; diff --git a/gdb/cp-support.h b/gdb/cp-support.h index bbf911a387f..569aeacb7d2 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -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); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index c1f6c654f33..845672d0afa 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1840,7 +1840,8 @@ guess_structure_name (struct partial_die_info *struct_pdi, 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 *die, struct dwarf2_cu *cu) { 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) diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 0e30c70dd0d..4219d4539e4 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -478,6 +478,7 @@ const struct language_defn f_language_defn = 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 */ diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index e8401916832..1fb8cd2d2ba 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -62,6 +62,8 @@ static struct value *java_value_string (char *ptr, int len); 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 *mangled, int options) 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_defn = 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 */ diff --git a/gdb/language.c b/gdb/language.c index b4d38ea364a..dae3e809a4b 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1176,6 +1176,16 @@ language_demangle (const struct language_defn *current_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 char *mangled, int options) 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_language_defn = 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_defn = 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_language_defn = 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 */ diff --git a/gdb/language.h b/gdb/language.h index 27c1491d76d..bbb45f6c7b8 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -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_trampoline (CORE_ADDR pc); 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); diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index c66b70341e2..1ab5d3b7a4e 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -431,6 +431,7 @@ const struct language_defn m2_language_defn = 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 */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index ecbce77b190..bcd487378bc 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -675,6 +675,7 @@ const struct language_defn objc_language_defn = { 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 */ diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 9ab55734a1d..3866e2cd660 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -467,6 +467,7 @@ const struct language_defn pascal_language_defn = 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 */ diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c index 1c410766963..665ac1b96bf 100644 --- a/gdb/scm-lang.c +++ b/gdb/scm-lang.c @@ -266,6 +266,7 @@ const struct language_defn scm_language_defn = 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 */ -- 2.30.2