Changeset 953


Ignore:
Timestamp:
Jan 11, 2004, 7:11:02 PM (22 years ago)
Author:
bird
Message:

put in some code which have been split out to gcc/cp/cxxfilt.c. Need to get GCC up to date soon!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/binutils/libiberty/cplus-dem.c

    • Property cvs2svn:cvs-rev changed from 1.1.1.2 to 1.2
    r952 r953  
    505505
    506506static int
    507 demangle_expression PARAMS ((struct work_stuff *, const char **, string *, 
     507demangle_expression PARAMS ((struct work_stuff *, const char **, string *,
    508508                             type_kind_t));
    509509
     
    845845     enum demangling_styles style;
    846846{
    847   const struct demangler_engine *demangler = libiberty_demanglers; 
     847  const struct demangler_engine *demangler = libiberty_demanglers;
    848848
    849849  for (; demangler->demangling_style != unknown_demangling; ++demangler)
     
    863863     const char *name;
    864864{
    865   const struct demangler_engine *demangler = libiberty_demanglers; 
     865  const struct demangler_engine *demangler = libiberty_demanglers;
    866866
    867867  for (; demangler->demangling_style != unknown_demangling; ++demangler)
     
    980980  int changed;
    981981  size_t demangled_size = 0;
    982  
     982
    983983  changed = 0;
    984984
     
    988988      changed = 1;
    989989    }
    990  
     990
    991991  if (mangled[0] == '_' || mangled[0] == '<')
    992992    goto Suppress;
    993  
     993
    994994  p = strstr (mangled, "___");
    995995  if (p == NULL)
     
    10051005        goto Suppress;
    10061006    }
    1007  
     1007
    10081008  /* Make demangled big enough for possible expansion by operator name.  */
    10091009  grow_vect (&demangled,
    10101010             &demangled_size,  2 * len0 + 1,
    10111011             sizeof (char));
    1012  
     1012
    10131013  if (ISDIGIT ((unsigned char) mangled[len0 - 1])) {
    10141014    for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1)
     
    10251025      }
    10261026  }
    1027  
     1027
    10281028  for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]);
    10291029       i += 1, j += 1)
    10301030    demangled[j] = mangled[i];
    1031  
     1031
    10321032  at_start_name = 1;
    10331033  while (i < len0)
    10341034    {
    10351035      at_start_name = 0;
    1036      
     1036
    10371037      if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_')
    10381038        {
     
    10481048    }
    10491049  demangled[j] = '\000';
    1050  
     1050
    10511051  for (i = 0; demangled[i] != '\0'; i += 1)
    10521052    if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ')
     
    10571057  else
    10581058    return demangled;
    1059  
     1059
    10601060 Suppress:
    10611061  grow_vect (&demangled,
     
    19801980      if (**mangled == 'Q')
    19811981        success = demangle_qualified (work, mangled, s,
    1982                                       /*isfuncname=*/0, 
     1982                                      /*isfuncname=*/0,
    19831983                                      /*append=*/1);
    19841984      else
     
    36453645              {
    36463646                success = demangle_qualified (work, mangled, &decl,
    3647                                               /*isfuncnam=*/0, 
     3647                                              /*isfuncnam=*/0,
    36483648                                              /*append=*/0);
    36493649                if (!success)
     
    48904890  string_append (s, buf);
    48914891}
     4892
     4893/* bird: This was put back since we're building some older gcc, remove
     4894         when going for gcc which doesn't expect MAIN and main().
     4895 */
     4896
     4897/* To generate a standalone demangler program for testing purposes,
     4898   just compile and link this file with -DMAIN and libiberty.a.  When
     4899   run, it demangles each command line arg, or each stdin string, and
     4900   prints the result on stdout.  */
     4901
     4902#ifdef MAIN
     4903
     4904#include "getopt.h"
     4905
     4906static const char *program_name;
     4907static const char *program_version = VERSION;
     4908static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
     4909
     4910static void demangle_it PARAMS ((char *));
     4911static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
     4912static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN;
     4913static void print_demangler_list PARAMS ((FILE *));
     4914
     4915static void
     4916demangle_it (mangled_name)
     4917     char *mangled_name;
     4918{
     4919  char *result;
     4920
     4921  /* For command line args, also try to demangle type encodings.  */
     4922  result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
     4923  if (result == NULL)
     4924    {
     4925      printf ("%s\n", mangled_name);
     4926    }
     4927  else
     4928    {
     4929      printf ("%s\n", result);
     4930      free (result);
     4931    }
     4932}
     4933
     4934static void
     4935print_demangler_list (stream)
     4936     FILE *stream;
     4937{
     4938  const struct demangler_engine *demangler;
     4939
     4940  fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
     4941
     4942  for (demangler = libiberty_demanglers + 1;
     4943       demangler->demangling_style != unknown_demangling;
     4944       ++demangler)
     4945    fprintf (stream, ",%s", demangler->demangling_style_name);
     4946
     4947  fprintf (stream, "}");
     4948}
     4949
     4950static void
     4951usage (stream, status)
     4952     FILE *stream;
     4953     int status;
     4954{
     4955  fprintf (stream, "\
     4956Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n",
     4957           program_name);
     4958
     4959  fprintf (stream, "\
     4960       [-s ");
     4961  print_demangler_list (stream);
     4962  fprintf (stream, "]\n");
     4963
     4964  fprintf (stream, "\
     4965       [--format ");
     4966  print_demangler_list (stream);
     4967  fprintf (stream, "]\n");
     4968
     4969  fprintf (stream, "\
     4970       [--help] [--version] [arg...]\n");
     4971  exit (status);
     4972}
     4973
     4974#define MBUF_SIZE 32767
     4975char mbuffer[MBUF_SIZE];
     4976
     4977/* Defined in the automatically-generated underscore.c.  */
     4978extern int prepends_underscore;
     4979
     4980int strip_underscore = 0;
     4981
     4982static const struct option long_options[] = {
     4983  {"strip-underscores", no_argument, 0, '_'},
     4984  {"format", required_argument, 0, 's'},
     4985  {"help", no_argument, 0, 'h'},
     4986  {"no-strip-underscores", no_argument, 0, 'n'},
     4987  {"version", no_argument, 0, 'v'},
     4988  {0, no_argument, 0, 0}
     4989};
     4990
     4991/* More 'friendly' abort that prints the line and file.
     4992   config.h can #define abort fancy_abort if you like that sort of thing.  */
     4993
     4994void
     4995fancy_abort ()
     4996{
     4997  fatal ("Internal gcc abort.");
     4998}
     4999
     5000
     5001static const char *
     5002standard_symbol_characters PARAMS ((void));
     5003
     5004static const char *
     5005hp_symbol_characters PARAMS ((void));
     5006
     5007static const char *
     5008gnu_v3_symbol_characters PARAMS ((void));
     5009
     5010/* Return the string of non-alnum characters that may occur
     5011   as a valid symbol component, in the standard assembler symbol
     5012   syntax.  */
     5013
     5014static const char *
     5015standard_symbol_characters ()
     5016{
     5017  return "_$.";
     5018}
     5019
     5020
     5021/* Return the string of non-alnum characters that may occur
     5022   as a valid symbol name component in an HP object file.
     5023
     5024   Note that, since HP's compiler generates object code straight from
     5025   C++ source, without going through an assembler, its mangled
     5026   identifiers can use all sorts of characters that no assembler would
     5027   tolerate, so the alphabet this function creates is a little odd.
     5028   Here are some sample mangled identifiers offered by HP:
     5029
     5030        typeid*__XT24AddressIndExpClassMember_
     5031        [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
     5032        __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
     5033
     5034   This still seems really weird to me, since nowhere else in this
     5035   file is there anything to recognize curly brackets, parens, etc.
     5036   I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
     5037   this is right, but I still strongly suspect that there's a
     5038   misunderstanding here.
     5039
     5040   If we decide it's better for c++filt to use HP's assembler syntax
     5041   to scrape identifiers out of its input, here's the definition of
     5042   the symbol name syntax from the HP assembler manual:
     5043
     5044       Symbols are composed of uppercase and lowercase letters, decimal
     5045       digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
     5046       underscore (_). A symbol can begin with a letter, digit underscore or
     5047       dollar sign. If a symbol begins with a digit, it must contain a
     5048       non-digit character.
     5049
     5050   So have fun.  */
     5051static const char *
     5052hp_symbol_characters ()
     5053{
     5054  return "_$.<>#,*&[]:(){}";
     5055}
     5056
     5057
     5058/* Return the string of non-alnum characters that may occur
     5059   as a valid symbol component in the GNU C++ V3 ABI mangling
     5060   scheme.  */
     5061
     5062static const char *
     5063gnu_v3_symbol_characters ()
     5064{
     5065  return "_$.";
     5066}
     5067
     5068
     5069extern int main PARAMS ((int, char **));
     5070
     5071int
     5072main (argc, argv)
     5073     int argc;
     5074     char **argv;
     5075{
     5076  char *result;
     5077  int c;
     5078  const char *valid_symbols;
     5079  enum demangling_styles style = auto_demangling;
     5080
     5081  program_name = argv[0];
     5082
     5083  strip_underscore = prepends_underscore;
     5084
     5085  while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
     5086    {
     5087      switch (c)
     5088        {
     5089        case '?':
     5090          usage (stderr, 1);
     5091          break;
     5092        case 'h':
     5093          usage (stdout, 0);
     5094        case 'n':
     5095          strip_underscore = 0;
     5096          break;
     5097        case 'v':
     5098          printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version);
     5099          return (0);
     5100        case '_':
     5101          strip_underscore = 1;
     5102          break;
     5103        case 's':
     5104          {
     5105            style = cplus_demangle_name_to_style (optarg);
     5106            if (style == unknown_demangling)
     5107              {
     5108                fprintf (stderr, "%s: unknown demangling style `%s'\n",
     5109                         program_name, optarg);
     5110                return (1);
     5111              }
     5112            else
     5113              cplus_demangle_set_style (style);
     5114          }
     5115          break;
     5116        }
     5117    }
     5118
     5119  if (optind < argc)
     5120    {
     5121      for ( ; optind < argc; optind++)
     5122        {
     5123          demangle_it (argv[optind]);
     5124        }
     5125    }
     5126  else
     5127    {
     5128      switch (current_demangling_style)
     5129        {
     5130        case gnu_demangling:
     5131        case lucid_demangling:
     5132        case arm_demangling:
     5133        case java_demangling:
     5134        case edg_demangling:
     5135        case gnat_demangling:
     5136        case auto_demangling:
     5137          valid_symbols = standard_symbol_characters ();
     5138          break;
     5139        case hp_demangling:
     5140          valid_symbols = hp_symbol_characters ();
     5141          break;
     5142        case gnu_v3_demangling:
     5143          valid_symbols = gnu_v3_symbol_characters ();
     5144          break;
     5145        default:
     5146          /* Folks should explicitly indicate the appropriate alphabet for
     5147             each demangling.  Providing a default would allow the
     5148             question to go unconsidered.  */
     5149          abort ();
     5150        }
     5151
     5152      for (;;)
     5153        {
     5154          int i = 0;
     5155          c = getchar ();
     5156          /* Try to read a label.  */
     5157          while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
     5158            {
     5159              if (i >= MBUF_SIZE-1)
     5160                break;
     5161              mbuffer[i++] = c;
     5162              c = getchar ();
     5163            }
     5164          if (i > 0)
     5165            {
     5166              int skip_first = 0;
     5167
     5168              if (mbuffer[0] == '.' || mbuffer[0] == '$')
     5169                ++skip_first;
     5170              if (strip_underscore && mbuffer[skip_first] == '_')
     5171                ++skip_first;
     5172
     5173              if (skip_first > i)
     5174                skip_first = i;
     5175
     5176              mbuffer[i] = 0;
     5177              flags |= (int) style;
     5178              result = cplus_demangle (mbuffer + skip_first, flags);
     5179              if (result)
     5180                {
     5181                  if (mbuffer[0] == '.')
     5182                    putc ('.', stdout);
     5183                  fputs (result, stdout);
     5184                  free (result);
     5185                }
     5186              else
     5187                fputs (mbuffer, stdout);
     5188
     5189              fflush (stdout);
     5190            }
     5191          if (c == EOF)
     5192            break;
     5193          putchar (c);
     5194          fflush (stdout);
     5195        }
     5196    }
     5197
     5198  return (0);
     5199}
     5200
     5201static void
     5202fatal (str)
     5203     const char *str;
     5204{
     5205  fprintf (stderr, "%s: %s\n", program_name, str);
     5206  exit (1);
     5207}
     5208
     5209PTR
     5210xmalloc (size)
     5211  size_t size;
     5212{
     5213  register PTR value = (PTR) malloc (size);
     5214  if (value == 0)
     5215    fatal ("virtual memory exhausted");
     5216  return value;
     5217}
     5218
     5219PTR
     5220xrealloc (ptr, size)
     5221  PTR ptr;
     5222  size_t size;
     5223{
     5224  register PTR value = (PTR) realloc (ptr, size);
     5225  if (value == 0)
     5226    fatal ("virtual memory exhausted");
     5227  return value;
     5228}
     5229#endif  /* main */
Note: See TracChangeset for help on using the changeset viewer.