diff options
author | Zack Weinberg <zack@codesourcery.com> | 2002-09-11 19:58:02 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2002-09-11 19:58:02 +0000 |
commit | 3fd9d606f3f68b72f7645400a79a8b09cc10a9e9 (patch) | |
tree | 6bbcd2c0a0f2af2f4a8beb06f20dc3cdb8866ba7 /gcc | |
parent | 6e471ea7b847f2a8bf4ee0673dc64a4156ec694e (diff) | |
download | gcc-3fd9d606f3f68b72f7645400a79a8b09cc10a9e9.zip gcc-3fd9d606f3f68b72f7645400a79a8b09cc10a9e9.tar.gz gcc-3fd9d606f3f68b72f7645400a79a8b09cc10a9e9.tar.bz2 |
Makefile.in: Remove all references to s-under and underscore.c.
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.
From-SVN: r57037
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/Makefile.in | 21 | ||||
-rw-r--r-- | gcc/collect2.c | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/Make-lang.in | 10 | ||||
-rw-r--r-- | gcc/cp/cxxfilt.c | 302 | ||||
-rw-r--r-- | gcc/tlink.c | 13 |
7 files changed, 331 insertions, 36 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cab4f48..c11b624 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-09-11 Zack Weinberg <zack@codesourcery.com> + + * 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. + 2002-09-11 David Edelsohn <edelsohn@gnu.org> * config/rs6000/rs6000.c (rs6000_xcoff_asm_named_section): Append diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 0aa6abc..52167f9 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -759,7 +759,7 @@ STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \ 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 insn-config.h insn-codes.h \ 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) toplev.h flags.h output.h $(RTL_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. @@ -1219,21 +1219,6 @@ collect2.o : collect2.c $(CONFIG_H) $(SYSTEM_H) gstab.h intl.h \ 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. c-common.o : c-common.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(OBSTACK_H) \ diff --git a/gcc/collect2.c b/gcc/collect2.c index c9b8865..4345e3a 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -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; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7746bc3..429c029 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2002-09-11 Zack Weinberg <zack@codesourcery.com> + + * 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) + 2002-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * cp-tree.h (require_complete_eh_spec_types): Add prototype. diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index 3235149..a189b41 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -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: diff --git a/gcc/cp/cxxfilt.c b/gcc/cp/cxxfilt.c new file mode 100644 index 0000000..c9ae0e4 --- /dev/null +++ b/gcc/cp/cxxfilt.c @@ -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); +} diff --git a/gcc/tlink.c b/gcc/tlink.c index 21d82f75..4a56d48 100644 --- a/gcc/tlink.c +++ b/gcc/tlink.c @@ -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); } } |