diff options
author | Doug Evans <xdje42@gmail.com> | 2015-01-11 14:06:34 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2015-01-11 14:06:34 -0800 |
commit | 439250fbacfc212a5959b4b5a53ecfee91dfb866 (patch) | |
tree | d8ca359220a4a15371412276967646212eb490f9 /gdb/demangle.c | |
parent | ebf3aa72243fec4bc02617673b243a63050e6127 (diff) | |
download | gdb-439250fbacfc212a5959b4b5a53ecfee91dfb866.zip gdb-439250fbacfc212a5959b4b5a53ecfee91dfb866.tar.gz gdb-439250fbacfc212a5959b4b5a53ecfee91dfb866.tar.bz2 |
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.
Diffstat (limited to 'gdb/demangle.c')
-rw-r--r-- | gdb/demangle.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/gdb/demangle.c b/gdb/demangle.c index 7b5fa55..c0027be 100644 --- a/gdb/demangle.c +++ b/gdb/demangle.c @@ -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); } |