1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / demangle.c
index 4abc84c86ac09154358dc705705d29570a314fc0..9c5e521d928a4c8d0f04ca5a30cc629bea89de8b 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
@@ -31,7 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* 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", etc.) in which case gdb will never attempt to do auto
+   "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. */
@@ -67,9 +67,18 @@ static const struct demangler
   {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}
 };
 
+static void
+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.
@@ -159,7 +168,32 @@ set_demangling_style (style)
       free (current_demangling_style_string);
     }
   current_demangling_style_string = savestring (style, strlen (style));
-  set_demangling_command ((char *) NULL, 0);
+  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
This page took 0.02428 seconds and 4 git commands to generate.