Accept -Wno- prefix in ARI
[deliverable/binutils-gdb.git] / binutils / cxxfilt.c
index f0a3a9e5ba375b1ef1d1374944aa51f993e22660..7b8210e6cce684a5c1f39600ba089e9292a010ab 100644 (file)
@@ -1,55 +1,77 @@
 /* Demangler for GNU C++ - main program
-   Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1989-2019 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 GNU Binutils.
 
-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.
+   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
+   the Free Software Foundation; either version 3 of the License, 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.
+   This program 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 "sysdep.h"
 #include "bfd.h"
-#include "bucomm.h"
 #include "libiberty.h"
 #include "demangle.h"
 #include "getopt.h"
 #include "safe-ctype.h"
+#include "bucomm.h"
 
 static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
+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-verbose", no_argument, NULL, 'i'},
+  {"types", no_argument, NULL, 't'},
+  {"version", no_argument, NULL, 'v'},
+  {"recurse-limit", no_argument, NULL, 'R'},
+  {"recursion-limit", no_argument, NULL, 'R'},
+  {"no-recurse-limit", no_argument, NULL, 'r'},
+  {"no-recursion-limit", no_argument, NULL, 'r'},
+  {NULL, no_argument, NULL, 0}
+};
 
 static void
 demangle_it (char *mangled_name)
 {
   char *result;
+  unsigned int skip_first = 0;
+
+  /* _ and $ are sometimes found at the start of function names
+     in assembler sources in order to distinguish them from other
+     names (eg register names).  So skip them here.  */
+  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);
-    }
+    printf ("%s", mangled_name);
   else
     {
-      printf ("%s\n", result);
+      if (mangled_name[0] == '.')
+       putchar ('.');
+      printf ("%s", result);
       free (result);
     }
 }
@@ -69,47 +91,40 @@ print_demangler_list (FILE *stream)
   fprintf (stream, "}");
 }
 
-static void
+ATTRIBUTE_NORETURN 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\
+  [-i|--no-verbose]           Do not show implementation details (if any)\n\
+  [-R|--recurse-limit]        Enable a limit on recursion whilst demangling.  [Default]\n\
+  ]-r|--no-recurse-limit]     Disable a limit on recursion whilst demangling\n\
+  [-t|--types]                Also attempt to demangle type encodings\n\
+  [-s|--format ");
   print_demangler_list (stream);
   fprintf (stream, "]\n");
 
   fprintf (stream, "\
-       [--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");
+  if (REPORT_BUGS_TO[0] && status == 0)
+    fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
   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,61 +135,22 @@ 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.
-
-   Note that, since HP's compiler generates object code straight from
-   C++ source, without going through an assembler, its mangled
-   identifiers can use all sorts of characters that no assembler would
-   tolerate, so the alphabet this function creates is a little odd.
-   Here are some sample mangled identifiers offered by HP:
-
-       typeid*__XT24AddressIndExpClassMember_
-       [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
-       __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
-
-   This still seems really weird to me, since nowhere else in this
-   file is there anything to recognize curly brackets, parens, etc.
-   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
-   misunderstanding here.
-
-   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
-   the symbol name syntax from the HP assembler manual:
-
-       Symbols are composed of uppercase and lowercase letters, decimal
-       digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
-       underscore (_). A symbol can begin with a letter, digit underscore or
-       dollar sign. If a symbol begins with a digit, it must contain a
-       non-digit character.
-
-   So have fun.  */
-static const char *
-hp_symbol_characters (void)
-{
-  return "_$.<>#,*&[]:(){}";
-}
-
 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;
 
   program_name = argv[0];
   xmalloc_set_program_name (program_name);
+  bfd_set_error_program_name (program_name);
 
   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, "_hinprRs:tv", long_options, (int *) 0)) != EOF)
     {
       switch (c)
        {
@@ -189,24 +165,33 @@ main (int argc, char **argv)
        case 'p':
          flags &= ~ DMGL_PARAMS;
          break;
+       case 'r':
+         flags |= DMGL_NO_RECURSE_LIMIT;
+         break;
+       case 'R':
+         flags &= ~ DMGL_NO_RECURSE_LIMIT;
+         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;
        }
     }
@@ -216,77 +201,60 @@ main (int argc, char **argv)
       for ( ; optind < argc; optind++)
        {
          demangle_it (argv[optind]);
+         putchar ('\n');
        }
+
+      return 0;
     }
-  else
+
+  switch (current_demangling_style)
+    {
+    case auto_demangling:
+    case gnu_v3_demangling:
+    case java_demangling:
+    case gnat_demangling:
+    case dlang_demangling:
+    case rust_demangling:
+       valid_symbols = standard_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 (;;)
     {
-      switch (current_demangling_style)
+      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);
-         fflush (stdout);
+         mbuffer[i] = 0;
+         demangle_it (mbuffer);
        }
+
+      if (c == EOF)
+       break;
+
+      /* Echo the whitespace characters so that the output looks
+        like the input, only with the mangled names demangled.  */
+      putchar (c);
+      if (c == '\n')
+       fflush (stdout);
     }
 
-  return (0);
+  fflush (stdout);
+  return 0;
 }
This page took 0.027328 seconds and 4 git commands to generate.