OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [binutils/] [cxxfilt.c] - Diff between revs 816 and 818

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 818
/* 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, 2005, 2007 Free Software Foundation, Inc.
   2000, 2001, 2002, 2003, 2005, 2007 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 GNU Binutils.
   This file is part of GNU Binutils.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or (at
   the Free Software Foundation; either version 3 of the License, or (at
   your option) any later version.
   your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License 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 "sysdep.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfd.h"
#include "libiberty.h"
#include "libiberty.h"
#include "demangle.h"
#include "demangle.h"
#include "getopt.h"
#include "getopt.h"
#include "safe-ctype.h"
#include "safe-ctype.h"
#include "bucomm.h"
#include "bucomm.h"
 
 
static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
static int strip_underscore = TARGET_PREPENDS_UNDERSCORE;
static int strip_underscore = TARGET_PREPENDS_UNDERSCORE;
 
 
static const struct option long_options[] =
static const struct option long_options[] =
{
{
  {"strip-underscore", no_argument, NULL, '_'},
  {"strip-underscore", no_argument, NULL, '_'},
  {"format", required_argument, NULL, 's'},
  {"format", required_argument, NULL, 's'},
  {"help", no_argument, NULL, 'h'},
  {"help", no_argument, NULL, 'h'},
  {"no-params", no_argument, NULL, 'p'},
  {"no-params", no_argument, NULL, 'p'},
  {"no-strip-underscores", no_argument, NULL, 'n'},
  {"no-strip-underscores", no_argument, NULL, 'n'},
  {"no-verbose", no_argument, NULL, 'i'},
  {"no-verbose", no_argument, NULL, 'i'},
  {"types", no_argument, NULL, 't'},
  {"types", no_argument, NULL, 't'},
  {"version", no_argument, NULL, 'v'},
  {"version", no_argument, NULL, 'v'},
  {NULL, no_argument, NULL, 0}
  {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;
  unsigned int skip_first = 0;
 
 
  /* _ and $ are sometimes found at the start of function names
  /* _ and $ are sometimes found at the start of function names
     in assembler sources in order to distinguish them from other
     in assembler sources in order to distinguish them from other
     names (eg register names).  So skip them here.  */
     names (eg register names).  So skip them here.  */
  if (mangled_name[0] == '.' || mangled_name[0] == '$')
  if (mangled_name[0] == '.' || mangled_name[0] == '$')
    ++skip_first;
    ++skip_first;
  if (strip_underscore && mangled_name[skip_first] == '_')
  if (strip_underscore && mangled_name[skip_first] == '_')
    ++skip_first;
    ++skip_first;
 
 
  result = cplus_demangle (mangled_name + skip_first, flags);
  result = cplus_demangle (mangled_name + skip_first, flags);
 
 
  if (result == NULL)
  if (result == NULL)
    printf ("%s", mangled_name);
    printf ("%s", mangled_name);
  else
  else
    {
    {
      if (mangled_name[0] == '.')
      if (mangled_name[0] == '.')
        putchar ('.');
        putchar ('.');
      printf ("%s", result);
      printf ("%s", result);
      free (result);
      free (result);
    }
    }
}
}
 
 
static void
static void
print_demangler_list (FILE *stream)
print_demangler_list (FILE *stream)
{
{
  const struct demangler_engine *demangler;
  const struct demangler_engine *demangler;
 
 
  fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
  fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
 
 
  for (demangler = libiberty_demanglers + 1;
  for (demangler = libiberty_demanglers + 1;
       demangler->demangling_style != unknown_demangling;
       demangler->demangling_style != unknown_demangling;
       ++demangler)
       ++demangler)
    fprintf (stream, ",%s", demangler->demangling_style_name);
    fprintf (stream, ",%s", demangler->demangling_style_name);
 
 
  fprintf (stream, "}");
  fprintf (stream, "}");
}
}
 
 
static void
static void
usage (FILE *stream, int status)
usage (FILE *stream, int status)
{
{
  fprintf (stream, "\
  fprintf (stream, "\
Usage: %s [options] [mangled names]\n", program_name);
Usage: %s [options] [mangled names]\n", program_name);
  fprintf (stream, "\
  fprintf (stream, "\
Options are:\n\
Options are:\n\
  [-_|--strip-underscore]     Ignore first leading underscore%s\n",
  [-_|--strip-underscore]     Ignore first leading underscore%s\n",
           TARGET_PREPENDS_UNDERSCORE ? " (default)" : "");
           TARGET_PREPENDS_UNDERSCORE ? " (default)" : "");
  fprintf (stream, "\
  fprintf (stream, "\
  [-n|--no-strip-underscore]  Do not ignore a leading underscore%s\n",
  [-n|--no-strip-underscore]  Do not ignore a leading underscore%s\n",
           TARGET_PREPENDS_UNDERSCORE ? "" : " (default)");
           TARGET_PREPENDS_UNDERSCORE ? "" : " (default)");
  fprintf (stream, "\
  fprintf (stream, "\
  [-p|--no-params]            Do not display function arguments\n\
  [-p|--no-params]            Do not display function arguments\n\
  [-i|--no-verbose]           Do not show implementation details (if any)\n\
  [-i|--no-verbose]           Do not show implementation details (if any)\n\
  [-t|--types]                Also attempt to demangle type encodings\n\
  [-t|--types]                Also attempt to demangle type encodings\n\
  [-s|--format ");
  [-s|--format ");
  print_demangler_list (stream);
  print_demangler_list (stream);
  fprintf (stream, "]\n");
  fprintf (stream, "]\n");
 
 
  fprintf (stream, "\
  fprintf (stream, "\
  [@<file>]                   Read extra options from <file>\n\
  [@<file>]                   Read extra options from <file>\n\
  [-h|--help]                 Display this information\n\
  [-h|--help]                 Display this information\n\
  [-v|--version]              Show the version information\n\
  [-v|--version]              Show the version information\n\
Demangled names are displayed to stdout.\n\
Demangled names are displayed to stdout.\n\
If a name cannot be demangled it is just echoed 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");
If no names are provided on the command line, stdin is read.\n");
  if (REPORT_BUGS_TO[0] && status == 0)
  if (REPORT_BUGS_TO[0] && status == 0)
    fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
    fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
  exit (status);
  exit (status);
}
}
 
 
/* 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.  */
 
 
static const char *
static const char *
standard_symbol_characters (void)
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.
 
 
   Note that, since HP's compiler generates object code straight from
   Note that, since HP's compiler generates object code straight from
   C++ source, without going through an assembler, its mangled
   C++ source, without going through an assembler, its mangled
   identifiers can use all sorts of characters that no assembler would
   identifiers can use all sorts of characters that no assembler would
   tolerate, so the alphabet this function creates is a little odd.
   tolerate, so the alphabet this function creates is a little odd.
   Here are some sample mangled identifiers offered by HP:
   Here are some sample mangled identifiers offered by HP:
 
 
        typeid*__XT24AddressIndExpClassMember_
        typeid*__XT24AddressIndExpClassMember_
        [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
        [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
        __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
        __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
 
 
   This still seems really weird to me, since nowhere else in this
   This still seems really weird to me, since nowhere else in this
   file is there anything to recognize curly brackets, parens, etc.
   file is there anything to recognize curly brackets, parens, etc.
   I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
   I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
   this is right, but I still strongly suspect that there's a
   this is right, but I still strongly suspect that there's a
   misunderstanding here.
   misunderstanding here.
 
 
   If we decide it's better for c++filt to use HP's assembler syntax
   If we decide it's better for c++filt to use HP's assembler syntax
   to scrape identifiers out of its input, here's the definition of
   to scrape identifiers out of its input, here's the definition of
   the symbol name syntax from the HP assembler manual:
   the symbol name syntax from the HP assembler manual:
 
 
       Symbols are composed of uppercase and lowercase letters, decimal
       Symbols are composed of uppercase and lowercase letters, decimal
       digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
       digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
       underscore (_). A symbol can begin with a letter, digit underscore or
       underscore (_). A symbol can begin with a letter, digit underscore or
       dollar sign. If a symbol begins with a digit, it must contain a
       dollar sign. If a symbol begins with a digit, it must contain a
       non-digit character.
       non-digit character.
 
 
   So have fun.  */
   So have fun.  */
static const char *
static const char *
hp_symbol_characters (void)
hp_symbol_characters (void)
{
{
  return "_$.<>#,*&[]:(){}";
  return "_$.<>#,*&[]:(){}";
}
}
 
 
extern int main (int, char **);
extern int main (int, char **);
 
 
int
int
main (int argc, char **argv)
main (int argc, char **argv)
{
{
  int c;
  int c;
  const char *valid_symbols;
  const char *valid_symbols;
  enum demangling_styles style = auto_demangling;
  enum demangling_styles style = auto_demangling;
 
 
  program_name = argv[0];
  program_name = argv[0];
  xmalloc_set_program_name (program_name);
  xmalloc_set_program_name (program_name);
 
 
  expandargv (&argc, &argv);
  expandargv (&argc, &argv);
 
 
  while ((c = getopt_long (argc, argv, "_hinps:tv", long_options, (int *) 0)) != EOF)
  while ((c = getopt_long (argc, argv, "_hinps:tv", long_options, (int *) 0)) != EOF)
    {
    {
      switch (c)
      switch (c)
        {
        {
        case '?':
        case '?':
          usage (stderr, 1);
          usage (stderr, 1);
          break;
          break;
        case 'h':
        case 'h':
          usage (stdout, 0);
          usage (stdout, 0);
        case 'n':
        case 'n':
          strip_underscore = 0;
          strip_underscore = 0;
          break;
          break;
        case 'p':
        case 'p':
          flags &= ~ DMGL_PARAMS;
          flags &= ~ DMGL_PARAMS;
          break;
          break;
        case 't':
        case 't':
          flags |= DMGL_TYPES;
          flags |= DMGL_TYPES;
          break;
          break;
        case 'i':
        case 'i':
          flags &= ~ DMGL_VERBOSE;
          flags &= ~ DMGL_VERBOSE;
          break;
          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);
          cplus_demangle_set_style (style);
          break;
          break;
        }
        }
    }
    }
 
 
  if (optind < argc)
  if (optind < argc)
    {
    {
      for ( ; optind < argc; optind++)
      for ( ; optind < argc; optind++)
        {
        {
          demangle_it (argv[optind]);
          demangle_it (argv[optind]);
          putchar ('\n');
          putchar ('\n');
        }
        }
 
 
      return 0;
      return 0;
    }
    }
 
 
  switch (current_demangling_style)
  switch (current_demangling_style)
    {
    {
    case gnu_demangling:
    case gnu_demangling:
    case lucid_demangling:
    case lucid_demangling:
    case arm_demangling:
    case arm_demangling:
    case java_demangling:
    case java_demangling:
    case edg_demangling:
    case edg_demangling:
    case gnat_demangling:
    case gnat_demangling:
    case gnu_v3_demangling:
    case gnu_v3_demangling:
    case auto_demangling:
    case auto_demangling:
      valid_symbols = standard_symbol_characters ();
      valid_symbols = standard_symbol_characters ();
      break;
      break;
    case hp_demangling:
    case hp_demangling:
      valid_symbols = hp_symbol_characters ();
      valid_symbols = hp_symbol_characters ();
      break;
      break;
    default:
    default:
      /* Folks should explicitly indicate the appropriate alphabet for
      /* Folks should explicitly indicate the appropriate alphabet for
         each demangling.  Providing a default would allow the
         each demangling.  Providing a default would allow the
         question to go unconsidered.  */
         question to go unconsidered.  */
      fatal ("Internal error: no symbol alphabet for current style");
      fatal ("Internal error: no symbol alphabet for current style");
    }
    }
 
 
  for (;;)
  for (;;)
    {
    {
      static char mbuffer[32767];
      static char mbuffer[32767];
      unsigned i = 0;
      unsigned i = 0;
 
 
      c = getchar ();
      c = getchar ();
      /* Try to read a mangled name.  */
      /* Try to read a mangled name.  */
      while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
      while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
        {
        {
          if (i >= sizeof (mbuffer) - 1)
          if (i >= sizeof (mbuffer) - 1)
            break;
            break;
          mbuffer[i++] = c;
          mbuffer[i++] = c;
          c = getchar ();
          c = getchar ();
        }
        }
 
 
      if (i > 0)
      if (i > 0)
        {
        {
          mbuffer[i] = 0;
          mbuffer[i] = 0;
          demangle_it (mbuffer);
          demangle_it (mbuffer);
        }
        }
 
 
      if (c == EOF)
      if (c == EOF)
        break;
        break;
 
 
      /* Echo the whitespace characters so that the output looks
      /* Echo the whitespace characters so that the output looks
         like the input, only with the mangled names demangled.  */
         like the input, only with the mangled names demangled.  */
      putchar (c);
      putchar (c);
      if (c == '\n')
      if (c == '\n')
        fflush (stdout);
        fflush (stdout);
    }
    }
 
 
  fflush (stdout);
  fflush (stdout);
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.