/* Basic C++ demangling support for GDB.
- Copyright 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1991, 1992, 1996 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* This file contains support code for C++ demangling that is common
#include "command.h"
#include "gdbcmd.h"
#include "demangle.h"
-#include <string.h>
+#include "gdb_string.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",
- "lucid", "cfront", etc.) in which case gdb will never attempt to do auto
+ "lucid", "arm", etc.) in which case gdb will never attempt to do auto
selection of the style unless you do an explicit "set demangle auto".
To select one of these as the default, set DEFAULT_DEMANGLING_STYLE in
the appropriate target configuration file. */
# define DEFAULT_DEMANGLING_STYLE AUTO_DEMANGLING_STYLE_STRING
#endif
-/* The current demangling style in affect. Global so that the demangler
- can read it (FIXME: change the interface) */
-
-enum demangling_styles current_demangling_style;
-
/* String name for the current demangling style. Set by the "set demangling"
command, printed as part of the output by the "show demangling" command. */
{LUCID_DEMANGLING_STYLE_STRING,
lucid_demangling,
"Lucid (lcc) style demangling"},
- {CFRONT_DEMANGLING_STYLE_STRING,
- cfront_demangling,
- "ARM (cfront) style demangling"},
- {NULL, 0, NULL}
+ {ARM_DEMANGLING_STYLE_STRING,
+ arm_demangling,
+ "ARM style demangling"},
+ {NULL, unknown_demangling, NULL}
};
-/* show current demangling style. */
-
-static void
-show_demangling_command (ignore, from_tty)
- char *ignore;
- int from_tty;
-{
- /* done automatically by show command. */
-}
-
-
/* set current demangling style. called by the "set demangling" command
after it has updated the current_demangling_style_string to match
what the user has entered.
a malloc'd string, even if it is a null-string. */
static void
-set_demangling_command (ignore, from_tty)
- char *ignore;
- int from_tty;
+set_demangling_command (ignore, from_tty, c)
+ char *ignore;
+ int from_tty;
+ struct cmd_list_element *c;
{
const struct demangler *dem;
for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
{
- if (strcmp (current_demangling_style_string,
- dem -> demangling_style_name) == 0)
+ if (STREQ (current_demangling_style_string,
+ dem -> demangling_style_name))
{
current_demangling_style = dem -> demangling_style;
break;
{
if (*current_demangling_style_string != '\0')
{
- printf ("Unknown demangling style `%s'.\n",
+ printf_unfiltered ("Unknown demangling style `%s'.\n",
current_demangling_style_string);
}
- printf ("The currently understood settings are:\n\n");
+ printf_unfiltered ("The currently understood settings are:\n\n");
for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
{
- printf ("%-10s %s\n", dem -> demangling_style_name,
+ printf_unfiltered ("%-10s %s\n", dem -> demangling_style_name,
dem -> demangling_style_doc);
if (dem -> demangling_style == current_demangling_style)
{
free (current_demangling_style_string);
current_demangling_style_string =
- strdup (dem -> demangling_style_name);
+ savestring (dem -> demangling_style_name,
+ strlen (dem -> demangling_style_name));
}
}
if (current_demangling_style == unknown_demangling)
one as the default. */
current_demangling_style = demanglers[0].demangling_style;
current_demangling_style_string =
- strdup (demanglers[0].demangling_style_name);
+ savestring (demanglers[0].demangling_style_name,
+ strlen (demanglers[0].demangling_style_name));
warning ("`%s' style demangling chosen as the default.\n",
current_demangling_style_string);
}
{
free (current_demangling_style_string);
}
- current_demangling_style_string = strdup (style);
+ current_demangling_style_string = savestring (style, strlen (style));
set_demangling_command ((char *) NULL, 0);
}
+/* 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' };
+
+int
+is_cplus_marker (c)
+ int c;
+{
+ return c && strchr (cplus_markers, c) != NULL;
+}
+
void
_initialize_demangler ()
{
set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
(char *) ¤t_demangling_style_string,
- "Set the current C++ demangling style.",
+ "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.cfunc = set_demangling_command;
- show -> function.cfunc = show_demangling_command;
+ set -> function.sfunc = set_demangling_command;
/* Set the default demangling style chosen at compilation time. */
set_demangling_style (DEFAULT_DEMANGLING_STYLE);
+ set_cplus_marker_for_demangling (CPLUS_MARKER);
}