* config/tc-m32r.c (md_parse_option): Delete unrecognized option
[deliverable/binutils-gdb.git] / gdb / demangle.c
index 971085637eefb1aec08b46b8a2177c684c6aeea2..29174f5f956731172a8b1d4691ec5bf0471b1530 100644 (file)
 /* Basic C++ demangling support for GDB.
-   Copyright 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1996, 1999 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-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.  */
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 
 /*  This file contains support code for C++ demangling that is common
-    to a styles of demangling, and GDB specific. */
+   to a styles of demangling, and GDB specific. */
 
 #include "defs.h"
 #include "command.h"
 #include "gdbcmd.h"
 #include "demangle.h"
-#include <string.h>
-
-#ifndef DEMANGLING_STYLE
-# define DEMANGLING_STYLE AUTO_DEMANGLING_STYLE_STRING
+#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", "arm", "hp", 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. */
+
+#ifndef DEFAULT_DEMANGLING_STYLE
+#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;
+extern void _initialize_demangler PARAMS ((void));
 
-/* String name for the current demangling style.  Set by the "set demangling"
-   command, printed as part of the output by the "show demangling" command. */
+/* String name for the current demangling style.  Set by the
+   "set demangle-style" command, printed as part of the output by the
+   "show demangle-style" command. */
 
 static char *current_demangling_style_string;
 
 /* List of supported demangling styles.  Contains the name of the style as
    seen by the user, and the enum value that corresponds to that style. */
-   
+
 static const struct demangler
+  {
+    char *demangling_style_name;
+    enum demangling_styles demangling_style;
+    char *demangling_style_doc;
+  }
+demanglers[] =
 {
-  char *demangling_style_name;
-  enum demangling_styles demangling_style;
-  char *demangling_style_doc;
-} demanglers [] =
-{
-  {AUTO_DEMANGLING_STYLE_STRING,
-     auto_demangling,
-     "Automatic selection based on executable"},
-  {GNU_DEMANGLING_STYLE_STRING,
-     gnu_demangling,
-     "GNU (g++) style demangling"},
-  {LUCID_DEMANGLING_STYLE_STRING,
-     lucid_demangling,
-     "Lucid (lcc) style demangling"},
-  {CFRONT_DEMANGLING_STYLE_STRING,
-     cfront_demangling,
-     "ARM (cfront) style demangling"},
-  {NULL, 0, NULL}
+  {
+    AUTO_DEMANGLING_STYLE_STRING,
+      auto_demangling,
+      "Automatic selection based on executable"
+  }
+  ,
+  {
+    GNU_DEMANGLING_STYLE_STRING,
+      gnu_demangling,
+      "GNU (g++) style demangling"
+  }
+  ,
+  {
+    LUCID_DEMANGLING_STYLE_STRING,
+      lucid_demangling,
+      "Lucid (lcc) style demangling"
+  }
+  ,
+  {
+    ARM_DEMANGLING_STYLE_STRING,
+      arm_demangling,
+      "ARM style demangling"
+  }
+  ,
+  {
+    HP_DEMANGLING_STYLE_STRING,
+      hp_demangling,
+      "HP (aCC) style demangling"
+  }
+  ,
+  {
+    EDG_DEMANGLING_STYLE_STRING,
+      edg_demangling,
+      "EDG 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_demangling_command PARAMS ((char *, int, struct cmd_list_element *));
 
-/* 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.
+/* Set current demangling style.  Called by the "set demangle-style"
+   command after it has updated the current_demangling_style_string to
+   match what the user has entered.
 
-   if the user has entered a string that matches a known demangling style
+   If the user has entered a string that matches a known demangling style
    name in the demanglers[] array then just leave the string alone and update
    the current_demangling_style enum value to match.
 
-   if the user has entered a string that doesn't match, including an empty
+   If the user has entered a string that doesn't match, including an empty
    string, then print a list of the currently known styles and restore
    the current_demangling_style_string to match the current_demangling_style
    enum value.
@@ -95,23 +121,24 @@ show_demangling_command (ignore, from_tty)
    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;
 
   /*  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. */
+     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 = demanglers; dem -> demangling_style_name != NULL; 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;
+         current_demangling_style = dem->demangling_style;
          break;
        }
     }
@@ -120,23 +147,24 @@ set_demangling_command (ignore, from_tty)
      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_name == NULL)
+  if (dem->demangling_style_name == NULL)
     {
       if (*current_demangling_style_string != '\0')
        {
-         printf ("Unknown demangling style `%s'.\n",
-                 current_demangling_style_string);
+         printf_unfiltered ("Unknown demangling style `%s'.\n",
+                            current_demangling_style_string);
        }
-      printf ("The currently understood settings are:\n\n");
-      for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
+      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,
-                 dem -> demangling_style_doc);
-         if (dem -> demangling_style == current_demangling_style)
+         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)
@@ -146,14 +174,15 @@ set_demangling_command (ignore, from_tty)
             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);
        }
     }
 }
 
-/* Fake a "set demangling" command. */
+/* Fake a "set demangle-style" command. */
 
 void
 set_demangling_style (style)
@@ -163,23 +192,50 @@ set_demangling_style (style)
     {
       free (current_demangling_style_string);
     }
-  current_demangling_style_string = strdup (style);
-  set_demangling_command ((char *) NULL, 0);
+  current_demangling_style_string = savestring (style, strlen (style));
+  set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL);
+}
+
+/* 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 ()
 {
-   struct cmd_list_element *set, *show;
-
-   set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
-                     (char *) &current_demangling_style_string,
-                     "Set the current C++ demangling style.",
-                     &setlist);
-   show = add_show_from_set (set, &showlist);
-   set -> function.cfunc = set_demangling_command;
-   show -> function.cfunc = show_demangling_command;
-
-   /* Set the default demangling style chosen at compilation time. */
-   set_demangling_style (DEMANGLING_STYLE);
+  struct cmd_list_element *set, *show;
+
+  set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
+                    (char *) &current_demangling_style_string,
+                    "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.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);
 }
This page took 0.028285 seconds and 4 git commands to generate.