This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Get rid of underscore.c


The sole function of underscore.c is to get the definition of
USER_LABEL_PREFIX into collect2 and c++filt.  For collect2, this can
be done just as easily by having collect2.c and tlink.c refer directly
to USER_LABEL_PREFIX.  Both files already use information from tm.h,
so no additional dependencies are created.  collect2 does not honor
-f(no-)leading-underscore, but it never has; that could be fixed in a
follow-up.

c++filt needs more work - I broke out its main() into a separate file
in gcc/cp, whence it can refer to USER_LABEL_PREFIX, and created a new
wrapper program to be used by the test harness for the demangler.  

I wrote the code to handle an arbitrary (but constant) definition of
USER_LABEL_PREFIX; for the two definitions in current use, 3.2 and
later optimize the idiom nicely.

This could be construed as a bug fix, as we have a number of
failure-to-bootstrap reports (see e.g.
http://gcc.gnu.org/ml/gcc-bugs/2002-09/msg00007.html aka GNATS
bootstrap/7800) related to underscore.c.  The underlying problem with
those bugs -- 2.95 or prior picking up the specs file for the
just-built xgcc -- is not addressed.  However, I believe the patch
will perturb the problem out of manifesting, by giving make no reason
to generate the new specs file until after we're done compiling stuff
with the old compiler.  In any case, it gets rid of a fair amount of
ugly makefile goo; I think it's a justified change on those grounds
alone.

i686-linux bootstrap in progress.  OK to commit, and to which branch?

zw

gcc:
	* Makefile.in: Remove all references to s-under and underscore.c.
	* collect2.c, tlink.c: Change all uses of prepends_underscore
	to look directly at USER_LABEL_PREFIX.

gcc/cp:
	* Make-lang.in: Build cp/cxxfilt.o from $(srcdir)/cp/cxxfilt.c,
	and c++filt from cxxfilt.o + version.o + $(LIBDEPS).
	* cxxfilt.c: New file: split from libiberty/cplus-dem.c, with
	minor adjustments (use version_string, eliminate yet another
	duplicate of xmalloc)

libiberty:
	* cplus-dem.c: Code code under #ifdef MAIN moved to gcc/cp/cxxfilt.c.
	* testsuite/Makefile.in: Adjust for test-demangle.
	* testsuite/regress-demangle: Deleted.
	* testsuite/test-demangle.c: New file.
	* testsuite/demangle-expected: Change \$ to $ throughout, now that
	this file is not being read by a shell script.

===================================================================
Index: gcc/Makefile.in
--- gcc/Makefile.in	3 Sep 2002 22:47:41 -0000	1.942
+++ gcc/Makefile.in	5 Sep 2002 00:58:39 -0000
@@ -759,7 +759,7 @@ STAGESTUFF = *$(objext) insn-flags.h ins
  insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
  insn-attr.h insn-attrtab.c insn-opinit.c insn-constants.h tm-preds.h \
  tree-check.h insn-conditions.c \
- s-flags s-config s-codes s-mlib s-under s-genrtl s-gtype gtyp-gen.h \
+ s-flags s-config s-codes s-mlib s-genrtl s-gtype gtyp-gen.h \
  s-output s-recog s-emit s-extract s-peep s-check s-conditions \
  s-attr s-attrtab s-opinit s-preds s-constants s-crt0 \
  genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
@@ -772,7 +772,7 @@ STAGESTUFF = *$(objext) insn-flags.h ins
  xgcc$(exeext) cpp$(exeext) cc1$(exeext) $(EXTRA_PASSES) \
  $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) cc1obj$(exeext) \
  protoize$(exeext) unprotoize$(exeext) \
- specs collect2$(exeext) $(USE_COLLECT2) underscore.c \
+ specs collect2$(exeext) $(USE_COLLECT2) \
  gcov$(exeext) *.[0-9][0-9].* *.[si] libcpp.a libbackend.a libgcc.mk \
  $(LANG_STAGESTUFF)
 
@@ -1202,7 +1202,7 @@ graph.o: graph.c $(CONFIG_H) $(SYSTEM_H)
 sbitmap.o: sbitmap.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) flags.h hard-reg-set.h \
     $(BASIC_BLOCK_H)
 
-COLLECT2_OBJS = collect2.o tlink.o intl.o underscore.o version.o
+COLLECT2_OBJS = collect2.o tlink.o intl.o version.o
 COLLECT2_LIBS = @COLLECT2_LIBS@
 collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS)
 # Don't try modifying collect2 (aka ld) in place--it might be linking this.
@@ -1218,21 +1218,6 @@ collect2.o : collect2.c $(CONFIG_H) $(SY
 
 tlink.o: tlink.c $(DEMANGLE_H) $(HASHTAB_H) $(CONFIG_H) $(SYSTEM_H) \
     $(OBSTACK_H) collect2.h intl.h
-
-underscore.c: s-under ; @true
-
-s-under: $(GCC_PASSES)
-	echo "int xxy_us_dummy;" >tmp-dum.c
-	$(GCC_FOR_TARGET) -S tmp-dum.c
-	echo '/*WARNING: This file is automatically generated!*/' >tmp-under.c
-	if grep _xxy_us_dummy tmp-dum.s > /dev/null ; then \
-	  echo "int prepends_underscore = 1;" >>tmp-under.c; \
-	else \
-	  echo "int prepends_underscore = 0;" >>tmp-under.c; \
-	fi
-	$(SHELL) $(srcdir)/move-if-change tmp-under.c underscore.c
-	-rm -f tmp-dum.c tmp-dum.s
-	$(STAMP) s-under
 
 # A file used by all variants of C.
 
===================================================================
Index: gcc/collect2.c
--- gcc/collect2.c	4 Aug 2002 22:45:18 -0000	1.140
+++ gcc/collect2.c	5 Sep 2002 00:58:39 -0000
@@ -236,9 +236,6 @@ char * temporary_firstobj;
 /* Holds the return value of pexecute.  */
 int pexecute_pid;
 
-/* Defined in the automatically-generated underscore.c.  */
-extern int prepends_underscore;
-
 /* Structure to hold all the directories in which to search for files to
    execute.  */
 
@@ -515,8 +512,8 @@ dump_file (name)
 	  if (*word == '.')
 	    ++word, putc ('.', stderr);
 	  p = word;
-	  if (*p == '_' && prepends_underscore)
-	    ++p;
+	  if (strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+	    p += strlen (USER_LABEL_PREFIX);
 
 	  if (no_demangle)
 	    result = 0;
===================================================================
Index: gcc/tlink.c
--- gcc/tlink.c	4 Aug 2002 22:45:20 -0000	1.44
+++ gcc/tlink.c	5 Sep 2002 00:58:40 -0000
@@ -595,8 +595,8 @@ scan_linker_output (fname)
       /* Try the first word on the line.  */
       if (*p == '.')
 	++p;
-      if (*p == '_' && prepends_underscore)
-	++p;
+      if (strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+	p += strlen (USER_LABEL_PREFIX);
 
       end = ! *q;
       *q = 0;
@@ -611,8 +611,8 @@ scan_linker_output (fname)
 	  p++;
 	  if (*p == '.')
 	    p++;
-	  if (*p == '_' && prepends_underscore)
-	    p++;
+	  if (strncmp (p, USER_LABEL_PREFIX, strlen (USER_LABEL_PREFIX)))
+	    p += strlen (USER_LABEL_PREFIX);
 	  sym = symbol_hash_lookup (p, false);
 	}
 
@@ -649,8 +649,9 @@ scan_linker_output (fname)
 		sym = symbol_hash_lookup (dem->mangled, false);
 	      else
 		{
-		  if (*p == '_' && prepends_underscore)
-		    ++p;
+		  if (strncmp (p, USER_LABEL_PREFIX,
+			       strlen (USER_LABEL_PREFIX)))
+		    p += strlen (USER_LABEL_PREFIX);
 		  sym = symbol_hash_lookup (p, false);
 		}
 	    }
===================================================================
Index: gcc/cp/Make-lang.in
--- gcc/cp/Make-lang.in	31 Aug 2002 02:37:09 -0000	1.122
+++ gcc/cp/Make-lang.in	5 Sep 2002 00:58:41 -0000
@@ -82,16 +82,12 @@ g++-cross$(exeext): g++$(exeext)
 	cp g++$(exeext) g++-cross$(exeext)
 
 # The demangler.
-cxxmain.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) $(CONFIG_H)
-	rm -f cxxmain.c
-	$(LN_S) $(srcdir)/../libiberty/cplus-dem.c cxxmain.c
-	$(CC) -c -DMAIN $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-	  -DVERSION=\"$(version)\" cxxmain.c
+cp/cxxfilt.o: cp/cxxfilt.c $(DEMANGLE_H) $(CONFIG_H) $(SYSTEM_H) version.h
 
 # Apparently OpenVM needs the -o to be at the beginning of the link line.
-$(DEMANGLER_PROG): cxxmain.o underscore.o $(LIBDEPS)
+$(DEMANGLER_PROG): cp/cxxfilt.o version.o $(LIBDEPS)
 	$(CC) -o $@ $(ALL_CFLAGS) $(LDFLAGS) \
-	  cxxmain.o underscore.o $(LIBS)
+	  cp/cxxfilt.o version.o $(LIBS)
 
 # The compiler itself.
 # Shared with C front end:
===================================================================
Index: gcc/cp/cxxfilt.c
--- gcc/cp/cxxfilt.c	1 Jan 1970 00:00:00 -0000
+++ gcc/cp/cxxfilt.c	5 Sep 2002 00:58:41 -0000
@@ -0,0 +1,302 @@
+/* Demangler for GNU C++ - main program
+   Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000, 2001, 2002 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.
+
+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.
+
+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, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+#include "config.h"
+#include "system.h"
+#include "demangle.h"
+#include "getopt.h"
+#include "version.h"
+
+static const char *program_name;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
+
+static void demangle_it PARAMS ((char *));
+static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
+static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN;
+static void print_demangler_list PARAMS ((FILE *));
+
+static void
+demangle_it (mangled_name)
+     char *mangled_name;
+{
+  char *result;
+
+  /* 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);
+    }
+  else
+    {
+      printf ("%s\n", result);
+      free (result);
+    }
+}
+
+static void 
+print_demangler_list (stream)
+     FILE *stream;
+{
+  const struct demangler_engine *demangler; 
+
+  fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
+  
+  for (demangler = libiberty_demanglers + 1;
+       demangler->demangling_style != unknown_demangling;
+       ++demangler)
+    fprintf (stream, ",%s", demangler->demangling_style_name);
+
+  fprintf (stream, "}");
+}
+
+static void
+usage (stream, status)
+     FILE *stream;
+     int status;
+{
+  fprintf (stream, "\
+Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n",
+	   program_name);
+
+  fprintf (stream, "\
+       [-s ");
+  print_demangler_list (stream);
+  fprintf (stream, "]\n");
+
+  fprintf (stream, "\
+       [--format ");
+  print_demangler_list (stream);
+  fprintf (stream, "]\n");
+
+  fprintf (stream, "\
+       [--help] [--version] [arg...]\n");
+  exit (status);
+}
+
+#define MBUF_SIZE 32767
+char mbuffer[MBUF_SIZE];
+
+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-strip-underscores", no_argument, 0, 'n'},
+  {"version", no_argument, 0, 'v'},
+  {0, no_argument, 0, 0}
+};
+
+static const char *
+standard_symbol_characters PARAMS ((void));
+
+static const char *
+hp_symbol_characters PARAMS ((void));
+
+/* Return the string of non-alnum characters that may occur 
+   as a valid symbol component, in the standard assembler symbol
+   syntax.  */
+
+static const char *
+standard_symbol_characters ()
+{
+  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 ()
+{
+  return "_$.<>#,*&[]:(){}";
+}
+
+extern int main PARAMS ((int, char **));
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *result;
+  int c;
+  const char *valid_symbols;
+  enum demangling_styles style = auto_demangling;
+
+  program_name = argv[0];
+
+  strip_underscore = (USER_LABEL_PREFIX[0] == '_');
+
+  while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
+    {
+      switch (c)
+	{
+	case '?':
+	  usage (stderr, 1);
+	  break;
+	case 'h':
+	  usage (stdout, 0);
+	case 'n':
+	  strip_underscore = 0;
+	  break;
+	case 'v':
+	  printf ("GNU %s (C++ demangler), version %s\n",
+		  program_name, version_string);
+	  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);
+	  }
+	  break;
+	}
+    }
+
+  if (optind < argc)
+    {
+      for ( ; optind < argc; optind++)
+	{
+	  demangle_it (argv[optind]);
+	}
+    }
+  else
+    {
+      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 (;;)
+	{
+	  int i = 0;
+	  c = getchar ();
+	  /* Try to read a label.  */
+	  while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
+	    {
+	      if (i >= MBUF_SIZE-1)
+		break;
+	      mbuffer[i++] = c;
+	      c = getchar ();
+	    }
+	  if (i > 0)
+	    {
+	      int 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);
+	}
+    }
+
+  return (0);
+}
+
+static void
+fatal (str)
+     const char *str;
+{
+  fprintf (stderr, "%s: %s\n", program_name, str);
+  exit (1);
+}
===================================================================
Index: libiberty/cplus-dem.c
--- libiberty/cplus-dem.c	29 Jul 2002 17:11:10 -0000	1.86
+++ libiberty/cplus-dem.c	5 Sep 2002 00:58:43 -0000
@@ -4878,337 +4878,3 @@ string_append_template_idx (s, idx)
   sprintf(buf, "T%d", idx);
   string_append (s, buf);
 }
-
-/* To generate a standalone demangler program for testing purposes,
-   just compile and link this file with -DMAIN and libiberty.a.  When
-   run, it demangles each command line arg, or each stdin string, and
-   prints the result on stdout.  */
-
-#ifdef MAIN
-
-#include "getopt.h"
-
-static const char *program_name;
-static const char *program_version = VERSION;
-static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
-
-static void demangle_it PARAMS ((char *));
-static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
-static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN;
-static void print_demangler_list PARAMS ((FILE *));
-
-static void
-demangle_it (mangled_name)
-     char *mangled_name;
-{
-  char *result;
-
-  /* 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);
-    }
-  else
-    {
-      printf ("%s\n", result);
-      free (result);
-    }
-}
-
-static void 
-print_demangler_list (stream)
-     FILE *stream;
-{
-  const struct demangler_engine *demangler; 
-
-  fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name);
-  
-  for (demangler = libiberty_demanglers + 1;
-       demangler->demangling_style != unknown_demangling;
-       ++demangler)
-    fprintf (stream, ",%s", demangler->demangling_style_name);
-
-  fprintf (stream, "}");
-}
-
-static void
-usage (stream, status)
-     FILE *stream;
-     int status;
-{
-  fprintf (stream, "\
-Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n",
-	   program_name);
-
-  fprintf (stream, "\
-       [-s ");
-  print_demangler_list (stream);
-  fprintf (stream, "]\n");
-
-  fprintf (stream, "\
-       [--format ");
-  print_demangler_list (stream);
-  fprintf (stream, "]\n");
-
-  fprintf (stream, "\
-       [--help] [--version] [arg...]\n");
-  exit (status);
-}
-
-#define MBUF_SIZE 32767
-char mbuffer[MBUF_SIZE];
-
-/* Defined in the automatically-generated underscore.c.  */
-extern int prepends_underscore;
-
-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-strip-underscores", no_argument, 0, 'n'},
-  {"version", no_argument, 0, 'v'},
-  {0, no_argument, 0, 0}
-};
-
-/* More 'friendly' abort that prints the line and file.
-   config.h can #define abort fancy_abort if you like that sort of thing.  */
-
-void
-fancy_abort ()
-{
-  fatal ("Internal gcc abort.");
-}
-
-
-static const char *
-standard_symbol_characters PARAMS ((void));
-
-static const char *
-hp_symbol_characters PARAMS ((void));
-
-static const char *
-gnu_v3_symbol_characters PARAMS ((void));
-
-/* Return the string of non-alnum characters that may occur 
-   as a valid symbol component, in the standard assembler symbol
-   syntax.  */
-
-static const char *
-standard_symbol_characters ()
-{
-  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 ()
-{
-  return "_$.<>#,*&[]:(){}";
-}
-
-
-/* Return the string of non-alnum characters that may occur 
-   as a valid symbol component in the GNU C++ V3 ABI mangling
-   scheme.  */
-
-static const char *
-gnu_v3_symbol_characters ()
-{
-  return "_$.";
-}
-
-
-extern int main PARAMS ((int, char **));
-
-int
-main (argc, argv)
-     int argc;
-     char **argv;
-{
-  char *result;
-  int c;
-  const char *valid_symbols;
-  enum demangling_styles style = auto_demangling;
-
-  program_name = argv[0];
-
-  strip_underscore = prepends_underscore;
-
-  while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF)
-    {
-      switch (c)
-	{
-	case '?':
-	  usage (stderr, 1);
-	  break;
-	case 'h':
-	  usage (stdout, 0);
-	case 'n':
-	  strip_underscore = 0;
-	  break;
-	case 'v':
-	  printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version);
-	  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);
-	  }
-	  break;
-	}
-    }
-
-  if (optind < argc)
-    {
-      for ( ; optind < argc; optind++)
-	{
-	  demangle_it (argv[optind]);
-	}
-    }
-  else
-    {
-      switch (current_demangling_style)
-	{
-	case gnu_demangling:
-	case lucid_demangling:
-	case arm_demangling:
-	case java_demangling:
-	case edg_demangling:
-	case gnat_demangling:
-	case auto_demangling:
-	  valid_symbols = standard_symbol_characters ();
-	  break;
-	case hp_demangling:
-	  valid_symbols = hp_symbol_characters ();
-	  break;
-	case gnu_v3_demangling:
-	  valid_symbols = gnu_v3_symbol_characters ();
-	  break;
-	default:
-	  /* Folks should explicitly indicate the appropriate alphabet for
-	     each demangling.  Providing a default would allow the
-	     question to go unconsidered.  */
-	  abort ();
-	}
-
-      for (;;)
-	{
-	  int i = 0;
-	  c = getchar ();
-	  /* Try to read a label.  */
-	  while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c)))
-	    {
-	      if (i >= MBUF_SIZE-1)
-		break;
-	      mbuffer[i++] = c;
-	      c = getchar ();
-	    }
-	  if (i > 0)
-	    {
-	      int skip_first = 0;
-
-	      if (mbuffer[0] == '.' || mbuffer[0] == '$')
-		++skip_first;
-	      if (strip_underscore && mbuffer[skip_first] == '_')
-		++skip_first;
-
-	      if (skip_first > i)
-		skip_first = i;
-
-	      mbuffer[i] = 0;
-	      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);
-	}
-    }
-
-  return (0);
-}
-
-static void
-fatal (str)
-     const char *str;
-{
-  fprintf (stderr, "%s: %s\n", program_name, str);
-  exit (1);
-}
-
-PTR
-xmalloc (size)
-  size_t size;
-{
-  register PTR value = (PTR) malloc (size);
-  if (value == 0)
-    fatal ("virtual memory exhausted");
-  return value;
-}
-
-PTR
-xrealloc (ptr, size)
-  PTR ptr;
-  size_t size;
-{
-  register PTR value = (PTR) realloc (ptr, size);
-  if (value == 0)
-    fatal ("virtual memory exhausted");
-  return value;
-}
-#endif	/* main */
===================================================================
Index: libiberty/testsuite/Makefile.in
--- libiberty/testsuite/Makefile.in	4 Sep 1999 15:09:19 -0000	1.2
+++ libiberty/testsuite/Makefile.in	5 Sep 2002 00:58:43 -0000
@@ -1,6 +1,6 @@
 #
 # Makefile
-#   Copyright (C) 1999
+#   Copyright (C) 1999, 2002
 #   Free Software Foundation
 #
 # This file is part of the libiberty library.
@@ -45,30 +45,24 @@ all:
 check: @CHECK@
 
 # Run some tests of the demangler.
-check-cplus-dem: test-filter $(srcdir)/demangle-expected
-	$(SHELL) $(srcdir)/regress-demangle $(srcdir)/demangle-expected
+check-cplus-dem: test-demangle $(srcdir)/demangle-expected
+	./test-demangle < $(srcdir)/demangle-expected
 
-# Note that we just hard-code prepends_underscore to 0.  This doesn't
-# matter since any particular test can override the default if need
-# be.
 TEST_COMPILE = $(CC) @DEFS@ $(LIBCFLAGS) -I.. -I$(INCDIR) $(HDEFINES)
-test-filter: $(srcdir)/../cplus-dem.c
-	echo 'int prepends_underscore = 0;' > test-us.c
-	$(TEST_COMPILE) -o test-filter -DMAIN -DVERSION='"none"' @DEFS@ \
-		$(srcdir)/../cplus-dem.c test-us.c -L.. -liberty
-
+test-demangle: $(srcdir)/test-demangle.c
+	$(TEST_COMPILE) -o test-demangle \
+		$(srcdir)/test-demangle.c ../libiberty.a
 
 # Standard (either GNU or Cygnus) rules we don't use.
 info install-info clean-info dvi install etags tags installcheck:
 
 # The standard clean rules.
 mostlyclean:
-	rm -f test-us.c test-filter
+	rm -f test-demangle
 clean: mostlyclean
 distclean: clean
 	rm -f Makefile
 maintainer-clean realclean: distclean
-
 
 Makefile: $(srcdir)/Makefile.in ../config.status
 	CONFIG_FILES=testsuite/Makefile CONFIG_HEADERS= \
===================================================================
Index: libiberty/testsuite/demangle-expected
--- libiberty/testsuite/demangle-expected	9 Jul 2002 23:57:09 -0000	1.13
+++ libiberty/testsuite/demangle-expected	5 Sep 2002 00:58:43 -0000
@@ -127,31 +127,31 @@ VOrder__9ivTSolverUiRP12ivInteractorT2
 ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&)
 #
 --format=gnu
-_10PageButton\$__both
+_10PageButton$__both
 PageButton::__both
 #
 --format=gnu
-_3RNG\$singleMantissa
+_3RNG$singleMantissa
 RNG::singleMantissa
 #
 --format=gnu
-_5IComp\$_release
+_5IComp$_release
 IComp::_release
 #
 --format=gnu
-_\$_10BitmapComp
+_$_10BitmapComp
 BitmapComp::~BitmapComp(void)
 #
 --format=gnu
-_\$_9__io_defs
+_$_9__io_defs
 __io_defs::~__io_defs(void)
 #
 --format=gnu
-_\$_Q23foo3bar
+_$_Q23foo3bar
 foo::bar::~bar(void)
 #
 --format=gnu
-_\$_Q33foo3bar4bell
+_$_Q33foo3bar4bell
 foo::bar::bell::~bell(void)
 #
 --format=gnu
@@ -435,11 +435,11 @@ _vt.foo.bar
 foo::bar virtual table
 #
 --format=gnu
-_vt\$foo
+_vt$foo
 foo virtual table
 #
 --format=gnu
-_vt\$foo\$bar
+_vt$foo$bar
 foo::bar virtual table
 #
 --format=gnu
@@ -647,11 +647,11 @@ zero__8osMemoryPvUi
 osMemory::zero(void *, unsigned int)
 #
 --format=gnu
-_2T4\$N
+_2T4$N
 T4::N
 #
 --format=gnu
-_Q22T42t1\$N
+_Q22T42t1$N
 T4::t1::N
 #
 --format=gnu
@@ -727,11 +727,11 @@ __t6vector1Zii
 vector<int>::vector(int)
 #
 --format=gnu
-_\$_t6vector1Zdi
+_$_t6vector1Zdi
 vector<double>::~vector(int)
 #
 --format=gnu
-_\$_t6vector1Zii
+_$_t6vector1Zii
 vector<int>::~vector(int)
 #
 --format=gnu
@@ -827,11 +827,11 @@ next__Ct4List1Z10VHDLEntityRQ2t4List1Z10
 List<VHDLEntity>::next(List<VHDLEntity>::Pix &) const
 #
 --format=gnu
-_GLOBAL_\$D\$set
+_GLOBAL_$D$set
 global destructors keyed to set
 #
 --format=gnu
-_GLOBAL_\$I\$set
+_GLOBAL_$I$set
 global constructors keyed to set
 #
 --format=gnu
@@ -875,7 +875,7 @@ __t8BDDHookV1ZPcRCPc
 BDDHookV<char *>::BDDHookV(char *const &)
 #
 --format=gnu
-_vt\$t8BDDHookV1ZPc
+_vt$t8BDDHookV1ZPc
 BDDHookV<char *> virtual table
 #
 --format=gnu
@@ -2564,7 +2564,7 @@ _27_GLOBAL_.N.__12burst_app_ct.app_insta
 {anonymous}::app_instance
 #
 --format=gnu
-_26_GLOBAL_\$N\$_tmp_n.iilg4Gya\$app_instance
+_26_GLOBAL_$N$_tmp_n.iilg4Gya$app_instance
 {anonymous}::app_instance
 #
 --format=java
===================================================================
Index: libiberty/testsuite/regress-demangle
--- libiberty/testsuite/regress-demangle	3 Feb 2002 04:00:36 -0000	1.4
+++ libiberty/testsuite/regress-demangle	1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-#! /bin/sh
-
-# Run a regression test for the demangler.
-# Usage: regress-demangle TEST-FILE
-
-failures=0
-count=0
-sed -e '/^#/ d' "$1" | (
-  while read type; do
-     read mangled
-     read demangled
-
-     x="`./test-filter $type $mangled`"
-     count=`expr $count + 1`
-     if test "x$x" != "x$demangled"; then
-	failures=`expr $failures + 1`
-	echo "FAIL: $type $mangled"
-	echo "   result: $x"
-	echo " expected: $demangled"
-     fi
-  done
-
-  if test $failures -eq 0; then
-     echo "All $count tests passed"
-  else
-     echo "$failures of $count tests failed"
-  fi
-
-  test $failures -eq 0
-)
===================================================================
Index: libiberty/testsuite/test-demangle.c
--- libiberty/testsuite/test-demangle.c	1 Jan 1970 00:00:00 -0000
+++ libiberty/testsuite/test-demangle.c	5 Sep 2002 00:58:43 -0000
@@ -0,0 +1,175 @@
+/* Demangler test program,
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   Written by Zack Weinberg <zack@codesourcery.com
+
+   This file is part of GNU libiberty.
+
+   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 2 of the License, or
+   (at your option) any later version.
+
+   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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "ansidecl.h"
+#include <stdio.h>
+#include "libiberty.h"
+#include "demangle.h"
+
+struct line
+{
+  size_t alloced;
+  char *data;
+};
+
+static unsigned int lineno;
+
+/* Safely read a single line of arbitrary length from standard input.  */
+
+#define LINELEN 80
+
+static void
+getline(buf)
+     struct line *buf;
+{
+  char *data = buf->data;
+  size_t alloc = buf->alloced;
+  size_t count = 0;
+  int c;
+
+  if (data == 0)
+    {
+      data = xmalloc (LINELEN);
+      alloc = LINELEN;
+    }
+
+  /* Skip comment lines.  */
+  while ((c = getchar()) == '#')
+    {
+      while ((c = getchar()) != EOF && c != '\n');
+      lineno++;
+    }
+
+  /* c is the first character on the line, and it's not a comment
+     line: copy this line into the buffer and return.  */
+  while (c != EOF && c != '\n')
+    {
+      if (count >= alloc)
+	{
+	  alloc *= 2;
+	  data = xrealloc (data, alloc);
+	}
+      data[count++] = c;
+      c = getchar();
+    }
+  lineno++;
+  data[count] = '\0';
+
+  buf->data = data;
+  buf->alloced = alloc;
+}
+
+/* The tester operates on a data file consisting of triples of lines:
+   format switch
+   input to be demangled
+   expected output
+
+   The format switch is expected to be either the empty string, a
+   line of the form --format=<name>, or just <name> by itself.  */
+
+#define FORMATS "--format="
+#define FORMATL (sizeof FORMATS - 1)
+
+int
+main(argc, argv)
+     int argc;
+     char **argv;
+{
+  enum demangling_styles style;
+  struct line format;
+  struct line input;
+  struct line expect;
+  char *fstyle;
+  char *result;
+  int failures = 0;
+  int tests = 0;
+
+  if (argc > 1)
+    {
+      fprintf (stderr, "usage: %s < test-set\n", argv[0]);
+      return 2;
+    }
+
+  format.data = 0;
+  input.data = 0;
+  expect.data = 0;
+
+  for (;;)
+    {
+      getline (&format);
+      if (feof (stdin))
+	break;
+
+      getline (&input);
+      getline (&expect);
+
+      tests++;
+
+      fstyle = format.data;
+      if (!strncmp (fstyle, FORMATS, FORMATL))
+	fstyle += FORMATL;
+
+      if (fstyle[0] == '\0')
+	style = auto_demangling;
+      else
+	style = cplus_demangle_name_to_style (fstyle);
+
+      if (style == unknown_demangling)
+	{
+	  printf ("FAIL at line %d: unknown demangling style %s\n",
+		  lineno, fstyle);
+	  failures++;
+	  continue;
+	}
+
+      cplus_demangle_set_style (style);
+
+      result = cplus_demangle (input.data,
+			       DMGL_PARAMS|DMGL_ANSI|DMGL_VERBOSE|DMGL_TYPES);
+
+      if (result
+	  ? strcmp (result, expect.data)
+	  : strcmp (input.data, expect.data))
+	{
+	  printf ("\
+FAIL at line %d, style %s:\n\
+in:  %s\n\
+out: %s\n\
+exp: %s\n",
+		   lineno, fstyle,
+		   input.data,
+		   result,
+		   expect.data);
+	  failures++;
+	}
+      free (result);
+    }
+
+  free (format.data);
+  free (input.data);
+  free (expect.data);
+
+  printf ("%s: %d tests, %d failures\n", argv[0], tests, failures);
+  return failures ? 1 : 0;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]