* 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:
parent
bd4aae00cc
commit
cbf1f5df2b
4 changed files with 150 additions and 141 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue