This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: turn SYMBOL_INIT_MANGLED_NAME into a function
- From: Jim Blandy <jimb at redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Wed, 27 Mar 2002 18:11:25 -0500 (EST)
- Subject: PATCH: turn SYMBOL_INIT_MANGLED_NAME into a function
I've committed the following:
2002-03-08 Jim Blandy <jimb@redhat.com>
* symtab.h (SYMBOL_INIT_MANGLED_NAME): Turn this macro's body into
a function; leave this macro here to invoke that function.
(symbol_init_mangled_name): Declaration for that function.
* symtab.c (symbol_init_mangled_name): New function.
Index: gdb/symtab.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/symtab.c,v
retrieving revision 1.257
diff -c -r1.257 symtab.c
*** gdb/symtab.c 2001/11/15 03:52:42 1.257
--- gdb/symtab.c 2002/03/08 19:20:55
***************
*** 298,303 ****
--- 298,380 ----
strcat (mangled_name, physname);
return (mangled_name);
}
+
+
+ /* Initialize a symbol's mangled name. */
+
+ /* Try to initialize the demangled name for a symbol, based on the
+ language of that symbol. If the language is set to language_auto,
+ it will attempt to find any demangling algorithm that works and
+ then set the language appropriately. If no demangling of any kind
+ is found, the language is set back to language_unknown, so we can
+ avoid doing this work again the next time we encounter the symbol.
+ Any required space to store the name is obtained from the specified
+ obstack. */
+
+ void
+ symbol_init_demangled_name (struct general_symbol_info *gsymbol,
+ struct obstack *obstack)
+ {
+ char *mangled = gsymbol->name;
+ char *demangled = NULL;
+
+ if (gsymbol->language == language_unknown)
+ gsymbol->language = language_auto;
+ if (gsymbol->language == language_cplus
+ || gsymbol->language == language_auto)
+ {
+ demangled =
+ cplus_demangle (gsymbol->name, DMGL_PARAMS | DMGL_ANSI);
+ if (demangled != NULL)
+ {
+ gsymbol->language = language_cplus;
+ gsymbol->language_specific.cplus_specific.demangled_name =
+ obsavestring (demangled, strlen (demangled), obstack);
+ xfree (demangled);
+ }
+ else
+ {
+ gsymbol->language_specific.cplus_specific.demangled_name = NULL;
+ }
+ }
+ if (gsymbol->language == language_java)
+ {
+ demangled =
+ cplus_demangle (gsymbol->name,
+ DMGL_PARAMS | DMGL_ANSI | DMGL_JAVA);
+ if (demangled != NULL)
+ {
+ gsymbol->language = language_java;
+ gsymbol->language_specific.cplus_specific.demangled_name =
+ obsavestring (demangled, strlen (demangled), obstack);
+ xfree (demangled);
+ }
+ else
+ {
+ gsymbol->language_specific.cplus_specific.demangled_name = NULL;
+ }
+ }
+ if (demangled == NULL
+ && (gsymbol->language == language_chill
+ || gsymbol->language == language_auto))
+ {
+ demangled =
+ chill_demangle (gsymbol->name);
+ if (demangled != NULL)
+ {
+ gsymbol->language = language_chill;
+ gsymbol->language_specific.chill_specific.demangled_name =
+ obsavestring (demangled, strlen (demangled), obstack);
+ xfree (demangled);
+ }
+ else
+ {
+ gsymbol->language_specific.chill_specific.demangled_name = NULL;
+ }
+ }
+ }
+
+
Index: gdb/symtab.h
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/symtab.h,v
retrieving revision 1.165
diff -c -r1.165 symtab.h
*** gdb/symtab.h 2001/10/15 22:15:53 1.165
--- gdb/symtab.h 2002/03/08 19:20:56
***************
*** 159,232 ****
} \
} while (0)
! /* Macro that attempts to initialize the demangled name for a symbol,
! based on the language of that symbol. If the language is set to
! language_auto, it will attempt to find any demangling algorithm
! that works and then set the language appropriately. If no demangling
! of any kind is found, the language is set back to language_unknown,
! so we can avoid doing this work again the next time we encounter
! the symbol. Any required space to store the name is obtained from the
! specified obstack. */
! #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) \
! { \
! demangled = \
! cplus_demangle (SYMBOL_NAME (symbol), DMGL_PARAMS | DMGL_ANSI);\
! if (demangled != NULL) \
! { \
! SYMBOL_LANGUAGE (symbol) = language_cplus; \
! SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = \
! obsavestring (demangled, strlen (demangled), (obstack)); \
! xfree (demangled); \
! } \
! else \
! { \
! SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \
! } \
! } \
! if (SYMBOL_LANGUAGE (symbol) == language_java) \
! { \
! demangled = \
! cplus_demangle (SYMBOL_NAME (symbol), \
! DMGL_PARAMS | DMGL_ANSI | DMGL_JAVA); \
! if (demangled != NULL) \
! { \
! SYMBOL_LANGUAGE (symbol) = language_java; \
! SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = \
! obsavestring (demangled, strlen (demangled), (obstack)); \
! xfree (demangled); \
! } \
! else \
! { \
! SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \
! } \
! } \
! if (demangled == NULL \
! && (SYMBOL_LANGUAGE (symbol) == language_chill \
! || SYMBOL_LANGUAGE (symbol) == language_auto)) \
! { \
! demangled = \
! chill_demangle (SYMBOL_NAME (symbol)); \
! if (demangled != NULL) \
! { \
! SYMBOL_LANGUAGE (symbol) = language_chill; \
! SYMBOL_CHILL_DEMANGLED_NAME (symbol) = \
! obsavestring (demangled, strlen (demangled), (obstack)); \
! xfree (demangled); \
! } \
! else \
! { \
! SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL; \
! } \
! } \
! } while (0)
!
/* Macro that returns the demangled name for a symbol based on the language
for that symbol. If no demangled name exists, returns NULL. */
--- 159,170 ----
} \
} while (0)
! #define SYMBOL_INIT_DEMANGLED_NAME(symbol,obstack) \
! (symbol_init_demangled_name (&symbol->ginfo, (obstack)))
! extern void symbol_init_demangled_name (struct general_symbol_info *symbol,
! struct obstack *obstack);
!
/* Macro that returns the demangled name for a symbol based on the language
for that symbol. If no demangled name exists, returns NULL. */