/* Basic C++ demangling support for GDB.
- Copyright 1991, 1992, 1996, 1999 Free Software Foundation, Inc.
+
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ 2003, 2007 Free Software Foundation, Inc.
+
Written by Fred Fish at Cygnus Support.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
/* This file contains support code for C++ demangling that is common
static char *current_demangling_style_string;
+/* The array of names of the known demanglyng styles. Generated by
+ _initialize_demangler from libiberty_demanglers[] array. */
+
+static const char **demangling_style_names;
+static void
+show_demangling_style_names(struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("The current C++ demangling style is \"%s\".\n"),
+ value);
+}
+
+
static void set_demangling_command (char *, int, struct cmd_list_element *);
/* Set current demangling style. Called by the "set demangle-style"
dem->demangling_style != unknown_demangling;
dem++)
{
- if (STREQ (current_demangling_style_string,
- dem->demangling_style_name))
+ if (strcmp (current_demangling_style_string,
+ dem->demangling_style_name) == 0)
{
current_demangling_style = dem->demangling_style;
break;
{
if (*current_demangling_style_string != '\0')
{
- printf_unfiltered ("Unknown demangling style `%s'.\n",
+ printf_unfiltered (_("Unknown demangling style `%s'.\n"),
current_demangling_style_string);
}
- printf_unfiltered ("The currently understood settings are:\n\n");
+ printf_unfiltered (_("The currently understood settings are:\n\n"));
for (dem = libiberty_demanglers;
dem->demangling_style != unknown_demangling;
dem++)
dem->demangling_style_doc);
if (dem->demangling_style == current_demangling_style)
{
- free (current_demangling_style_string);
+ xfree (current_demangling_style_string);
current_demangling_style_string =
savestring (dem->demangling_style_name,
strlen (dem->demangling_style_name));
savestring (
libiberty_demanglers[0].demangling_style_name,
strlen (libiberty_demanglers[0].demangling_style_name));
- warning ("`%s' style demangling chosen as the default.\n",
+ warning (_("`%s' style demangling chosen as the default."),
current_demangling_style_string);
}
}
{
if (current_demangling_style_string != NULL)
{
- free (current_demangling_style_string);
+ xfree (current_demangling_style_string);
}
current_demangling_style_string = savestring (style, strlen (style));
set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL);
}
-/* In order to allow a single demangler executable to demangle strings
- using various common values of CPLUS_MARKER, as well as any specific
- one set at compile time, we maintain a string containing all the
- commonly used ones, and check to see if the marker we are looking for
- is in that string. CPLUS_MARKER is usually '$' on systems where the
- assembler can deal with that. Where the assembler can't, it's usually
- '.' (but on many systems '.' is used for other things). We put the
- current defined CPLUS_MARKER first (which defaults to '$'), followed
- by the next most common value, followed by an explicit '$' in case
- the value of CPLUS_MARKER is not '$'.
-
- We could avoid this if we could just get g++ to tell us what the actual
- cplus marker character is as part of the debug information, perhaps by
- ensuring that it is the character that terminates the gcc<n>_compiled
- marker symbol (FIXME). */
-
-static char cplus_markers[] =
-{CPLUS_MARKER, '.', '$', '\0'};
+/* G++ uses a special character to indicate certain internal names. Which
+ character it is depends on the platform:
+ - Usually '$' on systems where the assembler will accept that
+ - Usually '.' otherwise (this includes most sysv4-like systems and most
+ ELF targets)
+ - Occasionally '_' if neither of the above is usable
+
+ We check '$' first because it is the safest, and '.' often has another
+ meaning. We don't currently try to handle '_' because the precise forms
+ of the names are different on those targets. */
+
+static char cplus_markers[] = {'$', '.', '\0'};
int
is_cplus_marker (int c)
_initialize_demangler (void)
{
struct cmd_list_element *set, *show;
-
- set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
- (char *) ¤t_demangling_style_string,
- "Set the current C++ demangling style.\n\
-Use `set demangle-style' without arguments for a list of demangling styles.",
- &setlist);
- show = add_show_from_set (set, &showlist);
- set->function.sfunc = set_demangling_command;
+ int i, ndems;
+
+ /* Fill the demangling_style_names[] array. */
+ for (ndems = 0;
+ libiberty_demanglers[ndems].demangling_style != unknown_demangling;
+ ndems++)
+ ;
+ demangling_style_names = xcalloc (ndems + 1, sizeof (char *));
+ for (i = 0;
+ libiberty_demanglers[i].demangling_style != unknown_demangling;
+ i++)
+ demangling_style_names[i] =
+ xstrdup (libiberty_demanglers[i].demangling_style_name);
+
+ /* FIXME: cagney/2005-02-20: The code implementing this variable are
+ malloc-ing and free-ing current_demangling_style_string when it
+ should instead just point to an element of
+ demangling_style_names. */
+ add_setshow_enum_cmd ("demangle-style", class_support,
+ demangling_style_names,
+ (const char **) ¤t_demangling_style_string, _("\
+Set the current C++ demangling style."), _("\
+Show the current C++ demangling style."), _("\
+Use `set demangle-style' without arguments for a list of demangling styles."),
+ set_demangling_command,
+ show_demangling_style_names,
+ &setlist, &showlist);
/* Set the default demangling style chosen at compilation time. */
set_demangling_style (DEFAULT_DEMANGLING_STYLE);
- set_cplus_marker_for_demangling (CPLUS_MARKER);
}