diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2004-07-06 19:29:31 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2004-07-06 19:29:31 +0000 |
commit | 31c27f7773b93ce606153e0248b513384077cb61 (patch) | |
tree | 082d8da1bca4df7523ed4f1e565efdc3e0c2dead | |
parent | 6e9114ad3d264d505acb60a6eaba700a883a6872 (diff) | |
download | gdb-31c27f7773b93ce606153e0248b513384077cb61.zip gdb-31c27f7773b93ce606153e0248b513384077cb61.tar.gz gdb-31c27f7773b93ce606153e0248b513384077cb61.tar.bz2 |
2004-07-06 Jeff Johnston <jjohnstn@redhat.com>
* 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.
-rw-r--r-- | gdb/ChangeLog | 31 | ||||
-rw-r--r-- | gdb/ada-lang.c | 1 | ||||
-rw-r--r-- | gdb/c-lang.c | 4 | ||||
-rw-r--r-- | gdb/cp-support.c | 2 | ||||
-rw-r--r-- | gdb/cp-support.h | 2 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 7 | ||||
-rw-r--r-- | gdb/f-lang.c | 1 | ||||
-rw-r--r-- | gdb/jv-lang.c | 56 | ||||
-rw-r--r-- | gdb/language.c | 17 | ||||
-rw-r--r-- | gdb/language.h | 7 | ||||
-rw-r--r-- | gdb/m2-lang.c | 1 | ||||
-rw-r--r-- | gdb/objc-lang.c | 1 | ||||
-rw-r--r-- | gdb/p-lang.c | 1 | ||||
-rw-r--r-- | gdb/scm-lang.c | 1 |
14 files changed, 128 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d16379d..8f69450 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,34 @@ +2004-07-06 Jeff Johnston <jjohnstn@redhat.com> + + * 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 <cagney@gnu.org> Patch from Bart Robinson. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index b99e197..ad5ec1c 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 3b52890..19c08dc 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 4344545..a182dd9 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 bbf911a..569aeac 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 c1f6c65..845672d 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 0e30c70..4219d45 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 e840191..1fb8cd2 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 b4d38ea..dae3e80 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 27c1491..bbb45f6 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 c66b703..1ab5d3b 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 ecbce77..bcd4873 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 9ab5573..3866e2c 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 1c41076..665ac1b 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 */ |