* 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>
* addr2line.c (usage): Document @file.

View 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

View 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 ");
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, "\
[--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;
}

View 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