* 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.
This commit is contained in:
Nick Clifton 2005-10-04 11:03:38 +00:00
parent bd4aae00cc
commit cbf1f5df2b
4 changed files with 150 additions and 141 deletions

View 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> 2005-10-03 Mark Mitchell <mark@codesourcery.com>
* addr2line.c (usage): Document @file. * addr2line.c (usage): Document @file.

View file

@ -1,10 +1,17 @@
-*- text -*- -*- 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 * 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. * 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 * 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 conscious. This form will automatically be chosen when ld detects that all

View file

@ -1,26 +1,26 @@
/* Demangler for GNU C++ - main program /* Demangler for GNU C++ - main program
Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, 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) Written by James Clark (jjc@jclark.uucp)
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
Modified by Satish Pai (pai@apollo.hp.com) for HP 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 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 the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later Software Foundation; either version 2, or (at your option) any later
version. version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details. for more details.
You should have received a copy of the GNU General Public License 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 along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */ 02110-1301, USA. */
#include "config.h" #include "config.h"
#include "bfd.h" #include "bfd.h"
@ -30,26 +30,42 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
#include "getopt.h" #include "getopt.h"
#include "safe-ctype.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 const struct option long_options[] =
static void usage (FILE *, int) ATTRIBUTE_NORETURN; {
static void print_demangler_list (FILE *); {"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 static void
demangle_it (char *mangled_name) demangle_it (char *mangled_name)
{ {
char *result; 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) if (result == NULL)
{ puts (mangled_name);
printf ("%s\n", mangled_name);
}
else else
{ {
printf ("%s\n", result); if (mangled_name[0] == '.')
putchar ('.');
puts (result);
free (result); free (result);
} }
} }
@ -73,43 +89,32 @@ static void
usage (FILE *stream, int status) usage (FILE *stream, int status)
{ {
fprintf (stream, "\ fprintf (stream, "\
Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores]\n\ Usage: %s [options] [mangled names]\n", program_name);
[-p] [--no-params]\n",
program_name);
fprintf (stream, "\ fprintf (stream, "\
[-s "); 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); print_demangler_list (stream);
fprintf (stream, "]\n"); fprintf (stream, "]\n");
fprintf (stream, "\ fprintf (stream, "\
[--format "); [@<file>] Read extra options from <file>\n\
print_demangler_list (stream); [-h|--help] Display this information\n\
fprintf (stream, "]\n"); [-v|--version] Show the version information\n\
Demangled names are displayed to stdout.\n\
fprintf (stream, "\ If a name cannot be demangled it is just echoed to stdout.\n\
[@file] [--help] [--version] [arg...]\n"); If no names are provided on the command line, stdin is read.\n");
exit (status); 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 /* Return the string of non-alnum characters that may occur
as a valid symbol component, in the standard assembler symbol as a valid symbol component, in the standard assembler symbol
syntax. */ syntax. */
@ -120,7 +125,6 @@ standard_symbol_characters (void)
return "_$."; return "_$.";
} }
/* Return the string of non-alnum characters that may occur /* Return the string of non-alnum characters that may occur
as a valid symbol name component in an HP object file. as a valid symbol name component in an HP object file.
@ -162,7 +166,6 @@ extern int main (int, char **);
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
char *result;
int c; int c;
const char *valid_symbols; const char *valid_symbols;
enum demangling_styles style = auto_demangling; enum demangling_styles style = auto_demangling;
@ -172,9 +175,7 @@ main (int argc, char **argv)
expandargv (&argc, &argv); expandargv (&argc, &argv);
strip_underscore = TARGET_PREPENDS_UNDERSCORE; while ((c = getopt_long (argc, argv, "_hinps:tv", long_options, (int *) 0)) != EOF)
while ((c = getopt_long (argc, argv, "_nps:", long_options, (int *) 0)) != EOF)
{ {
switch (c) switch (c)
{ {
@ -189,24 +190,27 @@ main (int argc, char **argv)
case 'p': case 'p':
flags &= ~ DMGL_PARAMS; flags &= ~ DMGL_PARAMS;
break; break;
case 't':
flags &= ~ DMGL_TYPES;
break;
case 'i':
flags &= ~ DMGL_VERBOSE;
break;
case 'v': case 'v':
print_version ("c++filt"); print_version ("c++filt");
return (0); return 0;
case '_': case '_':
strip_underscore = 1; strip_underscore = 1;
break; break;
case 's': case 's':
{ style = cplus_demangle_name_to_style (optarg);
style = cplus_demangle_name_to_style (optarg); if (style == unknown_demangling)
if (style == unknown_demangling) {
{ fprintf (stderr, "%s: unknown demangling style `%s'\n",
fprintf (stderr, "%s: unknown demangling style `%s'\n", program_name, optarg);
program_name, optarg); return 1;
return (1); }
} cplus_demangle_set_style (style);
else
cplus_demangle_set_style (style);
}
break; break;
} }
} }
@ -214,79 +218,57 @@ main (int argc, char **argv)
if (optind < argc) if (optind < argc)
{ {
for ( ; optind < argc; optind++) 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: if (i >= sizeof (mbuffer) - 1)
case lucid_demangling: break;
case arm_demangling: mbuffer[i++] = c;
case java_demangling: c = getchar ();
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 (;;) if (i > 0)
{ {
unsigned i = 0; mbuffer[i] = 0;
c = getchar (); demangle_it (mbuffer);
/* 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); fflush (stdout);
} }
if (c == EOF)
break;
} }
return (0); return 0;
} }

View file

@ -2397,9 +2397,10 @@ the Info entries for @file{binutils}.
@smallexample @smallexample
@c man begin SYNOPSIS cxxfilt @c man begin SYNOPSIS cxxfilt
c++filt [@option{-_}|@option{--strip-underscores}] c++filt [@option{-_}|@option{--strip-underscores}]
[@option{-j}|@option{--java}]
[@option{-n}|@option{--no-strip-underscores}] [@option{-n}|@option{--no-strip-underscores}]
[@option{-p}|@option{--no-params}] [@option{-p}|@option{--no-params}]
[@option{-t}|@option{--no-types}]
[@option{-i}|@option{--no-verbose}]
[@option{-s} @var{format}|@option{--format=}@var{format}] [@option{-s} @var{format}|@option{--format=}@var{format}]
[@option{--help}] [@option{--version}] [@var{symbol}@dots{}] [@option{--help}] [@option{--version}] [@var{symbol}@dots{}]
@c man end @c man end
@ -2420,9 +2421,9 @@ names into user-level names so that the linker can keep these overloaded
functions from clashing. functions from clashing.
Every alphanumeric word (consisting of letters, digits, underscores, Every alphanumeric word (consisting of letters, digits, underscores,
dollars, or periods) seen in the input is a potential label. If the dollars, or periods) seen in the input is a potential mangled name.
label decodes into a C++ name, the C++ name replaces the low-level If the name decodes into a C++ name, the C++ name replaces the
name in the output. low-level name in the output.
You can use @command{c++filt} to decipher individual symbols: 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 When demangling the name of a function, do not display the types of
the function's parameters. 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} @item -s @var{format}
@itemx --format=@var{format} @itemx --format=@var{format}
@command{c++filt} can decode various methods of mangling, used by @command{c++filt} can decode various methods of mangling, used by