aboutsummaryrefslogtreecommitdiff
path: root/gdb/demangle.c
diff options
context:
space:
mode:
authorDoug Evans <xdje42@gmail.com>2015-01-11 14:06:34 -0800
committerDoug Evans <xdje42@gmail.com>2015-01-11 14:06:34 -0800
commit439250fbacfc212a5959b4b5a53ecfee91dfb866 (patch)
treed8ca359220a4a15371412276967646212eb490f9 /gdb/demangle.c
parentebf3aa72243fec4bc02617673b243a63050e6127 (diff)
downloadgdb-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.c82
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);
}