mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 09:38:57 +00:00
Fix completer.c FIXME, and invalid pointer to pointer conversion.
As mentioned in the previous patch, I grepped for "\*\*) &" and found one hit in completer.c. I was about to post a patch that simply made current_demangling_style_string const, and cast away constness at the xfree site. However, looking deeper, it seem to be there's a lot of dead code in the file. First, all external callers of set_demangling_style are found in the stabs reader, commented out for over 12 years: http://sourceware.org/ml/gdb-patches/2000-12/msg00214.html I don't think it's likely we'll ever make the older mangling schemes work for stabs. If we do, we can rediscuss the approach then. Then, set_demangling_command has special handling for unknown demangling styles, but "set demangle-style" is an enum command, and with those, the user can only specify a known enumeration value, by design: (gdb) set demangle-style gangnam-style Undefined item: "gangnam-style". This patch removes all that dead code, then makes current_demangling_style_string point to an element of demangling_style_names, as the FIXME suggests, and then makes current_demangling_style_string, removing the need for the 'const char **' cast. gdb/ 2013-03-13 Pedro Alves <palves@redhat.com> * dbxread.c (read_ofile_symtab, process_one_symbol): Remove commented out code. * demangle.c (current_demangling_style_string): Make it const. (set_demangling_command): Assert the demangling style is known. Remove all handling of unknown styles. Set 'current_demangling_style_string' to an element of the demangling_style_names array. (set_demangling_style): Delete. (_initialize_demangler): Set current_demangling_style_string to the element of the demangling_style_names array that corresponds to the default demangling style. Remove FIXME note. Don't call set_demangling_style. * gdb-demangle.h (set_demangling_style): Remove declaration.
This commit is contained in:
@@ -72,7 +72,7 @@ show_asm_demangle (struct ui_file *file, int from_tty,
|
||||
"set demangle-style" command, printed as part of the output by the
|
||||
"show demangle-style" command. */
|
||||
|
||||
static char *current_demangling_style_string;
|
||||
static const char *current_demangling_style_string;
|
||||
|
||||
/* The array of names of the known demanglyng styles. Generated by
|
||||
_initialize_demangler from libiberty_demanglers[] array. */
|
||||
@@ -106,13 +106,14 @@ static void
|
||||
set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
{
|
||||
const struct demangler_engine *dem;
|
||||
int i;
|
||||
|
||||
/* First just try to match whatever style name the user supplied with
|
||||
one of the known ones. Don't bother special casing for an empty
|
||||
name, we just treat it as any other style name that doesn't match.
|
||||
If we match, update the current demangling style enum. */
|
||||
|
||||
for (dem = libiberty_demanglers;
|
||||
for (dem = libiberty_demanglers, i = 0;
|
||||
dem->demangling_style != unknown_demangling;
|
||||
dem++)
|
||||
{
|
||||
@@ -120,60 +121,15 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
dem->demangling_style_name) == 0)
|
||||
{
|
||||
current_demangling_style = dem->demangling_style;
|
||||
current_demangling_style_string = demangling_style_names[i];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Check to see if we found a match. If not, gripe about any non-empty
|
||||
style name and supply a list of valid ones. FIXME: This should
|
||||
probably be done with some sort of completion and with help. */
|
||||
|
||||
if (dem->demangling_style == unknown_demangling)
|
||||
{
|
||||
if (*current_demangling_style_string != '\0')
|
||||
{
|
||||
printf_unfiltered (_("Unknown demangling style `%s'.\n"),
|
||||
current_demangling_style_string);
|
||||
}
|
||||
printf_unfiltered (_("The currently understood settings are:\n\n"));
|
||||
for (dem = libiberty_demanglers;
|
||||
dem->demangling_style != unknown_demangling;
|
||||
dem++)
|
||||
{
|
||||
printf_unfiltered ("%-10s %s\n", dem->demangling_style_name,
|
||||
dem->demangling_style_doc);
|
||||
if (dem->demangling_style == current_demangling_style)
|
||||
{
|
||||
xfree (current_demangling_style_string);
|
||||
current_demangling_style_string =
|
||||
xstrdup (dem->demangling_style_name);
|
||||
}
|
||||
}
|
||||
if (current_demangling_style == unknown_demangling)
|
||||
{
|
||||
/* This can happen during initialization if gdb is compiled with
|
||||
a DEMANGLING_STYLE value that is unknown, so pick the first
|
||||
one as the default. */
|
||||
current_demangling_style = libiberty_demanglers[0].demangling_style;
|
||||
current_demangling_style_string =
|
||||
xstrdup (libiberty_demanglers[0].demangling_style_name);
|
||||
warning (_("`%s' style demangling chosen as the default."),
|
||||
current_demangling_style_string);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* See documentation in gdb-demangle.h. */
|
||||
|
||||
void
|
||||
set_demangling_style (char *style)
|
||||
{
|
||||
if (current_demangling_style_string != NULL)
|
||||
{
|
||||
xfree (current_demangling_style_string);
|
||||
}
|
||||
current_demangling_style_string = xstrdup (style);
|
||||
set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL);
|
||||
/* We should have found a match, given we only add known styles to
|
||||
the enumeration list. */
|
||||
gdb_assert (dem->demangling_style != unknown_demangling);
|
||||
}
|
||||
|
||||
/* G++ uses a special character to indicate certain internal names. Which
|
||||
@@ -204,7 +160,8 @@ _initialize_demangler (void)
|
||||
{
|
||||
int i, ndems;
|
||||
|
||||
/* Fill the demangling_style_names[] array. */
|
||||
/* Fill the demangling_style_names[] array, and set the default
|
||||
demangling style chosen at compilation time. */
|
||||
for (ndems = 0;
|
||||
libiberty_demanglers[ndems].demangling_style != unknown_demangling;
|
||||
ndems++)
|
||||
@@ -213,8 +170,14 @@ _initialize_demangler (void)
|
||||
for (i = 0;
|
||||
libiberty_demanglers[i].demangling_style != unknown_demangling;
|
||||
i++)
|
||||
demangling_style_names[i] =
|
||||
xstrdup (libiberty_demanglers[i].demangling_style_name);
|
||||
{
|
||||
demangling_style_names[i]
|
||||
= xstrdup (libiberty_demanglers[i].demangling_style_name);
|
||||
|
||||
if (current_demangling_style_string == NULL
|
||||
&& strcmp (DEFAULT_DEMANGLING_STYLE, demangling_style_names[i]) == 0)
|
||||
current_demangling_style_string = demangling_style_names[i];
|
||||
}
|
||||
|
||||
add_setshow_boolean_cmd ("demangle", class_support, &demangle, _("\
|
||||
Set demangling of encoded C++/ObjC names when displaying symbols."), _("\
|
||||
@@ -230,20 +193,13 @@ Show demangling of C++/ObjC names in disassembly listings."), NULL,
|
||||
show_asm_demangle,
|
||||
&setprintlist, &showprintlist);
|
||||
|
||||
/* 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, _("\
|
||||
¤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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user