This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Make cxxfilt consistent


Hi Guys,

  I am applying the attached patch to fix the behaviour of the
  cxxfilt program.  At the moment mangled names read from the command
  line are treated differently to mangled names from from stdin.  In
  particular striping leading underscores (if requested or the
  default) is only performed for names from stdin, and the demangling
  of types is only performed for names provided on the command line.

  This patch fixes these problems, tidies up the code, improves the
  output with the --help switch to actually document the options, and
  it also adds two new switches:

    -t or --no-types    to turn off the demangling of types
                        (now on by default for both command line and
                        stdin)

    -i or --no-verbose  to turn off the display of implementation
                        details the demangled strings.

Cheers
  Nick

binutils/ChangeLog
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.

Index: binutils/NEWS
===================================================================
RCS file: /cvs/src/src/binutils/NEWS,v
retrieving revision 1.55
diff -c -3 -p -r1.55 NEWS
*** binutils/NEWS	3 Oct 2005 14:40:19 -0000	1.55
--- binutils/NEWS	4 Oct 2005 10:58:39 -0000
***************
*** 1,10 ****
  -*- text -*-
  
  * Add "-W/--dwarf" to objdump to display the contents of the DWARF
! debug sections.
  
  * Add "-t/--section-details" to readelf to display section details.
! "-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
--- 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.
  
  * Add "-t/--section-details" to readelf to display section details.
!   "-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: binutils/cxxfilt.c
===================================================================
RCS file: /cvs/src/src/binutils/cxxfilt.c,v
retrieving revision 1.8
diff -c -3 -p -r1.8 cxxfilt.c
*** binutils/cxxfilt.c	3 Oct 2005 19:37:44 -0000	1.8
--- binutils/cxxfilt.c	4 Oct 2005 10:58:39 -0000
***************
*** 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.
     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.
  
! 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.
! 
! 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"
--- 1,26 ----
  /* Demangler for GNU C++ - main program
     Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
!    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.
  
!    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.
! 
!    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"
*************** Software Foundation, 51 Franklin Street 
*** 30,55 ****
  #include "getopt.h"
  #include "safe-ctype.h"
  
! static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
  
! static void demangle_it (char *);
! static void usage (FILE *, int) ATTRIBUTE_NORETURN;
! static void print_demangler_list (FILE *);
  
  static void
  demangle_it (char *mangled_name)
  {
    char *result;
  
-   /* 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);
!     }
    else
      {
!       printf ("%s\n", result);
        free (result);
      }
  }
--- 30,71 ----
  #include "getopt.h"
  #include "safe-ctype.h"
  
! static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE | DMGL_TYPES;
! static int strip_underscore = TARGET_PREPENDS_UNDERSCORE;
  
! 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);
  
    if (result == NULL)
!     puts (mangled_name);
    else
      {
!       if (mangled_name[0] == '.')
! 	putchar ('.');
!       puts (result);
        free (result);
      }
  }
*************** static void
*** 73,115 ****
  usage (FILE *stream, int status)
  {
    fprintf (stream, "\
! Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores]\n\
!        [-p] [--no-params]\n",
! 	   program_name);
! 
    fprintf (stream, "\
!        [-s ");
!   print_demangler_list (stream);
!   fprintf (stream, "]\n");
! 
    fprintf (stream, "\
!        [--format ");
    print_demangler_list (stream);
    fprintf (stream, "]\n");
  
    fprintf (stream, "\
!        [@file] [--help] [--version] [arg...]\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.  */
--- 89,120 ----
  usage (FILE *stream, int status)
  {
    fprintf (stream, "\
! Usage: %s [options] [mangled names]\n", program_name);
    fprintf (stream, "\
! 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, "\
!   [-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>]                   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);
  }
  
  /* Return the string of non-alnum characters that may occur
     as a valid symbol component, in the standard assembler symbol
     syntax.  */
*************** standard_symbol_characters (void)
*** 120,126 ****
    return "_$.";
  }
  
- 
  /* Return the string of non-alnum characters that may occur
     as a valid symbol name component in an HP object file.
  
--- 125,130 ----
*************** extern int main (int, char **);
*** 162,168 ****
  int
  main (int argc, char **argv)
  {
-   char *result;
    int c;
    const char *valid_symbols;
    enum demangling_styles style = auto_demangling;
--- 166,171 ----
*************** main (int argc, char **argv)
*** 172,180 ****
  
    expandargv (&argc, &argv);
  
!   strip_underscore = TARGET_PREPENDS_UNDERSCORE;
! 
!   while ((c = getopt_long (argc, argv, "_nps:", long_options, (int *) 0)) != EOF)
      {
        switch (c)
  	{
--- 175,181 ----
  
    expandargv (&argc, &argv);
  
!   while ((c = getopt_long (argc, argv, "_hinps:tv", long_options, (int *) 0)) != EOF)
      {
        switch (c)
  	{
*************** main (int argc, char **argv)
*** 189,212 ****
  	case 'p':
  	  flags &= ~ DMGL_PARAMS;
  	  break;
  	case 'v':
  	  print_version ("c++filt");
! 	  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);
! 	  }
  	  break;
  	}
      }
--- 190,216 ----
  	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;
  	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;
! 	    }
! 	  cplus_demangle_set_style (style);
  	  break;
  	}
      }
*************** main (int argc, char **argv)
*** 214,292 ****
    if (optind < argc)
      {
        for ( ; optind < argc; optind++)
! 	{
! 	  demangle_it (argv[optind]);
! 	}
      }
!   else
      {
!       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 (;;)
  	{
! 	  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);
  	  fflush (stdout);
  	}
      }
  
!   return (0);
  }
--- 218,274 ----
    if (optind < argc)
      {
        for ( ; optind < argc; optind++)
! 	demangle_it (argv[optind]);
! 
!       return 0;
      }
! 
!   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)))
  	{
! 	  if (i >= sizeof (mbuffer) - 1)
! 	    break;
! 	  mbuffer[i++] = c;
  	  c = getchar ();
! 	}
  
!       if (i > 0)
! 	{
! 	  mbuffer[i] = 0;
! 	  demangle_it (mbuffer);
  	  fflush (stdout);
  	}
+       if (c == EOF)
+ 	break;
      }
  
!   return 0;
  }
Index: binutils/doc/binutils.texi
===================================================================
RCS file: /cvs/src/src/binutils/doc/binutils.texi,v
retrieving revision 1.79
diff -c -3 -p -r1.79 binutils.texi
*** binutils/doc/binutils.texi	3 Oct 2005 19:37:44 -0000	1.79
--- binutils/doc/binutils.texi	4 Oct 2005 10:58:41 -0000
*************** the Info entries for @file{binutils}.
*** 2397,2405 ****
  @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{-s} @var{format}|@option{--format=}@var{format}]
          [@option{--help}]  [@option{--version}]  [@var{symbol}@dots{}]
  @c man end
--- 2397,2406 ----
  @smallexample
  @c man begin SYNOPSIS cxxfilt
  c++filt [@option{-_}|@option{--strip-underscores}]
          [@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
*************** names into user-level names so that the 
*** 2420,2428 ****
  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.
  
  You can use @command{c++filt} to decipher individual symbols:
  
--- 2421,2429 ----
  functions from clashing.
  
  Every alphanumeric word (consisting of letters, digits, underscores,
! 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:
  
*************** Do not remove the initial underscore.
*** 2460,2465 ****
--- 2461,2476 ----
  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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]