* cxxfilt.c: Treat mangled names specified on the command line in the same way
authorNick Clifton <nickc@redhat.com>
Tue, 4 Oct 2005 11:03:38 +0000 (11:03 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 4 Oct 2005 11:03:38 +0000 (11:03 +0000)
  as mangled names read from stdin.
  Add -i switch to disable the display of implementation details.
  Add -t switch to disable the demangling of types.
* NEWS: Mention the new switches.
* doc/binutils.texi (cxxfilt): Document the -i and -t switches.

binutils/ChangeLog
binutils/NEWS
binutils/cxxfilt.c
binutils/doc/binutils.texi

index f7171c8666965a0447789c50494ed373dce3d3f4..89c9c9f1fb75e7f9a383e4a192d0d14754608c09 100644 (file)
@@ -1,3 +1,12 @@
+2005-10-04  Nick Clifton  <nickc@redhat.com>
+
+       * cxxfilt.c: Treat mangled names specified on the command line in
+       the same way as mangled names read from stdin.
+       Add -i switch to disable the display of implementation details.
+       Add -t switch to disable the demangling of types.
+       * NEWS: Mention the new switches.
+       * doc/binutils.texi (cxxfilt): Document the -i and -t switches.
+
 2005-10-03  Mark Mitchell  <mark@codesourcery.com>
 
        * addr2line.c (usage): Document @file.
index 8312093d599a20f4e983d8d422a257437f32fd63..76c4dd760b5908b780105af6e370eaaac4241eec 100644 (file)
@@ -1,10 +1,17 @@
 -*- text -*-
 
+* Add -i and -t switches to cxxfilt.  -i disables the display of implementation
+  specific extra demangling information (if any) and -t disables the demangling
+  of types.
+
+* Add support for the "@<file>" syntax to the command lines of all tools, so
+  that extra switches can be read from <file>.
+
 * Add "-W/--dwarf" to objdump to display the contents of the DWARF
-debug sections.
+  debug sections.
 
 * Add "-t/--section-details" to readelf to display section details.
-"-N/--full-section-name" is deprecated.
+  "-N/--full-section-name" is deprecated.
 
 * powerpc-linux ld now supports a variant form of PLT and GOT for the security
   conscious.  This form will automatically be chosen when ld detects that all
index a0e0a0759404f8cb37207027379b31a9a278691d..bc692712dd1ea9d894b85666e72a471ad8d3ca77 100644 (file)
@@ -1,26 +1,26 @@
 /* Demangler for GNU C++ - main program
    Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
    Written by James Clark (jjc@jclark.uucp)
    Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
    Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
 
-This file is part of GCC.
+   This file is part of GCC.
 
-GCC 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, or (at your option) any later
-version.
+   GCC 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, or (at your option) any later
+   version.
 
-GCC 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.
+   GCC 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 GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
-02110-1301, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING.  If not, write to the Free
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 #include "config.h"
 #include "bfd.h"
@@ -30,26 +30,42 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
 #include "getopt.h"
 #include "safe-ctype.h"
 
-static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE | DMGL_TYPES;
+static int strip_underscore = TARGET_PREPENDS_UNDERSCORE;
 
-static void demangle_it (char *);
-static void usage (FILE *, int) ATTRIBUTE_NORETURN;
-static void print_demangler_list (FILE *);
+static const struct option long_options[] =
+{
+  {"strip-underscore", no_argument, NULL, '_'},
+  {"format", required_argument, NULL, 's'},
+  {"help", no_argument, NULL, 'h'},
+  {"no-params", no_argument, NULL, 'p'},
+  {"no-strip-underscores", no_argument, NULL, 'n'},
+  {"no-types", no_argument, NULL, 't'},
+  {"no-verbose", no_argument, NULL, 'i'},
+  {"version", no_argument, NULL, 'v'},
+  {NULL, no_argument, NULL, 0}
+};
 
 static void
 demangle_it (char *mangled_name)
 {
   char *result;
+  unsigned int skip_first = 0;
+
+  if (mangled_name[0] == '.' || mangled_name[0] == '$')
+    ++skip_first;
+  if (strip_underscore && mangled_name[skip_first] == '_')
+    ++skip_first;
+
+  result = cplus_demangle (mangled_name + skip_first, flags);
 
-  /* For command line args, also try to demangle type encodings.  */
-  result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
   if (result == NULL)
-    {
-      printf ("%s\n", mangled_name);
-    }
+    puts (mangled_name);
   else
     {
-      printf ("%s\n", result);
+      if (mangled_name[0] == '.')
+       putchar ('.');
+      puts (result);
       free (result);
     }
 }
@@ -73,43 +89,32 @@ static void
 usage (FILE *stream, int status)
 {
   fprintf (stream, "\
-Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores]\n\
-       [-p] [--no-params]\n",
-          program_name);
-
+Usage: %s [options] [mangled names]\n", program_name);
   fprintf (stream, "\
-       [-s ");
-  print_demangler_list (stream);
-  fprintf (stream, "]\n");
-
+Options are:\n\
+  [-_|--strip-underscore]     Ignore first leading underscore%s\n",
+          TARGET_PREPENDS_UNDERSCORE ? " (default)" : "");
+  fprintf (stream, "\
+  [-n|--no-strip-underscore]  Do not ignore a leading underscore%s\n",
+          TARGET_PREPENDS_UNDERSCORE ? "" : " (default)");
   fprintf (stream, "\
-       [--format ");
+  [-p|--no-params]            Do not display function arguments\n\
+  [-t|--no-types]             Do not try to demangle type encodings\n\
+  [-i|--no-verbose]           Do not show implementation details (if any)\n\
+  [-s|--format ");
   print_demangler_list (stream);
   fprintf (stream, "]\n");
 
   fprintf (stream, "\
-       [@file] [--help] [--version] [arg...]\n");
+  [@<file>]                   Read extra options from <file>\n\
+  [-h|--help]                 Display this information\n\
+  [-v|--version]              Show the version information\n\
+Demangled names are displayed to stdout.\n\
+If a name cannot be demangled it is just echoed to stdout.\n\
+If no names are provided on the command line, stdin is read.\n");
   exit (status);
 }
 
-static char mbuffer[32767];
-
-int strip_underscore = 0;
-
-static const struct option long_options[] = {
-  {"strip-underscores", no_argument, 0, '_'},
-  {"format", required_argument, 0, 's'},
-  {"help", no_argument, 0, 'h'},
-  {"no-params", no_argument, 0, 'p'},
-  {"no-strip-underscores", no_argument, 0, 'n'},
-  {"version", no_argument, 0, 'v'},
-  {0, no_argument, 0, 0}
-};
-
-static const char *standard_symbol_characters (void);
-
-static const char *hp_symbol_characters (void);
-
 /* Return the string of non-alnum characters that may occur
    as a valid symbol component, in the standard assembler symbol
    syntax.  */
@@ -120,7 +125,6 @@ standard_symbol_characters (void)
   return "_$.";
 }
 
-
 /* Return the string of non-alnum characters that may occur
    as a valid symbol name component in an HP object file.
 
@@ -162,7 +166,6 @@ extern int main (int, char **);
 int
 main (int argc, char **argv)
 {
-  char *result;
   int c;
   const char *valid_symbols;
   enum demangling_styles style = auto_demangling;
@@ -172,9 +175,7 @@ main (int argc, char **argv)
 
   expandargv (&argc, &argv);
 
-  strip_underscore = TARGET_PREPENDS_UNDERSCORE;
-
-  while ((c = getopt_long (argc, argv, "_nps:", long_options, (int *) 0)) != EOF)
+  while ((c = getopt_long (argc, argv, "_hinps:tv", long_options, (int *) 0)) != EOF)
     {
       switch (c)
        {
@@ -189,24 +190,27 @@ main (int argc, char **argv)
        case 'p':
          flags &= ~ DMGL_PARAMS;
          break;
+       case 't':
+         flags &= ~ DMGL_TYPES;
+         break;
+       case 'i':
+         flags &= ~ DMGL_VERBOSE;
+         break;
        case 'v':
          print_version ("c++filt");
-         return (0);
+         return 0;
        case '_':
          strip_underscore = 1;
          break;
        case 's':
-         {
-           style = cplus_demangle_name_to_style (optarg);
-           if (style == unknown_demangling)
-             {
-               fprintf (stderr, "%s: unknown demangling style `%s'\n",
-                        program_name, optarg);
-               return (1);
-             }
-           else
-             cplus_demangle_set_style (style);
-         }
+         style = cplus_demangle_name_to_style (optarg);
+         if (style == unknown_demangling)
+           {
+             fprintf (stderr, "%s: unknown demangling style `%s'\n",
+                      program_name, optarg);
+             return 1;
+           }
+         cplus_demangle_set_style (style);
          break;
        }
     }
@@ -214,79 +218,57 @@ main (int argc, char **argv)
   if (optind < argc)
     {
       for ( ; optind < argc; optind++)
-       {
-         demangle_it (argv[optind]);
-       }
+       demangle_it (argv[optind]);
+
+      return 0;
     }
-  else
+
+  switch (current_demangling_style)
     {
-      switch (current_demangling_style)
+    case gnu_demangling:
+    case lucid_demangling:
+    case arm_demangling:
+    case java_demangling:
+    case edg_demangling:
+    case gnat_demangling:
+    case gnu_v3_demangling:
+    case auto_demangling:
+      valid_symbols = standard_symbol_characters ();
+      break;
+    case hp_demangling:
+      valid_symbols = hp_symbol_characters ();
+      break;
+    default:
+      /* Folks should explicitly indicate the appropriate alphabet for
+        each demangling.  Providing a default would allow the
+        question to go unconsidered.  */
+      fatal ("Internal error: no symbol alphabet for current style");
+    }
+
+  for (;;)
+    {
+      static char mbuffer[32767];
+      unsigned i = 0;
+
+      c = getchar ();
+      /* Try to read a mangled name.  */
+      while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
        {
-       case gnu_demangling:
-       case lucid_demangling:
-       case arm_demangling:
-       case java_demangling:
-       case edg_demangling:
-       case gnat_demangling:
-       case gnu_v3_demangling:
-       case auto_demangling:
-         valid_symbols = standard_symbol_characters ();
-         break;
-       case hp_demangling:
-         valid_symbols = hp_symbol_characters ();
-         break;
-       default:
-         /* Folks should explicitly indicate the appropriate alphabet for
-            each demangling.  Providing a default would allow the
-            question to go unconsidered.  */
-         fatal ("Internal error: no symbol alphabet for current style");
+         if (i >= sizeof (mbuffer) - 1)
+           break;
+         mbuffer[i++] = c;
+         c = getchar ();
        }
 
-      for (;;)
+      if (i > 0)
        {
-         unsigned i = 0;
-         c = getchar ();
-         /* Try to read a label.  */
-         while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
-           {
-             if (i >= sizeof (mbuffer) - 1)
-               break;
-             mbuffer[i++] = c;
-             c = getchar ();
-           }
-         if (i > 0)
-           {
-             unsigned skip_first = 0;
-
-             mbuffer[i] = 0;
-             if (mbuffer[0] == '.' || mbuffer[0] == '$')
-               ++skip_first;
-             if (strip_underscore && mbuffer[skip_first] == '_')
-               ++skip_first;
-
-             if (skip_first > i)
-               skip_first = i;
-
-             flags |= (int) style;
-             result = cplus_demangle (mbuffer + skip_first, flags);
-             if (result)
-               {
-                 if (mbuffer[0] == '.')
-                   putc ('.', stdout);
-                 fputs (result, stdout);
-                 free (result);
-               }
-             else
-               fputs (mbuffer, stdout);
-
-             fflush (stdout);
-           }
-         if (c == EOF)
-           break;
-         putchar (c);
+         mbuffer[i] = 0;
+         demangle_it (mbuffer);
          fflush (stdout);
        }
+      if (c == EOF)
+       break;
     }
 
-  return (0);
+  return 0;
 }
index 8c8e5dc8e446bf84a22176df44704d401918457a..fe7eb60c1058af3b7f05913674b6b4a5f63b73b2 100644 (file)
@@ -2397,9 +2397,10 @@ the Info entries for @file{binutils}.
 @smallexample
 @c man begin SYNOPSIS cxxfilt
 c++filt [@option{-_}|@option{--strip-underscores}]
-        [@option{-j}|@option{--java}]
         [@option{-n}|@option{--no-strip-underscores}]
         [@option{-p}|@option{--no-params}]
+        [@option{-t}|@option{--no-types}]
+        [@option{-i}|@option{--no-verbose}]
         [@option{-s} @var{format}|@option{--format=}@var{format}]
         [@option{--help}]  [@option{--version}]  [@var{symbol}@dots{}]
 @c man end
@@ -2420,9 +2421,9 @@ names into user-level names so that the linker can keep these overloaded
 functions from clashing.
 
 Every alphanumeric word (consisting of letters, digits, underscores,
-dollars, or periods) seen in the input is a potential label.  If the
-label decodes into a C++ name, the C++ name replaces the low-level
-name in the output.
+dollars, or periods) seen in the input is a potential mangled name.
+If the name decodes into a C++ name, the C++ name replaces the
+low-level name in the output.
 
 You can use @command{c++filt} to decipher individual symbols:
 
@@ -2460,6 +2461,16 @@ Do not remove the initial underscore.
 When demangling the name of a function, do not display the types of
 the function's parameters.
 
+@item -t
+@itemx --no-types
+Do not attempt to demangle types.  This is enabled by default, but it
+may not be desired if you are interested in mangled function names.
+
+@item -i
+@itemx --no-verbose
+Do not include implementation details (if any) in the demangled
+output.
+
 @item -s @var{format}
 @itemx --format=@var{format}
 @command{c++filt} can decode various methods of mangling, used by