From 235d1e032292b26ef7f9e66bab679edc8455f535 Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Thu, 12 Oct 2000 19:34:27 +0000 Subject: [PATCH] 2000-10-12 Elena Zannoni From Daniel Berlin : * symtab.h (SYMBOL_INIT_DEMANGLED_NAME): Initialize the symbol language to auto instead of unknown, so it will try to demangle the symbol. * symtab.h (OPNAME_PREFIX_P): Change operator prefix to correct value. * symtab.c (gdb_mangle_name): Properly handle C++ operators. --- gdb/ChangeLog | 10 ++++++++++ gdb/symtab.c | 22 ++++------------------ gdb/symtab.h | 14 ++++---------- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd1f8aae26f..0f59014e920 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2000-10-12 Elena Zannoni + + From Daniel Berlin : + + * symtab.h (SYMBOL_INIT_DEMANGLED_NAME): Initialize the symbol + language to auto instead of unknown, so it will try to demangle + the symbol. + * symtab.h (OPNAME_PREFIX_P): Change operator prefix to correct value. + * symtab.c (gdb_mangle_name): Properly handle C++ operators. + 2000-10-12 Elena Zannoni From Daniel Berlin : diff --git a/gdb/symtab.c b/gdb/symtab.c index 3a97e10281b..56a179514bc 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -303,6 +303,9 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) char buf[20]; int len = (newname == NULL ? 0 : strlen (newname)); + if (OPNAME_PREFIX_P (field_name)) + return xstrdup (physname); + is_full_physname_constructor = ((physname[0] == '_' && physname[1] == '_' && (isdigit (physname[2]) || physname[2] == 'Q' || physname[2] == 't')) @@ -338,25 +341,8 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len); } mangled_name_len = ((is_constructor ? 0 : strlen (field_name)) - + strlen (buf) + len - + strlen (physname) - + 1); - - /* Only needed for GNU-mangled names. ANSI-mangled names - work with the normal mechanisms. */ - if (OPNAME_PREFIX_P (field_name)) - { - const char *opname = cplus_mangle_opname (field_name + 3, 0); - if (opname == NULL) - error ("No mangling for \"%s\"", field_name); - mangled_name_len += strlen (opname); - mangled_name = (char *) xmalloc (mangled_name_len); + + strlen (buf) + len + strlen (physname) + 1); - strncpy (mangled_name, field_name, 3); - mangled_name[3] = '\0'; - strcat (mangled_name, opname); - } - else { mangled_name = (char *) xmalloc (mangled_name_len); if (is_constructor) diff --git a/gdb/symtab.h b/gdb/symtab.h index 55db0f82a9d..d76df87c253 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -170,6 +170,8 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *); #define SYMBOL_INIT_DEMANGLED_NAME(symbol,obstack) \ do { \ char *demangled = NULL; \ + if (SYMBOL_LANGUAGE (symbol) == language_unknown) \ + SYMBOL_LANGUAGE (symbol) = language_auto; \ if (SYMBOL_LANGUAGE (symbol) == language_cplus \ || SYMBOL_LANGUAGE (symbol) == language_auto) \ { \ @@ -222,10 +224,6 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *); SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL; \ } \ } \ - if (SYMBOL_LANGUAGE (symbol) == language_auto) \ - { \ - SYMBOL_LANGUAGE (symbol) = language_unknown; \ - } \ } while (0) /* Macro that returns the demangled name for a symbol based on the language @@ -1047,13 +1045,9 @@ struct partial_symtab #define VTBL_FNADDR_OFFSET 2 /* Macro that yields non-zero value iff NAME is the prefix for C++ operator - names. If you leave out the parenthesis here you will lose! - Currently 'o' 'p' CPLUS_MARKER is used for both the symbol in the - symbol-file and the names in gdb's symbol table. - Note that this macro is g++ specific (FIXME). */ - + names. If you leave out the parenthesis here you will lose! */ #define OPNAME_PREFIX_P(NAME) \ - ((NAME)[0] == 'o' && (NAME)[1] == 'p' && is_cplus_marker ((NAME)[2])) + (!strncmp (NAME, "operator", 8)) /* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl names. Note that this macro is g++ specific (FIXME). -- 2.30.2