@ -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 ;
}