mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
PR gdb/15830
gdb/ChangeLog: PR gdb/15830 * NEWS: The "maint demangle" command is renamed as "demangle". * demangle.c: #include cli/cli-utils.h, language.h. (demangle_command): New function. (_initialize_demangle): Add new command "demangle". * maint.c (maintenance_demangle): Stub out. (_initialize_maint_cmds): Update help text for "maint demangle", and mark as deprecated. gdb/doc/ChangeLog: * gdb.texinfo (Debugging C Plus Plus): Mention "demangle". (Symbols): Ditto. (Maintenance Commands): Delete docs for "maint demangle". gdb/testsuite/ChangeLog: * gdb.base/maint.exp: Remove references to "maint demangle". * gdb.cp/demangle.exp: Update. "maint demangle" -> "demangle". Add tests for explicitly specifying language to demangle. * gdb.dlang/demangle.exp: Ditto.
This commit is contained in:
@@ -24,10 +24,13 @@
|
||||
to a styles of demangling, and GDB specific. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "cli/cli-utils.h" /* for skip_to_space */
|
||||
#include "command.h"
|
||||
#include "gdbcmd.h"
|
||||
#include "demangle.h"
|
||||
#include "gdb-demangle.h"
|
||||
#include "language.h"
|
||||
|
||||
/* Select the default C++ demangling style to use. The default is "auto",
|
||||
which allows gdb to attempt to pick an appropriate demangling style for
|
||||
the executable it has loaded. It can be set to a specific style ("gnu",
|
||||
@@ -40,6 +43,8 @@
|
||||
#define DEFAULT_DEMANGLING_STYLE AUTO_DEMANGLING_STYLE_STRING
|
||||
#endif
|
||||
|
||||
static void demangle_command (char *, int);
|
||||
|
||||
/* See documentation in gdb-demangle.h. */
|
||||
int demangle = 1;
|
||||
|
||||
@@ -151,6 +156,77 @@ is_cplus_marker (int c)
|
||||
return c && strchr (cplus_markers, c) != NULL;
|
||||
}
|
||||
|
||||
/* Demangle the given string in the current language. */
|
||||
|
||||
static void
|
||||
demangle_command (char *args, int from_tty)
|
||||
{
|
||||
char *demangled, *name, *lang_name = NULL;
|
||||
char *arg_buf, *arg_start;
|
||||
int processing_args = 1;
|
||||
const struct language_defn *lang;
|
||||
struct cleanup *cleanups;
|
||||
|
||||
arg_buf = xstrdup (args != NULL ? args : "");
|
||||
cleanups = make_cleanup (xfree, arg_buf);
|
||||
arg_start = arg_buf;
|
||||
|
||||
while (processing_args
|
||||
&& *arg_start == '-')
|
||||
{
|
||||
char *p = skip_to_space (arg_start);
|
||||
|
||||
if (strncmp (arg_start, "-l", p - arg_start) == 0)
|
||||
{
|
||||
char *lang_name_end;
|
||||
|
||||
lang_name = skip_spaces (p);
|
||||
lang_name_end = skip_to_space (lang_name);
|
||||
lang_name = savestring (lang_name, lang_name_end - lang_name);
|
||||
make_cleanup (xfree, lang_name);
|
||||
p = lang_name_end;
|
||||
}
|
||||
else if (strncmp (arg_start, "--", p - arg_start) == 0)
|
||||
processing_args = 0;
|
||||
else
|
||||
{
|
||||
*p = '\0';
|
||||
error (_("Unrecognized option '%s' to demangle command. "
|
||||
"Try \"help demangle\"."), arg_start);
|
||||
}
|
||||
|
||||
arg_start = skip_spaces (p);
|
||||
}
|
||||
|
||||
name = arg_start;
|
||||
|
||||
if (*name == '\0')
|
||||
error (_("Usage: demangle [-l language] [--] name"));
|
||||
|
||||
if (lang_name != NULL)
|
||||
{
|
||||
enum language lang_enum;
|
||||
|
||||
lang_enum = language_enum (lang_name);
|
||||
if (lang_enum == language_unknown)
|
||||
error (_("Unknown language \"%s\""), lang_name);
|
||||
lang = language_def (lang_enum);
|
||||
}
|
||||
else
|
||||
lang = current_language;
|
||||
|
||||
demangled = language_demangle (lang, name, DMGL_ANSI | DMGL_PARAMS);
|
||||
if (demangled != NULL)
|
||||
{
|
||||
printf_filtered ("%s\n", demangled);
|
||||
xfree (demangled);
|
||||
}
|
||||
else
|
||||
error (_("Can't demangle \"%s\""), name);
|
||||
|
||||
do_cleanups (cleanups);
|
||||
}
|
||||
|
||||
extern initialize_file_ftype _initialize_demangler; /* -Wmissing-prototypes */
|
||||
|
||||
void
|
||||
@@ -200,4 +276,10 @@ Use `set demangle-style' without arguments for a list of demangling styles."),
|
||||
set_demangling_command,
|
||||
show_demangling_style_names,
|
||||
&setlist, &showlist);
|
||||
|
||||
add_cmd ("demangle", class_support, demangle_command, _("\
|
||||
Demangle a mangled name.\n\
|
||||
Usage: demangle [-l language] [--] name\n\
|
||||
If LANGUAGE is not specified, NAME is demangled in the current language."),
|
||||
&cmdlist);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user