diff options
author | No Author <no-author@gcc.gnu.org> | 1998-12-17 06:43:56 +0000 |
---|---|---|
committer | No Author <no-author@gcc.gnu.org> | 1998-12-17 06:43:56 +0000 |
commit | 3520370f09ccf2899fafd9fbdf421a73eb5e6e89 (patch) | |
tree | 71c1f8a188167f5d00e862fd4e0f2534533094ba | |
parent | 861bb6c1b0958236ad93717f98d347aa6152bd09 (diff) |
This commit was manufactured by cvs2svn to create tagmisc/first-egcs-checkin
'first-egcs-checkin'.
From-SVN: r24354
142 files changed, 46440 insertions, 38810 deletions
diff --git a/gcc/.gdbinit b/gcc/.gdbinit deleted file mode 100644 index dea758b5465..00000000000 --- a/gcc/.gdbinit +++ /dev/null @@ -1,95 +0,0 @@ -define pr -set debug_rtx ($) -end - -document pr -Print the full structure of the rtx that is $. -Works only when an inferior is executing. -end - -define prl -set debug_rtx_list ($, debug_rtx_count) -end - -document prl -Print the full structure of all rtx insns beginning at $. -Works only when an inferior is executing. -Uses variable debug_rtx_count to control number of insns printed: - debug_rtx_count > 0: print from $ on. - debug_rtx_count < 0: print a window around $. - -There is also debug_rtx_find (rtx, uid) that will scan a list for UID and print -it using debug_rtx_list. Usage example: set $foo=debug_rtx_find(first, 42) -end - -define pt -set debug_tree ($) -end - -document pt -Print the full structure of the tree that is $. -Works only when an inferior is executing. -end - -define ptc -output (enum tree_code) $.common.code -echo \n -end - -document ptc -Print the tree-code of the tree node that is $. -end - -define pdn -output $.decl.name->identifier.pointer -echo \n -end - -document pdn -Print the name of the decl-node that is $. -end - -define ptn -output $.type.name->decl.name->identifier.pointer -echo \n -end - -document ptn -Print the name of the type-node that is $. -end - -define prc -output (enum rtx_code) $.code -echo \ ( -output $.mode -echo )\n -end - -document prc -Print the rtx-code and machine mode of the rtx that is $. -end - -define pi -print $.fld[0].rtx@7 -end - -document pi -Print the fields of an instruction that is $. -end - -define pbs -set print_binding_stack () -end - -document pbs -In cc1plus, print the current binding stack, frame by frame, up to and -including the global binding level. -end - -# Don't let abort actually run, as it will make -# stdio stop working and therefore the `pr' command below as well. -b abort - -# Make gdb complain about symbol reading errors. This is so that gcc -# developers can see and fix bugs in gcc debug output. -set complaints 20 diff --git a/gcc/ABOUT-GCC-NLS b/gcc/ABOUT-GCC-NLS new file mode 100644 index 00000000000..b70a7c8df67 --- /dev/null +++ b/gcc/ABOUT-GCC-NLS @@ -0,0 +1,542 @@ +Notes on GCC's Native Language Support + +GCC's Native Language Support (NLS) is relatively new and +experimental, so NLS is currently disabled by default. Use +configure's --enable-nls option to enable it. Eventually, NLS will be +enabled by default, and you'll need --disable-nls to disable it. You +must enable NLS in order to make a GCC distribution. + +By and large, only diagnostic messages have been internationalized. +Some work remains in other areas; for example, GCC does not yet allow +non-ASCII letters in identifiers. + +Not all of GCC's diagnostic messages have been internationalized. +Programs like `enquire' and `genattr' are not internationalized, as +their users are GCC maintainers who typically need to be able to read +English anyway; internationalizing them would thus entail needless +work for the human translators. And no one has yet gotten around to +internationalizing the messages in the C++ compiler, or in the +specialized MIPS-specific programs mips-tdump and mips-tfile. + +The GCC library should not contain any messages that need +internationalization, because it operates below the +internationalization library. + +Currently, the only language translation supplied is en_UK (British English). + +Unlike some other GNU programs, the GCC sources contain few instances +of explicit translation calls like _("string"). Instead, the +diagnostic printing routines automatically translate their arguments. +For example, GCC source code should not contain calls like `error +(_("unterminated comment"))'; it should contain calls like `error +("unterminated comment")' instead, as it is the `error' function's +responsibility to translate the message before the user sees it. + +By convention, any function parameter in the GCC sources whose name +ends in `msgid' is expected to be a message requiring translation. +For example, the `error' function's first parameter is named `msgid'. +GCC's exgettext script uses this convention to determine which +function parameter strings need to be translated. The exgettext +script also assumes that any occurrence of `%eMSGID}' on a source +line, where MSGID does not contain `%' or `}', corresponds to a +message MSGID that requires translation; this is needed to identify +diagnostics in GCC spec strings. + +If you enable NLS and modify source files, you'll need to use a +special version of the GNU gettext package to propagate the +modifications to the translation tables. Apply the following patch +(use `patch -p0') to GNU gettext 0.10.35, which you can retrieve from: + +ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz + +This patch has been submitted to the GNU gettext maintainer, so +eventually we shouldn't need this special gettext version. + +This patch 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 patch 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 patch; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + +1998-07-26 Paul Eggert <eggert@twinsun.com> + + * po/Makefile.in.in (maintainer-clean): Remove cat-id-tbl.c and + stamp-cat-id. + +1998-07-24 Paul Eggert <eggert@twinsun.com> + + * po/Makefile.in.in (cat-id-tbl.o): Depend on + $(top_srcdir)/intl/libgettext.h, not ../intl/libgettext.h. + +1998-07-20 Paul Eggert <eggert@twinsun.com> + + * po/Makefile.in.in (.po.pox, all-yes, $(srcdir)/cat-id-tbl.c, + $(srcdir)/stamp-cat-id, update-po): Prepend `$(srcdir)/' to + files built in the source directory; this is needed for + VPATH-based make in Solaris 2.6. + +1998-07-17 Paul Eggert <eggert@twinsun.com> + + Add support for user-specified argument numbers for keywords. + Extract all strings from a keyword arg, not just the first one. + Handle parenthesized commas inside keyword args correctly. + Warn about nested keywords. + + * doc/gettext.texi: Document --keyword=id:argnum. + + * src/xgettext.c (scan_c_file): + Warn about nested keywords, e.g. _(_("xxx")). + Warn also about not-yet-implemented but allowed nesting, e.g. + dcgettext(..._("xxx")..., "yyy"). + Get all strings in a keyword arg, not just the first one. + Handle parenthesized commas inside keyword args correctly. + + * src/xget-lex.h (enum xgettext_token_type_ty): + Replace xgettext_token_type_keyword1 and + xgettext_token_type_keyword2 with just plain + xgettext_token_type_keyword; it now has argnum value. + Add xgettext_token_type_rp. + (struct xgettext_token_ty): Add argnum member. + line_number and file_name are now also set for + xgettext_token_type_keyword. + (xgettext_lex_keyword): Arg is const char *. + + * src/xget-lex.c: Include "hash.h". + (enum token_type_ty): Add token_type_rp. + (keywords): Now a hash table. + (phase5_get): Return token_type_rp for ')'. + (xgettext_lex, xgettext_lex_keyword): Add support for keyword argnums. + (xgettext_lex): Return xgettext_token_type_rp for ')'. + Report keyword argnum, line number, and file name back to caller. + +1998-07-09 Paul Eggert <eggert@twinsun.com> + + * intl/Makefile.in (uninstall): + Do nothing unless $(PACKAGE) is gettext. + +=================================================================== +RCS file: doc/gettext.texi,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.1 +diff -pu -r0.10.35.0 -r0.10.35.1 +--- doc/gettext.texi 1998/05/01 05:53:32 0.10.35.0 ++++ doc/gettext.texi 1998/07/18 00:25:15 0.10.35.1 +@@ -1854,13 +1854,19 @@ List of directories searched for input f + Join messages with existing file. + + @item -k @var{word} +-@itemx --keyword[=@var{word}] +-Additonal keyword to be looked for (without @var{word} means not to ++@itemx --keyword[=@var{keywordspec}] ++Additonal keyword to be looked for (without @var{keywordspec} means not to + use default keywords). + +-The default keywords, which are always looked for if not explicitly +-disabled, are @code{gettext}, @code{dgettext}, @code{dcgettext} and +-@code{gettext_noop}. ++If @var{keywordspec} is a C identifer @var{id}, @code{xgettext} looks ++for strings in the first argument of each call to the function or macro ++@var{id}. If @var{keywordspec} is of the form ++@samp{@var{id}:@var{argnum}}, @code{xgettext} looks for strings in the ++@var{argnum}th argument of the call. ++ ++The default keyword specifications, which are always looked for if not ++explicitly disabled, are @code{gettext}, @code{dgettext:2}, ++@code{dcgettext:2} and @code{gettext_noop}. + + @item -m [@var{string}] + @itemx --msgstr-prefix[=@var{string}] +=================================================================== +RCS file: intl/Makefile.in,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.1 +diff -pu -r0.10.35.0 -r0.10.35.1 +--- intl/Makefile.in 1998/04/27 21:53:18 0.10.35.0 ++++ intl/Makefile.in 1998/07/09 21:39:18 0.10.35.1 +@@ -143,10 +143,14 @@ install-data: all + installcheck: + + uninstall: +- dists="$(DISTFILES.common)"; \ +- for file in $$dists; do \ +- rm -f $(gettextsrcdir)/$$file; \ +- done ++ if test "$(PACKAGE)" = "gettext"; then \ ++ dists="$(DISTFILES.common)"; \ ++ for file in $$dists; do \ ++ rm -f $(gettextsrcdir)/$$file; \ ++ done ++ else \ ++ : ; \ ++ fi + + info dvi: + +=================================================================== +RCS file: src/xget-lex.c,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.1 +diff -pu -r0.10.35.0 -r0.10.35.1 +--- src/xget-lex.c 1998/07/09 22:49:48 0.10.35.0 ++++ src/xget-lex.c 1998/07/18 00:25:15 0.10.35.1 +@@ -33,6 +33,7 @@ + #include "error.h" + #include "system.h" + #include "libgettext.h" ++#include "hash.h" + #include "str-list.h" + #include "xget-lex.h" + +@@ -83,6 +84,7 @@ enum token_type_ty + token_type_eoln, + token_type_hash, + token_type_lp, ++ token_type_rp, + token_type_comma, + token_type_name, + token_type_number, +@@ -109,7 +111,7 @@ static FILE *fp; + static int trigraphs; + static int cplusplus_comments; + static string_list_ty *comment; +-static string_list_ty *keywords; ++static hash_table keywords; + static int default_keywords = 1; + + /* These are for tracking whether comments count as immediately before +@@ -941,6 +943,10 @@ phase5_get (tp) + tp->type = token_type_lp; + return; + ++ case ')': ++ tp->type = token_type_rp; ++ return; ++ + case ',': + tp->type = token_type_comma; + return; +@@ -1179,6 +1185,7 @@ xgettext_lex (tp) + while (1) + { + token_ty token; ++ void *keyword_value; + + phase8_get (&token); + switch (token.type) +@@ -1213,17 +1220,20 @@ xgettext_lex (tp) + if (default_keywords) + { + xgettext_lex_keyword ("gettext"); +- xgettext_lex_keyword ("dgettext"); +- xgettext_lex_keyword ("dcgettext"); ++ xgettext_lex_keyword ("dgettext:2"); ++ xgettext_lex_keyword ("dcgettext:2"); + xgettext_lex_keyword ("gettext_noop"); + default_keywords = 0; + } + +- if (string_list_member (keywords, token.string)) +- { +- tp->type = (strcmp (token.string, "dgettext") == 0 +- || strcmp (token.string, "dcgettext") == 0) +- ? xgettext_token_type_keyword2 : xgettext_token_type_keyword1; ++ if (find_entry (&keywords, token.string, strlen (token.string), ++ &keyword_value) ++ == 0) ++ { ++ tp->type = xgettext_token_type_keyword; ++ tp->argnum = (int) keyword_value; ++ tp->line_number = token.line_number; ++ tp->file_name = logical_file_name; + } + else + tp->type = xgettext_token_type_symbol; +@@ -1236,6 +1246,12 @@ xgettext_lex (tp) + tp->type = xgettext_token_type_lp; + return; + ++ case token_type_rp: ++ last_non_comment_line = newline_count; ++ ++ tp->type = xgettext_token_type_rp; ++ return; ++ + case token_type_comma: + last_non_comment_line = newline_count; + +@@ -1263,16 +1279,32 @@ xgettext_lex (tp) + + void + xgettext_lex_keyword (name) +- char *name; ++ const char *name; + { + if (name == NULL) + default_keywords = 0; + else + { +- if (keywords == NULL) +- keywords = string_list_alloc (); ++ int argnum; ++ size_t len; ++ const char *sp; ++ ++ if (keywords.table == NULL) ++ init_hash (&keywords, 100); ++ ++ sp = strchr (name, ':'); ++ if (sp) ++ { ++ len = sp - name; ++ argnum = atoi (sp + 1); ++ } ++ else ++ { ++ len = strlen (name); ++ argnum = 1; ++ } + +- string_list_append_unique (keywords, name); ++ insert_entry (&keywords, name, len, (void *) argnum); + } + } + +=================================================================== +RCS file: src/xget-lex.h,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.1 +diff -pu -r0.10.35.0 -r0.10.35.1 +--- src/xget-lex.h 1998/07/09 22:49:48 0.10.35.0 ++++ src/xget-lex.h 1998/07/18 00:25:15 0.10.35.1 +@@ -23,9 +23,9 @@ Foundation, Inc., 59 Temple Place - Suit + enum xgettext_token_type_ty + { + xgettext_token_type_eof, +- xgettext_token_type_keyword1, +- xgettext_token_type_keyword2, ++ xgettext_token_type_keyword, + xgettext_token_type_lp, ++ xgettext_token_type_rp, + xgettext_token_type_comma, + xgettext_token_type_string_literal, + xgettext_token_type_symbol +@@ -37,8 +37,14 @@ struct xgettext_token_ty + { + xgettext_token_type_ty type; + +- /* These 3 are only set for xgettext_token_type_string_literal. */ ++ /* This 1 is set only for xgettext_token_type_keyword. */ ++ int argnum; ++ ++ /* This 1 is set only for xgettext_token_type_string_literal. */ + char *string; ++ ++ /* These 2 are set only for xgettext_token_type_keyword and ++ xgettext_token_type_string_literal. */ + int line_number; + char *file_name; + }; +@@ -50,7 +56,7 @@ void xgettext_lex PARAMS ((xgettext_toke + const char *xgettext_lex_comment PARAMS ((size_t __n)); + void xgettext_lex_comment_reset PARAMS ((void)); + /* void xgettext_lex_filepos PARAMS ((char **, int *)); FIXME needed? */ +-void xgettext_lex_keyword PARAMS ((char *__name)); ++void xgettext_lex_keyword PARAMS ((const char *__name)); + void xgettext_lex_cplusplus PARAMS ((void)); + void xgettext_lex_trigraphs PARAMS ((void)); + +=================================================================== +RCS file: src/xgettext.c,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.1 +diff -pu -r0.10.35.0 -r0.10.35.1 +--- src/xgettext.c 1998/07/09 22:49:48 0.10.35.0 ++++ src/xgettext.c 1998/07/18 00:25:15 0.10.35.1 +@@ -835,6 +835,8 @@ scan_c_file(filename, mlp, is_cpp_file) + int is_cpp_file; + { + int state; ++ int commas_to_skip; /* defined only when in states 1 and 2 */ ++ int paren_nesting; /* defined only when in state 2 */ + + /* Inform scanner whether we have C++ files or not. */ + if (is_cpp_file) +@@ -854,63 +856,79 @@ scan_c_file(filename, mlp, is_cpp_file) + { + xgettext_token_ty token; + +- /* A simple state machine is used to do the recognising: ++ /* A state machine is used to do the recognising: + State 0 = waiting for something to happen +- State 1 = seen one of our keywords with string in first parameter +- State 2 = was in state 1 and now saw a left paren +- State 3 = seen one of our keywords with string in second parameter +- State 4 = was in state 3 and now saw a left paren +- State 5 = waiting for comma after being in state 4 +- State 6 = saw comma after being in state 5 */ ++ State 1 = seen one of our keywords ++ State 2 = waiting for part of an argument */ + xgettext_lex (&token); + switch (token.type) + { +- case xgettext_token_type_keyword1: ++ case xgettext_token_type_keyword: ++ if (!extract_all && state == 2) ++ { ++ if (commas_to_skip == 0) ++ { ++ error (0, 0, ++ _("%s:%d: warning: keyword nested in keyword arg"), ++ token.file_name, token.line_number); ++ continue; ++ } ++ ++ /* Here we should nest properly, but this would require a ++ potentially unbounded stack. We haven't run across an ++ example that needs this functionality yet. For now, ++ we punt and forget the outer keyword. */ ++ error (0, 0, ++ _("%s:%d: warning: keyword between outer keyword and its arg"), ++ token.file_name, token.line_number); ++ } ++ commas_to_skip = token.argnum - 1; + state = 1; + continue; + +- case xgettext_token_type_keyword2: +- state = 3; +- continue; +- + case xgettext_token_type_lp: + switch (state) + { + case 1: ++ paren_nesting = 0; + state = 2; + break; +- case 3: +- state = 4; ++ case 2: ++ paren_nesting++; + break; +- default: +- state = 0; + } + continue; + ++ case xgettext_token_type_rp: ++ if (state == 2 && paren_nesting != 0) ++ paren_nesting--; ++ else ++ state = 0; ++ continue; ++ + case xgettext_token_type_comma: +- state = state == 5 ? 6 : 0; ++ if (state == 2 && commas_to_skip != 0) ++ commas_to_skip -= paren_nesting == 0; ++ else ++ state = 0; + continue; + + case xgettext_token_type_string_literal: +- if (extract_all || state == 2 || state == 6) +- { +- remember_a_message (mlp, &token); +- state = 0; +- } ++ if (extract_all || (state == 2 && commas_to_skip == 0)) ++ remember_a_message (mlp, &token); + else + { + free (token.string); +- state = (state == 4 || state == 5) ? 5 : 0; ++ state = state == 2 ? 2 : 0; + } + continue; + + case xgettext_token_type_symbol: +- state = (state == 4 || state == 5) ? 5 : 0; ++ state = state == 2 ? 2 : 0; + continue; + + default: +- state = 0; +- continue; ++ abort (); + + case xgettext_token_type_eof: + break; +=================================================================== +RCS file: po/Makefile.in.in,v +retrieving revision 0.10.35.0 +retrieving revision 0.10.35.5 +diff -u -r0.10.35.0 -r0.10.35.5 +--- po/Makefile.in.in 1998/07/20 20:20:38 0.10.35.0 ++++ po/Makefile.in.in 1998/07/26 09:07:52 0.10.35.5 +@@ -62,7 +62,7 @@ + $(COMPILE) $< + + .po.pox: +- $(MAKE) $(PACKAGE).pot ++ $(MAKE) $(srcdir)/$(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + + .po.mo: +@@ -79,7 +79,7 @@ + + all: all-@USE_NLS@ + +-all-yes: cat-id-tbl.c $(CATALOGS) ++all-yes: $(srcdir)/cat-id-tbl.c $(CATALOGS) + all-no: + + $(srcdir)/$(PACKAGE).pot: $(POTFILES) +@@ -90,8 +90,8 @@ + || ( rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) + +-$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: +-$(srcdir)/stamp-cat-id: $(PACKAGE).pot ++$(srcdir)/cat-id-tbl.c: $(srcdir)/stamp-cat-id; @: ++$(srcdir)/stamp-cat-id: $(srcdir)/$(PACKAGE).pot + rm -f cat-id-tbl.tmp + sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ + | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp +@@ -180,7 +180,8 @@ + + check: all + +-cat-id-tbl.o: ../intl/libgettext.h ++cat-id-tbl.o: $(srcdir)/cat-id-tbl.c $(top_srcdir)/intl/libgettext.h ++ $(COMPILE) $(srcdir)/cat-id-tbl.c + + dvi info tags TAGS ID: + +@@ -196,7 +197,7 @@ + maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." +- rm -f $(GMOFILES) ++ rm -f $(GMOFILES) cat-id-tbl.c stamp-cat-id + + distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) + dist distdir: update-po $(DISTFILES) +@@ -207,7 +208,7 @@ + done + + update-po: Makefile +- $(MAKE) $(PACKAGE).pot ++ $(MAKE) $(srcdir)/$(PACKAGE).pot + PATH=`pwd`/../src:$$PATH; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ diff --git a/gcc/ABOUT-NLS b/gcc/ABOUT-NLS new file mode 100644 index 00000000000..28d38c76fd6 --- /dev/null +++ b/gcc/ABOUT-NLS @@ -0,0 +1,226 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do *not* +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +One advise in advance +===================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias or message inheritance) as the +implementation here. It is also not possible to offer this additional +functionality on top of a `catgets' implementation. Future versions of +GNU `gettext' will very likely convey even more functionality. So it +might be a good idea to change to GNU `gettext' as soon as possible. + + So you need not provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system provides +usable `catgets' (if using this is selected by the installer) or +`gettext' functions. If neither is available, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is *not* required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --with-catgets + ./configure --disable-nls + +will respectively bypass any pre-existing `catgets' or `gettext' to use +the internationalizing routines provided within this package, enable +the use of the `catgets' functions (if found on the locale system), or +else, *totally* disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + By default the configuration process will not test for the `catgets' +function and therefore they will not be used. The reasons are already +given above: the emulation on top of `catgets' cannot provide all the +extensions provided by the GNU `gettext' library. If you nevertheless +want to use the `catgets' functions use + + ./configure --with-catgets + +to enable the test for `catgets' (this causes no harm if `catgets' is +not available on your system). If you really select this option we +would like to hear about the reasons because we cannot think of any +good one ourself. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +ISO 639 `LL' two-letter code prior to using the programs in the +package. For example, let's suppose that you speak German. At the +shell prompt, merely execute `setenv LANG de' (in `csh'), +`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This +can be done from your `.login' or `.profile' file, once and for all. + + An operating system might already offer message localization for +many of its programs, while other programs have been installed locally +with the full capabilities of GNU `gettext'. Just using `gettext' +extended syntax for `LANG' would break proper localization of already +available operating system programs. In this case, users should set +both `LANGUAGE' and `LANG' variables in their environment, as programs +using GNU `gettext' give preference to `LANGUAGE'. For example, some +Swedish users would rather read translations in German than English for +when Swedish is not available. This is easily accomplished by setting +`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list, courtesy of Linux +International. You may reach your translation team at the address +`LL@li.org', replacing LL by the two-letter ISO 639 code for your +language. Language codes are *not* the same as the country codes given +in ISO 3166. The following translation teams exist, as of December +1997: + + Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en', + Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian + `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja', + Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish + `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es', + Swedish `sv', and Turkish `tr'. + +For example, you may reach the Chinese translation team by writing to +`zh@li.org'. + + If you'd like to volunteer to *work* at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is *not* the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +*actively* in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of December +1997. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination. + + Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv + .----------------------------------------------------. + bash | [] [] [] | 3 + bison | [] [] [] | 3 + clisp | [] [] [] [] | 4 + cpio | [] [] [] [] [] [] | 6 + diffutils | [] [] [] [] [] | 5 + enscript | [] [] [] [] [] [] | 6 + fileutils | [] [] [] [] [] [] [] [] [] [] | 10 + findutils | [] [] [] [] [] [] [] [] [] | 9 + flex | [] [] [] [] | 4 + gcal | [] [] [] [] [] | 5 + gettext | [] [] [] [] [] [] [] [] [] [] [] | 12 + grep | [] [] [] [] [] [] [] [] [] [] | 10 + hello | [] [] [] [] [] [] [] [] [] [] [] | 11 + id-utils | [] [] [] | 3 + indent | [] [] [] [] [] | 5 + libc | [] [] [] [] [] [] [] | 7 + m4 | [] [] [] [] [] [] | 6 + make | [] [] [] [] [] [] | 6 + music | [] [] | 2 + ptx | [] [] [] [] [] [] [] [] | 8 + recode | [] [] [] [] [] [] [] [] [] | 9 + sh-utils | [] [] [] [] [] [] [] [] | 8 + sharutils | [] [] [] [] [] [] | 6 + tar | [] [] [] [] [] [] [] [] [] [] [] | 11 + texinfo | [] [] [] | 3 + textutils | [] [] [] [] [] [] [] [] [] | 9 + wdiff | [] [] [] [] [] [] [] [] | 8 + `----------------------------------------------------' + 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv + 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If December 1997 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. + diff --git a/gcc/ChangeLog.11 b/gcc/ChangeLog.11 new file mode 100644 index 00000000000..29483ba2618 --- /dev/null +++ b/gcc/ChangeLog.11 @@ -0,0 +1,10652 @@ +Sat Aug 2 18:50:43 1997 Paul Eggert <eggert@twinsun.com> + + * tree.c (int_fits_type_p): Negative ints never fit unsigned + types, and unsigned ints with top-bit-set never fit signed types. + +Sat Aug 2 16:25:43 1997 Per Bothner <bothner@frobnitz.gnu.ai.mit.edu> + + * Makefile.in (EXTRA_C_OBJS): Removed. + (C_AND_OBJC_OBJS): New. Subsumes EXTRA_C_OBJS and OBJC_CCOMMON. + * objc/Make-lang.in (OBJC_CCOMMON): Removed. + +Sat Aug 2 16:11:57 1997 Doug Evans <dje@cygnus.com> + + * configure.in: Build .gdbinit for top level build dir here. + (AC_OUTPUT): Pass oldstyle_subdirs to configure.lang. + * configure.lang: Fix building of .gdbinit for oldstyle lang subdirs. + +Sat Aug 2 13:48:15 1997 Ken Raeburn <raeburn@cygnus.com> + + * cse.c (cse_insn): Ignore paradoxical SUBREGs unless we are + looking for such. + +Sat Aug 2 13:25:33 1997 Tristan Gingold (gingold@email.enst.fr) + + * calls.c (expand_call): If -fcheck-memory-usage, use pseudo-register, + check indirectly called function is executable, and set rights of + memory for aggregate as write only. + (store_one_arg): If -fcheck-memory-usage, set rights for pushed + stack argument. + * c-decl.c (init_decl_processing): Add + __builtin_aggregate_incoming_address. + * explow.c (expr_size): Call expand_expr with appropriate flag. + * expr.c (expand_builtin, case BUILT_IN_AGGREGATE_INCOMING_ADDRESS): + New case. + (expand_assignment, expand_expr, emit_push_insn, store_expr): + Insert calls to chkr_check_addr, chkr_set_right, and chkr_copy_bitmap + when -fcheck-memory-usage. + (get_push_address, get_memory_usage_from_modifier): New functions. + * expr.h: Add expand_modifier flags. + (chkr_*_libfunc): New decls. + (memory_use_mode): New declaration. + * flags.h (flag_check_memory_usage, flag_prefix_function_name): New + declaration. + * function.c (put_var_into_stack, assign_parms): If + -fcheck-memory-usage, set the rights of pushed variable. + * optabs.c (chkr_{check_addr,set_right}_libfunc): New definitions. + (chkr_{copy_bitmap,check_exec}_libfunc): Likewise. + (init_optabs): Initialize these chkr_*_libfunc. + * stmt.c (expand_computed_goto): If -fcheck-memory-usage, check that + computed address of a goto is executable. + (expand_asm, expand_asm_operands): If -fcheck-memory-usage, + disallow asm statments. + * toplev.c (flag_check_memory_usage, flag_prefix_function_name): New + variable. + (f_options): Add `check-memory-usage' and `prefix_function_name'. + (main): Disable `-fomit-frame-pointer' if `-fcheck-memory-usage' is set + and the machine can't debug without the frame pointer. + * tree.h (built_in_function): Add BUILT_IN_AGGREGATE_INCOMING_ADDRESS. + * varasm.c (make_function_rtl, make_decl_rtl): Add a prefix when + flag_prefix_function_name_usage is set. + (assemble_name): Strip the CHKR_PREFIX. + * alpha.c (alpha_builtin_saveregs): If -fcheck-memory-usage, + set rights of saved registers. + * clipper.c (clipper_builtin_saveregs): Likewise. + * m88k.c (m88k_builtin_saveregs): Likewise. + * pa.c (hppa_builtin_saveregs): Likewise. + * sparc.c (sparc_builtin_saveregs): Likewise. + +Sat Aug 2 08:01:12 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * c-decl.c (grokdeclarator): Give error for `long double' and + refine text of some error messages. + + * alpha.h (FLOAT_VALUE_TYPE, INTIFY, FLOATIFY, FLOAT_ARG_TYPE): Define. + * i860.h (FLOAT_VALUE_TYPE): Fix typo; was FLOAT_TYPE_VALLUE. + + * calls.c (store_one_arg): Allow stack_slot to be SP in + ARGS_GROW_DOWNWARD case. + + * c-decl.c (parmlist_tags_warning): Only suppress warning on + union if anonymous. + + * libgcc2.c (_trampoline): Rework last change; both getpagesize + and mprotect are in cygwin32. + + * reload1.c (reload): Add IN_ADDR to IN_ADDR_ADDR when computing + needs since they conflict. + + * print-rtl.c (indent): Move to file level; was static in print_rtx. + (print_inline_rtx): New function. + * reload.c (debug_reload): Rework to make output more compact. + + * dwarfout.c (output_compile_unit_die): Add support for Pascal. + * dwarf2out.c (gen_compile_unit_die): Likewise. + + * c-typeck.c (lvalue_p, case BIND_EXPR, RTL_EXPR): Return 1 if array. + + * Makefile.in (OBJC_OBJC): Delete from here. + + * varasm.c (compare_constant_1, case STRING_CST): Compare TYPE_MODE. + (record_constant_1, case STRING_CST): Record TYPE_MODE. + + * tree.c (contains_this_placeholder_p): Delete. + (contains_placeholder_p): Now contains code from above function. + (contains_placeholder_p, case 'r'): Don't look at offset info. + * expr.c (expand_expr, case PLACEHOLDER_EXPR): Find innermost + matching and don't check contains_placeholder_p. + +Fri Aug 1 17:15:07 1997 Per Bothner <bothner@cygnus.com> + + * objc/objc-act.c (lang_init): Don't check_newline #if USE_CPPLIB. + * c-lex.c (lang_init): Remove (recently moved here). + * c-lang.c (lang_init): Restore, but add #if !USE_CPPLIB. + +Fri Aug 1 11:26:45 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (pa_reorg): Explode ADDR_DIFF_VEC insns too. + +Thu Jul 31 19:37:22 1997 Ian Lance Taylor <ian@cygnus.com> + + * libgcc2.c (getpagesize): Don't compile if __CYGWIN32__. + +Thu Jul 31 16:04:42 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (output_to_reg, output_fix_trunc): Use scratch memory, + if available, instead of dynamically extending the stack. + (put_condition_code, print_operand): Added reverse_cc to reverse the + comparison when $ah is accessed directly instead of using eflags + + * i386.md (*trunc*): Use scratch memory for output_fix_trunc. + (movsicc_1, movhicc_1) Change alternative 3 to: + jCC L1; mov; jmp L2; L1:mov; L2: + (movsfcc, movdfcc, movxfcc): Force constant operands to memory. + (movsfcc_1, movdfcc_1, movxfcc_1): Change alternative 3 as above. + +Thu Jul 31 16:04:42 1997 Jason Merrill <jason@yorick.cygnus.com> + + * i386.h (MAX_FIXED_MODE_SIZE): Define. + +Thu Jul 31 16:04:42 1997 Robert Lipe <robertl@dgii.com> + + * i386/sco5.h (SWITCHES_NEED_SPACES) Define. + Required by the COFF (but not ELF) linker. + +Wed Jul 30 15:03:52 1997 Per Bothner <bothner@cygnus.com> + + * demangle.h (DMGL_JAVA): New option to request Java demangling. + * cplus-dem.c: Various changes to produce Java output when passed + DMGL_JAVA. Thus "::" becomes "." and "JArray<Foo>" becomes "Foo[]". + (main): Support --java and -j flags to set DMGL_JAVA. + +Wed Jul 30 08:56:08 1997 Philip Blundell <Philip.Blundell@pobox.com> + + * configure.in (arm-*-*): Replace with arm-*-aout. + * arm/aout.h (SET_ASM_OP): Define by default. + * arm/riscix.h (SET_ASM_OP: Undefine. + * arm.h (CPP_SPEC): Add %(subtarget_cpp_spec). + (SUBTARGET_CPP_SPEC): New macro. + * arm/linux.h: Include aout.h rather than arm.h directly. + (TARGET_CPU_DEFAULT): Define. + ({ASM,CPP}_SPEC): Remove. + * arm/t-linux (MULTILIB_OPTIONS): Use -mapcs-NN instead of -mN. + (LIB1ASMSRC): Use generic ARM version. + (CROSS_LIBGCC1): Define. + * arm/lib1funcs-linux.asm: Remove. + +Tue Jul 29 17:57:47 1997 Per Bothner <bothner@cygnus.com> + + * Add hooks for using autconf-style Makefile.in in language subdirs. + * configure.in (all_outputs, oldstyle_subdirs): New variables. + Pass all_outputs to AC_OUTPUT. + * configure.lang: Only iterate over oldstyle_subdirs. + + * Patches to use cpplib with cc1 #if USE_CPPLIB. + * configure.in (--enable-c-cpplib): New option. + (extra_c_flags, extra_c_objs): New variables. + * Makefile.in (EXTRA_C_OBJS): New variable. + (INTERNAL_CFLAGS): Add @extra_c_flags@. + (C_OBJS): Add $(EXTRA_C_OBJS). + * c-lex.c (generally): Replace getc and ungetc by macros GETC and + UNGETC. Avoid explicit references to finput. + (yy_get_token): New function, that calls cpp_get_token. + (init_parse): New function - calls init_lex. + (finish_parse): New function (called by compile_file). + (GET_DIRECTIVE_LINE): New macro wrapper replaces get_directive_line. + (lang_init): Don't check_newline - already know main_input_filename. + (handle_sysv_pragma): Remove FILE* parameter. + * toplev.c (finput): Remove #if USE_CPPLIB. + (compile_file): #if USE_CPPLIB don't open input file here, + do it in cpp_start_read. Call init_parse instead of init_lex. + At end, call finish_parse instead of fclose(finput). + +Mon Jul 28 15:48:29 1997 Brendan Kehoe <brendan@cygnus.com> + + * integrate.c (expand_inline_function): Use xmalloc instead of + alloca for the LABEL_MAP. + (save_for_inline_copying): Likewise. + +Mon Jul 28 11:22:16 1997 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (compile_file): Also emit any deferred TREE_PUBLIC inlines. + (rest_of_compilation): Use decl_printable_name instead of DECL_NAME + to identify functions in the RTL dump files. + + * dwarf2out.c (add_location_or_const_value_attribute): + leaf_renumber_regs_insn. Also eliminate_regs here. + (add_AT_location_description): Not here. Don't emit anything + for a variable that has been optimized away. + (add_const_value_attribute): Likewise. + + * dwarfout.c (location_or_const_value_attribute): + leaf_renumber_regs_insn. Also eliminate_regs here. + (location_attribute): Not here. + + * stor-layout.c (layout_type): Fix ancient code to match ancient + comment. Use mode of field for one-field structs. + +Sun Jul 27 12:09:02 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * function.c (put_var_into_stack, trampoline_address): Treat + inline_function_decl like current_function_decl. + * expr.c (expand_expr, case LABEL_DECL): Likewise. + (expand_expr, case SAVE_EXPR): Handle top-level SAVE_EXPR by + moving into current function; abort if in incorrect context. + * fold-const.c (fold_range_test, fold): Avoid making SAVE_EXPR + if at top level. + + * dwarfout.c (ASM_OUTPUT_SOURCE_FILENAME): Delete default value. + + * alpha.h (TARGET_SWITCHES): Add -mno-byte. + + * expr.c (get_inner_unaligned_p): Deleted. + (expand_assignment): Remove special-case of constant array. + (expand_expr, case ARRAY_REF): Likewise, and clean up remaining code. + + * explow.c (probe_stack_range): Do probing with loop if more + than a small number. + +Fri Jul 25 15:42:34 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * configure.in: Finish fixing calculation if default thread + support is enabled. + +Fri Jul 25 15:30:09 1997 Doug Evans <dje@cygnus.com> + + * Makefile.in (native): Depend on config.h. + (gcc.o): Depend on Makefile, not config.status. + +Fri Jul 25 10:56:50 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (pa_reorg): If TARGET_BIG_SWITCH, then do not explode + ADDR_VEC insns. Slightly rework code which explodes ADDR_VEC + insns. + * pa.h (TARGET_BIG_SWITCH): Define. + (TARGET_SWITCHES): Add "big-switch" and "no-big-switch". + (CASE_VECTOR_MODE): Use TI or DI depending on TARGET_BIG_SWITCH. + (CASE_DROPS_THROUGH): Remove definition. + (ASM_OUTPUT_ADDR_VEC_ELT): Rewrite to handle TARGET_BIG_SWITCH. + (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise. + * pa.md (casesi): Rework to avoid some potential long branch + problems (also makes generated code faster!). Handle + TARGET_BIG_SWITCH. + (casesi0): Corresponding changes. + +Fri Jul 25 08:36:47 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * calls.c: (expand_call): If -fstack-check and temp needed + for arg is too large, use alloca. + * expr.c (expand_expr, case MODIFY_EXPR): Don't preexpand calls + if LHS is an indirect via a constant pointer. + +Thu Jul 24 21:49:11 1997 Pat Rankin <rankin@eql.caltech.edu> + + * bitmap.c (bitmap_operation): Reset CURRENT on deferred deletion. + +Wed Jul 23 23:52:14 1997 Chris Smith <csmith@convex.hp.com> + + * convex.h (CHECK_FLOAT_VALUE): Fix OVERFLOW capitalization. + +Wed Jul 23 13:00:47 1997 Richard Earnshaw <rearnsha@cambridge.arm.com> + + * configure.in (arm-*-netbsd*): Fix typo setting tmake_file. + +Wed Jul 23 06:39:35 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * configure.in (alpha*): Put quotes around MASK_GAS. + +Tue Jul 22 15:24:45 1997 Brendan Kehoe <brendan@cygnus.com> + + * tree.c (array_type_nelts): Make sure the domain of TYPE is set + before we try to use it. + +Tue Jul 22 12:26:13 1997 Doug Evans <dje@cygnus.com> + + * sparc.c (gen_v9_scc): Handle early clobber of result. + * sparc.md (seqdi_special): Don't clobber %xcc. + (snedi_special, seqdi_special_trunc, snedi_special_trunc): Likewise. + (snedi_zero, neg_snedi_zero, seqdi_zero, neg_seqdi_zero): Likewise. + (snedi_zero_trunc, seqdi_zero_trunc): Likewise. Renamed from ..._sp64. + (snedi_zero_trunc_sp32, seqdi_zero_trunc_sp32): Delete. + + * Makefile.in (Makefile): Pass xmake_file, tmake_file to + configure.frag + (distclean): Delete Make-host, Make-target. + * configure.in (host_overrides): Set to Make-host. + (dep_host_xmakefile): Loop over all elements in host_make_file. + (target_overrides): Set to Make-target. + (dep_tmake_file): Loop over all elements in tmake_file. + (configure.frag): Pass dep_host_xmake_file, dep_tmake_file. + * configure.frag: New arguments xmake_files, tmake_files. + Build Make-host, Make-target. + +Mon Jul 21 23:17:44 1997 Paul Eggert <eggert@twinsun.com> + + * objc/Make-lang.in, objc/Makefile.in: Comment out lines containing + just formfeeds. + +Mon Jul 21 14:05:46 1997 Doug Evans <dje@cygnus.com> + + * Makefile.in (Makefile): Depend on config.status instead + of configure. + (config.status): Depend on configure. Run config.status --recheck + if out of date. + (cstamp-h.in): Use echo instead of touch. + + * reload1.c (reload_cse_mem_conflict_p): Restore handling of + (mem:BLK const0_rtx) meaning all memory is clobbered. + +Mon Jul 21 06:20:10 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k.md (iorsi_zexthi_ashl16): Mark output operand as earlyclobber. + +Sun Jul 20 06:11:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * configure.in (alpha*-*-*): Set cpu_type to alpha. + Change "alpha-" to "alpha*-" in all entries. + Set target_cpu_default for ev5 and ev56 systems. + Use symbolic names for target_cpu_default. + * alpha.c (override_options): Set default for alpha_cpu + from TARGET_CPU_DEFAULT. + * alpha.h (MASK_CPU_EV5): New macro. + + * tree.c (contains_placeholder_p): Call contains_this_placeholder_p. + (contains_this_placeholder_p): Renamed from contains_placeholder_p. + Added new arg, PL. + Rework to make more consistent, check more codes, and avoid + undefined fields. + * expr.c (expand_expr, case PLACEHOLDER_EXPR): Pick outermost + object in placeholder_list of right type without a PLACEHOLDER_EXPR. + +Sat Jul 19 18:00:01 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * alpha.c (override_options): Allow processor of ev56 or 21164a. + (input_operand, case MEM): Correct test involving TARGET_BYTE_OPS. + * alpha.h (SECONDARY_{IN,OUT}PUT_RELOAD_CLASS): Don't need for + QImode or HImode if TARGET_BYTE_OPS. + (ASM_FILE_START): Write a .arch directive. + (STACK_CHECK_BUILTIN): New macro. + * alpha.md ({zero_,}extend[qh]i[dsh]i2): Rework TARGET_BYTE_OPS cases. + (mov[hq]i): Likewise. + (extend[qh]i[hsd]i2x): Add missing cases and fix typo in constraint. + (reload_{in,out}[qh]i): Disable for TARGET_BYTE_OPS. + +Fri Jul 18 23:24:57 1997 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (make_decl_rtl): Don't use ASM_FORMAT_PRIVATE_NAME for + local decls with TREE_PUBLIC set. + (bc_make_decl_rtl): Likewise. + +Fri Jul 18 22:16:28 1997 Doug Evans <dje@cygnus.com> + + * configure.in: Invoke AC_CONFIG_HEADER. + Check for string.h, strings.h, stdlib.h, time.h, unistd.h. + Check for whether malloc/realloc/free need to be declared. + (links): Rename config.h to config2.h. + (AC_OUTPUT): Create cstamp-h. + * Makefile.in (config.in,cstamp-h.in): Add rules for. + (config.h,cstamp-h): Add rules for. + (distclean): Delete config2.h, cstamp-h. + (ALL_CFLAGS): Add @DEFS@. + * aclocal.m4, acconfig.h: New files. + + * Makefile.in (distclean): Delete Make-host, Make-target. + * configure.in (host_overrides): Set to host_xmake_file, don't create + Make-host. + (target_overrides): Set to tmake_file, don't create Make-target. + (language subdir support): Keep together. + + * c-decl.c (duplicate_decls): Set DECL_ABSTRACT_ORIGIN to olddecl + if inline function and not new definition. + + * configure.in: Don't loop trying to configure language subdirs. + Don't pass to configure.lang variables it doesn't use. + * configure.lang: Delete top level directory from loop. + Delete code not useful for language subdirs. + +Fri Jul 18 08:12:53 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE> + + * toplev.c (rest_of_compilation): Call reload_cse_regs here. + * reload1.c (reload): Don't call it here. + (reload_cse_mem_conflict_p): Remove MEM_OFFSET and MEM_MODE args. + (reload_cse_mem_conflict_p, case MEM): Call anti_dependence. + (reload_cse_invalidate_mem): Update call to reload_cse_mem_conflict_p. + (reload_cse_regs): No longer static. + Call init_alias_analysis. + Ignore CLOBBER in a PARALLEL. + +Fri Jul 18 06:44:22 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * objc/Make-lang.in (objc-headers): Fix command for the new build + directory layout, don't pass srcdir variable. + * objc/Makefile.in (copy-headers): Use $(srcdir) from this + makefile, not the parent's. + +Thu Jul 17 16:03:03 1997 Doug Evans <dje@cygnus.com> + + * configure.lang (EXTRA_HEADERS,EXTRA_PASSES,EXTRA_PARTS): Delete. + (EXTRA_PROGRAMS,EXTRA_OBJS,EXTRA_GCC_OBJS,MD_DEPS): Delete. + (version) Delete duplicate entry. + * configure.in (merged_frags): Delete unused variable. + (extra_headers_list): Move setting outside of subdir loop. + (extra_headers,extra_passes): Don't pass to configure.lang. + (extra_programs,extra_parts,extra_objs): Likewise. + (host_extra_gcc_objs,gxx_include_dir,md_cppflags): Likewise. + +Thu Jul 17 07:00:43 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * expr.h (STACK_CHECK_*): Provide default values. + (probe_stack_range): New declaration. + * flags.h (flag_stack_check): Likewise. + * explow.c (allocate_dynamic_stack_space): Call probe_stack_range. + (emit_stack_probe, probe_stack_range): New functions. + * function.c (expand_function_end): If function is non-leaf and stack + checking is requested, emit needed probes. + * reload1.c (reload): If checking stack, verify frame small enough. + * stmt.c (expand_decl): If stack checking, use alloca for large vars. + * toplev.c (flag_stack_check): New variable. + (f_options): Add "stack-check". + + * reorg.c (mark_target_live_regs): Pass FIRST_PSEUDO_REGISTER to + call to EXECUTE_IF_SET_IN_REG_SET. + +Wed Jul 16 14:51:00 1997 Jason Merrill <jason@yorick.cygnus.com> + + * i960.h (ASM_OUTPUT_ALIGNED_BSS): Define. + (ASM_OUTPUT_ALIGNED_LOCAL): Use standard method to convert ALIGN + to power-of-two of bytes. + + * sparc.h (ASM_OUTPUT_ALIGNED_BSS): Define. + * sparc/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Undef before definition. + +Wed Jul 16 14:34:09 1997 Klaus Espenlaub (kespenla@hydra.informatik.uni-ulm.de) + + * calls.c (emit_library_call_value): Initialize all argvec elements. + +Wed Jul 16 14:31:39 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * global.c (global_conflicts): Pass FIRST_PSEUDO_REGISTER to + call to EXECUTE_IF_SET_IN_REG_SET. + +Wed Jul 16 10:57:03 1997 Richard Earnshaw (rearnsha@cambridge.arm.com) + + * From Rob Black (r.black@ic.ac.uk) and Mark Brinicombe + (amb@physig.ph.kcl.ac.uk): + * configure.in (arm-*-netbsd*): New configuration. + * arm/netbsd.h, arm/t-netbsd, arm/xm-netbsd.h: New files. + +Wed Jul 16 10:57:03 1997 Richard Earnshaw (rearnsha@cambridge.arm.com) + + * arm.c (tune_flags): New variable. + (target_{cpu,fpe}_name): Delete. + (arm_fpu_arch): New variable. + (arm_select): Also allow -march=... to configure just the + architecture. + (all_procs): Allow armv{2,2a,3,3m,4,4t} for use with -march=. + (arm_override_options): Handle -march=, but don't let -mcpu= + and -mtune= match the architecture names, since we can only + tune for an implementation. Rework selection of tuning options + for floating point. + (use_return_insn): Support interworking with Thumb code. + (arm_rtx_costs): Rework multiply costs so that cost is based on + the tune, not the architecture. + (f_register_operand): New function. + (output_return_instruction): Support interworking with Thumb code. + (output_func_epilogue): Support interworking with Thumb code. + Remove redundant calculation of code_size. Use floating-point + load-multiples if permitted. + (emit_sfm): New function. + (arm_expand_prologue): Use floating-point store-multiples if + permitted. + + * arm.h (CPP_CPU_ARCH_SPEC): Handle -march=... + (TARGET_OPTIONS): Add arch= and fp=. Delete fpe=. + (enum processor_type): Add PROCESSOR_NONE, for use in all_procs table. + (FP_DEFAULT): Default floating point architecture for generic + back-end. + (PREDICATE_CODES): Add f_register_operand. + + * arm.md (*push_fp_multi): New pattern. + + +Tue Jul 15 22:08:47 1997 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (exeext): Set to build_exeext not exeext. + * configure.in (exeext): Delete redundant set and AC_SUBST call. + Change remaining AC_SUBST to use build_exeext instead of exeext. + +Tue Jul 15 15:48:25 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * configure.in: Fix calculation if default thread support is enabled. + +Tue Jul 15 13:38:46 1997 Mike Meissner <meissner@cygnus.com> + + * rtl.h (replace_regs): Declare. + +Mon Jul 14 16:18:19 1997 Jason Merrill <jason@yorick.cygnus.com> + + * i960.h (ASM_OUTPUT_MI_THUNK): Define. + + * dwarf2out.c (gen_subprogram_die): Remove unreachable and redundant + code. + +Mon Jul 14 14:22:45 1997 Jeffrey A Law (law@cygnus.com) + + * calls.c (emit_library_call): Use right index into argvec array + when iterating over arguments which need to be pushed on the stack. + (emit_library_call_value): Likewise. + +Mon Jul 14 08:17:41 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * gcc.c (convert_filename): Fix typo. + +Mon Jul 14 08:10:12 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * configure.in: Clear headers and lib2funcs before re-reading + config-lang.in. + + * m68k/linux.h (LINK_SPEC): Fix last change. + +Mon Jul 14 08:03:38 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * configure.in (sparc-*-linux-gnu{*,libc1*}): Add sparc/t-linux. + * sparc/t-linux: New file. + + * alpha/elf.h (LINK_SPEC): Fix typo. + * configure.in (alpha-*-linux-gnu*): Set tmake_file. + * alpha/t-linux: New file. + +Mon Jul 14 07:41:37 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.c (output_{and,ior,xor}si3): New functions from patterns bodies. + * m68k.h (output_{and,ior,xor}si3): New extern declarations. + * m68k.md (adddi3, subdi3): Allow constant operand. + (anddi3, iordi3, xordi3): New patterns. + ({and,ior,xor}si3_internal): Use corresponding output_???si3 function. + +Mon Jul 14 07:33:11 1997 Fila Kolodny <fila@ibi.com> + + * configure.in (*-*-gnu*): Add crt{begin,end}S.o to extra_parts. + +Mon Jul 14 07:26:36 1997 Craig Burley <burley@gnu.ai.mit.edu> + + * varasm.c (assemble_variable): If low part of size + doesn't fit in an int, variable is too large. + +Mon Jul 14 06:51:37 1997 Mike Meissner <meissner@cygnus.com> + + * bitmap.{h,c}: New files. + * Makefile.in (OBJS): Add bitmap.o. + (BASIC_BLOCK_H): New make variable for basic-block.h, bitmap.h. + ({flow,combine,regclass,local-alloc,reload1,reorg,sched}.o): Use + BASIC_BLOCK_H variable instead of basic-block.h. + * basic-block.h (*REG_SET): Delete old implementation; use bitmap.h. + (regset_{size,bytes}): Delete. + (regs_live_at_setjmp): Declare. + (EXECUTE_IF_SET_AND_RESET_IN_REG_SET): Delete. + * flow.c (init_regset_vector): Make global; don't take basic block + times # of pseduos as argument. + (life_analysis): Change all init_regset_vector calls. + Use free_regset_vector to release arrays only flow uses at end. + (allocate_for_life_analysis): Change init_regset_vector call. + Don't set regset_{size,bytes}. + (free_regset_vector): Call FREE_REG_SET to release any + memory allocated by each vector. + (propagate_block): Call FREE_REG_SET on dead/live. + (mark_used_regs): Don't use REGSET_ELT_TYPE anymore. + * output.h (allocate_for_life_analysis): Add declaration. + (regno_uninitialized, regno_clobbered_at_setjmp): Likewise. + (dump_flow_info, flow_analysis): Likewise. + * regclass.c (init_reg_sets): Invoke INIT_ONCE_REG_SET. + (allocate_reg_info): Invoke MAX_REGNO_REG_SET. + (regset_release_memory): Free basic_block_live_at_start storage. + * reorg.c (mark_target_live_regs): Delete unused variables. + * sched.c (schedule_block): Free space associated with + reg_pending_sets and old_live_regs. + (schedule_insns): Free bb_{dead,live}_regs on first pass. + (sched_analyze_insn): Use EXECUTE_IF_SET_IN_REG_SET and then clear. + * toplev.c (rest_of_compilation): Call regset_release_memory. + +Mon Jul 14 00:14:13 1997 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (main): Prefer DWARF 2 or stabs with -ggdb. + * ns32k/tek6000.h (PREFERRED_DEBUGGING_TYPE): DBX_DEBUG. + * alpha.h (PREFERRED_DEBUGGING_TYPE): SDB_DEBUG. + * mips.h (PREFERRED_DEBUGGING_TYPE): SDB_DEBUG. + +Sun Jul 13 15:11:08 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * stupid.c (stupid_mark_refs): If setting reg set only in this + insn and not referenced, make REG_UNUSED note. + +Sun Jul 13 14:03:19 1997 Michael Meissner <meissner@cygnus.com> + + * gcc.c (process_command): If -save-temps and -pipe were specified + together, don't do -pipe. + +Sun Jul 13 12:27:03 1997 Doug Evans <dje@cygnus.com> + + * gcc.c (main): Handle blank in version_string when comparing + with compiler_version. + +Sat Jul 12 01:53:55 1997 Jason Merrill <jason@yorick.cygnus.com> + + * sparc.c (output_function_prologue): Fix offset from CFA. + (sparc_flat_output_function_prologue): Likewise. + +Fri Jul 11 09:49:15 1997 Jeffrey A Law (law@cygnus.com) + + * mips.c (epilogue_reg_mentioned_p): Delete unused function. + (mips_epilogue_delay_slots): Likewise. + (function_epilogue): Greatly simplify. + (mips_expand_epilogue): If we have a null prologue/epilogue, + then use a normal return insn. Emit blockage insns before + stack pointer adjustments. + (mips_can_use_return_insn): Renamed from simple_epilogue_p. All + callers changed. Do not use return insns if $31 is live in the + function or if generating profiling information. + * mips.h (DELAY_SLOTS_FOR_EPILOGUE): Delete. + (ELIGIBLE_FOR_EPILOGUE_DELAY): Likewise. + * mips.md (return): Remove expander and change the pattern to + look like a standard "return" insn. + (return_internal): Show use of $31 explictly. + (epilogue expander): Enable. + +Thu Jul 10 13:04:53 1997 Doug Evans <dje@cygnus.com> + + * cccp.c (INO_T_EQ): Return 0 for MSDOS. + + * Makefile.in (CC): Use autoconf value. + +Tue Jul 8 18:08:00 1997 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (gen_subprogram_die): When handling declarations, test + DECL_CONTEXT not decl_class_context before equate_decl_number_to_die. + +Tue Jul 8 16:47:13 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000.md (movsi define_split): Use unsigned HOST_WIDE_INT, + not unsigned. + +Sat Jul 7 00:01:41 1997 Jim Meyering <meyering@eng.ascend.com> + + * i386/t-sol2 (crt[1in].o): Also depend on $(GCC_PASSES). + +Fri Jul 4 11:45:39 1997 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (DWARF_CIE_HEADER_SIZE, DWARF_FDE_HEADER_SIZE, + size_of_cfi, size_of_fde, calc_fde_sizes, next_fde_offset, + cie_size): Lose. + (ASM_OUTPUT_DWARF_STRING): Move earlier. + (INCOMING_FRAME_SP_OFFSET): Provide default. + (initial_return_save): Adjust for CFA offset. + (dwarf2out_frame_debug): Lookup initial CFA offset when setting up. + (output_call_frame_info): Use label subtraction for length fields. + Add pointer to exception region information in for_eh case. + (dwarf2out_do_frame): New fn. + (dwarf2out_frame_init): Use INCOMING_FRAME_SP_OFFSET. + (dwarf2out_frame_finish): Don't bother emitting .debug_frame for + non-Irix targets. Just emit .eh_frame. + (output_die): Refer to an FDE with label subtraction. + * i386.h (INCOMING_FRAME_SP_OFFSET): Define. + * defaults.h (DWARF2_UNWIND_INFO): Define if + INCOMING_RETURN_ADDR_RTX is provided. + * final.c (final): Don't call dwarf2out_frame_debug unless we are + doing dwarf 2. + +Thu Jul 3 17:37:52 1997 Jim Wilson <wilson@cygnus.com> + + * fp-bit.c (unpack_d): Check fraction not sign to distinquish QNaN. + +Wed Jul 2 09:48:03 1997 Michael Meissner <meissner@cygnus.com> + + * loop.c (strength_reduce): Make sure register does not exceed the + table size when looking up the last UID. + +Wed Jul 2 07:47:44 1997 Nick Burrett <n.a.burrett@btinternet.com> + + * genoutput.c (process_template): Place increment expression + outside of putchar function call. + +Wed Jul 2 06:56:52 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * sparc/linux.h (LIBGCC_SPEC): Removed. + (CC1_SPEC): Add %{profile:-p}. + ({CPP,LIB,LINK}_SPEC): Choose glibc 1 or 2 depending on USE_GNULIBC_1. + * configure.in (sparc-*-linux-gnulibc1*): New configuration. + + * configure.in (powerpc-*-linuxgnu*): Default thread_file is posix. + Set xmake_file to x-linux. Add extra_parts. + * rs6000/linux.h (LINK_SPEC): Defined. + + * m68k/linux.h (LINK_SPEC): Pass -shared for -shared. + ({CPP,LINK}_SPEC): Choose for glibc 1 or 2 depending on USE_GNULIBC_1. + * configure.in (m68k-*-linux-gnu*): Default thread_file is `posix'. + (m68k-*-linux-gnulibc1): New configuration. + + * alpha/elf.h (LINK_SPEC): Change ld-gnu.so.1 to ld-linux.so.2. + * configure.in (alpha-*-linux-gnu*): Default thread_file is `posix'. + +Wed Jul 2 06:12:37 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * alpha.md (divsi3, modsi3, udivsi3): Comment out. + (extendsfsd2_no_tp): Add alternative with output in MEM, input in REG. + + * configure.in (*-linux*): Add "-gnu" to names to match. + + * libgcc2.c (_trampoline): Add stdcall attribute to VirtualProtect + on i386. + + * objc/objc.gperf: Renamed from gperf. + +Wed Jul 2 05:42:19 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * objc/Make-lang.in ($(srcdir)/objc/objc-parse.c): Fix command + to use the right file names. + +Tue Jul 1 23:25:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * reorg.c (redundant_insn): If INSN or possible match has REG_UNUSED + note, don't have match. + +Tue Jul 1 18:36:24 1997 Doug Evans <dje@cygnus.com> + + * mips.c (mips_output_external): Don't output .extern's for + variables in user specified sections unless they're .sbss/.sdata. + +Tue Jul 1 18:30:26 1997 Jim Wilson <wilson@cygnus.com> + + * cse.c (find_best_addr): Add missing rtx_cost arguments. + + * fp-bit.c (float_to_usi): Move code for negative numbers before code + for infinity. Modify infinty code to only handle positive infinities. + +Tue Jul 1 11:16:41 1997 Robert Lipe <robertl@dgii.com> + + * fixinc.sco: Restore pwd aftercopy. + Convert declaration of abs in math.h to prototype. + Fix static functions in sys/stat.h for C++. + +Tue Jul 1 10:55:47 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000.md ({add,ior,xor}si3): Change to use define_expand wrapper + and split add/ior/xor of large constants early. + (andsi3): Remove 6/29 code to do and of large constants. + (nor, nand, eqv, maskir): Add names to all logical define_insns. + +Tue Jul 1 09:03:35 1997 Jeffrey A Law (law@cygnus.com) + + * h8300.h (BIGGEST_FIELD_ALIGNMENT): Remove definition. + * mips.h (BIGGEST_FIELD_ALIGNMENT): Likewise. + +Mon Jun 30 14:58:00 1997 Jeffrey A Law (law@cygnus.com) + + * sh.c (sh_expand_epilogue): Emit blockage insn before cutting + back stack. + +Sun Jun 29 11:27:07 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000.h (TARGET_FLAGS): Add -m{,no-}update to suppress + creating load/store with update instructions, and also + -m{,no-}fused-madd to suppress the generation of fused add and + multiply instructions. Move debug flags to TARGET_OPTIONS. + (GO_IF_LEGITIMATE_ADDRESS): Don't allow PRE_{INC,DEC} if -mno-update. + (GO_IF_MODE_DEPENDENT_ADDRESS): Ditto. + (rs6000_debug_{name,stack,arg}): Add declarations. + (toc_initialized): Likewise. + (got_no_const_operand): Likewise. + (PREDICATE_CODES): Add got_no_const_operand. + (toc_section): Make toc_initialized a global. + (RTX_COSTS): Set appropriate costs for add, logical operators that + are really two instructions. + + * rs6000.c (rs6000_debug_{name,stack,arg}): Add definitions. + (rs6000_override_options): Process debug flags. + (toc_initialized): Global to say toc initialized. + (small_data_operand): Use #if TARGET_ELF, not #ifdef TARGET_SDATA. + (rs6000_init_expanders): Likewise. + (SMALL_DATA_RELOC): Likewise. + (got_no_const_operand): Recognize SYMBOL_REF and LABEL_REF. + (rs6000_makes_calls): System V profiling doesn't count as a call. + (rs6000_stack_info): Likewise. + (rs6000_output_load_toc_table): Take register number argument to + determine register to load. Generate correct code if more than + one toc table is done in System V due to profiling or non-local + gotos. If System V toc is not initialized, initialize it now. + (rs6000_allocate_stack_space): Move code from output_prolog to + allocate stack space. Take -mno-update into account. + (output_prolog): Call rs6000_allocate_stack_space. Only set + rs6000_pic_func_labelno if not profiling. + (output_function_profiler): Implement System V profiling. + (and_operand): Don't call reg_or_short_operand. + (rs6000_finalize_pic): If not optimizing, insert a USE of the GOT + register as the last insn. + + * rs6000.md (load/store update): Take -mno-update into account. + If -msoft-float, support SF load/store with update to GPR regs. + (allocate_stack): Take -mno-update into account. + (add/subtract + multiply instructions): Take -mno-fused-madd into + account. + (nonlocal_goto_receiver): Specify register # to load. + ({add,and,ior,xor}si3): Recognize operation done with full 32 bit + constant, splitting latter if need be. + (andsi3 define_split): Fix up splitting andsi3 of large constant. + ({ior,xor}si3 define_split): Use GEN_INT to create integer rtx + values. + (movsi_got{,_internal}): Split the load of a CONST into load of + the SYMBOL_REF/LABEL_REF and an add. + (movsi): Know that addsi3 can handle large values now for NT. + + * sysv4.h (TARGET_SDATA): Remove explicit bit for -msdata. + (SUBTARGET_OVERRIDE_OPTIONS): Likewise. + (ASM_OUTPUT_ALIGNED_LOCAL): Likewise. + (SUBTARGET_SWITCHES): Indicate -m{,no-}sdata doesn't set any flags. + (ASM_SPEC): Only pass -m{,no-}reg-names if assembling .s/.S files. + (CC1_SPEC): If -msdata, invoke compiler with -msdata=default. + (PROFILE_BEFORE_PROLOGUE): Likewise. + (RS6000_MCOUNT): Define as "_mcount". + (toc_section): Make toc_initialized a global. + +Fri Jun 27 19:01:11 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * config/t-linux-gnulibc1: New file. + * configure.in (i[3456]86-*-linux*): Default thread_file is `posix'. + (i[3456]86-*-linux*gnulibc1): New case. + * config/linux.h (LIB_SPEC): Choose for glibc 1 or 2 depending + on USE_GNULIBC_1. + * i386/linux.h (CPP_SPEC, LINK_SPEC): Likewise. + +Fri Jun 27 19:00:52 1997 Ralf Baechle <ralf@waldorf-gmbh.de> + + * config/linux.h (PREFERRED_DEBUGGING_TYPE): Undefine before define. + +Fri Jun 27 18:35:04 1997 Alan Modra <alan@spri.levels.unisa.edu.au> + + * configure.in: Clean up Make-{host,target,hooks} in all + subdirs, not just '.'. + * Makefile.in (distclean): Delete */Make-{host,target,lang,hooks}. + +Fri Jun 27 18:27:11 1997 Fila Kolodny <fila@ibi.com> + + * config/xm-gnu.h (fcntl.h): Only include if not building libgcc.a. + +Fri Jun 27 18:17:44 1997 Doug Evans <dje@cygnus.com> + + * configure.frag: Rewrite. + + * objc/Make-lang.in (OBJC_CCOMMON): Object files don't go in srcdir. + (OBJC_OBJS): Likewise. + (OBJC_O): Likewise. + (objc-parse.o, objc-act.o): Fix rules. + (objc/libobjc files): Fix rules. + +Fri Jun 27 13:23:38 1997 Andrew Cagney <cagney@tpgi.com.au> + + * fp-bit.c (float_to_si): Correct return value when Inf. + +Fri Jun 27 10:47:09 1997 Scott Christley <scottc@net-community.com> + + * Makefile.in (DLLTOOL): Define.e + * objc/Make-lang.in (libobjc_entry.o, libobjc_s.a, libobjc.dll): + New targets. + (objc.install-normal): Install Objective-C runtime as a DLL. + (objc.mostlyclean): Clean up files used to build DLL. + * objc/libobjc.def: New file. + * objc/libobjc_entry.c: New file. + + * objc/sendmsg.c (search_for_method_in_list): No longer static. + + * Makefile.in (GCC_THREAD_FILE): Renamed from OBJC_THREAD_FILE. + * configure.lang (GCC_THREAD_FILE): Likewise. + * configure.in (--enable-threads): New parameter. + * objc/Make-lang.in (OBJC_THREAD_FILE): New definition.e + * objc/config-lang.in: Print message about ObjC thread file. + + * cccp.c (INO_T_EQ): Define for Win32 but not Cygwin32. + * i386/mingw32.h: New file. + * i386/xm-mingw32.h: New file. + * configure.in (i[3456]86-*-mingw32): New target. + * protoize.c (link): Eliminate definition on Win32. + + * objc/thr-posix.c (__objc_thread_yield): Use sched_yield instead. + +Fri Jun 27 10:36:41 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS): + Round up when calculating possible end address. + +Wed Jun 25 19:54:29 1997 Jim Wilson <wilson@cygnus.com> + + * unroll.c (final_giv_value): Verify that bl->initial_value is + invariant before trying to use it. + +Wed Jun 25 18:13:05 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000/sysv4.h (WCHAR_TYPE{,_SIZE}): Make wchar_t long as per + ABI spec. + +Wed Jun 25 16:56:16 1997 Jason Merrill <jason@yorick.cygnus.com> + + * sparc.h (INCOMING_RETURN_ADDR_RTX): Define. + (DBX_REGISTER_NUMBER): Fix frame pointer regno for -mflat. + * sol2.h (DBX_REGISTER_NUMBER): Likewise. + * sparc.c (save_regs): Emit dwarf2 frame debug info. + (output_function_prologue, sparc_flat_save_restore, + sparc_flat_output_function_prologue): Likewise. + + * dwarf2.h (enum dwarf_call_frame_info): Add DW_CFA_GNU_window_save. + * dwarf2out.c (dwarf_cfi_name, output_cfi): Support it. + (dwarf2out_cfi_label): Make non-static. + (initial_return_save): Support PLUS. + (dwarf2out_window_save, dwarf2out_return_save, + dwarf2out_return_reg): New fns. + + * dwarf2out.c (SECTION_FORMAT): Use PUSHSECTION_FORMAT, if defined. + (DEBUG_INFO_SECTION): Rename from DEBUG_SECTION. + (DEBUG_LINE_SECTION): Rename from LINE_SECTION. + * mips/iris6.h: Likewise. + +Wed Jun 25 16:25:41 1997 Scott Christley <scottc@net-community.com> + + * Makefile.in (GCC_PASSES): Don't define with $(exeext). + * configure.in ({cc,stage_prefix}_set_by_configure): Eliminate extra + comma and don't pass value to configure.lang. + * objc/Make-lang.in (objc-runtime): Add objc-headers. + + * configure.in: Execute configure.frag in a shell. + + * configure.in (cross_overrides, build_overrides): Default to + /dev/null to help platforms where sed cannot handle empty filenames. + + * Reorganize thread implementation to make a clearly defined + front-end/back-end interface. + * objc/thr-{decosf1,irix,mach,os2,posix,pthreads,single}.c: Completely + rework according to new interface. + * objc/thr-{solaris,win32}.c: Likewise. + * objc/thr.c: Likewise. + * objc/thr.h: Define front-end/back-end interface functions and + structures. + +Wed Jun 25 16:14:10 1997 Ovidiu Predescu <ovidiu@net-community.com> + + * Complete implementation of +load. + * objc/init.c (objc_send_load): New function. + (objc_class_tree): New structure. + (create_tree_of_subclasses_inherited_from): New function. + (__objc_tree_insert_class): New function. + (objc_tree_insert_class): New function. + (objc_preorder_traverse): New function. + (objc_postorder_traverse): New function. + (__objc_tree_print): New function. + (__objc_destroy_class_tree_node): New function. + (class_is_subclass_of_class): New function. + (__objc_exec_class): Allocate class tree list and load hash table. + (__objc_send_message_in_list): Rewrite using hash table. + (__objc_send_load): Remove calls to _objc_load_callback. + (objc_send_load): Make static. Create Tree of classes resembling + class hierarchy for all modules. Call __objc_send_load on all of + the modules in __objc_module_list. + (__objc_create_classes_tree): New function. + + * objc/encoding.h (method_get_sizeof_arguments): Fix typo. + * objc/objc-api.h (OBJC_ERR_BAD_STATE): New error code. + On NeXT redefine object_copy and object_dispose to avoid + a conflict with those defined in system library. + * objc/selector.c (__objc_register_instance_methods_to_class): New + function. + * objc/runtime.h: Likewise. Add missing function prototypes. + +Wed Jun 25 15:09:01 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Makefile.in (Makefile): Execute configure.frag from srcdir. + + * Makefile.in (configure): Target is $(srcdir)/configure. + +Tue Jun 24 15:18:14 1997 Jim Wilson <wilson@cygnus.com> + + * m68k.h (LIMIT_RELOAD_CLASS): Define. + + * recog.c (constrain_operands): When checking earlyclobbers, use + operands_match_p instead of rtx_equal_p. + + * dwarfout.c (field_byte_offset): Check for object_offset_in_bits + greater than bitpos_int and recompute object_offset_in_bytes if true. + + * mips.md (movdi_internal): Add x/J alternative. + (movdi_internal2): Add x/J alternative; change a/I to a/J. + (movsi_internal1, movsi_internal2): Change x/I alternative to x/J. + +Tue Jun 24 08:49:56 1997 Jeffrey A Law (law@cygnus.com) + + * pa.h (ASM_OUTPUT_SECTION_NAME): Fix typo. + +Mon Jun 23 22:48:00 1997 Jim Wilson <wilson@cygnus.com> + + * unroll.c (find_splittable_givs): Set splittable_regs_updates to + biv_count for reduced givs. + +Mon Jun 23 10:51:53 1997 Jeffrey A Law (law@cygnus.com) + + * mn10200.c, mn10200.h, mn10200.md: New files for mn10200 port. + * lib1funcs.asm, divmod.c, udivmod.c, udivmodsi4.c: Likewise. + * t-mn10200, xm-mn10200.h, va-mn10200.h: Likewise. + * Makefile.in (USER_H): Add va-mn10200.h. + * varargs.h, stdarg.h: Include va-mn10200.h. + * configure.in (mn10200-*-*): New target. + +Sun Jun 22 06:47:19 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * combine.c (force_to_mode): Don't do anything for ASM_OPERANDS insn. + +Sun Jun 22 06:29:28 1997 J. Kean Johnston <jkj@sco.com> + + * ginclude/stdarg.h: Protect va_list definition from SCO headers. + * ginclude/varargs.h: Likewise. + +Sat Jun 21 20:56:23 1997 Scott Christley <scottc@net-community.com> + + * Make ObjC a front-end language. + * Makefile.in (LANGUAGES, COMPILERS, .PHONY, stmp-int-hdrs): Remove + specific references to ObjC compiler and source files. + ({mostly,dist,maintainer,}clean, install-normal): Likewise + (OBJC_OBJS, OBJC, OBJECTIVE-C, cc1obj, objc-runtime): Rules deleted. + (libobjc.a, sublibobjc.a, objc-parse.{o, c, y}): Rules deleted. + (objc-headers, install-libobjc): Rules deleted. + * objc/Make-lang.in: New file; from rules deleted above. + * objc/config-lang.in: New file. + * objc/Makefile.in: Changes to support ObjC as a front-end language; + renamed from Makefile.in. + * objc-act.{c,h}, objc-parse.{c,y}, objc-tree.def: Moved to objc dir. + +Sat Jun 21 07:54:36 1997 Robert Lipe <robertl@dgii.com> + + * fixinc.sco (math.h): Correct the collision of "exception". + +Sat Jun 21 06:51:40 1997 Peter Gerwinski <peter@agnes.dida.physik.uni-essen.de> + + * rs6000.c (output_epilog): Name is "GNU Pascal", not all caps. + +Sat Jun 21 06:29:19 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * gcc.c (main): Check for and read ${libdir}/gcc-lib/specs to + override the default specs. + +Fri Jun 20 17:20:15 1997 Jim Wilson <wilson@cygnus.com> + + * mips.c (output_block_move): When loading addresses into registers, + add checks for ABI_N32 and ABI_64. + (mips_expand_prologue): Add check for SImode in code splitting + tsize_rtx when it is large_int. + +Fri Jun 20 09:07:31 1997 Russell King <rmk92@ecs.soton.ac.uk> + + * configure.in (arm-*-linuxaout): New target. + * arm/lib1funcs-linux.asm, arm/linux-gas.h: New files. + * arm/linux.h, arm/t-linux, arm/xm-linux.h: New file. + * xm-linux.h: Undef some macros before defining them. + +Thu Jun 19 21:18:20 1997 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (output_line_info): Always use DW_LNE_set_address instead + of DW_LNS_fixed_advance_pc for line number addresses. + (size_of_line_info): Adjust size calculation as per above change. + (text_end_label): Make it static. + +Thu Jun 19 14:55:49 1997 Brendan Kehoe <brendan@cygnus.com> + + * toplev.c (xmalloc): Only give the fatal msg if SIZE is non-zero. + +Sun Apr 27 23:19:13 1997 Ulrich Drepper <drepper@cygnus.com> + + * libgcc2.c (__eh_type): Remove `extern' to make this a definition. + +Wed Jun 18 18:10:16 1997 Per Bothner <bothner@cygnus.com> + + * dbxout.c (dbxout_type_fields): Skip field if DECL_IGNORED_P. + +Wed Jun 18 18:04:33 1997 Mike Stump <mrs@cygnus.com> + + * except.c (end_eh_unwinder): If we have a return instruction, we + have to make sure we use it and don't fall off the end of the + function in the unwinder. + +Wed Jun 18 14:27:58 1997 Mike Stump <mrs@cygnus.com> + + * flow.c (find_basic_blocks): Fix end case bug. + +Tue Jun 17 18:35:57 1997 Mike Stump <mrs@cygnus.com> + + * libgcc2.c (__eh_pcnthrow): Add support -fno-sjlj-exceptions + -fPIC exception handling on the SPARC. + * sparc.h (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise. + * libgcc2.c (__eh_ffetmnpc): Remove. + +Mon Jun 16 20:28:51 1997 Jason Merrill <jason@yorick.cygnus.com> + + * collect2.c (extract_string): Null-terminate. + +Mon Jun 16 14:38:44 1997 Michael Meissner <meissner@cygnus.com> + + * combine.c (set_nonzero_bits_and_sign_copies): Use REG_SET macros + instead of doing bit operations directly. + (try_combine,reg_dead_at_p): Ditto. + * caller-save.c (save_call_clobbered_regs): Ditto. + * reload1.c (reload): Ditto. + * local-alloc.c (update_equiv_regs,block_alloc): Ditto. + * sched.c (schedule_block): Dito. + +Sun Jun 15 20:46:12 1997 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (dwarf2out_frame_debug): Handle IOR. + (struct limbo_die_struct): Define. + (TYPE_DECL_IS_STUB): Call decl_ultimate_origin if DECL_ABTRACT_ORIGIN + is set. + (limbo_die_count): Delete. + (libmo_die_list): Define. + (new_die): Add die to limbo_die_list instead of incrementing + limbo_die_count. + (add_AT_location_description): Renamed from add_location_attribute. + New parameter attr_kind. + (add_location_or_const_value_attribute, gen_subprogram_die, + add_bound_info): Change call to add_AT_location_description. + (add_bound_info): Add call to contains_placeholder_p. Ignore + MAX_EXPR and VAR_DECL. + (add_subscript_info): Ignore the index type if it is an unnamed + integral type. + (scope_die_for): Move check for function-local tags after code setting + containing_scope, and add check for non-NULL containing_scope + (add_type_attribute): If unnamed type, use TREE_TYPE instead. + (gen_enumeration_type_die, gen_struct_or_union_type_die): Call + add_child_die if die_parent is NULL. + (gen_subprogram_die): Ifdef out DW_AT_static_link code. + (decls_for_scope): Delete decrement of limbo_die_count. + (dwarf2out_finish): Add code to traverse the limbo_die_list, and + call add_child_die if die_parent is NULL. Delete limbo_die_count code. + * mips.c (mips_expand_prologue): If tsize_rtx is large_int, emit two + insns instead of one splitable insn, setting RTX_FRAME_RELATED_P. + +Fri Jun 13 19:33:35 1997 Brendan Kehoe <brendan@cygnus.com> + + * fixincludes: Also fix AIX NULL macro in sys/{dir,param,types}.h. + +Thu Jun 12 22:53:12 1997 Jim Wilson <wilson@cygnus.com> + + * m68k.md (mov[qhs]i): Remove pair of constraints which allow + offsetable memory addresses to be moved to the same for TARGET_5200. + +Thu Jun 12 15:33:01 1997 Jeffrey A Law (law@cygnus.com) + + * pa.h (SELECT_RTX_SECTION): Place symbolic operands into the + data section. + + * pa.c (emit_move_sequence): Rewrite code to handle arithmetic + involving plabels. + +Wed Jun 11 08:57:14 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * tree.c (unsave_expr_now): Avoid recursing into the parts of + the tree that are RTL. + +Thu Jun 12 09:43:55 1997 Jeffrey A Law (law@cygnus.com) + + * reorg.c (emit_delay_sequence): Call set_new_first_and_last_insn + after the new sequence insn has been spliced into the insn chain. + +Wed Jun 11 23:10:49 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (call, call_value): Use "call" instead of "calls" + for calls to named functions. + +Wed Jun 11 00:22:34 1997 Jim Wilson <wilson@cygnus.com> + + * configure, configure.in: Restore changes from Feb 15 to Apr 13 + lost during conversion to autoconf. + +Tue Jun 10 18:23:35 1997 Mike Stump <mrs@cygnus.com> + + * stmt.c (expand_decl_cleanup): Avoid core dumping when exceptions + aren't on. + +Tue Jun 10 18:22:30 1997 Jason Merrill <jason@yorick.cygnus.com> + + * collect2.c (extract_string): New fn. + (main): Use it. + +Tue Jun 10 17:40:15 1997 Jim Wilson <wilson@cygnus.com> + + * expr.c (emit_group_load): Add case using gen_lowpart. + +Tue Jun 10 17:14:58 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000/rs6000.c (rs6000_override_options): If -mcpu=403, set + -mstrict-align as well. + + * rs6000/t-ppc{,gas} (MULTILIB_EXTRA_OPTS): Build libraries with + -mstrict-align. + + * configure.in ({powerpc,rs6000}*-*-*): Add embedded targets to + --with-cpu=n support. + +Tue Jun 10 07:06:12 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * flow.c (mark_used_regs): Fix typo in Jun 4 change. + +Mon Jun 9 20:26:26 1997 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (MAYBE_USE_COLLECT2): Renamed from MAYBE_USE_COLLECT. + +Mon Jun 9 19:42:21 1997 Jason Merrill <jason@yorick.cygnus.com> + + * fold-const.c (fold): Don't do COND_EXPR -> MIN_EXPR folding if it + loses information that might be needed by a later use as an lvalue. + +Mon Jun 9 19:10:50 1997 Alexandre Oliva <oliva@dcc.unicamp.br> + + * configure.in: Don't override a user's setting for prefix + on platforms that use the native prefix. + +Mon Jun 9 19:00:49 1997 Brendan Kehoe <brendan@melange.gnu.ai.mit.edu> + + * integrate.c (expand_inline_function): Use the mode of FNDECL's + result rtl, not the result type itself, in setting ARRIVING_MODE. + + * reload1.c (reload): Use xmalloc instead of alloca for the label + offsets in OFFSETS_AT and OFFSETS_KNOWN_AT. + +Mon Jun 9 15:16:52 1997 Mike Stump <mrs@cygnus.com> + + * flow.c (find_basic_blocks): Eliminate more dead code, enables + dead throws to be eliminated. + +Mon Jun 9 17:15:50 1997 Stephen L Moshier <moshier@world.std.com> + + * alpha.c (check_float_value): Underflow and overflow constants + are different for FLOAT_VAX and default targets. + +Mon Jun 9 16:48:21 1997 Scott Christley <scottc@net-community.com> + + * Makefile.in (Makefile): Process language fragments. + * configure.frag: New file. + * configure.in: Move language fragment processing to configure.lang.e + + * Makefile.in (GCC_PASSES): Prevent all compilers from being + built when only the C compiler is needed. + + * configure.in (cross_overrides, build_overrides): Use absolute + path to GCC top-level source directory. + + * configure.in: Save target alias for language directories. + + * configure.in (with-gxx-include-dir): New parameter for + setting the g++ header file directory. + * Makefile.in (gxx_include_dir): Use autoconf variable. + + * configure.in: Add parameter for setting local prefix. + + * configure.lang: New file. + * configure.in: Move language subdirectory Makefile processing + into configure.lang. + +Mon Jun 9 16:44:47 1997 Jim Wilson <wilson@cygnus.com> + + * sched.c (attach_deaths): Fix typo in Jun 4 change. + +Mon Jun 9 15:13:00 1997 Marc Lehmann (pcg@goof.com) + + * varasm.c (assemble_end_function): Switch back to function + section after outputting constant pool. + +Mon Jun 9 14:47:22 1997 Paul Eggert <eggert@twinsun.com> + + * tree.c (change_main_variant): Remove unused function. + (build_array_type): Remove obsolete references to + change_main_variant. + * c-decl.c (complete_array_type): Likewise. + + * c-common.c (c_build_type_variant): Don't futz with main type + variant of array since C Standard requires main type variant of + array-of-const also be array-of-const. + + * Makefile.in: Comment out lines containing just formfeeds. + + * Makefile.in (distclean): Remove config.bak. + (maintainer-clean): Output warning. + Do not remove `configure'. + +Mon Jun 9 14:44:17 1997 J.T. Conklin <jtc@netbsd.org> + + * configure.in (*-*-netbsd): Restore changes of Apr 13th lost in + autoconf conversion: tmake_file now t-netbsd; delete xmake_file. + +Mon Jun 9 14:39:29 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * expr.c (expand_builtin, case BUILT_IN_FRAME_ADDRESS): + Use correct function name in error message. + + * Makefile.in (diff): Exclude bi-parser.h. + + * i386.h (CC1_CPU_SPEC): Renamed, was CC1_SPEC. + (CC1_SPEC): New macro. + (EXTRA_SPECS): Add "cc1_cpu". + * i386/linux.h (CC1_SPEC): New macro. + +Mon Jun 9 13:23:06 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k/next.h (TARGET_DEFAULT): Use MASK_68040, + not MASK_68040_ALSO. + * m68k/mot3300.h, m68k/ccur-GAS.h (TARGET_DEFAULT): Likewise. + + * m68k.h (MACHINE_STATE_{SAVE,RESTORE}): Test #ifdef __mcf52000__, + not if (TARGET_52000); fixed for mc68000 case. + + * m68k/mot3300.h (CPP_SPEC): Define __mc68020__ if no -m[c]68000 + command-line option given. + +Mon Jun 9 09:19:17 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * Makefile.in (target_alias): Substitute with target_alias. + + * final.c (final_scan_insn): Use single_set to check cc_status.flags. + +Mon Jun 9 09:09:07 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * c-common.c (check_format_info): Correct handling of the 'a' flag + which adds another pointer level. + +Sun Jun 8 00:34:25 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (conditional branch insns): Get length right for branches + to targets which can not be reached with a "bl" instruction. + * pa.c (output_cbranch): Handle branches to targets which can not + be reached with a "bl" instruction. + + * pa.md (alternate dbra pattern): Remove incorrect pattern. + +Sat Jun 7 23:30:25 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (struct defer_plab): Renamed to struct deferred_plabel. + Remove "symbol" field and replace with "name" field. + (output_function_epilogue): Don't output deferred plabels here. + (output_deferred_labels): New function. Output them here instead. + (output_call): Rewrite long call support. + * pa.h (ASM_FILE_END): Define. + (LEGITIMATE_CONSTANT_P): Never accept a function_label_operand. + * pa.md (HIGH and LO_SUM of function address): Remove patterns. + +Fri Jun 6 16:09:04 1997 Mike Stump <mrs@cygnus.com> + + * libgcc2.c (__eh_ffetmnpc): Add support for machines that cannot + access globals after throw's epilogue when -fno-sjlj-exceptions is + used. + * rs6000.c (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise. + * mips.h (DONT_ACCESS_GBLS_AFTER_EPILOGUE): Likewise. + (INITIAL_ELIMINATION_OFFSET): Fix RETURN_ADDRESS_POINTER_REGNUM + for 64 bit words, with 32 bit pointers and variable endianness. + +Fri Jun 6 17:27:58 1997 Mike Meissner <meissner@cygnus.com> + + * regclass.c (allocate_reg_info): Fix off by one error. + +Fri Jun 6 17:17:41 1997 Doug Evans <dje@cygnus.com> + + * basic-block.h (EXECUTE_IF_SET_IN_REG_SET): Fix setting of scan_rs_. + (EXECUTE_IF_SET_AND_RESET_IN_REG_SET): Likewise. + (EXECUTE_IF_AND_IN_REG_SET): Likewise. + (EXECUTE_IF_AND_COMPL_IN_REG_SET): Likewise. + +Fri Jun 6 15:42:59 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (notice_cc_update): Set CC_FCOMI is this is a float compare. + +Fri Jun 6 15:12:38 1997 Jim Wilson <wilson@cygnus.com> + + * basic-block.h (REG_SET_TO_HARD_REG_SET): Fix typo. + + * sched.c (update_flow_info): When add extra REG_DEAD note for original + dest, handle case where last insn both uses and sets dest. + +Thu Jun 5 22:19:36 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * fixinc.irix: Add declaration of __vfork to unistd.h. + + * i960/vx960-coff.h (CPP_SPEC): Always define CPU, even if they + use -ansi; the VxWorks headers assume it's always present. + * sparc/vxsparc.h (CPP_SPEC): Define, adding the CPU definition to + what came from sparc.h. + (CPP_PREDEFINES): Don't define it here. + +Thu Jun 5 13:40:33 1997 Mike Meissner <meissner@cygnus.com> + + * basic-block.c (OBSTACK_ALLOC_REG_SET): Rename from + OBALLOC_REG_SET. Add obstack pointer parameter. + + * flow.c (function_obstack): Add declaration. + (life_analysis): Don't allocate the space to hold to vector of + regsets here. + (init_regset_vector): Add pointer parameter and delete space + paramter. Use OBSTACK_ALLOC_REG_SET to allocate. Change callers. + (propagate_block): Use ALLOCA_REG_SET instead of bare alloca. + + * sched.c (schedule_block): Fix typo in yesterday's changes. + * reorg.c (mark_target_live_regs): Ditto. + +Thu Jun 5 09:44:49 1997 Jeffrey A Law (law@cygnus.com) + + * sh.c (trap_exit, sp_switch): New variables. + (print_operand, case '@'): If trap_exit is nonzero, then use + a trapa instead of an rte/rts to exit the current function. + (sh_expand_prologue): Switch stacks at function entry as needed. + (sh_expand_epilogue): Similarly at function exit. + (function_epilogue): Clear trap_exit and sp_switch too. + (sh_valid_machine_decl_attribute): New function. + * sh.h (VALID_MACHINE_DECL_ATTRIBUTE): Define. + (sp_switch): Declare. + * sh.md (sp_switch_1, sp_switch_2): New named patterns. + +Wed Jun 4 18:11:14 1997 Michael Meissner <meissner@cygnus.com> + + * basic-block.h (REGSET_ELT_BITS): Make this explicitly unsigned, so + that division and modulus of REGSET_ELT_BITS uses a pure shift. + (*_REG_SET): New macros to abstract the register set interface. + + * caller-save.c (save_call_clobbered_regs): Use new *_REG_SET + macros. + * flow.c (life_analysis,propagate_block,insn_dead_p): Ditto. + (regno_uninitialized,regno_clobbered_at_setjmp,mark_set_1): Ditto. + (mark_used_regs,dump_flow_info,global_conflicts): Ditto. + global.c (mark_elimination): Ditto. + * reorg.c (mark_target_live_regs): Ditto. + * sched.c (sched_{analyze_{1,insn},note_set}): Ditto. + (birthing_insn_p,attach_deaths,unlink_notes,schedule_block): Ditto. + + * sched.c (sometimes structure): Delete offset, bit fields, replace + with regno. + (new_sometimes_live): Take regno argument, not offset and bit. + Change all callers. + +Tue Jun 3 19:18:36 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * fixincludes: Fix AIX NULL macro use of void*. + +Tue Jun 3 15:21:04 1997 Jason Merrill <jason@yorick.cygnus.com> + + * sparc.h (ASM_OUTPUT_MI_THUNK): Handle -fpic. + +Mon Jun 2 16:53:53 1997 Michael Meissner <meissner@cygnus.com> + + * loop.c (n_times_{set,used}): Make type int, not short. + (scan_loop): n_times{set,used} are now int pointers. + + * sched.c (sched_reg_n_deaths): Remove unused variable. + (struct sometimes): Make fields int sized, not short. + (schedule_insns): Don't set sched_reg_n_deaths, nobody uses it. + + * regclass.c (allocate_reg_info): Allocate the space for + reg_renumber, but don't set reg_renumber unless new argument + RENUMBER_P is set. If this is the first call for the function and + we need to grow space, use free/xmalloc instead of realloc since we + will be initializing the whole array. If number of registers is < + 0, just free up the space. + (reg_scan): Update allocate_reg_info call. + + * regs.h (allocate_reg_info): Change prototype. + + * flow.c (allocate_for_life_analysis): Update allocate_reg_info + call. + + * local-alloc.c (local_alloc): Call allocate_reg_info to allocate + and initialize the reg_renumber array. + * stupid.c (stupid_life_analysis): Ditto. + +Mon Jun 2 14:50:06 1997 Dave Miller <davem@jenolan.rutgers.edu> + + * sparc/sparc.md (v9 eq/ne cond move patterns): Add early clobber + constraint to destination. + +Fri May 30 11:00:44 1997 Michael Meissner <meissner@cygnus.com> + + * regs.h (reg_info): New structure to group the arrays indexed by + register number created by reg_scan and flow_analysis that are + globally visiable. + (reg_n_info): Pointer to the register information array. + (reg_n_{refs,sets,deaths,calls_crossed}): Delete variables. + (reg_changes_size): Ditto. + (REG_N_{REFS,SETS,DEATHS,CALLS_CROSSED}): New macros to reference + reg_n_info. + (REG_{CHANGES_SIZE,{FIRST,LAST,LAST_NOTE}_UID}): Ditto. + (allocate_reg_info): Add declaration. + + * basic-block.h (reg_basic_block): Delete. + (REG_BASIC_BLOCK): Use reg_n_info structure. + + * caller-save.c: Change all references to the above arrays to use + the corresponding macro to access the reg_n_info array. + * combine.c, cse.c, flow.c, global.c, jump.c, local-alloc.c: Ditto. + * loop.c, regclass.c, reload1.c, sched.c, stupid.c, unroll.c: Ditto. + + * regclass.c (allocate_reg_info): New function to allocate the + reg_info array and initialize the appropriate fields. + (reg_scan): Call it. + + * flow.c (allocate_for_life_analysis): Call allocate_reg_info to do + the actual allocation. + +Thu May 29 15:42:59 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md (movsfcc_1, movdfcc_1, movxfcc_1): Use singlemove_string + for float conditional move when destination and operands all differ. + + * i386.h (ASM_OUTPUT_REG_{PUSH,POP}): add %% before register name. + + * go32.h (ASM_OUTPUT_ALIGN): Use .p2align, not byte alignments. + +Wed May 28 20:44:00 1997 Mike Stump <mrs@cygnus.com> + + * except.c (push_eh_entry): Eliminate start of exception region + label, as it isn't used. Rename end_label to outer_context. + (expand_eh_region_start_for_decl): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_start_all_catch): Likewise. + * except.h (eh_entry): Likewise. + * except.c (expand_eh_region_end): Likewise. Jump around the nop + that we insert, so that we can optimize it away, if it is unused, + also so that flow analysis can tell if we fall through to the end + of a function or not so that it can know if a function that returns + a value, in fact does or not. + +Wed May 28 10:50:09 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (jump): Handle out of range unconditional jump + when not optimizing. + +Thu May 22 00:57:07 1997 Jeffrey A Law (law@cygnus.com) + + * reload1.c (reload_cse_record_set): Ignore values for SREG if + their mode is narrower than DEST_MODE. + + * pa.h (DFMODE_RETURN_STRING): Define. + (SFMODE_RETURN_STRING): Likewise. + (ASM_DECLARE_FUNCTION_NAME): Use them. + +Wed May 21 23:32:02 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (reload_insi): Handle SUBREG properly. + +Tue May 20 22:32:13 1997 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (dwarf2out_def_cfa): Set cfa_reg at the top. + +Tue May 20 16:57:50 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cplus-dem.c (do_type): Handle `J'. + (demangle_fund_type): Print "complex" for it. + +Mon May 19 21:01:53 1997 Jim Wilson <wilson@cygnus.com> + + * m68k.c (output_move_qimode): Add coldfire support. + * m68k.h (PUSH_ROUNDING): Add coldfire support. + * m68k.md (scc0_di, scc_di, seq, sne, sgt, sgtu, slt, sltu, sge, sgeu, + sle, sleu): Add coldfire support. + +Mon May 19 17:53:34 1997 Mike Meissner <meissner@cygnus.com> + + * rs6000/rs6000.c: (rs6000_pic_func_labelno): New variable to hold + the pic label number for the function's LCL label. + (rs6000_output_load_toc_table): Use it. + (output_prolog): Store current value. + +Sun May 18 16:32:08 1997 Michael Meissner <meissner@cygnus.com> + + * config/dbxcoff.h (ASM_OUTPUT_SOURCE_LINE): Use the macros + ASM_{GENERATE,OUTPUT}_INTERNAL_LABEL to create/output the line + number label. + +Sun May 18 13:55:12 1997 John Vickers (john@rhizik.demon.co.uk) + + * m68k.h (TARGET_SWITCHES): Add new target name, cpu32. + +Sun May 18 13:50:10 1997 Pat Rankin <rankin@eql.caltech.edu> + + * cccp.c (VMS_write, VMS_read): Delete. + (safe_write): If MAX_WRITE_LEN is defined, limit + incremental write attempts to that amount. + (safe_read): Analogous situation for MAX_READ_LEN. + * cpplib.c (safe_read): Likewise. + * vax/xm-vms.h (MAX_WRITE_LEN, MAX_READ_LEN): Define. + + * vax/xm-vms.h (get_dynamic_handler_chain_libfunc): New macro. + (protect_cleanup_actions_with_terminate): New macro. + +Sun May 18 08:50:25 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k/linux.h (ASM_COMMENT_START): Define. + * m68k/linux-aout.h (ASM_COMMENT_START): Define. + + * reload1.c (reload_cse_regno_equal_p): Check for value using more + than one register on a big endian machine. + +Sun May 18 08:39:59 1997 Vince Del Vecchio <vdelvecc@spd.analog.com> + + * loop.c (maybe_eliminate_biv_1): In (set (cc0) <biv>) case, + swap compare operands when mult_val < 0 in one additional place. + +Sun May 18 08:33:30 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * dwarf2out.c (ASM_COMMENT_START): Add default definition. + + * Makefile.in (maintainer-claean): Delete configure. + +Sun May 18 08:31:59 1997 Scott Christley <scottc@net-community.com> + + * configure.in: New file. + * Makefile.in: Change to utilize autoconf variables. + * configure: Now an output file. + +Sun May 18 07:48:31 1997 J.T. Conklin <jtc@netbsd.org> + + * m68k.md (mov[qhs]i,movstrict[qs]i, mulsi3): Use 'Q' constraint + for TARGET_5200. + * m68k.h (EXTRA_CONSTRAINT): New macro. + + * m68k.h (TARGET_SWITCHES): Add 68020-60. + Mask out bits which indicate a particular processor when a different + processor is selected. + (MASK_68040_ALSO): Remove. + (MASK_68040): Change to be a single bit. + + * m68k.h (TARGET_ALIGN_INT, MASK_ALIGN_INT): New macros. + (BIGGEST_ALIGNMENT): Determine according to TARGET_ALIGN_INT. + (TARGET_SWITCHES): Add align-int and no-align-int. + + * m68k.md (mov[qhs]i}): Add pair of constraints which allow + offsetable memory addresses to be moved to the same for TARGET_5200. + + * m68k.c (output_move_strict{hi,qi}): New functions. + * m68k.h (output_move_strict{hi,qi}): Declare. + * m68k.md (movstrict*): Changed into define_expands. + Split insns into m68k and coldfire specific versions with appropriate + constraints. + +Sun May 18 07:26:40 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * libgcc2.c (atexit): Cast malloc and realloc calls. + +Sat May 17 16:26:51 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE> + + * final.c (profile_function): Call function_section, not + text_section. + +Sat May 17 16:01:00 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * cse.c (notreg_cost): New function, extracted from COST macro. + (COST): Use notreg_cost. + +Sat May 17 15:13:23 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * cse.c (cse_insn): Don't record a SRC that's a MEM and the same + as a REG_EQUIV note if DEST is set more than once. + +Fri May 16 14:50:57 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (output_move_double): Handle loading a general register + from a scaled indexed memory address. + * pa.md (movdf, movdi): Allow scaled loads into general registers. + +Fri May 16 13:31:08 1997 Mike Stump <mrs@cygnus.com> + + * rs6000.c (rs6000_stack_info): Only do eabi setup for "main", + when main is the global main, not some nested routine that + happens to be called main. + +Thu May 15 17:19:50 1997 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_all_catch): If the machine needs to + perform any actions at the start of an expcetion handler that + hasn't already been done, use gen_exception_receiver to emit it. + (expand_leftover_cleanups): Likewise. + * alpha/alpha.md (exception_receiver): Use it. + * pa/pa.h (exception_receiver): Use it. + +Thu May 15 08:36:59 1997 Jeffrey A Law (law@cygnus.com) + + * dbxout.c (dbxout_function_end): Don't subtract one from + the end of function scoping stab. + +Wed May 14 23:27:09 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (adddi3, subdi3): Remove expanders and patterns. + +Wed May 14 18:51:35 1997 Mike Stump <mrs@cygnus.com> + + * function.c (expand_function_end): Make sure we finish off any + leftover exception handlers. + +Tue May 13 14:07:01 1997 Mike Stump <mrs@cygnus.com> + + * expr.c (expand_builtin_setjmp): Remove setting of + current_function_has_nonlocal_goto, as this isn't a goto. + +Tue May 13 14:47:40 1997 Richard Earnshaw (rearnsha@cambridge.arm.com) + + * arm.h (CPP_SPEC): Fix typo invoking cpp_endian. + * arm/t-semi (LIB2FUNCS_EXTRA): Build fp-bit.c when compiling + with -msoft-float. + * arm.c: Add prototypes for all static functions. + (output_multi_immediate, int_log2): Make static. + + * arm.h (*_SPEC): Remove all references to mle/mbe. + * arm/coff.h (MULTILIB_DEFAULTS): Likewise. + * arm/t-bare (MULTILIB_OPTIONS): Change options mbe/mle to mbig-endian + and mlittle-endian. + (MULTILIB_MATCHES): Nothing matches that matters. + +Mon May 12 20:42:20 1997 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_all_catch): If the machine needs a + nonlocal_goto_receiver, add one at the start of the exception + handler. + (expand_leftover_cleanups): Likewise. + +Mon May 12 17:36:28 1997 Jeffrey A Law (law@cygnus.com) + + * mips.c (move_operand): Accept any general operand after reload + has started. + +Fri May 9 14:29:33 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (udivmodhi4, divmodhi4): Remove expander, give + corresponding pattern [u]divmodhir4 name. Clear MDR register + in the udivmodhi4 pattern itself. + (clear_mdr): Delete pattern. + +Thu May 8 18:20:30 1997 Richard Earnshaw (rearnshaw@cambridge.arm.com) + + * arm/aout.h (ASM_OUTPUT_LONG_DOUBLE): Delete call to + arm_increase_location. + (ASM_OUTPUT_{DOUBLE,FLOAT,INT,SHORT,CHAR,BYTE,ASCII,SKIP}): Likewise. + (ASM_OUTPUT_ALIGN): Delete all code refering to arm_text_location. + + * arm.c (arm_increase_location, get_prologue_size): Delete. + (arm_naked_function_p): Add declaration. + (arm_pic_register): Define. + (all_procs): Delete entries for arm{60,620,70,7d,7di,700i,710c}; add + entries for arm{7m,7500fe,8}, strongarm and strongarm110. + (arm_override_options): Rework so that configure can properly set + the default processor type. Add a warning that PIC code is not yet + supported. + (legitimate_pic_operand_p, legitimize_pic_address): New functions. + (is_pic, arm_finalize_pic): New functions. + (arm_adjust_cost): New function. + (const_pool_offset, arm_backwards_branch, short_branch): Delete. + (arm_insn_not_targeted): Delete. + (add_constant): If generating AOF syntax, then handle pic specially. + (output_ascii_pseudo_op): Delete calls to arm_increase_location. + (function_really_clobbers_lr): Calls followed by a barrier don't + clobber the link register. + (output_func_prologue): Handle AOF syntax pic code. + (output_func_epilogue): Handle cases where lr_save_eliminated is set. + Delete call to arm_increase_location. + (arm_asm_output_label): Simplify, since we no-longer need to cache the + label's address. + (aof_pic_entry): New function to keep track of pic symbols. + (aof_dump_pic_table): New function. + + * arm.h (TARGET_CPU_arm*, TARGET_CPU_strongarm*, TARGET_CPU_generic): + define. + (CPP_ARCH_DEFAULT_SPEC): Set up based on setting of TARGET_CPU_DEFAULT. + (CPP_SPEC): Split up into sub-rule calls. + (CPP_CPU_SPEC): Add default definition. + (CPP_APCS_PC_SPEC, CPP_APCS_PC_DEFAULT_SPEC): Add definitions. + (CPP_FLOAT_SPEC, CPP_FLOAT_DEFAULT_SPEC): Add definitions. + (CPP_ENDIAN_SPEC, CPP_ENDIAN_DEFAULT_SPEC): Add definitions. + (CC1_SPEC): Map legacy -m[236] onto -mcpu=.. and -mapcs-{26,32} as + appropriate. Similarly for -mbe and -mle to -m{big,little}-endian. + (EXTRA_SPECS): Define. + (enum processor_type): New types for arm8 and strongarm. + (CONDITIONAL_REGISTER_USAGE): Handle flag_pic. + (LEGITIMIZE_ADDRESS): Likewise. + (ADJUST_COST): Define. + (PIC_OFFSET_TABLE_REGNUM): Define. + (FINALIZE_PIC): Define. + (LEGITIMATE_PIC_OPERAND_P): Define. + (OUTPUT_INT_ADDR_CONST): Define. + (ASM_OUTPUT_MI_THUNK): Delete calls to arm_increase_location. + (MASK_RETURN_ADDR): Use TARGET_APCS_32 not TARGET_6. + + * arm.md (attr cpu): Add new cpu types for arm8 and strongarm. + (attr ldsched): New attribute, set if processor has a load_delay slot. + (function_unit core): Rework to handle load delay slots. + (function_unit loader): New function unit. + (movsi): Handle pic. + (pic_load_addr): New expand. + (*pic_load_addr_based_insn, pic_add_dot_plus_eight): New patterns. + (peepholes to cause flow to return to a label after a function call): + Delete, these have been disabled for a while now. + + * arm/riscix.h (CPP_SPEC): Rewrite using new sub-components. + (SUBTARGET_CPU_DEFAULT): Set to TARGET_CPU_arm2. + * arm/riscix1-1.h (CPP_SPEC): Rewrite using new sub-components. + (SUBTARGET_CPU_DEFAULT): Set to TARGET_CPU_arm2. + * arm/semi.h: (CPP_SPEC): Delete. + (PROCESSOR_DEFAULT): Delete. + (CPP_APCS_PC_DEFAULT_SPEC): Define. + * arm/semiaof.h (CPP_SPEC): Delete. + (CPP_APCS_PC_DEFAULT_SPEC): Define. + * arm/t-semi (LIBGCC1_TEST): Don't build it. + (MULTILIB_{OPTIONS,DIRNAMES,EXCEPTIONS}): Build a suitable set of + cross libraries. + (LIBGCC): Set to stmp-multilib. + (INSTALL_LIBGCC): Set to install-multilib. + +Thu May 8 15:20:46 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (output_float_compare): For pentiumpro use fcomip + followed by a float stack pop for "compare;pop;pop" cases. + +Thu May 8 13:20:20 1997 Chris Torek <torek@elf.bsdi.com> + + * fold-const.c (fold, truth_andor): Disable optimization for + side effects on RHS. + +Wed May 7 15:43:57 1997 Mike Stump <mrs@cygnus.com> + + * except.c (start_dynamic_handler): Fix so that we can use + __builtin_setjmp, and default to using __builtin_setjmp instead of + setjmp. + * expr.c (expand_builtin_setjmp): New routine, split out from + existing inline code from expand_builtin. + (expand_builtin): Split out code into expand_builtin_setjmp. + * expr.h (expand_builtin_setjmp): Add declaration. + * libgcc2.c (__sjthrow): Default to using __builtin_setjmp instead + of setjmp. + (__sjpopnthrow): Likewise. + * optabs.c (init_optabs): Likewise. + +Wed May 7 18:01:24 1997 Samuel Figueroa <Samuel_Figueroa@next.com> + + * rs6000.md (insv): Only combine insert with shift if + remaining source bits >= destination field size. + +Tue May 6 15:48:52 1997 Jason Merrill <jason@gerbil.cygnus.com> + + * dwarf2out.c (dwarf2out_begin_prologue): Increment + current_funcdef_number here. + (dwarf2out_end_epilogue): Not here. + +Mon May 5 18:52:32 1997 Jeffrey A Law (law@cygnus.com) + + * h8300.c (notice_update_cc): Use CC_SET_ZN and CC_SET_ZNV. + (shift_one, shift_two): Set CC_NO_CARRY as needed. Remove + references to CC_OVERFLOW_0. + (emit_a_shift): Similarly. + * h8300.h (CC_OVERFLOW_0): Remove. + * h8300.md: Use set_zn and set_znv for cc0 tracking. + (bCC): Restore the comparison is CC_OVERFLOW_UNUSABLE is set and + the comparison needs the overflow bits. + + * mn10300.c (notice_update_cc): Use CC_SET_ZN and CC_SET_ZNV. + * mn10300.h (CC_NO_CARRY): Define. + * mn10300.md: Use "set_zn" and "set_znv" to more accurately + describe cc0 status. + +Fri May 2 17:00:33 1997 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c: Reorganize, moving .debug_frame support to the top + of the file, and compile it if INCOMING_RETURN_ADDR_RTX is defined + even if DWARF2_DEBUGGING_INFO isn't. + (EH_FRAME_SECTION): New macro. + (output_call_frame_info): Handle .eh_frame variant. + (dwarf2out_def_cfa): Update cfa_*{reg,offset}. + (dwarf2out_frame_debug): Move cfa_*{reg,offset} to file scope. + (dwarf2out_end_epilogue): Increment current_funcdef_number here. + (dwarf2out_decl): Not here. + (dwarf2out_frame_init, dwarf2out_frame_finish): New fns. + (dwarf2out_init, dwarf2out_finish): Call them. + (output_die): Add missing 'case 8:' + (dwarf2out_decl): Revert other context_die = NULL change. + (add_bound_info): Restore default case. + +Fri May 2 15:30:16 1997 Doug Evans <dje@seba.cygnus.com> + + * m32r/m32r.h (LIT_NAME_P): New macro. + (SMALL_NAME_P): Use it. + (ASM_OUTPUT_ALIGNED_COMMON): Don't output to scommon if -msdata=none. + * m32r/m32r.c (addr24_operand): Handle literals. + (m32r_output_function_prologue): Use IMMEDIATE_PREFIX. + (m32r_output_function_epilogue): Likewise. Use shorter add insn if + able. + +Fri May 2 14:40:44 1997 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000.h (RS6000_ALIGN): Macro renamed from ALIGN. + * rs6000.c (rs6000_stack_info): Use it. + +Fri May 2 14:15:54 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (reload_cse_noop_set_p): When checking the values + equivalent to sreg, make sure the mode is right. + +Fri May 2 12:53:03 1997 Jeffrey A Law (law@cygnus.com) + + * reload1.c (reload_cse_invalidate_regno): Properly set + the mode for invalidate_regno_rtx. + +Thu May 1 14:57:35 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (call_internal_symref): Fix typo. + +Thu May 1 14:44:17 1997 Jim Wilson <wilson@cygnus.com> + + * mips.c (mips_asm_file_start): Use new macro TARGET_FILE_SWITCHING. + (mips_asm_file_end): Likewise. + * mips.h (TARGET_FILE_SWITCHING): Define. + (NO_DBX_FUNCTION_END): Define. + +Thu May 1 09:08:40 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k.c (output_addsi3): Replace "\\;" by "\n\t" in + assembler templates. + +Thu May 1 09:00:42 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * integrate.c (subst_constants, case SUBREG): Cancel changes once + done with result. + +Wed Apr 30 19:45:56 1997 Jim Wilson <wilson@cygnus.com> + + * mips.c (override_options): Set mips_split_addresses only if + TARGET_SPLIT_ADDRESSES is set. + * mips.h (MASK_SPLIT_ADDR, TARGET_SPLIT_ADDRESSES): New macros. + (TARGET_SWITCHES): Add -msplit-addresses, -mno-split-addresses. + * configure (mips*-*-ecoff*, mips*-*-elf*): Set MASK_SPLIT_ADDR + bit in target_cpu_default2. + + * flags.h (current_function_is_thunk): Add extern to declaration. + + * dbxout.c (dbxout_function): Test NO_DBX_FUNCTION_END at run time + instead of compile time. + + * unroll.c (set_dominates_use): In second loop, add check for copy_end. + + * mips.md (paradoxical_extendhidi2, paradoxical_extendqidi2): New + patterns. + +Wed Apr 30 02:23:24 1997 Jason Merrill <jason@yorick.cygnus.com> + + * output.h (named_section): Add reloc argument. + (DECL_READONLY_SECTION): New macro. + * varasm.c (named_section): Add reloc argument, pass it to + ASM_OUTPUT_SECTION_NAME. + (UNIQUE_SECTION, UNIQUE_SECTION_P): Provide defaults. + (function_section): Pass reloc argument to named_section. + (variable_section, exception_section): Likewise. + (output_constant_def_contents): Likewise. + (assemble_start_function): Use UNIQUE_SECTION_P. UNIQUE_SECTION is + now a statement. + (assemble_variable): Likewise. + * mips/iris6.h (ASM_OUTPUT_SECTION_NAME): Add reloc arg, + use DECL_READONLY_SECTION. + * psos.h, ptx4.h, a29k.h, alpha/elf.h, arm/coff.h, h8300.h: Likewise. + * i386/go32.h, i386/sco5.h, m68k/coff.h, mips/elf64.h: Likewise. + * mips/netbsd.h, pa.h, rs6000/sysv4.h, sh.h, sparc/sysv4.h: Likewise. + * config/svr4.h (SELECT_SECTION): Use DECL_READONLY_SECTION. + (ASM_OUTPUT_SECTION_NAME): Likewise, add reloc argument. + (MAKE_DECL_ONE_ONLY): Just set DECL_WEAK. + (UNIQUE_SECTION, UNIQUE_SECTION_P): Define. + * i386/cygwin32.h (UNIQUE_SECTION_P): Define. + (SUPPORTS_ONE_ONLY): Define. + (MAKE_DECL_ONE_ONLY): Lose. + (ASM_OUTPUT_SECTION_NAME): Add reloc arg, use DECL_READONLY_SECTION. + * i386/winnt.c (i386_pe_unique_section): Add reloc arg, + use DECL_READONLY_SECTION. + + * mips/iris6.h (CTORS_SECTION_ASM_OP): Change aligment based on ABI. + (DTORS_SECTION_ASM_OP): Likewise. + +Tue Apr 29 16:08:07 1997 Jeffrey A Law (law@cygnus.com) + + * pa/lib1funcs.asm (divnorm, modnorm, exitdiv): Fix code to + negate SImode values. + +Tue Apr 29 12:54:14 1997 Mike Stump <mrs@cygnus.com> + + * except.c (expand_eh_region_start_tree): Add DECL argument so we + can better track why the region was made for error reporting. + * except.h (expand_eh_region_start_tree): Likewise. + * tree.h (expand_dhc_cleanup): Likewise. + (expand_dcc_cleanup): Likewise. + * except.c (expand_eh_region_start_for_decl): New routine. + * except.h (expand_eh_region_start_for_decl): Likewise. + * stmt.c (expand_decl_cleanup): Add DECL to call of + expand_eh_region_start_tree. + (expand_dcc_cleanup): Likewise. + (expand_dhc_cleanup): Likewise. + + (expand_start_case): Switches introduce conditional contexts. + (expand_start_case_dummy): Likewise. + (expand_start_case_dummy): Likewise. + (expand_end_case): Likewise. + +Tue Apr 29 11:45:09 1997 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (dwarf2out_decl): Undo earlier change. + (constant_size): Likewise. + (gen_subprogram_die): Handle NULL context_die. + + * mips/iris6.h (ASM_OUTPUT_CONSTRUCTOR): Fix for -mabi=64. + (ASM_OUTPUT_DESTRUCTOR): Likewise. + +Mon Apr 28 09:10:19 1997 Jeffrey A Law (law@cygnus.com) + + * h8300.c (push_order, pop_order): Add missing initializer + entries. + +Fri Apr 25 19:39:43 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * h8300.c (output_adds_subs): check for adding 0. + +Fri Apr 25 14:52:31 1997 Jim Wilson <wilson@cygnus.com> + + * configure (i[3456]86-*-freebsdelf*, i[3456]86-*-freebsd*): Use + t-freebsd instead of x-freebsd. + * i386/t-freebsd: Renamed from x-freebsd. + +Fri Apr 25 12:16:20 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * go32.h (DBX_*): Use definitions from config/dbxcoff.h instead. + +Fri Apr 25 11:55:54 1997 Jason Merrill <jason@yorick.cygnus.com> + + * i386/cygwin32.h (MULTIPLE_SYMBOL_SPACES): Define. + +Thu Apr 24 18:32:56 1997 Jason Merrill <jason@yorick.cygnus.com> + + * i386/winnt.c (i386_pe_unique_section): New fn. + * i386/cygwin32.h (UNIQUE_SECTION): Define. + (MAKE_DECL_ONE_ONLY): Define. + (ASM_OUTPUT_SECTION_NAME): Support DECL_ONE_ONLY. + + * c-decl.c (implicitly_declare): Don't set DECL_ARTIFICIAL. + +Thu Apr 24 17:11:23 1997 Jim Wilson <wilson@cygnus.com> + + * m68k.h (MACHINE_STATE_SAVE, MACHINE_STATE_RESTORE): Add + TARGET_5200 support. + +Thu Apr 24 16:39:25 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * stmt.c (pushcase_range): Check for null range first. + +Wed Apr 23 23:06:28 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (reload_cse_record_set): Use push_operand to check for + changes to the stack pointer. + +Wed Apr 23 19:56:01 1997 Jason Merrill <jason@yorick.cygnus.com> + + * calls.c (expand_call): If we're in a thunk, pass through invisible + references instead of making a copy. + * flags.h: Add current_function_is_thunk. + * function.c: Likewise. + (init_function_start): Initialize it. + (push_function_context_to): Save it. + (pop_function_context_from): Restore it. + * function.h (struct function): Add is_thunk. + +Wed Apr 23 17:47:25 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (secondary_reload_class): Handle more cases where we + need secondary reloads. + (impossible_plus_operand): Accept anything that involves addition + of the stack pointer. + * mn10300.md (reload_insi): Always load the stack pointer into + the destination (which is always an address register). + * mn10300.h (STORE_FLAG_VALUE): Remove definition. + * xm-mn10300.h: Declare malloc, realloc, calloc and free. + +Wed Apr 23 14:28:30 1997 Mike Stump <mrs@cygnus.com> + + * expr.h (sjthrow_libfunc): Add support for setjmp/longjmp based + exception handling. + (sjpopnthrow_libfunc): Likewise. + (terminate_libfunc): Likewise. + (setjmp_libfunc): Likewise. + (longjmp_libfunc): Likewise. + (get_dynamic_handler_chain_libfunc): Likewise. + * expr.c (expand_expr, case TRY_CATCH_EXPR): Likewise. + (expand_expr, case POPDCC_EXPR): Likewise. + (expand_expr, case POPDHC_EXPR): Likewise. + * stmt.c (mark_block_as_eh_region): Likewise. + (mark_block_as_not_eh_region): Likewise. + (is_eh_region): Likewise. + (conditional_context): Likewise. + (expand_start_bindings): Likewise. + (expand_end_bindings): Likewise. + (expand_decl_cleanup): Likewise. + (expand_dcc_cleanup): Likewise. + (expand_dhc_cleanup): Likewise. + (expand_cleanups): Likewise. + * tree.h (mark_block_as_eh_region): Likewise. + (mark_block_as_not_eh_region): Likewise. + (is_eh_region): Likewise. + (conditional_context): Likewise. + (expand_dhc_cleanup): Likewise. + * except.c (exception_via_longjmp): Likewise. + (protect_cleanup_actions_with_terminate): Likewise. + (current_function_dhc): Likewise. + (current_function_dcc): Likewise. + (add_partial_entry): Likewise. + (get_dynamic_handler_chain): Likewise. + (get_dynamic_cleanup_chain): Likewise. + (start_dynamic_cleanup): Likewise. + (start_dynamic_handler): Likewise. + (expand_eh_region_start_tree): Likewise. + (expand_eh_region_start): Likewise. + (expand_eh_region_end): Likewise. + (emit_throw): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_start_all_catch): Likewise. + (expand_end_all_catch): Likewise. + (protect_with_terminate): Likewise. + (start_eh_unwinder): Likewise. + (end_eh_unwinder): Likewise. + (init_eh_for_function): Likewise. + (save_eh_status): Likewise. + (restore_eh_status): Likewise. + (exception_optimize): Likewise. + * optabs.c (sjthrow_libfunc): Likewise. + (sjpopnthrow_libfunc): Likewise. + (terminate_libfunc): Likewise. + (setjmp_libfunc): Likewise. + (longjmp_libfunc): Likewise. + (get_dynamic_handler_chain_libfunc): Likewise. + (init_optabs): Likewise. + * except.h: Likewise. + * libgcc2.c (__default_terminate): Likewise. + (__terminate): Likewise. + (__get_dynamic_handler_chain): Likewise. + (__sjthrow): Likewise. + (__sjpopnthrow): Likewise. + * toplev.c (f_options): Likewise. + * tree.def (TRY_CATCH_EXPR): Likewise. + (POPDHC_EXPR): Likewise. + (POPDCC_EXPR): Likewise. + * config/pa/pa.h: JMP_BUF_SIZE define. + * config/sparc/sparc.h: JMP_BUF_SIZE define. + + * expr.h (cleanups_this_call): Transform uses of cleanups_this_call + into uses of the cleanups managed by the block code + (expand_start_bindings and friends). Remove defer_cleanups_to and + expand_cleanups_to, and use start_cleanup_deferal and + end_cleanup_deferal instead. Add exception_region, + target_temp_slot_level, conditional_code, + last_unconditional_cleanup and cleanup_ptr to struct nesting to + facilitate conditional cleanups. + * expr.c (cleanups_this_call): Likewise. + (init_expr): Likewise. + (save_expr_status): Likewise. + (restore_expr_status): Likewise. + (store_expr): Likewise. + (expand_expr): Likewise. + (defer_cleanups_to): Likewise. + (expand_cleanups_to): Likewise. + (do_jump, case TRUTH_ANDIF_EXPR): Likewise. + (do_jump, case TRUTH_ORIF_EXPR): Likewise. + (do_jump, case COND_EXPR): Likewise. + * stmt.c (struct nesting): Likewise. + (expand_return): Likewise. + (expand_start_bindings): Likewise. + (expand_end_bindings): Likewise. + (expand_cleanups): Likewise. + (start_cleanup_deferal): Likewise. + (end_cleanup_deferal): Likewise. + * tree.h (start_cleanup_deferal): Likewise. + (end_cleanup_deferal): Likewise. + * calls.c (expand_call): Likewise. + * function.h (struct function): Likewise. + + * except.c (asynchronous_exceptions): Support + -fasynchronous_exceptions. + (can_throw): Likewise. + * toplev.c (f_options): Likewise. + + * flags.h (flag_short_temps): Remove support for short temps. + * calls.c (expand_call): Likewise. + * toplev.c (flag_short_temps): Likewise. + + * stmt.c (expand_start_target_temps): Add for convenience. + (expand_end_target_temps): Likewise. + * except.c (jumpif_rtx): Likewise. + * except.c (jumpifnot_rtx): Likewise. + + * stmt.c: Remove all traces of empty_cleanup_list. + +Wed Apr 23 17:26:40 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (reload_cse_mem_conflict_p): Don't assume that a + SUBREG can not conflict with a MEM. + +Wed Apr 23 09:48:58 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * 1750a.md (cmphi): Fixed when next CC user is unsigned. + (mov[hq]i-[23]): New patterns for mem-indirect moves. + (movhf,movtqf): Corrected. + * 1750a.c (memop_valid): Memory indirection now valid. + (nonindirect_operand): Remove. + (print_operand): Fix the 'J' output modifier. + * 1750a.h (FRAME_POINTER_REQUIRED): Not required. + (INITIAL_FRAME_POINTER_OFFSET,FIX_FRAME_POINTER_ADDRESS): Undefine. + (FUNCTION_PROLOGUE,FUNCTION_EPILOGUE): Honor -fomit-frame-pointer. + (ELIMINABLE_REGS,CAN_ELIMINATE,INITIAL_ELIMINATION_OFFSET): Defined. + (PREFERRED_RELOAD_CLASS): Corrected. + (CONST_COSTS,ADDRESS_COST,REGISTER_MOVE_COST,MEMORY_MOVE_COST): + Slight adjustments. + (ASM_APP_ON,ASM_APP_OFF): Corrected. + * ms1750.inc (DUCR.M,DUC.M): Defined. + +Wed Apr 23 09:41:35 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * reload.c (push_reload): Fix last argument of the call to + find_dummy_reload. + +Wed Apr 23 09:29:14 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * configure (i[3456]86-next-*, m68k-next-nextstep{2,3}*): + Remove out_file and add extra_objs. + * config/nextstep.c: Add includes for config.h, stdio.h, and flags.h. + * {i386,m68k}/t-next (nextstep.o): New rule. + * m68k/next.h: Remove include of machmode.h. + * {i386,m68k}/next.c: Files deleted. + +Tue Apr 22 20:45:29 1997 Jason Merrill <jason@yorick.cygnus.com> + + * sparc.h (DBX_CONTIN_LENGTH): Shrink to 1000. + +Tue Apr 22 18:21:20 1997 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (gen_variable_dir): Add test for DW_AT_declaration to + the old_die if statement, and delete assertion for it. + (decl_ultimate_origin): Remove last change. + +Tue Apr 22 10:22:27 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (expand_prologue): End the current sequence before + counting the tst insns in the current function. Start a new + one before emitting any prologue instructions. + + * mn10300.h (REGISTER_MOVE_COST): Bump up cost of moves in the + same class. + + * mn10300.md (untyped_call): New expander. + +Mon Apr 21 16:30:21 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * cse.c (fold_rtx, case PLUS): When seeing if negative of constant + is around, make sure not dealing with largest negative. + +Mon Apr 21 13:57:53 1997 Jim Wilson <wilson@cygnus.com> + + * mips/t-ecoff: Set TARGET_LIBGCC2_CFLAGS instead of LIBGCC2_CFLAGS. + + * m68k.c (output_addsi3): New function. From addsi3 pattern. + * m68k.h (output_addsi3): Add declaration. + * m68k.md (movqi+2): Add address registers. + (movxf+1): Disable for TARGET_5200. + (movxf+2): New pattern for TARGET_5200. + (addsi3): Add define_expand. Move code to output_addsi3. + (addsi3_internal): Renamed from addsi3. Disable for TARGET_5200. + (addsi3_5200): New pattern for TARGET_5200. + +Sun Apr 20 10:45:35 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * fold-const.c (operand_equal_p): Constants are not equal if there + has been an overflow. + + * toplev.c (compile_file): Shorten "branch-probabilities" in + output of times. + + * alpha/vms.h (MOD[SD]I3_LIBCALL): Call ots$rem, not ots$mod. + (DWARF2_DEBUGGING_INFO): Define. + + * alpha.c (alpha_need_linkage): Call get_identifier. + + * rs6000.c (rs6000_output_load_toc_table): New function. + (output_prolog): Call it instead of doing it directly. + * rs6000.md (nonlocal_goto_receiver): New pattern. + + * dwarf2out.c: Major cleanup; mostly reformatting. + Include expr.h. + Undefine inline ifndef __GNUC__; never define to include static. + Add "static" to header of all inlined functions. + Add declarations for all static functions, with prototypes. + (addr_const_to_string): Use HOST_WIDE_INT_PRINT_* macros. + (add_AT_*, new_{die,loc_descr,cfi): Don't check for xmalloc + returning zero. + (modified_type_die): Add missing parm on recursive call. + ({reg,based}_loc_descriptor): Add missing arg to call to new_loc_descr. + (add_const_value_attribute): Use REAL_VALUE_TYPE for fp calculations. + (output_call_frame_info): Add missing arg to output_cfi call. + (dwarf2out_def_cfa): Local variable OLD_REG must be unsigned long. + * Makefile.in (dwarf2out.o): Includes expr.h. + + * dwarf2out.c: Cast first arg in all calls to bzero to char *. + (decl_ultimate_origin): Return NULL if equal to decl. + (constant_size): Never return more than 4. + (value_format, case 8): New case. + (dwarf2out_frame_debug): Use HARD_FRAME_POINTER_REGNUM. + (based_loc_descr): Likewise. + (add_bound_info): Delete default case. + Add cases for CONVERT_EXPR and NON_LVALUE_EXPR; treat like NOP_EXPR. + Change NOP_EXPR to to recursive call. + (add_type_attribute): Ignore unnamed subtype of integral or FP. + (gen_subprogram_die): Use reg_loc_descriptor. + (dwarf2out_decl): Ignore nested functions. + + * fix-header.c, protoize.c, gcov.c: Use symbolic codes for exit. + + * final.c (profile_function): Only call ASM_OUTPUT_REG_{PUSH,POP} + if defined. + + * expr.c ({move,clear}_by_pieces_1, expand_assignment): Ensure + we have unshared rtx before changing flags. + (store_{constructor,field}): Likewise. + (expand_expr, case COMPONENT_REF): Likewise. + (store_expr): Check if TEMP and TARGET are same with rtx_equal_p. + + * emit-rtl.c (change_address, init_emit): Delete forward references. + (rtl_obstack, stack_depth, max_stack_depth): Delete extern decls. + +Fri Apr 18 18:25:52 1997 Jim Wilson <wilson@cygnus.com> + + * function.c (instantiate_decls): For DECL_INCOMING_RTL, use max + of type size and mode size in instantiate_decl call. + + * fixincludes (sys/lc_core.h): Fix OSF1/4.x namespace pollution. + +Wed Apr 16 19:36:53 1997 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (add_bound_info): Use a DIE instead of a location + expression for variable bounds. Trust a MEM rtx even when + optimizing. + (DWARF_FRAME_RETURN_COLUMN): Default to FIRST_PSEUDO_REGISTER. + + * expr.c (expand_expr, case RTL_EXPR): If there is no sequence, + don't set it to const0_rtx. + * tree.c (array_type_nelts): Don't return any SAVE_EXPRs. + +Mon Apr 14 18:12:57 1997 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000.h (RS6000_ITRUNC, RS6000_UITRUNC): Prepend underscores. + (RS6000_MCOUNT): New macro. + (ASM_FILE_START): Use RS6000_MCOUNT. + * rs6000.c (output_function_profiler): Use RS6000_MCOUNT. + * rs6000/aix31.h (RS6000_{ITRUNC,UITRUNC,MCOUNT}): New macros. + +Mon Apr 14 14:37:27 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (can_use_return_insn): Include outgoing argument + area in size computation. + (expand_prologue): Likewise. No longer diddle with sequences. + Put register saves just before outgoing argument area. + (expand_epilogue): Similarly. + (impossible_plus_operand): New function. + * mn10300.h (FRAME_POINTER_REQUIRED): Never require a frame pointer. + (ACCUMULATE_OUTGOING_ARGS, OUTGOING_REG_PARM_STACK_SPACE): Define. + (impossible_plus_operand): Declare. + * mn10300.md (reload_insi): New expander to handle pathological + reload cases. + (addsi3): Fix CC status. + + * mn10300.h (FUNCTION_VALUE): Return addresses in $a0. + (FUNCTION_VALUE_REGNO_P): Corresponding changes. + * mn10300.md (call_value_internal): Allow output to be in an + address register. + + * calls.c (emit_library_call): Handle saving of stack slots when + ACCUMULATE_OUTGOING_ARGS is defined. + (emit_library_call_value): Likewise. + +Mon Apr 14 14:48:15 1997 Jim Wilson <wilson@cygnus.com> + + * sh.md (xtrct_left, xtrct_right): New patterns. + + * combine.c (get_last_value_validate): New argument insn. + Add check for memory reference clobbered by later store. + (record_value_for_reg, get_last_values): Pass in new argument. + +Mon Apr 14 14:03:18 1997 Mike Meissner <meissner@cygnus.com> + + * configure (powerpc --with-cpu=x): Add embedded powerpcs and 604e. + + * rs6000.c (rs6000_override_options): Recognize -mcpu=801, -mcpu=823, + and -mcpu=604e. + +Sun Apr 13 18:43:16 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (invalidate_regno_rtx): New static variable. + (reload_cse_invalidate_regno): Check whether any earlier registers + have a multi-register value which includes the register we are + invalidating. + (reload_cse_regs): Initialize invalidate_regno_rtx. + + * reload1.c (reload_cse_record_set): When setting reg_values for a + copy from one register to another, use gen_lowpart_common to + adjust the value correctly if the mode changes. + +Sun Apr 13 17:24:48 1997 Doug Evans <dje@cygnus.com> + + * expr.c (move_block_from_reg): Try using an integral mov operation + first. + + * calls.c (expand_call): When copying unaligned values into a register, + zero out the register first rather than emitting a clobber. + + * integrate.c (copy_rtx_and_substitute): If FRAME_GROWS_DOWNWARD + and regno == VIRTUAL_STACK_VARS_REGNUM, round size of stack slot up + before calling assign_stack_temp. + +Sun Apr 13 15:29:38 1997 Ulrich Drepper <drepper@cygnus.com> + + * enquire.c (fake_f_rep): Add missing element name in cast. + +Sun Apr 13 15:20:05 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS): + Fix sign bug in last change. + +Sun Apr 13 15:03:38 1997 J.T. Conklin <jtc@netbsd.org> + + * m68k.md (movstricthi): Remove extraneous comparisons. + + * configure (*-*-netbsd): tmake_file now t-netbsd; delete xmake_file. + * config/t-netbsd: New file. + * config/x-netbsd: Removed. + +Sun Apr 13 14:51:25 1997 Richard Earnshaw (rearnsha@armltd.co.uk) + + * cse.c (canon_reg, cse_insn): Don't examine insn_n_dups if + recog_memoized fails to find a match. + +Sun Apr 13 14:17:26 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (reload_cse_noop_set_p): Add insn parameter. Change + all callers. If deleting the instruction, remove any earlier + REG_DEAD note for DREG. + (reload_cse_simplify_set): If simplifying, remove any earlier + REG_DEAD note for the new source register. + +Sun Apr 13 14:12:08 1997 Pat Rankin <rankin@eql.caltech.edu> + + * libgcc2 (L_bb, L_exit): Use 0 rather than NULL for null pointers. + +Sun Apr 13 12:53:03 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k/linux.h (ASM_SPEC): Define. + (STRUCT_VALUE_REGNUM, STATIC_CHAIN_REGNUM, INITIALIZE_TRAMPOLINE): + Remove definitions, undoing the change of Mar 20 1996. + + * m68k.c (output_move_qimode): Optimize pushing one byte if source + operand does not use stack pointer. + + * m68k.md (rotl[shq]i3, rotl[hq]i3+1): Don't directly modify operand. + + * m68k.md (tstdi): Add missing parallel around the pattern. + +Sun Apr 13 12:51:00 1997 Paul Eggert <eggert@twinsun.com> + + * cccp.c, cpplib.c (do_include): Diagnose #import and + #include_next if pedantic and if not in a system header. + (do_warning): #warning now causes an error if -pedantic-errors + is given; this is needed since #warning isn't ANSI. + + * toplev.c (lang_options): Add -Wundef, -Wno-undef. + * c-decl.c (c_decode_option): Ignore -Wundef, -Wno-undef. + + * cccp.c, cexp.y (warn_undef): New variable. + * cpplib.h (struct cpp_options): New member warn_undef. + (CPP_WARN_UNDEF): New macro. + + * cccp.c (main), cpplib.c (cpp_handle_options): Set warn_undef + from -Wundef and -Wno-undef. + + * cppexp.c (cpp_lex) New arg skip_evaluation. + (cpp_parse_expr): Pass skip_evaluation to cpp_lex. + Abort if cpp_lex returns NAME. + + * cexp.y (exp), cppexp.c (cpp_lex): Optionally warn about undefined + identifiers that evaluate to 0. + +Sun Apr 13 11:43:16 1997 Joel Sherrill <joel@OARcorp.com> + + * configure (hppa1.1-*-rtems*): New target. + * mips/rtems.h: New file. + +Sun Apr 13 09:48:26 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * gcov.c (print_usage, open_files): Use FATAL_EXIT_CODE. + * collect2.c (fatal_perror, fatal, collect_wait): Likewise. + + * sparc.c (eligible_for_delay_slot): Clean up and make to agree + precisely with patterns in MD file. + * sparc.md (*return_addsi): Change condition to exclude both ints. + (*return_adddi): Likewise. + (*return_subsi): New pattern. + + * recog.c (validate_replace_rtx_1, case MINUS): New case. + +Sun Apr 13 08:20:24 1997 Thomas Bushnell <thomas@gnu.ai.mit.edu> + + * i386/gnu.h (TARGET_VERSION): Redefine. + +Sun Apr 13 08:15:31 1997 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE> + + * c-typeck.c (lookup_field): Don't recurse unless FIELD is + a RECORD_TYPE or UNION_TYPE. + + * final.c (profile_function): Save the static chain register + around the call to the profiler function. + + * loop.c (invariant_p, case REG): Pointers into frame are not + invariants if function has nonlocal gotos. + * reload1.c (reload): If function has nonlocal label, mark all + caller-saved regs as used. + +Fri Apr 11 16:49:06 1997 Doug Evans <dje@seba.cygnus.com> + + * m32r.h (REG_ALLOC_ORDER): Restore to original setting. + + * m32r.h (UPPER16_P): Fix calculation. + * m32r.c (two_insn_const_operand): New function. + (m32r_print_operand): Handle 'X'. + * m32r.md (movsi): Tweak. + (*movsi_insn): Output hex value of constants too. + (movsi define_split): Add. + (andsi3,orsi3,xorsi3): Output hex value of constants too. + +Thu Apr 10 18:39:33 1997 Jim Wilson <wilson@cygnus.com> + + * sh.md (sne): Modified to use negc instead of xor. + (sne+1): New define_split for new sne pattern. + * sh.c (output_stack_adjust): Reorganize code for readability. + If size is negative, negate and subtract it instead of adding it. + +Wed Apr 9 13:51:07 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (output_stack_adjust): When splitting an adjustment into two + parts, make sure the stack is aligned at all times. + +Tue Apr 8 12:34:38 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (RETURN_ADDR_RTX): Define. + +Mon Apr 7 19:19:57 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (count_tst_insns): New function. + (expand_prologue): Load zero into data and/or address registers + if any are free and the function has optimizable tst insns. + (output_tst): If a suitable register is known to have the + value zero, use it instead of searching for a suitable register. + * mn10300.h (zero_dreg, zero_areg): Declare. + (FRAME_POINTER_NEEDED): Frame pointers are not needed if the + outgoing argument size is zero. + * mn10300.md (movXX): Optimize loading zero into an address + register if possible. Optimize loading a DF/DI mode value + into an address register from a constant memory address. + (addsi3): Provide alternative which doesn't require a matching + inout operand. + (return): Optimize consecutive return instructions. + +Mon Apr 7 17:30:35 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * mips/iris5.h (SUBTARGET_CC1_SPEC): Define. + (LINK_SPEC, STARTFILE_SPEC): Support -static. + * mips/iris6.h (SUBTARGET_CC1_SPEC): Define. + (STARTFILE_SPEC, LINK_SPEC): Support -static. + * mips.h: (SUBTARGET_CC1_SPEC): Define. + (CC1_SPEC): Add subtarget_cc1_spec. + (EXTRA_SPECS): Add subtarget_cc1_spec. + +Sun Apr 6 12:24:53 1997 Richard Earnshaw (rearnsha@armltd.co.uk) + + * arm.md (incscc): Use a match_operand with cc_register to match + the condition code register. + (decscc, *condbranch, *condbranch_reversed, *mov_scc): Likewise. + (*mov_negscc, *mov_notscc, *cond_return): Likewise. + (*cond_return_inverted, *ior_scc, *cond_move): Likewise. + (insv): New expand. + (andsi_notsi_si): Renamed from *andsi_notsi_si. + (andsi_not_shiftsi_si): New insn. + (*minmax_arithsi): Don't match this insn if operand1 is an + eliminable register. + ({sin,cos}*): Delete, since the ARM always emulates these its + faster to call a library function. + (movsicc, *movsicc_insn): Make operand0 an s_register_operand, + and operand3 an arm_not_operand. Use cc_register to match the + condition code register. + (mov[sd]fcc*): Make operand[0,2] s_register_operands, and operand3 + the nonmemory_operand. Use cc_register to match the condition + code register. + (*ifcompare_plus_move): Move before *ifcompare_arith_move. Just do + a split for the output. + (*ifcompare_move_plus): Similarly, but relative + to *ifcompare_move_arith. + (*if_plus_move, *if_move_plus): New patterns. + (*ifcompare_arith_arith): Simplify the alternatives down to just one, + and split the insn before output. + (*if_arith_arith, *if_arith_move, *if_move_arith): New patterns. + (*ifcompare_move_not, *ifcompare_not_move): Simplify and split the + insn before output. + (*if_move_not, *if_not_move): New patterns. + (*ifcompare_shift_move, *ifcompare_move_shift): Simplify and split the + insn before output. + (*if_shift_move, *if_move_shift): New patterns. + (*ifcompare_shift_shift): Simplify and split the insn before output. + (*if_shift_shift): New pattern. + (*ifcompare_not_arith, *ifcompare_arith_not): Simplify and split the + insn before output. + (*if_not_arith, *if_arith_not): New patterns. + (*ifcompare_neg_move, *ifcompare_move_neg): Simplify and split the + insn before output. + (*if_neg_move, *if_move_neg): New patterns. + +Sat Apr 5 20:17:43 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000/sol-ci.asm (_environ): Don't make _envrion a common + variable, the lastest assembler doesn't let common variables also + be a weak symbol. + +Fri Apr 4 18:30:12 1997 Jim Wilson <wilson@cygnus.com> + + * rs6000/rs6000.md (adddi3): Use non_short_cint_operand instead of + non_add_cint_operand. + +Thu Apr 3 15:08:39 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (can_use_return_insn): Add size of fixed stack space + for function calls into the size of the frame. */ + (expand_prologue, expand_epilogue): Likewise. + (initial_offset): Corresponding changes.. + * mn10300.h (OUTGOING_REG_PARM_STACK_SPACE): No longer define. + (STACK_POINTER_OFFSET): Define. + * mn10300.md (call, call_value expanders): Don't adjust the stack + pointer here anymore. + + * mn10300.md (ashlsi3): Remove some alternatives which are no longer + needed or desired. + +Thu Apr 3 15:06:53 1997 Jim Wilson <wilson@cygnus.com> + + * local-alloc.c (no_conflict_p): Reject sequences with foreign insns. + + * combine.c (move_deaths): Handle partial REG_DEAD note for + multi-reg hard register. + + * function.c (expand_function_start): Emit queue after expanding + each dynamic parameter type. + + * mips.c (mips_move_2words): Add SIGN_EXTEND support for SYMBOL_REF, + LABEL_REF, and CONST operands. + + * dwarf2out.c: Delete comment referring to README.DWARF. + +Wed Apr 2 17:21:23 1997 Jim Wilson <wilson@cygnus.com> + + * rs6000.md (ashrdi3_power): Mark alternative 0 as early_clobber + output. + + * rs6000.md (abssi3_nopower define_split): Switch operands of MINUS. + (nabssi3_nopower define_split): Likewise. + +Tue Apr 1 19:30:01 1997 Mike Stump <mrs@cygnus.com> + + * libgcc2.c (find_exception_table): Fix to logic to deal with + functions that are in their own section, such as template + instantiations, that cause overlapping EH tables. + +Tue Apr 1 17:16:22 1997 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (USER_H): Add va-mn10300.h + + * ginclude/stdarg.h: Include va-mn10300.h. + * ginclude/varargs.h: Likewise. + * ginclude/va-mn10300.h: New file. + * mn10300.c (expand_prologue): If current_function_varargs is nonzero, + flush d0/d1 back into stack. + (mn10300_builtin_saveregs): New function. + (function_arg, function_arg_partial_nregs): New functions. + (initial_offset): Tweak now that the RP save area is allocated + and deallocated around each call again. + * mn10300.h (FIRST_PARM_OFFSET): Now 4. + (FRAME_POINTER_REQUIRED): Require frame pointer for all non-leaf fcns. + (REG_PARM_STACK_SPACE): Now 8 bytes. + (FUNCTION_ARG_REGNO_P): Update for new parameter passing conventions. + (CUMULATIVE_ARGS, INIT_CUMULATIVE_ARGS): Likewise. + (FUNCTION_ARG_ADVANCE, FUNCTION_ARG): Likewise. + (FUNCTION_ARG_PARTIAL_NREGS): Likewise. + (TRAMPOLINE_TEMPLATE): Don't clobber d0 anymore. + (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Corresponding changes. + (EXPAND_BUILTIN_SAVEREGS): Define. + * mn10300.md (call, call_value patterns): Allocate and deallocate + stack slot for return pointer around each call. + + * mn10300.h (RTX_COSTS): Refine. + (CASE_VALUES_THRESHHOLD, NO_FUNCTION_CSE): Likewise. + * mn10300.c (output_tst): New function. + * mn10300.md (movdi, movdf): Improve code to load constants into regs. + (tst insns): Use output_tst to optimize some cases. Add versions to + encourage more zero extensions instead of sign extensions of HImode + and QImode values. + (divsi3, udivsi3): Remove patterns. Replaced by... + (divmodsi4, udivmodsi4): New expanders/patterns. + (andsi3): Optimize "and" operations with certain constants. + +Tue Apr 1 09:14:29 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.h: (ADJUST_COSTS): Define. + +Fri Mar 28 17:46:13 1997 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (LANGUAGES): Add gcov. + (OBJS): Add profile.o. + (STAGESTUFF): Add gcov. + (profile.o, gcov.o, gcov): Add rules to build them. + (cpp.info, gcc.info, gcc.dvi): Add gcov.texi. + (install-common): Install gcov. + * combine.c (distribute_notes): Handle REG_BR_PROB and REG_EXEC_COUNT + REG_NOTES. + * sparc.h (OVERRIDE_OPTIONS): Check profile_arc_flag. + * final.c (LONG_TYPE_SIZE): Define. + (count_instrumented_arcs): New variable. + (end_final, profile_after_prologue, leaf_function_p): Add support + for profile_arc_flag. + (add_bb): Only call CC_STATUS_INIT if HAVE_cc0. + * flags.h (profile_arc_flag, flag_test_coverage, + flag_branch_probabilities): Declare. + * function.c (expand_function_end): Output NOTE_REPEATED_LINE_NUMBER + for last line of function. + * integrate.c (expand_inline_function): Output + NOTE_REPEATED_LINE_NUMBER after inlined call. + * jump.c (jump_optimize, follow_jumps, mark_jump_label): Disable some + optimizations when flag_test_coverage and there is a line number note + in the way. + (invert_jump): Add REG_BR_PROB when flag_branch_probabililties. + * libgcc2.c (__bb_exit_func): Support gcov style output. + * reorg.c (mostly_true_jump): Use REG_BR_PROB notes when + flag_branch_probabilities. + * rtl.c (note_insn_name): Add NOTE_REPEATED_LINE_NUMBER. + (reg_note_name): Add REG_BR_PROB and REG_EXEC_COUNT. + * rtl.h (enum reg_note): Add REG_BR_PROB and REG_EXEC_COUNT. + (REG_BR_PROB_BASE): Define. + (NOTE_REPEATED_LINE_NUMBER): Define. + * sched.c (update_flow_info): Handle REG_EXEC_COUNT and REG_BR_PROB + notes. + * toplev.c (branch_prob_dump, profile_arc_flag, flag_test_coverage, + flag_branch_probabilities, branch_prob_dump_file, branch_prob_time): + New variables. + (f_options): Add profile-arcs, test-coverage, and + branch-probabilities. + (compile_file): Set branch_prob_time. Pass flag_test_coverage to + init_emit_once. Handle branch_prob_dump. Call init_branch_prob. + Call end_branch_prob. Call output_func_start_profiler. + (rest_of_compilation): Handle branch_prob_dump. Call new + branch_prob pass. + (main): Set branch_prob_dump. + * gcov.c, profile.c, gcov-io.h, gcov.texi: New files. + +Thu Mar 27 16:52:52 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.h (CPP_CPU_DEFAULT): Define if TARGET_CPU_DEFAULT is not set. + * i386.h (STACK_BOUNDARY): Define to always be 32. + + From J"orn Rennecke <amylaar@cygnus.co.uk> + * i386.md: (zero_extendhisi2+[12]): use true_regnum instead of REGNO for + operand 0. + (zero_extendqisi2+3: use reg_overlap_mentioned_p instead of REGNO + comparison; use true_regnum instead of REGNO for rtx generation. + +Wed Mar 26 12:34:21 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (reload): Call reload_cse_regs. + (reg_values): New static variable. + (reload_cse_invalidate_regno): New static function. + (reload_cse_mem_conflict_p): New static function. + (reload_cse_invalidate_mem): New static function. + (reload_cse_invalidate_rtx): New static function. + (reload_cse_regs): New static function. + (reload_cse_regno_equal_p): New static function. + (reload_cse_noop_set_p): New static function. + (reload_cse_simplify_set): New static function. + (reload_cse_check_clobbered): New static variable. + (reload_cse_check_src): New static variable. + (reload_cse_check_clobber): New static function. + (reload_cse_record_set): New static function. + +Wed Mar 26 07:34:06 1997 Ulrich Drepper <drepper@cygnus.com> + + * ginclude/stdarg.h (__va_copy): New definition. + +Tue Mar 25 13:43:36 1997 Michael Meissner <meissner@cygnus.com> + + * gcc.c (init_spec): If -v, print out that the default spec values + were being used. Fix prototype to reflect no arguments. + (set_spec): If specs has not been set, set it up with the default + specs. + (read_specs): Move to later in the file so that startfile_prefixes + has been declared. Process "%include <file>" to include another + specs file, aborting if the file can't be found. Process + "%include_noerr <file>: to include another specs file, giving no + error if the file can't be found. Process "%rename var1 var2" to + rename a specs variable. Take new argument that indicates whether + we are processing the main file. Only process % commands if this + is not the main specs file. Change callers. + (main): Do not call init_spec if a specs file was found. + (set_spec,read_specs,do_spec_1): If DEBUG_SPECS is defined, print + debug information. + +Tue Mar 25 14:43:58 1997 Doug Evans <dje@cygnus.com> + + * expr.c (emit_push_insn): Delete emission of CLOBBER + when doing partial push, no longer necessary. + + * c-decl.c (grokdeclarator): Pedwarn qualified void function return + type. + +Tue Mar 25 14:28:15 1997 Richard Earnshaw (rearnsha@armltd.co.uk) + + * reload.c (find_dummy_reload): New parameter earlyclobber. If set + then don't use IN for the reload if it also appears elsewhere in + the insn. All callers changed. + +Tue Mar 25 13:20:18 1997 J.T. Conklin <jtc@cygnus.com> + + * m68k/lb1sf68.asm (udivsi3): Fix hunk from previous patch that + did not apply correctly. + + * m68k.md (tablejump): Use extl to explicitly sign extend + index registeron TARGET_5200. + * m68k/{apollo68.h,coff.h,linux.h,mot3300.h,pbb.h} + (ASM_RETURN_CASE_JUMP): Likewise. + + * m68k.md (mulsi3): Changed into define_expand. Split insn into + m68k and coldfire specific versions with appropriate constraints. + + * m68k.md (movqi): Disable use of address registers for + TARGET_5200. + + * m68k/lb1sf68.asm (__modsi3, __umodsi3): Use mulsl instruction + instead of __mulsi3 function call on the coldfire. + + * m68k.md (bne0_di): Fix typo in last change. + + * m68k.md (xorsi3_5200): Correct constraints. + + * m68k.c (output_move_{si,hi,qi}mode): New functions. + * m68k.h (output_move_{si,hi,qi}mode): Declare. + + * m68k.md (move{si,hi,qi,di}): Changed into define_expands. Split + insns into m68k and coldfire specific versions with appropriate + constraints. + +Tue Mar 25 12:18:41 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Makefile.in (GCC_PASSES): Revert previous change; use + cc1$(exeext). + +Mon Mar 24 16:12:20 1997 Doug Evans <dje@cygnus.com> + + * m32r/*: New files. + * config.sub: Add m32r. + * configure: Add m32r. + * longlong.h: Add m32r support. + * ginclude/{stdarg.h,varargs.h}: Add m32r support. + * ginclude/va-m32r.h: New file. + +Mon Mar 24 15:53:15 1997 Joel Sherrill <joel@OARcorp.com> + + * rs6000/rtems.h: Change to a near clone of the powerpc-eabi target. + * configure (powerpc*-*-rtems): Move before Linux configuration. + +Mon Mar 24 14:26:37 1997 Gavin Koch <gavin@cygnus.com> + + * ginclude/va-mips.h: For little endian, eabi, objects + less than __va_reg_size are passed in registers. + +Fri Mar 21 00:48:02 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (print_operand): Handle 'N'. + + * mn10300.c (expand_epilogue): Correctly handle functions + with large frames, but no callee register saves. + + * mn1300.md (movdf, movdi): Handle overlapping moves. + + * pa.c (compute_movstrsi_length): Handle residuals correctly. + +Thu Mar 20 13:53:30 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000.c (easy_fp_constant): If -mrelocatable, consider all fp + constants to be hard. + +Mon Mar 20 13:53:30 1997 Jim Wilson <wilson@cygnus.com> + + * rs6000.md (movdf/movsf define_splits): Add SUBREG support. + + * rs6000.c (fp_reg_or_mem_operand): Delete. + * rs6000.h (PREDICATE_CODES): Remove fp_reg_or_mem_operand. + (fp_reg_or_mem_operand): Delete declaration. + * rs6000.md (movsf_hardfloat): Use nonimmediate_operand instead + of fp_reg_or_mem_operand. + +Thu Mar 20 08:52:27 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (cmpsi): Handle comparing a register with + itself by adding zero to the reg. Z bit for such an insn is + inverted. + * mn10300.c (notice_update_cc): Handle CC_INVERT. + + * pa.c (emit_move_sequence): Don't lose for a secondary reload + to the SAR register if the input is a MEM with an offset that won't + fit in 14bits. + +Wed Mar 19 17:10:44 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k/linux.h (ASM_OUTPUT_MI_THUNK): Define. + +Wed Mar 19 16:59:34 1997 Paul Eggert <eggert@twinsun.com> + + * cccp.c, cpplib.c (do_error, do_warning): Fix memory leak. + + * cccp.c (output_line_directive): Do not output negative line + numbers when analyzing directives like `#line 0'. + + * cexp.y (parse_number, yylex), cccp.c (rescan), cpplib.c + (cpp_get_token): Unless -lang-c89 is specified, allow C9X-style + hexadecimal floating-point numbers as preprocessor numbers. + * cccp.c (c89): New decl. + (main): Set it to 1 if -lang-c89. + * cpplib.h (struct cpp_options): New member c89. + (CPP_C89): New macro. + * cpplib.c (unsafe_chars): `p' is unsafe before `-' or `+', since it + might generate a C9X-style hexadecimal floating-point number. + (cpp_handle_options): Set c89 option to 1 if -lang-c89. + +Tue Mar 18 17:05:57 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.h (STACK_BOUNDARY): Determine according to TARGET_ALIGN_DOUBLE. + + * i386.c (override_options) Make the default alignment 4 for 486, + otherwise 2. + + * i386/freebsd-elf.h (CPP_SPEC): Remove TARGET_CPU_DEFAULT reference. + * i386/linux{,-aout,-oldld}.h (CPP_SPEC): Likewise. + + * i386/go32.h (DBX_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE, + NO_STAB_H, ASM_FILE_START, DBX_BLOCKS_FUNCTION_RELATIVE, + DBX_FUNCTION_FIRST, DBX_OUTPUT_MAIN_SOURCE_FILE_END, + ASM_OUTPUT_SOURCE_LINE): Added to support stabs. + (ASM_OUTPUT_SECTION_NAME): Support section attribute. + +Tue Mar 18 16:12:28 1997 Jim Wilson <wilson@cygnus.com> + + * final.c (shorten_branches): Split all insns before computing insn + lengths. + (final_scan_insn, case default): If HAVE_ATTR_length defined, call + abort for any insn that has a '#' output template. + + * expr.c (emit_group_load): Call operand_subword instead of creating + an explicit SUBREG. + + * reload1.c (reload_reg_free_before_p, case + RELOAD_FOR_OPERAND_ADDRESS): Conflicts with RELOAD_FOR_OPADDR_ADDR + reloads. + + * configure (alpha-dec-osf[23456789]*): Use install-headers-cpio + for osf4. + + * gcc.c (init_spec): Delete parameter. Always initialize extra_specs. + (process_command, main): Change all callers. + + * combine.c (if_then_else_cond): Call copy_rtx to prevent sharing. + +Tue Mar 18 14:59:12 1997 Ian Lance Taylor <ian@cygnus.com> + + * function.c (assign_parms): Add a REG_EQUIV note to the + instruction which copies a parameter into a pseudo-register + whenever there is an associated stack slot, even if the parameter + actually arrived in a register. + +Tue Mar 18 14:24:48 1997 Doug Evans <dje@cygnus.com> + + * configure (alpha-dec-osf[23]): Separate osf[23] case. + * alpha.h (LIB_SPEC): -lprof1 requires -lpdf for OSF 4. + * alpha/osf2or3.h: New file. + +Tue Mar 18 11:32:10 1997 Jeffrey A Law (law@cygnus.com) + + * m68k.c (m68k_last_compare_had_fp_operands): New variable. + * m68k.h (m68k_last_compare_had_fp_operands): Declare it. + * m68k.md (tst*, cmp*): Turn into define_expand/define_insn pairs. + Keep track of whether test/compare has fp operands. + (seq, sne, sgt, slt, sge, sle): Turn into define_expand/define_insn + pairs. Make expanders FAIL if TARGET_68060 and last comparison/test + had fp operands. + +Tue Mar 18 04:29:29 1997 Richard Earnshaw <rearnsha@armltd.co.uk> + + * arm.md (movhi): Handle generation of large constants during + and after reload. + +Mon Mar 17 17:30:24 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * gmicro.h (RETURN_POPS_ARGS): Make sure FUNDECL is non-nil + before we try to use it. + * m68k.h (RETURN_POPS_ARGS): Likewise. + * ns32k.h (RETURN_POPS_ARGS): Likewise. + * pyr.h (RETURN_POPS_ARGS): Likewise. + +Mon Mar 17 17:13:44 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * stor-layout.c (layout_record, PCC_BITFIELD_TYPE_MATTERS): + Only add padding if a bit field would otherwise span more units + of alignment than its base type. + +Mon Mar 17 17:03:55 1997 J.T. Conklin <jtc@cygnus.com> + + * m68k.md (beq0_di, bne0_di, bge0_di, blt0_di): Use cmpw #0 + instead of tstl when testing address registers on the 68000. + + * m68k/lb1sf68.asm: Fix prologues/epilogues to deal with the lack + of predecrement/postincrement addressing modes in the coldfire + moveml instruction. + +Mon Mar 17 17:00:14 1997 Scott Christley <scottc@net-community.com> + + * Fix long standing bug where first method call for a class could + result in a garbled stack or produce an incorrect return value. + * objc/sendmsg.c (__objc_block_return): Remove function. + (__objc_word_return, __objc_double_return): Remove functions. + (__objc_get_forward_imp): New function. + (__objc_init_dispatch_tables): Install zero instead of + __objc_init_install_dtable. + (__objc_init_install_dtable): No longer call the method but + allow objc_msg_lookup return it for normal execution. + (obj_msg_lookup): Differentiate between when a method isn't + implemented and when the dispatch table needs to be installed. + Return the IMP when the dispatch table is installed versus + having __objc_init_install_dtable call it. + (get_imp): Install dispatch table if needed and return IMP + from the newly installed dispatch table. + (__objc_responds_to): Install dispatch table if needed before + checking if method is implemented. + +Mon Mar 17 16:29:38 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * tree.c (build_{index,range}_type): Ensure expressions for min + and max value are in same obstack as type. + +Mon Mar 17 15:44:18 1997 Pat Rankin <rankin@eql.caltech.edu> + + * cccp.c [#if VMS] (O_RDONLY, O_WRONLY): Delete (redundant). + (BSTRING): Delete (obsolete; usage occurs prior to definition). + (do_include): Handle old VAX C style includes better. + +Mon Mar 17 13:46:47 1997 Paul Eggert <eggert@twinsun.com> + + * cexp.y, cppexp.c (parse_number): Invalid integer constants are + errors if pedantic. + * cexp.y (yylex): Invalid multibyte characters are errors if pedantic. + * cppexp.c (cpp_lex): Likewise. + * cppexp.c (cpp_parse_escape): Character constants that do not fit are + errors if pedantic. + + * c-parse.in (expr_no_commas): Do not store temporary + skip_evaluation increments on yacc value stack. + +Sun Mar 16 19:54:49 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * expr.c (expand_expr, case PLACEHOLDER_EXPR): Refine which + object is picked. + +Sun Mar 16 15:45:45 1997 Jeffrey A Law (law@cygnus.com) + + * loop.c (strength_reduce): Adjust BENEFIT appropriately if an + autoincrement memory reference will eliminate add insns. + +Sun Mar 16 08:41:40 1997 Scott Christley <scottc@net-community.com> + + * i386.md (untyped_call): Re-enable code. + * objc/sendmsg.c (__objc_block_return): New function. + (__objc_word_return, __objc_double_return): New functions. + (__objc_init_install_dtable): Call appropriate return function + based upon method type. + * objc/thr-pthreads.c: Correct include path. + +Sat Mar 15 07:58:33 1997 Scott Christley <scottc@net-community.com> + + * objc-act.c (OBJC_VERSION): Increment version. + * objc/init.c (OBJC_VERSION): Likewise. + +Sat Mar 15 07:58:00 1997 Ovidiu Predescu <ovidiu@net-community.com> + + * Implement +load. + * objc/init.c (objc_send_load, __objc_send_load): New functions. + (__objc_send_message_in_list): New function. + (__objc_force_linking): New function. + (__objc_exec_class): Don't call _objc_load_callback here. + * objc/linking.m: New file. + * objc/sendmsg.c (class_add_method_list): Check for the +load method + when adding a methods list to a class. + * objc/Makefile (OBJC_O): Add linking.m. + + * Allow methods defined in categories to override methods that are + defined in the class implementation. + * objc/sendmsg.c (__objc_install_methods_in_dtable): New function. + (class_add_method_list): Don't check anymore for duplicate methods. + + * config/nextstep.h (INCLUDE_DEFAULTS): Define to something useful + when cross-compiling. + + * The static instances list moved from the objc_module struct to + objc_symtab struct, at the end of defs array. This now allows the NeXT + gdb to work with binaries generated for the GNU ObjC runtime. + * objc-act.c (build_objc_symtab_template): Make sure + defs in objc_symtab is a NULL terminated array. + (init_def_list): Attach statics to end of def list. + (init_objc_symtab): Take statics list into account. + (init_module_descriptor, build_module_descriptor): Don't add statics. + (generate_static_references): Indicate that statics are used. + (finish_objc): Process statics in the beginning. + * objc/objc-api.h (objc_module): Eliminate statics variable. + * objc/init.c (__objc_exec_class): Access statics from their + new place in the defs variable. + +Sat Mar 15 07:29:15 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * reload.c: Include expr.h. + (find_reloads_address, find_reloads_address_1): New argument INSN. + (find_reloads_address_1): Reload inside of p{re,ost}_{in,de}c + instead of entire p{re,ost}_{in,de}c where appropriate. + * Makefile.in (reload.o): Added expr.h to dependencies list. + +Sat Mar 15 07:17:12 1997 Richard Henderson <rth@tamu.edu> + + * reload.h (eliminate_regs): Add STORING arg. + * reload1.c (eliminate_regs): Likewise. + (eliminate_regs, case SET): Pass that we are storing to recursive call. + (eliminate_regs, case SUBREG): If storing and same number of words, + use larger mode. + * caller-save.c, dbxout.c, dwarfout.c, dwarf2out.c, reload.c, sdbout.c: + Change all calls to eliminate_regs. + +Fri Mar 14 14:18:49 1997 Ian Lance Taylor <ian@cygnus.com> + + * cplus-dem.c: Add prototypes for all static functions. + (mystrstr): Make static. Make arguments and result const. + (cplus_match): Remove; not used. + +Fri Mar 14 10:15:35 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (const_costs): Remove unused function. + * mn10300.h (CONST_COSTS): Rework to generate better code. + + * mn10300.c (print_operand): Handle 'H' and 'L' output + modifers for high/low part of a 64bit value. + * mn10300.h (CONST_DOUBLE_OK_FOR_LETTER_P): Handle 'G' + (LEGITIMATE_CONSTANT_P): Allow any constant. + * mn10300.md (movdi, movdf): Implement. + (adddi3, subdi3): New expanders and patterns. + + * mn10300.c (print_operand): Handle 'A' modifier for an + address which can't be simple register indirect. + * mn10300.h (EXTRA_CONSTRAINT): Handle 'R' for bit ops. + * mn10300.md: Add patterns to test, set and clear bitfields. + + * mn10300.c (can_use_return_insn): New function. + (expand_epilogue): Emit a RETURN insn if possible. + * mn10300.md (return): New pattern. + + * mn10300.h (CONST_OK_FOR_LETTER_P): Handle 'N'. + * mn10300.md (andsi3): Catch "and 255,dn" and "and 65535,dn" + which were not turned into zero_extend patterns. + + * mn10300.h (GO_IF_LEGITIMATE_ADDRESS): Handle symbolic + constant as an index/base too. + + * mn10300.md (movsi): Allow SP to be loaded/saved with + reg+d8 addresses. + + * mn10300.md (cmpsi): Allow second operand to be a constant. + (subsi3): Likewise. + + * mn10300.md (sign extension patterns): Fix thinko when + extending from memory. + + * mn10300.md (tst peepholes): Add peepholes for test/branch + based on N bit being set/clear and the data value being tested dies. + +Tue Mar 11 17:07:51 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (expand_prologue): Rework so that eliminating + the frame pointer produces faster/smaller code. + (expand_epilogue): Likewise. + (initial_offset): New function for argument pointer and frame pointer + elimination. + * mn10300.h (FIRST_PSEUDO_REGISTER): Bump to 10. + (FIXED_REGISTERS): Add argument pointer register, it's a fake fixed + register. + (CALL_USED_REGISTERS, REG_ALLOC_ORDER): Corresponding changes. + (REGNO_REG_CLASS, REG_CLASS_CONTENTS): Likewise. + (REG_OK_FOR_BASE_P, REGISTER_NAMES): Likewise. + (reg_class, REG_CLASS_NAMES): Delete unwanted DATA_OR_SP_REGS class. + (PREFERRED_OUTPUT_RELOAD_CLASS): Define. + (FIRST_PARM_OFFSET): No longer include register save area in + computation. + (STACK_POINTER_REGNUM): Is now register 9. + (ARG_POINTER_REGNUM): Is now register 8. + (FRAME_POINTER_REQUIRED): Refine. + (ELIMINABLE_REGS, INITIAL_ELIMINATION_OFFSET): Define. + (CAN_DEUG_WITHOUT_FP): Define. + * mn10300.md (return_internal): Break into two patterns. + + * mn10300.h (CONST_OK_FOR_LETTER_P): Handle 'M' too. + (REGISTER_MOVE_COST): Fix errors and refine. + + * mn10300.c (notice_update_cc): SET_ZN_C0 insns leave the + overflow bit in an unuseable state. Rename CC_SET to CC_TST. + * mn10300.md (cc attributes): "set" is gone, replaced by + "tst". Update attributes on various insns. + + * mn10300.md: Improve sign and zero extension instructions. + (ashlsi3): Improve. Handle address registers too. + (add peephole): Combine two consecutive adjustments of a register + into a single adjustment. + +Tue Mar 11 17:18:40 1997 Brendan Kehoe <brendan@melange.gnu.ai.mit.edu> + + * cplus-dem.c (gnu_special): Call demangled_fund_type for other + __t* symbols. + +Mon Mar 10 16:10:34 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * emit-rtl.c (subreg_lowpart_p): Return 0 if SUBREG_REG is VOIDmode. + * combine.c (simplify_rtx, case SUBREG): Fix direction of test when + calling operand_subword; use inline code intead of subreg_lowpart_p. + +Fri Mar 7 09:22:28 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (expand_{pro,epi}logue): Rework to avoid + unnecessary "add" operations. + (expand_epilogue): Likewise. + * mn10300.h (STARTING_FRAME_OFFSET): Is zero after the last + round of prologue/epilogue changes. + (FIRST_PARM_OFFSET): Is now 16 (-4 for REG_PARM_STACK_SPACE + 20 for + register save area). + (REG_PARM_STACK_SPACE): Define as 4 bytes. + (OUTGOING_REG_PARM_STACK_SPACE): Define so caller allocates it. + * mn10300.md (call{,_value} expander): Don't emit insns to adjust the + stack here anymore. + + * mn10300.md (bCC patterns): Just use "bCC target". + +Tue Mar 4 13:21:41 1997 Jim Wilson <wilson@cygnus.com> + + * rs6000.md (movsi): Don't emit a USE insn for LABEL_REFs. + +Thu Mar 6 16:29:13 1997 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (modified_type_die): Initialize item_type to NULL. + Move equate_type_number_to_die call before use of sub_die, and move + recursive modified_type_die calls on item_type after it. + + * dwarfout.c (root_type_1, write_modifier_bytes_1): New functions. + (root_type): Call root_type_1. + (write_modifier_bytes): Call write_modifier_bytes_1. + (output_type, case POINTER_TYPE): Set TREE_ASM_WRITTEN before + recursive call. + +Wed Mar 5 14:30:49 1997 Torbjorn Granlund <tege@quiet.matematik.su.se> + + Partially undo Jan 11 changes (nor takes only register ops): + * mips.md (*norsi3_const, *nordi3_const): Delete bogus patterns. + * mips.c (complemented_arith_operand): Delete function. + (print_operand): Don't handle `e' for CONST_INT. + * mips.h (PREDICATE_CODES): Delete complemented_arith_operand. + +Tue Mar 4 16:38:13 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * i386.c (i386_return_pops_args): Make sure FUNDECL is non-nil + before we try to use it. + * i386/isc.h (RETURN_POPS_ARGS): Likewise. + * i386/next.h (RETURN_POPS_ARGS): Likewise. + * i386/sco.h (RETURN_POPS_ARGS): Likewise. + * i386/sco5.h (RETURN_POPS_ARGS): Likewise. + * i386/scodbx.h (RETURN_POPS_ARGS): Likewise. + +Mon Mar 3 20:17:54 1997 Gavin Koch <gavin@cygnus.com> + + * ginclude/va-mips.h: __mips_single_float should have + the same effect on vararg lists as __mips_soft_float. + +Mon Mar 3 18:12:01 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000.h (DBX_CONTIN_LENGTH): Undo 2/26 change. + +Mon Mar 3 13:08:20 1997 Jeffrey A Law (law@cygnus.com) + + * combine.c (simplify_rtx): Do nothing with (truncate:mode) if + mode is a partial integer mode. + +Sun Mar 2 17:41:18 1997 Ulrich Drepper <drepper@cygnus.com> + + * ginclude/varargs.h: Add definition of __va_copy. + * va-alpha.h, va-clipper.h, va-h8300.h, va-i860.h: Likewise. + * va-i960.h, va-m88k.h, va-mips.h, va-pa.h, va-ppc.h: Likewise. + * va-sh.h, va-sparc.h, va-spur.h: Likewise. + +Sun Mar 2 13:25:49 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-typeck.c (process_init_element): Warn and truncate if upper + bound of index is out of range. + +Fri Feb 28 16:08:47 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000/sol-c0.c (_start): Disable loading up r13 and r2 with the + SDA base registers for now. + + * rs6000.md (movsi): Emit a USE insn when putting the + label of constants into the TOC, so that the constant is still + emitted when expensive optimizations are used. + +Thu Feb 27 17:54:42 1997 Karl Heuer <kwzh@gnu.ai.mit.edu> + + * fixinc.ptx: Fix sed expression looking for <sys/types.h> in + pwd.h. + +Thu Feb 27 12:11:16 1997 Dennis Glatting <dennis.glatting@plaintalk.bellevue.wa.us> + + * fixincludes: Remove more cases of __const__ from math.h on + NeXT. + +Wed Feb 26 14:52:27 1997 Michael Meissner <meissner@cygnus.com> + + * reload.c (debug_reload): Remove extra argument to fprintf. + + * rs6000.c (output_toc): Make fprintf calls type correct. + + * rs6000.h (DBX_CONTIN_LENGTH): Define as 4000 to avoid AIX + assembler line limit. + +Mon Feb 24 17:56:17 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * fixincludes: Fix need of prototypes for C++ in rpc/xdr.h on SunOS4. + +Mon Feb 24 17:33:57 1997 Michael Meissner <meissner@cygnus.com> + + * rs6000/xm-sysv4.h (HAVE_STRERROR): Define. + +Sun Feb 23 17:18:28 1997 Jim Wilson <wilson@cygnus.com> + + * rs6000.md (floatsidf2_loadaddr): Correct syntax for cau instruction. + (load_multiple, store_multiple): Call change_address instead of + creating MEM from scratch. + +Thu Feb 20 16:39:15 1997 Jim Wilson <wilson@cygnus.com> + + * unroll.c (unroll_loop): Add check for naive loop that ends with + conditional branch that does not branch back to loop start. + + * reload1.c (reload): Move assign_stack_local call into main loop. + +Thu Feb 20 11:40:46 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (zero extension patterns): Turn into define_expand and + define_insn pair. + +Wed Feb 19 17:05:38 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (emit_move_sequence): Don't copy 0.0 (double precision) + directly to memory, go through a reg if reload hasn't started. + * pa.md (main movdf pattern): Don't allow 0.0 (double precision) + to be copied directly to memory. + + * pa/pa-hpux10.h (MD_EXEC_PREFIX): Define appropriately for hpux10. + (MD_STARTFILE_PREFIX): Similarly. + + * pa.h (ASM_OUTPUT_SECTION_NAME): Surround the section name + with '$' if not using GAS. + +Wed Feb 19 16:43:47 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sched.c (schedule_insns): If there was no first scheduling pass, + split instructions after reload. + (update_flow_info): Tolerate some idiosyncrasies after reload. + +Wed Feb 19 11:13:51 1997 Jeffrey A Law (law@cygnus.com) + + * combine.c (find_split_point): Don't turn a SIGN_EXTEND into + a series of shifts if either mode is a partial integer mode. + +Mon Feb 17 08:06:02 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * rs6000.c ({,non_}short_cint_operand): Use (unsigned HOST_WIDE_INT). + (non_add_cint_operand, includes_rshift_p): Likewise. + * rs6000.h (CONST_OK_FOR_LETTER_P): Likewise. + (LEGITIMATE_ADDRESS_INTEGER_P, LEGITIMIZE_ADDRESS): Likewise. + +Sun Feb 16 07:55:19 1997 J"orn Rennecke (amylaar@cygnus.co.uk) + + * libgcc2.c (__negdi2, __lshrdi3, __ashldi3, __ashrdi3, __ffsdi2): + Use ANSI style definition with full prototype. + (__muldi3, __udiv_w_sdiv, __udivmoddi4, __divdi3, __moddi3) : Likewise. + (__udivmoddi4, __udivdi3, __cmpdi2, __ucmpdi2) : Likewise. + (__fixunstfdi, __fixtfdi, __fixunsxfdi, __fixxfdi) : Likewise. + (__fixunsdfdi, __fixdfdi, __floatdixf, __floatditf) : Likewise. + (__floatdidf, __floatdisf, __fixunsxfsi, __fixunsdfsi) : Likewise. + (__gcc_bcmp, __eprintf, gopen, gclose, __bb_init_file) : Likewise. + (__bb_init_trace_func, __clear_cache, mprotect) : Likewise. + (__enable_execute_stack, cacheflush, exit) : Likewise. + (find_exception_table, __find_first_exception_table_match) : Likewise. + +Sun Feb 16 07:52:02 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * 1750a.md (mulqihi3): Corrected. + (tst{hf,tqf}): Simplified. + (movqi): Removed redundant alternative. + (addqi-3,addqi-2,addqi-1): Set/Reset Bit patterns by C. Nettleton. + (many patterns): Introduced operand output modifiers d,t,b,B,w. + * 1750a.c (print_operand): New operand output modifiers d,t,b,B,w. + (simple_memory_operand): Removed. + (one_bit_set_p, which_bit): Added from C. Nettleton's m1750 config. + +Sun Feb 16 07:43:37 1997 Paul Eggert <eggert@twinsun.com> + + * cccp.c (special_symbol): Don't treat "L" in "L'...'" as identifier. + (check_macro_name, collect_expansion, rescan): Likewise. + * cpplib.c (special_symbol, check_macro_name, collect_expansion): + Likewise. + + * cexp.y (parse_c_expression): Don't check for null lexptr + or *lexptr == 0. If yyparse returns nonzero value, abort. + + * cexp.y (yylex): Use is_space, not is_hor_space, to find keyword end. + (is_space): New decl. + (is_hor_space): Removed. + * cccp.c (is_space): Now external. + (is_hor_space): Now static. + +Sun Feb 16 04:55:11 1997 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c, tree.h (decl_printable_name): Change arguments. + * c-common.c (declare_function_name): Reflect above change. + * final.c (final_start_function): Likewise. + * function.c (init_function_start): Likewise. + * toplev.c (decl_name): Likewise. + (announce_function): Likewise. + (v_message_with_decl): Likewise. + * dwarf2out.c (dwarf2_name): New fn, uses decl_printable_name. + (add_pubname): Use it. + (add_name_and_src_coords_attributes): Use it, add + DW_AT_MIPS_linkage_name if appropriate. + (output_aranges): Use DW_AT_MIPS_linkage_name if present. + +Sat Feb 15 18:45:30 1997 J.T. Conklin <jtc@cygnus.com> + + * m68k.md (cmpsi): Added insn with appropriate constraints for + TARGET_5200; changed condition of existing insn to !TARGET_5200. + +Sat Feb 15 18:26:50 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k/hp320.h (PRINT_OPERAND_FLOAT): Removed. + (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}_OPERAND): Defined. + (PRINT_OPERAND): Turned off: use default. + * m68k/news.h (PRINT_OPERAND): Turned off: use default. + (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}_OPERAND): Defined. + * m68k/tower-as.h (PRINT_OPERAND): Turned off: use default. + (ASM_OUTPUT_{FLOAT,DOUBLE}_OPERAND): Defined. + * m68k/crds.h (PRINT_OPERAND): Turned off: use default. + (ASM_OUTPUT_{FLOAT,DOUBLE}_OPERAND): Defined. + (SGS_NO_LI,STRUCTURE_SIZE_BOUNDARY,IMMEDIATE_PREFIX): Defined. + (NEED_PROBE): Defined instead of HAVE_probe and gen_probe. + (FUNCTION_{PRO,EPI}LOGUE): Do not access FPA registers. + * m68k.c (output_function_prologue): Add CRDS and MOTOROLA probe code. + (print_operand): Do not output '.' if CRDS. + + * gcc.c (set_spec): Fix comment-in-comment typo. + +Sat Feb 15 17:54:23 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * Makefile.in (COMPILERS): Moved before GCC_PASSES. + (GCC_PASSES): Use $(COMPILERS) instead of cc1$(exeext). + +Sat Feb 15 17:25:44 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * gcc.c (process_command): Allocate space for terminating null. + +Sat Feb 15 17:21:34 1997 Pat Rankin <rankin@eql.caltech.edu> + + * vax/vax.h (FUNCTION_PROLOGUE): Adjust size by STARTING_FRAME_OFFSET. + * vax/vms.h (FUNCTION_PROLOGUE): Delete. + +Sat Feb 15 08:48:14 1997 Douglas B. Rupp (rupp@gnat.com) + + * configure: Fix setting of CC in no-symlink case. + +Sat Feb 15 08:42:17 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * expmed.c (expand_divmod): Prefer divmod in same mode over div + in wider mode. + +Sat Feb 15 08:27:50 1997 J"orn Rennecke (amylaar@cygnus.co.uk) + + * fold-const.c (fold): Don't assume a nonexplicit constant cannot + equal an explicit one. + + * i386.md (zero_extendqi[hs]i2+3): Ensure operating on REG. + +Sat Feb 15 08:11:04 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure (i[3456]86-*-solaris2*): Correct tm.h filename in + stabs case. + + * a29k.h (STORE_FLAG_VALUE): Write so works on both 32 and 64-bit host. + +Fri Feb 14 16:03:37 1997 Robert Lipe <robertl@dgii.com> + + * i386/t-sco5 (libgcc{1,2}-elf.a): correct target dependencies. + +Fri Feb 14 16:00:23 1997 H.J. Lu <hjl@gnu.ai.mit.edu> + + * config/svr4.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Set + current-section variable to text. + +Wed Feb 12 16:07:34 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * fixinc.irix: New file. + * configure (mips-sgi-irix[56]): Set fixincludes to fixinc.irix. + +Wed Feb 12 15:40:20 1997 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (LIBGCC2_DEBUG_CFLAGS): New macro. + (LIBGCC2_CFLAGS): Use it. + + * dwarfout.c (output_type): Do early exit only if TYPE_CONTEXT is NULL + or if TYPE_CONTEXT is another type (e.g. a nested type). + +Tue Feb 11 15:53:51 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (calc_live_regs): Exclude RETURN_ADDRESS_POINTER_REGNUM. + + * sh.c (calc_live_regs): Need not save MACL/MACH when not live + or in leaf function. + +Mon Feb 10 14:46:32 1997 Jeffrey A Law (law@cygnus.com) + + * stmt.c (group_case_nodes): Recognize more opportunities to + group case nodes. + +Sun Feb 9 14:05:48 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (assign_stack_temp): Clear MEM flags from reuse. + +Sat Feb 8 17:37:47 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * local-alloc.c (update_equiv_regs): Fix error in last change. + +Fri Feb 7 12:42:34 1997 Mike Stump <mrs@cygnus.com> + + * pa.h (RETURN_ADDR_RTX): Fix to ignore export stubs. + * pa.c (return_addr_rtx): Define. + +Fri Feb 7 13:56:56 1997 Doug Evans <dje@cygnus.com> + + * cse.c (invalidate_from_clobbers): Delete unnecessary test for + (clobber nil). + + * toplev.c (main): Delete redundant settings of flag_no_inline + and warn_inline if not optimizating. + +Fri Feb 7 10:45:02 1997 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (stmp-multilib-sub): Add missing "else true" + clauses to work around make bug on some systems. + +Fri Feb 7 08:19:43 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * fold-const.c (const_binop): Don't call size_int if low < 0. + + * function.c (instantiate_virtual_regs_1, case USE, CLOBBER): + Fix error in last change. + +Thu Feb 6 17:09:17 1997 Mike Stump <mrs@cygnus.com> + + * except.c (find_exception_handler_labels): Initialize label array + with zeroes. + +Wed Feb 5 22:11:55 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (post_ldwm): Fix typos. + +Wed Feb 5 15:57:42 1997 Doug Evans <dje@cygnus.com> + + * m68k/vxm68k.h (WCHAR_TYPE,WCHAR_TYPE_SIZE,SIZE_TYPE): Fix. + (PTRDIFF_TYPE): Define. + +Wed Feb 5 11:19:13 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload1.c (alter_reg): Don't ask assign_stack_local to round up + to a multiple of BIGGEST_ALIGNMENT, unless a register appears in a + paradoxical subreg. + +Tue Feb 4 19:29:40 1997 Jim Wilson <wilson@cygnus.com> + + * reload.c (find_reloads_address_1, case POST_INC): Don't use + ADDR_TYPE here. + +Tue Feb 4 12:33:45 1997 Jeffrey A Law (law@cygnus.com) + + * flow.c (life_analysis): Delete obvious no-op moves + which use SUBREGs. + +Mon Feb 3 20:00:35 1997 Jim Wilson <wilson@cygnus.com> + + * jump.c (find_cross_jump): Don't allow old-style and volatile asms + to match. + +Mon Feb 3 15:51:31 1997 Doug Evans <dje@cygnus.com> + + * sparc/sol2.h (ASM_SHORT,ASM_LONG): Set to .uahalf/.uaword. + * sparc/sysv4.h (ASM_LONG): Define. + (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}): Use ASM_LONG. + +Mon Feb 3 13:01:46 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload.h (enum reload_type): Add RELOAD_FOR_INPADDR_ADDRESS and + RELOAD_FOR_OUTADDR_ADDRESS. + * reload.c (ADDR_TYPE): New macro. + (push_secondary_reload): Check for new reload types. + (combine_reloads): Likewise. + (find_reloads): Likewise. Convert INPADDR_ADDRESS and + OUTADDR_ADDRESS to OPADDR_ADDR. Check OPADDR_ADDR when looking + for merges. + (find_reloads_address): When reloading an address, use the + ADDR_TYPE macro to get the type of the new reload. + (find_reloads_address_1): Likewise. + (reload_when_needed_name): Add new reload types. + * reload1.c (reload): Add in_addr_addr and out_addr_addr fields to + insn_needs struct. Use them for new reload types, and when + computing in_max and out_max. + (reg_used_in_inpaddr_addr): New static array. + (reg_used_in_outaddr_addr): New static array. + (mark_reload_reg_in_use): Handle new reload types. + (clear_reload_reg_in_use, reload_reg_free_p): Likewise. + (reload_reg_free_before_p, reload_reg_reaches_end_p): Likewise. + (reloads_conflict, merge_assigned_reloads): Likewise. + (emit_reload_insns): Likewise. + (choose_reload_regs): Save arrays for new reload types. + +Sun Feb 2 19:43:17 1997 Scott Christley <scottc@net-community.com> + + * objc/selector.c (__sel_register_typed_name): Eliminate compiler + warnings with explicit cast. + + * Add condition mutex support to the objc runtime. + * objc/thr-mach.c (objc_condition_{,de}allocate): New functions. + (objc_condition_{wait,broadcast,signal}): New functions. + * objc/thr-pthreads.c (objc_condition_{,de}allocate): New functions. + (objc_condition_{wait,broadcast,signal}): New functions. + * objc/thr-solaris.c (objc_condition_{,de}allocate): New functions. + (objc_condition_{wait,broadcast,signal}): New functions. + * objc/thr.h: Prototypes for new functions. + + * objc/init.c (__objc_runtime_mutex): Eliminate leading underscore + from name of objc mutex and thread structures. + * objc/runtime.h: Likewise. + * objc/thr-{decosf1,irix,mach,os2,posix,pthreads,single}.c: Likewise. + * objc/thr-{solaris,win32}.c: Likewise. + * objc/thr.{c,h}: Likewise. + + * Major reorganization of objc error handling. + * objc/Object.m (-error:): Call objc_error function instead of + using function pointer. + * objc/archive.c: Replace call to abort or __objc_fatal functions + with call to objc_error function throughout the complete file. + * objc/class.c (objc_get_class): Replace call to abort function + with call to objc_error function. + * objc/encoding.c (objc_sizeof_type, objc_alignof_type): Replace + call to abort function with call to objc_error function. + (objc_skip_typespec): Likewise. + * objc/init.c (init_check_module_version): Replace call to + abort function with call to objc_error function. + * objc/misc.c (objc_verror): New function. + (objc_fatal): Remove function. + (objc_set_error_handler): New function. + (_objc_error_handler): New global variable. + (__alpha__): Remove unneeded code. + (objc_error): Allow user specified error handler function to + trap and handle the objc error. Added an error code parameter + which indicates the specific error that occured. + (objc_malloc, objc_atomic_malloc): Replace call to objc_fatal + function with call to objc_error function. + (objc_valloc, objc_realloc, objc_calloc): Likewise. + * objc/objc-api.h: Declare error handling functions and typedef + for user specified error handler function. Define error codes + used by the runtime library. + * objc/runtime.h: Remove error handling declarations. + * objc/sendmsg.c (__objc_forward): Replace call to abort function + with call to objc_error function. + +Sun Feb 2 19:42:52 1997 Thomas Baier <baier@ci.tuwien.ac.at> + + * objc/hash.c (hash_delete): Step through the hash nodes + versus using hash_next to increase efficiency. + * objc/archive.c (__objc_finish_read_root_object): Use hash + table instead of list. + +Sun Feb 2 08:25:05 1997 Ovidiu Predescu <ovidiu@net-community.com> + + * objc-act.c (encode_aggregate_within): New function. + (encode_aggregate): Generates encodings for unions similar + to those for structs except surrounded by parenthesis instead + of braces. + +Sun Feb 2 07:15:54 1997 Mat Hostetter (mat@lcs.mit.edu) + + * c-decl.c (start_function): Fix improper installation of last change. + +Sun Feb 2 06:50:55 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k.c (output_scc_di): Add missing CC_STATUS_INIT. + +Sun Feb 2 06:39:55 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-typeck.c (process_init_element): When popping levels, don't + blow up if constructor_max_index not set due to previous error. + + * combine.c (find_split_point, case SET): Fix error in last change. + +Sun Feb 2 06:28:56 1997 Paul Eggert <eggert@twinsun.com> + + * cccp.c (rescan): Insert a space after `.' as well, + to prevent accidental token-pasting (e.g. `.x' -> `.10'). + +Sun Feb 2 06:08:14 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * 1750a.c (modregno_adjust): Fixed case when reg_renumber invalid. + +Sat Feb 1 19:11:08 1997 J.T. Conklin <jtc@rhino.cygnus.com> + + * m68k.md (movqi): Enable use of clr and st insns on TARGET_5200. + * m68k.c (output_move_simode_const): Likewise. + +Sat Feb 1 18:54:00 1997 Douglas B. Rupp (rupp@gnat.com) + + * gcc.c (process_command): Fix improper use of strncpy. + +Fri Jan 31 15:35:08 1997 Mike Stump <mrs@cygnus.com> + + * libgcc2.c: Remove extern for malloc and realloc. + +Fri Jan 31 17:08:11 1997 Ian Lance Taylor <ian@cygnus.com> + + * local-alloc.c (update_equiv_regs): If a register which is + equivalent to some value is only used in one place, and we can't + substitute the value for the use, then move the register assignment + to just before the use. + +Fri Jan 31 15:57:25 1997 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md (idiv,imul,fpmul): Added new functional units for pentiumpro. + + * i386.c (pentiumpro_cost): Added new cost structure for pentiumpro. + (override_options): Set ix86_cost to appropriate cost structure. + +Thu Jan 30 09:34:26 1997 J.T. Conklin <jtc@rhino.cygnus.com> + + * m68k.md (stack adjust peepholes): Use lea instead of + add.w when adding 16 bit constants on all but TARGET_68040. + +Thu Jan 30 08:58:08 1997 Ralf Baechle <ralf@waldorf-gmbh.de> + + * function.c (TRAMPOLINE_ALIGNMENT): Provide default. + (expand_function_end): Use TRAMPOLINE_ALIGNMENT instead + of FUNCTION_BOUNDARY. + * varasm.c (TRAMPOLINE_ALIGNMENT): Provide default. + (assemble_trampoline_template): Use TRAMPOLINE_ALIGNMENT instead + of FUNCTION_BOUNDARY. + +Wed Jan 29 18:16:02 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.h (REG_CLASS_CONTENTS): Add rap to GENERAL_REGS and its + superclasses. + + * sh.md (movsi_i, movsi_ie, movhi_i, movhi+1): Use type pcload for + immediate operands where appropriate. + (movsf_ie+1): Fail when loading anything but a MEM into + a floating point reguister. + +Wed Jan 29 16:00:31 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * varasm.c (force_const_mem): Set MARK instead of clearing it. + (output_constant_pool): Only mark constant pool if -O. + Check mark flag unconditionally. + (mark_constant_pool): Start by clearing all mark flags. + + * tree.c (copy_node): Clear TREE_ASM_WRITTEN. + + * flow.c (regno_uninitialized): Return 0 if reg is used for args. + +Wed Jan 29 15:23:59 1997 Ian Lance Taylor <ian@cygnus.com> + + * combine.c (try_combine): Clear reg_n_refs if i2dest is not + mentioned in newi2pat. + +Tue Jan 28 16:00:23 1997 Stan Cox (coxs@dg-rtp.dg.com) + + From Robert Lipe <robertl@dgii.com> + * i386/sco5.h (SCO_DEFAULT_ASM_COFF): Remove bytecode stuff. + (ASM_OUTPUT_ASCII): Use .ascii in both ELF and COFF modes. + (ASM_OUTPUT_SECTION_NAME): Handle alternate sections for COFF. + The OpenServer 5.0.0 assembler gives an error for section + names over 6 characters long, so we catch the "obvious" case + and shorten it. + + * m88k.h (ASM_OUTPUT_SECTION_NAME): Undefine; fails + for exception sections. The 88k ABI specifies 'section' + instead of '.section'. + +Mon Jan 27 13:32:46 1997 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (shl_and_kind): Fix typo. + * sh.md (and_shl_scratch): Fix typo for length 8. + +Mon Jan 27 08:56:03 1997 Jeffrey A Law (law@cygnus.com) + + * fixincludes: Fix incorrect forward structure declaration in + sys/time.h on hpux10.20. + +Mon Jan 27 09:05:35 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * combine.c (simplify_rtx): Don't do anything with if_then_else_cond + result if both one arm and the input are a comparison. + (simplify_{rtx,if_then_else,logical,shift_const}): Don't + test STORE_FLAG_VALUE with #if; properly test for just sign bit. + (num_sign_bit_copies, if_then_else_cond): Likewise. + * expmed.c (emit_store_flag): Properly test for STORE_FLAG_VALUE + of just sign bit. + * fold-const.c (fold): Don't make COND_EXPR when both expr and + one part are comparisons. + * a29k.h (STORE_FLAG_VALUE): Make negative. + +Fri Jan 24 16:42:26 1997 Ian Lance Taylor <ian@cygnus.com> + + * varasm.c (struct pool_constant): Add mark field. + (force_const_mem): Clear mark field in new constant pool entry. + (output_constant_pool): Call mark_constant_pool. + (mark_constant_pool, mark_constants): New static functions. + +Thu Jan 23 15:04:17 1997 Ian Lance Taylor <ian@cygnus.com> + + * cse.c (COST): Get the right cost for a SUBREG of a register when + truncation is free. + +Thu Jan 23 11:19:40 1997 Mike Stump <mrs@cygnus.com> + + * Makefile.in (objc-headers): Don't try and install the headers if + the objc directory has been removed. + +Wed Jan 22 13:26:25 1997 Brendan Kehoe <brendan@lisa.cygnus.com> + + * i960.c (process_pragma): Call ungetc on the last character + that was read by the while loop, to make sure the parser sees it. + +Tue Jan 21 17:20:30 1997 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (output_toc): Move STRIP_NAME_ENCODING to common + code, so the test for vt's works with -mminimal-toc. + +Tue Jan 21 16:03:35 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (mark_all_temps_used): Set KEEP as well. + +Tue Jan 21 12:16:15 1997 Doug Evans <dje@seba.cygnus.com> + + * stor-layout.c (layout_record): Correct test for whether + field spans its unit of alignment in case where + field_size == type_align. + +Mon Jan 20 20:27:54 1997 Ian Lance Taylor <ian@cygnus.com> + + * mips.md (probe): Comment out. + +Sun Jan 19 20:54:45 1997 John F. Carr <jfc@mit.edu> + + * integrate.c (expand_inline_function): Handle a PARALLEL containing + a RETURN the same as a RETURN. + +Sun Jan 19 20:35:28 1997 Pat Rankin <rankin@eql.caltech.edu> + + * vmsconfig.com: Change all hardcoded references of "vax" to + use variable expansion instead. + (arch_indx, arch): New variables. + + * vax.c (not_qsort): Don't declare alloca. + * vax/xm-vms.h: Declare alloca here. + Do most of the VAX C-specific set up for DEC C. + #if DEC C, undefine QSORT_WORKAROUND and qsort. + * make-gcc.com, make-cccp.com, make-cc1.com: Support building + with GNU C vs VAX C vs DEC C from the DCL command line. + +Sun Jan 19 17:20:50 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * 1750a.md (movh[if]-1): Corrected. + (movtqf-1): Deleted. + * 1750a.c (add_1_to_mem): Deleted. + (output_operand_address): Added output modifier 'A'. + +Sun Jan 19 17:17:54 1997 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.md (ashrdi_const, ashrdi3): Allow 31 as shift count. + + * m68k.h (CONST_OK_FOR_LETTER_P): Recognize 'N', 'O' and 'P'. + * m68k.md (rotl[shq]i3, strict_low_part rotl): Allow 'N', 'O' + or 'P' operands. + +Sun Jan 19 17:09:17 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k.md (addsi3): Fix previous change: {add,sub}qw should + be {add,sub}ql. For other uses of {add,sub}q don't check for address + register and always use {add,sub}ql. + +Sun Jan 19 15:05:42 1997 Peter Seebach <seebs@solon.com> + + * c-decl.c (start_decl): Add code for -Wmain. + (c_decode_option): Add -fhosted, -ffreestanding, and -Wmain. + * toplev.c (lang_options): Likewise. + * c-tree.h (warn_main, flag_hosted): New variables. + +Sun Jan 19 14:35:41 1997 Alex Garthwaite (alex@samwise.cis.upenn.edu) + + * fixinc.svr4: Fix problems with symlinks to ".". + +Sun Jan 19 14:21:46 1997 Craig Burley <burley@gnu.ai.mit.edu> + + * loop.c (check_final_value): Handle insns with no luid's. + +Sun Jan 19 08:57:26 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.md (arg_home): Add CLOBBER of MEM and USE of arg regs. + * vms.h (SETUP_INCOMING_VARARGS): Delete duplicate definition. + + * toplev.c (set_float_handler): Set up signal catcher on first call + in case a front end has disabled it. + + * cccp.c, cexp.y: #define __attribute__ to be null if + compiling with GCC older than 2.7, not 2.6. + + * toplev.c (main): If PREFERRED_DEBUGGING_TYPE used and set + to NO_DEBUG, say debugging not supported. + * mips/sni-svr4.h (PREFERRED_DEBUGGING_TYPE): Undefine. + + * i386/xm-cygwin32.h (DIR_SEPARATOR): Define. + + * explow.c (convert_memory_address, case SYMBOL_REF): + Copy CONSTANT_POOL_ADDRESS_P. + * integrate.c (save_constants): Make (address (const ..)) to record + both modes. + (copy_for_inline, copy_rtx_and_substitute, restore_constants): Use + both modes when restoring constant pool entry for ADDRESS. + + * alpha.h (MINIMUM_ATOMIC_ALIGNMENT): New macro. + + * function.c (instantiate_virtual_regs_1, case USE, case CLOBBER): + Properly handle case of shared MEM whose replacement is not valid. + +Sat Jan 18 14:08:31 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.c (get_unwidened): Don't crash if FIELD_DECL not layed out. + + * varasm.c (const_hash): Treat NON_LVALUE_EXPR like CONVERT_EXPR. + (compare_constant_1, copy_constant, bc_assemble_integer): Likewise. + (const_hash, compare_constant_1): Use switch, not if-then-else. + +Fri Jan 17 17:10:20 1997 Ian Lance Taylor <ian@cygnus.com> + + * mips.h (STACK_POINTER_OFFSET): Don't define. + +Thu Jan 16 14:51:03 1997 Bob Manson <manson@charmed.cygnus.com> + + * cplus-dem.c: Fix indenting; note that this file also lives in + libiberty. + (do_type, case 'M'): Check for a template as well as a class. + +Thu Jan 16 15:08:26 1997 Michael Meissner <meissner@tiktok.cygnus.com> + + * gcc.c (cross_compile): Change to be a char * like all of the + other specs. + (process_command): Change how cross_compile is tested. + (main): Likewise. + (struct spec_list): Merge with the format used by EXTRA_SPECS. + Add name length field to speed up repeated calls to strcmp. Add + flag to say spec was allocated. Add pointer to char * so that + static spec fields can be updated. + (extra_specs): Use struct spec_list as type. + (static_specs): Static list of predefined specs. + (init_specs): New function, initialize the specs list. Link in + the default specs and any specs defined via EXTRA_SPECS. + (set_spec): No longer special case predefined specs. + (process_command,validate_all_switches): Ditto. + (process_command): Call init_specs for -dumpspecs. + (do_spec_1): Use name length field to avoid calling strncmp when + it is going to fail. + (main): Call init_spec. Don't handle EXTRA_SPECS here. + +Thu Jan 16 17:07:54 1997 Eddie C. Dost <ecd@skynet.be> + + * configure: Add sparc-linux{,aout} support. + * ginclude/va-sparc.h: Likewise. + * sparc/linux.h: New file. + * sparc/linux-aout.h: New file. + * sparc/xm-linux.h: New file. + +Thu Jan 16 16:19:13 1997 Jim Wilson <wilson@cygnus.com> + + * configure (sparc-*-aout*): Add libgloss.h to tm_file. + (sparclite-*-coff*): Change "= to =". + +Thu Jan 16 12:53:15 CST 1997 Joel Sherrill <joel@OARcorp.com> + + * rs6000/rtems.h: Change from being sysv4 based to being eabi based. + +Thu Jan 16 13:40:51 1997 Jim Wilson <wilson@cygnus.com> + + * mips.h (LINKER_ENDIAN_SPEC): Define. + (LINK_SPEC): Add linker_endian_spec. + (EXTRA_SPECS): Add linker_endian_spec. + +Thu Jan 16 08:02:13 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.md (bCC, inverted bCC): Use bCC .+X instead of bCC 0f. + +Wed Jan 15 14:06:28 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload.h (reload_address_base_reg_class): Declare. + (reload_address_index_reg_class): Declare. + * reload1.c (reload_address_base_reg_class): Define. + (reload_address_index_reg_class): Define. + (init_reload): Initialize reload_address_{base,index}_reg_class. + * reload.c (find_reloads_address): Use + reload_address_base_reg_class rather than BASE_REG_CLASS. Use + reload_address_index_reg_class rather than INDEX_REG_CLASS. + (find_reloads_address_1): Likewise. + +Tue Jan 14 15:26:33 1997 Ian Lance Taylor <ian@cygnus.com> + + * reload.c (REGNO_MODE_OK_FOR_BASE_P): Define if not defined. + (REG_MODE_OK_FOR_BASE_P): Define if not defined. + (find_reloads_address): Use REG[NO]_MODE_OK_FOR_BASE_P rather than + REG[NO]_OK_FOR_BASE_P. + (find_reloads_address_1): Likewise. + Add mode parameter; change all callers. + + * reload1.c (eliminate_regs_in_insn): Handle more cases when + eliminating the frame pointer to the hard frame pointer. + + * varasm.c (force_const_mem): Copy a CONST_INT rtx like a CONST rtx. + + * varasm.c (assemble_end_function): Call + output_after_function_constants. + (after_function_constants): New static variable. + (output_after_function_constants): New static function. + (output_constant_def): Check CONSTANT_AFTER_FUNCTION_P. + +Mon Jan 13 16:44:40 1997 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000/aix41.h (CPP_PREDEFINES): Add -D_AIX41. + +Sun Jan 12 20:54:01 1997 Jim Wilson <wilson@cygnus.com> + + * libgloss.h (LINK_SPEC): Delete. + (STARTFILE_SPEC): Delete spurious newline. + +Sat Jan 11 00:13:03 1997 Torbjorn Granlund <tege@quiet.matematik.su.se> + + * mips.md (norsi3, nordi3): Use canonical RTL. Prepend `*' to pattern + name. Don't match immediates. + (norsi3_const, nordi3_const): New patterns. + (anddi3, iordi3, xordi3): Test TARGET_64BIT, not mips_isa + in length attribute calculation. + * mips.c (complemented_arith_operand): New function. + (print_operand): Handle `e' for CONST_INT. + * mips.h (PREDICATE_CODES): Add complemented_arith_operand. + +Fri Jan 10 14:11:53 1997 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000/aix41.h (SUBTARGET_SWITCHES): Add threads and pe. + (CPP_SPEC): Add mpe and mthreads cases. + (LIB_SPEC): Add mpe and mthreads cases to variant from rs6000.h. + (STARTFILE_SPEC): Add mpe and mthreads support. + +Fri Jan 10 07:12:26 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * i386/cygwin32.h (LINK_SPEC): New definition. + + * Makefile.in (FLAGS_TO_PASS): Add STAGE_PREFIX, set by configure. + * configure: Initialize exeext. + Update STAGE_PREFIX in Makefile. + + * dwarfout.c (dwarfout_line): Push to LINE_SECTION after calling + lookup_filename. + +Thu Jan 9 12:06:04 1997 Jim Wilson <wilson@cygnus.com> + + * i386.md (addsidi3_2): Add & to operand 0 of alternative 5. + +Thu Jan 9 12:06:04 1997 Stan Cox <coxs@dg-rtp.dg.com> + + From Linus Torvalds and Mat Hostetter: + * i386.c (i386_sext16_if_const): Added to sign extend an HImode constant. + (i386_aligned_reg_p): Added to tell if an rtx is aligned. + (i386_cc_probably_useless_p): Don't trust cc bits. + * i386.h (TARGET_ZERO_EXTEND_WITH_AND): Don't do this for p6. + * i386.md (cmpsf_ccfpeq+2): Use SImode test instruction. + (movhi+1): Use movz instead of mov on p6. + (addsi3): Add 128 by subtracting -128. + (zero_extendhisi2): Use SImode move if aligned. + (addhi3): Likewise. + (subhi3): Likewise. + (andhi3): Likewise. + (iorhi3): Likewise. + (xorhi3): Likewise. + +Tue Jan 7 16:58:27 1997 Jason Merrill <jason@yorick.cygnus.com> + + * c-parse.in (extension): New rule for __extension__. + (extdef, unary_expr, decl, component_decl): Use it. + +Mon Jan 6 15:44:37 1997 Oliver Kellogg (oliver.kellogg@space.otn.dasa.de) + + * 1750a.c: Now includes regs.h. + ({movcnt,mod}_regno_adjust): Corrected typos. + * 1750a.md (movhi): Corrected case of moving constant to memory. + +Mon Jan 6 08:00:57 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * mips.h: Delete redundant definitions of compiler and library fns. + + * dwarfout.c (type_attribute): Ignore any subtype for now. + + * fold-const.c (operand_equal_p): Rework to consider two + expressions that have embedded identical SAVE_EXPRs as + equivalent; also handle some more cases. + +Sun Jan 5 23:54:34 1997 Jeffrey A Law (law@cygnus.com) + + * pa.md (pic_load_label): Fix test for using just an + ldo rather than an addil;ldo sequence to load the label's + address. + +Sun Jan 5 07:26:47 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (expand_expr, case COMPONENT_REF): Fix error in last + change: don't suppress conversion if just EXPAND_SUM. + +Sat Jan 4 18:44:01 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.h (struct tree_decl): saved_insns.i is HOST_WIDE_INT. + + * fold-const.c (const_binop): Rework to only make constants in + one place; always use size_int if small enough and of sizetype. + (size_int): Call force_fit_type. + (fold): Avoid ever changing type of input tree. + + * expr.c (get_inner_reference): Fix type error. + (expand_expr, case COMPONENT_REF): Don't convert if modifier + is EXPAND_CONST_ADDRESS, EXPAND_SUM, or EXPAND_INITIALIZER. + * tree.c (staticp, case COMPONENT_REF, BIT_FIELD_REF): Not + static if bitfield. + + * expr.c (expand_expr, case COMPONENT_REF): If taking value + from a CONSTRUCTOR, must mask/sign-extend if bitfield. + (expand_builtin, case BUILT_IN_LONGJMP): Pass type, not IDENTIFIER, + to second arg of RETURN_POPS_ARGS. + + * expr.c (expand_expr, case COND_EXPR): Add additional cases + to "singleton" cases. + * tree.c (integer_pow2): Mask value to width of type. + (tree_log2): New function. + + * expmed.c (store_fixed_bit_field): If not SLOW_UNALIGNED_ACCESS, + treat everything as maximally aligned. + + * combine.c (find_split_point, case SET): If SET_SRC is NE and + STORE_FLAG_VALUE is -1, see if we can convert into NEG of shift. + (force_to_mode, case NE): Make condition stricter. + + * calls.c (emit_library_call_value): Remove redundant check for + outmode != VOIDmode. + +Sat Jan 4 08:12:16 1997 J.T. Conklin <jtc@rhino.cygnus.com> + + * Optimizations from John Vickers (john@rhizik.demon.co.uk): + * m68k.c (output_function_{pro,epi}logue): Use addq/subq when + adjusting stack pointer by small displacements. + * m68k.md (addsi3, addhi3): Use two addqw (or subqw) insns when + adding (or subtracting) small integer constants (8 < N <= 16) to + both address and data registers. + +Sat Jan 4 07:06:07 1997 Kamil Iskra <iskra@student.uci.agh.edu.pl> + + * loop.c (basic_induction_var): Return 0 if SUBREG is not a + promoted variable. + +Sat Jan 4 06:22:36 1997 Doug Rupp (rupp@gnat.com) + + * alpha.c (vmskrunch): Try to not chop trailing uppercase letters. + * alpha/vms.h (ENDFILE_SPEC): Use "gnu", not "gnu_cc". + + * cccp.c (PRINTF_PROTO): Use __printf__ in __attribute__, not printf. + * cexp.y (PRINTF_PROTO): Likewise. + +Fri Jan 3 09:01:00 1997 Craig Burley <burley@gnu.ai.mit.edu> + + * alpha.md (cmov): Fix operand numbers in case involving DF target, + DF comparison, and SF source. + +Fri Jan 3 08:19:46 1997 Paul Eggert <eggert@twinsun.com> + + * cpplib.c (macroexpand): Delete any no-reexpansion marker following + identifier at beginning of an argu concatenated with what precedes it. + +Fri Jan 3 07:59:21 1997 Ken Rose (rose@netcom.com) + + * reorg.c (fill_slots_from_thread): Skip moved insn in all three cases. + +Fri Jan 3 07:51:44 1997 Bob Manson <manson@cygnus.com> + + * function.c ({push,pop}_function_context_to): Save and restore + current_function_args_info. + * function.h (struct function): New field args_info. + +Fri Jan 3 06:55:09 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * jump.c (rtx_equal_for_thread_p): Return 0 for floating-point. + + * reload.c (find_reloads): If replaced a PLUS or MULT with a + simple operand, start over again. + + * va-alpha.h: Check for __VMS__, not VMS. + +Thu Jan 2 08:52:51 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * configure: Finish restoring change of default of objc threads to + "single" for Linux. + +Mon Dec 30 17:03:46 1996 Jeffrey A Law (law@cygnus.com) + + * pa.c (fmpy_operands): Remove. No longer needed. + (combinable_add, combinable_copy, combinable_fmpy): Likewise. + (combinable_fadd, combineable_fsub): Likewise. + (pa_reorg): Call pa_combine_instructions. + (pa_combine_instructions): Combine instructions to make things + like fmpyadd and fmpysub. + (pa_can_combine_p): Helper function for pa_combine_instructions. + * pa.md (pa_combine_type): New attribute. Set it appropriately + for various insns. + (define_delays): Use a separate define_delay for unconditional + branches. + (fmpyadd, fmpysub peepholes): Remove, no longer needed. + (fmpyadd, fmpysub insns): Add variant with fadd/fsub first, + then the fmpy. + +Mon Dec 30 14:43:51 1996 Jim Wilson <wilson@cygnus.com> + + * reg-stack.c (subst_stack_regs_pat): Set src_note explicitly, instead + of using invalid aggregate initialization. + + * print-tree.c (print_node): Don't try to print nonexistent + TYPE_ATTRIBUTES field of a decl node. + +1996-12-30 Richard Stallman <rms@ethanol.gnu.ai.mit.edu> + + * config.sub: Handle hiuxmpp as system type. + +Thu Dec 26 13:33:27 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (init_v4_pic): Explicitly set the length. + +Mon Dec 23 19:39:38 1996 Jim Wilson <wilson@cygnus.com> + + * mips.h (FUNCTION_ARG_REGNO_P): Correct for TARGET_SOFT_FLOAT and + TARGET_FLOAT64 cases. + + * integrate.c (function_cannot_inline_p): Reject function with + PARALLEL result. + (expand_inline_function): Abort if function result not handled. + +Sat Dec 21 04:02:46 1996 Jason Merrill <jason@gerbil.cygnus.com> + + * mips.c (save_restore_insns): Mark large frame setup insns + as frame-related. + (mips_expand_prologue): Likewise. + + * dwarf2out.c (dwarf2out_frame_debug): Support MIPS large frames. + (add_bound_info): Use default lower bounds. + Handle simple variable bounds with a DIE ref. + Don't generate a NULL loc descr. + (add_subscript_info): Always add lower bound. + (gen_formal_parameter_die): Always equate_decl_number_to_die. + (gen_variable_die): Likewise. Don't use the old die for automatic + variables. + +Wed Dec 18 10:23:46 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (notice_update_cc): Enable this code. + * mn10300.h (CC_OVERFLOW_UNUSABLE): Define. + * mn10300.md (tstsi): Use "set_zn_c0" instead of "set" for cc status. + (addsi3 pattern): Break "inc" into two different alternatives + since "inc dn" sets cc0, but "inc an" does not. + (multiply and divide patterns): Fix cc status. + (bCC, inverted bCC): Restore any comparison which needs the + overflow bits when CC_OVERFLOW_UNUSABLE is set. + (zero and sign extensions): Fix cc status. + (movm_store): Likewise. + +Tue Dec 17 15:02:44 1996 Jim Wilson <wilson@cygnus.com> + + * sched.c (update_flow_info): When add REG_DEAD notes for dest of + last insn, add check for global_regs. + +Tue Dec 17 11:07:26 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/win-nt.h (HAS_INIT_SECTION): Delete, so that __main is + called from main. + +Mon Dec 16 15:28:44 1996 Jim Wilson <wilson@cygnus.com> + + * combine.c (nonzero_bits): Ifdef out calls to num_sign_bit_copies. + Add dummy define/undef for num_sign_bit_copies. + + * dwarfout.c (location_or_const_value_attribute, case CONCAT): Add. + + * combine.c (simplify_comparison): Use mode_width as shift count + only if it is less than or equal to HOST_BITS_PER_WIDE_INT. + +Mon Dec 16 10:10:11 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (expand_epilogue): Restore registers in the + "ret" instruction instead of a separate movm instruction. + Support possible stack deallocation in "ret" instruction too. + * mn10300.md (return_internal): Use "ret" instead of "rets"; + restore registers and deallocate stack as needed. + (load_movm): Delete unused pattern. + + * mn10300.h (SMALL_REGISTER_CLASSES): Define. + +Fri Dec 13 14:46:54 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.md (dect): Rewrite pattern so that it can be combined. + +Fri Dec 13 13:14:51 1996 Ian Lance Taylor <ian@cygnus.com> + + * varasm.c (output_constant_pool): If ASM_OUTPUT_POOL_EPILOGUE is + defined, call it. + +Thu Dec 12 20:04:55 1996 Jason Merrill <jason@yorick.cygnus.com> + + * rtl.h (RTX_FRAME_RELATED_P): New macro. + (struct rtx_def): Add frame_related bitfield. + * final.c (final_scan_insn): Call dwarf2out_frame_debug. + Don't call dwarf2out_begin_function. + (final): Initialize dwarf2out_frame_debug. + * dwarf2out.c (dwarf2out_begin_function): Remove. + (dwarf2out_init): Use INCOMING_RETURN_ADDR_RTX. + (DWARF_CIE_DATA_ALIGNMENT): Generalize. + (DWARF_FRAME_REGNUM): Don't add 1. + (decode_cfi_rtl): Lose. + (dwarf2out_def_cfa): Now takes reg and offset directly. + (reg_save): Likewise. + (dwarf2out_reg_save): Now takes offset. + (initial_return_save): Grok INCOMING_RETURN_ADDR_RTX. + Replaces dwarf2out_return_save. + (dwarf2out_cfi_label): New fn. + (add_fde_cfi): Use it. + (dwarf2out_frame_debug): New fn. + * mips.h (DWARF_FRAME_REGNUM): Tweak r31. + (INCOMING_RETURN_ADDR_RTX): Define. + * mips.c (mips_expand_prologue): Set RTX_FRAME_RELATED_P as needed. + (save_restore_insns): Likewise. + * i386.c (ix86_expand_prologue): Likewise. + * i386.h (INCOMING_RETURN_ADDR_RTX): Define. + (DWARF_FRAME_RETURN_COLUMN): Define. + + * dwarf2out.c (add_AT_long_long): Renamed from add_AT_double for + clarity. + (print_die): Adjust. + (add_AT_float): New fn. + (add_const_value_attribute): Support fp values. + (size_of_die): Use blocks for long_long and fp values. + (value_format): Likewise. + (output_die): Likewise. + (output_loc_operands): Don't support DW_OP_const8?. + +Thu Dec 12 19:49:09 1996 Ian Lance Taylor <ian@cygnus.com> + + * varasm.c (CONSTANT_POOL_BEFORE_FUNCTION): Define if not + defined. + (assemble_start_function): Check CONSTANT_POOL_BEFORE_FUNCTION + to decide whether to call output_constant_pool. + (assemble_end_function): Likewise. + + * calls.c: Check SMALL_REGISTER_CLASSES at run time as well as at + compile time. + * combine.c, cse.c, function.c, jump.c, local-alloc.c: Likewise. + * loop.c, reload.c, reload1.c: Likewise. + * dsp16xx.h (SMALL_REGISTER_CLASSES): Define with value. + * h8300.h (SMALL_REGISTER_CLASSES): Likewise. + * i386.h (SMALL_REGISTER_CLASSES): Likewise. + * pdp11.h (SMALL_REGISTER_CLASSES): Likewise. + * sh.h (SMALL_REGISTER_CLASSES): Likewise. + +Thu Dec 12 15:25:39 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (sysv call insns): If flag_pic add @plt suffix. + + * rs6000.md (fix_truncdfsi2_store): Fix offsets > 32k. + + * rs6000/t-ppccomm: New file for common parts of embedded and + System V target Makefile support. + + * rs6000/t-ppcos: New file for System V OS target Makefile + support. + + * rs6000/t-solaris: Delete, merge into rs6000/t-ppcos. + + * rs6000/t-{ppc,ppcgas}: Only keep the multilib specific parts, + moving the rest to rs6000/t-ppccomm. + + * configure (powerpc*-*-*): For embedded and System V + configurations, add rs6000/t-ppccomm. For Linux and Solaris, use + t-ppcos. + + * ginclude/ppc-asm.h (cr*, f*): Add new macros for register names. + + * rs6000/sol-c0.c (_start): Fix uninitialized data bug. + + * rs6000.md (init_v4_pic): Add @local to call. + (icbi,dcbst,sync,isync): Delete PowerPC cache control insns. + + * rs6000/sysv4.h (ASM_SPEC): On explicit -mcall-solaris, pass + -msolaris to the assembler. + + * rs6000.c (rs6000_sync_trampoline): Delete. + (rs6000_trampoline_template): Aix & System V don't need template now. + (rs6000_initialize_trampoline): For System V, call the function + __trampoline_setup to set up the trampoline. + + * rs6000.h (TRAMPOLINE_TEMPLATE): Delete here. + * rs6000/win-nt.h (TRAMPOLINE_TEMPLATE): Add it here. + + * rs6000/tramp.asm: New file, setup trampolines properly on System + V systems, properly flushing the caches. + +Thu Dec 12 10:53:10 1996 Jeffrey A Law (law@cygnus.com) + + * reorg.c (fill_slots_from_thread): Don't call eligible_for_delay + with an insn with asm operands. + + * expmed.c (emit_store_flag_force): Fix typos/thinkos. + +Thu Dec 12 08:09:20 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * i386.c (i386_return_pops_args): Libcalls ignore TARGET_RTD. + +Thu Dec 12 07:56:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.h (maybe_get_identifier): New declaration. + + * calls.c (emit_library_call): Don't pass VOIDmode to type_for_mode. + + * va-alpha.h: Add definitions for VMS; they differ from Unix. + + * Makefile.in (stamp-objlist): Handle first character of object + file being a digit. + + * 1750a.h (function_arg, {movcnt,mod}_regno_adjust): Add decls. + (branch_or_jump): Likewise. + (FUNCTION_ARG): Remove cast of function_arg result to rtx. + * 1750a.md: Remove unneeded casts to char *. + +Thu Dec 12 05:55:27 1996 Richard Earnshaw (rearnsha@armltd.co.uk) + + * arm.c (arm_gen_constant, case [IX]OR): Don't invert constant if + loading into temporary. + +Wed Dec 11 18:57:21 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * toplev.c (rest_of_compilation): Make sure unwinder RTL is saved. + + * collect2.c (write_c_file): Wrap the ctor/dtor lists and fns + with `extern "C" { ... }'. + +Wed Dec 11 17:46:48 1996 John F. Carr <jfc@mit.edu> + + * tree.h (tree_decl): Reorder field declarations to reduce size + on 64 bit machines. + + * combine.c (try_combine): When splitting an insn, check for the + new I2 setting a SUBREG. + +Wed Dec 11 17:00:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.c (print_operand): Use HOST_WIDE_INT_PRINT_DEC instead of + using "%ld". + (output_prolog): Don't print useless comment for VMS. + + * alpha.c (output_prolog): SIZE is now HOST_WIDE_INT. + * alpha.md (mov[hq]i unnamed): Split up for TARGET_BYTE_OPS and not. + + * function.c (fixup_var_refs_1, case ZERO_EXTRACT): Don't call + fixup_memory_subreg if no longer SUBREG of MEM. + +Wed Dec 11 14:10:48 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.c: New file for Matsushita MN10300 port. + * mn10300.h, mn10300.md, t-mn10300, xm-mn10300.h: Likewise. + * config.sub: Recognize mn10300 as a basic machine type. + * configure: Similarly. + * ginclude/stdarg.h: mn10300 is little endian. + * ginclude/varargs.h: Likewise. + +Wed Dec 11 09:09:10 1996 Nagai Takayuki <nagai@ics.es.osaka-u.ac.jp> + + * libgcc2.c (cacheflush): Add SONY NEWS-OS 4.2 version. + +Wed Dec 11 09:01:39 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * calls.c (emit_library_call, emit_library_call_value): + Don't pass an identifier node as function type for + library functions, but rather build a function type that + has a return type with the correct mode. + * i386.c (i386_return_pops_args): Don't test for IDENTIFIER_NODE. + * i386/isc.h (obsolete RETURN_POPS_ARGS): Test first argument + for IDENTIFIER_NODE. + * i386/next.h (RETURN_POPS_ARGS): Likewise. + * i386/sco.h (RETURN_POPS_ARGS): Likewise. + * i386/sco5.h (RETURN_POPS_ARGS): Likewise. + * i386/scodbx.h (RETURN_POPS_ARGS): Likewise. + * m68k.h (RETURN_POPS_ARGS): Likewise. + * ns32k.h (RETURN_POPS_ARGS): Likewise. + * pyr.h (RETURN_POPS_ARGS): Likewise. + * gmicro.h (RETURN_POPS_ARGS): Likewise; fix typo. + +Tue Dec 10 17:36:47 1996 J.T. Conklin <jtc@rhino.cygnus.com> + + * Add optimizations from John Vickers (john@rhizik.demon.co.uk) + * m68k.h (TARGET_CPU32): New macro. + * m68k.md (add[hs]i3): Only use two addq.w or subq.w instructions + when adding or subtracting constants 8 < N < 16 on TARGET_CPU32. + Use lea instead of add.w when adding 16 bit constants to address + registers on all but TARGET_68040. + * m68k.c (output_function_{pro,epi}logue): Use lea instead of add.w + when adjusting stack pointer on all but TARGET_68040. + +Tue Dec 10 15:55:23 1996 Ian Lance Taylor <ian@cygnus.com> + + * optabs.c (emit_unop_insn): Treat ZERO_EXTEND like SIGN_EXTEND. + +Tue Dec 10 13:47:24 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * combine.c (combinable_i3pat): Bring back to sync with can_combine_p. + + * sh.h (ADJUST_INSN_LENGTH): Don't break from loop when LOOP_BEG found. + Calculate padding in new variable pad. + +Mon Dec 9 18:00:38 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (output_uleb128): Output the value in a human-readable + comment. + (output_sleb128): Likewise. + (various): Adjust. + (output_call_frame_info): Only output info if it's interesting. + (add_src_coords_attributes): New fn. + (add_name_and_src_coords_attributes): Split out from here. + (gen_enumeration_type_die): Add src coordinates. + (gen_struct_or_union_type_die): Likewise. + (dwarf2out_finish): Call output_call_frame_info for all targets. + +Thu Dec 5 11:25:30 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (add_pure_or_virtual_attribute): Only add + AT_containing_type if -g2 or higher. + + * dwarf2out.c (gen_struct_or_union_type_die): Make sure that + the type for AT_containing_type has been generated. + (gen_decl_die): Likewise. + + * dwarf2out.c (type_tag): Check DECL_IGNORED_P. + (add_pure_or_virtual_attribute): Check DECL_VINDEX instead. + (scope_die_for): Likewise. + * dwarfout.c (type_tag): Likewise. + +Wed Dec 4 22:51:38 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (decode_cfi_rtl): Support getting a CONST_INT. + (dwarf2out_begin_function): Adjust. + (reg_save): Divide offset by the alignment. + (output_cfi): Support having more than one advance_loc. + (output_call_frame_info): Re-initialize current_label. + (dwarf2out_begin_prologue): Initialize current_label to NULL. + (lookup_cfa, lookup_cfa_1): New fns. + (dwarf2out_def_cfa): Call lookup_cfa. + (dwarf2out_finish): Don't generate CIE CFIs. + (dwarf2out_init): Generate them here. + (DWARF_FRAME_RETURN_COLUMN): Use PC_REGNUM. + + (add_pure_or_virtual_attribute): Note virtual context. + (gen_formal_parameter_die): Return the die. + (gen_formal_types_die): Set AT_artificial on `this'. + (gen_subprogram_die): Add AT_accessibility. + (gen_variable_die): Likewise. + (gen_field_die): Likewise. Don't generate location attribute for + union members. + (gen_struct_or_union_type_die): Note where our vtable lives. + (gen_decl_die): Handle anonymous union fields. + (dwarf2out_decl): Always output `bool'. + +Mon Dec 2 03:55:15 1996 Jason Merrill <jason@yorick.cygnus.com> + + * final.c (final_end_function): Don't call dwarf2out_end_function. + + * dwarf2out.c (output_line_info): Emit special opcodes for each line + entry, even if the line number doesn't change. + (pend_type, output_pending_types_for_scope): New fns. + (gen_struct_or_union_type_die): Use them to defer generating member + dies if we're in the middle of some other context. + (gen_type_die): Still put nested types in the right place. + (dwarf2out_decl): Call output_pending_types_for_scope. + + * dwarf2out.c (dw_fde_struct): Replace end_prologue, begin_epilogue + with current_label. + (DWARF_CIE_INSN_SIZE, DWARF_CIE_SIZE): Remove. + (DWARF_CIE_HEADER_SIZE): The size without the initial insns. + (size_of_cfi): Revert. + (decode_cfi_rtl, add_fde_cfi, dwarf2out_def_cfa, reg_save, + dwarf2out_reg_save, dwarf2out_return_save): New fns. + (dwarf2out_begin_function): Use them to generate CFIs. + (dwarf2out_finish): Use them to generate E CFIs. + Don't set next_fde_offset. + (calc_fde_sizes): Initialize cie_size. + (output_call_frame_info): Don't generate CIE CFIs. + (dwarf2out_end_function): Remove. + + * tree.c (maybe_get_identifier): New fn. + * varasm.c (assemble_name): Use it instead of get_identifier. + +Fri Nov 29 15:13:39 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * jump.c (jump_optimize): Don't move initialization if there is a + label between it and the jump for if (foo) bar++ to bar += (foo !=0) + +Wed Nov 27 16:21:14 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * Remove change of Oct 4. + * i386.h (outer_function_chain): Remove. + (current_function_calls_alloca): Remove. + (rtx_equal_function_value_matters): Remove. + (N_REGS_USED, N_ALLOCATABLE_REGISTERS): Remove. + * i386.md (adddi3_1, subdi3_1): Remove. + (adddi3, subdi3): Revert. + (movsf, movsf_mem, movsf_normal, movdf, movdf_mem, movdf_mem+1): + Likewise. + (movxf, movxf_mem, movxf_mem+1, addsidi3_1, addsidi3_2): Likewise. + (adddi3_1, subsidi3, subdi3_1): Likewise. + (addsidi3_1, addsidi3_2, subsidi3): Likewise. + (addsidi3_1, addsidi3_2, adddi3, subsidi3): Disable the problem + reload alternatives. + +Wed Nov 27 16:21:14 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * i386.md (ashldi3_non_const_int, ashrdi3_non_const_int): + Use a hidden branch to handle shifts > 32 bit. + (lshrdi3_non_const_int): Likewise. + (floatdixf2): Don't use unnecessary XFmode operation. + +Wed Nov 27 15:23:41 1996 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (assemble_variable): Don't emit DWARF. + + * toplev.c (rest_of_type_compilation): Don't emit DWARF. + (main): Just let -gdwarf mean DWARF v1; remove -gdwarf-1. + + * dwarfout.c (decl_class_context): New fn. + (output_global_subroutine_die): Fix declaration case. + (output_global_variable_die): Likewise. + (output_type): Note when we are in a class defn. If we're a nested + type and our context hasn't been written, do that. Do early exit + for nested types. + (output_decl): Output the class context for fns and vars. + Don't emit detailed parm info for a fn declaration. + Use TYPE_DECL_IS_STUB, is_redundant_typedef. + (type_ok_for_scope): Support emitting nested types later. + (is_redundant_typedef): New fn. + (TYPE_DECL_IS_STUB): New macro. + (output_compile_unit_die): Check use_gnu_debug_info_extensions. + (output_local_subroutine_die, output_global_subroutine_die, + dwarfout_begin_function, dwarfout_end_function, dwarfout_line, + generate_macinfo_entry, dwarfout_init, dwarfout_finish): Likewise. + + * dwarf2out.c (decl_class_context): Static. + (lookup_type_die): Use TYPE_SYMTAB_POINTER. + (equate_type_number_to_die): Likewise. + (gen_subprogram_die): If we're in class context, it's a decl. + (gen_variable_die): Likewise. + (gen_decl_die): Output the containing type. + (dwarf2out_init): Lose type_die_table code. + +Wed Nov 27 08:30:54 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * Makefile.in (DRIVER_DEFINES): New macro, with the macro + definitions for the driver. + (gcc.o): Make rule use $(DRIVER_DEFINES). + * gcc.c (process_command) [LANG_SPECIFIC_DRIVER]: Call + lang_specific_driver, passing along the addr of FATAL for errors + along with our ARGC and ARGV. + +Wed Nov 27 08:21:13 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.md (iorsi_zexthi_ashl16): New pattern. + (ashrsi_16): New name for old unnamed pattern. + + * objc/misc.c (stdlib.h): Define __USE_FIXED_PROTOTYPES__ before + including stdlib.h. + +Wed Nov 27 08:17:34 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * i386.md (decrement_and_branch_until_zero+[3-8]): Add missing + CC_STATUS_INIT. + (decrement_and_branch_until_zero+[5-8]): Delete redundant assignment. + +Wed Nov 27 07:56:27 1996 J.T. Conklin <jtc@rhino.cygnus.com> + + * m68k.md ({and,ior,xor}si3_internal): Removed !TARGET_5200 from + conditionals now that entire insn is disabled when !TARGET_5200. + +Wed Nov 27 07:52:32 1996 Oliver Kellogg <kellogg@space.otn.dasa.de> + + * 1750a.md (movhi pattern): Fixed MEM to MEM move problem. + +Tue Nov 26 14:50:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (move_by_pieces): Abort only if length positive at end. + * function.c (frame_offset, get_frame_size): Make HOST_WIDE_INT. + * function.h (struct function): Make frame_offset be HOST_WIDE_INT. + (get_frame_size): Add definition. + * reload1.c (reload): Make starting_frame_size be HOST_WIDE_INT. + +Mon Nov 25 16:55:14 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (dwarf2out_finish): Don't emit call frame info + for non-MIPS targets. + (is_redundant_typedef): New fn. + (modified_type_die): Refer to typedef DIEs where appropriate. + (gen_typedef_die): Support DECL_ORIGINAL_TYPE. + (gen_type_die): Likewise. Use is_redundant_typedef. + (gen_subprogram_die): Don't force a spec DIE for local class methods. + +Mon Nov 25 15:09:12 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * gcc.c (handle_braces): Rework last change. + +Mon Nov 25 13:49:51 1996 Jim Wilson <wilson@cygnus.com> + + * configure (build_exeext, exeext): New variables. Use sed to insert + build_exeext value into Makefile exeext rule. + (*-*-cygwin32): Set exeext. + * i386/x-cygwin32 (exeext): Delete. + * rs6000/x-cygwin32 (exeext): Delete. + + * dwarf.h (enum dwarf_location_atom): Add OP_MULT. + * dwarfout.c (output_mem_loc_descriptor, case MULT): Add. + * dwarfout2.c (mem_loc_descriptor, case MULT): Add. + + * dwarfout.c (dwarf_fund_type_name, case FT_unsigned_int64): Fix typo. + +Sun Nov 24 21:42:01 1996 J.T. Conklin <jtc@rhino.cygnus.com> + + * m68k.md (andsi3): Changed into define_expand. + (andsi3_internal): Rename from old andsi3, changed condition + to !TARGET_5200. + (andsi2_5200): New insn. + (iorsi3): Change into define_expand. + (iorsi2_internal): Rename from old iorsi3, changed condition + to !TARGET_5200. + (iorsi2_5200): New insn. + (xorsi3): Change into define_expand. + (xorsi2_internal): Rename from old xorsi3, changed condition + to !TARGET_5200. + (xorsi2_5200): New insn. + +Sun Nov 24 21:31:32 1996 John F. Carr <jfc@mit.edu> + + * i386.h (N_ALLOCATABLE_REGISTERS): Remove extra backslash at + end of macro definition. + + * cpplib.c (LOCAL_INCLUDE_DIR): Remove default definition. + (include_defaults_array): Do not use LOCAL_INCLUDE_DIR or + TOOL_INCLUDE_DIR if they are not defined. + * cccp.c: Likewise. + + * Makefile.in (cppmain.o): New rule. + +Sun Nov 24 19:14:50 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * fold-const.c (merge_ranges): In (+,-) case, if lower bounds are + the same the result is always false. + +Sun Nov 24 18:48:31 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * c-typeck.c (build_indirect_ref): Don't give warning for + dereferencing void * if evaluation is being skipped. + + * c-decl.c (poplevel): Don't call output_inline_function if + DECL_SAVED_INSNS is not set. + + * gcc.c (give_switch): Add new arg, INCLUDE_BLANKS. + (handle_braces): All callers changed. + Add support for new construct: %{S*^}. + +Sun Nov 24 18:44:48 1996 Paul Eggert <eggert@twinsun.com> + + * c-parse.in (unary_expr, expr_no_commas): Increment skip_evaluation + when analyzing an expression that is known not to be evaluated. + (sizeof, alignof): New rules. + * c-tree.h (skip_evaluation): New variable. + * c-common.c (skip_evaluation): Likewise. + (overflow_warning, unsigned_conversion_warning): Don't warn about + potential runtime errors when skipping evaluation. + * c-typeck.c (build_binary_op): Likewise. + (build_conditional_expr): op1 now always nonnull. + +Sun Nov 24 17:06:58 1996 Bernd Schmidt (crux@Pool.Informatik.RWTH-Aachen.DE) + + * toplev.c (rest_of_compilation): Call regscan before each + jump threading pass. + +Sun Nov 24 16:37:18 1996 Dave Love <d.love@dl.ac.uk> + + * configure (objc_thread_file): Set conditionally in each case so + may be overidden with `--enable-objcthreads=posix'. + Change Linux default to `single'. + +Fri Nov 22 17:53:15 1996 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (assemble_variable): Output DWARF in the third case, too. + + * dwarf2out.c (decls_for_scope): Only add DIEs with no parents to + our scope. + (gen_subroutine_type_die): Parm types go under the fn type DIE. + + * Makefile.in ($(T)crt{begin,end}.o): Move CRTSTUFF_T_CFLAGS after + general flags. + + * mips/t-iris6 (CRTSTUFF_T_CFLAGS): Define. + * mips.c (compute_frame_size): Fix fp_save_offset. + + * dwarf2out.c (new_die): If we get a NULL parent, inc limbo_die_count. + (decls_for_scope): Decrement limbo_die_count as appropriate. + (dwarf2out_finish): Check for good limbo_die_count. + (size_of_cfi): If regno too big for DW_CFA_offset, use offset_extended + instead. + (output_call_frame_info): Add disabled code for specifying ABI. + (dwarf2out_begin_function): Note all saved regs. + + * dwarf2out.c (gen_subprogram_die): Have a DIE for each fn at + toplevel. + (scope_die_for): Only use the NULL for fns and tags. + +Tue Nov 21 15:53:51 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * sh.c (output_stack_adjust): New argument TEMP. Changed all callers. + If the adjust cannot be done with one, but can be done with two + CONST_OK_FOR_I constants, do it that way. + +Thu Nov 21 14:25:55 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixincludes: Include <stdio.h> in <assert.h> even if not C++ if + stderr needs to be defined. + +Wed Nov 20 15:38:13 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (rest_of_type_compilation): Do output function-scope tags + for DWARF 2. + * c-decl.c (pushtag): Set TYPE_CONTEXT on the tag. + * toplev.c, varasm.c: s/dwarf2out_file_scope_decl/dwarf2out_decl/g. + * dwarf2out.c (add_prototyped_attribute): Use a value of 1. + (gen_subprogram_die): Support AT_static_link. + (dwarf2out_decl): Rename from dwarf2out_file_scope_decl. + Give nested fns and tags a die_parent of NULL. + (decls_for_scope): Fix the die_parent for nested fns and tags. + (scope_die_for): If we get a context of NULL, just return it. + +Tue Nov 19 18:21:11 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (gen_subprogram_die): Support block extern decls. + (gen_variable_die): Likewise. + (gen_decl_die): Emit block extern function decls. + + * c-decl.c (implicitly_declare): Set DECL_ARTIFICIAL. + +Tue Nov 19 16:50:32 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * configure (powerpc*-{sysv,elf,eabi{,aix,sim}}): Set + extra_headers to ppc-asm.h. + (powerpc*-{linux,solaris,rtems,vxworks}): Ditto. + (powerpc*-{winnt,pe,cygwin32}): Ditto. + + * rs6000/t-{ppc,ppcgas,solaris,winnt} (EXTRA_HEADERS): Don't set + it here. + +Mon Nov 18 14:51:46 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (DWARF_CIE_INSN_SIZE): New macro. + (DWARF_CIE_HEADER_SIZE): Use it. + (DWARF_FRAME_RETURN_COLUMN, DWARF_FRAME_REGNUM): New macros. + (output_call_frame_info, dwarf2out_begin_function): Use them. + For the MIPS, output the first CFA insn in the CIE. + * dwarf2.h (enum dwarf_call_reg_usage): Lose. + (dwarf_macinfo_record_type): Fix spelling. + * mips/mips.h (DWARF_FRAME_REGNUM, DWARF_FRAME_RETURN_COLUMN): Define. + + * dwarf2out.c (base_type_die): Just generate the DIEs as needed, + rather than building up some table. + (init_base_type_table): Lose. + (add_subscript_info): Use add_type_attribute. Don't give an upper + bound for an array of unknown size. + (gen_unspecified_parameters_die): Remove DWARF-1 kludge. + (dwarf2out_init): Lose call to init_base_type_table. + (is_c_family, is_fortran): New fns. + (gen_compile_unit_die): Recognize GNU F77. + (gen_array_type_die): Use AT_declaration for an array of unknown size. + (modified_type_die): Take TYPE_MAIN_VARIANT before passing it + to build_type_variant, so we ignore named variants. + (dwarf2out_file_scope_decl): Don't generate DIEs for built-in structs, + either; they will be emitted if they are used. + From wilson: + (gen_array_type_die): Force the element type out first on IRIX 6. + +Sun Nov 17 20:23:11 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (get_inner_reference): Fix error in previous change. + +Sat Nov 16 06:08:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * emit-rtl.c (operand_subword): Avoid confusion if sizeof (float) + is less than a full word. + + * alpha.h (MASK_BYTE_OPS): Now define as 1024. + * alpha/vms.h (TARGET_DEFAULT): Use symbolic values. + + * expr.c (get_inner_reference): Add new arg PALIGNMENT and compute it. + (expand_assignment, do_jump): Pass new arg to get_inner_reference. + (expand_expr, case COMPONENT_REF): Likewise. + * fold-const.c (optimize_bit_field_compare, decode_field_reference): + Likewise. + * tree.h (get_inner_reference): Add new arg. + + * Add support for Alpha/VMS, mostly from + Klaus Kaempf (kkaempf@progis.de) + * configure (alpha-dec-vms*): New target. + * alpha.c (override_options): Handle VAX format floating-point. + (print_operand, case ',', '-'): New cases. + (alpha_builtin_saveregs): Handle VMS convention. + (alpha_sa_{mask,size}, alpha_pv_save_size, alpha_using_fp): + New versions for VMS. + (output_{pro,epi}logue, function_arg): Likewise. + (direct_return): Never true on VMS. + (check_float_value): Return 0 for VMS. + (vmskrunch, alpha_{need,write}_linkage): New function. + * alpha.h ({MASK,TARGET}_{OPEN_VMS,FLOAT_VAX}): New macros. + (TARGET_SWITCHES): Add float-vax and float-ieee. + ({FUNCTION,LIBCALL}_VALUE, FUNCTION_VALUE_REGNO_P): R1 and R33 + are also return registers. + (ASM_OUTPUT_DOUBLE): Support both floating-point formats. + (PRINT_OPERAND_FUNCT_VALID_P): Add ',' and '-'. + * alpha.md ({div,mod}[sd]i3): Only for VMS. + (fp operations): Add modifiers for multiple floating-point formats. + (call patterns): Handle new calling sequence for VMS. + (tablejump): Make new pattern for VMS. + (nonlocal_goto_receiver, arg_home): New patterns. + * alpha/t-vms, alpha/vms.h, alpha/xm-vms.h: New files. + +Fri Nov 15 17:38:20 1996 Doug Evans <dje@seba.cygnus.com> + + * sdbout.c (current_file): New global. + (PUT_SDB_SRC_FILE): New PUT_SDB_FOO macro. + (sdbout_init): Initialize current_file ifdef MIPS_DEBUGGING_INFO. + (sdbout_{start_new,resume_previous}_source_file): New functions. + * toplev.c (debug_{start,end}_source_file): Call them if SDB_DEBUG. + * mips.h (PUT_SDB_SRC_FILE): Define. + +Fri Nov 15 16:11:25 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarfout.c (dwarfout_line): Don't emit line number info for + functions outside of .text. + +Fri Nov 15 15:52:42 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386/386bsd.h (COMMENT_BEGIN): Delete. + * i386/freebsd.h (COMMENT_BEGIN): Likewise. + * i386/netbsd.h (COMMENT_BEGIN): Likewise. + * i386/unix.h (COMMENT_BEGIN): Likewise. + +Fri Nov 15 13:22:42 1996 Jim Wilson <wilson@cygnus.com> + + * fold-const.c (unextend): Rewrite type conversions to avoid overflow. + +Fri Nov 15 12:11:28 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * combine.c (try_combine): Properly copy an rtvec. + * emit-rtl.c (gen_rtvec_vv): New function. + (copy_rtx_if_shared): Call it. + * integrate.c (copy_for_inline): Likewise. + * reload1.c (eliminate_regs): Likewise. + * rtl.h (gen_rtvec_vv): Declare. + * genattrtab.c (simplify_cond): Make TESTS an array of rtunions. + * genextract.c (main): Use loop, not bcopy, to set recog_operands + from an rtvec. + * rtl.c (rtvec_alloc): Clear rtwint instead of rtvec. + + * machmode.h (HOST_PTR_PRINTF): Handle char * wider than long. + (HOST_WIDE_INT_PRINT_{DEC,UNSIGNED,HEX,DOUBLE_HEX}): New macros. + * final.c (asm_fprintf): Use "ll" prefix for a long long HOST_WIDE_INT. + (output_{asm_insn,addr_const}): Use HOST_WIDE_INT_PRINT_*. + * print-tree.c (print_node{,_brief}, case INTEGER_CST): Likewise. + * print-rtl.c (print_rtx, case 'w'): Use HOST_WIDE_INT_PRINT_DEC. + + * unroll.c (iteration_info): Fix code so that it knows iteration_var + is a HOST_WIDE_INT, not a long. + + * fold-const.c (operand_equal_p): Do real comparison with + REAL_VALUES_EQUAL. + (make_range): Properly decide when to get TREE_TYPE of arg0. + Handle EXP being an INTEGER_CST at end. + (fold_range_test): Handle return of 0 from make_range. + (fold, case TRUTH_AND_EXPR): Handle first arg of 0. + (fold, case TRUTH_OR_EXPR): Handle first arg of 1. + + * c-common.c (decl_attributes, case A_ALIAS): Add missing parens. + +Fri Nov 15 06:37:54 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * fold-const.c (range_binop): Set SNG1 to zero if ARG1 is a + not a lower or upper bound. + +Thu Nov 14 23:08:25 1996 Jason Merrill <jason@yorick.cygnus.com> + + * flags.h (debug_info_type): Add DWARF2_DEBUG. + * toplev.c (main): Support DWARF2_DEBUG. Add -gdwarf-1, -gdwarf-2 + options. Check debug level after choosing type. + (debug_{start,end}_source_file, debug_{define,undef}): New functions. + (compile_file): Support dwarf2 separately from dwarf1. + (rest_of_type_compilation, rest_of_compilation): Likewise. + * final.c (final_start_function): Likewise. + (final_end_function, final_scan_insn, output_source_line): Likewise. + * varasm.c (assemble_variable): Likewise. + * dwarfout.c: Don't check DWARF_VERSION. + * dwarf2out.c: s/dwarfout/dwarf2out/g. Check DWARF2_DEBUGGING_INFO. + * c-lex.c (check_newline): Use debug_* instead of calling *out + functions directly. + * svr4.h (DWARF2_DEBUGGING_INFO): Define. + * mips/iris6.h (PREFERRED_DEBUGGING_TYPE): DWARF2_DEBUG. + (DWARF2_DEBUGGING_INFO): Define instead of DWARF_DEBUGGING_INFO. + (LINK_SPEC): Pass -w through. + * mips.h (PREFERRED_DEBUGGING_TYPE): Don't check `len'. + +Thu Nov 14 17:25:47 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.c (dosize): Don't clobber static chain reg if needed by + current function. + +Wed Nov 13 17:05:19 1996 Jason Merrill <jason@yorick.cygnus.com> + + * Makefile.in (stage?-start): Keep a copy of EXTRA_MULTILIB_PARTS + in the build directory. + +Tue Nov 12 23:17:17 1996 Jeffrey A Law (law@cygnus.com) + + * pa.c (print_operand, case 'Y'): Fix comparisons to handle + NaNs properly in all cases. + +Tue Nov 12 18:47:24 1996 Jim Wilson <wilson@cygnus.com> + + * expr.c (emit_group_store): For REG case, call gen_lowpart if + modes are different. + +Tue Nov 12 18:24:40 1996 Doug Rupp (rupp@gnat.com) + + * gcc.c (exit): If VMS, define as __posix_exit. + (option_map): Add define-macro and undefine-macro. + +Tue Nov 12 17:55:10 1996 Torbjorn Granlund <tege@tege.pdc.kth.se> + + * alpha.c (input_operand): If TARGET_BYTE_OPS accept HImode and QImode. + * alpha.h (MASK_BYTE_OPS): New define. + (TARGET_BYTE_OPS): New define. + (TARGET_SWITCHES): Handle -mbyte. + (LOAD_EXTEND_OP): When MODE is not SImode, return ZERO_EXTEND. + * alpha.md (zero_extendqidi2): Handle TARGET_BYTE_OPS. + (zero_extendhidi2): Likewise. + (zero_extendqisi2): Likewise. + (zero_extendhisi2): Likewise. + (extendqisi2): Use extendqidi2x if TARGET_BYTE_OPS. + (extendqidi2): Likewise. + (extendqidi2x): New pattern. + (extendhisi2): Use extendhidi2x if TARGET_BYTE_OPS. + (extendhidi2): Likewise. + (extendhidi2x): New pattern. + (movhi): Handle TARGET_BYTE_OPS. + (movhi matcher): Output ldwu and stw. + (movqi): Handle TARGET_BYTE_OPS. + (movqi matcher): Output ldbu and stb. + +Tue Nov 12 16:53:37 1996 Rob Savoye <rob@chinadoll.cygnus.com> + + * configure (hppa1.1-pro*, i960-*-coff*,m68k-*-aout*): Add libgloss.h. + (m68k-*-coff*, mips*-*-elf*, sparc*-*-aout*, sparc*-*-coff*): Likewise. + * config/libgloss.h: New file. + +Tue Nov 12 16:21:45 1996 Joern Rennecke <amylaar@cygnus.com> + + * jump.c (jump_optimize): Fix bug in Sep 23 change. + +Tue Nov 12 16:15:31 1996 Andrew Cagney (cagney@tpgi.com.au) + + * global.c (prune_references): Add missing symmetic CONFLICTP call. + +Tue Nov 12 14:34:40 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.c (output_function_{pro,epi}logue): Save and restore + fp-registers only if TARGET_68881. + + * m68k/mot3300.h (ASM_OUTPUT_INTERNAL_LABEL): Prefix labels with "L%". + (ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_CASE_LABEL): Likewise. + (ASM_OUTPUT_ADDR_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Likewise. + + * m68k/mot3300.h (TARGET_DEFAULT): Use MASK_68040_ALSO, not MASK_68040. + * m68k/next.h, m68k/ccur-GAS.h (TARGET_DEFAULT): Likewise. + + * fixproto (std_files): Add sys/socket.h. + + * m68k.md (movqi): Emit 'st' for INTVAL & 255 == 255, not INTVAL == -1. + (seq,sne,sgt,sgtu,slt,sltu,sge,sgeu,sle,sleu): Allow "m" as operand 0. + +Tue Nov 12 14:17:45 1996 Paul Eggert <eggert@twinsun.com> + + * c-decl.c (grokdeclarator): Generate a warning if -Wimplicit, + unless a warning was already generated by -Wreturn-type. + +Tue Nov 12 14:11:02 1996 Pat Rankin <rankin@eql.caltech.edu> + + * Make qsort callback routines conform to the ANSI/ISO standard. + * c-decl.c (field_decl_cmp): Use `const void *' arguments. + * global.c (allocno_compare): Likewise. + * reload1.c (hard_reg_use_compare, compare_spill_regs): Likewise. + (reload_reg_class_lower): Likewise. + * stupid.c (stupid_reg_compare): Likewise. + * local-alloc.c (qty_compare_1, qty_sugg_compare_1): Likewise. + (QTY_CMP_PRI, QTY_CMP_SUGG): New macros. + (qty_compare_1, qty_sugg_compare_1): Use them. + +Tue Nov 12 13:20:25 1996 Jim Wilson <wilson@cygnus.com> + + * fold-const.c (merge_ranges): In (+,-) case, treat subset specially + if lower bounds are the same. + +Tue Nov 12 13:10:01 1996 J.T. Conklin <jtc@cygnus.com> + + * m68k.md (addsi3): If TARGET_5200, use the lea insn to add small + constants to address registers. + (negsi2): Change into define_expand. + (negsi2_internal): Rename from old negsi2, changed condition + to !TARGET_5200. + (negsi2_5200): New insn. + (one_cmplsi2): Change into define_expand. + (one_cmplsi2_internal): Rename from old one_cmplsi2, changed + condition to !TARGET_5200. + (one_cmplsi2_5200): New insn. + (negdi2_5200): Corrected constraints. + (one_cmpldi2): Changed condition to !TARGET_5200. + + * m68k.c (m68k_align_loops_string, m68k_align_jumps_string): New vars. + (m68k_align_funcs_string, m68k_align_loops): Likewise. + (m68k_align_jumps, m68k_align_funcs): Likewise. + (override_options): New function. + * m68k.h (TARGET_OPTIONS): Added alignment options. + (MAX_CODE_ALIGN, ASM_OUTPUT_LOOP_ALIGN, ASM_OUTPUT_ALIGN_CODE): + New macros. + (FUNCTION_BOUNDARY): Use value derrived from m68k_align_funcs + instead of constant. + + * m68k.c (output_function_{pro,epi}logue): Fix typo in last change. + +Tue Nov 12 09:26:51 1996 Torbjorn Granlund <tege@wombat.gnu.ai.mit.edu> + + * i386.md (parallel inc/dec and branch-if-zero/nonzero): Use `+' in + constraint. + +Mon Nov 11 15:12:22 1996 Jason Merrill <jason@yorick.cygnus.com> + + * libgcc2.c: Also define WEAK_ALIAS if ASM_OUTPUT_WEAK_ALIAS. + * mips/iris6.h (ASM_OUTPUT_WEAK_ALIAS): Define. + * varasm.c (assemble_alias): Use ASM_OUTPUT_WEAK_ALIAS. + + * dwarf2out.c (TYPE_USED_FOR_FUNCTION): Lose. + (gen_compile_unit_die): Only append -g with -g2 or better. + (scope_die_for): Don't emit any type info with -g1. + (gen_subprogram_die): Likewise. + (gen_decl_die): Likewise. + (dwarfout_file_scope_decl): Likewise. + (dwarfout_init): Likewise. + + * mips/iris6.h (TYPE_ASM_OP): Define. + (SIZE_ASM_OP): Define. + (ASM_WEAKEN_LABEL): Define. + (BSS_SECTION_ASM_OP): Define. + (ASM_OUTPUT_ALIGNED_LOCAL): Don't use ASM_DECLARE_OBJECT_NAME. + (ASM_OUTPUT_ALIGNED_BSS): Define. + (ASM_DECLARE_OBJECT_NAME): Redefine to emit .size directive. + (ASM_FINISH_DECLARE_OBJECT): Define. + (ASM_OUTPUT_DEF): Don't define. + +Fri Nov 8 20:38:51 1996 Jim Wilson <wilson@cygnus.com> + + * function.c (expand_function_end): Handle BLKmode structures returned + in registers. + +Fri Nov 8 20:27:07 1996 Jason Merrill <jason@yorick.cygnus.com> + + * stor-layout.c (layout_record): Check for VAR_DECL instead + of TREE_STATIC. + + * varasm.c (assemble_variable): Do write out DWARF for + record-scope variables. + * toplev.c (rest_of_type_compilation): Do write out DWARF for + record-scope types. + + * dwarf2out.c (gen_enumeration_type_die): Set TREE_ASM_WRITTEN on a + complete enum type. + (gen_struct_or_union_type_die): Don't recurse between nested classes. + (gen_type_die): Write out nested classes by writing out their context. + +Fri Nov 8 17:40:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * emit-rtl.c (change_address): If MEMREF isn't changing, + return the old one. + + * expr.c (expand_assignment): Remove bogus resetting of alignment + to inner alignment. + (expand_expr, case COMPONENT_REF): Likewise. + +Fri Nov 8 16:31:31 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * reg-stack.c (compare_for_stack_reg, subst_stack_regs_pat): + Add support for float conditional move. + +Thu Nov 7 07:46:07 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * stor-layout.c (layout_record): Treat constant size as variable if + it overflows. + * fold-const.c (const_binop, case *_DIV_EXPR): Don't do special + sizetype case if a constant overflows. + (size_binop): Use integer_{zero,one}p instead of explicit test. + * tree.c (integer_{zero,one,all_ones,pow2}p, real_{zero,one,two}p): + Return 0 if TREE_CONSTANT_OVERFLOW. + +Wed Nov 6 17:53:33 1996 Torbjorn Granlund <tege@wombat.gnu.ai.mit.edu> + + * i386.md (parallel inc and branch-if-zero/nonzero): Add two + new pattern variants. Change incrementing pattern to use incl/jnz. + +Wed Nov 6 09:46:10 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (override_options): Set defaults for -march and -mcpu. + (output_float_compare): Use cc_status.flags to mark if this + comparison can be done with fcomi. + (output_fp_cc0_set): A conditional move may be in a PARALLEL. + + * i386.h (CC_FCOMI): Define + + * i386.md (sgt,sgtu,sge,sle,bgt,blt,bge,ble): Use CC_FCOMI + (movsicc_1,movhicc_1): Use correct size suffix. + (movsfcc_1,movdfcc_1): Cleanup default move case. + +Wed Nov 6 09:46:10 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * i386.h (HARD_REGNO_MODE_OK): If long double isn't XFmode, can't + allow XFmode. + +Tue Nov 5 22:49:56 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.md (define_split for and_shl_scratch): + Use rtx_equal_p on the operands to find out which alternative is used. + * sh.c (gen_shl_and): Try to generate shorter constant for and. + +Mon Nov 4 19:13:52 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c: Clean up unused variables. + Use ASM_{GENERATE,OUTPUT}_INTERNAL_LABEL, shorten label names. + (loc_descriptor): Use reg_loc_descriptor. + (TYPE_DECL_IS_STUB): New macro. + (gen_decl_die): Use it. + (dwarfout_file_scope_decl): Use it. + +Mon Nov 4 10:23:46 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * ginclude/va-ppc.h (__va_regsave_t,va_start,va_end): Wrap macro + and structures inside #ifndef __VA_PPC_H__ to allow reinclusion. + + * rs6000/rs6000.h (LEGITIMATE_SMALL_DATA_P): Don't allow -fpic or + TARGET_TOC. + (LEGITIMATE_LO_SUM_ADDRESS_P): Ditto. + (LEGITIMIZE_ADDRESS): Ditto. + + * rs6000/rs6000.md (movsi): Don't call elf_{high,low} if -fpic. + + * rs6000/cygwin32.h (STARTFILE_SPEC): Eliminate empty %{}. + +Sun Nov 3 15:56:35 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (TARGET_TOC): Plain -fpic does not require a TOC. + ({MINIMAL_TOC,CONST}_SECTION_ASM_OP): -fpic should be treated like + -mrelocatable in these cases. + (ASM_OUTPUT_INT): Ditto. + (ASM_OUTPUT_SECTION_NAME): Ditto. + (ASM_OUTPUT_ALIGNED_LOCAL): Use sdata_section, not sbss_section. + +Fri Nov 1 19:57:13 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (based_loc_descr): Use DBX_REGISTER_NUMBER. The + "frame base" is just the frame or stack reg without an offset. + (gen_subprogram_die): Likewise. + (dwarfout_begin_function): Use DBX_REGISTER_NUMBER. + +Fri Nov 1 09:50:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * fold-const.c (make_range): Don't merge unsigned case with range + containing upper bound; instead merge just with zero and convert + a range with no upper bound to opposite one with no lower bound. + (merge_ranges): In (+,-) case, don't treat subset specially if + the upper bounds are the same; fix typo in others case here. + +Thu Oct 31 20:12:13 1996 Jeffrey A Law (law@cygnus.com) + + * fold-const.c (make_range, case PLUS_EXPR): Correct + normalization of an unsigned range that wraps around zero. + +Thu Oct 31 21:06:37 1996 Jason Merrill <jason@yorick.cygnus.com> + + * mips/t-iris6 (EXTRA_MULTILIB_PARTS): Define. + (EXTRA_PARTS): Don't define. + + * dwarf2out.c (gen_struct_or_union_type_die): Use AT_specification + for nested types defined outside their containing class. Lose + is_complete. + (gen_enumeration_type_die): Lose is_complete. + (gen_type_die): Lose is_complete. + (add_name_and_src_coords_attributes): Tweak. + (gen_subroutine_type_die): Use scope_die_for. + (gen_ptr_to_mbr_type_die): Likewise. + (gen_subprogram_die): Support AT_artificial. + (gen_variable_die): Likewise. + (dwarfout_file_scope_decl): Lose finalizing. + +Thu Oct 31 18:43:18 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * pa.c (emit_move_sequence): Refine previous change. + +Thu Oct 31 13:25:32 1996 Jim Wilson <wilson@cygnus.com> + + * crtstuff.c: Put HAS_INIT_SECTION ifdefs around Irix6 support. + + * tree.c (decl_function_context): Handle QUAL_UNION_TYPE. + + * calls.c (expand_call): Disable special handling for const calls + that return a PARALLEL rtx. + * expr.c (expand_expr, case CONSTRUCTOR): Don't use a PARALLEL + target. + +Thu Oct 31 11:45:00 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/t-{ppcgas,ppc,solaris} (EXTRA_MULTILIB_PARTS): Add + {e,s}crt{i,n,0}.o. + ({stmp,install}-crt): Delete, no longer used. + ({,INSTALL_}LIBGCC): Remove {stmp,install}-crt rule. + +Thu Oct 31 02:49:58 1996 Torbjorn Granlund <tege@nada.kth.se> + + * i386.md (parallel inc and branch-if-zero/nonzero): + Check for -1, not zero. + +Wed Oct 30 15:50:49 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * fold-const.c (range_binop): Strip NOPs from result and + verify it's an INTEGER_CST. + (make_range, case BIT_NOT_EXPR): Fix typo in constant for PLUS_EXPR. + + * stor-layout.c (layout_record): Use HOST_WIDE_INT for size. + + * stmt.c (expand_asm_operands): Disallow matching constraints + on output and validate the numbers on inputs. + +Tue Oct 29 16:21:59 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * gcc.c (process_command,main): Process -specs=file and -specs + file after reading the main specs file to allow the user to + override the default. + (DEFAULT_WORD_SWITCH_TAKES_ARG): Add specs to list. + (option_map): Ditto. + +Tue Oct 29 15:49:18 1996 Jason Merrill <jason@yorick.cygnus.com> + + * Makefile.in (stmp-multilib): Pass $flags to s-m-sub in + MULTILIB_CFLAGS. + (stmp-multilib-sub): Build EXTRA_MULTILIB_PARTS. + ($(T)crt*.o): Add $(T), lose stamp-crt rule, use MULTILIB_CFLAGS. + (install-multilib): Install EXTRA_MULTILIB_PARTS. + +Mon Oct 28 20:09:39 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.md (shl_sext_ext): Don't accept simple left/right shift + variant. + * sh.c (EXT_SHIFT_SIGNED): New macro. + (shl_sext_kind, gen_shl_sext): try left shift - sign extend - + left shift - arithmetic right shift in case 2. + +Mon Oct 28 14:55:42 1996 Jim Wilson <wilson@cygnus.com> + + * configure (sh-*-*): Set float_format to sh. + * config/float-sh.h: New file. + +Mon Oct 28 14:26:08 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips/mips.h (RTX_COSTS): Add cases for SIGN_EXTEND and + ZERO_EXTEND. + + * m68k/lb1sf68.asm: Change # to IMM in udivsi3 __mcf5200__. + + * combine.c (simplify_rtx): Add some optimizations for TRUNCATE. + (expand_compound_operation): Add some optimizations for + ZERO_EXTEND. + +Mon Oct 28 14:11:20 1996 Gavin Koch <gavin@cygnus.com> + + * varasm.c (make_decl_rtl,assemble_variable): + Allow named sections for uninitialized variables. + +Mon Oct 28 13:08:51 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * pa.c (emit_move_sequence): If reload in progress, replace + reference to pseudo with reference to corresponding MEM. + + * c-typeck.c ({un,}signed_type): If can't do anything, call + signed_or_unsigned_type. + (signed_or_unsigned_type): If already right signedness, return. + +Mon Oct 28 13:05:26 1996 Stephen Williams (steve@icarus.com) + + * i960.h: Add specification for -Jx types. + * i960/t-960bare: Include multilib support for Jx types. + +Mon Oct 28 10:06:00 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/t-{ppc{,gas},solaris} (install-crt): Depend on + installdirs, not install-dir. + + * rs6000/sysv4.h (TARGET_TOC): -fpic does not use a TOC area. + +Mon Oct 28 09:07:42 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * reload1.c (delete_output_reload): Don't use delete_insn + when deleting all stores into a replaced pseudo. + + * sh.md (movsf_ieq, movsf_ie): Merged the former into the latter. + Changed matching define_split appropriately. + (movsf): Changed appropriately. + (reload_insf) Define. + * sh.h (SECONDARY_INPUT_RELOAD_CLASS): Define. + +Mon Oct 28 08:38:23 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * dsp16xx.h (ASM_OUTPUT_BYTE): adjust definition to actual type of + VALUE, which is HOST_WIDE_INT. + +Mon Oct 28 07:36:07 1996 Ulrich Drepper <drepper@cygnus.com> + + * ginclude/stddef.h: Make sure file is processed if some of the + known __need_* macros is defined. + +Sun Oct 27 21:37:59 1996 J.T. Conklin <jtc@cygnus.com> + + * m68k.c (output_function_prologue): Adjust SP then use movmel with + plain address indirect mode for TARGET_5200. + (output_function_epilogue): Disable moveml and use several movel's + instead for TARGET_5200. + (output_function_{pro,epi}logue): Use lea instruction to adjust + stack pointer for short displacements for TARGET_5200. + +Sun Oct 27 15:27:45 1996 Jeffrey A Law (law@cygnus.com) + + * fold-const.c (merge_ranges): Fix thinko/typo. + +Sat Oct 26 22:07:04 1996 Ian Lance Taylor <ian@cygnus.com> + + * expr.c (convert_modes): Before returning a const_double for a + large unsigned value, zero extend an integer value if necessary. + +Sat Oct 26 15:24:55 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k/x-mot3300 (XCFLAGS): Disable native assembler's jump + optimization for expr.o and cp/decl.o. + +Sat Oct 26 14:04:09 1996 Ben Harris <bjh21@cam.ac.uk> + + * m68k.c (output_function_prologue): Add REGISTER_PREFIX to stack + probe instruction. + +Sat Oct 26 13:59:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * explow.c (allocate_dynamic_stack_space): Delete reference to + nonexistant macro ALLOCATE_OUTGOING_ARGS. + + * next.h (CPP_PREDEFINES): Add -D_NEXT_SOURCE. + +Sat Oct 26 13:50:49 1996 Mark Mitchell (mitchell@centerline.com) + + * configure (i486-ncr-sysv4*): Use i386/sysv4gdb if stabs and gas. + +Sat Oct 26 12:20:35 1996 John F. Carr <jfc@mit.edu> + + * configure: Support --with-cpu=* for SPARC. Or target default + values instead of adding them. + * sparc.c (cpu_default): Add entries for v8 and supersparc. + * sparc.h: Define TARGET_CPU values for v8 and supersparc. + +Sat Oct 26 11:38:01 1996 Kamil Iskra <iskra@student.uci.agh.edu.pl> + + * collect2.c (dump_file): Call fclose() for opened files. + +Sat Oct 26 11:29:29 1996 J"orn Rennecke (amylaar@cygnus.co.uk) + + * jump.c (jump_optimize): Fix second error in last change. + + * svr3.h: Fix typo which makes comment text be non-comment. + +Fri Oct 25 16:18:39 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/t-winnt (LIBGCC1): Don't build libgcc1. + (EXTRA_PARTS): Build crti.o, crtn.o. + (stmp-crt): Remove old multilib support. + +Thu Oct 24 15:09:14 1996 Jim Wilson <wilson@cygnus.com> + + * fold-const.c (make_range, case PLUS_EXPR): Normalize an unsigned + range that wraps around 0. + +Thu Oct 24 14:37:17 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.md: Change predicates for 64 bit arithmetic operations + so that they accept sign extended registers as operands. + (extendsidi2): Accept hi or lo as input. + * mips.c (movdi_operand, se_register_operand, + se_reg_or_0_operand, se_uns_arith_operand, se_arith_operand, + se_nonmemory_operand, se_nonimmediate_operand): New functions. + (mips_move_2words): Handle a SIGN_EXTEND source. + (print_operand): Handle a SIGN_EXTEND operand. + (mips_secondary_reload_class): Handle a SIGN_EXTEND rtx. + * mips.h: Declare new mips.c functions. + (PREDICATE_CODES): Add new functions. + +Thu Oct 24 07:41:14 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * fold-const.c (make_range, comparison cases): When making range + for unsigned to merge in, use full range. + + * stor-layout.c (GET_MODE_ALIGNMENT): Delete definition; duplicate. + +Thu Oct 24 07:28:53 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * reload1.c (emit_reload_insns): Check for second_reloadreg + in SECONDARY_OUTPUT_RELOAD_CLASS / PRESERVE_DEATH_INFO_REGNO_P case. + +Wed Oct 23 14:27:43 1996 Mike Stump <mrs@cygnus.com> + + * crtstuff.c (__do_global_dtors_aux): Allow finalization code to + be run more than once. + * libgcc2.c (__do_global_dtors): Ditto. + +Wed Oct 23 20:42:23 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * sh.c (dump_table): handle SFmode and DFmode. + (broken_move): handle simple PARALLEL. + (machine_dependent_reorg, pc-relative move generation): Likewise. + * sh.h (CONST_DOUBLE_OK_FOR_LETTER_P): always true for 'F' . + (LEGITIMATE_CONSTANT_P): accept SFmode and DFmode. + * sh.md (movdf_k, movsf_i, movsf_ie): new alternative for + pc-relative load. + (movsf_ieq): new define_insn with matching define_split. + (movsf): use it where appropriate. + (consttable_sf, consttable_df): new define_insns. + +Wed Oct 23 17:48:32 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * svr4.h (MAKE_DECL_ONE_ONLY): Fix typo in use of macro parameter. + +Wed Oct 23 17:46:13 1996 Pat Rankin <rankin@eql.caltech.edu> + + * cexp.y (yylex): Cast string literal to U_CHAR* for lookup() call. + +Wed Oct 23 14:50:04 1996 Jason Merrill <jason@yorick.cygnus.com> + + * stmt.c (expand_return): Expand cleanups. Make sure we get a + pseudo-reg and provide a target in the non-BLKmode case. Get return + type of fn properly. + +Wed Oct 23 14:16:06 1996 Ian Lance Taylor <ian@cygnus.com> + + * reload.c (find_reloads): Handle any unary operator. + * recog.c (constrain_operands): Likewise. + + * mips.md: Remove extendsidi2 define_expand. + Rename extendsidi2_internal define_insn to extendsidi2, and add a + register to register case. + +Wed Oct 23 14:08:31 1996 Jim Wilson <wilson@cygnus.com> + + * a29k.c (a29k_makes_calls): New global variable. + (compute_regstack_size, a29k_compute_reg_names): New functions. + (output_prolog): Much code moved to two new functions. Use + a29k_makes_calls instead of makes_calls. + * a29k.h (ASM_DECLARE_FUNCTION_NAME): Call a29k_compute_reg_names. + + * calls.c (expand_call): In target code, move PARALLEL case above + target != case. + + * mips.c (block_move_load_store, block_move_sequence): Delete. + (block_move_loop): New parameter orig_dest. Call change_address to + create new MEM instead of gen_rtx. + (expand_block_move): New local orig_dest. Pass it to block_move_loop. + Call change_address to create new MEM instead of gen_rtx. + +Wed Oct 23 10:30:32 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * loop.c (combine_givs): When combining a DEST_REG giv with its + only use, always set the benefit of the combined giv to that of + the DEST_REG giv. + + * emit-rtl (gen_lowpart_common): When converting a floating + point value into an integer, use WORD as (first) word. + + * combine.c (can_combine_p): When SMALL_REGISTER_CLASSES is defined, + avoid substituting a return register into I3. + + * optabs.c (emit_libcall_block): Before adding an REG_EQUAL note, + check that it will really apply to a single instruction. + (expand_binop, expand_fix): Likewise. + +Wed Oct 23 10:20:52 1996 Stephen L Moshier (moshier@world.std.com) + + * real.c (exact_real_inverse): New function, if REAL_ARITHMETIC. + * fold-const.c (exact_real_inverse): Likewise, if no REAL_ARITHMETIC. + (fold, case RDIV_EXPR): Turn divide by constant into multiplication + by the reciprocal, if optimizing and result is exact. + * real.h (exact_real_inverse): Declare. + +Wed Oct 23 00:12:52 1996 Torbjorn Granlund <tege@nada.kth.se> + + * expr.h (emit_store_flag_force): Declare. + +Tue Oct 22 18:32:20 1996 Jim Wilson <wilson@cygnus.com> + + * unroll.c (unroll_loop): Always reject loops with unbalanced blocks. + +Tue Oct 22 18:27:06 1996 Ian Lance Taylor <ian@cygnus.com> + + * config/fp-bit.c (float_to_usi): Correct thinko: avoid a negative + shift. + (df_to_sf): Remember any discarded nonzero bits in the low order + guard bit. + + * ginclude/va-mips.h: Add support for -mips1 and -msoft-float when + using -mabi=eabi. + * mips/abi64.h (SETUP_INCOMING_VARARGS): When MIPS EABI, handle + TARGET_SINGLE_FLOAT or ! TARGET_FLOAT64 correctly when saving + floating point registers to the stack. + * mips/mips.c (mips_function_value): If TARGET_SINGLE_FLOAT, use + GP_RETURN for floating point types larger than 4 bytes. + +Tue Oct 22 09:43:49 1996 Geoffrey Noer <noer@cygnus.com> + + * rs6000/cygwin32.h (LIB_SPEC): Add -lkernel32 all of the time, + and {user,gdi,comdlg}32 if -mwindows. + +Tue Oct 22 05:24:05 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (scope_die_for): Don't skip lexical blocks. + (gen_lexical_block_die): Call push_decl_scope. + (gen_subprogram_die): Never refer to the function symbol. + (dwarfout_begin_prologue): Likewise. + +Mon Oct 21 20:22:49 1996 Torbjorn Granlund <tege@nada.kth.se> + + * expmed.c (emit_store_flag_force): New function. + * optabs.c (expand_binop): Use it. + + * expr.c (do_store_flag): Don't check if target is 0 in code + emitting store flag as compare-branch. + +Mon Oct 21 17:58:33 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.c (override_options): Correct typo (MASK_64BIT should + have been TARGET_64BIT). + +Mon Oct 21 13:58:54 1996 Jim Wilson <wilson@cygnus.com> + + * unroll.c (loop_comparison_code): New static variable. + (unroll_loop): Add check for loop_comparison_code + (loop_iterations): Set loop_comparison_code. + + * sh.c (gen_shl_sext): Add missing parameter to shl_sext_kind call. + + * mips.h (INITIAL_FRAME_POINTER_OFFSET): Delete. + + * loop.c (strength_reduce): Add check for ! bl->reversed to + auto_inc_opt code. + +Mon Oct 21 12:28:15 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + jump.c (jump_optimize): Fix bug in Oct. 14 change. + +Mon Oct 21 07:59:16 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (store_expr): Disable optimization of using convert + if exp's type is a subtype. + + * c-typeck.c (build_array_ref): If -Wchar-subscripts, also warn + in case when pointer is being indexed. + +Mon Oct 21 07:39:31 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * jump.c (jump_optimize): Use emit_store_flag even if branches + are cheap, if the store is even cheaper. + +Sun Oct 20 20:01:09 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * reload1.c (reload_reg_free_p, reloads_conflict): RELOAD_OTHER + and RELOAD_FOR_OTHER_ADDRESS conflict. + + * i386.md (ffs[sh]i2): Add missing CC_STATUS_INIT. + +Fri Oct 18 13:32:13 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (float conversion insns): Generate correct code + if the bit 15 of rs6000_fpmem_offset is non-zero. + +Thu Oct 17 23:22:03 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarfout.c (data_member_location_attribute): Support binfos. + (output_inheritance_die): New fn. + (output_type): Use it. + + * dwarf2out.c (value_format): Split out from... + (output_value_format): Here. + (build_abbrev_table): Use value_format. + (size_of_locs): New fn. + (size_of_die): Don't assume a loc needs a 2-byte length. + (value_format): Likewise. + (output_die): Likewise. + +Thu Oct 17 14:46:14 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.c (override_options): In 64 bit EABI mode, set TARGET_LONG64. + +Thu Oct 17 11:34:51 1996 Bob Manson <manson@cygnus.com> + + * expr.c (do_jump): Conditionalize cleanups for the COND_EXPR case, + similarly to the way TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR are + handled. + +Thu Oct 17 01:20:16 1996 Jim Wilson <wilson@cygnus.com> + + * m68k.h (MASK_68040_ALSO): New macro. + (TARGET_SWITCHES): Option -m68020-40 includes MASK_68040_ALSO. + +Wed Oct 16 16:25:38 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (scope_die_for): Also support decls, add asserts. + (modified_type_die): Modified types all go under comp_unit_die. + (add_type_attribute): Just pass context_die through. + (various): Revert useless lookup_type_die change. + (gen_subprogram_die): Use scope_die_for. Call push_decl_scope. + (gen_inlined_subroutine_die): Call push_decl_scope. + (gen_struct_or_union_type_die): Likewise. + (gen_decl_die): Don't call push_decl_scope. + + * mips/iris6.h (*_SPEC): Replace enumeration of !mabi= with !mabi*. + (ASM_OUTPUT_{CON,DE}STRUCTOR): Enable. + (STARTFILE_SPEC): Support -mips4, -shared. + (ENDFILE_SPEC): Likewise. + (LIB_SPEC): Support -shared, avoid warning 84. + (LIBGCC_SPEC): Define. + (LINK_SPEC): Support -shared, remove -woff 84. + * mips/t-iris6 (EXTRA_PARTS): Add crtstuff. + * crtstuff.c: Support Irix 6. + * configure: Don't use collect2 for Irix 6. + * libgcc2.c (__main): Don't use any of this stuff if HAS_INIT_SECTION. + +Wed Oct 16 11:46:37 1996 Mike Stump <mrs@cygnus.com> + + * elxsi.h (CHECK_FLOAT_VALUE): Removed. + +Wed Oct 16 14:19:38 1996 Jim Wilson <wilson@cygnus.com> + + * iris6.h (CPP_PREDEFINES): Add -D_LONGLONG. + (CPP_SPECS): Remove -D_LONGLONG. + +Wed Oct 16 03:34:42 1996 Torbjorn Granlund <tege@nada.kth.se> + + * i386.md (parallel inc/dec and branch-if-zero/nonzero): New patterns. + +Tue Oct 15 22:28:11 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.h (enum mips_abi_type): Add ABI_EABI. + (CPP_SPEC): Define __mips_soft_float if -msoft-float, and + __mips_eabi if -mabi=eabi. + (INITIAL_ELIMINATION_OFFSET, CUMULATIVE_ARGS, + GO_IF_LEGITIMATE_ADDRESS, CONSTANT_ADDRESS_P, LEGITIMATE_CONSTANT, + LEGITIMIZE_ADDRESS): Add support for MIPS EABI. + * mips/abi64.h (STACK_BOUNDARY, MIPS_STACK_ALIGN, + FUNCTION_ARG_PADDING, RETURN_IN_MEMORY, SETUP_INCOMING_VARARGS): + Add support for MIPS EABI. + (FUNCTION_ARG_PASS_BY_REFERENCE): Define. + (FUNCTION_ARG_CALLEE_COPIES): Define. + * mips.c (mips_const_double_ok, function_arg_advance, + function_arg, function_arg_partial_nregs, override_options, + compute_frame_size): Add support for MIPS EABI. + (function_arg_pass_by_reference): New function. + * ginclude/va-mips.h: Add support for MIPS EABI. + +Tue Oct 15 19:10:08 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (rest_of_type_compilation): Don't write out + DWARF for function-scope types yet. + (compile_file): Do send vars with no RTL to the DWARF code. + +Tue Oct 15 17:54:43 1996 Doug Evans <dje@cygnus.com> + + * loop.c (strength_reduce): Avoid taking PATTERN of a label. + +Tue Oct 15 16:52:33 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips/iris6.h: (SUBTARGET_CPP_SIZE_SPEC): Define. + (SUBTARGET_CPP_SPEC): Remove definitions of __SIZE_TYPE__ and + __PTRDIFF_TYPE__, now in SUBTARGET_CPP_SIZE_SPEC. + +Tue Oct 15 11:19:17 1996 Lee Iverson <leei@Canada.AI.SRI.COM> + + * mips.h (CPP_SPEC): Restore -D_LANGUAGE_C for Objective C. + +Mon Oct 14 18:03:35 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (gen_decl_die): Do generate dies for classes with -g1. + (dwarfout_file_scope_decl): Likewise. + +Mon Oct 14 16:31:44 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * jump.c (jump_optimize): Check for if (...) { x = a; goto l; } x = b; + +Mon Oct 14 14:19:49 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (modified_type_die): Don't bother with AT_address_class. + (add_data_member_location_attribute): Handle getting a binfo. + (add_location_or_const_value_attribute): Handle a decl with no RTL. + (add_pure_or_virtual_attribute): Add AT_vtable_elem_location. + (add_name_and_src_coords_attributes): Only use DECL_ASSEMBLER_NAME + for staticp things. + (gen_subprogram_die): Set up AT_inline for abstract decls. + (gen_inheritance_die): New fn. + (gen_member_die): Also emit info for base classes. + +Sat Oct 12 00:07:00 1996 Doug Evans <dje@cygnus.com> + + * fold-const.c (make_range): Handle NULL operand 0 + (like in BIND_EXPRs). + +Fri Oct 11 15:42:22 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (rest_of_compilation): If we did a + save_for_inline_copying, reset DECL_ABSTRACT_ORIGIN for the + function when we're done. + + * toplev.c (main): DWARF works with C++ now. + + * dwarf2out.c (gen_subprogram_die): Disable MIPS_AT_has_inline + support for now. + +Fri Oct 11 14:31:10 1996 Torbjorn Granlund <tege@nada.kth.se> + + * dwarfout.c: (output_bound_representation): Fix typo in prototype. + +Fri Oct 11 12:19:21 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.h (MIPS_AS_ASM_SPEC): Define. + (SUBARGET_MIPS_AS_ASM_SPEC): Define. + (GAS_ASM_SPEC): Define. + (TARGET_ASM_SPEC): Define. + (SUBTARGET_ASM_OPTIMIZING_SPEC): Define. + (SUBTARGET_ASM_DEBUGGING_SPEC): Define. + (SUBTARGET_ASM_SPEC): Define. + (ASM_SPEC): Rewrite to use above specs. + (SUBTARGET_CPP_SIZE_SPEC): Define. + (SUBTARGET_CPP_SPEC): Define. + (CPP_SPEC): Use above specs. Don't define _LANGUAGE_C if C++ or + Objective C. + (EXTRA_SPECS): Define. + (SUBTARGET_EXTRA_SPECS): Define. + * mips/dec-bsd.h (ASM_SPEC): Don't define. + (CPP_SPEC): Don't define. + * mips/dec-osf1.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SIZE_SPEC): Define. + * mips/elf64.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SPEC): Define. + * mips/gnu.h (TARGET_DEFAULT): Define. + (ASM_SPEC): Don't define. + * mips/iris3.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SPEC): Define. + * mips/iris4loser.h (ASM_SPEC): Don't define. + (SUBTARGET_MIPS_AS_ASM_SPEC): Define. + (SUBTARGET_ASM_OPTIMIZING_SPEC): Define. + * mips/iris5.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SPEC): Define. + * mips/iris6.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SPEC): Define. + (ASM_SPEC): Don't define. + (SUBTARGET_ASM_SPEC): Define. + (SUBARGET_MIPS_AS_ASM_SPEC): Define. + (SUBTARGET_ASM_DEBUGGING_SPEC): Define. + * mips/netbsd.h (ASM_SPEC): Don't define. + (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SPEC): Define. + * mips/osfrose.h (ASM_SPEC, ASM_FINAL_SPEC): Don't define. + (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SIZE_SPEC): Define. + (SUBTARGET_CPP_SPEC): Define. + * mips/sni-svr4.h (CPP_SPEC): Don't define. + (SUBTARGET_CPP_SIZE_SPEC): Define. + +Thu Oct 10 17:58:49 1996 Jason Merrill <jason@yorick.cygnus.com> + + * mips/iris6.h (ASM_OUTPUT_SECTION_NAME): Define. + (DWARF_OFFSET_SIZE): Define. + + * dwarf2out.c (most everywhere): Support SGI/MIPS -mabi=64 by fixing + code which assumed that pointers are 4 bytes long, parameterizing + many sizes on DWARF_OFFSET_SIZE and using DELTA instead of DELTA4, + DATA instead of DATA4, FORM_ref instead of FORM_ref4. (DWARF_ROUND, + UNALIGNED_DOUBLE_INT_ASM_OP, UNALIGNED_WORD_ASM_OP, + ASM_OUTPUT_DWARF_DELTA, ASM_OUTPUT_DWARF_DATA, DW_FORM_data, + DW_FORM_ref): New macros. + (gen_variable_die): Only equate_decl_number_to_die if + decl is TREE_STATIC. + (get_AT): Fix thinko. + + * dwarf2out.c (constant_size): New fn. + (size_of_die): Use it instead of assuming 4 bytes; + usually we only need one. + (output_value_format, output_die): Likewise. + (build_abbrev_table): We need a new abbrev if the size + of the constant differs. + (dwarf_attr_name): Add new SGI/MIPS extensions. + (gen_subprogram_die): Support DW_AT_MIPS_has_inlines. + (gen_inlined_subroutine_die): Likewise. + +Thu Oct 10 16:38:58 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.md (mov[sd]fcc): Use register_operand, not reg_or_0_operand, + for source predicates. + +Thu Oct 10 15:19:38 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (floatsidf2_load): For large stack frames, do not + generate an illegal memory reference. + (movdi, movdf define_splits): Fix code so that it works for either + big or little endian hosts generating code for either big or + little endian targets. + + (from Jim Wilson) + * rs6000.c (rs6000_save_toc_p): Delete global variable. + (rs6000_{save,restore}_machine_status): Do not save/restore it. + (rs6000_init_expanders): Do not initialize it. + (rs6000_stack_info): Always create TOC save space. + + * rs6000.md (NT indirect call insns): Do not set + rs6000_save_toc_p. + + * rs6000.h (rs6000_save_toc_p): Delete declaration. + +Wed Oct 9 18:06:54 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips.h (EMPTY_FIELD_BOUNDARY): Define as 32. + * mips/abi64.h (EMPTY_FIELD_BOUNDARY): Don't define. + + * mips/abi64.h (TARGET_DEFAULT, TARGET_LONG64, CPP_PREDEFINES, + CPP_SPEC): Move from here... + * mips/iris6.h: ...to here. + +Wed Oct 9 16:43:51 1996 Jim Wilson <wilson@cygnus.com> + + * configure (i[3456]86-dg-dgux): Use install-headers-cpio. + + * expr.c (store_constructor): Delete unnecessary increment. + +Wed Oct 9 16:29:22 1996 Gavin Koch <gavin@cetus.cygnus.com> + + * cccp.c (do_include): Treat ENOTDIR like ENOENT when an open fails. + +Wed Oct 9 16:26:57 1996 Paul Eggert <eggert@twinsun.com> + + * gcc.c (default_compilers): -ansi no longer implies -$ to cpp. + * c-lex.c (yylex): Treat `$' just like `_', except issue a + diagnostic if !dollars_in_ident or if pedantic. + * c-decl.c (dollars_in_ident): DOLLARS_IN_IDENTIFIERS is now Boolean. + (c_decode_option): -fdollars-in-identifiers is now independent + of -ansi, of -traditional, and of DOLLARS_IN_IDENTIFIERS. + * cexp.y (initialize_random_junk): Ignore DOLLARS_IN_IDENTIFIERS. + * cccp.c (dollars_in_ident): Remove; replaced by is_idchar['$']. + (main): Initialize is_idchar and is_idstart directly when given -$. + Ignore DOLLARS_IN_IDENTIFIERS. + (rescan): Diagnose $ in identifier if pedantic. + (initialize_char_syntax): Assume $ is allowed in identifier; + `main' will change this if -$ is given. + * cpplib.h (DOLLARS_IN_IDENTIFIERS): Remove. + * cpplib.c (cpp_options_init): Ignore DOLLARS_IN_IDENTIFIERS. + (parse_name): Diagnose $ in identifier if pedantic. + (cpp_handle_options): -traditional no longer messes with + dollars_in_ident. + * i386/dgux.h, m68k/apollo68.h (DOLLARS_IN_IDENTIFIERS): Remove. + * m88k.h, mips.h, nextstep.h, pa.h (DOLLARS_IN_IDENTIFIERS): Remove. + * vax/ultrix.h, vax/vms.h (DOLLARS_IN_IDENTIFIERS): Remove. + * convex.h (OVERRIDE_OPTIONS): Don't need to set + dollars_in_ident any more, since -ansi doesn't change it. + +Wed Oct 9 07:35:47 1996 Doug Evans <dje@cygnus.com> + + * Allow prefix attributes in more places. + * c-parse.in: Update number of shift/reduce conflicts. + ({typed_declspecs,reserved_declspecs,declmods}_no_prefix_attr): New. + (current_declspecs): Initialize to NULL_TREE. + (fndef): Pass current_declspecs, not $1, to start_function. + (old_style_parm_decls): Renamed from xdecls. + (datadecl, declmods): Add references to new rules. + (setspecs): Call split_specs_attrs. + (absdcl1): Remove case with setattrs. + * c-common.c (split_specs_attrs): New function. + +Wed Oct 9 05:48:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * sdbout.c: Include defaults.h. + * Makefile.in (sdbout.o): Make dependency list match included files. + + * fold-const.c (range_test): Function deleted. + (range_binop, make_range, build_range_check): New functions. + (merge_ranges, fold_range_test): Likewise. + (fold_truthop): No longer call range_test. + (fold, case TRUTH_{AND,OR}{,IF}_EXPR): Call fold_range_test. + +Tue Oct 8 22:03:32 1996 Torbjorn Granlund <tege@nada.kth.se> + + * configure: Set cpu_type for pyramid. + +Tue Oct 8 21:54:04 1996 Jason Merrill <jason@yorick.cygnus.com> + + * final.c (final_start_function): Call dwarfout_begin_prologue. + + * dwarf2out.c (pubname_*, arange_*): New data for .debug_pubnames + and .debug_aranges sections. + (add_pubname): New fn. + (size_of_pubnames): Reimplement. + (output_pubnames): Likewise. + (add_arange): New fn. + (size_of_aranges): Include function sections. + (output_aranges): Likewise. + (gen_variable_die): Call add_pubname. + (add_name_and_src_coords_attributes): Use DECL_ASSEMBLER_NAME for now. + (decl_start_label): Renamed from function_start_label. + (gen_subprogram_die): If weak or one_only, use a local label for + AT_low_pc. Call add_pubname and add_arange. + (dwarfout_begin_prologue): New fn. Start up FDE here. + (dwarfout_begin_function): Not here. + (get_AT): Split out. Look in specification and abstract_origin DIEs. + (get_AT_low_pc, get_AT_string, get_AT_flag, get_AT_unsigned, + get_AT_hi_pc): Use it. + (dwarfout_finish): Variables can produce pubnames, too. + +Tue Oct 8 19:35:40 1996 Torbjorn Granlund <tege@nada.kth.se> + + * m88k/dgux.h (CPP_SPEC): Avoid newline in the string. + + * final.c (final): Update insn_current_address before calling + final_scan_insn. + +Tue Oct 8 17:52:02 1996 Jim Wilson <wilson@cygnus.com> + + * unroll.c (unroll_loops): Set local_regno only if set_dominates_use + returns true. + (set_dominates_use): New function. + +Tue Oct 8 16:01:37 1996 Doug Evans <dje@cygnus.com> + + * c-typeck.c (decl_constant_value): Delete test for ! TREE_PUBLIC. + +Tue Oct 8 10:36:44 1996 Jeffrey A Law (law@cygnus.com) + + * pa.c (hppa_legitimize_address): Remove test code accidentally left + in during last change. + +Mon Oct 7 19:55:02 1996 Jim Wilson <wilson@cygnus.com> + + * sched.c (schedule_block): Before scheduling, add code to make all + call used regs that are not fixed or global live when we see a + CALL_INSN. During scheduling, change existing code to use same test. + + * varasm.c (bss_section): Delete unused parameters. + +Mon Oct 7 16:24:21 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2.h: Add new SGI/MIPS attributes. + + * dwarf2out.c (*_separate_line_info_*): Parallel line number + information for functions defined in sections other than .text. + (size_of_line_info): Support it. + (output_line_info): Likewise. + (dwarfout_line): Likewise. + (gen_compile_unit_die): Don't add high/low_pc or stmt_list + attributes here. + (dwarfout_finish): Add them here if appropriate. + (remove_AT): free removed attribute properly. + (gen_type_die): Don't assume a nested type is complete. + (dwarfout_finish): Don't emit line info if it would be empty. + + * dwarfout.c (output_block): Don't emit a DIE for a body block. + (output_decls_for_scope): Don't increment next_block_number for the + outer block. + (output_decl): Start from the outer block, not + the first inner block since there can be more than one in C++. + (type_tag): Handle C++ TYPE_NAME. + (output_type): Fix handling of TYPE_METHODS. + (output_decl): Don't output a DIE for artificial typedefs. + +Mon Oct 7 15:47:29 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (movdi define_splits): Fix previous change to work + on both little and big endian hosts. + +Sun Oct 6 16:52:34 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (combinable_fsub): Don't return without a value. + +Sun Oct 6 14:05:39 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (mov{df,di} define_splits): Use split_double to + properly split CONST_DOUBLEs. + (movdi): Likewise. + +Sat Oct 5 08:43:14 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * i386/cygwin32.h (LIB_SPEC): Add support for -mwindows. + Always pass -lkernel32. + (LIBGCC_SPEC): Don't delete. + (STARTFILE_SPEC): Remove always-true conditionalization. + (LONG_DOUBLE_TYPE_SIZE): Use default. + +Fri Oct 4 17:22:53 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (rest_of_type_compilation): Don't emit DWARF for member + types of a type we haven't emitted yet. + (compile_file): Still emit DWARF for pending tagged types. + + * final.c (final_scan_insn): Do emit DWARF labels for level 1 blocks. + + * dwarf2out.c (gen_subprogram_die): Start from the outer block, not + the first inner block since there can be more than one in C++. + (gen_lexical_block_die): Keep track of the block depth. + (gen_block_die): Don't emit a DIE for a body block. + (gen_inlined_subroutine_die): Don't emit anything for an + abstract instance. + (decls_for_scope): Don't increment next_block_number for the + outer block. + +Fri Oct 4 15:27:55 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.h (PRESERVE_DEATH_INFO_REGNO_P): Define. + + * sh.c (sfunc_uses_reg): New function. + (noncall_uses_reg, machine_dependent_reorg, final_prescan_insn): + Handle special functions like function calls for purposes of relaxing. + (noncall_uses_reg): Added some missing cases of registers + being used in non-call instructions. + +Fri Oct 4 10:51:40 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c: Tear out backchaining brain damage. + (remove_AT, remove_children): New functions. + (modified_type_die): Call gen_type_die instead of backchaining. + (gen_subprogram_die): Don't generate a new specification DIE for + member functions defined in the class; use the declaration DIE instead. + (gen_struct_or_union_type_die): Support DW_AT_declaration. + (gen_type_die): Don't set TREE_ASM_WRITTEN on incomplete structs. + (gen_decl_die): Revert previous change; it's much simpler to emit + the class from rest_of_type_compilation. + +Fri Oct 4 09:54:21 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * Make sure we have enough registers for the insns we recognize. + * i386.h (flag_omit_frame_pointer, outer_function_chain): Declare. + (current_function_calls_alloca): Likewise + (rtx_equal_function_value_matters): Likewise + (N_REGS_USED, N_ALLOCATABLE_REGISTERS): Define. + + * i386.md (adddi3_1, subdi3_1): Insns renamed from adddi3 and subdi3; + added missing earlyclobbers. + (adddi3_1): Removed duplicates from commutativity. + (adddi3, subdi3): New define_expands. + (movsf, movsf_mem, movsf_normal, movdf, movdf_mem , movdf_mem+1): Take + number of used vs. available registers into account. + (movxf, movxf_mem, movxf_mem+1, addsidi3_1, addsidi3_2): Likewise. + (adddi3_1, subsidi3, subdi3_1): Likewise. + (addsidi3_1, addsidi3_2, subsidi3): Need no generate function. + + * i386.c (asm_output_function_prefix): Don't use + ASM_DECLARE_FUNCTION_NAME if it is not defined. + +Fri Oct 4 07:01:55 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * stor-layout.c (layout_decl): Don't turn off DECL_BIT_FIELD + if DECL's alignment is less than its type. + +Thu Oct 3 19:42:30 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (rest_of_type_compilation): Also do this for DWARF. + (compile_file): Don't try to write out DWARF for vars with no RTL. + +Thu Oct 3 18:31:28 1996 Doug Evans <dje@cygnus.com> + + * ginclude/{stdarg.h,varargs.h}: Use #include "", not #include <>. + +Wed Oct 2 17:29:53 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixincludes: Add a hack to the big sed script to work around a + bug in the sed implementation on HP/UX 10.20. + +Wed Oct 2 16:53:56 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (modified_type_die): Don't generate redundant DIEs. + (gen_{array,pointer,reference,ptr_to_mbr}_type_die): Likewise. + (gen_{subroutine,string,set}_type_die): Likewise. + + * dwarf2out.c: Undo text_end_label, add_src_coords changes. + (addr_const_to_string): Fix typos. + (decl_class_context): New fn. + (get_AT_unsigned): New fn. + (gen_subprogram_die): Only emit src coords info for a specification + if they changed. + (gen_variable_die): Support DW_AT_declaration and DW_AT_specification. + (gen_decl_die): Avoid generating redundant DIEs for member functions + and variables. + +Wed Oct 2 11:22:50 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (EXTRA_CONSTRAINT): Loosen conditions for match of + 'Q' and 'T' while reload is running. + * pa.c (hppa_legitimize_address): Rework to generate more + indexed and scaled indexed addressing. + * pa.md (scaled indexed store): Add define_splits to undo + pessimizations created by hppa_legitimize_address for integer + stores. + + * pa.c (remove_useless_addtr_insns): New function. + (pa_reorg): Delete code to remove useless add,tr insns. + Instead call remove_useless_addtr_insns. + (output_function_prologue): Call remove_useless_addtr_insns + to catch any add,tr insns created by reorg. + + * pa.c (secondary_reload_class): Remove duplicate/useless code. + + * pa.h (PARSE_LDD_OUTPUT): Handle output from hpux10.20 "chatr". + +Tue Oct 1 17:23:32 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dwarf2out.c (text_end_label): New static. + (size_of_line_info): The final entry is smaller. + (output_aranges): Use TEXT_SECTION instead of TEXT_BEGIN_LABEL and + text_end_label instead of TEXT_END_LABEL. + (gen_compile_unit_die): Likewise. + (output_line_info): Likewise. Use a fixed advance for the last entry. + (dwarfout_init): Don't output starting labels. + (dwarfout_finish): Set up text_end_label. Don't output ending labels. + + (add_pure_or_virtual_attribute): Don't say pure virtual for now. + (type_tag): Handle C++ TYPE_NAME. + (gen_formal_parameter_die): Support DW_AT_artificial. + (gen_formal_types_die): Do emit the type for 'this'. + (gen_member_die): Fix handling of TYPE_METHODS. + (gen_decl_die): Do output a DIE for member function declarations. + Don't output a DIE for artificial typedefs. + + (add_member_attribute): Remove, not in DWARF-II. + (gen_array_type_die): Remove ref to add_member_attribute. + (gen_set_type_die, gen_entry_point_die, gen_enumeration_type_die, + gen_subprogram_die, gen_variable_die, gen_field_die, + gen_pointer_type_die, gen_reference_type_die, gen_ptr_to_mbr_type_die, + gen_string_type_die, gen_struct_or_union_type_die, + gen_subroutine_type_die, gen_typedef_die): Likewise. + + (get_AT_flag): New fn. + (add_src_coords_attributes): Split out... + (add_name_and_src_coords_attributes): From here. + (gen_subprogram_die): Support DW_AT_declaration and + DW_AT_specification. + + (gen_compile_unit_die): Don't emit full pathname for source file; + comment claimed that SGI required it, but they don't emit it either. + Append -g to producer rather than replacing it. + +Tue Oct 1 14:19:23 1996 Jim Wilson <wilson@cygnus.com> + + * gcc.c (used_arg): When call xmalloc for mswitches, pass 1 if + n_switches is zero. + +Mon Sep 30 17:46:26 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (gen_shl_and, gen_shl_sext): Use gen_lowpart to + generate rtx in the appropriate mode for zero/sign-extension. + Don't generate a zero bit shift. + (gen_shl_sext) Directly use gen_ashift instead of gen_ashrsi3. + +Mon Sep 30 17:17:56 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixinc.svr4: In math.h, redefine exception to __math_exception + for C++, to avoid conflict with <exception>. + * fixincludes: Likewise. + Fix check for class in math.h to not match fp_class. + +Mon Sep 30 17:15:19 1996 Jim Wilson <wilson@cygnus.com> + + * iris6.h (ASM_SPEC): Add -w. + (STARTFILE_SPEC): Add mips3 to n32 pathnames. + Add -L/usr/lib32/mips for n32 cases. + (ENDFILE_SPEC): Add mips3 to n32 pathnames. + +Mon Sep 30 13:20:31 1996 Ian Lance Taylor <ian@cygnus.com> + + * genopinit.c (gen_insn): Look through the modes in reverse order, + to avoid stopping early on CC when EXTRA_CC_MODES is used. + + * fixincludes: Add extern "C" to <sys/mman.h> on HP/UX. + +Sun Sep 29 12:39:18 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * c-typeck.c (pointer_diff): Do not do default conversions when + doing the minus expression, in case restype is a short type. + +Sun Sep 29 11:22:10 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.c (build_complex): Add new argument, TYPE. + * tree.h (build_complex): Likewise. + * c-lex.c (yylex): Add new arg, TYPE, to call to build_complex. + * fold-const.c (const_binop): Likewise. + (fold, case CONJ_EXPR, COMPLEX_EXPR): Likewise. + * varasm.c (copy_constant, case COMPLEX_CST): Likewise. + * expr.c (expand_expr, case COMPONENT_REF): Don't try to directly + load a complex. + * recog.c (register_operand): Don't reject subreg of complex mode. + * emit-rtl.c (mark_user_reg): New function. + * function.c (assign_parms): Use it. + * stmt.c (expand_decl): Likewise, and simplify code. + + * tree.c (contains_placeholder): Return 1 for PLACEHOLDER_EXPR. + + * expr.c (store_expr): memset/bzero gets ptr_mode, not Pmode. + + * stmt.c (expand_asm_operands): Fix errors in previous patches. + + * x-linux: Simplify, but ensure headers aren't changed. + + * getpwd.c: No longer include direct.h for _WIN32. + + * configure (i[3456]86-*-isc*): Remove bogus echo. + (m68k-apple-aux*): a-ux.h renamed from aux.h. + (CC): Escape "$" char in "no-symlink" case for bash/cygwin32 bug. + + * Makefile.in (installdirs): Renamed from install-dir. + Create $(prefix) and $(exec_prefix) if doesn't exist. + (install-float): Reflect new name for installdirs. + (install-{common,info,man,libgcc,multilib,libobjc}): Likewise. + (install-{include-dir,assert-h,collect2}): Likewise. + + * reload1.c (gen_reload): Handle SUBREG in PLUS specially too. + Change calls to emit_move_insn to recursive calls. + + * stmt.c (fixup_gotos): When running undefined labels, if no cleanup + actions for this block, don't clear BEFORE_JUMP. + +Fri Sep 27 13:48:21 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * c-decl.c (init_decl_processing): Create short int types before + creating size_t in case a machine description needs to use + unsigned short for size_t. + +Fri Sep 27 12:28:54 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * gcc.c (do_spec_1): Allow -A in %[Spec]. + + * i386.h (CPP_CPU_SPEC): New. Added for defining the submodel. + + * i386.c (asm_output_function_prefix, function_prologue, + ix86_expand_prologue): Make the routine that sets the GOT (when pic + is enabled) a function, to assist debugging. + + * i386.md (gen_prologue_get_pc): Call the function created above. + (divdf3): Added. + + * i386/dgux.h (CPP_PREDEFINES, CPP_SPEC): Reference CPP_CPU_SPEC. + Use svr4 assembler directive .backalign instead of .align. + (align to x bytes if it takes no more than y bytes to do so.) + + * i386/{aix386ng.h,dgux.h} (CPP_SPEC): Use %[cpp_cpu]. + * i386/{freebsd-elf,gas,isc,linux-aout}.h: Likewise. + * i386/{linux-oldld,linux,osfelf,osfrose,sco,sco4}.h: Likewise. + * i386/{sco4dbx,sco5,sol2,sysv3}.h: Likewise. + +Thu Sep 26 17:58:34 1996 Torbjorn Granlund <tege@matematik.su.se> + + * m68k.md (mulsidi3 matcher): Change predicate const_int_operand + to const_sint32_operand. Get rid of bogus range condition. + +Thu Sep 26 17:12:00 1996 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (stmp-int-hdrs): Don't cd to srcdir before copying + header files to objdir. + +Wed Sep 25 21:22:57 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (FIRST_PSEUDO_REGISTER): Bump up by one. + (ARG_POINTER_REGNUM): Likewise. + (FIXED_REGISTERS): Add entry for MAC register. + (CALL_USED_REGISTERS< REG_ALLOC_ORDER): Likewise. + (HARD_REGNO_NREGS): Handle MAC register. + (HARD_REGNO_MODE_OK< REGNO_OK_FOR_BASE_P): LIkewise. + (REGISTER_NAMES): Likewise. + (enum reg_class): New MAC_REGS register class. + (REG_CLASS_CONTENTS, REGNO_REG_CLASS): Corresponding changes. + (REG_CLASS_FROM_LETTER): LIkewise. + (REGISTER_MOVE_COST): Make copies to/from the MAC register + expenseive. + (CONDITIONAL_REGISTER_USAGE): Define. + * h8300.md (movsi_h8300hs): Renamed from movsi_h8300h. + Handle moves to/from the MAC register. + (mac): Two new patterns to use the mac instruction. + + * h8300.c (notice_update_cc): Fix CC_SET case. + (restore_compare_p): Remove unused function. + * h8300.md: Handle "set" vs "set_zn_c0" correctly. + (bCC patterns): No longer need to call restore_compare_p. + + * h8300.c (get_shift_alg): Fix HImode ASHIFTRT by 13 or 14 bits. + +Wed Sep 25 18:52:19 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * sh.md (insv): New pattern. + +Wed Sep 25 16:47:26 1996 Doug Evans <dje@seba.cygnus.com> + + * sparc/t-sunos41 (MULTILIB_{OPTIONS,DIRNAMES,MATCHES}): Create + multilib versions of -fpic and -fPIC. + (TARGET_LIBGCC2_CFLAGS): Comment out. + + * sparc.c (print_operand): Handle new codes H/L. + * sparc.md (lo_sum_di_sp32): Add little endian support. + (adddi3_sp32,subdi3_sp32,mulsidi3_sp32,const_mulsidi3): Likewise. + (umulsidi3_sp32,const_umulsidi3,smacdi,umacdi,anddi3_sp32): Likewise. + (iordi3_sp32,xordi3_sp32,negdi2_sp32): Likewise. + +Wed Sep 25 15:32:35 1996 Jim Wilson <wilson@cygnus.com> + + * expmed.c (store_bit_field): Don't make flag_force_mem disable insv + for memory operands. + + * function.c (instantiate_decl): Always store addr back into x. + +Tue Sep 24 19:37:00 1996 Jim Wilson <wilson@cygnus.com> + + * reload.c (push_secondary_reload): Do strip paradoxical SUBREG + even if reload_class is CLASS_CANNOT_CHANGE_SIZE. Change reload_mode + to mode in SECONDARY_MEMORY_NEEDED and get_secondary_mem calls. + + * reload1.c (emit_reload_insns): For output part of RELOAD_OTHER, + emit after RELOAD_FOR_OUTPUT, in reverse order of reload number, + but not separately. + +Tue Sep 24 18:13:07 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * expr.c (emit_group_load): Allow target to be smaller than source. + +Tue Sep 24 17:40:39 1996 Doug Evans <dje@cygnus.com> + + * m68k/a-ux.h: Renamed from aux.h because of MSDOS. + +Tue Sep 24 08:33:53 1996 David S. Miller (davem@caip.rutgers.edu) + + * tree.c (copy_node): Fix error in last change. + +Tue Sep 24 08:29:03 1996 James G. Smith <jsmith@cygnus.co.uk> + + * gcc.c (used_arg): Fix multilib_matches parsing to not corrupt + entry parameter. + +Tue Sep 24 08:22:18 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * loop.c (get_condition): Use rtx_equal_p to compare rtx. + +Tue Sep 24 08:14:01 1996 Christian Iseli <Christian.Iseli@lslsun.epfl.ch> + + * integrate.c (expand_inline_function): Avoid creating paradoxical + subreg wider than BITS_PER_WORD as inlined function result. + +Tue Sep 24 08:00:15 1996 Paul Eggert <eggert@twinsun.com> + + * cccp.c (struct directive, directive_table, handle_directive): + pass_thru now 1 for #define and 2 for #pragma. + (handle_directive): When deciding whether to suppress comment at end + of directive, ignore tabs and spaces after comment. Remove redundant + limit test. With -dD -C, copy comment when isolating definition. + (skip_to_end_of_comment): With -C, don't copy newline at end + of C++ comment. + + * fixinc.ptx, fixinc.svr4, fixincludes: Insert newlines just before + end of 'sed' command strings if last 'sed' command is 'a' or 'i'. + +Tue Sep 24 07:28:58 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * toplev.c (PREFERRED_DEBUGGING_TYPE): If no debugging formats are + supported, set to NO_DEBUG. + (main): Don't do setting of PREFERRED_DEBUGGING_TYPE here. + +Mon Sep 23 22:45:15 1996 Sean McNeil <sean@mcneil.com> + + * rs6000/vxppc.h, sparc/vxsim.h: New files. + * configure (powerpc-*-vxworks*, sparc-*-vxsim*): New targets. + * objc/objc.h (BOOL): Define BOOL as int for VxWorks. + +Mon Sep 23 21:23:27 1996 Klaus K"ampf (kkaempf@progis.de) + + * explow.c (promote_mode, case REFERENCE_TYPE): New case. + +Mon Sep 23 21:15:43 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * c-decl.c (finish_struct): Check PCC_BITFIELD_TYPE_MATTERS value. + + * dbxout.c (dbxout_symbol): Fix forgotten case in last change: + check DECL_ARTIFICIAL also when using the short cut way. + +Mon Sep 23 15:55:24 1996 David S. Miller (davem@caip.rutgers.edu) + + * tree.c (copy_node): Abort if don't know size of node. + + * tree.c (build1): Clean up initialization of OBSTACK. + +Mon Sep 23 15:35:33 1996 Jason Merrill <jason@yorick.cygnus.com> + + * Makefile.in (stmp-multilib): Depend on $(LANG_LIB2FUNCS). + + * dbxout.c (dbxout_function): Don't check DECL_SECTION_NAME before + calling dbxout_function_end. + +Mon Sep 23 14:41:12 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * combine.c (can_combine_p): Even if SMALL_REGISTER_CLASSES, + know lifetime not extended if all_adjacent set. + + * stmt.c (expand_asm_operands): Handle '+' constraint. + * cse.c (fold_rtx): Fold inside ASM_OPERANDS. + + * expr.c (expand_increment): If postincrement for MEM can't use add + directly, load address in reg and enqueue increment and store of reg. + + * loop.c (check_dbra_loop): Don't assume label must be second part of + if_then_else in condjump. + + * jump.c (jump_optimize): In no-nop move deletion, don't + test PRESERVE_DEATH_INFO_REGNO_P; instead test if optimization is + performed. + Check for REG_UNUSED note on to-be deleted insn before searching for + preceding instruction to delete note from. + If PRESERVE_DEATH_INFO_REGNO_P is true for SREG, replace INSN with USE. + + * reload1.c (reload): Initialize the previous_offset fields + in reg_eliminate before calling setup_save_areas. + + * reload1.c (emit_reload_insns): Declare and set this_reload_insn. + + * expr.c (var_rtx): New function. + (expand_expr, case COND_EXPR): Also use target if same as singleton. + +Mon Sep 23 14:22:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * recog.c (constrain_operands): Don't test clobbered constraints. + + * reload1.c (emit_reload_insns): For output part of RELOAD_OTHER, + put in front of anything previous for that output, but not separately. + +Sun Sep 22 21:06:46 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-common.c (decl_attribtes, case A_SECTION): Allow for static + local variable. + +Sun Sep 22 11:30:27 1996 Christian Iseli (christian.iseli@di.epfl.ch) + + * expr.c (convert_move): Replace explicit checks for FP extend ops + with use of can_extend_p. + Add missing tests for FP trunc operations. + +Sun Sep 22 11:20:02 1996 Pat Rankin <rankin@eql.caltech.edu> + + * dwarfout.c (DWARF_VERSION): Define as 1 if not already defined. + * dwarf2out.c (DWARF_VERSION): Likewise. + +Sun Sep 22 11:12:20 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * c-decl.c (pushdecl): Check new declaration actually conflicts before + warning about implicit external vs. static declarations. + + * loop.c (combine_givs): Improve combining DEST_REG giv with + its only use. + +Sun Sep 22 10:50:03 1996 Scott Christley <scottc@net-community.com> + + * Create consistent mechanism for memory allocation and release + so that garbage collection routines can be easily subsititued + for the ANSI standard malloc, realloc, free, etc. + * objc/archive.c: Replace use of __objc_xmalloc and free + with objc_malloc and objc_free. + * objc/hash.c: Replace use of __objc_xcalloc and free + with objc_calloc and objc_free. + * objc/init.c: Replace use of free with objc_free. + * objc/misc.c (objc_malloc): Renamed from __objc_xmalloc. + (objc_realloc): Renamed from __objc_realloc. + (objc_atomic_malloc): New function. + (objc_valloc): New function. + (objc_calloc): Renamed from __objc_calloc. + (objc_free): New function. + * objc/objc-api.h (_objc_malloc): New function pointer. + (_objc_atomic_malloc, _objc_valloc): Likewise. + (_objc_realloc, _objc_calloc, _objc_free): Likewise + * objc/objc-list.h: Replace use of __obj_xmalloc and free + with objc_malloc and objc_free. + * objc/objects.c: Likewise. + * objc/sarray.c: Replace use of __objc_xmalloc and free + with objc_malloc and objc_free. + * objc/sarray.h (__objc_xmalloc, __objc_xrealloc): Delete. + * objc/selector.c: Replace use of __objc_xcalloc, __objc_xrealloc, + and __objc_xmalloc with objc_calloc, objc_realloc, and objc_malloc. + * objc/thr-decosf1.c: Replace use of __objc_xmalloc and free + with objc_malloc and objc_free. + * objc/thr-irix.c, objc/thr-mach.c, objc/thr-os2.c: Likewise. + * objc/thr-posix.c, objc/thr-pthreads, objc/thr-single: Likewise. + * objc/thr-solaris.c, objc/thr-win32.c, objc/thr.c: Likewise. + +Sun Sep 22 05:26:01 1996 Jason Merrill <jason@yorick.cygnus.com> + + * configure: Set up LANG_LIB2FUNCS and LANG_EXTRA_HEADERS. + * Makefile.in (libgcc2.a): Include LANG_LIB2FUNCS. + (USER_H): Add LANG_EXTRA_HEADERS. + (LANG_LIB2FUNCS): New macro. + (LANG_EXTRA_HEADERS): New macro. + (stmp-int-hdrs): Don't hardwire ginclude. + (stamp-objlist): Don't depend on Makefile. + +Sat Sep 21 18:00:10 1996 Stephen L Moshier (moshier@world.std.com) + + * alpha.md (alpha_swapped_comparison_operator pattern): Fix asm + operand typo in last change. + +Sat Sep 21 07:11:51 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * defaults.h (ASM_OUTPUT_LABELREF): Provide default definition + if not already defined. + * 1750a.h (USER_LABEL_PREFIX): Define instead of ASM_OUTPUT_LABELREF. + * a29k.h, alpha.h, convex.h, dsp16xx.h, elxsi.h, fx80.h: Likewise. + * gmicro.h, h8300.h, i386/sun386.h, i860.h, i960.h, ns32k.h: Likewise. + * pdp11.h, pyr.h, romp.h, sh.h, sparc.h, spur.h, tahoe.h: Likewise. + * vax.h, we32k.h: Likewise. + * i386/att.h (USER_LABEL_PREFIX): Redefine, not ASM_OUTPUT_LABELREF. + * i386/bsd.h, i386/lynx.h, i386/sco5.h, i860/fx2800.h: Likewise. + * m68k/3b1.h, m68k/mot3300.h, m68k/tower-as.h, m68k/tower.h: Likewise. + * ptx4.h, sparc/pbd.h, svr3.h, svr4.h: Likewise. + * i386/osfrose.h, m88k.h (USER_LABEL_PREFIX): Redefine. + * nextstep.h (USER_LABEL_PREFIX): Redefine. + (ASM_OUTPUT_LABELREF) Use USER_LABEL_PREFIX. + * arm/aout.h, mips.h (ASM_OUTPUT_LABELREF): Delete. + * rs6000/lynx.h (USER_LABEL_PREFIX): Undefine. + * rs6000.h, rs6000/win-nt.h (USER_LABEL_PREFIX): Define. + +Thu Sep 19 00:05:53 1996 Jason Merrill <jason@yorick.cygnus.com> + + * configure: Move i[3456]86-*-gnu* case after linux and don't + treat linux-gnu like other gnu systems. + +Wed Sep 18 20:51:09 1996 Jason Merrill <jason@yorick.cygnus.com> + + * cplus-dem.c (demangle_template): Fix handling of address args. + (gnu_special): Handle type_info stuff. + +Wed Sep 18 17:57:55 1996 Patrik Lantto (patrik@opq.se) + + * jump.c (jump_optimize): Insert conditional move after jump + insn instead of before. + +Wed Sep 18 17:33:36 1996 Richard Henderson <rth@tamu.edu> + + * alpha.h (PREDICATE_CODES): Add alpha_swapped_comparison_operator. + * alpha.c (alpha_swapped_comparison_operator): New function. + (print_operand): Support unsigned codes for %D, %c, and %d. + * alpha.md: Add pattern for b%c with swapped comparisons with 0. + Delete three unnamed cmp patterns that are strict subsets of it. + + * alpha.c (alpha_emit_set_long_const): Save one instruction + when -O2 and high word == low word. + +Tue Sep 17 22:46:15 1996 Jason Merrill <jason@yorick.cygnus.com> + + * i386/unix.h (ASM_OUTPUT_MI_THUNK): Handle functions + returning an aggregate. + + * varasm.c (supports_one_only): New function. + (make_decl_one_only): Likewise. + * svr4.h (MAKE_DECL_ONE_ONLY): Define. + * tree.h (DECL_ONE_ONLY): New macro. + + * varasm.c (assemble_variable): Fix setting of + first_global_object_name. + (assemble_start_function): Likewise. + +Tue Sep 17 19:42:39 1996 Doug Evans <dje@wabamun.cygnus.com> + + * i386/t-cygwin32 (winnt.o): Compile properly. + +Tue Sep 17 15:47:20 1996 Ian Lance Taylor <ian@cygnus.com> + + * Add support for VR5000, and finish MIPS4 support. + * mips.h (enum processor_type): Add PROCESSOR_R5000. + (gen_conditional_move): Declare. + (CONDITIONAL_REGISTER_USAGE): Mark ST_REGS as fixed if not + HARD_FLOAT, or if mips_isa < 4. + (FIRST_PSEUDO_REGISTER): Change to 76. + (FIXED_REGISTERS): Add condition code registers. + (CALL_USED_REGISTERS): Likewise. + (ST_REG_LAST): Change to 74. + (RAP_REG_NUM): Change to 75. + (ST_REG_P): Look for any condition code register. + (REG_CLASS_CONTENTS): Update for new condition code registers. + (RTX_COSTS): Add cases for R5000. + (REGISTER_MOVE_COST): Add cases for condition code registers. + (PREDICATE_CODES): Add "const_float_1_operand". + (EXTRA_CC_MODES): Remove. + (EXTRA_CC_NAMES): Remove. + (SELECT_CC_MODE): Remove. + (REGISTER_NAMES): Add entries for new condition code registers. + (DEBUG_REGISTER_NAMES): Likewise. + (ADDITIONAL_REGISTER_NAMES): Remove FPSW_REGNUM. + * mips.md (cpu attribute): Add R5000. + (function units): Add cases for the R5000. + (madd.d): Only available if TARGET_DOUBLE_FLOAT. + (msub.d, nmadd.d, nmsub.d): Likewise. + (recip.d, recip.s, rsqrt.d, rsqrt.s): New define_insn patterns. + (movcc): New pattern to move condition code values. + (reload_incc, reload_out_cc): New define_expand patterns. + (lwxc1, ldxc1, swxc1, sdxc1): Several new define_insn patterns. + (various): Replace CC_FP with CC. + (branch_fp_ne, branch_fp_eq): Match any condition code register. + (branch_fp_ne_rev, branch_fp_eq_rev): Remove. + (seq_df, slt_df, sle_df): Match any condition code register. + (sgt_df, sge_df, seq_sf, slt_sf, sle_sf): Likewise. + (sgt_sf, sge_sf): Likewise. + (sne_df, sne_sf): Remove. + (FP conditional moves): Match any condition code register. + Require TARGET_HARD_FLOAT and, if appropriate, + TARGET_DOUBLE_FLOAT. + (movsicc): Just call gen_conditional_move. + (movdicc, movsfcc, movdfcc): New define_expand patterns. + * mips.c (mips_reg_names): Add condition code registers. + (mips_sw_reg_names): Likewise. + (mips_regno_to_class): Likewise. + (const_float_1_operand): New function. + (mips_move_1word): Treat CCmode as SImode. Handle move from + ST_REG to GR_REG if mips_isa >= 4. Only permit move from GR_REG + to ST_REG is mips_isa < 4. + (gen_conditional_branch): Rewrite. Just use CCmode, not extra + condition modes. + (gen_conditional_move): New function. + (override_options): Recognize vr5000. Look for just CCmode, not + extra condition modes. If mips_isa >= 4, permit CCmode in GR_REGS + and FP_REGS. + (print_operand): Handle %Z. + (mips_secondary_reload_class): Require a data register to copy a + value out of a condition code register. Require a floating point + register to copy a value into a condition code register. + +Tue Sep 17 15:10:29 1996 Joern Rennecke <amylaar@cygnus.co.uk> + + * sh.md: New define_splits to recombine output from LEGITIMIZE_ADDRESS. + * sh.h (LEGITIMIZE_ADDRESS): Typo fixes (x -> X). + +Mon Sep 16 23:00:35 1996 Jim Wilson <wilson@cygnus.com> + + * configure (build_broken_install): Renamed from host_broken_install. + Set from build not host. + (build_install_headers): Renamed from host_install_headers. Set from + build not host. + +Mon Sep 16 22:38:55 1996 Stu Grossman (grossman@critters.cygnus.com) + + * configure (m68k-*-coff*): Use dbx debug format by default. + * gcc.c (link_command_spec): Move -T to end of link command line. + * m68k/m68kemb.h (LINK_SPEC, SUBTARTGET_SWITCHES): Delete. + (LIB_SPEC): Define to just -lc. + (STARTFILE_SPEC): Define to empty. + +Mon Sep 16 13:12:27 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (ext_shift_insns, ext_shift_amounts): new arrays. + (gen_ashift_hi, gen_shifty_hi_op, shl_and_kind): new functions. + rtx_equal_function_value_matters: declare. + (shl_and_length, shl_and_src_length, gen_shl_and): new functions. + (shl_sext_kind, shl_sext_length, gen_shl_sext): new functions. + * sh.md (ashlhi3_k, lshrhi3_m): new insn pattern. + (lshrhi3, shl_sext_ext, shl_sext_sub): + new insn pattern with matching define_split. + (and_shl_scratch): Likewise, but also with unnamed variants. + +Sat Sep 14 17:05:07 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * gcc.c (convert_filename): Don't start looking for '.' until + after last directory separator. + + * i386.md (clrstrsi): Correct check for constant size. + + * Based on code by sac@cygnus.com. + * i386/cygwin32.h (CHECK_STACK_LIMIT): Make consistent with MD file. + * i386.c ({function,ix86_expand}_prologue): Use __alloca to allocate + stack if desired and beyond CHECK_STACK_LIMIT in size. + * i386.h ({MASK,TARGET}_STACK_PROBE): New macros. + (TARGET_SWITCHES): Add -mstack-arg-probe. + * i386.md (allocate_stack{,_worker}): New patterns. + +Fri Sep 13 18:23:18 1996 Joel Sherrill <joel@OARcorp.com> + + * sparc/lb1spc.asm (.div, .rem): Fixed typo so sign is returned + correctly. TOPBITS was 2 and should have been 4. + +Thu Sep 12 21:51:56 1996 Jim Wilson <wilson@cygnus.com> + + * mips.md (call_value_multiple_internal0): Change from define_insn to + define_expand. + +Thu Sep 12 19:22:14 1996 Doug Evans <dje@seba.cygnus.com> + + * sparc.md (move_pic_label_si): Operand one is label_ref now. + * sparc.c (emit_move_sequence): Pass label_ref to + gen_move_pic_label_si to not lose flags. + +Wed Sep 11 12:10:08 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * Makefile.in (GCC_PASSES): Add $(exeext) to names. + (FLAGS_TO_PASS): Add CLIB. + (c-pragma.o): Add dependencies on except.h, function.h, defaults.h. + +Tue Sep 10 22:25:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure (i[3456]86-*-cygwin32): Use xm-cygwin32.h and xm-i386.h. + Set fixincludes to Makefile.in and objc_thread_file to win32. + * i386/xm-cywin32.h: Don't include xm-i386.h. + * i386/x-cygwin32, rs6000/x-cygwin32 (STMP_FIXPROTO, exeext): New defs. + + * gcc.c (HAVE_EXECUTABLE_SUFFIX): New macro. + (convert_filename): New function. + (process_command, case 'o'): Call it. + (process_command, default case): Likewise; delete old code. + +Tue Sep 10 21:08:43 1996 Torbjorn Granlund <tege@albert.gnu.ai.mit.edu> + + * i386.md (decrement_and_branch_until_zero matcher): Fix typo. + +Tue Sep 10 19:04:19 1996 Jim Wilson <wilson@cygnus.com> + + * mips.c (mips_move_2words): Rewrite 32 bit shifts as 16 bit shifts. + +Tue Sep 10 10:39:07 1996 Jeffrey A Law (law@cygnus.com) + + * pa/pa-gas.h (DBX_DEBUGGING_INFO): Remove all #define + and #undef statements related to debugging information. + * pa/pa-hpux.h, pa-hpux7.h: Likewise + * pa.c (override_options): Disable "-g" and issue a warning + if it's used when !TARGET_GAS. + +Mon Sep 9 17:57:49 1996 Doug Evans <dje@wabamun.cygnus.com> + + * sparc.h ({MASK,TARGET}_FPU_SET): Define. + (TARGET_SWITCHES): Record if -m{,no-}fpu passed. + * sparc.c (sparc_override_options): Don't clobber explicit + -m{,no-}fpu setting with cpu default. + +Mon Sep 9 15:57:57 1996 Joel Sherrill <joel@OARcorp.com> + + * configure (mips64orion-*-rtems*): New target. + * mips/rtems64.h: New file. + +Sat Sep 7 22:07:53 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (store_field): If storing a record on big endian targets, + set up so we store the high-order bits. + (expand_expr, case COMPONENT_REF): Likewise for loads. + +Thu Sep 5 14:59:47 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.h (LEGITIMIZE_ADDRESS): Define nonempty. + +Thu Sep 5 10:43:36 1996 Jeffrey A Law (law@cygnus.com) + + * pa.md (movsi, movdi, movsf patterns): Handle + 'R' constraints as needed. + +Wed Sep 4 17:13:28 1996 Bob Manson <manson@charmed.cygnus.com> + + * except.c: (add_partial_entry): New routine. + (expand_start_try_stmts): Moved from cp/except.c. + (expand_start_all_catch): Move functionality of expand_end_try_stmts + here. + +Wed Sep 4 12:30:02 1996 Mike Stump <mrs@cygnus.com> + + * except.c (emit_unwinder): Ensure that CLOBBER and USE insns come + last, if present. + +Tue Sep 3 12:01:43 1996 Ian Lance Taylor <ian@cygnus.com> + + * configure (sh-*-elf*): New target. + * sh/elf.h: New file. + +Fri Aug 30 17:52:26 1996 Jim Wilson <wilson@cygnus.com> + + * dwarf2out.c (gen_formal_types_die): Delete extra argument from + gen_type_die call. + +Fri Aug 30 15:40:40 1996 James G. Smith <jsmith@cygnus.co.uk> + + * mips/elf64.h: Allow MULTILIB_DEFAULTS to be defined + before this file is included. + +Fri Aug 30 15:00:06 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md: (movsicc,movhicc): Allow reload from memory. + + * i386.c (override_options): Don't thread the prologue if profiling. + +Fri Aug 30 15:00:06 1996 James Hawtin <cgjwh@sunrise.co.uk> + + * i386/t-sol2 (gcrt1.o): Added for profiling Solaris 2 + * i386/sol2.h (STARTFILE_SPEC): New. + * i386/gmon-sol2.c, i386/sol2-gc1.asm: New files. + +Thu Aug 29 22:08:03 1996 Jim Wilson <wilson@cygnus.com> + + * except.c (add_eh_table_entry): Multiply realloc size by sizeof int. + +Thu Aug 29 15:15:31 1996 Jeffrey A Law (law@cygnus.com) + + * pa.md (fcmp patterns): Don't try to eliminate useless add,tr + insns here. + * pa.c (pa_reorg): Do elimination of useless add,tr insns here instead. + (print_operand, case 'y'): Remove this code. + +Wed Aug 28 16:19:34 1996 Doug Evans <dje@cygnus.com> + + * toplev.c (print_single_switch): Ultrix fprintf returns 0 for success. + + * toplev.c (main): Rewrite -g parsing. + +Mon Aug 26 16:15:49 1996 Fred Fish <fnf@cygnus.com> + + * Makefile.in (objc-parse.y): Fix typo in name of temp file. + +Mon Aug 26 14:08:37 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (mark_all_temps_used): Fix error in last change. + +Sun Aug 25 22:27:19 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (mark_all_temps_used): New function. + +Fri Aug 23 11:34:57 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Fixes to make -fPIC + really the same as -mrelocatable. + (ASM_SPEC): Pass -K PIC to the assembler if -fpic/-fPIC. + + * rs6000/sol2.h (ASM_CPU_SPEC): Remove passing -K PIC to the + assembler if -fpic/-fPIC. + + * bi-{arity,opcode,opname}.c (fancy_abort): Define, so that + -Dabort=fancy_abort works again. + +Thu Aug 22 11:39:34 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/t-ppcgas ({stmp,install}-crt): Only build and install the + eabi ecrt[in].o object files in eabi multilib directories, only + build and install the solaris scrt[in0].o object files in solaris + directories. + (MULTILIB_MATCHES): Remove matches for solaris, linux to other + switches. + +Tue Aug 20 18:49:55 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (ASM_OUTPUT_SECTION_NAME): If -mrelocatable or + -mrelocatable-lib, don't make read-only sections, since if there + are pointers to be fixed up, the assembler complains. + +Mon Aug 19 18:42:13 1996 Doug Evans <dje@cygnus.com> + + * sparc.h ({MASK,TARGET}_LITTLE_ENDIAN): Define. + (LIBGCC2_WORDS_BIG_ENDIAN): Add little endian support. + * sparc/sp64-elf.h ({CPP,ASM,LINK}_SPEC): Add little endian support. + (SUBTARGET_SWITCHES): Recognize -m{big,little}-endian. + ({BYTES,WORDS}_BIG_ENDIAN): Likewise. + * sparc/splet.h (SUBTARGET_SWITCHES): Recognize -m{big,little}-endian. + ({CPP,ASM,LINK}_SPEC): Add little endian support. + ({BYTES,WORDS}_BIG_ENDIAN): Likewise. + * sparc/t-splet (MULTILIB_{OPTIONS,DIRNAMES}): Likewise. + + * sparc/lynx-ng.h (CPP_SPEC): Use %(cpp_cpu). + +Sat Aug 17 15:23:39 1996 Geoffrey Noer <noer@cygnus.com> + + * i386/cygwin32.h (CPP_PREDEFINES): Define _WIN32, not WIN32. + Define only __CYGWIN32__, not CYGWIN32 or __CYGWIN32. + * rs6000/cygwin32.h (CPP_PREDEFINES): Likewise. + * cccp.c (absolute_filename): Drive specifiers make the pathname + absolute in cygwin32. + * choose-temp.c: Delete !defined(_WIN32) condition when including + sys/file.h (NO_SYS_FILE_H is still used). + * gcc.c: Change ifndef _WIN32 to ifndef NO_SYS_FILE_H when deciding + whether to include sys/file.h. + (execute): -pipe is supported for cygwin32. + * getopt.c: Change win32 test from WIN32 to _WIN32. + * pexecute.c: Update test for win32 (&& ! cygwin32). + * protoize.c: Likewise. + (kill): Delete decl. + * toplev.c: Update test for win32 (&& ! cygwin32). + * ginclude/stdarg.h: Change __WIN32__ to _WIN32. + * ginclude/varargs.h: Likewise. + * ginclude/va-ppc.h: Likewise. + +Fri Aug 16 16:02:09 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (rs6000_got_register): Make sure pic_offset_table_rtx + allocated, even if current_function_uses_pic_offset_table set. + +Fri Aug 16 15:56:04 1996 J. Kean Johnston <hug@netcom.com> + + * i386/sco5.h (CLASS_LIKELY_SPILLED_P): Deleted. + (STARTFILE_SPEC): Insert crtbegin.o in correct place, and correct + versions of values-X?.o. + (SWITCH_TAKES_ARG): Extend DEFAULT_SWITCH_TAKES_ARG, not replace. + (CPP_SPEC): Add -Di386, and correctly include extra directories. + Define HAVE_ATEXIT in ELF mode for global destructors. + +Thu Aug 15 16:42:44 1996 Doug Evans <dje@cygnus.com> + + * sparc.c (label_ref_operand): New function. + (emit_move_sequence): Pass label_ref to gen_move_label_di to not + lose flags. + * sparc.md (move_label_di): Operand one is label_ref now. + * genattrtab.c (write_test_expr): Allow label_ref in match_dup. + + * sys-protos.h (gethostid): Make return type `int' ifdef __alpha__. + * gen-protos.c: Delete support for SYS_PROTO_OVERRIDES. + * alpha.h (SYS_PROTO_OVERRIDES): Delete. + +Thu Aug 15 17:36:09 1996 Mike Stump <mrs@cygnus.com> + + * libgcc2.c (__throw): New routine. + (__eh_pc): New data object for exception handling. + + * except.c (eh_saved_pc): New object so we can call + assemble_external. + (expand_internal_throw_indirect): Call assemble_external for __eh_pc. + (end_eh_unwinder): Likewise. + (init_eh): Initialize eh_saved_pc. + +Thu Aug 15 13:02:42 1996 Mike Stump <mrs@cygnus.com> + + * arm.h (RETURN_ADDR_RTX): Define. + + * expr.c (expand_builtin_return_addr): Fix order of parameters. + +Wed Aug 14 19:48:00 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu> + + * stmt.c (expand_return): In code for doing scc with jumps, + stick to default handling if we have corresponding scc pattern. + +Wed Aug 14 10:31:28 1996 Jeffrey A Law (law@cygnus.com) + + * pa.c (override_options): Treat TARGET_FAST_INDIRECT_CALLS + just like TARGET_NO_SPACE_REGS. + (output_millicode_call): Likewise. + * pa.h (TARGET_FAST_INDIRECT_CALLS): Define. + (TARGET_SWITCHES): Add "fast-indirect-calls". + * pa.md: Treat TARGET_FAST_INDIRECT_CALLS just like + TARGET_NO_SPACE_REGS in various call/millicode call patterns. + + * pa.c (print_operand): Use the right comparison operator + for reversed EQ and NE comparisons. + + * pa.h (OUTPUT_MI_THUNK): Define. + +Wed Aug 14 11:40:49 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * ginclude/va-ppc.h: Add Windows NT support. + * ginclude/{varargs,stdarg}.h: For PowerPC Windows NT, include + va-ppc.h, instead of using the default handling. + +Tue Aug 13 18:30:10 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixincludes: Remove duplicate volatile from sig_atomic_t in AIX + sys/signal.h + +Tue Aug 13 16:51:37 1996 Jim Wilson <wilson@cygnus.com> + + * i960-coff.h (LIB_SPEC): Undef. + + * sh.h (PROFILE_BEFORE_PROLOGUE): Define. + +Tue Aug 13 11:36:02 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * gcc.c (set_spec,process_command): Dump and load the compiler + version number in the specs file. + + * rs6000.c (output_toc): Fix last change, so that it doesn't use + an uninitialized variable if -mminimal-toc. + (output_prolog): Increment probe_labelno after last use. + + * rs6000/t-ppcgas (MULTILIB_*): Build far fewer multilib + libraries. Build all libraries with -mrelocatable-lib and + -mno-eabi. Build special Linux and Solaris libraries. + * rs6000/eabi{,aix,le}.h (MULTILIB_DEFAULTS): Adapt to changes in + t-ppcgas. + * rs6000/(linux,sol2).h (MULTILIB_DEFAULTS): Ditto. + * rs6000/{sysv4,sysv4le} (MULTILIB_DEFAULTS): Ditto. + +Tue Aug 13 11:36:02 1996 Jeffrey A Law (law@cygnus.com) + + * rs6000.c (handle_mac_pragma): Initialize "psize". + +Mon Aug 12 18:14:35 1996 Jim Wilson <wilson@cygnus.com> + + * gcc.c (used_arg): Initialize cnt to zero. + +Mon Aug 12 14:03:16 1996 Jim Wilson <wilson@cygnus.com> + + From Mike Stump: + * sh.c (regno_reg_class): Change entry 23 from NO_REGS to GENERAL_REGS. + (initial_elimination_offset): New variable live_regs_mask. Add + code to handle RETURN_ADDRESS_POINTER_REGNUM. + * sh.h (RAP_REG, RETURN_ADDRESS_POINTER_REGNUM): Define. + (ELIMINABLE_REGS): Add RETURN_ADDRESS_POINTER_REGNUM support. + (RETURN_ADDR_RTX): Define. + (REGISTER_NAMES): Add rap. + + * iris5.h (DOLLARS_IN_IDENTIFIERS): Undefine. + + * m68kemb.h (LIB_SPEC): Always emit -lc. + +Mon Aug 12 12:30:25 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (rs6000_got_register): Test variable + current_function_uses_pic_offset_table to see whether or not a GOT + register has been created already. + + * Makefile.in (multilib.h): Move to stamp-mlib. + (stamp-mlib): Use move-if-change to conditionally update + multilib.h. Pass MULTILIB_EXTRA_OPTS to genmultilib. + (STAGESTUFF): Add stamp-mlib. + (mostlyclean): Delete tmp-mlib.h. + + * genmultilib: Take a fifth argument to add options to pass on to + all multilib builds. Restructure output so that we pass the + synonym switches and extra arguments separately, and not + exponentially slow down genmultilib. + + * gcc.c (toplevel): Rearrange multilib support so that we support + passing the synonyms separately from the normal switches. Add + support for passing additional switches to be used on all multilib + builds. Dump and restore the value of MULTILIB_DEFAULTS so that + gcc cover programs for other targets will correctly chose the + appropriate multilib directory. + (setspec,process_command,main): Ditto + (used_arg,default_arg,print_multilib_info): Ditto. + +Mon Aug 12 07:46:47 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (expand_builtin, case BUILT_IN_SETJMP): Add test + and call for nonlocal_goto_receiver pattern. + * stmt.c (expand_end_bindings): Likewise. + + * stmt.c (expand_asm_operands): Fix off-by-one error when + scanning constraints. + +Sun Aug 11 22:48:02 1996 Jason Merrill <jason@yorick.cygnus.com> + + * expr.c (store_expr): Handle COND_EXPR cleanups like expand_expr. + +Sun Aug 11 22:42:36 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * optabs.c (expand_abs): When OP0 and TARGET are the same + pseudo register, it is safe to use TARGET. + + * local-alloc.c (reg_equiv_replace): New variable. + (update_equiv_regs): Set reg_equiv_replacement for all REG_EQUIV + notes encountered or generated. + +Sun Aug 11 22:27:14 1996 Scott Christley <scottc@net-community.com> + + * objc/hash.c (hash_is_key_in_hash): Function somehow got lost. + +Sun Aug 11 21:43:15 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * ginclude/stddef.h (__need_wint_t): Move #undef to right place. + +Sun Aug 11 17:46:22 1996 J"orn Rennecke <amylaar@cygnus.co.uk> + + * c-decl.c (finish_struct): If pedantic, also warn if struct/union + has no named members. + +Sun Aug 11 17:32:52 1996 Joel Sherrill <joel@OARcorp.com> + + * i386/rtems.h: Renamed from i386/i386-rtems.h + * i960/rtems.h: Renamed from i960/i960-rtems.h + * m68k/rtems.h: Renamed from m68k/m68k-rtems.h + * rs6000/rtems.h: Renamed from rs6000/powerpc-rtems.h + * sparc/rtems.h: Renamed from sparc/sparc-rtems.h + * config/t-rtems: New file. + * configure (i386-*-rtems*): Added t-rtems to tmake_file. + Renamed i386/i386-rtems.h to i386/rtems.h. + (i960-*-rtems*): Added t-rtems to tmake_file. + Renamed i960/i960-rtems.h to i960/rtems.h. + Added original tm.h file and dbxcoff.h. + (m68k-*-rtems*): Added t-rtems to tmake_file. + Renamed m68k/m68k-rtems.h to m68k/rtems.h. + (powerpc-*-rtems*): Added t-rtems to tmake_file. + Renamed rs6000/powerpc-rtems.h to rs6000/rtems.h. + (sparc-*-rtems*): Added t-rtems to tmake_file. + Renamed sparc/sparc-rtems.h to sparc/rtems.h. + +Fri Aug 9 16:05:13 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md: (untyped_call) Avoid SIGFPE. + + * i386.c (output_float_compare): Don't try to initialize + aggregate local variable; use assignment statements instead. + + * i386.h (RTX_COSTS): rtx_cost should pass two parameters. + + * i386/go32.h (ASM_OUTPUT_SECTION_NAME): New. + +Fri Aug 9 16:00:11 1996 Jim Wilson <wilson@cygnus.com> + + * winnt.c (gen_stdcall_suffix): Round parameter size to PARM_BOUNDARY. + +Thu Aug 8 17:42:35 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (output_toc): If we are emitting a reference to a + vtable, don't put in the section name, just use the symbol. + +Wed Aug 7 19:03:36 1996 Jim Wilson <wilson@cygnus.com> + + * sh.md (casesi_jump): New pattern. + (casesi): Generate RTL to match it. + +Wed Aug 7 14:10:07 1996 Jason Merrill <jason@yorick.cygnus.com> + + * ginclude/stddef.h (NULL): Use __null for G++. + +Tue Aug 6 17:37:53 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (STACK_BOUNDARY): Always define as 64. + (ABI_STACK_BOUNDARY): Define as 64/128 based on the -mno-eabi + switch. + + * rs6000.c (rs6000_stack_info): Use ABI_STACK_BOUNDARY, not + STACK_BOUNDARY. Define ABI_STACK_BOUNDARY as STACK_BOUNDARY #ifndef. + +Tue Aug 6 14:29:43 1996 Doug Evans <dje@fallis.cygnus.com> + + * gen-protos.c (overrides): New static local. + (add_hash,parse_fn_proto): New static functions. + (main): Add prototypes from SYS_PROTO_OVERRIDES to hash table before + parsing sys-protos.h. Reserve entry 0 in std_protos. + * alpha.h (SYS_PROTO_OVERRIDES): Define. + +Mon Aug 5 16:53:36 1996 Doug Evans <dje@fallis.cygnus.com> + + * sparc/t-splet (MULTILIB_OPTIONS): Add mbroken-saverestore. + (MULTILIB_DIRNAMES): Add brknsave. + + * stor-layout.c (layout_record): Correct overflow test for 0 sized + fields. + +Mon Aug 5 16:12:19 1996 Jim Wilson <wilson@cygnus.com> + + * alpha.c (alpha_output_filename): When emitting stabs, don't + disable them if using GNU as. + (alpha_output_lineno): Likewise, when not using GNU as. + + * sh.c (arith_reg_operand): Reject SUBREG of an invalid hard reg. + + * sparc/lite.h (aoutos.h): Don't include it. + * configure (sparclite-*-aout*): Add aoutos.h to tm_file. + +Sat Aug 3 23:13:55 1996 Jeffrey A Law (law@cygnus.com) + + * combine.c (rtx_equal_for_field_assignment_p): Check for + get_last_value returning (CLOBBER (CONST_INT 0)). + +Sat Aug 3 20:19:14 1996 Jim Wilson <wilson@cygnus.com> + + * i960.md (subsi3+1): Handle case where first operand is constant + but second operand is not. + + * m68k/vxm68k.h (WCHAR_TYPE_SIZE): Undef, then define to 16. + +Fri Aug 2 15:46:19 1996 Jeffrey A Law (law@cygnus.com) + + * pa/pa-hpux.h (LINK_SPEC): Don't link in PA1.1 specific + libraries when creating shared libraries. + * pa/pa-hpux9.h, pa/pa-hpux10.h: Likewise. + +Fri Aug 2 13:36:42 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (output_float_compare): fcomi should be followed by the + correct conditional jump instead of fcom/pfstsw/and/jne + (override_options): Added -mbranch-cost to set BRANCH_COST. + + * i386.md (sgt+1,slt+1,sge+1,sle+1,bgt+1,blt+1,bge+1,ble+1,bleu+4) + Added TARGET_CMOVE check for fcomi. + (movsicc_1+1,movhicc_1+1): Added to handle the general case. + + * i386.h (i386_branch_cost, i386_branch_cost_string): Added. + +Fri Aug 2 11:53:55 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * sparc/vxsparc.h (CPP_PREDEFINES): Add `-DCPU=SPARC'. + +Thu Aug 1 23:56:01 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (ASM_OUTPUT_INT): Remove all hacks for exception table. + +Thu Aug 1 10:08:14 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu> + + * m68k.h (RTX_COSTS, case PLUS): Get operand order right. + +Wed Jul 31 15:06:46 1996 Doug Evans <dje@cygnus.com> + + * sparc.md (negtf2,abstf2): Fix v9 case. + +Wed Jul 31 09:49:25 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (ASM_OUTPUT_INT): Use an 'E%' prefix for items in + the exception table if TARGET_GAS && ! TARGET_PORTABLE_RUNTIME. + +Tue Jul 30 15:37:31 1996 Jim Wilson <wilson@cygnus.com> + + * i386/cygwin32.h (dbxcoff.h): Include. + (DBX_DEBUGGING_INFO, SDB_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE): + Move definitions before include of dbxcoff.h. + (ASM_OUTPUT_SOURCE_LINE, DBX_OUTPUT_MAIN_SOURCE_FILE_END): Delete. + (DBX_BLOCKS_FUNCTION_RELATIVE, DBX_FUNCTION_FIRST): Delete. + +Tue Jul 30 15:03:53 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu> + + * i960.md (eq reg (const_int 0)): New pattern. + +Tue Jul 30 11:15:44 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (RETURN_ADDR_RTX): Offset is -20 from the frame, not +20! + +Mon Jul 29 12:16:17 1996 Jeffrey A Law (law@cygnus.com) + + * pa.h (GO_IF_LEGITIMATE_ADDRESS): Fix thinko in last change. + +Fri Jul 26 18:19:47 1996 Doug Evans <dje@cygnus.com> + + * dwarfout.c (output_bound_representation): Fix typo. + +Thu Jul 25 16:00:10 1996 Mike Stump <mrs@cygnus.com> + + * expr.c (do_jump, case TRUTH_ORIF_EXPR): Ensure end of an + exception region comes after its start. + (do_jump, case TRUTH_ANDIF_EXPR): Likewise. + +Thu Jul 25 13:36:42 1996 Stan Cox <coxs@equinox> + + * i386.c (output_float_compare): Added support for Pentium Pro + fcomi instruction which sets EFLAGS instead of FPU Status Word. + +Wed Jul 24 21:48:08 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * cse.c (canon_hash, cse_insn): MEM is not unchanging if it is + in the frame (since the temp slot might be reused). + +Wed Jul 24 17:34:06 1996 J"orn Rennecke (amylaar@cygnus.com) + + * sh.md (branch_true, branch_false, inverse_branch_true): Express + tests of the T bit as comparisons against zero, rather than one. + (inverse_branch_false, beq, bne, bgt, blt, ble, bge, bgtu): Likewise. + (bltu, bgeu, bleu, casesi): Likewise. + +Wed Jul 24 15:58:06 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md: (mov{sf,df,xf}cc{,_1}): New patterns for P6 FP cmove. + * i386.c (put_condition_code, print_operand, output_fp_cc0_set): + Support fcmov suffixes. + +Wed Jul 24 10:53:38 1996 Jeffrey A Law (law@cygnus.com) + + * pa.c (move_operand): Relax "mode" test. Allow scaled + indexed addressing modes. + (output_fp_move_double): Tweak output strings to work with updated + 'F' and 'M' output modifiers. + (print_operand): Collapse 'F' and 'M' into a single hunk of code. + For auto-increment modes output "s,ma" and "s,mb". + For scaled indexing modes output "x,s" + For other addresses, output nothing for 'M' and "s" for 'F'. + * pa.h (EXTRA_CONSTRAINT): Don't accept scaled indexed addresses + for 'Q' and 'T'. Do accept scaled indexed addresses for 'R'. + (GO_IF_LEGITIMATE_ADDRESS): Accept scaled indexed addresses + for SFmode and DFmode. + * pa.md: Remove all scaled indexed load patterns. + (movsi patterns): Accept scaled indexed addresses in some + cases. Update output strings for updated 'M' and 'F' output modifiers. + (movhi, movqi, movsf, movdf, movdi patterns): Likewise. + +Tue Jul 23 23:10:41 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.h (struct tree_int_cst): Add field for TREE_CST_RTL. + * varasm.c (decode_addr_const, output_constant_def): AllowINTEGER_CST. + +Tue Jul 23 16:42:09 1996 Jim Wilson <wilson@cygnus.com> + + * sh.c (reg_unused_after): Handle JUMP_INSN inside a sequence. + +Tue Jul 23 16:33:25 1996 Mike Stump <mrs@cygnus.com> + + * Make exception handling work better when optimizations are on. + * except.c, except.h: New files. + * Makefile.in (OBJS): Add except.o. + (except.o): Add. + (stmt.o, final.o): Add except.h. + * rtl.c (note_insn_name): Add NOTE_INSN_EH_REGION_{BEG,END}. + * rtl.h: Likewise. + * arm.h (MASK_RETURN_ADDR): Define. + * pa.h (MASK_RETURN_ADDR, RETURN_ADDR_RTX): New macros. + * sparc.h (DOESNT_NEED_UNWINDER): Define if not doing a flat function. + * mips.h (RETURN_ADDR_RTX): Improve. + * vax.h (RETURN_ADDR_RTX): Improve. + * toplev.c (rest_of_compilation): Use find_handler_labels. + (main, interim_eh{,_hook}): Remove interim_eh_hook support. + (flag_exceptions): New flag; also add to table. + (compile_file): Emit the exception table in the backend now. + * final.c (final_scan_insn): Support ASM_OUTPUT_EH_REGION_{BEG,END}. + (final_scan_insn): Redo handler labels, implement + NOTE_INSN_EH_REGION_BEG and NOTE_INSN_EH_REGION_END and use them + instead of CODE_LABELs. + (final): Add call to check_handler_labels. + * libgcc2.c (L_eh): Add support for EH_TABLE_LOOKUP. + * sparc.md (return): Add a reference to the return address register. + * flow.c (find_basic_blocks): Add support for handler_labels. + * loop.c (find_and_verify_loops): Likewise. + * jump.c (jump_optimize): Likewise. + Add call to check_handler_labels. Add call to exception_optimize. + * sched.c (sched_analyze): Smuggle exception region notes around. + (unlink_notes, reemit_notes, schedule_block): Likewise. + (sched_analyze): Add extra element since we remove two at a time. + * integrate.c (save_for_inline_copying): Add support for exception + regions. + (expand_inline_function): Likewise. + (function_cannot_inline_p): Don't inline functions that have EH + regions before NOTE_INSN_FUNCTION_BEG. + (finish_inline): Use FIRST_FUNCTION_INSN, not NEXT_INSN. + * function.c (expand_start_all_catch): New function. + * function.h: Add exception handling support information. + * expr.c (expand_expr, {defer,expand}_cleanups_to, do_jump): Transform + interim_eh_hook into calls to expand_ehregion_{start,end}. + * stmt.c (expand_{decl_cleanup,cleanups}): Likewise. + (init_stmt_for_function): Call init_eh. + (save_stmt_status): Call save_eh_status. + (restore_stmt_status): Call restore_eh_status. + * expr.h (throw_libfunc): Add. + * optabs.c (throw_libfunc): Initialize. + * print-rtl.c (print_rtx): Add support for exception regions. + * rs6000.c (EXCEPTION_SECTION): Define. + * output.h (exception_section): Declare. + * varasm.c (exception_section): Define. + * i386.c, i960.c, rs6000.c: Include except.h for function.h. + * c-pragma.c, emit-rtl.c, expr.c, final.c, flow.c: Include except.h. + * function.c, integrate.c, jump.c, loop.c, objc-act.c: Likewise. + * stmt.c, stor-layout.c, toplev.c, tree.c, varasm.c: Likewise. + +Tue Jul 23 12:32:54 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (rs6000_replace_regno): Set pic_offset_table_rtx so + that other phases will use the PIC register instead of the + placeholder. + + * rs6000.md (movsi_got*): Eliminate -fPIC code, keep -fpic code. + (movsi): Only call movsi_got if -fpic, not -fPIC. + + * sysv4.h (OVERRIDE_OPTIONS): Improve error messages. Always set + -msdata=data by default, even if -fpic/-fPIC/-mrelocatable. Treat + -fPIC the same as -mrelocatable-lib and vica versa. + + * t-ppcgas: (MULTILIB_*): Use -mreloctable-lib, instead of + -mrelocatable. Map Solaris into mcall-sysv-noeabi case. Build + -mrelocatable-lib libraries under non-eabi case. When linking, if + -fpic, -fPIC, or -shared, link in the -mrelocatable-lib libraries. + +Mon Jul 22 19:34:20 1996 Jim Wilson <wilson@cygnus.com> + + * iris6.h (ASM_SPEC): Change {% to %{. + + * dwarf2out.c (output_call_frame_info): Change FDE CIE offset to + be section name rather than 0. + (gen_subprogram_die): Only emit DW_AT_external if origin is NULL. + Only call equate_decl_number_to_die if origin is NULL. + (dwarfout_begin_function): In code that computes offset of frame + pointer, change 4 to UNITS_PER_WORD. + + * combine.c (undo_all): Clear previous_undos field. + +Mon Jul 22 19:10:45 1996 Ian Lance Taylor <ian@cygnus.com> + + * configure: Don't change target_alias to target in Makefile. + +Sat Jul 20 09:28:38 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * dwarfout.c (output_bound_representation): Treat default case + as variable bounds, then look inside for SAVE_EXPR. + + * mips.h (INITIALIZE_TRAMPOLINE): Use `_flush_cache'; flush data + cache too. + +Sat Jul 20 09:24:13 1996 Marco Walther (Marco.Walther@mch.sni.de). + + * configure (mips-sni-sysv4): New target. + * mips/sni-gas.h, mips/sni-svr4.h, mips/x-sni-svr4: New files. + +Fri Jul 19 17:44:13 1996 Stan Coxs <coxs@dg-rtp.dg.com> + + * i386.md: (leave): Clobbers esp and ebp. + + * i386.h: (TARGET_USE_Q_REG): Support inline strlen on PentiumPro + +Fri Jul 19 15:56:18 1996 Ian Lance Taylor <ian@cygnus.com> + + * m68k/t-m68kbare (MULTILIB_OPTIONS): Add m5200. + (MULTILIB_EXCEPTIONS): Define. + * m68k/lb1sf68.asm: Add MCF5200 support. + * m68k.md (adddi_sexthishl32): Set condition to !TARGET_5200. + (subdi_sexthishl32, ashrdi3, ashrhi3): Likewise. + (negdi2): Change into define_expand. + (negdi2_internal): Rename from old negdi2; condition now !TARGET_5200. + (negdi2_5200): New insn. + * m68k.c (output_function_prologue): Don't use add.w if TARGET_5200. + (output_function_epilogue): Likewise. + + * m68k.md (movqi): Remove complex cases which move between address reg + and memory; rely on secondary reloads instead. + +Fri Jul 19 12:22:50 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * fixproto (std_files): Add utime.h. + +Fri Jul 19 10:59:46 1996 Jeffrey A Law (law@cygnus.com) + + * m68k/m68kemb.h: Remove '\' at EOF. + +Fri Jul 19 09:59:00 1996 Joel Sherrill <joel@OARcorp.com> + + * m68k/coff.h (STARTFILE_SPEC): Add #undef before definition. + +Fri Jul 19 09:44:45 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * m68k.h (LEGITIMATE_INDEX_P): Coldfire does not have scale + by 8 addressing modes. + + * m68k-none.h: Use MASK_* macros instead of explicit constants. + +Fri Jul 19 09:08:53 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.md (negdi2): Undo last change: don't apply neg to address regs. + +Fri Jul 19 09:03:01 1996 Robert Wilhelm (rwilhelm@Physik.TU-Muenchen.DE) + + * toplev.c (main): Correct typo in error message. + +Thu Jul 18 20:29:33 1996 Jim Wilson <wilson@cygnus.com> + + * Makefile.in (OBJS): Add dwarf2out.o. + (dwarf2out.o): New rule. + * dwarf2.h, dwarf2out.c: New files. + * dwarfout.c: Check DWARF_VERSION macro. + + * mips/iris6.h (DWARF_DEBUGGING_INFO, PREFERRED_DEBUGGING_TYPE): + Move after header files are included. + (iris5.h): Include instead of iris5gas.h. + (MACHINE_TYPE): Change 5.x to 6.x. + (DEBUG_SECTION, LINE_SECTION): Add debug_ to name, fix attributes. + (SFNAMES_SECTION, SRCINFO_SECTION, MACINFO_SECTION, PUBNAMES_SECTION, + ARANGES_SECTION): Fix attributes. + (DWARF_VERSION, MIPS_DEBUGGING_INFO, ASM_DECLARE_FUNCTION_NAME, + ASM_DECLARE_FUNCTION_SIZE, FUNCTION_NAME_ALREADY_DECLARED, + FRAME_SECTION, ABBREV_SECTION): Define. + (DBX_DEBUGGING_INFO, SDB_DEBUGGING_INFO, MIPS_DEBUGGING_INFO, + DWARF_DEBUGGING_INFO, PREFERRED_DEBUGGING_INFO): Delete undefs at + end of file. + * mips/mips.c (function_prologue): Use FUNCTION_NAME_ALREADY_DECLARED. + (function_epilogue): Likewise. + +Thu Jul 18 19:24:19 1996 David Mosberger-Tang <davidm@azstarnet.com> + + * alpha/elf.h (INT_ASM_OP): Change from ".long" to ".quad". + +Thu Jul 18 19:20:58 1996 Ulrich Drepper <drepper@myware.rz.uni-karlsruhe.de> + + * stddef.h: Undefine __need_wint_t. + +Thu Jul 18 19:06:35 1996 J.T. Conklin <jtc@hippo.cygnus.com> + + * longlong.h (mc680x0): Define umul_ppmm, udiv_qrnnd, sdiv_qrnnd + for the '020, '030, '040, and '332. Define count_leading_zeros + for the '020, '030, '040, and '060. + + * m68k.md: Add TARGET_5200 to conditions which determine whether + the extbl instruction is emitted. + (mulsi3): Enable pattern with TARGET_5200. + + * m68k.md (add patterns): Don't use two addqw instructions when + adding small (8 < N <= 16) integers to address registers on 68040. + +Thu Jul 18 18:06:15 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure: Write target_alias in Makefile. + (i[3456]86-*-sco3.2v4*): Set truncate_target. + * Makefile.in (target_alias): New and used for all current uses + of `target'. + +Thu Jul 18 17:46:02 1996 Dave Love <d.love@dl.ac.uk> + + * gcc.c (default_compilers): Extra Fortran extensions. + +Wed Jul 17 10:28:10 1996 Torbjorn Granlund <tege@spiff.gnu.ai.mit.edu> + + * expmed.c (expand_mult_highpart): Revert last change. + +Tue Jul 16 12:51:59 1996 Doug Evans <dje@cygnus.com> + + * sparc/sparc-rtems.h: #include "sparc/sparc-aout.h" -> sparc/aout.h. + +Mon Jul 15 14:42:06 1996 Jim Wilson <wilson@cygnus.com> + + * mips/iris6.h (LINK_SPEC): Add -woff 84. + +Fri Jul 12 17:34:01 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/eabi.asm (__eabi): Convert pointers in the Global Offset + Table if -mrelocatable. Move loops into separate subroutines for + ease of debugging. Reorganize code somewhat. + + * rs6000/rs6000.c (small_data_operand): Allow small data under + Solaris. + + * rs6000/sol-c0.c (_start): Initialize r13 to point to the small + data operand. + + * rs6000/sol-c{i,n}.asm (_init, _fini): Enable shared library + support. + + * rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Default to + -msdata=data, even if -fpic or -mrelocatable. Allow -mrelocatable + and -mno-eabi. + (CPP_SYSV_SPEC): If -fpic, define __PIC__ and __pic__ to 1. If + -fPIC, define them to 2. + (CPP_ENDIAN_SPEC): Push definition of macros for specific endian + targets to new specs. + (CPP_ENDIAN_DEFAULT_SPEC): Define to use CPP_ENDIAN_BIG_SPEC. + (CPP_ENDIAN_{LITTLE,BIG,SOLARIS}_SPEC): New specs for little + endian mode, big endian mode, and Solaris, which can't define + _LITTLE_ENDIAN. Define __LITTLE_ENDIAN__ in all cases for little + endian systems. Define __BIG_ENDIAN__ in all cases for big endian + systems. + (SUBTARGET_EXTRA_SPECS): Add new specs. + + * rs6000/{eabile,sysv4le}.h (CPP_ENDIAN_DEFAULT_SPEC): Define to + use CPP_ENDIAN_LITTLE_SPEC. + + * rs6000/sol2.h (CPP_ENDIAN_LITTLE_SPEC): Define as + CPP_ENDIAN_SOLARIS_SPEC so that _LITTLE_ENDIAN is not define. + +Fri Jul 12 17:34:01 1996 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000.c (function_arg): Add IBM AIX XL compiler broken FP arg + passing compatibility mode. + * rs6000.h (TARGET_XL_CALL): Define default. + * aix3newas.h (TARGET_XL_CALL, SUBTARGET_SWITCHES): Define. + * aix41.h (TARGET_XL_CALL, SUBTARGET_SWITCHES): Define. + +Fri Jul 12 15:04:43 1996 Doug Evans <dje@cygnus.com> + + * arm/arm.h (ASM_OUTPUT_MI_THUNK): Handle fns returning structures. + + * ptx4.h ({ASM,LINK}_SPEC): %{V} %{v:%{!V:-V}} -> %{v:-V}. + * svr4.h ({ASM,LINK}_SPEC): Likewise. + * dsp16xx/dsp16xx.h ({ASM,LINK}_SPEC): Likewise. + * i386/dgux.h (LINK_SPEC): Likewise. + * i386/sol2.h (LINK_SPEC): Likewise. + * m88k/dgux.h ({LINK,ASM_CPU}_SPEC): Likewise. + * sparc/sol2.h ({ASM,LINK}_SPEC): Likewise. + * sparc/sp64-elf.h ({ASM,LINK}_SPEC): Likewise. + * sparc/sysv4.h (ASM_SPEC): Likewise. + +Thu Jul 11 17:29:33 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.h (GOT_TOC_REGNUM): New macro for r2, which is used as a + marker for the GOT/TOC register to be allocated later. + (MACHINE_DEPENDENT_REORG): Call rs6000_reorg. + (rs6000_reorg): Add declaration. + + * rs6000.c (rs6000_got_register): Return REG 2, not a pseudo + register in order to work with inlined functions. + (rs6000_replace_regno): New function to replace a register with a + new pseudo register. + (rs6000_finalize_pic): Loop through all of the insns, replacing + any GOT_TOC_REGNUM registers with a new pseudo register, and + adding the initialization of of the GOT register if it was + created. + (rs6000_reorg): New function to check whether the GOT_TOC register + marker was removed. + +Thu Jul 11 10:12:50 1996 Jeffrey A Law (law@cygnus.com) + + * h8300/h8300.h (OK_FOR_U): If generating H8/S code, accept + SYMBOL_REF and SYMBOL_REF + CONST_INT. + + * h8300/h8300.c (shift_one): Emit tabs between opcode and + operands to be consistent with the rest of the compiler. + (rotate_one): Likewise. + (shift_two, rotate_two): Define. + (get_shift_alg): Accept new argument "assembler2_p" for + rotate/shift by two insns. All callers changed. Rework + to generate more efficient code on the H8/300, H8/300H, and + H8/S. Try to simplify somewhat. + (emit_a_shift): Use shift-by-two insns when they're available. + Emit tabs between opcode and operands to be consistent with + the rest of the compiler. + +Wed Jul 10 19:32:17 1996 Jim Wilson <wilson@cygnus.com> + + * mips/iris6.h (ASM_SPEC): Correct typos in Jun 18 change. + +Wed Jul 10 18:56:38 1996 Ian Lance Taylor <ian@cygnus.com> + + * sh/sh.c (machine_dependent_reorg): When looking for the + instruction that sets a register in LOG_LINKS, skip the link if + REG_NOTE_KIND is not zero. + +Wed Jul 10 15:02:18 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (rs6000_got_register): New function to return a pseudo + register to hold the pic register. Abort if reload is in progress + or done. + (num_insns_constant): Allow SFmode and DFmode. + + * rs6000.h (CONST_DOUBLE_OK_FOR_LETTER_P): Redo 'G' so that it + means a constant that takes exactly two insns. + (rs6000_got_register): Add declaration. + + * rs6000.md (movsi_got): Move setup of pic register to + rs6000_got_register. + (movsf): If -msoft-float, don't force constants to memory. + (mov{sf,df} insns): If soft floating point, allow any constant to + be loaded. Add define_splits that allow the 604 to use both + integer units for loading constants. Make sure insn length is + correct. + +Tue Jul 9 17:05:10 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (easy_fp_constant): All FP constants are considered + hard for -fpic and hardware floating point, so that the GOT + register is created. + +Tue Jul 9 15:21:27 1996 Jim Wilson <wilson@cygnus.com> + + * x-iris6 (FIXPROTO_DEFINES): Add -D_SGI_SOURCE. + +Mon Jul 8 18:00:33 1996 Jim Wilson <wilson@cygnus.com> + + * sh/sh.h (enum reg_class): Add new class GENERAL_FP_REGS. + (REG_CLASS_NAMES, REG_CLASS_CONTENTS): Likewise. + + * cse.c (note_mem_written): Varying structure memory access with + AND address can alias scalars. + * sched.c (true_dependence, anti_dependence, output_dependence): + Likewise. + + * sh.c (calc_live_regs): For pragma_interrupt case, exclude call + clobbered regs that are fixed, explicitly add MACH_REG and MACL_REG. + + * calls.c (expand_call): For assign_stack_temp call in PARALLEL case, + get mode from type instead of using BLKmode. + * function.c (aggregate_value_p): If hard_function_value returns + a non-REG, then return 0. + + * mips/mips.c (function_arg): Add explicit checks for FIELD_DECLs. + (mips_function_value): Add explicit checks for FIELD_DECLs, and save + them in the array FIELDS. When returning structure with 1 float field, + enclose it in a PARALLEL and set the PARALLEL mode correctly. + * mips/mips.md (call_value): Call gen_call_value_multiple_internal0 + only if there are multiple return values. Strip the PARALLEL off + if there there is only one return value. + +Mon Jul 8 16:27:33 1996 Jeffrey A. Law <law@cygnus.com> + + * First cut at support for the H8/S. + * h8300/h8300.c (h8300_init_once): Handle the H8/S (treat it + like the H8/300H). + (dosize, adds_subs_operand, one_insn_adds_subs_operand): Likewise. + (output_adds_subs, const_costs, print_operand): Likewise. + (output_simode_bld, h8300_adjust_insn_length): Likewise. + (push_order, pop_order): Reverse. + (function_prologue): Try to use ldm.l and stm.l insns + on the H8/S. Minor cleanups. + (function_epilogue): Likewise. + (asm_file_start): Emit ".h8300s" when compiling for the H8/S. + * h8300/h8300.h (CPP_SPEC): Handle the H8/S. + (TARGET_H8300S): New target. + (TARGET_SWITCHES): Add "-ms" and "-mno-s". + (BITS_PER_WORD): Handle the H8/S (treat it like the H8/300H). + (UNITS_PER_WORD, POINTER_SIZE, PARM_BOUNDARY): Likewise. + (BIGGEST_ALIGNMENT, BIGGEST_FIELD_ALIGNMENT): Likewise. + (INITIALIZE_TRAMPOLINE, MOVE_MAX, Pmode): Likewise. + * h8300/h8300.md: Handle H8/S just like H8/300H + throughout the entire file. + * h8300/t-h8300 (MULTILIB_OPTIONS): Build "-ms" libraries + too. + (MULTILIB_DIRNAMES): Put H8/S libraries in "h8300s" directory. + * h8300/lib1funcs.asm: Emit ".h8300s" pseudo-op when generating + h8300s object files. Otherwise treat the H8/S just like the H8/300H. + * ginclude/stdarg.h: Handle the H8/S. + * ginclude/varargs.h: Likewise. + +Mon Jul 8 14:50:58 1996 Doug Evans <dje@cygnus.com> + + * sparc/sol2.h (LINK_SPEC): Don't pass `-z text' if + -shared -mimpure-text. + +Sun Jul 7 18:03:46 1996 Torbjorn Granlund <tege@noisy.tmg.se> + + * m68k/lb1sf68.asm (__udivsi3): Use faster tstw instead of btst. + +Thu Jul 4 11:44:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (get_inner_reference): Delete using alternate mode for + bitfield; we don't make bitfields anymore if not needed. + +Wed Jul 3 18:23:17 1996 Stephen L Moshier (moshier@world.std.com) + + * c-common.c (record_function_format): Define as static. + + * collect2.c (at SUNOS4_SHARED_LIBRARIES): Fix reference to unistd.h. + +Wed Jul 3 17:35:20 1996 Gavin Koch <gavin@cygnus.com> + + * c-typeck.c (default_conversion): Add bitfield promotions. + +Wed Jul 3 17:09:22 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * gcc.c (default_compilers): Add null entries for languages we + heard of. + (main): If found one of those entries, say compiler not installed. + +Wed Jul 3 12:52:53 1996 Jeffrey A. Law <law@cygnus.com> + + * pa.c (fmpy_operands): Define. + (combinable_fmpy): New function. + (combinable_fadd, combinable_fsub): Likewise. + * pa.md (parallel_addb, parallel_movb): New patterns. + (fmpyadd, fmpysub): New patterns. + + * pa.c (fmpyaddoperands): Tighten checks. Allow SFmode. + (fmpysuboperands): Similarly. + +Tue Jul 2 18:57:15 1996 Jeffrey A. Law <law@cygnus.com> + + * pa.c (ireg_or_int5_operand): New function. + (output_parallel_movb, output_parallel_addb): Likewise. + (combinable_copy, combinable_add, following_call): Likewise. + (pa_adjust_insn_length): Handle parallel unconditional branches. + (output_movb): Handle case were destination is %sar. + * pa.h: Declare new functions. + * pa.md (parallel_branch): New "type" attribute. + (delay slot descriptions): Don't allow "parallel_branches" in + delay slots. Fill "parallel_branches" like "branch" insns. + (movb patterns): Handle %sar as destination register. + + * expr.c (compare): If function pointers need canonicalization + before comparisons, canonicalize them. + (do_store_flag): Do not use an sCC insn for a function pointer + comparison if function pointers need canonicalization before + comparing. + +Tue Jul 2 17:56:37 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h ({START,END}FILE_LINUX_SPEC): If -mnewlib is not + used, use the crtbegin/crtend that 2.7.2 used. + +Sat Jun 29 07:10:02 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.h (INIT_EXPANDERS): Define, call rs6000_init_expanders. + (RS6000_VARARGS_OFFSET): fpmem area no longer next to outgoing + argument area. + (STARTING_FRAME_OFFSET): Ditto. + (STACK_DYNAMIC_OFFSET): Ditto. + (frame_pointer_needed): Add external declaration. + (rs6000_{save,restore}_machine_status): Ditto. + (rs6000_init_expanders): Ditto. + + * rs6000.c (rs6000_{save,restore}_machine_status): New functions + to save and restore the globals needed on a per function basis. + (rs6000_init_expanders): Initialize globals needed on a per + function basis, and set up so the above save/restore functions are + called when processing nested functions. + (output_epilog): Don't initialize per function globals here. + (rs6000_stack_info): Change where the fpmem save area is to below + the local variables, and not just below the outgoing argument + area. + + * rs6000.md (floatsidf2*, fix_truncdfsi2*): Rewrite conversion + routines to track new location of the fpmem save area. Allocate a + new base register temp for the routines in case the stack frame is + more than 32k in size. + +Sat Jun 29 05:44:37 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * explow.c (convert_memory_address, case PLUS): Fix error in + last change. + +Fri Jun 28 23:30:48 1996 Jeffrey A. Law <law@cygnus.com> + + * reload1.c (choose_reload_regs): Properly mark spill registers + as in use for inherited reloads. + +Fri Jun 28 18:37:20 1996 Stephen L Moshier <moshier@world.std.com> + + * objc/sarray.c (ifdef __alpha__): Don't declare `free'. + * objc/thr-decosf1.c (objc_thread_id): Use pthread_getunique_np + to obtain a thread ID value. + (objc_mutex_allocate): Cast mutex->owner to _objc_thread_t. + (objc_mutex_deallocate): Likewise. + (objc_mutex_unlock): Likewise. + (objc_mutex_trylock): Declare thread_id as _objc_thread_t. + (objc_mutex_lock): Likewise. + (objc_mutex_unlock): Likewise. + + * real.c (asctoeg): `0.0eX' is zero, regardless of the exponent X. + +Fri Jun 28 18:33:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * vax.md (rotl): Remove extraneous `$'. + + * combine.c (previous_num_undos): Deleted variable. + (MAX_UNDO): Deleted macro. + (struct undo): New field, next. + (struct undobuf): Deleted num_undos and undo. + New fields undos, frees, and previous_undos. + (SUBST, SUBST_INT): Rework to allocate memory and chain undo entries. + (combine_instructions): Initialize undobuf.{undos,previous_undos}, + not undobuf.num_undo and previous_num_undos. + (try_combine): Likewise. + (undo_all, gen_rtx_combine): Rework to use new data structures. + +Fri Jun 28 16:48:25 1996 Scott Christley <scottc@net-community.com> + + * objc/sendmsg.c (__objc_block_forward): New function. + (get_imp, objc_msg_lookup): Use different forwarding function + when the returning a floating point value. + +Fri Jun 28 16:25:25 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * configure: Allow multiple makefile frags. + (i[3456]86-*-linux*oldld*): Add i386/t-crtstuff as target frag. + (i[3456]86-*-linux*aout*, i[3456]86-*-linux*): Likewise. + (m68k-*-linux*aout*): Add t-linux-aout as target frag. + (m68k-*-linux*): Add t-linux as target frag. + * Makefile.in (Makefile): xmake_file and tmake_file now already + contain the $(srcdir)/config prefix. + + * config/t-linux (BOOT_CFLAGS): Removed, no longer necessary. + (CRTSTUFF_T_CFLAGS): Don't define. + (CRTSTUFF_T_CFLAGS_S): Define this instead. + * config/t-linux-aout (BOOT_CFLAGS): Removed. + * m68k/t-linux: Remove variables now in t-linux. + +Fri Jun 28 15:06:05 1996 John F. Carr <jfc@mit.edu> + + * alpha.c (alpha_emit_conditional_move): Emit correct code when + incoming comparison code is NE. + +Fri Jun 28 14:35:45 1996 J.T. Conklin <jtc@hippo.cygnus.com> + + * c-decl.c (init_decl_processing): Register __builtin_memset + and memset as builtin functions. + * expr.c (expand_builtin, case BUILTIN_MEMSET): Open code memset + where val == 0. + +Fri Jun 28 14:10:03 1996 Richard Henderson <rth@tamu.edu> + + * alpha/linux.h (FUNCTION_PROFILER): _mcount has non-standard linkage. + * alpha/elf.h (LINK_SPEC): Bring emulation name into sync + with Cygnus snapshot. + + * alpha.h ({MASK,TARGET}_BUILD_CONSTANTS): New macros. + (TARGET_SWITCHES): New target option build-constants. + * alpha.c (alpha_emit_set_long_const): New function. + * alpha.md (movdi): Call it. + * expmed.c (expand_mult_highpart): Use op1 not wide_op1 in + expansion of mul_highpart. + + * alpha.c (output_{pro,epi}log): Flag_inhibit_size_directive + should supress .ent, .end, and accompanying directives. + (alpha_output_lineno): Fix polarity on GAS test. + * alpha.h (NO_DBX_FUNCTION_END): New macro. + * dbxout.c (dbxout_function): Respect NO_DBX_FUNCTION_END. + * alpha/elf.h: New file. + * alpha/linux.h (INITIALIZE_TRAMPOLINE): New definition. + * alpha/xm-linux.h (HAVE_STRERROR): Define. + * configure (alpha*-linux*ecoff*): New target, was alpha-*-linux*. + (alpha-*-linux*): Use elf.h. + * crtstuff.c (init_dummy): Only i386-linux (at most) + needs ___brk_addr hack. + +Thu Jun 27 20:23:30 1996 Jon Buller (jonb@metronet.com) + + * ns32k.c (split_di): New; from i386.c. + * ns32k.md (adddi3, subdi3, negdi3): New patterns. + +Thu Jun 27 19:42:50 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * combine.c (force_to_mode, case NE): Fix typo and logical error. + (simplify_comparison): Don't swap args if op1 is CONST_INT. + +Thu Jun 27 18:49:35 1996 Jim Wilson <wilson@cygnus.com> + + * expmed.c (extract_bit_field): Check TRULY_NOOP_TRUNCATION before + making a SUBREG of a REG. + +Thu Jun 27 11:03:59 1996 Ian Lance Taylor <ian@cygnus.com> + + * mips/mips.h (CC1_SPEC): Put spaces between the -mips* cases. + * mips/osfrose.h (CC1_SPEC): Likewise. + + * sh/sh.c (output_branch): Don't call ADJUST_INSN_LENGTH if the + insn is inside a sequence. + +Wed Jun 26 19:09:43 1996 Jeffrey A. Law <law@cygnus.com> + + * pa/pa.h (CMP_PSI): Delete. + (FUNCTION_POINTER_COMPARISON_MODE): Likewise. + * pa/pa.md (cmppsi); Delete expander. + (canonicalize_funcptr_for_compare): Renamed from plabel_dereference, + turned into an expander + anonymous pattern. + +Tue Jun 25 22:36:11 1996 Doug Evans <dje@seba.cygnus.com> + + * gcc.c (PEXECUTE_VERBOSE): Define. + (execute): Pass PEXECUTE_VERBOSE to pexecute if -v. + +Tue Jun 25 12:23:54 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.h (FINALIZE_PIC): Define to call rs6000_finalize_pic. + (rs6000_finalize_pic): Add declaration. + (svr4_traceback): Delete unused declaration. + + * rs6000.md (movsi_got): Don't emit gen_init_v4_pic insn. + (V.4 call insns): Do not use @plt for PIC calls. + + * rs6000.c (print_operand_address): Handle LABEL_REF just like + SYMBOL_REF. + (rs6000_finalize_pic): Define, emit the gen_init_v4_pic insn + before all other insns if needed for V.4 PIC calls. + + * eabi-ci.asm (_GLOBAL_OFFSET_TABLE_): Do not provide a default + definition, since it interferes with the linker generated version. + +Tue Jun 25 01:17:50 1996 Jeffrey A. Law <law@cygnsu.com> + + * h8300/h8300.c (function_prologue): Update "monitor" prologues. + (function_epilogue): Similarly. + + * pa/pa.h (PARSE_LDD_OUTPUT): Handle dynamic libraries that are + loaded "statically". + +Mon Jun 24 19:48:36 1996 Joel Sherrill <joel@merlin.gcs.redstone.army.mil> + + * configure ({i386,i960,m68k,powerpc,sparc}-rtems): New targets. + * i386/go32-rtems.h, i386/i386-rtems.h: New files. + * i960/i960-rtems.h: New file. + * m68k/m68k-rtems.h: New file. + * rs6000/powerpc-rtems.h: New file. + * sparc/sparc-rtems.h: New file. + +Mon Jun 24 23:09:22 1996 Paul Eggert <eggert@twinsun.com> + + * cccp.c: (create_definition): Diagnose `#define #' only once. + +Mon Jun 24 11:42:58 1996 Jim Wilson <wilson@cygnus.com> + + * i386/cygwin32.h, rs6000/cygwin32.h (CPP_PREDEFINES): For consistency, + change to define WIN32, WINNT, and CYGWIN32. + +Mon Jun 24 10:46:50 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (floatsidf2*): Move the xor of the argument into the + define_insn, since it confuses inline function expands. + +Fri Jun 21 20:40:17 1996 Jim Wilson <wilson@cygnus.com> + + * mips.md (call_internal1, call_value_internal1): Delete obsolete code. + (call_internal2, call_value_internal2, call_value_multiple_internal2): + Delete obsolete code. Explicitly load SYMBOL_REF into register. + (call_value): Change Pmode to SImode in gen_call_value_internal0 call. + +Thu Jun 20 12:20:33 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * configure (*-aix*): If building a cross compiler, use t-xnewas + instead of t-newas. + + * rs6000.c (num_insns_constant_wide): Fix typo if HOST_WIDE_INT + has more than 32 bits. + +Wed Jun 19 17:50:33 1996 Richard Henderson <richard@atheist.tamu.edu> + + * combine.c (move_deaths): New parameter maybe_kill_insn. + Don't move note if reg killed by maybe_kill_insn. + (try_combine): Pass new arg to move_deaths. + +Wed Jun 19 10:44:47 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * toplev.c (flag_keep_static_consts): Define. + (f_options): Add "keep-static-consts" entry. + (compile_file): Check it in addition to !optimize for emitting + static const variables. + +Tue Jun 18 23:37:20 1996 Doug Evans <dje@cygnus.com> + + * i386/cygwin32.h (ASM_OUTPUT_SOURCE_LINE): Local symbols begin with L. + +Tue Jun 18 12:00:11 1996 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (asm_output_aligned_bss): Don't emit a skip of size 0. + +Tue Jun 18 06:24:28 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * integrate.c (expand_inline_function): Add missing call to + force_operand when getting structure_value_addr into reg. + + * alpha.c (override_options): Allow EV4/5 or 21064/21164 for cpu. + Clean up handling of floating-point options. + * alpha.h (TARGET_SWITCHES): Have all -mieee options turn + on MASK_IEEE_CONFORMANT. + (TARGET_DEFAULT): Use symbolic value. + * alpha.md: When not involving named pattern, update condition + to include alpha_tp != ALPHA_TP_INSN. + Don't do float_extend as part of other pattern when ALPHA_TP_INSN. + (extendsfsd2): Split into two patterns, depending on + value of alpha_tp. + + * mips/iris6.h (ASM_SPEC): Treat -o32 as -32 and -n64 same as -64. + * mips.c (override_options): Likewise. + + * genattrtab.c (fatal): Declare A1 and A2 as char *. + + * function.c (find_temp_slot_from_address): Check for overlap + from BASE_OFFSET if X is PLUS of virtual_stack_vars_rtx and const. + + * flow.c (flow_analysis): Fix typo in last change. + + * expr.c (expand_builtin, case BUILT_IN_{SET,LONG}JMP): Properly + handle case when ptr_mode != Pmode. + + * combine.c (try_combine): Don't use split if dest of new I2 + is used between I2 and I3. + + * c-typeck.c (pointer_int_sum): Convert integer to both signedness + and precision of sizetype. + * explow.c (convert_memory_address, case PLUS, MULT): Don't commute + operation with extension if not adding small integer. + + * Makefile.in (BOOT_LANGUAGES): New variable. + (bootstrap): Use it to select languages for stage1. + * configure (extra_host_objs): New variable. + Separate files needed for target and host and concatenate list. + (extra_gcc_objs): Use setting for host, not target. + (objc_thread_file): Start with it as null, then don't include "thr-". + Print name of file after others and in same format. + (alpha-*-winnt*, i[3456]86-*-winnt): oldnames.o is in extra_host_objs. + (all_boot_languages): New variable. + Set from boot_language variable in config-lang.in. + Defines value of BOOT_LANGUAGES in Makefile. + (Makefile): Set target to the canonical form of target. + +Mon Jun 17 22:37:07 1996 Mike Meissner <meissner@rtl.cygnus.com> + + * rs6000/win-nt.h (ASM_DECLARE_FUNCTION_NAME): Put function + descriptor in .reldata, not .text. + +Mon Jun 17 16:05:34 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * ginclude/stddef.h (wint_t): Don't wrap with #ifndef __cplusplus. + +Mon Jun 17 15:03:20 1996 Jim Wilson <wilson@cygnus.com> + + * mips.c (mips_split_addresses): New variable. + (simple_memory_operand): Add comment about mode check. Add check + for LO_SUM. + (call_insn_operand): OP is now an addresses instead of a MEM. + (move_operand, mips_check_split): New functions. + (mips_count_memory_refs): Add check for LO_SUM. + (mips_move_1word): Add HIGH support. + (mips_address_cost): Delete check for HIGH. + (output_block_move): Handle LO_SUM addresses. + (override_options): Set mips_split_addresses. + (print_operand_address): Add LO_SUM support. + * mips.h (mips_split_addresses, mips_check_split, move_operand): + New declarations + (GO_IF_LEGITIMATE_ADDRESS): Reject constant addresses when + mips_split_addresses is TRUE. Add LO_SUM support. + (LEGITIMIZE_ADDRESS): Add LO_SUM support. + (PREDICATE_CODES): Modify call_insn_operand support. Add + move_operand. + * mips.md (memory): Change r4100/r4300 support. + (imuldiv): Add r4300 support. + (high, low): New patterns. + (movsi, movdi): Add LO_SUM support. + (movsi_internal1, movsi_internal2): Use move_operand instead of + general_operand. + (movstrsi_internal, movstrsi_internal2): Delete R constraint. + (call, call_value): Pass address instead of MEM to call_insn_operand. + Call gen_call_{value_}internal0 instead of internal1. + (call_internal0, call_value_internal0, call_multiple_internal0): + New patterns. + (call_internal1, call_internal2, call_value_internal1, + call_value_internal2, call_value_multiple_internal2): Add explicit + MEM before target address. + +Sun Jun 16 23:05:16 1996 Jeffrey A. Law <law@cygnus.com> + + * configure (hppa*-hp-hpux10*): Use new pa-hpux10 configuration file. + (hppa*-hp-hpux*): Use hpux9 configuration files by default. + * pa/pa-hpux10.h: New file. + * pa/pa-ghpux9.h: Deleted. No longer used. + +Sat Jun 15 04:35:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> + + * i386/gnu.h (LINK_SPEC): Remove -rpath /lib/ option. + Ignore -ibcs option. + +Thu Jun 13 14:49:41 1996 Jim Wilson <wilson@cygnus.com> + + * gen-protos.c (main): Change argv[i] to argv[0][i]. + +Thu Jun 13 10:46:24 1996 Doug Evans <dje@cygnus.com> + + * gcc.c (pfatal_pexecute): Delete code to check errno < sys_nerr. + +Wed Jun 12 21:47:10 1996 Eliot Dresselhaus <dresselh@rft30.nas.nasa.gov> + + * alpha.c (alpha_cpu, alpha_cpu_string): New variables. + (override_options): Process -mcpu= value. + (alpha_adjust_cost): Handle adjustments for EV5. + * alpha.h (enum processor_type): New enum. + (alpha_cpu, alpha_cpu_string): New declarations. + (target_options): Add "cpu=". + (RTX_COSTS): Adjust values for EV5. + * alpha.md: Add scheduling rules for EV5. + +Tue Jun 11 17:51:03 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-common.c (check_format_info): Change text of message about use + of `0' with precision. + +Tue Jun 11 15:14:10 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.h (TARGET_SCHEDULE_PROLOGUE): New. Allows prologue to + be emitted as asm or rtl. + + * i386.c (function_prologue): Emit prologue as asm. + (override_options): Don't emit rtl for prologue if -fpic. + +Tue Jun 11 14:41:01 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/eabi.asm (__eabi): Fix normal code so that it properly + loads up r2/r13 if needed again. + + * rs6000/sysv4.h (CPP_ENDIAN_SPEC): Call cpp_endian_default, not + cpp_endian_default_spec. + +Mon Jun 10 15:10:56 1996 Jeffrey A. Law <law@cygnus.com> + + * local-alloc.c (update_equiv_regs): Ignore insns that read or + write registers that are likely to be spilled. + + * pa.h (cmp_type): Add CMP_PSI. + (FUNCTION_POINTER_COMPARISON_MODE): Define. + * pa.md (cmppsi): New expander. + (plabel_dereference): New pattern + +Mon Jun 10 14:56:14 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sol2.h (SKIP_ASM_OP): Delete, Solaris accepts .space, + like rest of PowerPC V4 ports. + + * rs6000/sysv4.h (ASM_OUTPUT_ALIGNED_LOCAL): Emit .lcomm if not + using the .sbss area. If using the .sbss area, put out + appropriate .size directive. + +Mon Jun 10 14:53:38 1996 Doug Evans <dje@cygnus.com> + + Move fork/exec/wait handling into file of its own. + * pexecute.c: New file. + * Makefile.in (pexecute.o): Add rule. + (xgcc): Link in pexecute.o. + (protoize,unprotoize): Likewise. + * gcc.c (_WIN32): Don't include process.h or declare spawnv{,p}. + (pexecute,pwait): Add prototypes. + (PEXECUTE_{FIRST,LAST,SEARCH}): Define. + (execv,execvp): Delete decls. + (perror_exec): Delete. + (pfatal_pexecute): New function. + (pexecute support): Delete. + (execute): -pipe not supported if _WIN32 or OS2. + Update call to pexecute. Fatal error if pexecute fails. Call pwait. + * protoize.c: Include gansidecl.h. + (my_execvp): Delete. + (choose_temp_base,pexecute,pwait): Declare. + (PEXECUTE_{FIRST,LAST,SEARCH}): Define. + (execvp): Delete decl. + (usage): Fix typo. + (gen_aux_info_file): Rewrite to use pexecute/pwait. + + * gcc.c (do_spec_1): Allow leading text in version string. + Delete support for default minor number = 0. + +Mon Jun 10 11:49:53 1996 Scott Christley <scottc@net-community.com> + + * objc/Makefile (libobjc.a): Don't delete the library. + + * objc/thr.h (objc_set_thread_callback): New function. + (objc_thread_callback): Typedef for the hook function. + * objc/thr.c (__objc_thread_detach_function): Clear thread storage. + Call the thread hook function when first becoming multi-threaded. + (objc_set_thread_callback): New function. + + * objc/selector.c (__sel_register_typed_name): Additional parameter + that indicates whether name and type parameters are constant or not. + * objc/runtime.h (__sel_register_typed_name): Likewise. + * objc/init.c (__sel_register_typed_name): Likewise. + + * objc/init.c (__objc_init_protocols): Need to unlock mutex. + +Mon Jun 10 11:44:44 1996 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * sparc/t-sol2 (gmon.o): Depend on stmp-int-hdrs. + (crt1.o, crti.o, crtn.o, gcrt1.o): Depend on $(GCC_PASSES). + +Mon Jun 10 11:29:46 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * flow.c (flow_analysis, find_basic_blocks): Ignore + nonlocal_label_list for CALL_INSN that has a REG_RETVAL. + + * c-common.c (decl_attributes, case A_T_UNION): Don't look at fields + of union if there aren't any. + +Sat Jun 8 22:13:33 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (ix86_expand_prologue): Keep pic register load ahead + of reference which may use a pic register. + +Sat Jun 8 22:13:33 1996 Jim Wilson <wilson@cygnus.com> + + * i386.md (strlensi_unroll4, strlensi_unroll5): Use + not =& for + constraint for input/output operand 2. + +Sat Jun 8 22:13:33 1996 J"orn Rennecke (amylaar@meolyon.hanse.de) + + * i386.h (CONST_COSTS): Even integer constants have a cost. + (RTX_COSTS): Take costs of subexpressions into account. + If a multiply is actually a shift, use the cost of the shift. + * i386/unix.h (SHIFT_DOUBLE_OMITS_COUNT): New macro. + * i386/{gas, next, seq-gas}.h (SHIFT_DOUBLE_OMITS_COUNT): Redefine + as zero. + * i386.c (print_operand): new letter 's'. + +Sat Jun 8 15:13:33 1996 Jim Wilson <wilson@cygnus.com> + + * mips/mips.c (override_options): Add vr4100 and vr4300 support. + * mips/mips.h (enum processor_type): Likewise. + (MASK_4300_MUL_FIX, TARGET_4300_MUL_FIX): New macros. + (TARGET_SWITCHES): Add -mfix4300 option. + * mips/mips.md (cpu, memory, imuldiv, adder, mult, divide): Add + vr4100 and vr4300 support. + (muldf3, mulsf3): Add vr4300 support. + (muldf3_internal, muldf_r4300, mulsf3_internal, mulsf_r4300): New + patterns. + +Sat Jun 8 14:35:23 1996 David Edelsohn <edelsohn@mhpcc.edu> + + * toplev.c (main): Re-enable -gxcoff+. + +Sat Jun 8 14:20:14 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * m68k/lb1sf68.asm (__{eq,ne,gt,lt,ge,le}{df,sf}2): Removed + extraneous comments, constants, labels, etc. + + * m68k/altos3068.h (TARGET_DEFAULT): Use MASK_* macros + instead of explicit constants in definitions or conditionals. + * m68k/{apollo68, aux, ccur-GAS, dpx2, hp320, hp3bsd}.h: Likewise. + * m68k/{hp3bsd44, isi-nfp, isi, linux-aout, linux}.h): Likewise. + * m68k/{lynx-ng, lynx, m68k-none, m68k-psos, m68kv4}.h): Likewise. + * m68k/{mot3300, netbsd, news, next, pbb, plexus, sun2o4}.h): Likewise. + * m68k/{sun3, sun3n, tower}.h): Likewise. + +Sat Jun 8 13:55:23 1996 Matthias Pfaller (leo@marco.de) + + * ns32k.md (define_insns for ffs[qhs]i2): Deleted. + (define_expand for ffssi2): New pattern. + +Sat Jun 8 13:44:14 1996 Stephen L Moshier (moshier@world.std.com) + + * reload.c (find_equiv_reg): Set need_stable_sp if GOAL is the + stack pointer. + +Sat Jun 8 13:36:05 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (fixup_var_refs_1, case SIGN_EXTEND): Handle + paradoxical SUBREGs as first operand. + (fixup_var_regs_1, case SET): Handle paradoxical SUBREGs as + first operand of a ZERO_EXTRACT in SET_DEST. + + * c-common.c (enum attrs): Add A_FORMAT_ARG. + (init_attribute): Initialize it. + (decl_attributes, case A_FORMAT): Clean up error messages. + (decl_attributes, case A_FORMAT_ARG): New case. + (struct international_format_info): New structure and typedef. + (international_format_list): New variable. + (record_international_format): New function. + (init_format_info): Call it for gettext, dcgettext, and dcgettext. + (check_format_info): See if format arg is call to + internationalization function. + +Fri Jun 7 20:04:40 1996 Jim Wilson <wilson@cygnus.com> + + * gcc.c (MULTILIB_SELECT): Delete definition. + (multilib_select): Delete static initializer. + (multilib_obstack, multilib_raw): New global variables. + (multilib.h): Include inside multilib_raw definition. + (main): Set multilib_select from multilib_raw. + * genmultilib: Change output to be a sequence of short strings + separated by commas rather than a single long macro definition. + + * cse.c (simplify_binary_operation, case MULT): Check for case + where width is larger than HOST_BITS_PER_WIDE_INT, and upper most + bit is set. We can not generate a simple shift in this case. + + * gsyms.h (enum sdb_type): Add T_LNGDBL if EXTENDED_SDB_BASIC_TYPES. + (enum sdb_masks): Add EXTENDED_SDB_BASIC_TYPES masks. + * sdbout.c (gsyms.h): Include if CROSS_COMPILE is defined. + (plain_type_1): Use TYPE_PRECISION instead of TYPE_SIZE. + Add check for LONG_DOUBLE_TYPE_SIZE if EXTENDED_SDB_BASIC_TYPES. + * i960/i960.h (EXTENDED_SDB_BASIC_TYPES): Define. + (PUT_SDB_TYPE): Delete now unnecessary shifting and masking. + + * i960/i960.h (i960_output_move_{double,quad}): Declare. + +Fri Jun 7 19:22:09 1996 Scott Christley <scottc@net-community.com> + + * Makefile.in (OBJC_THREAD_FILE): New variable. + * configure (objc_thread_file): Set new variable to appropriate + values based upon target operating system; default is `thr-single'. + * objc/Makefile (OBJC_THREAD_FILE): Add target and dependency. + (thr.o): Remove OS specific thread files as dependencies. + * objc/thr-decosf1.c: Now compiles as a separate source file, so + include appropriate Objective-C headers. + * objc/thr-{mach,os2,posix,irix,single,solaris,win32}.c: Likewise. + * objc/thr.c: Remove inclusion of source files. + * objc/thr.h (__objc_thread_exit_status): Declare global variable. + * objc/thr-pthreads.c: New file. + +Fri Jun 7 19:04:04 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * m68k.h (TARGET_SWITCHES): Treat -m68302 like -m68000 and -m68332 + like -m68020; remove -mno-68302 and -mno-68332. + +Fri Jun 7 12:06:12 1996 Per Bothner <bothner@deneb.cygnus.com> + + * expr.c (safe_from_p): Allow Chill-style variable-sized arrays. + +Thu Jun 6 23:11:11 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.c (h8300_monitor_function_p): New function. + (h8300_os_task_function_p): Likewise. + (os_task, monitor): Variables to note if the current + function is an os_task or monitor. + (function_prologue): Set monitor and/or os_task as needed. Handle + os_task and monitor functions. + (function_epilogue): Clear monitor and os_task. Handle os_task and + monitor functions. + (h8300_valid_machine_decl_attribute): Accept "OS_Task" and + "monitor". + +Thu Jun 6 20:01:54 1996 Per Bothner <bothner@cygnus.com> + + * gen-protos.c (progname): New variable (needed by cppalloc.c). + (main): Set progname. + + * cpplib.h (struct parse_file): Removed. + (CPP_FATAL_LIMIT, CPP_FATAL_ERRORS, CPP_OUT_BUFFER): New macros. + * cpphash.c (cpp_lookup): Change struct parse_file -> cpp_reader. + + * cpplib.c (init_parse_option): Renamed to cpp_options_init. + (push_parse_file): Renamed to ... + (cpp_start_read): Change to return 1 on success, 0 on failure. + (init_parse_file): Renamed to cpp_reader_init. + * cppmain.c (main): Use CPP_SET_WRITTEN and cpp_fatal. + Use renamed function names, and return protocols. + * fix-header.c (read_scan_file): Likewise. + + * cpperror.c (cpp_message): Generalize for "fatal" errors. + (cpp_fatal): New function (just calls cpp_message). + * cpplib.c (cpp_start_read, cpp_handle_options, cpp_finish, + parse_goto_mark, parse_move_mark): Use cpp_fatal rather than fatal. + + * fix-header.c (check_macro_names): Fix struct parse_file->cpp_reader. + * cpplib.c (newline_fix): Remove unused function. + +Thu Jun 6 19:47:26 1996 Jim Wilson <wilson@cygnus.com> + + Changes to support parameters and return values in multiple + non-contiguous locations. + * calls.c (expand_call): Handle NIL in PARALLEL. Handle PARALLEL + parameter in REG. Handle PARALLEL return value in VALREG. + (emit_library_call, emit_library_call_value): Abort for PARALLEL. + (store_one_arg): Delete code for handling EXPR_LIST. + * expr.c (emit_group_load, emit_group_store): New functions. + (use_group_regs): New function. + (emit_push_insn): Handle PARALLEL parameter in REG. + (expand_assignment): Handle PARALLEL to_rtx. + (store_expr): Handle PARALLEL target. + * expr.h (emit_group_load, emit_group_store, use_group_regs): New + declarations. + * function.c (assign_parms): Handle PARALLEL parameter in ENTRY_PARM. + * stmt.c (expand_value_return): Handle PARALLEL return_reg. + + * mips/abi64.h (TYPE_DEPENDENT_REG): Delete. + * mips/mips.c (function_arg): Return PARALLEL for structure with + aligned double fields. + (type_dependent_reg): Delete. + (mips_function_value): Return PARALLEL for structure + with two floating point fields. + * mips/mips.md (call_value): Handle PARALLEL in operands[0]. + (call_value_multiple_internal2): New pattern. + * pa/pa.h (FUNCTION_ARG): General PARALLEL instead of EXPR_LIST. + * rs6000/rs6000.c (init_cumulative_args): Change EXPR_LIST to PARALLEL + in comments. + (function_arg): Generate PARALLEL instead of EXPR_LIST. + +Thu Jun 6 18:21:27 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * function.c (assign_parms): Tighten up code that makes REG_EQUIV + notes for parms. + + * fold-const.c (fold): Don't do anything with evaluated SAVE_EXPR. + +Thu Jun 6 17:54:07 1996 J.T. Conklin <jtc@cygnus.com> + + * m68k.h (TARGET_SWITCHES): Group all floating point options. + When an fp option is selected, unset bits used for other mutually + exclusive fp options. + (OVERRIDE_OPTIONS): Remove special case for SUPPORT_SUN_FPA; + bits used for 68881 and SKY are now cleared by TARGET_SWITCHES. + + * m68k.md (movsi_const0, movhi): Favor clr with TARGET_5200. + (add[qhs]3): Don't use two addqw/subqw insns to add small integers to + an address register with TARGET_68060. + (stack push peephole): Use moveq.l with TARGET_5200 (when appropriate). + + * m68k.h (MASK_5200, TARGET_5200): New macros. + (TARGET_SWITCHES): Add "m5200". + (LEGITIMATE_INDEX_P): Add TARGET_5200 to conditional expression. + * m68k.c (const_method): Do not synthesize long constants + with byte or word operations with TARGET_5200. + * m68k.md: Disable byte and word arithmetic, rotate, integer + divide, dbcc, etc. insns for TARGET_5200. + * m68k-none.h: (CPU_FPU_SPEC, CPP_SPEC, ASM_SPEC): Support m5200. + +Thu Jun 6 17:32:32 1996 Paul Eggert <eggert@twinsun.com> + + * fixproto (subdirs): Work around Solaris 2.5 + /usr/xpgr/bin/sed problem with \+\+. + +Thu Jun 6 15:06:27 1996 Jim Wilson <wilson@cygnus.com> + + * c-decl.c (grokdeclarator): Call pop_obstacks after creating + TYPE_DECL. + + * loop.c (strength_reduce): If HAVE_cc0 defined, disable auto_inc_opt + if it would put an insn between a cc0 setter/user pair. + +Thu Jun 6 13:06:54 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (LIBGCC2_WORDS_BIG_ENDIAN): If __sun__ is + defined, treat that as little endian. + +Wed Jun 5 20:04:53 1996 Jim Wilson <wilson@cygnus.com> + + * i960/i960.h (ROUND_TYPE_ALIGN): Add check for TYPE_PACKED. + + * sh/sh.h (SHORT_IMMEDIATES_SIGN_EXTEND): Define. + * sh/sh.md (branch_true): Add comment about T-bit compares. + +Tue Jun 4 23:08:34 1996 Per Bothner <bothner@deneb.cygnus.com> + + * cpplib.h, cpplib.c: Remove support for !STATIC_BUFFERS. + * cpplib.h: Use unsigned char rather than U_CHAR. + * cpplib.h (cpp_reader): Add destructor #ifdef __cplusplus. + (cpp_cleanup): New prototype. + * cpplib.c (special_symbol, do_once, do_include, cpp_get_token): + Compare cpp_buffer against CPP_NULL_BUFFER, not NULL. + + * cpplib.c (dump_special_to_buffer): New function. + (initialize_builtins): Use it. + +Wed Jun 5 19:10:22 1996 Jeffrey A. Law <law@cygnus.com> + + * pa/pa.h (TEXT_SPACE_P): Fix thinko in last change. + +Wed Jun 5 16:25:51 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.h (ASM_DEFAULT_SPEC): Default to "", not -mpwr. + + * sysv4.h (SUBTARGET_SWITCHES): Add -mshlib. + (LINK_PATH_SPEC): Add -compat-bsd support from Solaris. + (LINK_SPEC): Eliminate %{b} and %{G}, since they conflict with GCC + switches. Defer shared library support to LINK_SHLIB_SPEC. Defer + target selection to LINK_TARGET_SPEC. + (LINK_SHLIB_SPEC): Provide two different versions, depending on + whether shared libraries are default or not. Make shared + libraries not default until linker is fixed. + (LINK_OS_*_SPEC): New specs for OS specific linker switches. + (SUBTARGET_EXTRA_SPECS): Add new specs. + + * {sol2,sysv4}.h (LINK_SPEC): Move Solaris link into the general + link spec. + + * {sysv4,sysv4le,eabile}.h (LINK_TARGET_SPEC): Only pass -oformat + to the linker if the user is changing the default endian format. + + * {sol2,linux,eabisim,eabilesim}.h (LINK_OS_DEFAULT_SPEC): Define + to use the appropriate OS link spec. + +Wed Jun 5 16:35:10 1996 Ian Lance Taylor <ian@cygnus.com> + + * ginclude/stddef.h: Fix typo: TYPE_ptrdiff_t to _TYPE_ptrdiff_t. + +Wed Jun 5 15:52:57 1996 Per Bothner <bothner@kalessin.cygnus.com> + + * varasm.c (output_constructor): Handle RANGE_EXPR in array index. + +Wed Jun 5 13:45:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * sparc.md (*call_{address,symbolic}_struct_value_sp32): Allow + operand 2 to be const0_rtx. + +Tue Jun 4 16:43:44 1996 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (make_decl_rtl): Don't update DECL_ASSEMBLER_NAME for + local statics. + + * c-decl.c (start_decl): Always set DECL_COMMON on statics. + * varasm.c (assemble_variable): Only treat vars with DECL_COMMON + as common. + +Tue Jun 4 14:55:49 1996 Jeffrey A. Law <law@cygnus.com> + + * pa.c (reloc_needed): New function. + * pa.h (TEXT_SPACE_P): Variables/constants with initializers + requiring relocs never live in the text space. + +Tue Jun 4 14:10:46 1996 Ian Lance Taylor <ian@cygnus.com> + + * sh.c (fp_zero_operand): Do not accept minus zero. + + * sh.h (ASM_OUTPUT_LOOP_ALIGN): Define. + (ASM_OUTPUT_ALIGN_CODE): Define. + (ADJUST_INSN_LENGTH): Add in bytes that may be added by + alignment. + * sh.c (output_branch): Run ADJUST_INSN_LENGTH in reverse to get + correct length. Just call abort rather than returning "bad". + (find_barrier): Adjust limits for possible alignment. + +Tue Jun 4 09:35:05 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/t-solaris: New target config file for PowerPC Solaris + without gas. + + * rs6000/t-ppc: Eliminate all multilib varients except for + software floating point. + + * configure (powerpcle-*-solaris*): If not --with-gnu-as, use + t-solaris, not t-ppc. + + * rs6000/sol2.h (MULTILIB_DEFAULTS): Add correct defaults for + Solaris. + + * rs6000/sysv4.h (ASM_OUTPUT_SECTION_NAME): Clone from svr4.h, omit + @progbits, since Solaris assembler doesn't like it. + (LIB_SOLARIS_SPEC): If -msolaris-cclib, add libabi.a. + ({START,END}FILE_SOLARIS_SPEC): If -msolaris-cclib, use explicit + pathnames for the Solaris compiler start/end files. + (ASM_SPEC): Pass -mno-regnames to the assembler. + +Mon Jun 3 19:40:10 1996 Jim Wilson <wilson@cygnus.com> + + * mips/abi64.h (CPP_SPEC): Make -mabi=n32 the default. + * mips/iris6.h (MIPS_ISA_DEFAULT, MIPS_ABI_DEFAULT, MULTILIB_DEFAULTS, + ASM_SPEC, STARTFILE_SPEC, ENDFILE_SPEC, LINK_SPEC): Likewise. + * mips.md (tablejump_internal4+1): Fix typo in condition. + * mips/x-iris6 (CC, OLDCC): Define to be `cc -32'. + +Mon Jun 3 07:57:35 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.def ([LR]SHIFT_EXPR): Remove `a' from printed names. + + * sparc.md (call): Mask unimp operand to 12 bits, just like Sun. + + * expr.c (store_field): Fix typo in last change; update TARGET addr. + + * c-decl.c (start_struct): Set TYPE_PACKED from flag_pack_struct. + (start_enum): Likewise but from flag_short_enums. + (finish_enum): Test TYPE_PACKED, not flag_short_enums. + * stor-layout.c (layout_decl): Test DECL_PACKED and TYPE_PACKED + instead of flag_pack_struct. + (layout_record): Likewise. + +Sun Jun 2 19:41:14 1996 Jim Wilson <wilson@cygnus.com> + + * mips.md (tablejump_internal3, tablejump_internal4): New patterns. + (tablejump): Use them for PIC code. + +Fri May 31 17:26:53 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.c (ix86_expand_epilogue): Don't generate references to an + exposed vacated stack. + * i386.md (epilogue_set_stack_ptr): New. + +Fri May 31 15:07:49 1996 Jim Wilson <wilson@cygnus.com> + + * mips/abi64.h: Add -mabi=n32 support. + (ABI_64BIT): Delete. + (TARGET_LONG64, CPP_SPEC, STACK_BOUNDARY, MIPS_STACK_ALIGN, + GP_ARG_LAST, FP_ARG_LAST, SUBTARGET_CONDITIONAL_REGISTER_USAGE, + MAX_ARGS_IN_REGISTER, FUNCTION_ARG_PADDING, RETURN_IN_MEMORY, + SETUP_INCOMING_VARARGS): Modify. + (REG_PARM_STACK_SPACE): Ifdef out. + (TARGET_DEFAULT, SUBTARGET_TARGET_OPTIONS): Define. + * mips/iris6.h: Add -mabi=n32 support. + (TARGET_DEFAULT, ASM_OUTPUT_INTERNAL_LABEL, + ASM_GENERATE_INTERNAL_LABEL): Delete. + (MULTILIB_DEFAULTS, ASM_SPEC, EXTRA_SECTION_FUNCTIONS, + ASM_OUTPUT_ALIGNED_LOCAL, STARTFILE_SPEC, ENDFILE_SPEC, LINK_SPEC): + Modify. + (MIPS_ABI_DEFAULT, LOCAL_LABEL_PREFIX): Define. + * mips/mips.c: Add -mabi=n32 support. + (mips_const_double_ok, mips_move_1word, mips_move_2words, + function_arg, override_options, mips_asm_file_start, + compute_frame_size, save_restore_insns, function_prologue, + mips_expand_prologue, function_epilogue, mips_function_value): Modify. + (mips_abi, mips_abi_string): Define + * mips/mips.h: Add -mabi=n32 support. + (ABI_64BIT): Delete. + (TARGET_OPTIONS, INITIAL_ELIMINATION_OFFSET, GO_IF_LEGITIMATE_ADDRESS, + CONSTANT_ADDRESS_P, LEGITIMATE_CONSTANT_P, LEGITIMIZE_ADDRESS, + ASM_OUTPUT_ADDR_DIFF_ELT): Modify. + (enum mips_abi_type, SUBTARGET_TARGET_OPTIONS): Define. + (mips_abi, mips_abi_string): Declare. + * mips/mips.md (jump, tablejump_internal1, tablejump_internal2): Add + -mabi=n32 support. + * mips/t-iris6 (MULTILIB_OPTIONS): Add -mabi=n32 support. + * mips/xm-irix6.h (HOST_BITS_PER_LONG): Use _MIPS_SZLONG not 64. + * ginclude/va-mips.h (va_start): Add -mabi=n32 support. + +Fri May 31 14:45:30 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -msolaris-cclib to use + the Sun compiler's crt files instead of ours. + ({START,END}FILE_SOLARIS_SPEC): If -msolaris-cclib, use the Sun + compiler's crt files instead of ours. + (SUBTARGET_OVERRIDE_OPTIONS): Don't set -msdata=data for Solaris. + (SBSS_SECTION_ASM_OP): For Solaris, don't use @nobits. + (CPP_OS_SOLARIS_SPEC): Remove -Asystem(unix) and -Asystem(svr4). + + * rs6000/t-ppc{,gas} (MULTILIB*): Add Solaris specific multilibs. + + * rs6000/eabi{,le}sim.h (*_DEFAULT_SPEC): Rather than using + duplicate definitions, just use %(...) so that there is only one + place in the specs file where the switches are defined. + * rs6000/{linux,sol2}.h (*_DEFAULT_SPEC): Ditto. + + * rs6000/sol2.h (CPP_PREDEFINES): Use the standard one in sysv4.h. + (RS6000_ABI_NAME): Default is solaris. + (ASM_OUTPUT_ALIGNED_LOCAL): Don't redefine. + + * rs6000/sol-c{i.asm,n.asm,c0.c}: Provide more things that Solaris + needs for program startup. + +Thu May 30 21:57:34 1996 Mike Stump <mrs@cygnus.com> + + * tree.def (OFFSET_REF): Remove. + * expr.c (expand_expr, case OFFSET_REF): Likewise. + * tree.c (substitute_in_expr): Remove OFFSET_REF code. + +Wed May 29 14:54:44 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/eabi.asm (__eabi): If not -mrelocatable, don't assemble + relocatable functions, so that it can be assembled with the + Solaris assembler. + + * rs6000/sysv4.h (CPP_SYSV_SPEC): Define _RELOCATABLE if + -mrelocatable-lib as well as -mrelocatable. + + * rs6000.c (rs6000_file_start): New function to print some more + information to the asm file. + * rs6000/{sysv4,win-nt,rs6000}.h (ASM_FILE_START): Call it. + +Tue May 28 15:21:24 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.h (FIRST_PSEUDO_REGISTER): Bump to 77. The new fpmem + register represents the memory location used for float/int + conversions. + ({FIXED,CALL_USED}_REGISTERS): Add support for the fpmem pseudo + register. + (REG_ALLOC_ORDER): Ditto. + (HARD_REGNO_{NREGS,MODE_OK}): Ditto. + (REGISTER_MOVE_COST): Ditto. + (reg_class): Ditto. + (REG_CLASS_{NAMES,CONTENTS}): Ditto. + (REGNO_REG_CLASS): Ditto. + (PREFERRED_RELOAD_CLASS): Ditto. + (CLASS_{MAX_NREGS,CANNOT_CHANGE_SIZE,MAX_NREGS}): Ditto. + (rs6000_stack): Ditto. + ({,DEBUG_}REGISTER_NAMES): Ditto. + (FPMEM_{REGNO_P,REGNUM}): New macros for fpmem register. + (rs6000_fpmem_{offset,size}): New global variables. + (RS6000_VARARGS_OFFSET): Fpmem temporary storage is located + between outgoing arg area and varargs save area. + (STARTING_FRAME_OFFSET): Ditto. + (STACK_DYNAMIC_OFFSET): Ditto. + (PREDICATE_CODES): Add fpmem_operand. + ({count_register,fpmem}_operand): Add declarations. + + * rs6000.c ({rs6000,alt}_reg_names): Add support for fpmem + 'register'. + (rs6000_fpmem_{offset,size}): New global variables. + (fpmem_operand): Return true for fpmem registers. + (gpc_reg_operand): The fpmem register is not general purpose. + (includes_rshift_p): Add casts to silence warnings from Solaris + PowerPC host compiler. + (print_operand): Add 'v' operand type for the upper 16 bits of + signed constants, to placate the Solaris assembler. + ({rs6000,debug}_stack_info): Add support for fpmem 'register'. + (output_epilog): Ditto. + + * rs6000.md (addsi3,movsi,movsf,movdi): Use %v for constants with + the upper 16 bits, to get the sign correct for PowerPC Solaris. + (float{,uns}sidf2,fix_truncdfsi2): Rewrite to use 'register' 76 + for the memory location used to convert between float and integer. + + * sysv4.h (ASM_OUTPUT_{CON,DE}STRUCTOR): Use code laid down in + .init and .fini for making constructors and destructors under + Solaris. + (ASM_SPEC): Do not pass -u to the assembler. + (CC1_SPEC): -mrelocatable implies -meabi. + + * sol2.h (RS6000_ABI_NAME): Default ABI is Solaris, not System + V.4. + (ASM_OUTPUT_ALIGNED_LOCAL): Don't define a Solaris specific + method. + +Mon May 27 06:39:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (expand_builtin, case BUILT_IN_{LONG,SET}JMP): + Convert block address from ptr_mode to Pmode. + +Sun May 26 20:05:43 1996 Doug Evans <dje@cygnus.com> + + * gcc.c (MSDOS pexecute): Call xmalloc, not malloc. + +Sun May 26 08:31:54 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure (vax-*-{sysv}): tm_file and xm_file now list. + (vax-*-ultrix): tm_file is now list. + (we32k-att-sysv*): xm_file now list. + * vax/xm-netbsd.h: Deleted. + * vax/netbsd.h: No longer include vax.h and config/netbsd.h. + * vax/ultrix.h, vax/vaxv.h: No longer include vax.h. + * vax/xm-vaxv.h: No longer include xm-vax.h. + * xm-we32k.h: No longer include xm-svr3.h. + + * configure: Separately set target_cpu_default for two + case statements and then combine if both set. + (alpha-*-winnt3): tm_file and xm_file are now list. + Set target_cpu_default to 64. + * winnt/config-nt.bat: Make .h files properly for Alpha. + * alpha.h (WINDOWS_NT): No longer defined and used. + (MASK_WINDOWS_NT, TARGET_WINDOWS_NT): New macros. + (ASM_OUTPUT_ADDR_DIFF_ELT): Use TARGET_WINDOWS_NT. + * alpha.c (output_prolog): Test TARGET_WINDOWS_NT, not WINDOWS_NT. + * alpha.md: Likewise. + * alpha/config-nt.sed: Properly set tm_file and {build,host}_xm_file. + * alpha/win-nt.h: Don't include alpha.h + (WINDOWS_NT): No longer define. + * alpha/xm-winnt.h: Don't include xm-alpha.h and winnt/xm-winnt.h. + +Fri May 24 12:34:22 1996 Doug Evans <dje@seba.cygnus.com> + + * configure (cpu_type): Add case for arm. + (sparclet-*-aout*): Delete extra_headers. + + * varasm.c (asm_output_bss): New argument DECL. + Use ASM_DECLARE_OBJECT_NAME if defined. + (asm_output_aligned_bss): Likewise. + (assemble_variable): Pass DECL to ASM_OUTPUT{,_ALIGNED}_BSS. + * arm/aout.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * h8300/h8300.h (ASM_OUTPUT_BSS): Update. + * i386/linux.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * i386/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * m68k/coff.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * m68k/linux.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * m68k/m68k-aout.h (ASM_OUTPUT_BSS): Update. + * rs6000/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * rs6000/win-nt.h (ASM_OUTPUT_ALIGNED_BSS): Update. + * sparc/sysv4.h (ASM_OUTPUT_ALIGNED_BSS): Update. + +Thu May 23 19:55:52 1996 Jim Wilson <wilson@cygnus.com> + + * combine.c (set_nonzero_bits_and_sign_copies): Set + reg_sign_bit_copies to one not zero to indicate that the value + is unknown. + +Thu May 23 18:39:24 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * config/netbsd.h (SWITCH_TAKES_ARG): Add -R. + (LINK_SPEC): Add %{R*}. + + * m68k/lb1sf68.asm: Construct exception masks at compile time + instead of or'ing in bits at run time. + +Thu May 23 15:53:06 1996 Ian Lance Taylor <ian@cygnus.com> + + * sh/sh.md: Add new instruction types fp and fpdiv. Set new + instruction types where appropriate. Add function unit fp. + Claim that store instructions use function unit memory. + +Thu May 23 00:36:19 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.h (CONSTANT_ADDRESS_P): Don't accept CONST or HIGH + on the H8/300H. + * h8300/h8300.md: Use "m" rather than "o" constraint everywhere + appropriate. Cleanup use of "i" and "n" constraints. + +Wed May 22 17:43:37 1996 Jim Wilson <wilson@cygnus.com> + + * fixincludes (pthread.h): Add extern to __page_size* declarations + for AIX 4.1.x. + + * combine.c (nonzero_bits): Don't assume arg pointer has same + alignment as stack pointer. + +Wed May 22 16:09:05 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (LINK_START_DEFAULT_SPEC): Spell macro correctly. + (LIB_DEFAULT_SPEC): Provide default version. + +Wed May 22 11:23:57 1996 J"orn Rennecke (amylaar@meolyon.hanse.de) + + * i386.md (return_pop_internal): new pattern. + (pop): disable emitting of bogus move instruction. + * i386.c (ix86_expand_epilogue): use gen_return_pop_internal to + simultanously return and pop args; removed stray semicolon. + * config/linux-aout.h, config/linux.h (SET_ASM_OP): Added for + __attribute__ ((alias ())) support. + +Wed May 22 08:06:42 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu.edu> + + * combine.c (init_reg_last_arrays, setup_incoming_promotions): + Correct prototypes. + +Tue May 21 13:42:17 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.md (div patterns): Rewrite. + (mod patterns): Likewise. + + * pa/pa.c (basereg_operand): Never accept a CONST_INT. + +Tue May 21 12:26:40 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * pa/pa-hpux9.h, pa-osf.h (LINK_SPEC): Provide version for Snake. + +Tue May 21 07:20:48 1996 Pat Rankin <rankin@eql.caltech.edu> + + * vax.h (TARGET_NAME): Define unless already defined. + (TARGET_VERSION): Print TARGET_NAME. + * vax/vms.h (TARGET_NAME): Always redefine. + (TARGET_VERSION): Delete; retain vax.h definition. + +Mon May 20 14:00:44 1996 Jim Wilson <wilson@cygnus.com> + + * sh.c (output_file_start): Delete misplaced semicolon. + +Mon May 20 11:58:15 1996 Jeffrey A. Law <law@cygnus.com> + + * reorg.c (relax_delay_slots): Call update_block before + redirecting a branch past a redundant insn. + +Sun May 19 16:40:53 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * Makefile.in (libobjc.a, sublibobjc.a): 'specs' added to + dependencies. + +Sun May 19 12:25:48 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure: Add new switch to provide default for cpu_type; + delete numerous settings of it in main switch. + (hppa): Reflect rerrangements below; use new configure features. + * pa/pa-gas.h, pa/pa-pro-end.h: New files. + * pa/pa1.h, pa/pa1-osf.h, pa/pa1-ghpux.h, pa/pa1-oldas.h: Deleted. + * pa/pa1-ghpux9.h, pa/pa1-hpux9.h, pa/pa1-hpux.h: Deleted. + * pa/pa1-ghiux.h, pa/pa1-hiux.h, pa/pa-ghpux.h: Deleted. + * pa/pa-gux7.h, pa/pa-ghiux.h: Deleted. + * pa/pa-hiux.h: No longer include pa-hpux.h. + * pa/pa-hpux.h: No longer include pa.h. + (TARGET_DEFAULT): Unset before setting. + (LINK_SPEC): Provide option for pa1. + * pa/pa-hpux7.h: No longer include pa.h. + (HP_FP_ARG_DESCRIPTOR_REVERSED): Don't define here. + * pa/pa-hpux9.h, pa/pa-oldas.h: No longer include pa-hpux.h. + (TARGET_DEFAULT): Don't need to set here. + * pa/pa-osf.h: No longer include pa.h. + (TARGET_DEFAULT): Don't define; identical to default. + * pa/pa-pro.h: No longer include pa.h. + Move definitions after include to new file pa-pro-end.h. + * pa.h (TARGET_SWITCHES): Include TARGET_CPU_DEFAULT. + (TARGET_CPU_DEFAULT): Provide default value. + (CPP_SPEC): Test TARGET_CPU_DEFAULT too. + + * Makefile.in (function.o): Includes bc-emit.h. + (reg-stack.o): Includes insn-flags.h. + * expr.h (function_value): Deleted; no such function. + (bc_build_calldesc, bc_runtime_type_code): New declarations. + * c-decl.c: Add prototypes for all static functions. + * c-iterate.c: Likewise. + * dbxout.c: Likewise. + (adspath): Delete; never used and has numerous parse errors. + * dwarfout.c: If not GNUC, make `inline' null; otherwise, leave alone. + Add `static' to inline functions. + Add prototypes for static function. + * expr.c (bc_runtime_type_code): Delete redundant declaration. + * function.c: Include bc-emit.h. + ({save,restore}_machine_status): Add prototype for args. + (bc_runtime_type_code, bc_build_calldesc): Delete redundant decls. + (bc_emit_trampoline, bc_end_function): Likewise. + * reg-stack.c: Include insn-flags.h. + Add prototypes for static functions. + (gen_jump, gen_movdf, gen_movxf): Delete redundant declarations. + (find_regno_note, emit_jump_insn_before, emit_label_after): Likewise. + (swap_rtx_condition): Now static. + * sdbout.c: Add prototypes for static functions. + (sdbout_parms, sdbout_reg_parms): Delete extra parm to plain_type. + +Sun May 19 11:50:10 1996 John Carr <jfc@mit.edu> + + * alpha.c (alpha_emit_conditional_move): Compare to 0 in correct mode. + +Sat May 18 20:17:27 1996 Jim Wilson <wilson@cygnus.com> + + * sh.c (prepare_move_operands): If source is r0, and dest is reg+reg + MEM, then copy source to a pseudo-reg. + * sh.md (untyped_call): New pattern. + + * unroll.c (copy_loop_body): When update split DEST_ADDR giv, + check to make sure it was split. + (find_splittable_givs): Fix reversed test of verify_addresses result. + +Sat May 18 10:26:04 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * tree.c (unsave_expr_now): Avoid use of NULL_RTX since no rtl.h. + + * configure: Set cpu_default, tm_file, and xm_file early. + Remove redundant settings of those, tmake_file, and xmake_file. + Use ${tm_file} and ${xm_file} to refer to the main files. + Sort some entries for consistency and reformat some others. + (rs6000, powerpc): Remove bogus test on host == target. + (alpha-*-linux): xm-linux.h no longer includes xm-alpha. + (alpha-*-osf*): Remove redundant setting of target_cpu_default. + (*-convex-*): Use target_cpu_default instead of separate .h files. + (clipper-intergraph-clix*): clix.h no longer includes any files. + (i860, i960, pdp11): Reflect removal of includes listed below. + * alpha/xm-linux.h: No longer include xm-alpha.h. + * clipper/clix.h: No longer include clipper.h and svr3.h. + * convex.h: Provide a default for TARGET_DEFAULT. + Take "or" of TARGET_DEFAULT and TARGET_CPU_DEFAULT everywhere. + * convex/convex{1,2,32,34,38}.h: Deleted. + * i860/bsd-gas.h: No longer include bsd.h. + * i860/bsd.h: No longer include i860.h. + * i860/fx2800.h: No longer include i860/sysv4.h. + (OUTPUT_TDESC): No longer define. + (ASM_FILE_END): Move redefinition to here. + * i860/mach.h: No longer include i860.h. + * i860/paragon.h, i860/sysv3.h: No longer include i860.h and svr3.h. + * i860/sysv4.h: No longer include i860.h and svr4.h. + (ASM_FILE_END): Delete redefinition from here. + * i860/xm-fx2800.h: No longer include xm-i860.h. + * i860/xm-paragon.h, i860/xm-sysv{3,4}.h: Deleted. + * i960/i960-coff.h: No longer include i960.h and dbxcoff.h. + * i960/vx960-coff.h: No longer include i960-coff.h. + * i960/vx960.h: No longer include i960.h. + * pdp11/2bsd.h: No longer include pdp11.h. + + * i370/i370.h: Renamed from mvs.h. + * i370/i370.c: Renamed from mvs370.c. + * i370/t-i370: Renamed from t-mvs. + * i370/xm-i370.h: Renamed from xm-mvs.h. + * configure (i370-*-mvs*): Use default names for all files. + + * c-parse.in: Update number of shift/reduce conflicts for objc. + +Sat May 18 08:20:17 1996 Dennis Glatting (dennisg@plaintalk.bellevue.wa.us) + + * m68k/next.h (FINALIZE_TRAMPOLINE): Add missing backslashes. + +Fri May 17 19:57:20 1996 Pat Rankin <rankin@eql.caltech.edu> + + * vax/xm-vms.h (dbxout_resume_previous_source_file): New macro. + +Fri May 17 14:20:13 1996 Mike Stump <mrs@cygnus.com> + + * expr.c (expand_expr, cond TARGET_EXPR): Make TARGET_EXPRs + redoable for UNSAVE_EXPR. + * stmt.c (expand_decl_cleanup): Wrap the cleanup in an UNSAVE_EXPR + to that we can redo it. + * tree.c (unsave_expr_now): Handle TARGET_EXPRs fully now. + * tree.def (TARGET_EXPR): Add a fourth field so that TARGET_EXPRs + are redoable. + + * expr.c (expand_expr, cond UNSAVE_EXPR): Move from the C++ + frontend to the backend where it belongs. + * tree.c (unsave_expr): Likewise. + (unsave_expr_now): Likewise. + * tree.def (UNSAVE_EXPR): Likewise. + * tree.h (unsave_expr): Likewise. + (unsave_expr_now): Likewise. + +Fri May 17 15:04:40 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (lshrsi3 insns): Add special case code for shifting by + 0 to avoid bad code generated with no optimization. + +Fri May 17 13:50:55 1996 Jason Merrill <jason@yorick.cygnus.com> + + * i386/unix.h (ASM_OUTPUT_MI_THUNK): Define. + * i386/{att.h,bsd.h,sun386.h} (ASM_OUTPUT_MI_THUNK): Delete. + +Fri May 17 13:34:28 1996 Ian Lance Taylor <ian@cygnus.com> + + * config/fp-bit.c (_fpdiv_parts): Correct sign handling when + dividing zero or infinity by something. + +Fri May 17 12:36:36 1996 Doug Evans <dje@seba.cygnus.com> + + Standardize option output in assembler files. + * Makefile.in (toplev.o): Pass -DTARGET_NAME. + * arm/aout.h (ASM_OUTPUT_OPTIONS): Delete. + (ASM_FILE_START): Delete option output support. + * arm/arm.c (output_option, output_options, m_options): Delete. + * m88k/m88k.c (output_file_start): Delete option output support. + * m88k/m88k.h (ASM_COMMENT_START): Define. + * mips/mips.c (target_switches, print_options): Delete. + (mips_asm_file_start): Put output of -G,Cpu,ISA here. + * mips/mips.h (ASM_COMMENT_START): Change from "\t\t#" to " #". + * rs6000/rs6000.c (output_option, m_options, output_options): Delete. + * rs6000/rs6000.h (ASM_OUTPUT_OPTIONS): Delete. + (ASM_COMMENT_START): Define. + (ASM_FILE_START): Delete option output support. + * rs6000/sysv4.h (ASM_FILE_START): Likewise. + * rs6000/win-nt.h (ASM_FILE_START): Likewise. Delete duplicate. + * sh/sh.c (output_option, m_options, output_options): Delete. + (output_file_start): Delete option output support. + * sh/sh.h (ASM_FILE_START): Likewise. + (ASM_COMMENT_START): Define. + * dwarfout.c (*): flag_verbose_asm renamed to flag_debug_asm. + * flags.h (flag_debug_asm): Declare. + * toplev.c (print_version): New function. + (print_single_switch): New arguments pos, max, indent, sep, term. + (print_switch_values): New arguments pos, max, indent, sep, term. + Update call to print_single_switch. Output options passed and + options enabled. + (MAX_LINE): New macro. + (flag_debug_asm): Define. + (compile_file): Output options to assembler file. + (main): Recognize -dA. Call print_version. Update call to + print_switch_values. + (line_position): Deleted. + +Fri May 17 10:50:44 1996 Stan Cox (coxs@dg-rtp.dg.com) + + * i386.c (function_prologue, ix86_expand_prologue, + function_epilogue, ix86_expand_epilogue): Generate prologue and + epilogue as RTL (prior to scheduling) instead of emitting asm. + (override_options): If only -march is given, make it the default -mcpu. + * i386.h (FUNCTION_BEGIN_EPILOGUE): Renamed from FUNCTION_EPILOGUE. + * i386.md (return, return_internal, prologue, prologue_set_got, + prologue_get_pc, epilogue, leave, pop): New patterns for emitting + asm from prologue and epilogue RTL. + * m88k/t-dgux (T_CFLAGS): Delete. + * m88k/x-dgux (X_CFLAGS): New. + +Fri May 17 09:54:23 1996 Jim Meyering (meyering@asic.sc.ti.com) + + * Makefile.in (stamp-crt{,S}): Use -o to avoid conflicts if + both of these are built in parallel. + +Fri May 17 08:55:19 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expmed.c (store_split_bit_field): Don't assume the alignment + of VALUE is the same as the record. + + * configure: Write #define TARGET_CPU_DEFAULT into tm.h + instead of defining MAYBE_TARGET_DEFAULT in Makefile. + (alpha-*-linux): Set target_cpu_default to 4 and xmake_file to none. + (alpha-*-osf*): Set target_cpu_default to 4 if --gas. + * Makefile.in (gcc.o, toplev.o, $(out_object_file)): + Remove MAYBE_TARGET_DEFAULT. + + * combine.c (insn_cuid): New function. + (INSN_CUID): Sometimes call it. + +Fri May 17 08:12:37 1996 Scott Christley <scottc@net-community.com> + + * objc/sendmsg.c (objc_get_uninstalled_dtable): New function. + * objc/objc-api.h (objc_get_uninstalled_dtable): New declaration. + + * objc/thr-os2.c, objc/thr-posix.c, objc/thr-mach.c: New files. + * objc/THREADS.MACH: New file. + + * objc/sendmsg.c (nil_method): Deleted from here. + * objc/nil_method.c: New file. + * Makefile (OBJC_O): Add dependency for nil_method.c. + + * objc/hash.c (hash_is_key_in_hash): New function. + * objc/hash.h: Include objc/objc.h here instead of in objc/hash.c + to get BOOL typedef. + +Fri May 17 08:01:48 1996 Doug Rupp (rupp@gnat.com) + + * msdos/configur.bat: If Ada subdirectory present, adjust Makefile. + +Fri May 17 07:40:04 1996 Ulrich Drepper (drepper@cygnus.com) + + * stddef.h: If need_wint_t defined, nothing in this file is needed. + (_WINT_T, __WINT__TYPE__, wint_t): Define under certain circumstances. + +Thu May 16 18:53:25 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * fold-const.c (fold, case EQ_EXPR): When folding VAR++ = CONST, + mask the new const if VAR is a bitfield reference; also for VAR--. + +Thu May 16 18:29:03 1996 Doug Evans <dje@seba.cygnus.com> + + * varasm.c (function_section): Delete flag_function_sections support. + (assemble_start_function): Put it here. Use UNIQUE_SECTION if defined. + +Wed May 15 13:35:11 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.{h,c,md} (rs6000_pic_register): Delete all uses, use + pic_offset_table_rtx instead. + + * rs6000.md (move_to_float): Rewrite so that it uses the register + allocator to allocate the stack temp, instead of calling + rs6000_stack_temp. + (fix_truncdfsi2): Ditto. + + * rs6000.c (rs6000_stack_temp): Delete, no longer used. + +Wed May 15 10:39:27 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Define. + +Sat May 11 07:42:59 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (store_field): Support BLKmode bitfield if aligned on + byte boundary using emit_block_move. + (expand_expr, case COMPONENT_REF): Likewise. + +Fri May 10 18:33:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * configure (alpha-*-linux): Reverse order in tm_file list. + Delete xmake_file. + * alpha/x-linux: Deleted. + * alpha/linux.h (ASM_FINAL_SPEC): Add #undef. + * alpha/xm-linux.h: Remove bogus trailing #endif. + + * loop.c (maybe_eliminate_biv_1): Disable all but two cases + of biv elimination with givs and restrict those two cases to + an ADD_VAL that is an address. + + * flow.c (mark_set_1, mark_used_regs): Clean up usages + of ALL_NEEDED; change to SOME_NOT_NEEDED and set properly. + +Fri May 10 11:37:38 1996 Jason Merrill <jason@yorick.cygnus.com> + + * toplev.c (compile_file): Don't warn about artificial functions + declared static and not defined. + +Thu May 9 22:03:28 1996 Doug Evans <dje@cygnus.com> + + * varasm.c (assemble_start_function): ASM_DECLARE_FUNCTION_NAME + needn't consider bytecodes. + (assemble_variable): ASM_DECLARE_OBJECT_NAME needn't + consider bytecodes. + * toplev.c (rest_of_decl_compilation): Likewise with + ASM_FINISH_DECLARE_OBJECT. + * arm/aof.h (ASM_DECLARE_{FUNCTION,OBJECT}_NAME): Delete bytecode + support. + * vax/vms.h (ASM_DECLARE_OBJECT_NAME): Likewise. + +Thu May 9 19:36:13 1996 Jim Wilson <wilson@cygnus.com> + + * sh.h (SET_ASM_OP): Define. + +Thu May 9 13:31:58 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sysv4.h (SUBTARGET_{SWITCHES,OPTIONS}): Add support for + finer grain control on -msdata, so that eabi people can specify to + compile sdata code to only use r13 instead of r2/r13. Make + -mrelocatable-lib turn off -msdata, just like -m relocatable does. + (SUBTARGET_OVERRIDE_OPTIONS): Ditto. + (ENCODE_SECTION_INFO): Move to rs6000.c. + (ASM_SPEC): -msdata=eabi sets -memb also. + (CC1_SPEC): -mno-sdata gets converted to -msdata=none. + + * rs6000.c (rs6000_sdata{,_name}): Add support for finer grain + control on -msdata. + (output_options): Ditto. + (small_data_operand): Ditto. + (print_operand): Ditto. + (rs6000_select_section): Ditto. + (rs6000_encode_section_info): Move here from sysv4.h, section + names are stored as STRING nodes, not IDENTIFIER. + +Wed May 8 21:04:49 1996 Doug Evans <dje@cygnus.com> + + * function.c (aggregate_value_p): Return 1 if TREE_ADDRESSABLE. + * pa/pa.h (RETURN_IN_MEMORY): No longer test for TREE_ADDRESSABLE. + +Tue May 7 13:42:57 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.c: Include obstack.h. + (bit_memory_operand): New function. + (print_operand): Append ":16" to a memory reference to + the tiny data area. + (h8300_tiny_data_p): New function. + (h8300_valid_machine_decl_attribute): Accept "tiny_data". Fix + typo. + (h8300_encode_label): New function. + (h8300_adjust_insn_length): References to the tiny data section + are two bytes shorter than normal accesses on the H8/300H. + * h8300/h8300.h (OK_FOR_U): Fix thinko. + (ENCODE_SECTION_INFO): Encode info for tiny data variables. + (STRIP_NAME_ENCODING): Define. + * h8300/h8300.md (movqi insn): Fix length for a constant load. + (movstrictqi): Likewise. + (movhi, movstricthi): Likewise. + (memory btst patterns): Add register to the constraints to keep + reload happy. + + * h8300/h8300.h (OK_FOR_U): (const (plus (symbol_ref) (const_int))) + is a valid U operand if SYMBOL_REF_FLAG is set on the + SYMBOL_REF. + * h8300/h8300.md (memory btst patterns): New patterns. + + * h8300/h8300.c (h8300_eightbit_data_p): Renamed from + h8300_tiny_data_p. + (h8300_eightbit_data_p): Check for the "eightbit_data" + attribute instead of "tiny_data". + (h8300_valid_machine_decl_attribute): Likewise. + * h8300/h8300.h (ENCODE_SECTION_INFO): Call h8300_eightbit_data_p + instead of h8300_tiny_data_p. + + * h8300/h8300.h (READONLY_DATA_SECTION): Define. + (EXTRA_SECTIONS): Add in_readonly_data. + (READONLY_DATA_SECTION_ASM_OP): Define. + (EXTRA_SECTION_FUNCTINOS): Add readonly_data. + +Tue May 7 09:26:24 1996 Jason Merrill <jason@yorick.cygnus.com> + + * varasm.c (make_decl_rtl): Update DECL_ASSEMBLER_NAME for local + statics. Remove reference to flag_no_common. + +Mon May 6 21:38:36 1996 Paul Eggert <eggert@twinsun.com> + + * cpplib.c (skip_comment, handle_directive): Don't use uninit vars. + +Mon May 6 18:47:36 1996 Doug Evans <dje@cygnus.com> + + * dbxout.c (dbxout_function): When deciding to call dbxout_function_end + change test from flag_function_sections to DECL_SECTION_NAME != NULL. + + * varasm.c (named_section): Accept any decl. + +Mon May 6 16:41:08 1996 Stan Cox (coxs@dg-rtp.dg.com) + + * final.c (final_scan_insn): Modify conditional moves whose cc is + nonstandard. + + * c-common.c (decl_attributes): Chain multiple attributes correctly. + +Mon May 6 15:41:43 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * stmt.c (expand_decl): Don't deduce alignment of SIZE from + DECL_ALIGN; use TYPE_ALIGN instead. + + * function.c (assign_parms): Set RTX_UNCHANGING_P in stack_parm + if parm is read-only. + + * c-common.c (truthvalue_conversion, case ADDR_EXPR): Don't + treat address of external decl as always nonzero. + +Mon May 6 11:33:57 1996 Jason Merrill <jason@yorick.cygnus.com> + + * c-decl.c (start_decl): Check -fno-common here. + * varasm.c (assemble_variable): Instead of here. + * final.c (end_final): Likewise. + * c-common.c (init_attributes, decl_attributes): Add A_COMMON. + +Mon May 6 11:12:39 1996 Mike Stump <mrs@cygnus.com> + + * expr.c (expand_increment): Add third parameter to know when to + ignore the result value. + (store_constructor): Likewise + (expand_expr, case {PRE,POST}{INC,DEC}REMENT_EXPR): Likewise. + * tree.c (stabilize_reference): Always ignore the first operand of + COMPOUND_EXPRs. + +Mon May 6 13:14:45 1996 Jim Wilson <wilson@cygnus.com> + + * sh.c (gen_shifty_op): Truncate VALUE to avoid out of bounds array + access. + + * expr.c (expand_expr, case INDIRECT_REF): Delete obsolete code + to special case a SAVE_EXPR operand. + +Mon May 6 10:00:12 1996 Pat Rankin <rankin@eql.caltech.edu> + + * vax.h (ASM_OUTPUT_MI_THUNK): Define. + +Mon May 6 09:49:10 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k/linux.h: Use the new trampoline definition. + (TRAMPOLINE_TEMPLATE, TRAMPOLINE_SIZE): Deleted. + (INITIALIZE_TRAMPOLINE): Changed. + (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New. + +Mon May 6 09:43:55 1996 Patrick J. LoPresti (patl@lcs.mit.edu) + + * rtlanal.c (rtx_addr_varies_p): Scan operands of type `E'. + +Mon May 6 09:04:40 1996 H.J. Lu (hjl@gnu.ai.mit.edu) + + * x-linux{,-aout} (BOOT_CFLAGS, STMP_FIXPROTO, STMP_FIXPROTO): Deleted. + * config/t-linux (BOOT_CFLAGS, STMP_FIXPROTO, STMP_FIXPROTO): New, + moved from x-linux. + * t-linux-aout: New file. + * configure (i[3456]86-*-linux*oldld*, i[3456]86-*-linux*aout*): + Set tmake_file to t-linux-aout. + +Sun May 5 22:13:22 1996 H.J. Lu (hjl@gnu.ai.mit.edu) + + * Makefile.in (gxx_include_dir): Change to $(prefix)/include/g++. + (old_gxx_include_dir): New - defined as $(libdir)/g++-include. + (cccp.o, cpplib.o): Also pass OLD_GPLUSPLUS_INCLUDE_DIR (set + from $(old_gxx_include_dir)). + * cccp.c (include_defaults_array): For C++, also search + OLD_GPLUSPLUS_INCLUDE_DIR. + * cpplib.c (default_include): Likewise. + * configure: Remove no-longer-needed support for --gxx-include-dir. + +Sun May 5 21:59:53 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * c-lex.c (check_newline): Fix #pragma parsing; issue error message + for directive that starts with `p' but isn't `pragma'. + +Sun May 5 13:13:40 1996 Jeremy Bettis <jeremy@hksys.com> + + * objc/hash.c (hash_value_for_key): Prevent endless loop when 0 was + stored in a hashtable. + +Sun May 5 13:09:54 1996 Satoshi Adachi (adachi@wisdom.aa.ap.titech.ac.jp) + + * m68k/newsgas.h (SET_ASM_OP, ASM_WEAKEN_LABEL): Define. + +Sun May 5 12:48:08 1996 Stephen L Moshier (moshier@world.std.com) + + * tree.c (build_real_from_int_cst): Remove spurious test for + REAL_IS_NOT_DOUBLE. + +Sat May 4 12:17:58 1996 Richard Earnshaw (rearnsha@armltd.co.uk) + + * arm.h (ASM_OUTPUT_MI_THUNK): Moved here from aout.h. Rewrite to be + independent of the selected assembler, and to use optimal number of + instructions. + * arm/aout.h (ASM_OUTPUT_MI_THUNK): Delete. + + * arm/aout.h (ASM_OUTPUT_OPTIONS): Define. + (ASM_FILE_START): Call ASM_OUTPUT_OPTIONS. + (BSS_SECTION_OP): Define. + (ASM_OUTPUT_ALIGN): Don't output anything if byte alignment is wanted. + (ASM_OUTPUT_ALIGNED_BSS): Define. + * arm.h (target_cpu_name): Delete. + (TARGET_SWITCHES): Delete "be" and "le". + (TARGET_OPTIONS): Delete "cpu-", add "tune=". + (struct arm_cpu_select): New struct. + (PROCESSOR_DEFAULT, TARGET_CPU_DEFAULT): Define. + (EXTRA_CC_MODES, EXTRA_CC_NAMES): Add CC_Cmode. + (CANONICALIZE_COMPARISON): Define. + * arm.c (arm_select): Declare and initialize. + (all_procs): Add arm7100. + (arm_override_options): Parse arm_select structure to determine + selected architecture and tuning parameters. + (output_option, output_options): New functions. + (arm_canonicalize_comparison): New function. + (arm_gen_movstrqi): Don't add a writeback of the index registers for + the last instructions. + (arm_select_cc_mode): Detect case where mode is carry out of unsigned + arithmetic. + (output_lcomm_directive): Use bss_section (), and use alignment + rather than rounding. + (get_arm_condition_code): Handle CC_Cmode. + (final_prescan_insn): Avoid boundary case where we would occasionally + inline MAX_INSNS_SKIPPED+1 insns. Allow call_insns to be inlined in + APCS_32 mode if they are the last insn in the block. + * arm.md (*addsi3_compareneg): Delete potentially unsafe insn. + (*addsi3_compare_op[12]): New insns. + (*compare_addsi2_op[01]): New insns. + (*addsi3_carryin, *addsi3_carryin_alt[12]): New insns. + (*cmp_ite1): Use arm_add_operand instead of arm_rhs_operand. + * semi.h (PROCESSOR_DEFAULT): Default to PROCESSOR_ARM6. + +Fri May 3 10:52:11 1996 1996 Stan Cox (coxs@dg-rtp.dg.com) + + * i386.md (movesicc, movehicc) Pentium Pro conditional move insns. + + * i386.h (TARGET_PENTIUMPRO, TARGET_CMOVE, BRANCH_COST, + ASM_OUTPUT_FUNCTION_PREFIX): New macros for conditional move. + + * i386.c (asm_output_function_prefix, function_prologue): Setup + pic on Pentium Pro so a return will match the call. + (print_operand, put_condition_code): Output conditional move suffixes. + +Fri May 3 10:52:11 1996 Jason Merrill <jason@yorick.cygnus.com> + + * i386/{att.h,gas.h,bsd.h,sub386.h} (ASM_OUTPUT_MI_THUNK): Define. + +Wed May 1 17:54:51 1996 Doug Evans <dje@cygnus.com> + + * sparc.h (ASM_OUTPUT_MI_THUNK): Fix for sparc64, optimize. + +Wed May 1 13:28:32 1996 Jason Merrill <jason@yorick.cygnus.com> + + * i386/linux.h (ASM_OUTPUT_ALIGNED_BSS): Define. + * i386/sysv4.h: Likewise. + * sparc/sysv4.h: Likewise. + +Wed May 1 01:44:47 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.c (h8300_adjust_insn_length): Adjust the cost of + shifts by small constant values. + * h8300/h8300.md: Refine comments. Remove names from many + patterns which don't need them. + (compare insns): Don't underestimate lengths. + (andqi3 expander): Remove constrains. + (andhi3): Don't underestimate length. + (andsi3): Don't underestimate length. Improve code when upper + or lower half of destination is being cleared. + (indirect_jump_h8300, indirect_jump_h8300h): Simplify. + (shift insns): Remove useless "I" constraint. + + * h8300/h8300.md (bcs type): Remove "bcs" type attribute and + all references. + (bcs insns): Delete. No longer needed. + (setcc from bitfield): Rewrite to use zero_extract. Provide + QImode, HImode and SImode variants. + +Tue Apr 30 18:13:09 1996 Jason Merrill <jason@yorick.cygnus.com> + + * svr4.h (SELECT_SECTION): If RELOC is true, put it in data. + +Tue Apr 30 17:26:30 1996 Jason Merrill <jason@yorick.cygnus.com> + + * fold-const.c (fold): Don't call convert to recreate tree nodes + we already have. + +Tue Apr 30 16:52:41 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.c (one_insn_adds_subs_operand): New function. + (h8300_adjust_insn_length): New function. + * h8300/h8300.h (ADJUST_INSN_LENGTH): Define. + * h8300/h8300.md: Remove obsolete comments. + (move patterns): Tweak constraints. + (tst patterns): Use "register_operand" for predicate. + (adds pattern): Use one_insn_adds_subs_operand to get length + computation correct. + (subs pattern): Similarly. + (movstrhi): Remove unused expander. + (fancy*, pxor, and-not patterns): Remove. No longer needed. + +Tue Apr 30 13:35:06 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/sol-c0.c (_start): Temporarily display calling + __do_global_ctors, since the Solaris linker doesn't handle the + relocations properly. + +Mon Apr 29 13:03:12 1996 Doug Evans <dje@cyguns.com> + + * sparc/vxsparc.h: sparc-aout.h renamed to aout.h. + +Mon Apr 29 00:35:15 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.c (names_small): Remove "BAD" postfix from + %r7 byte registers. + (rtx_equal_function_value_matters): Remove extra declaration. + (output_simode_bld): New function. + * h8300/h8300.h (NO_FUNCTION_CSE): Do define this. Register + pressure makes cse-ing function addresses rarely a win. + (reg_class): Remove unnecessary register classes LONG_REGS, + SP_REG, SP_AND_G_REGS. + (REG_CLASS_NAMES): Corresponding changes. + (REG_CLASS_CONTENTS): Corresponding changes. + (REGNO_REG_CLASS): Corresponding changes. + (REG_CLASS_FROM_LETTER): Corresponding chagnes. + (output_simode_bld): Declare. + * h8300/h8300.md: Nuke comments for stuff which has been fixed. + (all patterns): Remove references to register class "a" (SP_REGS) + which no longer exists. + (many patterns): Accept auto-inc auto-dec addresses in more cases. + (zero_extendqisi2): New pattern for the H8/300. + (zero_extendhisi2): Only use zero_extendhisi2_h8300 when not optimizing. + (extendhisi2): Only use extendhisi2_h8300 when not optimizing. + (extendqisi2): New pattern for the H8/300. + (bitfield related patterns): Completely rewrite. + (fancy_bclr, fancy_btst): Deleted. Redundant with new bitfield + patterns. + (addhi3 pattern for h8300): Handle case where we can't make matching + constraints (works around hard to fix reload problem). + (stack_pointer_manip): Delete. + (and not patterns): New combiner patterns. + + * pa/pa.h (DBX_OUTPUT_MAIN_SOURCE_FILE_END): Make sure the + final $CODE$ subspace is in the $TEXT$ space. + +Sun Apr 28 14:52:21 1996 Jason Merrill <jason@yorick.cygnus.com> + + * svr4.h (ASM_OUTPUT_SECTION_NAME): If no decl is specified, + make the section read/write data. + +Sat Apr 27 10:28:59 1996 Michael Meissner <meissner@wogglebug.tiac.net> + + * rs6000/t-ppcgas (MULTILIB_EXCEPTIONS): Don't allow -mrelocatable + and -mcall-sysv-noeabi. + + * rs6000/sysv.h (SUBTARGET_OVERRIDE_OPTIONS): The -mcall-aix + option sets -meabi. Don't allow -mrelocatable without -meabi. + +Fri Apr 26 16:10:46 1996 Doug Evans <dje@cygnus.com> + + * sparc/sparc.md (*smacsi,*smacdi,*umacdi): Fix constraint on + operand 0. + +Fri Apr 26 14:36:33 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * gcc/config/i960/t-{960bare,vxworks960} (MULTILIB*): Add + soft-float multilib support. + +Fri Apr 26 06:38:56 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * stor-layout.c (layout_decl): Turn off DECL_BIT_FIELD for BLKmode + that's properly aligned and a multiple of a byte. + +Thu Apr 25 22:43:19 1996 Doug Evans <dje@cygnus.com> + + * i386/gas.h (ASM_OUTPUT_ALIGN): #if 0 out again. + Undoes change of Apr. 9. + * i386/go32.h (ASM_OUTPUT_ALIGN): Define. + +Thu Apr 25 14:05:33 1996 Richard Kenner (kennervlsi1.ultra.nyu.edu) + + * calls.c (expand_call): In inlining case, if BEFORE_CALLS is + zero, start looking at first insn (one more place). + + * expr.c (expand_builtin, case BUILT_IN_SETJMP): CLOBBER the + static chain after label at setjmp point. + +Thu Apr 25 09:02:24 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (print_operand{,_address}): Correct compile error if + TARGET_EABI is not defined. Also, just call small_data_operand, + without testing the ABI. + (rs6000_select_section): Ditto. + + * rs6000/sysv4.h (CC1_SPEC): For -mcall-solaris, don't pass + -mno-main-init. + +Wed Apr 24 18:26:48 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * collect2.c (handler): Delete export_file when we get a signal. + +Wed Apr 24 14:54:44 1996 Jeffrey A. Law <law@cygnus.com> + + * pa/pa1-ghpux.h (LINK_SPEC): Define. Link in PA1.1 libraries + by default. + * pa/{pa1-ghpux9.h, pa1-hpux.h, pa1-hpux9.h}: Likewise. + +Wed Apr 24 11:12:06 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * configure (powerpc{,le}-*-eabi*): Use t-ppc{,gas}, instead of + t-eabi{,gas}. + (powerpc-*-linux,powerpcle-*-solaris): Add definitions. + (MULTILIB_DIRNAMES): Pick shorter names for the multilib + directories. + (MULTILIB_*): Do not build -msdata versions of the library. Build + both system V and eabi versions of the libraries. + + * rs6000/t-ppc{,gas} (MULTILIB*): Don't build -msdata versions of + the libraries. Split -mcall-sysv libraries into + -mcall-sysv-{eabi,noeabi} varients. + (LIB2FUNCS_EXTRA): Add eabi.S, eabi-ctors.c. + (eabi.S): Use eabi.S, not eabi.s for eabi.asm. + (crt files): Add support for Solaris crt files. + + * rs6000/sol{2.h,-c0.c,-ci.asm,-cn.asm}: New files for Solaris + support. + + * rs6000/linux.h: New file for Linux support. + + * rs6000/eabi-ci.asm (ppc-asm.h): Include. + (.got section): Correct attribute. + + * rs6000/eabi-c{i,n}.asm (.init,.finit): Add support for System V + style .init/.fini sections, that constructors and destructors + place a bl <func> in the appropriate section. + + * rs6000/eabi-ctors.c (__do_global_{c,d}tors): Call __init, and + __fini to handle constructors/destructors in the .init, .fini + sections. + + * rs6000/{eabi,sysv}.h: Move most eabi configuration stuff from + eabi.h to sysv.h. + + * rs6000/sysv.h (TARGET_*): Convert -mcall-xxx from a switch into + an option. Add -mcall-{solaris,linux,sysv-eabi,sysv-noeabi} + options. Add -m{,no-}eabi options to control whether we adhere to + the System V spec or the EABI spec. Add -m{,no-}regnames to + control whether registers are printed out as %r0 instead of 0. + (SUBTARGET_OVERRIDE_OPTIONS): Add support for new -mcall options. + (FP_ARG_MAX_REG): Use new macros for ABI conformance. + (RS6000_REG_SAVE): Ditto. + (STACK_BOUNDARY,BIGGEST_ALIGNMENT): If eabi, align to 8 byte + boundary, otherwise 16 byte. + (EXTRA_SECTIONS): Add .init, .fini sections. + (*_SPEC): Reorganize so that the different targets all have sub + specs that go in the specs file. Add support for linux and + Solaris targets. + + * rs6000/{sysv4,eabi}*.h (*_SPECS): Only override the default + spec, all other specs moved to sysv4.h. + (RS6000_ABI_NAME): Use RS6000_ABI_NAME to set the default ABI + name, not TARGET_DEFAULTS. + + * rs6000/xm-sysv4.h (alloca): Properly declare alloca if compiler + is not GCC. + (DONT_DECLARE_SYS_SIGLIST): Define. + + * rs6000.c (rs6000_abi_name): New global for getting the results + of -mcall-xxx. + (rs6000_reg_names): New global for holding the normal register + names. + (alt_reg_names): Alternate register names for -mregnames. + (rs6000_override_options): If -mregnames, copy alt_reg_names into + rs6000_reg_names. + (input_operand): Recognize ABI_SOLARIS. + (small_data_operand): Ditto. + (init_cumulative_args): Ditto. + (function_arg{,_boundary,_advance,_partial_nregs}): Ditto. + (function_arg_pass_by_reference): Ditto. + (setup_incoming_varargs): Ditto. + ({rs6000,debug}_stack_info): Ditto. + (output_{prolog,epilog}): Ditto. + (print_operand): %$ prints '.' on Solaris, '$' elsewhere. + (print_operand{,_address}): If not eabi, use @sdarel for small + data references. + (rs6000_stack_info): Only emit __eabi call if TARGET_EABI. + + * rs6000.h (*_SPECS): Move the System V specs to svr4.h. + (ABI_SOLARIS): New ABI, mostly like System V. + (EXTRA_CONSTRAINT): Use ABI_SOLARIS like ABI_V4. + (RETURN_ADDRESS_OFFSET): Ditto. + (LEGITIMATE_SMALL_DATA_P): Ditto. + (RETURN_IN_MEMORY): On Solaris, small structures are returned in + registers. + (REGISTER_NAMES): Use rs6000_reg_names array, instead of string + literals. + (DEBUG_REGISTER_NAMES): Define. + (ADDITIONAL_REGISTER_NAMES): Add sp, toc aliases. + (PRINT_OPERAND_PUNCT_VALID_P): Recognize $ as a punctuation char. + + * rs6000.md (got & call patterns): Use ABI_SOLARIS to mean the + same as ABI_V4. + (branch patterns): Use %$ for the current location, not just $. + + * va-ppc.h: Add Solaris support. + +Tue Apr 23 20:02:13 1996 Doug Evans <dje@cygnus.com> + + * sparc/sparc.c (output_function_prologue): In -mbroken-saverestore + case, %sp = %fp - size. + * sparc/t-splet (TARGET_LIBGCC2_CFLAGS): Delete. + * sparc/sparc.md (isa attribute): Add sparclet. + (*smacsi,*smacdi,*umacdi): Use match_operand, not match_dup + for third arg. + (*mulsidi3_sp32,const_mulsidi3,*umulsidi3_sp32,const_umulsidi3): Use + smuld,umuld for sparclet. + +Tue Apr 23 16:28:28 1996 Michael Meissner <meissner@wombat.gnu.ai.mit.edu> + + * config/m68k/m68kemb.h: Add {LINK,STARTFILE,LIB,SUBTARGET}_SPEC, so + gcc will use libgloss for supported target boards {idp,mvme,bcc}. + +Tue Apr 23 16:00:28 1996 Per Bothner <bothner@cygnus.com> + + * expr.c (store_constructor): Fix test for missing array elements. + +Tue Apr 23 11:21:09 1996 Stephen L Moshier (moshier@world.std.com) + + * config/i386/sco5.h (BSS_SECTION_ASM_OP): Use `data' directive. + (ASM_OUTPUT_ALIGNED_LOCAL): Generate an `lcomm' directive. + (TARGET_DEFAULT): Include TARGET_IEEE_FP. + (CPP_PREDEFINES): Include Di386. + +Mon Apr 22 12:00:46 1996 David Edelsohn <edelsohn@mhpcc.edu> + + * rs6000.h (BIGGEST_FIELD_ALIGNMENT): Delete. + (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Define. + * sysv4.h (BIGGEST_FIELD_ALIGNMENT): Delete. + (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Undefine. + * win-nt.h (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Undefine. + +Sun Apr 21 17:52:36 1996 Jim Wilson <wilson@cygnus.com> + + * m68k/coff.h (ASM_OUTPUT_SECTION): Test DECL before + dereferencing it. + + * cse.c (cse_process_notes): Handle SUBREG like ZERO_EXTEND. + +Sun Apr 21 12:57:12 1996 Doug Evans <dje@cygnus.com> + + * arm/aout.h (ASM_OUTPUT_MI_THUNK): Define. + +Sun Apr 21 09:50:09 1996 Stephen L Moshier (moshier@world.std.com) + + * choose-temp.c: Include sys/types.h before sys/file.h for sco3.2v5. + +Sun Apr 21 08:42:13 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.c (check_float_value): Cast args of bcopy to avoid warnings. + +Sat Apr 20 21:22:21 1996 David Edelsohn <edelsohn@mhpcc.edu> + + * stor-layout.c (layout_record): Use ADJUST_FIELD_ALIGN to modify + alignment of fields within records. + +Sat Apr 20 19:55:33 1996 Niels Moller <nisse@lysator.liu.se> + + * c-parse.in (typespec): Made <SomeProtocol> equivalent + to (id <SomeProtocol>). + (non_empty_protocolrefs): New nonterminal. + +Sat Apr 20 08:34:02 1996 J"orn Rennecke (amylaar@meolyon.hanse.de) + + * stmt.c (check_for_full_enumeration_handling): Call case_tree2list + before checking for case expressions not corresponding to enumerators. + (mark_seen_cases): If SPARSENESS == 2, exploit AVL order. + Else, convert tree to list. + Set xlo to -1 if SPARSENESS == 1 search failed. + (expand_end_case): Avoid calling case_tree2list on list. + +Fri Apr 19 16:54:57 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000/win-nt.h (BIGGEST_FIELD_ALIGNMENT): Set to 64, not + 32 that AIX uses. + +Fri Apr 19 16:40:38 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * i386.md (movqi): Handle QImode values in %si and %di. + +Thu Apr 18 20:56:56 1996 Jim Wilson <wilson@cygnus.com> + + * sh.md (lshrsi3): Change gen_ashlsi3_d to gen_lshrsi3_d. + +Thu Apr 18 15:49:28 1996 Per Bothner <bothner@cygnus.com> + + * sparc.h (ASM_OUTPUT_MI_THUNK): Define. + +Thu Apr 18 15:19:26 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.md: Remove "type" attribute from all patterns + except those which have varying length branches. Eliminate + obsolete "type" attributes. Add additional comments about insn + length computation problems and further optimizations. Add + "length" and "cc" attributes to insns without them, fix a few + length computations. Remove patterns which are commented out. + + * h8300.md (zero extension expanders and insns): Simplify, fix various + length problems, provide optimized versions for the h8300 and h8300h. + (sign extension expanders and insns): Likewise. Make them + nearly identical to zero_extension patterns and insns. + +Wed Apr 17 18:50:16 1996 Jeffrey A. Law <law@cygnus.com> + + * pa.h (SELECT_SECTION): Define. Never place a something + into the read-only data section if it requires a reloc. + + * pa.md (rotlsi3): Delete unnecessary and incorrect pattern. + +Wed Apr 17 17:15:40 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.md (movdi): Never FAIL, even if operand[1] is not a + general operand, due to being in volatile memory. + +Wed Apr 17 15:20:10 1996 Brendan Kehoe <brendan@lisa.cygnus.com> + + * c-lex.c (check_newline): Rewrite to use tokens. + (handle_sysv_pragma): Take a token instead of a character. + * i960.c (process_pragma): Take the IDENTIFIER_POINTER tree + node instead of a character. + * sh.c (handle_pragma): Likewise. + * config/nextstep.c (handle_pragma): Likewise. + * h8300.c (handle_pragma): Likewise. + * i960.h (HANDLE_PRAGMA): Expect/pass 2nd arg of NODE, not CH. + * sh.h (HANDLE_PRAGMA): Likewise. + * config/nextstep.h (HANDLE_PRAGMA): Likewise. + * h8300.h (HANDLE_PRAGMA): Likewise. + +Wed Apr 17 14:28:43 1996 Doug Evans <dje@cygnus.com> + + * choose-temp.c: Don't include sys/file.h ifdef NO_SYS_FILE_H. + #include <stdio.h>. + (choose_temp_base): Make tmp,usrtmp, static locals. + +Wed Apr 17 08:41:02 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.c (alpha_emit_conditional_move): Fix some bugs in previous + change and do some cleanup. + +Tue Apr 16 18:53:05 1996 Jim Wilson <wilson@cygnus.com> + + * reload.c (push_reload): Add extra reload for inside of SUBREG if + it is CONSTANT_P. + + * expr.c (do_store_flag): Rewrite last change to avoid compiler + warnings. + + * reload.c (push_reload): When reuse an old reload, set the modes + to be the larger of the old and new modes. + + * i960/t-960bare (xp-bit.c): Fix typo in source file name. + +Tue Apr 16 18:09:16 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/h8300.md (andhi3): If 2nd operand is a CONST_INT that + meets the 'J' constraint, then only two bytes are needed for + this insn. Improve code generated for the h8300h when both + operands are registers. + (iorhi3, xorhi3): Likewise. Rework to be nearly identical to andhi3. + (andsi3): If 2nd operand is a CONST_INT that meets the 'J' + constraint, then only two bytes are need for this insn. + Improve code generated for the h8300h regardless of the + type of the 2nd operand. Make this pattern work on the h8300 too. + (iorsi3, xorsi3): Likewise. Rework to be nearly identical to andsi3. + (iorqi3_internal): Make this pattern look more like andqi3_internal. + (one_cmplhi2, one_cmplsi2): Fix length computation for H8300H. + +Tue Apr 16 17:43:25 1996 J"orn Rennecke (amylaar@meolyon.hanse.de) + + * i386.md (addsidi3_2): Handle non-MEM overlap case. + +Tue Apr 16 16:59:49 1996 Richard Henderson <rth@tamu.edu> + + * function.c (expand_function_end): Allow TRAMPOLINE_TEMPLATE + to be omitted on systems for which it is not cost effective. + * varasm.c (assemble_trampoline_template): No such function + if no TRAMPOLINE_TEMPLATE. + * m68k.h: Greatly simplify the run-time trampoline code: + (TRAMPOLINE_TEMPLATE, TRANSFER_FROM_TRAMPOLINE): Delete define. + (TRAMPOLINE_SIZE, INITIALIZE_TRAMPOLINE): Changed. + (TRAMPOLINE_ALIGN): No point aligning to cache line. + (FINISH_INIT_TRAMPOLINE): New define. + * m68k/next.h: Instead of redefining INITIALIZE_TRAMPOLINE, + make use of the new FINISH_INIT_TRAMPOLINE. + * m68k/{m68k.h,next.h,aux.h} (FINISH_INIT_TRAMPOLINE): + Rename to FINALIZE_TRAMPOLINE. + * m68k/{linux.h,m68kv4.h}: Override trampoline macros. + +Tue Apr 16 16:02:50 1996 David Edelsohn <edelsohn@mhpcc.edu> + + * combine.c (make_field_assignment): Allow XOR in final case. + +Tue Apr 16 11:33:53 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * m68k.h (TARGET_SWITCHES): Don't remove MASK_68060 with -msoft-float. + + * m68k.h (MULL_COST, MULW_COST, RTX_COSTS): Add costs for TARGET_68060. + * m68k.md (ashlsi_16, lshrsi_16): Disable pattern for TARGET_68060; + this special case is not faster for that cpu. + +Tue Apr 16 10:54:55 1996 Eliot Dresselhaus <dresselh@rft30.nas.nasa.gov> + + * alpha.c (alpha_emit_conditional_move): New function. + * alpha.h (alpha_emit_conditional_move): Declare it. + * alpha.md (cmov* define_expands): Use it. + +Tue Apr 16 09:06:17 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * function.h (struct function): New field returns_pointer. + * function.c (push_function_context_{to,from}): Save and restore + current_function_returns_pointer. + + * config/svr4.h (ENDFILE_SPEC): Add missing `%s'. + + * configure (m68k-*-linux*aout*): Set tmake_file to m68k/t-linux-aout. + (m68k-*-linux*): Set extra_parts. + * m68k/t-linux (INSTALL_ASSERT_H): New definition. + (CRTSTUFF_T_CFLAGS_S, TARGET_LIBGCC2_CFLAGS): New definitions. + * m68k/t-linux-aout: New file. + * m68k/linux.h (LIB_SPEC): Deleted. + (BSS_SECTION_ASM_OP, ASM_OUTPUT_ALIGNED_BSS): Define. + + * m68k.h (TRAMPOLINE_ALIGNMENT): Specify alignment in bits, not bytes. + +Tue Apr 16 08:53:17 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * final.c (final_scan_insn): Allow removal of redundant test and + compare instructions that use clobbers. + +Tue Apr 16 06:22:00 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-decl.c (clear_limbo_values): New function. + (pushdecl): Call it for function body blocks. + + * objc/thr-decosf1.c (_objc_thread_id): Correct return type from + int to _objc_thread_id. + + * expr.c (expand_builtin, case BUILT_IN_LONGJMP): Make a decl + for __dummy, so we can call make_function_rtl on it. + + * expr.c (expand_assignment): Don't pre-evaluate RHS if a CALL_EXPR + with a variable-size return. + +Mon Apr 15 17:38:45 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixincludes: Fix undefined VOIDFUNCPTR in VxWorks 5.2 <time.h>. + +Mon Apr 15 15:12:16 1996 Jim Wilson <wilson@cygnus.com> + + * expr.c (do_store_flag): Before calling exact_log2, remove any + sign extension bits. + + * reload1.c (emit_reload_insns): Call reload_reg_reaches_end_p for + every reg of multi-reg spill register. Invalidate old info for multi + reg spill registers when only part survives to the end. + +Mon Apr 15 14:49:12 1996 Mike Stump <mrs@cygnus.com> + + * function.c (preserve_temp_slots): Only preserve temporaries that + happen to be at the current level. + +Mon Apr 15 14:08:12 1996 Doug Evans <dje@canuck.cygnus.com> + + * gansidecl.h: New file. + * choose-temp.c: New file. + * Makefile.in (xgcc): Depend on and link in choose-temp.o. + (collect2): Likewise. + (choose-temp.o): Add rule for. + * collect2.c: #include "gansidecl.h". + (const,PROTO): Delete. + (P_tmpdir): Delete. + (choose_temp_base): Declare as extern, delete internal copy. + (main): Update call to choose_temp_base. + * cpphash.c: #include "gansidecl.h". + (NULL,const,volatile): Delete. + * demangle.h: #include "gansidecl.h". + (PROTO,PTR,const): Delete. + * expr.h (const): Delete. + * fix-header.c: #include "gansidecl.h". + (const): Delete. + * gcc.c: #include "gansidecl.h". + (PROTO,VPROTO,PVPROTO,VPROTO,VA_START,NULL): Delete. + (GENERIC_PTR,NULL_PTR,P_tmpdir): Delete. + (choose_temp_base): Declare as extern, delete internal copy. + (concat): Rewrite to take a variable number of arguments. + (choose_temp_base_try,concat[346]): Delete. + (translate_options,set_spec,process_command,do_spec_1, + is_directory,main): Always use concat, not concat[346]. Pass + NULL_PTR as trailing arg to concat. + * genattr.c (main): Delete printing of "#define PROTO". + * machmode.h: #include "gansidecl.h". + (PROTO): Delete. + (HAVE_MACHINE_MODES): Move definition to standard place. + * recog.h: #include "gansidecl.h". + (PROTO,const): Delete. + * rtl.h: #include "gansidecl.h". + (PROTO,VPROTO,PVPROTO,VPROTO,VA_START,STDIO_PROTO): Delete. + (NULL,GENERIC_PTR,NULL_PTR): Delete. + * tree.h: Likewise. + +Mon Apr 15 08:49:20 1996 Tom May (ftom@netcom.com) + + * cse.c (invalidate_skipped_set): Ignore CLOBBER after calling + note_mem_written, not before. + +Mon Apr 15 08:22:03 1996 Philippe De Muyter <phdm@info.ucl.ac.be> + + * m68k.md (tstdi): Optimized for "d" case. + (movqi): Allow moving "i" into "a". + (zero_extendsidi2): Alternatives merged. + (extendplussidi): Fixed when operands 0 and 1 share a register. + (adddi_sexthishl32): Constraints reordered for better reload. + (adddi3,subdi_sexthishl32,subdi3,negdi2): Likewise. + (ashldi_sexthi): Accept "m" as operand 0. + (ashldi_const32): Alternatives merged. + (ashift patterns): Output "lsl" instead of "asl". + (beq0_di): If condition codes already set, output only branch insn. + (bne0_di,bge0_di,blt0_di): Likewise. + * m68k.c (notice_update_cc, case ASHIFT{,RT}, LSHIFTRT, ROTATE{,RT}): + Don't set CC_NO_OVERFLOW. + * m68k.h (TARGET_SWITCHES): Fix typo in "c68000" entry. + +Mon Apr 15 08:06:17 1996 Stephen L Moshier (moshier@world.std.com) + + * real.c (eadd1): Check for overflow on X plus X. + +Mon Apr 15 08:02:24 1996 J.T. Conklin <jtc@cygnus.com> + + * i386/netbsd.h (HAVE_SYSV_PRAGMA): Removed definition. + * config/netbsd.h (HAVE_SYSV_PRAGMA): Define. + (SET_ASM_OP): Define. + +Mon Apr 15 07:28:54 1996 Fila Kolodny <fila@ibi.com> + + * configure: Add definition for host= into Makefile. + * build-make (CC): Pass -b $(host), not target. + +Mon Apr 15 05:12:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (bc_expand_increment): Change declaration to return void. + + * toplev.c (max_label_num_after_reload): New variable. + (rest_of_compilation): Set it. + * reorg.c (find_dead_or_set_registers): Only kill spill regs after + label made before jump2. + + * combine.c (expand_field_assignment): Take SUBREG_WORD into + account when have STRICT_LOW_PART. + (make_extraction): Make a STRICT_LOW_PART at any low-order word. + +Mon Apr 15 03:43:11 1996 Jeffrey A. Law <law@cygnus.com> + + * flags.h (flag_function_sections): Declare. + * toplev.c (flag_function_sections): Define. + (compile_file): Add warnings when -ffunction-sections is + used with -g, or profiling. Disable -ffunction-sections + when profiling is used. Add warning when -ffunction-sections + is used on a target that doesn't support it. + * varasm.c (named_section): Make a copy of the section name + in case the original is in temporary storage. + (function_section): Set DECL_SECTION_NAME for each function + if flag_function_sections is on and the target supports it. + * dbxout.c (dbxout_function_end): New function. + (dbxout_function): Call dbxout_function_end if using extensions + and flag_function_sections is on. + * sparc/sysv4.h (ASM_OUTPUT_SECTION_NAME): Prefix a function + section's name with ".text%" when -ffunction-sections. + +Sun Apr 14 19:37:43 1996 Doug Evans <dje@cygnus.com> + + * toplev.c (main): Delete redundant test for -p used with -fbytecode. + +Sun Apr 14 19:01:59 1996 John F. Carr <jfc@mit.edu> + + * c-decl.c (finish_enum): Don't crash if no type can represent all + enumeration values. + +Sun Apr 14 18:56:40 1996 J.T. Conklin <jtc@rtl.cygnus.com> + + * m68k.md (ftruncdf2): Enable for m68060 systems. + +Sun Apr 14 18:49:30 1996 David L. Reese (david.reese@east.sun.com) + + * fold-const.c (range_test): Don't convert hi_cst or lo_cst + to unsigned when folding signed range tests. + +Sun Apr 14 08:56:27 1996 Stephen L Moshier <moshier@world.std.com> + + * real.h (ereal_from_{int,uint}): Add new arg, MODE. + (REAL_VALUE_FROM{,_UNSIGNED}_INT): New arg, MODE. + * real.c (ereal_from_{int,uint}): New arg, MODE. + * cse.c (simplify_unary_operation): Add new arg to REAL_VALUE_FROM_INT. + * fold-const.c (fold_convert): Likewise. + * tree.c (real_value_from_int_cst): New arg, TYPE. + Pass mode to REAL_VALUE_FROM_INT. + (build_real_from_int_cst): Properly deal with truncation. + +Sun Apr 14 08:21:29 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * combine.c (try_combine): When substituting in output of I2, + ensure dest isn't clobbered in I2. + + * combine.c (combine_instructions): In initial scan of insns, + handle a REG_INC note's affect on sign bit copies and nonzero bits. + (set_nonzero_bits_and_sign_copies): Treat a zero SET arg as a CLOBBER. + +Sun Apr 14 07:52:28 1996 Manor Askenazi <manor@santafe.edu> + + * objc/encoding.c (objc_skip_typespec): Don't abort for _C_UNDEF. + +Sat Apr 13 20:35:36 1996 Richard Henderson (richard@atheist.tamu.edu) + + * configure (m68k-apple-aux*): Rework to take advantange + of list of tm.h files and support all four gas/gld options. + * m68k/auxas.h, m68k/auxgas.h, m68k/auxgld.h, m68k/auxld.h: New files. + * m68k/auxstd.h, m68k/auxgnu.h: Deleted. + +Sat Apr 13 20:18:11 1996 Stephen L Moshier <moshier@world.std.com> + + * alpha.c (check_float_value): New function. + * alpha.h (CHECK_FLOAT_VALUE): Define. + (ASM_OUTPUT_FLOAT): Print the value in hex. + +Sat Apr 13 15:08:45 1996 Doug Evans <dje@canuck.cygnus.com> + + * configure: New target arm{,el}-*-coff*. + (cpu_default): Sort alphabetically. + * arm/coff.h: New file. + * arm/t-bare: New file. + * arm/arm.c (use_return_insn): Don't use return for naked functions. + (arm_valid_machine_decl_attribute): New function. + (arm_naked_function_p): New function. + (output_func_prologue): Naked functions don't have prologues. + (arm_expand_prologue): Likewise. + (output_func_epilogue): Likewise with epilogues. + +Sat Apr 13 11:31:32 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.c (adds_subs_operand): Fix thinko in last change. + + * h8300.md (subhi3): Turn into a define_expand. + (subhi3 using adds_subs): New pattern. + (H8300 subhi): Derived from old subhi pattern. Simplified. + (H8300H subhi): Likewise. + (subsi using adds_subs): New pattern. Only used on H8300H. + (subsi_h8300): Allow "a" registers as destination. + (subsi_h8300h): Allow "a" registers as destination. Simplify. + + * h8300.md (bcs_qiqi, bcs_hihi, bs_hiqi): Fix thinkos + in last change. + +Sat Apr 13 08:59:48 1996 Fila Kolodny <fila@ibi.com> + + * i370/mvs.h (ASM_DECLARE_FUNCTION_NAME): Don't write anything to + asm file, because everything is handled in FUNCTION_PROLOGUE. + +Sat Apr 13 07:55:38 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.c (alpha_emit_set_const_1): Renamed from + alpha_emit_set_const and static. + Remove change of Nov 26; again use normal mechanism for SImode. + (alpha_emit_set_const): New function. + +Fri Apr 12 18:19:39 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.c (adds_subs_operand, output_adds_subs): New functions. + * h8300.md (addhi3): Turn into a define_expand. + (addhi3 using adds_subs): New pattern. + (H8300 addhi): Derived from old addhi pattern. Simplified. + (H8300H addhi): Likewise. + (addsi using adds_subs): New pattern. Only used on H8300H. + (addsi_h8300): Allow "a" registers as destination. + (addsi_h8300h): Simplify. Allow "a" registers as destination. + + * h8300.md (bcs): New attribute type. + (default_length): Compute correct length for bcs insns. + (bcs_qiqi, bcs_hihi, bs_hiqi): Use new type and update + to account for correct length computation. + + * h8300/h8300.md (movhi_internal): Demand at least one operand to + be a register. + (movsi_h8300): Optimize loading certain constants. + (movsi_h8300h): Likewise. + + * h8300.h (NO_FUNCTION_CSE): Comment out. + (FUNCTION_ARG_REGNO_P): Properly define for TARGET_QUICKCALL. + (RETURN_IN_MEMORY): Don't return small structs in regs. + + * h8300.c (const_costs): -4 and 4 are cheap on the h8300h. + (notice_update_cc): Remove references to "value2" field. + + * h8300.c (dosize): Remove unused "fped" argument. All callers + changed. Handle add/sub of 5-8 bytes efficiently on the h8300h. + + * h8300.c (print_operand): Handle new 'R' case for accessing + the 8-bit area. Make code for 'Y' fall into code for 'R' when + operand is not a register. Update some comments. + (h8300_tiny_data_p): New function. + (h8300_valid_machine_decl_attribute): Handle "tiny_data" attribute. + * h8300.h (OK_FOR_U): Handle memory references into the + 8-bit area. + (ENCODE_SECTION_INFO): Mark SYMBOL_REFs which refer to 8-bit area. + * h8300.md (many patterns): Use 'R' rather than 'X' for + operands that may be memory accesses into the 8-bit area. + (btst pattern): New pattern to set the cc0 (zbit) based on + data in the 8-bit area. + + * h8300.md (one_cmplsi2): Fix length computation for h8300h. + +Fri Apr 12 14:34:39 1996 Doug Evans <dje@cygnus.com> + + * arm.md (*ldmsi,*stmsi): Use (mem (match_operand ...)) + to avoid using indirect_operand (reload problems). + * arm/semi.h (CPP_PREDEFINES): Define __semi__ instead of semi. + * arm/aout.h (ASM_GENERATE_INTERNAL_LABEL): Use LOCAL_LABEL_PREFIX. + (ASM_OUTPUT_ADDR_{VEC,DIFF_ELT}): Likewise. + +Fri Apr 12 09:43:30 1996 Jason Merrill <jason@yorick.cygnus.com> + + * dbxout.c (dbxout_typedefs): Don't emit incomplete types yet. + (dbxout_symbol): Use DECL_ARTIFICIAL to recognize C++ implicit + typedefs. + +Thu Apr 11 21:56:26 1996 Doug Evans <dje@cygnus.com> + + * i386/t-winnt (winnt.o): Rewrite based on .c.o rule. + (oldnames.o,spawnv.o): Add rules for. + +Thu Apr 11 07:25:06 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * calls.c (expand_call): In inlining case, if BEFORE_CALLS is + zero, start looking at first insn. + + * expr.c (preexpand_calls, case CALL_EXPR): Rework to properly + avoid expanding functions returning variable size objects. + + * integrate.c (expand_inline_function): When comparing types + of formal and actual, use TYPE_MAIN_VARIANT. + +Thu Apr 11 00:48:29 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300/lib1funcs.asm (modnorm): New function(s). Like divnorm, + but gets the sign bit right for modulo operations. + (__modhi3, modsi3): Use modnorm. + + * h8300/h8300.c (dosize): On the h8300h, do 4 byte adjustments + using adds and subs. + * h8300/h8300.h (LONG_LONG_TYPE_SIZE): Always make this 32bits. + Reverses change from Apr 2, 1996. + +Wed Apr 10 18:39:52 1996 Doug Evans <dje@canuck.cygnus.com> + + * sparc.h (ASM_OUTPUT_INTERNAL_LABELREF): Delete. + (FUNCTION_PROFILER): Use ASM_GENERATE_INTERNAL_LABEL instead. + + * sparc.c (sparc_override_options): 90c701 renamed to tsc701. + (eligible_for_epilogue_delay_slot): Don't allow anything if + -mbroken-saverestore. + (output_function_prologue): Only use trivial save's if + -mbroken-saverestore. + * sparc.h (CPP_SPEC): Handle -mcpu={sparclet,tsc701}. + (ASM_SPEC): Likewise. + ({MASK,TARGET}_BROKEN_SAVERESTORE): Define. + (enum processor_type): 90C701 renamed to TSC701. + * sparc.md (attr cpu): 90c701 renamed to tsc701. + * sparc/splet.h (SUBTARGET_SWITCHES): Recognize -mbroken-saverestore. + +Wed Apr 10 17:56:02 1996 Stan Cox <coxs@dg-rtp.dg.com> + + * m88k/dgux.h (EXTRA_SPECS): Define. + (ASM_SPEC,CPP_SPEC,STARTFILE_SPEC): Use EXTRA_SPECS. + * m88k/dguxbcs.h (ASM_SPEC,CPP_SPEC,STARTFILE_SPEC): Use EXTRA_SPECS. + * m88k/m88k.c (output_ascii) Output literal HT. + +Wed Apr 10 17:28:37 1996 James Carlson (carlson@xylogics.com) + + * configure: Work around AIX bug when defining SUBDIRS. + +Wed Apr 10 17:22:42 1996 Paul Eggert <eggert@twinsun.com> + + * cexp.y (parse_number): Don't reject long long constants unless + pedantic. + +Wed Apr 10 17:19:56 1996 Stephen L. Moshier (moshier@world.std.com) + + * real.c (e64toe): Properly distinguish between NaN and infinity + bit patterns for real-words-big-endian targets. + +Wed Apr 10 17:17:26 1996 Richard Earnshaw (rearnsha@armltd.co.uk) + + * real.c (endian): Add two explicit casts. + (e64toe): Support ARM extended precision fp format. + Check negative infinities properly for NaNs. + (toe64): Support ARM extended precision fp format. + +Tue Apr 9 12:53:31 1996 Doug Evans <dje@canuck.cygnus.com> + + * i386/gas.h (ASM_OUTPUT_ALIGN): Define and use .balign. + +Tue Apr 9 12:48:45 1996 Stephen L Moshier (moshier@world.std.com) + + * sparc.c (fp_zero_operand): Exclude -0.0. + +Tue Apr 9 07:11:24 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * alpha.c: Fix typo in last change. + + * tree.c (substitute_in_expr): Don't return new expression if + nothing changed. + (substitute_in_type): Deleted, not used. + * tree.h (substitute_in_type): Delete declaration. + +Mon Apr 8 16:30:18 1996 Jeffrey A. Law <law@cygnus.com> + + * flow.c (find_auto_inc): Also make sure there aren't + any sets of the incremented register between the memory + reference and increment insn. + +Mon Apr 8 15:41:14 1996 John Polstra (jdp@polstra.com) + + * configure (i[3456]86-*-freebsdelf*): New target. + * i386/freebsd-elf.h: New file. + * i386/x-freebsd (USER_H): New define; to null. + +Mon Apr 8 14:44:41 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * c-decl.c (finish_function): Always warn if main doesn't return int. + +Mon Apr 8 13:01:37 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * rs6000.c (got_operand): New function, returns true if the + operand can go in V.4's GOT. + (rs6000_pic_register): New variable. + (output_epilog): Reset rs6000_pic_register. + + * rs6000.h (rs6000_pic_register,got_operand,flag_pic): Add + declarations. + (PREDICATE_CODES): Add got_operand. + + * rs6000.md (movsi): Add support for V.4's -fpic and -FPIC. + (init_v4_pic): Initialize the V4 pic register if needed. + (call patterns): If -fpic/-fPIC, call function with @plt suffix. + + * t-eabigas (MULTILIB_DIRNAMES): Remove errant pic directory. + + * rs6000.c (output_prolog): Correctly store & restore the + arguments to main in their correct save location, when calling the + start function. + +Mon Apr 8 13:01:37 1996 David Reese <Dave.Reese@East.Sun.COM> + + * rs6000.c (print_operand): Use reg_names to print registers. + +Fri Apr 5 00:40:19 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.c (h8300_valid_machine_decl_attribute): Use underscores, + not dashes in attributes. + (h8300_funcvec_function_p): Corresponding changes. + (h8300_interrupt_function_p): Likewise. + + * pa.h (INIT_CUMULATIVE_INCOMING_ARGS): Initialize "indirect" + field to zero. + +Thu Apr 4 12:52:11 1996 Jim Wilson <wilson@chestnut.cygnus.com> + + * loop.c (combine_givs): Use new macro GIV_SORT_CRITERION. + New variable giv_array. Loop over giv_array instead of following + next_iv links. + (giv_sort): New function. + * sh.h (GIV_SORT_CRITERION): Define. + + * c-typeck.c (push_init_level): When output alignment for structure + field, add check to verify it is the next field to be output. + +Thu Apr 4 12:19:26 1996 David Mosberger-Tang <davidm@AZStarNet.com> + + * alpha.c: Don't include stamp.h for Linux. + +Thu Apr 4 12:17:08 1996 Richardg Kenner (kenner@vlsi1.ultra.nyu.edu) + + * objc/Makefile: Rename thread* to thr*. + * objc/thread.c: Rename thread-* to thr-*. + * objc/thr-decosf1.c: Renamed from thread-decosf1.c + * objc/thr-irix.c: Renamed from thread-irix.c. + * objc/thr-single.c: Renamed from thread-single.c. + * objc/thr-solarius.c: Renamed from thread-solaris.c. + * objc/thr-win32.c: Renamed from thread-win32.c. + * objc/objc-api.h: Include thr.h, not thread.h. + * objc/runtime.h, objc/sarray.h: Likewise. + + * i386.md (ashldi3_const_int): Don't recognize if won't match + constraint of operand 2. + +Thu Apr 4 11:40:55 1996 Michael Meissner <meissner@tiktok.cygnus.com> + + * config/fp-bit.c (EXTENDED_FLOAT_STUBS): If EXTENDED_FLOAT_STUBS + is defined, define all of the XF/TF functions that might be + generated that we don't have code for yet. + + * i960/t-(vxworks960,960bare): (LIB2FUNCS_EXTRA): Make and + compile xp-bits.c that defines EXTENDED_FLOAT_STUBS. + + From: steve chamberlain <sac@slash.cygnus.com> + * i386/x-cygwin32 (LANGUAGES): Delete. + * i386/xm-cygwin32.h (EXECUTABLE_SUFFIX): Set to .exe. + * rs6000/xm-cygwin32.h (EXECUTABLE_SUFFIX): Set to .exe. + +Wed Apr 3 14:10:16 1996 Jim Wilson <wilson@chestnut.cygnus.com> + + * expr.c (emit_push_insn): Clobber register only if it is non-zero. + +Wed Apr 3 11:31:55 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.h (h8300_funcvec_function_p): Declaration moved here. + * h8300.c (h8300_funcvec_function_p): Declaration removed from here. + * h8300.md (tstqi): Tweak to work like other tstXX patterns. + (cmphi): Turn into a define_expand. Add two anonymous + matterns to match the output of the cmphi expander. + (cmpsi): Accept constants as the second input operand. + +Tue Apr 2 13:52:30 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.md (movqi_internal): Remove useless alternative(s). Fix + lengths and simplify by reordering remaining alternatives. + (movstrictqi, movhi_internal, movstricthi): Likewise. + (movsi_h8300h, movsf_h8300h): Likewise. + + * h8300/h8300.c (extra_pop): Remove unused variable. + (current_function_anonymous_args): Likewise. + (function_prologue): Remove incorrect varargs/stdarg + related code. + (function_epilogue): Likewise. + (function_arg): Never pass unnamed arguments in registers. + * h8300.h (LONG_LONG_TYPE_SIZE): Use 64bits when ints are 32bits. + (SETUP_INCOMING_VARARGS): Remove definition. + +Mon Apr 1 16:59:48 1996 Ian Lance Taylor <ian@cygnus.com> + + * fixincludes: Fix signal prototype on SunOS to avoid pedantic C++ + error. + +Mon Apr 1 16:16:34 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * expr.c (get_inner_reference): When finding mode to access bitfield + that ends up properly aligned, use mode class of its type unless + type's mode was BLKmode. + +Mon Apr 1 13:45:30 1996 Jeffrey A. Law <law@cygnus.com> + + * h8300.c (interrupt_handler): Renamed from pragma_interrupt. + All references changed. + (function_prologue): Set interrupt_handler if the current + function has the "interrrupt-handler" attribute. + (small_call_insn_operand): New function. + (h8300_interrrupt_function_p): New function. + (h8300_funcvec_function_p): New function. + (h8300_valid_machine_decl_attribute): New function. + * h8300.h (VALID_MACHINE_DECL_ATTRIBUTE): Define. + * h8300.md (call insns): Handle calls through the + function vector. Indirect calls and calls through + the function vector have a length of two bytes. + +See ChangeLog.10 for earlier changes. diff --git a/gcc/INSTALL b/gcc/INSTALL deleted file mode 100644 index d4ac7c5a2ea..00000000000 --- a/gcc/INSTALL +++ /dev/null @@ -1,1906 +0,0 @@ -This file documents the installation of the GNU compiler. Copyright -(C) 1988, 1989, 1992, 1994, 1995 Free Software Foundation, Inc. You -may copy, distribute, and modify it freely as long as you preserve this -copyright notice and permission notice. - -Installing GNU CC -***************** - - Here is the procedure for installing GNU CC on a Unix system. See -*Note VMS Install::, for VMS systems. In this section we assume you -compile in the same directory that contains the source files; see *Note -Other Dir::, to find out how to compile in a separate directory on Unix -systems. - - You cannot install GNU C by itself on MSDOS; it will not compile -under any MSDOS compiler except itself. You need to get the complete -compilation package DJGPP, which includes binaries as well as sources, -and includes all the necessary compilation tools and libraries. - - 1. If you have built GNU CC previously in the same directory for a - different target machine, do `make distclean' to delete all files - that might be invalid. One of the files this deletes is - `Makefile'; if `make distclean' complains that `Makefile' does not - exist, it probably means that the directory is already suitably - clean. - - 2. On a System V release 4 system, make sure `/usr/bin' precedes - `/usr/ucb' in `PATH'. The `cc' command in `/usr/ucb' uses - libraries which have bugs. - - 3. Specify the host, build and target machine configurations. You do - this by running the file `configure'. - - The "build" machine is the system which you are using, the "host" - machine is the system where you want to run the resulting compiler - (normally the build machine), and the "target" machine is the - system for which you want the compiler to generate code. - - If you are building a compiler to produce code for the machine it - runs on (a native compiler), you normally do not need to specify - any operands to `configure'; it will try to guess the type of - machine you are on and use that as the build, host and target - machines. So you don't need to specify a configuration when - building a native compiler unless `configure' cannot figure out - what your configuration is or guesses wrong. - - In those cases, specify the build machine's "configuration name" - with the `--build' option; the host and target will default to be - the same as the build machine. (If you are building a - cross-compiler, see *Note Cross-Compiler::.) - - Here is an example: - - ./configure --build=sparc-sun-sunos4.1 - - A configuration name may be canonical or it may be more or less - abbreviated. - - A canonical configuration name has three parts, separated by - dashes. It looks like this: `CPU-COMPANY-SYSTEM'. (The three - parts may themselves contain dashes; `configure' can figure out - which dashes serve which purpose.) For example, - `m68k-sun-sunos4.1' specifies a Sun 3. - - You can also replace parts of the configuration by nicknames or - aliases. For example, `sun3' stands for `m68k-sun', so - `sun3-sunos4.1' is another way to specify a Sun 3. You can also - use simply `sun3-sunos', since the version of SunOS is assumed by - default to be version 4. `sun3-bsd' also works, since `configure' - knows that the only BSD variant on a Sun 3 is SunOS. - - You can specify a version number after any of the system types, - and some of the CPU types. In most cases, the version is - irrelevant, and will be ignored. So you might as well specify the - version if you know it. - - See *Note Configurations::, for a list of supported configuration - names and notes on many of the configurations. You should check - the notes in that section before proceeding any further with the - installation of GNU CC. - - There are four additional options you can specify independently to - describe variant hardware and software configurations. These are - `--with-gnu-as', `--with-gnu-ld', `--with-stabs' and `--nfp'. - - `--with-gnu-as' - If you will use GNU CC with the GNU assembler (GAS), you - should declare this by using the `--with-gnu-as' option when - you run `configure'. - - Using this option does not install GAS. It only modifies the - output of GNU CC to work with GAS. Building and installing - GAS is up to you. - - Conversely, if you *do not* wish to use GAS and do not specify - `--with-gnu-as' when building GNU CC, it is up to you to make - sure that GAS is not installed. GNU CC searches for a - program named `as' in various directories; if the program it - finds is GAS, then it runs GAS. If you are not sure where - GNU CC finds the assembler it is using, try specifying `-v' - when you run it. - - The systems where it makes a difference whether you use GAS - are - `hppa1.0-ANY-ANY', `hppa1.1-ANY-ANY', `i386-ANY-sysv', - `i386-ANY-isc', - `i860-ANY-bsd', `m68k-bull-sysv', `m68k-hp-hpux', - `m68k-sony-bsd', - `m68k-altos-sysv', `m68000-hp-hpux', `m68000-att-sysv', - `ANY-lynx-lynxos', and `mips-ANY'). On any other system, - `--with-gnu-as' has no effect. - - On the systems listed above (except for the HP-PA, for ISC on - the 386, and for `mips-sgi-irix5.*'), if you use GAS, you - should also use the GNU linker (and specify `--with-gnu-ld'). - - `--with-gnu-ld' - Specify the option `--with-gnu-ld' if you plan to use the GNU - linker with GNU CC. - - This option does not cause the GNU linker to be installed; it - just modifies the behavior of GNU CC to work with the GNU - linker. Specifically, it inhibits the installation of - `collect2', a program which otherwise serves as a front-end - for the system's linker on most configurations. - - `--with-stabs' - On MIPS based systems and on Alphas, you must specify whether - you want GNU CC to create the normal ECOFF debugging format, - or to use BSD-style stabs passed through the ECOFF symbol - table. The normal ECOFF debug format cannot fully handle - languages other than C. BSD stabs format can handle other - languages, but it only works with the GNU debugger GDB. - - Normally, GNU CC uses the ECOFF debugging format by default; - if you prefer BSD stabs, specify `--with-stabs' when you - configure GNU CC. - - No matter which default you choose when you configure GNU CC, - the user can use the `-gcoff' and `-gstabs+' options to - specify explicitly the debug format for a particular - compilation. - - `--with-stabs' is meaningful on the ISC system on the 386, - also, if `--with-gas' is used. It selects use of stabs - debugging information embedded in COFF output. This kind of - debugging information supports C++ well; ordinary COFF - debugging information does not. - - `--with-stabs' is also meaningful on 386 systems running - SVR4. It selects use of stabs debugging information embedded - in ELF output. The C++ compiler currently (2.6.0) does not - support the DWARF debugging information normally used on 386 - SVR4 platforms; stabs provide a workable alternative. This - requires gas and gdb, as the normal SVR4 tools can not - generate or interpret stabs. - - `--nfp' - On certain systems, you must specify whether the machine has - a floating point unit. These systems include - `m68k-sun-sunosN' and `m68k-isi-bsd'. On any other system, - `--nfp' currently has no effect, though perhaps there are - other systems where it could usefully make a difference. - - The `configure' script searches subdirectories of the source - directory for other compilers that are to be integrated into GNU - CC. The GNU compiler for C++, called G++ is in a subdirectory - named `cp'. `configure' inserts rules into `Makefile' to build - all of those compilers. - - Here we spell out what files will be set up by `configure'. - Normally you need not be concerned with these files. - - * A file named `config.h' is created that contains a `#include' - of the top-level config file for the machine you will run the - compiler on (*note The Configuration File: - (gcc.info)Config.). This file is responsible for defining - information about the host machine. It includes `tm.h'. - - The top-level config file is located in the subdirectory - `config'. Its name is always `xm-SOMETHING.h'; usually - `xm-MACHINE.h', but there are some exceptions. - - If your system does not support symbolic links, you might - want to set up `config.h' to contain a `#include' command - which refers to the appropriate file. - - * A file named `tconfig.h' is created which includes the - top-level config file for your target machine. This is used - for compiling certain programs to run on that machine. - - * A file named `tm.h' is created which includes the - machine-description macro file for your target machine. It - should be in the subdirectory `config' and its name is often - `MACHINE.h'. - - * The command file `configure' also constructs the file - `Makefile' by adding some text to the template file - `Makefile.in'. The additional text comes from files in the - `config' directory, named `t-TARGET' and `x-HOST'. If these - files do not exist, it means nothing needs to be added for a - given target or host. - - 4. The standard directory for installing GNU CC is `/usr/local/lib'. - If you want to install its files somewhere else, specify - `--prefix=DIR' when you run `configure'. Here DIR is a directory - name to use instead of `/usr/local' for all purposes with one - exception: the directory `/usr/local/include' is searched for - header files no matter where you install the compiler. To override - this name, use the `--local-prefix' option below. - - 5. Specify `--local-prefix=DIR' if you want the compiler to search - directory `DIR/include' for locally installed header files - *instead* of `/usr/local/include'. - - You should specify `--local-prefix' *only* if your site has a - different convention (not `/usr/local') for where to put - site-specific files. - - *Do not* specify `/usr' as the `--local-prefix'! The directory - you use for `--local-prefix' *must not* contain any of the - system's standard header files. If it did contain them, certain - programs would be miscompiled (including GNU Emacs, on certain - targets), because this would override and nullify the header file - corrections made by the `fixincludes' script. - - 6. Make sure the Bison parser generator is installed. (This is - unnecessary if the Bison output files `c-parse.c' and `cexp.c' are - more recent than `c-parse.y' and `cexp.y' and you do not plan to - change the `.y' files.) - - Bison versions older than Sept 8, 1988 will produce incorrect - output for `c-parse.c'. - - 7. If you have chosen a configuration for GNU CC which requires other - GNU tools (such as GAS or the GNU linker) instead of the standard - system tools, install the required tools in the build directory - under the names `as', `ld' or whatever is appropriate. This will - enable the compiler to find the proper tools for compilation of - the program `enquire'. - - Alternatively, you can do subsequent compilation using a value of - the `PATH' environment variable such that the necessary GNU tools - come before the standard system tools. - - 8. Build the compiler. Just type `make LANGUAGES=c' in the compiler - directory. - - `LANGUAGES=c' specifies that only the C compiler should be - compiled. The makefile normally builds compilers for all the - supported languages; currently, C, C++ and Objective C. However, - C is the only language that is sure to work when you build with - other non-GNU C compilers. In addition, building anything but C - at this stage is a waste of time. - - In general, you can specify the languages to build by typing the - argument `LANGUAGES="LIST"', where LIST is one or more words from - the list `c', `c++', and `objective-c'. If you have any - additional GNU compilers as subdirectories of the GNU CC source - directory, you may also specify their names in this list. - - Ignore any warnings you may see about "statement not reached" in - `insn-emit.c'; they are normal. Also, warnings about "unknown - escape sequence" are normal in `genopinit.c' and perhaps some - other files. Likewise, you should ignore warnings about "constant - is so large that it is unsigned" in `insn-emit.c' and - `insn-recog.c' and a warning about a comparison always being zero - in `enquire.o'. Any other compilation errors may represent bugs in - the port to your machine or operating system, and should be - investigated and reported. - - Some commercial compilers fail to compile GNU CC because they have - bugs or limitations. For example, the Microsoft compiler is said - to run out of macro space. Some Ultrix compilers run out of - expression space; then you need to break up the statement where - the problem happens. - - 9. If you are building a cross-compiler, stop here. *Note - Cross-Compiler::. - - 10. Move the first-stage object files and executables into a - subdirectory with this command: - - make stage1 - - The files are moved into a subdirectory named `stage1'. Once - installation is complete, you may wish to delete these files with - `rm -r stage1'. - - 11. If you have chosen a configuration for GNU CC which requires other - GNU tools (such as GAS or the GNU linker) instead of the standard - system tools, install the required tools in the `stage1' - subdirectory under the names `as', `ld' or whatever is - appropriate. This will enable the stage 1 compiler to find the - proper tools in the following stage. - - Alternatively, you can do subsequent compilation using a value of - the `PATH' environment variable such that the necessary GNU tools - come before the standard system tools. - - 12. Recompile the compiler with itself, with this command: - - make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2" - - This is called making the stage 2 compiler. - - The command shown above builds compilers for all the supported - languages. If you don't want them all, you can specify the - languages to build by typing the argument `LANGUAGES="LIST"'. LIST - should contain one or more words from the list `c', `c++', - `objective-c', and `proto'. Separate the words with spaces. - `proto' stands for the programs `protoize' and `unprotoize'; they - are not a separate language, but you use `LANGUAGES' to enable or - disable their installation. - - If you are going to build the stage 3 compiler, then you might - want to build only the C language in stage 2. - - Once you have built the stage 2 compiler, if you are short of disk - space, you can delete the subdirectory `stage1'. - - On a 68000 or 68020 system lacking floating point hardware, unless - you have selected a `tm.h' file that expects by default that there - is no such hardware, do this instead: - - make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float" - - 13. If you wish to test the compiler by compiling it with itself one - more time, install any other necessary GNU tools (such as GAS or - the GNU linker) in the `stage2' subdirectory as you did in the - `stage1' subdirectory, then do this: - - make stage2 - make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" - - This is called making the stage 3 compiler. Aside from the `-B' - option, the compiler options should be the same as when you made - the stage 2 compiler. But the `LANGUAGES' option need not be the - same. The command shown above builds compilers for all the - supported languages; if you don't want them all, you can specify - the languages to build by typing the argument `LANGUAGES="LIST"', - as described above. - - If you do not have to install any additional GNU tools, you may - use the command - - make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST - - instead of making `stage1', `stage2', and performing the two - compiler builds. - - 14. Then compare the latest object files with the stage 2 object - files--they ought to be identical, aside from time stamps (if any). - - On some systems, meaningful comparison of object files is - impossible; they always appear "different." This is currently - true on Solaris and some systems that use ELF object file format. - On some versions of Irix on SGI machines and DEC Unix (OSF/1) on - Alpha systems, you will not be able to compare the files without - specifying `-save-temps'; see the description of individual - systems above to see if you get comparison failures. You may have - similar problems on other systems. - - Use this command to compare the files: - - make compare - - This will mention any object files that differ between stage 2 and - stage 3. Any difference, no matter how innocuous, indicates that - the stage 2 compiler has compiled GNU CC incorrectly, and is - therefore a potentially serious bug which you should investigate - and report. - - If your system does not put time stamps in the object files, then - this is a faster way to compare them (using the Bourne shell): - - for file in *.o; do - cmp $file stage2/$file - done - - If you have built the compiler with the `-mno-mips-tfile' option on - MIPS machines, you will not be able to compare the files. - - 15. Install the compiler driver, the compiler's passes and run-time - support with `make install'. Use the same value for `CC', - `CFLAGS' and `LANGUAGES' that you used when compiling the files - that are being installed. One reason this is necessary is that - some versions of Make have bugs and recompile files gratuitously - when you do this step. If you use the same variable values, those - files will be recompiled properly. - - For example, if you have built the stage 2 compiler, you can use - the following command: - - make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="LIST" - - This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1', - `cpp' and `libgcc.a' in the directory - `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the - compiler driver program looks for them. Here TARGET is the target - machine type specified when you ran `configure', and VERSION is - the version number of GNU CC. This naming scheme permits various - versions and/or cross-compilers to coexist. - - This also copies the driver program `xgcc' into - `/usr/local/bin/gcc', so that it appears in typical execution - search paths. - - On some systems, this command causes recompilation of some files. - This is usually due to bugs in `make'. You should either ignore - this problem, or use GNU Make. - - *Warning: there is a bug in `alloca' in the Sun library. To avoid - this bug, be sure to install the executables of GNU CC that were - compiled by GNU CC. (That is, the executables from stage 2 or 3, - not stage 1.) They use `alloca' as a built-in function and never - the one in the library.* - - (It is usually better to install GNU CC executables from stage 2 - or 3, since they usually run faster than the ones compiled with - some other compiler.) - - 16. If you're going to use C++, it's likely that you need to also - install the libg++ distribution. It should be available from the - same place where you got the GNU C distribution. Just as GNU C - does not distribute a C runtime library, it also does not include - a C++ run-time library. All I/O functionality, special class - libraries, etc., are available in the libg++ distribution. - -Configurations Supported by GNU CC -================================== - - Here are the possible CPU types: - - 1750a, a29k, alpha, arm, cN, clipper, dsp16xx, elxsi, h8300, - hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m68000, m68k, - m88k, mips, mipsel, mips64, mips64el, ns32k, powerpc, powerpcle, - pyramid, romp, rs6000, sh, sparc, sparclite, sparc64, vax, we32k. - - Here are the recognized company names. As you can see, customary -abbreviations are used rather than the longer official names. - - acorn, alliant, altos, apollo, att, bull, cbm, convergent, convex, - crds, dec, dg, dolphin, elxsi, encore, harris, hitachi, hp, ibm, - intergraph, isi, mips, motorola, ncr, next, ns, omron, plexus, - sequent, sgi, sony, sun, tti, unicom, wrs. - - The company name is meaningful only to disambiguate when the rest of -the information supplied is insufficient. You can omit it, writing -just `CPU-SYSTEM', if it is not needed. For example, `vax-ultrix4.2' -is equivalent to `vax-dec-ultrix4.2'. - - Here is a list of system types: - - 386bsd, aix, acis, amigados, aos, aout, bosx, bsd, clix, coff, - ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms, - genix, gnu, gnu/linux, hiux, hpux, iris, irix, isc, luna, lynxos, - mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf, osfrose, - ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym, sysv, - udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks, winnt, - xenix. - -You can omit the system type; then `configure' guesses the operating -system from the CPU and company. - - You can add a version number to the system type; this may or may not -make a difference. For example, you can write `bsd4.3' or `bsd4.4' to -distinguish versions of BSD. In practice, the version number is most -needed for `sysv3' and `sysv4', which are often treated differently. - - If you specify an impossible combination such as `i860-dg-vms', then -you may get an error message from `configure', or it may ignore part of -the information and do the best it can with the rest. `configure' -always prints the canonical name for the alternative that it used. GNU -CC does not support all possible alternatives. - - Often a particular model of machine has a name. Many machine names -are recognized as aliases for CPU/company combinations. Thus, the -machine name `sun3', mentioned above, is an alias for `m68k-sun'. -Sometimes we accept a company name as a machine name, when the name is -popularly used for a particular machine. Here is a table of the known -machine names: - - 3300, 3b1, 3bN, 7300, altos3068, altos, apollo68, att-7300, - balance, convex-cN, crds, decstation-3100, decstation, delta, - encore, fx2800, gmicro, hp7NN, hp8NN, hp9k2NN, hp9k3NN, hp9k7NN, - hp9k8NN, iris4d, iris, isi68, m3230, magnum, merlin, miniframe, - mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc, - powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3, - sun4, symmetry, tower-32, tower. - -Remember that a machine name specifies both the cpu type and the company -name. If you want to install your own homemade configuration files, -you can use `local' as the company name to access them. If you use -configuration `CPU-local', the configuration name without the cpu prefix -is used to form the configuration file names. - - Thus, if you specify `m68k-local', configuration uses files -`m68k.md', `local.h', `m68k.c', `xm-local.h', `t-local', and `x-local', -all in the directory `config/m68k'. - - Here is a list of configurations that have special treatment or -special things you must know: - -`1750a-*-*' - MIL-STD-1750A processors. - - Starting with GCC 2.6.1, the MIL-STD-1750A cross configuration no - longer supports the Tektronix Assembler, but instead produces - output for `as1750', an assembler/linker available under the GNU - Public License for the 1750A. Contact *kellogg@space.otn.dasa.de* - for more details on obtaining `as1750'. A similarly licensed - simulator for the 1750A is available from same address. - - You should ignore a fatal error during the building of libgcc - (libgcc is not yet implemented for the 1750A.) - - The `as1750' assembler requires the file `ms1750.inc', which is - found in the directory `config/1750a'. - - GNU CC produced the same sections as the Fairchild F9450 C - Compiler, namely: - - `Normal' - The program code section. - - `Static' - The read/write (RAM) data section. - - `Konst' - The read-only (ROM) constants section. - - `Init' - Initialization section (code to copy KREL to SREL). - - The smallest addressable unit is 16 bits (BITS_PER_UNIT is 16). - This means that type `char' is represented with a 16-bit word per - character. The 1750A's "Load/Store Upper/Lower Byte" instructions - are not used by GNU CC. - -`alpha-*-osf1' - Systems using processors that implement the DEC Alpha architecture - and are running the DEC Unix (OSF/1) operating system, for example - the DEC Alpha AXP systems. (VMS on the Alpha is not currently - supported by GNU CC.) - - GNU CC writes a `.verstamp' directive to the assembler output file - unless it is built as a cross-compiler. It gets the version to - use from the system header file `/usr/include/stamp.h'. If you - install a new version of DEC Unix, you should rebuild GCC to pick - up the new version stamp. - - Note that since the Alpha is a 64-bit architecture, - cross-compilers from 32-bit machines will not generate code as - efficient as that generated when the compiler is running on a - 64-bit machine because many optimizations that depend on being - able to represent a word on the target in an integral value on the - host cannot be performed. Building cross-compilers on the Alpha - for 32-bit machines has only been tested in a few cases and may - not work properly. - - `make compare' may fail on old versions of DEC Unix unless you add - `-save-temps' to `CFLAGS'. On these systems, the name of the - assembler input file is stored in the object file, and that makes - comparison fail if it differs between the `stage1' and `stage2' - compilations. The option `-save-temps' forces a fixed name to be - used for the assembler input file, instead of a randomly chosen - name in `/tmp'. Do not add `-save-temps' unless the comparisons - fail without that option. If you add `-save-temps', you will have - to manually delete the `.i' and `.s' files after each series of - compilations. - - GNU CC now supports both the native (ECOFF) debugging format used - by DBX and GDB and an encapsulated STABS format for use only with - GDB. See the discussion of the `--with-stabs' option of - `configure' above for more information on these formats and how to - select them. - - There is a bug in DEC's assembler that produces incorrect line - numbers for ECOFF format when the `.align' directive is used. To - work around this problem, GNU CC will not emit such alignment - directives while writing ECOFF format debugging information even - if optimization is being performed. Unfortunately, this has the - very undesirable side-effect that code addresses when `-O' is - specified are different depending on whether or not `-g' is also - specified. - - To avoid this behavior, specify `-gstabs+' and use GDB instead of - DBX. DEC is now aware of this problem with the assembler and - hopes to provide a fix shortly. - -`arm' - Advanced RISC Machines ARM-family processors. These are often - used in embedded applications. There are no standard Unix - configurations. This configuration corresponds to the basic - instruction sequences and will produce a.out format object modules. - - You may need to make a variant of the file `arm.h' for your - particular configuration. - -`arm-*-riscix' - The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD - Unix. If you are running a version of RISC iX prior to 1.2 then - you must specify the version number during configuration. Note - that the assembler shipped with RISC iX does not support stabs - debugging information; a new version of the assembler, with stabs - support included, is now available from Acorn. - -`a29k' - AMD Am29k-family processors. These are normally used in embedded - applications. There are no standard Unix configurations. This - configuration corresponds to AMD's standard calling sequence and - binary interface and is compatible with other 29k tools. - - You may need to make a variant of the file `a29k.h' for your - particular configuration. - -`a29k-*-bsd' - AMD Am29050 used in a system running a variant of BSD Unix. - -`decstation-*' - DECstations can support three different personalities: Ultrix, DEC - OSF/1, and OSF/rose. To configure GCC for these platforms use the - following configurations: - - `decstation-ultrix' - Ultrix configuration. - - `decstation-osf1' - Dec's version of OSF/1. - - `decstation-osfrose' - Open Software Foundation reference port of OSF/1 which uses - the OSF/rose object file format instead of ECOFF. Normally, - you would not select this configuration. - - The MIPS C compiler needs to be told to increase its table size - for switch statements with the `-Wf,-XNg1500' option in order to - compile `cp/parse.c'. If you use the `-O2' optimization option, - you also need to use `-Olimit 3000'. Both of these options are - automatically generated in the `Makefile' that the shell script - `configure' builds. If you override the `CC' make variable and - use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit - 3000'. - -`elxsi-elxsi-bsd' - The Elxsi's C compiler has known limitations that prevent it from - compiling GNU C. Please contact `mrs@cygnus.com' for more details. - -`dsp16xx' - A port to the AT&T DSP1610 family of processors. - -`h8300-*-*' - The calling convention and structure layout has changed in release - 2.6. All code must be recompiled. The calling convention now - passes the first three arguments in function calls in registers. - Structures are no longer a multiple of 2 bytes. - -`hppa*-*-*' - There are two variants of this CPU, called 1.0 and 1.1, which have - different machine descriptions. You must use the right one for - your machine. All 7NN machines and 8N7 machines use 1.1, while - all other 8NN machines use 1.0. - - The easiest way to handle this problem is to use `configure hpNNN' - or `configure hpNNN-hpux', where NNN is the model number of the - machine. Then `configure' will figure out if the machine is a 1.0 - or 1.1. Use `uname -a' to find out the model number of your - machine. - - `-g' does not work on HP-UX, since that system uses a peculiar - debugging format which GNU CC does not know about. However, `-g' - will work if you also use GAS and GDB in conjunction with GCC. We - highly recommend using GAS for all HP-PA configurations. - - You should be using GAS-2.3 (or later) along with GDB-4.12 (or - later). These can be retrieved from all the traditional GNU ftp - archive sites. - - Build GAS and install the resulting binary as: - - /usr/local/lib/gcc-lib/CONFIGURATION/GCCVERSION/as - - where CONFIGURATION is the configuration name (perhaps - `hpNNN-hpux') and GCCVERSION is the GNU CC version number. Do - this *before* starting the build process, otherwise you will get - errors from the HPUX assembler while building `libgcc2.a'. The - command - - make install-dir - - will create the necessary directory hierarchy so you can install - GAS before building GCC. - - To enable debugging, configure GNU CC with the `--with-gnu-as' - option before building. - - It has been reported that GNU CC produces invalid assembly code for - 1.1 machines running HP-UX 8.02 when using the HP assembler. - Typically the errors look like this: - as: bug.s @line#15 [err#1060] - Argument 0 or 2 in FARG upper - - lookahead = ARGW1=FR,RTNVAL=GR - as: foo.s @line#28 [err#1060] - Argument 0 or 2 in FARG upper - - lookahead = ARGW1=FR - - You can check the version of HP-UX you are running by executing - the command `uname -r'. If you are indeed running HP-UX 8.02 on - a PA and using the HP assembler then configure GCC with - "hpNNN-hpux8.02". - -`i370-*-*' - This port is very preliminary and has many known bugs. We hope to - have a higher-quality port for this machine soon. - -`i386-*-linuxoldld' - Use this configuration to generate a.out binaries on Linux if you - do not have gas/binutils version 2.5.2 or later installed. This is - an obsolete configuration. - -`i386-*-linuxaout' - Use this configuration to generate a.out binaries on Linux. This - configuration is being superseded. You must use gas/binutils - version 2.5.2 or later. - -`i386-*-linux' - Use this configuration to generate ELF binaries on Linux. You must - use gas/binutils version 2.5.2 or later. - -`i386-*-sco' - Compilation with RCC is recommended. Also, it may be a good idea - to link with GNU malloc instead of the malloc that comes with the - system. - -`i386-*-sco3.2v4' - Use this configuration for SCO release 3.2 version 4. - -`i386-*-isc' - It may be a good idea to link with GNU malloc instead of the - malloc that comes with the system. - - In ISC version 4.1, `sed' core dumps when building `deduced.h'. - Use the version of `sed' from version 4.0. - -`i386-*-esix' - It may be good idea to link with GNU malloc instead of the malloc - that comes with the system. - -`i386-ibm-aix' - You need to use GAS version 2.1 or later, and and LD from GNU - binutils version 2.2 or later. - -`i386-sequent-bsd' - Go to the Berkeley universe before compiling. In addition, you - probably need to create a file named `string.h' containing just - one line: `#include <strings.h>'. - -`i386-sequent-ptx1*' - Sequent DYNIX/ptx 1.x. - -`i386-sequent-ptx2*' - Sequent DYNIX/ptx 2.x. - -`i386-sun-sunos4' - You may find that you need another version of GNU CC to begin - bootstrapping with, since the current version when built with the - system's own compiler seems to get an infinite loop compiling part - of `libgcc2.c'. GNU CC version 2 compiled with GNU CC (any - version) seems not to have this problem. - - See *Note Sun Install::, for information on installing GNU CC on - Sun systems. - -`i[345]86-*-winnt3.5' - This version requires a GAS that has not let been released. Until - it is, you can get a prebuilt binary version via anonymous ftp from - `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must - also use the Microsoft header files from the Windows NT 3.5 SDK. - Find these on the CDROM in the `/mstools/h' directory dated - 9/4/94. You must use a fixed version of Microsoft linker made - especially for NT 3.5, which is also is available on the NT 3.5 - SDK CDROM. If you do not have this linker, can you also use the - linker from Visual C/C++ 1.0 or 2.0. - - Installing GNU CC for NT builds a wrapper linker, called `ld.exe', - which mimics the behaviour of Unix `ld' in the specification of - libraries (`-L' and `-l'). `ld.exe' looks for both Unix and - Microsoft named libraries. For example, if you specify `-lfoo', - `ld.exe' will look first for `libfoo.a' and then for `foo.lib'. - - You may install GNU CC for Windows NT in one of two ways, - depending on whether or not you have a Unix-like shell and various - Unix-like utilities. - - 1. If you do not have a Unix-like shell and few Unix-like - utilities, you will use a DOS style batch script called - `configure.bat'. Invoke it as `configure winnt' from an - MSDOS console window or from the program manager dialog box. - `configure.bat' assumes you have already installed and have - in your path a Unix-like `sed' program which is used to - create a working `Makefile' from `Makefile.in'. - - `Makefile' uses the Microsoft Nmake program maintenance - utility and the Visual C/C++ V8.00 compiler to build GNU CC. - You need only have the utilities `sed' and `touch' to use - this installation method, which only automatically builds the - compiler itself. You must then examine what `fixinc.winnt' - does, edit the header files by hand and build `libgcc.a' - manually. - - 2. The second type of installation assumes you are running a - Unix-like shell, have a complete suite of Unix-like utilities - in your path, and have a previous version of GNU CC already - installed, either through building it via the above - installation method or acquiring a pre-built binary. In this - case, use the `configure' script in the normal fashion. - -`i860-intel-osf1' - This is the Paragon. If you have version 1.0 of the operating - system, you need to take special steps to build GNU CC due to - peculiarities of the system. Newer system versions have no - problem. See the section `Installation Problems' in the GNU CC - Manual. - -`*-lynx-lynxos' - LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as - `/bin/gcc'. You should compile with this instead of `/bin/cc'. - You can tell GNU CC to use the GNU assembler and linker, by - specifying `--with-gnu-as --with-gnu-ld' when configuring. These - will produce COFF format object files and executables; otherwise - GNU CC will use the installed tools, which produce a.out format - executables. - -`m68000-hp-bsd' - HP 9000 series 200 running BSD. Note that the C compiler that - comes with this system cannot compile GNU CC; contact - `law@cs.utah.edu' to get binaries of GNU CC for bootstrapping. - -`m68k-altos' - Altos 3068. You must use the GNU assembler, linker and debugger. - Also, you must fix a kernel bug. Details in the file - `README.ALTOS'. - -`m68k-att-sysv' - AT&T 3b1, a.k.a. 7300 PC. Special procedures are needed to - compile GNU CC with this machine's standard C compiler, due to - bugs in that compiler. You can bootstrap it more easily with - previous versions of GNU CC if you have them. - - Installing GNU CC on the 3b1 is difficult if you do not already - have GNU CC running, due to bugs in the installed C compiler. - However, the following procedure might work. We are unable to - test it. - - 1. Comment out the `#include "config.h"' line on line 37 of - `cccp.c' and do `make cpp'. This makes a preliminary version - of GNU cpp. - - 2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to - that file name. - - 3. Undo your change in `cccp.c', or reinstall the original - version, and do `make cpp' again. - - 4. Copy this final version of GNU cpp into `/lib/cpp'. - - 5. Replace every occurrence of `obstack_free' in the file - `tree.c' with `_obstack_free'. - - 6. Run `make' to get the first-stage GNU CC. - - 7. Reinstall the original version of `/lib/cpp'. - - 8. Now you can compile GNU CC with itself and install it in the - normal fashion. - -`m68k-bull-sysv' - Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GNU - CC works either with native assembler or GNU assembler. You can use - GNU assembler with native coff generation by providing - `--with-gnu-as' to the configure script or use GNU assembler with - dbx-in-coff encapsulation by providing `--with-gnu-as --stabs'. - For any problem with native assembler or for availability of the - DPX/2 port of GAS, contact `F.Pierresteguy@frcl.bull.fr'. - -`m68k-crds-unox' - Use `configure unos' for building on Unos. - - The Unos assembler is named `casm' instead of `as'. For some - strange reason linking `/bin/as' to `/bin/casm' changes the - behavior, and does not work. So, when installing GNU CC, you - should install the following script as `as' in the subdirectory - where the passes of GCC are installed: - - #!/bin/sh - casm $* - - The default Unos library is named `libunos.a' instead of `libc.a'. - To allow GNU CC to function, either change all references to - `-lc' in `gcc.c' to `-lunos' or link `/lib/libc.a' to - `/lib/libunos.a'. - - When compiling GNU CC with the standard compiler, to overcome bugs - in the support of `alloca', do not use `-O' when making stage 2. - Then use the stage 2 compiler with `-O' to make the stage 3 - compiler. This compiler will have the same characteristics as the - usual stage 2 compiler on other systems. Use it to make a stage 4 - compiler and compare that with stage 3 to verify proper - compilation. - - (Perhaps simply defining `ALLOCA' in `x-crds' as described in the - comments there will make the above paragraph superfluous. Please - inform us of whether this works.) - - Unos uses memory segmentation instead of demand paging, so you - will need a lot of memory. 5 Mb is barely enough if no other - tasks are running. If linking `cc1' fails, try putting the object - files into a library and linking from that library. - -`m68k-hp-hpux' - HP 9000 series 300 or 400 running HP-UX. HP-UX version 8.0 has a - bug in the assembler that prevents compilation of GNU CC. To fix - it, get patch PHCO_4484 from HP. - - In addition, if you wish to use gas `--with-gnu-as' you must use - gas version 2.1 or later, and you must use the GNU linker version - 2.1 or later. Earlier versions of gas relied upon a program which - converted the gas output into the native HP/UX format, but that - program has not been kept up to date. gdb does not understand - that native HP/UX format, so you must use gas if you wish to use - gdb. - -`m68k-sun' - Sun 3. We do not provide a configuration file to use the Sun FPA - by default, because programs that establish signal handlers for - floating point traps inherently cannot work with the FPA. - - See *Note Sun Install::, for information on installing GNU CC on - Sun systems. - -`m88k-*-svr3' - Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port. - These systems tend to use the Green Hills C, revision 1.8.5, as the - standard C compiler. There are apparently bugs in this compiler - that result in object files differences between stage 2 and stage - 3. If this happens, make the stage 4 compiler and compare it to - the stage 3 compiler. If the stage 3 and stage 4 object files are - identical, this suggests you encountered a problem with the - standard C compiler; the stage 3 and 4 compilers may be usable. - - It is best, however, to use an older version of GNU CC for - bootstrapping if you have one. - -`m88k-*-dgux' - Motorola m88k running DG/UX. To build 88open BCS native or cross - compilers on DG/UX, specify the configuration name as - `m88k-*-dguxbcs' and build in the 88open BCS software development - environment. To build ELF native or cross compilers on DG/UX, - specify `m88k-*-dgux' and build in the DG/UX ELF development - environment. You set the software development environment by - issuing `sde-target' command and specifying either `m88kbcs' or - `m88kdguxelf' as the operand. - - If you do not specify a configuration name, `configure' guesses the - configuration based on the current software development - environment. - -`m88k-tektronix-sysv3' - Tektronix XD88 running UTekV 3.2e. Do not turn on optimization - while building stage1 if you bootstrap with the buggy Green Hills - compiler. Also, The bundled LAI System V NFS is buggy so if you - build in an NFS mounted directory, start from a fresh reboot, or - avoid NFS all together. Otherwise you may have trouble getting - clean comparisons between stages. - -`mips-mips-bsd' - MIPS machines running the MIPS operating system in BSD mode. It's - possible that some old versions of the system lack the functions - `memcpy', `memcmp', and `memset'. If your system lacks these, you - must remove or undo the definition of `TARGET_MEM_FUNCTIONS' in - `mips-bsd.h'. - - The MIPS C compiler needs to be told to increase its table size - for switch statements with the `-Wf,-XNg1500' option in order to - compile `cp/parse.c'. If you use the `-O2' optimization option, - you also need to use `-Olimit 3000'. Both of these options are - automatically generated in the `Makefile' that the shell script - `configure' builds. If you override the `CC' make variable and - use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit - 3000'. - -`mips-mips-riscos*' - The MIPS C compiler needs to be told to increase its table size - for switch statements with the `-Wf,-XNg1500' option in order to - compile `cp/parse.c'. If you use the `-O2' optimization option, - you also need to use `-Olimit 3000'. Both of these options are - automatically generated in the `Makefile' that the shell script - `configure' builds. If you override the `CC' make variable and - use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit - 3000'. - - MIPS computers running RISC-OS can support four different - personalities: default, BSD 4.3, System V.3, and System V.4 (older - versions of RISC-OS don't support V.4). To configure GCC for - these platforms use the following configurations: - - `mips-mips-riscos`rev'' - Default configuration for RISC-OS, revision `rev'. - - `mips-mips-riscos`rev'bsd' - BSD 4.3 configuration for RISC-OS, revision `rev'. - - `mips-mips-riscos`rev'sysv4' - System V.4 configuration for RISC-OS, revision `rev'. - - `mips-mips-riscos`rev'sysv' - System V.3 configuration for RISC-OS, revision `rev'. - - The revision `rev' mentioned above is the revision of RISC-OS to - use. You must reconfigure GCC when going from a RISC-OS revision - 4 to RISC-OS revision 5. This has the effect of avoiding a linker - bug. - -`mips-sgi-*' - In order to compile GCC on an SGI running IRIX 4, the "c.hdr.lib" - option must be installed from the CD-ROM supplied from Silicon - Graphics. This is found on the 2nd CD in release 4.0.1. - - In order to compile GCC on an SGI running IRIX 5, the - "compiler_dev.hdr" subsystem must be installed from the IDO CD-ROM - supplied by Silicon Graphics. - - `make compare' may fail on version 5 of IRIX unless you add - `-save-temps' to `CFLAGS'. On these systems, the name of the - assembler input file is stored in the object file, and that makes - comparison fail if it differs between the `stage1' and `stage2' - compilations. The option `-save-temps' forces a fixed name to be - used for the assembler input file, instead of a randomly chosen - name in `/tmp'. Do not add `-save-temps' unless the comparisons - fail without that option. If you do you `-save-temps', you will - have to manually delete the `.i' and `.s' files after each series - of compilations. - - The MIPS C compiler needs to be told to increase its table size - for switch statements with the `-Wf,-XNg1500' option in order to - compile `cp/parse.c'. If you use the `-O2' optimization option, - you also need to use `-Olimit 3000'. Both of these options are - automatically generated in the `Makefile' that the shell script - `configure' builds. If you override the `CC' make variable and - use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit - 3000'. - - On Irix version 4.0.5F, and perhaps on some other versions as well, - there is an assembler bug that reorders instructions incorrectly. - To work around it, specify the target configuration - `mips-sgi-irix4loser'. This configuration inhibits assembler - optimization. - - In a compiler configured with target `mips-sgi-irix4', you can turn - off assembler optimization by using the `-noasmopt' option. This - compiler option passes the option `-O0' to the assembler, to - inhibit reordering. - - The `-noasmopt' option can be useful for testing whether a problem - is due to erroneous assembler reordering. Even if a problem does - not go away with `-noasmopt', it may still be due to assembler - reordering--perhaps GNU CC itself was miscompiled as a result. - - To enable debugging under Irix 5, you must use GNU as 2.5 or later, - and use the `--with-gnu-as' configure option when configuring gcc. - GNU as is distributed as part of the binutils package. - -`mips-sony-sysv' - Sony MIPS NEWS. This works in NEWSOS 5.0.1, but not in 5.0.2 - (which uses ELF instead of COFF). Support for 5.0.2 will probably - be provided soon by volunteers. In particular, the linker does - not like the code generated by GCC when shared libraries are - linked in. - -`ns32k-encore' - Encore ns32000 system. Encore systems are supported only under - BSD. - -`ns32k-*-genix' - National Semiconductor ns32000 system. Genix has bugs in `alloca' - and `malloc'; you must get the compiled versions of these from GNU - Emacs. - -`ns32k-sequent' - Go to the Berkeley universe before compiling. In addition, you - probably need to create a file named `string.h' containing just - one line: `#include <strings.h>'. - -`ns32k-utek' - UTEK ns32000 system ("merlin"). The C compiler that comes with - this system cannot compile GNU CC; contact `tektronix!reed!mason' - to get binaries of GNU CC for bootstrapping. - -`romp-*-aos' -`romp-*-mach' - The only operating systems supported for the IBM RT PC are AOS and - MACH. GNU CC does not support AIX running on the RT. We - recommend you compile GNU CC with an earlier version of itself; if - you compile GNU CC with `hc', the Metaware compiler, it will work, - but you will get mismatches between the stage 2 and stage 3 - compilers in various files. These errors are minor differences in - some floating-point constants and can be safely ignored; the stage - 3 compiler is correct. - -`rs6000-*-aix' -`powerpc-*-aix' - Various early versions of each release of the IBM XLC compiler - will not bootstrap GNU CC. Symptoms include differences between - the stage2 and stage3 object files, and errors when compiling - `libgcc.a' or `enquire'. Known problematic releases include: - xlc-1.2.1.8, xlc-1.3.0.0 (distributed with AIX 3.2.5), and - xlc-1.3.0.19. Both xlc-1.2.1.28 and xlc-1.3.0.24 (PTF 432238) are - known to produce working versions of GNU CC, but most other recent - releases correctly bootstrap GNU CC. Also, releases of AIX prior - to AIX 3.2.4 include a version of the IBM assembler which does not - accept debugging directives: assembler updates are available as - PTFs. Also, if you are using AIX 3.2.5 or greater and the GNU - assembler, you must have a version modified after October 16th, - 1995 in order for the GNU C compiler to build. See the file - `README.RS6000' for more details on of these problems. - - GNU CC does not yet support the 64-bit PowerPC instructions. - - Objective C does not work on this architecture because it makes - assumptions that are incompatible with the calling conventions. - - AIX on the RS/6000 provides support (NLS) for environments outside - of the United States. Compilers and assemblers use NLS to support - locale-specific representations of various objects including - floating-point numbers ("." vs "," for separating decimal - fractions). There have been problems reported where the library - linked with GNU CC does not produce the same floating-point - formats that the assembler accepts. If you have this problem, set - the LANG environment variable to "C" or "En_US". - - Due to changes in the way that GNU CC invokes the binder (linker) - for AIX 4.1, you may now receive warnings of duplicate symbols - from the link step that were not reported before. The assembly - files generated by GNU CC for AIX have always included multiple - symbol definitions for certain global variable and function - declarations in the original program. The warnings should not - prevent the linker from producing a correct library or runnable - executable. - -`powerpc-*-elf' -`powerpc-*-sysv4' - PowerPC system in big endian mode, running System V.4. - - This configuration is currently under development. - -`powerpc-*-eabiaix' - Embedded PowerPC system in big endian mode with -mcall-aix - selected as the default. This system is currently under - development. - -`powerpc-*-eabisim' - Embedded PowerPC system in big endian mode for use in running - under the PSIM simulator. This system is currently under - development. - -`powerpc-*-eabi' - Embedded PowerPC system in big endian mode. - - This configuration is currently under development. - -`powerpcle-*-elf' -`powerpcle-*-sysv4' - PowerPC system in little endian mode, running System V.4. - - This configuration is currently under development. - -`powerpcle-*-sysv4' - Embedded PowerPC system in little endian mode. - - This system is currently under development. - -`powerpcle-*-eabisim' - Embedded PowerPC system in little endian mode for use in running - under the PSIM simulator. - - This system is currently under development. - -`powerpcle-*-eabi' - Embedded PowerPC system in little endian mode. - - This configuration is currently under development. - -`vax-dec-ultrix' - Don't try compiling with Vax C (`vcc'). It produces incorrect code - in some cases (for example, when `alloca' is used). - - Meanwhile, compiling `cp/parse.c' with pcc does not work because of - an internal table size limitation in that compiler. To avoid this - problem, compile just the GNU C compiler first, and use it to - recompile building all the languages that you want to run. - -`sparc-sun-*' - See *Note Sun Install::, for information on installing GNU CC on - Sun systems. - -`vax-dec-vms' - See *Note VMS Install::, for details on how to install GNU CC on - VMS. - -`we32k-*-*' - These computers are also known as the 3b2, 3b5, 3b20 and other - similar names. (However, the 3b1 is actually a 68000; see *Note - Configurations::.) - - Don't use `-g' when compiling with the system's compiler. The - system's linker seems to be unable to handle such a large program - with debugging information. - - The system's compiler runs out of capacity when compiling `stmt.c' - in GNU CC. You can work around this by building `cpp' in GNU CC - first, then use that instead of the system's preprocessor with the - system's C compiler to compile `stmt.c'. Here is how: - - mv /lib/cpp /lib/cpp.att - cp cpp /lib/cpp.gnu - echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp - chmod +x /lib/cpp - - The system's compiler produces bad code for some of the GNU CC - optimization files. So you must build the stage 2 compiler without - optimization. Then build a stage 3 compiler with optimization. - That executable should work. Here are the necessary commands: - - make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g" - make stage2 - make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O" - - You may need to raise the ULIMIT setting to build a C++ compiler, - as the file `cc1plus' is larger than one megabyte. - -Compilation in a Separate Directory -=================================== - - If you wish to build the object files and executables in a directory -other than the one containing the source files, here is what you must -do differently: - - 1. Make sure you have a version of Make that supports the `VPATH' - feature. (GNU Make supports it, as do Make versions on most BSD - systems.) - - 2. If you have ever run `configure' in the source directory, you must - undo the configuration. Do this by running: - - make distclean - - 3. Go to the directory in which you want to build the compiler before - running `configure': - - mkdir gcc-sun3 - cd gcc-sun3 - - On systems that do not support symbolic links, this directory must - be on the same file system as the source code directory. - - 4. Specify where to find `configure' when you run it: - - ../gcc/configure ... - - This also tells `configure' where to find the compiler sources; - `configure' takes the directory from the file name that was used to - invoke it. But if you want to be sure, you can specify the source - directory with the `--srcdir' option, like this: - - ../gcc/configure --srcdir=../gcc OTHER OPTIONS - - The directory you specify with `--srcdir' need not be the same as - the one that `configure' is found in. - - Now, you can run `make' in that directory. You need not repeat the -configuration steps shown above, when ordinary source files change. You -must, however, run `configure' again when the configuration files -change, if your system does not support symbolic links. - -Building and Installing a Cross-Compiler -======================================== - - GNU CC can function as a cross-compiler for many machines, but not -all. - - * Cross-compilers for the Mips as target using the Mips assembler - currently do not work, because the auxiliary programs - `mips-tdump.c' and `mips-tfile.c' can't be compiled on anything - but a Mips. It does work to cross compile for a Mips if you use - the GNU assembler and linker. - - * Cross-compilers between machines with different floating point - formats have not all been made to work. GNU CC now has a floating - point emulator with which these can work, but each target machine - description needs to be updated to take advantage of it. - - * Cross-compilation between machines of different word sizes is - somewhat problematic and sometimes does not work. - - Since GNU CC generates assembler code, you probably need a -cross-assembler that GNU CC can run, in order to produce object files. -If you want to link on other than the target machine, you need a -cross-linker as well. You also need header files and libraries suitable -for the target machine that you can install on the host machine. - -Steps of Cross-Compilation --------------------------- - - To compile and run a program using a cross-compiler involves several -steps: - - * Run the cross-compiler on the host machine to produce assembler - files for the target machine. This requires header files for the - target machine. - - * Assemble the files produced by the cross-compiler. You can do this - either with an assembler on the target machine, or with a - cross-assembler on the host machine. - - * Link those files to make an executable. You can do this either - with a linker on the target machine, or with a cross-linker on the - host machine. Whichever machine you use, you need libraries and - certain startup files (typically `crt....o') for the target - machine. - - It is most convenient to do all of these steps on the same host -machine, since then you can do it all with a single invocation of GNU -CC. This requires a suitable cross-assembler and cross-linker. For -some targets, the GNU assembler and linker are available. - -Configuring a Cross-Compiler ----------------------------- - - To build GNU CC as a cross-compiler, you start out by running -`configure'. Use the `--target=TARGET' to specify the target type. If -`configure' was unable to correctly identify the system you are running -on, also specify the `--build=BUILD' option. For example, here is how -to configure for a cross-compiler that produces code for an HP 68030 -system running BSD on a system that `configure' can correctly identify: - - ./configure --target=m68k-hp-bsd4.3 - -Tools and Libraries for a Cross-Compiler ----------------------------------------- - - If you have a cross-assembler and cross-linker available, you should -install them now. Put them in the directory `/usr/local/TARGET/bin'. -Here is a table of the tools you should put in this directory: - -`as' - This should be the cross-assembler. - -`ld' - This should be the cross-linker. - -`ar' - This should be the cross-archiver: a program which can manipulate - archive files (linker libraries) in the target machine's format. - -`ranlib' - This should be a program to construct a symbol table in an archive - file. - - The installation of GNU CC will find these programs in that -directory, and copy or link them to the proper place to for the -cross-compiler to find them when run later. - - The easiest way to provide these files is to build the Binutils -package and GAS. Configure them with the same `--host' and `--target' -options that you use for configuring GNU CC, then build and install -them. They install their executables automatically into the proper -directory. Alas, they do not support all the targets that GNU CC -supports. - - If you want to install libraries to use with the cross-compiler, -such as a standard C library, put them in the directory -`/usr/local/TARGET/lib'; installation of GNU CC copies all all the -files in that subdirectory into the proper place for GNU CC to find -them and link with them. Here's an example of copying some libraries -from a target machine: - - ftp TARGET-MACHINE - lcd /usr/local/TARGET/lib - cd /lib - get libc.a - cd /usr/lib - get libg.a - get libm.a - quit - -The precise set of libraries you'll need, and their locations on the -target machine, vary depending on its operating system. - - Many targets require "start files" such as `crt0.o' and `crtn.o' -which are linked into each executable; these too should be placed in -`/usr/local/TARGET/lib'. There may be several alternatives for -`crt0.o', for use with profiling or other compilation options. Check -your target's definition of `STARTFILE_SPEC' to find out what start -files it uses. Here's an example of copying these files from a target -machine: - - ftp TARGET-MACHINE - lcd /usr/local/TARGET/lib - prompt - cd /lib - mget *crt*.o - cd /usr/lib - mget *crt*.o - quit - -`libgcc.a' and Cross-Compilers ------------------------------- - - Code compiled by GNU CC uses certain runtime support functions -implicitly. Some of these functions can be compiled successfully with -GNU CC itself, but a few cannot be. These problem functions are in the -source file `libgcc1.c'; the library made from them is called -`libgcc1.a'. - - When you build a native compiler, these functions are compiled with -some other compiler-the one that you use for bootstrapping GNU CC. -Presumably it knows how to open code these operations, or else knows how -to call the run-time emulation facilities that the machine comes with. -But this approach doesn't work for building a cross-compiler. The -compiler that you use for building knows about the host system, not the -target system. - - So, when you build a cross-compiler you have to supply a suitable -library `libgcc1.a' that does the job it is expected to do. - - To compile `libgcc1.c' with the cross-compiler itself does not work. -The functions in this file are supposed to implement arithmetic -operations that GNU CC does not know how to open code for your target -machine. If these functions are compiled with GNU CC itself, they will -compile into infinite recursion. - - On any given target, most of these functions are not needed. If GNU -CC can open code an arithmetic operation, it will not call these -functions to perform the operation. It is possible that on your target -machine, none of these functions is needed. If so, you can supply an -empty library as `libgcc1.a'. - - Many targets need library support only for multiplication and -division. If you are linking with a library that contains functions for -multiplication and division, you can tell GNU CC to call them directly -by defining the macros `MULSI3_LIBCALL', and the like. These macros -need to be defined in the target description macro file. For some -targets, they are defined already. This may be sufficient to avoid the -need for libgcc1.a; if so, you can supply an empty library. - - Some targets do not have floating point instructions; they need other -functions in `libgcc1.a', which do floating arithmetic. Recent -versions of GNU CC have a file which emulates floating point. With a -certain amount of work, you should be able to construct a floating -point emulator that can be used as `libgcc1.a'. Perhaps future -versions will contain code to do this automatically and conveniently. -That depends on whether someone wants to implement it. - - Some embedded targets come with all the necessary `libgcc1.a' -routines written in C or assembler. These targets build `libgcc1.a' -automatically and you do not need to do anything special for them. -Other embedded targets do not need any `libgcc1.a' routines since all -the necessary operations are supported by the hardware. - - If your target system has another C compiler, you can configure GNU -CC as a native compiler on that machine, build just `libgcc1.a' with -`make libgcc1.a' on that machine, and use the resulting file with the -cross-compiler. To do this, execute the following on the target -machine: - - cd TARGET-BUILD-DIR - ./configure --host=sparc --target=sun3 - make libgcc1.a - -And then this on the host machine: - - ftp TARGET-MACHINE - binary - cd TARGET-BUILD-DIR - get libgcc1.a - quit - - Another way to provide the functions you need in `libgcc1.a' is to -define the appropriate `perform_...' macros for those functions. If -these definitions do not use the C arithmetic operators that they are -meant to implement, you should be able to compile them with the -cross-compiler you are building. (If these definitions already exist -for your target file, then you are all set.) - - To build `libgcc1.a' using the perform macros, use -`LIBGCC1=libgcc1.a OLDCC=./xgcc' when building the compiler. -Otherwise, you should place your replacement library under the name -`libgcc1.a' in the directory in which you will build the -cross-compiler, before you run `make'. - -Cross-Compilers and Header Files --------------------------------- - - If you are cross-compiling a standalone program or a program for an -embedded system, then you may not need any header files except the few -that are part of GNU CC (and those of your program). However, if you -intend to link your program with a standard C library such as `libc.a', -then you probably need to compile with the header files that go with -the library you use. - - The GNU C compiler does not come with these files, because (1) they -are system-specific, and (2) they belong in a C library, not in a -compiler. - - If the GNU C library supports your target machine, then you can get -the header files from there (assuming you actually use the GNU library -when you link your program). - - If your target machine comes with a C compiler, it probably comes -with suitable header files also. If you make these files accessible -from the host machine, the cross-compiler can use them also. - - Otherwise, you're on your own in finding header files to use when -cross-compiling. - - When you have found suitable header files, put them in -`/usr/local/TARGET/include', before building the cross compiler. Then -installation will run fixincludes properly and install the corrected -versions of the header files where the compiler will use them. - - Provide the header files before you build the cross-compiler, because -the build stage actually runs the cross-compiler to produce parts of -`libgcc.a'. (These are the parts that *can* be compiled with GNU CC.) -Some of them need suitable header files. - - Here's an example showing how to copy the header files from a target -machine. On the target machine, do this: - - (cd /usr/include; tar cf - .) > tarfile - - Then, on the host machine, do this: - - ftp TARGET-MACHINE - lcd /usr/local/TARGET/include - get tarfile - quit - tar xf tarfile - -Actually Building the Cross-Compiler ------------------------------------- - - Now you can proceed just as for compiling a single-machine compiler -through the step of building stage 1. If you have not provided some -sort of `libgcc1.a', then compilation will give up at the point where -it needs that file, printing a suitable error message. If you do -provide `libgcc1.a', then building the compiler will automatically -compile and link a test program called `libgcc1-test'; if you get -errors in the linking, it means that not all of the necessary routines -in `libgcc1.a' are available. - - You must provide the header file `float.h'. One way to do this is -to compile `enquire' and run it on your target machine. The job of -`enquire' is to run on the target machine and figure out by experiment -the nature of its floating point representation. `enquire' records its -findings in the header file `float.h'. If you can't produce this file -by running `enquire' on the target machine, then you will need to come -up with a suitable `float.h' in some other way (or else, avoid using it -in your programs). - - Do not try to build stage 2 for a cross-compiler. It doesn't work to -rebuild GNU CC as a cross-compiler using the cross-compiler, because -that would produce a program that runs on the target machine, not on the -host. For example, if you compile a 386-to-68030 cross-compiler with -itself, the result will not be right either for the 386 (because it was -compiled into 68030 code) or for the 68030 (because it was configured -for a 386 as the host). If you want to compile GNU CC into 68030 code, -whether you compile it on a 68030 or with a cross-compiler on a 386, you -must specify a 68030 as the host when you configure it. - - To install the cross-compiler, use `make install', as usual. - -Installing GNU CC on the Sun -============================ - - On Solaris (version 2.1), do not use the linker or other tools in -`/usr/ucb' to build GNU CC. Use `/usr/ccs/bin'. - - Make sure the environment variable `FLOAT_OPTION' is not set when -you compile `libgcc.a'. If this option were set to `f68881' when -`libgcc.a' is compiled, the resulting code would demand to be linked -with a special startup file and would not link properly without special -pains. - - There is a bug in `alloca' in certain versions of the Sun library. -To avoid this bug, install the binaries of GNU CC that were compiled by -GNU CC. They use `alloca' as a built-in function and never the one in -the library. - - Some versions of the Sun compiler crash when compiling GNU CC. The -problem is a segmentation fault in cpp. This problem seems to be due to -the bulk of data in the environment variables. You may be able to avoid -it by using the following command to compile GNU CC with Sun CC: - - make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc" - -Installing GNU CC on VMS -======================== - - The VMS version of GNU CC is distributed in a backup saveset -containing both source code and precompiled binaries. - - To install the `gcc' command so you can use the compiler easily, in -the same manner as you use the VMS C compiler, you must install the VMS -CLD file for GNU CC as follows: - - 1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to - point to the directories where the GNU CC executables - (`gcc-cpp.exe', `gcc-cc1.exe', etc.) and the C include files are - kept respectively. This should be done with the commands: - - $ assign /system /translation=concealed - - disk:[gcc.] gnu_cc - $ assign /system /translation=concealed - - disk:[gcc.include.] gnu_cc_include - - with the appropriate disk and directory names. These commands can - be placed in your system startup file so they will be executed - whenever the machine is rebooted. You may, if you choose, do this - via the `GCC_INSTALL.COM' script in the `[GCC]' directory. - - 2. Install the `GCC' command with the command line: - - $ set command /table=sys$common:[syslib]dcltables - - /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc - $ install replace sys$common:[syslib]dcltables - - 3. To install the help file, do the following: - - $ library/help sys$library:helplib.hlb gcc.hlp - - Now you can invoke the compiler with a command like `gcc /verbose - file.c', which is equivalent to the command `gcc -v -c file.c' in - Unix. - - If you wish to use GNU C++ you must first install GNU CC, and then -perform the following steps: - - 1. Define the VMS logical name `GNU_GXX_INCLUDE' to point to the - directory where the preprocessor will search for the C++ header - files. This can be done with the command: - - $ assign /system /translation=concealed - - disk:[gcc.gxx_include.] gnu_gxx_include - - with the appropriate disk and directory name. If you are going to - be using libg++, this is where the libg++ install procedure will - install the libg++ header files. - - 2. Obtain the file `gcc-cc1plus.exe', and place this in the same - directory that `gcc-cc1.exe' is kept. - - The GNU C++ compiler can be invoked with a command like `gcc /plus - /verbose file.cc', which is equivalent to the command `g++ -v -c - file.cc' in Unix. - - We try to put corresponding binaries and sources on the VMS -distribution tape. But sometimes the binaries will be from an older -version than the sources, because we don't always have time to update -them. (Use the `/version' option to determine the version number of -the binaries and compare it with the source file `version.c' to tell -whether this is so.) In this case, you should use the binaries you get -to recompile the sources. If you must recompile, here is how: - - 1. Execute the command procedure `vmsconfig.com' to set up the files - `tm.h', `config.h', `aux-output.c', and `md.', and to create files - `tconfig.h' and `hconfig.h'. This procedure also creates several - linker option files used by `make-cc1.com' and a data file used by - `make-l2.com'. - - $ @vmsconfig.com - - 2. Setup the logical names and command tables as defined above. In - addition, define the VMS logical name `GNU_BISON' to point at the - to the directories where the Bison executable is kept. This - should be done with the command: - - $ assign /system /translation=concealed - - disk:[bison.] gnu_bison - - You may, if you choose, use the `INSTALL_BISON.COM' script in the - `[BISON]' directory. - - 3. Install the `BISON' command with the command line: - - $ set command /table=sys$common:[syslib]dcltables - - /output=sys$common:[syslib]dcltables - - gnu_bison:[000000]bison - $ install replace sys$common:[syslib]dcltables - - 4. Type `@make-gcc' to recompile everything (alternatively, submit - the file `make-gcc.com' to a batch queue). If you wish to build - the GNU C++ compiler as well as the GNU CC compiler, you must - first edit `make-gcc.com' and follow the instructions that appear - in the comments. - - 5. In order to use GCC, you need a library of functions which GCC - compiled code will call to perform certain tasks, and these - functions are defined in the file `libgcc2.c'. To compile this - you should use the command procedure `make-l2.com', which will - generate the library `libgcc2.olb'. `libgcc2.olb' should be built - using the compiler built from the same distribution that - `libgcc2.c' came from, and `make-gcc.com' will automatically do - all of this for you. - - To install the library, use the following commands: - - $ library gnu_cc:[000000]gcclib/delete=(new,eprintf) - $ library gnu_cc:[000000]gcclib/delete=L_* - $ library libgcc2/extract=*/output=libgcc2.obj - $ library gnu_cc:[000000]gcclib libgcc2.obj - - The first command simply removes old modules that will be replaced - with modules from `libgcc2' under different module names. The - modules `new' and `eprintf' may not actually be present in your - `gcclib.olb'--if the VMS librarian complains about those modules - not being present, simply ignore the message and continue on with - the next command. The second command removes the modules that - came from the previous version of the library `libgcc2.c'. - - Whenever you update the compiler on your system, you should also - update the library with the above procedure. - - 6. You may wish to build GCC in such a way that no files are written - to the directory where the source files reside. An example would - be the when the source files are on a read-only disk. In these - cases, execute the following DCL commands (substituting your - actual path names): - - $ assign dua0:[gcc.build_dir.]/translation=concealed, - - dua1:[gcc.source_dir.]/translation=concealed gcc_build - $ set default gcc_build:[000000] - - where the directory `dua1:[gcc.source_dir]' contains the source - code, and the directory `dua0:[gcc.build_dir]' is meant to contain - all of the generated object files and executables. Once you have - done this, you can proceed building GCC as described above. (Keep - in mind that `gcc_build' is a rooted logical name, and thus the - device names in each element of the search list must be an actual - physical device name rather than another rooted logical name). - - 7. *If you are building GNU CC with a previous version of GNU CC, you - also should check to see that you have the newest version of the - assembler*. In particular, GNU CC version 2 treats global constant - variables slightly differently from GNU CC version 1, and GAS - version 1.38.1 does not have the patches required to work with GCC - version 2. If you use GAS 1.38.1, then `extern const' variables - will not have the read-only bit set, and the linker will generate - warning messages about mismatched psect attributes for these - variables. These warning messages are merely a nuisance, and can - safely be ignored. - - If you are compiling with a version of GNU CC older than 1.33, - specify `/DEFINE=("inline=")' as an option in all the - compilations. This requires editing all the `gcc' commands in - `make-cc1.com'. (The older versions had problems supporting - `inline'.) Once you have a working 1.33 or newer GNU CC, you can - change this file back. - - 8. If you want to build GNU CC with the VAX C compiler, you will need - to make minor changes in `make-cccp.com' and `make-cc1.com' to - choose alternate definitions of `CC', `CFLAGS', and `LIBS'. See - comments in those files. However, you must also have a working - version of the GNU assembler (GNU as, aka GAS) as it is used as - the back-end for GNU CC to produce binary object modules and is - not included in the GNU CC sources. GAS is also needed to compile - `libgcc2' in order to build `gcclib' (see above); `make-l2.com' - expects to be able to find it operational in - `gnu_cc:[000000]gnu-as.exe'. - - To use GNU CC on VMS, you need the VMS driver programs `gcc.exe', - `gcc.com', and `gcc.cld'. They are distributed with the VMS - binaries (`gcc-vms') rather than the GNU CC sources. GAS is also - included in `gcc-vms', as is Bison. - - Once you have successfully built GNU CC with VAX C, you should use - the resulting compiler to rebuild itself. Before doing this, be - sure to restore the `CC', `CFLAGS', and `LIBS' definitions in - `make-cccp.com' and `make-cc1.com'. The second generation - compiler will be able to take advantage of many optimizations that - must be suppressed when building with other compilers. - - Under previous versions of GNU CC, the generated code would -occasionally give strange results when linked with the sharable -`VAXCRTL' library. Now this should work. - - Even with this version, however, GNU CC itself should not be linked -with the sharable `VAXCRTL'. The version of `qsort' in `VAXCRTL' has a -bug (known to be present in VMS versions V4.6 through V5.5) which -causes the compiler to fail. - - The executables are generated by `make-cc1.com' and `make-cccp.com' -use the object library version of `VAXCRTL' in order to make use of the -`qsort' routine in `gcclib.olb'. If you wish to link the compiler -executables with the shareable image version of `VAXCRTL', you should -edit the file `tm.h' (created by `vmsconfig.com') to define the macro -`QSORT_WORKAROUND'. - - `QSORT_WORKAROUND' is always defined when GNU CC is compiled with -VAX C, to avoid a problem in case `gcclib.olb' is not yet available. - -`collect2' -========== - - Many target systems do not have support in the assembler and linker -for "constructors"--initialization functions to be called before the -official "start" of `main'. On such systems, GNU CC uses a utility -called `collect2' to arrange to call these functions at start time. - - The program `collect2' works by linking the program once and looking -through the linker output file for symbols with particular names -indicating they are constructor functions. If it finds any, it creates -a new temporary `.c' file containing a table of them, compiles it, and -links the program a second time including that file. - - The actual calls to the constructors are carried out by a subroutine -called `__main', which is called (automatically) at the beginning of -the body of `main' (provided `main' was compiled with GNU CC). Calling -`__main' is necessary, even when compiling C code, to allow linking C -and C++ object code together. (If you use `-nostdlib', you get an -unresolved reference to `__main', since it's defined in the standard -GCC library. Include `-lgcc' at the end of your compiler command line -to resolve this reference.) - - The program `collect2' is installed as `ld' in the directory where -the passes of the compiler are installed. When `collect2' needs to -find the *real* `ld', it tries the following file names: - - * `real-ld' in the directories listed in the compiler's search - directories. - - * `real-ld' in the directories listed in the environment variable - `PATH'. - - * The file specified in the `REAL_LD_FILE_NAME' configuration macro, - if specified. - - * `ld' in the compiler's search directories, except that `collect2' - will not execute itself recursively. - - * `ld' in `PATH'. - - "The compiler's search directories" means all the directories where -`gcc' searches for passes of the compiler. This includes directories -that you specify with `-B'. - - Cross-compilers search a little differently: - - * `real-ld' in the compiler's search directories. - - * `TARGET-real-ld' in `PATH'. - - * The file specified in the `REAL_LD_FILE_NAME' configuration macro, - if specified. - - * `ld' in the compiler's search directories. - - * `TARGET-ld' in `PATH'. - - `collect2' explicitly avoids running `ld' using the file name under -which `collect2' itself was invoked. In fact, it remembers up a list -of such names--in case one copy of `collect2' finds another copy (or -version) of `collect2' installed as `ld' in a second place in the -search path. - - `collect2' searches for the utilities `nm' and `strip' using the -same algorithm as above for `ld'. - -Standard Header File Directories -================================ - - `GCC_INCLUDE_DIR' means the same thing for native and cross. It is -where GNU CC stores its private include files, and also where GNU CC -stores the fixed include files. A cross compiled GNU CC runs -`fixincludes' on the header files in `$(tooldir)/include'. (If the -cross compilation header files need to be fixed, they must be installed -before GNU CC is built. If the cross compilation header files are -already suitable for ANSI C and GNU CC, nothing special need be done). - - `GPLUS_INCLUDE_DIR' means the same thing for native and cross. It -is where `g++' looks first for header files. `libg++' installs only -target independent header files in that directory. - - `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is -normally `/usr/local/include'. GNU CC searches this directory so that -users can install header files in `/usr/local/include'. - - `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC -doesn't install anything there. - - `TOOL_INCLUDE_DIR' is used for both native and cross compilers. It -is the place for other packages to install header files that GNU CC will -use. For a cross-compiler, this is the equivalent of `/usr/include'. -When you build a cross-compiler, `fixincludes' processes any header -files in this directory. - diff --git a/gcc/ORDERS b/gcc/ORDERS deleted file mode 100644 index ac183c9d4c6..00000000000 --- a/gcc/ORDERS +++ /dev/null @@ -1,4003 +0,0 @@ -The actual order form follows the descriptions of media contents. - -Most of this file is excerpted from the January 1997 GNU's Bulletin. - -Please send suggestions for improvements to gnu@prep.ai.mit.edu or the postal -address at the end of the order form. Thank You. - ------------------------------------------------------------------------------ - - -FSF Order Form with Descriptions January, 1997 - - - -Free Software Foundation, Inc. Telephone: +1-617-542-5942 -59 Temple Place - Suite 330 Fax: (including Japan) +1-617-542-2652 -Boston, MA 02111-1307 Electronic Mail: `gnu@prep.ai.mit.edu' -USA World Wide Web: http://www.gnu.ai.mit.edu - ------------------------------------------------------------------------------ - - - -There are some sections (e.g. ``Forthcoming GNUs'' and ``How to Get GNU -Software'') which are not in this Order Form file. If you wish to see them, -ask gnu@prep.ai.mit.edu for the complete July, 1996 GNU's Bulletin. - - - -Table of Contents ------------------ - - Donations Translate Into Free Software - Cygnus Matches Donations! - Free Software Redistributors Donate - Help from Free Software Companies - Major Changes in GNU Software and Documentation - The Deluxe Distribution - GNU Documentation - GNU Software - - Program/Package Cross Reference - CD-ROMs - Pricing of the GNU CD-ROMs - What Do the Different Prices Mean? - Why Is There an Individual Price? - Is There a Maximum Price? - January 1997 Compiler Tools Binaries CD-ROM - Source Code CD-ROMs - January 1997 Source Code CD-ROMs - July 1996 Source Code CD-ROMs - CD-ROM Subscription Service - FSF T-shirt - Free Software Foundation Order Form - - ------------------------------------------------------------------------------ - - - -Donations Translate Into Free Software -************************************** - -If you appreciate Emacs, GNU CC, Ghostscript, and other free software, you -may wish to help us make sure there is more in the future--remember, -*donations translate into more free software!* - -Your donation to us is tax-deductible in the United States. We gladly accept -*any* currency, although the U.S. dollar is the most convenient. - -If your employer has a matching gifts program for charitable donations, -please arrange to: add the FSF to the list of organizations for your -employer's matching gifts program; and have your donation matched (note *Note -Cygnus Matches Donations!::). If you do not know, please ask your personnel -department. - -Circle amount you are donating, cut out this form, and send it with your -donation to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307 - USA - - $500 $250 $100 $50 Other $_____ Other currency:_____ - -You can charge a donation to any of Carte Blanche, Diner's Club, JCB, -MasterCard, Visa, or American Express. Charges may also be faxed to -+1-617-542-2652. - - Card type: __________________ Expiration Date: _____________ - - Account Number: _____________________________________________ - - Cardholder's Signature: _____________________________________ - - Name: _______________________________________________________ - - Street Address: _____________________________________________ - - City/State/Province: ________________________________________ - - Zip Code/Postal Code/Country: _______________________________ - - Telephone Number: ___________________________________________ - - Email Address: ______________________________________________ - - - -Cygnus Matches Donations! -************************* - -To encourage cash donations to the Free Software Foundation, Cygnus Solutions -will continue to contribute corporate funds to the FSF to accompany gifts by -its employees, and by its customers and their employees. - -Donations payable to the Free Software Foundation should be sent by eligible -persons to Cygnus Solutions, which will add its gifts and forward the total -to the FSF each quarter. The FSF will provide the contributor with a receipt -to recognize the contribution (which is tax-deductible on U.S. tax returns). -To see if your employer is a Cygnus customer, or for more information, -please contact Cygnus: - - Cygnus Solutions - 1325 Chesapeake Terrace - Sunnyvale, CA 94089 - USA - - Telephone: +1 408 542 9600 - +1 800 Cygnus1 (-294-6871) - Fax: +1 408 542 9700 - Electronic-Mail: `info@cygnus.com' - FTP: `ftp.cygnus.com' - World Wide Web: `http://www.Cygnus.com/' - - - -Free Software Redistributors Donate -*********************************** - -In adddition to their conference donation, Red Hat Software has agreed to -donate $1.00 to the FSF for every copy of Red Hat Archives sold. They have -also added a GNU logo to the back of that CD with the words "Supports the -Free Software Foundation". - -The SNOW 2.1 CD producers added the words "Includes $5 donation to the FSF" -to the front of their CD. Potential buyers will know just how much of the -price is for the FSF & how much is for the redistributor. - -The Sun Users Group Deutschland has made it even clearer: their CD says, -"Price 90 DM, + 12 DM donation to the FSF." We thank them for their -contribution to our efforts. - -Kyoto Micro Computer of Japan regularly gives us 10% of their GNU-related -sales. - -Mr. Hiroshi, Mr. Kojima, and the other authors of the `Linux Primer' in Japan -have donated money from the sales of their book. - -Infomagic has continued to make sizeable donations to the FSF. - -At the request of author Arnold Robbins, Specialized Systems Consultants, Inc. -continues to donate 3% of their profits from selling `Effective AWK -Programming'. We would also like to acknowledge the many SSC authors who -have donated their royalties and fees to the FSF. - -In the long run, the success of free software depends on how much new free -software people develop. Free software distribution offers an opportunity to -raise funds for such development in an ethical way. These redistributors -have made use of the opportunity. Many others let it go to waste. - -You can help promote free software development by convincing for-a-fee -redistributors to contribute--either by doing development themselves or by -donating to development organizations (the FSF and others). - -The way to convince distributors to contribute is to demand and expect this -of them. This means choosing among distributors partly by how much they give -to free software development. Then you can show distributors they must -compete to be the one who gives the most. - -To make this work, you must insist on numbers that you can compare, such as, -"We will give ten dollars to the Foobar project for each disk sold." A vague -commitment, such as "A portion of the profits is donated," doesn't give you a -basis for comparison. Even a precise fraction "of the profits from this -disk" is not very meaningful, since creative accounting and unrelated -business decisions can greatly alter what fraction of the sales price counts -as profit. - -Also, press developers for firm information about what kind of development -they do or support. Some kinds make much more long-term difference than -others. For example, maintaining a separate version of a GNU program -contributes very little; maintaining a program on behalf of the GNU Project -<contributes much. Easy new ports contribute little, since someone else -would surely do them; difficult ports such as adding a new CPU to the GNU -compiler or Mach contribute more; major new features & programs contribute -the most. - -By establishing the idea that supporting further development is "the proper -thing to do" when distributing free software for a fee, we can assure a -steady flow of resources for making more free software. - - - -Help from Free Software Companies -********************************* - -When choosing a free software business, ask those you are considering how -much they do to assist free software development, e.g., by contributing money -to free software development or by writing free software improvements -themselves for general use. By basing your decision partially on this -factor, you can help encourage those who profit from free software to -contribute to its growth. - -Wingnut (SRA's special GNU support group) regularly donates a part of its -income to the FSF to support the development of new GNU programs. Listing -them here is our way of thanking them. Wingnut has made a pledge to donate -10% of their income to the FSF, and has purchased several Deluxe Distribution -packages in Japan. Also see *Note Cygnus Matches Donations!::. - - Wingnut Project - Software Research Associates, Inc. - 1-1-1 Hirakawa-cho, Chiyoda-ku - Tokyo 102, Japan - - Phone: (+81-3)3234-2611 - Fax: (+81-3)3942-5174 - E-mail: `info-wingnut@sra.co.jp' - WWW: `http://www.sra.co.jp/public/sra/product/wingnut/' - - - -Major Changes in GNU Software and Documentation -*********************************************** - - * Hurd Progress (Also *note What Is the Hurd::.) - - We have made two test releases of the Hurd, and we will make another - (version 0.2) in this month. Stability is improving, and we have begun - modifying various user-level utilities to understand new Hurd filesystem - features (fileutils, shellutils, tar, etc.). - - One way for people to help out is to compile and run as much third-party - free software as they can; in this way we can find bugs and deficiencies - with some rapidity. Volunteers with a PC are therefore eagerly sought - to get the new 0.2 release and compile their favorite Unix programs and - games. - - * GNU System Progress - - Version 0.2 of the GNU system will be released in this month, to coincide - with the 0.2 release of the Hurd. This complete GNU system is available - by FTP. We are working with Ian Murdock to develop an excellent package - management system for GNU. This will make administering and upgrading - the system much easier. Because of features only the Hurd has, the GNU - package management system will be simpler and more featureful than - similar package systems for various GNU/Linux distributions. - - * New Source Code CD! (See *Note January 1997 Source Code CD-ROMs::) - - We are releasing the January 1997 (Edition 9) Source Code CD-ROM this - month. Once again, it is a two disk set. It includes several new - programs: `gforth', `gpc', <Meta-HTML>, `stow', `units', VRweb, `wget', - `windows32api', and `xinfo'. On the CD-ROMs are full distributions of - X11R6.3, MIT Scheme, Emacs, GCC, and current versions of all other GNU - Software. *Note GNU Software::, for more about these packages. - - * New Compiler Tools CD-ROM - - We are releasing the January 1997 (Edition 4) Compiler Tools Binaries - CD. Support is included for several new operating systems. - - The Compiler Tools Binaries CD-ROM contains executables of the GNU - compiler tools for some systems that don't normally come with a - compiler. This allows users of those systems to compile their own - software without having to buy a proprietary compiler. - - We hope to include more systems with each update of this CD-ROM. If you - can help build binaries for new systems or have one to suggest, please - contact us at either address on the top menu. For more information, see - *Note Compiler Tools Binaries CD-ROM::. - - * New/Updated Manuals since Last Bulletin (See *Note Documentation::) - - Since the last bulletin, we have published new editions of: `Debugging - with GDB', for version 4.16 with a new color cover; `Texinfo' Manual, - edition 2.24; & the `GNU Emacs Manual', for version 19.33 with a new - color cover. `Using and Porting GNU CC' has been re-printed in a - lay-flat bound edition with a new color cover. A new Bison Manual with - a new color cover is planned. - - * Give to GNU the United Way! - - As a 501(c)3 tax-exempt organization, the FSF is eligible to receive - United Way funds. When donating to United Way, one can specify that all - or part of the donation be directed to the FSF. On the donor form, - check the "Specific Requests" box and include the sentence, "Send my - gift to the Free Software Foundation, 59 Temple Place, Suite 330, - Boston, MA 02111." We especially appreciate the donations from Microsoft - matching the United Way donations of their employees. Also see *Note - Donations Translate Into Free Software:: and *Note Cygnus Matches - Donations!::. - - * GNU Software Works on MS-DOS (Also *note GNU Software::.) - - GNU Emacs 19 and many other GNU programs have been ported to MS-DOS for - i386/i486/Pentium machines. We ship binaries & sources on the *Note - Compiler Tools Binaries CD-ROM::. - - * MULE Merge Almost Complete - - MULE is the Multi-Lingual Emacs developed by Ken'ichi Handa at the - Electro-Technical Lab in Tsukuba, Japan. Handa has readied the code for - merging into Emacs and we expect to complete the merge soon. - - * GCC (For current status on GCC and GNAT, *note GNU Software::.) - - New front ends for GCC are being done for Pascal & Chill. Pascal, - `gpc', stagnated for some years, but should be released by the time you - read this. See `http://agnes.dida.physik.uni-essen.de/~gnu-pascal'. - - * GUILE - - GUILE is currently available as a test release. GNU's Ubiquitous - Intelligent Language for Extension is an SCM-based library that can make - any ordinary C program extensible. (For SCM info, see "JACAL" in *Note - GNU Software::.) - - Also being developed are SCSH-compatible system call & Tk interfaces, a - module system, dynamic linking support, & a byte-code interpreter. - Support for Emacs Lisp & a more C-like language is coming. - - * Texinfo (For current status, *note GNU Software::.) - - Texinfo now provides macro facilities and supports multicolumn tables. - It comes with an `install-info' program that packages can use to update - the `dir' file automatically when they install their Info files. - - * GNU Common Lisp (For current status, *note GNU Software::.) - - Version 2.2.1 of GNU Common Lisp (GCL) was released in December '96. It - now includes a graphical interface to the Tk widget system. All - documentation is now Texinfo-based, with built-in regexp matching used - to access the documentation. A first pass at the Common Lisp condition - system is also included. Version 2.2.1 contains mainly updates to allow - GCL 2.2 to work correctly with current operating system levels, and to - fix bugs. Volunteers to help with the move to the ANSI standard are - most welcome; please contact `schelter@math.utexas.edu'. - - * Experimental Electronic Cash - - `http://www.lysator.liu.se/~nisse/NCash' is an experimental - implementation of anonymous electronic cash which is to be released as - free software. - - * HTML Professional and GPL - - The recent development and release of HTML Professional was made under - the terms of the GNU GPL. In order to facilitate distribution, the GPL - text was re-encoded into this more recent version of HTML, and is now - distributed with HTML Pro. An online copy can be retrieved at - `http://www.arbornet.org/~silmaril/dtds/html/gnugpl.html'. - - HTML Pro is an unofficial version of the HTML DTD. HTML Pro is - distributed for discussion by the `www-html' mailing list. It - composites all other known versions, and allows World Wide Web designers - to use recent experimental additions in a rational and structured manner. - It comes with a `.ced' file for GNU Emacs/psgml-mode and can be gotten at - `ftp://www.ucc.ie/pub/html/htmlpro.{zip|tar.gz|zip.hqx}'. - Documentation is at - `http://www.arbornet.org/~silmaril/dtds/html/htmlpro.html'. - - * Meta-HTML 5.01 Source Release - - Version 5.01 of Universal Access Inc.'s <Meta-HTML> is now available. - - <Meta-HTML> is a programming language specifically designed to work - within the environment of the World Wide Web. Although it is a genuine - programming language, suitable for large-scale symbolic manipulation, - <Meta-HTML> also provides the most commonly wanted Web functionality as - built-in primitives, so you don't have to write them. You can find out - more about the theory of implementation in this white paper - `http://www.metahtml.com/meta-html/manifesto.html'. - - Web pages are authored using HTML and <Meta-HTML> statements freely - intermixed. When a page is requested by a browser, the page is passed - through the <Meta-HTML> engine, which dynamically processes any - <Meta-HTML> statements to produce a final HTML page which is delivered - to the browser. - - The source distribution provides several different interpreter options: - a CGI engine which can be run by any Unix Web server; a full-featured - Web server (mhttpd) with the interpreter built in; a standalone - processor, much like Perl or Tcl; and an interactive debugger, with a - feel similar to GDB (mdb). - - There is a user mailing list: `metahtml-users@metahtml.com'. You can - subscribe on the Web at `http://www.metahtml.com/E-Mail/', or by sending - mail to `metahtml-users-request@metahtml.com'. - - Pre-compiled distribution sets for some systems are available via the - <Meta-HTML> Web site at `http://www.metahtml.com'. - - * VRweb Browser - - VRweb, a browser for 3D models on the Web written in the Virtual Reality - Modeling Language (VRML), is now available under the GPL. VRweb works - in conjunction with Web browsers on Unix & Windows platforms. - - VRweb is a joint project of IICM (home of Hyper-G), NCSA (home of - Mosaic), & the University of Minnesota (home of Gopher). The software - is freely available in binary & source. VRweb 1.2 for Unix has just - been released, VRweb 1.2 for Windows will follow in due course. You can - download VRweb from `ftp://iicm.tu-graz.ac.at/pub/Hyper-G/VRweb/UNIX' - and numerous mirror sites. Further information on VRweb can be found at - `http://hyperg.iicm.tu-graz.ac.at/vrweb'. - - VRML is a non-proprietary, platform-independent file format for 3D - graphics on the Internet. Also see `http://www.sdsc.edu/vrml/', the - VRML Repository. - - - -The Deluxe Distribution -*********************** - -The Free Software Foundation has been asked repeatedly to create a package -that provides executables for all of our software. Normally we offer only -sources. The Deluxe Distribution provides binaries with the source code and -includes six T-shirts, all our CD-ROMs, printed manuals, & reference cards. - -The FSF Deluxe Distribution contains the binaries and sources to hundreds of -different programs including Emacs, the GNU C/C++ Compiler, the GNU Debugger, -the complete X Window System, and all the GNU utilities. - -We will make a Deluxe Distribution for most machines/operating systems. We -may be able to send someone to your office to do the compilation, if we can't -find a suitable machine here. However, we can only compile the programs that -already support your chosen machine/system - porting is a separate matter. -(To commission a port, see the GNU Service Directory; details in *Note Free -Software Support::.) Compiling all these programs takes time; a Deluxe -Distribution for an unusual machine will take longer to produce than one for -a common machine. Please contact the FSF Office with any questions. - -We supply the software on a write-once CD-ROM (in ISO 9660 format with "Rock -Ridge" extensions), or on one of these tapes in Unix `tar' format: 1600 or -6250bpi 1/2in reel, Sun DC300XLP 1/4in cartridge - QIC24, IBM RS/6000 1/4in -c.t. - QIC 150, Exabyte 8mm c.t., or DAT 4mm c.t. If your computer cannot -read any of these, please contact us to see if we can handle your format. - -The manuals included are one each of `Bison', `Calc', `GAWK', `GCC', `GNU C -Library', `GDB', `Flex', `GNU Emacs Lisp Reference', `Programming in Emacs -Lisp: An Introduction', `Make', `Texinfo', & `Termcap' manuals; six copies of -the `GNU Emacs' manual; and ten reference cards each for Emacs, Bison, Calc, -Flex, & GDB. - -Every Deluxe Distribution also has a copy of the latest editions of our -CD-ROMs that have sources of our software & compiler tool binaries for some -systems. The CDs are in ISO 9660 format with Rock Ridge extensions. - -The price of the Deluxe Distribution is $5000 (shipping included). These -sales provide enormous financial assistance to help the FSF develop more free -software. To order, please fill out the "Deluxe Distribution" section on the -*note Free Software Foundation Order Form::. and send it to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307 - USA - - Telephone: +1-617-542-5942 - Fax (including Japan): +1-617-542-2652 - Electronic Mail: gnu@prep.ai.mit.edu - World Wide Web: http://www.gnu.ai.mit.edu - - - -GNU Documentation -***************** - -GNU is dedicated to having quality, easy-to-use online & printed -documentation. GNU manuals are intended to explain underlying concepts, -describe how to use all the features of each program, & give examples of -command use. GNU manuals are distributed as Texinfo source files, which -yield both typeset hardcopy via the TeX document formatting system and online -hypertext display via the menu-driven Info system. Source for these manuals -comes with our software; here are the manuals that we publish as printed -books. See the *note Free Software Foundation Order Form::., to order them. - -Most GNU manuals are bound as soft cover books with "lay-flat" bindings. -This allows you to open them so they lie flat on a table without creasing the -binding. They have an inner cloth spine and an outer cardboard cover that -will not break or crease as an ordinary paperback will. Currently, the -`Using and Porting GNU CC', `GDB', `Emacs', `Emacs Lisp Reference', -`Programming in Emacs Lisp: An Introduction', `GNU Awk User's Guide', `Make', -& `Bison' manuals have this binding. Our other manuals also lie flat when -opened, using a GBC binding. Our manuals are 7in by 9.25in except the 8.5in -by 11in `Calc' manual. - -The edition number of the manual and version number of the program listed -after each manual's name were current at the time this Bulletin was published. - -`Debugging with GDB' (for Version 4.16) tells how to run your program under -GNU Debugger control, examine and alter data, modify a program's flow of -control, and use GDB through GNU Emacs. - -The `GNU Emacs Manual' (12th Edition for Version 19.33) describes editing with -GNU Emacs. It explains advanced features, including outline mode and regular -expression search; how to use special programming modes to write languages -like C++ and TeX; how to use the `tags' utility; how to compile and correct -code; how to make your own keybindings; and other elementary customizations. - -`Programming in Emacs Lisp: An Introduction' (October 1995 Edition 1.04) is -for people who are not necessarily interested in programming, but who do want -to customize or extend their computing environment. If you read it in Emacs -under Info mode, you can run the sample programs directly. - -`The GNU Emacs Lisp Reference Manual' (Edition 2.4 for Version 19.29) and -`The GNU Emacs Lisp Reference, Japanese Edition' (Japanese Draft Revision -1.0, from English Edition 2.4 for Version 19.29) cover this programming -language in depth, including data types, control structures, functions, -macros, syntax tables, searching/matching, modes, windows, keymaps, byte -compilation, and the operating system interface. - -`The GNU Awk User's Guide' (Edition 1.0 for Version 3.0) tells how to use -`gawk'. It is written for those who have never used `awk' and describes -features of this powerful string and record manipulation language. It -clearly delineates those features which are part of POSIX `awk' from `gawk' -extensions, providing a comprehensive guide to `awk' program portability. - -`GNU Make' (Edition 0.50 for Version 3.75 Beta) describes GNU `make', a -program used to rebuild parts of other programs. The manual tells how to -write "makefiles", which specify how a program is to be compiled and how its -files depend on each other. Included are an introductory chapter for novice -users and a section about automatically generated dependencies. - -The `Flex' manual (Edition 1.03 for Version 2.3.7) teaches you to write a -lexical scanner definition for the `flex' program to create a C++ or C-coded -scanner that recognizes the patterns defined. You need no prior knowledge of -scanners. - -`The Bison Manual' (November 1995 Edition for Version 1.25) teaches you how -to write context-free grammars for the Bison program that convert into -C-coded parsers. You need no prior knowledge of parser generators. - -`Using and Porting GNU CC' (November 1995 Edition for Version 2.7.2) tells -how to run, install, and port the GNU C Compiler to new systems. It lists -new features and incompatibilities of GCC, but people not familiar with C -will still need a good reference on the C programming language. It also -covers G++. - -The `Texinfo' manual (Edition 2.24 for Version 3) explains the markup -language that produces our online Info documentation & typeset hardcopies. -It tells you how to make tables, lists, chapters, nodes, accented & special -characters, indexes, cross references, & how to catch mistakes. - -`The Termcap Manual' (3rd Edition for Version 1.3), often described as "twice -as much as you ever wanted to know about termcap," details the format of the -termcap database, the definitions of terminal capabilities, and the process -of interrogating a terminal description. This manual is primarily for -programmers. - -The `C Library Reference Manual' (Edition 0.08 for Version 2.0) describes the -library's facilities, including both what Unix calls "library functions" & -"system calls." We are doing small copier runs of this manual until it -becomes more stable. Please send fixes to `bug-glibc-manual@prep.ai.mit.edu'. - -The `Emacs Calc Manual' (for Version 2.02) is both a tutorial and a reference -manual. It tells how to do ordinary arithmetic, how to use Calc for algebra, -calculus, and other forms of mathematics, and how to extend Calc. - - - -GNU Software -************ - -All our software is available via FTP; see *Note How to Get GNU Software::. -We also offer *Note CD-ROMs::, and printed *Note Documentation::, which -includes manuals and reference cards. In the articles describing the -contents of each medium, the version number listed after each program name -was current when we published this Bulletin. When you order a newer CD-ROM, -some of the programs may be newer and therefore the version number higher. -See the *note Free Software Foundation Order Form::., for ordering -information. - -Some of the contents of our FTP distributions are compressed. We have -software on our FTP sites to uncompress these files. Due to patent troubles -with `compress', we use another compression program, `gzip'. (Such -prohibitions on software development are fought by the League for Programming -Freedom; *note What Is the LPF::., for details.) - -You may need to build GNU `make' before you build our other software. Some -vendors supply no `make' utility at all and some native `make' programs lack -the `VPATH' feature essential for using the GNU configure system to its full -extent. The GNU `make' sources have a shell script to build `make' itself on -such systems. - -We welcome all bug reports and enhancements sent to the appropriate -electronic mailing list (*note Free Software Support::.). - - - -Configuring GNU Software ------------------------- - -We are using Autoconf, a uniform scheme for configuring GNU software packages -in order to compile them (see "Autoconf" and "Automake" below, in this -article). The goal is to have all GNU software support the same alternatives -for naming machine and system types. - -Ultimately, it will be possible to configure and build the entire system all -at once, eliminating the need to configure each individual package separately. - -You can also specify both the host and target system to build -cross-compilation tools. Most GNU programs now use Autoconf-generated -configure scripts. - - - -GNU Software Now Available --------------------------- - -For future programs and features, see *Note Forthcoming GNUs::. - -Key to cross reference: - - BinCD January 1997 Binaries CD-ROM - SrcCD January 1997 Source CD-ROMs - -[FSFman] shows that we sell a manual for that package. [FSFrc] shows we sell -a reference card for that package. To order them, see the *note Free -Software Foundation Order Form::. *Note Documentation::, for more -information on the manuals. Source code for each manual or reference card is -included with each package. - - * `acm' (SrcCD) - - `acm' is a LAN-oriented, multiplayer, aerial combat simulation that runs - under the X Window System. Players engage in air to air combat against - one another using heat seeking missiles and cannons. We are working on - a more accurate simulation of real airplane flight characteristics. - - * Apache *Also see* `http://www.apache.org/' (SrcCD) - - Apache is an HTTP server designed as a successor to the NCSA family of - web servers. It adds a significant amount of new functionality, has an - extensive API for modular enhancements, is extremely flexible without - compromising speed, and has an active development group and user - community. - - * Autoconf (SrcCD) - - Autoconf produces shell scripts which automatically configure source code - packages. These scripts adapt the packages to many kinds of Unix-like - systems without manual user intervention. Autoconf creates a script for - a package from a template file which lists the operating system features - which the package can use, in the form of `m4' macro calls. Autoconf - requires GNU `m4' to operate, but the resulting configure scripts it - generates do not. - - * Automake (SrcCD) - - Automake is a tool for generating `Makefile.in's for use with Autoconf. - The generated makefiles are compliant with GNU Makefile standards. - - * BASH (SrcCD) - - GNU's shell, BASH (Bourne Again SHell), is compatible with the Unix `sh' - and offers many extensions found in `csh' and `ksh'. BASH has job - control, `csh'-style command history, command-line editing (with Emacs - and `vi' modes built-in), and the ability to rebind keys via the - `readline' library. BASH conforms to the POSIX 1003.2-1992 standard. - - * `bc' (SrcCD) - - `bc' is an interactive algebraic language with arbitrary precision - numbers. GNU `bc' follows the POSIX 1003.2-1992 standard with several - extensions, including multi-character variable names, an `else' - statement, and full Boolean expressions. The RPN calculator `dc' is now - distributed as part of the same package, but GNU `bc' is not implemented - as a `dc' preprocessor. - - * BFD (BinCD, SrcCD) - - The Binary File Descriptor library allows a program which operates on - object files (e.g., `ld' or GDB) to support many different formats in a - clean way. BFD provides a portable interface, so that only BFD needs to - know the details of a particular format. One result is that all - programs using BFD will support formats such as a.out, COFF, and ELF. - BFD comes with Texinfo source for a manual (not yet published on paper). - - At present, BFD is not distributed separately; it is included with - packages that use it. - - * Binutils (BinCD, SrcCD) - - Binutils includes these programs: `ar', `c++filt', `demangle', `gas', - `gprof', `ld', `nlmconv', `nm', `objcopy', `objdump', `ranlib', `size', - `strings', & `strip'. - - Binutils version 2 uses the BFD library. The GNU assembler, `gas', - supports the a29k, Alpha, H8/300, H8/500, HP-PA, i386, i960, m68k, m88k, - MIPS, NS32K, SH, SPARC, Tahoe, Vax, and Z8000 CPUs, and attempts to be - compatible with many other assemblers for Unix and embedded systems. It - can produce mixed C and assembly listings, and includes a macro facility - similar to that in some other assemblers. GNU's linker, `ld', emits - source-line numbered error messages for multiply-defined symbols and - undefined references, and interprets a superset of AT&T's Linker Command - Language, which gives control over where segments are placed in memory. - `nlmconv' converts object files into Novell NetWare Loadable Modules. - `objdump' can disassemble code for most of the CPUs listed above, and - can display other data (e.g., symbols and relocations) from any file - format read by BFD. - - * Bison *See *Note Documentation::* (BinCD, SrcCD) [FSFman, FSFrc] - - Bison is an upwardly compatible replacement for the parser generator - `yacc'. Texinfo source for the `Bison Manual' and reference card are - included. - - * C Library *See *Note Forthcoming GNUs::* (BinCD, SrcCD) [FSFman] - - The GNU C library supports ISO C-1989, ISO C/amendment 1-1995, POSIX - 1003.1-1990, POSIX 1003.1b-1993, POSIX 1003.1c-1995 (when the underlying - system permits), & most of the functions in POSIX 1003.2-1992. It is - nearly compliant with the extended XPG4.2 specification which guarantees - upward compatibility with 4.4BSD & many System V functions. - - When used with the GNU Hurd, the C Library performs many functions of the - Unix system calls directly. Mike Haertel has written a fast `malloc' - which wastes less memory than the old GNU version. - - GNU `stdio' lets you define new kinds of streams, just by writing a few - C functions. Two methods for handling translated messages help writing - internationalized programs & the user can adopt the environment the - program runs in to conform with local conventions. Extended `getopt' - functions are already used to parse options, including long options, in - many GNU utilities. The name lookup functions now are modularized which - makes it easier to select the service which is needed for the specific - database & the document interface makes it easy to add new services. - Texinfo source for the `GNU C Library Reference Manual' is included - (*note Documentation::.). - - Previous versions of the GNU C library ran on a large number of systems. - The architecture-dependent parts of the C library have not been updated - since development on version 2.0 started, so today it runs out of the - box only on GNU/Hurd (all platforms GNU/Hurd also runs on) & GNU/Linux - (ix86, Alpha, m68k, work is in progress for MIPS & Sparc). Other - architectures will become available again as soon as somebody does the - port. - - * C++ Library (BinCD, SrcCD) - - The GNU C++ library (libg++) contains an extensive collection of - container and utility classes, including Obstacks, multiple-precision - Integers and Rationals, Complex numbers, BitSets, and BitStrings. - - The distribution also includes the libstdc++ library. This implements - library facilities defined by the forthcoming ANSI/ISO C++ standard, - including strings, the iostream library, and a port of the Standard - Template Library. - - * Calc (SrcCD) [FSFman, FSFrc] - - Calc (written by Dave Gillespie in Emacs Lisp) is an extensible, advanced - desk calculator & mathematical tool that runs as part of GNU Emacs. You - can use Calc as a simple four-function calculator, but it has many more - features including: choice of algebraic or RPN (stack-based) entry; - logarithmic, trigonometric, & financial functions; arbitrary precision; - complex numbers; vectors; matrices; dates; times; infinities; sets; - algebraic simplification; & differentiation & integration. It outputs to - `gnuplot', & comes with source for a manual & reference card (*note - Documentation::.). - - * `cfengine' (SrcCD) - - `cfengine' is used to maintain site-wide configuration of a - heterogeneous Unix network using a simple high level language. Its - appearance is similar to `rdist', but allows many more operations to be - performed automatically. See Mark Burgess, "A Site Configuration - Engine", `Computing Systems', Vol. 8, No. 3 (ask `office@usenix.org' how - to get a copy). - - * Chess (SrcCD) - - GNU Chess lets most modern computers play a full game of chess. It has - a plain terminal interface, a curses interface, & the unique X Windows - interface `xboard'. Best results are obtained using GNU C to compile - GNU Chess. - - Recent improvements include "configure"-capability, correct thinking on - opponent's time, makefile for Windows NT, full Windows 95/NT - compatibility, parallel Unix & Windows 95/NT versions, major crash bug - fix & various other minor improvements & bug fixes. - - Stuart Cracraft founded GNU Chess & is the project lead for the 10+ year - history of GNU Chess. Acknowledgements for this past year's work - include Chua Kong Sian, National Supercomputing Research Center, - Singapore; & Conor McCarthy, Biomolecular/Biomed Science at Griffith - University, Australia. - - Send bugs to `bug-gnu-chess@prep.ai.mit.edu' & general comments to - `info-gnu-chess@prep.ai.mit.edu'. Visit the author's website at - `http://www.win.net/~msm/index.html'. Play GNU Chess on the web at - `http://www.delorie.com/game-room/chess'. - - * CLISP (SrcCD) - - CLISP is a Common Lisp implementation by Bruno Haible & Michael Stoll. - It mostly supports the Lisp described by `Common LISP: The Language (2nd - edition)' & the ANSI Common Lisp standard. CLISP includes an - interpreter, a byte-compiler, a large subset of CLOS & a foreign language - interface. The user interface language (English, German, French) can be - chosen at run time. An X11 API is available through CLX & Garnet. - CLISP needs only 2 MB of memory & runs on many microcomputers (including - MS-DOS systems, OS/2, Windows NT, Windows 95, Amiga 500-4000, & Acorn - RISC PC) & all kinds of Unix systems. - - * Common Lisp *Also *note GNUs Flashes::.* (SrcCD) - - GNU Common Lisp (GCL, formerly known as Kyoto Common Lisp) is a compiler - & interpreter for Common Lisp. GCL is very portable & extremely - efficient on a wide class of applications, & compares favorably in - performance with commercial Lisps on several large theorem-prover & - symbolic algebra systems. GCL supports the CLtL1 specification but is - moving towards the proposed ANSI standard. - - GCL compiles to C & then uses the native optimizing C compiler (e.g., - GCC). A function with a fixed number of args & one value turns into a C - function of the same number of args, returning one value--so GCL is - maximally efficient on such calls. Its conservative garbage collector - gives great freedom to the C compiler to put Lisp values in registers. - It has a source level Lisp debugger for interpreted code & displays - source code in an Emacs window. Its profiler (based on the C profiling - tools) counts function calls & the time spent in each function. - - There is now a built-in interface to the Tk widget system. It runs in a - separate process, so users may monitor progress on Lisp computations or - interact with running computations via a windowing interface. - - There is also an Xlib interface via C (xgcl-2). CLX runs with GCL, as - does PCL (see "PCL" later in this article). - - GCL version 2.2.1 is released under the GNU Library General Public - License. - - * CLX (SrcCD) - - CLX is an X Window interface library for GCL. This is separate from the - built-in TK interface. - - * `cpio' (SrcCD) - - `cpio' is an archive program with all the features of SVR4 `cpio', - including support for the final POSIX 1003.1 `ustar' standard. `mt', a - program to position magnetic tapes, is included with `cpio'. - - * CVS (SrcCD) - - CVS is a version control system (like RCS or SCCS) which allows you to - keep old versions of files (usually source code), keep a log of who, - when, and why changes occurred, etc. It handles multiple developers, - multiple directories, triggers to enable/log/control various operations, - and can work over a wide area network. It does not handle build - management or bug-tracking; these are handled by `make' and GNATS, - respectively. - - * DejaGnu (SrcCD) - - DejaGnu is a framework to test programs with a single front end for all - tests. DejaGnu's flexibility & consistency makes it easy to write tests. - DejaGnu will also work with remote hosts and embedded systems. - - DejaGnu comes with `expect', which runs scripts to conduct dialogs with - programs. - - * Diffutils (SrcCD) - - GNU `diff' compares files showing line-by-line changes in several - flexible formats. It is much faster than traditional Unix versions. The - Diffutils package has `diff', `diff3', `sdiff', & `cmp'. Future plans - include support for internationalization (e.g., error messages in - Chinese) & some non-Unix PC environments, & a library interface that can - be used by other free software. - - * DJGPP *Also see "GCC" in this article* (BinCD) - - DJ Delorie has ported GCC/G++ to i386s running DOS. DJGPP has a 32-bit - i386 DOS extender with a symbolic debugger, development libraries, & - ports of Bison, `flex', & Binutils. Full source code is provided. It - needs at least 5MB of hard disk space to install & 512K of RAM to use. - It supports SVGA (up to 1024x768), XMS & VDISK memory allocation, - `himem.sys', VCPI (e.g., QEMM, DESQview, & 386MAX), & DPMI (e.g., - Windows 3.x, OS/2, QEMM, & QDPMI). Version 2 was released in Feb. 1996, - & needs a DPMI environment; a free DPMI server is included. - - FTP from `ftp.simtel.net' in `/pub/simtelnet/gnu/djgpp/' (or a SimTel - mirror site). - - Ask `listserv@delorie.com', to join a DJGPP users mailing list. - - * `dld' (SrcCD) - - `dld' is a dynamic linker written by W. Wilson Ho. Linking your program - with the `dld' library allows you to dynamically load object files into - the running binary. `dld' supports a.out object types on the following - platforms: Convex C-Series (BSD), i386/i486/Pentium (GNU/Linux), Sequent - Symmetry i386 (Dynix 3), Sun-3 (SunOS 3 & 4), Sun-4 (SunOS 4), & VAX - (Ultrix). - - * `doschk' (SrcCD) - - This program is a utility to help software developers ensure that their - source file names are distinguishable on System V platforms with - 14-character filenames and on MS-DOS systems with 8+3 character - filenames. - - * `ed' (SrcCD) - - `ed' is the standard text editor. It is line-oriented and can be used - interactively or in scripts. - - * Elib (SrcCD) - - Elib is a small library of Emacs Lisp functions, including routines for - using AVL trees and doubly-linked lists. - - * Elisp archive (SrcCD) - - This is a snapshot of Ohio State's GNU Emacs Lisp FTP Archive. FTP it - from `archive.cis.ohio-state.edu' in `/pub/gnu/emacs/elisp-archive'. - - * Emacs *Also *note Forthcoming GNUs::.* [FSFman(s), FSFrc] - - In 1975, Richard Stallman developed the first Emacs, an extensible, - customizable real-time display editor & computing environment. GNU Emacs - is his second implementation. It offers true Lisp--smoothly integrated - into the editor--for writing extensions & provides an interface to the X - Window System. It runs on Unix, MS-DOS, & Windows NT or 95. In - addition to its powerful native command set, Emacs can emulate the - editors vi & EDT (DEC's VMS editor). Emacs has many other features which - make it a full computing support environment. Source for the `GNU Emacs - Manual' & a reference card comes with the software. Sources for the - `GNU Emacs Lisp Reference Manual', & `Programming in Emacs Lisp: An - Introduction' are distributed in separate packages. *Note - Documentation::. - - * Emacs 19 (SrcCD) [FSFman(s), FSFrc] - - Emacs 19 works with character-only terminals & with the X Window System - (with or without an X toolkit). Features new to Emacs 19 include: - multiple X windows ("frames" to Emacs), with a separate X window for the - minibuffer or a minibuffer attached to each X window; use of the X - toolkit; interfacing with the X resource manager; property lists - associated with regions of text in a buffer; multiple fonts & colors - defined by those properties; simplified/improved processing of function - keys, mouse movement & clicks; X selection processing, including - clipboard selections; hooks to be run if the point or mouse moves - outside a certain range; menu bars & popup menus defined by keymaps; - scrollbars; before- & after-change hooks; a source-level debugger for - Emacs Lisp programs; floating point numbers; improved buffer allocation, - including returning storage to the system when a buffer is killed; many - updated libraries; Autoconf-based configuration; support for version - control systems (CVS, RCS, & SCCS); & European character sets. - - Features added recently to Emacs 19 include the ability to open frames - on more than one X display from a single Emacs job, operation under - MS-DOS, MS Windows, and Windows NT, displaying multiple views of an - outline at the same time, Lisp-level timers for real time and idle time, - version control support for CVS and for multiple branches, text - properties for formatting text, commands to edit text properties and - save them in files, and GNU-standard long-named command line options. - Also see *Note Forthcoming GNUs::. - - Emacs 19 works on: Acorn RISC (RISCiX); Alliant FX/2800 (BSD); Alpha - (OSF/1 or GNU/Linux); Apollo (DomainOS); Bull DPX/2 2nn & 3nn (SysV.3) & - sps7 (SysV.2); Clipper; Convex (BSD); Cubix QBx (SysV); Data General - Aviion (DGUX); DEC MIPS (Ultrix 4.2, OSF/1, not VMS); Elxsi 6400 (SysV); - Gould Power Node & NP1 (4.2 & 4.3BSD); Harris Night Hawk 1200, 3000, - 4000 & 5000 (cxux); Harris Night Hawk Power PC (powerunix); Honeywell - XPS100 (SysV); HP 9000 series 200, 300, 700, 800 (but not 500) (4.3BSD; - HP-UX 7, 8, 9; NextStep); Intel i386/i486/Pentium (GNU/Hurd, GNU/Linux, - 386BSD, AIX, BSDI/386, FreeBSD, Esix, ISC, MS-DOS, NetBSD, SCO3.2v4, - Solaris, SysV, Xenix, WindowsNT, Windows95); IBM RS/6000 (AIX 3.2) & - RT/PC (AIX, BSD); Motorola Delta 147 & 187 (SysV.3, SysV.4, m88kbcs); - National Semiconductor 32K (Genix); NeXT (BSD, Mach 2 w/ NeXTStep 3.0); - Paragon (OSF/1); Prime EXL (SysV); Pyramid (BSD); Sequent Symmetry (BSD, - ptx); Siemens RM400 & RM600 (SysV); SGI Iris 4D (Irix 4.x & 5.x); Sony - News/RISC (NewsOS); Stardent i860 (SysV); Sun 3 & 4, SPARC 1, 1+, 2, 10, - Classic (SunOS 4.0, 4.1, Solaris 2.0-2.3); Tadpole 68k (SysV); Tektronix - XD88 (SysV.3) & 4300 (BSD); & Titan P2 & P3 (SysV). - - * Emacs 18 (SrcCD) [FSFrc] - - Emacs 18 is several years old. We no longer maintain it, but still - distribute it for those using platforms which Emacs 19 does not support: - Alliant FX/80, Altos 3068, Amdahl (UTS), AT&T (3Bs & 7300 PC), CCI 5/32 - & 6/32, Celerity, DEC (VAX VMS), Dual, Encore (APC, DPC, & XPC), HLH - Orion (original & 1/05), ISI (Optimum V, 80386), Masscomp, NCR Tower 32 - (SVR2 & SVR3), Nixdorf Targon 31, Nu (TI & LMI), pfa50, Plexus, Prime - EXL, Stride (system rel. 2), Tahoe, Tandem Integrity S2, Tektronix 16000, - Triton 88, Ustation E30 (SS5E), Whitechapel (MG1), & Wicat. - - * `es' (SrcCD) - - `es' is an extensible shell (based on `rc') with first-class functions, - lexical scope, exceptions, and rich return values (i.e., functions can - return values other than just numbers). `es''s extensibility comes from - the ability to modify and extend the shell's built-in services, such as - path searching and redirection. Like `rc', it is great for both - interactive use and scripting, particularly since its quoting rules are - much less baroque than the C and Bourne shells. - - * `enscript' (SrcCD) - - `enscript' is an upwardly-compatible replacement for the Adobe - `enscript' program. It formats ASCII files (outputting in Postscript) - and stores generated output to a file or sends it directly to the - printer. - - * Exim (SrcCD) - - Exim is a new Internet mail transfer agent, similar in style to Smail 3. - It can handle relatively high volume mail systems, header rewriting, - control over which hosts/nets may use it as a relay, blocking of - unwanted mail from specified hosts/nets/senders, and multiple local - domains on one mail host ("virtual domains") with several options for - the way these are handled. - - * `f2c' *Also see "Fortran" below & in *Note Forthcoming GNUs::* - (SrcCD) - - `f2c' converts Fortran-77 source into C or C++, which can be compiled - with GCC or G++. Get bug fixes by FTP from site `netlib.bell-labs.com' - or by email from `netlib@netlib.bell-labs.com'. For a summary, see the - file `/netlib/f2c/readme.Z'. - - * `ffcall' (SrcCD) - - `ffcall' is a C library for implementing foreign function calls in - embedded interpreters by Bill Triggs and Bruno Haible. It allows C - functions with arbitrary argument lists and return types to be called or - emulated (callbacks). - - * Fileutils (SrcCD) - - The Fileutils are: `chgrp', `chmod', `chown', `cp', `dd', `df', `dir', - `dircolors', `du', `install', `ln', `ls', `mkdir', `mkfifo', `mknod', - `mv', `rm', `rmdir', `sync', `touch', & `vdir'. - - * Findutils (SrcCD) - - `find' is frequently used both interactively and in shell scripts to - find files which match certain criteria and perform arbitrary operations - on them. Also included are `locate', which scans a database for file - names that match a pattern, and `xargs', which applies a command to a - list of files. - - * Finger (SrcCD) - - GNU Finger has more features than other finger programs. For sites with - many hosts, a single host may be designated as the finger "server" host - and other hosts at that site configured as finger "clients". The server - host collects information about who is logged in on the clients. To - finger a user at a GNU Finger site, a query to any of its client hosts - gets useful information. GNU Finger supports many customization - features, including user output filters and site-programmable output for - special target names. - - * `flex' (BinCD, SrcCD) [FSFman, FSFrc] - - `flex' is a replacement for the `lex' scanner generator. `flex' was - written by Vern Paxson of the Lawrence Berkeley Laboratory and generates - far more efficient scanners than `lex' does. Sources for the `Flex - Manual' and reference card are included (*note Documentation::.). - - * Fortran (`g77') *Also *note Forthcoming GNUs::.* (SrcCD) - - GNU Fortran (`g77'), developed by Craig Burley, is available for public - beta testing on the Internet. For now, `g77' produces code that is - mostly object-compatible with `f2c' & uses the same run-time library - (`libf2c'). - - * Fontutils (SrcCD) - - The Fontutils convert between font formats, create fonts for use with - Ghostscript or TeX (starting with a scanned type image & converting the - bitmaps to outlines), etc. It includes: `bpltobzr', `bzrto', - `charspace', `fontconvert', `gsrenderfont', `imageto', `imgrotate', - `limn', & `xbfe'. - - * GAWK (SrcCD) [FSFman] - - GAWK is upwardly compatible with the latest POSIX specification of - `awk'. It also provides several useful extensions not found in other - `awk' implementations. Texinfo source for the `The GNU Awk User's - Guide' comes with the software (*note Documentation::.). - - * `gcal' (SrcCD) - - `gcal' is a program for printing calendars. It displays different - styled calendar sheets, eternal holiday lists, and fixed date warning - lists. - - * GCC *Also *note GNUs Flashes::.* (BinCD, SrcCD) [FSFman] - - Version 2 of the GNU C Compiler supports the languages C, C++, and - Objective-C; the source file name suffix or a compiler option selects - the language. (Also see "GNAT" later in this article for Ada language - supports.) Objective-C support was donated by NeXT. The runtime support - needed to run Objective-C programs is now distributed with GCC (this - does not include any Objective-C classes aside from `object', but see - "GNUstep" in *Note Forthcoming GNUs::). As much as possible, G++ is - kept compatible with the evolving draft ANSI standard, but not with - `cfront' (AT&T's compiler), which has been diverging from ANSI. - - GCC is a fairly portable optimizing compiler which performs many - optimizations. They include: automatic register allocation, common - sub-expression elimination (CSE) (including a certain amount of CSE - between basic blocks - though not all the supported machine descriptions - provide for scheduling or delay slots), invariant code motion from - loops, induction variable optimizations, constant propagation, copy - propagation, delayed popping of function call arguments, tail recursion - elimination, integration of inline functions & frame pointer elimination, - instruction scheduling, loop unrolling, filling of delay slots, leaf - function optimization, optimized multiplication by constants, the - ability to assign attributes to instructions, & many local optimizations - automatically deduced from the machine description. - - GCC can open-code most arithmetic on 64-bit values (type `long long - int'). It supports extended floating point (type `long double') on the - 68k; other machines will follow. GCC supports full ANSI C, traditional - C, & GNU C extensions (including: nested functions support, nonlocal - gotos, & taking the address of a label). - - GCC can generate a.out, COFF, ELF, & OSF-Rose files when used with a - suitable assembler. It can produce debugging information in these - formats: BSD stabs, COFF, ECOFF, ECOFF with stabs, & DWARF. - - GCC generates code for many CPUs, including the a29k, Alpha, ARM, AT&T, - DSP1610, Clipper, Convex cN, Elxsi, Fujitsu Gmicro, i370, i860, i960, - MIL-STD-1750a, MIPS, ns32k, PDP-11, Pyramid, ROMP, RS/6000, SH, SPUR, - Tahoe, VAX, & we32k. - - Position-independent code is generated for the Clipper, Hitachi H8/300, - HP-PA (1.0 & 1.1), i386/i486/Pentium, m68k, m88k, SPARC, & SPARClite. - - Operating systems supported include: GNU/Hurd, GNU/Linux, ACIS, AIX, AOS, - BSD, Clix, Concentrix, Ctix, DG/UX, Dynix, FreeBSD, Genix, HP-UX, Irix, - ISC, Luna, LynxOS, Minix, NetBSD, NewsOS, NeXTStep, OS/2, OSF, OSF-Rose, - RISCOS, SCO, Solaris 2, SunOS 4, System/370, SysV, Ultrix, Unos, VMS, & - Windows/NT. - - Using the configuration scheme for GCC, building a cross-compiler is as - easy as building a native compiler. - - Version 1 of GCC, G++, & libg++ are no longer maintained. - - Texinfo source for the `Using and Porting GNU CC' manual is included - with GCC (*note Documentation::.). - - * GDB (BinCD, SrcCD) [FSFman, FSFrc] - - GDB, the GNU DeBugger, is a source-level debugger for C, C++, & Fortran. - It provides partial support for Modula-2 & Chill. - - GDB can debug both C & C++, & will work with executables made by many - different compilers; but, C++ debugging will have some limitations if - you do not use GCC. - - GDB has a command line user interface, and Emacs has GDB mode as an - interface. Two X interfaces (not distributed or maintained by the FSF) - are: `gdbtk' (FTP it from `ftp.cygnus.com' in directory `/pub/gdb'); and - `xxgdb' (FTP it from `ftp.x.org' in directory `/contrib/utilities'). - - Executable files and symbol tables are read via the BFD library, which - allows a single copy of GDB to debug programs with multiple object file - formats (e.g., a.out, COFF, ELF). Other features include a rich command - language, remote debugging over serial lines or TCP/IP, and watchpoints - (breakpoints triggered when the value of an expression changes). - - GDB uses a standard remote interface to a simulator library which (so - far) has simulators for the ARM, Hitachi H8/300, Hitachi H8/500, Hitachi - Super-H, PowerPC, WDC 65816, & Zilog Z8001/2. - - GDB can perform cross-debugging. To say that GDB "targets" a platform - means it can perform native or cross-debugging for it. To say that GDB - can "host" a given platform means that it can be built on it, but cannot - necessarily debug native programs. - - GDB can: - - * "target" & "host": Amiga 3000 (Amix, NetBSD), DEC Alpha (OSF/1), - DECstation 3100 & 5000 (Ultrix), HP 9000/300 (BSD, HP-UX), HP - 9000/700 (HP-UX 9, 10), i386/i486/Pentium (GNU/Hurd, GNU/Linux, - BSD, FreeBSD, LynxOS, NetBSD, SCO, Windows NT), IBM RS/6000 (AIX - 3.x, AIX 4.x, LynxOS), Motorola Delta m88k (System V, CX/UX), PC532 - (NetBSD), Motorola m68k MVME-167 (LynxOS), NCR 3000 (SVR4), PowerPC - (AIX 4.x, MacOS, Windows NT), SGI (Irix V3, V4, V5), SONY News - (NewsOS 3.x), SPARC (LynxOS, NetBSD, Solaris 2.x, & SunOS 4.1 ) - Sun-3 (SunOS 4.1), & Ultracomputer (a29k running Sym1). - - * "target", but not "host": AMD 29000 (COFF & a.out), ARM (RDP), - Hitachi H8/300, Hitachi SH (CMON, SH3, E7000), HP PA Pro (Winbond, - Oki), i386 (a.out, COFF, OS/9000), i960 (MON960, Nindy, VxWorks), - m68k/m68332 (a.out, COFF, CPU32BUG, EST, ROM68K, VxWorks), MIPS - (ELF, IDT ecoff, PMON, VxWorks), PowerPC (PPCBug), Matra Sparclet, - Fujitsu SPARClite (a.out, COFF), WDC 65816, & Z8000. - - * "host", but not "target": IBM RT/PC (AIX), HP/Apollo 68k (BSD), & - m68k Apple Macintosh (MacOS). Sources for the manual, - `Debugging with GDB', and a reference card are included (*note - Documentation::.). - - * `gdbm' (SrcCD) - - `gdbm' is the GNU replacement for the traditional `dbm' and `ndbm' - libraries. It implements a database using quick lookup by hashing. - `gdbm' does not ordinarily make sparse files (unlike its Unix and BSD - counterparts). - - * `gettext' *Also *note Help the GNU Translation Project::.* (SrcCD) - - The GNU `gettext' tool set has everything maintainers need to - internationalize a package's user messages. Once a package has been - internationalized, `gettext''s many tools help translators localize - messages to their native language and automate handling the translation - files. - - * Generic NQS (SrcCD) - - Generic NQS is a network queuing system for spreading batch jobs across a - network of machines. It is designed to be simple to install on a - heterogeneous network of machines, and has optimizations for running on - the high end, symmetric multiprocessing servers that are currently on the - market. It is available for many more UNIX variants than any other - comparable product, and inter-operates with other NQS systems, including - Cray's NQE. - - * `geomview' *See* `http://www.geom.umn.edu/software/geomview' (SrcCD) - - `geomview' is an interactive geometry viewing program, for UNIX systems - with Motif, using X, GL, or OpenGL graphics. It allows multiple - independently controllable objects and cameras. `geomview' provides - interactive control for motion, appearances (including lighting, - shading, and materials), picking on an object, edge or vertex level, and - snapshots in PPM or SGI image files, Postscript, and Renderman RIB - format. `geomview' can be controlled through direct mouse manipulation, - control panels, and keyboard shortcuts. External programs can also - drive desired aspects of the viewer (such as continually loading - changing geometry or controlling the motion of certain objects) while - allowing interactive control of everything else. - - * `gforth' (SrcCD) - - `gforth' is a fast, portable implementation of the ANS Forth language. - - * Ghostscript (SrcCD) - - Ghostscript is an interpreter for the Postscript and PDF graphics - languages. - - The current version of GNU Ghostscript, 3.33, includes nearly a full - Postscript Level 2 interpreter and a PDF 1.0 interpreter. Significant - new features include: support for anti-aliased characters; the ability - to scan a directory and register all the fonts in it; support for Type 0 - (Japanese / Chinese / Korean) fonts; and the ability to compile all the - external initialization files into the executable. This version can - also run as a 32-bit MS Windows application. - - Thanks to the generosity of URW++ (Hamburg, Germany), the low-quality - bitmap-derived fonts distributed with older versions have been replaced - with commercial-quality, hinted outline fonts. - - Ghostscript executes commands in the Postscript language by writing - directly to a printer, drawing on an X window, or writing to files for - printing later or manipulating with other graphics programs. - - Ghostscript includes a C-callable graphics library (for client programs - that do not want to deal with the Postscript language). It also supports - i386/i486/Pentiums running DOS with EGA, VGA or SuperVGA graphics (but - please do *not* ask the FSF staff any questions about this; we do not - use DOS). - - * Ghostview (SrcCD) - - Tim Theisen, `ghostview@cs.wisc.edu', created Ghostview, a previewer for - multi-page files with an X Window interface. Ghostview & Ghostscript - work together; Ghostview creates a viewing window & Ghostscript draws in - it. - - * GIT (SrcCD) - - The GNU Interactive Tools package includes: an extensible file system - browser, an ASCII/hex file viewer, a process viewer/killer, & other - related utilities & shell scripts. It can be used to increase the speed - & efficiency of many daily tasks, such as copying & moving files & - directories, invoking editors, compressing/uncompressing files, creating - & expanding archives, compiling programs, sending mail, etc. It looks - nice, has colors (if the standard ANSI color sequences are supported), & - is user-friendly. - - * `gmp' (SrcCD) - - GNU `mp' is a library for arithmetic on arbitrary precision integers, - rational numbers, and floating-point numbers. It has a rich set of - functions with a regular interface. - - A major new release, version 2, came out in Spring '96. Compared to - previous versions, it is much faster, contains lots of new functions, & - has support for arbitrary precision floating-point numbers. - - * Gnans (SrcCD) - - Gnans is a program (and language) for the numerical study of - deterministic and stochastic dynamical systems. The dynamical systems - may evolve in continuous or discrete time. Gnans has graphical & - command line interfaces. - - * GNAT: The GNU Ada Translator (SrcCD) - - GNAT, a front end for the entire Ada 95 language, including all special - needs annexes, is available via anonymous FTP from `cs.nyu.edu' and - various mirror sites in `/pub/gnat'. SGI, DEC, and Siemens Nixdorf have - chosen GNU Ada 95 as the Ada compiler for their systems. GNAT is - maintained by Ada Core Technologies. For more information, see - `http://www.gnat.com'. - - * GNATS (SrcCD) - - GNATS, GNats: A Tracking System, is a bug-tracking system. It is based - upon the paradigm of a central site or organization which receives - problem reports and negotiates their resolution by electronic mail. - Although it has been used primarily as a software bug-tracking system so - far, it is sufficiently generalized that it could be used for handling - system administration issues, project management, or any number of other - applications. - - * GNUMATH (`gnussl') (SrcCD) - - GNUMATH is a library (`gnussl') that simplifies scientific programming - in C & C++. Its focus is on problems that can be solved by a - straight-forward application of numerical linear algebra. It also - handles plotting. It is in beta release; it is expected to grow more - versatile & offer a wider scope in time. - - * `gnuplot' (SrcCD) - - `gnuplot' is an interactive program for plotting mathematical - expressions and data. It plots both curves (2 dimensions) & surfaces (3 - dimensions). It was neither written nor named for the GNU Project; the - name is a coincidence. Various GNU programs use `gnuplot'. - - * `gnuserv' (SrcCD) - - `gnuserv' is an enhanced version of Emacs' `emacsclient' program. It - lets the user direct a running Emacs to edit files or evaluate arbitrary - Emacs Lisp constructs from another process. - - * GnuGo (SrcCD) - - GnuGo plays the game of Go. It is not yet very sophisticated. - - * `gperf' (SrcCD) - - `gperf' generates perfect hash tables. The C version is in package - cperf. The C++ version is in libg++. Both produce hash functions in - either C or C++. - - * Graphics (SrcCD) - - GNU Graphics produces x-y plots from ASCII or binary data. It outputs - in Postscript, Tektronix 4010 compatible, and Unix device-independent - "plot" formats. It has a previewer for the X Window System. Features - include a `spline' interpolation program; examples of shell scripts - using `graph' and `plot'; a statistics toolkit; and output in TekniCAD - TDA and ln03 file formats. Email bugs or queries to Rich Murphey, - `Rich@lamprey.utmb.edu'. - - * grep (SrcCD) - - This package has GNU `grep', `egrep', and `fgrep', which find lines that - match entered patterns. They are much faster than the traditional Unix - versions. - - * Groff (SrcCD) - - Groff is a document formatting system based on a device-independent - version of `troff', & includes: `eqn', `nroff', `pic', `refer', `tbl', - `troff'; the `man', `ms', & `mm' macros; & drivers for Postscript, TeX - `dvi' format, the LaserJet 4 series of printers, and typewriter-like - devices. Groff's `mm' macro package is almost compatible with the DWB - `mm' macros with several extensions. Also included is a modified - version of the Berkeley `me' macros and an enhanced version of the X11 - `xditview' previewer. Written in C++, these programs can be compiled - with GNU C++ Version 2.7.2 or later. - - Groff users are encouraged to contribute enhancements. Most needed are - complete Texinfo documentation, a `grap' emulation (a `pic' preprocessor - for typesetting graphs), a page-makeup postprocessor similar to `pm' - (see `Computing Systems', Vol. 2, No. 2; ask `office@usenix.org' how to - get a copy), and an ASCII output class for `pic' to integrate `pic' with - Texinfo. Questions and bug reports from users who have read the - documentation provided with Groff can be sent to - `bug-groff@prep.ai.mit.edu'. - - * `gzip' (SrcCD) - - `gzip' can expand LZW-compressed files but uses another, unpatented - algorithm for compression which generally produces better results. It - also expands files compressed with System V's `pack' program. - - * `hello' (SrcCD) - - The GNU `hello' program produces a familiar, friendly greeting. It - allows non-programmers to use a classic computer science tool which would - otherwise be unavailable to them. Because it is protected by the GNU - General Public License, users are free to share and change it. `hello' - is also a good example of a program that meets the GNU coding standards. - Like any truly useful program, `hello' contains a built-in mail reader. - - * `hp2xx' (SrcCD) - - GNU `hp2xx' reads HP-GL files, decomposes all drawing commands into - elementary vectors, and converts them into a variety of vector and raster - output formats. It is also an HP-GL previewer. Currently supported - vector formats include encapsulated Postscript, Uniplex RGIP, Metafont, - various special TeX-related formats, and simplified HP-GL (line drawing - only) for imports. Raster formats supported include IMG, PBM, PCX, & - HP-PCL (including Deskjet & DJ5xxC support). Previewers work under X11 - (Unix), OS/2 (PM & full screen), & MS-DOS (SVGA, VGA, & HGC). - - * HylaFAX *Also see* `http://www.vix.com/hylafax/' (SrcCD) - - HylaFAX (once named FlexFAX) is a facsimile system for Unix systems. It - supports sending, receiving, & polled retrieval of facsimile, as well as - transparent shared data use of the modem. - - * Hyperbole (SrcCD) - - Hyperbole, written by Bob Weiner in Emacs Lisp, is an open, efficient, - programmable information management, autonumbered outliner, & hypertext - system, intended for everyday work on any platform Emacs runs on. - - * ID Utils (SrcCD) - - ID Utils is a package of simple, fast, high-capacity, - language-independent tools that index program identifiers, literal - numbers, or words of human-readable text. Queries can be issued from - the command-line, or from within Emacs, serving as an augmented tags - facility. - - * `indent' (SrcCD) - - GNU `indent' formats C source code into the GNU, BSD, K&R, or your own - special indentation style. GNU `indent' is more robust & provides more - functionality than other such programs, including handling C++ comments. - It runs on Unix, DOS, VMS and ATARI systems. - - The next version will also format C++ source code. A Java version may - be considered in the future. - - * Inetutils (SrcCD) - - Inetutils has common networking utilities & servers. - - This release is mainly support the GNU Hurd, which is source compatible - with BSD in many ways, & will probably only work on systems that are - similarly compatible. - - * Ispell (SrcCD) - - Ispell is an interactive spell checker that suggests "near misses" to - replace unrecognized words. System & user-maintained dictionaries for - multiple languages can be used. Standalone & Emacs interfaces are - available. - - * JACAL *Not available from the FSF except by FTP* - - JACAL is a symbolic mathematics system for the manipulation & - simplification of algebraic equations & expressions. It is written in - Scheme using the SLIB portable Scheme Library. JACAL comes with SCM, an - IEEE P1178 & R4RS compliant Scheme implementation written in C. SCM runs - on Amiga, Atari-ST, MacOS, MS-DOS, OS/2, NOS/VE, Unicos, VMS, Unix, & - similar systems. - - The FSF is not distributing JACAL on any physical media. You can FTP it - or get it from the Web site below. Documentation is at - `http://www-swiss.ai.mit.edu/~jaffer/JACAL.html'. - - * Karma (SrcCD) - - Karma is a signal and image processing library and visualization toolkit - that provides interprocess communications, authentication, graphics - display, and user interface to and manipulation of the Karma network - data structure. Several foreign data formats are also supported. Karma - comes packaged with a number of generic visualization tools and some - astronomy-specific tools. - - * `less' (SrcCD) - - `less' is a display paginator similar to `more' and `pg', but with - various features (such as the ability to scroll backwards) that most - pagers lack. - - * Lynx *Also see* `http://www.cc.ukans.edu/about_lynx' (SrcCD) - - Lynx is a text-only World Wide Web browser for those running - character-only ("cursor-addressable") terminals or terminal emulators. - - * `m4' (SrcCD) - - GNU `m4' is an implementation of the traditional Unix macro processor. - It is mostly SVR4 compatible, although it has some extensions (e.g., - handling more than 9 positional parameters to macros). `m4' also has - built-in functions for including files, running shell commands, doing - arithmetic, etc. - - * `make' (BinCD, SrcCD) [FSFman] - - GNU `make' supports POSIX 1003.2 and has all but a few obscure features - of the BSD and System V versions of `make', and runs on MS-DOS, - AmigaDOS, VMS, & Windows NT or 95, as well as all Unix-compatible - systems. GNU extensions include long options, parallel compilation, - flexible implicit pattern rules, conditional execution, & powerful text - manipulation functions. Source for the `Make Manual' comes with the - program (*note Documentation::.). - - * MandelSpawn (SrcCD) - - A parallel Mandelbrot generation program for the X Window System. - - * Maxima (SrcCD) - - Maxima is a Common Lisp implementation of MIT's Macsyma system for - computer based algebra. - - * Meta-HTML (SrcCD) - - <Meta-HTML> is a programming language specifically designed for working - within the World Wide Web environment. Although it is a genuine - programming language, suitable for large-scale symbolic manipulation, it - provides the most commonly wanted Web functionality as built-in - primitives, so you don't have to write them. - - * Midnight Commander (`mc') (SrcCD) - - The Midnight Commander is a user friendly & colorful Unix file manager & - shell, useful to novice & guru alike. It has a built-in virtual file - system that manipulates files inside tar files or files on remote - machines using the FTP protocol. This mechanism is extendable with - external Unix programs. - - * Miscellaneous Files Distribution (SrcCD) - - The GNU Miscellaneous Files are non-crucial files that are common on - various systems, including word lists, airport codes, ZIP codes etc. - - * `mkisofs' (SrcCD) - - `mkisofs' is a pre-mastering program to generate an ISO 9660 file system. - It takes a snapshot of a directory tree, and makes a binary image which - corresponds to an ISO 9660 file system when written to a block device. - - It can also generate the System Use Sharing Protocol records of the Rock - Ridge Interchange Protocol (used to further describe the files in an ISO - 9660 file system to a Unix host; it provides information such as longer - filenames, uid/gid, permissions, and device nodes). - - The `mkisofs' program is often used with `cdwrite'. The `cdwrite' - program works by taking the image that `mkisofs' generates and driving a - cdwriter drive to actually burn the disk. `cdwrite' works under - GNU/Linux, and supports popular cdwriter drives. Older versions of - `cdwrite' were included with older versions of `mkisofs'; - `sunsite.unc.edu' has the latest version: - `/pub/Linux/utils/disk-management/cdwrite-2.0.tar.gz'. - - * `mtools' (SrcCD) - - `mtools' is a set of public domain programs to allow Unix systems to - read, write, and manipulate files on an MS-DOS file system (usually a - diskette). - - * MULE (SrcCD) - - MULE is a MULtilingual Enhancement to GNU Emacs. MULE text buffers can - contain a mix of characters from many languages including: Japanese, - Chinese, Korean, Vietnamese, Thai, modern European languages (including - Greek & Russian), Arabic, & Hebrew. MULE also provides input methods - for all of them. MULE is being merged into GNU Emacs. *Note GNU & - Other Free Software in Japan::, for more information about MULE. - - * `ncurses' (SrcCD) - - `ncurses' implements the Unix `curses' API for developing screen-based - programs that are terminal independent. It is not merely an emulation - of old (BSD) curses/termcap, but is fully compatible with SVR4 - curses/terminfo. It includes color, multiple-highlight, & xterm - mouse-event support. - - * NetHack (SrcCD) - - NetHack is a Rogue-like adventure game supporting character & X displays. - - * NIH Class Library (SrcCD) - - The NIH Class Library is a set of C++ classes (similar to - Smalltalk-80's) written in C++ by Keith Gorlen of the National Institutes - of Health (NIH). - - * `nvi' (SrcCD) - - `nvi' is an implementation of the `ex'/`vi' Unix editor. It has all the - functionality of the original `ex'/`vi', except `open' mode & the `lisp' - edit option. Enhancements include multiple buffers, command-line - editing & path completion, integrated Perl5 & Tcl scripting languages, - Cscope support & tag stacks, 8-bit data support, infinite file/line - lengths, infinite undo, language catalogs, incremental search, extended - regular expressions, and security fixes. It uses Autoconf for - configuration and runs on any Unix-like system. - - * Oaklisp (SrcCD) - - Oaklisp is a fast, portable, object-oriented Scheme with first class - types. - - * Objective-C Library (SrcCD) - - Our Objective-C Class Library (`gstep-base.tar.gz', `libgnustep-base') - has general-purpose, non-graphical Objective-C objects written by Andrew - McCallum & others. It includes collection classes for maintaining - groups of objects, I/O streams, coders for formatting objects & C types - to streams, ports for network packet transmission, distributed objects - (remote object messaging), string classes, invocations, notifications, - event loops, timers, exceptions, pseudo-random number generators, & - more. It has the base classes for the GNUstep project; all but a few of - them have already been written. Send queries & bugs to - `mccallum@gnu.ai.mit.edu'. See "GNUstep" in *Note Forthcoming GNUs::. - - * OBST (SrcCD) - - OBST is a persistent object management system with bindings to C++. - OBST supports incremental loading of methods. Its graphical tools - require the X Window System. It features a hands-on tutorial including - sample programs. It compiles with G++, and should install easily on - most Unix platforms. - - * Octave *Also see* `http://www.che.wisc.edu/octave' (SrcCD) - - Octave does arithmetic for real and complex scalars and matrices, solves - sets of nonlinear algebraic equations, integrates systems of ordinary - differential & differential-algebraic equations, and integrates - functions over finite & infinite intervals. Two- & three-dimensional - plotting is available using `gnuplot'. - - Version 2.0 of Octave was released in December '96. It includes support - for dynamically linked functions, user-defined data types, many new - functions, & a completely revised manual. Octave works on most Unix - systems & OS/2. A port to Windows NT/95 is underway. - - * Oleo (SrcCD) - - Oleo is a spreadsheet program (better for you than the more expensive - spreadsheets). It supports the X Window System and character-based - terminals, and can output Embedded Postscript renditions of spreadsheets. - Keybindings should be familiar to Emacs users and are configurable. - Oleo supports multiple variable-width fonts when used under the X Window - System or outputting to Postscript devices. - - * `p2c' (SrcCD) - - `p2c' is Dave Gillespie's Pascal-to-C translator. It inputs many - dialects (HP, ISO, Turbo, VAX, etc.) & generates readable, - maintainable, portable C. - - * `patch' (SrcCD) - - `patch' is our version of Larry Wall's program to take `diff''s output - and apply those differences to an original file to generate the modified - version. - - * PCL (SrcCD) - - PCL is a free implementation of a large subset of CLOS, the Common Lisp - Object System. It runs under both GCL and CLISP, mentioned above. - - * `perl' (SrcCD) - - Larry Wall's `perl' combines the features & capabilities of C, `sed', - `awk', & `sh', and provides interfaces to the Unix system calls & many C - library routines. - - * `pine' *Also *note Bad News and Good News about Pine::.* (SrcCD) - - `pine' is a friendly menu-driven electronic mail manager and user - interface. - - * `ptx' *Also *note Forthcoming GNUs::.* (SrcCD) - - GNU `ptx' is our version of the traditional permuted index generator. - It handles multiple input files at once, has TeX compatible output, & - outputs readable "KWIC" (KeyWords In Context) indexes without using - `nroff'. - - It does not yet handle input files that do not fit in memory all at once. - - * `rc' (SrcCD) - - `rc' is a shell that features a C-like syntax (much more so than `csh') - and far cleaner quoting rules than the C or Bourne shells. It's - intended to be used interactively, but is also great for writing - scripts. It inspired the shell `es'. - - * RCS (SrcCD) - - RCS, the Revision Control System, is used for version control & - management of software projects. Used with GNU `diff', RCS can handle - binary files (8-bit data, executables, object files, etc). RCS now - conforms to GNU configuration standards & to POSIX 1003.1b-1993. Also - see the CVS item above. - - * `recode' *Also *note Forthcoming GNUs::.* (SrcCD) - - GNU `recode' converts files between character sets and usages. When - exact transliterations are not possible, it may delete the offending - characters or fall back on approximations. This program recognizes or - outputs nearly 150 different character sets and is able to transliterate - files between almost any pair. Most RFC 1345 character sets are - supported. - - * `regex' (SrcCD) - - The GNU regular expression library supports POSIX.2, except for - internationalization features. It is included in many GNU programs which - do regular expression matching & is available separately. An alternate - regular expression package, `rx', is faster than `regex' in many cases; - we were planning to replace `regex' with `rx', but it is not certain - this will happen. - - * Roxen (SrcCD) - - Roxen is a modularized, object-oriented, non-forking World Wide Web - server with high performance and throughput. It was formerly named - Spinner, but was renamed for trademark reasons. - - * `rx' (SrcCD) - - Tom Lord has written `rx', a new regular expression library which is - faster than the older GNU `regex' library. It is being distributed with - `sed'. `rx' is also an installation option for `fileutils', `id-utils', - and `textutils', and maybe for future versions of `cpio', `m4' and `ptx'. - - * SAOimage (SrcCD) - - SAOimage is an X-based astronomical image viewer. It reads array data - images, which may be in specific formats, and displays them with a - pseudocolor colormap. There is full interactive control of the - colormap, panning and zooming, graphical annotation, and cursor tracking - in pixel and sky coordinates, among other features. - - * Scheme (SrcCD) - - Scheme is a simplified, lexically-scoped dialect of Lisp. It was - designed at MIT and other universities to teach students the art of - programming and to research new parallel programming constructs and - compilation techniques. - - We now distribute MIT Scheme 7.3, which conforms to the "Revised^4 - Report On the Algorithmic Language Scheme" (MIT AI Lab Memo 848b), for - which TeX source is included. It is written partly in C, but is - presently hard to bootstrap. Binaries to bootstrap it exist for: HP9000 - series 300, 400, 700, & 800 (running HP-UX 9.0), NeXT (NeXT OS 2 or 3.2), - DEC Alpha (OSF/1), IBM RS/6000 (AIX), Sun-3 or Sun-4 (SunOS 4.1), - DECstation 3100/5100 (Ultrix 4.0), Sony NeWS-3250 (NEWS OS 5.01), & - Intel i386 (MS-DOS, Windows 3.1 or NT). If your system isn't on this - list & you don't enjoy the bootstrap challenge, see "JACAL" earlier in - this article. - - * `screen' (SrcCD) - - `screen' is a terminal multiplexer that runs several separate "screens" - (ttys) on a single character-based terminal. Each virtual terminal - emulates a DEC VT100 plus several ISO 2022 and ISO 6429 (ECMA 48, ANSI - X3.64) functions, including color. Arbitrary keyboard input translation - is also supported. `screen' sessions can be detached and resumed later - on a different terminal type. Output in detached sessions is saved for - later viewing. - - * `sed' (SrcCD) - - `sed' is a stream-oriented version of `ed'. It comes with the `rx' - library. - - * Sharutils (SrcCD) - - `shar' makes so-called shell archives out of many files, preparing them - for transmission by electronic mail services; `unshar' helps unpack - these shell archives after reception. `uuencode' and `uudecode' are - POSIX compliant implementations of a pair of programs which transform - files into a format that can be safely transmitted across a 7-bit ASCII - link. - - * Shellutils (SrcCD) - - The Shellutils are: `basename', `chroot', `date', `dirname', `echo', - `env', `expr', `factor', `false', `groups', `hostname', `id', `logname', - `nice', `nohup', `pathchk', `printenv', `printf', `pwd', `seq', `sleep', - `stty', `su', `tee', `test', `true', `tty', `uname', `uptime', `users', - `who', `whoami', & `yes'. - - * Shogi (SrcCD) - - Shogi is a Japanese game similar to Chess; a major difference is that - captured pieces can be returned into play. - - GNU Shogi is a variant of GNU Chess; it implements the same features & - similar heuristics. As a new feature, sequences of partial board - patterns can be introduced to help the program play toward specific - opening patterns. It has both character and X display interfaces. - - It is primarily supported by Matthias Mutz on behalf of the FSF. - - * SIPP (SrcCD) - - SIPP is a library for photorealisticly rendering 3D scenes. Scenes can - be illuminated by an arbitrary number of light sources; they are built up - of object hierarchies, with arbitrarily many subobjects and subsurfaces. - Surfaces can be rendered with either Phong, Gouraud, or flat shading. - The library supports programmable shaders and texture mapping. - - * Smail (SrcCD) - - Smail is a mail transport system, designed as a compatible drop-in - replacement for `sendmail'. It uses a much simpler configuration format - than `sendmail' and is designed to be setup with minimal effort. - - * Smalltalk *Also *note Forthcoming GNUs::.* (SrcCD) - - GNU Smalltalk is an interpreted object-oriented programming language - system written in highly portable C. It has been ported to DOS, many - Unix, & other OSes. Features include a binary image save capability, - the ability to call user-written C code with parameters, an Emacs - editing mode, a version of the X protocol invocable from Smalltalk, - optional byte-code compilation and/or execution tracing, & automatically - loaded per-user initialization files. It implements all of the classes - & protocol in the book "Smalltalk-80: The Language", except for the - graphic user interface (GUI) related classes. - - * SNePS (SrcCD) - - SNePS is the Semantic Network Processing System. It is an - implementation of a fully intensional theory of propositional knowledge - representation and reasoning. SNePS runs under CLISP or GCL. - - * Superopt (SrcCD) - - Superopt is a function sequence generator that uses an exhaustive - generate-and-test approach to find the shortest instruction sequence for - a given function. You provide a function as input, a CPU to generate - code for, and how many instructions you want. Its use in GCC is - described in the `ACM SIGPLAN PLDI'92 Proceedings'. It supports: SPARC, - m68k, m68020, m88k, IBM POWER and PowerPC, AMD 29k, Intel x86 & 960, - Pyramid, DEC Alpha, Hitachi SH, & HP-PA. - - * `stow' (SrcCD) - - `stow' manages the installation of software packages, keeping them - separate while making them appear to be installed in the same place. - - * `tar' (SrcCD) - - GNU `tar' includes multi-volume support, the ability to archive sparse - files, compression/decompression, remote archives, and special features - that allow `tar' to be used for incremental and full backups. GNU `tar' - uses an early draft of the POSIX 1003.1 `ustar' format which is - different from the final version. This will be corrected in the future. - - * Termcap Library (SrcCD) [FSFman] - - The GNU Termcap library is a drop-in replacement for `libtermcap.a' on - any system. It does not place an arbitrary limit on the size of Termcap - entries, unlike most other Termcap libraries. Included is source for the - `Termcap Manual' in Texinfo format (*note Documentation::.). - - * Termutils (SrcCD) - - The Termutils package contains programs for controlling terminals. - `tput' is a portable way for shell scripts to use special terminal - capabilities. `tabs' is a program to set hardware terminal tab settings. - - * TeX (SrcCD) - - TeX is a document formatting system that handles complicated - typesetting, including mathematics. It is GNU's standard text formatter. - - The University of Washington maintains & supports a tape distribution of - TeX for Unix systems. The core material is Karl Berry's `web2c' TeX - package. Sources are available via anonymous FTP; retrieval - instructions are in `/pub/tex/unixtex.ftp' on `ftp.cs.umb.edu'. If you - receive any installation support from the University of Washington, - consider sending them a donation. - - To order a full distribution written in `tar' on either a 1/4inch - 4-track QIC-24 cartridge or a 4mm DAT cartridge, send $210.00 to: - - Pierre A. MacKay - Department of Classics - DH-10, Denny Hall 218 - University of Washington - Seattle, WA 98195 - USA - - Electronic-Mail: `mackay@cs.washington.edu' - Telephone: +1-206-543-2268 - - Please make checks payable to: `University of Washington'. Do not - specify any other payee. That causes accounting problems. Checks must - be in U.S. dollars, drawn on a U.S. bank. Only prepaid orders can be - handled. Overseas sites: please add to the base cost $20.00 to ship via - air parcel post or $30.00 to ship via courier. Please check with the - above for current prices & formats. - - * Texinfo (SrcCD) [FSFman] - - Texinfo is a set of utilities (`makeinfo', `info', `install-info', - `texi2dvi', `texindex', & `texinfmt.el') which generate printed manuals, - plain ASCII text, & online hypertext documentation (called "Info"), & - can read online Info documents; Info files can also be read in Emacs. - Version 3 has both Emacs Lisp & standalone programs written in C or as - shell scripts. Texinfo mode for Emacs enables easy editing & updating - of Texinfo files. Source for the `Texinfo Manual' is included (*note - Documentation::.). - - * Textutils (SrcCD) - - The Textutils programs manipulate textual data. They include: `cat', - `cksum', `comm', `csplit', `cut', `expand', `fmt', `fold', `head', - `join', `md5sum', `nl', `od', `paste', `pr', `sort', `split', `sum', - `tac', `tail', `tr', `unexpand', `uniq', and `wc'. - - * TIFF library (SrcCD) - - The TIFF library, `libtiff', is a library for manipulating Tagged Image - File Format files, a commonly used bitmap graphics format. - - * Tile Forth (SrcCD) - - Tile Forth is a 32-bit implementation of the Forth-83 standard written - in C, allowing it to be easily ported to new systems & extended with any - C-function (graphics, windowing, etc). - - Many documented Forth libraries are available, e.g. top-down parsing, - multi-threads, & object-oriented programming. - - * `time' (SrcCD) - - `time' reports (usually from a shell) the user, system, & real time used - by a process. On some systems it also reports memory usage, page - faults, etc. - - * `ucblogo' (SrcCD) - - `ucblogo' implements the classic teaching language, Logo. - - * UUCP (SrcCD) - - GNU's UUCP system (written by Ian Lance Taylor) supports the `f', `g' - (all window & packet sizes), `v', `G', `t', `e', Zmodem, & two new - bidirectional (`i' & `j') protocols. With a BSD sockets library, it can - make TCP connections. With TLI libraries, it can make TLI connections. - Source is included for a manual (not yet published by the FSF). - - * viewfax (SrcCD) - - Viewfax is a tool for displaying fax files on an X display. It can - display raw, digifax or tiff/f files, such as those received by HylaFAX. - - * W3 (SrcCD) - - W3 (written by William Perry in Emacs Lisp) is an extensible, advanced - World Wide Web browser that runs as part of Emacs. It understands many - protocols & file formats: FTP, gopher, HTML, SMTP, Telnet, WAIS, etc. - - * `wdiff' (SrcCD) - - `wdiff' is a front-end to GNU `diff'. It compares two files, finding - the words deleted or added to the first to make the second. It has many - output formats and works well with terminals and pagers. `wdiff' is - very useful when two texts differ only by a few words and paragraphs - have been refilled. - - * `wget' (SrcCD) - - `wget' non-interactively retrieves files from the WWW using HTTP & FTP. - It is suitable for use in shell scripts. - - * `windows32api' (SrcCD) - - `windows32' is a set of header files & import libraries that can be used - by GNU tools for compiling & linking programs to be run on Windows NT/95. - - * WN (SrcCD) - - WN is a World Wide Web server designed to be secure and flexible. It - offers many different capabilities in pre-parsing files before passing - them to the client, and has a very different design from Apache and the - NCSA server. - - * X11 (SrcCD) - - We distribute Version 11, Release 6.3 of the X Window System with the - latest patches & bug fixes. X11 includes all of the core software, - documentation, contributed clients, libraries, & toolkits, games, etc. - - While supplies last, we will distribute X11R5 on the November 1993 - Source Code CD-ROM. - - * `xboard' (SrcCD) - - `xboard' is a graphical chessboard for X Windows. It can serve as a - user interface to the Crafty or GNU chess programs, the Internet Chess - Servers, e-mail correspondence chess, or games saved in Portable Game - Notation. - - * `xgrabsc' (SrcCD) - - `xgrabsc' is a screen capture program similar to `xwd' but with a - graphical user interface, more ways of selecting the part of the screen - to capture, & different types of output: Postscript, color Postscript, - xwd, bitmap, pixmap, & puzzle. - - * `xinfo' (SrcCD) - - `xinfo' is an X-windows program for reading Info files. It uses a - special widget, which is available for use in other programs. - - * `xshogi' (SrcCD) - - `xshogi' is a graphical Shogi (Japanese Chess) board for the X Window - System. It can serve as a user interface to GNU Shogi, as a referee for - games between two humans, or as a client for the Internet Shogi Server. - - * `Ygl' (SrcCD) - - `Ygl' emulates a subset of SGI's GL (Graphics Language) library under - X11 on most platforms with an ANSI C compiler (including GCC). It has - most two-dimensional graphics routines, the queue device & query - routines, double buffering, RGB mode with dithering, FORTRAN bindings, - etc. - - - -Program/Package Cross Reference -******************************* - -Here is a list of the package each GNU program or library is in. You can FTP -the current list in the file `/pub/gnu/ProgramIndex' from a GNU FTP host -(listed in *Note How to Get GNU Software::). - - * 4dview geomview - - * a2p perl - * a2x xopt - * ac bsd44 - * accton bsd44 - * ackpfd phttpd - * acl bsd44 - * acm acm - * acms acm - * addbbox geomview - * addftinfo Groff - * adventure bsd44 - * afm2tfm TeX - * aid ID Utils - * amd bsd44 - * ansitape bsd44 - * AnswerGarden xopt - * apply bsd44 - * appres xreq - * apropos bsd44 - * ar Binutils - * arithmetic bsd44 - * arp bsd44 - * atc bsd44 - * authwn WN - * autoconf Autoconf - * autoheader Autoconf - * automake Automake - * autoreconf Autoconf - * autoscan Autoconf - * autoupdate Autoconf - * auto_box xopt - * auto_box xreq - - * b2m Emacs - * backgammon bsd44 - * bad144 bsd44 - * badsect bsd44 - * banner bsd44 - * basename Shellutils - * bash BASH - * battlestar bsd44 - * bc bc - * bcd bsd44 - * bdes bsd44 - * bdftops Ghostscript - * beach_ball xopt - * beach_ball xreq - * beach_ball2 xopt - * bibtex TeX - * biff bsd44 - * bison Bison - * bitmap xreq - * boggle bsd44 - * bpltobzr Fontutils - * bugfiler bsd44 - * buildhash Ispell - * bzrto Fontutils - - * c++ GCC - * c++filt Binutils - * c2ph perl - * ca100 xopt - * caesar bsd44 - * cal bsd44 - * calendar bsd44 - * canfield bsd44 - * cat Textutils - * cbars wdiff - * cc GCC - * cc1 GCC - * cc1obj GCC - * cc1plus GCC - * cccp GCC - * cdwrite mkisofs - * cfengine cfengine - * cgi Spinner - * charspace Fontutils - * checknr bsd44 - * chess bsd44 - * chflags bsd44 - * chgrp Fileutils - * ching bsd44 - * chmod Fileutils - * chown Fileutils - * chpass bsd44 - * chroot bsd44 - * ci RCS - * cksum Textutils - * cktyps g77 - * clisp CLISP - * clri bsd44 - * cmail xboard - * cmmf TeX - * cmodext xopt - * cmp Diffutils - * co RCS - * col bsd44 - * colcrt bsd44 - * colrm bsd44 - * column bsd44 - * comm Textutils - * compress bsd44 - * comsat bsd44 - * connectd bsd44 - * cp Fileutils - * cpicker xopt - * cpio cpio - * cpp GCC - * cppstdin perl - * cribbage bsd44 - * crock xopt - * csh bsd44 - * csplit Textutils - * ctags Emacs - * ctwm xopt - * cu UUCP - * cut Textutils - * cvs CVS - * cvscheck CVS - * cvtmail Emacs - * cxterm xopt - - * d Fileutils - * date Shellutils - * dc bc - * dd Fileutils - * ddd DDD - * defid ID Utils - * delatex TeX - * demangle Binutils - * descend CVS - * detex TeX - * df Fileutils - * dhtppd phttpd - * diff Diffutils - * diff3 Diffutils - * diffpp enscript - * digest-doc Emacs - * dipress bsd44 - * dir Fileutils - * dircolors Fileutils - * dirname Shellutils - * dish xopt - * disklabel bsd44 - * diskpart bsd44 - * dld dld - * dm bsd44 - * dmesg bsd44 - * doschk doschk - * dox xopt - * du Fileutils - * dump bsd44 - * dump mkisofs - * dumpfs bsd44 - * dvi2tty TeX - * dvicopy TeX - * dvips TeX - * dvitype TeX - - * ecc ecc - * echo Shellutils - * ed ed - * edit-pr GNATS - * editres xreq - * edquota bsd44 - * eeprom bsd44 - * egrep grep - * eid ID Utils - * emacs Emacs - * emacsclient Emacs - * emacsserver Emacs - * emacstool Emacs - * emu xopt - * enscript enscript - * env Shellutils - * eqn Groff - * error bsd44 - * es es - * esdebug es - * etags Emacs - * ex nvi - * example geomview - * exicyclog Exim - * exigrep Exim - * exim Exim - * eximon Exim - * eximon Exim - * eximstats Exim - * exinext Exim - * exiwhat Exim - * expand Textutils - * expect DejaGnu - * expr Shellutils - * exterm xopt - - * f2c f2c - * factor bsd44 - * fakemail Emacs - * false Shellutils - * fastboot bsd44 - * fax2ps HylaFAX - * faxalter HylaFAX - * faxanswer HylaFAX - * faxcover HylaFAX - * faxd HylaFAX - * faxd.recv HylaFAX - * faxmail HylaFAX - * faxquit HylaFAX - * faxrcvd HylaFAX - * faxrm HylaFAX - * faxstat HylaFAX - * fc f2c - * fdraw xopt - * ffe g77 - * fgrep grep - * fid ID Utils - * file bsd44 - * find Findutils - * find2perl perl - * finger Finger - * fingerd Finger - * fish bsd44 - * fixfonts Texinfo - * fixinc.svr4 GCC - * fixincludes GCC - * flex flex - * flex++ flex - * flythrough geomview - * fmt bsd44 - * fnid ID Utils - * fold Textutils - * font2c Ghostscript - * fontconvert Fontutils - * forth Tile Forth - * forthicon Tile Forth - * forthtool Tile Forth - * fortune bsd44 - * fpr bsd44 - * freq Ispell - * freqtbl Ispell - * from bsd44 - * fsck bsd44 - * fsplit bsd44 - * fstat bsd44 - * ftp bsd44 - * ftp Inetutils - * ftpd bsd44 - * ftpd Inetutils - - * g++ GCC - * gas Binutils - * gawk GAWK - * gcal gcal - * gcc GCC - * gcore bsd44 - * gdb GDB - * genclass libg++ - * geomstuff geomview - * gettext gettext - * getty bsd44 - * gftodvi TeX - * gftopk TeX - * gftype TeX - * ghostview Ghostview - * gid ID Utils - * ginsu geomview - * git GIT - * gitaction GIT - * gitcmp GIT - * gitkeys GIT - * gitmatch GIT - * gitmount GIT - * gitps GIT - * gitredir GIT - * gitrgrep GIT - * gitview GIT - * gitwipe GIT - * gn GN - * gnans Gnans - * gnanslator Gnans - * gnats GNATS - * gnuchess Chess - * gnuchessc Chess - * gnuchessn Chess - * gnuchessr Chess - * gnuchessx Chess - * gnuclient gnuserv - * gnudoit gnuserv - * gnupdisp Shogi - * gnuplot gnuplot - * gnuplot_x11 gnuplot - * gnuserv gnuserv - * gnushogi Shogi - * gnushogir Shogi - * gnushogix Shogi - * go GnuGo - * gpc xopt - * gpc xreq - * gperf cperf - * gperf libg++ - * gprof Binutils - * graffiti geomview - * graph Graphics - * grep grep - * grodvi Groff - * groff Groff - * grops Groff - * grotty Groff - * groups Shellutils - * gs Ghostscript - * gsbj Ghostscript - * gsdj Ghostscript - * gslj Ghostscript - * gslp Ghostscript - * gsnd Ghostscript - * gsrenderfont Fontutils - * gunzip gzip - * gvclock geomview - * gwm xopt - * gzexe gzip - * gzip gzip - - * h2ph perl - * h2pl perl - * hack bsd44 - * hangman bsd44 - * head Textutils - * hello hello - * hexdump bsd44 - * hexl Emacs - * hinge geomview - * hostname Shellutils - * hp2xx hp2xx - * hterm xopt - * htmlencode phttpd - * httpd apache - * httpdecode phttpd - - * i18nOlwmV2 xopt - * i2mif xopt - * ico xopt - * ico xreq - * id Shellutils - * ident RCS - * ifconfig bsd44 - * ifnames Autoconf - * ImageMagick xopt - * imageto Fontutils - * iman xopt - * imgrotate Fontutils - * indent indent - * indxbib Groff - * inetd bsd44 - * inetd Inetutils - * info Texinfo - * inimf TeX - * init bsd44 - * initex TeX - * inn bsd44 - * install Fileutils - * iostat bsd44 - * isodiag mkisofs - * isodump mkisofs - * ispell Ispell - * ixterm xopt - * ixx xopt - - * join Textutils - * jot bsd44 - * jove bsd44 - - * kdestroy bsd44 - * kdump bsd44 - * kermit bsd44 - * kgames xopt - * kgmon bsd44 - * kill bsd44 - * kinit bsd44 - * kinput2 xopt - * klist bsd44 - * kpasswdd bsd44 - * ksrvtgt bsd44 - * kterm xopt - * ktrace bsd44 - - * lam bsd44 - * larn bsd44 - * lasergnu gnuplot - * last bsd44 - * lastcomm bsd44 - * latex TeX - * lclock xopt - * ld Binutils - * leave bsd44 - * less less - * lesskey less - * libavcall.a ffcall - * libbfd.a Binutils - * libbfd.a GDB - * libbzr.a Fontutils - * libc.a C Library - * libcompat.a bsd44 - * libcurses.a bsd44 - * libcurses.a ncurses - * libdcurses.a ncurses - * libedit.a bsd44 - * libF77.a f2c - * libF77.a g77 - * libg++.a libg++ - * libgdbm.a gdbm - * libgf.a Fontutils - * libgmp.a gmp - * libgnanslib.a Gnans - * libgnussl.a gnussl - * libI77.a f2c - * libI77.a g77 - * libkvm.a bsd44 - * libm.a bsd44 - * libncurses.a ncurses - * libnihcl.a NIHCL - * libnihclmi.a NIHCL - * libnihclvec.a NIHCL - * libnls.a xreq - * libobjects.a libobjects - * liboctave.a Octave - * liboldX.a xreq - * libpbm.a Fontutils - * libPEXt.a xopt - * libpk.a Fontutils - * libresolv.a bsd44 - * librpc.a bsd44 - * libsipp.a SIPP - * libtcl.a DejaGnu - * libtelnet.a bsd44 - * libterm.a bsd44 - * libtermcap.a Termcap - * libtfm.a Fontutils - * libtiff.a tiff - * libutil.a bsd44 - * libvacall.a ffcall - * libWc.a xopt - * libwidgets.a Fontutils - * libX.a xreq - * libXau.a xreq - * libXaw.a xreq - * libXcp.a xopt - * libXcu.a xopt - * libXdmcp.a xreq - * libXmp.a xopt - * libXmu.a xreq - * libXO.a xopt - * libXop.a xopt - * libXp.a xopt - * libXpex.a xopt - * libXt.a xopt - * libXt.a xreq - * libXwchar.a xopt - * liby.a bsd44 - * libYgl.a Ygl - * lid ID Utils - * limn Fontutils - * listres xopt - * listres xreq - * lkbib Groff - * ln Fileutils - * locate Findutils - * lock bsd44 - * logcvt-ip2n phttpd - * logger bsd44 - * login bsd44 - * logname Shellutils - * logo ucblogo - * lookbib Groff - * lorder bsd44 - * lpr bsd44 - * ls Fileutils - * lynx lynx - - * m4 m4 - * mail bsd44 - * mail-files Sharutils - * mailq smail - * mailshar Sharutils - * make make - * make-docfile Emacs - * make-path Emacs - * makeindex TeX - * makeinfo Texinfo - * MakeTeXPK TeX - * man bsd44 - * man-macros Groff - * maniview geomview - * mattrib mtools - * maze xopt - * maze xreq - * mazewar xopt - * mc mc - * mcd mtools - * mcopy mtools - * mcserv mc - * md5sum Textutils - * mdel mtools - * mdir mtools - * me-macros Groff - * medit2gv geomview - * merge RCS - * mesg bsd44 - * mf TeX - * mformat mtools - * mft TeX - * mgdiff xopt - * mh bsd44 - * mille bsd44 - * mkafmmap enscript - * mkcache GN - * mkdep bsd44 - * mkdir Fileutils - * mkfifo Fileutils - * mkid ID Utils - * mkisofs mkisofs - * mklocale bsd44 - * mkmanifest mtools - * mkmf bsd44 - * mkmodules CVS - * mknod Fileutils - * mkstr bsd44 - * mlabel mtools - * mm-macros Groff - * mmd mtools - * monop bsd44 - * more bsd44 - * morse bsd44 - * mount bsd44 - * mountd bsd44 - * movemail Emacs - * mprof bsd44 - * mrd mtools - * mread mtools - * mren mtools - * ms-macros Groff - * msgcmp gettext - * msgfmt gettext - * msgmerge gettext - * msgs bsd44 - * msgunfmt gettext - * mst Smalltalk - * mt cpio - * mterm xopt - * mtree bsd44 - * mtype mtools - * mule MULE - * muncher xopt - * mv Fileutils - * mvdir Fileutils - * mwrite mtools - - * NDview geomview - * nethack NetHack - * netstat bsd44 - * newfs bsd44 - * nfsd bsd44 - * nfsiod bsd44 - * nfsstat bsd44 - * nice Shellutils - * nl Textutils - * nlmconv Binutils - * nm Binutils - * nohup Shellutils - * nose geomview - * notify HylaFAX - * nroff Groff - * number bsd44 - - * objc GCC - * objcopy Binutils - * objdump Binutils - * objective-c GCC - * obst-boot OBST - * obst-CC OBST - * obst-cct OBST - * obst-cgc OBST - * obst-cmp OBST - * obst-cnt OBST - * obst-cpcnt OBST - * obst-csz OBST - * obst-dir OBST - * obst-dmp OBST - * obst-gen OBST - * obst-gsh OBST - * obst-init OBST - * obst-scp OBST - * obst-sil OBST - * obst-stf OBST - * oclock xreq - * octave Octave - * od Textutils - * oleo Oleo - * ora-examples xopt - - * p2c p2c - * pagesize bsd44 - * palette xopt - * pascal bsd44 - * passwd bsd44 - * paste Textutils - * patch patch - * patgen TeX - * pathalias bsd44 - * pathchk Shellutils - * pathto smail - * pax bsd44 - * pbmplus xopt - * perl perl - * pfbtops Groff - * phantasia bsd44 - * phttpd phttpd - * pic Groff - * pico pine - * pig bsd44 - * pine pine - * ping bsd44 - * pixedit xopt - * pixmap xopt - * pktogf TeX - * pktype TeX - * plaid xopt - * plot2fig Graphics - * plot2plot Graphics - * plot2ps Graphics - * plot2tek Graphics - * pltotf TeX - * pollrcvd HylaFAX - * pom bsd44 - * pooltype TeX - * portmap bsd44 - * ppt bsd44 - * pr Textutils - * pr-addr GNATS - * pr-edit GNATS - * primes bsd44 - * printenv Shellutils - * printf Shellutils - * protoize GCC - * proxygarb Spinner - * ps bsd44 - * ps2ascii Ghostscript - * ps2epsi Ghostscript - * ps2fax HylaFAX - * psbb Groff - * pstat bsd44 - * psycho xopt - * ptester phttpd - * ptx ptx - * pubdic+ xopt - * puzzle xopt - * puzzle xreq - * pwd Shellutils - * pyramid xopt - - * query-pr GNATS - * quiz bsd44 - * quot bsd44 - * quota bsd44 - * quotacheck bsd44 - * quotaon bsd44 - - * rain bsd44 - * random bsd44 - * ranlib Binutils - * rbootd bsd44 - * rc rc - * rcp bsd44 - * rcp Inetutils - * rcs RCS - * rcs-to-cvs CVS - * rcs2log Emacs - * rcsdiff RCS - * rcsfreeze RCS - * rcsmerge RCS - * rdist bsd44 - * reboot bsd44 - * recode recode - * recvstats HylaFAX - * red ed - * refer Groff - * remsync Sharutils - * renice bsd44 - * repquota bsd44 - * restore bsd44 - * rev bsd44 - * rexecd bsd44 - * rexecd Inetutils - * rlog RCS - * rlogin bsd44 - * rlogin Inetutils - * rlogind bsd44 - * rlogind Inetutils - * rm Fileutils - * rmail bsd44 - * rmdir Fileutils - * rmt cpio - * rmt tar - * robots bsd44 - * rogue bsd44 - * route bsd44 - * routed bsd44 - * rr xopt - * rs bsd44 - * rsh bsd44 - * rsh Inetutils - * rshd bsd44 - * rshd Inetutils - * rsmtp smail - * runq smail - * runtest DejaGnu - * runtest.exp DejaGnu - * ruptime bsd44 - * rwho bsd44 - * rwhod bsd44 - - * s2p perl - * sail bsd44 - * saoimage SAOimage - * savecore bsd44 - * sc bsd44 - * sccs bsd44 - * sccs2rcs CVS - * scdisp xopt - * screen screen - * script bsd44 - * scsiformat bsd44 - * sctext xopt - * sdiff Diffutils - * sed sed - * send-pr GNATS - * sendfax HylaFAX - * sendmail bsd44 - * sgi2fax HylaFAX - * sgn GN - * sh bsd44 - * shar Sharutils - * shinbun xopt - * shogi Shogi - * showfont xopt - * showmount bsd44 - * shutdown bsd44 - * size Binutils - * sj3 xopt - * sjxa xopt - * slattach bsd44 - * sleep Shellutils - * sliplogin bsd44 - * smail smail - * smtpd smail - * snake bsd44 - * snftobdf xopt - * soelim Groff - * sort Textutils - * sos2obst OBST - * spider xopt - * split Textutils - * startslip bsd44 - * stereo geomview - * stf OBST - * strings Binutils - * strip Binutils - * stty Shellutils - * su Shellutils - * sum Textutils - * superopt Superopt - * swapon bsd44 - * sweep geomview - * sync bsd44 - * sysctl bsd44 - * syslog Inetutils - * syslogd bsd44 - * syslogd Inetutils - * systat bsd44 - - * tabs Termutils - * tac Textutils - * tackdown geomview - * tail Textutils - * taintperl perl - * talk bsd44 - * talk Inetutils - * talkd bsd44 - * talkd Inetutils - * tangle TeX - * tar tar - * tbl Groff - * tcal gcal - * tcl DejaGnu - * tclsh DejaGnu - * tcopy bsd44 - * tcp Emacs - * tee Shellutils - * tek2plot Graphics - * telnet bsd44 - * telnet Inetutils - * telnetd bsd44 - * telnetd Inetutils - * test Shellutils - * test-g++ DejaGnu - * test-tool DejaGnu - * tetris bsd44 - * tex TeX - * tex3patch Texinfo - * texi2dvi Texinfo - * texindex Texinfo - * texspell TeX - * textfmt HylaFAX - * tfmtodit Groff - * tftopl TeX - * tftp bsd44 - * tftp Inetutils - * tftpd bsd44 - * tftpd Inetutils - * tgrind TeX - * time time - * timed bsd44 - * timer Emacs - * timex xopt - * tip bsd44 - * tkpostage xopt - * tn3270 bsd44 - * togeomview geomview - * touch Fileutils - * tput Termutils - * tr Textutils - * traceroute bsd44 - * transcript HylaFAX - * transfig xopt - * transformer geomview - * trek bsd44 - * trigrp geomview - * trn3 bsd44 - * troff Groff - * trpt bsd44 - * trsp bsd44 - * true Shellutils - * tset bsd44 - * tsort bsd44 - * tty Shellutils - * ttygnans Gnans - * tunefs bsd44 - * tupdate gettext - * tvtwm xopt - * twm xreq - - * ul bsd44 - * ulpc Spinner - * umount bsd44 - * uname Shellutils - * uncompress gzip - * unexpand Textutils - * unifdef bsd44 - * unify wdiff - * uniq Textutils - * unprotoize GCC - * unshar Sharutils - * unvis bsd44 - * update bsd44 - * updatedb Findutils - * users Shellutils - * uuchk UUCP - * uucico UUCP - * uuconv UUCP - * uucp UUCP - * uucpd bsd44 - * uucpd Inetutils - * uudecode Sharutils - * uudir UUCP - * uuencode Sharutils - * uulog UUCP - * uuname UUCP - * uupath smail - * uupick UUCP - * uurate UUCP - * uusched UUCP - * uustat UUCP - * uuto UUCP - * uux UUCP - * uuxqt UUCP - - * v Fileutils - * vacation bsd44 - * vandal xopt - * vcdiff Emacs - * vdir Fileutils - * vftovp TeX - * vgrind bsd44 - * vi nvi - * viewres xopt - * viewres xreq - * vine xopt - * vipw bsd44 - * virmf TeX - * virtex TeX - * vis bsd44 - * vmstat bsd44 - * vptovf TeX - - * w bsd44 - * waisgn GN - * wakeup Emacs - * wall bsd44 - * wargames bsd44 - * wc Textutils - * wdiff wdiff - * weave TeX - * what bsd44 - * whatis bsd44 - * whereis bsd44 - * who Shellutils - * whoami Shellutils - * whois bsd44 - * window bsd44 - * winterp xopt - * wish DejaGnu - * wn WN - * wndex WN - * worm bsd44 - * worms bsd44 - * write bsd44 - * wump bsd44 - - * x11perf xreq - * x2p perl - * xalarm xopt - * xancur xopt - * xargs Findutils - * xauth xreq - * xbfe Fontutils - * xbiff xopt - * xbiff xreq - * xboard xboard - * xboing xopt - * xbuffy3 xopt - * xcalc xopt - * xcalc xreq - * xcalendar xopt - * xcdplayer xopt - * xcell xopt - * xclipboard xreq - * xclock xreq - * xcmdmenu xopt - * xcms xopt - * xcmsdb xreq - * xcmstest xreq - * xco xopt - * xcolorize xopt - * xcolors xopt - * xconsole xreq - * xcrtca xopt - * xdaliclock xopt - * xdiary xopt - * xditview Groff - * xditview xopt - * xditview xreq - * xdm xreq - * xdpyinfo xreq - * xdu xopt - * xdvi TeX - * xdvi xopt - * xdvorak xopt - * xearth xopt - * xed xopt - * xedit xopt - * xedit xreq - * xev xopt - * xev xreq - * xexit xopt - * xeyes xopt - * xeyes xreq - * xfd xreq - * xfed xopt - * xfedor xopt - * xfeoak xopt - * xferstats HylaFAX - * xfig xopt - * xfontsel xopt - * xfontsel xreq - * xforecast xopt - * xgas xopt - * xgas xreq - * xgc xopt - * xgc xreq - * xgettext gettext - * xhearts xopt - * xhelp xopt - * xhost xreq - * xinit xreq - * xkeycaps xopt - * xkill xreq - * xlax xopt - * xlayout xopt - * xlbiff xopt - * xless xopt - * xload xopt - * xload xreq - * xlogin xopt - * xlogo xreq - * xlsatoms xreq - * xlsclients xreq - * xlsfonts xreq - * xmag xreq - * xmail xopt - * xmailbox xopt - * xmailwatcher xopt - * xman xopt - * xman xreq - * xmandel xopt - * xmessage xopt - * xmeter xopt - * xmh xreq - * xmh-icons xopt - * xmh.editor xopt - * xmodmap xreq - * xmon xopt - * xmove xopt - * xmphone xopt - * xpd xopt - * xphoon xopt - * xpipeman xopt - * xplot Graphics - * xpostit xopt - * xpr xopt - * xpr xreq - * xprompt xopt - * xproof xopt - * xprop xreq - * xpserv xopt - * xrdb xreq - * xrefresh xreq - * xrsh xopt - * xrubik xopt - * xrunclient xopt - * xscope xopt - * xscreensaver xopt - * xsession xopt - * xset xreq - * xsetroot xreq - * xshogi xshogi - * xstdcmap xreq - * xstr bsd44 - * xtalk xopt - * xterm xreq - * xterm_color xopt - * xtetris xopt - * xTeXcad.13 xopt - * xtiff xopt - * xtokid ID Utils - * xtree xopt - * xtv xopt - * xwd xreq - * xwininfo xreq - * xwud xreq - - * yacc bsd44 - * yes Shellutils - * youbin xopt - * yow Emacs - - * zcat gzip - * zcmp gzip - * zdiff gzip - * zforce gzip - * zgrep gzip - * zmore gzip - * znew gzip - - * [ Shellutils - - - -CD-ROMs -******* - -We offer these CD-ROMs: - - * Several editions of our *Note Source Code CD-ROMs::. - - * January 1997 *Note Compiler Tools Binaries CD-ROM::. - - * December 1995 Compiler Tools Binaries CD-ROM, see the *note Free - Software Foundation Order Form::. - - * December 1994 Compiler Tools Binaries CD-ROM, see the *note Free - Software Foundation Order Form::. - - * December 1993 Compiler Tools Binaries CD-ROM, see the *note Free - Software Foundation Order Form::. - -Our CDs are in ISO 9660 format & can be mounted as a read-only file system on -most computers. If your driver supports it, you can mount each CD with "Rock -Ridge" extensions & it will look like a regular Unix file system, rather than -one full of truncated & otherwise mangled names that fit vanilla ISO 9660. - -You can build most of the software without copying the sources off the CD. -You only need enough disk space for object files and intermediate build -targets. - - - -Pricing of the GNU CD-ROMs --------------------------- - -If a business or organization is ultimately paying, the January 1997 Source CD -set costs $240. The set costs $60 if you, an individual, are paying out of -your own pocket. The January 1997 Compiler Tools Binaries CD-ROM costs $220 -for a business or organization, and $55 for an individual. - - - -What Do the Different Prices Mean? -.................................. - -The software on our disks is free; anyone can copy it and anyone can run it. -What we charge for is the physical disk and the service of distribution. - -We charge two different prices depending on who is buying. When a company or -other organization buys the January 1997 Source CD-ROMs, we charge $240. -When an individual buys the same CD-ROMs, we charge just $60. This -distinction is not a matter of who is allowed to use the software. In either -case, once you have a copy, you can distribute as many copies as you wish and -there's no restriction on who can have or run them. The price distinction is -entirely a matter of what kind of entity pays for the CDs. - -You, the reader, are certainly an individual, not a company. If you are -buying a disk "in person", then you are probably doing so as an individual. -But if you expect to be reimbursed by your employer, then the disk is really -for the company; so please pay the company price and get reimbursed for it. -We won't try to check up on you--we use the honor system--so please cooperate. - -Buying CDs at the company price is very helpful for GNU; just -150 Source CDs at that price support an FSF programmer or tech writer for a -year. - - - -Why Is There an Individual Price? -................................. - -In the past, our distribution tapes were ordered mainly by companies. The CD -at the price of $240 provides them with all of our software for a much lower -price than they would previously have paid for six different tapes. To lower -the price more would cut into the FSF's funds very badly and decrease the -software development we can do. - -However, for individuals, $240 is too high a price; hardly anyone could -afford that. So we decided to make CDs available to individuals at the lower -price of $60. - - - -Is There a Maximum Price? -......................... - -Our stated prices are minimum prices. Feel free to pay a higher price if you -wish to support GNU development more. The sky's the limit; we will accept as -high a price as you can offer. Or simply give a donation (tax-deductible in -the U.S.) to the Free Software Foundation, a tax-exempt public charity. - - - -January 1997 Compiler Tools Binaries CD-ROM -------------------------------------------- - -The fourth edition of our CD-ROM that has binaries and complete sources for -GNU compiler tools for some systems which lack a compiler, will be available -at the end of January 1997. This enables the people who use these systems to -compile GNU and other free software without having to buy a proprietary -compiler. You can also use these GNU tools to compile your own -C/C++/Objective-C programs. Older editions of this CD are available while -supplies last at a reduced price; see the *note Free Software Foundation -Order Form::. - -We hope to have more systems on each update of this CD. If you can help -build binaries for new systems (especially those that don't come with a C -compiler), or have one to suggest, please contact us at the addresses on the -top menu. - -These packages: - - * DJGPP - * GCC/G++/Objective-C - * GNU C Library - * GDB - * Binutils - * Bison - * Emacs (MS-DOS only) - * Flex - * Make - * libg++ - -On these platforms: - - * `i386-msdos' - * `hppa1.1-hp-hpux9' - * `hppa1.1-hp-hpux10' - * `powerpc-ibm-aix4.2' - * `sparc-sun-solaris2.4' - * `sparc-sun-solaris2.5' - * `sparc-sun-sunos4.1' - - - -Source Code CD-ROMs -------------------- - -We have several versions of our Source Code CD-ROMs available, including: - - * *Note January 1997 Source Code CD-ROMs::, the newest release, has - programs, bug fixes, & improvements not on the other CDs. - - * *Note July 1996 Source Code CD-ROMs::. - - * December 1995 Source Code CD-ROMs, see the *note Free Software - Foundation Order Form::. - - * June 1995 Source Code CD-ROM, see the *note Free Software Foundation - Order Form::. - - * May 1994 Source Code CD-ROM, see the *note Free Software Foundation - Order Form::. - - * November 1993 Source Code CD-ROM, see the *note Free Software Foundation - Order Form::. - - * May 1993 Source Code CD-ROM, see the *note Free Software Foundation - Order Form::. - - * October 1992 Source Code CD-ROM, see the *note Free Software Foundation - Order Form::. - -The older Source CDs are available while supplies last at a reduced price -(please note that the December 1994 Source CD is permanently out of stock). -All the Source CDs have Texinfo source for the GNU manuals listed in *Note -Documentation::. - -MIT Scheme & much of X11 is *not* on the older Source CDs. - -There are no precompiled programs on these Source CDs. You will need a C -compiler (programs which need some other interpreter or compiler normally -provide the C source for a bootstrapping program). We ship C compiler -binaries for some systems on the *Note Compiler Tools Binaries CD-ROM::. - - - -January 1997 Source Code CD-ROMs -................................ - -The 9th edition of our Source Code CD will be available at the end of January -1997 with two CD-ROM disks. It has programs, bug fixes, & improvements not -on the older Source CDs. It has these packages, & some manuals that are not -part of packages. The version number of each package listed might be higher -on the 9th edition CD due to new releases being made between now and then. - - - * acm 4.7 - * apache 1.2b2 - * Autoconf 2.12 - * Automake 1.0 - * BASH 1.14.7 - * bc 1.03 - * Binutils 2.7 - * Bison 1.25 - * C Library 2.0 - * Calc 2.02f - * cfengine 1.3.17a - * Chess 4.0.pl77 - * CLISP 1996.05.30 - * Common Lisp 2.2 - * cperf 2.1a - * cpio 2.4.2 - * CVS 1.9 - * DejaGnu 1.3 - * Diffutils 2.7 - * dld 3.3 - * doschk 1.1 - * ed 0.2 - * Elib 1.0 - * elisp archive - * Emacs 18.59 - * Emacs 19.34 - * enscript 1.4.0 - * es 0.84 - * Exim 1.59 - * f2c 1996.09.25 - * ffcall 1.1 - * Fileutils 3.14 - * Findutils 4.1 - * Finger 1.37 - * flex 2.5.4 - * Fontutils 0.6 - * g77 0.5.19 - * GAWK 3.0.1 - * gcal 2.10 - * GCC/G++/Objective-C 2.7.2.1 - * GDB 4.16 - * gdbm 1.7.3 - * Generic NQS 3.50.2 - * geomview 1.6.1 - * gettext 0.10 - * gforth 0.2.0 - * Ghostscript 3.33 - * Ghostview 1.5 - * Ghostview for Windows 1.0 - * GIT 4.3.14 - * gmp 2.0.2 - * GN 2.24 - * Gnans 1.5.1 - * gnat 3.05 - * GNATS 3.2 - * GNU Emacs Lisp Reference Manual 1.03 - * GNU Emacs Lisp Reference Manual 2.4.2 - * GnuGo 1.2 - * gnuplot 3.5 - * gnuserv 2.1alpha - * gnussl 0.2.1 - * Graphics 0.17 - * grep 2.0 - * Groff 1.10 - * gzip 1.2.4 - * hello 1.3 - * hp2xx 3.1.4 - * HylaFAX 4.0b018 - * Hyperbole 4.01 - * ID Utils 3.2 - * indent 1.9.1 - * Inetutils 1.2 - * Ispell 3.1.20 - * karma 1.6 - * less 321 - * libg++ 2.7.2 - * libobjects 0.1.19 - * lynx 2.6 - * m4 1.4 - * make 3.75 - * MandelSpawn 0.07 - * maxima 5.2 - * mc 3.2.1 - * <Meta-HTML> 5.01 - * miscfiles 1.0 - * mkisofs 1.05GNU - * mm 1.07 - * mtools 3.0 - * MULE 2.3 - * ncurses 1.9.9e - * NetHack 3.2.1 - * NIHCL 3.1.4 - * nvi 1.76 - * Oaklisp 930720 - * OBST 3.4.3 - * Octave 2.0 - * Oleo 1.6 - * p2c 1.20 - * patch 2.1 - * perl 4.036 - * perl 5.003 - * phttpd 0.99.72.1 - * pine 3.91 - * Programming in Emacs Lisp an Introduction 1.04 - * ptx 0.4 - * rc 1.4 - * RCS 5.7 - * readline 2.0 - * recode 3.4 - * regex 0.12 - * rx 1.4 - * SAOimage 1.19 - * screen 3.7.2 - * sed 2.05 - * Sharutils 4.2 - * Shellutils 1.14 - * Shogi 1.2p03 - * SIPP 3.1 - * smail 3.2 - * Smalltalk 1.1.5 - * Roxen 1.0 - * stow 1.3.2 - * Superopt 2.5 - * tar 1.11.8 - * Termcap 1.3 - * Termutils 2.0 - * TeX 3.145 - * Texinfo 3.9 - * Textutils 1.20 - * tiff 3.4b035 - * Tile Forth 2.1 - * time 1.7 - * ucblogo 3.4 - * UUCP 1.06.1 - * W3 2.2.26 - * wdiff 0.5 - * wget 1.4.2 - * windows32api 0.1.2 - * WN 1.17.1 - * X11R6.3 - * xboard 3.4.pl1 - * xgrabsc 2.41 - * xinfo 1.01.01 - * xshogi 1.2p03 - * Ygl 3.1 - - - -July 1996 Source Code CD-ROMs -............................. - -We still have copies of the 8th edition of our Source CD with two CD-ROM -disks. It has these packages, & some manuals that are not part of packages: - - - * acm 4.7 - * apache 1.1 - * Autoconf 2.10 - * Automake 1.0 - * BASH 1.14.6 - * bc 1.03 - * Binutils 2.7 - * Bison 1.25 - * C Library 1.93 - * Calc 2.02d - * cfengine 1.3.7 - * Chess 4.0.pl77 - * CLISP 1996.05.30 - * Common Lisp 2.2 - * cperf 2.1a - * cpio 2.4.2 - * CVS 1.8.1 - * DejaGnu 1.3 - * Diffutils 2.7 - * dld 3.3 - * doschk 1.1 - * ed 0.2 - * Elib 1.0 - * elisp archive - * Emacs 18.59 - * Emacs 19.31 - * Emacs 19.32 - * enscript 1.4.0 - * es 0.84 - * Exim 0.53 - * f2c 1996.07.23 - * ffcall 1.0 - * Fileutils 3.13 - * Findutils 4.1 - * Finger 1.37 - * flex 2.5.3 - * Fontutils 0.6 - * g77 0.5.18 - * GAWK 3.0.0 - * gcal 1.01 - * GCC/G++/Objective-C 2.7.2 - * GCC 2.7.2.1 - * GDB 4.16 - * gdbm 1.7.3 - * Generic NQS 3.50.0 - * geomview 1.5.0 - * gettext 0.10 - * Ghostscript 3.33 - * Ghostview 1.5 - * Ghostview for Windows 1.0 - * GIT 4.3.11 - * gmp 2.0.2 - * GN 2.24 - * Gnans 1.5.1 - * gnat 3.05 - * GNATS 3.2 - * GNU Emacs Lisp Reference Manual 1.03 - * GNU Emacs Lisp Reference Manual 2.4 - * GnuGo 1.2 - * gnuplot 3.5 - * gnuserv 2.1alpha - * gnussl 0.2 - * Graphics 0.17 - * grep 2.0 - * Groff 1.10 - * gzip 1.2.4 - * hello 1.3 - * hp2xx 3.1.4 - * HylaFAX 4.0b018 - * ID Utils 3.1 - * indent 1.9.1 - * Inetutils 1.0 - * Ispell 3.1.20 - * karma 1.4 - * less 321 - * libg++ 2.7.2 - * libobjects 0.1.19 - * lynx 2.5 - * m4 1.4 - * make 3.75 - * MandelSpawn 0.07 - * maxima 5.2 - * mc 3.2.1 - * miscfiles 1.0 - * mkisofs 1.05GNU - * mm 1.07 - * mtools 3.0 - * MULE 2.3 - * ncurses 1.9.9e - * NetHack 3.2.1 - * NIHCL 3.1.4 - * nvi 1.71 - * Oaklisp 930720 - * OBST 3.4.3 - * Octave 1.1.1 - * Oleo 1.6 - * p2c 1.20 - * patch 2.1 - * perl 4.036 - * perl 5.003 - * phttpd 0.99.72.1 - * pine 3.91 - * Programming in Emacs Lisp an Introduction 1.04 - * ptx 0.4 - * rc 1.4 - * RCS 5.7 - * readline 2.0 - * regex 0.12 - * rx 1.0 - * SAOimage 1.18 - * screen 3.7.1 - * sed 2.05 - * Sharutils 4.2 - * Shellutils 1.12 - * Shogi 1.2p03 - * SIPP 3.1 - * smail 3.2 - * Smalltalk 1.1.1 - * Spinner 1.0b14 - * Superopt 2.5 - * tar 1.11.8 - * Termcap 1.3 - * Termutils 2.0 - * TeX 3.145 - * Texinfo 3.7 - * Textutils 1.19 - * tiff 3.4b035 - * Tile Forth 2.1 - * time 1.7 - * ucblogo 3.3 - * UUCP 1.06.1 - * W3 2.2.26 - * wdiff 0.5 - * WN 1.15.3 - * X11R6.3 - * xboard 3.4.pl1 - * xgrabsc 2.41 - * xshogi 1.2p03 - * Ygl 3.1 - - - -CD-ROM Subscription Service -*************************** - -Our subscription service enables you to stay current with the latest GNU -developments. For a one-time cost equivalent to three Source CD-ROMs (plus -shipping in some cases), we will ship you four new versions of the *Note -Source Code CD-ROMs::. The CD-ROMs are sent as they are issued (currently -twice a year, but we hope to make it more frequent). We do not yet know if -we will be offering subscriptions to the Compiler Tools Binaries CD. - -A subscription is an easy way to keep up with the regular bug fixes to the X -Window System. Each edition of the *Note Source Code CD-ROMs::, has updated -sources for the X Window System. - -Please note: In two cases, you must pay 4 times the normal shipping required -for a single order when you pay for each subscription. If you're in Alaska, -Hawaii, or Puerto Rico you must add $20.00 for shipping for each -subscription. If you're outside of the U.S., Canada, and Puerto Rico, you -must add $80.00 for each subscription. See "CD-ROMs" and "Tax and Shipping -Costs" on the *note Free Software Foundation Order Form::. - - - -FSF T-shirt -*********** - -The front of our T-shirt has the GNU Emacs Lisp code `(USE 'GNU)' with "`()'" -being the dancing parentheses from the cover of our `GNU Emacs Lisp Reference -Manual' (drawn by Berkeley, CA artist Etienne Suvasa). The shirt's back has -the Preamble to the GNU General Public License. - -These shirts come in black, purple, red, pink, burgundy, blue, and natural -(off-white). When you order, please give 3 choices. Black and purple are -printed in white; the other colors are printed in black. All shirts are -thick 100% cotton, and come in sizes S, M, L, XL, and XXL (but they run small -so you may want a larger size than usual). - -GNU T-shirts often create spontaneous friendships at conferences & on -university campuses. They also make great gifts for friends & family, -including children! - - - -Free Software Foundation Order Form -*********************************** - -All items are distributed with permission to copy and to redistribute. -Texinfo source for each manual and source for each reference card is on the -appropriate CD-ROM; the prices for these media do not include printed -documentation. All items are provided on an ``as is'' basis, with no -warranty of any kind. Please allow four weeks for delivery (though it -won't usually take that long). - - - PRICE AND CONTENTS MAY CHANGE WITHOUT NOTICE AFTER July 31, 1997. - - -A possibly more current version of this order form can be found on the -World Wide Web at `http://www.gnu.ai.mit.edu/order/order.html' or -can be found in file `/pub/gnu/GNUinfo/ORDERS' on a GNU FTP host -(listed in *Note How to Get GNU Software::). - - - -FSF Deluxe Distribution -....................... -(Please contact us with any questions. *note Deluxe Distribution::. -for machine, operating system, and media types.) - - -____ @ $5000 = $ ______ The Deluxe Distribution, with manuals, etc. - -Machine: _____________________________________________________________________ - -Operating system: ____________________________________________________________ - -Media type: __________________________________________________________________ - -Version of X Window System to build: _________________________________________ - - - -CD-ROMs, in ISO 9660 format (*note CD-ROMs::.): -.............................................. - - -GNU Source Code CD-ROMs, Version 9 with X11R6.3 (*note January 1997 Source Code CD-ROMs::.): - -____ @ $240 = $ ______ for corporations and other organizations. - -____ @ $ 60 = $ ______ for individuals. - - -Subscriptions, next 4 updates, of the Source Code CD-ROM, in ISO 9660 format -(*note CD-ROM Subscription Service::.): - -____ @ $720 = $ ______ for corporations and other organizations. - -____ @ $180 = $ ______ for individuals. - - -GNU Compiler Tools Binaries CD-ROM, Version 4, January 1997 Edition -(*note Compiler Tools Binaries CD-ROM::.): - -____ @ $220 = $ ______ for corporations and other organizations. - -____ @ $55 = $ ______ for individuals. - - - -Proceedings ------------ - -____ @ $ 25 = $ ______ The Proceedings of the First Conference - on Freely Redistributable Software - only - available while supplies last. - - - -Manuals -------- - -These manuals (*note Documentation::.). The latest version of each manual -will be shipped. Please contact us if you want a specific version. - -____ @ $ 25 = $ ______ GNU Emacs manual, with a reference card. - -____ @ $ 50 = $ ______ GNU Emacs Lisp Reference manual, in two volumes. - -____ @ $ 60 = $ ______ GNU Emacs Lisp Reference, Japanese Edition. - -____ @ $ 50 = $ ______ Using and Porting GNU CC. - -____ @ $ 50 = $ ______ GNU C Library Reference Manual. - -____ @ $ 50 = $ ______ GNU Emacs Calc manual, with a reference card. - -____ @ $ 20 = $ ______ Programming in Emacs Lisp: An Introduction. - -____ @ $ 20 = $ ______ Debugging with GDB, with a reference card. - -____ @ $ 25 = $ ______ GNU Awk User's Guide. - -____ @ $ 20 = $ ______ Make manual. - -____ @ $ 20 = $ ______ Bison manual, with a reference card. - -____ @ $ 20 = $ ______ Flex manual, with a reference card. - -____ @ $ 20 = $ ______ Texinfo manual. - -____ @ $ 15 = $ ______ Termcap manual. - - - -Reference Cards ---------------- - -The following reference cards, in packets of ten. For single copies please -contact us. - -____ @ $ 10 = $ ______ GNU Emacs version 19 reference cards. - -____ @ $ 10 = $ ______ GNU Emacs Calc reference cards. - -____ @ $ 10 = $ ______ GDB reference cards. - -____ @ $ 10 = $ ______ Bison reference cards. - -____ @ $ 10 = $ ______ Flex reference cards. - - - -T-shirts --------- - -GNU/FSF T-shirts, thick 100% cotton in sizes: M, L, XL, & XXL (they run -small); and in colors: black, purple, red, pink, burgundy, blue, & -natural (off-white); please list 1st, 2nd, and 3rd choice of color -(*note FSF T-shirt::.): - -____ @ $ 15 = $ ______ Size _____ - - Color choice: 1st _______ 2nd _______ 3rd _______ - -____ @ $ 15 = $ ______ Size _____ - - Color choice: 1st _______ 2nd _______ 3rd _______ - -____ @ $ 15 = $ ______ Size _____ - - Color choice: 1st _______ 2nd _______ 3rd _______ - -____ @ $ 15 = $ ______ Size _____ - - Color choice: 1st _______ 2nd _______ 3rd _______ - - -Older Items ------------ - -Older items are only available while supplies last. - -____ @ $ 5 = $ ______ GNU Emacs version 18 reference cards, in packets - of ten. - -____ @ $ 15 = $ ______ GNU Emacs Manual for Emacs version 19.29. - - -____ @ $ 10 = $ ______ Gawk Manual, Edition 0.16 for version 2.16. - - -____ @ $ 40 = $ ______ Using and Porting GCC, 8.5 x 11 inches, with - plastic binding (same text as current edition) - -____ @ $ 15 = $ ______ Debugging with GDB for Version 4.14 - - -Please fill in the number of each older CD-ROM you order: - - GNU Compiler Tools Binaries CD-ROMs: - -Version 1 (December '93) ______ Version 2 (December '94) ______ - -Version 3 (December '95) ______ - - GNU Source Code CD-ROMs: (Version 5 (Dec. '94) is not available.) - -Version 1 (October '92) ______ Version 2 (May '93) ______ - -Version 3 (November '93 - last edition with X11R5) ______ - -Version 4 (May '94 - first edition with X11R6) ______ - -Version 6 (June '95) ______ Version 7 (Dec. '95) ______ - -Version 8 (June '96) ______ - -Please put the total count and cost of the above older CD-ROMs here: - -____ @ $ 80 = $ ______ for corporations and other organizations. - -____ @ $ 20 = $ ______ for individuals. - - ====== - - Subtotal $ ______ - - - -Tax and Shipping Costs ----------------------- - - + $ ______ For addresses in Massachusetts: add 5% sales tax - or give tax exempt number. There is no sales tax - on T-shirts. - + $ ______ Shipping fee for addresses in Alaska, Hawaii, or - Puerto Rico: - $ 5.00 base charge; - + $ 5.00 for *each* Emacs Calc or Emacs Lisp - Reference manual ($ 5.00 * #ofMans); - + $ 20.00 for *each* CD-ROM subscription - ($20.00 * #ofSubs); - + $ 1.00 for *each* item other then the above - (shipping for all other items = - $ 1.00 * #ofOtherItems). - + $ ______ Shipping fee for most Foreign Destinations: (Please - do *not* use this formula for addresses in China, - Guam, Indonesia, Israel, Malaysia, New Zealand, - Philippines, and Thailand. Please fax, - or contact us for an exact shipping quote.) - $ 20.00 base charge for orders to other - addresses outside of U.S., Canada, & Puerto Rico: - + $ 10.00 for each item ordered, ($ 10.00 * #ofItems) - + $ 80.00 for each CD-ROM subscription - ($ 80.00 * #ofSubs) (don't count as an item). - + $ ______ Optional (tax-deductible in the U.S.) donation. - ------ We suggest 5% if paying by credit card. - - TOTAL $ ______ We pay for shipping via UPS ground transportation in - the contiguous 48 states and Canada. For very - large orders, ask about actual shipping costs for - that order. - -Note: The shipping fee for foreign destinations covers express courier - shipping. If you would like shipping via air mail, please contact - our distribution offfice for a quote on your order. - -Shipping Information --------------------- - -Name: ________________________________________________________________________ - -Mail Stop/Dept. Name: ________________________________________________________ - -Organization: ________________________________________________________________ - -Street Address: ______________________________________________________________ - -City, State/Province: ________________________________________________________ - -Zip Code/Postal Code Country: ________________________________________________ - -Telephone number in case of a problem with your order. -For international orders, please include a Fax number. _______________________ - -E-mail Address: ______________________________________________________________ - - ------------------------------------------------------------------------------- -| | -| Orders filled only upon receipt of check, money order, or credit card | -| order in U.S. dollars. Unpaid orders will be returned to the sender. | -| We do not have the staff to handle the billing of unpaid orders. Please | -| help keep our lives simple by including your payment with your order. | -| | ------------------------------------------------------------------------------- - - - -For orders from outside the U.S.: ---------------------------------- - -You are responsible for paying all duties, tariffs, and taxes. If you -refuse to pay the charges, the shipper will return or abandon the order. - - - --------------------------------------------------------------------------- - | | - | Please make checks payable to the ``Free Software Foundation''. | - | | - | Checks must be in U.S. dollars, drawn on a U.S. bank. | - | | - --------------------------------------------------------------------------- - - - -For Credit Card Orders: ------------------------ - -The Free Software Foundation takes these credit cards: Carte Blanche, -Diner's Club, JCB, MasterCard, Visa, or American Express. Please note that -we are charged about 5% of an order's total amount in credit card -processing fees. Please consider paying by check instead, or adding on a 5% -donation to make up the difference. To place a credit card order, please -give us this information: - - -Card type: ___________________________________________________________________ - -Account Number: ______________________________________________________________ - -Expiration Date: _____________________________________________________________ - -Cardholder's Name: ___________________________________________________________ - -Cardholder's Signature: ______________________________________________________ - - - ------------------------------------------------------------------------------- -| | -| If you wish to pay by wire transfer or you are a reseller, please | -| contact us or write us for details. | -| | ------------------------------------------------------------------------------- - - - -A possibly more current version of this order form can be found on the -World Wide Web at `http://www.gnu.ai.mit.edu/order/order.html' or -can be found in file `/pub/gnu/GNUinfo/ORDERS' on a GNU FTP host -(listed in *Note How to Get GNU Software::). - - - - Please mail orders to: Free Software Foundation - 59 Temple Place - Suite 330 - Boston, MA 02111 -PRICES AND CONTENTS MAY CHANGE +1-617-542-5942 -WITHOUT NOTICE AFTER July 31, 1997 Fax (including Japan): +1-617-542-2652 - -Version: January 1997 ASCII etc/ORDERS - ------------------------------------------------------------------------------ diff --git a/gcc/README-bugs b/gcc/README-bugs deleted file mode 100644 index 06e15bb8af7..00000000000 --- a/gcc/README-bugs +++ /dev/null @@ -1,144 +0,0 @@ -The purpose of GCC pretesting is to verify that the new GCC -distribution, about to be released, works properly on your system *with -no change whatever*, when installed following the precise -recommendations that come with the distribution. - -Here are some guidelines on how to do pretesting so as to make it -helpful. All of them follow from common sense together with the -nature of the purpose and the situation. - -* It is absolutely vital that you mention even the smallest change or -departure from the standard sources and installation procedure. - -Otherwise, you are not testing the same program that I wrote. Testing -a different program is usually of no use whatever. It can even cause -trouble if you fail to tell me that you tested some other program -instead of what I know as GCC. I might think that GCC works, when in -fact it has not been properly tried, and might have a glaring fault. - -* Even changing the compilation options counts as a change in the -program. The GCC sources specify which compilation options to use. -Some of them are specified in makefiles, and some in machine-specific -configuration files. - -You have ways to override this--but if you do, then you are not -testing what ordinary users will do. Therefore, when pretesting, it -is vital to test with the default compilation options. - -(It is okay to test with nonstandard options as well as testing with -the standard ones.) - -* The machine and system configuration files of GCC are parts of -GCC. So when you test GCC, you need to do it with the -configuration files that come with GCC. - -If GCC does not come with configuration files for a certain machine, -and you test it with configuration files that don't come with GCC, -this is effectively changing GCC. Because the crucial fact about -the planned release is that, without changes, it doesn't work on that -machine. - -To make GCC work on that machine, I would need to install new -configuration files. That is not out of the question, since it is -safe--it certainly won't break any other machines that already work. -But you will have to rush me the legal papers to give the FSF -permission to use a large piece of text. - -* Look for recommendations for your system. - -You can find these recommendations in the Installation node of the -manual, and in the file INSTALL. (These two files have the same text.) - -These files say which configuration name to use for your machine, so -use the ones that are recommended. If you guess, you might guess -wrong and encounter spurious difficulties. What's more, if you don't -follow the recommendations then you aren't helping to test that its -recommendations are valid. - -These files may describe other things that you need to do to make GCC -work on your machine. If so, you should follow these recommendations -also, for the same reason. - -Also look at the Trouble chapter of the manual for items that -pertain to your machine. - -* Don't delay sending information. - -When you find a problem, please double check it if you can do so -quickly. But don't spend a long time double-checking. A good rule is -always to tell me about every problem on the same day you encounter -it, even if that means you can't find a solution before you report the -problem. - -I'd much rather hear about a problem today and a solution tomorrow -than get both of them tomorrow at the same time. - -* Make each bug report self-contained. - -If you refer back to another message, whether from you or from someone -else, then it will be necessary for anyone who wants to investigate -the bug to find the other message. This may be difficult, it is -probably time-consuming. - -To help me save time, simply copy the relevant parts of any previous -messages into your own bug report. - -In particular, if I ask you for more information because a bug report -was incomplete, it is best to send me the *entire* collection of -relevant information, all together. If you send just the additional -information, that makes me do extra work. There is even a risk that -I won't remember what question you are sending me the answer to. - -* Always be precise when talking about changes you have made. Show -things rather than describing them. Use exact filenames (relative to -the main directory of the distribution), not partial ones. For -example, say "I changed Makefile" rather than "I changed the -makefile". Instead of saying "I defined the MUMBLE macro", send a -diff that shows your change. - -* Always use `diff -c' to make diffs. If you don't include context, -it may be hard for me to figure out where you propose to make the -changes. I might have to ignore your patch because I can't tell what -it means. - -* When you write a fix, keep in mind that I can't install a change -that would break other systems. - -People often suggest fixing a problem by changing machine-independent -files such as toplev.c to do something special that a particular -system needs. Sometimes it is totally obvious that such changes would -break GCC for almost all users. I can't possibly make a change like -that. All I can do is send it back to you and ask you to find a fix -that is safe to install. - -Sometimes people send fixes that *might* be an improvement in -general--but it is hard to be sure of this. I can install such -changes some of the time, but not during pretest, when I am trying to -get a new version to work reliably as quickly as possible. - -The safest changes for me to install are changes to the configuration -files for a particular machine. At least I know those can't create -bugs on other machines. - -* Don't try changing GCC unless it fails to work if you don't change it. - -* Don't even suggest changes that would only make GCC cleaner. -Every change I install could introduce a bug, so I won't install -a change unless I see it is necessary. - -* If you would like to suggest changes for purposes other than fixing -serious bugs, don't wait till pretest time. Instead, send them just -after I make a release. That's the best time for me to install them. - -* In some cases, if you don't follow these guidelines, your -information might still be useful, but I might have to do more work to -make use of it. Unfortunately, I am so far behind in my work that I -just can't get the job done unless you help me to do it efficiently. - - - Thank you - rms - -Local Variables: -mode: text -End: diff --git a/gcc/SERVICE b/gcc/SERVICE deleted file mode 100644 index 786d4768c68..00000000000 --- a/gcc/SERVICE +++ /dev/null @@ -1,1460 +0,0 @@ - -*- text -*- -GNU Service Directory ---------------------- - -This is a list of people who have asked to be listed as offering -support services for GNU software, including GNU Emacs, for a fee -or in some cases at no charge. - -The information comes from the people who asked to be listed; -we do not include any information we know to be false, but we -cannot check out any of the information; we are transmitting it to -you as it was given to us and do not promise it is correct. -Also, this is not an endorsement of the people listed here. -We have no opinions and usually no information about the abilities of -any specific person. We provide this list to enable you to contact -service providers and decide for yourself whether to hire one. - -Before FSF will list your name in the GNU Service Directory, we ask -that you agree informally to the following terms: - -1. You will not restrict (except by copyleft) the use or distribution -of any software, documentation, or other information you supply anyone -in the course of modifying, extending, or supporting GNU software. -This includes any information specifically designed to ameliorate the -use of GNU software. - -2. You will not take advantage of contact made through the Service -Directory to advertise an unrelated business (e.g., sales of -non-GNU-related proprietary information). You may spontaneously -mention your availability for general consulting, but you should not -promote a specific unrelated business unless the client asks. - -Please include some indication of your rates, because otherwise users -have nothing to go by. Please put each e-mail address inside "<>". -Please put nothing else inside "<>". Thanks! - -For a current copy of this directory, or to have yourself listed, ask: - gnu@prep.ai.mit.edu - -** Please keep the entries in this file alphabetical ** - -Altrasoft <info@altrasoft.com> -4880 Stevens Creek Blvd., Suite 205 -San Jose, CA 95129-1034 -+1 408 243 3300 -http://www.altrasoft.com - -Altrasoft provides corporate-quality support, development and user -documentation for GNU Emacs, XEmacs and InfoDock. (InfoDock is a turnkey -information management and software development toolset built atop emacs, -written by one of our associates.) Emacs distributions for a variety of -platforms are also available, as is support for other emacs variants, such as -those often found on PCs. - -Our unique focus on emacs-related work allows us to attract expert talent in -this area to keep you on the leading edge of productivity, especially if you -do software development work. We do the porting, patching, coding, -integrating, debugging, documenting and testing so that your people spend -much more productive time on their mainline tasks. - -Standard support packages include help on all aspects of the packages -supported, including all tools shipped as a standard part of the original -package distribution. In general, we want to give you an unbelievably strong -level of support, so where we can, we will also answer questions concerning -any add-on Lisp code that is used at your site. Setup and customization -help, bug fixes, and announcements of new releases are, of course, included. - -Support rates start at $1,500 USD, for single user support for one year. -Discounts are available for group contracts. We also offer Golden Support -contracts for those who need the absolute best in mission-critical support; -contact us for details. Hourly development rates and fixed bid work are -available. - -Updated: 1997-05-12 - -Magnus Alvestad <magnus@itanalyse.no> - -GNU Emacs, GCC, the Unix tools, Linux, Jolt. - -Rates: Free, or from $50/hour. - -Updated: 1997-05-09 - -AO UrbanSoft <info@usoft.spb.su> -St. Petersburg State University Science Campus -St. Petersburg, Russia -www.usoft.spb.ru - -AO UrbanSoft packages, markets and supports -industry standard free software products, -including the Linux operating system and -TeX document compiler. -The company also provides programming services -based on TeX, Tk, Python, HTML, Java, Perl and -Intranet. - -Rates approximately 15 USD per hour. - -Updated: 1997-05-25 - -Joseph Arceneaux <jla@ai.mit.edu> -PO Box 460633 http://www.samsara.com/~jla -San Francisco, CA 94146-0633 -+1 415 648 9988 -+1 415 285 9088 - -Recently led the project making Wells Fargo Bank the first to provide -secure customer account access over the Internet. - -Former FSF staffmember. Performed X11 implementation of Emacs version -19, designed and implemented WYSIWYG Emacs. Installed and -administered FSF network. Maintainer of GNU indent. Over 15 years -experience with Unix and other systems, from writing ROM monitors to -UI design and system administration. - -I provide installation, porting, debugging and customization or -development of GNU and other Unix software. I also design and -implement free software projects and consult on software engineering -and systems design. Handholding and teaching services are also -available as well as things like LAN and compute--infrastructure design. - -Time and material rates around $150 USD per hour, depending upon the -particular job. I am also very interested in fixed-bid jobs. For -selected non-profit organizations with worthy goals, I work for free. - -Updated: 1995-10-17 - -Gerd Aschemann <Aschemann@Informatik.TH-Darmstadt.de> -Osannstr. 49 -D-64285 Darmstadt -Tel.: +49 6151 16 2259 -http://www.informatik.th-darmstadt.de/~ascheman/ - -- System Administrator (UNIX) at CS Department, TU Darmstadt, Germany -- 17 years experience with CS, System administration on different platforms -- 10 years with UNIX/Networking/FreeWare/GNU/X11 -- 8 years organizer of Operating Systems and Distributed Systems courses -- Lectures on System and Network Administration -- Platforms: Solaris, SunOS, Ultrix, OSF1, HP-UX, Linux, FreeBSD, AIX, SCO -- Distributed Platforms and Information Systems (CORBA, WWW, Java, FTP) -- Experience with parallel environments (Connection Machine, Meiko, Parsytec) -- Consultant - -Rates are at 130,-- DM (~80 US$) per hour minimum, depending on the job. -I am willing to travel for sufficiently large jobs. - -Updated: 1997-05-07 - - - Basis Technology Corp. - One Kendall Square, Bldg 200 - Cambridge, MA 02139 - U.S.A. - - Tel: +1-617-252-5636 - Fax: +1-617-252-9150 - E-mail: <info@basistech.com> - Web: http://www.basistech.com - -Technical Expertise: - Multilingual software development - Internationalization and localization of software products - International character encodings, including Unicode, ISO-10646, - ISO-2022, ISO-8859-n, JIS, KSC5601, BIG5, GB2312 - Translation of technical materials into Japanese, Korean, and Chinese - including HTML, SGML, RTF, MIF, etc. - -GNU-related Services: - Custom internationalization and localization of GNU software, or - applications developed using GNU tools (GCC, G++, Emacs Lisp, etc.) - Custom multilingual application development based on MULE. - -GNU Contributions: - Organized 1992, 1993, and 1994 fund-raising seminars and lecture - tours for FSF in Japan. - Negotiated book royalty agreements with Japanese publishers on - behalf of the FSF. - Negotiated hardware contributions from Japanese PC vendors to - the FSF. - -Contacts: - Carl Hoffman, Steve Cohen, or Karen Watts - -Updated: 1997-05-07 - -Laurent Bernardin -16, rue Dicks -L-6944 Niederanven -Luxemburg -<bernardin@inf.ethz.ch> -+41 1 632 7469 - -Support and installation of all GNU software. - -Expertise: C, C++, Java, Motif, X, Unix administration, network security - -Rates: ~60 US$ / hour (Flux 2000.-) - -Updated: 1997-05-07 - -Paul Black <paulb@triode.apana.org.au> -Sydney, Australia - - I am available for general consulting on GNU software. My specific -areas of interest are: - - general C, C++, ADA and APL programming - - Gnu/unix utilities - - Troff - - Real Time Software - - Linux - - IP Comms, SMTP, NNTP, HTTP and WWW - - Simulation - -I am happy to provide free consulting/services if the work is of the order of -a couple of hours. If more time is required, I am happy to negotiate depending -on the nature of the work, my indicative rate is $40 per hour. - -Entered: 1996-07-10 - -Keith Bostic - - I'm interested in supporting/extending the ex/vi editors, - which I wrote. On-site or by email, rates are based on the - project. <bostic@cs.berkeley.edu> - -Entered: 1996-07-15 - -Philip Brown -<phil@mitre.org> -(703) 893-8967 (prefer email) -Northern-VA, D.C. Area -Rates: $40/Hr; less for educational or charitable organizations - -Systems Supported: - HP9000/7xx running HP/UX 8.07 - 10.X - IBM RS6000 running AIX 3.2.X - Also SGI/Indy and Sun/Sparcs - -Software Supported: - Most all FSF (Gnu) software - esp. GCC, Emacs, Binutils, GS, etc... - -Statement: - I'd be more than happy to assist anyone in my area with acquiring, - installing, and configuring any FSF tools/utilities on any of the - above systems. I'm also willing to work with other UNIX systems not - listed above. In addition, I'd be happy to share my many years of - experience with anyone having difficulty using or configuring these - tools. I've been installing and using them for about 5 years now - and I'll swear by their quality and the people/principles that made - them available. - - - Phil Brown - -Updated: 1997-05-07 - -James Craig Burley -97 Arrowhead Circle -Ashland, MA 01721-1987 -508 881-6087, -4745 -(Please call only between 0900-1700 Eastern time, and only if you -are prepared to hire me -- ask me to help you for free only -via email, to which I might or might not respond.) -Email: <burley@gnu.ai.mit.edu> --preferred-- - <burley@cygnus.com> - <burley@world.std.com> - -Expertise: - Compiler Internals (author of GNU Fortran, for example) - Operating Systems Internals - Tools/Utilities Development and Maintenance - Microcode Development and Maintenance (primarily VLIW machines) - System Design (computers, operating systems, toolsets, &c) - Debugging (often asked to help debug Other People's Code) - Documentation (authored many books and ran a few doc projects) - Extensive experience with a variety of operating systems, hardware, - languages, and so on - -Rate: $100/hour -- willing to consider flat-fee arrangements - -Updated: 1997-05-07 - -Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> -Becket House -66 Highland Ave. No. 8 -Somerville, MA 02143 -(617) 623-0654 - - -All GNU software: Installation, customization, answering simple or - complex questions, bug fixing, extension. - -Experience: I have done Unix and GNU programming for several years, - I am the primary author of the Hurd (which provides most - kernel related facilities for the GNU OS). - -I am easily available in the Cambridge/Boston area; work via email. -I am willing to travel for sufficiently large jobs. - -Rates: $100/hr, negotiable, less for non-profit organizaions. - -Updated: 1997-05-07 - - C2V Michel Delval <mfd@ccv.fr> - 82 bd Haussmann Jean-Alain Le Borgne <jalb@ccv.fr> - 75008 Paris - France - Tel (33 1) 40.08.07.07 - Fax (33 1) 43.87.35.99 - Compuserve 100413,1012 - http://c2v.com - - We offer source or source+binary distribution, installation, training, - maintenance, technical support, consulting, specific development and - followup on the GNU software development environment: Emacs, gcc/g++, - binutils, gas, gdb. - - Experience: adapted gcc, gas and binutils to work as cross-development - tools for the Thomson D950 DSP chip: GCC parser and typing system - have been augmented to allow the manipulation of variables located in - separated memory spaces. Porting on new platforms, and professionally - developing software with the GNU tools in the Unix/X11 environment - since they were first available. - - Rates: from 2000 FF/day to 150 000 FF/year, 40% discount for - educational institutions, add taxes and expenses. Ask for list. - -Updated: 1997-05-09 - -Bruce Dawson - <jbd@codemeta.com> -CodeMeta, Inc. -Epping, NH USA -800-468-8750 - -Specializing in GNU tools such as guile, CVS, gnats, bash, gawk, fileutils... - -Services: - - o 800 phone support. - - o Modification and development. - - o Training. - -Rate: $75/hour or per quote. - -http://www.codemeta.com - -Updated: 1997-05-09 - -Kevin Cosgrove <kevinc@dOink.COM> - - - I can help folks with porting & installation of many GNU - and X packages on a variety of Unix platforms. - - - My rates depend on the scope of each project but range - from $35 to $90 per hour. - -Updated: 1997-05-07 - -Couvares Consulting -211 W. Gilman St., Suite 3W -Madison, WI 53703 USA -Phone: (608) 256-6201 -EMail: <couvares@family.hampshire.edu> -Contact: Peter F. Couvares - -Type of support: We offer phone/email support, installation, ongoing - administration, training, programming, and specialized consulting for - free software and other UNIX systems. - -Sample prices: USD75/hour commercial, 40/hour nonprofit, sliding scale -for individuals. - -Updated: 1996-12-04 - -Stuart Cracraft <cracraft@ai.mit.edu> -25682 Cresta Loma -Laguna Niguel, CA, 92677, USA -GNUline: 714-308-7900 -Website: http://www.earthlink.net/~cracraft/index.html -Rate: $90/hour -Consultation topics: -Entire GNU suite - porting, compilation, installation, -user-training, administrator-training -Method: telephone line support, call-in via modem to your site, -work over the Internet, or in-person visit. - -Experience: supporting GNU since the mid-1980's, coordinator -of GNU Chess (original author), GNU Shogi, GNU Go. Ported GNU Emacs -to Solaris (System V Release 4). Expertise in C, Emacs Lisp, Perl, -Expect, Oracle, Informix, SunOS, Solaris, NIS, NFS. - -Customized programming also available. - -Updated: 1997-05-07 - -Noel Cragg <noel@cyclic.com> -6244 Aberdeen Av -Goleta CA 93117 -805-899-4695 - -I'll do installation, debugging, and extension of GNU tools on a -contract basis. CVS and configuration management are my current -specialties. Rate: $75/hour or per-project negotiated fee. - -Updated: 1997-05-07 - -Cygnus Solutions -<info@cygnus.com> -1325 Chesapeake Terrace -Sunnyvale, CA 94089 USA -+1 408 542 9600 voice -+1 408 542 9699 fax -Web Site: http://www.cygnus.com - - -Cygnus Solutions provides supported and maintained versions of gcc, g++, gdb -with GUI, GNU linker and GNU macro assembler. In addition, Cygnus provides -these GNU software development tools for well over 100 host-target -configurations. Support includes bug fixes and semi-annual releases of the -toolset. Each release is regression tested and includes substantial -improvements and additions to the current release. Support is available for -groups of 5 or 25 on a wide range of standard, special and vintage -toolchains for native and embedded applications. New target processors are -being added regularly. Rates for support for standard products start at $7495. - -Cygnus Solutions contacts: - - Kathy Powers - ph: +1-206-888-6002 - fx: +1-206-888-6145 - email: <kpowers@cygnus.com> - - - Erik Westcott - ph: +1 408 542 9637 - fx: +1 408 542 9699 - email: <westcott@cygnus.com> -Updated: 1997-05-23 - -Marcus G. Daniels <marcusd@gnu.ai.mit.edu> -31060 S. Kaufman Rd. <marcus@tdb.com> -Canby, OR 97013-9520 <marcus@sysc.pdx.edu> -(503) 651-2694 - -I can customize, extend, port, and repair many types of free software. -I maintain the CLISP Common Lisp implementation and contribute to -several GNU packages (e.g. Emacs). Ten years of C and Unix -experience. Consulting rates start at $40 US/hr. - -Updated: 1997-05-07 - -Edgar Der-Danieliantz (Danielyan) <edd@acm.org> -P.O. Box 10 FAX +374 2 28 50 82 -Yerevan 375009 -ARMENIA - - Support for GCC, X Window System, WWW, Tcl/Tk, logic programming, - Internet security, TCP/IP. - - Experience: - OS's: 4.4BSD, SVR4.2, FreeBSD, SCO, Solaris, UnixWare. - Languages: C, C++, Objective C, Pascal, Tcl/Tk, Perl, Prolog - Platforms: Intel, SPARC, Mac, VAX, NeXT. - - Rates: Depending on type of work, approx. $20/hour. Contact for more - information. - Negotiable for individuals and non-profit organizations. - FREE for individuals who can't pay. Your 'Thanks!' just enough! :-) - Payment by international wire transfer or check. - -Updated: 1997-05-07 - -Echo Labs <echo@iinet.net.au> -29 Weld St, http://www.iinet.net.au/~echo/ -Nedlands, WA 6009 -Perth, Australia -+61 (0) 41 985 9603 - -Echo Labs is a software consultancy that also provides support and -development skills. Specialising in GNU software, particularly Tcl/Tk -and Linux. We can deliver systems at a fraction of the cost of those -based on more traditional technologies. Internet/intranet and data -communications solutions, for all platforms are undertaken. GUI -front-ends done quickly. - -While typically involved in engineering and technical area, any -GNU/freeware software will be supported. - -For further details see: http://www.iinet.net.au/~echo/ - -Experience: 12+ years C/Unix, Sun, SCO, Linux, Win/NT. - Systems programming, device drivers, hardware interfacing. - GNU tools/utilities, - Embedded & realtime systems, software, firmware, hardware. - Communications protocols and implementation. - -Degrees: BAppSc (CS), Curtin University, Perth - -Rates: AUS $50-75/hr neg. - -Updated: 1997-05-09 - -Free Software Association of Germany -Michaela Merz -Heimatring 19 -6000 Frankfurt/Main 70 -phone: (+49 69) 6312083) -ert : (+49-172-6987246) -email: (info@elara.fsag.de) - -Supporting all kinds of freeware (i.e. GNU), freeware development, consulting, -training, installation. Special LINUX support group. - -RATES: - -Companies and for profit -organizations : 100 US$ / hour -Private and not-for-profit -organizations : 40 US$ / hour -ert (24h Emergency -response team) : 300 US$ / hour - -Entered: 1994-04-14 - -Noah Friedman <friedman@prep.ai.mit.edu> -1111 W. El Camino Real #109-331 -Sunnyvale, CA 94087 -(permanent) - -Author of several Emacs Lisp packages and parts of Emacs, as well as -numerous network and unix system utilities. Co-maintained GNU Texinfo and -Autoconf for a couple of years. Experienced unix systems administrator. -FSF employee Feb 1991--Sep 1994. - -I can perform installation, porting, and enhancement of all GNU software -and any other free software, including the Linux kernel; system design and -administration for unix-type systems and IP networks; and I am willing to -provide handholding for shell programming, Emacs Lisp development, and -version control systems such as RCS and CVS. - -Fees negotiable, averaging $75-$100/hour. I can work in the California bay -area or anywhere accessible on the Internet. For larger jobs I may be -willing to travel. - -Updated: 1997-05-08 - -Ronald F. Guilmette <rfg@monkeys.com> -RG Consulting -1751 East Roseville Pkwy. #1828 -Roseville, CA 95661 -Tel: +1 916 786 7945 -FAX: +1 916 786 5311 - -Services: Development & porting of GNU software development tools. - -GNU Contributions: - Invented, designed, and implemented the protoize and - unprotoize tools supplied with GCC2. - - Designed and developed all code to support the generation - of Dwarf symbolic debugging information for System V Release - 4 in GCC2. - - Performed original port of GNU compilers to SVr4 system. - - Finished port of GNU compilers to Intel i860 RISC - processor. - -Experience: 13+ years UNIX systems experience, all working on compilers - and related tools. - - 7+ years working professionally on GCC, G++, and GDB under - contract to various firms including the Microelectronics - and Computer Technology Corporation (MCC), Data General (DG), - Network Computing Devices (NCD), and Intel Corp. - -Other qualifications: - Developer of the RoadTest (tm) C and C++ commercial - compiler test suites. - - Former vice-chairman of UNIX International Programming - Languages Special Interest Group (UI/PLSIG). - - Bachelor's and a Master's degrees, both in Computer Science. - -Rates: Variable depending upon contract duration. Call for quote. - -Updated: 1997-05-07 - -Michael P. Deignan -Ideamation, Inc. -136 Nelson Street -Providence, RI 02908 -(401) 331-3708 -(401) 272-6449 fax. - -Rate: Varies depending on complexity of task. - Hourly and fixed-rate contracts are available. -Programs Supported: All - -Updated: 1997-05-07 - -Interactive Information Limited - -Interactive Information Limited is an Edinburgh-based company that -specialises in WWW services and support for using the Internet for -marketing. - -Our staff have many years experience in using, and developing lisp packages -within, Emacs, and in using other GNU/Unix tools, particularly under public -domain UNIXes. - -We can provide services throughout the UK, at any level from general -consultancy through fetching, installing and customising software to -bespoke programming. Fees would be in the range #300 - #600 per day, -depending primarily on the size of the job. - -You can contact us - by email: <enquire@interactive.co.uk> - by phone: 0370 30 40 52 (UK) - (+44) 370 30 40 52 (International) - by post: 3, Lauriston Gardens, - Edinburgh EH3 9HH - Scotland - -Entered: 1997-05-09 - -Scott D. Kalter <sdk@twinsun.com> -2032 Corral Canyon -Malibu, CA 90265-9503 -Home: (310) 456-0254 - -Very familiar with all levels of Elisp programming. Taught Emacs use -and customization in universities and industry. Extensive -troubleshooting and user support experience. Co-developed an -object-oriented extension to Elisp (Eoops) that can be used for -projects. Extensive Elisp level modification for rapid prototyping of -designs used in groupware research. This includes the development of -an infrastructure to support multiple, communicating Emacs processes. - -Prefer e-mail communication to telephone calls. - -Updated: 1997-05-07 - -Kaman Sciences Corporation -Griffiss Business & Technology Park -775 Daedalian Drive -Rome, NY 13441-4909 -(315) 334-4900 - -CONTACTS: - Dennis Fitzgerald <dfitzgerald@rome.kaman.com> - Tom Robbins <trobbins@rome.kaman.com> - -Kaman Sciences has performed a GNU port for a custom RISC processor. -We have experience in the definition and description of the machine -register transfer language to the GNU tool-set. This includes rewriting -and modification of the necessary description and source files of gcc, gas, -and gld and other binutils. Kaman also has services for installation and -setup of GNU tools, (GAWK, GCC, EMACS, etc.) on Sun workstations. - -Work is on a "service contract" basis and development is charged either -hourly or as a fixed price contract. - -Consulting rates: $70 to $175 per hour. - -Updated: 1997-05-07 - -Ehud Karni <kehud@simonwiesel.net.il> - -I am an UNIX system programmer. My skills include writing in C and scripts. - -In the GNU domain, I consider myself an expert on Emacs. I have written several -packages in emacs-lisp (.el) including: better Hebrew support, another marking -system, emulation for CDC full screen editor (FSE), COBOL mode, mathematical -expression computing, and enhancements to vc.el (customization) and to ange-ftp -(added Novell and NT operating systems). - I have installed and tested Emacs and my el's on several machines: DG, -HP, Alpha (OSF) and PC (DOS). - I installed and worked with several other GNU packages - RCS, Gmake, GCC -and more, but I'm not an expert in these packages. - -I work in Israel and my normal rate is $40 per hour. - -Entered: 1996-07-15 - -Joseph R. Kiniry <kiniry@cs.caltech.edu> -Caltech Mailstop 256-80 http://www.cs.caltech.edu/~kiniry/ -Pasadena, CA 91125 <jrk@metagenesis.com> -Phone: 818-395-4840 -Fax: 818-792-4257 - -Long-term high-level consultant in a variety of domains. See -http://www.cs.caltech.edu/~kiniry/resume.html for more information on -professional and academic background. - -I provide installation, porting, debugging, customization, design, and -development of GNU and other UNIX and non-UNIX software. I am or have -been a certified developer with Microsoft, SunSoft, NeXT, and Amiga. -I have a great deal of development and management experience and an -extremely broad background which contributes to my excellent system -integration capabilities. I have a special expertise and conduct -research in distributed object technologies. - -Time and material rates for local work vary regionally, but are -currently $250 per hour on the west coast. Other rates apply for -long-term jobs (day rates, travel, etc.) and remote work (usually 1/2 -fee). I am interested in fixed-bid jobs and will work for lower rates -for non-profit organizations and educational institutions. - -Updated: 1997-05-07 - -Bradley M. Kuhn -<bkuhn@acm.org> -http://www.smart.net/~bkuhn - -I am available for primarily Unix system administration consulting, including -but not limited to installation, configuration and integration of GNU tools -and other copy-lefted software such as GNU/Linux. - -I am particularly skilled at end-user hand-holding and assisting in the -integration of GNU and other copy-lefted software into new environments that -have not used such tools in the past. - -Please visit my homepage for more information on my background and skills. - -I am available for both 1099 (preferred) and W2 on-site contracting in the -Baltimore, MD metropolitan area, as well as remote consulting via dialup or -Internet connection anywhere in the US. - -My rate is in the $40/hour range, depending on the circumstances. Rates for -non-profit organizations are substantially lower, and possibly free. - -Updated: 1996-12-31 - -Fen Labalme <fen@comedia.com> -CoMedia Consulting http//www.comedia.com/comedia/ -40 Carl Street #4 WE ARE EVERYWHERE -San Francisco CA 94117 JUST SAY "KNOW" - -Consulting, installation, customization and training for GNU Emacs, -and selected other GNU & network software. Design & implementation -of free software projects, as well as software engineering & system -design. I have been hacking Emacs since '76 when it was TECO and ^R -macros (don't ask), and am inter/intra-network, UNIX & Web friendly. - -Rates: $75 hour & up, depending; flat rate jobs considered. - Lower rates, barter or free for selected non-profits. - -Updated: 1997-05-07 - -Greg Lehey -LEMIS -PO Box 460 -Echunga SA 5153 -Australia - -Phone: +61-8-8388-8250 -Fax: +61-8-8388-8250 -Mobile: +61-41-739-7062 -Mail <grog@lemis.com> - -Services: Supply, porting, installation, consultation on all GNU -products. - -Experience: 20 years OS and compiler experience, ports of most GNU -products. Author of ported software CD-ROM for UNIX System V.4.2, -"Porting UNIX Software" (O'Reilly), "Installing and Running FreeBSD" -and "The Complete FreeBSD" (both Walnut Creek). - -Rates: Choice of AUD 120 per hour or hotline rates AUD 2.50 DM per -minute. Outside Australia, $US 100 per hour or $US 2 per minute. -Quick questions may be free. Limited free support available for -purchasers of LEMIS CD-ROMs. - -Updated: 1997-05-09 - -Rohan Lenard <rjl@wr.com.au> -32 Holtermann St. -Crows Nest, NSW 2065 -AUSTRALIA -+61 411250024 - -* The human face behind the bug-g++@prep.ai.mit.edu mailing list - known - in the past as <rjl@iassf.easams.com.au> and <rjl@ot.com.au> - now - known as <rjl@wr.com.au>. - -* Interested in providing first line support and development. - -Experience: 10+ years C/Unix, 6+ years C++ - Extensive experience with GNU tools, cross-compilers, - embedded/hosted systems, realtime, simulations, - and military software. - -Degrees: BSc (CS), BE (Comms), University of Melbourne - -Rates: AUS $75+/hr neg. - -Updated: 1997-05-17 - -Reuven M. Lerner <reuven@netvision.net.il> -17 Disraeli Street -Haifa 34333 -Israel - -Phone: 04-824-2265 (within Israel) - +972-4-824-2265 (outside of Israel) - -Fax: 04-826-1219 (within Israel) - +972-4-826-1219 (outside of Israel) - -WWW: http://www.netvision.net.il/php/reuven - -- System and network administration, especially Linux-based systems - and networks -- Administration, training, and programming for Internet nodes and - World-Wide Web sites -- Installation, support and training in the use of Linux, Emacs, Perl, - and other free software -- Expertise in C, Emacs Lisp, and Perl - -Consulting rates: $75/hour, less for educational institutions. - -Updated: 1997-05-07 - -Richard Levitte (in TeX: Richard Levitte -Levitte Programming Levitte Programming -Spannvagen 38, I Spannv\"agen 28, I -S-168 35 Bromma S-168 35 Bromma -Sweden Sweden) -Tel.nr.: +46 (8) 26 52 47 (there is an answering machine) -Cellular: +46 (10) 222 64 05 -e-mail: <levitte@lp.se> - -What I do: - Primarly I work on GNU software for VMS, both VAX and AXP. I've - been porting GNU Emacs to VMS since spring 1991. I've ported a - bunch of other GNU programs as well. I maintain GNU vmslib. - For further info, see http://www.lp.se/~levitte/prof/resume.html - -Programs supported: - To a varying degree (ranging from extention and porting to - installation and simple questions) at the time of updating this - entry: - - GNU vmslib, emacs, autoconf, zip, diffutils, m4, patch, texinfo, - C/C++; on both VMS and Unix. - - Other GNU programs to a small degree; on Unix. - For further info, look at http://www.lp.se/products/gnu.html - -Experience: - Fluent in TeX/LaTeX and many programming languages. - Modified key elements in Emacs (e.g., memory and process management) - to work transparently on VMS. I have very good knowledge in the VMS - operating system. I'm also knowledged in the a few Unix flavors. - For further info, see http://www.lp.se/~levitte/prof/resume.html - -Your Rate: - $70-$100/hour (500-800 SEK in sweden), plus expenses. My rates - are negotiable, depending on how interesting the project is to me. - -Updated: 1997-05-08 - -Lexa Software info@lexa.com -1590 The Alameda, Suite 102 -San Jose, CA 95126 - -+1 800 278-2040 -+1 408 278-2043 voice -+1 408 278-2045 fax - -http://www.lexa.com - -Lexa Software provides support for GNU C/C++ including the GNU debugger -and linker. Lexa has extensive experience supporting GCC/G++ on SNI -and Pyramid as well as all other MIPS ABI platforms. We offer support -to 2, 5, 25 and larger number of users via phone, email, ftp. - -Updated: 1997-05-01 - -Gord Matzigkeit <gord@gnu.ai.mit.edu> -2220 Capitol Hill Crescent http://www.m-tech.ab.ca/~gord/ -Calgary, Alberta T2M 4B9 Voice: (403) 282-1387 -CANADA FAX: (403) 284-0137 - -I will help install badly-behaved source code packages, and have experience -fixing them to conform to GNU standards. I will gladly help novices and -intermediate computer users to understand, install, and use free software, -whether or not I have prior experience with that software. I know my -limitations well, and will freely give other contacts if I do not want to -solve your problem myself. - -I have installed and administered free and proprietary systems in home, -academic, and business environments. I have practical experience in most -aspects of Unix and network security. I know how to diagnose a complex -existing computer system and incrementally replace it with a superior free -system without disrupting service. - -I have over 2 years of experience with several of the major free OSes: -Linux/GNU (Red Hat, Debian, Slackware), NetBSD, FreeBSD, and GNU/Hurd. I am -the maintainer of GNU Libtool and GNU DLD. Some of my specialties are: -Emacs, Automake, Autoconf, SANE, C, Perl, and shell script programming. - -My rates start at $10 (Canadian dollars) per hour. When I am not starving, I -do not charge worthy non-profit organizations. - -Updated: 1997-05-08 - -Andrew McCallum -6623 Dalzell Place -Pittsburgh, PA 15217 -Home: (412) 422-0688 -<mccallum@cs.cmu.edu> -http://www.cs.rochester.edu/u/mccallum - -Services: Support, enhancements, new development in: - GNU Objective C - GNUstep, both graphical and non-graphical. - GNUstep Base Library: libgnustep-base - (especially Distributed Objects) - Interface between Objective-C and Guile or TCL: libguileobjc. - -Experience: 10+ years of UNIX experience. - Programming for NeXTSTEP since version 0.8, 1988. - MA and PhD in Computer Science. - Extensive work on GNU Objective C Runtime. - Author of GNUstep Base Library, including Distributed Objects - FSF Chief Maintainer of the GNUstep Project. - Contributor to GCC, Emacs, Guile. - C, Objective-C, Postscript, Scheme, Lisp, ELisp, Linux. - English and Francais. - -Rates: $90-$150 / hour, negotiable, depending on many variables. - -Updated: 1997-05-07 - -Erik Naggum <erik@naggum.no> -P.O. Box 1570 Vika http://www.naggum.no -0118 OSLO phone: +47 8800 8879 -NORWAY NIC handle: EN9 - -Background: I have extensive experience with programming under Unix, in C -in particular (since 1983), with standards and specifications for Internet -protocols (since 1987), International Standards for character sets and -encoding schemes (since 1988), ISO 8879 SGML (since 1990, national head of -delegation to ISO/IEC JTC 1/SC 18/WG 8 since 1991), and ANSI X3.226 Common -Lisp (since early 1994). I have been an Emacs user and programmer from -1984 to 1987 (TOPS-20) and from 1991 to present (Unix). since early 1994, -I have worked on GNU Emacs development, in both Lisp and C, and since mid -1995, I have been tracking the development code. - -Services I offer the free software community include supporting Emacs users -and programmers with expert advice (gratis on USENET or mailing lists where -others may benefit), customizing and writing Emacs functions and packages, -delivering courses and seminars from tutorials to writing Emacs Lisp and C -extensions, and providing general aid with all GNU software. - -My standard rate is a flat USD 80 per hour or USD 2 per minute (you decide -which time unit to apply), but to offset the cost of processing money, the -minimum credit card charge is USD 100 and the minimum invoiced amount is -USD 250. Discounts are available to worthy causes -- present your case. -Time away from home is billed at USD 40 per hour around the clock to -encourage remote work. (Courses and seminars are negotiated individually.) - -Please call only about actual work, I prefer mail for all other questions. - -Updated: 1997-07-18 - -NET-Community <sales@net-community.com> -522 SW 5th Avenue http://www.net-community.com -Suite 1105 -Portland, OR 97204 USA -1-800-919-0060 voice -1-503-274-4423 voice -1-503-274-5406 fax - -NET-Community provides support for the complete GNUstep toolset -including the Objective-C runtime within GCC, the GNUstep Base Library, -the Display Ghostscript system, the GNUstep GUI Library, the GNUstep -X/DPS GUI Backend, and the GNUstep Database Library. NET-Community also -provides support for its own MediaBook software including the MediaBook -Random Library and the MediaBook Speech Synthesis Library. -NET-Community actively supports and develops free software on all -GNUstep platforms; a portion of the proceeds, usually 20%, generated -from CD-ROM sales go towards additional development and enhancement of -GNUstep. - -Updated: 1997-05-12 - - Open Systems Consultants a.s - St. Olavsgt. 24 - N-0166 OSLO - NORWAY - -Phone: Fax: - +47 22 20 40 50 +47 22 20 02 85 - -Web: E-mail: - http://www.osc.no <gnu-support@osc.no> - -Open Systems Consultants a.s can provide programming support for all -GNU software -- extending or adopting it to meet customer needs. -Prices vary with software and project. Hourly fees are in the $80-120 -range. Fixed-priced projects are also available. No phone support. - -Updated: 1997-05-08 - -Francesco Potorti` <F.Potorti@cnuce.cnr.it> -Via S.Stefano, 8 -56123 Pisa, Italy -Tel. (050)560671 - -Emacs: installation and maintenance, training and tutorials, - customisation, extensions, troubleshooting. Author of some of - the packages in the emacs distribution, has made the porting - of emacs to the Motorola Delta architecture. - -Other: installation and maintenance of GNU software. Experience with - hylafax, RCS, gperf, etags, smail, indent, diff, gawk, gcc, - screen. Is the current maintainer of etags. - -Rates: 30-80 KL/hr, depending on experience on the particular task. - Average is 50 KL/hr $50/hr. - Prefer e-mail communication to telephone. - -Qualifications: Electronic Engineering degree, Pisa. Full time - researcher in CNUCE-CNR. - Familiar with elisp programming and porting of C programs. - -Updated: 1997-05-08 - -Dipl.-Inform. Klaus Kaempf <kkaempf@progis.de> -proGIS Software -Jakobstr. 117 -D-52064 Aachen -Germany -http://www.progis.de -Tel +49 241 470670 -Fax +49 241 4706729 - -- 15 years C/Unix experience -- 6 years VMS experience -- Ported BFD library, Binutils, GNU Assembler, GNU C, GNU C++, - GNU C++ libraries, and GNU Make to openVMS/Alpha. - -We do a lot of cross-platform (Unix-VMS-WindowsNT) development -mostly with the GNU compiler environment. We are actively -supporting GNU software on openVMS/Alpha. - -Rates start at 160.- DM / hour for support and -installation. Larger projects are negotiable. - -Updated: 1997-05-08 - -Quiotix Corporation -Menlo Park, CA - -Contact: Jeffrey Siegal - jbs@quiotix.com - 415 324-0535 - -Area of focus: Embedded systems--using GNU software to develop for -embedded systems, porting GNU software to embedded systems, extending GNU -software to better support embedded environments, developing new tools and -utilities for embedded development using GNU software. - -Services: porting, development, support, project management, advisory -consulting. - -Rates: $125-$250/hour or fixed fees depending on services provided. - -Updated: 1997-05-16 - -Wolfgang S. Rupprecht <wolfgang@wsrcc.com> -47 Esparito Ave. -Fremont, CA 94539-3827 -(510) 659-9757 - -Anything, (lisp, C, customization, porting, installing) I have -written thousands of lines of GNU Emacs C and Lisp code. Original -author of the floating point additions in Emacs 19. - -Rates: $95/hr. - -Updated: 1997-05-08 - -Stanislav Shalunov - -Email: shalunov@mccme.ru -Phones: on request - -Installing, configuring, helping learn any free software. -Handholding, trouble shooting. Making custom changes to free -software written in C. Teaching, lecturing, consulting. - -Want to have a free OS with free software serving your needs but do -not want to spend time yourself or not very skilled with the -computers? Cannot decide which free software suits your needs -better? Drop me a line. - -Well, essentially, anything else on special request. :-) - -Rate: $30/hour if you are in Moscow and I am there when you request -job done, $50 if the job may be done remotely (like configuring user -level program), $60/hour + travel expenses otherwise. (Negotiable, -significant discounts may apply.) - -Entered 1997-07-17 - -Vin Shelton -EtherSoft, Inc -617.924.6437 -<acs@acm.org> - -I have been a professional programmer for 20 years, with most of that time -spent doing UNIX/C/C++ hacking. My specialties are (in no particular -order): system/kernel hacking, speech recognition, perl, object-oriented -design and analysis, FSF software (I have built nearly every FSF package on -several different platforms), small language design and implementation, and -HTML/web programming. Currently I'm a member of the XEmacs beta testing -team - I'm responsible for maintaining the version 19.15 patches and have -written a few small packages/lisp hacks. My rates vary from $60 - $100 per -hour, depending on the size of the project. - -Updated: 1997-05-09 - -Signum Support AB <info@signum.se> -Teknikringen 8 -S-583 30 Linkoping, Sweden -+46 13 21 46 00 voice -+46 13 21 47 00 fax -http://www.signum.se/ - -Signum Support AB is a company dedicated to supporting, developing and -distributing free software for mainly UNIX systems. The people behind -Signum Support AB have many years of general UNIX and Internet -experience, both as system administrators and as programmers, and also -extensive experience in maintaining and administring the GNU programs -and Linux. - -Signum Support develops and markets the free GUI equiped Readynet -Internet server, the free PHTTPD http server and the easy to use Linux -based Fuego firewall. - -Services offered: - - - Support on Internet service software, especially the free - Readynet Internet server we have developed for Linux. - - Support on Linux. - - Customization of Linux. - - Installation and customizing GNU and other free software. We are - making free software as easy to install and use as shrink wrapped - programs. - - Warranty protection. - - Finding, Recommending and Investigation of free software in any - area of the customers choise. - - Regular consulting. - -Rates: For software items, request our price list. - For consulting, 700-900 SEK/hour. - -Updated: 1997-05-12 - - Jon Solomon <jsol@gnu.ai.mit.edu> - 235 Main St., Apt 3C-1 - East Hartford, Conn. 06118 - +1 860 895-8289 - - Maintains all GNU software... Available for General Consulting - (contact me if you are interested)... - Sendmail a specialty... Can answer questions pertaining to the - installation, maintainence, bug reporting and fixing for - most GNU products... Adhering to the FSF/GNU copyleft for all - work... (I only charge for the time it takes to do the above, - the software (and most GNU copyleft'd software) is free. - I can make tapes for you if you need that... - -Updated: 1997-05-09 - -Name: Julian Stacey <jhs@freebsd.org> -Location: Munich Germany, & on the Internet. -Qualifications: University Degree, BSc Hons Computer & Cybernetics, 1980. -Phone: +49.89.268616 Fax: +49.89.260812 Data: +49.89.26023276 -Resume: http://www.freebsd.org/~jhs/ -Time Zone: +01:00 -Rate: 130-170 DM/Hour. 2.7846 DM = 1 Pound = US $1.6332 -Commercial Independent Freelance Consultancy: - Any Unix (inc FreeBSD, Linux etc), C, X-Windows, FSF Tools, - Internet, Systems engineering, hardware interfacing, - real time, comms & scientific industrial, even Cyrillic & - Chinese interfaces etc. No Emacs. No Cobol. -Free Sources: FSF, FreeBSD & NetBSD CVS & current (daily!) & releases, - X-Windows, XFree86, Free dial in soon (details on web). - Media Copy Charge ~DM 100 QIC 1/4" 525M, 150M, & 60M; & CAS-60M. -Free GCC-1.40 For Symmetric Computer Systems Model 375 (native cc is broken). -Languages: Deutsch & Francais - Man kann mir in Deutsch schreiben, (oder mich anrufen). - Je comprend Francais, mais je n'ecris pas des responses en Fr. -! NO FREE HELP ! - - The Free Software Foundation do not pay me. - - I earn my living from professional consultancy fees. - - Though I write code for public domain ... - - I will Not solve stranger's complex problems for free ! -WHEN CONTACTING ME, DO THIS :- - 1) Tell me Immediately, Are You: - A) Expecting to pay my bill for professional consultancy. - B) Seeking a few minutes advice free of charge. - 2) Give me your email adddress, or that of a friend. - or Volunteer to phone back ~ 5 days later to collect follow-up - info. from the net. (No I will not incur bills phoning you back). - 3) Speak English if you want free advice ! I speak German, & - listen in French, but if you're not paying, make some effort too ! - -Updated: 1997-05-15 - -Richard M. Stallman <rms@gnu.ai.mit.edu> -545 Tech Sq, Rm 430 -Cambridge, MA 02139 - -Emacs: anything whatever -Is anyone interested in courses in using or extending GNU Emacs? - -Original inventor of Emacs and main author of GNU Emacs and GCC. - -Rates: $6/min or $250/hr. - -Updated: 1997-05-09 - -Kayvan Sylvan <kayvan@sylvan.com> -Sylvan Associates -879 Lewiston Drive -San Jose, CA 95136-1517 -Phone: (408) 978-1407 -Fax: (408) 978-1417 - -I will help you port, install and customize GNU Emacs, GCC, G++, -bison, and other GNU tools on almost any architechture and operating -system. Questions answered. GNU C and lisp hacking available. I will -also do ongoing support and periodic upgrades if you get on my GNU -software subscription list. - -Rates: $70-$100/hour, depending on type of work. Substantial discounts -for long-term contracts and also for educational or non-profit -institutions. - -Experience: Many different Unix systems (2.9BSD to 4.4BSD, Xenix, SVR3 and -SVR4, Linux, FreeBSD). Systems programming and system administration on all -brands of Unix. Kernel hacking experience. Lots of porting experience. - -Updated: 1997-05-09 - -TerraTel AB <info@netg.se> -Tankeg=E5ngen 4 -S-417 56 G=F6teborg, Sweden -+46 31 50 79 40 voice -+46 31 50 79 39 fax -http://www.netg.se - -TerraTel AB is a company that does consultant jobs and holds courses -in the fields of Unix software, TCP/IP networking and Internet -applications. The people behind TerraTel AB have many years -of general UNIX experience, both as system administrators and as -programmers, and also extensive experience in maintaining the GNU -programs; in administration as well as finding and fixing bugs. - -Services offered: - -- Installation and customizing GNU and other free software. We will - make free software as easy to install and use as shrink wrapped - programs. -- Service and support subscriptions. -- Warranty protection. -- Customization and porting. -- Subscriptions to new versions which we will send monthly or with - any other interval. -- Finding, recommending and investigating free software in any - area of the customers choice. -- Regular consulting. -- Support on Internet service software, especially the free -- Support on Linux. -- Freeware based courses in Unix usage, C, C++, or any GNU tools - -Rates: For courses, contact us for a quote, -For consulting, $60-120/hour, depending on contract length. - -Entered: 1997-05-12 - -Jonathan Thornburg / BKIS Consulting -E-mail: <bkis@island.net> (preferred way to contact me) -Postal: Box 8-7, Thetis Island BC V0R 2Y0, Canada -Phone: (250) 246-3640 (somewhat unreliable) - -* B.Sc (Honors 1st Class) in Math+Physics+CS, M.Sc and Ph.D in Astronomy -* 20+ years computing experience using a wide range of software and - hardware environments - -* Very fluent in C (15+ years experience) -* Fluent in C++, Perl, sh, csh, Awk, Fortran, PL/I, Pascal, APL, Lisp, - Basic, Maple, Reduce, various machine languages -* Very fluent (10+ years experience) in general Unix toolset and programming -* Good knowledge (4+ years experience) of Unix system administration - (SunOS, Linux, SGI) -* Strong background (both theory and practical experience) in Unix/network - security, computer graphics, X and Motif GUI programming -* Good general knowledge of Unix (kernel) internals and device drivers -* Very fluent in LaTeX, TeX, also HTML, HTTP, and CGI programming -* Member of Usenix (professional and technical Unix association) and - SAGE (system administrator's guild) - -* Very strong background (extensive experience) in numerical analysis -* Strong backgrounds in hardware architecture, microprogramming, - programming language implementation, compiler theory, data structures, - OS design and internals, networking, symbolic manipulation, AI - -I'm available for Unix-based contract programming, software installation, -and/or general system administration. My recent projects include several -20K-50K 50K line C/Maple/Awk scientific applications, several small (1K line) -Perl/Awk text processors and "system glue" CGI programs, finding and fixing -bugs in a (free) 50K line graphics package, and a partially completed project -to port (really rewrite) the GUI of a 50K line C++ Netscape plugin from -Win32 to Unix/X/Motif. - -Unless otherwise required by a client, all the software I write is covered -by the GNU Public License. My basic rate is Can$50/hour for work I can do -remotely over the Internet, more for on-site work, less for selected -non-profit organizations. - -Updated: 1997-05-19 - -Leonard H. Tower Jr. <tower@prep.ai.mit.edu> -36 Porter Street -Somerville, MA 02143 -USA -+1-617-623-7739 - -Will work on most GNU software. -Installation, handholding, trouble shooting, extensions, teaching. - -Rates: $ 150.00/hour + travel expenses. Negotiable for non-profits. - -Experience: Have hacked on over a dozen architectures in many languages. Have -system mothered too many varieties of Unixes. Assisted rms with the front end -of gcc and its back-end support. Resume available on request. - -Updated: 1997-05-24 - -noris network GmbH -Matthias Urlichs -Schleiermacherstrasse 12 -90491 Nuernberg -Germany -Phone: +49 911 59818-0 -Fax: +49 911 59818-11 -<info@noris.de> -http://info.noris.de/ (German) - -Expertise: - OS internals, esp. Linux and BSD, esp. device drivers - Network protocol / program design and coding - Utilities coding and maintainance - Program debugging, testing - User interface design and testing - Several programming and tool languages - -Services: - Installation, debugging, enhancement, distribution, - for all kinds of free software. - System administration for most Unix-like systems. - Email, Fax, phone, and in-person consulting (and/or "question answering"). - Remote support and system monitoring (over the Internet), - Update service (new tools tested and installed automagically) - Internet access - -Rates: - DM 110 (~$70) per hour - Support contracts start at DM 170/month + DM 30/supported system. - Willing to travel for sufficiently large jobs. - Rates don't include taxes. - -Updated: 1996-07-05 - -Paul C.A. van Gool - <P.vanGool@LR.TUDelft.NL> - -Address: Faculty of Aerospace Engineering - Delft University of Technology - Kluyverweg 1, 2629 HS Delft - The Netherlands - -Phone: +31-15-2785370 -Fax : +31-15-2786480 - -I would like to provide unpaid support for the following things: - -- C -- C++ -- f2c -- compilation and installation of most GNU packages - -Updated: 1997-05-12 - -Arne Wichmann - -EMail: <aw@math.uni-sb.de> -Telephone on request. - -I support GNU software on the following platforms: - -Linux -SunOS 4.X 5.X -HPUX 9.X -other platforms on request. - -Usual rates: 20DM per hour. Free support for private people as time -permits. - -Updated: 1997-05-16 - -Jody Winston -xprt Computer Consulting, Inc. -731 Voyager -Houston, TX, 77058 -(281) 480-UNIX, <jody@sccsi.com> - -We have supported, installed, and used the entire GNU software suite -for over 8 years on many different Unix platforms. We have written -character device drivers and proc file systems for custom hardware -running on Linux. In addition, we have developed a custom X11 server -and X input extensions. Our consulting rate is $150.00 US dollars per -hour, negotiable, plus a per diem for out of town work. - -Updated: 1997-05-12 - -Lige Zhou -Consultant -Open Technologies Corporation -Sun Lotus Bldg. 2nd Floor -2-9-1 Chuou, Nakano-ku, Tokyo 164 Japan -Tel: +81-3-3365-2911 Fax: +81-3-3365-2920 -E-mail: <zhou@opentech.co.jp> - -My profile is listed at: http://www.opentech.co.jp/~zhou/ - -I have two years of experience porting and supporting GNU C Compiler and -GNU Assember at the Wingnut project of SRA, Inc., Tokyo. - -I can provide free consultation on these products if the problem is not -time-consuming. - -Updated: 1996-12-04 - - -For a current copy of this directory, or to have yourself listed, ask: - gnu@prep.ai.mit.edu - -** Please keep the entries in this file alphabetical ** diff --git a/gcc/bi-parser.c b/gcc/bi-parser.c deleted file mode 100644 index 9f6f2b02e3c..00000000000 --- a/gcc/bi-parser.c +++ /dev/null @@ -1,980 +0,0 @@ - -/* A Bison parser, made from bi-parser.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define DEFOP 258 -#define STRING 259 - -#line 22 "bi-parser.y" - - -#include <stdio.h> -#include "hconfig.h" -#include "bi-defs.h" - -extern char yytext[]; -extern int yyleng; - - -/* Chain of all defs built by the parser. */ -struct def *defs; -int ndefs; - -static struct node *makenode (); -static struct variation *makevar (); -static struct def *makedef (); - -void yyerror (); - - -#line 44 "bi-parser.y" -typedef union -{ - char *string; - struct def *def; - struct variation *variation; - struct node *node; -} YYSTYPE; - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 39 -#define YYFLAG -32768 -#define YYNTBASE 8 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 259 ? yytranslate[x] : 17) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, - 7, 2, 2, 6, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 7, 18, 20, 24, 28, 34, 42, - 52, 53, 55, 59, 60, 62, 66 -}; - -static const short yyrhs[] = { 9, - 0, 10, 0, 9, 10, 0, 3, 5, 4, 6, - 13, 6, 5, 11, 7, 7, 0, 12, 0, 11, - 6, 12, 0, 5, 13, 7, 0, 5, 13, 6, - 14, 7, 0, 5, 13, 6, 14, 6, 14, 7, - 0, 5, 13, 6, 14, 6, 14, 6, 14, 7, - 0, 0, 4, 0, 5, 15, 7, 0, 0, 16, - 0, 16, 6, 15, 0, 4, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 60, 65, 67, 71, 76, 78, 82, 85, 87, 89, - 93, 95, 98, 101, 105, 108, 112 -}; - -static const char * const yytname[] = { "$","error","$undefined.","DEFOP", -"STRING","'('","','","')'","top","defs","def","variations","variation","opt_string", -"list","items","item","" -}; -#endif - -static const short yyr1[] = { 0, - 8, 9, 9, 10, 11, 11, 12, 12, 12, 12, - 13, 13, 14, 14, 15, 15, 16 -}; - -static const short yyr2[] = { 0, - 1, 1, 2, 10, 1, 3, 3, 5, 7, 9, - 0, 1, 3, 0, 1, 3, 1 -}; - -static const short yydefact[] = { 0, - 0, 1, 2, 0, 3, 0, 11, 12, 0, 0, - 0, 11, 0, 5, 0, 0, 0, 14, 7, 6, - 4, 0, 0, 17, 0, 15, 14, 8, 13, 0, - 0, 16, 14, 9, 0, 10, 0, 0, 0 -}; - -static const short yydefgoto[] = { 37, - 2, 3, 13, 14, 9, 23, 25, 26 -}; - -static const short yypact[] = { 2, - 6, 2,-32768, 8,-32768, 7, 10,-32768, 9, 11, - 12, 10, -5,-32768, -3, 12, 13, 14,-32768,-32768, --32768, 17, 1,-32768, 15, 18, 14,-32768,-32768, 17, - 3,-32768, 14,-32768, 16,-32768, 25, 26,-32768 -}; - -static const short yypgoto[] = {-32768, --32768, 27,-32768, 19, 20, -27, -12,-32768 -}; - - -#define YYLAST 35 - - -static const short yytable[] = { 31, - 16, 17, 18, 19, 1, 35, 27, 28, 33, 34, - 4, 6, 7, 8, 10, 11, 12, 32, 22, 21, - 24, 29, 36, 30, 38, 39, 0, 0, 5, 0, - 0, 15, 0, 0, 20 -}; - -static const short yycheck[] = { 27, - 6, 7, 6, 7, 3, 33, 6, 7, 6, 7, - 5, 4, 6, 4, 6, 5, 5, 30, 5, 7, - 4, 7, 7, 6, 0, 0, -1, -1, 2, -1, - -1, 12, -1, -1, 16 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include <malloc.h> -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include <malloc.h> - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 1: -#line 62 "bi-parser.y" -{ defs = yyvsp[0].def; ; - break;} -case 3: -#line 68 "bi-parser.y" -{ yyvsp[0].def->next = yyvsp[-1].def; yyval.def = yyvsp[0].def; ; - break;} -case 4: -#line 73 "bi-parser.y" -{ yyval.def = makedef (yyvsp[-7].string, yyvsp[-5].string, yyvsp[-2].variation); ; - break;} -case 6: -#line 79 "bi-parser.y" -{ yyvsp[0].variation->next = yyvsp[-2].variation; yyval.variation = yyvsp[0].variation; ; - break;} -case 7: -#line 84 "bi-parser.y" -{ yyval.variation = makevar (yyvsp[-1].string, (struct node *) NULL, (struct node *) NULL, (struct node *) NULL); ; - break;} -case 8: -#line 86 "bi-parser.y" -{ yyval.variation = makevar (yyvsp[-3].string, yyvsp[-1].node, (struct node *) NULL, (struct node *) NULL); ; - break;} -case 9: -#line 88 "bi-parser.y" -{ yyval.variation = makevar (yyvsp[-5].string, yyvsp[-3].node, yyvsp[-1].node, (struct node *) NULL); ; - break;} -case 10: -#line 90 "bi-parser.y" -{ yyval.variation = makevar (yyvsp[-7].string, yyvsp[-5].node, yyvsp[-3].node, yyvsp[-1].node); ; - break;} -case 11: -#line 94 "bi-parser.y" -{ yyval.string = ""; ; - break;} -case 12: -#line 95 "bi-parser.y" -{ yyval.string = yyvsp[0].string; ; - break;} -case 13: -#line 100 "bi-parser.y" -{ yyval.node = yyvsp[-1].node; ; - break;} -case 14: -#line 102 "bi-parser.y" -{ yyval.node = NULL; ; - break;} -case 16: -#line 109 "bi-parser.y" -{ yyvsp[-2].node->next = yyvsp[0].node; yyval.node = yyvsp[-2].node; ; - break;} -case 17: -#line 114 "bi-parser.y" -{ yyval.node = makenode (yyvsp[0].string); ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/local/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 117 "bi-parser.y" - - -static struct node * -makenode (s) - char *s; -{ - struct node *n; - - n = (struct node *) malloc (sizeof (struct node)); - n->text = s; - n->next = NULL; - return n; -} - -static struct variation * -makevar (name, inputs, outputs, literals) - char *name; - struct node *inputs, *outputs, *literals; -{ - struct variation *v; - - v = (struct variation *) malloc (sizeof (struct variation)); - v->name = name; - v->code = ndefs++; - v->inputs = inputs; - v->outputs = outputs; - v->literals = literals; - v->next = NULL; - return v; -} - -static struct def * -makedef (name, template, vars) - char *name, *template; - struct variation *vars; -{ - struct def *d; - - d = (struct def *) malloc (sizeof (struct def)); - d->basename = name; - d->template = template; - d->variations = vars; - d->next = NULL; - return d; -} - -void -yyerror (s) - char *s; -{ - fprintf (stderr, "syntax error in input\n"); - exit (FATAL_EXIT_CODE); -} diff --git a/gcc/bi-parser.h b/gcc/bi-parser.h deleted file mode 100644 index 5beb8628f08..00000000000 --- a/gcc/bi-parser.h +++ /dev/null @@ -1,12 +0,0 @@ -typedef union -{ - char *string; - struct def *def; - struct variation *variation; - struct node *node; -} YYSTYPE; -#define DEFOP 258 -#define STRING 259 - - -extern YYSTYPE yylval; diff --git a/gcc/c-parse.c b/gcc/c-parse.c deleted file mode 100644 index 0c6f3d2b0b7..00000000000 --- a/gcc/c-parse.c +++ /dev/null @@ -1,3859 +0,0 @@ - -/* A Bison parser, made from c-parse.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SCSPEC 260 -#define TYPESPEC 261 -#define TYPE_QUAL 262 -#define CONSTANT 263 -#define STRING 264 -#define ELLIPSIS 265 -#define SIZEOF 266 -#define ENUM 267 -#define STRUCT 268 -#define UNION 269 -#define IF 270 -#define ELSE 271 -#define WHILE 272 -#define DO 273 -#define FOR 274 -#define SWITCH 275 -#define CASE 276 -#define DEFAULT 277 -#define BREAK 278 -#define CONTINUE 279 -#define RETURN 280 -#define GOTO 281 -#define ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define ATTRIBUTE 285 -#define EXTENSION 286 -#define LABEL 287 -#define REALPART 288 -#define IMAGPART 289 -#define ASSIGN 290 -#define OROR 291 -#define ANDAND 292 -#define EQCOMPARE 293 -#define ARITHCOMPARE 294 -#define LSHIFT 295 -#define RSHIFT 296 -#define UNARY 297 -#define PLUSPLUS 298 -#define MINUSMINUS 299 -#define HYPERUNARY 300 -#define POINTSAT 301 -#define INTERFACE 302 -#define IMPLEMENTATION 303 -#define END 304 -#define SELECTOR 305 -#define DEFS 306 -#define ENCODE 307 -#define CLASSNAME 308 -#define PUBLIC 309 -#define PRIVATE 310 -#define PROTECTED 311 -#define PROTOCOL 312 -#define OBJECTNAME 313 -#define CLASS 314 -#define ALIAS 315 -#define OBJC_STRING 316 - -#line 56 "c-parse.y" - -#include <stdio.h> -#include <errno.h> -#include <setjmp.h> - -#include "config.h" -#include "tree.h" -#include "input.h" -#include "c-lex.h" -#include "c-tree.h" -#include "flags.h" - -#ifdef MULTIBYTE_CHARS -#include <stdlib.h> -#include <locale.h> -#endif - - -/* Since parsers are distinct for each language, put the language string - definition here. */ -char *language_string = "GNU C"; - -#ifndef errno -extern int errno; -#endif - -void yyerror (); - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#line 93 "c-parse.y" -typedef union {long itype; tree ttype; enum tree_code code; - char *filename; int lineno; int ends_in_label; } YYSTYPE; -#line 209 "c-parse.y" - -/* Number of statements (loosely speaking) seen so far. */ -static int stmt_count; - -/* Input file and line number of the end of the body of last simple_if; - used by the stmt-rule immediately after simple_if returns. */ -static char *if_stmt_file; -static int if_stmt_line; - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs = NULL_TREE; -static tree prefix_attributes = NULL_TREE; - -/* Stack of saved values of current_declspecs and prefix_attributes. */ -static tree declspec_stack; - -/* 1 if we explained undeclared var errors. */ -static int undeclared_variable_notice; - - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint (); - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 681 -#define YYFLAG -32768 -#define YYNTBASE 84 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 316 ? yytranslate[x] : 238) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 80, 2, 2, 2, 52, 43, 2, 59, - 76, 50, 48, 81, 49, 58, 51, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 38, 77, 2, - 36, 2, 37, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 60, 2, 83, 42, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 82, 41, 78, 79, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 39, 40, 44, 45, 46, 47, 53, 54, 55, 56, - 57, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 1, 3, 4, 7, 8, 12, 14, 16, 22, - 25, 29, 34, 39, 42, 45, 48, 51, 53, 54, - 55, 63, 68, 69, 70, 78, 83, 84, 85, 92, - 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, - 116, 117, 119, 121, 125, 127, 130, 133, 136, 139, - 142, 147, 150, 155, 158, 161, 163, 165, 167, 172, - 173, 181, 183, 187, 191, 195, 199, 203, 207, 211, - 215, 219, 223, 227, 231, 232, 237, 238, 243, 244, - 245, 253, 254, 260, 264, 268, 270, 272, 274, 278, - 282, 283, 288, 293, 298, 302, 306, 309, 312, 314, - 317, 318, 320, 323, 327, 329, 331, 334, 337, 342, - 347, 350, 353, 357, 359, 361, 364, 367, 368, 369, - 374, 379, 383, 387, 390, 393, 396, 399, 403, 404, - 407, 410, 413, 416, 420, 421, 424, 427, 429, 431, - 434, 437, 439, 441, 444, 447, 450, 454, 455, 458, - 460, 462, 464, 469, 474, 476, 478, 480, 482, 486, - 488, 492, 493, 498, 499, 506, 510, 511, 518, 522, - 523, 525, 527, 530, 537, 539, 543, 544, 546, 551, - 558, 563, 565, 567, 569, 571, 573, 574, 579, 581, - 582, 585, 587, 591, 593, 594, 599, 601, 602, 611, - 612, 619, 620, 626, 627, 632, 633, 639, 640, 641, - 647, 648, 649, 655, 657, 659, 663, 667, 672, 676, - 680, 684, 686, 690, 695, 699, 703, 707, 709, 713, - 717, 721, 726, 730, 734, 736, 737, 745, 751, 754, - 755, 763, 769, 772, 773, 782, 783, 791, 794, 795, - 797, 798, 800, 802, 805, 806, 810, 813, 817, 819, - 823, 825, 827, 830, 832, 836, 841, 848, 854, 856, - 860, 862, 864, 868, 871, 874, 875, 877, 879, 882, - 883, 886, 890, 894, 897, 901, 906, 910, 913, 917, - 920, 922, 924, 927, 930, 931, 933, 936, 937, 938, - 940, 942, 945, 949, 951, 954, 957, 964, 970, 976, - 979, 982, 987, 988, 993, 994, 995, 999, 1004, 1008, - 1010, 1012, 1014, 1016, 1019, 1020, 1025, 1027, 1031, 1032, - 1033, 1041, 1047, 1050, 1051, 1052, 1053, 1066, 1067, 1074, - 1077, 1080, 1083, 1087, 1094, 1103, 1114, 1127, 1131, 1136, - 1138, 1140, 1141, 1148, 1152, 1158, 1161, 1164, 1165, 1167, - 1168, 1170, 1171, 1173, 1175, 1179, 1184, 1186, 1190, 1191, - 1194, 1197, 1198, 1203, 1206, 1207, 1209, 1211, 1215, 1217, - 1221, 1226, 1231, 1236, 1241, 1246, 1247, 1250, 1252, 1255, - 1257, 1261, 1263, 1267 -}; - -static const short yyrhs[] = { -1, - 85, 0, 0, 86, 88, 0, 0, 85, 87, 88, - 0, 90, 0, 89, 0, 27, 59, 99, 76, 77, - 0, 237, 88, 0, 122, 136, 77, 0, 129, 122, - 136, 77, 0, 125, 122, 135, 77, 0, 129, 77, - 0, 125, 77, 0, 1, 77, 0, 1, 78, 0, - 77, 0, 0, 0, 125, 122, 165, 91, 116, 92, - 196, 0, 125, 122, 165, 1, 0, 0, 0, 129, - 122, 168, 93, 116, 94, 196, 0, 129, 122, 168, - 1, 0, 0, 0, 122, 168, 95, 116, 96, 196, - 0, 122, 168, 1, 0, 3, 0, 4, 0, 43, - 0, 49, 0, 48, 0, 54, 0, 55, 0, 79, - 0, 80, 0, 101, 0, 0, 101, 0, 107, 0, - 101, 81, 107, 0, 113, 0, 50, 105, 0, 237, - 105, 0, 98, 105, 0, 40, 97, 0, 103, 102, - 0, 103, 59, 183, 76, 0, 104, 102, 0, 104, - 59, 183, 76, 0, 33, 105, 0, 34, 105, 0, - 11, 0, 29, 0, 102, 0, 59, 183, 76, 105, - 0, 0, 59, 183, 76, 82, 106, 150, 78, 0, - 105, 0, 107, 48, 107, 0, 107, 49, 107, 0, - 107, 50, 107, 0, 107, 51, 107, 0, 107, 52, - 107, 0, 107, 46, 107, 0, 107, 47, 107, 0, - 107, 45, 107, 0, 107, 44, 107, 0, 107, 43, - 107, 0, 107, 41, 107, 0, 107, 42, 107, 0, - 0, 107, 40, 108, 107, 0, 0, 107, 39, 109, - 107, 0, 0, 0, 107, 37, 110, 99, 38, 111, - 107, 0, 0, 107, 37, 112, 38, 107, 0, 107, - 36, 107, 0, 107, 35, 107, 0, 3, 0, 8, - 0, 115, 0, 59, 99, 76, 0, 59, 1, 76, - 0, 0, 59, 114, 197, 76, 0, 113, 59, 100, - 76, 0, 113, 60, 99, 83, 0, 113, 58, 97, - 0, 113, 57, 97, 0, 113, 54, 0, 113, 55, - 0, 9, 0, 115, 9, 0, 0, 118, 0, 118, - 10, 0, 202, 203, 119, 0, 117, 0, 191, 0, - 118, 117, 0, 117, 191, 0, 127, 122, 135, 77, - 0, 130, 122, 136, 77, 0, 127, 77, 0, 130, - 77, 0, 202, 203, 124, 0, 120, 0, 191, 0, - 121, 120, 0, 120, 191, 0, 0, 0, 125, 122, - 135, 77, 0, 129, 122, 136, 77, 0, 125, 122, - 159, 0, 129, 122, 162, 0, 125, 77, 0, 129, - 77, 0, 237, 124, 0, 133, 126, 0, 129, 133, - 126, 0, 0, 126, 134, 0, 126, 5, 0, 126, - 143, 0, 133, 128, 0, 130, 133, 128, 0, 0, - 128, 134, 0, 128, 5, 0, 130, 0, 143, 0, - 129, 130, 0, 129, 143, 0, 7, 0, 5, 0, - 130, 7, 0, 130, 5, 0, 133, 132, 0, 185, - 133, 132, 0, 0, 132, 134, 0, 6, 0, 169, - 0, 4, 0, 28, 59, 99, 76, 0, 28, 59, - 183, 76, 0, 6, 0, 7, 0, 169, 0, 138, - 0, 135, 81, 138, 0, 140, 0, 136, 81, 138, - 0, 0, 27, 59, 115, 76, 0, 0, 165, 137, - 142, 36, 139, 148, 0, 165, 137, 142, 0, 0, - 168, 137, 142, 36, 141, 148, 0, 168, 137, 142, - 0, 0, 143, 0, 144, 0, 143, 144, 0, 30, - 59, 59, 145, 76, 76, 0, 146, 0, 145, 81, - 146, 0, 0, 147, 0, 147, 59, 3, 76, 0, - 147, 59, 3, 81, 101, 76, 0, 147, 59, 100, - 76, 0, 97, 0, 5, 0, 6, 0, 7, 0, - 107, 0, 0, 82, 149, 150, 78, 0, 1, 0, - 0, 151, 174, 0, 152, 0, 151, 81, 152, 0, - 107, 0, 0, 82, 153, 150, 78, 0, 1, 0, - 0, 60, 107, 10, 107, 83, 36, 154, 152, 0, - 0, 60, 107, 83, 36, 155, 152, 0, 0, 60, - 107, 83, 156, 152, 0, 0, 97, 38, 157, 152, - 0, 0, 58, 97, 36, 158, 152, 0, 0, 0, - 165, 160, 116, 161, 197, 0, 0, 0, 168, 163, - 116, 164, 197, 0, 166, 0, 168, 0, 59, 166, - 76, 0, 166, 59, 232, 0, 166, 60, 99, 83, - 0, 166, 60, 83, 0, 50, 186, 166, 0, 143, - 123, 166, 0, 4, 0, 167, 59, 232, 0, 167, - 60, 99, 83, 0, 167, 60, 83, 0, 50, 186, - 167, 0, 143, 123, 167, 0, 4, 0, 168, 59, - 232, 0, 59, 168, 76, 0, 50, 186, 168, 0, - 168, 60, 99, 83, 0, 168, 60, 83, 0, 143, - 123, 168, 0, 3, 0, 0, 13, 97, 82, 170, - 176, 78, 142, 0, 13, 82, 176, 78, 142, 0, - 13, 97, 0, 0, 14, 97, 82, 171, 176, 78, - 142, 0, 14, 82, 176, 78, 142, 0, 14, 97, - 0, 0, 12, 97, 82, 172, 181, 175, 78, 142, - 0, 0, 12, 82, 173, 181, 175, 78, 142, 0, - 12, 97, 0, 0, 81, 0, 0, 81, 0, 177, - 0, 177, 178, 0, 0, 177, 178, 77, 0, 177, - 77, 0, 131, 122, 179, 0, 131, 0, 185, 122, - 179, 0, 185, 0, 1, 0, 237, 178, 0, 180, - 0, 179, 81, 180, 0, 202, 203, 165, 142, 0, - 202, 203, 165, 38, 107, 142, 0, 202, 203, 38, - 107, 142, 0, 182, 0, 181, 81, 182, 0, 1, - 0, 97, 0, 97, 36, 107, 0, 131, 184, 0, - 185, 184, 0, 0, 187, 0, 7, 0, 185, 7, - 0, 0, 186, 7, 0, 59, 187, 76, 0, 50, - 186, 187, 0, 50, 186, 0, 187, 59, 225, 0, - 187, 60, 99, 83, 0, 187, 60, 83, 0, 59, - 225, 0, 60, 99, 83, 0, 60, 83, 0, 189, - 0, 205, 0, 189, 205, 0, 189, 191, 0, 0, - 188, 0, 1, 77, 0, 0, 0, 194, 0, 195, - 0, 194, 195, 0, 32, 236, 77, 0, 197, 0, - 1, 197, 0, 82, 78, 0, 82, 192, 193, 121, - 190, 78, 0, 82, 192, 193, 1, 78, 0, 82, - 192, 193, 188, 78, 0, 199, 204, 0, 199, 1, - 0, 15, 59, 99, 76, 0, 0, 18, 201, 204, - 17, 0, 0, 0, 202, 203, 207, 0, 202, 203, - 218, 204, 0, 202, 203, 206, 0, 207, 0, 218, - 0, 197, 0, 215, 0, 99, 77, 0, 0, 198, - 16, 208, 204, 0, 198, 0, 198, 16, 1, 0, - 0, 0, 17, 209, 59, 99, 76, 210, 204, 0, - 200, 59, 99, 76, 77, 0, 200, 1, 0, 0, - 0, 0, 19, 59, 220, 77, 211, 220, 77, 212, - 220, 76, 213, 204, 0, 0, 20, 59, 99, 76, - 214, 204, 0, 23, 77, 0, 24, 77, 0, 25, - 77, 0, 25, 99, 77, 0, 27, 219, 59, 99, - 76, 77, 0, 27, 219, 59, 99, 38, 221, 76, - 77, 0, 27, 219, 59, 99, 38, 221, 38, 221, - 76, 77, 0, 27, 219, 59, 99, 38, 221, 38, - 221, 38, 224, 76, 77, 0, 26, 97, 77, 0, - 26, 50, 99, 77, 0, 77, 0, 216, 0, 0, - 19, 59, 113, 76, 217, 204, 0, 21, 107, 38, - 0, 21, 107, 10, 107, 38, 0, 22, 38, 0, - 97, 38, 0, 0, 7, 0, 0, 99, 0, 0, - 222, 0, 223, 0, 222, 81, 223, 0, 9, 59, - 99, 76, 0, 115, 0, 224, 81, 115, 0, 0, - 226, 227, 0, 229, 76, 0, 0, 230, 77, 228, - 227, 0, 1, 76, 0, 0, 10, 0, 230, 0, - 230, 81, 10, 0, 231, 0, 230, 81, 231, 0, - 125, 122, 167, 142, 0, 125, 122, 168, 142, 0, - 125, 122, 184, 142, 0, 129, 122, 168, 142, 0, - 129, 122, 184, 142, 0, 0, 233, 234, 0, 227, - 0, 235, 76, 0, 3, 0, 235, 81, 3, 0, - 97, 0, 236, 81, 97, 0, 31, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 236, 241, 255, 257, 257, 258, 260, 262, 263, 271, - 275, 286, 291, 296, 298, 300, 301, 302, 307, 314, - 316, 321, 326, 332, 334, 339, 344, 350, 352, 357, - 364, 366, 369, 371, 373, 375, 377, 379, 381, 385, - 389, 392, 395, 398, 402, 404, 407, 410, 414, 442, - 448, 451, 454, 457, 459, 463, 467, 471, 473, 476, - 480, 507, 509, 511, 513, 515, 517, 519, 521, 523, - 525, 527, 529, 531, 533, 537, 539, 543, 545, 548, - 552, 554, 561, 564, 567, 573, 672, 673, 675, 681, - 683, 697, 720, 722, 724, 728, 734, 736, 741, 743, - 748, 750, 751, 761, 766, 768, 769, 770, 777, 783, - 788, 791, 799, 804, 806, 807, 808, 815, 826, 830, - 836, 841, 846, 851, 853, 855, 864, 867, 871, 873, - 875, 880, 884, 887, 891, 894, 896, 908, 911, 913, - 915, 919, 923, 925, 928, 941, 944, 948, 950, 958, - 959, 960, 964, 966, 972, 973, 974, 977, 979, 982, - 984, 987, 990, 996, 1003, 1005, 1012, 1019, 1022, 1029, - 1032, 1036, 1039, 1043, 1048, 1051, 1055, 1058, 1060, 1062, - 1064, 1071, 1073, 1074, 1075, 1080, 1082, 1087, 1095, 1100, - 1104, 1107, 1109, 1114, 1117, 1119, 1121, 1125, 1128, 1128, - 1131, 1131, 1134, 1134, 1137, 1137, 1140, 1142, 1153, 1161, - 1165, 1176, 1184, 1191, 1193, 1198, 1201, 1206, 1208, 1210, - 1217, 1219, 1227, 1233, 1235, 1237, 1244, 1246, 1252, 1258, - 1260, 1262, 1264, 1271, 1273, 1276, 1281, 1283, 1287, 1289, - 1291, 1293, 1297, 1299, 1302, 1305, 1308, 1311, 1315, 1317, - 1320, 1322, 1326, 1329, 1334, 1336, 1338, 1352, 1359, 1364, - 1370, 1375, 1377, 1382, 1384, 1388, 1392, 1396, 1406, 1408, - 1413, 1418, 1421, 1425, 1428, 1432, 1435, 1438, 1441, 1445, - 1448, 1452, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, - 1480, 1488, 1490, 1492, 1496, 1498, 1501, 1504, 1515, 1517, - 1522, 1524, 1527, 1541, 1544, 1547, 1549, 1557, 1565, 1576, - 1581, 1584, 1597, 1605, 1609, 1613, 1617, 1623, 1627, 1632, - 1635, 1640, 1643, 1644, 1661, 1666, 1669, 1681, 1683, 1693, - 1703, 1704, 1712, 1715, 1727, 1731, 1748, 1758, 1767, 1772, - 1777, 1782, 1786, 1790, 1801, 1808, 1815, 1822, 1833, 1839, - 1842, 1847, 1870, 1904, 1929, 1960, 1975, 1986, 1990, 1994, - 1997, 2002, 2004, 2007, 2009, 2013, 2018, 2021, 2027, 2032, - 2037, 2039, 2048, 2049, 2055, 2057, 2067, 2069, 2073, 2076, - 2082, 2092, 2101, 2110, 2120, 2134, 2139, 2144, 2146, 2155, - 2158, 2163, 2166, 2170 -}; - -static const char * const yytname[] = { "$","error","$undefined.","IDENTIFIER", -"TYPENAME","SCSPEC","TYPESPEC","TYPE_QUAL","CONSTANT","STRING","ELLIPSIS","SIZEOF", -"ENUM","STRUCT","UNION","IF","ELSE","WHILE","DO","FOR","SWITCH","CASE","DEFAULT", -"BREAK","CONTINUE","RETURN","GOTO","ASM_KEYWORD","TYPEOF","ALIGNOF","ATTRIBUTE", -"EXTENSION","LABEL","REALPART","IMAGPART","ASSIGN","'='","'?'","':'","OROR", -"ANDAND","'|'","'^'","'&'","EQCOMPARE","ARITHCOMPARE","LSHIFT","RSHIFT","'+'", -"'-'","'*'","'/'","'%'","UNARY","PLUSPLUS","MINUSMINUS","HYPERUNARY","POINTSAT", -"'.'","'('","'['","INTERFACE","IMPLEMENTATION","END","SELECTOR","DEFS","ENCODE", -"CLASSNAME","PUBLIC","PRIVATE","PROTECTED","PROTOCOL","OBJECTNAME","CLASS","ALIAS", -"OBJC_STRING","')'","';'","'}'","'~'","'!'","','","'{'","']'","program","extdefs", -"@1","@2","extdef","datadef","fndef","@3","@4","@5","@6","@7","@8","identifier", -"unop","expr","exprlist","nonnull_exprlist","unary_expr","sizeof","alignof", -"cast_expr","@9","expr_no_commas","@10","@11","@12","@13","@14","primary","@15", -"string","old_style_parm_decls","lineno_datadecl","datadecls","datadecl","lineno_decl", -"decls","setspecs","setattrs","decl","typed_declspecs","reserved_declspecs", -"typed_declspecs_no_prefix_attr","reserved_declspecs_no_prefix_attr","declmods", -"declmods_no_prefix_attr","typed_typespecs","reserved_typespecquals","typespec", -"typespecqual_reserved","initdecls","notype_initdecls","maybeasm","initdcl", -"@16","notype_initdcl","@17","maybe_attribute","attributes","attribute","attribute_list", -"attrib","any_word","init","@18","initlist_maybe_comma","initlist1","initelt", -"@19","@20","@21","@22","@23","@24","nested_function","@25","@26","notype_nested_function", -"@27","@28","declarator","after_type_declarator","parm_declarator","notype_declarator", -"structsp","@29","@30","@31","@32","maybecomma","maybecomma_warn","component_decl_list", -"component_decl_list2","component_decl","components","component_declarator", -"enumlist","enumerator","typename","absdcl","nonempty_type_quals","type_quals", -"absdcl1","stmts","lineno_stmt_or_labels","xstmts","errstmt","pushlevel","maybe_label_decls", -"label_decls","label_decl","compstmt_or_error","compstmt","simple_if","if_prefix", -"do_stmt_start","@33","save_filename","save_lineno","lineno_labeled_stmt","lineno_stmt_or_label", -"stmt_or_label","stmt","@34","@35","@36","@37","@38","@39","@40","all_iter_stmt", -"all_iter_stmt_simple","@41","label","maybe_type_qual","xexpr","asm_operands", -"nonnull_asm_operands","asm_operand","asm_clobbers","parmlist","@42","parmlist_1", -"@43","parmlist_2","parms","parm","parmlist_or_identifiers","@44","parmlist_or_identifiers_1", -"identifiers","identifiers_or_typenames","extension","" -}; -#endif - -static const short yyr1[] = { 0, - 84, 84, 86, 85, 87, 85, 88, 88, 88, 88, - 89, 89, 89, 89, 89, 89, 89, 89, 91, 92, - 90, 90, 93, 94, 90, 90, 95, 96, 90, 90, - 97, 97, 98, 98, 98, 98, 98, 98, 98, 99, - 100, 100, 101, 101, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 103, 104, 105, 105, 106, - 105, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 108, 107, 109, 107, 110, 111, - 107, 112, 107, 107, 107, 113, 113, 113, 113, 113, - 114, 113, 113, 113, 113, 113, 113, 113, 115, 115, - 116, 116, 116, 117, 118, 118, 118, 118, 119, 119, - 119, 119, 120, 121, 121, 121, 121, 122, 123, 124, - 124, 124, 124, 124, 124, 124, 125, 125, 126, 126, - 126, 126, 127, 127, 128, 128, 128, 129, 129, 129, - 129, 130, 130, 130, 130, 131, 131, 132, 132, 133, - 133, 133, 133, 133, 134, 134, 134, 135, 135, 136, - 136, 137, 137, 139, 138, 138, 141, 140, 140, 142, - 142, 143, 143, 144, 145, 145, 146, 146, 146, 146, - 146, 147, 147, 147, 147, 148, 149, 148, 148, 150, - 150, 151, 151, 152, 153, 152, 152, 154, 152, 155, - 152, 156, 152, 157, 152, 158, 152, 160, 161, 159, - 163, 164, 162, 165, 165, 166, 166, 166, 166, 166, - 166, 166, 167, 167, 167, 167, 167, 167, 168, 168, - 168, 168, 168, 168, 168, 170, 169, 169, 169, 171, - 169, 169, 169, 172, 169, 173, 169, 169, 174, 174, - 175, 175, 176, 176, 177, 177, 177, 178, 178, 178, - 178, 178, 178, 179, 179, 180, 180, 180, 181, 181, - 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, - 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 188, 189, 189, 189, 190, 190, 191, 192, 193, 193, - 194, 194, 195, 196, 196, 197, 197, 197, 197, 198, - 198, 199, 201, 200, 202, 203, 204, 204, 205, 206, - 206, 207, 207, 207, 208, 207, 207, 207, 209, 210, - 207, 207, 207, 211, 212, 213, 207, 214, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 215, 217, 216, 218, 218, 218, 218, 219, 219, 220, - 220, 221, 221, 222, 222, 223, 224, 224, 226, 225, - 227, 228, 227, 227, 229, 229, 229, 229, 230, 230, - 231, 231, 231, 231, 231, 233, 232, 234, 234, 235, - 235, 236, 236, 237 -}; - -static const short yyr2[] = { 0, - 0, 1, 0, 2, 0, 3, 1, 1, 5, 2, - 3, 4, 4, 2, 2, 2, 2, 1, 0, 0, - 7, 4, 0, 0, 7, 4, 0, 0, 6, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 3, 1, 2, 2, 2, 2, 2, - 4, 2, 4, 2, 2, 1, 1, 1, 4, 0, - 7, 1, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 0, 4, 0, 4, 0, 0, - 7, 0, 5, 3, 3, 1, 1, 1, 3, 3, - 0, 4, 4, 4, 3, 3, 2, 2, 1, 2, - 0, 1, 2, 3, 1, 1, 2, 2, 4, 4, - 2, 2, 3, 1, 1, 2, 2, 0, 0, 4, - 4, 3, 3, 2, 2, 2, 2, 3, 0, 2, - 2, 2, 2, 3, 0, 2, 2, 1, 1, 2, - 2, 1, 1, 2, 2, 2, 3, 0, 2, 1, - 1, 1, 4, 4, 1, 1, 1, 1, 3, 1, - 3, 0, 4, 0, 6, 3, 0, 6, 3, 0, - 1, 1, 2, 6, 1, 3, 0, 1, 4, 6, - 4, 1, 1, 1, 1, 1, 0, 4, 1, 0, - 2, 1, 3, 1, 0, 4, 1, 0, 8, 0, - 6, 0, 5, 0, 4, 0, 5, 0, 0, 5, - 0, 0, 5, 1, 1, 3, 3, 4, 3, 3, - 3, 1, 3, 4, 3, 3, 3, 1, 3, 3, - 3, 4, 3, 3, 1, 0, 7, 5, 2, 0, - 7, 5, 2, 0, 8, 0, 7, 2, 0, 1, - 0, 1, 1, 2, 0, 3, 2, 3, 1, 3, - 1, 1, 2, 1, 3, 4, 6, 5, 1, 3, - 1, 1, 3, 2, 2, 0, 1, 1, 2, 0, - 2, 3, 3, 2, 3, 4, 3, 2, 3, 2, - 1, 1, 2, 2, 0, 1, 2, 0, 0, 1, - 1, 2, 3, 1, 2, 2, 6, 5, 5, 2, - 2, 4, 0, 4, 0, 0, 3, 4, 3, 1, - 1, 1, 1, 2, 0, 4, 1, 3, 0, 0, - 7, 5, 2, 0, 0, 0, 12, 0, 6, 2, - 2, 2, 3, 6, 8, 10, 12, 3, 4, 1, - 1, 0, 6, 3, 5, 2, 2, 0, 1, 0, - 1, 0, 1, 1, 3, 4, 1, 3, 0, 2, - 2, 0, 4, 2, 0, 1, 1, 3, 1, 3, - 4, 4, 4, 4, 4, 0, 2, 1, 2, 1, - 3, 1, 3, 1 -}; - -static const short yydefact[] = { 3, - 5, 0, 0, 0, 152, 143, 150, 142, 0, 0, - 0, 0, 0, 0, 394, 18, 4, 8, 7, 0, - 118, 118, 138, 129, 139, 172, 151, 0, 6, 16, - 17, 31, 32, 246, 248, 255, 239, 255, 243, 0, - 0, 0, 235, 280, 0, 0, 160, 119, 0, 15, - 0, 14, 0, 140, 129, 141, 145, 144, 127, 173, - 10, 0, 244, 0, 0, 236, 0, 240, 86, 87, - 99, 56, 57, 0, 0, 0, 33, 35, 34, 0, - 36, 37, 0, 38, 39, 0, 0, 40, 58, 0, - 0, 62, 43, 45, 88, 0, 278, 0, 276, 148, - 0, 276, 177, 0, 0, 11, 0, 0, 30, 0, - 386, 0, 0, 170, 222, 280, 0, 0, 158, 119, - 0, 214, 215, 0, 0, 128, 131, 155, 156, 130, - 132, 157, 271, 272, 251, 269, 0, 170, 262, 257, - 118, 254, 118, 0, 255, 170, 255, 54, 55, 49, - 46, 0, 0, 0, 0, 48, 0, 0, 0, 50, - 0, 52, 0, 0, 79, 77, 75, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 98, 0, 0, 41, 0, 100, 47, 153, 280, 369, - 0, 274, 277, 146, 154, 279, 148, 275, 183, 184, - 185, 182, 0, 175, 178, 281, 231, 230, 161, 162, - 234, 0, 229, 0, 233, 0, 0, 28, 0, 315, - 106, 316, 169, 171, 0, 0, 13, 0, 0, 22, - 0, 170, 386, 0, 12, 26, 0, 0, 252, 0, - 251, 238, 315, 256, 315, 263, 0, 242, 0, 90, - 89, 298, 0, 0, 9, 44, 0, 0, 85, 84, - 0, 0, 0, 0, 73, 74, 72, 71, 70, 68, - 69, 63, 64, 65, 66, 67, 96, 95, 0, 42, - 0, 284, 0, 288, 0, 290, 0, 369, 0, 149, - 147, 0, 177, 41, 0, 0, 390, 376, 118, 118, - 388, 0, 377, 379, 387, 0, 232, 297, 0, 108, - 103, 107, 0, 167, 220, 216, 159, 221, 20, 166, - 217, 219, 0, 24, 273, 270, 170, 0, 258, 264, - 316, 260, 170, 170, 306, 299, 92, 60, 59, 51, - 53, 0, 0, 78, 76, 93, 94, 283, 282, 370, - 289, 285, 287, 0, 174, 176, 86, 0, 163, 374, - 276, 276, 371, 372, 0, 389, 0, 0, 29, 304, - 104, 118, 118, 135, 0, 0, 164, 218, 0, 247, - 170, 315, 0, 237, 241, 0, 0, 300, 301, 0, - 80, 83, 286, 179, 0, 181, 228, 280, 369, 119, - 170, 170, 170, 280, 170, 170, 0, 378, 380, 391, - 305, 111, 0, 112, 0, 135, 133, 189, 187, 186, - 168, 21, 0, 25, 245, 265, 0, 170, 392, 0, - 0, 0, 315, 0, 0, 115, 316, 292, 302, 197, - 86, 0, 0, 195, 0, 194, 0, 249, 192, 0, - 0, 284, 0, 386, 0, 381, 382, 383, 284, 384, - 385, 373, 0, 0, 162, 134, 137, 136, 0, 165, - 170, 0, 266, 303, 0, 308, 117, 116, 296, 0, - 309, 294, 316, 293, 0, 0, 0, 0, 204, 61, - 0, 191, 81, 180, 226, 280, 227, 223, 225, 0, - 109, 110, 0, 268, 170, 393, 307, 0, 152, 0, - 329, 313, 0, 0, 0, 0, 0, 0, 0, 0, - 358, 350, 0, 0, 113, 118, 118, 322, 327, 0, - 0, 319, 320, 323, 351, 321, 0, 206, 0, 202, - 0, 0, 193, 0, 224, 188, 267, 0, 0, 315, - 360, 0, 0, 356, 340, 341, 342, 0, 0, 0, - 359, 0, 357, 324, 124, 0, 125, 0, 0, 311, - 316, 310, 333, 0, 126, 0, 0, 200, 0, 196, - 205, 0, 0, 0, 361, 45, 0, 0, 0, 354, - 343, 0, 348, 0, 0, 122, 208, 0, 123, 211, - 328, 315, 0, 0, 207, 0, 0, 203, 312, 0, - 314, 352, 334, 338, 0, 349, 0, 120, 0, 121, - 0, 326, 317, 315, 0, 198, 201, 330, 315, 360, - 315, 355, 362, 0, 209, 212, 318, 332, 0, 315, - 353, 0, 339, 0, 0, 363, 364, 344, 0, 0, - 199, 331, 335, 0, 362, 0, 0, 210, 213, 360, - 0, 0, 345, 365, 0, 366, 0, 0, 336, 367, - 0, 346, 315, 0, 0, 337, 347, 368, 0, 0, - 0 -}; - -static const short yydefgoto[] = { 679, - 1, 2, 3, 17, 18, 19, 231, 376, 237, 379, - 113, 309, 445, 86, 153, 279, 88, 89, 90, 91, - 92, 390, 93, 264, 263, 261, 450, 262, 94, 154, - 95, 218, 219, 220, 371, 432, 433, 20, 108, 525, - 299, 59, 372, 417, 300, 23, 99, 194, 24, 130, - 118, 46, 114, 119, 423, 47, 375, 223, 224, 26, - 203, 204, 205, 421, 469, 447, 448, 449, 488, 639, - 607, 579, 542, 576, 596, 619, 649, 599, 621, 650, - 210, 122, 495, 123, 27, 145, 147, 137, 62, 492, - 240, 64, 65, 142, 329, 330, 135, 136, 101, 192, - 102, 104, 193, 434, 435, 480, 221, 336, 387, 388, - 389, 369, 370, 529, 530, 531, 550, 571, 313, 572, - 438, 532, 533, 602, 549, 640, 630, 660, 673, 631, - 534, 535, 629, 536, 562, 587, 645, 646, 647, 671, - 284, 285, 301, 407, 302, 303, 304, 213, 214, 305, - 306, 430, 96 -}; - -static const short yypact[] = { 90, - 99, 588, 588, 321,-32768,-32768,-32768,-32768, 77, 79, - 85, 49, 75, 87,-32768,-32768,-32768,-32768,-32768, 194, - 37, 2116, 245,-32768, 119,-32768,-32768, 588,-32768,-32768, --32768,-32768,-32768,-32768, 111,-32768, 133,-32768, 143, 1958, - 1892, 179,-32768,-32768, 194, 164,-32768, 119, 1352,-32768, - 457,-32768, 194, 245,-32768, 119,-32768,-32768, 404,-32768, --32768, 267,-32768, 181, 419,-32768, 201,-32768,-32768,-32768, --32768,-32768,-32768, 1958, 1958, 397,-32768,-32768,-32768, 1958, --32768,-32768, 848,-32768,-32768, 1958, 227, 229,-32768, 1985, - 2012,-32768, 2202, 1091, 299, 1958,-32768, 240, 204,-32768, - 242, 1002, 699, 441, 172,-32768, 457, 194,-32768, 264, --32768, 1427, 360, 119,-32768,-32768, 457, 217,-32768, 119, - 724, 344, 392, 220, 1412, 404,-32768,-32768,-32768,-32768, - 119,-32768,-32768, 292, 250,-32768, 267, 119,-32768,-32768, - 381, 300, 313, 822,-32768, 119,-32768,-32768,-32768,-32768, --32768, 317, 320, 326, 343,-32768, 347, 1958, 848,-32768, - 848,-32768, 1958, 1958, 390,-32768,-32768, 1958, 1958, 1958, - 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958,-32768, --32768, 397, 397, 1958, 1958,-32768,-32768,-32768,-32768, 204, - 1487,-32768, 442, 277,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 106,-32768, 371,-32768, 392,-32768,-32768, 408, - 392, 434,-32768, 636,-32768, 358, 372,-32768, 268, 59, --32768,-32768, 433, 119, 226, 346,-32768, 457, 457,-32768, - 360, 119,-32768, 1500,-32768,-32768, 360, 1958, 397, 387, - 250,-32768,-32768,-32768,-32768,-32768, 394,-32768, 396,-32768, --32768, 399, 405, 1781,-32768, 2202, 407, 410, 2202, 2202, - 1958, 455, 1958, 1958, 1751, 578, 1357, 607, 873, 707, - 707, 303, 303,-32768,-32768,-32768,-32768,-32768, 422, 229, - 412, 56, 429,-32768, 904,-32768, 421,-32768, 1553,-32768, - 277, 430, 699, 2039, 57, 449,-32768,-32768,-32768, 1709, --32768, 453, 265,-32768,-32768, 115,-32768,-32768, 55,-32768, --32768,-32768, 1083,-32768, 344,-32768,-32768, 344,-32768, 494, --32768,-32768, 452,-32768, 2202,-32768, 119, 458, 451,-32768, --32768, 451, 119, 119,-32768, 510,-32768,-32768,-32768,-32768, --32768, 507, 1958, 2231, 2243,-32768,-32768, 442,-32768,-32768, --32768,-32768,-32768, 464,-32768,-32768, 124, 474,-32768,-32768, - 309, 67,-32768,-32768, 1679,-32768, 549, 326,-32768,-32768, --32768, 476, 450,-32768, 1341, 55,-32768,-32768, 55,-32768, - 119,-32768, 333,-32768,-32768, 397, 942, 510,-32768, 1161, --32768, 2218,-32768,-32768, 1958,-32768,-32768,-32768, 67, 119, - 144, 160, 119,-32768, 160, 119, 904,-32768,-32768,-32768, --32768,-32768, 457,-32768, 194,-32768, 887,-32768,-32768, 2202, --32768,-32768, 1341,-32768,-32768,-32768, 1958, 130,-32768, 266, - 432, 667, 479, 481, 760,-32768,-32768,-32768,-32768,-32768, - 522, 397, 1958,-32768, 526, 2202, 487, 497,-32768, 1958, - 132, 207, 601,-32768, 1566,-32768,-32768,-32768, 176,-32768, --32768,-32768, 279, 281, 52, 887,-32768,-32768, 1161,-32768, - 2166, 1958,-32768,-32768, 397,-32768,-32768,-32768,-32768, 501, --32768,-32768,-32768,-32768, 1647, 545, 2064, 1161,-32768,-32768, - 1221,-32768, 2218,-32768, 454,-32768, 454,-32768,-32768, 500, --32768,-32768, 506,-32768, 2166,-32768,-32768, 1727, 547, 527, --32768,-32768, 529, 537, 1958, 559, 533, 536, 1905, 89, - 592,-32768, 565, 540,-32768, 555, 2120,-32768, 590, 1024, - 60,-32768,-32768,-32768,-32768,-32768, 1838,-32768, 1958, 597, - 557, 1281,-32768, 813,-32768,-32768,-32768, 1958, 585,-32768, - 1958, 1958, 2135,-32768,-32768,-32768,-32768, 568, 1958, 586, --32768, 608,-32768,-32768,-32768, 457,-32768, 194, 1104,-32768, --32768,-32768,-32768, 1958,-32768, 1281, 2117,-32768, 1281,-32768, --32768, 593, 1958, 666,-32768, 275, 622, 632, 1958,-32768, --32768, 637,-32768, 1958, 301,-32768, 108, 308,-32768, 1033, --32768,-32768, 1727, 633,-32768, 677, 1281,-32768,-32768, 642, --32768,-32768,-32768,-32768, 2184,-32768, 26,-32768, 360,-32768, - 360,-32768,-32768,-32768, 643,-32768,-32768,-32768,-32768, 1958, --32768,-32768, 710, 646,-32768,-32768,-32768,-32768, 1281,-32768, --32768, 647,-32768, 668, 47, 651,-32768,-32768, 326, 326, --32768,-32768,-32768, 1958, 710, 656, 710,-32768,-32768, 1958, - 658, 48,-32768,-32768, 659,-32768, 434, 662,-32768, 299, - 146,-32768,-32768, 663, 434,-32768,-32768, 299, 742, 743, --32768 -}; - -static const short yypgoto[] = {-32768, --32768,-32768,-32768, 153,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, -5,-32768, -40, 456, -137, 427,-32768,-32768, - -55,-32768, 398,-32768,-32768,-32768,-32768,-32768, 197,-32768, - -191, -207, 542,-32768,-32768, 332,-32768, 22, -98, 216, - 0, 711,-32768, 351, 7, -7, -15, 573, 11, -171, - -365, -45, -107, -52,-32768,-32768,-32768, 206, 14, 53, --32768, 483,-32768, 349,-32768, -411,-32768, -384,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - -38, -63, -310, -13, -30,-32768,-32768,-32768,-32768,-32768, - 551, 24,-32768, 630, 550, 414, 653, 558, 27, -57, - 3, -89, -152, 365,-32768,-32768, -170,-32768,-32768,-32768, - 411, -292, -128,-32768,-32768,-32768,-32768, -95, -285, -422, - 367,-32768, 208,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 209,-32768, -555, 149,-32768, 150,-32768, - 525,-32768, -232,-32768,-32768,-32768, 459, -194,-32768,-32768, --32768,-32768, 9 -}; - - -#define YYLAST 2295 - - -static const short yytable[] = { 87, - 98, 21, 21, 35, 37, 39, 49, 124, 22, 22, - 28, 28, 121, 232, 54, 25, 25, 222, 148, 149, - 295, 229, 290, 319, 151, 253, 225, 21, 132, 324, - 156, 105, 55, 48, 22, 56, 28, 283, 321, 125, - 187, 25, 51, 53, 198, 383, 280, 463, 310, 141, - 401, 100, 350, 226, 209, 368, 134, 503, 48, -102, - 573, 67, 206, 633, 120, 186, 48, 143, 311, 43, - 150, 216, 131, 144, 642, 100, 541, 60, 110, 32, - 33, 32, 33, 422, 655, 667, 424, 32, 33, -1, - 207, 32, 33, 100, 211, 132, 14, 202, -2, 282, - 60, 634, 232, 105, 665, 189, 543, 40, 60, 155, - 111, 112, 197, 50, 190, 191, 404, 48, 574, 290, - 120, 48, 656, 668, 222, 399, 191, 584, 141, 348, - 120, 134, 359, 41, 110, 222, 252, -162, 559, 131, - -102, 222, 497, -162, 281, 42, 143, 331, 14, 331, - 287, 485, 144, 197, 100, 29, 280, 581, 34, 14, - 36, 315, 243, 132, 245, 318, 38, 472, 247, 100, - 249, 100, 60, 14, 462, 317, 277, 278, 43, 622, - 61, 292, 206, 60, -162, 257, 293, 258, -162, 14, - 366, 605, 63, 323, 608, 367, 43, 508, 339, 394, - 595, 637, 454, 455, 395, 14, 641, 494, 643, 43, - 397, 207, 158, 206, 66, 211, 436, 652, 111, 112, - 342, 674, 627, 14, 68, 404, 675, 25, 43, 115, - 111, 112, 206, 134, 399, 191, 14, 103, 120, 411, - 106, 120, 120, 44, 107, 468, 283, 208, 354, 57, - 676, 58, 45, 189, 651, 14, 398, 451, 138, 498, - 132, 477, 190, 191, 482, 399, 191, 133, 217, 32, - 33, -105, -105, -105, -105, 116, 60, -105, 146, -105, - -105, -105, 128, 129, 117, 603, 331, 202, 9, 10, - 11, 437, 54, 227, 468, -105, 235, 228, 25, 348, - 107, 453, 157, 403, 406, 373, 348, 186, 452, 158, - 55, 43, 397, 56, 459, 188, 5, 195, 7, 196, - 361, 362, 212, 374, 9, 10, 11, 238, 180, 181, - 239, 182, 183, 184, 185, 43, 115, 437, 14, 483, - 13, 364, 474, 242, 428, 365, 475, 402, 405, -105, - 612, 248, 177, 178, 179, 501, 528, 502, 398, 228, - 217, 107, 14, -315, -315, -315, -315, 399, 191, 464, - 427, -315, -315, -315, 400, 48, 244, 618, 25, 528, - 429, 228, 116, 416, 620, 105, 132, -315, 107, -261, - -261, 117, 250, 413, 415, 251, 120, 30, 31, 32, - 33, 465, 233, 234, 233, 234, 544, 252, 127, 128, - 129, 635, 48, 636, 500, 9, 10, 11, 254, 139, - 25, 316, 5, 255, 7, 97, 120, -82, 48, 294, - 9, 10, 11, 14, 110, 132, 486, 320, 207, 211, - 307, -101, 71, 43, 524, 207, 13, 206, 308, 15, - 111, 112, 60, 5, 57, 7, 58, -259, -259, 43, - 115, 9, 10, 11, 327, 400, 400, 524, 314, 506, - 14, 333, 48, 334, 528, 670, 335, 13, 558, 523, - 337, 187, 340, 678, 526, 341, 14, 288, 289, 232, - 44, 527, 343, 537, 347, 140, -253, 346, 25, 45, - 288, 289, 523, 351, 349, 355, 116, 582, 308, 476, - 585, 588, 454, 455, 560, 117, 160, 162, 592, 54, - 658, 659, 598, 222, 360, 222, 414, 597, 363, 377, - 207, 382, 380, 604, 378, 381, 526, 55, 384, 385, - 56, 386, 610, 527, 391, 537, 393, 566, 568, 396, - 25, 410, 412, 617, 600, 256, -295, 400, 481, -31, - 259, 260, 524, 489, 490, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 491, 507, 120, - 538, 48, 545, 546, -32, 548, 425, 551, 4, 585, - -118, 5, 6, 7, 8, 552, 554, 523, 561, 9, - 10, 11, 563, 43, 397, 569, 456, 457, 458, 555, - 460, 461, 556, 661, 12, 13, 564, 14, 15, 585, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 14, 565, 578, 473, 580, 325, 296, -118, 297, 5, - 6, 7, 8, 583, 591, 298, -118, 9, 10, 11, - 496, 172, 173, 174, 175, 176, 177, 178, 179, 45, - 344, 345, 593, 13, 16, 14, 594, 217, 609, -114, - -114, -114, -114, -114, -114, -114, 504, -114, -114, -114, - -114, -114, 611, -114, -114, -114, -114, -114, -114, -114, - -114, -114, -114, -114, -114, -114, -114, -114, 613, -114, - -114, 32, 33, 199, 200, 201, -114, 614, 625, -114, - 547, -375, 626, 616, -114, -114, -114, 628, 644, 638, - -114, -114, 648, 653, 230, -114, 654, -19, -19, -19, - -19, 657, 663, 666, 669, -19, -19, -19, 672, 677, - 392, 680, 681, -114, -114, -114, -114, 586, -114, 358, - 110, -19, 575, -162, 175, 176, 177, 178, 179, -162, - 217, 312, -315, -315, 478, 126, 466, -315, -315, 291, - -315, 470, 420, 246, -315, 356, -315, -315, -315, -315, - -315, -315, -315, -315, -315, -315, -315, 446, -315, 241, - -315, 328, -315, -315, 332, 426, 326, 479, 439, -315, - -162, 484, -315, 662, -162, -19, 664, -315, -315, -315, - 623, 624, 352, -315, -315, 43, 397, 0, -315, 206, - 420, 0, 139, 409, 471, 5, 0, 7, 97, 0, - 0, 0, 0, 9, 10, 11, -315, -291, -315, -315, - 487, -315, 14, 0, 0, 0, 0, 493, 152, 13, - 69, 5, 15, 7, 97, 70, 71, 0, 72, 9, - 10, 11, 496, 0, 0, 0, 446, 0, 0, 505, - 0, 45, 0, 0, 0, 13, 73, 0, 15, 0, - 74, 75, 0, 0, 0, 446, 0, 76, 446, 0, - 77, 467, 128, 129, 0, 78, 79, 80, 9, 10, - 11, 81, 82, 0, 296, 0, 83, 5, 6, 7, - 8, 0, 553, 298, 0, 9, 10, 11, 173, 174, - 175, 176, 177, 178, 179, 0, 84, 85, 0, -91, - 0, 13, 0, 14, 0, 0, 577, 0, 0, 446, - 0, 0, 431, 0, -315, -315, -315, -315, -315, -315, - -315, 0, -315, -315, -315, -315, -315, 0, -315, -315, - -315, -315, -315, -315, -315, -315, -315, -315, -315, -315, - -315, -315, -315, 446, -315, -315, 446, 0, 0, -375, - 0, -315, 0, 0, -315, 0, 615, 0, 0, -315, - -315, -315, 0, 0, 0, -315, -315, 0, 0, 0, - -315, 0, 0, 0, 446, 5, 0, 7, 196, 0, - 0, 0, 0, 9, 10, 11, 0, 0, -315, 0, - -315, -315, 0, -315, 570, 0, -315, -315, 0, 13, - 0, -315, -315, 0, -315, 0, 446, 0, -315, 0, - -315, -315, -315, -315, -315, -315, -315, -315, -315, -315, - -315, 189, -315, 0, -315, 0, -315, -315, 0, 110, - 190, 191, -162, -315, 0, 0, -315, 0, -162, 0, - 0, -315, -315, -315, 0, 0, 0, -315, -315, 0, - 0, 0, -315, 0, 0, 0, 5, 6, 7, 8, - 0, 111, 112, 0, 9, 10, 11, 0, 0, 0, - -315, 0, -315, -315, 601, -315, -325, -325, 0, -162, - 13, -325, -325, -162, -325, 0, 0, 0, -325, 0, - -325, -325, -325, -325, -325, -325, -325, -325, -325, -325, - -325, 0, -325, 0, -325, 0, -325, -325, 0, 0, - 0, 0, 0, -325, 180, 181, -325, 182, 183, 184, - 185, -325, -325, -325, 0, 0, 0, -325, -325, 0, - 0, 440, -325, 441, 33, 0, 0, 0, 70, 71, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, - -325, 0, -325, -325, 0, -325, 0, 0, 0, 73, - 0, 15, 0, 74, 75, 0, 0, 0, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 0, 78, 79, - 80, 0, 0, 0, 81, 82, 0, 0, 442, 83, - 443, 440, 0, 441, 33, 0, 0, 0, 70, 71, - 0, 72, 0, 0, 0, 0, 0, 0, -190, 84, - 85, 0, 444, 0, 0, 0, 0, 0, 0, 73, - 0, 15, 0, 74, 75, 0, 0, 0, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 0, 78, 79, - 80, 0, 0, 0, 81, 82, 0, 0, 442, 83, - 443, 440, 0, 441, 33, 0, 0, 0, 70, 71, - 0, 72, 0, 0, 0, 0, 0, 0, -250, 84, - 85, 0, 444, 0, 0, 0, 0, 0, 0, 73, - 0, 15, 0, 74, 75, 0, 0, 0, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 0, 78, 79, - 80, 0, 0, 0, 81, 82, 0, 0, 442, 83, - 443, 418, 0, 69, 0, 0, 0, 0, 70, 71, - 0, 72, 109, 0, 0, -27, -27, -27, -27, 84, - 85, 0, 444, -27, -27, -27, 0, 0, 0, 73, - 0, 15, 0, 74, 75, 0, 0, 0, 110, -27, - 76, -162, 0, 77, 0, 0, 0, -162, 78, 79, - 80, 0, 0, 0, 81, 82, 0, 0, 0, 83, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 0, - 111, 112, 236, 0, 0, -23, -23, -23, -23, 84, - 85, 0, 419, -23, -23, -23, 0, 0, -162, 69, - 0, 0, -162, -27, 70, 71, 0, 72, 110, -23, - 0, -162, 0, 0, 0, 0, 0, -162, 0, 0, - 0, 0, 0, 0, 0, 73, 0, 15, 0, 74, - 75, 0, 0, 0, 0, 0, 76, 0, 0, 77, - 111, 112, 0, 0, 78, 79, 80, 0, 0, 0, - 81, 82, 0, 0, 0, 83, 0, 0, -162, 69, - 0, 0, -162, -23, 70, 71, 0, 72, 0, 0, - 0, 0, 69, 0, 0, 84, 85, 70, 71, 215, - 72, 0, 0, 0, 0, 73, 0, 15, 0, 74, - 75, 0, 0, 0, 0, 0, 76, 0, 73, 77, - 15, 0, 74, 75, 78, 79, 80, 0, 0, 76, - 81, 82, 77, 0, 0, 83, 0, 78, 79, 80, - 0, 0, 0, 81, 82, 69, 0, 0, 83, 0, - 70, 71, 0, 72, 0, 84, 85, 0, 69, 286, - 0, 0, 0, 70, 71, 0, 72, 0, 84, 85, - 0, 73, 322, 15, 0, 74, 75, 0, 0, 0, - 0, 0, 76, 0, 73, 77, 15, 0, 74, 75, - 78, 79, 80, 0, 0, 76, 81, 82, 77, 0, - 0, 83, 0, 78, 79, 80, 0, 0, 0, 81, - 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, - 0, 84, 85, 0, 0, 353, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 85, 0, 0, 499, 441, - 509, 6, 7, 8, 70, 71, 0, 72, 9, 10, - 11, 510, 0, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 13, 73, 14, 15, 0, 74, - 75, 0, 5, 6, 7, 8, 76, 0, 408, 77, - 9, 10, 11, 0, 78, 79, 80, 0, 0, 0, - 81, 82, 0, 0, 0, 83, 13, 0, 14, 0, - 0, 0, 5, 6, 7, 8, 0, 0, 0, 0, - 9, 10, 11, 522, 0, 84, 85, 0, 252, 441, - 33, 0, 0, 0, 70, 71, 13, 72, 14, 0, - 0, 510, 0, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 0, 73, 0, 15, 0, 74, - 75, 0, 0, 0, 0, 0, 76, 0, 0, 77, - 0, 0, 0, 0, 78, 79, 80, 0, 0, 0, - 81, 82, 0, 69, 0, 83, 0, 0, 70, 71, - 0, 72, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 522, 0, 84, 85, 0, 252, 73, - 0, 15, 0, 74, 75, 0, 0, 0, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 0, 78, 79, - 80, 0, 0, 0, 81, 82, 0, 0, 0, 83, - 69, 5, 6, 7, 8, 70, 71, 0, 72, 9, - 10, 11, 0, 0, 0, 0, 0, 0, 0, 84, - 85, 0, 338, 0, 0, 13, 73, 14, 15, 0, - 74, 75, 0, 0, 0, 0, 0, 76, 0, 0, - 77, 0, 0, 0, 0, 78, 79, 80, 0, 0, - 0, 81, 82, 0, 69, 5, 83, 7, 97, 70, - 71, 0, 72, 9, 10, 11, 0, 69, 0, 0, - 0, 0, 70, 71, 0, 72, 84, 85, 0, 13, - 73, 0, 15, 0, 74, 75, 0, 0, 0, 0, - 0, 76, 0, 73, 77, 15, 0, 74, 75, 78, - 79, 80, 0, 0, 76, 81, 82, 77, 0, 0, - 83, 0, 78, 79, 80, 0, 0, 0, 81, 82, - 69, 0, 0, 83, 0, 70, 71, 0, 72, 0, - 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 557, 0, 84, 85, 0, 73, 69, 15, 0, - 74, 75, 70, 71, 0, 72, 0, 76, 0, 0, - 77, 0, 0, 0, 0, 78, 79, 80, 0, 0, - 0, 81, 82, 73, 69, 15, 83, 74, 75, 70, - 71, 0, 72, 0, 76, 0, 0, 77, 0, 0, - 0, 0, 78, 79, 80, 0, 84, 85, 81, 82, - 73, 357, 15, 159, 74, 75, 70, 71, 0, 72, - 0, 76, 0, 0, 77, 0, 0, 0, 0, 78, - 79, 80, 0, 84, 85, 81, 82, 73, 0, 15, - 161, 74, 75, 539, 0, 0, 0, 0, 76, 0, - 0, 77, 0, 0, 0, 0, 78, 79, 80, 0, - 84, 85, 81, 82, 0, 0, 0, 83, 163, 164, - 165, 0, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 0, 84, 85, 5, - 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, - 0, 9, 10, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 589, 14, 540, 13, 0, 14, - 0, 163, 164, 165, 0, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 163, - 164, 165, 590, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 0, 0, 0, - 0, 0, 52, 0, 0, 14, 567, 0, 0, 606, - 163, 164, 165, 0, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 163, 164, - 165, 632, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 163, 164, 165, 0, - 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 165, 0, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179 -}; - -static const short yycheck[] = { 40, - 41, 2, 3, 9, 10, 11, 20, 53, 2, 3, - 2, 3, 51, 121, 22, 2, 3, 113, 74, 75, - 212, 120, 194, 231, 80, 154, 116, 28, 59, 237, - 86, 45, 22, 20, 28, 22, 28, 190, 233, 53, - 96, 28, 21, 22, 102, 331, 184, 413, 219, 65, - 361, 41, 285, 117, 107, 1, 62, 469, 45, 1, - 1, 38, 7, 38, 51, 9, 53, 65, 10, 3, - 76, 112, 59, 65, 630, 65, 488, 25, 27, 3, - 4, 3, 4, 376, 38, 38, 379, 3, 4, 0, - 104, 3, 4, 83, 108, 126, 30, 103, 0, 189, - 48, 76, 210, 117, 660, 50, 491, 59, 56, 83, - 59, 60, 102, 77, 59, 60, 50, 104, 59, 291, - 107, 108, 76, 76, 220, 59, 60, 550, 144, 282, - 117, 137, 76, 59, 27, 231, 82, 30, 50, 126, - 82, 237, 453, 36, 185, 59, 144, 243, 30, 245, - 191, 437, 144, 143, 144, 3, 294, 542, 82, 30, - 82, 225, 141, 194, 143, 229, 82, 38, 145, 159, - 147, 161, 120, 30, 407, 228, 182, 183, 3, 602, - 28, 76, 7, 131, 77, 159, 81, 161, 81, 30, - 76, 576, 82, 234, 579, 81, 3, 483, 254, 76, - 566, 624, 59, 60, 81, 30, 629, 76, 631, 3, - 4, 225, 81, 7, 82, 229, 387, 640, 59, 60, - 261, 76, 607, 30, 82, 50, 81, 214, 3, 4, - 59, 60, 7, 239, 59, 60, 30, 59, 225, 368, - 77, 228, 229, 50, 81, 417, 399, 76, 289, 5, - 673, 7, 59, 50, 639, 30, 50, 395, 78, 454, - 291, 432, 59, 60, 435, 59, 60, 1, 1, 3, - 4, 4, 5, 6, 7, 50, 224, 10, 78, 12, - 13, 14, 6, 7, 59, 571, 382, 293, 12, 13, - 14, 387, 300, 77, 466, 28, 77, 81, 285, 452, - 81, 400, 76, 361, 362, 313, 459, 9, 398, 81, - 300, 3, 4, 300, 404, 76, 4, 76, 6, 7, - 299, 300, 59, 313, 12, 13, 14, 36, 54, 55, - 81, 57, 58, 59, 60, 3, 4, 433, 30, 435, - 28, 77, 77, 138, 383, 81, 81, 361, 362, 82, - 76, 146, 50, 51, 52, 77, 485, 77, 50, 81, - 1, 81, 30, 4, 5, 6, 7, 59, 60, 415, - 38, 12, 13, 14, 361, 362, 77, 77, 365, 508, - 386, 81, 50, 373, 77, 399, 417, 28, 81, 77, - 78, 59, 76, 372, 373, 76, 383, 77, 78, 3, - 4, 415, 59, 60, 59, 60, 496, 82, 5, 6, - 7, 619, 399, 621, 455, 12, 13, 14, 76, 1, - 407, 76, 4, 77, 6, 7, 413, 38, 415, 59, - 12, 13, 14, 30, 27, 466, 442, 232, 452, 453, - 83, 82, 9, 3, 485, 459, 28, 7, 77, 31, - 59, 60, 400, 4, 5, 6, 7, 77, 78, 3, - 4, 12, 13, 14, 78, 452, 453, 508, 36, 475, - 30, 78, 459, 78, 603, 667, 78, 28, 519, 485, - 76, 537, 76, 675, 485, 76, 30, 59, 60, 597, - 50, 485, 38, 485, 83, 77, 78, 76, 485, 59, - 59, 60, 508, 83, 76, 76, 50, 548, 77, 78, - 551, 552, 59, 60, 520, 59, 90, 91, 559, 527, - 649, 650, 568, 619, 76, 621, 77, 566, 76, 36, - 544, 81, 327, 574, 83, 78, 537, 527, 333, 334, - 527, 32, 583, 537, 38, 537, 83, 526, 527, 76, - 537, 3, 77, 594, 568, 158, 78, 544, 78, 38, - 163, 164, 603, 38, 78, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 81, 78, 566, - 36, 568, 83, 78, 38, 59, 381, 59, 1, 630, - 3, 4, 5, 6, 7, 59, 38, 603, 7, 12, - 13, 14, 38, 3, 4, 16, 401, 402, 403, 77, - 405, 406, 77, 654, 27, 28, 77, 30, 31, 660, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 30, 77, 36, 428, 78, 238, 1, 50, 3, 4, - 5, 6, 7, 59, 77, 10, 59, 12, 13, 14, - 50, 45, 46, 47, 48, 49, 50, 51, 52, 59, - 263, 264, 77, 28, 77, 30, 59, 1, 76, 3, - 4, 5, 6, 7, 8, 9, 471, 11, 12, 13, - 14, 15, 17, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 77, 33, - 34, 3, 4, 5, 6, 7, 40, 76, 76, 43, - 505, 76, 36, 77, 48, 49, 50, 76, 9, 77, - 54, 55, 77, 77, 1, 59, 59, 4, 5, 6, - 7, 81, 77, 76, 76, 12, 13, 14, 77, 77, - 343, 0, 0, 77, 78, 79, 80, 551, 82, 294, - 27, 28, 537, 30, 48, 49, 50, 51, 52, 36, - 1, 220, 3, 4, 433, 55, 416, 8, 9, 197, - 11, 423, 375, 144, 15, 293, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 390, 29, 137, - 31, 241, 33, 34, 245, 382, 239, 433, 388, 40, - 77, 435, 43, 655, 81, 82, 657, 48, 49, 50, - 603, 603, 288, 54, 55, 3, 4, -1, 59, 7, - 423, -1, 1, 365, 427, 4, -1, 6, 7, -1, - -1, -1, -1, 12, 13, 14, 77, 78, 79, 80, - 443, 82, 30, -1, -1, -1, -1, 450, 1, 28, - 3, 4, 31, 6, 7, 8, 9, -1, 11, 12, - 13, 14, 50, -1, -1, -1, 469, -1, -1, 472, - -1, 59, -1, -1, -1, 28, 29, -1, 31, -1, - 33, 34, -1, -1, -1, 488, -1, 40, 491, -1, - 43, 5, 6, 7, -1, 48, 49, 50, 12, 13, - 14, 54, 55, -1, 1, -1, 59, 4, 5, 6, - 7, -1, 515, 10, -1, 12, 13, 14, 46, 47, - 48, 49, 50, 51, 52, -1, 79, 80, -1, 82, - -1, 28, -1, 30, -1, -1, 539, -1, -1, 542, - -1, -1, 1, -1, 3, 4, 5, 6, 7, 8, - 9, -1, 11, 12, 13, 14, 15, -1, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 576, 33, 34, 579, -1, -1, 76, - -1, 40, -1, -1, 43, -1, 589, -1, -1, 48, - 49, 50, -1, -1, -1, 54, 55, -1, -1, -1, - 59, -1, -1, -1, 607, 4, -1, 6, 7, -1, - -1, -1, -1, 12, 13, 14, -1, -1, 77, -1, - 79, 80, -1, 82, 1, -1, 3, 4, -1, 28, - -1, 8, 9, -1, 11, -1, 639, -1, 15, -1, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 50, 29, -1, 31, -1, 33, 34, -1, 27, - 59, 60, 30, 40, -1, -1, 43, -1, 36, -1, - -1, 48, 49, 50, -1, -1, -1, 54, 55, -1, - -1, -1, 59, -1, -1, -1, 4, 5, 6, 7, - -1, 59, 60, -1, 12, 13, 14, -1, -1, -1, - 77, -1, 79, 80, 1, 82, 3, 4, -1, 77, - 28, 8, 9, 81, 11, -1, -1, -1, 15, -1, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, -1, 29, -1, 31, -1, 33, 34, -1, -1, - -1, -1, -1, 40, 54, 55, 43, 57, 58, 59, - 60, 48, 49, 50, -1, -1, -1, 54, 55, -1, - -1, 1, 59, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, - 77, -1, 79, 80, -1, 82, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, 58, 59, - 60, 1, -1, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, 82, -1, -1, -1, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, 58, 59, - 60, 1, -1, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, 82, -1, -1, -1, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, 58, 59, - 60, 1, -1, 3, -1, -1, -1, -1, 8, 9, - -1, 11, 1, -1, -1, 4, 5, 6, 7, 79, - 80, -1, 82, 12, 13, 14, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, 27, 28, - 40, 30, -1, 43, -1, -1, -1, 36, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, - 59, 60, 1, -1, -1, 4, 5, 6, 7, 79, - 80, -1, 82, 12, 13, 14, -1, -1, 77, 3, - -1, -1, 81, 82, 8, 9, -1, 11, 27, 28, - -1, 30, -1, -1, -1, -1, -1, 36, -1, -1, - -1, -1, -1, -1, -1, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - 59, 60, -1, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, -1, -1, 59, -1, -1, 77, 3, - -1, -1, 81, 82, 8, 9, -1, 11, -1, -1, - -1, -1, 3, -1, -1, 79, 80, 8, 9, 83, - 11, -1, -1, -1, -1, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, 29, 43, - 31, -1, 33, 34, 48, 49, 50, -1, -1, 40, - 54, 55, 43, -1, -1, 59, -1, 48, 49, 50, - -1, -1, -1, 54, 55, 3, -1, -1, 59, -1, - 8, 9, -1, 11, -1, 79, 80, -1, 3, 83, - -1, -1, -1, 8, 9, -1, 11, -1, 79, 80, - -1, 29, 83, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, 29, 43, 31, -1, 33, 34, - 48, 49, 50, -1, -1, 40, 54, 55, 43, -1, - -1, 59, -1, 48, 49, 50, -1, -1, -1, 54, - 55, -1, -1, -1, 59, -1, -1, -1, -1, -1, - -1, 79, 80, -1, -1, 83, -1, -1, -1, -1, - -1, -1, -1, -1, 79, 80, -1, -1, 83, 3, - 4, 5, 6, 7, 8, 9, -1, 11, 12, 13, - 14, 15, -1, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, -1, 33, - 34, -1, 4, 5, 6, 7, 40, -1, 10, 43, - 12, 13, 14, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, -1, -1, 59, 28, -1, 30, -1, - -1, -1, 4, 5, 6, 7, -1, -1, -1, -1, - 12, 13, 14, 77, -1, 79, 80, -1, 82, 3, - 4, -1, -1, -1, 8, 9, 28, 11, 30, -1, - -1, 15, -1, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, -1, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, 3, -1, 59, -1, -1, 8, 9, - -1, 11, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 77, -1, 79, 80, -1, 82, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 3, 4, 5, 6, 7, 8, 9, -1, 11, 12, - 13, 14, -1, -1, -1, -1, -1, -1, -1, 79, - 80, -1, 82, -1, -1, 28, 29, 30, 31, -1, - 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, - 43, -1, -1, -1, -1, 48, 49, 50, -1, -1, - -1, 54, 55, -1, 3, 4, 59, 6, 7, 8, - 9, -1, 11, 12, 13, 14, -1, 3, -1, -1, - -1, -1, 8, 9, -1, 11, 79, 80, -1, 28, - 29, -1, 31, -1, 33, 34, -1, -1, -1, -1, - -1, 40, -1, 29, 43, 31, -1, 33, 34, 48, - 49, 50, -1, -1, 40, 54, 55, 43, -1, -1, - 59, -1, 48, 49, 50, -1, -1, -1, 54, 55, - 3, -1, -1, 59, -1, 8, 9, -1, 11, -1, - 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 77, -1, 79, 80, -1, 29, 3, 31, -1, - 33, 34, 8, 9, -1, 11, -1, 40, -1, -1, - 43, -1, -1, -1, -1, 48, 49, 50, -1, -1, - -1, 54, 55, 29, 3, 31, 59, 33, 34, 8, - 9, -1, 11, -1, 40, -1, -1, 43, -1, -1, - -1, -1, 48, 49, 50, -1, 79, 80, 54, 55, - 29, 3, 31, 59, 33, 34, 8, 9, -1, 11, - -1, 40, -1, -1, 43, -1, -1, -1, -1, 48, - 49, 50, -1, 79, 80, 54, 55, 29, -1, 31, - 59, 33, 34, 10, -1, -1, -1, -1, 40, -1, - -1, 43, -1, -1, -1, -1, 48, 49, 50, -1, - 79, 80, 54, 55, -1, -1, -1, 59, 35, 36, - 37, -1, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, -1, 79, 80, 4, - 5, 6, 7, 4, 5, 6, 7, 12, 13, 14, - -1, 12, 13, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 28, 10, 30, 83, 28, -1, 30, - -1, 35, 36, 37, -1, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, - -1, -1, 77, -1, -1, 30, 77, -1, -1, 83, - 35, 36, 37, -1, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 35, 36, 37, -1, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 37, -1, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include <malloc.h> -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include <malloc.h> - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 1: -#line 237 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids an empty source file"); - finish_file (); - ; - break;} -case 2: -#line 242 "c-parse.y" -{ - /* In case there were missing closebraces, - get us back to the global binding level. */ - while (! global_bindings_p ()) - poplevel (0, 0, 0); - finish_file (); - ; - break;} -case 3: -#line 256 "c-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 5: -#line 257 "c-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 9: -#line 264 "c-parse.y" -{ STRIP_NOPS (yyvsp[-2].ttype); - if ((TREE_CODE (yyvsp[-2].ttype) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (yyvsp[-2].ttype, 0)) == STRING_CST) - || TREE_CODE (yyvsp[-2].ttype) == STRING_CST) - assemble_asm (yyvsp[-2].ttype); - else - error ("argument of `asm' is not a constant string"); ; - break;} -case 10: -#line 272 "c-parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 11: -#line 277 "c-parse.y" -{ if (pedantic) - error ("ANSI C forbids data definition with no type or storage class"); - else if (!flag_traditional) - warning ("data definition has no type or storage class"); - - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 12: -#line 287 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 13: -#line 292 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 14: -#line 297 "c-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 15: -#line 299 "c-parse.y" -{ shadow_tag (yyvsp[-1].ttype); ; - break;} -case 18: -#line 303 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C does not allow extra `;' outside of a function"); ; - break;} -case 19: -#line 309 "c-parse.y" -{ if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 20: -#line 314 "c-parse.y" -{ store_parm_decls (); ; - break;} -case 21: -#line 316 "c-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 22: -#line 322 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 23: -#line 327 "c-parse.y" -{ if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 24: -#line 332 "c-parse.y" -{ store_parm_decls (); ; - break;} -case 25: -#line 334 "c-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 26: -#line 340 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 27: -#line 345 "c-parse.y" -{ if (! start_function (NULL_TREE, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 28: -#line 350 "c-parse.y" -{ store_parm_decls (); ; - break;} -case 29: -#line 352 "c-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 30: -#line 358 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 33: -#line 370 "c-parse.y" -{ yyval.code = ADDR_EXPR; ; - break;} -case 34: -#line 372 "c-parse.y" -{ yyval.code = NEGATE_EXPR; ; - break;} -case 35: -#line 374 "c-parse.y" -{ yyval.code = CONVERT_EXPR; ; - break;} -case 36: -#line 376 "c-parse.y" -{ yyval.code = PREINCREMENT_EXPR; ; - break;} -case 37: -#line 378 "c-parse.y" -{ yyval.code = PREDECREMENT_EXPR; ; - break;} -case 38: -#line 380 "c-parse.y" -{ yyval.code = BIT_NOT_EXPR; ; - break;} -case 39: -#line 382 "c-parse.y" -{ yyval.code = TRUTH_NOT_EXPR; ; - break;} -case 40: -#line 386 "c-parse.y" -{ yyval.ttype = build_compound_expr (yyvsp[0].ttype); ; - break;} -case 41: -#line 391 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 43: -#line 397 "c-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 44: -#line 399 "c-parse.y" -{ chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 46: -#line 405 "c-parse.y" -{ yyval.ttype = build_indirect_ref (yyvsp[0].ttype, "unary *"); ; - break;} -case 47: -#line 408 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 48: -#line 411 "c-parse.y" -{ yyval.ttype = build_unary_op (yyvsp[-1].code, yyvsp[0].ttype, 0); - overflow_warning (yyval.ttype); ; - break;} -case 49: -#line 415 "c-parse.y" -{ tree label = lookup_label (yyvsp[0].ttype); - if (pedantic) - pedwarn ("ANSI C forbids `&&'"); - if (label == 0) - yyval.ttype = null_pointer_node; - else - { - TREE_USED (label) = 1; - yyval.ttype = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT (yyval.ttype) = 1; - } - ; - break;} -case 50: -#line 443 "c-parse.y" -{ skip_evaluation--; - if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF - && DECL_BIT_FIELD (TREE_OPERAND (yyvsp[0].ttype, 1))) - error ("`sizeof' applied to a bit-field"); - yyval.ttype = c_sizeof (TREE_TYPE (yyvsp[0].ttype)); ; - break;} -case 51: -#line 449 "c-parse.y" -{ skip_evaluation--; - yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ttype)); ; - break;} -case 52: -#line 452 "c-parse.y" -{ skip_evaluation--; - yyval.ttype = c_alignof_expr (yyvsp[0].ttype); ; - break;} -case 53: -#line 455 "c-parse.y" -{ skip_evaluation--; - yyval.ttype = c_alignof (groktypename (yyvsp[-1].ttype)); ; - break;} -case 54: -#line 458 "c-parse.y" -{ yyval.ttype = build_unary_op (REALPART_EXPR, yyvsp[0].ttype, 0); ; - break;} -case 55: -#line 460 "c-parse.y" -{ yyval.ttype = build_unary_op (IMAGPART_EXPR, yyvsp[0].ttype, 0); ; - break;} -case 56: -#line 464 "c-parse.y" -{ skip_evaluation++; ; - break;} -case 57: -#line 468 "c-parse.y" -{ skip_evaluation++; ; - break;} -case 59: -#line 474 "c-parse.y" -{ tree type = groktypename (yyvsp[-2].ttype); - yyval.ttype = build_c_cast (type, yyvsp[0].ttype); ; - break;} -case 60: -#line 477 "c-parse.y" -{ start_init (NULL_TREE, NULL, 0); - yyvsp[-2].ttype = groktypename (yyvsp[-2].ttype); - really_start_incremental_init (yyvsp[-2].ttype); ; - break;} -case 61: -#line 481 "c-parse.y" -{ char *name; - tree result = pop_init_level (0); - tree type = yyvsp[-5].ttype; - finish_init (); - - if (pedantic) - pedwarn ("ANSI C forbids constructor expressions"); - if (TYPE_NAME (type) != 0) - { - if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) - name = IDENTIFIER_POINTER (TYPE_NAME (type)); - else - name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); - } - else - name = ""; - yyval.ttype = result; - if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) - { - int failure = complete_array_type (type, yyval.ttype, 1); - if (failure) - abort (); - } - ; - break;} -case 63: -#line 510 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 64: -#line 512 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 65: -#line 514 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 66: -#line 516 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 67: -#line 518 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 68: -#line 520 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 69: -#line 522 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 70: -#line 524 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 71: -#line 526 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 72: -#line 528 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 73: -#line 530 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 74: -#line 532 "c-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 75: -#line 534 "c-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ; - break;} -case 76: -#line 537 "c-parse.y" -{ skip_evaluation -= yyvsp[-3].ttype == boolean_false_node; - yyval.ttype = parser_build_binary_op (TRUTH_ANDIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 77: -#line 540 "c-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ; - break;} -case 78: -#line 543 "c-parse.y" -{ skip_evaluation -= yyvsp[-3].ttype == boolean_true_node; - yyval.ttype = parser_build_binary_op (TRUTH_ORIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 79: -#line 546 "c-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ; - break;} -case 80: -#line 549 "c-parse.y" -{ skip_evaluation += ((yyvsp[-4].ttype == boolean_true_node) - - (yyvsp[-4].ttype == boolean_false_node)); ; - break;} -case 81: -#line 552 "c-parse.y" -{ skip_evaluation -= yyvsp[-6].ttype == boolean_true_node; - yyval.ttype = build_conditional_expr (yyvsp[-6].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 82: -#line 555 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids omitting the middle term of a ?: expression"); - /* Make sure first operand is calculated only once. */ - yyvsp[0].ttype = save_expr (yyvsp[-1].ttype); - yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[0].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ; - break;} -case 83: -#line 562 "c-parse.y" -{ skip_evaluation -= yyvsp[-4].ttype == boolean_true_node; - yyval.ttype = build_conditional_expr (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 84: -#line 565 "c-parse.y" -{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, NOP_EXPR, yyvsp[0].ttype); - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; - break;} -case 85: -#line 568 "c-parse.y" -{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, yyvsp[-1].code, yyvsp[0].ttype); - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, ERROR_MARK); ; - break;} -case 86: -#line 575 "c-parse.y" -{ - yyval.ttype = lastiddecl; - if (!yyval.ttype || yyval.ttype == error_mark_node) - { - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - { - /* Ordinary implicit function declaration. */ - yyval.ttype = implicitly_declare (yyvsp[0].ttype); - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - } - } - else if (current_function_decl == 0) - { - error ("`%s' undeclared here (not in a function)", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = error_mark_node; - } - else - { - { - if (IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) != error_mark_node - || IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) != current_function_decl) - { - error ("`%s' undeclared (first use this function)", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - yyval.ttype = error_mark_node; - /* Prevent repeated error messages. */ - IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) = error_mark_node; - IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) = current_function_decl; - } - } - } - else if (TREE_TYPE (yyval.ttype) == error_mark_node) - yyval.ttype = error_mark_node; - else if (C_DECL_ANTICIPATED (yyval.ttype)) - { - /* The first time we see a build-in function used, - if it has not been declared. */ - C_DECL_ANTICIPATED (yyval.ttype) = 0; - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - /* Omit the implicit declaration we - would ordinarily do, so we don't lose - the actual built in type. - But print a diagnostic for the mismatch. */ - if (TREE_CODE (yyval.ttype) != FUNCTION_DECL) - error ("`%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - else if ((TYPE_MODE (TREE_TYPE (TREE_TYPE (yyval.ttype))) - != TYPE_MODE (integer_type_node)) - && (TREE_TYPE (TREE_TYPE (yyval.ttype)) - != void_type_node)) - pedwarn ("type mismatch in implicit declaration for built-in function `%s'", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - /* If it really returns void, change that to int. */ - if (TREE_TYPE (TREE_TYPE (yyval.ttype)) == void_type_node) - TREE_TYPE (yyval.ttype) - = build_function_type (integer_type_node, - TYPE_ARG_TYPES (TREE_TYPE (yyval.ttype))); - } - else - pedwarn ("built-in function `%s' used without declaration", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - - /* Do what we would ordinarily do when a fn is used. */ - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - } - else - { - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - } - - if (TREE_CODE (yyval.ttype) == CONST_DECL) - { - yyval.ttype = DECL_INITIAL (yyval.ttype); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - yyval.ttype = build1 (NOP_EXPR, TREE_TYPE (yyval.ttype), yyval.ttype); - TREE_CONSTANT (yyval.ttype) = 1; - } - ; - break;} -case 88: -#line 674 "c-parse.y" -{ yyval.ttype = combine_strings (yyvsp[0].ttype); ; - break;} -case 89: -#line 676 "c-parse.y" -{ char class = TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - C_SET_EXP_ORIGINAL_CODE (yyvsp[-1].ttype, ERROR_MARK); - yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 90: -#line 682 "c-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 91: -#line 684 "c-parse.y" -{ if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - /* We must force a BLOCK for this level - so that, if it is not expanded later, - there is a way to turn off the entire subtree of blocks - that are contained in it. */ - keep_next_level (); - push_iterator_stack (); - push_label_level (); - yyval.ttype = expand_start_stmt_expr (); ; - break;} -case 92: -#line 698 "c-parse.y" -{ tree rtl_exp; - if (pedantic) - pedwarn ("ANSI C forbids braced-groups within expressions"); - pop_iterator_stack (); - pop_label_level (); - rtl_exp = expand_end_stmt_expr (yyvsp[-2].ttype); - /* The statements have side effects, so the group does. */ - TREE_SIDE_EFFECTS (rtl_exp) = 1; - - if (TREE_CODE (yyvsp[-1].ttype) == BLOCK) - { - /* Make a BIND_EXPR for the BLOCK already made. */ - yyval.ttype = build (BIND_EXPR, TREE_TYPE (rtl_exp), - NULL_TREE, rtl_exp, yyvsp[-1].ttype); - /* Remove the block from the tree at this point. - It gets put back at the proper place - when the BIND_EXPR is expanded. */ - delete_block (yyvsp[-1].ttype); - } - else - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 93: -#line 721 "c-parse.y" -{ yyval.ttype = build_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 94: -#line 723 "c-parse.y" -{ yyval.ttype = build_array_ref (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 95: -#line 725 "c-parse.y" -{ - yyval.ttype = build_component_ref (yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 96: -#line 729 "c-parse.y" -{ - tree expr = build_indirect_ref (yyvsp[-2].ttype, "->"); - - yyval.ttype = build_component_ref (expr, yyvsp[0].ttype); - ; - break;} -case 97: -#line 735 "c-parse.y" -{ yyval.ttype = build_unary_op (POSTINCREMENT_EXPR, yyvsp[-1].ttype, 0); ; - break;} -case 98: -#line 737 "c-parse.y" -{ yyval.ttype = build_unary_op (POSTDECREMENT_EXPR, yyvsp[-1].ttype, 0); ; - break;} -case 100: -#line 744 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 103: -#line 753 "c-parse.y" -{ c_mark_varargs (); - if (pedantic) - pedwarn ("ANSI C does not permit use of `varargs.h'"); ; - break;} -case 104: -#line 763 "c-parse.y" -{ ; - break;} -case 109: -#line 779 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 110: -#line 784 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 111: -#line 789 "c-parse.y" -{ shadow_tag_warned (yyvsp[-1].ttype, 1); - pedwarn ("empty declaration"); ; - break;} -case 112: -#line 792 "c-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 113: -#line 801 "c-parse.y" -{ ; - break;} -case 118: -#line 816 "c-parse.y" -{ yyval.itype = suspend_momentary (); - pending_xref_error (); - declspec_stack = tree_cons (prefix_attributes, - current_declspecs, - declspec_stack); - split_specs_attrs (yyvsp[0].ttype, - ¤t_declspecs, &prefix_attributes); ; - break;} -case 119: -#line 827 "c-parse.y" -{ prefix_attributes = chainon (prefix_attributes, yyvsp[0].ttype); ; - break;} -case 120: -#line 832 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 121: -#line 837 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 122: -#line 842 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 123: -#line 847 "c-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 124: -#line 852 "c-parse.y" -{ shadow_tag (yyvsp[-1].ttype); ; - break;} -case 125: -#line 854 "c-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 126: -#line 856 "c-parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 127: -#line 866 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 128: -#line 868 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 129: -#line 872 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 130: -#line 874 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 131: -#line 876 "c-parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 132: -#line 881 "c-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 133: -#line 886 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 134: -#line 888 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 135: -#line 893 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 136: -#line 895 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 137: -#line 897 "c-parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 138: -#line 910 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 139: -#line 912 "c-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; - break;} -case 140: -#line 914 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 141: -#line 916 "c-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 142: -#line 921 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); - TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 143: -#line 924 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 144: -#line 926 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); - TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 145: -#line 929 "c-parse.y" -{ if (extra_warnings && TREE_STATIC (yyvsp[-1].ttype)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); - TREE_STATIC (yyval.ttype) = TREE_STATIC (yyvsp[-1].ttype); ; - break;} -case 146: -#line 943 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 147: -#line 945 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 148: -#line 949 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 149: -#line 951 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 152: -#line 961 "c-parse.y" -{ /* For a typedef name, record the meaning, not the name. - In case of `foo foo, bar;'. */ - yyval.ttype = lookup_name (yyvsp[0].ttype); ; - break;} -case 153: -#line 965 "c-parse.y" -{ yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); ; - break;} -case 154: -#line 967 "c-parse.y" -{ yyval.ttype = groktypename (yyvsp[-1].ttype); ; - break;} -case 162: -#line 989 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 163: -#line 991 "c-parse.y" -{ if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 164: -#line 998 "c-parse.y" -{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1, - yyvsp[-1].ttype, prefix_attributes); - start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ; - break;} -case 165: -#line 1003 "c-parse.y" -{ finish_init (); - finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; - break;} -case 166: -#line 1006 "c-parse.y" -{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0, - yyvsp[0].ttype, prefix_attributes); - finish_decl (d, NULL_TREE, yyvsp[-1].ttype); - ; - break;} -case 167: -#line 1014 "c-parse.y" -{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1, - yyvsp[-1].ttype, prefix_attributes); - start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ; - break;} -case 168: -#line 1019 "c-parse.y" -{ finish_init (); - decl_attributes (yyvsp[-1].ttype, yyvsp[-3].ttype, prefix_attributes); - finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; - break;} -case 169: -#line 1023 "c-parse.y" -{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0, - yyvsp[0].ttype, prefix_attributes); - finish_decl (d, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 170: -#line 1031 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 171: -#line 1033 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 172: -#line 1038 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 173: -#line 1040 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 174: -#line 1045 "c-parse.y" -{ yyval.ttype = yyvsp[-2].ttype; ; - break;} -case 175: -#line 1050 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 176: -#line 1052 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 177: -#line 1057 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 178: -#line 1059 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 179: -#line 1061 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; - break;} -case 180: -#line 1063 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; - break;} -case 181: -#line 1065 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 187: -#line 1083 "c-parse.y" -{ really_start_incremental_init (NULL_TREE); - /* Note that the call to clear_momentary - is in process_init_element. */ - push_momentary (); ; - break;} -case 188: -#line 1088 "c-parse.y" -{ yyval.ttype = pop_init_level (0); - if (yyval.ttype == error_mark_node - && ! (yychar == STRING || yychar == CONSTANT)) - pop_momentary (); - else - pop_momentary_nofree (); ; - break;} -case 189: -#line 1096 "c-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 190: -#line 1102 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids empty initializer braces"); ; - break;} -case 194: -#line 1116 "c-parse.y" -{ process_init_element (yyvsp[0].ttype); ; - break;} -case 195: -#line 1118 "c-parse.y" -{ push_init_level (0); ; - break;} -case 196: -#line 1120 "c-parse.y" -{ process_init_element (pop_init_level (0)); ; - break;} -case 198: -#line 1126 "c-parse.y" -{ set_init_index (yyvsp[-4].ttype, yyvsp[-2].ttype); ; - break;} -case 200: -#line 1129 "c-parse.y" -{ set_init_index (yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 202: -#line 1132 "c-parse.y" -{ set_init_index (yyvsp[-1].ttype, NULL_TREE); ; - break;} -case 204: -#line 1135 "c-parse.y" -{ set_init_label (yyvsp[-1].ttype); ; - break;} -case 206: -#line 1138 "c-parse.y" -{ set_init_label (yyvsp[-1].ttype); ; - break;} -case 208: -#line 1144 "c-parse.y" -{ push_c_function_context (); - if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); ; - break;} -case 209: -#line 1153 "c-parse.y" -{ store_parm_decls (); ; - break;} -case 210: -#line 1161 "c-parse.y" -{ finish_function (1); - pop_c_function_context (); ; - break;} -case 211: -#line 1167 "c-parse.y" -{ push_c_function_context (); - if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); ; - break;} -case 212: -#line 1176 "c-parse.y" -{ store_parm_decls (); ; - break;} -case 213: -#line 1184 "c-parse.y" -{ finish_function (1); - pop_c_function_context (); ; - break;} -case 216: -#line 1200 "c-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 217: -#line 1202 "c-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 218: -#line 1207 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 219: -#line 1209 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 220: -#line 1211 "c-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 221: -#line 1218 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 223: -#line 1229 "c-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 224: -#line 1234 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 225: -#line 1236 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 226: -#line 1238 "c-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 227: -#line 1245 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 229: -#line 1254 "c-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 230: -#line 1259 "c-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 231: -#line 1261 "c-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 232: -#line 1263 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 233: -#line 1265 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 234: -#line 1272 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 236: -#line 1278 "c-parse.y" -{ yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype); - /* Start scope of tag before parsing components. */ - ; - break;} -case 237: -#line 1282 "c-parse.y" -{ yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 238: -#line 1284 "c-parse.y" -{ yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), - yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 239: -#line 1288 "c-parse.y" -{ yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ; - break;} -case 240: -#line 1290 "c-parse.y" -{ yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ; - break;} -case 241: -#line 1292 "c-parse.y" -{ yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 242: -#line 1294 "c-parse.y" -{ yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE), - yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 243: -#line 1298 "c-parse.y" -{ yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ; - break;} -case 244: -#line 1300 "c-parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (yyvsp[-1].ttype); ; - break;} -case 245: -#line 1303 "c-parse.y" -{ yyval.ttype = finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), yyvsp[0].ttype); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 246: -#line 1306 "c-parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (NULL_TREE); ; - break;} -case 247: -#line 1309 "c-parse.y" -{ yyval.ttype = finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), yyvsp[0].ttype); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 248: -#line 1312 "c-parse.y" -{ yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ; - break;} -case 252: -#line 1323 "c-parse.y" -{ if (pedantic) pedwarn ("comma at end of enumerator list"); ; - break;} -case 253: -#line 1328 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 254: -#line 1330 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); - pedwarn ("no semicolon at end of struct or union"); ; - break;} -case 255: -#line 1335 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 256: -#line 1337 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ; - break;} -case 257: -#line 1339 "c-parse.y" -{ if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); ; - break;} -case 258: -#line 1354 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 259: -#line 1360 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag(yyvsp[0].ttype); - yyval.ttype = NULL_TREE; ; - break;} -case 260: -#line 1365 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 261: -#line 1371 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag(yyvsp[0].ttype); - yyval.ttype = NULL_TREE; ; - break;} -case 262: -#line 1376 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 263: -#line 1378 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 265: -#line 1385 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 266: -#line 1390 "c-parse.y" -{ yyval.ttype = grokfield (yyvsp[-3].filename, yyvsp[-2].lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 267: -#line 1394 "c-parse.y" -{ yyval.ttype = grokfield (yyvsp[-5].filename, yyvsp[-4].lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 268: -#line 1397 "c-parse.y" -{ yyval.ttype = grokfield (yyvsp[-4].filename, yyvsp[-3].lineno, NULL_TREE, current_declspecs, yyvsp[-1].ttype); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 270: -#line 1409 "c-parse.y" -{ if (yyvsp[-2].ttype == error_mark_node) - yyval.ttype = yyvsp[-2].ttype; - else - yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ; - break;} -case 271: -#line 1414 "c-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 272: -#line 1420 "c-parse.y" -{ yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 273: -#line 1422 "c-parse.y" -{ yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 274: -#line 1427 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 275: -#line 1429 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 276: -#line 1434 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 278: -#line 1440 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 279: -#line 1442 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 280: -#line 1447 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 281: -#line 1449 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 282: -#line 1454 "c-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 283: -#line 1457 "c-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 284: -#line 1459 "c-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 285: -#line 1461 "c-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 286: -#line 1463 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 287: -#line 1465 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 288: -#line 1467 "c-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 289: -#line 1469 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 290: -#line 1471 "c-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ; - break;} -case 291: -#line 1482 "c-parse.y" -{ - if (pedantic && yyvsp[0].ends_in_label) - pedwarn ("ANSI C forbids label at end of compound statement"); - ; - break;} -case 293: -#line 1491 "c-parse.y" -{ yyval.ends_in_label = yyvsp[0].ends_in_label; ; - break;} -case 294: -#line 1493 "c-parse.y" -{ yyval.ends_in_label = 0; ; - break;} -case 298: -#line 1505 "c-parse.y" -{ emit_line_note (input_filename, lineno); - pushlevel (0); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); - ; - break;} -case 300: -#line 1518 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids label declarations"); ; - break;} -case 303: -#line 1529 "c-parse.y" -{ tree link; - for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - ; - break;} -case 304: -#line 1543 "c-parse.y" -{; - break;} -case 306: -#line 1548 "c-parse.y" -{ yyval.ttype = convert (void_type_node, integer_zero_node); ; - break;} -case 307: -#line 1550 "c-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - yyval.ttype = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 308: -#line 1558 "c-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - yyval.ttype = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 309: -#line 1566 "c-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - yyval.ttype = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 312: -#line 1586 "c-parse.y" -{ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0); - yyval.itype = stmt_count; - if_stmt_file = yyvsp[-5].filename; - if_stmt_line = yyvsp[-4].lineno; - position_after_white_space (); ; - break;} -case 313: -#line 1599 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno); - /* See comment in `while' alternative, above. */ - emit_nop (); - expand_start_loop_continue_elsewhere (1); - position_after_white_space (); ; - break;} -case 314: -#line 1606 "c-parse.y" -{ expand_loop_continue_here (); ; - break;} -case 315: -#line 1610 "c-parse.y" -{ yyval.filename = input_filename; ; - break;} -case 316: -#line 1614 "c-parse.y" -{ yyval.lineno = lineno; ; - break;} -case 317: -#line 1619 "c-parse.y" -{ ; - break;} -case 318: -#line 1624 "c-parse.y" -{ ; - break;} -case 319: -#line 1629 "c-parse.y" -{ yyval.ends_in_label = yyvsp[0].ends_in_label; ; - break;} -case 320: -#line 1634 "c-parse.y" -{ yyval.ends_in_label = 0; ; - break;} -case 321: -#line 1636 "c-parse.y" -{ yyval.ends_in_label = 1; ; - break;} -case 322: -#line 1642 "c-parse.y" -{ stmt_count++; ; - break;} -case 324: -#line 1645 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); -/* It appears that this should not be done--that a non-lvalue array - shouldn't get an error if the value isn't used. - Section 3.2.2.1 says that an array lvalue gets converted to a pointer - if it appears as a top-level expression, - but says nothing about non-lvalue arrays. */ -#if 0 - /* Call default_conversion to get an error - on referring to a register array if pedantic. */ - if (TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == FUNCTION_TYPE) - yyvsp[-1].ttype = default_conversion (yyvsp[-1].ttype); -#endif - iterator_expand (yyvsp[-1].ttype); - clear_momentary (); ; - break;} -case 325: -#line 1662 "c-parse.y" -{ expand_start_else (); - yyvsp[-1].itype = stmt_count; - position_after_white_space (); ; - break;} -case 326: -#line 1666 "c-parse.y" -{ expand_end_cond (); - if (extra_warnings && stmt_count == yyvsp[-3].itype) - warning ("empty body in an else-statement"); ; - break;} -case 327: -#line 1670 "c-parse.y" -{ expand_end_cond (); - /* This warning is here instead of in simple_if, because we - do not want a warning if an empty if is followed by an - else statement. Increment stmt_count so we don't - give a second error if this is a nested `if'. */ - if (extra_warnings && stmt_count++ == yyvsp[0].itype) - warning_with_file_and_line (if_stmt_file, if_stmt_line, - "empty body in an if-statement"); ; - break;} -case 328: -#line 1682 "c-parse.y" -{ expand_end_cond (); ; - break;} -case 329: -#line 1684 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno); - /* The emit_nop used to come before emit_line_note, - but that made the nop seem like part of the preceding line. - And that was confusing when the preceding line was - inside of an if statement and was not really executed. - I think it ought to work to put the nop after the line number. - We will see. --rms, July 15, 1991. */ - emit_nop (); ; - break;} -case 330: -#line 1694 "c-parse.y" -{ /* Don't start the loop till we have succeeded - in parsing the end test. This is to make sure - that we end every loop we start. */ - expand_start_loop (1); - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-1].ttype)); - position_after_white_space (); ; - break;} -case 331: -#line 1703 "c-parse.y" -{ expand_end_loop (); ; - break;} -case 332: -#line 1706 "c-parse.y" -{ emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-2].ttype)); - expand_end_loop (); - clear_momentary (); ; - break;} -case 333: -#line 1713 "c-parse.y" -{ expand_end_loop (); - clear_momentary (); ; - break;} -case 334: -#line 1717 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - /* See comment in `while' alternative, above. */ - emit_nop (); - if (yyvsp[-1].ttype) c_expand_expr_stmt (yyvsp[-1].ttype); - /* Next step is to call expand_start_loop_continue_elsewhere, - but wait till after we parse the entire for (...). - Otherwise, invalid input might cause us to call that - fn without calling expand_end_loop. */ - ; - break;} -case 335: -#line 1729 "c-parse.y" -{ yyvsp[0].lineno = lineno; - yyval.filename = input_filename; ; - break;} -case 336: -#line 1732 "c-parse.y" -{ - /* Start the loop. Doing this after parsing - all the expressions ensures we will end the loop. */ - expand_start_loop_continue_elsewhere (1); - /* Emit the end-test, with a line number. */ - emit_line_note (yyvsp[-2].filename, yyvsp[-3].lineno); - if (yyvsp[-4].ttype) - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-4].ttype)); - /* Don't let the tree nodes for $9 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - yyvsp[-3].lineno = lineno; - yyvsp[-2].filename = input_filename; - position_after_white_space (); ; - break;} -case 337: -#line 1748 "c-parse.y" -{ /* Emit the increment expression, with a line number. */ - emit_line_note (yyvsp[-4].filename, yyvsp[-5].lineno); - expand_loop_continue_here (); - if (yyvsp[-3].ttype) - c_expand_expr_stmt (yyvsp[-3].ttype); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - expand_end_loop (); ; - break;} -case 338: -#line 1759 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - c_expand_start_case (yyvsp[-1].ttype); - /* Don't let the tree nodes for $3 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - position_after_white_space (); ; - break;} -case 339: -#line 1767 "c-parse.y" -{ expand_end_case (yyvsp[-3].ttype); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 340: -#line 1773 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - if ( ! expand_exit_something ()) - error ("break statement not within loop or switch"); ; - break;} -case 341: -#line 1778 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - if (! expand_continue_loop (NULL_PTR)) - error ("continue statement not within a loop"); ; - break;} -case 342: -#line 1783 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - c_expand_return (NULL_TREE); ; - break;} -case 343: -#line 1787 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno); - c_expand_return (yyvsp[-1].ttype); ; - break;} -case 344: -#line 1791 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-7].filename, yyvsp[-6].lineno); - STRIP_NOPS (yyvsp[-2].ttype); - if ((TREE_CODE (yyvsp[-2].ttype) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (yyvsp[-2].ttype, 0)) == STRING_CST) - || TREE_CODE (yyvsp[-2].ttype) == STRING_CST) - expand_asm (yyvsp[-2].ttype); - else - error ("argument of `asm' is not a constant string"); ; - break;} -case 345: -#line 1802 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-9].filename, yyvsp[-8].lineno); - c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, - yyvsp[-6].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 346: -#line 1809 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-11].filename, yyvsp[-10].lineno); - c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, - yyvsp[-8].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 347: -#line 1817 "c-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-13].filename, yyvsp[-12].lineno); - c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, - yyvsp[-10].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 348: -#line 1823 "c-parse.y" -{ tree decl; - stmt_count++; - emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno); - decl = lookup_label (yyvsp[-1].ttype); - if (decl != 0) - { - TREE_USED (decl) = 1; - expand_goto (decl); - } - ; - break;} -case 349: -#line 1834 "c-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids `goto *expr;'"); - stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - expand_computed_goto (convert (ptr_type_node, yyvsp[-1].ttype)); ; - break;} -case 352: -#line 1849 "c-parse.y" -{ - /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ - - yyval.itype = 0; - if (TREE_CODE (yyvsp[-1].ttype) != VAR_DECL) - error ("invalid `for (ITERATOR)' syntax"); - else if (! ITERATOR_P (yyvsp[-1].ttype)) - error ("`%s' is not an iterator", - IDENTIFIER_POINTER (DECL_NAME (yyvsp[-1].ttype))); - else if (ITERATOR_BOUND_P (yyvsp[-1].ttype)) - error ("`for (%s)' inside expansion of same iterator", - IDENTIFIER_POINTER (DECL_NAME (yyvsp[-1].ttype))); - else - { - yyval.itype = 1; - iterator_for_loop_start (yyvsp[-1].ttype); - } - ; - break;} -case 353: -#line 1870 "c-parse.y" -{ - if (yyvsp[-1].itype) - iterator_for_loop_end (yyvsp[-3].ttype); - ; - break;} -case 354: -#line 1905 "c-parse.y" -{ register tree value = check_case_value (yyvsp[-1].ttype); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - stmt_count++; - - if (value != error_mark_node) - { - tree duplicate; - int success = pushcase (value, convert_and_check, - label, &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); ; - break;} -case 355: -#line 1930 "c-parse.y" -{ register tree value1 = check_case_value (yyvsp[-3].ttype); - register tree value2 = check_case_value (yyvsp[-1].ttype); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (pedantic) - pedwarn ("ANSI C forbids case ranges"); - stmt_count++; - - if (value1 != error_mark_node && value2 != error_mark_node) - { - tree duplicate; - int success = pushcase_range (value1, value2, - convert_and_check, label, - &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 4) - warning ("empty case range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); ; - break;} -case 356: -#line 1961 "c-parse.y" -{ - tree duplicate; - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - int success = pushcase (NULL_TREE, 0, label, &duplicate); - stmt_count++; - if (success == 1) - error ("default label not within a switch statement"); - else if (success == 2) - { - error ("multiple default labels in one switch"); - error_with_decl (duplicate, "this is the first default label"); - } - position_after_white_space (); ; - break;} -case 357: -#line 1976 "c-parse.y" -{ tree label = define_label (input_filename, lineno, yyvsp[-1].ttype); - stmt_count++; - emit_nop (); - if (label) - expand_label (label); - position_after_white_space (); ; - break;} -case 358: -#line 1988 "c-parse.y" -{ emit_line_note (input_filename, lineno); - yyval.ttype = NULL_TREE; ; - break;} -case 359: -#line 1991 "c-parse.y" -{ emit_line_note (input_filename, lineno); ; - break;} -case 360: -#line 1996 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 362: -#line 2003 "c-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 365: -#line 2010 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 366: -#line 2015 "c-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 367: -#line 2020 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ; - break;} -case 368: -#line 2022 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ; - break;} -case 369: -#line 2028 "c-parse.y" -{ pushlevel (0); - clear_parm_order (); - declare_parm_level (0); ; - break;} -case 370: -#line 2032 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - parmlist_tags_warning (); - poplevel (0, 0, 0); ; - break;} -case 372: -#line 2040 "c-parse.y" -{ tree parm; - if (pedantic) - pedwarn ("ANSI C forbids forward parameter declarations"); - /* Mark the forward decls as such. */ - for (parm = getdecls (); parm; parm = TREE_CHAIN (parm)) - TREE_ASM_WRITTEN (parm) = 1; - clear_parm_order (); ; - break;} -case 373: -#line 2048 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 374: -#line 2050 "c-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ; - break;} -case 375: -#line 2056 "c-parse.y" -{ yyval.ttype = get_parm_info (0); ; - break;} -case 376: -#line 2058 "c-parse.y" -{ yyval.ttype = get_parm_info (0); - /* Gcc used to allow this as an extension. However, it does - not work for all targets, and thus has been disabled. - Also, since func (...) and func () are indistinguishable, - it caused problems with the code in expand_builtin which - tries to verify that BUILT_IN_NEXT_ARG is being used - correctly. */ - error ("ANSI C requires a named argument before `...'"); - ; - break;} -case 377: -#line 2068 "c-parse.y" -{ yyval.ttype = get_parm_info (1); ; - break;} -case 378: -#line 2070 "c-parse.y" -{ yyval.ttype = get_parm_info (0); ; - break;} -case 379: -#line 2075 "c-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 380: -#line 2077 "c-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 381: -#line 2084 "c-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 382: -#line 2093 "c-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 383: -#line 2102 "c-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 384: -#line 2111 "c-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 385: -#line 2121 "c-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 386: -#line 2135 "c-parse.y" -{ pushlevel (0); - clear_parm_order (); - declare_parm_level (1); ; - break;} -case 387: -#line 2139 "c-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - parmlist_tags_warning (); - poplevel (0, 0, 0); ; - break;} -case 389: -#line 2147 "c-parse.y" -{ tree t; - for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t)) - if (TREE_VALUE (t) == NULL_TREE) - error ("`...' in old-style identifier list"); - yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 390: -#line 2157 "c-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 391: -#line 2159 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 392: -#line 2165 "c-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 393: -#line 2167 "c-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 394: -#line 2172 "c-parse.y" -{ yyval.itype = pedantic; - pedantic = 0; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/local/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 2176 "c-parse.y" - diff --git a/gcc/c-parse.h b/gcc/c-parse.h deleted file mode 100644 index 21b3d0caf6b..00000000000 --- a/gcc/c-parse.h +++ /dev/null @@ -1,64 +0,0 @@ -typedef union {long itype; tree ttype; enum tree_code code; - char *filename; int lineno; int ends_in_label; } YYSTYPE; -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SCSPEC 260 -#define TYPESPEC 261 -#define TYPE_QUAL 262 -#define CONSTANT 263 -#define STRING 264 -#define ELLIPSIS 265 -#define SIZEOF 266 -#define ENUM 267 -#define STRUCT 268 -#define UNION 269 -#define IF 270 -#define ELSE 271 -#define WHILE 272 -#define DO 273 -#define FOR 274 -#define SWITCH 275 -#define CASE 276 -#define DEFAULT 277 -#define BREAK 278 -#define CONTINUE 279 -#define RETURN 280 -#define GOTO 281 -#define ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define ATTRIBUTE 285 -#define EXTENSION 286 -#define LABEL 287 -#define REALPART 288 -#define IMAGPART 289 -#define ASSIGN 290 -#define OROR 291 -#define ANDAND 292 -#define EQCOMPARE 293 -#define ARITHCOMPARE 294 -#define LSHIFT 295 -#define RSHIFT 296 -#define UNARY 297 -#define PLUSPLUS 298 -#define MINUSMINUS 299 -#define HYPERUNARY 300 -#define POINTSAT 301 -#define INTERFACE 302 -#define IMPLEMENTATION 303 -#define END 304 -#define SELECTOR 305 -#define DEFS 306 -#define ENCODE 307 -#define CLASSNAME 308 -#define PUBLIC 309 -#define PRIVATE 310 -#define PROTECTED 311 -#define PROTOCOL 312 -#define OBJECTNAME 313 -#define CLASS 314 -#define ALIAS 315 -#define OBJC_STRING 316 - - -extern YYSTYPE yylval; diff --git a/gcc/c-parse.y b/gcc/c-parse.y deleted file mode 100644 index fd2b0f94a08..00000000000 --- a/gcc/c-parse.y +++ /dev/null @@ -1,2176 +0,0 @@ -/*WARNING: This file is automatically generated!*/ -/* YACC parser for C syntax and for Objective C. -*-c-*- - Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This file defines the grammar of C and that of Objective C. - ifobjc ... end ifobjc conditionals contain code for Objective C only. - ifc ... end ifc conditionals contain code for C only. - Sed commands in Makefile.in are used to convert this file into - c-parse.y and into objc-parse.y. */ - -/* To whomever it may concern: I have heard that such a thing was once - written by AT&T, but I have never seen it. */ - -%expect 46 - -/* These are the 23 conflicts you should get in parse.output; - the state numbers may vary if minor changes in the grammar are made. - -State 42 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) -State 44 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 103 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 110 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) -State 111 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 115 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 132 contains 1 shift/reduce conflict. (See comment at component_decl.) -State 180 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) -State 194 contains 2 shift/reduce conflict. (Four ways to parse this.) -State 202 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 214 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 220 contains 1 shift/reduce conflict. (Two ways to recover from error.) -State 304 contains 2 shift/reduce conflicts. (Four ways to parse this.) -State 335 contains 2 shift/reduce conflicts. (Four ways to parse this.) -State 347 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTES.) -State 352 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTES.) -State 383 contains 2 shift/reduce conflicts. (Four ways to parse this.) -State 434 contains 2 shift/reduce conflicts. (Four ways to parse this.) */ - - -%{ -#include <stdio.h> -#include <errno.h> -#include <setjmp.h> - -#include "config.h" -#include "tree.h" -#include "input.h" -#include "c-lex.h" -#include "c-tree.h" -#include "flags.h" - -#ifdef MULTIBYTE_CHARS -#include <stdlib.h> -#include <locale.h> -#endif - - -/* Since parsers are distinct for each language, put the language string - definition here. */ -char *language_string = "GNU C"; - -#ifndef errno -extern int errno; -#endif - -void yyerror (); - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 -%} - -%start program - -%union {long itype; tree ttype; enum tree_code code; - char *filename; int lineno; int ends_in_label; } - -/* All identifiers that are not reserved words - and are not declared typedefs in the current block */ -%token IDENTIFIER - -/* All identifiers that are declared typedefs in the current block. - In some contexts, they are treated just like IDENTIFIER, - but they can also serve as typespecs in declarations. */ -%token TYPENAME - -/* Reserved words that specify storage class. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token SCSPEC - -/* Reserved words that specify type. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token TYPESPEC - -/* Reserved words that qualify type: "const" or "volatile". - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token TYPE_QUAL - -/* Character or numeric constants. - yylval is the node for the constant. */ -%token CONSTANT - -/* String constants in raw form. - yylval is a STRING_CST node. */ -%token STRING - -/* "...", used for functions with variable arglists. */ -%token ELLIPSIS - -/* the reserved words */ -/* SCO include files test "ASM", so use something else. */ -%token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT -%token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF -%token ATTRIBUTE EXTENSION LABEL -%token REALPART IMAGPART - -/* Add precedence rules to solve dangling else s/r conflict */ -%nonassoc IF -%nonassoc ELSE - -/* Define the operator tokens and their precedences. - The value is an integer because, if used, it is the tree code - to use in the expression made from the operator. */ - -%right <code> ASSIGN '=' -%right <code> '?' ':' -%left <code> OROR -%left <code> ANDAND -%left <code> '|' -%left <code> '^' -%left <code> '&' -%left <code> EQCOMPARE -%left <code> ARITHCOMPARE -%left <code> LSHIFT RSHIFT -%left <code> '+' '-' -%left <code> '*' '/' '%' -%right <code> UNARY PLUSPLUS MINUSMINUS -%left HYPERUNARY -%left <code> POINTSAT '.' '(' '[' - -/* The Objective-C keywords. These are included in C and in - Objective C, so that the token codes are the same in both. */ -%token INTERFACE IMPLEMENTATION END SELECTOR DEFS ENCODE -%token CLASSNAME PUBLIC PRIVATE PROTECTED PROTOCOL OBJECTNAME CLASS ALIAS - -/* Objective-C string constants in raw form. - yylval is an OBJC_STRING_CST node. */ -%token OBJC_STRING - - -%type <code> unop - -%type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist -%type <ttype> expr_no_commas cast_expr unary_expr primary string STRING -%type <ttype> typed_declspecs reserved_declspecs -%type <ttype> typed_typespecs reserved_typespecquals -%type <ttype> declmods typespec typespecqual_reserved -%type <ttype> typed_declspecs_no_prefix_attr reserved_declspecs_no_prefix_attr -%type <ttype> declmods_no_prefix_attr -%type <ttype> SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual -%type <ttype> initdecls notype_initdecls initdcl notype_initdcl -%type <ttype> init maybeasm -%type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers -%type <ttype> maybe_attribute attributes attribute attribute_list attrib -%type <ttype> any_word - -%type <ttype> compstmt - -%type <ttype> declarator -%type <ttype> notype_declarator after_type_declarator -%type <ttype> parm_declarator - -%type <ttype> structsp component_decl_list component_decl_list2 -%type <ttype> component_decl components component_declarator -%type <ttype> enumlist enumerator -%type <ttype> typename absdcl absdcl1 type_quals -%type <ttype> xexpr parms parm identifiers - -%type <ttype> parmlist parmlist_1 parmlist_2 -%type <ttype> parmlist_or_identifiers parmlist_or_identifiers_1 -%type <ttype> identifiers_or_typenames - -%type <itype> setspecs - -%type <ends_in_label> lineno_stmt_or_label lineno_stmt_or_labels stmt_or_label - -%type <filename> save_filename -%type <lineno> save_lineno - - -%{ -/* Number of statements (loosely speaking) seen so far. */ -static int stmt_count; - -/* Input file and line number of the end of the body of last simple_if; - used by the stmt-rule immediately after simple_if returns. */ -static char *if_stmt_file; -static int if_stmt_line; - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs = NULL_TREE; -static tree prefix_attributes = NULL_TREE; - -/* Stack of saved values of current_declspecs and prefix_attributes. */ -static tree declspec_stack; - -/* 1 if we explained undeclared var errors. */ -static int undeclared_variable_notice; - - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint (); -%} - -%% -program: /* empty */ - { if (pedantic) - pedwarn ("ANSI C forbids an empty source file"); - finish_file (); - } - | extdefs - { - /* In case there were missing closebraces, - get us back to the global binding level. */ - while (! global_bindings_p ()) - poplevel (0, 0, 0); - finish_file (); - } - ; - -/* the reason for the strange actions in this rule - is so that notype_initdecls when reached via datadef - can find a valid list of type and sc specs in $0. */ - -extdefs: - {$<ttype>$ = NULL_TREE; } extdef - | extdefs {$<ttype>$ = NULL_TREE; } extdef - ; - -extdef: - fndef - | datadef - | ASM_KEYWORD '(' expr ')' ';' - { STRIP_NOPS ($3); - if ((TREE_CODE ($3) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST) - || TREE_CODE ($3) == STRING_CST) - assemble_asm ($3); - else - error ("argument of `asm' is not a constant string"); } - | extension extdef - { pedantic = $<itype>1; } - ; - -datadef: - setspecs notype_initdecls ';' - { if (pedantic) - error ("ANSI C forbids data definition with no type or storage class"); - else if (!flag_traditional) - warning ("data definition has no type or storage class"); - - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - | declmods setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods ';' - { pedwarn ("empty declaration"); } - | typed_declspecs ';' - { shadow_tag ($1); } - | error ';' - | error '}' - | ';' - { if (pedantic) - pedwarn ("ANSI C does not allow extra `;' outside of a function"); } - ; - -fndef: - typed_declspecs setspecs declarator - { if (! start_function (current_declspecs, $3, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator - { if (! start_function (current_declspecs, $3, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | setspecs notype_declarator - { if (! start_function (NULL_TREE, $2, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - | setspecs notype_declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - ; - -identifier: - IDENTIFIER - | TYPENAME - ; - -unop: '&' - { $$ = ADDR_EXPR; } - | '-' - { $$ = NEGATE_EXPR; } - | '+' - { $$ = CONVERT_EXPR; } - | PLUSPLUS - { $$ = PREINCREMENT_EXPR; } - | MINUSMINUS - { $$ = PREDECREMENT_EXPR; } - | '~' - { $$ = BIT_NOT_EXPR; } - | '!' - { $$ = TRUTH_NOT_EXPR; } - ; - -expr: nonnull_exprlist - { $$ = build_compound_expr ($1); } - ; - -exprlist: - /* empty */ - { $$ = NULL_TREE; } - | nonnull_exprlist - ; - -nonnull_exprlist: - expr_no_commas - { $$ = build_tree_list (NULL_TREE, $1); } - | nonnull_exprlist ',' expr_no_commas - { chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -unary_expr: - primary - | '*' cast_expr %prec UNARY - { $$ = build_indirect_ref ($2, "unary *"); } - /* __extension__ turns off -pedantic for following primary. */ - | extension cast_expr %prec UNARY - { $$ = $2; - pedantic = $<itype>1; } - | unop cast_expr %prec UNARY - { $$ = build_unary_op ($1, $2, 0); - overflow_warning ($$); } - /* Refer to the address of a label as a pointer. */ - | ANDAND identifier - { tree label = lookup_label ($2); - if (pedantic) - pedwarn ("ANSI C forbids `&&'"); - if (label == 0) - $$ = null_pointer_node; - else - { - TREE_USED (label) = 1; - $$ = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT ($$) = 1; - } - } -/* This seems to be impossible on some machines, so let's turn it off. - You can use __builtin_next_arg to find the anonymous stack args. - | '&' ELLIPSIS - { tree types = TYPE_ARG_TYPES (TREE_TYPE (current_function_decl)); - $$ = error_mark_node; - if (TREE_VALUE (tree_last (types)) == void_type_node) - error ("`&...' used in function with fixed number of arguments"); - else - { - if (pedantic) - pedwarn ("ANSI C forbids `&...'"); - $$ = tree_last (DECL_ARGUMENTS (current_function_decl)); - $$ = build_unary_op (ADDR_EXPR, $$, 0); - } } -*/ - | sizeof unary_expr %prec UNARY - { skip_evaluation--; - if (TREE_CODE ($2) == COMPONENT_REF - && DECL_BIT_FIELD (TREE_OPERAND ($2, 1))) - error ("`sizeof' applied to a bit-field"); - $$ = c_sizeof (TREE_TYPE ($2)); } - | sizeof '(' typename ')' %prec HYPERUNARY - { skip_evaluation--; - $$ = c_sizeof (groktypename ($3)); } - | alignof unary_expr %prec UNARY - { skip_evaluation--; - $$ = c_alignof_expr ($2); } - | alignof '(' typename ')' %prec HYPERUNARY - { skip_evaluation--; - $$ = c_alignof (groktypename ($3)); } - | REALPART cast_expr %prec UNARY - { $$ = build_unary_op (REALPART_EXPR, $2, 0); } - | IMAGPART cast_expr %prec UNARY - { $$ = build_unary_op (IMAGPART_EXPR, $2, 0); } - ; - -sizeof: - SIZEOF { skip_evaluation++; } - ; - -alignof: - ALIGNOF { skip_evaluation++; } - ; - -cast_expr: - unary_expr - | '(' typename ')' cast_expr %prec UNARY - { tree type = groktypename ($2); - $$ = build_c_cast (type, $4); } - | '(' typename ')' '{' - { start_init (NULL_TREE, NULL, 0); - $2 = groktypename ($2); - really_start_incremental_init ($2); } - initlist_maybe_comma '}' %prec UNARY - { char *name; - tree result = pop_init_level (0); - tree type = $2; - finish_init (); - - if (pedantic) - pedwarn ("ANSI C forbids constructor expressions"); - if (TYPE_NAME (type) != 0) - { - if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) - name = IDENTIFIER_POINTER (TYPE_NAME (type)); - else - name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); - } - else - name = ""; - $$ = result; - if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) - { - int failure = complete_array_type (type, $$, 1); - if (failure) - abort (); - } - } - ; - -expr_no_commas: - cast_expr - | expr_no_commas '+' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '-' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '*' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '/' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '%' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas LSHIFT expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas RSHIFT expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas ARITHCOMPARE expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas EQCOMPARE expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '&' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '|' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '^' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas ANDAND - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_false_node; } - expr_no_commas - { skip_evaluation -= $1 == boolean_false_node; - $$ = parser_build_binary_op (TRUTH_ANDIF_EXPR, $1, $4); } - | expr_no_commas OROR - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_true_node; } - expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = parser_build_binary_op (TRUTH_ORIF_EXPR, $1, $4); } - | expr_no_commas '?' - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_false_node; } - expr ':' - { skip_evaluation += (($1 == boolean_true_node) - - ($1 == boolean_false_node)); } - expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = build_conditional_expr ($1, $4, $7); } - | expr_no_commas '?' - { if (pedantic) - pedwarn ("ANSI C forbids omitting the middle term of a ?: expression"); - /* Make sure first operand is calculated only once. */ - $<ttype>2 = save_expr ($1); - $1 = truthvalue_conversion (default_conversion ($<ttype>2)); - skip_evaluation += $1 == boolean_true_node; } - ':' expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = build_conditional_expr ($1, $<ttype>2, $5); } - | expr_no_commas '=' expr_no_commas - { $$ = build_modify_expr ($1, NOP_EXPR, $3); - C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); } - | expr_no_commas ASSIGN expr_no_commas - { $$ = build_modify_expr ($1, $2, $3); - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE ($$, ERROR_MARK); } - ; - -primary: - IDENTIFIER - { - $$ = lastiddecl; - if (!$$ || $$ == error_mark_node) - { - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - { - /* Ordinary implicit function declaration. */ - $$ = implicitly_declare ($1); - assemble_external ($$); - TREE_USED ($$) = 1; - } - } - else if (current_function_decl == 0) - { - error ("`%s' undeclared here (not in a function)", - IDENTIFIER_POINTER ($1)); - $$ = error_mark_node; - } - else - { - { - if (IDENTIFIER_GLOBAL_VALUE ($1) != error_mark_node - || IDENTIFIER_ERROR_LOCUS ($1) != current_function_decl) - { - error ("`%s' undeclared (first use this function)", - IDENTIFIER_POINTER ($1)); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - $$ = error_mark_node; - /* Prevent repeated error messages. */ - IDENTIFIER_GLOBAL_VALUE ($1) = error_mark_node; - IDENTIFIER_ERROR_LOCUS ($1) = current_function_decl; - } - } - } - else if (TREE_TYPE ($$) == error_mark_node) - $$ = error_mark_node; - else if (C_DECL_ANTICIPATED ($$)) - { - /* The first time we see a build-in function used, - if it has not been declared. */ - C_DECL_ANTICIPATED ($$) = 0; - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - /* Omit the implicit declaration we - would ordinarily do, so we don't lose - the actual built in type. - But print a diagnostic for the mismatch. */ - if (TREE_CODE ($$) != FUNCTION_DECL) - error ("`%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME ($$))); - else if ((TYPE_MODE (TREE_TYPE (TREE_TYPE ($$))) - != TYPE_MODE (integer_type_node)) - && (TREE_TYPE (TREE_TYPE ($$)) - != void_type_node)) - pedwarn ("type mismatch in implicit declaration for built-in function `%s'", - IDENTIFIER_POINTER (DECL_NAME ($$))); - /* If it really returns void, change that to int. */ - if (TREE_TYPE (TREE_TYPE ($$)) == void_type_node) - TREE_TYPE ($$) - = build_function_type (integer_type_node, - TYPE_ARG_TYPES (TREE_TYPE ($$))); - } - else - pedwarn ("built-in function `%s' used without declaration", - IDENTIFIER_POINTER (DECL_NAME ($$))); - - /* Do what we would ordinarily do when a fn is used. */ - assemble_external ($$); - TREE_USED ($$) = 1; - } - else - { - assemble_external ($$); - TREE_USED ($$) = 1; - } - - if (TREE_CODE ($$) == CONST_DECL) - { - $$ = DECL_INITIAL ($$); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - $$ = build1 (NOP_EXPR, TREE_TYPE ($$), $$); - TREE_CONSTANT ($$) = 1; - } - } - | CONSTANT - | string - { $$ = combine_strings ($1); } - | '(' expr ')' - { char class = TREE_CODE_CLASS (TREE_CODE ($2)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - C_SET_EXP_ORIGINAL_CODE ($2, ERROR_MARK); - $$ = $2; } - | '(' error ')' - { $$ = error_mark_node; } - | '(' - { if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - /* We must force a BLOCK for this level - so that, if it is not expanded later, - there is a way to turn off the entire subtree of blocks - that are contained in it. */ - keep_next_level (); - push_iterator_stack (); - push_label_level (); - $<ttype>$ = expand_start_stmt_expr (); } - compstmt ')' - { tree rtl_exp; - if (pedantic) - pedwarn ("ANSI C forbids braced-groups within expressions"); - pop_iterator_stack (); - pop_label_level (); - rtl_exp = expand_end_stmt_expr ($<ttype>2); - /* The statements have side effects, so the group does. */ - TREE_SIDE_EFFECTS (rtl_exp) = 1; - - if (TREE_CODE ($3) == BLOCK) - { - /* Make a BIND_EXPR for the BLOCK already made. */ - $$ = build (BIND_EXPR, TREE_TYPE (rtl_exp), - NULL_TREE, rtl_exp, $3); - /* Remove the block from the tree at this point. - It gets put back at the proper place - when the BIND_EXPR is expanded. */ - delete_block ($3); - } - else - $$ = $3; - } - | primary '(' exprlist ')' %prec '.' - { $$ = build_function_call ($1, $3); } - | primary '[' expr ']' %prec '.' - { $$ = build_array_ref ($1, $3); } - | primary '.' identifier - { - $$ = build_component_ref ($1, $3); - } - | primary POINTSAT identifier - { - tree expr = build_indirect_ref ($1, "->"); - - $$ = build_component_ref (expr, $3); - } - | primary PLUSPLUS - { $$ = build_unary_op (POSTINCREMENT_EXPR, $1, 0); } - | primary MINUSMINUS - { $$ = build_unary_op (POSTDECREMENT_EXPR, $1, 0); } - ; - -/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ -string: - STRING - | string STRING - { $$ = chainon ($1, $2); } - ; - - -old_style_parm_decls: - /* empty */ - | datadecls - | datadecls ELLIPSIS - /* ... is used here to indicate a varargs function. */ - { c_mark_varargs (); - if (pedantic) - pedwarn ("ANSI C does not permit use of `varargs.h'"); } - ; - -/* The following are analogous to lineno_decl, decls and decl - except that they do not allow nested functions. - They are used for old-style parm decls. */ -lineno_datadecl: - save_filename save_lineno datadecl - { } - ; - -datadecls: - lineno_datadecl - | errstmt - | datadecls lineno_datadecl - | lineno_datadecl errstmt - ; - -/* We don't allow prefix attributes here because they cause reduce/reduce - conflicts: we can't know whether we're parsing a function decl with - attribute suffix, or function defn with attribute prefix on first old - style parm. */ -datadecl: - typed_declspecs_no_prefix_attr setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods_no_prefix_attr setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs_no_prefix_attr ';' - { shadow_tag_warned ($1, 1); - pedwarn ("empty declaration"); } - | declmods_no_prefix_attr ';' - { pedwarn ("empty declaration"); } - ; - -/* This combination which saves a lineno before a decl - is the normal thing to use, rather than decl itself. - This is to avoid shift/reduce conflicts in contexts - where statement labels are allowed. */ -lineno_decl: - save_filename save_lineno decl - { } - ; - -decls: - lineno_decl - | errstmt - | decls lineno_decl - | lineno_decl errstmt - ; - -/* records the type and storage class specs to use for processing - the declarators that follow. - Maintains a stack of outer-level values of current_declspecs, - for the sake of parm declarations nested in function declarators. */ -setspecs: /* empty */ - { $$ = suspend_momentary (); - pending_xref_error (); - declspec_stack = tree_cons (prefix_attributes, - current_declspecs, - declspec_stack); - split_specs_attrs ($<ttype>0, - ¤t_declspecs, &prefix_attributes); } - ; - -/* ??? Yuck. See after_type_declarator. */ -setattrs: /* empty */ - { prefix_attributes = chainon (prefix_attributes, $<ttype>0); } - ; - -decl: - typed_declspecs setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs nested_function - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_nested_function - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs ';' - { shadow_tag ($1); } - | declmods ';' - { pedwarn ("empty declaration"); } - | extension decl - { pedantic = $<itype>1; } - ; - -/* Declspecs which contain at least one type specifier or typedef name. - (Just `const' or `volatile' is not enough.) - A typedef'd name following these is taken as a name to be declared. - Declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -typed_declspecs: - typespec reserved_declspecs - { $$ = tree_cons (NULL_TREE, $1, $2); } - | declmods typespec reserved_declspecs - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_declspecs: /* empty */ - { $$ = NULL_TREE; } - | reserved_declspecs typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs attributes - { $$ = tree_cons ($2, NULL_TREE, $1); } - ; - -typed_declspecs_no_prefix_attr: - typespec reserved_declspecs_no_prefix_attr - { $$ = tree_cons (NULL_TREE, $1, $2); } - | declmods_no_prefix_attr typespec reserved_declspecs_no_prefix_attr - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_declspecs_no_prefix_attr: - /* empty */ - { $$ = NULL_TREE; } - | reserved_declspecs_no_prefix_attr typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs_no_prefix_attr SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -/* List of just storage classes, type modifiers, and prefix attributes. - A declaration can start with just this, but then it cannot be used - to redeclare a typedef-name. - Declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -declmods: - declmods_no_prefix_attr - { $$ = $1; } - | attributes - { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); } - | declmods declmods_no_prefix_attr - { $$ = chainon ($2, $1); } - | declmods attributes - { $$ = tree_cons ($2, NULL_TREE, $1); } - ; - -declmods_no_prefix_attr: - TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); - TREE_STATIC ($$) = 1; } - | SCSPEC - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } - | declmods_no_prefix_attr TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); - TREE_STATIC ($$) = 1; } - | declmods_no_prefix_attr SCSPEC - { if (extra_warnings && TREE_STATIC ($1)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); - TREE_STATIC ($$) = TREE_STATIC ($1); } - ; - - -/* Used instead of declspecs where storage classes are not allowed - (that is, for typenames and structure components). - Don't accept a typedef-name if anything but a modifier precedes it. */ - -typed_typespecs: - typespec reserved_typespecquals - { $$ = tree_cons (NULL_TREE, $1, $2); } - | nonempty_type_quals typespec reserved_typespecquals - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_typespecquals: /* empty */ - { $$ = NULL_TREE; } - | reserved_typespecquals typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -/* A typespec (but not a type qualifier). - Once we have seen one of these in a declaration, - if a typedef name appears then it is being redeclared. */ - -typespec: TYPESPEC - | structsp - | TYPENAME - { /* For a typedef name, record the meaning, not the name. - In case of `foo foo, bar;'. */ - $$ = lookup_name ($1); } - | TYPEOF '(' expr ')' - { $$ = TREE_TYPE ($3); } - | TYPEOF '(' typename ')' - { $$ = groktypename ($3); } - ; - -/* A typespec that is a reserved word, or a type qualifier. */ - -typespecqual_reserved: TYPESPEC - | TYPE_QUAL - | structsp - ; - -initdecls: - initdcl - | initdecls ',' initdcl - ; - -notype_initdecls: - notype_initdcl - | notype_initdecls ',' initdcl - ; - -maybeasm: - /* empty */ - { $$ = NULL_TREE; } - | ASM_KEYWORD '(' string ')' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); - $$ = $3; - } - ; - -initdcl: - declarator maybeasm maybe_attribute '=' - { $<ttype>$ = start_decl ($1, current_declspecs, 1, - $3, prefix_attributes); - start_init ($<ttype>$, $2, global_bindings_p ()); } - init -/* Note how the declaration of the variable is in effect while its init is parsed! */ - { finish_init (); - finish_decl ($<ttype>5, $6, $2); } - | declarator maybeasm maybe_attribute - { tree d = start_decl ($1, current_declspecs, 0, - $3, prefix_attributes); - finish_decl (d, NULL_TREE, $2); - } - ; - -notype_initdcl: - notype_declarator maybeasm maybe_attribute '=' - { $<ttype>$ = start_decl ($1, current_declspecs, 1, - $3, prefix_attributes); - start_init ($<ttype>$, $2, global_bindings_p ()); } - init -/* Note how the declaration of the variable is in effect while its init is parsed! */ - { finish_init (); - decl_attributes ($<ttype>5, $3, prefix_attributes); - finish_decl ($<ttype>5, $6, $2); } - | notype_declarator maybeasm maybe_attribute - { tree d = start_decl ($1, current_declspecs, 0, - $3, prefix_attributes); - finish_decl (d, NULL_TREE, $2); } - ; -/* the * rules are dummies to accept the Apollo extended syntax - so that the header files compile. */ -maybe_attribute: - /* empty */ - { $$ = NULL_TREE; } - | attributes - { $$ = $1; } - ; - -attributes: - attribute - { $$ = $1; } - | attributes attribute - { $$ = chainon ($1, $2); } - ; - -attribute: - ATTRIBUTE '(' '(' attribute_list ')' ')' - { $$ = $4; } - ; - -attribute_list: - attrib - { $$ = $1; } - | attribute_list ',' attrib - { $$ = chainon ($1, $3); } - ; - -attrib: - /* empty */ - { $$ = NULL_TREE; } - | any_word - { $$ = build_tree_list ($1, NULL_TREE); } - | any_word '(' IDENTIFIER ')' - { $$ = build_tree_list ($1, build_tree_list (NULL_TREE, $3)); } - | any_word '(' IDENTIFIER ',' nonnull_exprlist ')' - { $$ = build_tree_list ($1, tree_cons (NULL_TREE, $3, $5)); } - | any_word '(' exprlist ')' - { $$ = build_tree_list ($1, $3); } - ; - -/* This still leaves out most reserved keywords, - shouldn't we include them? */ - -any_word: - identifier - | SCSPEC - | TYPESPEC - | TYPE_QUAL - ; - -/* Initializers. `init' is the entry point. */ - -init: - expr_no_commas - | '{' - { really_start_incremental_init (NULL_TREE); - /* Note that the call to clear_momentary - is in process_init_element. */ - push_momentary (); } - initlist_maybe_comma '}' - { $$ = pop_init_level (0); - if ($$ == error_mark_node - && ! (yychar == STRING || yychar == CONSTANT)) - pop_momentary (); - else - pop_momentary_nofree (); } - - | error - { $$ = error_mark_node; } - ; - -/* `initlist_maybe_comma' is the guts of an initializer in braces. */ -initlist_maybe_comma: - /* empty */ - { if (pedantic) - pedwarn ("ANSI C forbids empty initializer braces"); } - | initlist1 maybecomma - ; - -initlist1: - initelt - | initlist1 ',' initelt - ; - -/* `initelt' is a single element of an initializer. - It may use braces. */ -initelt: - expr_no_commas - { process_init_element ($1); } - | '{' - { push_init_level (0); } - initlist_maybe_comma '}' - { process_init_element (pop_init_level (0)); } - | error - /* These are for labeled elements. The syntax for an array element - initializer conflicts with the syntax for an Objective-C message, - so don't include these productions in the Objective-C grammar. */ - | '[' expr_no_commas ELLIPSIS expr_no_commas ']' '=' - { set_init_index ($2, $4); } - initelt - | '[' expr_no_commas ']' '=' - { set_init_index ($2, NULL_TREE); } - initelt - | '[' expr_no_commas ']' - { set_init_index ($2, NULL_TREE); } - initelt - | identifier ':' - { set_init_label ($1); } - initelt - | '.' identifier '=' - { set_init_label ($2); } - initelt - ; - -nested_function: - declarator - { push_c_function_context (); - if (! start_function (current_declspecs, $1, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } -/* This used to use compstmt_or_error. - That caused a bug with input `f(g) int g {}', - where the use of YYERROR1 above caused an error - which then was handled by compstmt_or_error. - There followed a repeated execution of that same rule, - which called YYERROR1 again, and so on. */ - compstmt - { finish_function (1); - pop_c_function_context (); } - ; - -notype_nested_function: - notype_declarator - { push_c_function_context (); - if (! start_function (current_declspecs, $1, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } -/* This used to use compstmt_or_error. - That caused a bug with input `f(g) int g {}', - where the use of YYERROR1 above caused an error - which then was handled by compstmt_or_error. - There followed a repeated execution of that same rule, - which called YYERROR1 again, and so on. */ - compstmt - { finish_function (1); - pop_c_function_context (); } - ; - -/* Any kind of declarator (thus, all declarators allowed - after an explicit typespec). */ - -declarator: - after_type_declarator - | notype_declarator - ; - -/* A declarator that is allowed only after an explicit typespec. */ - -after_type_declarator: - '(' after_type_declarator ')' - { $$ = $2; } - | after_type_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | after_type_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | after_type_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | after_type_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '*' type_quals after_type_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs after_type_declarator - { $$ = $3; } - | TYPENAME - ; - -/* Kinds of declarator that can appear in a parameter list - in addition to notype_declarator. This is like after_type_declarator - but does not allow a typedef name in parentheses as an identifier - (because it would conflict with a function with that typedef as arg). */ - -parm_declarator: - parm_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | parm_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | parm_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | parm_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '*' type_quals parm_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs parm_declarator - { $$ = $3; } - | TYPENAME - ; - -/* A declarator allowed whether or not there has been - an explicit typespec. These cannot redeclare a typedef-name. */ - -notype_declarator: - notype_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | notype_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | '(' notype_declarator ')' - { $$ = $2; } - | '*' type_quals notype_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - | notype_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | notype_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs notype_declarator - { $$ = $3; } - | IDENTIFIER - ; - -structsp: - STRUCT identifier '{' - { $$ = start_struct (RECORD_TYPE, $2); - /* Start scope of tag before parsing components. */ - } - component_decl_list '}' maybe_attribute - { $$ = finish_struct ($<ttype>4, $5, $7); } - | STRUCT '{' component_decl_list '}' maybe_attribute - { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), - $3, $5); - } - | STRUCT identifier - { $$ = xref_tag (RECORD_TYPE, $2); } - | UNION identifier '{' - { $$ = start_struct (UNION_TYPE, $2); } - component_decl_list '}' maybe_attribute - { $$ = finish_struct ($<ttype>4, $5, $7); } - | UNION '{' component_decl_list '}' maybe_attribute - { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE), - $3, $5); - } - | UNION identifier - { $$ = xref_tag (UNION_TYPE, $2); } - | ENUM identifier '{' - { $<itype>3 = suspend_momentary (); - $$ = start_enum ($2); } - enumlist maybecomma_warn '}' maybe_attribute - { $$ = finish_enum ($<ttype>4, nreverse ($5), $8); - resume_momentary ($<itype>3); } - | ENUM '{' - { $<itype>2 = suspend_momentary (); - $$ = start_enum (NULL_TREE); } - enumlist maybecomma_warn '}' maybe_attribute - { $$ = finish_enum ($<ttype>3, nreverse ($4), $7); - resume_momentary ($<itype>2); } - | ENUM identifier - { $$ = xref_tag (ENUMERAL_TYPE, $2); } - ; - -maybecomma: - /* empty */ - | ',' - ; - -maybecomma_warn: - /* empty */ - | ',' - { if (pedantic) pedwarn ("comma at end of enumerator list"); } - ; - -component_decl_list: - component_decl_list2 - { $$ = $1; } - | component_decl_list2 component_decl - { $$ = chainon ($1, $2); - pedwarn ("no semicolon at end of struct or union"); } - ; - -component_decl_list2: /* empty */ - { $$ = NULL_TREE; } - | component_decl_list2 component_decl ';' - { $$ = chainon ($1, $2); } - | component_decl_list2 ';' - { if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); } - ; - -/* There is a shift-reduce conflict here, because `components' may - start with a `typename'. It happens that shifting (the default resolution) - does the right thing, because it treats the `typename' as part of - a `typed_typespecs'. - - It is possible that this same technique would allow the distinction - between `notype_initdecls' and `initdecls' to be eliminated. - But I am being cautious and not trying it. */ - -component_decl: - typed_typespecs setspecs components - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_typespecs - { if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag($1); - $$ = NULL_TREE; } - | nonempty_type_quals setspecs components - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | nonempty_type_quals - { if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag($1); - $$ = NULL_TREE; } - | error - { $$ = NULL_TREE; } - | extension component_decl - { $$ = $2; - pedantic = $<itype>1; } - ; - -components: - component_declarator - | components ',' component_declarator - { $$ = chainon ($1, $3); } - ; - -component_declarator: - save_filename save_lineno declarator maybe_attribute - { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); - decl_attributes ($$, $4, prefix_attributes); } - | save_filename save_lineno - declarator ':' expr_no_commas maybe_attribute - { $$ = grokfield ($1, $2, $3, current_declspecs, $5); - decl_attributes ($$, $6, prefix_attributes); } - | save_filename save_lineno ':' expr_no_commas maybe_attribute - { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); - decl_attributes ($$, $5, prefix_attributes); } - ; - -/* We chain the enumerators in reverse order. - They are put in forward order where enumlist is used. - (The order used to be significant, but no longer is so. - However, we still maintain the order, just to be clean.) */ - -enumlist: - enumerator - | enumlist ',' enumerator - { if ($1 == error_mark_node) - $$ = $1; - else - $$ = chainon ($3, $1); } - | error - { $$ = error_mark_node; } - ; - - -enumerator: - identifier - { $$ = build_enumerator ($1, NULL_TREE); } - | identifier '=' expr_no_commas - { $$ = build_enumerator ($1, $3); } - ; - -typename: - typed_typespecs absdcl - { $$ = build_tree_list ($1, $2); } - | nonempty_type_quals absdcl - { $$ = build_tree_list ($1, $2); } - ; - -absdcl: /* an absolute declarator */ - /* empty */ - { $$ = NULL_TREE; } - | absdcl1 - ; - -nonempty_type_quals: - TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } - | nonempty_type_quals TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -type_quals: - /* empty */ - { $$ = NULL_TREE; } - | type_quals TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -absdcl1: /* a nonempty absolute declarator */ - '(' absdcl1 ')' - { $$ = $2; } - /* `(typedef)1' is `int'. */ - | '*' type_quals absdcl1 %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - | '*' type_quals %prec UNARY - { $$ = make_pointer_declarator ($2, NULL_TREE); } - | absdcl1 '(' parmlist %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } - | absdcl1 '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | absdcl1 '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '(' parmlist %prec '.' - { $$ = build_nt (CALL_EXPR, NULL_TREE, $2, NULL_TREE); } - | '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, NULL_TREE, $2); } - | '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); } - /* ??? It appears we have to support attributes here, however - using prefix_attributes is wrong. */ - ; - -/* at least one statement, the first of which parses without error. */ -/* stmts is used only after decls, so an invalid first statement - is actually regarded as an invalid decl and part of the decls. */ - -stmts: - lineno_stmt_or_labels - { - if (pedantic && $1) - pedwarn ("ANSI C forbids label at end of compound statement"); - } - ; - -lineno_stmt_or_labels: - lineno_stmt_or_label - | lineno_stmt_or_labels lineno_stmt_or_label - { $$ = $2; } - | lineno_stmt_or_labels errstmt - { $$ = 0; } - ; - -xstmts: - /* empty */ - | stmts - ; - -errstmt: error ';' - ; - -pushlevel: /* empty */ - { emit_line_note (input_filename, lineno); - pushlevel (0); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); - } - ; - -/* Read zero or more forward-declarations for labels - that nested functions can jump to. */ -maybe_label_decls: - /* empty */ - | label_decls - { if (pedantic) - pedwarn ("ANSI C forbids label declarations"); } - ; - -label_decls: - label_decl - | label_decls label_decl - ; - -label_decl: - LABEL identifiers_or_typenames ';' - { tree link; - for (link = $2; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - } - ; - -/* This is the body of a function definition. - It causes syntax errors to ignore to the next openbrace. */ -compstmt_or_error: - compstmt - {} - | error compstmt - ; - -compstmt: '{' '}' - { $$ = convert (void_type_node, integer_zero_node); } - | '{' pushlevel maybe_label_decls decls xstmts '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - $$ = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | '{' pushlevel maybe_label_decls error '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - $$ = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | '{' pushlevel maybe_label_decls stmts '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - $$ = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - ; - -/* Value is number of statements counted as of the closeparen. */ -simple_if: - if_prefix lineno_labeled_stmt -/* Make sure expand_end_cond is run once - for each call to expand_start_cond. - Otherwise a crash is likely. */ - | if_prefix error - ; - -if_prefix: - IF '(' expr ')' - { emit_line_note ($<filename>-1, $<lineno>0); - expand_start_cond (truthvalue_conversion ($3), 0); - $<itype>$ = stmt_count; - if_stmt_file = $<filename>-1; - if_stmt_line = $<lineno>0; - position_after_white_space (); } - ; - -/* This is a subroutine of stmt. - It is used twice, once for valid DO statements - and once for catching errors in parsing the end test. */ -do_stmt_start: - DO - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* See comment in `while' alternative, above. */ - emit_nop (); - expand_start_loop_continue_elsewhere (1); - position_after_white_space (); } - lineno_labeled_stmt WHILE - { expand_loop_continue_here (); } - ; - -save_filename: - { $$ = input_filename; } - ; - -save_lineno: - { $$ = lineno; } - ; - -lineno_labeled_stmt: - save_filename save_lineno stmt - { } -/* | save_filename save_lineno error - { } -*/ - | save_filename save_lineno label lineno_labeled_stmt - { } - ; - -lineno_stmt_or_label: - save_filename save_lineno stmt_or_label - { $$ = $3; } - ; - -stmt_or_label: - stmt - { $$ = 0; } - | label - { $$ = 1; } - ; - -/* Parse a single real statement, not including any labels. */ -stmt: - compstmt - { stmt_count++; } - | all_iter_stmt - | expr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); -/* It appears that this should not be done--that a non-lvalue array - shouldn't get an error if the value isn't used. - Section 3.2.2.1 says that an array lvalue gets converted to a pointer - if it appears as a top-level expression, - but says nothing about non-lvalue arrays. */ -#if 0 - /* Call default_conversion to get an error - on referring to a register array if pedantic. */ - if (TREE_CODE (TREE_TYPE ($1)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE ($1)) == FUNCTION_TYPE) - $1 = default_conversion ($1); -#endif - iterator_expand ($1); - clear_momentary (); } - | simple_if ELSE - { expand_start_else (); - $<itype>1 = stmt_count; - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_cond (); - if (extra_warnings && stmt_count == $<itype>1) - warning ("empty body in an else-statement"); } - | simple_if %prec IF - { expand_end_cond (); - /* This warning is here instead of in simple_if, because we - do not want a warning if an empty if is followed by an - else statement. Increment stmt_count so we don't - give a second error if this is a nested `if'. */ - if (extra_warnings && stmt_count++ == $<itype>1) - warning_with_file_and_line (if_stmt_file, if_stmt_line, - "empty body in an if-statement"); } -/* Make sure expand_end_cond is run once - for each call to expand_start_cond. - Otherwise a crash is likely. */ - | simple_if ELSE error - { expand_end_cond (); } - | WHILE - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* The emit_nop used to come before emit_line_note, - but that made the nop seem like part of the preceding line. - And that was confusing when the preceding line was - inside of an if statement and was not really executed. - I think it ought to work to put the nop after the line number. - We will see. --rms, July 15, 1991. */ - emit_nop (); } - '(' expr ')' - { /* Don't start the loop till we have succeeded - in parsing the end test. This is to make sure - that we end every loop we start. */ - expand_start_loop (1); - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($4)); - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_loop (); } - | do_stmt_start - '(' expr ')' ';' - { emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($3)); - expand_end_loop (); - clear_momentary (); } -/* This rule is needed to make sure we end every loop we start. */ - | do_stmt_start error - { expand_end_loop (); - clear_momentary (); } - | FOR - '(' xexpr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* See comment in `while' alternative, above. */ - emit_nop (); - if ($3) c_expand_expr_stmt ($3); - /* Next step is to call expand_start_loop_continue_elsewhere, - but wait till after we parse the entire for (...). - Otherwise, invalid input might cause us to call that - fn without calling expand_end_loop. */ - } - xexpr ';' - /* Can't emit now; wait till after expand_start_loop... */ - { $<lineno>7 = lineno; - $<filename>$ = input_filename; } - xexpr ')' - { - /* Start the loop. Doing this after parsing - all the expressions ensures we will end the loop. */ - expand_start_loop_continue_elsewhere (1); - /* Emit the end-test, with a line number. */ - emit_line_note ($<filename>8, $<lineno>7); - if ($6) - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($6)); - /* Don't let the tree nodes for $9 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - $<lineno>7 = lineno; - $<filename>8 = input_filename; - position_after_white_space (); } - lineno_labeled_stmt - { /* Emit the increment expression, with a line number. */ - emit_line_note ($<filename>8, $<lineno>7); - expand_loop_continue_here (); - if ($9) - c_expand_expr_stmt ($9); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - expand_end_loop (); } - | SWITCH '(' expr ')' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_start_case ($3); - /* Don't let the tree nodes for $3 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_case ($3); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | BREAK ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - if ( ! expand_exit_something ()) - error ("break statement not within loop or switch"); } - | CONTINUE ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - if (! expand_continue_loop (NULL_PTR)) - error ("continue statement not within a loop"); } - | RETURN ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_return (NULL_TREE); } - | RETURN expr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_return ($2); } - | ASM_KEYWORD maybe_type_qual '(' expr ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - STRIP_NOPS ($4); - if ((TREE_CODE ($4) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND ($4, 0)) == STRING_CST) - || TREE_CODE ($4) == STRING_CST) - expand_asm ($4); - else - error ("argument of `asm' is not a constant string"); } - /* This is the case with just output operands. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - /* This is the case with input operands as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' asm_operands ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, $8, NULL_TREE, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - /* This is the case with clobbered registers as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' - asm_operands ':' asm_clobbers ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, $8, $10, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - | GOTO identifier ';' - { tree decl; - stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - decl = lookup_label ($2); - if (decl != 0) - { - TREE_USED (decl) = 1; - expand_goto (decl); - } - } - | GOTO '*' expr ';' - { if (pedantic) - pedwarn ("ANSI C forbids `goto *expr;'"); - stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - expand_computed_goto (convert (ptr_type_node, $3)); } - | ';' - ; - -all_iter_stmt: - all_iter_stmt_simple -/* | all_iter_stmt_with_decl */ - ; - -all_iter_stmt_simple: - FOR '(' primary ')' - { - /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ - - $<itype>$ = 0; - if (TREE_CODE ($3) != VAR_DECL) - error ("invalid `for (ITERATOR)' syntax"); - else if (! ITERATOR_P ($3)) - error ("`%s' is not an iterator", - IDENTIFIER_POINTER (DECL_NAME ($3))); - else if (ITERATOR_BOUND_P ($3)) - error ("`for (%s)' inside expansion of same iterator", - IDENTIFIER_POINTER (DECL_NAME ($3))); - else - { - $<itype>$ = 1; - iterator_for_loop_start ($3); - } - } - lineno_labeled_stmt - { - if ($<itype>5) - iterator_for_loop_end ($3); - } - -/* This really should allow any kind of declaration, - for generality. Fix it before turning it back on. - -all_iter_stmt_with_decl: - FOR '(' ITERATOR pushlevel setspecs iterator_spec ')' - { -*/ /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ -/* - iterator_for_loop_start ($6); - } - lineno_labeled_stmt - { - iterator_for_loop_end ($6); - emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - $<ttype>$ = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - } -*/ - -/* Any kind of label, including jump labels and case labels. - ANSI C accepts labels only before statements, but we allow them - also at the end of a compound statement. */ - -label: CASE expr_no_commas ':' - { register tree value = check_case_value ($2); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - stmt_count++; - - if (value != error_mark_node) - { - tree duplicate; - int success = pushcase (value, convert_and_check, - label, &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); } - | CASE expr_no_commas ELLIPSIS expr_no_commas ':' - { register tree value1 = check_case_value ($2); - register tree value2 = check_case_value ($4); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (pedantic) - pedwarn ("ANSI C forbids case ranges"); - stmt_count++; - - if (value1 != error_mark_node && value2 != error_mark_node) - { - tree duplicate; - int success = pushcase_range (value1, value2, - convert_and_check, label, - &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 4) - warning ("empty case range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); } - | DEFAULT ':' - { - tree duplicate; - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - int success = pushcase (NULL_TREE, 0, label, &duplicate); - stmt_count++; - if (success == 1) - error ("default label not within a switch statement"); - else if (success == 2) - { - error ("multiple default labels in one switch"); - error_with_decl (duplicate, "this is the first default label"); - } - position_after_white_space (); } - | identifier ':' - { tree label = define_label (input_filename, lineno, $1); - stmt_count++; - emit_nop (); - if (label) - expand_label (label); - position_after_white_space (); } - ; - -/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ - -maybe_type_qual: - /* empty */ - { emit_line_note (input_filename, lineno); - $$ = NULL_TREE; } - | TYPE_QUAL - { emit_line_note (input_filename, lineno); } - ; - -xexpr: - /* empty */ - { $$ = NULL_TREE; } - | expr - ; - -/* These are the operands other than the first string and colon - in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ -asm_operands: /* empty */ - { $$ = NULL_TREE; } - | nonnull_asm_operands - ; - -nonnull_asm_operands: - asm_operand - | nonnull_asm_operands ',' asm_operand - { $$ = chainon ($1, $3); } - ; - -asm_operand: - STRING '(' expr ')' - { $$ = build_tree_list ($1, $3); } - ; - -asm_clobbers: - string - { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE); } - | asm_clobbers ',' string - { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); } - ; - -/* This is what appears inside the parens in a function declarator. - Its value is a list of ..._TYPE nodes. */ -parmlist: - { pushlevel (0); - clear_parm_order (); - declare_parm_level (0); } - parmlist_1 - { $$ = $2; - parmlist_tags_warning (); - poplevel (0, 0, 0); } - ; - -parmlist_1: - parmlist_2 ')' - | parms ';' - { tree parm; - if (pedantic) - pedwarn ("ANSI C forbids forward parameter declarations"); - /* Mark the forward decls as such. */ - for (parm = getdecls (); parm; parm = TREE_CHAIN (parm)) - TREE_ASM_WRITTEN (parm) = 1; - clear_parm_order (); } - parmlist_1 - { $$ = $4; } - | error ')' - { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } - ; - -/* This is what appears inside the parens in a function declarator. - Is value is represented in the format that grokdeclarator expects. */ -parmlist_2: /* empty */ - { $$ = get_parm_info (0); } - | ELLIPSIS - { $$ = get_parm_info (0); - /* Gcc used to allow this as an extension. However, it does - not work for all targets, and thus has been disabled. - Also, since func (...) and func () are indistinguishable, - it caused problems with the code in expand_builtin which - tries to verify that BUILT_IN_NEXT_ARG is being used - correctly. */ - error ("ANSI C requires a named argument before `...'"); - } - | parms - { $$ = get_parm_info (1); } - | parms ',' ELLIPSIS - { $$ = get_parm_info (0); } - ; - -parms: - parm - { push_parm_decl ($1); } - | parms ',' parm - { push_parm_decl ($3); } - ; - -/* A single parameter declaration or parameter type name, - as found in a parmlist. */ -parm: - typed_declspecs setspecs parm_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs notype_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs absdcl maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - - | declmods setspecs absdcl maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - ; - -/* This is used in a function definition - where either a parmlist or an identifier list is ok. - Its value is a list of ..._TYPE nodes or a list of identifiers. */ -parmlist_or_identifiers: - { pushlevel (0); - clear_parm_order (); - declare_parm_level (1); } - parmlist_or_identifiers_1 - { $$ = $2; - parmlist_tags_warning (); - poplevel (0, 0, 0); } - ; - -parmlist_or_identifiers_1: - parmlist_1 - | identifiers ')' - { tree t; - for (t = $1; t; t = TREE_CHAIN (t)) - if (TREE_VALUE (t) == NULL_TREE) - error ("`...' in old-style identifier list"); - $$ = tree_cons (NULL_TREE, NULL_TREE, $1); } - ; - -/* A nonempty list of identifiers. */ -identifiers: - IDENTIFIER - { $$ = build_tree_list (NULL_TREE, $1); } - | identifiers ',' IDENTIFIER - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -/* A nonempty list of identifiers, including typenames. */ -identifiers_or_typenames: - identifier - { $$ = build_tree_list (NULL_TREE, $1); } - | identifiers_or_typenames ',' identifier - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -extension: - EXTENSION - { $<itype>$ = pedantic; - pedantic = 0; } - ; - -%% diff --git a/gcc/cexp.c b/gcc/cexp.c deleted file mode 100644 index a4f2cc53029..00000000000 --- a/gcc/cexp.c +++ /dev/null @@ -1,2142 +0,0 @@ - -/* A Bison parser, made from cexp.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define INT 258 -#define CHAR 259 -#define NAME 260 -#define ERROR 261 -#define OR 262 -#define AND 263 -#define EQUAL 264 -#define NOTEQUAL 265 -#define LEQ 266 -#define GEQ 267 -#define LSH 268 -#define RSH 269 -#define UNARY 270 - -#line 27 "cexp.y" - -#include "config.h" -#include <setjmp.h> -/* #define YYDEBUG 1 */ - -/* The following symbols should be autoconfigured: - HAVE_STDLIB_H - STDC_HEADERS - In the mean time, we'll get by with approximations based - on existing GCC configuration symbols. */ - -#ifdef POSIX -# ifndef HAVE_STDLIB_H -# define HAVE_STDLIB_H 1 -# endif -# ifndef STDC_HEADERS -# define STDC_HEADERS 1 -# endif -#endif /* defined (POSIX) */ - -#if STDC_HEADERS -# include <string.h> -#endif - -#if HAVE_STDLIB_H || defined (MULTIBYTE_CHARS) -# include <stdlib.h> -#endif - -#ifdef MULTIBYTE_CHARS -#include <locale.h> -#endif - -#include <stdio.h> - -typedef unsigned char U_CHAR; - -/* This is used for communicating lists of keywords with cccp.c. */ -struct arglist { - struct arglist *next; - U_CHAR *name; - int length; - int argno; -}; - -/* Define a generic NULL if one hasn't already been defined. */ - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef GENERIC_PTR -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define GENERIC_PTR void * -#else -#define GENERIC_PTR char * -#endif -#endif - -#ifndef NULL_PTR -#define NULL_PTR ((GENERIC_PTR) 0) -#endif - -/* Find the largest host integer type and set its size and type. - Don't blindly use `long'; on some crazy hosts it is shorter than `int'. */ - -#ifndef HOST_BITS_PER_WIDE_INT - -#if HOST_BITS_PER_LONG > HOST_BITS_PER_INT -#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG -#define HOST_WIDE_INT long -#else -#define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT -#define HOST_WIDE_INT int -#endif - -#endif - -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) -# define __attribute__(x) -#endif - -#ifndef PROTO -# if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -# define PROTO(ARGS) ARGS -# else -# define PROTO(ARGS) () -# endif -#endif - -#if defined (__STDC__) && defined (HAVE_VPRINTF) -# include <stdarg.h> -# define VA_START(va_list, var) va_start (va_list, var) -# define PRINTF_ALIST(msg) char *msg, ... -# define PRINTF_DCL(msg) -# define PRINTF_PROTO(ARGS, m, n) PROTO (ARGS) __attribute__ ((format (__printf__, m, n))) -#else -# include <varargs.h> -# define VA_START(va_list, var) va_start (va_list) -# define PRINTF_ALIST(msg) msg, va_alist -# define PRINTF_DCL(msg) char *msg; va_dcl -# define PRINTF_PROTO(ARGS, m, n) () __attribute__ ((format (__printf__, m, n))) -# define vfprintf(file, msg, args) \ - { \ - char *a0 = va_arg(args, char *); \ - char *a1 = va_arg(args, char *); \ - char *a2 = va_arg(args, char *); \ - char *a3 = va_arg(args, char *); \ - fprintf (file, msg, a0, a1, a2, a3); \ - } -#endif - -#define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2) - -HOST_WIDE_INT parse_c_expression PROTO((char *)); - -static int yylex PROTO((void)); -static void yyerror PROTO((char *)) __attribute__ ((noreturn)); -static HOST_WIDE_INT expression_value; - -static jmp_buf parse_return_error; - -/* Nonzero means count most punctuation as part of a name. */ -static int keyword_parsing = 0; - -/* Nonzero means do not evaluate this expression. - This is a count, since unevaluated expressions can nest. */ -static int skip_evaluation; - -/* some external tables of character types */ -extern unsigned char is_idstart[], is_idchar[], is_space[]; - -/* Flag for -pedantic. */ -extern int pedantic; - -/* Flag for -traditional. */ -extern int traditional; - -/* Flag for -lang-c89. */ -extern int c89; - -/* Flag for -Wundef. */ -extern int warn_undef; - -#ifndef CHAR_TYPE_SIZE -#define CHAR_TYPE_SIZE BITS_PER_UNIT -#endif - -#ifndef INT_TYPE_SIZE -#define INT_TYPE_SIZE BITS_PER_WORD -#endif - -#ifndef LONG_TYPE_SIZE -#define LONG_TYPE_SIZE BITS_PER_WORD -#endif - -#ifndef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE INT_TYPE_SIZE -#endif - -#ifndef MAX_CHAR_TYPE_SIZE -#define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE -#endif - -#ifndef MAX_INT_TYPE_SIZE -#define MAX_INT_TYPE_SIZE INT_TYPE_SIZE -#endif - -#ifndef MAX_LONG_TYPE_SIZE -#define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE -#endif - -#ifndef MAX_WCHAR_TYPE_SIZE -#define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE -#endif - -#if MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT -#define MAX_CHAR_TYPE_MASK (~ (~ (HOST_WIDE_INT) 0 << MAX_CHAR_TYPE_SIZE)) -#else -#define MAX_CHAR_TYPE_MASK (~ (HOST_WIDE_INT) 0) -#endif - -#if MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT -#define MAX_WCHAR_TYPE_MASK (~ (~ (HOST_WIDE_INT) 0 << MAX_WCHAR_TYPE_SIZE)) -#else -#define MAX_WCHAR_TYPE_MASK (~ (HOST_WIDE_INT) 0) -#endif - -/* Suppose A1 + B1 = SUM1, using 2's complement arithmetic ignoring overflow. - Suppose A, B and SUM have the same respective signs as A1, B1, and SUM1. - Suppose SIGNEDP is negative if the result is signed, zero if unsigned. - Then this yields nonzero if overflow occurred during the addition. - Overflow occurs if A and B have the same sign, but A and SUM differ in sign, - and SIGNEDP is negative. - Use `^' to test whether signs differ, and `< 0' to isolate the sign. */ -#define overflow_sum_sign(a, b, sum, signedp) \ - ((~((a) ^ (b)) & ((a) ^ (sum)) & (signedp)) < 0) - -struct constant; - -GENERIC_PTR xmalloc PROTO((size_t)); -HOST_WIDE_INT parse_escape PROTO((char **, HOST_WIDE_INT)); -int check_assertion PROTO((U_CHAR *, int, int, struct arglist *)); -struct hashnode *lookup PROTO((U_CHAR *, int, int)); -void error PRINTF_PROTO_1((char *, ...)); -void pedwarn PRINTF_PROTO_1((char *, ...)); -void warning PRINTF_PROTO_1((char *, ...)); - -static int parse_number PROTO((int)); -static HOST_WIDE_INT left_shift PROTO((struct constant *, unsigned HOST_WIDE_INT)); -static HOST_WIDE_INT right_shift PROTO((struct constant *, unsigned HOST_WIDE_INT)); -static void integer_overflow PROTO((void)); - -/* `signedp' values */ -#define SIGNED (~0) -#define UNSIGNED 0 - -#line 244 "cexp.y" -typedef union { - struct constant {HOST_WIDE_INT value; int signedp;} integer; - struct name {U_CHAR *address; int length;} name; - struct arglist *keywords; -} YYSTYPE; - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 77 -#define YYFLAG -32768 -#define YYNTBASE 34 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 43) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 29, 2, 31, 2, 27, 14, 2, 32, - 33, 25, 23, 9, 24, 2, 26, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 8, 2, 17, - 2, 18, 7, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 12, 2, 30, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 10, 11, 15, 16, 19, 20, 21, 22, 28 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 8, 11, 14, 17, 20, 23, 24, - 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, - 71, 75, 79, 83, 87, 91, 95, 99, 100, 105, - 106, 111, 112, 113, 121, 123, 125, 127, 128, 133 -}; - -static const short yyrhs[] = { 35, - 0, 36, 0, 35, 9, 36, 0, 24, 36, 0, - 29, 36, 0, 23, 36, 0, 30, 36, 0, 31, - 5, 0, 0, 31, 5, 37, 32, 42, 33, 0, - 32, 35, 33, 0, 36, 25, 36, 0, 36, 26, - 36, 0, 36, 27, 36, 0, 36, 23, 36, 0, - 36, 24, 36, 0, 36, 21, 36, 0, 36, 22, - 36, 0, 36, 15, 36, 0, 36, 16, 36, 0, - 36, 19, 36, 0, 36, 20, 36, 0, 36, 17, - 36, 0, 36, 18, 36, 0, 36, 14, 36, 0, - 36, 13, 36, 0, 36, 12, 36, 0, 0, 36, - 11, 38, 36, 0, 0, 36, 10, 39, 36, 0, - 0, 0, 36, 7, 40, 36, 8, 41, 36, 0, - 3, 0, 4, 0, 5, 0, 0, 32, 42, 33, - 42, 0, 5, 42, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 274, 279, 280, 287, 292, 295, 297, 300, 304, 306, - 311, 316, 329, 346, 359, 365, 371, 377, 383, 386, - 389, 396, 403, 410, 417, 420, 423, 426, 429, 432, - 435, 438, 440, 443, 446, 448, 450, 458, 460, 473 -}; - -static const char * const yytname[] = { "$","error","$undefined.","INT","CHAR", -"NAME","ERROR","'?'","':'","','","OR","AND","'|'","'^'","'&'","EQUAL","NOTEQUAL", -"'<'","'>'","LEQ","GEQ","LSH","RSH","'+'","'-'","'*'","'/'","'%'","UNARY","'!'", -"'~'","'#'","'('","')'","start","exp1","exp","@1","@2","@3","@4","@5","keywords", -"" -}; -#endif - -static const short yyr1[] = { 0, - 34, 35, 35, 36, 36, 36, 36, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 38, 36, 39, - 36, 40, 41, 36, 36, 36, 36, 42, 42, 42 -}; - -static const short yyr2[] = { 0, - 1, 1, 3, 2, 2, 2, 2, 2, 0, 6, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 0, 4, 0, - 4, 0, 0, 7, 1, 1, 1, 0, 4, 2 -}; - -static const short yydefact[] = { 0, - 35, 36, 37, 0, 0, 0, 0, 0, 0, 1, - 2, 6, 4, 5, 7, 8, 0, 0, 32, 30, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 3, - 0, 0, 0, 27, 26, 25, 19, 20, 23, 24, - 21, 22, 17, 18, 15, 16, 12, 13, 14, 38, - 0, 31, 29, 38, 38, 0, 33, 40, 0, 10, - 0, 38, 34, 39, 0, 0, 0 -}; - -static const short yydefgoto[] = { 75, - 10, 11, 38, 43, 42, 41, 71, 66 -}; - -static const short yypact[] = { 12, --32768,-32768,-32768, 12, 12, 12, 12, 1, 12, 4, - 79,-32768,-32768,-32768,-32768, -21, 31, 12,-32768,-32768, --32768, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 30,-32768, 79, - 12, 12, 12, 110, 124, 137, 148, 148, 155, 155, - 155, 155, 160, 160, -17, -17,-32768,-32768,-32768, 2, - 58, 34, 95, 2, 2, 54,-32768,-32768, 55,-32768, - 12, 2, 79,-32768, 63, 188,-32768 -}; - -static const short yypgoto[] = {-32768, - 180, -4,-32768,-32768,-32768,-32768,-32768, -60 -}; - - -#define YYLAST 189 - - -static const short yytable[] = { 12, - 13, 14, 15, 68, 69, 16, 64, 35, 36, 37, - -9, 74, 18, 40, 1, 2, 3, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 65, 4, 5, 61, 62, 63, 18, - 6, 7, 8, 9, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 60, 76, 39, 19, 67, 73, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 19, 70, 72, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 31, 32, 33, 34, 35, - 36, 37, 33, 34, 35, 36, 37, 77, 17 -}; - -static const short yycheck[] = { 4, - 5, 6, 7, 64, 65, 5, 5, 25, 26, 27, - 32, 72, 9, 18, 3, 4, 5, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 32, 23, 24, 41, 42, 43, 9, - 29, 30, 31, 32, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 32, 0, 33, 7, 8, 71, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 7, 33, 33, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 21, 22, 23, 24, 25, - 26, 27, 23, 24, 25, 26, 27, 0, 9 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include <malloc.h> -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include <malloc.h> - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 1: -#line 275 "cexp.y" -{ expression_value = yyvsp[0].integer.value; ; - break;} -case 3: -#line 281 "cexp.y" -{ if (pedantic) - pedwarn ("comma operator in operand of `#if'"); - yyval.integer = yyvsp[0].integer; ; - break;} -case 4: -#line 288 "cexp.y" -{ yyval.integer.value = - yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[0].integer.signedp; - if ((yyval.integer.value & yyvsp[0].integer.value & yyval.integer.signedp) < 0) - integer_overflow (); ; - break;} -case 5: -#line 293 "cexp.y" -{ yyval.integer.value = ! yyvsp[0].integer.value; - yyval.integer.signedp = SIGNED; ; - break;} -case 6: -#line 296 "cexp.y" -{ yyval.integer = yyvsp[0].integer; ; - break;} -case 7: -#line 298 "cexp.y" -{ yyval.integer.value = ~ yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[0].integer.signedp; ; - break;} -case 8: -#line 301 "cexp.y" -{ yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length, - 0, NULL_PTR); - yyval.integer.signedp = SIGNED; ; - break;} -case 9: -#line 305 "cexp.y" -{ keyword_parsing = 1; ; - break;} -case 10: -#line 307 "cexp.y" -{ yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length, - 1, yyvsp[-1].keywords); - keyword_parsing = 0; - yyval.integer.signedp = SIGNED; ; - break;} -case 11: -#line 312 "cexp.y" -{ yyval.integer = yyvsp[-1].integer; ; - break;} -case 12: -#line 317 "cexp.y" -{ yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; - if (yyval.integer.signedp) - { - yyval.integer.value = yyvsp[-2].integer.value * yyvsp[0].integer.value; - if (yyvsp[-2].integer.value - && (yyval.integer.value / yyvsp[-2].integer.value != yyvsp[0].integer.value - || (yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0)) - integer_overflow (); - } - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - * yyvsp[0].integer.value); ; - break;} -case 13: -#line 330 "cexp.y" -{ if (yyvsp[0].integer.value == 0) - { - if (!skip_evaluation) - error ("division by zero in #if"); - yyvsp[0].integer.value = 1; - } - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; - if (yyval.integer.signedp) - { - yyval.integer.value = yyvsp[-2].integer.value / yyvsp[0].integer.value; - if ((yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0) - integer_overflow (); - } - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - / yyvsp[0].integer.value); ; - break;} -case 14: -#line 347 "cexp.y" -{ if (yyvsp[0].integer.value == 0) - { - if (!skip_evaluation) - error ("division by zero in #if"); - yyvsp[0].integer.value = 1; - } - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; - if (yyval.integer.signedp) - yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - % yyvsp[0].integer.value); ; - break;} -case 15: -#line 360 "cexp.y" -{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; - if (overflow_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value, - yyval.integer.value, yyval.integer.signedp)) - integer_overflow (); ; - break;} -case 16: -#line 366 "cexp.y" -{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; - if (overflow_sum_sign (yyval.integer.value, yyvsp[0].integer.value, - yyvsp[-2].integer.value, yyval.integer.signedp)) - integer_overflow (); ; - break;} -case 17: -#line 372 "cexp.y" -{ yyval.integer.signedp = yyvsp[-2].integer.signedp; - if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0) - yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); - else - yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; - break;} -case 18: -#line 378 "cexp.y" -{ yyval.integer.signedp = yyvsp[-2].integer.signedp; - if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0) - yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); - else - yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; - break;} -case 19: -#line 384 "cexp.y" -{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value); - yyval.integer.signedp = SIGNED; ; - break;} -case 20: -#line 387 "cexp.y" -{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value); - yyval.integer.signedp = SIGNED; ; - break;} -case 21: -#line 390 "cexp.y" -{ yyval.integer.signedp = SIGNED; - if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) - yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - <= yyvsp[0].integer.value); ; - break;} -case 22: -#line 397 "cexp.y" -{ yyval.integer.signedp = SIGNED; - if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) - yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - >= yyvsp[0].integer.value); ; - break;} -case 23: -#line 404 "cexp.y" -{ yyval.integer.signedp = SIGNED; - if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) - yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - < yyvsp[0].integer.value); ; - break;} -case 24: -#line 411 "cexp.y" -{ yyval.integer.signedp = SIGNED; - if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) - yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; - else - yyval.integer.value = ((unsigned HOST_WIDE_INT) yyvsp[-2].integer.value - > yyvsp[0].integer.value); ; - break;} -case 25: -#line 418 "cexp.y" -{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; - break;} -case 26: -#line 421 "cexp.y" -{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; - break;} -case 27: -#line 424 "cexp.y" -{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; - break;} -case 28: -#line 427 "cexp.y" -{ skip_evaluation += !yyvsp[-1].integer.value; ; - break;} -case 29: -#line 429 "cexp.y" -{ skip_evaluation -= !yyvsp[-3].integer.value; - yyval.integer.value = (yyvsp[-3].integer.value && yyvsp[0].integer.value); - yyval.integer.signedp = SIGNED; ; - break;} -case 30: -#line 433 "cexp.y" -{ skip_evaluation += !!yyvsp[-1].integer.value; ; - break;} -case 31: -#line 435 "cexp.y" -{ skip_evaluation -= !!yyvsp[-3].integer.value; - yyval.integer.value = (yyvsp[-3].integer.value || yyvsp[0].integer.value); - yyval.integer.signedp = SIGNED; ; - break;} -case 32: -#line 439 "cexp.y" -{ skip_evaluation += !yyvsp[-1].integer.value; ; - break;} -case 33: -#line 441 "cexp.y" -{ skip_evaluation += !!yyvsp[-4].integer.value - !yyvsp[-4].integer.value; ; - break;} -case 34: -#line 443 "cexp.y" -{ skip_evaluation -= !!yyvsp[-6].integer.value; - yyval.integer.value = yyvsp[-6].integer.value ? yyvsp[-3].integer.value : yyvsp[0].integer.value; - yyval.integer.signedp = yyvsp[-3].integer.signedp & yyvsp[0].integer.signedp; ; - break;} -case 35: -#line 447 "cexp.y" -{ yyval.integer = yylval.integer; ; - break;} -case 36: -#line 449 "cexp.y" -{ yyval.integer = yylval.integer; ; - break;} -case 37: -#line 451 "cexp.y" -{ if (warn_undef && !skip_evaluation) - warning ("`%.*s' is not defined", - yyvsp[0].name.length, yyvsp[0].name.address); - yyval.integer.value = 0; - yyval.integer.signedp = SIGNED; ; - break;} -case 38: -#line 459 "cexp.y" -{ yyval.keywords = 0; ; - break;} -case 39: -#line 461 "cexp.y" -{ struct arglist *temp; - yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); - yyval.keywords->next = yyvsp[-2].keywords; - yyval.keywords->name = (U_CHAR *) "("; - yyval.keywords->length = 1; - temp = yyval.keywords; - while (temp != 0 && temp->next != 0) - temp = temp->next; - temp->next = (struct arglist *) xmalloc (sizeof (struct arglist)); - temp->next->next = yyvsp[0].keywords; - temp->next->name = (U_CHAR *) ")"; - temp->next->length = 1; ; - break;} -case 40: -#line 474 "cexp.y" -{ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); - yyval.keywords->name = yyvsp[-1].name.address; - yyval.keywords->length = yyvsp[-1].name.length; - yyval.keywords->next = yyvsp[0].keywords; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/local/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 479 "cexp.y" - - -/* During parsing of a C expression, the pointer to the next character - is in this variable. */ - -static char *lexptr; - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/* maybe needs to actually deal with floating point numbers */ - -static int -parse_number (olen) - int olen; -{ - register char *p = lexptr; - register int c; - register unsigned HOST_WIDE_INT n = 0, nd, max_over_base; - register int base = 10; - register int len = olen; - register int overflow = 0; - register int digit, largest_digit = 0; - int spec_long = 0; - - yylval.integer.signedp = SIGNED; - - if (*p == '0') { - base = 8; - if (len >= 3 && (p[1] == 'x' || p[1] == 'X')) { - p += 2; - base = 16; - len -= 2; - } - } - - max_over_base = (unsigned HOST_WIDE_INT) -1 / base; - - for (; len > 0; len--) { - c = *p++; - - if (c >= '0' && c <= '9') - digit = c - '0'; - else if (base == 16 && c >= 'a' && c <= 'f') - digit = c - 'a' + 10; - else if (base == 16 && c >= 'A' && c <= 'F') - digit = c - 'A' + 10; - else { - /* `l' means long, and `u' means unsigned. */ - while (1) { - if (c == 'l' || c == 'L') - { - if (!pedantic < spec_long) - yyerror ("too many `l's in integer constant"); - spec_long++; - } - else if (c == 'u' || c == 'U') - { - if (! yylval.integer.signedp) - yyerror ("two `u's in integer constant"); - yylval.integer.signedp = UNSIGNED; - } - else { - if (c == '.' || c == 'e' || c == 'E' || c == 'p' || c == 'P') - yyerror ("Floating point numbers not allowed in #if expressions"); - else { - char *buf = (char *) alloca (p - lexptr + 40); - sprintf (buf, "missing white space after number `%.*s'", - (int) (p - lexptr - 1), lexptr); - yyerror (buf); - } - } - - if (--len == 0) - break; - c = *p++; - } - /* Don't look for any more digits after the suffixes. */ - break; - } - if (largest_digit < digit) - largest_digit = digit; - nd = n * base + digit; - overflow |= (max_over_base < n) | (nd < n); - n = nd; - } - - if (base <= largest_digit) - pedwarn ("integer constant contains digits beyond the radix"); - - if (overflow) - pedwarn ("integer constant out of range"); - - /* If too big to be signed, consider it unsigned. */ - if (((HOST_WIDE_INT) n & yylval.integer.signedp) < 0) - { - if (base == 10) - warning ("integer constant is so large that it is unsigned"); - yylval.integer.signedp = UNSIGNED; - } - - lexptr = p; - yylval.integer.value = n; - return INT; -} - -struct token { - char *operator; - int token; -}; - -static struct token tokentab2[] = { - {"&&", AND}, - {"||", OR}, - {"<<", LSH}, - {">>", RSH}, - {"==", EQUAL}, - {"!=", NOTEQUAL}, - {"<=", LEQ}, - {">=", GEQ}, - {"++", ERROR}, - {"--", ERROR}, - {NULL, ERROR} -}; - -/* Read one token, getting characters through lexptr. */ - -static int -yylex () -{ - register int c; - register int namelen; - register unsigned char *tokstart; - register struct token *toktab; - int wide_flag; - HOST_WIDE_INT mask; - - retry: - - tokstart = (unsigned char *) lexptr; - c = *tokstart; - /* See if it is a special token of length 2. */ - if (! keyword_parsing) - for (toktab = tokentab2; toktab->operator != NULL; toktab++) - if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) { - lexptr += 2; - if (toktab->token == ERROR) - { - char *buf = (char *) alloca (40); - sprintf (buf, "`%s' not allowed in operand of `#if'", toktab->operator); - yyerror (buf); - } - return toktab->token; - } - - switch (c) { - case '\n': - return 0; - - case ' ': - case '\t': - case '\r': - lexptr++; - goto retry; - - case 'L': - /* Capital L may start a wide-string or wide-character constant. */ - if (lexptr[1] == '\'') - { - lexptr++; - wide_flag = 1; - mask = MAX_WCHAR_TYPE_MASK; - goto char_constant; - } - if (lexptr[1] == '"') - { - lexptr++; - wide_flag = 1; - mask = MAX_WCHAR_TYPE_MASK; - goto string_constant; - } - break; - - case '\'': - wide_flag = 0; - mask = MAX_CHAR_TYPE_MASK; - char_constant: - lexptr++; - if (keyword_parsing) { - char *start_ptr = lexptr - 1; - while (1) { - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr, mask); - else if (c == '\'') - break; - } - yylval.name.address = tokstart; - yylval.name.length = lexptr - start_ptr; - return NAME; - } - - /* This code for reading a character constant - handles multicharacter constants and wide characters. - It is mostly copied from c-lex.c. */ - { - register HOST_WIDE_INT result = 0; - register num_chars = 0; - unsigned width = MAX_CHAR_TYPE_SIZE; - int max_chars; - char *token_buffer; - - if (wide_flag) - { - width = MAX_WCHAR_TYPE_SIZE; -#ifdef MULTIBYTE_CHARS - max_chars = MB_CUR_MAX; -#else - max_chars = 1; -#endif - } - else - max_chars = MAX_LONG_TYPE_SIZE / width; - - token_buffer = (char *) alloca (max_chars + 1); - - while (1) - { - c = *lexptr++; - - if (c == '\'' || c == EOF) - break; - - if (c == '\\') - { - c = parse_escape (&lexptr, mask); - } - - num_chars++; - - /* Merge character into result; ignore excess chars. */ - if (num_chars <= max_chars) - { - if (width < HOST_BITS_PER_WIDE_INT) - result = (result << width) | c; - else - result = c; - token_buffer[num_chars - 1] = c; - } - } - - token_buffer[num_chars] = 0; - - if (c != '\'') - error ("malformatted character constant"); - else if (num_chars == 0) - error ("empty character constant"); - else if (num_chars > max_chars) - { - num_chars = max_chars; - error ("character constant too long"); - } - else if (num_chars != 1 && ! traditional) - warning ("multi-character character constant"); - - /* If char type is signed, sign-extend the constant. */ - if (! wide_flag) - { - int num_bits = num_chars * width; - - if (lookup ((U_CHAR *) "__CHAR_UNSIGNED__", - sizeof ("__CHAR_UNSIGNED__") - 1, -1) - || ((result >> (num_bits - 1)) & 1) == 0) - yylval.integer.value - = result & (~ (unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)); - else - yylval.integer.value - = result | ~(~ (unsigned HOST_WIDE_INT) 0 - >> (HOST_BITS_PER_WIDE_INT - num_bits)); - } - else - { -#ifdef MULTIBYTE_CHARS - /* Set the initial shift state and convert the next sequence. */ - result = 0; - /* In all locales L'\0' is zero and mbtowc will return zero, - so don't use it. */ - if (num_chars > 1 - || (num_chars == 1 && token_buffer[0] != '\0')) - { - wchar_t wc; - (void) mbtowc (NULL_PTR, NULL_PTR, 0); - if (mbtowc (& wc, token_buffer, num_chars) == num_chars) - result = wc; - else - pedwarn ("Ignoring invalid multibyte character"); - } -#endif - yylval.integer.value = result; - } - } - - /* This is always a signed type. */ - yylval.integer.signedp = SIGNED; - - return CHAR; - - /* some of these chars are invalid in constant expressions; - maybe do something about them later */ - case '/': - case '+': - case '-': - case '*': - case '%': - case '|': - case '&': - case '^': - case '~': - case '!': - case '@': - case '<': - case '>': - case '[': - case ']': - case '.': - case '?': - case ':': - case '=': - case '{': - case '}': - case ',': - case '#': - if (keyword_parsing) - break; - case '(': - case ')': - lexptr++; - return c; - - case '"': - mask = MAX_CHAR_TYPE_MASK; - string_constant: - if (keyword_parsing) { - char *start_ptr = lexptr; - lexptr++; - while (1) { - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr, mask); - else if (c == '"') - break; - } - yylval.name.address = tokstart; - yylval.name.length = lexptr - start_ptr; - return NAME; - } - yyerror ("string constants not allowed in #if expressions"); - return ERROR; - } - - if (c >= '0' && c <= '9' && !keyword_parsing) { - /* It's a number */ - for (namelen = 1; ; namelen++) { - int d = tokstart[namelen]; - if (! ((is_idchar[d] || d == '.') - || ((d == '-' || d == '+') - && (c == 'e' || c == 'E' - || ((c == 'p' || c == 'P') && ! c89)) - && ! traditional))) - break; - c = d; - } - return parse_number (namelen); - } - - /* It is a name. See how long it is. */ - - if (keyword_parsing) { - for (namelen = 0;; namelen++) { - if (is_space[tokstart[namelen]]) - break; - if (tokstart[namelen] == '(' || tokstart[namelen] == ')') - break; - if (tokstart[namelen] == '"' || tokstart[namelen] == '\'') - break; - } - } else { - if (!is_idstart[c]) { - yyerror ("Invalid token in expression"); - return ERROR; - } - - for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++) - ; - } - - lexptr += namelen; - yylval.name.address = tokstart; - yylval.name.length = namelen; - return NAME; -} - - -/* Parse a C escape sequence. STRING_PTR points to a variable - containing a pointer to the string to parse. That pointer - is updated past the characters we use. The value of the - escape sequence is returned. - - RESULT_MASK is used to mask out the result; - an error is reported if bits are lost thereby. - - A negative value means the sequence \ newline was seen, - which is supposed to be equivalent to nothing at all. - - If \ is followed by a null character, we return a negative - value and leave the string pointer pointing at the null character. - - If \ is followed by 000, we return 0 and leave the string pointer - after the zeros. A value of 0 does not mean end of string. */ - -HOST_WIDE_INT -parse_escape (string_ptr, result_mask) - char **string_ptr; - HOST_WIDE_INT result_mask; -{ - register int c = *(*string_ptr)++; - switch (c) - { - case 'a': - return TARGET_BELL; - case 'b': - return TARGET_BS; - case 'e': - case 'E': - if (pedantic) - pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c); - return 033; - case 'f': - return TARGET_FF; - case 'n': - return TARGET_NEWLINE; - case 'r': - return TARGET_CR; - case 't': - return TARGET_TAB; - case 'v': - return TARGET_VT; - case '\n': - return -2; - case 0: - (*string_ptr)--; - return 0; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - register HOST_WIDE_INT i = c - '0'; - register int count = 0; - while (++count < 3) - { - c = *(*string_ptr)++; - if (c >= '0' && c <= '7') - i = (i << 3) + c - '0'; - else - { - (*string_ptr)--; - break; - } - } - if (i != (i & result_mask)) - { - i &= result_mask; - pedwarn ("octal escape sequence out of range"); - } - return i; - } - case 'x': - { - register unsigned HOST_WIDE_INT i = 0, overflow = 0; - register int digits_found = 0, digit; - for (;;) - { - c = *(*string_ptr)++; - if (c >= '0' && c <= '9') - digit = c - '0'; - else if (c >= 'a' && c <= 'f') - digit = c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - digit = c - 'A' + 10; - else - { - (*string_ptr)--; - break; - } - overflow |= i ^ (i << 4 >> 4); - i = (i << 4) + digit; - digits_found = 1; - } - if (!digits_found) - yyerror ("\\x used with no following hex digits"); - if (overflow | (i != (i & result_mask))) - { - i &= result_mask; - pedwarn ("hex escape sequence out of range"); - } - return i; - } - default: - return c; - } -} - -static void -yyerror (s) - char *s; -{ - error ("%s", s); - skip_evaluation = 0; - longjmp (parse_return_error, 1); -} - -static void -integer_overflow () -{ - if (!skip_evaluation && pedantic) - pedwarn ("integer overflow in preprocessor expression"); -} - -static HOST_WIDE_INT -left_shift (a, b) - struct constant *a; - unsigned HOST_WIDE_INT b; -{ - /* It's unclear from the C standard whether shifts can overflow. - The following code ignores overflow; perhaps a C standard - interpretation ruling is needed. */ - if (b >= HOST_BITS_PER_WIDE_INT) - return 0; - else - return (unsigned HOST_WIDE_INT) a->value << b; -} - -static HOST_WIDE_INT -right_shift (a, b) - struct constant *a; - unsigned HOST_WIDE_INT b; -{ - if (b >= HOST_BITS_PER_WIDE_INT) - return a->signedp ? a->value >> (HOST_BITS_PER_WIDE_INT - 1) : 0; - else if (a->signedp) - return a->value >> b; - else - return (unsigned HOST_WIDE_INT) a->value >> b; -} - -/* This page contains the entry point to this file. */ - -/* Parse STRING as an expression, and complain if this fails - to use up all of the contents of STRING. */ -/* STRING may contain '\0' bytes; it is terminated by the first '\n' - outside a string constant, so that we can diagnose '\0' properly. */ -/* We do not support C comments. They should be removed before - this function is called. */ - -HOST_WIDE_INT -parse_c_expression (string) - char *string; -{ - lexptr = string; - - /* if there is some sort of scanning error, just return 0 and assume - the parsing routine has printed an error message somewhere. - there is surely a better thing to do than this. */ - if (setjmp (parse_return_error)) - return 0; - - if (yyparse () != 0) - abort (); - - if (*lexptr != '\n') - error ("Junk after end of expression."); - - return expression_value; /* set by yyparse () */ -} - -#ifdef TEST_EXP_READER - -#if YYDEBUG -extern int yydebug; -#endif - -int pedantic; -int traditional; - -int main PROTO((int, char **)); -static void initialize_random_junk PROTO((void)); - -/* Main program for testing purposes. */ -int -main (argc, argv) - int argc; - char **argv; -{ - int n, c; - char buf[1024]; - - pedantic = 1 < argc; - traditional = 2 < argc; -#if YYDEBUG - yydebug = 3 < argc; -#endif - initialize_random_junk (); - - for (;;) { - printf ("enter expression: "); - n = 0; - while ((buf[n] = c = getchar ()) != '\n' && c != EOF) - n++; - if (c == EOF) - break; - printf ("parser returned %ld\n", (long) parse_c_expression (buf)); - } - - return 0; -} - -/* table to tell if char can be part of a C identifier. */ -unsigned char is_idchar[256]; -/* table to tell if char can be first char of a c identifier. */ -unsigned char is_idstart[256]; -/* table to tell if c is horizontal or vertical space. */ -unsigned char is_space[256]; - -/* - * initialize random junk in the hash table and maybe other places - */ -static void -initialize_random_junk () -{ - register int i; - - /* - * Set up is_idchar and is_idstart tables. These should be - * faster than saying (is_alpha (c) || c == '_'), etc. - * Must do set up these things before calling any routines tthat - * refer to them. - */ - for (i = 'a'; i <= 'z'; i++) { - ++is_idchar[i - 'a' + 'A']; - ++is_idchar[i]; - ++is_idstart[i - 'a' + 'A']; - ++is_idstart[i]; - } - for (i = '0'; i <= '9'; i++) - ++is_idchar[i]; - ++is_idchar['_']; - ++is_idstart['_']; - ++is_idchar['$']; - ++is_idstart['$']; - - ++is_space[' ']; - ++is_space['\t']; - ++is_space['\v']; - ++is_space['\f']; - ++is_space['\n']; - ++is_space['\r']; -} - -void -error (PRINTF_ALIST (msg)) - PRINTF_DCL (msg) -{ - va_list args; - - VA_START (args, msg); - fprintf (stderr, "error: "); - vfprintf (stderr, msg, args); - fprintf (stderr, "\n"); - va_end (args); -} - -void -pedwarn (PRINTF_ALIST (msg)) - PRINTF_DCL (msg) -{ - va_list args; - - VA_START (args, msg); - fprintf (stderr, "pedwarn: "); - vfprintf (stderr, msg, args); - fprintf (stderr, "\n"); - va_end (args); -} - -void -warning (PRINTF_ALIST (msg)) - PRINTF_DCL (msg) -{ - va_list args; - - VA_START (args, msg); - fprintf (stderr, "warning: "); - vfprintf (stderr, msg, args); - fprintf (stderr, "\n"); - va_end (args); -} - -int -check_assertion (name, sym_length, tokens_specified, tokens) - U_CHAR *name; - int sym_length; - int tokens_specified; - struct arglist *tokens; -{ - return 0; -} - -struct hashnode * -lookup (name, len, hash) - U_CHAR *name; - int len; - int hash; -{ - return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1); -} - -GENERIC_PTR -xmalloc (size) - size_t size; -{ - return (GENERIC_PTR) malloc (size); -} -#endif diff --git a/gcc/config.in b/gcc/config.in deleted file mode 100644 index 8a04e60e647..00000000000 --- a/gcc/config.in +++ /dev/null @@ -1,32 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ - -/* Include the old config.h as config2.h to simplify the transition - to autoconf. */ -#include "config2.h" - -/* Whether malloc must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_MALLOC - -/* Whether realloc must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_REALLOC - -/* Whether free must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_FREE - -/* Define if you have the <stddef.h> header file. */ -#undef HAVE_STDDEF_H - -/* Define if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the <time.h> header file. */ -#undef HAVE_TIME_H - -/* Define if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H diff --git a/gcc/config/alpha/crtbegin.asm b/gcc/config/alpha/crtbegin.asm new file mode 100644 index 00000000000..dfb11e51eab --- /dev/null +++ b/gcc/config/alpha/crtbegin.asm @@ -0,0 +1,104 @@ + # Copyright (C) 1996, 1998 Free Software Foundation, Inc. + # Contributed by Richard Henderson (rth@tamu.edu) + # + # This file 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. + # + # In addition to the permissions in the GNU General Public License, the + # Free Software Foundation gives you unlimited permission to link the + # compiled version of this file with other programs, and to distribute + # those programs without any restriction coming from the use of this + # file. (The General Public License restrictions do apply in other + # respects; for example, they cover modification of the file, and + # distribution when not linked into another program.) + # + # This file 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; see the file COPYING. If not, write to + # the Free Software Foundation, 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + # + # As a special exception, if you link this library with files + # compiled with GCC to produce an executable, this does not cause + # the resulting executable to be covered by the GNU General Public License. + # This exception does not however invalidate any other reasons why + # the executable file might be covered by the GNU General Public License. + + # + # Heads of the constructor/destructor lists. + # + + # The __*TOR_LIST__ symbols are not global because when this file is used + # in a shared library, we do not want the symbol to fall over to the + # application's lists. + +.section .ctors,"aw" + + .align 3 +__CTOR_LIST__: + .quad -1 + +.section .dtors,"aw" + + .align 3 +__DTOR_LIST__: + .quad -1 + + + # + # Fragment of the ELF _fini routine that invokes our dtor cleanup. + # + +.section .fini,"ax" + + # Since the bits of the _fini function are spread across many + # object files, each potentially with its own GP, we must + # assume we need to load ours. Further, our .fini section + # can easily be more than 4MB away from our .text bits so we + # can't use bsr. + + br $29,1f +1: ldgp $29,0($29) + jsr $26,__do_global_dtors_aux + + # Must match the alignment we got from crti.o else we get + # zero-filled holes in our _fini function and then SIGILL. + .align 3 + + # + # Invoke our destructors in order. + # + +.text + + .align 3 + .ent __do_global_dtors_aux + +__do_global_dtors_aux: + ldgp $29,0($27) + lda $30,-16($30) + .frame $30,16,$26,0 + stq $26,0($30) + .mask 0x4000000,-16 + .prologue 1 + + lda $1,__DTOR_LIST__ + br 1f +0: stq $1,8($30) + jsr $26,($27) + ldq $1,8($30) +1: ldq $27,8($1) + addq $1,8,$1 + bne $27,0b + + ldq $26,0($30) + lda $30,16($30) + ret + + .end __do_global_dtors_aux diff --git a/gcc/config/alpha/crtend.asm b/gcc/config/alpha/crtend.asm new file mode 100644 index 00000000000..36f11b9723a --- /dev/null +++ b/gcc/config/alpha/crtend.asm @@ -0,0 +1,105 @@ + # Copyright (C) 1996 Free Software Foundation, Inc. + # Contributed by Richard Henderson (rth@tamu.edu) + # + # This file 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. + # + # In addition to the permissions in the GNU General Public License, the + # Free Software Foundation gives you unlimited permission to link the + # compiled version of this file with other programs, and to distribute + # those programs without any restriction coming from the use of this + # file. (The General Public License restrictions do apply in other + # respects; for example, they cover modification of the file, and + # distribution when not linked into another program.) + # + # This file 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; see the file COPYING. If not, write to + # the Free Software Foundation, 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + # + # As a special exception, if you link this library with files + # compiled with GCC to produce an executable, this does not cause + # the resulting executable to be covered by the GNU General Public License. + # This exception does not however invalidate any other reasons why + # the executable file might be covered by the GNU General Public License. + + # + # Tails of the constructor/destructor lists. + # + + # The __*TOR_END__ symbols are not global because when this file is used + # in a shared library, we do not want the symbol to fall over to the + # application's lists. + +.section .ctors,"aw" + + .align 3 +__CTOR_END__: + .quad 0 + +.section .dtors,"aw" + + .align 3 +__DTOR_END__: + .quad 0 + + + # + # Fragment of the ELF _init routine that invokes our ctor startup + # + +.section .init,"ax" + + # Since the bits of the _init function are spread across many + # object files, each potentially with its own GP, we must + # assume we need to load ours. Further, our .init section + # can easily be more than 4MB away from our .text bits so we + # can't use bsr. + + br $29,1f +1: ldgp $29,0($29) + jsr $26,__do_global_ctors_aux + + # Must match the alignment we got from crti.o else we get + # zero-filled holes in our _init function and thense SIGILL. + .align 3 + + # + # Invoke our destructors in order. + # + +.text + + .align 3 + .ent __do_global_ctors_aux + +__do_global_ctors_aux: + ldgp $29,0($27) + lda $30,-16($30) + .frame $30,16,$26,0 + stq $9,8($30) + stq $26,0($30) + .mask 0x4000200,-16 + .prologue 1 + + lda $9,__CTOR_END__ + br 1f +0: jsr $26,($27) +1: ldq $27,-8($9) + subq $9,8,$9 + not $27,$0 + bne $0,0b + + ldq $26,0($30) + ldq $9,8($30) + lda $30,16($30) + ret + + .end __do_global_ctors_aux diff --git a/gcc/config/alpha/t-crtbe b/gcc/config/alpha/t-crtbe new file mode 100644 index 00000000000..5e82b923c72 --- /dev/null +++ b/gcc/config/alpha/t-crtbe @@ -0,0 +1,9 @@ +# Effectively disable the crtbegin/end rules using crtstuff.c +T = disable + +# Assemble startup files. +crtbegin.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtbegin.o -x assembler $(srcdir)/config/alpha/crtbegin.asm + +crtend.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtend.o -x assembler $(srcdir)/config/alpha/crtend.asm diff --git a/gcc/config/alpha/vxworks.h b/gcc/config/alpha/vxworks.h new file mode 100644 index 00000000000..6016be9677d --- /dev/null +++ b/gcc/config/alpha/vxworks.h @@ -0,0 +1,57 @@ +/* Definitions of target machine for GNU compiler. Vxworks Alpha version. + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* This file just exists to give specs for the Alpha running on VxWorks. */ + +#undef CPP_SPEC +#define CPP_SPEC "\ +%{mvxsim:-DCPU=SIMALPHADUNIX} \ +%{!mvxsim: %{!mcpu*:-DCPU=21064} \ + %{mcpu=21064:-DCPU=21064} \ + %{mcpu=21164:-DCPU=21164}} \ +%{posix: -D_POSIX_SOURCE} \ +%{!.S: -D__LANGUAGE_C__ -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}} \ +%{.S: -D__LANGUAGE_ASSEMBLY__ -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}}" + +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "\ +-D__vxworks -D__alpha_vxworks -Asystem(vxworks) \ +-Asystem(embedded) -D_LONGLONG -Acpu(alpha) -Amachine(alpha)" + +/* VxWorks does all the library stuff itself. */ + +#undef LIB_SPEC +#define LIB_SPEC "" + +/* VxWorks uses object files, not loadable images. make linker just + combine objects. */ + +#undef LINK_SPEC +#define LINK_SPEC "-r" + +/* VxWorks provides the functionality of crt0.o and friends itself. */ + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "" + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "" + +#undef TRANSFER_FROM_TRAMPOLINE diff --git a/gcc/config/alpha/xm-linux.h b/gcc/config/alpha/xm-linux.h deleted file mode 100644 index 9426c4ee5a7..00000000000 --- a/gcc/config/alpha/xm-linux.h +++ /dev/null @@ -1,3 +0,0 @@ -#define HAVE_STRERROR -#define DONT_DECLARE_SYS_SIGLIST -#define USE_BFD diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c new file mode 100644 index 00000000000..c9e5411103c --- /dev/null +++ b/gcc/config/arc/arc.c @@ -0,0 +1,2212 @@ +/* Subroutines used for code generation on the ARC cpu. + Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* ??? This is an old port, and is undoubtedly suffering from bit rot. */ + +#include <stdio.h> +#include "config.h" +#include "tree.h" +#include "rtl.h" +#include "regs.h" +#include "hard-reg-set.h" +#include "real.h" +#include "insn-config.h" +#include "conditions.h" +#include "insn-flags.h" +#include "output.h" +#include "insn-attr.h" +#include "flags.h" +#include "expr.h" +#include "recog.h" + +/* Which cpu we're compiling for (NULL(=base), ???). */ +char *arc_cpu_string; +int arc_cpu_type; + +/* Name of mangle string to add to symbols to separate code compiled for each + cpu (or NULL). */ +char *arc_mangle_cpu; + +/* Save the operands last given to a compare for use when we + generate a scc or bcc insn. */ +rtx arc_compare_op0, arc_compare_op1; + +/* Name of text, data, and rodata sections, as specified on command line. + Selected by -m{text,data,rodata} flags. */ +char *arc_text_string = ARC_DEFAULT_TEXT_SECTION; +char *arc_data_string = ARC_DEFAULT_DATA_SECTION; +char *arc_rodata_string = ARC_DEFAULT_RODATA_SECTION; + +/* Name of text, data, and rodata sections used in varasm.c. */ +char *arc_text_section; +char *arc_data_section; +char *arc_rodata_section; + +/* Array of valid operand punctuation characters. */ +char arc_punct_chars[256]; + +/* Variables used by arc_final_prescan_insn to implement conditional + execution. */ +static int arc_ccfsm_state; +static int arc_ccfsm_current_cc; +static rtx arc_ccfsm_target_insn; +static int arc_ccfsm_target_label; + +/* The maximum number of insns skipped which will be conditionalised if + possible. */ +#define MAX_INSNS_SKIPPED 3 + +/* A nop is needed between a 4 byte insn that sets the condition codes and + a branch that uses them (the same isn't true for an 8 byte insn that sets + the condition codes). Set by arc_final_prescan_insn. Used by + arc_print_operand. */ +static int last_insn_set_cc_p; +static int current_insn_set_cc_p; +static void record_cc_ref (); + +void arc_init_reg_tables (); + +/* Called by OVERRIDE_OPTIONS to initialize various things. */ + +void +arc_init (void) +{ + if (arc_cpu_string == 0 + || !strcmp (arc_cpu_string, "base")) + { + /* Ensure we have a printable value for the .cpu pseudo-op. */ + arc_cpu_string = "base"; + arc_cpu_type = 0; + arc_mangle_cpu = NULL; + } + else if (ARC_EXTENSION_CPU (arc_cpu_string)) + ; /* nothing to do */ + else + { + error ("bad value (%s) for -mcpu switch", arc_cpu_string); + arc_cpu_string = "base"; + arc_cpu_type = 0; + arc_mangle_cpu = NULL; + } + + /* Set the pseudo-ops for the various standard sections. */ + arc_text_section = xmalloc (strlen (arc_text_string) + sizeof (ARC_SECTION_FORMAT) + 1); + sprintf (arc_text_section, ARC_SECTION_FORMAT, arc_text_string); + arc_data_section = xmalloc (strlen (arc_data_string) + sizeof (ARC_SECTION_FORMAT) + 1); + sprintf (arc_data_section, ARC_SECTION_FORMAT, arc_data_string); + arc_rodata_section = xmalloc (strlen (arc_rodata_string) + sizeof (ARC_SECTION_FORMAT) + 1); + sprintf (arc_rodata_section, ARC_SECTION_FORMAT, arc_rodata_string); + + arc_init_reg_tables (); + + /* Initialize array for PRINT_OPERAND_PUNCT_VALID_P. */ + memset (arc_punct_chars, 0, sizeof (arc_punct_chars)); + arc_punct_chars['#'] = 1; + arc_punct_chars['*'] = 1; + arc_punct_chars['?'] = 1; + arc_punct_chars['!'] = 1; + arc_punct_chars['~'] = 1; +} + +/* The condition codes of the ARC, and the inverse function. */ +static char *arc_condition_codes[] = +{ + "al", 0, "eq", "ne", "p", "n", "c", "nc", "v", "nv", + "gt", "le", "ge", "lt", "hi", "ls", "pnz", 0 +}; + +#define ARC_INVERSE_CONDITION_CODE(X) ((X) ^ 1) + +/* Returns the index of the ARC condition code string in + `arc_condition_codes'. COMPARISON should be an rtx like + `(eq (...) (...))'. */ + +static int +get_arc_condition_code (comparison) + rtx comparison; +{ + switch (GET_CODE (comparison)) + { + case EQ : return 2; + case NE : return 3; + case GT : return 10; + case LE : return 11; + case GE : return 12; + case LT : return 13; + case GTU : return 14; + case LEU : return 15; + case LTU : return 6; + case GEU : return 7; + default : abort (); + } + /*NOTREACHED*/ + return (42); +} + +/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE, + return the mode to be used for the comparison. */ + +enum machine_mode +arc_select_cc_mode (op, x, y) + enum rtx_code op; + rtx x, y; +{ + switch (op) + { + case EQ : + case NE : + return CCZNmode; + default : + switch (GET_CODE (x)) + { + case AND : + case IOR : + case XOR : + case SIGN_EXTEND : + case ZERO_EXTEND : + return CCZNmode; + case ASHIFT : + case ASHIFTRT : + case LSHIFTRT : + return CCZNCmode; + } + } + return CCmode; +} + +/* Vectors to keep interesting information about registers where it can easily + be got. We use to use the actual mode value as the bit number, but there + is (or may be) more than 32 modes now. Instead we use two tables: one + indexed by hard register number, and one indexed by mode. */ + +/* The purpose of arc_mode_class is to shrink the range of modes so that + they all fit (as bit numbers) in a 32 bit word (again). Each real mode is + mapped into one arc_mode_class mode. */ + +enum arc_mode_class { + C_MODE, + S_MODE, D_MODE, T_MODE, O_MODE, + SF_MODE, DF_MODE, TF_MODE, OF_MODE +}; + +/* Modes for condition codes. */ +#define C_MODES (1 << (int) C_MODE) + +/* Modes for single-word and smaller quantities. */ +#define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE)) + +/* Modes for double-word and smaller quantities. */ +#define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE)) + +/* Modes for quad-word and smaller quantities. */ +#define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE)) + +/* Value is 1 if register/mode pair is acceptable on arc. */ + +unsigned int arc_hard_regno_mode_ok[] = { + T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, + T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, + T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, T_MODES, D_MODES, + D_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, + + /* ??? Leave these as S_MODES for now. */ + S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, + S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, + S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, + S_MODES, S_MODES, S_MODES, S_MODES, S_MODES, C_MODES +}; + +unsigned int arc_mode_class [NUM_MACHINE_MODES]; + +enum reg_class arc_regno_reg_class[FIRST_PSEUDO_REGISTER]; + +void +arc_init_reg_tables () +{ + int i; + + for (i = 0; i < NUM_MACHINE_MODES; i++) + { + switch (GET_MODE_CLASS (i)) + { + case MODE_INT: + case MODE_PARTIAL_INT: + case MODE_COMPLEX_INT: + if (GET_MODE_SIZE (i) <= 4) + arc_mode_class[i] = 1 << (int) S_MODE; + else if (GET_MODE_SIZE (i) == 8) + arc_mode_class[i] = 1 << (int) D_MODE; + else if (GET_MODE_SIZE (i) == 16) + arc_mode_class[i] = 1 << (int) T_MODE; + else if (GET_MODE_SIZE (i) == 32) + arc_mode_class[i] = 1 << (int) O_MODE; + else + arc_mode_class[i] = 0; + break; + case MODE_FLOAT: + case MODE_COMPLEX_FLOAT: + if (GET_MODE_SIZE (i) <= 4) + arc_mode_class[i] = 1 << (int) SF_MODE; + else if (GET_MODE_SIZE (i) == 8) + arc_mode_class[i] = 1 << (int) DF_MODE; + else if (GET_MODE_SIZE (i) == 16) + arc_mode_class[i] = 1 << (int) TF_MODE; + else if (GET_MODE_SIZE (i) == 32) + arc_mode_class[i] = 1 << (int) OF_MODE; + else + arc_mode_class[i] = 0; + break; + case MODE_CC: + default: + /* mode_class hasn't been initialized yet for EXTRA_CC_MODES, so + we must explicitly check for them here. */ + if (i == (int) CCmode || i == (int) CCZNmode || i == (int) CCZNCmode) + arc_mode_class[i] = 1 << (int) C_MODE; + else + arc_mode_class[i] = 0; + break; + } + } + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + if (i < 60) + arc_regno_reg_class[i] = GENERAL_REGS; + else if (i == 60) + arc_regno_reg_class[i] = LPCOUNT_REG; + else if (i == 61) + arc_regno_reg_class[i] = NO_REGS /* CC_REG: must be NO_REGS */; + else + arc_regno_reg_class[i] = NO_REGS; + } +} + +/* ARC specific attribute support. + + The ARC has these attributes: + interrupt - for interrupt functions +*/ + +/* Return nonzero if IDENTIFIER is a valid decl attribute. */ + +int +arc_valid_machine_decl_attribute (type, attributes, identifier, args) + tree type; + tree attributes; + tree identifier; + tree args; +{ + if (identifier == get_identifier ("__interrupt__") + && list_length (args) == 1 + && TREE_CODE (TREE_VALUE (args)) == STRING_CST) + { + tree value = TREE_VALUE (args); + + if (!strcmp (TREE_STRING_POINTER (value), "ilink1") + || !strcmp (TREE_STRING_POINTER (value), "ilink2")) + return 1; + } + return 0; +} + +/* Return zero if TYPE1 and TYPE are incompatible, one if they are compatible, + and two if they are nearly compatible (which causes a warning to be + generated). */ + +int +arc_comp_type_attributes (type1, type2) + tree type1, type2; +{ + return 1; +} + +/* Set the default attributes for TYPE. */ + +void +arc_set_default_type_attributes (type) + tree type; +{ +} + +/* Acceptable arguments to the call insn. */ + +int +call_address_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + return (symbolic_operand (op, mode) + || (GET_CODE (op) == CONST_INT && LEGITIMATE_CONSTANT_P (op)) + || (GET_CODE (op) == REG)); +} + +int +call_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != MEM) + return 0; + op = XEXP (op, 0); + return call_address_operand (op, mode); +} + +/* Returns 1 if OP is a symbol reference. */ + +int +symbolic_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case SYMBOL_REF: + case LABEL_REF: + case CONST : + return 1; + default: + return 0; + } +} + +/* Return truth value of statement that OP is a symbolic memory + operand of mode MODE. */ + +int +symbolic_memory_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) == SUBREG) + op = SUBREG_REG (op); + if (GET_CODE (op) != MEM) + return 0; + op = XEXP (op, 0); + return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST + || GET_CODE (op) == LABEL_REF); +} + +/* Return true if OP is a short immediate (shimm) value. */ + +int +short_immediate_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != CONST_INT) + return 0; + return SMALL_INT (INTVAL (op)); +} + +/* Return true if OP will require a long immediate (limm) value. + This is currently only used when calculating length attributes. */ + +int +long_immediate_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case SYMBOL_REF : + case LABEL_REF : + case CONST : + return 1; + case CONST_INT : + return !SMALL_INT (INTVAL (op)); + case CONST_DOUBLE : + /* These can happen because large unsigned 32 bit constants are + represented this way (the multiplication patterns can cause these + to be generated). They also occur for SFmode values. */ + return 1; + } + return 0; +} + +/* Return true if OP is a MEM that when used as a load or store address will + require an 8 byte insn. + Load and store instructions don't allow the same possibilities but they're + similar enough that this one function will do. + This is currently only used when calculating length attributes. */ + +int +long_immediate_loadstore_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != MEM) + return 0; + + op = XEXP (op, 0); + switch (GET_CODE (op)) + { + case SYMBOL_REF : + case LABEL_REF : + case CONST : + return 1; + case CONST_INT : + /* This must be handled as "st c,[limm]". Ditto for load. + Technically, the assembler could translate some possibilities to + "st c,[limm/2 + limm/2]" if limm/2 will fit in a shimm, but we don't + assume that it does. */ + return 1; + case CONST_DOUBLE : + /* These can happen because large unsigned 32 bit constants are + represented this way (the multiplication patterns can cause these + to be generated). They also occur for SFmode values. */ + return 1; + case REG : + return 0; + case PLUS : + if (GET_CODE (XEXP (op, 1)) == CONST_INT + && !SMALL_INT (INTVAL (XEXP (op, 1)))) + return 1; + return 0; + } + return 0; +} + +/* Return true if OP is an acceptable argument for a single word + move source. */ + +int +move_src_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case SYMBOL_REF : + case LABEL_REF : + case CONST : + return 1; + case CONST_INT : + return (LARGE_INT (INTVAL (op))); + case CONST_DOUBLE : + /* We can handle DImode integer constants in SImode if the value + (signed or unsigned) will fit in 32 bits. This is needed because + large unsigned 32 bit constants are represented as CONST_DOUBLEs. */ + if (mode == SImode) + return arc_double_limm_p (op); + /* We can handle 32 bit floating point constants. */ + if (mode == SFmode) + return GET_MODE (op) == SFmode; + return 0; + case REG : + return register_operand (op, mode); + case SUBREG : + /* (subreg (mem ...) ...) can occur here if the inner part was once a + pseudo-reg and is now a stack slot. */ + if (GET_CODE (SUBREG_REG (op)) == MEM) + return address_operand (XEXP (SUBREG_REG (op), 0), mode); + else + return register_operand (op, mode); + case MEM : + return address_operand (XEXP (op, 0), mode); + default : + return 0; + } +} + +/* Return true if OP is an acceptable argument for a double word + move source. */ + +int +move_double_src_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case REG : + return register_operand (op, mode); + case SUBREG : + /* (subreg (mem ...) ...) can occur here if the inner part was once a + pseudo-reg and is now a stack slot. */ + if (GET_CODE (SUBREG_REG (op)) == MEM) + return move_double_src_operand (SUBREG_REG (op), mode); + else + return register_operand (op, mode); + case MEM : + /* Disallow auto inc/dec for now. */ + if (GET_CODE (XEXP (op, 0)) == PRE_DEC + || GET_CODE (XEXP (op, 0)) == PRE_INC) + return 0; + return address_operand (XEXP (op, 0), mode); + case CONST_INT : + case CONST_DOUBLE : + return 1; + default : + return 0; + } +} + +/* Return true if OP is an acceptable argument for a move destination. */ + +int +move_dest_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case REG : + return register_operand (op, mode); + case SUBREG : + /* (subreg (mem ...) ...) can occur here if the inner part was once a + pseudo-reg and is now a stack slot. */ + if (GET_CODE (SUBREG_REG (op)) == MEM) + return address_operand (XEXP (SUBREG_REG (op), 0), mode); + else + return register_operand (op, mode); + case MEM : + return address_operand (XEXP (op, 0), mode); + default : + return 0; + } +} + +/* Return true if OP is valid load with update operand. */ + +int +load_update_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != MEM + || GET_MODE (op) != mode) + return 0; + op = XEXP (op, 0); + if (GET_CODE (op) != PLUS + || GET_MODE (op) != Pmode + || !register_operand (XEXP (op, 0), Pmode) + || !nonmemory_operand (XEXP (op, 1), Pmode)) + return 0; + return 1; +} + +/* Return true if OP is valid store with update operand. */ + +int +store_update_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != MEM + || GET_MODE (op) != mode) + return 0; + op = XEXP (op, 0); + if (GET_CODE (op) != PLUS + || GET_MODE (op) != Pmode + || !register_operand (XEXP (op, 0), Pmode) + || !(GET_CODE (XEXP (op, 1)) == CONST_INT + && SMALL_INT (INTVAL (XEXP (op, 1))))) + return 0; + return 1; +} + +/* Return true if OP is a non-volatile non-immediate operand. + Volatile memory refs require a special "cache-bypass" instruction + and only the standard movXX patterns are set up to handle them. */ + +int +nonvol_nonimm_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) == MEM && MEM_VOLATILE_P (op)) + return 0; + return nonimmediate_operand (op, mode); +} + +/* Accept integer operands in the range -0x80000000..0x7fffffff. We have + to check the range carefully since this predicate is used in DImode + contexts. */ + +int +const_sint32_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + /* All allowed constants will fit a CONST_INT. */ + return (GET_CODE (op) == CONST_INT + && (INTVAL (op) >= (-0x7fffffff - 1) && INTVAL (op) <= 0x7fffffff)); +} + +/* Accept integer operands in the range 0..0xffffffff. We have to check the + range carefully since this predicate is used in DImode contexts. Also, we + need some extra crud to make it work when hosted on 64-bit machines. */ + +int +const_uint32_operand (op, mode) + rtx op; + enum machine_mode mode; +{ +#if HOST_BITS_PER_WIDE_INT > 32 + /* All allowed constants will fit a CONST_INT. */ + return (GET_CODE (op) == CONST_INT + && (INTVAL (op) >= 0 && INTVAL (op) <= 0xffffffffL)); +#else + return ((GET_CODE (op) == CONST_INT && INTVAL (op) >= 0) + || (GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_HIGH (op) == 0)); +#endif +} + +/* Return 1 if OP is a comparison operator valid for the mode of CC. + This allows the use of MATCH_OPERATOR to recognize all the branch insns. + + Some insns only set a few bits in the condition code. So only allow those + comparisons that use the bits that are valid. */ + +int +proper_comparison_operator (op, mode) + rtx op; + enum machine_mode mode; +{ + enum rtx_code code = GET_CODE (op); + + if (GET_RTX_CLASS (code) != '<') + return 0; + + if (GET_MODE (XEXP (op, 0)) == CCZNmode) + return (code == EQ || code == NE); + if (GET_MODE (XEXP (op, 0)) == CCZNCmode) + return (code == EQ || code == NE + || code == LTU || code == GEU || code == GTU || code == LEU); + return 1; +} + +/* Misc. utilities. */ + +/* X and Y are two things to compare using CODE. Emit the compare insn and + return the rtx for the cc reg in the proper mode. */ + +rtx +gen_compare_reg (code, x, y) + enum rtx_code code; + rtx x, y; +{ + enum machine_mode mode = SELECT_CC_MODE (code, x, y); + rtx cc_reg; + + cc_reg = gen_rtx (REG, mode, 61); + + emit_insn (gen_rtx (SET, VOIDmode, cc_reg, + gen_rtx (COMPARE, mode, x, y))); + + return cc_reg; +} + +/* Return 1 if VALUE, a const_double, will fit in a limm (4 byte number). + We assume the value can be either signed or unsigned. */ + +int +arc_double_limm_p (value) + rtx value; +{ + HOST_WIDE_INT low, high; + + if (GET_CODE (value) != CONST_DOUBLE) + abort (); + + low = CONST_DOUBLE_LOW (value); + high = CONST_DOUBLE_HIGH (value); + + if (low & 0x80000000) + { + return (((unsigned HOST_WIDE_INT) low <= 0xffffffff && high == 0) + || (((low & - (unsigned HOST_WIDE_INT) 0x80000000) + == - (unsigned HOST_WIDE_INT) 0x80000000) + && high == -1)); + } + else + { + return (unsigned HOST_WIDE_INT) low <= 0x7fffffff && high == 0; + } +} + +/* Do any needed setup for a variadic function. For the ARC, we must + create a register parameter block, and then copy any anonymous arguments + in registers to memory. + + CUM has not been updated for the last named argument which has type TYPE + and mode MODE, and we rely on this fact. + + We do things a little weird here. We're supposed to only allocate space + for the anonymous arguments. However we need to keep the stack eight byte + aligned. So we round the space up if necessary, and leave it to va-arc.h + to compensate. */ + +void +arc_setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl) + CUMULATIVE_ARGS *cum; + enum machine_mode mode; + tree type; + int *pretend_size; + int no_rtl; +{ + int first_anon_arg; + + /* All BLKmode values are passed by reference. */ + if (mode == BLKmode) + abort (); + + /* We must treat `__builtin_va_alist' as an anonymous arg. */ + if (current_function_varargs) + first_anon_arg = *cum; + else + first_anon_arg = *cum + ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) + / UNITS_PER_WORD); + + if (first_anon_arg < MAX_ARC_PARM_REGS && !no_rtl) + { + /* Note that first_reg_offset < MAX_ARC_PARM_REGS. */ + int first_reg_offset = first_anon_arg; + /* Size in words to "pretend" allocate. */ + int size = MAX_ARC_PARM_REGS - first_reg_offset; + /* Extra slop to keep stack eight byte aligned. */ + int align_slop = size & 1; + rtx regblock; + + regblock = gen_rtx (MEM, BLKmode, + plus_constant (arg_pointer_rtx, + FIRST_PARM_OFFSET (0) + + align_slop * UNITS_PER_WORD)); + move_block_from_reg (first_reg_offset, regblock, + MAX_ARC_PARM_REGS - first_reg_offset, + ((MAX_ARC_PARM_REGS - first_reg_offset) + * UNITS_PER_WORD)); + + *pretend_size = ((MAX_ARC_PARM_REGS - first_reg_offset + align_slop) + * UNITS_PER_WORD); + } +} + +/* Cost functions. */ + +/* Provide the costs of an addressing mode that contains ADDR. + If ADDR is not a valid address, its cost is irrelevant. */ + +int +arc_address_cost (addr) + rtx addr; +{ + switch (GET_CODE (addr)) + { + case REG : + /* This is handled in the macro that calls us. + It's here for documentation. */ + return 1; + + case LABEL_REF : + case SYMBOL_REF : + case CONST : + return 2; + + case PLUS : + { + register rtx plus0 = XEXP (addr, 0); + register rtx plus1 = XEXP (addr, 1); + + if (GET_CODE (plus0) != REG) + break; + + switch (GET_CODE (plus1)) + { + case CONST_INT : + return SMALL_INT (plus1) ? 1 : 2; + case CONST : + case SYMBOL_REF : + case LABEL_REF : + return 2; + default: + break; + } + break; + } + } + + return 4; +} + +/* Function prologue/epilogue handlers. */ + +/* ARC stack frames look like: + + Before call After call + +-----------------------+ +-----------------------+ + | | | | + high | local variables, | | local variables, | + mem | reg save area, etc. | | reg save area, etc. | + | | | | + +-----------------------+ +-----------------------+ + | | | | + | arguments on stack. | | arguments on stack. | + | | | | + SP+16->+-----------------------+FP+48->+-----------------------+ + | 4 word save area for | | reg parm save area, | + | return addr, prev %fp | | only created for | + SP+0->+-----------------------+ | variable argument | + | functions | + FP+16->+-----------------------+ + | 4 word save area for | + | return addr, prev %fp | + FP+0->+-----------------------+ + | | + | local variables | + | | + +-----------------------+ + | | + | register save area | + | | + +-----------------------+ + | | + | alloca allocations | + | | + +-----------------------+ + | | + | arguments on stack | + | | + SP+16->+-----------------------+ + low | 4 word save area for | + memory | return addr, prev %fp | + SP+0->+-----------------------+ + +Notes: +1) The "reg parm save area" does not exist for non variable argument fns. + The "reg parm save area" can be eliminated completely if we created our + own va-arc.h, but that has tradeoffs as well (so it's not done). */ + +/* Structure to be filled in by arc_compute_frame_size with register + save masks, and offsets for the current function. */ +struct arc_frame_info +{ + unsigned int total_size; /* # bytes that the entire frame takes up. */ + unsigned int extra_size; /* # bytes of extra stuff. */ + unsigned int pretend_size; /* # bytes we push and pretend caller did. */ + unsigned int args_size; /* # bytes that outgoing arguments take up. */ + unsigned int reg_size; /* # bytes needed to store regs. */ + unsigned int var_size; /* # bytes that variables take up. */ + unsigned int reg_offset; /* Offset from new sp to store regs. */ + unsigned int gmask; /* Mask of saved gp registers. */ + int initialized; /* Nonzero if frame size already calculated. */ +}; + +/* Current frame information calculated by arc_compute_frame_size. */ +static struct arc_frame_info current_frame_info; + +/* Zero structure to initialize current_frame_info. */ +static struct arc_frame_info zero_frame_info; + +/* Type of function DECL. + + The result is cached. To reset the cache at the end of a function, + call with DECL = NULL_TREE. */ + +enum arc_function_type +arc_compute_function_type (decl) + tree decl; +{ + tree a; + /* Cached value. */ + static enum arc_function_type fn_type = ARC_FUNCTION_UNKNOWN; + /* Last function we were called for. */ + static tree last_fn = NULL_TREE; + + /* Resetting the cached value? */ + if (decl == NULL_TREE) + { + fn_type = ARC_FUNCTION_UNKNOWN; + last_fn = NULL_TREE; + return fn_type; + } + + if (decl == last_fn && fn_type != ARC_FUNCTION_UNKNOWN) + return fn_type; + + /* Assume we have a normal function (not an interrupt handler). */ + fn_type = ARC_FUNCTION_NORMAL; + + /* Now see if this is an interrupt handler. */ + for (a = DECL_MACHINE_ATTRIBUTES (current_function_decl); + a; + a = TREE_CHAIN (a)) + { + tree name = TREE_PURPOSE (a), args = TREE_VALUE (a); + + if (name == get_identifier ("__interrupt__") + && list_length (args) == 1 + && TREE_CODE (TREE_VALUE (args)) == STRING_CST) + { + tree value = TREE_VALUE (args); + + if (!strcmp (TREE_STRING_POINTER (value), "ilink1")) + fn_type = ARC_FUNCTION_ILINK1; + else if (!strcmp (TREE_STRING_POINTER (value), "ilink2")) + fn_type = ARC_FUNCTION_ILINK2; + else + abort (); + break; + } + } + + last_fn = decl; + return fn_type; +} + +#define ILINK1_REGNUM 29 +#define ILINK2_REGNUM 30 +#define RETURN_ADDR_REGNUM 31 +#define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM)) +#define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM)) + +/* Tell prologue and epilogue if register REGNO should be saved / restored. + The return address and frame pointer are treated separately. + Don't consider them here. */ +#define MUST_SAVE_REGISTER(regno, interrupt_p) \ +((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \ + && (regs_ever_live[regno] && (!call_used_regs[regno] || interrupt_p))) + +#define MUST_SAVE_RETURN_ADDR (regs_ever_live[RETURN_ADDR_REGNUM]) + +/* Return the bytes needed to compute the frame pointer from the current + stack pointer. + + SIZE is the size needed for local variables. */ + +unsigned int +arc_compute_frame_size (size) + int size; /* # of var. bytes allocated. */ +{ + int regno; + unsigned int total_size, var_size, args_size, pretend_size, extra_size; + unsigned int reg_size, reg_offset; + unsigned int gmask; + enum arc_function_type fn_type; + int interrupt_p; + + var_size = size; + args_size = current_function_outgoing_args_size; + pretend_size = current_function_pretend_args_size; + extra_size = FIRST_PARM_OFFSET (0); + total_size = extra_size + pretend_size + args_size + var_size; + reg_offset = FIRST_PARM_OFFSET(0) + current_function_outgoing_args_size; + reg_size = 0; + gmask = 0; + + /* See if this is an interrupt handler. Call used registers must be saved + for them too. */ + fn_type = arc_compute_function_type (current_function_decl); + interrupt_p = ARC_INTERRUPT_P (fn_type); + + /* Calculate space needed for registers. + ??? We ignore the extension registers for now. */ + + for (regno = 0; regno <= 31; regno++) + { + if (MUST_SAVE_REGISTER (regno, interrupt_p)) + { + reg_size += UNITS_PER_WORD; + gmask |= 1 << regno; + } + } + + total_size += reg_size; + + /* If the only space to allocate is the fp/blink save area this is an + empty frame. However, if we'll be making a function call we need to + allocate a stack frame for our callee's fp/blink save area. */ + if (total_size == extra_size + && !MUST_SAVE_RETURN_ADDR) + total_size = extra_size = 0; + + total_size = ARC_STACK_ALIGN (total_size); + + /* Save computed information. */ + current_frame_info.total_size = total_size; + current_frame_info.extra_size = extra_size; + current_frame_info.pretend_size = pretend_size; + current_frame_info.var_size = var_size; + current_frame_info.args_size = args_size; + current_frame_info.reg_size = reg_size; + current_frame_info.reg_offset = reg_offset; + current_frame_info.gmask = gmask; + current_frame_info.initialized = reload_completed; + + /* Ok, we're done. */ + return total_size; +} + +/* Common code to save/restore registers. */ + +void +arc_save_restore (file, base_reg, offset, gmask, op) + FILE *file; + char *base_reg; + unsigned int offset; + unsigned int gmask; + char *op; +{ + int regno; + + if (gmask == 0) + return; + + for (regno = 0; regno <= 31; regno++) + { + if ((gmask & (1L << regno)) != 0) + { + fprintf (file, "\t%s %s,[%s,%d]\n", + op, reg_names[regno], base_reg, offset); + offset += UNITS_PER_WORD; + } + } +} + +/* Set up the stack and frame pointer (if desired) for the function. */ + +void +arc_output_function_prologue (file, size) + FILE *file; + int size; +{ + char *sp_str = reg_names[STACK_POINTER_REGNUM]; + char *fp_str = reg_names[FRAME_POINTER_REGNUM]; + unsigned int gmask = current_frame_info.gmask; + enum arc_function_type fn_type = arc_compute_function_type (current_function_decl); + + /* If this is an interrupt handler, set up our stack frame. + ??? Optimize later. */ + if (ARC_INTERRUPT_P (fn_type)) + { + fprintf (file, "\t%s interrupt handler\n", + ASM_COMMENT_START); + fprintf (file, "\tsub %s,%s,16\n", sp_str, sp_str); + } + + /* This is only for the human reader. */ + fprintf (file, "\t%s BEGIN PROLOGUE %s vars= %d, regs= %d, args= %d, extra= %d\n", + ASM_COMMENT_START, ASM_COMMENT_START, + current_frame_info.var_size, + current_frame_info.reg_size / 4, + current_frame_info.args_size, + current_frame_info.extra_size); + + size = ARC_STACK_ALIGN (size); + size = (! current_frame_info.initialized + ? arc_compute_frame_size (size) + : current_frame_info.total_size); + + /* These cases shouldn't happen. Catch them now. */ + if (size == 0 && gmask) + abort (); + + /* Allocate space for register argumenets if this is a variadic function. */ + if (current_frame_info.pretend_size != 0) + fprintf (file, "\tsub %s,%s,%d\n", + sp_str, sp_str, current_frame_info.pretend_size); + + /* The home-grown ABI says link register is saved first. */ + if (MUST_SAVE_RETURN_ADDR) + fprintf (file, "\tst %s,[%s,%d]\n", + reg_names[RETURN_ADDR_REGNUM], sp_str, UNITS_PER_WORD); + + /* Set up the previous frame pointer next (if we need to). */ + if (frame_pointer_needed) + { + fprintf (file, "\tst %s,[%s]\n", fp_str, sp_str); + fprintf (file, "\tmov %s,%s\n", fp_str, sp_str); + } + + /* ??? We don't handle the case where the saved regs are more than 252 + bytes away from sp. This can be handled by decrementing sp once, saving + the regs, and then decrementing it again. The epilogue doesn't have this + problem as the `ld' insn takes reg+limm values (though it would be more + efficient to avoid reg+limm). */ + + /* Allocate the stack frame. */ + if (size - current_frame_info.pretend_size > 0) + fprintf (file, "\tsub %s,%s,%d\n", + sp_str, sp_str, size - current_frame_info.pretend_size); + + /* Save any needed call-saved regs (and call-used if this is an + interrupt handler). */ + arc_save_restore (file, sp_str, current_frame_info.reg_offset, + /* The zeroing of these two bits is unnecessary, + but leave this in for clarity. */ + gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK), + "st"); + + fprintf (file, "\t%s END PROLOGUE\n", ASM_COMMENT_START); +} + +/* Do any necessary cleanup after a function to restore stack, frame, + and regs. */ + +void +arc_output_function_epilogue (file, size) + FILE *file; + int size; +{ + rtx epilogue_delay = current_function_epilogue_delay_list; + int noepilogue = FALSE; + enum arc_function_type fn_type = arc_compute_function_type (current_function_decl); + + /* This is only for the human reader. */ + fprintf (file, "\t%s EPILOGUE\n", ASM_COMMENT_START); + + size = ARC_STACK_ALIGN (size); + size = (!current_frame_info.initialized + ? arc_compute_frame_size (size) + : current_frame_info.total_size); + + if (size == 0 && epilogue_delay == 0) + { + rtx insn = get_last_insn (); + + /* If the last insn was a BARRIER, we don't have to write any code + because a jump (aka return) was put there. */ + if (GET_CODE (insn) == NOTE) + insn = prev_nonnote_insn (insn); + if (insn && GET_CODE (insn) == BARRIER) + noepilogue = TRUE; + } + + if (!noepilogue) + { + unsigned int pretend_size = current_frame_info.pretend_size; + unsigned int frame_size = size - pretend_size; + int restored, fp_restored_p; + int can_trust_sp_p = !current_function_calls_alloca; + char *sp_str = reg_names[STACK_POINTER_REGNUM]; + char *fp_str = reg_names[FRAME_POINTER_REGNUM]; + + /* ??? There are lots of optimizations that can be done here. + EG: Use fp to restore regs if it's closer. + Maybe in time we'll do them all. For now, always restore regs from + sp, but don't restore sp if we don't have to. */ + + if (!can_trust_sp_p) + { + if (!frame_pointer_needed) + abort (); + fprintf (file,"\tsub %s,%s,%d\t\t%s sp not trusted here\n", + sp_str, fp_str, frame_size, ASM_COMMENT_START); + } + + /* Restore any saved registers. */ + arc_save_restore (file, sp_str, current_frame_info.reg_offset, + /* The zeroing of these two bits is unnecessary, + but leave this in for clarity. */ + current_frame_info.gmask & ~(FRAME_POINTER_MASK | RETURN_ADDR_MASK), + "ld"); + + if (MUST_SAVE_RETURN_ADDR) + fprintf (file, "\tld %s,[%s,%d]\n", + reg_names[RETURN_ADDR_REGNUM], + frame_pointer_needed ? fp_str : sp_str, + UNITS_PER_WORD + (frame_pointer_needed ? 0 : frame_size)); + + /* Keep track of how much of the stack pointer we've restored. + It makes the following a lot more readable. */ + restored = 0; + fp_restored_p = 0; + + /* We try to emit the epilogue delay slot insn right after the load + of the return address register so that it can execute with the + stack intact. Secondly, loads are delayed. */ + /* ??? If stack intactness is important, always emit now. */ + if (MUST_SAVE_RETURN_ADDR && epilogue_delay != NULL_RTX) + { + final_scan_insn (XEXP (epilogue_delay, 0), file, 1, -2, 1); + epilogue_delay = NULL_RTX; + } + + if (frame_pointer_needed) + { + /* Try to restore the frame pointer in the delay slot. We can't, + however, if any of these is true. */ + if (epilogue_delay != NULL_RTX + || !SMALL_INT (frame_size) + || pretend_size + || ARC_INTERRUPT_P (fn_type)) + { + /* Note that we restore fp and sp here! */ + fprintf (file, "\tld.a %s,[%s,%d]\n", fp_str, sp_str, frame_size); + restored += frame_size; + fp_restored_p = 1; + } + } + else if (!SMALL_INT (size /* frame_size + pretend_size */) + || ARC_INTERRUPT_P (fn_type)) + { + fprintf (file, "\tadd %s,%s,%d\n", sp_str, sp_str, frame_size); + restored += frame_size; + } + + /* These must be done before the return insn because the delay slot + does the final stack restore. */ + if (ARC_INTERRUPT_P (fn_type)) + { + if (epilogue_delay) + { + final_scan_insn (XEXP (epilogue_delay, 0), file, 1, -2, 1); + } + } + + /* Emit the return instruction. */ + { + static int regs[4] = { + 0, RETURN_ADDR_REGNUM, ILINK1_REGNUM, ILINK2_REGNUM + }; + fprintf (file, "\tj.d %s\n", reg_names[regs[fn_type]]); + } + + /* If the only register saved is the return address, we need a + nop, unless we have an instruction to put into it. Otherwise + we don't since reloading multiple registers doesn't reference + the register being loaded. */ + + if (ARC_INTERRUPT_P (fn_type)) + fprintf (file, "\tadd %s,%s,16\n", sp_str, sp_str); + else if (epilogue_delay != NULL_RTX) + { + if (frame_pointer_needed && !fp_restored_p) + abort (); + if (restored < size) + abort (); + final_scan_insn (XEXP (epilogue_delay, 0), file, 1, -2, 1); + } + else if (frame_pointer_needed && !fp_restored_p) + { + if (!SMALL_INT (frame_size)) + abort (); + /* Note that we restore fp and sp here! */ + fprintf (file, "\tld.a %s,[%s,%d]\n", fp_str, sp_str, frame_size); + } + else if (restored < size) + { + if (!SMALL_INT (size - restored)) + abort (); + fprintf (file, "\tadd %s,%s,%d\n", + sp_str, sp_str, size - restored); + } + else + fprintf (file, "\tnop\n"); + } + + /* Reset state info for each function. */ + current_frame_info = zero_frame_info; + arc_compute_function_type (NULL_TREE); +} + +/* Define the number of delay slots needed for the function epilogue. + + Interrupt handlers can't have any epilogue delay slots (it's always needed + for something else, I think). For normal functions, we have to worry about + using call-saved regs as they'll be restored before the delay slot insn. + Functions with non-empty frames already have enough choices for the epilogue + delay slot so for now we only consider functions with empty frames. */ + +int +arc_delay_slots_for_epilogue () +{ + if (arc_compute_function_type (current_function_decl) != ARC_FUNCTION_NORMAL) + return 0; + if (!current_frame_info.initialized) + (void) arc_compute_frame_size (get_frame_size ()); + if (current_frame_info.total_size == 0) + return 1; + return 0; +} + +/* Return true if TRIAL is a valid insn for the epilogue delay slot. + Any single length instruction which doesn't reference the stack or frame + pointer or any call-saved register is OK. SLOT will always be 0. */ + +int +arc_eligible_for_epilogue_delay (trial, slot) + rtx trial; + int slot; +{ + if (slot != 0) + abort (); + + if (get_attr_length (trial) == 1 + /* If registers where saved, presumably there's more than enough + possibilities for the delay slot. The alternative is something + more complicated (of course, if we expanded the epilogue as rtl + this problem would go away). */ + /* ??? Note that this will always be true since only functions with + empty frames have epilogue delay slots. See + arc_delay_slots_for_epilogue. */ + && current_frame_info.gmask == 0 + && ! reg_mentioned_p (stack_pointer_rtx, PATTERN (trial)) + && ! reg_mentioned_p (frame_pointer_rtx, PATTERN (trial))) + return 1; + return 0; +} + +/* PIC */ + +/* Set up PIC-specific rtl. This should not cause any insns + to be emitted. */ + +void +arc_initialize_pic () +{ + /* nothing to do */ +} + +/* Emit special PIC prologues and epilogues. */ + +void +arc_finalize_pic () +{ + /* nothing to do */ +} + +/* Return true if OP is a shift operator. */ + +int +shift_operator (op, mode) + rtx op; + enum machine_mode mode; +{ + switch (GET_CODE (op)) + { + case ASHIFTRT: + case LSHIFTRT: + case ASHIFT: + return 1; + default: + return 0; + } +} + +/* Output the assembler code for doing a shift. + We go to a bit of trouble to generate efficient code as the ARC only has + single bit shifts. This is taken from the h8300 port. We only have one + mode of shifting and can't access individual bytes like the h8300 can, so + this is greatly simplified (at the expense of not generating hyper- + efficient code). + + This function is not used if the variable shift insns are present. */ + +/* ??? We assume the output operand is the same as operand 1. + This can be optimized (deleted) in the case of 1 bit shifts. */ +/* ??? We use the loop register here. We don't use it elsewhere (yet) and + using it here will give us a chance to play with it. */ + +char * +output_shift (operands) + rtx *operands; +{ + static int loopend_lab; + rtx shift = operands[3]; + enum machine_mode mode = GET_MODE (shift); + enum rtx_code code = GET_CODE (shift); + char *shift_one; + + if (mode != SImode) + abort (); + + switch (code) + { + case ASHIFT: shift_one = "asl %0,%0"; break; + case ASHIFTRT: shift_one = "asr %0,%0"; break; + case LSHIFTRT: shift_one = "lsr %0,%0"; break; + default: abort (); + } + + if (GET_CODE (operands[2]) != CONST_INT) + { + if (optimize) + output_asm_insn ("mov lp_count,%2", operands); + else + output_asm_insn ("mov %4,%2", operands); + goto shiftloop; + } + else + { + int n = INTVAL (operands[2]); + + /* If the count is negative, make it 0. */ + if (n < 0) + n = 0; + /* If the count is too big, truncate it. + ANSI says shifts of GET_MODE_BITSIZE are undefined - we choose to + do the intuitive thing. */ + else if (n > GET_MODE_BITSIZE (mode)) + n = GET_MODE_BITSIZE (mode); + + /* First see if we can do them inline. */ + if (n <= 8) + { + while (--n >= 0) + output_asm_insn (shift_one, operands); + } + /* See if we can use a rotate/and. */ + else if (n == BITS_PER_WORD - 1) + { + switch (code) + { + case ASHIFT : + output_asm_insn ("and %0,%0,1\n\tror %0,%0", operands); + break; + case ASHIFTRT : + /* The ARC doesn't have a rol insn. Use something else. */ + output_asm_insn ("asl.f 0,%0\n\tsbc %0,0,0", operands); + break; + case LSHIFTRT : + /* The ARC doesn't have a rol insn. Use something else. */ + output_asm_insn ("asl.f 0,%0\n\tadc %0,0,0", operands); + break; + } + } + /* Must loop. */ + else + { + char buf[100]; + + if (optimize) + output_asm_insn ("mov lp_count,%c2", operands); + else + output_asm_insn ("mov %4,%c2", operands); + shiftloop: + if (optimize) + { + if (flag_pic) + sprintf ("lr %%4,[status]\n\tadd %%4,%%4,6\t%s single insn loop start", + ASM_COMMENT_START); + else + sprintf (buf, "mov %%4,%%%%st(1f)\t%s (single insn loop start) >> 2", + ASM_COMMENT_START); + output_asm_insn (buf, operands); + output_asm_insn ("sr %4,[lp_start]", operands); + output_asm_insn ("add %4,%4,1", operands); + output_asm_insn ("sr %4,[lp_end]", operands); + output_asm_insn ("nop\n\tnop", operands); + if (flag_pic) + asm_fprintf (asm_out_file, "\t%s single insn loop\n", + ASM_COMMENT_START); + else + asm_fprintf (asm_out_file, "1:\t%s single insn loop\n", + ASM_COMMENT_START); + output_asm_insn (shift_one, operands); + } + else + { + asm_fprintf (asm_out_file, "1:\t%s begin shift loop\n", + ASM_COMMENT_START); + output_asm_insn ("sub.f %4,%4,1", operands); + output_asm_insn ("nop", operands); + output_asm_insn ("bn.nd 2f", operands); + output_asm_insn (shift_one, operands); + output_asm_insn ("b.nd 1b", operands); + asm_fprintf (asm_out_file, "2:\t%s end shift loop\n", + ASM_COMMENT_START); + } + } + } + + return ""; +} + +/* Nested function support. */ + +/* Emit RTL insns to initialize the variable parts of a trampoline. + FNADDR is an RTX for the address of the function's pure code. + CXT is an RTX for the static chain value for the function. */ + +void +arc_initialize_trampoline (tramp, fnaddr, cxt) + rtx tramp, fnaddr, cxt; +{ +} + +/* Set the cpu type and print out other fancy things, + at the top of the file. */ + +void +arc_asm_file_start (file) + FILE *file; +{ + fprintf (file, "\t.cpu %s\n", arc_cpu_string); +} + +/* Print operand X (an rtx) in assembler syntax to file FILE. + CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. + For `%' followed by punctuation, CODE is the punctuation and X is null. */ + +void +arc_print_operand (file, x, code) + FILE *file; + rtx x; + int code; +{ + switch (code) + { + case '#' : + /* Conditional brances. For now these are equivalent. */ + case '*' : + /* Unconditional branches. Output the appropriate delay slot suffix. */ + if (!final_sequence || XVECLEN (final_sequence, 0) == 1) + { + /* There's nothing in the delay slot. */ + fputs (".nd", file); + } + else + { + rtx jump = XVECEXP (final_sequence, 0, 0); + rtx delay = XVECEXP (final_sequence, 0, 1); + if (INSN_ANNULLED_BRANCH_P (jump)) + fputs (INSN_FROM_TARGET_P (delay) ? ".jd" : ".nd", file); + else + fputs (".d", file); + } + return; + case '?' : /* with leading "." */ + case '!' : /* without leading "." */ + /* This insn can be conditionally executed. See if the ccfsm machinery + says it should be conditionalized. */ + if (arc_ccfsm_state == 3 || arc_ccfsm_state == 4) + { + /* Is this insn in a delay slot? */ + if (final_sequence && XVECLEN (final_sequence, 0) == 2) + { + rtx insn = XVECEXP (final_sequence, 0, 1); + + /* If the insn is annulled and is from the target path, we need + to inverse the condition test. */ + if (INSN_ANNULLED_BRANCH_P (insn)) + { + if (INSN_FROM_TARGET_P (insn)) + fprintf (file, "%s%s", + code == '?' ? "." : "", + arc_condition_codes[ARC_INVERSE_CONDITION_CODE (arc_ccfsm_current_cc)]); + else + fprintf (file, "%s%s", + code == '?' ? "." : "", + arc_condition_codes[arc_ccfsm_current_cc]); + } + else + /* This insn is executed for either path, so don't + conditionalize it at all. */ + ; /* nothing to do */ + } + else + { + /* This insn isn't in a delay slot. */ + fprintf (file, "%s%s", + code == '?' ? "." : "", + arc_condition_codes[arc_ccfsm_current_cc]); + } + } + return; + case '~' : + /* Output a nop if we're between a set of the condition codes, + and a conditional branch. */ + if (last_insn_set_cc_p) + fputs ("nop\n\t", file); + return; + case 'd' : + fputs (arc_condition_codes[get_arc_condition_code (x)], file); + return; + case 'D' : + fputs (arc_condition_codes[ARC_INVERSE_CONDITION_CODE + (get_arc_condition_code (x))], + file); + return; + case 'R' : + /* Write second word of DImode or DFmode reference, + register or memory. */ + if (GET_CODE (x) == REG) + fputs (reg_names[REGNO (x)+1], file); + else if (GET_CODE (x) == MEM) + { + fputc ('[', file); + /* Handle possible auto-increment. Since it is pre-increment and + we have already done it, we can just use an offset of four. */ + /* ??? This is taken from rs6000.c I think. I don't think it is + currently necessary, but keep it around. */ + if (GET_CODE (XEXP (x, 0)) == PRE_INC + || GET_CODE (XEXP (x, 0)) == PRE_DEC) + output_address (plus_constant (XEXP (XEXP (x, 0), 0), 4)); + else + output_address (plus_constant (XEXP (x, 0), 4)); + fputc (']', file); + } + else + output_operand_lossage ("invalid operand to %R code"); + return; + case 'S' : + if ((GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FLAG (x)) + || GET_CODE (x) == LABEL_REF) + { + fprintf (file, "%%st("); + output_addr_const (file, x); + fprintf (file, ")"); + return; + } + break; + case 'H' : + case 'L' : + if (GET_CODE (x) == REG) + { + /* L = least significant word, H = most significant word */ + if ((TARGET_BIG_ENDIAN != 0) ^ (code == 'L')) + fputs (reg_names[REGNO (x)], file); + else + fputs (reg_names[REGNO (x)+1], file); + } + else if (GET_CODE (x) == CONST_INT + || GET_CODE (x) == CONST_DOUBLE) + { + rtx first, second; + + split_double (x, &first, &second); + fprintf (file, "0x%08lx", + code == 'L' ? INTVAL (first) : INTVAL (second)); + } + else + output_operand_lossage ("invalid operand to %H/%L code"); + return; + case 'A' : + { + REAL_VALUE_TYPE d; + char str[30]; + + if (GET_CODE (x) != CONST_DOUBLE + || GET_MODE_CLASS (GET_MODE (x)) != MODE_FLOAT) + abort (); + REAL_VALUE_FROM_CONST_DOUBLE (d, x); + REAL_VALUE_TO_DECIMAL (d, "%.20e", str); + fprintf (file, "%s", str); + return; + } + case 'U' : + /* Output a load/store with update indicator if appropriate. */ + if (GET_CODE (x) == MEM) + { + if (GET_CODE (XEXP (x, 0)) == PRE_INC + || GET_CODE (XEXP (x, 0)) == PRE_DEC) + fputs (".a", file); + } + else + output_operand_lossage ("invalid operand to %U code"); + return; + case 'V' : + /* Output cache bypass indicator for a load/store insn. Volatile memory + refs are defined to use the cache bypass mechanism. */ + if (GET_CODE (x) == MEM) + { + if (MEM_VOLATILE_P (x)) + fputs (".di", file); + } + else + output_operand_lossage ("invalid operand to %V code"); + return; + case 0 : + /* Do nothing special. */ + break; + default : + /* Unknown flag. */ + output_operand_lossage ("invalid operand output code"); + } + + switch (GET_CODE (x)) + { + case REG : + fputs (reg_names[REGNO (x)], file); + break; + case MEM : + fputc ('[', file); + if (GET_CODE (XEXP (x, 0)) == PRE_INC) + output_address (plus_constant (XEXP (XEXP (x, 0), 0), + GET_MODE_SIZE (GET_MODE (x)))); + else if (GET_CODE (XEXP (x, 0)) == PRE_DEC) + output_address (plus_constant (XEXP (XEXP (x, 0), 0), + - GET_MODE_SIZE (GET_MODE (x)))); + else + output_address (XEXP (x, 0)); + fputc (']', file); + break; + case CONST_DOUBLE : + /* We handle SFmode constants here as output_addr_const doesn't. */ + if (GET_MODE (x) == SFmode) + { + REAL_VALUE_TYPE d; + long l; + + REAL_VALUE_FROM_CONST_DOUBLE (d, x); + REAL_VALUE_TO_TARGET_SINGLE (d, l); + fprintf (file, "0x%08lx", l); + break; + } + /* Fall through. Let output_addr_const deal with it. */ + default : + output_addr_const (file, x); + break; + } +} + +/* Print a memory address as an operand to reference that memory location. */ + +void +arc_print_operand_address (file, addr) + FILE *file; + rtx addr; +{ + register rtx base, index = 0; + int offset = 0; + + switch (GET_CODE (addr)) + { + case REG : + fputs (reg_names[REGNO (addr)], file); + break; + case SYMBOL_REF : + if (/*???*/ 0 && SYMBOL_REF_FLAG (addr)) + { + fprintf (file, "%%st("); + output_addr_const (file, addr); + fprintf (file, ")"); + } + else + output_addr_const (file, addr); + break; + case PLUS : + if (GET_CODE (XEXP (addr, 0)) == CONST_INT) + offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1); + else if (GET_CODE (XEXP (addr, 1)) == CONST_INT) + offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0); + else + base = XEXP (addr, 0), index = XEXP (addr, 1); + if (GET_CODE (base) != REG) + abort (); + fputs (reg_names[REGNO (base)], file); + if (index == 0) + { + if (offset != 0) + fprintf (file, ",%d", offset); + } + else if (GET_CODE (index) == REG) + fprintf (file, ",%s", reg_names[REGNO (index)]); + else if (GET_CODE (index) == SYMBOL_REF) + fputc (',', file), output_addr_const (file, index); + else + abort (); + break; + case PRE_INC : + case PRE_DEC : + /* We shouldn't get here as we've lost the mode of the memory object + (which says how much to inc/dec by. */ + abort (); + break; + default : + output_addr_const (file, addr); + break; + } +} + +/* Update compare/branch separation marker. */ + +static void +record_cc_ref (insn) + rtx insn; +{ + last_insn_set_cc_p = current_insn_set_cc_p; + + switch (get_attr_cond (insn)) + { + case COND_SET : + case COND_SET_ZN : + case COND_SET_ZNC : + if (get_attr_length (insn) == 1) + current_insn_set_cc_p = 1; + else + current_insn_set_cc_p = 0; + break; + default : + current_insn_set_cc_p = 0; + break; + } +} + +/* Conditional execution support. + + This is based on the ARM port but for now is much simpler. + + A finite state machine takes care of noticing whether or not instructions + can be conditionally executed, and thus decrease execution time and code + size by deleting branch instructions. The fsm is controlled by + final_prescan_insn, and controls the actions of PRINT_OPERAND. The patterns + in the .md file for the branch insns also have a hand in this. */ + +/* The state of the fsm controlling condition codes are: + 0: normal, do nothing special + 1: don't output this insn + 2: don't output this insn + 3: make insns conditional + 4: make insns conditional + + State transitions (state->state by whom, under what condition): + 0 -> 1 final_prescan_insn, if insn is conditional branch + 0 -> 2 final_prescan_insn, if the `target' is an unconditional branch + 1 -> 3 branch patterns, after having not output the conditional branch + 2 -> 4 branch patterns, after having not output the conditional branch + 3 -> 0 ASM_OUTPUT_INTERNAL_LABEL, if the `target' label is reached + (the target label has CODE_LABEL_NUMBER equal to + arc_ccfsm_target_label). + 4 -> 0 final_prescan_insn, if `target' unconditional branch is reached + + If the jump clobbers the conditions then we use states 2 and 4. + + A similar thing can be done with conditional return insns. + + We also handle separating branches from sets of the condition code. + This is done here because knowledge of the ccfsm state is required, + we may not be outputting the branch. */ + +void +arc_final_prescan_insn (insn, opvec, noperands) + rtx insn; + rtx *opvec; + int noperands; +{ + /* BODY will hold the body of INSN. */ + register rtx body = PATTERN (insn); + + /* This will be 1 if trying to repeat the trick (ie: do the `else' part of + an if/then/else), and things need to be reversed. */ + int reverse = 0; + + /* If we start with a return insn, we only succeed if we find another one. */ + int seeking_return = 0; + + /* START_INSN will hold the insn from where we start looking. This is the + first insn after the following code_label if REVERSE is true. */ + rtx start_insn = insn; + + /* Update compare/branch separation marker. */ + record_cc_ref (insn); + + /* Allow -mdebug-ccfsm to turn this off so we can see how well it does. + We can't do this in macro FINAL_PRESCAN_INSN because it's called from + final_scan_insn which has `optimize' as a local. */ + if (optimize < 2 || TARGET_NO_COND_EXEC) + return; + + /* If in state 4, check if the target branch is reached, in order to + change back to state 0. */ + if (arc_ccfsm_state == 4) + { + if (insn == arc_ccfsm_target_insn) + { + arc_ccfsm_target_insn = NULL; + arc_ccfsm_state = 0; + } + return; + } + + /* If in state 3, it is possible to repeat the trick, if this insn is an + unconditional branch to a label, and immediately following this branch + is the previous target label which is only used once, and the label this + branch jumps to is not too far off. Or in other words "we've done the + `then' part, see if we can do the `else' part." */ + if (arc_ccfsm_state == 3) + { + if (simplejump_p (insn)) + { + start_insn = next_nonnote_insn (start_insn); + if (GET_CODE (start_insn) == BARRIER) + { + /* ??? Isn't this always a barrier? */ + start_insn = next_nonnote_insn (start_insn); + } + if (GET_CODE (start_insn) == CODE_LABEL + && CODE_LABEL_NUMBER (start_insn) == arc_ccfsm_target_label + && LABEL_NUSES (start_insn) == 1) + reverse = TRUE; + else + return; + } + else if (GET_CODE (body) == RETURN) + { + start_insn = next_nonnote_insn (start_insn); + if (GET_CODE (start_insn) == BARRIER) + start_insn = next_nonnote_insn (start_insn); + if (GET_CODE (start_insn) == CODE_LABEL + && CODE_LABEL_NUMBER (start_insn) == arc_ccfsm_target_label + && LABEL_NUSES (start_insn) == 1) + { + reverse = TRUE; + seeking_return = 1; + } + else + return; + } + else + return; + } + + if (GET_CODE (insn) != JUMP_INSN) + return; + + /* This jump might be paralled with a clobber of the condition codes, + the jump should always come first. */ + if (GET_CODE (body) == PARALLEL && XVECLEN (body, 0) > 0) + body = XVECEXP (body, 0, 0); + + if (reverse + || (GET_CODE (body) == SET && GET_CODE (SET_DEST (body)) == PC + && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE)) + { + int insns_skipped = 0, fail = FALSE, succeed = FALSE; + /* Flag which part of the IF_THEN_ELSE is the LABEL_REF. */ + int then_not_else = TRUE; + /* Nonzero if next insn must be the target label. */ + int next_must_be_target_label_p; + rtx this_insn = start_insn, label = 0; + + /* Register the insn jumped to. */ + if (reverse) + { + if (!seeking_return) + label = XEXP (SET_SRC (body), 0); + } + else if (GET_CODE (XEXP (SET_SRC (body), 1)) == LABEL_REF) + label = XEXP (XEXP (SET_SRC (body), 1), 0); + else if (GET_CODE (XEXP (SET_SRC (body), 2)) == LABEL_REF) + { + label = XEXP (XEXP (SET_SRC (body), 2), 0); + then_not_else = FALSE; + } + else if (GET_CODE (XEXP (SET_SRC (body), 1)) == RETURN) + seeking_return = 1; + else if (GET_CODE (XEXP (SET_SRC (body), 2)) == RETURN) + { + seeking_return = 1; + then_not_else = FALSE; + } + else + abort (); + + /* See how many insns this branch skips, and what kind of insns. If all + insns are okay, and the label or unconditional branch to the same + label is not too far away, succeed. */ + for (insns_skipped = 0, next_must_be_target_label_p = FALSE; + !fail && !succeed && insns_skipped < MAX_INSNS_SKIPPED; + insns_skipped++) + { + rtx scanbody; + + this_insn = next_nonnote_insn (this_insn); + if (!this_insn) + break; + + if (next_must_be_target_label_p) + { + if (GET_CODE (this_insn) == BARRIER) + continue; + if (GET_CODE (this_insn) == CODE_LABEL + && this_insn == label) + { + arc_ccfsm_state = 1; + succeed = TRUE; + } + else + fail = TRUE; + break; + } + + scanbody = PATTERN (this_insn); + + switch (GET_CODE (this_insn)) + { + case CODE_LABEL: + /* Succeed if it is the target label, otherwise fail since + control falls in from somewhere else. */ + if (this_insn == label) + { + arc_ccfsm_state = 1; + succeed = TRUE; + } + else + fail = TRUE; + break; + + case BARRIER: + /* Succeed if the following insn is the target label. + Otherwise fail. + If return insns are used then the last insn in a function + will be a barrier. */ + next_must_be_target_label_p = TRUE; + break; + + case CALL_INSN: + /* Can handle a call insn if there are no insns after it. + IE: The next "insn" is the target label. We don't have to + worry about delay slots as such insns are SEQUENCE's inside + INSN's. ??? It is possible to handle such insns though. */ + if (get_attr_cond (this_insn) == COND_CANUSE) + next_must_be_target_label_p = TRUE; + else + fail = TRUE; + break; + + case JUMP_INSN: + /* If this is an unconditional branch to the same label, succeed. + If it is to another label, do nothing. If it is conditional, + fail. */ + /* ??? Probably, the test for the SET and the PC are unnecessary. */ + + if (GET_CODE (scanbody) == SET + && GET_CODE (SET_DEST (scanbody)) == PC) + { + if (GET_CODE (SET_SRC (scanbody)) == LABEL_REF + && XEXP (SET_SRC (scanbody), 0) == label && !reverse) + { + arc_ccfsm_state = 2; + succeed = TRUE; + } + else if (GET_CODE (SET_SRC (scanbody)) == IF_THEN_ELSE) + fail = TRUE; + } + else if (GET_CODE (scanbody) == RETURN + && seeking_return) + { + arc_ccfsm_state = 2; + succeed = TRUE; + } + else if (GET_CODE (scanbody) == PARALLEL) + { + if (get_attr_cond (this_insn) != COND_CANUSE) + fail = TRUE; + } + break; + + case INSN: + /* We can only do this with insns that can use the condition + codes (and don't set them). */ + if (GET_CODE (scanbody) == SET + || GET_CODE (scanbody) == PARALLEL) + { + if (get_attr_cond (this_insn) != COND_CANUSE) + fail = TRUE; + } + /* We can't handle other insns like sequences. */ + else + fail = TRUE; + break; + + default: + break; + } + } + + if (succeed) + { + if ((!seeking_return) && (arc_ccfsm_state == 1 || reverse)) + arc_ccfsm_target_label = CODE_LABEL_NUMBER (label); + else if (seeking_return || arc_ccfsm_state == 2) + { + while (this_insn && GET_CODE (PATTERN (this_insn)) == USE) + { + this_insn = next_nonnote_insn (this_insn); + if (this_insn && (GET_CODE (this_insn) == BARRIER + || GET_CODE (this_insn) == CODE_LABEL)) + abort (); + } + if (!this_insn) + { + /* Oh dear! we ran off the end, give up. */ + insn_extract (insn); + arc_ccfsm_state = 0; + arc_ccfsm_target_insn = NULL; + return; + } + arc_ccfsm_target_insn = this_insn; + } + else + abort (); + + /* If REVERSE is true, ARM_CURRENT_CC needs to be inverted from + what it was. */ + if (!reverse) + arc_ccfsm_current_cc = get_arc_condition_code (XEXP (SET_SRC (body), + 0)); + + if (reverse || then_not_else) + arc_ccfsm_current_cc = ARC_INVERSE_CONDITION_CODE (arc_ccfsm_current_cc); + } + + /* Restore recog_operand. Getting the attributes of other insns can + destroy this array, but final.c assumes that it remains intact + accross this call; since the insn has been recognized already we + call insn_extract direct. */ + insn_extract (insn); + } +} + +/* Record that we are currently outputting label NUM with prefix PREFIX. + It it's the label we're looking for, reset the ccfsm machinery. + + Called from ASM_OUTPUT_INTERNAL_LABEL. */ + +void +arc_ccfsm_at_label (prefix, num) + char *prefix; + int num; +{ + if (arc_ccfsm_state == 3 && arc_ccfsm_target_label == num + && !strcmp (prefix, "L")) + { + arc_ccfsm_state = 0; + arc_ccfsm_target_insn = NULL_RTX; + } +} + +/* See if the current insn, which is a conditional branch, is to be + deleted. */ + +int +arc_ccfsm_branch_deleted_p () +{ + if (arc_ccfsm_state == 1 || arc_ccfsm_state == 2) + return 1; + return 0; +} + +/* Record a branch isn't output because subsequent insns can be + conditionalized. */ + +void +arc_ccfsm_record_branch_deleted () +{ + /* Indicate we're conditionalizing insns now. */ + arc_ccfsm_state += 2; + + /* If the next insn is a subroutine call, we still need a nop between the + cc setter and user. We need to undo the effect of calling record_cc_ref + for the just deleted branch. */ + current_insn_set_cc_p = last_insn_set_cc_p; +} diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h new file mode 100644 index 00000000000..d92fbdc0b98 --- /dev/null +++ b/gcc/config/arc/arc.h @@ -0,0 +1,1643 @@ +/* Definitions of target machine for GNU compiler, for the ARC cpu. + Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* ??? This is an old port, and is undoubtedly suffering from bit rot. */ + +/* Things to do: + + - PREDICATE_CODES + - incscc, decscc? + - print active compiler options in assembler output +*/ + +/* FIXME: Create elf.h and have svr4.h include it. */ +#include "svr4.h" + +#undef ASM_SPEC +#undef LINK_SPEC +#undef STARTFILE_SPEC +#undef ENDFILE_SPEC +#undef SIZE_TYPE +#undef PTRDIFF_TYPE +#undef WCHAR_TYPE +#undef WCHAR_TYPE_SIZE + +/* Print subsidiary information on the compiler version in use. */ +#define TARGET_VERSION fprintf (stderr, " (arc)") + +/* Names to predefine in the preprocessor for this target machine. */ +#define CPP_PREDEFINES "-Acpu(arc) -Amachine(arc) -D__arc__" + +/* Additional flags for the preprocessor. */ +#define CPP_SPEC "\ +%{!mcpu=*:-D__base__} %{mcpu=base:-D__base__} \ +%{EB:-D__big_endian__} \ +" + +/* Pass -mmangle-cpu if we get -mcpu=*. + Doing it this way lets one have it on as default with -mcpu=*, + but also lets one turn it off with -mno-mangle-cpu. */ +#define CC1_SPEC "\ +%{mcpu=*:-mmangle-cpu} \ +%{EB:%{EL:%emay not use both -EB and -EL}} \ +%{EB:-mbig-endian} %{EL:-mlittle-endian} \ +" + +#define ASM_SPEC "%{v} %{EB} %{EL}" + +#define LINK_SPEC "%{v} %{EB} %{EL}" + +#define STARTFILE_SPEC "%{!shared:crt0.o%s} crtinit.o%s" + +#define ENDFILE_SPEC "crtfini.o%s" + +/* Run-time compilation parameters selecting different hardware subsets. */ + +extern int target_flags; + +/* Mangle all user symbols for the specified cpu. + ARC's can be shipped in which a collection of cpus are coupled together. + Each CPU may be different in some way, and thus we may need to distinguish + code compiled for one to ensure it isn't linked with code compiled for + another. */ +#define TARGET_MASK_MANGLE_CPU 1 +#define TARGET_MANGLE_CPU (target_flags & TARGET_MASK_MANGLE_CPU) + +#if 0 +/* Mangle libgcc symbols by adding a suffix for the specified cpu. */ +#define TARGET_MASK_MANGLE_CPU_LIBGCC 2 +#define TARGET_MANGLE_CPU_LIBGCC (target_flags & TARGET_MASK_MANGLE_CPU_LIBGCC) +#endif + +/* Align loops to 32 byte boundaries (cache line size). */ +#define TARGET_MASK_ALIGN_LOOPS 4 +#define TARGET_ALIGN_LOOPS (target_flags & TARGET_MASK_ALIGN_LOOPS) + +/* Big Endian. */ +#define TARGET_MASK_BIG_ENDIAN 8 +#define TARGET_BIG_ENDIAN (target_flags & TARGET_MASK_BIG_ENDIAN) + +/* Turn off conditional execution optimization, + so we can see how well it does, or in case it's buggy. */ +#define TARGET_MASK_NO_COND_EXEC 0x10 +#define TARGET_NO_COND_EXEC (target_flags & TARGET_MASK_NO_COND_EXEC) + +/* Macro to define tables used to set the flags. + This is a list in braces of pairs in braces, + each pair being { "NAME", VALUE } + where VALUE is the bits to set or minus the bits to clear. + An empty string NAME is used to identify the default VALUE. */ + +#define TARGET_SWITCHES \ +{ \ + { "mangle-cpu", TARGET_MASK_MANGLE_CPU }, \ + { "no-mangle-cpu", -TARGET_MASK_MANGLE_CPU }, \ +/* { "mangle-cpu-libgcc", TARGET_MASK_MANGLE_CPU_LIBGCC }, */ \ +/* { "no-mangle-cpu-libgcc", -TARGET_MASK_MANGLE_CPU_LIBGCC }, */ \ + { "align-loops", TARGET_MASK_ALIGN_LOOPS }, \ + { "no-align-loops", -TARGET_MASK_ALIGN_LOOPS }, \ + { "big-endian", TARGET_MASK_BIG_ENDIAN }, \ + { "little-endian", -TARGET_MASK_BIG_ENDIAN }, \ + { "no-cond-exec", TARGET_MASK_NO_COND_EXEC }, \ + SUBTARGET_SWITCHES \ + { "", TARGET_DEFAULT } \ +} + +#define TARGET_DEFAULT (0) + +#define SUBTARGET_SWITCHES + +/* Instruction set characteristics. + These are internal macros, set by the appropriate -mcpu= option. */ + +/* Non-zero means the cpu has a barrel shifter. */ +#define TARGET_SHIFTER 0 + +/* This macro is similar to `TARGET_SWITCHES' but defines names of + command options that have values. Its definition is an + initializer with a subgrouping for each command option. + + Each subgrouping contains a string constant, that defines the + fixed part of the option name, and the address of a variable. + The variable, type `char *', is set to the variable part of the + given option if the fixed part matches. The actual option name + is made by appending `-m' to the specified name. + + Here is an example which defines `-mshort-data-NUMBER'. If the + given option is `-mshort-data-512', the variable `m88k_short_data' + will be set to the string `"512"'. + + extern char *m88k_short_data; + #define TARGET_OPTIONS { { "short-data-", &m88k_short_data } } */ + +extern char *arc_cpu_string; +extern char *arc_text_string,*arc_data_string,*arc_rodata_string; + +#define TARGET_OPTIONS \ +{ \ + { "cpu=", &arc_cpu_string }, \ + { "text=", &arc_text_string }, \ + { "data=", &arc_data_string }, \ + { "rodata=", &arc_rodata_string }, \ +} + +/* Which cpu we're compiling for. */ +extern int arc_cpu_type; + +/* Check if CPU is an extension and set `arc_cpu_type' and `arc_mangle_cpu' + appropriately. The result should be non-zero if the cpu is recognized, + otherwise zero. This is intended to be redefined in a cover file. + This is used by arc_init. */ +#define ARC_EXTENSION_CPU(cpu) 0 + +/* Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ + +extern void arc_init (); + +#define OVERRIDE_OPTIONS \ +do { \ + /* These need to be done at start up. It's convenient to do them here. */ \ + arc_init (); \ +} while (0) + +/* Target machine storage layout. */ + +/* Define to use software floating point emulator for REAL_ARITHMETIC and + decimal <-> binary conversion. */ +#define REAL_ARITHMETIC + +/* Define this if most significant bit is lowest numbered + in instructions that operate on numbered bit-fields. */ +#define BITS_BIG_ENDIAN 1 + +/* Define this if most significant byte of a word is the lowest numbered. */ +#define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN) + +/* Define this if most significant word of a multiword number is the lowest + numbered. */ +#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN) + +/* Define this to set the endianness to use in libgcc2.c, which can + not depend on target_flags. */ +#ifdef __big_endian__ +#define LIBGCC2_WORDS_BIG_ENDIAN 1 +#else +#define LIBGCC2_WORDS_BIG_ENDIAN 0 +#endif + +/* Number of bits in an addressable storage unit. */ +#define BITS_PER_UNIT 8 + +/* Width in bits of a "word", which is the contents of a machine register. + Note that this is not necessarily the width of data type `int'; + if using 16-bit ints on a 68000, this would still be 32. + But on a machine with 16-bit registers, this would be 16. */ +#define BITS_PER_WORD 32 + +/* Width of a word, in units (bytes). */ +#define UNITS_PER_WORD 4 + +/* Define this macro if it is advisable to hold scalars in registers + in a wider mode than that declared by the program. In such cases, + the value is constrained to be within the bounds of the declared + type, but kept valid in the wider mode. The signedness of the + extension may differ from that of the type. */ +#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ +if (GET_MODE_CLASS (MODE) == MODE_INT \ + && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \ +{ \ + (MODE) = SImode; \ +} + +/* Define this macro if the promotion described by `PROMOTE_MODE' + should also be done for outgoing function arguments. */ +#define PROMOTE_FUNCTION_ARGS + +/* Likewise, if the function return value is promoted. */ +#define PROMOTE_FUNCTION_RETURN + +/* Width in bits of a pointer. + See also the macro `Pmode' defined below. */ +#define POINTER_SIZE 32 + +/* Allocation boundary (in *bits*) for storing arguments in argument list. */ +#define PARM_BOUNDARY 32 + +/* Boundary (in *bits*) on which stack pointer should be aligned. */ +#define STACK_BOUNDARY 64 + +/* ALIGN FRAMES on word boundaries */ +#define ARC_STACK_ALIGN(LOC) (((LOC)+7) & ~7) + +/* Allocation boundary (in *bits*) for the code of a function. */ +#define FUNCTION_BOUNDARY 32 + +/* Alignment of field after `int : 0' in a structure. */ +#define EMPTY_FIELD_BOUNDARY 32 + +/* Every structure's size must be a multiple of this. */ +#define STRUCTURE_SIZE_BOUNDARY 8 + +/* A bitfield declared as `int' forces `int' alignment for the struct. */ +#define PCC_BITFIELD_TYPE_MATTERS 1 + +/* No data type wants to be aligned rounder than this. */ +/* This is bigger than currently necessary for the ARC. If 8 byte floats are + ever added it's not clear whether they'll need such alignment or not. For + now we assume they will. We can always relax it if necessary but the + reverse isn't true. */ +#define BIGGEST_ALIGNMENT 64 + +/* The best alignment to use in cases where we have a choice. */ +#define FASTEST_ALIGNMENT 32 + +/* Make strings word-aligned so strcpy from constants will be faster. */ +#define CONSTANT_ALIGNMENT(EXP, ALIGN) \ + ((TREE_CODE (EXP) == STRING_CST \ + && (ALIGN) < FASTEST_ALIGNMENT) \ + ? FASTEST_ALIGNMENT : (ALIGN)) + +/* Make arrays of chars word-aligned for the same reasons. */ +#define DATA_ALIGNMENT(TYPE, ALIGN) \ + (TREE_CODE (TYPE) == ARRAY_TYPE \ + && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ + && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN)) + +/* Set this nonzero if move instructions will actually fail to work + when given unaligned data. */ +/* On the ARC the lower address bits are masked to 0 as necessary. The chip + won't croak when given an unaligned address, but the insn will still fail + to produce the correct result. */ +#define STRICT_ALIGNMENT 1 + +/* Layout of source language data types. */ + +#define SHORT_TYPE_SIZE 16 +#define INT_TYPE_SIZE 32 +#define LONG_TYPE_SIZE 32 +#define LONG_LONG_TYPE_SIZE 64 +#define FLOAT_TYPE_SIZE 32 +#define DOUBLE_TYPE_SIZE 64 +#define LONG_DOUBLE_TYPE_SIZE 64 + +/* Define this as 1 if `char' should by default be signed; else as 0. */ +#define DEFAULT_SIGNED_CHAR 1 + +#define SIZE_TYPE "long unsigned int" +#define PTRDIFF_TYPE "long int" +#define WCHAR_TYPE "short unsigned int" +#define WCHAR_TYPE_SIZE 16 + +/* Define results of standard character escape sequences. */ +#define TARGET_BELL 007 +#define TARGET_BS 010 +#define TARGET_TAB 011 +#define TARGET_NEWLINE 012 +#define TARGET_VT 013 +#define TARGET_FF 014 +#define TARGET_CR 015 + +/* Standard register usage. */ + +/* Number of actual hardware registers. + The hardware registers are assigned numbers for the compiler + from 0 to just below FIRST_PSEUDO_REGISTER. + All registers that the compiler knows about must be given numbers, + even those that are not normally considered general registers. */ +/* Registers 61, 62, and 63 are not really registers and we needn't treat + them as such. We still need a register for the condition code. */ +#define FIRST_PSEUDO_REGISTER 62 + +/* 1 for registers that have pervasive standard uses + and are not available for the register allocator. + + 0-28 - general purpose registers + 29 - ilink1 (interrupt link register) + 30 - ilink2 (interrupt link register) + 31 - blink (branch link register) + 32-59 - reserved for extensions + 60 - LP_COUNT + 61 - condition code + + For doc purposes: + 61 - short immediate data indicator (setting flags) + 62 - long immediate data indicator + 63 - short immediate data indicator (not setting flags). + + The general purpose registers are further broken down into: + 0-7 - arguments/results + 8-15 - call used + 16-23 - call saved + 24 - call used, static chain pointer + 25 - call used, gptmp + 26 - global pointer + 27 - frame pointer + 28 - stack pointer + + By default, the extension registers are not available. */ + +#define FIXED_REGISTERS \ +{ 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 1, 1, 1, 1, 0, \ + \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1 } + +/* 1 for registers not available across function calls. + These must include the FIXED_REGISTERS and also any + registers that can be used without being saved. + The latter must include the registers where values are returned + and the register where structure-value addresses are passed. + Aside from that, you can include as many other registers as you like. */ + +#define CALL_USED_REGISTERS \ +{ 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1 } + +/* If defined, an initializer for a vector of integers, containing the + numbers of hard registers in the order in which GNU CC should + prefer to use them (from most preferred to least). */ +#define REG_ALLOC_ORDER \ +{ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, \ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 31, \ + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \ + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, \ + 27, 28, 29, 30 } + +/* Return number of consecutive hard regs needed starting at reg REGNO + to hold something of mode MODE. + This is ordinarily the length in words of a value of mode MODE + but can be less for certain modes in special long registers. */ +#define HARD_REGNO_NREGS(REGNO, MODE) \ +((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + +/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */ +extern unsigned int arc_hard_regno_mode_ok[]; +extern unsigned int arc_mode_class[]; +#define HARD_REGNO_MODE_OK(REGNO, MODE) \ +((arc_hard_regno_mode_ok[REGNO] & arc_mode_class[MODE]) != 0) + +/* A C expression that is nonzero if it is desirable to choose + register allocation so as to avoid move instructions between a + value of mode MODE1 and a value of mode MODE2. + + If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, + MODE2)' are ever different for any R, then `MODES_TIEABLE_P (MODE1, + MODE2)' must be zero. */ + +/* Tie QI/HI/SI modes together. */ +#define MODES_TIEABLE_P(MODE1, MODE2) \ +(GET_MODE_CLASS (MODE1) == MODE_INT \ + && GET_MODE_CLASS (MODE2) == MODE_INT \ + && GET_MODE_SIZE (MODE1) <= UNITS_PER_WORD \ + && GET_MODE_SIZE (MODE2) <= UNITS_PER_WORD) + +/* Register classes and constants. */ + +/* Define the classes of registers for register constraints in the + machine description. Also define ranges of constants. + + One of the classes must always be named ALL_REGS and include all hard regs. + If there is more than one class, another class must be named NO_REGS + and contain no registers. + + The name GENERAL_REGS must be the name of a class (or an alias for + another name such as ALL_REGS). This is the class of registers + that is allowed by "g" or "r" in a register constraint. + Also, registers outside this class are allocated only when + instructions express preferences for them. + + The classes must be numbered in nondecreasing order; that is, + a larger-numbered class must never be contained completely + in a smaller-numbered class. + + For any two classes, it is very desirable that there be another + class that represents their union. + + It is important that any condition codes have class NO_REGS. + See `register_operand'. */ + +enum reg_class { + NO_REGS, LPCOUNT_REG, GENERAL_REGS, ALL_REGS, LIM_REG_CLASSES +}; + +#define N_REG_CLASSES (int) LIM_REG_CLASSES + +/* Give names of register classes as strings for dump file. */ +#define REG_CLASS_NAMES \ +{ "NO_REGS", "LPCOUNT_REG", "GENERAL_REGS", "ALL_REGS" } + +/* Define which registers fit in which classes. + This is an initializer for a vector of HARD_REG_SET + of length N_REG_CLASSES. */ + +#define REG_CLASS_CONTENTS \ +{ {0, 0}, {0, 0x10000000}, {0xffffffff, 0xfffffff}, \ + {0xffffffff, 0x1fffffff} } + +/* The same information, inverted: + Return the class number of the smallest class containing + reg number REGNO. This could be a conditional expression + or could index an array. */ +extern enum reg_class arc_regno_reg_class[]; +#define REGNO_REG_CLASS(REGNO) \ +(arc_regno_reg_class[REGNO]) + +/* The class value for index registers, and the one for base regs. */ +#define INDEX_REG_CLASS GENERAL_REGS +#define BASE_REG_CLASS GENERAL_REGS + +/* Get reg_class from a letter such as appears in the machine description. */ +#define REG_CLASS_FROM_LETTER(C) \ +((C) == 'l' ? LPCOUNT_REG /* ??? needed? */ \ + : NO_REGS) + +/* These assume that REGNO is a hard or pseudo reg number. + They give nonzero only if REGNO is a hard reg of the suitable class + or a pseudo reg currently allocated to a suitable hard reg. + Since they use reg_renumber, they are safe only once reg_renumber + has been allocated, which happens in local-alloc.c. */ +#define REGNO_OK_FOR_BASE_P(REGNO) \ +((REGNO) < 29 || (unsigned) reg_renumber[REGNO] < 29) +#define REGNO_OK_FOR_INDEX_P(REGNO) \ +((REGNO) < 29 || (unsigned) reg_renumber[REGNO] < 29) + +/* Given an rtx X being reloaded into a reg required to be + in class CLASS, return the class of reg to actually use. + In general this is just CLASS; but on some machines + in some cases it is preferable to use a more restrictive class. */ +#define PREFERRED_RELOAD_CLASS(X,CLASS) \ +(CLASS) + +/* Return the maximum number of consecutive registers + needed to represent mode MODE in a register of class CLASS. */ +#define CLASS_MAX_NREGS(CLASS, MODE) \ +((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + +/* The letters I, J, K, L, M, N, O, P in a register constraint string + can be used to stand for particular ranges of immediate operands. + This macro defines what the ranges are. + C is the letter, and VALUE is a constant value. + Return 1 if VALUE is in the range specified by C. */ +/* 'I' is used for short immediates (always signed). + 'J' is used for long immediates. + 'K' is used for any constant up to 64 bits (for 64x32 situations?). */ + +/* local to this file */ +#define SMALL_INT(X) ((unsigned) ((X) + 0x100) < 0x200) +/* local to this file */ +#define LARGE_INT(X) \ +((X) >= (-(HOST_WIDE_INT) 0x7fffffff - 1) \ + && (X) <= (unsigned HOST_WIDE_INT) 0xffffffff) + +#define CONST_OK_FOR_LETTER_P(VALUE, C) \ +((C) == 'I' ? SMALL_INT (VALUE) \ + : (C) == 'J' ? LARGE_INT (VALUE) \ + : (C) == 'K' ? 1 \ + : 0) + +/* Similar, but for floating constants, and defining letters G and H. + Here VALUE is the CONST_DOUBLE rtx itself. */ +/* 'G' is used for integer values for the multiplication insns where the + operands are extended from 4 bytes to 8 bytes. + 'H' is used when any 64 bit constant is allowed. */ +#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ +((C) == 'G' ? arc_double_limm_p (VALUE) \ + : (C) == 'H' ? 1 \ + : 0) + +/* A C expression that defines the optional machine-dependent constraint + letters that can be used to segregate specific types of operands, + usually memory references, for the target machine. It should return 1 if + VALUE corresponds to the operand type represented by the constraint letter + C. If C is not defined as an extra constraint, the value returned should + be 0 regardless of VALUE. */ +/* ??? This currently isn't used. Waiting for PIC. */ +#if 0 +#define EXTRA_CONSTRAINT(VALUE, C) \ +((C) == 'R' ? (SYMBOL_REF_FLAG (VALUE) || GET_CODE (VALUE) == LABEL_REF) \ + : 0) +#endif + +/* Stack layout and stack pointer usage. */ + +/* Define this macro if pushing a word onto the stack moves the stack + pointer to a smaller address. */ +#define STACK_GROWS_DOWNWARD + +/* Define this if the nominal address of the stack frame + is at the high-address end of the local variables; + that is, each additional local variable allocated + goes at a more negative offset in the frame. */ +#define FRAME_GROWS_DOWNWARD + +/* Offset within stack frame to start allocating local variables at. + If FRAME_GROWS_DOWNWARD, this is the offset to the END of the + first local allocated. Otherwise, it is the offset to the BEGINNING + of the first local allocated. */ +#define STARTING_FRAME_OFFSET 0 + +/* Offset from the stack pointer register to the first location at which + outgoing arguments are placed. */ +#define STACK_POINTER_OFFSET FIRST_PARM_OFFSET (0) + +/* Offset of first parameter from the argument pointer register value. */ +/* 4 bytes for each of previous fp, return address, and previous gp. + 4 byte reserved area for future considerations. */ +#define FIRST_PARM_OFFSET(FNDECL) 16 + +/* A C expression whose value is RTL representing the address in a + stack frame where the pointer to the caller's frame is stored. + Assume that FRAMEADDR is an RTL expression for the address of the + stack frame itself. + + If you don't define this macro, the default is to return the value + of FRAMEADDR--that is, the stack frame address is also the address + of the stack word that points to the previous frame. */ +/* FIXME: unfinished */ +/*define DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)*/ + +/* A C expression whose value is RTL representing the value of the + return address for the frame COUNT steps up from the current frame. + FRAMEADDR is the frame pointer of the COUNT frame, or the frame + pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' + is defined. */ +/* The current return address is in r31. The return address of anything + farther back is at [%fp,4]. */ +#if 0 /* The default value should work. */ +#define RETURN_ADDR_RTX(COUNT, FRAME) \ +(((COUNT) == -1) \ + ? gen_rtx (REG, Pmode, 31) \ + : copy_to_reg (gen_rtx (MEM, Pmode, \ + memory_address (Pmode, plus_constant ((FRAME), UNITS_PER_WORD))))) +#endif + +/* Register to use for pushing function arguments. */ +#define STACK_POINTER_REGNUM 28 + +/* Base register for access to local variables of the function. */ +#define FRAME_POINTER_REGNUM 27 + +/* Base register for access to arguments of the function. */ +#define ARG_POINTER_REGNUM FRAME_POINTER_REGNUM + +/* Register in which static-chain is passed to a function. This must + not be a register used by the prologue. */ +#define STATIC_CHAIN_REGNUM 24 + +/* A C expression which is nonzero if a function must have and use a + frame pointer. This expression is evaluated in the reload pass. + If its value is nonzero the function will have a frame pointer. */ +#define FRAME_POINTER_REQUIRED \ +(current_function_calls_alloca) + +/* C statement to store the difference between the frame pointer + and the stack pointer values immediately after the function prologue. */ +#define INITIAL_FRAME_POINTER_OFFSET(VAR) \ +((VAR) = arc_compute_frame_size (get_frame_size ())) + +/* Function argument passing. */ + +/* When a prototype says `char' or `short', really pass an `int'. */ +#define PROMOTE_PROTOTYPES + +/* If defined, the maximum amount of space required for outgoing + arguments will be computed and placed into the variable + `current_function_outgoing_args_size'. No space will be pushed + onto the stack for each call; instead, the function prologue should + increase the stack frame size by this amount. */ +#define ACCUMULATE_OUTGOING_ARGS + +/* Value is the number of bytes of arguments automatically + popped when returning from a subroutine call. + FUNDECL is the declaration node of the function (as a tree), + FUNTYPE is the data type of the function (as a tree), + or for a library call it is an identifier node for the subroutine name. + SIZE is the number of bytes of arguments passed on the stack. */ +#define RETURN_POPS_ARGS(DECL, FUNTYPE, SIZE) 0 + +/* Define a data type for recording info about an argument list + during the scan of that argument list. This data type should + hold all necessary information about the function itself + and about the args processed so far, enough to enable macros + such as FUNCTION_ARG to determine where the next arg should go. */ +#define CUMULATIVE_ARGS int + +/* Initialize a variable CUM of type CUMULATIVE_ARGS + for a call to a function whose data type is FNTYPE. + For a library call, FNTYPE is 0. */ +#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +((CUM) = 0) + +/* The number of registers used for parameter passing. Local to this file. */ +#define MAX_ARC_PARM_REGS 8 + +/* 1 if N is a possible register number for function argument passing. */ +#define FUNCTION_ARG_REGNO_P(N) \ +((unsigned) (N) < MAX_ARC_PARM_REGS) + +/* The ROUND_ADVANCE* macros are local to this file. */ +/* Round SIZE up to a word boundary. */ +#define ROUND_ADVANCE(SIZE) \ +(((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + +/* Round arg MODE/TYPE up to the next word boundary. */ +#define ROUND_ADVANCE_ARG(MODE, TYPE) \ +((MODE) == BLKmode \ + ? ROUND_ADVANCE (int_size_in_bytes (TYPE)) \ + : ROUND_ADVANCE (GET_MODE_SIZE (MODE))) + +/* Round CUM up to the necessary point for argument MODE/TYPE. */ +#define ROUND_ADVANCE_CUM(CUM, MODE, TYPE) \ +((((MODE) == BLKmode ? TYPE_ALIGN (TYPE) : GET_MODE_BITSIZE (MODE)) \ + > BITS_PER_WORD) \ + ? ((CUM) + 1 & ~1) \ + : (CUM)) + +/* Return boolean indicating arg of type TYPE and mode MODE will be passed in + a reg. This includes arguments that have to be passed by reference as the + pointer to them is passed in a reg if one is available (and that is what + we're given). + When passing arguments NAMED is always 1. When receiving arguments NAMED + is 1 for each argument except the last in a stdarg/varargs function. In + a stdarg function we want to treat the last named arg as named. In a + varargs function we want to treat the last named arg (which is + `__builtin_va_alist') as unnamed. + This macro is only used in this file. */ +extern int current_function_varargs; +#define PASS_IN_REG_P(CUM, MODE, TYPE, NAMED) \ +((!current_function_varargs || (NAMED)) \ + && (CUM) < MAX_ARC_PARM_REGS \ + && ((ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE)) \ + + ROUND_ADVANCE_ARG ((MODE), (TYPE)) \ + <= MAX_ARC_PARM_REGS))) + +/* Determine where to put an argument to a function. + Value is zero to push the argument on the stack, + or a hard register in which to store the argument. + + MODE is the argument's machine mode. + TYPE is the data type of the argument (as a tree). + This is null for libcalls where that information may + not be available. + CUM is a variable of type CUMULATIVE_ARGS which gives info about + the preceding args and about the function being called. + NAMED is nonzero if this argument is a named parameter + (otherwise it is an extra parameter matching an ellipsis). */ +/* On the ARC the first MAX_ARC_PARM_REGS args are normally in registers + and the rest are pushed. */ +#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ +(PASS_IN_REG_P ((CUM), (MODE), (TYPE), (NAMED)) \ + ? gen_rtx (REG, (MODE), ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE))) \ + : 0) + +/* A C expression for the number of words, at the beginning of an + argument, must be put in registers. The value must be zero for + arguments that are passed entirely in registers or that are entirely + pushed on the stack. + + On some machines, certain arguments must be passed partially in + registers and partially in memory. On these machines, typically the + first @var{n} words of arguments are passed in registers, and the rest + on the stack. If a multi-word argument (a @code{double} or a + structure) crosses that boundary, its first few words must be passed + in registers and the rest must be pushed. This macro tells the + compiler when this occurs, and how many of the words should go in + registers. */ +#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 + +/* A C expression that indicates when an argument must be passed by + reference. If nonzero for an argument, a copy of that argument is + made in memory and a pointer to the argument is passed instead of + the argument itself. The pointer is passed in whatever way is + appropriate for passing a pointer to that type. */ +/* All aggregates and arguments greater than 8 bytes are passed this way. */ +#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ +(TYPE \ + && (AGGREGATE_TYPE_P (TYPE) \ + || int_size_in_bytes (TYPE) > 8)) + +/* A C expression that indicates when it is the called function's + responsibility to make copies of arguments passed by reference. + If the callee can determine that the argument won't be modified, it can + avoid the copy. */ +/* ??? We'd love to be able to use NAMED here. Unfortunately, it doesn't + include the last named argument so we keep track of the args ourselves. */ + +#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \ +FUNCTION_ARG_PASS_BY_REFERENCE ((CUM), (MODE), (TYPE), (NAMED)) + +/* Update the data in CUM to advance over an argument + of mode MODE and data type TYPE. + (TYPE is null for libcalls where that information may not be available.) */ +#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ +((CUM) = (ROUND_ADVANCE_CUM ((CUM), (MODE), (TYPE)) \ + + ROUND_ADVANCE_ARG ((MODE), (TYPE)))) + +/* If defined, a C expression that gives the alignment boundary, in bits, + of an argument with the specified mode and type. If it is not defined, + PARM_BOUNDARY is used for all arguments. */ +#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \ +(((TYPE) ? TYPE_ALIGN (TYPE) : GET_MODE_BITSIZE (MODE)) <= PARM_BOUNDARY \ + ? PARM_BOUNDARY \ + : 2 * PARM_BOUNDARY) + +/* This macro offers an alternative + to using `__builtin_saveregs' and defining the macro + `EXPAND_BUILTIN_SAVEREGS'. Use it to store the anonymous register + arguments into the stack so that all the arguments appear to have + been passed consecutively on the stack. Once this is done, you + can use the standard implementation of varargs that works for + machines that pass all their arguments on the stack. + + The argument ARGS_SO_FAR is the `CUMULATIVE_ARGS' data structure, + containing the values that obtain after processing of the named + arguments. The arguments MODE and TYPE describe the last named + argument--its machine mode and its data type as a tree node. + + The macro implementation should do two things: first, push onto the + stack all the argument registers *not* used for the named + arguments, and second, store the size of the data thus pushed into + the `int'-valued variable whose name is supplied as the argument + PRETEND_SIZE. The value that you store here will serve as + additional offset for setting up the stack frame. + + If the argument NO_RTL is nonzero, it means that the + arguments of the function are being analyzed for the second time. + This happens for an inline function, which is not actually + compiled until the end of the source file. The macro + `SETUP_INCOMING_VARARGS' should not generate any instructions in + this case. */ + +#define SETUP_INCOMING_VARARGS(ARGS_SO_FAR, MODE, TYPE, PRETEND_SIZE, NO_RTL) \ +arc_setup_incoming_varargs(&ARGS_SO_FAR, MODE, TYPE, &PRETEND_SIZE, NO_RTL) + +/* Function results. */ + +/* Define how to find the value returned by a function. + VALTYPE is the data type of the value (as a tree). + If the precise function being called is known, FUNC is its FUNCTION_DECL; + otherwise, FUNC is 0. */ +#define FUNCTION_VALUE(VALTYPE, FUNC) gen_rtx (REG, TYPE_MODE (VALTYPE), 0) + +/* Define how to find the value returned by a library function + assuming the value has mode MODE. */ +#define LIBCALL_VALUE(MODE) gen_rtx (REG, MODE, 0) + +/* 1 if N is a possible register number for a function value + as seen by the caller. */ +/* ??? What about r1 in DI/DF values. */ +#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) + +/* A C expression which can inhibit the returning of certain function + values in registers, based on the type of value. A nonzero value says + to return the function value in memory, just as large structures are + always returned. Here TYPE will be a C expression of type `tree', + representing the data type of the value. */ +#define RETURN_IN_MEMORY(TYPE) \ +(AGGREGATE_TYPE_P (TYPE) \ + || int_size_in_bytes (TYPE) > 8 \ + || TREE_ADDRESSABLE (TYPE)) + +/* Tell GCC to use RETURN_IN_MEMORY. */ +#define DEFAULT_PCC_STRUCT_RETURN 0 + +/* Register in which address to store a structure value + is passed to a function, or 0 to use `invisible' first argument. */ +#define STRUCT_VALUE 0 + +/* Function entry and exit. */ + +/* This macro generates the assembly code for function entry. + FILE is a stdio stream to output the code to. + SIZE is an int: how many units of temporary storage to allocate. + Refer to the array `regs_ever_live' to determine which registers + to save; `regs_ever_live[I]' is nonzero if register number I + is ever used in the function. This macro is responsible for + knowing which registers should not be saved even if used. */ +#define FUNCTION_PROLOGUE(FILE, SIZE) \ +arc_output_function_prologue (FILE, SIZE) + +/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, + the stack pointer does not matter. The value is tested only in + functions that have frame pointers. + No definition is equivalent to always zero. */ +#define EXIT_IGNORE_STACK 0 + +/* This macro generates the assembly code for function exit, + on machines that need it. If FUNCTION_EPILOGUE is not defined + then individual return instructions are generated for each + return statement. Args are same as for FUNCTION_PROLOGUE. + + The function epilogue should not depend on the current stack pointer! + It should use the frame pointer only. This is mandatory because + of alloca; we also take advantage of it to omit stack adjustments + before returning. */ +#define FUNCTION_EPILOGUE(FILE, SIZE) \ +arc_output_function_epilogue (FILE, SIZE) + +/* Epilogue delay slots. */ +#define DELAY_SLOTS_FOR_EPILOGUE arc_delay_slots_for_epilogue () + +#define ELIGIBLE_FOR_EPILOGUE_DELAY(TRIAL, SLOTS_FILLED) \ +arc_eligible_for_epilogue_delay (TRIAL, SLOTS_FILLED) + +/* Output assembler code to FILE to increment profiler label # LABELNO + for profiling a function entry. */ +#define FUNCTION_PROFILER(FILE, LABELNO) + +/* Trampolines. */ +/* ??? This doesn't work yet because GCC will use as the address of a nested + function the address of the trampoline. We need to use that address + right shifted by 2. It looks like we'll need PSImode after all. :-( */ + +/* Output assembler code for a block containing the constant parts + of a trampoline, leaving space for the variable parts. */ +/* On the ARC, the trampoline is quite simple as we have 32 bit immediate + constants. + + mov r24,STATIC + j.nd FUNCTION +*/ +#define TRAMPOLINE_TEMPLATE(FILE) \ +do { \ + ASM_OUTPUT_INT (FILE, GEN_INT (0x631f7c00)); \ + ASM_OUTPUT_INT (FILE, const0_rtx); \ + ASM_OUTPUT_INT (FILE, GEN_INT (0x381f0000)); \ + ASM_OUTPUT_INT (FILE, const0_rtx); \ +} while (0) + +/* Length in units of the trampoline for entering a nested function. */ +#define TRAMPOLINE_SIZE 16 + +/* Emit RTL insns to initialize the variable parts of a trampoline. + FNADDR is an RTX for the address of the function's pure code. + CXT is an RTX for the static chain value for the function. */ +#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ +do { \ + emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 4)), CXT); \ + emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 12)), FNADDR); \ + emit_insn (gen_flush_icache (validize_mem (gen_rtx (MEM, SImode, TRAMP)))); \ +} while (0) + +/* Library calls. */ + +/* Generate calls to memcpy, memcmp and memset. */ +#define TARGET_MEM_FUNCTIONS + +/* Addressing modes, and classification of registers for them. */ + +/* Maximum number of registers that can appear in a valid memory address. */ +/* The `ld' insn allows 2, but the `st' insn only allows 1. */ +#define MAX_REGS_PER_ADDRESS 1 + +/* We have pre inc/dec (load/store with update). */ +#define HAVE_PRE_INCREMENT +#define HAVE_PRE_DECREMENT + +/* Recognize any constant value that is a valid address. */ +#define CONSTANT_ADDRESS_P(X) \ +(GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \ + || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST) + +/* Nonzero if the constant value X is a legitimate general operand. + We can handle any 32 or 64 bit constant. */ +/* "1" should work since the largest constant should be a 64 bit critter. */ +/* ??? Not sure what to do for 64x32 compiler. */ +#define LEGITIMATE_CONSTANT_P(X) 1 + +/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx + and check its validity for a certain class. + We have two alternate definitions for each of them. + The usual definition accepts all pseudo regs; the other rejects + them unless they have been allocated suitable hard regs. + The symbol REG_OK_STRICT causes the latter definition to be used. + + Most source files want to accept pseudo regs in the hope that + they will get allocated to the class that the insn wants them to be in. + Source files for reload pass need to be strict. + After reload, it makes no difference, since pseudo regs have + been eliminated by then. */ + +#ifndef REG_OK_STRICT + +/* Nonzero if X is a hard reg that can be used as an index + or if it is a pseudo reg. */ +#define REG_OK_FOR_INDEX_P(X) \ +((unsigned) REGNO (X) - 29 >= FIRST_PSEUDO_REGISTER - 29) +/* Nonzero if X is a hard reg that can be used as a base reg + or if it is a pseudo reg. */ +#define REG_OK_FOR_BASE_P(X) \ +((unsigned) REGNO (X) - 29 >= FIRST_PSEUDO_REGISTER - 29) + +#else + +/* Nonzero if X is a hard reg that can be used as an index. */ +#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) +/* Nonzero if X is a hard reg that can be used as a base reg. */ +#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) + +#endif + +/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression + that is a valid memory address for an instruction. + The MODE argument is the machine mode for the MEM expression + that wants to use this address. */ +/* The `ld' insn allows [reg],[reg+shimm],[reg+limm],[reg+reg],[limm] + but the `st' insn only allows [reg],[reg+shimm],[limm]. + The only thing we can do is only allow the most strict case `st' and hope + other parts optimize out the restrictions for `ld'. */ + +/* local to this file */ +#define RTX_OK_FOR_BASE_P(X) \ +(REG_P (X) && REG_OK_FOR_BASE_P (X)) + +/* local to this file */ +#define RTX_OK_FOR_INDEX_P(X) \ +(0 && /*FIXME*/ REG_P (X) && REG_OK_FOR_INDEX_P (X)) + +/* local to this file */ +/* ??? Loads can handle any constant, stores can only handle small ones. */ +#define RTX_OK_FOR_OFFSET_P(X) \ +(GET_CODE (X) == CONST_INT && SMALL_INT (INTVAL (X))) + +#define LEGITIMATE_OFFSET_ADDRESS_P(MODE, X) \ +(GET_CODE (X) == PLUS \ + && RTX_OK_FOR_BASE_P (XEXP (X, 0)) \ + && (RTX_OK_FOR_INDEX_P (XEXP (X, 1)) \ + || RTX_OK_FOR_OFFSET_P (XEXP (X, 1)))) + +#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ +{ if (RTX_OK_FOR_BASE_P (X)) \ + goto ADDR; \ + if (LEGITIMATE_OFFSET_ADDRESS_P ((MODE), (X))) \ + goto ADDR; \ + if (GET_CODE (X) == CONST_INT && LARGE_INT (INTVAL (X))) \ + goto ADDR; \ + if (GET_CODE (X) == SYMBOL_REF \ + || GET_CODE (X) == LABEL_REF \ + || GET_CODE (X) == CONST) \ + goto ADDR; \ + if ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \ + /* We're restricted here by the `st' insn. */ \ + && RTX_OK_FOR_BASE_P (XEXP ((X), 0))) \ + goto ADDR; \ +} + +/* Try machine-dependent ways of modifying an illegitimate address + to be legitimate. If we find one, return the new, valid address. + This macro is used in only one place: `memory_address' in explow.c. + + OLDX is the address as it was before break_out_memory_refs was called. + In some cases it is useful to look at this to decide what needs to be done. + + MODE and WIN are passed so that this macro can use + GO_IF_LEGITIMATE_ADDRESS. + + It is always safe for this macro to do nothing. It exists to recognize + opportunities to optimize the output. */ + +#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) + +/* Go to LABEL if ADDR (a legitimate address expression) + has an effect that depends on the machine mode it is used for. */ +#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \ +{ if (GET_CODE (ADDR) == PRE_DEC) \ + goto LABEL; \ + if (GET_CODE (ADDR) == PRE_INC) \ + goto LABEL; \ +} + +/* Condition code usage. */ + +/* Some insns set all condition code flags, some only set the ZNC flags, and + some only set the ZN flags. */ + +#define EXTRA_CC_MODES CCZNCmode, CCZNmode + +#define EXTRA_CC_NAMES "CCZNC", "CCZN" + +/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE, + return the mode to be used for the comparison. */ +extern enum machine_mode arc_select_cc_mode (); +#define SELECT_CC_MODE(OP, X, Y) \ +arc_select_cc_mode (OP, X, Y) + +/* Return non-zero if SELECT_CC_MODE will never return MODE for a + floating point inequality comparison. */ +#define REVERSIBLE_CC_MODE(MODE) 1 /*FIXME*/ + +/* Costs. */ + +/* An insn is define to cost 4 "units", and we work from there. + COSTS_N_INSNS (N) is defined as (N) * 4 - 2 so that seems reasonable. + Some values are supposed to be defined relative to each other and thus + aren't necessarily related to COSTS_N_INSNS. */ + +/* Compute the cost of computing a constant rtl expression RTX + whose rtx-code is CODE. The body of this macro is a portion + of a switch statement. If the code is computed here, + return it with a return statement. Otherwise, break from the switch. */ +/* Small integers are as cheap as registers. 4 byte values can be fetched + as immediate constants - let's give that the cost of an extra insn. */ +#define CONST_COSTS(X, CODE, OUTER_CODE) \ + case CONST_INT : \ + if (SMALL_INT (INTVAL (X))) \ + return 0; \ + /* fall through */ \ + case CONST : \ + case LABEL_REF : \ + case SYMBOL_REF : \ + return 4; \ + case CONST_DOUBLE : \ + { \ + rtx high, low; \ + split_double (X, &high, &low); \ + return 4 * (!SMALL_INT (INTVAL (high)) \ + + !SMALL_INT (INTVAL (low))); \ + } + +/* Compute the cost of an address. */ +#define ADDRESS_COST(ADDR) (REG_P (ADDR) ? 1 : arc_address_cost (ADDR)) + +/* Compute extra cost of moving data between one register class + and another. */ +#define REGISTER_MOVE_COST(CLASS1, CLASS2) 2 + +/* Compute the cost of moving data between registers and memory. */ +/* Memory is 3 times as expensive as registers. + ??? Is that the right way to look at it? */ +#define MEMORY_MOVE_COST(MODE) \ +(GET_MODE_SIZE (MODE) <= UNITS_PER_WORD ? 6 : 12) + +/* The cost of a branch insn. */ +/* ??? What's the right value here? Branches are certainly more + expensive than reg->reg moves. */ +#define BRANCH_COST 2 + +/* Provide the costs of a rtl expression. This is in the body of a + switch on CODE. The purpose for the cost of MULT is to encourage + `synth_mult' to find a synthetic multiply when reasonable. + + If we need more than 12 insns to do a multiply, then go out-of-line, + since the call overhead will be < 10% of the cost of the multiply. */ +#define RTX_COSTS(X, CODE, OUTER_CODE) \ + case ASHIFT : \ + case ASHIFTRT : \ + case LSHIFTRT : \ + if (TARGET_SHIFTER) \ + return COSTS_N_INSNS (1); \ + if (GET_CODE (XEXP ((X), 1)) != CONST_INT) \ + return COSTS_N_INSNS (16); \ + return COSTS_N_INSNS (INTVAL (XEXP ((X), 1))); + +/* Nonzero if access to memory by bytes is slow and undesirable. + For RISC chips, it means that access to memory by bytes is no + better than access by words when possible, so grab a whole word + and maybe make use of that. */ +#define SLOW_BYTE_ACCESS 1 + +/* Define this macro if it is as good or better to call a constant + function address than to call an address kept in a register. */ +/* On the ARC, calling through registers is slow. */ +#define NO_FUNCTION_CSE + +/* Define this macro if it is as good or better for a function to call + itself with an explicit address than to call an address kept in a + register. */ +/* On the ARC, calling through registers is slow. */ +#define NO_RECURSIVE_FUNCTION_CSE + +/* Section selection. */ +/* WARNING: These section names also appear in dwarfout.c. */ + +/* The names of the text, data, and readonly-data sections are runtime + selectable. */ + +#define ARC_SECTION_FORMAT "\t.section %s" +#define ARC_DEFAULT_TEXT_SECTION ".text" +#define ARC_DEFAULT_DATA_SECTION ".data" +#define ARC_DEFAULT_RODATA_SECTION ".rodata" + +extern char *arc_text_section,*arc_data_section,*arc_rodata_section; + +/* initfini.c uses this in an asm. */ +#if defined (CRT_INIT) || defined (CRT_FINI) +#define TEXT_SECTION_ASM_OP "\t.section .text" +#else +#define TEXT_SECTION_ASM_OP arc_text_section /*"\t.section .text"*/ +#endif +#define DATA_SECTION_ASM_OP arc_data_section /*"\t.section .data"*/ + +#undef CONST_SECTION_ASM_OP +#define CONST_SECTION_ASM_OP arc_rodata_section /*"\t.section .rodata"*/ + +#define BSS_SECTION_ASM_OP "\t.section .bss" + +/* Define this macro if jump tables (for tablejump insns) should be + output in the text section, along with the assembler instructions. + Otherwise, the readonly data section is used. + This macro is irrelevant if there is no separate readonly data section. */ +/*#define JUMP_TABLES_IN_TEXT_SECTION*/ + +/* Define this macro if references to a symbol must be treated + differently depending on something about the variable or + function named by the symbol (such as what section it is in). + + The macro definition, if any, is executed immediately after the + rtl for DECL or other node is created. + The value of the rtl will be a `mem' whose address is a + `symbol_ref'. + + The usual thing for this macro to do is to store a flag in the + `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified + name string in the `symbol_ref' (if one bit is not enough + information). */ + +/* On the ARC, function addresses are not the same as normal addresses. + Branch to absolute address insns take an address that is right-shifted + by 2. We encode the fact that we have a function here, and then emit a + special assembler op when outputting the address. */ +#define ENCODE_SECTION_INFO(DECL) \ +do { \ + if (TREE_CODE (DECL) == FUNCTION_DECL) \ + SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \ +} while (0) + +/* Decode SYM_NAME and store the real name part in VAR, sans + the characters that encode section info. Define this macro if + ENCODE_SECTION_INFO alters the symbol's name string. */ +/*#define STRIP_NAME_ENCODING(VAR, SYM_NAME)*/ + +/* For DWARF. Marginally different than default so output is "prettier" + (and consistent with above). */ +#define PUSHSECTION_FORMAT "\t%s %s\n" + +/* Tell crtstuff.c we're using ELF. */ +#define OBJECT_FORMAT_ELF + +/* PIC */ + +/* The register number of the register used to address a table of static + data addresses in memory. In some cases this register is defined by a + processor's ``application binary interface'' (ABI). When this macro + is defined, RTL is generated for this register once, as with the stack + pointer and frame pointer registers. If this macro is not defined, it + is up to the machine-dependent files to allocate such a register (if + necessary). */ +#define PIC_OFFSET_TABLE_REGNUM 26 + +/* Define this macro if the register defined by PIC_OFFSET_TABLE_REGNUM is + clobbered by calls. Do not define this macro if PIC_OFFSET_TABLE_REGNUM + is not defined. */ +/* This register is call-saved on the ARC. */ +/*#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED*/ + +/* By generating position-independent code, when two different programs (A + and B) share a common library (libC.a), the text of the library can be + shared whether or not the library is linked at the same address for both + programs. In some of these environments, position-independent code + requires not only the use of different addressing modes, but also + special code to enable the use of these addressing modes. + + The FINALIZE_PIC macro serves as a hook to emit these special + codes once the function is being compiled into assembly code, but not + before. (It is not done before, because in the case of compiling an + inline function, it would lead to multiple PIC prologues being + included in functions which used inline functions and were compiled to + assembly language.) */ + +#define INITIALIZE_PIC arc_initialize_pic () +#define FINALIZE_PIC arc_finalize_pic () + +/* A C expression that is nonzero if X is a legitimate immediate + operand on the target machine when generating position independent code. + You can assume that X satisfies CONSTANT_P, so you need not + check this. You can also assume `flag_pic' is true, so you need not + check it either. You need not define this macro if all constants + (including SYMBOL_REF) can be immediate operands when generating + position independent code. */ +/*#define LEGITIMATE_PIC_OPERAND_P(X)*/ + +/* Control the assembler format that we output. */ + +/* Output at beginning of assembler file. */ +extern void arc_asm_file_start (); +#undef ASM_FILE_START +#define ASM_FILE_START(FILE) arc_asm_file_start (FILE) + +/* A C statement to output assembler commands which will identify the + object file as having been compiled with GNU CC (or another GNU + compiler). */ +#undef ASM_IDENTIFY_GCC +#define ASM_IDENTIFY_GCC(FILE) /* nothing */ + +/* Needed because we define ASM_IDENTIFY_GCC. */ +#define ASM_IDENTIFY_LANGUAGE(FILE) output_lang_identify (FILE) + +/* A C string constant describing how to begin a comment in the target + assembler language. The compiler assumes that the comment will + end at the end of the line. */ +#define ASM_COMMENT_START ";" + +/* Output to assembler file text saying following lines + may contain character constants, extra white space, comments, etc. */ +#define ASM_APP_ON "" + +/* Output to assembler file text saying following lines + no longer contain unusual constructs. */ +#define ASM_APP_OFF "" + +/* This is how to output an assembler line defining a `char' constant. */ +#define ASM_OUTPUT_CHAR(FILE, VALUE) \ +( fprintf (FILE, "\t.byte\t"), \ + output_addr_const (FILE, (VALUE)), \ + fprintf (FILE, "\n")) + +/* This is how to output an assembler line defining a `short' constant. */ +#define ASM_OUTPUT_SHORT(FILE, VALUE) \ +( fprintf (FILE, "\t.hword\t"), \ + output_addr_const (FILE, (VALUE)), \ + fprintf (FILE, "\n")) + +/* This is how to output an assembler line defining an `int' constant. + We also handle symbol output here. Code addresses must be right shifted + by 2 because that's how the jump instruction wants them. */ +#define ASM_OUTPUT_INT(FILE, VALUE) \ +do { \ + fprintf (FILE, "\t.word\t"); \ + if ((GET_CODE (VALUE) == SYMBOL_REF && SYMBOL_REF_FLAG (VALUE)) \ + || GET_CODE (VALUE) == LABEL_REF) \ + { \ + fprintf (FILE, "%%st("); \ + output_addr_const (FILE, (VALUE)); \ + fprintf (FILE, ")"); \ + } \ + else \ + output_addr_const (FILE, (VALUE)); \ + fprintf (FILE, "\n"); \ +} while (0) + +/* This is how to output an assembler line defining a `float' constant. */ +#define ASM_OUTPUT_FLOAT(FILE, VALUE) \ +{ \ + long t; \ + char str[30]; \ + REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \ + REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \ + fprintf (FILE, "\t.word\t0x%lx %s %s\n", \ + t, ASM_COMMENT_START, str); \ +} + +/* This is how to output an assembler line defining a `double' constant. */ +#define ASM_OUTPUT_DOUBLE(FILE, VALUE) \ +{ \ + long t[2]; \ + char str[30]; \ + REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \ + REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \ + fprintf (FILE, "\t.word\t0x%lx %s %s\n\t.word\t0x%lx\n", \ + t[0], ASM_COMMENT_START, str, t[1]); \ +} + +/* This is how to output an assembler line for a numeric constant byte. */ +#define ASM_BYTE_OP ".byte" +#define ASM_OUTPUT_BYTE(FILE, VALUE) \ + fprintf (FILE, "\t%s\t0x%x\n", ASM_BYTE_OP, (VALUE)) + +/* The assembler's parentheses characters. */ +#define ASM_OPEN_PAREN "(" +#define ASM_CLOSE_PAREN ")" + +/* This is how to output the definition of a user-level label named NAME, + such as the label on a static function or variable NAME. */ +#define ASM_OUTPUT_LABEL(FILE, NAME) \ +do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0) + +/* This is how to output a command to make the user-level label named NAME + defined for reference from other files. */ +#define ASM_GLOBALIZE_LABEL(FILE, NAME) \ +do { \ + fputs ("\t.global\t", FILE); \ + assemble_name (FILE, NAME); \ + fputs ("\n", FILE); \ +} while (0) + +/* A C statement (sans semicolon) to output on FILE an assembler pseudo-op to + declare a library function name external. The name of the library function + is given by SYMREF, which has type RTX and is a SYMBOL_REF. */ +#if 0 +/* On the ARC we want to have libgcc's for multiple cpus in one binary. + We can't use `assemble_name' here as that will call ASM_OUTPUT_LABELREF + and we'll get another suffix added on if -mmangle-cpu. */ +extern char *arc_mangle_cpu; +#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, SYMREF) \ +do { \ + if (TARGET_MANGLE_CPU_LIBGCC) \ + { \ + fprintf (FILE, "\t.rename\t_%s, _%s%s\n", \ + XSTR (SYMREF, 0), XSTR (SYMREF, 0), \ + arc_mangle_suffix); \ + } \ +} while (0) +#endif + +/* This is how to output a reference to a user-level label named NAME. + `assemble_name' uses this. */ +/* We mangle all user labels to provide protection from linking code + compiled for different cpus. */ +/* We work around a dwarfout.c deficiency by watching for labels from it and + not adding the '_' prefix nor the cpu suffix. There is a comment in + dwarfout.c that says it should be using ASM_OUTPUT_INTERNAL_LABEL. */ +extern char *arc_mangle_cpu; +#define ASM_OUTPUT_LABELREF(FILE, NAME) \ +do { \ + if ((NAME)[0] == '.' && (NAME)[1] == 'L') \ + fprintf (FILE, "%s", NAME); \ + else \ + { \ + fputc ('_', FILE); \ + if (TARGET_MANGLE_CPU && arc_mangle_cpu != NULL) \ + fprintf (FILE, "%s_", arc_mangle_cpu); \ + fprintf (FILE, "%s", NAME); \ + } \ +} while (0) + +/* This is how to output a definition of an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. */ +#undef ASM_OUTPUT_INTERNAL_LABEL +#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \ +do { \ + arc_ccfsm_at_label (PREFIX, NUM); \ + fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \ +} while (0) + +/* Store in OUTPUT a string (made with alloca) containing + an assembler-name for a local static variable named NAME. + LABELNO is an integer which is different for each call. */ +#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ +( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \ + sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO))) + +/* Assembler pseudo-op to equate one value with another. */ +/* ??? This is needed because dwarfout.c provides a default definition too + late for defaults.h (which contains the default definition of ASM_OUTPUT_DEF + that we use). */ +#define SET_ASM_OP ".set" + +/* A C statement (sans semicolon) to output an element in the table of + global constructors. */ +#undef ASM_OUTPUT_CONSTRUCTOR +#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME) \ +do { \ + ctors_section (); \ + fprintf (FILE, "\t.word\t%%st("); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, ")\n"); \ +} while (0) + +/* A C statement (sans semicolon) to output an element in the table of + global destructors. */ +#undef ASM_OUTPUT_DESTRUCTOR +#define ASM_OUTPUT_DESTRUCTOR(FILE, NAME) \ +do { \ + dtors_section (); \ + fprintf (FILE, "\t.word\t%%st("); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, ")\n"); \ +} while (0) + +/* How to refer to registers in assembler output. + This sequence is indexed by compiler's hard-register-number (see above). */ +#define REGISTER_NAMES \ +{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \ + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \ + "r24", "r25", "r26", "fp", "sp", "ilink1", "ilink2", "blink", \ + "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39", \ + "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", \ + "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55", \ + "r56", "r57", "r58", "r59", "lp_count", "cc"} + +/* Entry to the insn conditionalizer. */ +#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \ +arc_final_prescan_insn (INSN, OPVEC, NOPERANDS) + +/* A C expression which evaluates to true if CODE is a valid + punctuation character for use in the `PRINT_OPERAND' macro. */ +extern char arc_punct_chars[]; +#define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \ +arc_punct_chars[(unsigned char) (CHAR)] + +/* Print operand X (an rtx) in assembler syntax to file FILE. + CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. + For `%' followed by punctuation, CODE is the punctuation and X is null. */ +#define PRINT_OPERAND(FILE, X, CODE) \ +arc_print_operand (FILE, X, CODE) + +/* A C compound statement to output to stdio stream STREAM the + assembler syntax for an instruction operand that is a memory + reference whose address is ADDR. ADDR is an RTL expression. + + On some machines, the syntax for a symbolic address depends on + the section that the address refers to. On these machines, + define the macro `ENCODE_SECTION_INFO' to store the information + into the `symbol_ref', and then check for it here. */ +#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ +arc_print_operand_address (FILE, ADDR) + +/* This is how to output an element of a case-vector that is absolute. */ +#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ +do { \ + char label[30]; \ + ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE); \ + fprintf (FILE, "\t.word %%st("); \ + assemble_name (FILE, label); \ + fprintf (FILE, ")\n"); \ +} while (0) + +/* This is how to output an element of a case-vector that is relative. */ +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ +do { \ + char label[30]; \ + ASM_GENERATE_INTERNAL_LABEL (label, "L", VALUE); \ + fprintf (FILE, "\t.word %%st("); \ + assemble_name (FILE, label); \ + fprintf (FILE, "-"); \ + ASM_GENERATE_INTERNAL_LABEL (label, "L", REL); \ + assemble_name (FILE, label); \ + fprintf (FILE, ")\n"); \ +} while (0) + +/* A C expression to output text to align the location counter in the way + that is desirable at the beginning of a loop. */ +/* On the ARC, align loops to 32 byte boundaries (cache line size) + if -malign-loops. */ +#define ASM_OUTPUT_LOOP_ALIGN(FILE) \ +do { if (TARGET_ALIGN_LOOPS) ASM_OUTPUT_SKIP (FILE, 5); } while (0) + +/* This is how to output an assembler line + that says to advance the location counter + to a multiple of 2**LOG bytes. */ +#define ASM_OUTPUT_ALIGN(FILE,LOG) \ +do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0) + +/* Debugging information. */ + +/* Generate DBX and DWARF debugging information. */ +#define DBX_DEBUGGING_INFO +#define DWARF_DEBUGGING_INFO + +/* Prefer STABS (for now). */ +#undef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG + +/* How to renumber registers for dbx and gdb. */ +#define DBX_REGISTER_NUMBER(REGNO) (REGNO) + +/* Turn off splitting of long stabs. */ +#define DBX_CONTIN_LENGTH 0 + +/* Miscellaneous. */ + +/* Specify the machine mode that this machine uses + for the index in the tablejump instruction. */ +#define CASE_VECTOR_MODE Pmode + +/* Define this if the tablejump instruction expects the table + to contain offsets from the address of the table. + Do not define this if the table should contain absolute addresses. */ +/* It's not clear what PIC will look like or whether we want to use -fpic + for the embedded form currently being talked about. For now require -fpic + to get pc relative switch tables. */ +/*#define CASE_VECTOR_PC_RELATIVE*/ + +/* Define if operations between registers always perform the operation + on the full register even if a narrower mode is specified. */ +#define WORD_REGISTER_OPERATIONS + +/* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD + will either zero-extend or sign-extend. The value of this macro should + be the code that says which one of the two operations is implicitly + done, NIL if none. */ +#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND + +/* Specify the tree operation to be used to convert reals to integers. */ +#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR + +/* This is the kind of divide that is easiest to do in the general case. */ +#define EASY_DIV_EXPR TRUNC_DIV_EXPR + +/* Max number of bytes we can move from memory to memory + in one reasonably fast instruction. */ +#define MOVE_MAX 4 + +/* Define this to be nonzero if shift instructions ignore all but the low-order + few bits. */ +#define SHIFT_COUNT_TRUNCATED 1 + +/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits + is done just by pretending it is already truncated. */ +#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 + +/* We assume that the store-condition-codes instructions store 0 for false + and some other value for true. This is the value stored for true. */ +#define STORE_FLAG_VALUE 1 + +/* Specify the machine mode that pointers have. + After generation of rtl, the compiler makes no further distinction + between pointers and any other objects of this machine mode. */ +/* ??? The arc doesn't have full 32 bit pointers, but making this PSImode has + it's own problems (you have to add extendpsisi2 and trucnsipsi2 but how does + one do it without getting excess code?). Try to avoid it. */ +#define Pmode SImode + +/* A function address in a call instruction. */ +#define FUNCTION_MODE SImode + +/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to TYPE. */ +extern int arc_valid_machine_attribute (); +#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \ +arc_valid_machine_decl_attribute (DECL, ATTRIBUTES, IDENTIFIER, ARGS) + +/* A C expression that returns zero if the attributes on TYPE1 and TYPE2 are + incompatible, one if they are compatible, and two if they are + nearly compatible (which causes a warning to be generated). */ +extern int arc_comp_type_attributes (); +#define COMP_TYPE_ATTRIBUTES(TYPE1, TYPE2) \ +arc_comp_type_attributes (TYPE1, TYPE2) + +/* Give newly defined TYPE some default attributes. */ +extern void arc_set_default_type_attributes (); +#define SET_DEFAULT_TYPE_ATTRIBUTES(TYPE) \ +arc_set_default_type_attributes (TYPE) + +/* Define this if the target system supports the function + atexit from the ANSI C standard. If this is not defined, + and INIT_SECTION_ASM_OP is not defined, a default + exit function will be provided to support C++. */ +#define HAVE_ATEXIT + +/* alloca should avoid clobbering the old register save area. */ +/* ??? Not defined in tm.texi. */ +#define SETJMP_VIA_SAVE_AREA + +/* Define the information needed to generate branch and scc insns. This is + stored from the compare operation. Note that we can't use "rtx" here + since it hasn't been defined! */ +extern struct rtx_def *arc_compare_op0, *arc_compare_op1; + +/* Define the function that build the compare insn for scc and bcc. */ +extern struct rtx_def *gen_compare_reg (); + +/* Declarations for various fns used in the .md file. */ +extern char *output_shift (); + +/* ARC function types. */ +enum arc_function_type { + ARC_FUNCTION_UNKNOWN, ARC_FUNCTION_NORMAL, + /* These are interrupt handlers. The name corresponds to the register + name that contains the return address. */ + ARC_FUNCTION_ILINK1, ARC_FUNCTION_ILINK2 +}; +#define ARC_INTERRUPT_P(TYPE) \ +((TYPE) == ARC_FUNCTION_ILINK1 || (TYPE) == ARC_FUNCTION_ILINK2) +/* Compute the type of a function from its DECL. */ +enum arc_function_type arc_compute_function_type (); diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md new file mode 100644 index 00000000000..0894f79151a --- /dev/null +++ b/gcc/config/arc/arc.md @@ -0,0 +1,1630 @@ +;; Machine description of the ARC cpu for GNU C compiler +;; Copyright (C) 1994, 1997 Free Software Foundation, Inc. + +;; This file is part of GNU CC. + +;; GNU CC 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. + +;; GNU CC 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 GNU CC; see the file COPYING. If not, write to +;; the Free Software Foundation, 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;; See file "rtl.def" for documentation on define_insn, match_*, et. al. + +;; ??? This is an old port, and is undoubtedly suffering from bit rot. + +;; Insn type. Used to default other attribute values. + +(define_attr "type" + "move,load,store,cmove,unary,binary,compare,shift,mul,uncond_branch,branch,call,call_no_delay_slot,multi,misc" + (const_string "binary")) + +;; Length (in # of insns, long immediate constants counted too). +;; ??? There's a nasty interaction between the conditional execution fsm +;; and insn lengths: insns with shimm values cannot be conditionally executed. +(define_attr "length" "" + (cond [(eq_attr "type" "load") + (if_then_else (match_operand 1 "long_immediate_loadstore_operand" "") + (const_int 2) (const_int 1)) + + (eq_attr "type" "store") + (if_then_else (match_operand 0 "long_immediate_loadstore_operand" "") + (const_int 2) (const_int 1)) + + (eq_attr "type" "move,unary,compare") + (if_then_else (match_operand 1 "long_immediate_operand" "") + (const_int 2) (const_int 1)) + + (eq_attr "type" "binary,mul") + (if_then_else (match_operand 2 "long_immediate_operand" "") + (const_int 2) (const_int 1)) + + (eq_attr "type" "cmove") + (if_then_else (match_operand 2 "register_operand" "") + (const_int 1) (const_int 2)) + + (eq_attr "type" "multi") (const_int 2) + ] + + (const_int 1))) + +;; The length here is the length of a single asm. Unfortunately it might be +;; 1 or 2 so we must allow for 2. That's ok though. How often will users +;; lament asm's not being put in delay slots? +(define_asm_attributes + [(set_attr "length" "2") + (set_attr "type" "multi")]) + +;; Condition codes: this one is used by final_prescan_insn to speed up +;; conditionalizing instructions. It saves having to scan the rtl to see if +;; it uses or alters the condition codes. + +;; USE: This insn uses the condition codes (eg: a conditional branch). +;; CANUSE: This insn can use the condition codes (for conditional execution). +;; SET: All condition codes are set by this insn. +;; SET_ZN: the Z and N flags are set by this insn. +;; SET_ZNC: the Z, N, and C flags are set by this insn. +;; CLOB: The condition codes are set to unknown values by this insn. +;; NOCOND: This insn can't use and doesn't affect the condition codes. + +(define_attr "cond" "use,canuse,set,set_zn,set_znc,clob,nocond" + (cond [(and (eq_attr "type" "unary,binary,move") + (eq_attr "length" "1")) + (const_string "canuse") + + (eq_attr "type" "compare") + (const_string "set") + + (eq_attr "type" "cmove,branch") + (const_string "use") + + (eq_attr "type" "multi,misc") + (const_string "clob") + ] + + (const_string "nocond"))) + +;; Delay slots. + +(define_attr "in_delay_slot" "false,true" + (cond [(eq_attr "type" "uncond_branch,branch,call,call_no_delay_slot,multi") + (const_string "false") + ] + + (if_then_else (eq_attr "length" "1") + (const_string "true") + (const_string "false")))) + +(define_delay (eq_attr "type" "call") + [(eq_attr "in_delay_slot" "true") + (eq_attr "in_delay_slot" "true") + (eq_attr "in_delay_slot" "true")]) + +(define_delay (eq_attr "type" "branch,uncond_branch") + [(eq_attr "in_delay_slot" "true") + (eq_attr "in_delay_slot" "true") + (eq_attr "in_delay_slot" "true")]) + +;; Function units of the ARC + +;; (define_function_unit {name} {num-units} {n-users} {test} +;; {ready-delay} {issue-delay} [{conflict-list}]) + +;; 1) A conditional jump cannot immediately follow the insn setting the flags. +;; This isn't a complete solution as it doesn't come with guarantees. That +;; is done in the branch patterns and in arc_print_operand. This exists to +;; avoid inserting a nop when we can. +(define_function_unit "compare" 1 0 (eq_attr "type" "compare") 2 2 [(eq_attr "type" "branch")]) + +;; 2) References to loaded registers should wait a cycle. + +;; Memory with load-delay of 1 (i.e., 2 cycle load). +(define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 0) + +;; Units that take one cycle do not need to be specified. + +;; Move instructions. + +(define_expand "movqi" + [(set (match_operand:QI 0 "general_operand" "") + (match_operand:QI 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (QImode, operands[1]); +}") + +(define_insn "*movqi_insn" + [(set (match_operand:QI 0 "move_dest_operand" "=r,r,r,m") + (match_operand:QI 1 "move_src_operand" "rI,Ji,m,r"))] +;; ??? Needed? + "register_operand (operands[0], QImode) + || register_operand (operands[1], QImode)" + "@ + mov%? %0,%1 + mov%? %0,%1 + ldb%U1%V1 %0,%1 + stb%U0%V0 %1,%0" + [(set_attr "type" "move,move,load,store")]) + +;; ??? This may never match since there's no cmpqi insn. + +(define_insn "*movqi_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (sign_extend:SI (match_operand:QI 1 "move_src_operand" "rIJi")) + (const_int 0))) + (set (match_operand:QI 0 "move_dest_operand" "=r") + (match_dup 1))] + "" + "mov%?.f %0,%1" + [(set_attr "type" "move") + (set_attr "cond" "set_zn")]) + +(define_expand "movhi" + [(set (match_operand:HI 0 "general_operand" "") + (match_operand:HI 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (HImode, operands[1]); +}") + +(define_insn "*movhi_insn" + [(set (match_operand:HI 0 "move_dest_operand" "=r,r,r,m") + (match_operand:HI 1 "move_src_operand" "rI,Ji,m,r"))] + "register_operand (operands[0], HImode) + || register_operand (operands[1], HImode)" + "@ + mov%? %0,%1 + mov%? %0,%1 + ldw%U1%V1 %0,%1 + stw%U0%V0 %1,%0" + [(set_attr "type" "move,move,load,store")]) + +;; ??? Will this ever match? + +(define_insn "*movhi_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (sign_extend:SI (match_operand:HI 1 "move_src_operand" "rIJi")) + (const_int 0))) + (set (match_operand:HI 0 "move_dest_operand" "=r") + (match_dup 1))] +;; ??? Needed? + "register_operand (operands[0], HImode) + || register_operand (operands[1], HImode)" + "mov%?.f %0,%1" + [(set_attr "type" "move") + (set_attr "cond" "set_zn")]) + +(define_expand "movsi" + [(set (match_operand:SI 0 "general_operand" "") + (match_operand:SI 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (SImode, operands[1]); +}") + +(define_insn "*movsi_insn" + [(set (match_operand:SI 0 "move_dest_operand" "=r,r,r,m") + (match_operand:SI 1 "move_src_operand" "rI,GJi,m,r"))] + "register_operand (operands[0], SImode) + || register_operand (operands[1], SImode)" + "@ + mov%? %0,%1 + mov%? %0,%S1 + ld%U1%V1 %0,%1 + st%U0%V0 %1,%0" + [(set_attr "type" "move,move,load,store")]) + +(define_insn "*movsi_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (match_operand:SI 1 "move_src_operand" "rIJi") + (const_int 0))) + (set (match_operand:SI 0 "move_dest_operand" "=r") + (match_dup 1))] + "register_operand (operands[0], SImode) + || register_operand (operands[1], SImode)" + "mov%?.f %0,%S1" + [(set_attr "type" "move") + (set_attr "cond" "set_zn")]) + +(define_expand "movdi" + [(set (match_operand:DI 0 "general_operand" "") + (match_operand:DI 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (DImode, operands[1]); +}") + +(define_insn "*movdi_insn" + [(set (match_operand:DI 0 "move_dest_operand" "=r,r,r,m") + (match_operand:DI 1 "move_double_src_operand" "r,HK,m,r"))] + "register_operand (operands[0], DImode) + || register_operand (operands[1], DImode)" + "* +{ + switch (which_alternative) + { + case 0 : + /* We normally copy the low-numbered register first. However, if + the first register operand 0 is the same as the second register of + operand 1, we must copy in the opposite order. */ + if (REGNO (operands[0]) == REGNO (operands[1]) + 1) + return \"mov %R0,%R1\;mov %0,%1\"; + else + return \"mov %0,%1\;mov %R0,%R1\"; + case 1 : + return \"mov %0,%L1\;mov %R0,%H1\"; + case 2 : + /* If the low-address word is used in the address, we must load it + last. Otherwise, load it first. Note that we cannot have + auto-increment in that case since the address register is known to be + dead. */ + if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, + operands [1], 0)) + return \"ld%V1 %R0,%R1\;ld%V1 %0,%1\"; + else + return \"ld%V1 %0,%1\;ld%V1 %R0,%R1\"; + case 3 : + return \"st%V0 %1,%0\;st%V0 %R1,%R0\"; + } +}" + [(set_attr "type" "move,move,load,store") + ;; ??? The ld/st values could be 4 if it's [reg,bignum]. + (set_attr "length" "2,4,2,2")]) + +;(define_expand "movdi" +; [(set (match_operand:DI 0 "general_operand" "") +; (match_operand:DI 1 "general_operand" ""))] +; "" +; " +;{ +; /* Flow doesn't understand that this is effectively a DFmode move. +; It doesn't know that all of `operands[0]' is set. */ +; emit_insn (gen_rtx (CLOBBER, VOIDmode, operands[0])); +; +; /* Emit insns that movsi_insn can handle. */ +; emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DImode), +; operand_subword (operands[1], 0, 0, DImode))); +; emit_insn (gen_movsi (operand_subword (operands[0], 1, 0, DImode), +; operand_subword (operands[1], 1, 0, DImode))); +; DONE; +;}") + +;; Floating point move insns. + +(define_expand "movsf" + [(set (match_operand:SF 0 "general_operand" "") + (match_operand:SF 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + +#if HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT + if (GET_CODE (operands[1]) == CONST_DOUBLE) + operands[1] = force_const_mem (SFmode, operands[1]); +#endif + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (SFmode, operands[1]); +}") + +(define_insn "*movsf_insn" + [(set (match_operand:SF 0 "move_dest_operand" "=r,r,r,m") + (match_operand:SF 1 "move_src_operand" "r,E,m,r"))] + "register_operand (operands[0], SFmode) + || register_operand (operands[1], SFmode)" + "@ + mov%? %0,%1 + mov%? %0,%1 ; %A1 + ld%U1%V1 %0,%1 + st%U0%V0 %1,%0" + [(set_attr "type" "move,move,load,store")]) + +(define_expand "movdf" + [(set (match_operand:DF 0 "general_operand" "") + (match_operand:DF 1 "general_operand" ""))] + "" + " +{ + /* Everything except mem = const or mem = mem can be done easily. */ + +#if HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT + if (GET_CODE (operands[1]) == CONST_DOUBLE) + operands[1] = force_const_mem (DFmode, operands[1]); +#endif + + if (GET_CODE (operands[0]) == MEM) + operands[1] = force_reg (DFmode, operands[1]); +}") + +(define_insn "*movdf_insn" + [(set (match_operand:DF 0 "move_dest_operand" "=r,r,r,m") + (match_operand:DF 1 "move_double_src_operand" "r,E,m,r"))] + "register_operand (operands[0], DFmode) + || register_operand (operands[1], DFmode)" + "* +{ + switch (which_alternative) + { + case 0 : + /* We normally copy the low-numbered register first. However, if + the first register operand 0 is the same as the second register of + operand 1, we must copy in the opposite order. */ + if (REGNO (operands[0]) == REGNO (operands[1]) + 1) + return \"mov %R0,%R1\;mov %0,%1\"; + else + return \"mov %0,%1\;mov %R0,%R1\"; + case 1 : + return \"mov %0,%L1\;mov %R0,%H1 ; %A1\"; + case 2 : + /* If the low-address word is used in the address, we must load it + last. Otherwise, load it first. Note that we cannot have + auto-increment in that case since the address register is known to be + dead. */ + if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, + operands [1], 0)) + return \"ld%V1 %R0,%R1\;ld%V1 %0,%1\"; + else + return \"ld%V1 %0,%1\;ld%V1 %R0,%R1\"; + case 3 : + return \"st%V0 %1,%0\;st%V0 %R1,%R0\"; + } +}" + [(set_attr "type" "move,move,load,store") + ;; ??? The ld/st values could be 4 if it's [reg,bignum]. + (set_attr "length" "2,4,2,2")]) + +;(define_expand "movdf" +; [(set (match_operand:DF 0 "general_operand" "") +; (match_operand:DF 1 "general_operand" ""))] +; "" +; " +;{ +; /* Flow doesn't understand that this is effectively a DFmode move. +; It doesn't know that all of `operands[0]' is set. */ +; emit_insn (gen_rtx (CLOBBER, VOIDmode, operands[0])); +; +; /* Emit insns that movsi_insn can handle. */ +; emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DFmode), +; operand_subword (operands[1], 0, 0, DFmode))); +; emit_insn (gen_movsi (operand_subword (operands[0], 1, 0, DFmode), +; operand_subword (operands[1], 1, 0, DFmode))); +; DONE; +;}") + +;; Load/Store with update instructions. +;; +;; Some of these we can get by using pre-decrement or pre-increment, but the +;; hardware can also do cases where the increment is not the size of the +;; object. +;; +;; In all these cases, we use operands 0 and 1 for the register being +;; incremented because those are the operands that local-alloc will +;; tie and these are the pair most likely to be tieable (and the ones +;; that will benefit the most). +;; +;; We use match_operator here because we need to know whether the memory +;; object is volatile or not. + +(define_insn "*loadqi_update" + [(set (match_operand:QI 3 "register_operand" "=r,r") + (match_operator:QI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")])) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldb.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*load_zeroextendqisi_update" + [(set (match_operand:SI 3 "register_operand" "=r,r") + (zero_extend:SI (match_operator:QI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")]))) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldb.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*load_signextendqisi_update" + [(set (match_operand:SI 3 "register_operand" "=r,r") + (sign_extend:SI (match_operator:QI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")]))) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldb.x.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*storeqi_update" + [(set (match_operator:QI 4 "store_update_operand" + [(match_operand:SI 1 "register_operand" "0") + (match_operand:SI 2 "short_immediate_operand" "I")]) + (match_operand:QI 3 "register_operand" "r")) + (set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "stb.a%V4 %3,[%0,%2]" + [(set_attr "type" "store") + (set_attr "length" "1")]) + +(define_insn "*loadhi_update" + [(set (match_operand:HI 3 "register_operand" "=r,r") + (match_operator:HI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")])) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldw.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*load_zeroextendhisi_update" + [(set (match_operand:SI 3 "register_operand" "=r,r") + (zero_extend:SI (match_operator:HI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")]))) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldw.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*load_signextendhisi_update" + [(set (match_operand:SI 3 "register_operand" "=r,r") + (sign_extend:SI (match_operator:HI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")]))) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ldw.x.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*storehi_update" + [(set (match_operator:HI 4 "store_update_operand" + [(match_operand:SI 1 "register_operand" "0") + (match_operand:SI 2 "short_immediate_operand" "I")]) + (match_operand:HI 3 "register_operand" "r")) + (set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "stw.a%V4 %3,[%0,%2]" + [(set_attr "type" "store") + (set_attr "length" "1")]) + +(define_insn "*loadsi_update" + [(set (match_operand:SI 3 "register_operand" "=r,r") + (match_operator:SI 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")])) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ld.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*storesi_update" + [(set (match_operator:SI 4 "store_update_operand" + [(match_operand:SI 1 "register_operand" "0") + (match_operand:SI 2 "short_immediate_operand" "I")]) + (match_operand:SI 3 "register_operand" "r")) + (set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "st.a%V4 %3,[%0,%2]" + [(set_attr "type" "store") + (set_attr "length" "1")]) + +(define_insn "*loadsf_update" + [(set (match_operand:SF 3 "register_operand" "=r,r") + (match_operator:SF 4 "load_update_operand" + [(match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "rI,J")])) + (set (match_operand:SI 0 "register_operand" "=r,r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "ld.a%V4 %3,[%0,%2]" + [(set_attr "type" "load,load") + (set_attr "length" "1,2")]) + +(define_insn "*storesf_update" + [(set (match_operator:SF 4 "store_update_operand" + [(match_operand:SI 1 "register_operand" "0") + (match_operand:SI 2 "short_immediate_operand" "I")]) + (match_operand:SF 3 "register_operand" "r")) + (set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_dup 1) (match_dup 2)))] + "" + "st.a%V4 %3,[%0,%2]" + [(set_attr "type" "store") + (set_attr "length" "1")]) + +;; Conditional move instructions. + +(define_expand "movsicc" + [(set (match_operand:SI 0 "register_operand" "") + (if_then_else (match_operand 1 "comparison_operator" "") + (match_operand:SI 2 "nonmemory_operand" "") + (match_operand:SI 3 "register_operand" "")))] + "" + " +{ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg = gen_rtx (REG, + SELECT_CC_MODE (code, arc_compare_op0, arc_compare_op1), + 61); + + operands[1] = gen_rtx (code, VOIDmode, ccreg, const0_rtx); +}") + +;(define_expand "movdicc" +; [(set (match_operand:DI 0 "register_operand" "") +; (if_then_else (match_operand 1 "comparison_operator" "") +; (match_operand:DI 2 "nonmemory_operand" "") +; (match_operand:DI 3 "register_operand" "")))] +; "0 /* ??? this would work better if we had cmpdi */" +; " +;{ +; enum rtx_code code = GET_CODE (operands[1]); +; rtx ccreg = gen_rtx (REG, +; SELECT_CC_MODE (code, arc_compare_op0, arc_compare_op1), +; 61); +; +; operands[1] = gen_rtx (code, VOIDmode, ccreg, const0_rtx); +;}") + +(define_expand "movsfcc" + [(set (match_operand:SF 0 "register_operand" "") + (if_then_else (match_operand 1 "comparison_operator" "") + (match_operand:SF 2 "nonmemory_operand" "") + (match_operand:SF 3 "register_operand" "")))] + "" + " +{ + enum rtx_code code = GET_CODE (operands[1]); + rtx ccreg = gen_rtx (REG, + SELECT_CC_MODE (code, arc_compare_op0, arc_compare_op1), + 61); + + operands[1] = gen_rtx (code, VOIDmode, ccreg, const0_rtx); +}") + +;(define_expand "movdfcc" +; [(set (match_operand:DF 0 "register_operand" "") +; (if_then_else (match_operand 1 "comparison_operator" "") +; (match_operand:DF 2 "nonmemory_operand" "") +; (match_operand:DF 3 "register_operand" "")))] +; "0 /* ??? can generate less efficient code if constants involved */" +; " +;{ +; enum rtx_code code = GET_CODE (operands[1]); +; rtx ccreg = gen_rtx (REG, +; SELECT_CC_MODE (code, arc_compare_op0, arc_compare_op1), +; 61); +; +; operands[1] = gen_rtx (code, VOIDmode, ccreg, const0_rtx); +;}") + +(define_insn "*movsicc_insn" + [(set (match_operand:SI 0 "register_operand" "=r") + (if_then_else (match_operand 1 "comparison_operator" "") + (match_operand:SI 2 "nonmemory_operand" "rJi") + (match_operand:SI 3 "register_operand" "0")))] + "" + "mov.%d1 %0,%S2" + [(set_attr "type" "cmove")]) + +; ??? This doesn't properly handle constants. +;(define_insn "*movdicc_insn" +; [(set (match_operand:DI 0 "register_operand" "=r,r") +; (if_then_else (match_operand 1 "comparison_operator" "") +; (match_operand:DI 2 "nonmemory_operand" "r,Ji") +; (match_operand:DI 3 "register_operand" "0,0")))] +; "0" +; "* +;{ +; switch (which_alternative) +; { +; case 0 : +; /* We normally copy the low-numbered register first. However, if +; the first register operand 0 is the same as the second register of +; operand 1, we must copy in the opposite order. */ +; if (REGNO (operands[0]) == REGNO (operands[2]) + 1) +; return \"mov.%d1 %R0,%R2\;mov.%d1 %0,%2\"; +; else +; return \"mov.%d1 %0,%2\;mov.%d1 %R0,%R2\"; +; case 1 : +; return \"mov.%d1 %0,%2\;mov.%d1 %R0,%R2\"; +; } +;}" +; [(set_attr "type" "cmove,cmove") +; (set_attr "length" "2,4")]) + +(define_insn "*movsfcc_insn" + [(set (match_operand:SF 0 "register_operand" "=r,r") + (if_then_else (match_operand 1 "comparison_operator" "") + (match_operand:SF 2 "nonmemory_operand" "r,E") + (match_operand:SF 3 "register_operand" "0,0")))] + "" + "@ + mov.%d1 %0,%2 + mov.%d1 %0,%2 ; %A2" + [(set_attr "type" "cmove,cmove")]) + +;(define_insn "*movdfcc_insn" +; [(set (match_operand:DF 0 "register_operand" "=r,r") +; (if_then_else (match_operand 1 "comparison_operator" "") +; (match_operand:DF 2 "nonmemory_operand" "r,E") +; (match_operand:DF 3 "register_operand" "0,0")))] +; "0" +; "* +;{ +; switch (which_alternative) +; { +; case 0 : +; /* We normally copy the low-numbered register first. However, if +; the first register operand 0 is the same as the second register of +; operand 1, we must copy in the opposite order. */ +; if (REGNO (operands[0]) == REGNO (operands[2]) + 1) +; return \"mov.%d1 %R0,%R2\;mov.%d1 %0,%2\"; +; else +; return \"mov.%d1 %0,%2\;mov.%d1 %R0,%R2\"; +; case 1 : +; return \"mov.%d1 %0,%L2\;mov.%d1 %R0,%H2 ; %A2\"; +; } +;}" +; [(set_attr "type" "cmove,cmove") +; (set_attr "length" "2,4")]) + +;; Zero extension instructions. +;; ??? We don't support volatile memrefs here, but I'm not sure why. + +(define_insn "zero_extendqihi2" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (zero_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + extb%? %0,%1 + ldb%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*zero_extendqihi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (zero_extend:SI (match_operand:QI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:HI 0 "register_operand" "=r") + (zero_extend:HI (match_dup 1)))] + "" + "extb%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +(define_insn "zero_extendqisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (zero_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + extb%? %0,%1 + ldb%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*zero_extendqisi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (zero_extend:SI (match_operand:QI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (zero_extend:SI (match_dup 1)))] + "" + "extb%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +(define_insn "zero_extendhisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (zero_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + extw%? %0,%1 + ldw%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*zero_extendhisi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (zero_extend:SI (match_operand:HI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (zero_extend:SI (match_dup 1)))] + "" + "extw%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +;; Sign extension instructions. + +(define_insn "extendqihi2" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (sign_extend:HI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + sexb%? %0,%1 + ldb.x%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*extendqihi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (sign_extend:SI (match_operand:QI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:HI 0 "register_operand" "=r") + (sign_extend:HI (match_dup 1)))] + "" + "sexb%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +(define_insn "extendqisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (sign_extend:SI (match_operand:QI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + sexb%? %0,%1 + ldb.x%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*extendqisi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (sign_extend:SI (match_operand:QI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (sign_extend:SI (match_dup 1)))] + "" + "sexb%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +(define_insn "extendhisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (sign_extend:SI (match_operand:HI 1 "nonvol_nonimm_operand" "r,m")))] + "" + "@ + sexw%? %0,%1 + ldw.x%U1 %0,%1" + [(set_attr "type" "unary,load")]) + +(define_insn "*extendhisi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (sign_extend:SI (match_operand:HI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (sign_extend:SI (match_dup 1)))] + "" + "sexw%?.f %0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +;; Arithmetic instructions. + +(define_insn "addsi3" + [(set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")))] + "" + "add%? %0,%1,%2") + +(define_insn "*addsi3_set_cc_insn" + [(set (reg:CC 61) (compare:CC + (plus:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (match_dup 1) + (match_dup 2)))] + "" + "add%?.f %0,%1,%2" + [(set_attr "cond" "set")]) + +(define_insn "adddi3" + [(set (match_operand:DI 0 "register_operand" "=r") + (plus:DI (match_operand:DI 1 "nonmemory_operand" "%r") + (match_operand:DI 2 "nonmemory_operand" "ri"))) + (clobber (reg:CC 61))] + "" + "* +{ + rtx op2 = operands[2]; + + if (GET_CODE (op2) == CONST_INT) + { + int sign = INTVAL (op2); + if (sign < 0) + return \"add.f %L0,%L1,%2\;adc %H0,%H1,-1\"; + else + return \"add.f %L0,%L1,%2\;adc %H0,%H1,0\"; + } + else + return \"add.f %L0,%L1,%L2\;adc %H0,%H1,%H2\"; +}" + [(set_attr "length" "2")]) + +(define_insn "subsi3" + [(set (match_operand:SI 0 "register_operand" "=r") + (minus:SI (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")))] + "" + "sub%? %0,%1,%2") + +(define_insn "*subsi3_set_cc_insn" + [(set (reg:CC 61) (compare:CC + (minus:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (minus:SI (match_dup 1) + (match_dup 2)))] + "" + "sub%?.f %0,%1,%2" + [(set_attr "cond" "set")]) + +(define_insn "subdi3" + [(set (match_operand:DI 0 "register_operand" "=r") + (minus:DI (match_operand:DI 1 "nonmemory_operand" "r") + (match_operand:DI 2 "nonmemory_operand" "ri"))) + (clobber (reg:CC 61))] + "" + "* +{ + rtx op2 = operands[2]; + + if (GET_CODE (op2) == CONST_INT) + { + int sign = INTVAL (op2); + if (sign < 0) + return \"sub.f %L0,%L1,%2\;sbc %H0,%H1,-1\"; + else + return \"sub.f %L0,%L1,%2\;sbc %H0,%H1,0\"; + } + else + return \"sub.f %L0,%L1,%L2\;sbc %H0,%H1,%H2\"; +}" + [(set_attr "length" "2")]) + +;; Boolean instructions. +;; +;; We don't define the DImode versions as expand_binop does a good enough job. + +(define_insn "andsi3" + [(set (match_operand:SI 0 "register_operand" "=r") + (and:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")))] + "" + "and%? %0,%1,%2") + +(define_insn "*andsi3_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (and:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (and:SI (match_dup 1) + (match_dup 2)))] + "" + "and%?.f %0,%1,%2" + [(set_attr "cond" "set_zn")]) + +(define_insn "*bicsi3_insn" + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") + (and:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J") + (not:SI (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r"))))] + "" + "bic%? %0,%1,%2" + [(set_attr "length" "1,2,1,2")]) + +(define_insn "*bicsi3_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (and:SI (match_operand:SI 1 "register_operand" "%r") + (not:SI (match_operand:SI 2 "nonmemory_operand" "rIJ"))) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (and:SI (match_dup 1) + (not:SI (match_dup 2))))] + "" + "bic%?.f %0,%1,%2" + [(set_attr "cond" "set_zn")]) + +(define_insn "iorsi3" + [(set (match_operand:SI 0 "register_operand" "=r") + (ior:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")))] + "" + "or%? %0,%1,%2") + +(define_insn "*iorsi3_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (ior:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (ior:SI (match_dup 1) + (match_dup 2)))] + "" + "or%?.f %0,%1,%2" + [(set_attr "cond" "set_zn")]) + +(define_insn "xorsi3" + [(set (match_operand:SI 0 "register_operand" "=r") + (xor:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")))] + "" + "xor%? %0,%1,%2") + +(define_insn "*xorsi3_set_cc_insn" + [(set (reg:CCZN 61) (compare:CCZN + (xor:SI (match_operand:SI 1 "register_operand" "%r") + (match_operand:SI 2 "nonmemory_operand" "rIJ")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (xor:SI (match_dup 1) + (match_dup 2)))] + "" + "xor%?.f %0,%1,%2" + [(set_attr "cond" "set_zn")]) + +(define_insn "negsi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (neg:SI (match_operand:SI 1 "register_operand" "r")))] + "" + "sub%? %0,0,%1" + [(set_attr "type" "unary")]) + +(define_insn "*negsi2_set_cc_insn" + [(set (reg:CC 61) (compare:CC + (neg:SI (match_operand:SI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (neg:SI (match_dup 1)))] + "" + "sub%?.f %0,0,%1" + [(set_attr "type" "unary") + (set_attr "cond" "set")]) + +(define_insn "negdi2" + [(set (match_operand:DI 0 "register_operand" "=r") + (neg:DI (match_operand:DI 1 "register_operand" "r"))) + (clobber (reg:SI 61))] + "" + "sub.f %L0,0,%L1\;sbc %H0,0,%H1" + [(set_attr "type" "unary") + (set_attr "length" "2")]) + +(define_insn "one_cmplsi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (not:SI (match_operand:SI 1 "register_operand" "r")))] + "" + "xor%? %0,%1,-1" + [(set_attr "type" "unary")]) + +(define_insn "*one_cmplsi2_set_cc_insn" + [(set (reg:CCZN 61) (compare:CC + (not:SI (match_operand:SI 1 "register_operand" "r")) + (const_int 0))) + (set (match_operand:SI 0 "register_operand" "=r") + (not:SI (match_dup 1)))] + "" + "xor%?.f %0,%1,-1" + [(set_attr "type" "unary") + (set_attr "cond" "set_zn")]) + +;; Shift instructions. + +(define_expand "ashlsi3" + [(set (match_operand:SI 0 "register_operand" "") + (ashift:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "nonmemory_operand" "")))] + "" + " +{ + if (! TARGET_SHIFTER) + { + emit_insn (gen_rtx + (PARALLEL, VOIDmode, + gen_rtvec (2, + gen_rtx (SET, VOIDmode, operands[0], + gen_rtx (ASHIFT, SImode, operands[1], operands[2])), + gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0))))); + DONE; + } +}") + +(define_expand "ashrsi3" + [(set (match_operand:SI 0 "register_operand" "") + (ashiftrt:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "nonmemory_operand" "")))] + "" + " +{ + if (! TARGET_SHIFTER) + { + emit_insn (gen_rtx + (PARALLEL, VOIDmode, + gen_rtvec (2, + gen_rtx (SET, VOIDmode, operands[0], + gen_rtx (ASHIFTRT, SImode, operands[1], operands[2])), + gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0))))); + DONE; + } +}") + +(define_expand "lshrsi3" + [(set (match_operand:SI 0 "register_operand" "") + (lshiftrt:SI (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "nonmemory_operand" "")))] + "" + " +{ + if (! TARGET_SHIFTER) + { + emit_insn (gen_rtx + (PARALLEL, VOIDmode, + gen_rtvec (2, + gen_rtx (SET, VOIDmode, operands[0], + gen_rtx (LSHIFTRT, SImode, operands[1], operands[2])), + gen_rtx (CLOBBER, VOIDmode, gen_rtx (SCRATCH, SImode, 0))))); + DONE; + } +}") + +(define_insn "*ashlsi3_insn" + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") + (ashift:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J") + (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))] + "TARGET_SHIFTER" + "asl%? %0,%1,%2" + [(set_attr "type" "shift") + (set_attr "length" "1,2,1,2")]) + +(define_insn "*ashrsi3_insn" + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") + (ashiftrt:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J") + (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))] + "TARGET_SHIFTER" + "asr%? %0,%1,%2" + [(set_attr "type" "shift") + (set_attr "length" "1,2,1,2")]) + +(define_insn "*lshrsi3_insn" + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") + (lshiftrt:SI (match_operand:SI 1 "nonmemory_operand" "r,r,I,J") + (match_operand:SI 2 "nonmemory_operand" "rI,J,r,r")))] + "TARGET_SHIFTER" + "lsr%? %0,%1,%2" + [(set_attr "type" "shift") + (set_attr "length" "1,2,1,2")]) + +(define_insn "*shift_si3" + [(set (match_operand:SI 0 "register_operand" "=r") + (match_operator:SI 3 "shift_operator" + [(match_operand:SI 1 "register_operand" "0") + (match_operand:SI 2 "nonmemory_operand" "rIJ")])) + (clobber (match_scratch:SI 4 "=&r"))] + "! TARGET_SHIFTER" + "* return output_shift (operands);" + [(set_attr "type" "shift") + (set_attr "length" "8")]) + +;; Compare instructions. +;; This controls RTL generation and register allocation. + +;; We generate RTL for comparisons and branches by having the cmpxx +;; patterns store away the operands. Then, the scc and bcc patterns +;; emit RTL for both the compare and the branch. + +(define_expand "cmpsi" + [(set (reg:CC 61) + (compare:CC (match_operand:SI 0 "register_operand" "") + (match_operand:SI 1 "nonmemory_operand" "")))] + "" + " +{ + arc_compare_op0 = operands[0]; + arc_compare_op1 = operands[1]; + DONE; +}") + +;; ??? We may be able to relax this a bit by adding a new constant 'K' for 0. +;; This assumes sub.f 0,symbol,0 is a valid insn. +;; Note that "sub.f 0,r0,1" is an 8 byte insn. To avoid unnecessarily +;; creating 8 byte insns we duplicate %1 in the destination reg of the insn +;; if it's a small constant. + +(define_insn "*cmpsi_cc_insn" + [(set (reg:CC 61) + (compare:CC (match_operand:SI 0 "register_operand" "r,r,r") + (match_operand:SI 1 "nonmemory_operand" "r,I,J")))] + "" + "@ + sub.f 0,%0,%1 + sub.f %1,%0,%1 + sub.f 0,%0,%1" + [(set_attr "type" "compare,compare,compare")]) + +(define_insn "*cmpsi_cczn_insn" + [(set (reg:CCZN 61) + (compare:CCZN (match_operand:SI 0 "register_operand" "r,r,r") + (match_operand:SI 1 "nonmemory_operand" "r,I,J")))] + "" + "@ + sub.f 0,%0,%1 + sub.f %1,%0,%1 + sub.f 0,%0,%1" + [(set_attr "type" "compare,compare,compare")]) + +(define_insn "*cmpsi_ccznc_insn" + [(set (reg:CCZNC 61) + (compare:CCZNC (match_operand:SI 0 "register_operand" "r,r,r") + (match_operand:SI 1 "nonmemory_operand" "r,I,J")))] + "" + "@ + sub.f 0,%0,%1 + sub.f %1,%0,%1 + sub.f 0,%0,%1" + [(set_attr "type" "compare,compare,compare")]) + +;; Next come the scc insns. + +(define_expand "seq" + [(set (match_operand:SI 0 "register_operand" "=r") + (eq:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (EQ, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sne" + [(set (match_operand:SI 0 "register_operand" "=r") + (ne:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (NE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sgt" + [(set (match_operand:SI 0 "register_operand" "=r") + (gt:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (GT, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sle" + [(set (match_operand:SI 0 "register_operand" "=r") + (le:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (LE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sge" + [(set (match_operand:SI 0 "register_operand" "=r") + (ge:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (GE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "slt" + [(set (match_operand:SI 0 "register_operand" "=r") + (lt:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (LT, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sgtu" + [(set (match_operand:SI 0 "register_operand" "=r") + (gtu:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (GTU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sleu" + [(set (match_operand:SI 0 "register_operand" "=r") + (leu:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (LEU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sgeu" + [(set (match_operand:SI 0 "register_operand" "=r") + (geu:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (GEU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "sltu" + [(set (match_operand:SI 0 "register_operand" "=r") + (ltu:SI (match_dup 1) (const_int 0)))] + "" + " +{ + operands[1] = gen_compare_reg (LTU, arc_compare_op0, arc_compare_op1); +}") + +(define_insn "*scc_insn" + [(set (match_operand:SI 0 "register_operand" "=r") + (match_operator:SI 1 "comparison_operator" [(reg 61) (const_int 0)]))] + "" + "mov %0,1\;sub.%D1 %0,%0,%0" + [(set_attr "type" "unary") + (set_attr "length" "2")]) + +;; ??? Look up negscc insn. See pa.md for example. +(define_insn "*neg_scc_insn" + [(set (match_operand:SI 0 "register_operand" "=r") + (neg:SI (match_operator:SI 1 "comparison_operator" + [(reg 61) (const_int 0)])))] + "" + "mov %0,-1\;sub.%D1 %0,%0,%0" + [(set_attr "type" "unary") + (set_attr "length" "2")]) + +(define_insn "*not_scc_insn" + [(set (match_operand:SI 0 "register_operand" "=r") + (not:SI (match_operator:SI 1 "comparison_operator" + [(reg 61) (const_int 0)])))] + "" + "mov %0,1\;sub.%d1 %0,%0,%0" + [(set_attr "type" "unary") + (set_attr "length" "2")]) + +;; These control RTL generation for conditional jump insns + +(define_expand "beq" + [(set (pc) + (if_then_else (eq (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (EQ, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bne" + [(set (pc) + (if_then_else (ne (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (NE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bgt" + [(set (pc) + (if_then_else (gt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (GT, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "ble" + [(set (pc) + (if_then_else (le (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (LE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bge" + [(set (pc) + (if_then_else (ge (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (GE, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "blt" + [(set (pc) + (if_then_else (lt (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (LT, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bgtu" + [(set (pc) + (if_then_else (gtu (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (GTU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bleu" + [(set (pc) + (if_then_else (leu (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (LEU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bgeu" + [(set (pc) + (if_then_else (geu (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (GEU, arc_compare_op0, arc_compare_op1); +}") + +(define_expand "bltu" + [(set (pc) + (if_then_else (ltu (match_dup 1) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + " +{ + operands[1] = gen_compare_reg (LTU, arc_compare_op0, arc_compare_op1); +}") + +;; Now match both normal and inverted jump. + +(define_insn "*branch_insn" + [(set (pc) + (if_then_else (match_operator 1 "proper_comparison_operator" + [(reg 61) (const_int 0)]) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "* +{ + if (arc_ccfsm_branch_deleted_p ()) + { + arc_ccfsm_record_branch_deleted (); + return \"; branch deleted, next insns conditionalized\"; + } + else + return \"%~b%d1%# %l0\"; +}" + [(set_attr "type" "branch")]) + +(define_insn "*rev_branch_insn" + [(set (pc) + (if_then_else (match_operator 1 "proper_comparison_operator" + [(reg 61) (const_int 0)]) + (pc) + (label_ref (match_operand 0 "" ""))))] + "REVERSIBLE_CC_MODE (GET_MODE (XEXP (operands[1], 0)))" + "* +{ + if (arc_ccfsm_branch_deleted_p ()) + { + arc_ccfsm_record_branch_deleted (); + return \"; branch deleted, next insns conditionalized\"; + } + else + return \"%~b%D1%# %l0\"; +}" + [(set_attr "type" "branch")]) + +;; Unconditional and other jump instructions. + +(define_insn "jump" + [(set (pc) (label_ref (match_operand 0 "" "")))] + "" + "b%* %l0" + [(set_attr "type" "uncond_branch")]) + +(define_insn "indirect_jump" + [(set (pc) (match_operand:SI 0 "address_operand" "p"))] + "" + "j%* %a0" + [(set_attr "type" "uncond_branch")]) + +;; Implement a switch statement. +;; This wouldn't be necessary in the non-pic case if we could distinguish +;; label refs of the jump table from other label refs. The problem is that +;; label refs are output as "%st(.LL42)" but we don't want the %st - we want +;; the real address since it's the address of the table. + +(define_expand "casesi" + [(set (match_dup 5) + (minus:SI (match_operand:SI 0 "register_operand" "") + (match_operand:SI 1 "nonmemory_operand" ""))) + (set (reg:CC 61) + (compare:CC (match_dup 5) + (match_operand:SI 2 "nonmemory_operand" ""))) + (set (pc) + (if_then_else (gtu (reg:CC 61) + (const_int 0)) + (label_ref (match_operand 4 "" "")) + (pc))) + (parallel + [(set (pc) + (mem:SI (plus:SI (mult:SI (match_dup 5) + (const_int 4)) + (label_ref (match_operand 3 "" ""))))) + (clobber (match_scratch:SI 6 "")) + (clobber (match_scratch:SI 7 ""))])] + "" + " +{ + operands[5] = gen_reg_rtx (SImode); +}") + +(define_insn "*casesi_insn" + [(set (pc) + (mem:SI (plus:SI (mult:SI (match_operand:SI 0 "register_operand" "r") + (const_int 4)) + (label_ref (match_operand 1 "" ""))))) + (clobber (match_scratch:SI 2 "=r")) + (clobber (match_scratch:SI 3 "=r"))] + "" + "* +{ + output_asm_insn (\"mov %2,%1\", operands); + if (TARGET_SHIFTER) + output_asm_insn (\"asl %3,%0,2\", operands); + else + output_asm_insn (\"asl %3,%0\;asl %3,%3\", operands); + output_asm_insn (\"ld %2,[%2,%3]\", operands); + output_asm_insn (\"j.nd %a2\", operands); + return \"\"; +}" + [(set_attr "type" "uncond_branch") + (set_attr "length" "6")]) + +(define_insn "tablejump" + [(set (pc) (match_operand:SI 0 "address_operand" "p")) + (use (label_ref (match_operand 1 "" "")))] + "0 /* disabled -> using casesi now */" + "j%* %a0" + [(set_attr "type" "uncond_branch")]) + +(define_expand "call" + ;; operands[1] is stack_size_rtx + ;; operands[2] is next_arg_register + [(parallel [(call (match_operand:SI 0 "call_operand" "") + (match_operand 1 "" "")) + (clobber (reg:SI 31))])] + "" + "") + +(define_insn "*call_via_reg" + [(call (mem:SI (match_operand:SI 0 "register_operand" "r")) + (match_operand 1 "" "")) + (clobber (reg:SI 31))] + "" + "lr blink,[status]\;j.d %0\;add blink,blink,2" + [(set_attr "type" "call_no_delay_slot") + (set_attr "length" "3")]) + +(define_insn "*call_via_label" + [(call (mem:SI (match_operand:SI 0 "call_address_operand" "")) + (match_operand 1 "" "")) + (clobber (reg:SI 31))] + "" + ; The %~ is necessary in case this insn gets conditionalized and the previous + ; insn is the cc setter. + "%~bl%!%* %0" + [(set_attr "type" "call") + (set_attr "cond" "canuse")]) + +(define_expand "call_value" + ;; operand 2 is stack_size_rtx + ;; operand 3 is next_arg_register + [(parallel [(set (match_operand 0 "register_operand" "=r") + (call (match_operand:SI 1 "call_operand" "") + (match_operand 2 "" ""))) + (clobber (reg:SI 31))])] + "" + "") + +(define_insn "*call_value_via_reg" + [(set (match_operand 0 "register_operand" "=r") + (call (mem:SI (match_operand:SI 1 "register_operand" "r")) + (match_operand 2 "" ""))) + (clobber (reg:SI 31))] + "" + "lr blink,[status]\;j.d %1\;add blink,blink,2" + [(set_attr "type" "call_no_delay_slot") + (set_attr "length" "3")]) + +(define_insn "*call_value_via_label" + [(set (match_operand 0 "register_operand" "=r") + (call (mem:SI (match_operand:SI 1 "call_address_operand" "")) + (match_operand 2 "" ""))) + (clobber (reg:SI 31))] + "" + ; The %~ is necessary in case this insn gets conditionalized and the previous + ; insn is the cc setter. + "%~bl%!%* %1" + [(set_attr "type" "call") + (set_attr "cond" "canuse")]) + +(define_insn "nop" + [(const_int 0)] + "" + "nop" + [(set_attr "type" "misc")]) + +;; Special pattern to flush the icache. +;; ??? Not sure what to do here. Some ARC's are known to support this. + +(define_insn "flush_icache" + [(unspec_volatile [(match_operand 0 "memory_operand" "m")] 0)] + "" + "* return \"\";" + [(set_attr "type" "misc")]) + +;; Split up troublesome insns for better scheduling. + +;; Peepholes go at the end. diff --git a/gcc/config/arc/initfini.c b/gcc/config/arc/initfini.c new file mode 100644 index 00000000000..084e2292bf5 --- /dev/null +++ b/gcc/config/arc/initfini.c @@ -0,0 +1,157 @@ +/* .init/.fini section handling + C++ global constructor/destructor handling. + This file is based on crtstuff.c, sol2-crti.asm, sol2-crtn.asm. + +Copyright (C) 1995, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this file with files + compiled with GCC to produce an executable, this does not cause + the resulting executable to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +/* Declare a pointer to void function type. */ +typedef void (*func_ptr) (void); + +#ifdef CRT_INIT + +/* NOTE: In order to be able to support SVR4 shared libraries, we arrange + to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__, + __DTOR_END__ } per root executable and also one set of these symbols + per shared library. So in any given whole process image, we may have + multiple definitions of each of these symbols. In order to prevent + these definitions from conflicting with one another, and in order to + ensure that the proper lists are used for the initialization/finalization + of each individual shared library (respectively), we give these symbols + only internal (i.e. `static') linkage, and we also make it a point to + refer to only the __CTOR_END__ symbol in crtfini.o and the __DTOR_LIST__ + symbol in crtinit.o, where they are defined. */ + +static func_ptr __CTOR_LIST__[1] __attribute__ ((section (".ctors"))) + = { (func_ptr) (-1) }; + +static func_ptr __DTOR_LIST__[1] __attribute__ ((section (".dtors"))) + = { (func_ptr) (-1) }; + +/* Run all the global destructors on exit from the program. */ + +/* Some systems place the number of pointers in the first word of the + table. On SVR4 however, that word is -1. In all cases, the table is + null-terminated. On SVR4, we start from the beginning of the list and + invoke each per-compilation-unit destructor routine in order + until we find that null. + + Note that this function MUST be static. There will be one of these + functions in each root executable and one in each shared library, but + although they all have the same code, each one is unique in that it + refers to one particular associated `__DTOR_LIST__' which belongs to the + same particular root executable or shared library file. */ + +static void __do_global_dtors () +asm ("__do_global_dtors") __attribute__ ((section (".text"))); + +static void +__do_global_dtors () +{ + func_ptr *p; + for (p = __DTOR_LIST__ + 1; *p; p++) + (*p) (); +} + +/* .init section start. + This must appear at the start of the .init section. */ + +asm (" + .section .init\n + .global init\n + .word 0\n +init:\n + st blink,[sp,4]\n + st fp,[sp]\n + mov fp,sp\n + sub sp,sp,16\n +"); + +/* .fini section start. + This must appear at the start of the .init section. */ + +asm (" + .section .fini\n + .global fini\n + .word 0\n +fini:\n + st blink,[sp,4]\n + st fp,[sp]\n + mov fp,sp\n + sub sp,sp,16\n + bl.nd __do_global_dtors +"); + +#endif /* CRT_INIT */ + +#ifdef CRT_FINI + +/* Put a word containing zero at the end of each of our two lists of function + addresses. Note that the words defined here go into the .ctors and .dtors + sections of the crtend.o file, and since that file is always linked in + last, these words naturally end up at the very ends of the two lists + contained in these two sections. */ + +static func_ptr __CTOR_END__[1] __attribute__ ((section (".ctors"))) + = { (func_ptr) 0 }; + +static func_ptr __DTOR_END__[1] __attribute__ ((section (".dtors"))) + = { (func_ptr) 0 }; + +/* Run all global constructors for the program. + Note that they are run in reverse order. */ + +static void __do_global_ctors () +asm ("__do_global_ctors") __attribute__ ((section (".text"))); + +static void +__do_global_ctors () +{ + func_ptr *p; + for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--) + (*p) (); +} + +/* .init section end. + This must live at the end of the .init section. */ + +asm (" + .section .init\n + bl.nd __do_global_ctors + ld blink,[fp,4]\n + j.d blink\n + ld.a fp,[sp,16]\n +"); + +/* .fini section end. + This must live at the end of the .fini section. */ + +asm (" + .section .fini\n + ld blink,[fp,4]\n + j.d blink\n + ld.a fp,[sp,16]\n +"); + +#endif /* CRT_FINI */ diff --git a/gcc/config/arc/lib1funcs.asm b/gcc/config/arc/lib1funcs.asm new file mode 100644 index 00000000000..a2d509ac765 --- /dev/null +++ b/gcc/config/arc/lib1funcs.asm @@ -0,0 +1,273 @@ +; libgcc1 routines for ARC cpu. + +/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. + +This file 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. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file with other programs, and to distribute +those programs without any restriction coming from the use of this +file. (The General Public License restrictions do apply in other +respects; for example, they cover modification of the file, and +distribution when not linked into another program.) + +This file 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this library with other files, + some of which are compiled with GCC, to produce an executable, + this library does not by itself cause the resulting executable + to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +#ifdef L_mulsi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___mulsi3 +___mulsi3: + +/* This the simple version. + + while (a) + { + if (a & 1) + r += b; + a >>= 1; + b <<= 1; + } +*/ + mov r2,0 ; Accumulate result here. +.Lloop: + sub.f 0,r0,0 ; while (a) + nop + beq.nd .Ldone + and.f 0,r0,1 ; if (a & 1) + add.nz r2,r2,r1 ; r += b + lsr r0,r0 ; a >>= 1 + b.d .Lloop + lsl r1,r1 ; b <<= 1 +.Ldone: + j.d blink + mov r0,r2 +#endif + +#endif /* L_mulsi3 */ + +#ifdef L_umulsidi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___umulsidi3 +___umulsidi3: + +/* This the simple version. + + while (a) + { + if (a & 1) + r += b; + a >>= 1; + b <<= 1; + } +*/ + mov r2,0 ; Top part of b. + mov r3,0 ; Accumulate result here. + mov r4,0 +.Lloop: + sub.f 0,r0,0 ; while (a) + nop + beq.nd .Ldone + and.f 0,r0,1 ; if (a & 1) + add.nz r4,r4,r1 ; r += b + adc.nz r3,r3,r2 + lsr r0,r0 ; a >>= 1 + lsl.f r1,r1 ; b <<= 1 + b.d .Lloop + rlc r2,r2 +.Ldone: +#ifdef __big_endian__ + mov r1,r4 + j.d blink + mov r0,r3 +#else + mov r0,r4 + j.d blink + mov r1,r3 +#endif +#endif + +#endif /* L_umulsidi3 */ + +#ifdef L_divmod_tools + +; Utilities used by all routines. + + .section .text + .align 4 + +; inputs: r0 = numerator, r1 = denominator +; outputs: positive r0/r1, +; r6.bit1 = sign of numerator, r6.bit0 = sign of result + + .global ___divnorm +___divnorm: + mov r6,0 ; keep sign in r6 + sub.f 0,r0,0 ; is numerator -ve? + sub.lt r0,0,r0 ; negate numerator + mov.lt r6,3 ; sign is -ve + sub.f 0,r1,0 ; is denominator -ve? + sub.lt r1,0,r1 ; negate denominator + xor.lt r6,r6,1 ; toggle sign + j.nd blink + +/* +unsigned long +udivmodsi4(int modwanted, unsigned long num, unsigned long den) +{ + unsigned long bit = 1; + unsigned long res = 0; + + while (den < num && bit && !(den & (1L<<31))) + { + den <<=1; + bit <<=1; + } + while (bit) + { + if (num >= den) + { + num -= den; + res |= bit; + } + bit >>=1; + den >>=1; + } + if (modwanted) return num; + return res; +} +*/ + +; inputs: r0 = numerator, r1 = denominator +; outputs: r0 = quotient, r1 = remainder, r2/r3 trashed + + .global ___udivmodsi4 +___udivmodsi4: + mov r2,1 ; bit = 1 + mov r3,0 ; res = 0 +.Lloop1: + sub.f 0,r1,r0 ; while (den < num + nop + bnc.nd .Lloop2 + sub.f 0,r2,0 ; && bit + nop + bz.nd .Lloop2 + lsl.f 0,r1 ; && !(den & (1<<31)) + nop + bc.nd .Lloop2 + lsl r1,r1 ; den <<= 1 + b.d .Lloop1 + lsl r2,r2 ; bit <<= 1 +.Lloop2: + sub.f 0,r2,0 ; while (bit) + nop + bz.nd .Ldivmodend + sub.f 0,r0,r1 ; if (num >= den) + nop + bc.nd .Lshiftdown + sub r0,r0,r1 ; num -= den + or r3,r3,r2 ; res |= bit +.Lshiftdown: + lsr r2,r2 ; bit >>= 1 + b.d .Lloop2 + lsr r1,r1 ; den >>= 1 +.Ldivmodend: + mov r1,r0 ; r1 = mod + j.d blink + mov r0,r3 ; r0 = res + +#endif + +#ifdef L_udivsi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___udivsi3 +___udivsi3: + mov r7,blink + bl.nd ___udivmodsi4 + j.nd r7 +#endif + +#endif /* L_udivsi3 */ + +#ifdef L_divsi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___divsi3 +___divsi3: + mov r7,blink + bl.nd ___divnorm + bl.nd ___udivmodsi4 + and.f 0,r6,1 + sub.nz r0,0,r0 ; cannot go in delay slot, has limm value + j.nd r7 +#endif + +#endif /* L_divsi3 */ + +#ifdef L_umodsi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___umodsi3 +___umodsi3: + mov r7,blink + bl.nd ___udivmodsi4 + j.d r7 + mov r0,r1 +#endif + +#endif /* L_umodsi3 */ + +#ifdef L_modsi3 + .section .text + .align 4 + +#ifdef __base__ + .cpu base + .global ___modsi3 +___modsi3: + mov r7,blink + bl.nd ___divnorm + bl.nd ___udivmodsi4 + and.f 0,r6,2 + sub.nz r1,0,r1 + j.d r7 + mov r0,r1 +#endif + +#endif /* L_modsi3 */ diff --git a/gcc/config/arc/t-arc b/gcc/config/arc/t-arc new file mode 100644 index 00000000000..d922c27ca5f --- /dev/null +++ b/gcc/config/arc/t-arc @@ -0,0 +1,72 @@ +CROSS_LIBGCC1 = libgcc1-asm.a +LIB1ASMSRC = arc/lib1funcs.asm +LIB1ASMFUNCS = _mulsi3 _umulsidi3 _udivsi3 _divsi3 _umodsi3 _modsi3 _divmod_tools + +# We need libgcc routines to be mangled according to which cpu they +# were compiled for. +# ??? -mmangle-cpu passed by default for now. +#LIBGCC2_CFLAGS = -g1 -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) -mmangle-cpu + +# These are really part of libgcc1, but this will cause them to be +# built correctly, so... + +LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c + +dp-bit.c: $(srcdir)/config/fp-bit.c + echo '#ifndef __big_endian__' > dp-bit.c + echo '#define FLOAT_BIT_ORDER_MISMATCH' >> dp-bit.c + echo '#endif' >> dp-bit.c + cat $(srcdir)/config/fp-bit.c >> dp-bit.c + +fp-bit.c: $(srcdir)/config/fp-bit.c + echo '#define FLOAT' > fp-bit.c + echo '#ifndef __big_endian__' >> fp-bit.c + echo '#define FLOAT_BIT_ORDER_MISMATCH' >> fp-bit.c + echo '#endif' >> fp-bit.c + cat $(srcdir)/config/fp-bit.c >> fp-bit.c + +# .init/.fini section routines + +x-crtinit.o: $(srcdir)/config/arc/initfini.c $(GCC_PASSES) $(CONFIG_H) + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS) \ + -DCRT_INIT -finhibit-size-directive -fno-inline-functions \ + -g0 -c $(srcdir)/config/arc/initfini.c -o $(dir)/crtinit.o + +x-crtfini.o: $(srcdir)/config/arc/initfini.c $(GCC_PASSES) $(CONFIG_H) + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS) \ + -DCRT_FINI -finhibit-size-directive -fno-inline-functions \ + -g0 -c $(srcdir)/config/arc/initfini.c -o $(dir)/crtfini.o + +MULTILIB_OPTIONS = EB +MULTILIB_DIRNAMES = be + +# We need our own versions to build multiple copies of crt*.o. +# ??? Use new support in Makefile. + +LIBGCC = stmp-multilib-arc +INSTALL_LIBGCC = install-multilib-arc + +stmp-multilib-arc: stmp-multilib + for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \ + dir=`echo $$i | sed -e 's/;.*$$//'`; \ + flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ + $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \ + CC="$(CC)" CFLAGS="$(CFLAGS)" \ + HOST_PREFIX="$(HOST_PREFIX)" HOST_PREFIX_1="$(HOST_PREFIX_1)" \ + GCC_CFLAGS="$(GCC_CFLAGS) $${flags}" \ + INCLUDES="$(INCLUDES)" CRTSTUFF_T_CFLAGS=$(CRTSTUFF_T_CFLAGS) \ + dir="$${dir}" x-crtinit.o x-crtfini.o; \ + if [ $$? -eq 0 ] ; then true; else exit 1; fi; \ + done + touch stmp-multilib-arc + +install-multilib-arc: install-multilib + for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \ + dir=`echo $$i | sed -e 's/;.*$$//'`; \ + rm -f $(libsubdir)/$${dir}/crtinit.o; \ + $(INSTALL_DATA) $${dir}/crtinit.o $(libsubdir)/$${dir}/crtinit.o; \ + chmod a-x $(libsubdir)/$${dir}/crtinit.o; \ + rm -f $(libsubdir)/$${dir}/crtfini.o; \ + $(INSTALL_DATA) $${dir}/crtfini.o $(libsubdir)/$${dir}/crtfini.o; \ + chmod a-x $(libsubdir)/$${dir}/crtfini.o; \ + done diff --git a/gcc/config/arc/xm-arc.h b/gcc/config/arc/xm-arc.h new file mode 100644 index 00000000000..ba011e94be6 --- /dev/null +++ b/gcc/config/arc/xm-arc.h @@ -0,0 +1,47 @@ +/* Configuration for GNU C-compiler for the ARC processor. + Copyright (C) 1994, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* #defines that need visibility everywhere. */ +#define FALSE 0 +#define TRUE 1 + +/* This describes the machine the compiler is hosted on. */ +#define HOST_BITS_PER_CHAR 8 +#define HOST_BITS_PER_SHORT 16 +#define HOST_BITS_PER_INT 32 +#define HOST_BITS_PER_LONG 32 +#define HOST_BITS_PER_LONGLONG 64 + +/* Doubles are stored in memory with the high order word first. This + matters when cross-compiling. */ +#define HOST_WORDS_BIG_ENDIAN 1 + +/* target machine dependencies. + tm.h is a symbolic link to the actual target specific file. */ +#include "tm.h" + +/* Arguments to use with `exit'. */ +#define SUCCESS_EXIT_CODE 0 +#define FATAL_EXIT_CODE 33 + +/* If compiled with Sun CC, the use of alloca requires this #include. */ +#ifndef __GNUC__ +#include "alloca.h" +#endif diff --git a/gcc/config/arm/xm-netbsd.h b/gcc/config/arm/xm-netbsd.h deleted file mode 100644 index 1c7a656486c..00000000000 --- a/gcc/config/arm/xm-netbsd.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Configuration for GCC for ARM running NetBSD as host. */ - -#include <arm/xm-arm.h> - -/* xm-netbsd.h defines this */ -#ifdef HAVE_VPRINTF -#undef HAVE_VPRINTF -#endif - -#include <xm-netbsd.h> diff --git a/gcc/config/i386/crtdll.h b/gcc/config/i386/crtdll.h new file mode 100644 index 00000000000..c6b219ae020 --- /dev/null +++ b/gcc/config/i386/crtdll.h @@ -0,0 +1,33 @@ +/* Operating system specific defines to be used when targeting GCC for + hosting on Windows32, using GNU tools and the Windows32 API Library, + as distinct from winnt.h, which is used to build GCC for use with a + windows style library and tool set and uses the Microsoft tools. + This variant uses CRTDLL.DLL insted of MSVCRTDLL.DLL. + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#undef LIBGCC_SPEC +#define LIBGCC_SPEC "-lmingw32 -lgcc -lmoldname -lcrtdll" + +/* Specify a different entry point when linking a DLL */ +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "%{mdll:dllcrt1%O%s} %{!mdll:crt1%O%s}" + +#undef MATH_LIBRARY +#define MATH_LIBRARY "-lcrtdll" diff --git a/gcc/config/i386/osf1-ci.asm b/gcc/config/i386/osf1-ci.asm new file mode 100644 index 00000000000..a0f077304a8 --- /dev/null +++ b/gcc/config/i386/osf1-ci.asm @@ -0,0 +1,65 @@ +! crti.s for OSF/1, x86; derived from sol2-ci.asm. + +! Copyright (C) 1993, 1998 Free Software Foundation, Inc. +! Written By Fred Fish, Nov 1992 +! +! This file 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. +! +! In addition to the permissions in the GNU General Public License, the +! Free Software Foundation gives you unlimited permission to link the +! compiled version of this file with other programs, and to distribute +! those programs without any restriction coming from the use of this +! file. (The General Public License restrictions do apply in other +! respects; for example, they cover modification of the file, and +! distribution when not linked into another program.) +! +! This file 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; see the file COPYING. If not, write to +! the Free Software Foundation, 59 Temple Place - Suite 330, +! Boston, MA 02111-1307, USA. +! +! As a special exception, if you link this library with files +! compiled with GCC to produce an executable, this does not cause +! the resulting executable to be covered by the GNU General Public License. +! This exception does not however invalidate any other reasons why +! the executable file might be covered by the GNU General Public License. +! + +! This file just supplies labeled starting points for the .init and .fini +! sections. It is linked in before the values-Xx.o files and also before +! crtbegin.o. + + .file "crti.s" + .ident "GNU C crti.s" + + .section .init + .globl _init + .type _init,@function +_init: + + .section .fini + .globl _fini + .type _fini,@function +_fini: + +.globl _init_init_routine +.data + .align 4 + .type _init_init_routine,@object + .size _init_init_routine,4 +_init_init_routine: + .long _init +.globl _init_fini_routine + .align 4 + .type _init_fini_routine,@object + .size _init_fini_routine,4 +_init_fini_routine: + .long _fini diff --git a/gcc/config/i386/osf1-cn.asm b/gcc/config/i386/osf1-cn.asm new file mode 100644 index 00000000000..a10298fd288 --- /dev/null +++ b/gcc/config/i386/osf1-cn.asm @@ -0,0 +1,46 @@ +! crtn.s for OSF/1, x86; derived from sol2-cn.asm. + +! Copyright (C) 1993, 1998 Free Software Foundation, Inc. +! Written By Fred Fish, Nov 1992 +! +! This file 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. +! +! In addition to the permissions in the GNU General Public License, the +! Free Software Foundation gives you unlimited permission to link the +! compiled version of this file with other programs, and to distribute +! those programs without any restriction coming from the use of this +! file. (The General Public License restrictions do apply in other +! respects; for example, they cover modification of the file, and +! distribution when not linked into another program.) +! +! This file 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; see the file COPYING. If not, write to +! the Free Software Foundation, 59 Temple Place - Suite 330, +! Boston, MA 02111-1307, USA. +! +! As a special exception, if you link this library with files +! compiled with GCC to produce an executable, this does not cause +! the resulting executable to be covered by the GNU General Public License. +! This exception does not however invalidate any other reasons why +! the executable file might be covered by the GNU General Public License. +! + +! This file just supplies returns for the .init and .fini sections. It is +! linked in after all other files. + + .file "crtn.o" + .ident "GNU C crtn.o" + + .section .init + ret $0x0 + + .section .fini + ret $0x0 diff --git a/gcc/config/i386/osf1elf.h b/gcc/config/i386/osf1elf.h new file mode 100644 index 00000000000..da61e8b5674 --- /dev/null +++ b/gcc/config/i386/osf1elf.h @@ -0,0 +1,260 @@ +/* OSF/1 1.3 now is compitable with SVR4, so include sysv4.h, and + put difference here. */ + +#include <stdio.h> +#include "i386/sysv4.h" /* Base i386 target machine definitions */ +#define _sys_siglist sys_siglist +extern char *sys_siglist[]; + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 OSF/1)"); + +/* WORD_SWITCH_TAKES_ARG defined in svr4 is not correct. We also + need an extra -soname */ +#undef WORD_SWITCH_TAKES_ARG +#define WORD_SWITCH_TAKES_ARG(STR) \ + (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ + || !strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \ + || !strcmp (STR, "Tbss") || !strcmp (STR, "soname")) + +/* Note, -fpic and -fPIC are equivalent */ +#undef CPP_SPEC +#define CPP_SPEC "\ +%{fpic: -D__SHARED__} %{fPIC: %{!fpic: -D__SHARED__}} \ +%{.S: %{!ansi:%{!traditional:%{!traditional-cpp:%{!ftraditional: -traditional}}}}} \ +%{.S: -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \ +%{.cc: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.cxx: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.C: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.m: -D__LANGUAGE_OBJECTIVE_C} \ +%{!.S: -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}}" + +/* -mmcount or -mno-mcount should be used with -pg or -p */ +#undef CC1_SPEC +#define CC1_SPEC "%{p: %{!mmcount: %{!mno-mcount: -mno-mcount }}} \ +%{!p: %{pg: %{!mmcount: %{!mno-mcount: -mno-mcount }}}}" + +/* Note, -D__NO_UNDERSCORES__ -D__ELF__ are provided in the older version of + OSF/1 gcc. We keep them here, so that old /usr/include/i386/asm.h works. + */ +#undef CPP_PREDEFINES +#define CPP_PREDEFINES \ + "-D__NO_UNDERSCORES__ -D__ELF__ -DOSF -DOSF1 -Di386 -Dunix -Asystem(xpg4) -Asystem(osf1) -Acpu(i386) -Amachine(i386)" + +/* current OSF/1 doesn't provide separate crti.o and gcrti.o (and also, crtn.o + and gcrtn.o) for profile. */ + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "%{!shared: \ + %{!symbolic: \ + %{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}}\ + crti.o%s \ + crtbegin.o%s" + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "crtend.o%s crtn.o%s" + +#undef ASM_SPEC +#define ASM_SPEC "%{v*: -v}" + +#undef LINK_SPEC +#define LINK_SPEC "%{v*: -v} \ + %{h*} %{z*} \ + %{dy:-call_shared} %{dn:-static} \ + %{static:-static} \ + %{shared:-shared} \ + %{call_shared:-call_shared} \ + %{symbolic:-Bsymbolic -shared -call_shared} \ + %{!dy: %{!dn: %{!static: %{!shared: %{!symbolic: \ + %{noshrlib: -static } \ + %{!noshrlib: -call_shared}}}}}}" + +#undef MD_EXEC_PREFIX +#define MD_EXEC_PREFIX "/usr/ccs/gcc/" + +#undef MD_STARTFILE_PREFIX +#define MD_STARTFILE_PREFIX "/usr/ccs/lib/" + +/* Define this macro meaning that gcc should find the library 'libgcc.a' + by hand, rather than passing the argument '-lgcc' to tell the linker + to do the search */ +#define LINK_LIBGCC_SPECIAL + +/* This goes with LINK_LIBGCC_SPECIAL, we need tell libgcc.a differently */ +#undef LIBGCC_SPEC +#define LIBGCC_SPEC "%{!shared:%{!symbolic:libgcc.a%s}}" + +/* A C statement to output assembler commands which will identify the object + file as having been compile with GNU CC. We don't need or want this for + OSF1. */ +#undef ASM_IDENTIFY_GCC +#define ASM_IDENTIFY_GCC(FILE) + +/* Identify the front-end which produced this file. To keep symbol + space down, and not confuse kdb, only do this if the language is + not C. */ +#define ASM_IDENTIFY_LANGUAGE(STREAM) \ +{ \ + if (strcmp (lang_identify (), "c") != 0) \ + output_lang_identify (STREAM); \ +} + +/* Specify size_t, ptrdiff_t, and wchar_t types. */ +#undef SIZE_TYPE +#undef PTRDIFF_TYPE +#undef WCHAR_TYPE +#undef WCHAR_TYPE_SIZE + +#define SIZE_TYPE "long unsigned int" +#define PTRDIFF_TYPE "int" +#define WCHAR_TYPE "unsigned int" +#define WCHAR_TYPE_SIZE BITS_PER_WORD + +/* Turn off long double being 96 bits. */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE 64 + +/* Work with OSF/1 profile */ +#define MASK_NO_MCOUNT 000200000000 /* profiling uses mcount_ptr */ + +#define TARGET_MCOUNT ((target_flags & MASK_NO_MCOUNT) == 0) + +#undef SUBTARGET_SWITCHES +#define SUBTARGET_SWITCHES \ + { "mcount", -MASK_NO_MCOUNT}, \ + { "no-mcount", MASK_NO_MCOUNT}, + +/* This macro generates the assembly code for function entry. + FILE is a stdio stream to output the code to. + SIZE is an int: how many units of temporary storage to allocate. + Refer to the array `regs_ever_live' to determine which registers + to save; `regs_ever_live[I]' is nonzero if register number I + is ever used in the function. This macro is responsible for + knowing which registers should not be saved even if used. + + We override it here to allow for the new profiling code to go before + the prologue and the old mcount code to go after the prologue (and + after %ebx has been set up for ELF shared library support). */ +#if 0 +#define OSF_PROFILE_BEFORE_PROLOGUE \ + (!TARGET_MCOUNT \ + && !current_function_needs_context \ + && (!flag_pic \ + || !frame_pointer_needed \ + || (!current_function_uses_pic_offset_table \ + && !current_function_uses_const_pool))) +#else +#define OSF_PROFILE_BEFORE_PROLOGUE 0 +#endif +#undef FUNCTION_PROLOGUE +#define FUNCTION_PROLOGUE(FILE, SIZE) \ +do \ + { \ + char *prefix = ""; \ + char *lprefix = LPREFIX; \ + int labelno = profile_label_no; \ + \ + if (profile_flag && OSF_PROFILE_BEFORE_PROLOGUE) \ + { \ + if (!flag_pic) \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall *%s_mcount_ptr\n", prefix); \ + } \ + \ + else \ + { \ + static int call_no = 0; \ + \ + fprintf (FILE, "\tcall %sPc%d\n", lprefix, call_no); \ + fprintf (FILE, "%sPc%d:\tpopl %%eax\n", lprefix, call_no); \ + fprintf (FILE, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-%sPc%d],%%eax\n", \ + lprefix, call_no++); \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%eax),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tmovl %s_mcount_ptr@GOT(%%eax),%%eax\n", \ + prefix); \ + fprintf (FILE, "\tcall *(%%eax)\n"); \ + } \ + } \ + \ + function_prologue (FILE, SIZE); \ + } \ +while (0) + +/* A C statement or compound statement to output to FILE some assembler code to + call the profiling subroutine `mcount'. Before calling, the assembler code + must load the address of a counter variable into a register where `mcount' + expects to find the address. The name of this variable is `LP' followed by + the number LABELNO, so you would generate the name using `LP%d' in a + `fprintf'. + + The details of how the address should be passed to `mcount' are determined + by your operating system environment, not by GNU CC. To figure them out, + compile a small program for profiling using the system's installed C + compiler and look at the assembler code that results. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ +do \ + { \ + if (!OSF_PROFILE_BEFORE_PROLOGUE) \ + { \ + char *prefix = ""; \ + char *lprefix = LPREFIX; \ + int labelno = LABELNO; \ + \ + /* Note that OSF/rose blew it in terms of calling mcount, \ + since OSF/rose prepends a leading underscore, but mcount's \ + doesn't. At present, we keep this kludge for ELF as well \ + to allow old kernels to build profiling. */ \ + \ + if (flag_pic \ + && !current_function_uses_pic_offset_table \ + && !current_function_uses_const_pool) \ + abort (); \ + \ + if (TARGET_MCOUNT && flag_pic) \ + { \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tcall *%smcount@GOT(%%ebx)\n", prefix); \ + } \ + \ + else if (TARGET_MCOUNT) \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall %smcount\n", prefix); \ + } \ + \ + else if (flag_pic && frame_pointer_needed) \ + { \ + fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n"); \ + fprintf (FILE, "\tpushl %%ecx\n"); \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tmovl _mcount_ptr@GOT(%%ebx),%%eax\n"); \ + fprintf (FILE, "\tcall *(%%eax)\n"); \ + fprintf (FILE, "\tpopl %%eax\n"); \ + } \ + \ + else if (frame_pointer_needed) \ + { \ + fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n"); \ + fprintf (FILE, "\tpushl %%ecx\n"); \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall *_mcount_ptr\n"); \ + fprintf (FILE, "\tpopl %%eax\n"); \ + } \ + \ + else \ + abort (); \ + } \ + } \ +while (0) + +#if defined (CROSS_COMPILE) && defined (HOST_BITS_PER_INT) && defined (HOST_BITS_PER_LONG) && defined (HOST_BITS_PER_LONGLONG) +#if (HOST_BITS_PER_INT==32) && (HOST_BITS_PER_LONG==64) && (HOST_BITS_PER_LONGLONG==64) +#define REAL_ARITHMETIC +#endif +#endif diff --git a/gcc/config/i386/osf1elfgdb.h b/gcc/config/i386/osf1elfgdb.h new file mode 100644 index 00000000000..af6efa2d0de --- /dev/null +++ b/gcc/config/i386/osf1elfgdb.h @@ -0,0 +1,7 @@ +/* Target definitions for GNU compiler for Intel 80386 running OSF/1 1.3+ + with gas and gdb. */ + +/* Use stabs instead of DWARF debug format. */ +#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG + +#include "i386/osf1elf.h" diff --git a/gcc/config/i386/rtemself.h b/gcc/config/i386/rtemself.h new file mode 100644 index 00000000000..6486102abdc --- /dev/null +++ b/gcc/config/i386/rtemself.h @@ -0,0 +1,169 @@ +/* Definitions for Intel 386 running Linux-based GNU systems with ELF format. + Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Contributed by Eric Youngdale. + Modified for stabs-in-ELF by H.J. Lu. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#define LINUX_DEFAULT_ELF + +/* A lie, I guess, but the general idea behind linux/ELF is that we are + supposed to be outputting something that will assemble under SVr4. + This gets us pretty close. */ +#include <i386/i386.h> /* Base i386 target machine definitions */ +#include <i386/att.h> /* Use the i386 AT&T assembler syntax */ +#include <linux.h> /* some common stuff */ + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 RTEMS with ELF)"); + +/* The svr4 ABI for the i386 says that records and unions are returned + in memory. */ +#undef DEFAULT_PCC_STRUCT_RETURN +#define DEFAULT_PCC_STRUCT_RETURN 1 + +/* This is how to output an element of a case-vector that is relative. + This is only used for PIC code. See comments by the `casesi' insn in + i386.md for an explanation of the expression this outputs. */ +#undef ASM_OUTPUT_ADDR_DIFF_ELT +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ + fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) + +/* Indicate that jump tables go in the text section. This is + necessary when compiling PIC code. */ +#define JUMP_TABLES_IN_TEXT_SECTION + +/* Copy this from the svr4 specifications... */ +/* Define the register numbers to be used in Dwarf debugging information. + The SVR4 reference port C compiler uses the following register numbers + in its Dwarf output code: + 0 for %eax (gnu regno = 0) + 1 for %ecx (gnu regno = 2) + 2 for %edx (gnu regno = 1) + 3 for %ebx (gnu regno = 3) + 4 for %esp (gnu regno = 7) + 5 for %ebp (gnu regno = 6) + 6 for %esi (gnu regno = 4) + 7 for %edi (gnu regno = 5) + The following three DWARF register numbers are never generated by + the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 + believes these numbers have these meanings. + 8 for %eip (no gnu equivalent) + 9 for %eflags (no gnu equivalent) + 10 for %trapno (no gnu equivalent) + It is not at all clear how we should number the FP stack registers + for the x86 architecture. If the version of SDB on x86/svr4 were + a bit less brain dead with respect to floating-point then we would + have a precedent to follow with respect to DWARF register numbers + for x86 FP registers, but the SDB on x86/svr4 is so completely + broken with respect to FP registers that it is hardly worth thinking + of it as something to strive for compatibility with. + The version of x86/svr4 SDB I have at the moment does (partially) + seem to believe that DWARF register number 11 is associated with + the x86 register %st(0), but that's about all. Higher DWARF + register numbers don't seem to be associated with anything in + particular, and even for DWARF regno 11, SDB only seems to under- + stand that it should say that a variable lives in %st(0) (when + asked via an `=' command) if we said it was in DWARF regno 11, + but SDB still prints garbage when asked for the value of the + variable in question (via a `/' command). + (Also note that the labels SDB prints for various FP stack regs + when doing an `x' command are all wrong.) + Note that these problems generally don't affect the native SVR4 + C compiler because it doesn't allow the use of -O with -g and + because when it is *not* optimizing, it allocates a memory + location for each floating-point variable, and the memory + location is what gets described in the DWARF AT_location + attribute for the variable in question. + Regardless of the severe mental illness of the x86/svr4 SDB, we + do something sensible here and we use the following DWARF + register numbers. Note that these are all stack-top-relative + numbers. + 11 for %st(0) (gnu regno = 8) + 12 for %st(1) (gnu regno = 9) + 13 for %st(2) (gnu regno = 10) + 14 for %st(3) (gnu regno = 11) + 15 for %st(4) (gnu regno = 12) + 16 for %st(5) (gnu regno = 13) + 17 for %st(6) (gnu regno = 14) + 18 for %st(7) (gnu regno = 15) +*/ +#undef DBX_REGISTER_NUMBER +#define DBX_REGISTER_NUMBER(n) \ +((n) == 0 ? 0 \ + : (n) == 1 ? 2 \ + : (n) == 2 ? 1 \ + : (n) == 3 ? 3 \ + : (n) == 4 ? 6 \ + : (n) == 5 ? 7 \ + : (n) == 6 ? 5 \ + : (n) == 7 ? 4 \ + : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ + : (-1)) + +/* Output assembler code to FILE to increment profiler label # LABELNO + for profiling a function entry. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ +{ \ + if (flag_pic) \ + { \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ + } \ + else \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall mcount\n"); \ + } \ +} + +#undef SIZE_TYPE +#define SIZE_TYPE "unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "int" + +#undef WCHAR_TYPE +#define WCHAR_TYPE "long int" + +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE BITS_PER_WORD + +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-Di386 -Drtems -D__rtems__ \ + -Asystem(rtems) -Acpu(i386) -Amachine(i386)" + +/* Get perform_* macros to build libgcc.a. */ +#include "i386/perform.h" + +/* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named + NAME whose size is SIZE bytes and alignment is ALIGN bytes. + Try to use asm_output_aligned_bss to implement this macro. */ + +#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ + asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "crt0.o%s" + +#undef ENDFILE_SPEC + diff --git a/gcc/config/i386/t-osf1elf b/gcc/config/i386/t-osf1elf new file mode 100644 index 00000000000..77c7df1a6df --- /dev/null +++ b/gcc/config/i386/t-osf1elf @@ -0,0 +1,18 @@ +# Assemble startup files. +crti.o: $(srcdir)/config/i386/osf1-ci.asm $(GCC_PASSES) + sed -e '/^!/d' <$(srcdir)/config/i386/osf1-ci.asm >crti.s + $(GCC_FOR_TARGET) -c -o crti.o crti.s +crtn.o: $(srcdir)/config/i386/osf1-cn.asm $(GCC_PASSES) + sed -e '/^!/d' <$(srcdir)/config/i386/osf1-cn.asm >crtn.s + $(GCC_FOR_TARGET) -c -o crtn.o crtn.s + +# The pushl in CTOR initialization interferes with frame pointer elimination. + +# We need to use -fPIC when we are using gcc to compile the routines in +# crtstuff.c. This is only really needed when we are going to use gcc/g++ +# to produce a shared library, but since we don't know ahead of time when +# we will be doing that, we just always use -fPIC when compiling the +# routines in crtstuff.c. + +CRTSTUFF_T_CFLAGS = -fPIC -fno-omit-frame-pointer +TARGET_LIBGCC2_CFLAGS = -fPIC diff --git a/gcc/config/i386/x-osf1elf b/gcc/config/i386/x-osf1elf new file mode 100644 index 00000000000..146738107f6 --- /dev/null +++ b/gcc/config/i386/x-osf1elf @@ -0,0 +1,8 @@ +# Defaults for OSF/1 1.3+ +CC = $(OLDCC) +CLIB = -lld +INSTALL = installbsd -c +OLDCC = /usr/ccs/gcc/gcc +X_CFLAGS = -static + +# FIXPROTO_DEFINES = -D_XOPEN_SOURCE diff --git a/gcc/config/i386/xm-bsd386.h b/gcc/config/i386/xm-bsd386.h deleted file mode 100644 index 7a823b96032..00000000000 --- a/gcc/config/i386/xm-bsd386.h +++ /dev/null @@ -1,11 +0,0 @@ -/* Configuration for GCC for Intel i386 running BSDI's BSD/386 as host. */ - -#include "i386/xm-i386.h" - -#define HAVE_STRERROR - -/* We have _sys_siglist, but the declaration in <signal.h> conflicts with - the declarations in collect2.c so disable the declarations - in those files. */ - -#define DONT_DECLARE_SYS_SIGLIST diff --git a/gcc/config/i386/xm-dgux.h b/gcc/config/i386/xm-dgux.h deleted file mode 100644 index 5bdb9be0ebb..00000000000 --- a/gcc/config/i386/xm-dgux.h +++ /dev/null @@ -1,12 +0,0 @@ - -/* Configuration for GCC for Intel i386 running DG/ux */ - -/* looks just like sysv4 for now */ - -#include "i386/xm-i386.h" -#include "xm-svr4.h" - -/* If not compiled with GNU C, use the portable alloca. */ -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif diff --git a/gcc/config/i386/xm-freebsd.h b/gcc/config/i386/xm-freebsd.h deleted file mode 100644 index 007a609f263..00000000000 --- a/gcc/config/i386/xm-freebsd.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running FreeBSD as host. */ - -#include <i386/xm-i386.h> -#include <xm-freebsd.h> diff --git a/gcc/config/i386/xm-gnu.h b/gcc/config/i386/xm-gnu.h deleted file mode 100644 index 0b5985f9065..00000000000 --- a/gcc/config/i386/xm-gnu.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Configuration for GCC for Intel i386 running GNU as host. */ - -#include <i386/xm-i386.h> -#include <xm-gnu.h> - diff --git a/gcc/config/i386/xm-netbsd.h b/gcc/config/i386/xm-netbsd.h deleted file mode 100644 index 3a9f3241990..00000000000 --- a/gcc/config/i386/xm-netbsd.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running NetBSD as host. */ - -#include <i386/xm-i386.h> -#include <xm-netbsd.h> diff --git a/gcc/config/i386/xm-osf1elf.h b/gcc/config/i386/xm-osf1elf.h new file mode 100644 index 00000000000..69ca9c14c00 --- /dev/null +++ b/gcc/config/i386/xm-osf1elf.h @@ -0,0 +1,6 @@ +/* Configuration for GCC for Intel i386 running OSF/1 1.3. */ + +#ifndef HZ +#include <machine/machtime.h> +#define HZ DEFAULT_CLK_TCK +#endif diff --git a/gcc/config/i386/xm-sysv3.h b/gcc/config/i386/xm-sysv3.h deleted file mode 100644 index 72078bb1feb..00000000000 --- a/gcc/config/i386/xm-sysv3.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running System V Release 3. */ - -#include "i386/xm-i386.h" -#include "xm-svr3.h" diff --git a/gcc/config/i386/xm-winnt.h b/gcc/config/i386/xm-winnt.h deleted file mode 100644 index d36d2cdb11e..00000000000 --- a/gcc/config/i386/xm-winnt.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Configuration for GNU compiler - for an Intel i386 or later processor running Windows NT 3.x. - Copyright (C) 1994 Free Software Foundation, Inc. - Contributed by Douglas B. Rupp (drupp@cs.washington.edu) - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "winnt/xm-winnt.h" -#include "i386/xm-i386.h" diff --git a/gcc/config/i860/xm-fx2800.h b/gcc/config/i860/xm-fx2800.h deleted file mode 100644 index f1ab6d8c9c5..00000000000 --- a/gcc/config/i860/xm-fx2800.h +++ /dev/null @@ -1,7 +0,0 @@ -/* Alliant FX/2800 running Concentrix 2.x. */ - -/* vfprintf is not present prior to Concentrix 2.2. Unfortunately, there - does not seem to be a cpp symbol that identifies OS revision. Undefine - the following if running 2.1 or older. */ - -#define HAVE_VPRINTF diff --git a/gcc/config/m68k/xm-altos3068.h b/gcc/config/m68k/xm-altos3068.h deleted file mode 100644 index 294f5645b5e..00000000000 --- a/gcc/config/m68k/xm-altos3068.h +++ /dev/null @@ -1,7 +0,0 @@ -#define USG - -#include "m68k/xm-m68k.h" - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) diff --git a/gcc/config/m68k/xm-amix.h b/gcc/config/m68k/xm-amix.h deleted file mode 100644 index 69b4bd17c74..00000000000 --- a/gcc/config/m68k/xm-amix.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Definitions of host machine for GNU compiler. - Commodore Amiga A3000UX version. - - Copyright (C) 1991 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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 1, or (at your option) -any later version. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "m68k/xm-m68kv.h" /* Use the System V flavor of m68k host */ - -#define HAVE_VPRINTF /* Host has vprintf() in library */ -#define rindex strrchr -#define index strchr - -/* Define FULL_PROTOTYPES for protoize.c, to get <unistd.h> included. - We need this file for things like R_OK, not necessarily prototypes. */ - -#define FULL_PROTOTYPES - -#if defined (__GNUC__) && __GNUC__ == 1 -#define alloca __builtin_alloca -#endif - -#if 0 /* I don't want individual ports to be inconsistent about this. - I regard fancy_abort as a half-solution and not the right way - to do things. --rms. */ -/* The m88k and mips ports make use of fancy_abort to give possibly helpful - abort information rather than just dumping core. They do it in their - tm-* files. It seems more logical that this is a characteristic of - the host machine and not the target machine, so we do it here. */ - -#define abort fancy_abort /* give possibly helpful abort info */ -#endif diff --git a/gcc/config/m68k/xm-aux.h b/gcc/config/m68k/xm-aux.h deleted file mode 100644 index 5ac1f4654d8..00000000000 --- a/gcc/config/m68k/xm-aux.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef USG -#define USG -#endif - -#ifndef AUX -#define AUX -#endif - -#include "m68k/xm-m68k.h" diff --git a/gcc/config/m68k/xm-hp320.h b/gcc/config/m68k/xm-hp320.h deleted file mode 100644 index d724c3a26c8..00000000000 --- a/gcc/config/m68k/xm-hp320.h +++ /dev/null @@ -1,19 +0,0 @@ -/* USG is needed to prevent trying to use getrusage and getwd. */ -#define USG - -#include "m68k/xm-m68k.h" - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) -#define rindex strrchr -#define index strchr - -/* If compiling with HPUX compiler, we are probably using alloca.c, - so help it work right. */ -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif - -/* Don't try to use sys_siglist. */ -#define NO_SYS_SIGLIST diff --git a/gcc/config/m68k/xm-linux.h b/gcc/config/m68k/xm-linux.h deleted file mode 100644 index 3b1050673fa..00000000000 --- a/gcc/config/m68k/xm-linux.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Motorola m68k running Linux. */ - -#include <m68k/xm-m68k.h> -#include <xm-linux.h> diff --git a/gcc/config/m68k/xm-m68kv.h b/gcc/config/m68k/xm-m68kv.h deleted file mode 100644 index ce3cf665e81..00000000000 --- a/gcc/config/m68k/xm-m68kv.h +++ /dev/null @@ -1,15 +0,0 @@ -/* Host environment for 68000's running System V. */ - -#include "m68k/xm-m68k.h" - -#define USG -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) - -#define rindex strrchr -#define index strchr - -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif diff --git a/gcc/config/m68k/xm-netbsd.h b/gcc/config/m68k/xm-netbsd.h deleted file mode 100644 index 27a33cd5b83..00000000000 --- a/gcc/config/m68k/xm-netbsd.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Motorola 68k running NetBSD as host. */ - -#include <m68k/xm-m68k.h> -#include <xm-netbsd.h> diff --git a/gcc/config/m68k/xm-sun3.h b/gcc/config/m68k/xm-sun3.h deleted file mode 100644 index eafe716e93b..00000000000 --- a/gcc/config/m68k/xm-sun3.h +++ /dev/null @@ -1,5 +0,0 @@ -/* Configuration for GCC for Motorola m68k on sun3. */ - -#define HAVE_POPEN - -#include "m68k/xm-m68k.h" diff --git a/gcc/config/m68k/xm-tower.h b/gcc/config/m68k/xm-tower.h deleted file mode 100644 index fcb456fa621..00000000000 --- a/gcc/config/m68k/xm-tower.h +++ /dev/null @@ -1,4 +0,0 @@ -#include "m68k/xm-m68k.h" -#include "xm-svr3.h" - -#define HAVE_VPRINTF diff --git a/gcc/config/mips/elflorion.h b/gcc/config/mips/elflorion.h deleted file mode 100644 index 4b7f111873f..00000000000 --- a/gcc/config/mips/elflorion.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Definitions of target machine for GNU compiler. MIPS ORION version with - GOFAST floating point library. - Copyright (C) 1994 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#define MIPS_CPU_STRING_DEFAULT "orion" - -#include "mips/elfl64.h" diff --git a/gcc/config/mips/nws3250v4.h b/gcc/config/mips/nws3250v4.h deleted file mode 100644 index 611effe02a1..00000000000 --- a/gcc/config/mips/nws3250v4.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Definitions of target machine for GNU compiler. Sony RISC NEWS (mips) - Copyright (C) 1991 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#define MIPS_NEWS - -#define CPP_PREDEFINES "\ --Dmips -Dhost_mips -Dsony -Dsonyrisc -Dunix \ --DLANGUAGE_C -DMIPSEB -DSYSTYPE_SYSV \ --Asystem(unix) -Asystem(svr3) -Acpu(mips) -Amachine(mips)" - -#define MD_STARTFILE_PREFIX "/usr/ccs/lib/" - -#define LIB_SPEC "%{p:-lprof1} %{pg:-lprof1} -lc crtn.o%s values-Xt.o%s" - -#define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt1.o%s}}" - -#define MACHINE_TYPE "RISC NEWS-OS SVr4" - -#include "mips/mips.h" diff --git a/gcc/config/mips/r3900.h b/gcc/config/mips/r3900.h new file mode 100644 index 00000000000..c1867430129 --- /dev/null +++ b/gcc/config/mips/r3900.h @@ -0,0 +1,71 @@ +/* Definitions of MIPS sub target machine for GNU compiler. + Toshiba r3900. You should include mips.h after this. + + Copyright (C) 1989, 90-6, 1997 Free Software Foundation, Inc. + Contributed by Gavin Koch (gavin@cygnus.com). + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#define SUBTARGET_CPP_SPEC "\ +%{!mabi=32: %{!mabi=n32: %{!mabi=64: -D__mips_eabi}}} \ +%{!msingle-float:-D__mips_soft_float} \ +%{mhard-float:%e-mhard-float not supported.} \ +%{msingle-float:%{msoft-float: \ + %e-msingle-float and -msoft-float can not both be specified.}}" + +/* The following is needed because -mips3 and -mips4 set gp64 which in + combination with abi=eabi, causes long64 to be set. */ +#define SUBTARGET_CPP_SIZE_SPEC "\ +%{mips3:-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int} \ +%{mips4:-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int} \ +%{!mips3:%{!mips4:%{!m4650:\ + -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int}}} " + +/* by default (if not mips-something-else) produce code for the r3900 */ +#define SUBTARGET_CC1_SPEC "\ +%{mhard-float:%e-mhard-float not supported.} \ +%{msingle-float:%{msoft-float: \ + %e-msingle-float and -msoft-float can not both be specified.}}" + +#define TARGET_DEFAULT (MASK_SOFT_FLOAT | MASK_MIPS3900) +#define MIPS_CPU_STRING_DEFAULT "R3900" +#define MIPS_ISA_DEFAULT 1 + +#define MULTILIB_DEFAULTS { "EB", "mips1", "msoft-float" } + +/* We use the MIPS EABI by default. */ +#define MIPS_ABI_DEFAULT ABI_EABI + + +/* Debugging */ + +#define DWARF2_DEBUGGING_INFO +#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG + +/* For the 'preferred' cases ("gN" and "ggdbN") we need to tell the + gnu assembler "dwarf-2" */ + +#define SUBTARGET_ASM_DEBUGGING_SPEC "\ +%{!mmips-as: \ + %{g:-gdwarf-2} %{g0:-gdwarf-2} %{g1:-gdwarf-2} %{g2:-gdwarf-2} %{g3:-gdwarf-2} \ + %{ggdb:-gdwarf-2} %{ggdb0:-gdwarf-2} %{ggdb1:-gdwarf-2} %{ggdb2:-gdwarf-2} %{ggdb3:-gdwarf-2} \ + %{gdwarf-2*:-gdwarf-2}} \ +%{gstabs:-g} %{gstabs0:-g0} %{gstabs1:-g1} %{gstabs2:-g2} %{gstabs3:-g3} \ +%{gstabs+:-g} %{gstabs+0:-g0} %{gstabs+1:-g1} %{gstabs+2:-g2} %{gstabs+3:-g3} \ +%{gcoff:-g} %{gcoff0:-g0} %{gcoff1:-g1} %{gcoff2:-g2} %{gcoff3:-g3}" + diff --git a/gcc/config/mips/xm-iris3.h b/gcc/config/mips/xm-iris3.h deleted file mode 100644 index 3d2a59a1447..00000000000 --- a/gcc/config/mips/xm-iris3.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "mips/xm-mips.h" - -#define USG - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) - diff --git a/gcc/config/mips/xm-iris4.h b/gcc/config/mips/xm-iris4.h deleted file mode 100644 index e12c226614e..00000000000 --- a/gcc/config/mips/xm-iris4.h +++ /dev/null @@ -1,18 +0,0 @@ -#include "mips/xm-mips.h" - -#define USG -#define HAVE_VPRINTF - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) - -#if 0 -#ifdef __GNUC__ -/* The normal irix compiler requires alloca.h or alloca doesn't work. - However, the IRIX compiler doesn't allow alloca to be stored in - something like ptr->field = alloca(), so we just use the normal - C alloca. */ -#include <alloca.h> -#endif -#endif diff --git a/gcc/config/mips/xm-netbsd.h b/gcc/config/mips/xm-netbsd.h deleted file mode 100644 index b9d3c709d9d..00000000000 --- a/gcc/config/mips/xm-netbsd.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "mips/xm-mips.h" -#include "config/xm-netbsd.h" diff --git a/gcc/config/mips/xm-news.h b/gcc/config/mips/xm-news.h deleted file mode 100644 index 9409d7fe0a6..00000000000 --- a/gcc/config/mips/xm-news.h +++ /dev/null @@ -1,6 +0,0 @@ -/* This file is for the Sony Mips News running "NewsOS Version 5", - which is really System V. */ -#include "mips/xm-sysv.h" - -/* Sony has a funny name for this symbol. */ -#define sys_siglist _sys_siglist diff --git a/gcc/config/mips/xm-nws3250v4.h b/gcc/config/mips/xm-nws3250v4.h deleted file mode 100644 index 34ab631acb4..00000000000 --- a/gcc/config/mips/xm-nws3250v4.h +++ /dev/null @@ -1,9 +0,0 @@ -#define USG - -#include "xm-mips.h" - -/* If compiling with mips compiler, we are probably using alloca.c, - so help it work right. */ -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif diff --git a/gcc/config/mips/xm-sysv4.h b/gcc/config/mips/xm-sysv4.h deleted file mode 100644 index 490a7722995..00000000000 --- a/gcc/config/mips/xm-sysv4.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "mips/xm-sysv.h" - -/* SVR4 provides no sys_siglist, - but does offer the same data under another name. */ -#define sys_siglist _sys_siglist - -/* There is a declaration in /usr/include/signal.h that conflicts with the - declarations in collect2.c and mips-tfile.c, so disable gcc's declarations. - This is at least true for CDC's EP/IX 2.1.1. It is suspected to be true - for RISC/OS 5.x also. */ -#define DONT_DECLARE_SYS_SIGLIST diff --git a/gcc/config/ns32k/xm-genix.h b/gcc/config/ns32k/xm-genix.h deleted file mode 100644 index 76be3b76fc8..00000000000 --- a/gcc/config/ns32k/xm-genix.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Config file for ns32k running system V. */ - -#include "ns32k/xm-ns32k.h" - -#define USG - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) diff --git a/gcc/config/ns32k/xm-netbsd.h b/gcc/config/ns32k/xm-netbsd.h deleted file mode 100644 index 4040751d1d9..00000000000 --- a/gcc/config/ns32k/xm-netbsd.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Configuration for GCC for ns32k running NetBSD as host. */ - -#include <ns32k/xm-ns32k.h> - -/* ns32k/xm-ns32k.h defines these macros, but we don't need them */ -#undef memcmp -#undef memcpy -#undef memset - -#include <xm-netbsd.h> diff --git a/gcc/config/xm-svr3.h b/gcc/config/sh/rtems.h index ac1000fb1cb..5cbdf9bb51a 100644 --- a/gcc/config/xm-svr3.h +++ b/gcc/config/sh/rtems.h @@ -1,5 +1,7 @@ -/* Configuration for GNU C-compiler for hosts running System V Release 3 - Copyright (C) 1991, 1993 Free Software Foundation, Inc. +/* Definitions for rtems targetting a SH using elf. + + Copyright (C) 1996 Free Software Foundation, Inc. + Contributed by Joel Sherrill (joel@OARcorp.com). This file is part of GNU CC. @@ -18,16 +20,16 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define bcopy(src,dst,len) memcpy ((dst),(src),(len)) -#define bzero(dst,len) memset ((dst),0,(len)) -#define bcmp(left,right,len) memcmp ((left),(right),(len)) +#include "sh/elf.h" + +/* Specify predefined symbols in preprocessor. */ -#define rindex strrchr -#define index strchr +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-D__sh__ -D__ELF__ -Drtems -D__rtems__ \ + -Asystem(rtems) -Acpu(sh) -Amachine(sh)" -#define USG -#define HAVE_VPRINTF +#undef SUBTARGET_SWITCHES +#define SUBTARGET_SWITCHES \ + { "rtems", 0 }, -#ifndef SVR3 -#define SVR3 -#endif +/* end of sparc/rtems.h */ diff --git a/gcc/config/mips/xm-sysv.h b/gcc/config/sparc/elf.h index 170538fb682..70cb26a93be 100644 --- a/gcc/config/mips/xm-sysv.h +++ b/gcc/config/sparc/elf.h @@ -1,5 +1,6 @@ -/* Configuration for GNU C-compiler for UMIPS operating system - Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. +/* Definitions of target machine for GNU compiler, + for SPARC running in an embedded environment using the ELF file format. + Copyright (C) 1997 Free Software Foundation, Inc. This file is part of GNU CC. @@ -18,21 +19,24 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - * Notes for compiling gcc on umips (v3.0) - * - change the -g in the CFLAGS to a -g3 or take it out all together. - * - do not define DBX_DEBUGGING_INFO in tm.h, it doesn't exist (unless - * you get one from a bsd system) - */ +#include "sol2.h" -#define USG +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-Dsparc -D__elf__ -Acpu(sparc) -Amachine(sparc)" -#include "mips/xm-mips.h" +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "crt0.o%s crti.o%s crtbegin.o%s" -#define bcopy(a,b,c) memcpy((b),(a),(c)) -#define bzero(a,b) memset((a),0,(b)) -#define bcmp(a,b,c) memcmp((a),(b),(c)) +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "crtend.o%s crtn.o%s" -#define rindex strrchr -#define index strchr +/* Use the default. */ +#undef LINK_SPEC +/* Don't set the target flags, this is done by the linker script */ +#undef LIB_SPEC +#define LIB_SPEC "" + +/* FIXME: until fixed */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE 64 diff --git a/gcc/config/i386/xm-sun.h b/gcc/config/sparc/hal.h index d2e714ecf5c..0222b819e0e 100644 --- a/gcc/config/i386/xm-sun.h +++ b/gcc/config/sparc/hal.h @@ -1,5 +1,7 @@ -/* Configuration for GNU C-compiler for Intel 80386 running SunOS 4.0. - Copyright (C) 1988 Free Software Foundation, Inc. +/* Definitions of target machine for GNU compiler, for HAL + SPARC running Solaris 2 HALOS + Copyright 1998 Free Software Foundation, Inc. + Contributed by Carol LePage (carolo@hal.com) This file is part of GNU CC. @@ -18,10 +20,14 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define USG +/* Need different command line for assembler */ -#include "i386/xm-i386.h" +#undef ASM_SPEC +#define ASM_SPEC \ + "%{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -e1 \ + %{fpic:-K PIC} %{fPIC:-K PIC}" -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) +/* Need DWARF for debuggers. */ + +#undef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h new file mode 100644 index 00000000000..cf6015d3adb --- /dev/null +++ b/gcc/config/sparc/linux64.h @@ -0,0 +1,238 @@ +/* Definitions for 64-bit SPARC running Linux with ELF + Copyright 1996, 1997 Free Software Foundation, Inc. + Contributed by David S. Miller (davem@caip.rutgers.edu) + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#define LINUX_DEFAULT_ELF + +/* This is a v9 only compiler. -mv8 is not expected to work. If you want + a v8/v9 compiler, this isn't the place to do it. */ + +#define SPARC_V9 1 /* See sparc.h. */ +#define SPARC_ARCH64 1 + +/* Don't assume anything about the header files. */ +#define NO_IMPLICIT_EXTERN_C + +#undef HAVE_ATEXIT +#define HAVE_ATEXIT + +#include <sparc/sysv4.h> + +#undef MD_EXEC_PREFIX +#undef MD_STARTFILE_PREFIX + +/* Output at beginning of assembler file. */ +/* The .file command should always begin the output. */ +#undef ASM_FILE_START +#define ASM_FILE_START(FILE) \ + do { \ + output_file_directive (FILE, main_input_filename); \ + fprintf (FILE, "\t.version\t\"01.01\"\n"); \ + } while (0) + +#undef ASM_DEFAULT_SPEC +#define ASM_DEFAULT_SPEC "-Av9a" + +#undef LIBGCC_SPEC +#define LIBGCC_SPEC \ + "%{!shared:-lgcc}" + +/* Provide a STARTFILE_SPEC appropriate for Linux. Here we add + the Linux magical crtbegin.o file (see crtstuff.c) which + provides part of the support for getting C++ file-scope static + object constructed before entering `main'. */ + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC \ + "%{!shared: \ + %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\ + crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" + +/* Provide a ENDFILE_SPEC appropriate for Linux. Here we tack on + the Linux magical crtend.o file (see crtstuff.c) which + provides part of the support for getting C++ file-scope static + object constructed before entering `main', followed by a normal + Linux "finalizer" file, `crtn.o'. */ + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (sparc64 Linux/ELF)"); + +/* A v9 compiler with stack-bias, 32 bit integers, 64 bit longs and + 64 bit pointers, in a Medium/Anywhere code model environment. */ + +#undef TARGET_DEFAULT +#define TARGET_DEFAULT \ + (MASK_V9 + MASK_ARCH64 + MASK_LONG64 + MASK_PTR64 /* + MASK_HARD_QUAD */ \ + + MASK_STACK_BIAS + MASK_MEDANY + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU) + +#undef SIZE_TYPE +#define SIZE_TYPE "long long unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "long long int" + +#undef WCHAR_TYPE +#define WCHAR_TYPE "long int" + +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE BITS_PER_WORD + +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-D__sparc__ -D__sparc__ -D__sparc_v9__ -D__arch64__ -D__ELF__ -Dunix -Dsparc -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(sparc) -Amachine(sparc)" + +#undef CPP_SPEC +#define CPP_SPEC "\ +%{fPIC:-D__PIC__ -D__pic__} \ +%{fpic:-D__PIC__ -D__pic__} \ +%{mint64:-D__INT_MAX__=9223372036854775807LL -D__LONG_MAX__=9223372036854775807LL} \ +%{mlong64:-D__LONG_MAX__=9223372036854775807LL} \ +%{mlittle-endian:-D__LITTLE_ENDIAN__} \ +%{msparclite:-D__sparclite__} \ +%{mv8:-D__sparc_v8__} \ +%{msupersparc:-D__supersparc__ -D__sparc_v8__} \ +%{posix:-D_POSIX_SOURCE} \ +" +/* We no longer link with libc_p.a or libg.a by default. If you + * want to profile or debug the Linux C library, please add + * -lc_p or -ggdb to LDFLAGS at the link time, respectively. + */ +#undef LIB_SPEC +#define LIB_SPEC \ + "%{!shared: %{mieee-fp:-lieee} %{p:-lgmon} %{pg:-lgmon} \ + %{!ggdb:-lc} %{ggdb:-lg}}" + +/* Provide a LINK_SPEC appropriate for Linux. Here we provide support + for the special GCC options -static and -shared, which allow us to + link things in one of these three modes by applying the appropriate + combinations of options at link-time. We like to support here for + as many of the other GNU linker options as possible. But I don't + have the time to search for those flags. I am sure how to add + support for -soname shared_object_name. H.J. + + I took out %{v:%{!V:-V}}. It is too much :-(. They can use + -Wl,-V. + + When the -shared link option is used a final link is not being + done. */ + +/* If ELF is the default format, we should not use /lib/elf. */ + +#undef LINK_SPEC +#define LINK_SPEC "-m elf64_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}} \ +%{mlittle-endian:-EL} \ +" + +/* The sun bundled assembler doesn't accept -Yd, (and neither does gas). + It's safe to pass -s always, even if -g is not used. */ +#undef ASM_SPEC +#define ASM_SPEC "\ +%{V} \ +%{v:%{!V:-V}} \ +%{!Qn:-Qy} \ +%{n} \ +%{T} \ +%{Ym,*} \ +%{Wa,*:%*} \ +-s %{fpic:-K PIC} %{fPIC:-K PIC} \ +%{mlittle-endian:-EL} \ +%(asm_cpu) \ +" + +/* Same as sparc.h */ +#undef DBX_REGISTER_NUMBER +#define DBX_REGISTER_NUMBER(REGNO) (REGNO) + +/* System V Release 4 uses DWARF debugging info. Buf DWARF1 doesn't do + 64-bit anything, so we use DWARF2. */ + +#undef DWARF2_DEBUGGING_INFO +#undef DWARF_DEBUGGING_INFO +#undef DBX_DEBUGGING_INFO +#define DWARF2_DEBUGGING_INFO +#define DBX_DEBUGGING_INFO + +#undef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG + +#undef ASM_OUTPUT_ALIGNED_LOCAL +#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ +do { \ + fputs ("\t.local\t", (FILE)); \ + assemble_name ((FILE), (NAME)); \ + putc ('\n', (FILE)); \ + ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ +} while (0) + +#undef COMMON_ASM_OP +#define COMMON_ASM_OP "\t.common" + +/* This is how to output a definition of an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. */ + +#undef ASM_OUTPUT_INTERNAL_LABEL +#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ + fprintf (FILE, ".L%s%d:\n", PREFIX, NUM) + +/* This is how to output a reference to an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. */ + +#undef ASM_OUTPUT_INTERNAL_LABELREF +#define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \ + fprintf (FILE, ".L%s%d", PREFIX, NUM) + +/* This is how to store into the string LABEL + the symbol_ref name of an internal numbered label where + PREFIX is the class of label and NUM is the number within the class. + This is suitable for output with `assemble_name'. */ + +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ + sprintf (LABEL, "*.L%s%d", PREFIX, NUM) + +/* Stabs doesn't use this, and it confuses a simulator. */ +/* ??? Need to see what DWARF needs, if anything. */ +#undef ASM_IDENTIFY_GCC +#define ASM_IDENTIFY_GCC(FILE) + +/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. + ??? If ints are 64 bits then UNALIGNED_INT_ASM_OP (defined elsewhere) is + misnamed. These should all refer to explicit sizes (half/word/xword?), + anything other than short/int/long/etc. */ + +#define UNALIGNED_DOUBLE_INT_ASM_OP ".uaxword" + +/* DWARF bits. */ + +/* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. + Obviously the Dwarf2 folks havn't tried to actually build systems + with their spec. On a 64-bit system, only 64-bit relocs become + RELATIVE relocations. */ + +/* #define DWARF_OFFSET_SIZE PTR_SIZE */ diff --git a/gcc/config/sparc/sol2-sld.h b/gcc/config/sparc/sol2-sld.h new file mode 100644 index 00000000000..90c5ca65724 --- /dev/null +++ b/gcc/config/sparc/sol2-sld.h @@ -0,0 +1,18 @@ +/* Definitions of target machine for GNU compiler, for SPARC running Solaris 2 + using the system linker. */ + +#include "sparc/sol2.h" + +/* Disable any support for DWARF and DWARF2 if we are using the system linker. + At least up through Solaris 2.6, + the system linker does not work with DWARF or DWARF2, + since it does not have working support for relocations + to unaligned data. */ + +#ifdef DWARF2_DEBUGGING_INFO +#undef DWARF2_DEBUGGING_INFO +#endif + +#ifdef DWARF_DEBUGGING_INFO +#undef DWARF_DEBUGGING_INFO +#endif diff --git a/gcc/config/arm/xm-linux.h b/gcc/config/sparc/sun4gas.h index 955379dab16..3cea9560b4f 100644 --- a/gcc/config/arm/xm-linux.h +++ b/gcc/config/sparc/sun4gas.h @@ -1,6 +1,5 @@ -/* Configuration for GCC for Intel i386 running Linux. - Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. - Contributed by H.J. Lu (hjl@nynexst.com) +/* Definitions of target machine for GNU compiler, for SunOS 4.x with gas + Copyright (C) 1997 Free Software Foundation, Inc. This file is part of GNU CC. @@ -19,6 +18,10 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <arm/xm-arm.h> -#include <xm-linux.h> +/* gas supports unaligned data. */ +#define UNALIGNED_DOUBLE_INT_ASM_OP ".uaxword" +#define UNALIGNED_INT_ASM_OP ".uaword" +#define UNALIGNED_SHORT_ASM_OP ".uahalf" +/* defaults.h will define DWARF2_UNWIND_INFO for us. */ +#undef DWARF2_UNWIND_INFO diff --git a/gcc/config/sparc/t-elf b/gcc/config/sparc/t-elf new file mode 100644 index 00000000000..da9df38368e --- /dev/null +++ b/gcc/config/sparc/t-elf @@ -0,0 +1,39 @@ +# we need to supply our own assembly versions of libgcc1.c files, +# since the user may not have native 'cc' available + +CROSS_LIBGCC1 = libgcc1-asm.a +LIB1ASMSRC = sparc/lb1spc.asm +LIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3 + +# crt0 is built elsewhere +LIBGCC1_TEST = + +# These are really part of libgcc1, but this will cause them to be +# built correctly, so... + +LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c + +dp-bit.c: $(srcdir)/config/fp-bit.c + cat $(srcdir)/config/fp-bit.c > dp-bit.c + +fp-bit.c: $(srcdir)/config/fp-bit.c + echo '#define FLOAT' > fp-bit.c + cat $(srcdir)/config/fp-bit.c >> fp-bit.c + +# MULTILIB_OPTIONS should have msparclite too, but we'd have to make +# gas build... +#MULTILIB_OPTIONS = msoft-float mcpu=v8 +MULTILIB_OPTIONS = msoft-float +#MULTILIB_DIRNAMES = soft v8 +MULTILIB_DIRNAMES = soft +#MULTILIB_MATCHES = msoft-float=mno-fpu mcpu?v8=mv8 +MULTILIB_MATCHES = msoft-float=mno-fpu + +LIBGCC = stmp-multilib +INSTALL_LIBGCC = install-multilib + +# Assemble startup files. +crti.o: $(srcdir)/config/sparc/sol2-ci.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crti.o -x assembler $(srcdir)/config/sparc/sol2-ci.asm +crtn.o: $(srcdir)/config/sparc/sol2-cn.asm $(GCC_PASSES) + $(GCC_FOR_TARGET) -c -o crtn.o -x assembler $(srcdir)/config/sparc/sol2-cn.asm diff --git a/gcc/config/sparc/t-halos b/gcc/config/sparc/t-halos new file mode 100644 index 00000000000..0bd5496ac23 --- /dev/null +++ b/gcc/config/sparc/t-halos @@ -0,0 +1,2 @@ +# For a native HALOS compile, we need to set -e1 for the assembler +AS=as -e1 diff --git a/gcc/config/sparc/xm-netbsd.h b/gcc/config/sparc/xm-netbsd.h deleted file mode 100644 index 5f11b8d2f48..00000000000 --- a/gcc/config/sparc/xm-netbsd.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Sun SPARC running NetBSD as host. */ - -#include <sparc/xm-sparc.h> -#include <xm-netbsd.h> diff --git a/gcc/config/sparc/xm-pbd.h b/gcc/config/sparc/xm-pbd.h deleted file mode 100644 index dad9fdc6b34..00000000000 --- a/gcc/config/sparc/xm-pbd.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Host environment for the tti "Unicom" PBB 68020 boards */ - -#include "sparc/xm-sparc.h" - -#define USG -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) - -#ifndef __GNUC__ -#define USE_C_ALLOCA -#endif - diff --git a/gcc/config/i386/xm-linux.h b/gcc/config/sparc/xm-sp64.h index 42f097ddc6c..5954affa3b5 100644 --- a/gcc/config/i386/xm-linux.h +++ b/gcc/config/sparc/xm-sp64.h @@ -1,6 +1,5 @@ -/* Configuration for GCC for Intel i386 running Linux. - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. - Contributed by H.J. Lu (hjl@nynexst.com) +/* Configuration for GCC for Sparc v9 running 64-bit native. + Copyright (C) 1997 Free Software Foundation, Inc. This file is part of GNU CC. @@ -19,6 +18,8 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include <i386/xm-i386.h> -#include <xm-linux.h> +#include <sparc/xm-sparc.h> +/* This describes the machine the compiler is hosted on. */ +#undef HOST_BITS_PER_LONG +#define HOST_BITS_PER_LONG 64 diff --git a/gcc/config/v850/lib1funcs.asm b/gcc/config/v850/lib1funcs.asm new file mode 100644 index 00000000000..d441590678f --- /dev/null +++ b/gcc/config/v850/lib1funcs.asm @@ -0,0 +1,1271 @@ +/* CYGNUS LOCAL entire file v850/law */ +/* libgcc1 routines for NEC V850. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file with other programs, and to distribute +those programs without any restriction coming from the use of this +file. (The General Public License restrictions do apply in other +respects; for example, they cover modification of the file, and +distribution when not linked into another program.) + +This file 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; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this library with files + compiled with GCC to produce an executable, this does not cause + the resulting executable to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +#ifdef L_mulsi3 + .text + .globl ___mulsi3 + .type ___mulsi3,@function + +/* + * In order to not deal with negative numbers (mulh is a signed multiply + * and we want an unsigned multiply, code the multiplication as a series + * of 7 bit multiplies). + * + * int __mulsi3 (unsigned a, unsigned b) + * { + * int i, j; + * int ret = 0; + * + * for (i = 0; i < 32; i += 7) + * { + * short a_part = a & 0x7f; + * unsigned b_tmp = b; + * a >>= 7; + * + * for (j = 0; (i+j) < 32; j += 7) + * { + * short b_part = b_tmp & 0x7f; + * ret += (((int)a_part) * ((int)b_part)) << (i+j); + * b_tmp >>= 7; + * } + * } + * + * return ret; + * } + */ + +___mulsi3: + mov 0,r10 /* total */ + mov 0,r14 /* i = 0, index for multiply a's part */ + movea lo(31),r0,r16 /* upper bounds for loop */ +.L5: + mov r7,r13 /* b_tmp = b */ + andi 0x7f,r6,r15 /* a_part = (a & 127) */ + shr 7,r6 /* a >>= 7 */ + mov r14,r12 /* i+j = i */ +.L9: + andi 0x7f,r13,r11 /* b_part = (b_tmp & 127) */ + mulh r15,r11 /* ((int)a_part) * ((int)b_part) */ + shr 7,r13 /* b_tmp >>= 7 */ + shl r12,r11 /* (((int)a_part) * ((int)b_part)) << (i+j) */ + add r11,r10 /* ret += (((int)a_part) * ((int)b_part)) << (i+j) */ + add 7,r12 /* i+j += 7 */ + cmp r16,r12 /* i+j < 32 */ + ble .L9 + + add 7,r14 /* i += 7 */ + cmp r16,r14 /* i < 32 */ + ble .L5 + + jmp [r31] /* return */ + .size __mulsi3,.-__mulsi3 +#endif + +#ifdef L_udivsi3 + .global ___udivsi3 +___udivsi3: + mov 1,r12 + mov 0,r10 + cmp r6,r7 + bnl .L12 + movhi hi(-2147483648),r0,r13 + cmp r0,r7 + blt .L12 +.L4: + shl 1,r7 + shl 1,r12 + cmp r6,r7 + bnl .L12 + cmp r0,r12 + be .L8 + mov r7,r5 + and r13,r5 + be .L4 + br .L12 +.L9: + cmp r7,r6 + bl .L10 + sub r7,r6 + or r12,r10 +.L10: + shr 1,r12 + shr 1,r7 +.L12: + cmp r0,r12 + bne .L9 +.L8: + jmp [r31] + .size __udivsi3,.-__udivsi3 +#endif + +#ifdef L_divsi3 + .text + .globl ___divsi3 + .type ___divsi3,@function +___divsi3: + add -8,sp + st.w r31,4[sp] + st.w r22,0[sp] + mov 1,r22 + tst r7,r7 + bp .L3 + subr r0,r7 + subr r0,r22 +.L3: + tst r6,r6 + bp .L4 + subr r0,r6 + subr r0,r22 +.L4: + jarl ___udivsi3,r31 + cmp r0,r22 + bp .L7 + subr r0,r10 +.L7: + ld.w 0[sp],r22 + ld.w 4[sp],r31 + add 8,sp + jmp [r31] + .size __divsi3,.-__divsi3 +#endif + +#ifdef L_umodsi3 + .text + .globl ___umodsi3 + .type ___umodsi3,@function +___umodsi3: + add -12,sp + st.w r31,8[sp] + st.w r7,4[sp] + st.w r6,0[sp] + jarl ___udivsi3,r31 + ld.w 4[sp],r7 + mov r10,r6 + jarl ___mulsi3,r31 + ld.w 0[sp],r6 + subr r6,r10 + ld.w 8[sp],r31 + add 12,sp + jmp [r31] + .size __umodsi3,.-__umodsi3 +#endif /* L_umodsi3 */ + +#ifdef L_modsi3 + .text + .globl ___modsi3 + .type ___modsi3,@function +___modsi3: + add -12,sp + st.w r31,8[sp] + st.w r7,4[sp] + st.w r6,0[sp] + jarl ___divsi3,r31 + ld.w 4[sp],r7 + mov r10,r6 + jarl ___mulsi3,r31 + ld.w 0[sp],r6 + subr r6,r10 + ld.w 8[sp],r31 + add 12,sp + jmp [r31] + .size __modsi3,.-__modsi3 +#endif /* L_modsi3 */ + +#ifdef L_save_2 + .text + .align 2 + .globl __save_r2_r29 + .type __save_r2_r29,@function + /* Allocate space and save registers 2, 20 .. 29 on the stack */ + /* Called via: jalr __save_r2_r29,r10 */ +__save_r2_r29: + mov ep,r1 + addi -44,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + sst.w r23,24[ep] + sst.w r22,28[ep] + sst.w r21,32[ep] + sst.w r20,36[ep] + sst.w r2,40[ep] + mov r1,ep + jmp [r10] + .size __save_r2_r29,.-__save_r2_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r2_r29 */ + .align 2 + .globl __return_r2_r29 + .type __return_r2_r29,@function +__return_r2_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + sld.w 24[ep],r23 + sld.w 28[ep],r22 + sld.w 32[ep],r21 + sld.w 36[ep],r20 + sld.w 40[ep],r2 + addi 44,sp,sp + mov r1,ep + jmp [r31] + .size __return_r2_r29,.-__return_r2_r29 +#endif /* L_save_2 */ + +#ifdef L_save_20 + .text + .align 2 + .globl __save_r20_r29 + .type __save_r20_r29,@function + /* Allocate space and save registers 20 .. 29 on the stack */ + /* Called via: jalr __save_r20_r29,r10 */ +__save_r20_r29: + mov ep,r1 + addi -40,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + sst.w r23,24[ep] + sst.w r22,28[ep] + sst.w r21,32[ep] + sst.w r20,36[ep] + mov r1,ep + jmp [r10] + .size __save_r20_r29,.-__save_r20_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r20_r29 */ + .align 2 + .globl __return_r20_r29 + .type __return_r20_r29,@function +__return_r20_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + sld.w 24[ep],r23 + sld.w 28[ep],r22 + sld.w 32[ep],r21 + sld.w 36[ep],r20 + addi 40,sp,sp + mov r1,ep + jmp [r31] + .size __return_r20_r29,.-__return_r20_r29 +#endif /* L_save_20 */ + +#ifdef L_save_21 + .text + .align 2 + .globl __save_r21_r29 + .type __save_r21_r29,@function + /* Allocate space and save registers 21 .. 29 on the stack */ + /* Called via: jalr __save_r21_r29,r10 */ +__save_r21_r29: + mov ep,r1 + addi -36,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + sst.w r23,24[ep] + sst.w r22,28[ep] + sst.w r21,32[ep] + mov r1,ep + jmp [r10] + .size __save_r21_r29,.-__save_r21_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r21_r29 */ + .align 2 + .globl __return_r21_r29 + .type __return_r21_r29,@function +__return_r21_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + sld.w 24[ep],r23 + sld.w 28[ep],r22 + sld.w 32[ep],r21 + addi 36,sp,sp + mov r1,ep + jmp [r31] + .size __return_r21_r29,.-__return_r21_r29 +#endif /* L_save_21 */ + +#ifdef L_save_22 + .text + .align 2 + .globl __save_r22_r29 + .type __save_r22_r29,@function + /* Allocate space and save registers 22 .. 29 on the stack */ + /* Called via: jalr __save_r22_r29,r10 */ +__save_r22_r29: + mov ep,r1 + addi -32,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + sst.w r23,24[ep] + sst.w r22,28[ep] + mov r1,ep + jmp [r10] + .size __save_r22_r29,.-__save_r22_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r22_r29 */ + .align 2 + .globl __return_r22_r29 + .type __return_r22_r29,@function +__return_r22_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + sld.w 24[ep],r23 + sld.w 28[ep],r22 + addi 32,sp,sp + mov r1,ep + jmp [r31] + .size __return_r22_r29,.-__return_r22_r29 +#endif /* L_save_22 */ + +#ifdef L_save_23 + .text + .align 2 + .globl __save_r23_r29 + .type __save_r23_r29,@function + /* Allocate space and save registers 23 .. 29 on the stack */ + /* Called via: jalr __save_r23_r29,r10 */ +__save_r23_r29: + mov ep,r1 + addi -28,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + sst.w r23,24[ep] + mov r1,ep + jmp [r10] + .size __save_r23_r29,.-__save_r23_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r23_r29 */ + .align 2 + .globl __return_r23_r29 + .type __return_r23_r29,@function +__return_r23_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + sld.w 24[ep],r23 + addi 28,sp,sp + mov r1,ep + jmp [r31] + .size __return_r23_r29,.-__return_r23_r29 +#endif /* L_save_23 */ + +#ifdef L_save_24 + .text + .align 2 + .globl __save_r24_r29 + .type __save_r24_r29,@function + /* Allocate space and save registers 24 .. 29 on the stack */ + /* Called via: jalr __save_r24_r29,r10 */ +__save_r24_r29: + mov ep,r1 + addi -24,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + sst.w r24,20[ep] + mov r1,ep + jmp [r10] + .size __save_r24_r29,.-__save_r24_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r24_r29 */ + .align 2 + .globl __return_r24_r29 + .type __return_r24_r29,@function +__return_r24_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + sld.w 20[ep],r24 + addi 24,sp,sp + mov r1,ep + jmp [r31] + .size __return_r24_r29,.-__return_r24_r29 +#endif /* L_save_24 */ + +#ifdef L_save_25 + .text + .align 2 + .globl __save_r25_r29 + .type __save_r25_r29,@function + /* Allocate space and save registers 25 .. 29 on the stack */ + /* Called via: jalr __save_r25_r29,r10 */ +__save_r25_r29: + mov ep,r1 + addi -20,sp,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + sst.w r25,16[ep] + mov r1,ep + jmp [r10] + .size __save_r25_r29,.-__save_r25_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r25_r29 */ + .align 2 + .globl __return_r25_r29 + .type __return_r25_r29,@function +__return_r25_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + sld.w 16[ep],r25 + addi 20,sp,sp + mov r1,ep + jmp [r31] + .size __return_r25_r29,.-__return_r25_r29 +#endif /* L_save_25 */ + +#ifdef L_save_26 + .text + .align 2 + .globl __save_r26_r29 + .type __save_r26_r29,@function + /* Allocate space and save registers 26 .. 29 on the stack */ + /* Called via: jalr __save_r26_r29,r10 */ +__save_r26_r29: + mov ep,r1 + add -16,sp + mov sp,ep + sst.w r29,0[ep] + sst.w r28,4[ep] + sst.w r27,8[ep] + sst.w r26,12[ep] + mov r1,ep + jmp [r10] + .size __save_r26_r29,.-__save_r26_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r26_r29 */ + .align 2 + .globl __return_r26_r29 + .type __return_r26_r29,@function +__return_r26_r29: + mov ep,r1 + mov sp,ep + sld.w 0[ep],r29 + sld.w 4[ep],r28 + sld.w 8[ep],r27 + sld.w 12[ep],r26 + addi 16,sp,sp + mov r1,ep + jmp [r31] + .size __return_r26_r29,.-__return_r26_r29 +#endif /* L_save_26 */ + +#ifdef L_save_27 + .text + .align 2 + .globl __save_r27_r29 + .type __save_r27_r29,@function + /* Allocate space and save registers 27 .. 29 on the stack */ + /* Called via: jalr __save_r27_r29,r10 */ +__save_r27_r29: + add -12,sp + st.w r29,0[sp] + st.w r28,4[sp] + st.w r27,8[sp] + jmp [r10] + .size __save_r27_r29,.-__save_r27_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r27_r29 */ + .align 2 + .globl __return_r27_r29 + .type __return_r27_r29,@function +__return_r27_r29: + ld.w 0[sp],r29 + ld.w 4[sp],r28 + ld.w 8[sp],r27 + add 12,sp + jmp [r31] + .size __return_r27_r29,.-__return_r27_r29 +#endif /* L_save_27 */ + +#ifdef L_save_28 + .text + .align 2 + .globl __save_r28_r29 + .type __save_r28_r29,@function + /* Allocate space and save registers 28,29 on the stack */ + /* Called via: jalr __save_r28_r29,r10 */ +__save_r28_r29: + add -8,sp + st.w r29,0[sp] + st.w r28,4[sp] + jmp [r10] + .size __save_r28_r29,.-__save_r28_r29 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r28_r29 */ + .align 2 + .globl __return_r28_r29 + .type __return_r28_r29,@function +__return_r28_r29: + ld.w 0[sp],r29 + ld.w 4[sp],r28 + add 8,sp + jmp [r31] + .size __return_r28_r29,.-__return_r28_r29 +#endif /* L_save_28 */ + +#ifdef L_save_29 + .text + .align 2 + .globl __save_r29 + .type __save_r29,@function + /* Allocate space and save register 29 on the stack */ + /* Called via: jalr __save_r29,r10 */ +__save_r29: + add -4,sp + st.w r29,0[sp] + jmp [r10] + .size __save_r29,.-__save_r29 + + /* Restore saved register 29, deallocate stack and return to the user */ + /* Called via: jr __return_r29 */ + .align 2 + .globl __return_r29 + .type __return_r29,@function +__return_r29: + ld.w 0[sp],r29 + add 4,sp + jmp [r31] + .size __return_r29,.-__return_r29 +#endif /* L_save_28 */ + +#ifdef L_save_2c + .text + .align 2 + .globl __save_r2_r31 + .type __save_r2_r31,@function + /* Allocate space and save registers 20 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r2_r31,r10 */ +__save_r2_r31: + mov ep,r1 + addi -64,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r23,40[ep] + sst.w r22,44[ep] + sst.w r21,48[ep] + sst.w r20,52[ep] + sst.w r2,56[ep] + sst.w r31,60[ep] + mov r1,ep + jmp [r10] + .size __save_r2_r31,.-__save_r2_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r20_r31 */ + .align 2 + .globl __return_r2_r31 + .type __return_r2_r31,@function +__return_r2_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r23 + sld.w 44[ep],r22 + sld.w 48[ep],r21 + sld.w 52[ep],r20 + sld.w 56[ep],r2 + sld.w 60[ep],r31 + addi 64,sp,sp + mov r1,ep + jmp [r31] + .size __return_r2_r31,.-__return_r2_r31 +#endif /* L_save_2c */ + +#ifdef L_save_20c + .text + .align 2 + .globl __save_r20_r31 + .type __save_r20_r31,@function + /* Allocate space and save registers 20 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r20_r31,r10 */ +__save_r20_r31: + mov ep,r1 + addi -60,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r23,40[ep] + sst.w r22,44[ep] + sst.w r21,48[ep] + sst.w r20,52[ep] + sst.w r31,56[ep] + mov r1,ep + jmp [r10] + .size __save_r20_r31,.-__save_r20_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r20_r31 */ + .align 2 + .globl __return_r20_r31 + .type __return_r20_r31,@function +__return_r20_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r23 + sld.w 44[ep],r22 + sld.w 48[ep],r21 + sld.w 52[ep],r20 + sld.w 56[ep],r31 + addi 60,sp,sp + mov r1,ep + jmp [r31] + .size __return_r20_r31,.-__return_r20_r31 +#endif /* L_save_20c */ + +#ifdef L_save_21c + .text + .align 2 + .globl __save_r21_r31 + .type __save_r21_r31,@function + /* Allocate space and save registers 21 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r21_r31,r10 */ +__save_r21_r31: + mov ep,r1 + addi -56,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r23,40[ep] + sst.w r22,44[ep] + sst.w r21,48[ep] + sst.w r31,52[ep] + mov r1,ep + jmp [r10] + .size __save_r21_r31,.-__save_r21_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r21_r31 */ + .align 2 + .globl __return_r21_r31 + .type __return_r21_r31,@function +__return_r21_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r23 + sld.w 44[ep],r22 + sld.w 48[ep],r21 + sld.w 52[ep],r31 + addi 56,sp,sp + mov r1,ep + jmp [r31] + .size __return_r21_r31,.-__return_r21_r31 +#endif /* L_save_21c */ + +#ifdef L_save_22c + .text + .align 2 + .globl __save_r22_r31 + .type __save_r22_r31,@function + /* Allocate space and save registers 22 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r22_r31,r10 */ +__save_r22_r31: + mov ep,r1 + addi -52,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r23,40[ep] + sst.w r22,44[ep] + sst.w r31,48[ep] + mov r1,ep + jmp [r10] + .size __save_r22_r31,.-__save_r22_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r22_r31 */ + .align 2 + .globl __return_r22_r31 + .type __return_r22_r31,@function +__return_r22_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r23 + sld.w 44[ep],r22 + sld.w 48[ep],r31 + addi 52,sp,sp + mov r1,ep + jmp [r31] + .size __return_r22_r31,.-__return_r22_r31 +#endif /* L_save_22c */ + +#ifdef L_save_23c + .text + .align 2 + .globl __save_r23_r31 + .type __save_r23_r31,@function + /* Allocate space and save registers 23 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r23_r31,r10 */ +__save_r23_r31: + mov ep,r1 + addi -48,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r23,40[ep] + sst.w r31,44[ep] + mov r1,ep + jmp [r10] + .size __save_r23_r31,.-__save_r23_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r23_r31 */ + .align 2 + .globl __return_r23_r31 + .type __return_r23_r31,@function +__return_r23_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r23 + sld.w 44[ep],r31 + addi 48,sp,sp + mov r1,ep + jmp [r31] + .size __return_r23_r31,.-__return_r23_r31 +#endif /* L_save_23c */ + +#ifdef L_save_24c + .text + .align 2 + .globl __save_r24_r31 + .type __save_r24_r31,@function + /* Allocate space and save registers 24 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r24_r31,r10 */ +__save_r24_r31: + mov ep,r1 + addi -44,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r24,36[ep] + sst.w r31,40[ep] + mov r1,ep + jmp [r10] + .size __save_r24_r31,.-__save_r24_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r24_r31 */ + .align 2 + .globl __return_r24_r31 + .type __return_r24_r31,@function +__return_r24_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r24 + sld.w 40[ep],r31 + addi 44,sp,sp + mov r1,ep + jmp [r31] + .size __return_r24_r31,.-__return_r24_r31 +#endif /* L_save_24c */ + +#ifdef L_save_25c + .text + .align 2 + .globl __save_r25_r31 + .type __save_r25_r31,@function + /* Allocate space and save registers 25 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r25_r31,r10 */ +__save_r25_r31: + mov ep,r1 + addi -40,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r25,32[ep] + sst.w r31,36[ep] + mov r1,ep + jmp [r10] + .size __save_r25_r31,.-__save_r25_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r25_r31 */ + .align 2 + .globl __return_r25_r31 + .type __return_r25_r31,@function +__return_r25_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r25 + sld.w 36[ep],r31 + addi 40,sp,sp + mov r1,ep + jmp [r31] + .size __return_r25_r31,.-__return_r25_r31 +#endif /* L_save_25c */ + +#ifdef L_save_26c + .text + .align 2 + .globl __save_r26_r31 + .type __save_r26_r31,@function + /* Allocate space and save registers 26 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r26_r31,r10 */ +__save_r26_r31: + mov ep,r1 + addi -36,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r26,28[ep] + sst.w r31,32[ep] + mov r1,ep + jmp [r10] + .size __save_r26_r31,.-__save_r26_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r26_r31 */ + .align 2 + .globl __return_r26_r31 + .type __return_r26_r31,@function +__return_r26_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r26 + sld.w 32[ep],r31 + addi 36,sp,sp + mov r1,ep + jmp [r31] + .size __return_r26_r31,.-__return_r26_r31 +#endif /* L_save_26c */ + +#ifdef L_save_27c + .text + .align 2 + .globl __save_r27_r31 + .type __save_r27_r31,@function + /* Allocate space and save registers 27 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r27_r31,r10 */ +__save_r27_r31: + mov ep,r1 + addi -32,sp,sp + mov sp,ep + sst.w r29,16[ep] + sst.w r28,20[ep] + sst.w r27,24[ep] + sst.w r31,28[ep] + mov r1,ep + jmp [r10] + .size __save_r27_r31,.-__save_r27_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r27_r31 */ + .align 2 + .globl __return_r27_r31 + .type __return_r27_r31,@function +__return_r27_r31: + mov ep,r1 + mov sp,ep + sld.w 16[ep],r29 + sld.w 20[ep],r28 + sld.w 24[ep],r27 + sld.w 28[ep],r31 + addi 32,sp,sp + mov r1,ep + jmp [r31] + .size __return_r27_r31,.-__return_r27_r31 +#endif /* L_save_27c */ + +#ifdef L_save_28c + .text + .align 2 + .globl __save_r28_r31 + .type __save_r28_r31,@function + /* Allocate space and save registers 28 .. 29, 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r28_r31,r10 */ +__save_r28_r31: + addi -28,sp,sp + st.w r29,16[sp] + st.w r28,20[sp] + st.w r31,24[sp] + jmp [r10] + .size __save_r28_r31,.-__save_r28_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r28_r31 */ + .align 2 + .globl __return_r28_r31 + .type __return_r28_r31,@function +__return_r28_r31: + ld.w 16[sp],r29 + ld.w 20[sp],r28 + ld.w 24[sp],r31 + addi 28,sp,sp + jmp [r31] + .size __return_r28_r31,.-__return_r28_r31 +#endif /* L_save_28c */ + +#ifdef L_save_29c + .text + .align 2 + .globl __save_r29_r31 + .type __save_r29_r31,@function + /* Allocate space and save registers 29 & 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r29_r31,r10 */ +__save_r29_r31: + addi -24,sp,sp + st.w r29,16[sp] + st.w r31,20[sp] + jmp [r10] + .size __save_r29_r31,.-__save_r29_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r29_r31 */ + .align 2 + .globl __return_r29_r31 + .type __return_r29_r31,@function +__return_r29_r31: + ld.w 16[sp],r29 + ld.w 20[sp],r31 + addi 24,sp,sp + jmp [r31] + .size __return_r29_r31,.-__return_r29_r31 +#endif /* L_save_29c */ + +#ifdef L_save_31c + .text + .align 2 + .globl __save_r31 + .type __save_r31,@function + /* Allocate space and save register 31 on the stack */ + /* Also allocate space for the argument save area */ + /* Called via: jalr __save_r29_r31,r10 */ +__save_r31: + addi -20,sp,sp + st.w r31,16[sp] + jmp [r10] + .size __save_r31,.-__save_r31 + + /* Restore saved registers, deallocate stack and return to the user */ + /* Called via: jr __return_r31 */ + .align 2 + .globl __return_r31 + .type __return_r31,@function +__return_r31: + ld.w 16[sp],r31 + addi 20,sp,sp + jmp [r31] + .size __return_r29_r31,.-__return_r29_r31 +#endif /* L_save_31c */ + +#ifdef L_save_varargs + .text + .align 2 + .globl __save_r6_r9 + .type __save_r6_r9,@function + /* Save registers 6 .. 9 on the stack for variable argument functions */ + /* Called via: jalr __save_r6_r9,r10 */ +__save_r6_r9: + mov ep,r1 + mov sp,ep + sst.w r6,0[ep] + sst.w r7,4[ep] + sst.w r8,8[ep] + sst.w r9,12[ep] + mov r1,ep + jmp [r10] + .size __save_r6_r9,.-__save_r6_r9 +#endif /* L_save_varargs */ + +#ifdef L_save_interrupt + .text + .align 2 + .globl __save_interrupt + .type __save_interrupt,@function + /* Save registers r1, r5 on stack and load up with expected values */ + /* Note, 12 bytes of stack have already been allocated. */ + /* Called via: jalr __save_interrupt,r10 */ +__save_interrupt: + st.w ep,0[sp] + st.w gp,4[sp] + st.w r1,8[sp] + movhi hi(__ep),r0,ep + movea lo(__ep),ep,ep + movhi hi(__gp),r0,gp + movea lo(__gp),gp,gp + jmp [r10] + .size __save_interrupt,.-__save_interrupt + + /* Restore saved registers, deallocate stack and return from the interrupt */ + /* Called via: jr __return_interupt */ + .align 2 + .globl __return_interrupt + .type __return_interrupt,@function +__return_interrupt: + ld.w 0[sp],ep + ld.w 4[sp],gp + ld.w 8[ep],r1 + ld.w 12[ep],r10 + add 12,sp + reti + .size __return_interrupt,.-__return_interrupt +#endif /* L_save_interrupt */ + +#ifdef L_save_all_interrupt + .text + .align 2 + .globl __save_all_interrupt + .type __save_all_interrupt,@function + /* Save all registers except for those saved in __save_interrupt */ + /* allocate enough stack for all of the registers & 16 bytes of space */ + /* Called via: jalr __save_all_interrupt,r10 */ +__save_all_interrupt: + addi -120,sp,sp + mov ep,r1 + mov sp,ep + sst.w r31,116[ep] + sst.w r2,112[ep] + sst.w gp,108[ep] + sst.w r6,104[ep] + sst.w r7,100[ep] + sst.w r8,96[ep] + sst.w r9,92[ep] + sst.w r11,88[ep] + sst.w r12,84[ep] + sst.w r13,80[ep] + sst.w r14,76[ep] + sst.w r15,72[ep] + sst.w r16,68[ep] + sst.w r17,64[ep] + sst.w r18,60[ep] + sst.w r19,56[ep] + sst.w r20,52[ep] + sst.w r21,48[ep] + sst.w r22,44[ep] + sst.w r23,40[ep] + sst.w r24,36[ep] + sst.w r25,32[ep] + sst.w r26,28[ep] + sst.w r27,24[ep] + sst.w r28,20[ep] + sst.w r29,16[ep] + mov r1,ep + jmp [r10] + .size __save_all_interrupt,.-__save_all_interrupt + + .globl __restore_all_interrupt + .type __restore_all_interrupt,@function + /* Restore all registers saved in __save_all_interrupt */ + /* & deallocate the stack space */ + /* Called via: jalr __restore_all_interrupt,r10 */ +__restore_all_interrupt: + mov ep,r1 + mov sp,ep + sld.w 116[ep],r31 + sld.w 112[ep],r2 + sld.w 108[ep],gp + sld.w 104[ep],r6 + sld.w 100[ep],r7 + sld.w 96[ep],r8 + sld.w 92[ep],r9 + sld.w 88[ep],r11 + sld.w 84[ep],r12 + sld.w 80[ep],r13 + sld.w 76[ep],r14 + sld.w 72[ep],r15 + sld.w 68[ep],r16 + sld.w 64[ep],r17 + sld.w 60[ep],r18 + sld.w 56[ep],r19 + sld.w 52[ep],r20 + sld.w 48[ep],r21 + sld.w 44[ep],r22 + sld.w 40[ep],r23 + sld.w 36[ep],r24 + sld.w 32[ep],r25 + sld.w 28[ep],r26 + sld.w 24[ep],r27 + sld.w 20[ep],r28 + sld.w 16[ep],r29 + mov r1,ep + addi 120,sp,sp + jmp [r10] + .size __restore_all_interrupt,.-__restore_all_interrupt +#endif /* L_save_all_interrupt */ +/* END CYGNUS LOCAL */ diff --git a/gcc/config/v850/t-v850 b/gcc/config/v850/t-v850 new file mode 100644 index 00000000000..52034414b70 --- /dev/null +++ b/gcc/config/v850/t-v850 @@ -0,0 +1,54 @@ +# CYGNUS LOCAL entire file v850/law +CROSS_LIBGCC1 = libgcc1-asm.a +LIB1ASMSRC = v850/lib1funcs.asm +LIB1ASMFUNCS = _mulsi3 \ + _divsi3 \ + _udivsi3 \ + _modsi3 \ + _umodsi3 \ + _save_2 \ + _save_20 \ + _save_21 \ + _save_22 \ + _save_23 \ + _save_24 \ + _save_25 \ + _save_26 \ + _save_27 \ + _save_28 \ + _save_29 \ + _save_2c \ + _save_20c \ + _save_21c \ + _save_22c \ + _save_23c \ + _save_24c \ + _save_25c \ + _save_26c \ + _save_27c \ + _save_28c \ + _save_29c \ + _save_31c \ + _save_varargs \ + _save_interrupt \ + _save_all_interrupt + + +# These are really part of libgcc1, but this will cause them to be +# built correctly, so... + +LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c + +dp-bit.c: $(srcdir)/config/fp-bit.c + echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c + echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c + echo '#endif' >> dp-bit.c + cat $(srcdir)/config/fp-bit.c >> dp-bit.c + +fp-bit.c: $(srcdir)/config/fp-bit.c + echo '#define FLOAT' > fp-bit.c + echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c + echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c + echo '#endif' >> fp-bit.c + cat $(srcdir)/config/fp-bit.c >> fp-bit.c +#END CYGNUS LOCAL diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c new file mode 100644 index 00000000000..6435d409336 --- /dev/null +++ b/gcc/config/v850/v850.c @@ -0,0 +1,1942 @@ +/* Subroutines for insn-output.c for NEC V850 series + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Contributed by Jeff Law (law@cygnus.com). + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <ctype.h> +#include "config.h" +#include "rtl.h" +#include "regs.h" +#include "hard-reg-set.h" +#include "real.h" +#include "insn-config.h" +#include "conditions.h" +#include "insn-flags.h" +#include "output.h" +#include "insn-attr.h" +#include "flags.h" +#include "recog.h" +#include "expr.h" +#include "tree.h" +#include "obstack.h" + +/* True if the current function has anonymous arguments. */ +int current_function_anonymous_args; + +/* Information about the various small memory areas. */ +struct small_memory_info small_memory[ (int)SMALL_MEMORY_max ] = +{ + /* name value max physical max */ + { "tda", (char *)0, 0, 256 }, + { "sda", (char *)0, 0, 65536 }, + { "zda", (char *)0, 0, 32768 }, +}; + +/* True if we don't need to check any more if the current + function is an interrupt handler */ +static int v850_interrupt_cache_p = FALSE; + +/* Whether current function is an interrupt handler. */ +static int v850_interrupt_p = FALSE; + + +/* Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ + +void +override_options () +{ + int i; + extern int atoi (); + + /* Parse -m{s,t,z}da=nnn switches */ + for (i = 0; i < (int)SMALL_MEMORY_max; i++) + { + if (small_memory[i].value) + { + if (!isdigit (*small_memory[i].value)) + error ("%s=%s is not numeric.", + small_memory[i].name, + small_memory[i].value); + else + { + small_memory[i].max = atoi (small_memory[i].value); + if (small_memory[i].max > small_memory[i].physical_max) + error ("%s=%s is too large.", + small_memory[i].name, + small_memory[i].value); + } + } + } +} + + +/* Output assembly code for the start of the file. */ + +void +asm_file_start (file) + FILE *file; +{ + output_file_directive (file, main_input_filename); +} + + +/* Return an RTX to represent where a value with mode MODE will be returned + from a function. If the result is 0, the argument is pushed. */ + +rtx +function_arg (cum, mode, type, named) + CUMULATIVE_ARGS *cum; + enum machine_mode mode; + tree type; + int named; +{ + rtx result = 0; + int size, align; + + if (TARGET_GHS && !named) + return NULL_RTX; + + if (mode == BLKmode) + size = int_size_in_bytes (type); + else + size = GET_MODE_SIZE (mode); + + if (type) + align = TYPE_ALIGN (type) / BITS_PER_UNIT; + else + align = size; + + cum->nbytes = (cum->nbytes + align - 1) &~(align - 1); + + if (cum->nbytes > 4 * UNITS_PER_WORD) + return 0; + + if (type == NULL_TREE + && cum->nbytes + size > 4 * UNITS_PER_WORD) + return 0; + + switch (cum->nbytes / UNITS_PER_WORD) + { + case 0: + result = gen_rtx (REG, mode, 6); + break; + case 1: + result = gen_rtx (REG, mode, 7); + break; + case 2: + result = gen_rtx (REG, mode, 8); + break; + case 3: + result = gen_rtx (REG, mode, 9); + break; + default: + result = 0; + } + + return result; +} + + +/* Return the number of words which must be put into registers + for values which are part in registers and part in memory. */ + +int +function_arg_partial_nregs (cum, mode, type, named) + CUMULATIVE_ARGS *cum; + enum machine_mode mode; + tree type; + int named; +{ + int size, align; + + if (TARGET_GHS && !named) + return 0; + + if (mode == BLKmode) + size = int_size_in_bytes (type); + else + size = GET_MODE_SIZE (mode); + + if (type) + align = TYPE_ALIGN (type) / BITS_PER_UNIT; + else + align = size; + + cum->nbytes = (cum->nbytes + align - 1) &~(align - 1); + + if (cum->nbytes > 4 * UNITS_PER_WORD) + return 0; + + if (cum->nbytes + size <= 4 * UNITS_PER_WORD) + return 0; + + if (type == NULL_TREE + && cum->nbytes + size > 4 * UNITS_PER_WORD) + return 0; + + return (4 * UNITS_PER_WORD - cum->nbytes) / UNITS_PER_WORD; +} + + +/* Return the high and low words of a CONST_DOUBLE */ + +static void +const_double_split (x, p_high, p_low) + rtx x; + HOST_WIDE_INT *p_high; + HOST_WIDE_INT *p_low; +{ + if (GET_CODE (x) == CONST_DOUBLE) + { + long t[2]; + REAL_VALUE_TYPE rv; + + switch (GET_MODE (x)) + { + case DFmode: + REAL_VALUE_FROM_CONST_DOUBLE (rv, x); + REAL_VALUE_TO_TARGET_DOUBLE (rv, t); + *p_high = t[1]; /* since v850 is little endian */ + *p_low = t[0]; /* high is second word */ + return; + + case SFmode: + REAL_VALUE_FROM_CONST_DOUBLE (rv, x); + REAL_VALUE_TO_TARGET_SINGLE (rv, *p_high); + *p_low = 0; + return; + + case VOIDmode: + case DImode: + *p_high = CONST_DOUBLE_HIGH (x); + *p_low = CONST_DOUBLE_LOW (x); + return; + } + } + + fatal_insn ("const_double_split got a bad insn:", x); +} + + +/* Return the cost of the rtx R with code CODE. */ + +static int +const_costs_int (value, zero_cost) + HOST_WIDE_INT value; + int zero_cost; +{ + if (CONST_OK_FOR_I (value)) + return zero_cost; + else if (CONST_OK_FOR_J (value)) + return 1; + else if (CONST_OK_FOR_K (value)) + return 2; + else + return 4; +} + +int +const_costs (r, c) + rtx r; + enum rtx_code c; +{ + HOST_WIDE_INT high, low; + + switch (c) + { + case CONST_INT: + return const_costs_int (INTVAL (r), 0); + + case CONST_DOUBLE: + const_double_split (r, &high, &low); + if (GET_MODE (r) == SFmode) + return const_costs_int (high, 1); + else + return const_costs_int (high, 1) + const_costs_int (low, 1); + + case SYMBOL_REF: + case LABEL_REF: + case CONST: + return 2; + + case HIGH: + return 1; + + default: + return 4; + } +} + + +/* Print operand X using operand code CODE to assembly language output file + FILE. */ + +void +print_operand (file, x, code) + FILE *file; + rtx x; + int code; +{ + HOST_WIDE_INT high, low; + + switch (code) + { + case 'b': + case 'B': + switch (code == 'b' ? GET_CODE (x) : reverse_condition (GET_CODE (x))) + { + case NE: + fprintf (file, "bne"); + break; + case EQ: + fprintf (file, "be"); + break; + case GE: + fprintf (file, "bge"); + break; + case GT: + fprintf (file, "bgt"); + break; + case LE: + fprintf (file, "ble"); + break; + case LT: + fprintf (file, "blt"); + break; + case GEU: + fprintf (file, "bnl"); + break; + case GTU: + fprintf (file, "bh"); + break; + case LEU: + fprintf (file, "bnh"); + break; + case LTU: + fprintf (file, "bl"); + break; + default: + abort (); + } + break; + switch (GET_CODE (x)) + { + case NE: + fprintf (file, "be"); + break; + case EQ: + fprintf (file, "bne"); + break; + case GE: + fprintf (file, "blt"); + break; + case GT: + fprintf (file, "bgt"); + break; + case LE: + fprintf (file, "ble"); + break; + case LT: + fprintf (file, "blt"); + break; + case GEU: + fprintf (file, "bnl"); + break; + case GTU: + fprintf (file, "bh"); + break; + case LEU: + fprintf (file, "bnh"); + break; + case LTU: + fprintf (file, "bl"); + break; + default: + abort (); + } + break; + case 'F': /* high word of CONST_DOUBLE */ + if (GET_CODE (x) == CONST_INT) + fprintf (file, "%d", (INTVAL (x) >= 0) ? 0 : -1); + else if (GET_CODE (x) == CONST_DOUBLE) + { + const_double_split (x, &high, &low); + fprintf (file, "%ld", (long) high); + } + else + abort (); + break; + case 'G': /* low word of CONST_DOUBLE */ + if (GET_CODE (x) == CONST_INT) + fprintf (file, "%ld", (long) INTVAL (x)); + else if (GET_CODE (x) == CONST_DOUBLE) + { + const_double_split (x, &high, &low); + fprintf (file, "%ld", (long) low); + } + else + abort (); + break; + case 'L': + fprintf (file, "%d\n", INTVAL (x) & 0xffff); + break; + case 'M': + fprintf (file, "%d", exact_log2 (INTVAL (x))); + break; + case 'O': + if (special_symbolref_operand (x, VOIDmode)) + { + char* name; + + if (GET_CODE (x) == SYMBOL_REF) + name = XSTR (x, 0); + else if (GET_CODE (x) == CONST) + name = XSTR (XEXP (XEXP (x, 0), 0), 0); + else + abort (); + + if (ZDA_NAME_P (name)) + fprintf (file, "zdaoff"); + else if (SDA_NAME_P (name)) + fprintf (file, "sdaoff"); + else if (TDA_NAME_P (name)) + fprintf (file, "tdaoff"); + else + abort(); + } + else + abort(); + break; + case 'P': + if (special_symbolref_operand (x, VOIDmode)) + output_addr_const (file, x); + else + abort(); + break; + case 'Q': + if (special_symbolref_operand (x, VOIDmode)) + { + char* name; + + if (GET_CODE (x) == SYMBOL_REF) + name = XSTR (x, 0); + else if (GET_CODE (x) == CONST) + name = XSTR (XEXP (XEXP (x, 0), 0), 0); + else + abort (); + + if (ZDA_NAME_P (name)) + fprintf (file, "r0"); + else if (SDA_NAME_P (name)) + fprintf (file, "gp"); + else if (TDA_NAME_P (name)) + fprintf (file, "ep"); + else + abort(); + } + else + abort(); + break; + case 'R': /* 2nd word of a double. */ + switch (GET_CODE (x)) + { + case REG: + fprintf (file, reg_names[REGNO (x) + 1]); + break; + case MEM: + print_operand_address (file, + XEXP (adj_offsettable_operand (x, 4), 0)); + break; + } + break; + case 'S': + { + /* if it's a referance to a TDA variable, use sst/sld vs. st/ld */ + if (GET_CODE (x) == MEM && ep_memory_operand (x, GET_MODE (x))) + fputs ("s", file); + + break; + } + case 'W': /* print the instruction suffix */ + switch (GET_MODE (x)) + { + default: + abort (); + + case QImode: fputs (".b", file); break; + case HImode: fputs (".h", file); break; + case SImode: fputs (".w", file); break; + case SFmode: fputs (".w", file); break; + } + break; + case '.': /* register r0 */ + fputs (reg_names[0], file); + break; + default: + switch (GET_CODE (x)) + { + case MEM: + if (GET_CODE (XEXP (x, 0)) == CONST_INT) + output_address (gen_rtx (PLUS, SImode, + gen_rtx (REG, SImode, 0), + XEXP (x, 0))); + else + output_address (XEXP (x, 0)); + break; + + case REG: + fputs (reg_names[REGNO (x)], file); + break; + case SUBREG: + fputs (reg_names[REGNO (SUBREG_REG (x)) + SUBREG_WORD (x)], file); + break; + case CONST_INT: + case SYMBOL_REF: + case CONST: + case LABEL_REF: + case CODE_LABEL: + print_operand_address (file, x); + break; + default: + abort (); + } + break; + + } +} + + +/* Output assembly language output for the address ADDR to FILE. */ + +void +print_operand_address (file, addr) + FILE *file; + rtx addr; +{ + switch (GET_CODE (addr)) + { + case REG: + fprintf (file, "0["); + print_operand (file, addr, 0); + fprintf (file, "]"); + break; + case LO_SUM: + if (GET_CODE (XEXP (addr, 0)) == REG) + { + /* reg,foo */ + fprintf (file, "lo("); + print_operand (file, XEXP (addr, 1), 0); + fprintf (file, ")["); + print_operand (file, XEXP (addr, 0), 0); + fprintf (file, "]"); + } + break; + case PLUS: + if (GET_CODE (XEXP (addr, 0)) == REG + || GET_CODE (XEXP (addr, 0)) == SUBREG) + { + /* reg,foo */ + print_operand (file, XEXP (addr, 1), 0); + fprintf (file, "["); + print_operand (file, XEXP (addr, 0), 0); + fprintf (file, "]"); + } + else + { + print_operand (file, XEXP (addr, 0), 0); + fprintf (file, "+"); + print_operand (file, XEXP (addr, 1), 0); + } + break; + case SYMBOL_REF: + if (ENCODED_NAME_P (XSTR (addr, 0))) + { + char* name = XSTR (addr, 0); + char* off_name; + char* reg_name; + + if (ZDA_NAME_P (name)) + { + off_name = "zdaoff"; + reg_name = "r0"; + } + else if (SDA_NAME_P (name)) + { + off_name = "sdaoff"; + reg_name = "gp"; + } + else if (TDA_NAME_P (name)) + { + off_name = "tdaoff"; + reg_name = "ep"; + } + else + abort(); + + fprintf (file, "%s(", off_name); + output_addr_const (file, addr); + fprintf (file, ")[%s]", reg_name); + } + else + output_addr_const (file, addr); + break; + case CONST: + if (special_symbolref_operand (addr, VOIDmode)) + { + char* name = XSTR (XEXP (XEXP (addr, 0), 0), 0); + char* off_name; + char* reg_name; + + if (ZDA_NAME_P (name)) + { + off_name = "zdaoff"; + reg_name = "r0"; + } + else if (SDA_NAME_P (name)) + { + off_name = "sdaoff"; + reg_name = "gp"; + } + else if (TDA_NAME_P (name)) + { + off_name = "tdaoff"; + reg_name = "ep"; + } + else + abort(); + + fprintf (file, "%s(", off_name); + output_addr_const (file, addr); + fprintf (file, ")[%s]", reg_name); + } + else + output_addr_const (file, addr); + break; + default: + output_addr_const (file, addr); + break; + } +} + + +/* Return appropriate code to load up a 1, 2, or 4 integer/floating + point value. */ + +char * +output_move_single (operands) + rtx *operands; +{ + rtx dst = operands[0]; + rtx src = operands[1]; + + if (REG_P (dst)) + { + if (REG_P (src)) + return "mov %1,%0"; + + else if (GET_CODE (src) == CONST_INT) + { + HOST_WIDE_INT value = INTVAL (src); + + if (CONST_OK_FOR_J (value)) /* signed 5 bit immediate */ + return "mov %1,%0"; + + else if (CONST_OK_FOR_K (value)) /* signed 16 bit immediate */ + return "movea lo(%1),%.,%0"; + + else if (CONST_OK_FOR_L (value)) /* upper 16 bits were set */ + return "movhi hi(%1),%.,%0"; + + else /* random constant */ + return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0"; + } + + else if (GET_CODE (src) == CONST_DOUBLE && GET_MODE (src) == SFmode) + { + HOST_WIDE_INT high, low; + + const_double_split (src, &high, &low); + if (CONST_OK_FOR_J (high)) /* signed 5 bit immediate */ + return "mov %F1,%0"; + + else if (CONST_OK_FOR_K (high)) /* signed 16 bit immediate */ + return "movea lo(%F1),%.,%0"; + + else if (CONST_OK_FOR_L (high)) /* upper 16 bits were set */ + return "movhi hi(%F1),%.,%0"; + + else /* random constant */ + return "movhi hi(%F1),%.,%0\n\tmovea lo(%F1),%0,%0"; + } + + else if (GET_CODE (src) == MEM) + return "%S1ld%W1 %1,%0"; + + else if (special_symbolref_operand (src, VOIDmode)) + return "movea %O1(%P1),%Q1,%0"; + + else if (GET_CODE (src) == LABEL_REF + || GET_CODE (src) == SYMBOL_REF + || GET_CODE (src) == CONST) + return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0"; + + else if (GET_CODE (src) == HIGH) + return "movhi hi(%1),%.,%0"; + + else if (GET_CODE (src) == LO_SUM) + { + operands[2] = XEXP (src, 0); + operands[3] = XEXP (src, 1); + return "movea lo(%3),%2,%0"; + } + } + + else if (GET_CODE (dst) == MEM) + { + if (REG_P (src)) + return "%S0st%W0 %1,%0"; + + else if (GET_CODE (src) == CONST_INT && INTVAL (src) == 0) + return "%S0st%W0 %.,%0"; + + else if (GET_CODE (src) == CONST_DOUBLE + && CONST0_RTX (GET_MODE (dst)) == src) + return "%S0st%W0 %.,%0"; + } + + fatal_insn ("output_move_single:", gen_rtx (SET, VOIDmode, dst, src)); + return ""; +} + + +/* Return appropriate code to load up an 8 byte integer or floating point value */ + +char * +output_move_double (operands) + rtx *operands; +{ + enum machine_mode mode = GET_MODE (operands[0]); + rtx dst = operands[0]; + rtx src = operands[1]; + + if (register_operand (dst, mode) + && register_operand (src, mode)) + { + if (REGNO (src) + 1 == REGNO (dst)) + return "mov %R1,%R0\n\tmov %1,%0"; + else + return "mov %1,%0\n\tmov %R1,%R0"; + } + + /* Storing 0 */ + if (GET_CODE (dst) == MEM + && ((GET_CODE (src) == CONST_INT && INTVAL (src) == 0) + || (GET_CODE (src) == CONST_DOUBLE && CONST_DOUBLE_OK_FOR_G (src)))) + return "st.w %.,%0\n\tst.w %.,%R0"; + + if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE) + { + HOST_WIDE_INT high_low[2]; + int i; + rtx xop[10]; + + if (GET_CODE (src) == CONST_DOUBLE) + const_double_split (src, &high_low[1], &high_low[0]); + else + { + high_low[0] = INTVAL (src); + high_low[1] = (INTVAL (src) >= 0) ? 0 : -1; + } + + for (i = 0; i < 2; i++) + { + xop[0] = gen_rtx (REG, SImode, REGNO (dst)+i); + xop[1] = GEN_INT (high_low[i]); + output_asm_insn (output_move_single (xop), xop); + } + + return ""; + } + + if (GET_CODE (src) == MEM) + { + int ptrreg = -1; + int dreg = REGNO (dst); + rtx inside = XEXP (src, 0); + + if (GET_CODE (inside) == REG) + ptrreg = REGNO (inside); + else if (GET_CODE (inside) == SUBREG) + ptrreg = REGNO (SUBREG_REG (inside)) + SUBREG_WORD (inside); + else if (GET_CODE (inside) == PLUS) + ptrreg = REGNO (XEXP (inside, 0)); + else if (GET_CODE (inside) == LO_SUM) + ptrreg = REGNO (XEXP (inside, 0)); + + if (dreg == ptrreg) + return "ld.w %R1,%R0\n\tld.w %1,%0"; + } + + if (GET_CODE (src) == MEM) + return "ld.w %1,%0\n\tld.w %R1,%R0"; + + if (GET_CODE (dst) == MEM) + return "st.w %1,%0\n\tst.w %R1,%R0"; + + return "mov %1,%0\n\tmov %R1,%R0"; +} + + +/* Return true if OP is a valid short EP memory reference */ + +int +ep_memory_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + rtx addr, op0, op1; + int max_offset; + int mask; + + if (GET_CODE (op) != MEM) + return FALSE; + + switch (GET_MODE (op)) + { + default: + return FALSE; + + case QImode: + max_offset = 128; + mask = 0; + break; + + case HImode: + max_offset = 256; + mask = 1; + break; + + case SImode: + case SFmode: + max_offset = 256; + mask = 3; + break; + } + + addr = XEXP (op, 0); + if (GET_CODE (addr) == CONST) + addr = XEXP (addr, 0); + + switch (GET_CODE (addr)) + { + default: + break; + + case SYMBOL_REF: + return TDA_NAME_P (XSTR (addr, 0)); + + case REG: + return REGNO (addr) == EP_REGNUM; + + case PLUS: + op0 = XEXP (addr, 0); + op1 = XEXP (addr, 1); + if (GET_CODE (op1) == CONST_INT + && INTVAL (op1) < max_offset + && (INTVAL (op1) & mask) == 0) + { + if (GET_CODE (op0) == REG && REGNO (op0) == EP_REGNUM) + return TRUE; + + if (GET_CODE (op0) == SYMBOL_REF && TDA_NAME_P (XSTR (op0, 0))) + return TRUE; + } + break; + } + + return FALSE; +} + +/* Return true if OP is either a register or 0 */ + +int +reg_or_0_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) == CONST_INT) + return INTVAL (op) == 0; + + else if (GET_CODE (op) == CONST_DOUBLE) + return CONST_DOUBLE_OK_FOR_G (op); + + else if (GET_CODE (op) == REG) + return TRUE; + + else if (GET_CODE (op) == SUBREG) + { + do { + op = SUBREG_REG (op); + } while (GET_CODE (op) == SUBREG); + + if (GET_CODE (op) == MEM && !reload_completed) + return TRUE; + + else if (GET_CODE (op) == REG) + return TRUE; + } + + return FALSE; +} + +/* Return true if OP is either a register or a signed five bit integer */ + +int +reg_or_int5_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) == CONST_INT) + return CONST_OK_FOR_J (INTVAL (op)); + + else if (GET_CODE (op) == REG) + return TRUE; + + else if (GET_CODE (op) == SUBREG) + { + do { + op = SUBREG_REG (op); + } while (GET_CODE (op) == SUBREG); + + if (GET_CODE (op) == MEM && !reload_completed) + return TRUE; + + else if (GET_CODE (op) == REG) + return TRUE; + } + + return FALSE; +} + +/* Return true if OP is a valid call operand. */ + +int +call_address_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + /* Only registers are valid call operands if TARGET_LONG_CALLS. */ + if (TARGET_LONG_CALLS) + return GET_CODE (op) == REG; + return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == REG); +} + +int +special_symbolref_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) == SYMBOL_REF) + return ENCODED_NAME_P (XSTR (op, 0)); + + else if (GET_CODE (op) == CONST) + return (GET_CODE (XEXP (op, 0)) == PLUS + && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF + && ENCODED_NAME_P (XSTR (XEXP (XEXP (op, 0), 0), 0)) + && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT + && CONST_OK_FOR_K (INTVAL (XEXP (XEXP (op, 0), 1)))); + + return FALSE; +} + +int +movsi_source_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + /* Some constants, as well as symbolic operands + must be done with HIGH & LO_SUM patterns. */ + if (CONSTANT_P (op) + && GET_CODE (op) != HIGH + && !(GET_CODE (op) == CONST_INT + && (CONST_OK_FOR_J (INTVAL (op)) + || CONST_OK_FOR_K (INTVAL (op)) + || CONST_OK_FOR_L (INTVAL (op))))) + return special_symbolref_operand (op, mode); + else + return general_operand (op, mode); +} + +int +power_of_two_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + if (GET_CODE (op) != CONST_INT) + return 0; + + if (exact_log2 (INTVAL (op)) == -1) + return 0; + return 1; +} + +int +not_power_of_two_operand (op, mode) + rtx op; + enum machine_mode mode; +{ + unsigned int mask; + + if (mode == QImode) + mask = 0xff; + else if (mode == HImode) + mask = 0xffff; + else if (mode == SImode) + mask = 0xffffffff; + else + return 0; + + if (GET_CODE (op) != CONST_INT) + return 0; + + if (exact_log2 (~INTVAL (op) & mask) == -1) + return 0; + return 1; +} + + +/* Substitute memory references involving a pointer, to use the ep pointer, + taking care to save and preserve the ep. */ + +static void +substitute_ep_register (first_insn, last_insn, uses, regno, p_r1, p_ep) + rtx first_insn; + rtx last_insn; + int uses; + int regno; + rtx *p_r1; + rtx *p_ep; +{ + rtx reg = gen_rtx (REG, Pmode, regno); + rtx insn; + int i; + + if (!*p_r1) + { + regs_ever_live[1] = 1; + *p_r1 = gen_rtx (REG, Pmode, 1); + *p_ep = gen_rtx (REG, Pmode, 30); + } + + if (TARGET_DEBUG) + fprintf (stderr, "Saved %d bytes (%d uses of register %s) in function %s, starting as insn %d, ending at %d\n", + 2 * (uses - 3), uses, reg_names[regno], + IDENTIFIER_POINTER (DECL_NAME (current_function_decl)), + INSN_UID (first_insn), INSN_UID (last_insn)); + + if (GET_CODE (first_insn) == NOTE) + first_insn = next_nonnote_insn (first_insn); + + last_insn = next_nonnote_insn (last_insn); + for (insn = first_insn; insn && insn != last_insn; insn = NEXT_INSN (insn)) + { + if (GET_CODE (insn) == INSN) + { + rtx pattern = single_set (insn); + + /* Replace the memory references. */ + if (pattern) + { + rtx *p_mem; + + if (GET_CODE (SET_DEST (pattern)) == MEM + && GET_CODE (SET_SRC (pattern)) == MEM) + p_mem = (rtx *)0; + + else if (GET_CODE (SET_DEST (pattern)) == MEM) + p_mem = &SET_DEST (pattern); + + else if (GET_CODE (SET_SRC (pattern)) == MEM) + p_mem = &SET_SRC (pattern); + + else + p_mem = (rtx *)0; + + if (p_mem) + { + rtx addr = XEXP (*p_mem, 0); + + if (GET_CODE (addr) == REG && REGNO (addr) == regno) + *p_mem = change_address (*p_mem, VOIDmode, *p_ep); + + else if (GET_CODE (addr) == PLUS + && GET_CODE (XEXP (addr, 0)) == REG + && REGNO (XEXP (addr, 0)) == regno + && GET_CODE (XEXP (addr, 1)) == CONST_INT + && ((unsigned)INTVAL (XEXP (addr, 1))) < 256 + && (GET_MODE (*p_mem) != QImode + || ((unsigned)INTVAL (XEXP (addr, 1))) < 128)) + *p_mem = change_address (*p_mem, VOIDmode, + gen_rtx (PLUS, Pmode, + *p_ep, XEXP (addr, 1))); + } + } + } + } + + /* Optimize back to back cases of ep <- r1 & r1 <- ep. */ + insn = prev_nonnote_insn (first_insn); + if (insn && GET_CODE (insn) == INSN + && GET_CODE (PATTERN (insn)) == SET + && SET_DEST (PATTERN (insn)) == *p_ep + && SET_SRC (PATTERN (insn)) == *p_r1) + delete_insn (insn); + else + emit_insn_before (gen_rtx (SET, Pmode, *p_r1, *p_ep), first_insn); + + emit_insn_before (gen_rtx (SET, Pmode, *p_ep, reg), first_insn); + emit_insn_before (gen_rtx (SET, Pmode, *p_ep, *p_r1), last_insn); +} + + +/* In rare cases, correct code generation requires extra machine + dependent processing between the second jump optimization pass and + delayed branch scheduling. On those machines, define this macro + as a C statement to act on the code starting at INSN. + + On the 850, we use it to implement the -mep mode to copy heavily used + pointers to ep to use the implicit addressing */ + +void v850_reorg (start_insn) + rtx start_insn; +{ + struct { + int uses; + rtx first_insn; + rtx last_insn; + } regs[FIRST_PSEUDO_REGISTER]; + + int i; + int use_ep = FALSE; + rtx r1 = NULL_RTX; + rtx ep = NULL_RTX; + rtx insn; + rtx pattern; + + /* If not ep mode, just return now */ + if (!TARGET_EP) + return; + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + regs[i].uses = 0; + regs[i].first_insn = NULL_RTX; + regs[i].last_insn = NULL_RTX; + } + + for (insn = start_insn; insn != NULL_RTX; insn = NEXT_INSN (insn)) + { + switch (GET_CODE (insn)) + { + /* End of basic block */ + default: + if (!use_ep) + { + int max_uses = -1; + int max_regno = -1; + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + if (max_uses < regs[i].uses) + { + max_uses = regs[i].uses; + max_regno = i; + } + } + + if (max_uses > 3) + substitute_ep_register (regs[max_regno].first_insn, + regs[max_regno].last_insn, + max_uses, max_regno, &r1, &ep); + } + + use_ep = FALSE; + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + regs[i].uses = 0; + regs[i].first_insn = NULL_RTX; + regs[i].last_insn = NULL_RTX; + } + break; + + case NOTE: + break; + + case INSN: + pattern = single_set (insn); + + /* See if there are any memory references we can shorten */ + if (pattern) + { + rtx src = SET_SRC (pattern); + rtx dest = SET_DEST (pattern); + rtx mem; + + if (GET_CODE (dest) == MEM && GET_CODE (src) == MEM) + mem = NULL_RTX; + + else if (GET_CODE (dest) == MEM) + mem = dest; + + else if (GET_CODE (src) == MEM) + mem = src; + + else + mem = NULL_RTX; + + if (mem && ep_memory_operand (mem, GET_MODE (mem))) + use_ep = TRUE; + + else if (!use_ep && mem + && GET_MODE_SIZE (GET_MODE (mem)) <= UNITS_PER_WORD) + { + rtx addr = XEXP (mem, 0); + int regno = -1; + int short_p; + + if (GET_CODE (addr) == REG) + { + short_p = TRUE; + regno = REGNO (addr); + } + + else if (GET_CODE (addr) == PLUS + && GET_CODE (XEXP (addr, 0)) == REG + && GET_CODE (XEXP (addr, 1)) == CONST_INT + && ((unsigned)INTVAL (XEXP (addr, 1))) < 256 + && (GET_MODE (mem) != QImode + || ((unsigned)INTVAL (XEXP (addr, 1))) < 128)) + { + short_p = TRUE; + regno = REGNO (XEXP (addr, 0)); + } + + else + short_p = FALSE; + + if (short_p) + { + regs[regno].uses++; + regs[regno].last_insn = insn; + if (!regs[regno].first_insn) + regs[regno].first_insn = insn; + } + } + + /* Loading up a register in the basic block zaps any savings + for the register */ + if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG) + { + enum machine_mode mode = GET_MODE (dest); + int word = 0; + int regno; + int endregno; + + while (GET_CODE (dest) == SUBREG) + { + word = SUBREG_WORD (dest); + dest = SUBREG_REG (dest); + } + + regno = REGNO (dest) + word; + endregno = regno + HARD_REGNO_NREGS (regno, mode); + + if (!use_ep) + { + /* See if we can use the pointer before this + modification. */ + int max_uses = -1; + int max_regno = -1; + + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + if (max_uses < regs[i].uses) + { + max_uses = regs[i].uses; + max_regno = i; + } + } + + if (max_uses > 3 + && max_regno >= regno + && max_regno < endregno) + { + substitute_ep_register (regs[max_regno].first_insn, + regs[max_regno].last_insn, + max_uses, max_regno, &r1, &ep); + + /* Since we made a substitution, zap all remembered + registers. */ + for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) + { + regs[i].uses = 0; + regs[i].first_insn = NULL_RTX; + regs[i].last_insn = NULL_RTX; + } + } + } + + for (i = regno; i < endregno; i++) + { + regs[i].uses = 0; + regs[i].first_insn = NULL_RTX; + regs[i].last_insn = NULL_RTX; + } + } + } + } + } +} + + +/* # of registers saved by the interrupt handler. */ +#define INTERRUPT_FIXED_NUM 4 + +/* # of bytes for registers saved by the interrupt handler. */ +#define INTERRUPT_FIXED_SAVE_SIZE (4 * INTERRUPT_FIXED_NUM) + +/* # of registers saved in register parameter area. */ +#define INTERRUPT_REGPARM_NUM 4 +/* # of words saved for other registers. */ +#define INTERRUPT_ALL_SAVE_NUM \ + (30 - INTERRUPT_FIXED_NUM + INTERRUPT_REGPARM_NUM) + +#define INTERRUPT_ALL_SAVE_SIZE (4 * INTERRUPT_ALL_SAVE_NUM) + +int +compute_register_save_size (p_reg_saved) + long *p_reg_saved; +{ + int size = 0; + int i; + int interrupt_handler = v850_interrupt_function_p (current_function_decl); + int call_p = regs_ever_live[31]; + long reg_saved = 0; + + /* Count the return pointer if we need to save it. */ + if (profile_flag && !call_p) + regs_ever_live[31] = call_p = 1; + + /* Count space for the register saves. */ + if (interrupt_handler) + { + for (i = 0; i <= 31; i++) + switch (i) + { + default: + if (regs_ever_live[i] || call_p) + { + size += 4; + reg_saved |= 1L << i; + } + break; + + /* We don't save/restore r0 or the stack pointer */ + case 0: + case STACK_POINTER_REGNUM: + break; + + /* For registers with fixed use, we save them, set them to the + appropriate value, and then restore them. + These registers are handled specially, so don't list them + on the list of registers to save in the prologue. */ + case 1: /* temp used to hold ep */ + case 5: /* gp */ + case 10: /* temp used to call interrupt save/restore */ + case EP_REGNUM: /* ep */ + size += 4; + break; + } + } + + else + for (i = 0; i <= 31; i++) + if (regs_ever_live[i] && ((! call_used_regs[i]) || i == 31)) + { + size += 4; + reg_saved |= 1L << i; + } + + if (p_reg_saved) + *p_reg_saved = reg_saved; + + return size; +} + +int +compute_frame_size (size, p_reg_saved) + int size; + long *p_reg_saved; +{ + extern int current_function_outgoing_args_size; + + return (size + + compute_register_save_size (p_reg_saved) + + current_function_outgoing_args_size); +} + + +void +expand_prologue () +{ + unsigned int i; + int offset; + unsigned int size = get_frame_size (); + unsigned int actual_fsize; + unsigned int init_stack_alloc = 0; + rtx save_regs[32]; + rtx save_all; + int num_save; + int default_stack; + int code; + int interrupt_handler = v850_interrupt_function_p (current_function_decl); + long reg_saved = 0; + + actual_fsize = compute_frame_size (size, ®_saved); + + /* Save/setup global registers for interrupt functions right now */ + if (interrupt_handler) + { + emit_insn (gen_save_interrupt ()); + actual_fsize -= INTERRUPT_FIXED_SAVE_SIZE; + if (((1L << 31) & reg_saved) != 0) + actual_fsize -= INTERRUPT_ALL_SAVE_SIZE; + } + + /* Save arg registers to the stack if necessary. */ + else if (current_function_anonymous_args) + { + if (TARGET_PROLOG_FUNCTION) + emit_insn (gen_save_r6_r9 ()); + else + { + offset = 0; + for (i = 6; i < 10; i++) + { + emit_move_insn (gen_rtx (MEM, SImode, + plus_constant (stack_pointer_rtx, + offset)), + gen_rtx (REG, SImode, i)); + offset += 4; + } + } + } + + /* Identify all of the saved registers */ + num_save = 0; + default_stack = 0; + for (i = 1; i < 31; i++) + { + if (((1L << i) & reg_saved) != 0) + save_regs[num_save++] = gen_rtx (REG, Pmode, i); + } + + /* If the return pointer is saved, the helper functions also allocate + 16 bytes of stack for arguments to be saved in. */ + if (((1L << 31) & reg_saved) != 0) + { + save_regs[num_save++] = gen_rtx (REG, Pmode, 31); + default_stack = 16; + } + + /* See if we have an insn that allocates stack space and saves the particular + registers we want to. */ + save_all = NULL_RTX; + if (TARGET_PROLOG_FUNCTION && num_save > 0 && actual_fsize >= default_stack) + { + int alloc_stack = (4 * num_save) + default_stack; + int unalloc_stack = actual_fsize - alloc_stack; + int save_func_len = 4; + int save_normal_len; + + if (unalloc_stack) + save_func_len += CONST_OK_FOR_J (unalloc_stack) ? 2 : 4; + + /* see if we would have used ep to save the stack */ + if (TARGET_EP && num_save > 3 && (unsigned)actual_fsize < 255) + save_normal_len = (3 * 2) + (2 * num_save); + else + save_normal_len = 4 * num_save; + + save_normal_len += CONST_OK_FOR_J (actual_fsize) ? 2 : 4; + + /* Don't bother checking if we don't actually save any space. + This happens for instance if one register is saved and additional + stack space is allocated. */ + if (save_func_len < save_normal_len) + { + save_all = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (num_save + 2)); + XVECEXP (save_all, 0, 0) = gen_rtx (SET, VOIDmode, + stack_pointer_rtx, + gen_rtx (PLUS, Pmode, + stack_pointer_rtx, + GEN_INT (-alloc_stack))); + + XVECEXP (save_all, 0, num_save+1) + = gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, Pmode, 10)); + + offset = - default_stack; + for (i = 0; i < num_save; i++) + { + XVECEXP (save_all, 0, i+1) + = gen_rtx (SET, VOIDmode, + gen_rtx (MEM, Pmode, + plus_constant (stack_pointer_rtx, offset)), + save_regs[i]); + offset -= 4; + } + + code = recog (save_all, NULL_RTX, NULL_PTR); + if (code >= 0) + { + rtx insn = emit_insn (save_all); + INSN_CODE (insn) = code; + actual_fsize -= alloc_stack; + + if (TARGET_DEBUG) + fprintf (stderr, "Saved %d bytes via prologue function (%d vs. %d) for function %s\n", + save_normal_len - save_func_len, + save_normal_len, save_func_len, + IDENTIFIER_POINTER (DECL_NAME (current_function_decl))); + } + else + save_all = NULL_RTX; + } + } + + /* If no prolog save function is available, store the registers the old fashioned + way (one by one). */ + if (!save_all) + { + /* Special case interrupt functions that save all registers for a call. */ + if (interrupt_handler && ((1L << 31) & reg_saved) != 0) + emit_insn (gen_save_all_interrupt ()); + + else + { + /* If the stack is too big, allocate it in chunks so we can do the + register saves. We use the register save size so we use the ep + register. */ + if (actual_fsize && !CONST_OK_FOR_K (-actual_fsize)) + init_stack_alloc = compute_register_save_size (NULL); + else + init_stack_alloc = actual_fsize; + + /* Save registers at the beginning of the stack frame */ + offset = init_stack_alloc - 4; + + if (init_stack_alloc) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (-init_stack_alloc))); + + /* Save the return pointer first. */ + if (num_save > 0 && REGNO (save_regs[num_save-1]) == 31) + { + emit_move_insn (gen_rtx (MEM, SImode, + plus_constant (stack_pointer_rtx, + offset)), + save_regs[--num_save]); + offset -= 4; + } + + for (i = 0; i < num_save; i++) + { + emit_move_insn (gen_rtx (MEM, SImode, + plus_constant (stack_pointer_rtx, + offset)), + save_regs[i]); + offset -= 4; + } + } + } + + /* Allocate the rest of the stack that was not allocated above (either it is + > 32K or we just called a function to save the registers and needed more + stack. */ + if (actual_fsize > init_stack_alloc) + { + int diff = actual_fsize - init_stack_alloc; + if (CONST_OK_FOR_K (diff)) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (-diff))); + else + { + rtx reg = gen_rtx (REG, Pmode, 12); + emit_move_insn (reg, GEN_INT (-diff)); + emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, reg)); + } + } + + /* If we need a frame pointer, set it up now. */ + if (frame_pointer_needed) + emit_move_insn (hard_frame_pointer_rtx, stack_pointer_rtx); +} + + +void +expand_epilogue () +{ + unsigned int i; + int offset; + unsigned int size = get_frame_size (); + long reg_saved = 0; + unsigned int actual_fsize = compute_frame_size (size, ®_saved); + unsigned int init_stack_free = 0; + rtx restore_regs[32]; + rtx restore_all; + int num_restore; + int default_stack; + int code; + int interrupt_handler = v850_interrupt_function_p (current_function_decl); + + /* Eliminate the initial stack stored by interrupt functions. */ + if (interrupt_handler) + { + actual_fsize -= INTERRUPT_FIXED_SAVE_SIZE; + if (((1L << 31) & reg_saved) != 0) + actual_fsize -= INTERRUPT_ALL_SAVE_SIZE; + } + + /* Cut off any dynamic stack created. */ + if (frame_pointer_needed) + emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx); + + /* Identify all of the saved registers */ + num_restore = 0; + default_stack = 0; + for (i = 1; i < 31; i++) + { + if (((1L << i) & reg_saved) != 0) + restore_regs[num_restore++] = gen_rtx (REG, Pmode, i); + } + + /* If the return pointer is saved, the helper functions also allocate + 16 bytes of stack for arguments to be saved in. */ + if (((1L << 31) & reg_saved) != 0) + { + restore_regs[num_restore++] = gen_rtx (REG, Pmode, 31); + default_stack = 16; + } + + /* See if we have an insn that restores the particular registers we + want to. */ + restore_all = NULL_RTX; + if (TARGET_PROLOG_FUNCTION && num_restore > 0 && actual_fsize >= default_stack + && !interrupt_handler) + { + int alloc_stack = (4 * num_restore) + default_stack; + int unalloc_stack = actual_fsize - alloc_stack; + int restore_func_len = 4; + int restore_normal_len; + + if (unalloc_stack) + restore_func_len += CONST_OK_FOR_J (unalloc_stack) ? 2 : 4; + + /* see if we would have used ep to restore the registers */ + if (TARGET_EP && num_restore > 3 && (unsigned)actual_fsize < 255) + restore_normal_len = (3 * 2) + (2 * num_restore); + else + restore_normal_len = 4 * num_restore; + + restore_normal_len += (CONST_OK_FOR_J (actual_fsize) ? 2 : 4) + 2; + + /* Don't bother checking if we don't actually save any space. */ + if (restore_func_len < restore_normal_len) + { + restore_all = gen_rtx (PARALLEL, VOIDmode, + rtvec_alloc (num_restore + 2)); + XVECEXP (restore_all, 0, 0) = gen_rtx (RETURN, VOIDmode); + XVECEXP (restore_all, 0, 1) + = gen_rtx (SET, VOIDmode, stack_pointer_rtx, + gen_rtx (PLUS, Pmode, + stack_pointer_rtx, + GEN_INT (alloc_stack))); + + offset = alloc_stack - 4; + for (i = 0; i < num_restore; i++) + { + XVECEXP (restore_all, 0, i+2) + = gen_rtx (SET, VOIDmode, + restore_regs[i], + gen_rtx (MEM, Pmode, + plus_constant (stack_pointer_rtx, offset))); + offset -= 4; + } + + code = recog (restore_all, NULL_RTX, NULL_PTR); + if (code >= 0) + { + rtx insn; + + actual_fsize -= alloc_stack; + if (actual_fsize) + { + if (CONST_OK_FOR_K (actual_fsize)) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (actual_fsize))); + else + { + rtx reg = gen_rtx (REG, Pmode, 12); + emit_move_insn (reg, GEN_INT (actual_fsize)); + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + reg)); + } + } + + insn = emit_jump_insn (restore_all); + INSN_CODE (insn) = code; + + if (TARGET_DEBUG) + fprintf (stderr, "Saved %d bytes via epilogue function (%d vs. %d) in function %s\n", + restore_normal_len - restore_func_len, + restore_normal_len, restore_func_len, + IDENTIFIER_POINTER (DECL_NAME (current_function_decl))); + } + else + restore_all = NULL_RTX; + } + } + + /* If no epilog save function is available, restore the registers the + old fashioned way (one by one). */ + if (!restore_all) + { + /* If the stack is large, we need to cut it down in 2 pieces. */ + if (actual_fsize && !CONST_OK_FOR_K (-actual_fsize)) + init_stack_free = 4 * num_restore; + else + init_stack_free = actual_fsize; + + /* Deallocate the rest of the stack if it is > 32K or if extra stack + was allocated for an interrupt handler that makes a call. */ + if (actual_fsize > init_stack_free || (interrupt_handler && actual_fsize)) + { + int diff = actual_fsize - ((interrupt_handler) ? 0 : init_stack_free); + if (CONST_OK_FOR_K (diff)) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (diff))); + else + { + rtx reg = gen_rtx (REG, Pmode, 12); + emit_move_insn (reg, GEN_INT (diff)); + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + reg)); + } + } + + /* Special case interrupt functions that save all registers + for a call. */ + if (interrupt_handler && ((1L << 31) & reg_saved) != 0) + emit_insn (gen_restore_all_interrupt ()); + else + { + /* Restore registers from the beginning of the stack frame */ + offset = init_stack_free - 4; + + /* Restore the return pointer first. */ + if (num_restore > 0 && REGNO (restore_regs[num_restore-1]) == 31) + { + emit_move_insn (restore_regs[--num_restore], + gen_rtx (MEM, SImode, + plus_constant (stack_pointer_rtx, + offset))); + offset -= 4; + } + + for (i = 0; i < num_restore; i++) + { + emit_move_insn (restore_regs[i], + gen_rtx (MEM, SImode, + plus_constant (stack_pointer_rtx, + offset))); + + offset -= 4; + } + + /* Cut back the remainder of the stack. */ + if (init_stack_free) + emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (init_stack_free))); + } + + /* And return or use reti for interrupt handlers. */ + if (interrupt_handler) + emit_jump_insn (gen_restore_interrupt ()); + else if (actual_fsize) + emit_jump_insn (gen_return_internal ()); + else + emit_jump_insn (gen_return ()); + } + + current_function_anonymous_args = 0; + v850_interrupt_cache_p = FALSE; + v850_interrupt_p = FALSE; +} + + +/* Update the condition code from the insn. */ + +void +notice_update_cc (body, insn) + rtx body; + rtx insn; +{ + switch (get_attr_cc (insn)) + { + case CC_NONE: + /* Insn does not affect CC at all. */ + break; + + case CC_NONE_0HIT: + /* Insn does not change CC, but the 0'th operand has been changed. */ + if (cc_status.value1 != 0 + && reg_overlap_mentioned_p (recog_operand[0], cc_status.value1)) + cc_status.value1 = 0; + break; + + case CC_SET_ZN: + /* Insn sets the Z,N flags of CC to recog_operand[0]. + V,C is in an unusable state. */ + CC_STATUS_INIT; + cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY; + cc_status.value1 = recog_operand[0]; + break; + + case CC_SET_ZNV: + /* Insn sets the Z,N,V flags of CC to recog_operand[0]. + C is in an unusable state. */ + CC_STATUS_INIT; + cc_status.flags |= CC_NO_CARRY; + cc_status.value1 = recog_operand[0]; + break; + + case CC_COMPARE: + /* The insn is a compare instruction. */ + CC_STATUS_INIT; + cc_status.value1 = SET_SRC (body); + break; + + case CC_CLOBBER: + /* Insn doesn't leave CC in a usable state. */ + CC_STATUS_INIT; + break; + } +} + + +/* Return nonzero if ATTR is a valid attribute for DECL. + ATTRIBUTES are any existing attributes and ARGS are the arguments + supplied with ATTR. + + Supported attributes: + + interrupt_handler or interrupt: output a prologue and epilogue suitable + for an interrupt handler. */ + +int +v850_valid_machine_decl_attribute (decl, attributes, attr, args) + tree decl; + tree attributes; + tree attr; + tree args; +{ + if (args != NULL_TREE) + return 0; + + if (is_attribute_p ("interrupt_handler", attr) + || is_attribute_p ("interrupt", attr)) + return TREE_CODE (decl) == FUNCTION_DECL; + + return 0; +} + + +/* Return nonzero if FUNC is an interrupt function as specified + by the "interrupt" attribute. */ + +int +v850_interrupt_function_p (func) + tree func; +{ + tree a; + int ret = 0; + + if (v850_interrupt_cache_p) + return v850_interrupt_p; + + if (TREE_CODE (func) != FUNCTION_DECL) + return 0; + + a = lookup_attribute ("interrupt_handler", DECL_MACHINE_ATTRIBUTES (func)); + if (a != NULL_TREE) + ret = 1; + + else + { + a = lookup_attribute ("interrupt", DECL_MACHINE_ATTRIBUTES (func)); + ret = a != NULL_TREE; + } + + /* Its not safe to trust global variables until after function inlining has + been done. */ + if (reload_completed | reload_in_progress) + v850_interrupt_p = ret; + + return ret; +} + + +extern struct obstack *saveable_obstack; + +v850_encode_data_area (decl) + tree decl; +{ + char *str = XSTR (XEXP (DECL_RTL (decl), 0), 0); + int len = strlen (str); + char *newstr; + + /* In the Cygnus sources we actually do something; this is just + here to make merges easier. */ + return; +} diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h new file mode 100644 index 00000000000..2a05aef749b --- /dev/null +++ b/gcc/config/v850/v850.h @@ -0,0 +1,1406 @@ +/* CYGNUS LOCAL entire file/law */ +/* Definitions of target machine for GNU compiler. + NEC V850 series + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Contributed by Jeff Law (law@cygnus.com). + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include "svr4.h" + +#undef ASM_SPEC +#undef ASM_FINAL_SPEC +#undef LIB_SPEC +#undef ENDFILE_SPEC +#undef LINK_SPEC +#undef STARTFILE_SPEC + +/* Names to predefine in the preprocessor for this target machine. */ + +#define CPP_PREDEFINES "-D__v850__ -D__v851__ -D__v850" + + +/* Run-time compilation parameters selecting different hardware subsets. */ + +extern int target_flags; + +/* Target flags bits, see below for an explanation of the bits. */ +#define MASK_GHS 0x00000001 +#define MASK_LONG_CALLS 0x00000002 +#define MASK_EP 0x00000004 +#define MASK_PROLOG_FUNCTION 0x00000008 +#define MASK_DEBUG 0x40000000 + +/* Macros used in the machine description to test the flags. */ + +/* The GHS calling convention support doesn't really work, + mostly due to a lack of documentation. Outstanding issues: + + * How do varargs & stdarg really work. How to they handle + passing structures (if at all). + + * Doubles are normally 4 byte aligned, except in argument + lists where they are 8 byte aligned. Is the alignment + in the argument list based on the first parameter, + first stack parameter, etc etc. + + * Passing/returning of large structures probably isn't the same + as GHS. We don't have enough documentation on their conventions + to be compatable. + + * Tests of SETUP_INCOMING_VARARGS need to be made runtime checks + since it depends on TARGET_GHS. */ +#define TARGET_GHS (target_flags & MASK_GHS) + +/* Don't do PC-relative calls, instead load the address of the target + function into a register and perform a register indirect call. */ +#define TARGET_LONG_CALLS (target_flags & MASK_LONG_CALLS) + +/* Whether to optimize space by using ep (r30) for pointers with small offsets + in basic blocks. */ +#define TARGET_EP (target_flags & MASK_EP) + +/* Whether to call out-of-line functions to save registers or not. */ +#define TARGET_PROLOG_FUNCTION (target_flags & MASK_PROLOG_FUNCTION) + +/* General debug flag */ +#define TARGET_DEBUG (target_flags & MASK_DEBUG) + +/* Macro to define tables used to set the flags. + This is a list in braces of pairs in braces, + each pair being { "NAME", VALUE } + where VALUE is the bits to set or minus the bits to clear. + An empty string NAME is used to identify the default VALUE. */ + +#define TARGET_SWITCHES \ + {{ "ghs", MASK_GHS }, \ + { "no-ghs", -MASK_GHS }, \ + { "long-calls", MASK_LONG_CALLS }, \ + { "no-long-calls", -MASK_LONG_CALLS }, \ + { "ep", MASK_EP }, \ + { "no-ep", -MASK_EP }, \ + { "prolog-function", MASK_PROLOG_FUNCTION }, \ + { "no-prolog-function", -MASK_PROLOG_FUNCTION }, \ + { "space", MASK_EP | MASK_PROLOG_FUNCTION }, \ + { "debug", MASK_DEBUG }, \ + { "", TARGET_DEFAULT}} + +#ifndef TARGET_DEFAULT +#define TARGET_DEFAULT 0 +#endif + +/* Information about the various small memory areas. */ +struct small_memory_info { + char *name; + char *value; + long max; + long physical_max; +}; + +enum small_memory_type { + /* tiny data area, using EP as base register */ + SMALL_MEMORY_TDA = 0, + /* small data area using dp as base register */ + SMALL_MEMORY_SDA, + /* zero data area using r0 as base register */ + SMALL_MEMORY_ZDA, + SMALL_MEMORY_max +}; + +extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max]; + +/* This macro is similar to `TARGET_SWITCHES' but defines names of + command options that have values. Its definition is an + initializer with a subgrouping for each command option. + + Each subgrouping contains a string constant, that defines the + fixed part of the option name, and the address of a variable. The + variable, type `char *', is set to the variable part of the given + option if the fixed part matches. The actual option name is made + by appending `-m' to the specified name. + + Here is an example which defines `-mshort-data-NUMBER'. If the + given option is `-mshort-data-512', the variable `m88k_short_data' + will be set to the string `"512"'. + + extern char *m88k_short_data; + #define TARGET_OPTIONS \ + { { "short-data-", &m88k_short_data } } */ + +#define TARGET_OPTIONS \ +{ \ + { "tda=", &small_memory[ (int)SMALL_MEMORY_TDA ].value }, \ + { "tda-", &small_memory[ (int)SMALL_MEMORY_TDA ].value }, \ + { "sda=", &small_memory[ (int)SMALL_MEMORY_SDA ].value }, \ + { "sda-", &small_memory[ (int)SMALL_MEMORY_SDA ].value }, \ + { "zda=", &small_memory[ (int)SMALL_MEMORY_ZDA ].value }, \ + { "zda-", &small_memory[ (int)SMALL_MEMORY_ZDA ].value }, \ +} + +/* Print subsidiary information on the compiler version in use. */ + +#define TARGET_VERSION fprintf (stderr, " (NEC V850)"); + +/* Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ +#define OVERRIDE_OPTIONS override_options () + + +/* Show we can debug even without a frame pointer. */ +#define CAN_DEBUG_WITHOUT_FP + +/* Some machines may desire to change what optimizations are + performed for various optimization levels. This macro, if + defined, is executed once just after the optimization level is + determined and before the remainder of the command options have + been parsed. Values set in this macro are used as the default + values for the other command line options. + + LEVEL is the optimization level specified; 2 if `-O2' is + specified, 1 if `-O' is specified, and 0 if neither is specified. + + You should not use this macro to change options that are not + machine-specific. These should uniformly selected by the same + optimization level on all supported machines. Use this macro to + enable machine-specific optimizations. + + *Do not examine `write_symbols' in this macro!* The debugging + options are not supposed to alter the generated code. */ + +#define OPTIMIZATION_OPTIONS(LEVEL) \ +{ \ + if (LEVEL) \ + target_flags |= (MASK_EP | MASK_PROLOG_FUNCTION); \ +} + + +/* Target machine storage layout */ + +/* Define this if most significant bit is lowest numbered + in instructions that operate on numbered bit-fields. + This is not true on the NEC V850. */ +#define BITS_BIG_ENDIAN 0 + +/* Define this if most significant byte of a word is the lowest numbered. */ +/* This is not true on the NEC V850. */ +#define BYTES_BIG_ENDIAN 0 + +/* Define this if most significant word of a multiword number is lowest + numbered. + This is not true on the NEC V850. */ +#define WORDS_BIG_ENDIAN 0 + +/* Number of bits in an addressable storage unit */ +#define BITS_PER_UNIT 8 + +/* Width in bits of a "word", which is the contents of a machine register. + Note that this is not necessarily the width of data type `int'; + if using 16-bit ints on a 68000, this would still be 32. + But on a machine with 16-bit registers, this would be 16. */ +#define BITS_PER_WORD 32 + +/* Width of a word, in units (bytes). */ +#define UNITS_PER_WORD 4 + +/* Width in bits of a pointer. + See also the macro `Pmode' defined below. */ +#define POINTER_SIZE 32 + +/* Define this macro if it is advisable to hold scalars in registers + in a wider mode than that declared by the program. In such cases, + the value is constrained to be within the bounds of the declared + type, but kept valid in the wider mode. The signedness of the + extension may differ from that of the type. + + Some simple experiments have shown that leaving UNSIGNEDP alone + generates the best overall code. */ + +#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ + if (GET_MODE_CLASS (MODE) == MODE_INT \ + && GET_MODE_SIZE (MODE) < 4) \ + { (MODE) = SImode; } + +/* Allocation boundary (in *bits*) for storing arguments in argument list. */ +#define PARM_BOUNDARY 32 + +/* The stack goes in 32 bit lumps. */ +#define STACK_BOUNDARY 32 + +/* Allocation boundary (in *bits*) for the code of a function. + 16 is the minimum boundary; 32 would give better performance. */ +#define FUNCTION_BOUNDARY 16 + +/* No data type wants to be aligned rounder than this. */ +#define BIGGEST_ALIGNMENT 32 + +/* Alignment of field after `int : 0' in a structure. */ +#define EMPTY_FIELD_BOUNDARY 32 + +/* No structure field wants to be aligned rounder than this. */ +#define BIGGEST_FIELD_ALIGNMENT 32 + +/* Define this if move instructions will actually fail to work + when given unaligned data. */ +#define STRICT_ALIGNMENT 1 + +/* Define this as 1 if `char' should by default be signed; else as 0. + + On the NEC V850, loads do sign extension, so make this default. */ +#define DEFAULT_SIGNED_CHAR 1 + +/* Define results of standard character escape sequences. */ +#define TARGET_BELL 007 +#define TARGET_BS 010 +#define TARGET_TAB 011 +#define TARGET_NEWLINE 012 +#define TARGET_VT 013 +#define TARGET_FF 014 +#define TARGET_CR 015 + +/* Standard register usage. */ + +/* Number of actual hardware registers. + The hardware registers are assigned numbers for the compiler + from 0 to just below FIRST_PSEUDO_REGISTER. + + All registers that the compiler knows about must be given numbers, + even those that are not normally considered general registers. */ + +#define FIRST_PSEUDO_REGISTER 34 + +/* 1 for registers that have pervasive standard uses + and are not available for the register allocator. */ + +#define FIXED_REGISTERS \ + { 1, 1, 0, 1, 1, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 1, 0, \ + 1, 1} + +/* 1 for registers not available across function calls. + These must include the FIXED_REGISTERS and also any + registers that can be used without being saved. + The latter must include the registers where values are returned + and the register where structure-value addresses are passed. + Aside from that, you can include as many other registers as you + like. */ + +#define CALL_USED_REGISTERS \ + { 1, 1, 0, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 1, 1, 1, 1, \ + 1, 1, 1, 1, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 1, 1, \ + 1, 1} + +/* List the order in which to allocate registers. Each register must be + listed once, even those in FIXED_REGISTERS. + + On the 850, we make the return registers first, then all of the volatile + registers, then the saved registers in reverse order to better save the + registers with an out of line function , and finnally the fixed + registers. */ + +#define REG_ALLOC_ORDER \ +{ \ + 10, 11, /* return registers */ \ + 12, 13, 14, 15, 16, 17, 18, 19, /* scratch registers */ \ + 6, 7, 8, 9, 31, /* argument registers */ \ + 29, 28, 27, 26, 25, 24, 23, 22, /* saved registers */ \ + 21, 20, 2, \ + 0, 1, 3, 4, 5, 30, 32, 33 /* fixed registers */ \ +} + +/* Return number of consecutive hard regs needed starting at reg REGNO + to hold something of mode MODE. + + This is ordinarily the length in words of a value of mode MODE + but can be less for certain modes in special long registers. */ + +#define HARD_REGNO_NREGS(REGNO, MODE) \ + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + +/* Value is 1 if hard register REGNO can hold a value of machine-mode + MODE. */ + +#define HARD_REGNO_MODE_OK(REGNO, MODE) \ + ((((REGNO) & 1) == 0) || (GET_MODE_SIZE (MODE) <= 4)) + +/* Value is 1 if it is a good idea to tie two pseudo registers + when one has mode MODE1 and one has mode MODE2. + If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2, + for any hard reg, then this must be 0 for correct output. */ +#define MODES_TIEABLE_P(MODE1, MODE2) \ + (MODE1 == MODE2 || GET_MODE_SIZE (MODE1) <= 4 && GET_MODE_SIZE (MODE2) <= 4) + + +/* Define the classes of registers for register constraints in the + machine description. Also define ranges of constants. + + One of the classes must always be named ALL_REGS and include all hard regs. + If there is more than one class, another class must be named NO_REGS + and contain no registers. + + The name GENERAL_REGS must be the name of a class (or an alias for + another name such as ALL_REGS). This is the class of registers + that is allowed by "g" or "r" in a register constraint. + Also, registers outside this class are allocated only when + instructions express preferences for them. + + The classes must be numbered in nondecreasing order; that is, + a larger-numbered class must never be contained completely + in a smaller-numbered class. + + For any two classes, it is very desirable that there be another + class that represents their union. */ + +enum reg_class { + NO_REGS, GENERAL_REGS, ALL_REGS, LIM_REG_CLASSES +}; + +#define N_REG_CLASSES (int) LIM_REG_CLASSES + +/* Give names of register classes as strings for dump file. */ + +#define REG_CLASS_NAMES \ +{ "NO_REGS", "GENERAL_REGS", "ALL_REGS", "LIM_REGS" } + +/* Define which registers fit in which classes. + This is an initializer for a vector of HARD_REG_SET + of length N_REG_CLASSES. */ + +#define REG_CLASS_CONTENTS \ +{ 0x00000000, /* No regs */ \ + 0xffffffff, /* GENERAL_REGS */ \ + 0xffffffff, /* ALL_REGS */ \ +} + +/* The same information, inverted: + Return the class number of the smallest class containing + reg number REGNO. This could be a conditional expression + or could index an array. */ + +#define REGNO_REG_CLASS(REGNO) GENERAL_REGS + +/* The class value for index registers, and the one for base regs. */ + +#define INDEX_REG_CLASS NO_REGS +#define BASE_REG_CLASS GENERAL_REGS + +/* Get reg_class from a letter such as appears in the machine description. */ + +#define REG_CLASS_FROM_LETTER(C) (NO_REGS) + +/* Macros to check register numbers against specific register classes. */ + +/* These assume that REGNO is a hard or pseudo reg number. + They give nonzero only if REGNO is a hard reg of the suitable class + or a pseudo reg currently allocated to a suitable hard reg. + Since they use reg_renumber, they are safe only once reg_renumber + has been allocated, which happens in local-alloc.c. */ + +#define REGNO_OK_FOR_BASE_P(regno) \ + ((regno) < FIRST_PSEUDO_REGISTER || reg_renumber[regno] >= 0) + +#define REGNO_OK_FOR_INDEX_P(regno) 0 + +/* Given an rtx X being reloaded into a reg required to be + in class CLASS, return the class of reg to actually use. + In general this is just CLASS; but on some machines + in some cases it is preferable to use a more restrictive class. */ + +#define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS) + +/* Return the maximum number of consecutive registers + needed to represent mode MODE in a register of class CLASS. */ + +#define CLASS_MAX_NREGS(CLASS, MODE) \ + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + +/* The letters I, J, K, L, M, N, O, P in a register constraint string + can be used to stand for particular ranges of immediate operands. + This macro defines what the ranges are. + C is the letter, and VALUE is a constant value. + Return 1 if VALUE is in the range specified by C. */ + +#define INT_7_BITS(VALUE) ((unsigned) (VALUE) + 0x40 < 0x80) +#define INT_8_BITS(VALUE) ((unsigned) (VALUE) + 0x80 < 0x100) +#define CONST_OK_FOR_I(VALUE) ((VALUE) == 0) +#define CONST_OK_FOR_J(VALUE) ((unsigned) (VALUE) + 0x10 < 0x20) +#define CONST_OK_FOR_K(VALUE) ((unsigned) (VALUE) + 0x8000 < 0x10000) +#define CONST_OK_FOR_L(VALUE) \ + (((unsigned) ((int) (VALUE) >> 16) + 0x8000 < 0x10000) \ + && CONST_OK_FOR_I ((VALUE & 0xffff))) +#define CONST_OK_FOR_M(VALUE) ((unsigned)(VALUE) < 0x10000) + +#define CONST_OK_FOR_N(VALUE) ((unsigned) VALUE >= 0 && (unsigned) VALUE <= 31) /* 5 bit signed immediate in shift instructions */ +#define CONST_OK_FOR_O(VALUE) 0 +#define CONST_OK_FOR_P(VALUE) 0 + +#define CONST_OK_FOR_LETTER_P(VALUE, C) \ + ((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \ + (C) == 'J' ? CONST_OK_FOR_J (VALUE) : \ + (C) == 'K' ? CONST_OK_FOR_K (VALUE) : \ + (C) == 'L' ? CONST_OK_FOR_L (VALUE) : \ + (C) == 'M' ? CONST_OK_FOR_M (VALUE) : \ + (C) == 'N' ? CONST_OK_FOR_N (VALUE) : \ + (C) == 'O' ? CONST_OK_FOR_O (VALUE) : \ + (C) == 'P' ? CONST_OK_FOR_P (VALUE) : \ + 0) + +/* Similar, but for floating constants, and defining letters G and H. + Here VALUE is the CONST_DOUBLE rtx itself. + + `G' is a zero of some form. */ + +#define CONST_DOUBLE_OK_FOR_G(VALUE) \ + ((GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT \ + && (VALUE) == CONST0_RTX (GET_MODE (VALUE))) \ + || (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_INT \ + && CONST_DOUBLE_LOW (VALUE) == 0 \ + && CONST_DOUBLE_HIGH (VALUE) == 0)) + +#define CONST_DOUBLE_OK_FOR_H(VALUE) 0 + +#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ + ((C) == 'G' ? CONST_DOUBLE_OK_FOR_G (VALUE) \ + : (C) == 'H' ? CONST_DOUBLE_OK_FOR_H (VALUE) \ + : 0) + + +/* Stack layout; function entry, exit and calling. */ + +/* Define this if pushing a word on the stack + makes the stack pointer a smaller address. */ + +#define STACK_GROWS_DOWNWARD + +/* Define this if the nominal address of the stack frame + is at the high-address end of the local variables; + that is, each additional local variable allocated + goes at a more negative offset in the frame. */ + +#define FRAME_GROWS_DOWNWARD + +/* Offset within stack frame to start allocating local variables at. + If FRAME_GROWS_DOWNWARD, this is the offset to the END of the + first local allocated. Otherwise, it is the offset to the BEGINNING + of the first local allocated. */ + +#define STARTING_FRAME_OFFSET 0 + +/* Offset of first parameter from the argument pointer register value. */ +/* Is equal to the size of the saved fp + pc, even if an fp isn't + saved since the value is used before we know. */ + +#define FIRST_PARM_OFFSET(FNDECL) 0 + +/* Specify the registers used for certain standard purposes. + The values of these macros are register numbers. */ + +/* Register to use for pushing function arguments. */ +#define STACK_POINTER_REGNUM 3 + +/* Base register for access to local variables of the function. */ +#define FRAME_POINTER_REGNUM 32 + +/* On some machines the offset between the frame pointer and starting + offset of the automatic variables is not known until after register + allocation has been done (for example, because the saved registers + are between these two locations). On those machines, define + `FRAME_POINTER_REGNUM' the number of a special, fixed register to + be used internally until the offset is known, and define + `HARD_FRAME_POINTER_REGNUM' to be actual the hard register number + used for the frame pointer. + + You should define this macro only in the very rare circumstances + when it is not possible to calculate the offset between the frame + pointer and the automatic variables until after register + allocation has been completed. When this macro is defined, you + must also indicate in your definition of `ELIMINABLE_REGS' how to + eliminate `FRAME_POINTER_REGNUM' into either + `HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'. + + Do not define this macro if it would be the same as + `FRAME_POINTER_REGNUM'. */ +#define HARD_FRAME_POINTER_REGNUM 29 + +/* Base register for access to arguments of the function. */ +#define ARG_POINTER_REGNUM 33 + +/* Register in which static-chain is passed to a function. */ +#define STATIC_CHAIN_REGNUM 5 + +/* Value should be nonzero if functions must have frame pointers. + Zero means the frame pointer need not be set up (and parms + may be accessed via the stack pointer) in functions that seem suitable. + This is computed in `reload', in reload1.c. */ +#define FRAME_POINTER_REQUIRED 0 + +/* If defined, this macro specifies a table of register pairs used to + eliminate unneeded registers that point into the stack frame. If + it is not defined, the only elimination attempted by the compiler + is to replace references to the frame pointer with references to + the stack pointer. + + The definition of this macro is a list of structure + initializations, each of which specifies an original and + replacement register. + + On some machines, the position of the argument pointer is not + known until the compilation is completed. In such a case, a + separate hard register must be used for the argument pointer. + This register can be eliminated by replacing it with either the + frame pointer or the argument pointer, depending on whether or not + the frame pointer has been eliminated. + + In this case, you might specify: + #define ELIMINABLE_REGS \ + {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ + {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ + {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} + + Note that the elimination of the argument pointer with the stack + pointer is specified first since that is the preferred elimination. */ + +#define ELIMINABLE_REGS \ +{{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ + { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }, \ + { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ + { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }} \ + +/* A C expression that returns non-zero if the compiler is allowed to + try to replace register number FROM-REG with register number + TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is + defined, and will usually be the constant 1, since most of the + cases preventing register elimination are things that the compiler + already knows about. */ + +#define CAN_ELIMINATE(FROM, TO) \ + ((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1) + +/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It + specifies the initial difference between the specified pair of + registers. This macro must be defined if `ELIMINABLE_REGS' is + defined. */ + +#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ +{ \ + if ((FROM) == FRAME_POINTER_REGNUM) \ + (OFFSET) = get_frame_size () + current_function_outgoing_args_size; \ + else if ((FROM) == ARG_POINTER_REGNUM) \ + (OFFSET) = compute_frame_size (get_frame_size (), (long *)0); \ + else \ + abort (); \ +} + +/* A guess for the V850. */ +#define PROMOTE_PROTOTYPES 1 + +/* Keep the stack pointer constant throughout the function. */ +#define ACCUMULATE_OUTGOING_ARGS + +/* Value is the number of bytes of arguments automatically + popped when returning from a subroutine call. + FUNDECL is the declaration node of the function (as a tree), + FUNTYPE is the data type of the function (as a tree), + or for a library call it is an identifier node for the subroutine name. + SIZE is the number of bytes of arguments passed on the stack. */ + +#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0 + + +/* Define a data type for recording info about an argument list + during the scan of that argument list. This data type should + hold all necessary information about the function itself + and about the args processed so far, enough to enable macros + such as FUNCTION_ARG to determine where the next arg should go. */ + +#define CUMULATIVE_ARGS struct cum_arg +struct cum_arg { int nbytes; }; + +/* Define where to put the arguments to a function. + Value is zero to push the argument on the stack, + or a hard register in which to store the argument. + + MODE is the argument's machine mode. + TYPE is the data type of the argument (as a tree). + This is null for libcalls where that information may + not be available. + CUM is a variable of type CUMULATIVE_ARGS which gives info about + the preceding args and about the function being called. + NAMED is nonzero if this argument is a named parameter + (otherwise it is an extra parameter matching an ellipsis). */ + +struct rtx_def *function_arg(); +#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ + function_arg (&CUM, MODE, TYPE, NAMED) + +#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \ + function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED) + +/* Initialize a variable CUM of type CUMULATIVE_ARGS + for a call to a function whose data type is FNTYPE. + For a library call, FNTYPE is 0. */ + +#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ + ((CUM).nbytes = 0) + +/* Update the data in CUM to advance over an argument + of mode MODE and data type TYPE. + (TYPE is null for libcalls where that information may not be available.) */ + +#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ + ((CUM).nbytes += ((MODE) != BLKmode \ + ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD \ + : (int_size_in_bytes (TYPE) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD)) + +/* When a parameter is passed in a register, stack space is still + allocated for it. */ +#define REG_PARM_STACK_SPACE(DECL) (!TARGET_GHS ? 16 : 0) + +/* Define this if the above stack space is to be considered part of the + space allocated by the caller. */ +#define OUTGOING_REG_PARM_STACK_SPACE + +extern int current_function_anonymous_args; +/* Do any setup necessary for varargs/stdargs functions. */ +#define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \ + current_function_anonymous_args = (!TARGET_GHS ? 1 : 0); + +#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ + ((TYPE) && int_size_in_bytes (TYPE) > 8) + +#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) \ + ((TYPE) && int_size_in_bytes (TYPE) > 8) + +/* 1 if N is a possible register number for function argument passing. */ + +#define FUNCTION_ARG_REGNO_P(N) (N >= 6 && N <= 9) + +/* Define how to find the value returned by a function. + VALTYPE is the data type of the value (as a tree). + If the precise function being called is known, FUNC is its FUNCTION_DECL; + otherwise, FUNC is 0. */ + +#define FUNCTION_VALUE(VALTYPE, FUNC) \ + gen_rtx (REG, TYPE_MODE (VALTYPE), 10) + +/* Define how to find the value returned by a library function + assuming the value has mode MODE. */ + +#define LIBCALL_VALUE(MODE) \ + gen_rtx (REG, MODE, 10) + +/* 1 if N is a possible register number for a function value. */ + +#define FUNCTION_VALUE_REGNO_P(N) ((N) == 10) + +/* Return values > 8 bytes in length in memory. */ +#define DEFAULT_PCC_STRUCT_RETURN 0 +#define RETURN_IN_MEMORY(TYPE) \ + (int_size_in_bytes (TYPE) > 8 || TYPE_MODE (TYPE) == BLKmode) + +/* Register in which address to store a structure value + is passed to a function. On the V850 it's passed as + the first parameter. */ + +#define STRUCT_VALUE 0 + +/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, + the stack pointer does not matter. The value is tested only in + functions that have frame pointers. + No definition is equivalent to always zero. */ + +#define EXIT_IGNORE_STACK 1 + +/* Output assembler code to FILE to increment profiler label # LABELNO + for profiling a function entry. */ + +#define FUNCTION_PROFILER(FILE, LABELNO) ; + +#define TRAMPOLINE_TEMPLATE(FILE) \ + do { \ + fprintf (FILE, "\tjarl .+4,r12\n"); \ + fprintf (FILE, "\tld.w 12[r12],r5\n"); \ + fprintf (FILE, "\tld.w 16[r12],r12\n"); \ + fprintf (FILE, "\tjmp [r12]\n"); \ + fprintf (FILE, "\tnop\n"); \ + fprintf (FILE, "\t.long 0\n"); \ + fprintf (FILE, "\t.long 0\n"); \ + } while (0) + +/* Length in units of the trampoline for entering a nested function. */ + +#define TRAMPOLINE_SIZE 24 + +/* Emit RTL insns to initialize the variable parts of a trampoline. + FNADDR is an RTX for the address of the function's pure code. + CXT is an RTX for the static chain value for the function. */ + +#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ +{ \ + emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 16)), \ + (CXT)); \ + emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 20)), \ + (FNADDR)); \ +} + +/* Addressing modes, and classification of registers for them. */ + + +/* 1 if X is an rtx for a constant that is a valid address. */ + +#define CONSTANT_ADDRESS_P(X) \ + (GET_CODE (X) == CONST_INT \ + && CONST_OK_FOR_K (INTVAL (X))) + +/* Maximum number of registers that can appear in a valid memory address. */ + +#define MAX_REGS_PER_ADDRESS 1 + +/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx + and check its validity for a certain class. + We have two alternate definitions for each of them. + The usual definition accepts all pseudo regs; the other rejects + them unless they have been allocated suitable hard regs. + The symbol REG_OK_STRICT causes the latter definition to be used. + + Most source files want to accept pseudo regs in the hope that + they will get allocated to the class that the insn wants them to be in. + Source files for reload pass need to be strict. + After reload, it makes no difference, since pseudo regs have + been eliminated by then. */ + +#ifndef REG_OK_STRICT + +/* Nonzero if X is a hard reg that can be used as an index + or if it is a pseudo reg. */ +#define REG_OK_FOR_INDEX_P(X) 0 +/* Nonzero if X is a hard reg that can be used as a base reg + or if it is a pseudo reg. */ +#define REG_OK_FOR_BASE_P(X) 1 +#define REG_OK_FOR_INDEX_P_STRICT(X) 0 +#define REG_OK_FOR_BASE_P_STRICT(X) REGNO_OK_FOR_BASE_P (REGNO (X)) +#define STRICT 0 + +#else + +/* Nonzero if X is a hard reg that can be used as an index. */ +#define REG_OK_FOR_INDEX_P(X) 0 +/* Nonzero if X is a hard reg that can be used as a base reg. */ +#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) +#define STRICT 1 + +#endif + +/* A C expression that defines the optional machine-dependent + constraint letters that can be used to segregate specific types of + operands, usually memory references, for the target machine. + Normally this macro will not be defined. If it is required for a + particular target machine, it should return 1 if VALUE corresponds + to the operand type represented by the constraint letter C. If C + is not defined as an extra constraint, the value returned should + be 0 regardless of VALUE. + + For example, on the ROMP, load instructions cannot have their + output in r0 if the memory reference contains a symbolic address. + Constraint letter `Q' is defined as representing a memory address + that does *not* contain a symbolic address. An alternative is + specified with a `Q' constraint on the input and `r' on the + output. The next alternative specifies `m' on the input and a + register class that does not include r0 on the output. */ + +#define EXTRA_CONSTRAINT(OP, C) \ + ((C) == 'Q' ? ep_memory_operand (OP, GET_MODE (OP)) \ + : (C) == 'R' ? special_symbolref_operand (OP, VOIDmode) \ + : (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF && ! ZDA_NAME_P (XSTR (OP, 0))) \ + : (C) == 'T' ? 0 \ + : (C) == 'U' ? 0 \ + : 0) + +/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression + that is a valid memory address for an instruction. + The MODE argument is the machine mode for the MEM expression + that wants to use this address. + + The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS, + except for CONSTANT_ADDRESS_P which is actually + machine-independent. */ + +/* Accept either REG or SUBREG where a register is valid. */ + +#define RTX_OK_FOR_BASE_P(X) \ + ((REG_P (X) && REG_OK_FOR_BASE_P (X)) \ + || (GET_CODE (X) == SUBREG && REG_P (SUBREG_REG (X)) \ + && REG_OK_FOR_BASE_P (SUBREG_REG (X)))) + +#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ +do { \ + if (RTX_OK_FOR_BASE_P (X)) goto ADDR; \ + if (CONSTANT_ADDRESS_P (X) \ + && (MODE == QImode || INTVAL (X) % 2 == 0)) \ + goto ADDR; \ + if (GET_CODE (X) == LO_SUM \ + && GET_CODE (XEXP (X, 0)) == REG \ + && REG_OK_FOR_BASE_P (XEXP (X, 0)) \ + && CONSTANT_P (XEXP (X, 1)) \ + && (GET_CODE (XEXP (X, 1)) != CONST_INT \ + || ((MODE == QImode || INTVAL (XEXP (X, 1)) % 2 == 0) \ + && CONST_OK_FOR_K (INTVAL (XEXP (X, 1))))) \ + && GET_MODE_SIZE (MODE) <= GET_MODE_SIZE (word_mode)) \ + goto ADDR; \ + if (special_symbolref_operand (X, MODE) \ + && (GET_MODE_SIZE (MODE) <= GET_MODE_SIZE (word_mode))) \ + goto ADDR; \ + if (GET_CODE (X) == PLUS \ + && CONSTANT_ADDRESS_P (XEXP (X, 1)) \ + && (MODE == QImode || INTVAL (XEXP (X, 1)) % 2 == 0) \ + && RTX_OK_FOR_BASE_P (XEXP (X, 0))) goto ADDR; \ +} while (0) + + +/* Try machine-dependent ways of modifying an illegitimate address + to be legitimate. If we find one, return the new, valid address. + This macro is used in only one place: `memory_address' in explow.c. + + OLDX is the address as it was before break_out_memory_refs was called. + In some cases it is useful to look at this to decide what needs to be done. + + MODE and WIN are passed so that this macro can use + GO_IF_LEGITIMATE_ADDRESS. + + It is always safe for this macro to do nothing. It exists to recognize + opportunities to optimize the output. */ + +#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) {} + +/* Go to LABEL if ADDR (a legitimate address expression) + has an effect that depends on the machine mode it is used for. */ + +#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) {} + +/* Nonzero if the constant value X is a legitimate general operand. + It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ + +#define LEGITIMATE_CONSTANT_P(X) \ + (GET_CODE (X) == CONST_DOUBLE \ + || !(GET_CODE (X) == CONST \ + && GET_CODE (XEXP (X, 0)) == PLUS \ + && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF \ + && GET_CODE (XEXP (XEXP (X, 0), 1)) == CONST_INT \ + && ! CONST_OK_FOR_K (INTVAL (XEXP (XEXP (X, 0), 1))))) + +/* In rare cases, correct code generation requires extra machine + dependent processing between the second jump optimization pass and + delayed branch scheduling. On those machines, define this macro + as a C statement to act on the code starting at INSN. */ + +#define MACHINE_DEPENDENT_REORG(INSN) v850_reorg (INSN) + + +/* Tell final.c how to eliminate redundant test instructions. */ + +/* Here we define machine-dependent flags and fields in cc_status + (see `conditions.h'). No extra ones are needed for the vax. */ + +/* Store in cc_status the expressions + that the condition codes will describe + after execution of an instruction whose pattern is EXP. + Do not alter them if the instruction would not alter the cc's. */ + +#define CC_OVERFLOW_UNUSABLE 0x200 +#define CC_NO_CARRY CC_NO_OVERFLOW +#define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP, INSN) + +/* A part of a C `switch' statement that describes the relative costs + of constant RTL expressions. It must contain `case' labels for + expression codes `const_int', `const', `symbol_ref', `label_ref' + and `const_double'. Each case must ultimately reach a `return' + statement to return the relative cost of the use of that kind of + constant value in an expression. The cost may depend on the + precise value of the constant, which is available for examination + in X, and the rtx code of the expression in which it is contained, + found in OUTER_CODE. + + CODE is the expression code--redundant, since it can be obtained + with `GET_CODE (X)'. */ + +#define CONST_COSTS(RTX,CODE,OUTER_CODE) \ + case CONST_INT: \ + case CONST_DOUBLE: \ + case CONST: \ + case SYMBOL_REF: \ + case LABEL_REF: \ + { \ + int _zxy = const_costs(RTX, CODE); \ + return (_zxy) ? COSTS_N_INSNS (_zxy) : 0; \ + } + +/* A crude cut at RTX_COSTS for the V850. */ + +/* Provide the costs of a rtl expression. This is in the body of a + switch on CODE. + + There aren't DImode MOD, DIV or MULT operations, so call them + very expensive. Everything else is pretty much a costant cost. */ + +#define RTX_COSTS(RTX,CODE,OUTER_CODE) \ + case MOD: \ + case DIV: \ + return 60; \ + case MULT: \ + return 20; + +/* All addressing modes have the same cost on the V850 series. */ +#define ADDRESS_COST(ADDR) 1 + +/* Nonzero if access to memory by bytes or half words is no faster + than accessing full words. */ +#define SLOW_BYTE_ACCESS 1 + +/* Define this if zero-extension is slow (more than one real instruction). */ +#define SLOW_ZERO_EXTEND + +/* According expr.c, a value of around 6 should minimize code size, and + for the V850 series, that's our primary concern. */ +#define MOVE_RATIO 6 + +/* Indirect calls are expensive, never turn a direct call + into an indirect call. */ +#define NO_FUNCTION_CSE + +/* A list of names for sections other than the standard two, which are + `in_text' and `in_data'. You need not define this macro on a + system with no other sections (that GCC needs to use). */ +#undef EXTRA_SECTIONS +#define EXTRA_SECTIONS in_tdata, in_sdata, in_zdata, in_const, in_ctors, in_dtors + +/* One or more functions to be defined in `varasm.c'. These + functions should do jobs analogous to those of `text_section' and + `data_section', for your additional sections. Do not define this + macro if you do not define `EXTRA_SECTIONS'. */ +#undef EXTRA_SECTION_FUNCTIONS +#define EXTRA_SECTION_FUNCTIONS \ +CONST_SECTION_FUNCTION \ +CTORS_SECTION_FUNCTION \ +DTORS_SECTION_FUNCTION \ + \ +void \ +sdata_section () \ +{ \ + if (in_section != in_sdata) \ + { \ + fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP); \ + in_section = in_sdata; \ + } \ +} \ + \ +void \ +tdata_section () \ +{ \ + if (in_section != in_tdata) \ + { \ + fprintf (asm_out_file, "%s\n", TDATA_SECTION_ASM_OP); \ + in_section = in_tdata; \ + } \ +} \ + \ +void \ +zdata_section () \ +{ \ + if (in_section != in_zdata) \ + { \ + fprintf (asm_out_file, "%s\n", ZDATA_SECTION_ASM_OP); \ + in_section = in_zdata; \ + } \ +} + +#define TEXT_SECTION_ASM_OP "\t.section .text" +#define DATA_SECTION_ASM_OP "\t.section .data" +#define BSS_SECTION_ASM_OP "\t.section .bss" +#define SDATA_SECTION_ASM_OP "\t.section .sdata,\"aw\"" +#define SBSS_SECTION_ASM_OP "\t.section .sbss,\"aw\"" +#define ZDATA_SECTION_ASM_OP "\t.section .zdata,\"aw\"" +#define ZBSS_SECTION_ASM_OP "\t.section .zbss,\"aw\"" +#define TDATA_SECTION_ASM_OP "\t.section .tdata,\"aw\"" + +/* A C statement or statements to switch to the appropriate section + for output of EXP. You can assume that EXP is either a `VAR_DECL' + node or a constant of some sort. RELOC indicates whether the + initial value of EXP requires link-time relocations. Select the + section by calling `text_section' or one of the alternatives for + other sections. + + Do not define this macro if you put all read-only variables and + constants in the read-only data section (usually the text section). */ +#undef SELECT_SECTION +#define SELECT_SECTION(EXP, RELOC) \ +do { \ + if (TREE_CODE (EXP) == VAR_DECL) \ + { \ + if (!TREE_READONLY (EXP) || TREE_SIDE_EFFECTS (EXP) \ + || !DECL_INITIAL (EXP) \ + || (DECL_INITIAL (EXP) != error_mark_node \ + && !TREE_CONSTANT (DECL_INITIAL (EXP)))) \ + data_section (); \ + else \ + const_section (); \ + } \ + else if (TREE_CODE (EXP) == STRING_CST) \ + { \ + if (! flag_writable_strings) \ + const_section (); \ + else \ + data_section (); \ + } \ + \ + else \ + const_section (); \ + \ +} while (0) + +/* A C statement or statements to switch to the appropriate section + for output of RTX in mode MODE. You can assume that RTX is some + kind of constant in RTL. The argument MODE is redundant except in + the case of a `const_int' rtx. Select the section by calling + `text_section' or one of the alternatives for other sections. + + Do not define this macro if you put all constants in the read-only + data section. */ +/* #define SELECT_RTX_SECTION(MODE, RTX) */ + +/* Output at beginning/end of assembler file. */ +#undef ASM_FILE_START +#define ASM_FILE_START(FILE) asm_file_start(FILE) + +#define ASM_COMMENT_START "#" + +/* Output to assembler file text saying following lines + may contain character constants, extra white space, comments, etc. */ + +#define ASM_APP_ON "#APP\n" + +/* Output to assembler file text saying following lines + no longer contain unusual constructs. */ + +#define ASM_APP_OFF "#NO_APP\n" + +/* This is how to output an assembler line defining a `double' constant. + It is .double or .float, depending. */ + +#define ASM_OUTPUT_DOUBLE(FILE, VALUE) \ +do { char dstr[30]; \ + REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr); \ + fprintf (FILE, "\t.double %s\n", dstr); \ + } while (0) + + +/* This is how to output an assembler line defining a `float' constant. */ +#define ASM_OUTPUT_FLOAT(FILE, VALUE) \ +do { char dstr[30]; \ + REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr); \ + fprintf (FILE, "\t.float %s\n", dstr); \ + } while (0) + +/* This is how to output an assembler line defining an `int' constant. */ + +#define ASM_OUTPUT_INT(FILE, VALUE) \ +( fprintf (FILE, "\t.long "), \ + output_addr_const (FILE, (VALUE)), \ + fprintf (FILE, "\n")) + +/* Likewise for `char' and `short' constants. */ + +#define ASM_OUTPUT_SHORT(FILE, VALUE) \ +( fprintf (FILE, "\t.hword "), \ + output_addr_const (FILE, (VALUE)), \ + fprintf (FILE, "\n")) + +#define ASM_OUTPUT_CHAR(FILE, VALUE) \ +( fprintf (FILE, "\t.byte "), \ + output_addr_const (FILE, (VALUE)), \ + fprintf (FILE, "\n")) + +/* This is how to output an assembler line for a numeric constant byte. */ +#define ASM_OUTPUT_BYTE(FILE, VALUE) \ + fprintf (FILE, "\t.byte 0x%x\n", (VALUE)) + +/* Define the parentheses used to group arithmetic operations + in assembler code. */ + +#define ASM_OPEN_PAREN "(" +#define ASM_CLOSE_PAREN ")" + +/* This says how to output the assembler to define a global + uninitialized but not common symbol. + Try to use asm_output_bss to implement this macro. */ + +#define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED) \ + asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED)) + +/* This is how to output the definition of a user-level label named NAME, + such as the label on a static function or variable NAME. */ + +#define ASM_OUTPUT_LABEL(FILE, NAME) \ + do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0) + +/* This is how to output a command to make the user-level label named NAME + defined for reference from other files. */ + +#define ASM_GLOBALIZE_LABEL(FILE, NAME) \ + do { fputs ("\t.global ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0) + +/* This is how to output a reference to a user-level label named NAME. + `assemble_name' uses this. */ + +#undef ASM_OUTPUT_LABELREF +#define ASM_OUTPUT_LABELREF(FILE, NAME) \ + do { \ + char* real_name; \ + STRIP_NAME_ENCODING (real_name, (NAME)); \ + fprintf (FILE, "_%s", real_name); \ + } while (0) + +/* Store in OUTPUT a string (made with alloca) containing + an assembler-name for a local static variable named NAME. + LABELNO is an integer which is different for each call. */ + +#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ +( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \ + sprintf ((OUTPUT), "%s___%d", (NAME), (LABELNO))) + +/* This is how we tell the assembler that two symbols have the same value. */ + +#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \ + do { assemble_name(FILE, NAME1); \ + fputs(" = ", FILE); \ + assemble_name(FILE, NAME2); \ + fputc('\n', FILE); } while (0) + + +/* How to refer to registers in assembler output. + This sequence is indexed by compiler's hard-register-number (see above). */ + +#define REGISTER_NAMES \ +{ "r0", "r1", "r2", "sp", "gp", "r5", "r6" , "r7", \ + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \ + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \ + "r24", "r25", "r26", "r27", "r28", "r29", "ep", "r31", \ + ".fp", ".ap"} + +#define ADDITIONAL_REGISTER_NAMES \ +{ { "zero", 0 }, \ + { "hp", 2 }, \ + { "r3", 3 }, \ + { "r4", 4 }, \ + { "tp", 5 }, \ + { "fp", 29 }, \ + { "r30", 30 }, \ + { "lp", 31} } + +/* Print an instruction operand X on file FILE. + look in v850.c for details */ + +#define PRINT_OPERAND(FILE, X, CODE) print_operand(FILE,X,CODE) + +#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ + ((CODE) == '.') + +/* Print a memory operand whose address is X, on file FILE. + This uses a function in output-vax.c. */ + +#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR) + +#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) +#define ASM_OUTPUT_REG_POP(FILE,REGNO) + +/* This is how to output an element of a case-vector that is absolute. */ + +#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ + asm_fprintf (FILE, "\t%s .L%d\n", ".long", VALUE) + +/* This is how to output an element of a case-vector that is relative. */ + +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ + fprintf (FILE, "\t%s .L%d-.L%d\n", ".long", VALUE, REL) + +#define ASM_OUTPUT_ALIGN(FILE,LOG) \ + if ((LOG) != 0) \ + fprintf (FILE, "\t.align %d\n", (LOG)) + +/* We don't have to worry about dbx compatability for the v850. */ +#define DEFAULT_GDB_EXTENSIONS 1 + +/* Use stabs debugging info by default. */ +#undef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG + +#define DBX_REGISTER_NUMBER(REGNO) REGNO + +/* Define to use software floating point emulator for REAL_ARITHMETIC and + decimal <-> binary conversion. */ +#define REAL_ARITHMETIC + +/* Specify the machine mode that this machine uses + for the index in the tablejump instruction. */ +#define CASE_VECTOR_MODE Pmode + +/* Define this if the case instruction drops through after the table + when the index is out of range. Don't define it if the case insn + jumps to the default label instead. */ +#define CASE_DROPS_THROUGH + +#define WORD_REGISTER_OPERATIONS + +/* Byte and short loads sign extend the value to a word. */ +#define LOAD_EXTEND_OP(MODE) SIGN_EXTEND + +/* Specify the tree operation to be used to convert reals to integers. */ +#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR + +/* This flag, if defined, says the same insns that convert to a signed fixnum + also convert validly to an unsigned one. */ +#define FIXUNS_TRUNC_LIKE_FIX_TRUNC + +/* This is the kind of divide that is easiest to do in the general case. */ +#define EASY_DIV_EXPR TRUNC_DIV_EXPR + +/* Max number of bytes we can move from memory to memory + in one reasonably fast instruction. */ +#define MOVE_MAX 4 + +/* Define if shifts truncate the shift count + which implies one can omit a sign-extension or zero-extension + of a shift count. */ +#define SHIFT_COUNT_TRUNCATED 1 + +/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits + is done just by pretending it is already truncated. */ +#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 + +#define STORE_FLAG_VALUE 1 + +/* Specify the machine mode that pointers have. + After generation of rtl, the compiler makes no further distinction + between pointers and any other objects of this machine mode. */ +#define Pmode SImode + +/* A function address in a call instruction + is a byte address (for indexing purposes) + so give the MEM rtx a byte's mode. */ +#define FUNCTION_MODE QImode + +/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to DECL. */ +#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \ +v850_valid_machine_decl_attribute (DECL, ATTRIBUTES, IDENTIFIER, ARGS) + +/* Tell compiler we have {ZDA,TDA,SDA} small data regions */ +#define HAVE_ZDA 1 +#define HAVE_SDA 1 +#define HAVE_TDA 1 + +/* Tell compiler we want to support GHS pragmas */ +#define HANDLE_GHS_PRAGMA + +/* The assembler op to to start the file. */ + +#define FILE_ASM_OP "\t.file\n" + +/* Enable the register move pass to improve code. */ +#define ENABLE_REGMOVE_PASS + + +/* Implement ZDA, TDA, and SDA */ + +#define EP_REGNUM 30 /* ep register number */ + +#define ENCODE_SECTION_INFO(DECL) \ +do { \ + if ((TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)) \ + && TREE_CODE (DECL) == VAR_DECL) \ + v850_encode_data_area (DECL); \ +} while (0) + +#define ZDA_NAME_FLAG_CHAR '@' +#define TDA_NAME_FLAG_CHAR '%' +#define SDA_NAME_FLAG_CHAR '&' + +#define ZDA_NAME_P(NAME) (*(NAME) == ZDA_NAME_FLAG_CHAR) +#define TDA_NAME_P(NAME) (*(NAME) == TDA_NAME_FLAG_CHAR) +#define SDA_NAME_P(NAME) (*(NAME) == SDA_NAME_FLAG_CHAR) + +#define ENCODED_NAME_P(SYMBOL_NAME) \ + (ZDA_NAME_P (SYMBOL_NAME) \ + || TDA_NAME_P (SYMBOL_NAME) \ + || SDA_NAME_P (SYMBOL_NAME)) + +#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \ + (VAR) = (SYMBOL_NAME) + (ENCODED_NAME_P (SYMBOL_NAME) || *(SYMBOL_NAME) == '*') + +/* Define this if you have defined special-purpose predicates in the + file `MACHINE.c'. This macro is called within an initializer of an + array of structures. The first field in the structure is the name + of a predicate and the second field is an array of rtl codes. For + each predicate, list all rtl codes that can be in expressions + matched by the predicate. The list should have a trailing comma. */ + +#define PREDICATE_CODES \ +{ "ep_memory_operand", { MEM }}, \ +{ "reg_or_0_operand", { REG, SUBREG, CONST_INT, CONST_DOUBLE }}, \ +{ "reg_or_int5_operand", { REG, SUBREG, CONST_INT }}, \ +{ "call_address_operand", { REG, SYMBOL_REF }}, \ +{ "movsi_source_operand", { LABEL_REF, SYMBOL_REF, CONST_INT, \ + CONST_DOUBLE, CONST, HIGH, MEM, \ + REG, SUBREG }}, \ +{ "special_symbolref_operand", { SYMBOL_REF }}, \ +{ "power_of_two_operand", { CONST_INT }}, \ +{ "not_power_of_two_operand", { CONST_INT }}, + +extern void override_options (); +extern void asm_file_start (); +extern int function_arg_partial_nregs (); +extern int const_costs (); +extern void print_operand (); +extern void print_operand_address (); +extern char *output_move_double (); +extern char *output_move_single (); +extern int ep_operand (); +extern int reg_or_0_operand (); +extern int reg_or_int5_operand (); +extern int call_address_operand (); +extern int movsi_source_operand (); +extern int power_of_two_operand (); +extern int not_power_of_two_operand (); +extern void v850_reorg (); +extern int compute_register_save_size (); +extern int compute_frame_size (); +extern void expand_prologue (); +extern void expand_epilogue (); +extern void notice_update_cc (); +extern int v850_valid_machine_decl_attribute (); +extern int v850_interrupt_function_p (); +/* END CYGNUS LOCAL */ diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md new file mode 100644 index 00000000000..30ebf8709c0 --- /dev/null +++ b/gcc/config/v850/v850.md @@ -0,0 +1,1852 @@ +;; CYGNUS LOCAL entire file/law +;; GCC machine description for NEC V850 +;; Copyright (C) 1996, 1997 Free Software Foundation, Inc. + +;; Contributed by Jeff Law (law@cygnus.com). + +;; This file is part of GNU CC. + +;; GNU CC 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. + +;; GNU CC 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 GNU CC; see the file COPYING. If not, write to +;; the Free Software Foundation, 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;; The original PO technology requires these to be ordered by speed, +;; so that assigner will pick the fastest. + +;; See file "rtl.def" for documentation on define_insn, match_*, et. al. + +;; The V851 manual states that the instruction address space is 16M; +;; the various branch/call instructions only have a 22bit offset (4M range). +;; +;; One day we'll probably need to handle calls to targets more than 4M +;; away. + +;; The size of instructions in bytes. + +(define_attr "length" "" + (const_int 200)) + +;; Types of instructions (for scheduling purposes). + +(define_attr "type" "load,mult,other" + (const_string "other")) + +;; Condition code settings. +;; none - insn does not affect cc +;; none_0hit - insn does not affect cc but it does modify operand 0 +;; This attribute is used to keep track of when operand 0 changes. +;; See the description of NOTICE_UPDATE_CC for more info. +;; set_znv - sets z,n,v to useable values; c is unknown. +;; set_zn - sets z,n to usable values; v,c is unknown. +;; compare - compare instruction +;; clobber - value of cc is unknown +(define_attr "cc" "none,none_0hit,set_zn,set_znv,compare,clobber" + (const_string "clobber")) + +;; Function units for the V850. As best as I can tell, there's +;; a traditional memory load/use stall as well as a stall if +;; the result of a multiply is used too early. +;; +(define_function_unit "memory" 1 0 (eq_attr "type" "load") 2 0) +(define_function_unit "mult" 1 0 (eq_attr "type" "mult") 2 0) + + +;; ---------------------------------------------------------------------- +;; MOVE INSTRUCTIONS +;; ---------------------------------------------------------------------- + +;; movqi + +(define_expand "movqi" + [(set (match_operand:QI 0 "general_operand" "") + (match_operand:QI 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, QImode) + && !reg_or_0_operand (operand1, QImode)) + operands[1] = copy_to_mode_reg (QImode, operand1); +}") + +(define_insn "*movqi_internal" + [(set (match_operand:QI 0 "general_operand" "=r,r,r,Q,r,m,m") + (match_operand:QI 1 "general_operand" "Jr,n,Q,Ir,m,r,I"))] + "register_operand (operands[0], QImode) + || reg_or_0_operand (operands[1], QImode)" + "* return output_move_single (operands);" + [(set_attr "length" "2,4,2,2,4,4,4") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,load,other,load,other,other")]) + +;; movhi + +(define_expand "movhi" + [(set (match_operand:HI 0 "general_operand" "") + (match_operand:HI 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, HImode) + && !reg_or_0_operand (operand1, HImode)) + operands[1] = copy_to_mode_reg (HImode, operand1); +}") + +(define_insn "*movhi_internal" + [(set (match_operand:HI 0 "general_operand" "=r,r,r,Q,r,m,m") + (match_operand:HI 1 "general_operand" "Jr,n,Q,Ir,m,r,I"))] + "register_operand (operands[0], HImode) + || reg_or_0_operand (operands[1], HImode)" + "* return output_move_single (operands);" + [(set_attr "length" "2,4,2,2,4,4,4") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,load,other,load,other,other")]) + +;; movsi and helpers + +(define_insn "*movsi_high" + [(set (match_operand:SI 0 "register_operand" "=r") + (high:SI (match_operand 1 "" "")))] + "" + "movhi hi(%1),%.,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit") + (set_attr "type" "other")]) + +(define_insn "*movsi_lo" + [(set (match_operand:SI 0 "register_operand" "=r") + (lo_sum:SI (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "immediate_operand" "i")))] + "" + "movea lo(%2),%1,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit") + (set_attr "type" "other")]) + +(define_expand "movsi" + [(set (match_operand:SI 0 "general_operand" "") + (match_operand:SI 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, SImode) + && !reg_or_0_operand (operand1, SImode)) + operands[1] = copy_to_mode_reg (SImode, operand1); + + /* Some constants, as well as symbolic operands + must be done with HIGH & LO_SUM patterns. */ + if (CONSTANT_P (operands[1]) + && GET_CODE (operands[1]) != HIGH + && !special_symbolref_operand (operands[1], VOIDmode) + && !(GET_CODE (operands[1]) == CONST_INT + && (CONST_OK_FOR_J (INTVAL (operands[1])) + || CONST_OK_FOR_K (INTVAL (operands[1])) + || CONST_OK_FOR_L (INTVAL (operands[1]))))) + { + rtx high; + rtx temp; + + if (reload_in_progress || reload_completed) + temp = operands[0]; + else + temp = gen_reg_rtx (SImode); + + emit_insn (gen_rtx (SET, SImode, temp, + gen_rtx (HIGH, SImode, operand1))); + emit_insn (gen_rtx (SET, SImode, operand0, + gen_rtx (LO_SUM, SImode, temp, operand1))); + DONE; + } +}") + +(define_insn "*movsi_internal" + [(set (match_operand:SI 0 "general_operand" "=r,r,r,r,Q,r,r,m,m") + (match_operand:SI 1 "movsi_source_operand" "Jr,K,L,Q,Ir,m,R,r,I"))] + "register_operand (operands[0], SImode) + || reg_or_0_operand (operands[1], SImode)" + "* return output_move_single (operands);" + [(set_attr "length" "2,4,4,2,2,4,4,4,4") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,other,load,other,load,other,other,other")]) + +(define_expand "movdi" + [(set (match_operand:DI 0 "general_operand" "") + (match_operand:DI 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, DImode) + && !reg_or_0_operand (operand1, DImode)) + operands[1] = copy_to_mode_reg (DImode, operand1); +}") + +(define_insn "*movdi_internal" + [(set (match_operand:DI 0 "general_operand" "=r,r,r,r,r,m,m,r") + (match_operand:DI 1 "general_operand" "Jr,K,L,i,m,r,IG,iF"))] + "register_operand (operands[0], DImode) + || reg_or_0_operand (operands[1], DImode)" + "* return output_move_double (operands);" + [(set_attr "length" "4,8,8,16,8,8,8,16") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,other,other,load,other,other,other")]) + +(define_expand "movsf" + [(set (match_operand:SF 0 "general_operand" "") + (match_operand:SF 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, SFmode) + && !reg_or_0_operand (operand1, SFmode)) + operands[1] = copy_to_mode_reg (SFmode, operand1); +}") + +(define_insn "*movsf_internal" + [(set (match_operand:SF 0 "general_operand" "=r,r,r,r,r,Q,r,m,m,r") + (match_operand:SF 1 "general_operand" "Jr,K,L,n,Q,Ir,m,r,IG,iF"))] + "register_operand (operands[0], SFmode) + || reg_or_0_operand (operands[1], SFmode)" + "* return output_move_single (operands);" + [(set_attr "length" "2,4,4,8,2,2,4,4,4,8") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,other,other,load,other,load,other,other,other")]) + +(define_expand "movdf" + [(set (match_operand:DF 0 "general_operand" "") + (match_operand:DF 1 "general_operand" ""))] + "" + " +{ + /* One of the ops has to be in a register or 0 */ + if (!register_operand (operand0, DFmode) + && !reg_or_0_operand (operand1, DFmode)) + operands[1] = copy_to_mode_reg (DFmode, operand1); +}") + +(define_insn "*movdf_internal" + [(set (match_operand:DF 0 "general_operand" "=r,r,r,r,r,m,m,r") + (match_operand:DF 1 "general_operand" "Jr,K,L,i,m,r,IG,iF"))] + "register_operand (operands[0], DFmode) + || reg_or_0_operand (operands[1], DFmode)" + "* return output_move_double (operands);" + [(set_attr "length" "4,8,8,16,8,8,8,16") + (set_attr "cc" "none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit") + (set_attr "type" "other,other,other,other,load,other,other,other")]) + + +;; ---------------------------------------------------------------------- +;; TEST INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "*v850_tst1" + [(set (cc0) (zero_extract:SI (match_operand:QI 0 "memory_operand" "m") + (const_int 1) + (match_operand:QI 1 "const_int_operand" "n")))] + "" + "tst1 %1,%0" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "tstsi" + [(set (cc0) (match_operand:SI 0 "register_operand" "r"))] + "" + "cmp %.,%0" + [(set_attr "length" "2") + (set_attr "cc" "set_znv")]) + +(define_insn "cmpsi" + [(set (cc0) + (compare:SI (match_operand:SI 0 "register_operand" "r,r") + (match_operand:SI 1 "reg_or_int5_operand" "r,J")))] + "" + "@ + cmp %1,%0 + cmp %1,%0" + [(set_attr "length" "2,2") + (set_attr "cc" "compare")]) + +;; ---------------------------------------------------------------------- +;; ADD INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "addsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r,&r") + (plus:SI (match_operand:SI 1 "register_operand" "%0,r,r") + (match_operand:SI 2 "nonmemory_operand" "rJ,K,r")))] + "" + "@ + add %2,%0 + addi %2,%1,%0 + mov %1,%0\;add %2,%0" + [(set_attr "length" "2,4,6") + (set_attr "cc" "set_zn")]) + +;; ---------------------------------------------------------------------- +;; SUBTRACT INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "subsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (minus:SI (match_operand:SI 1 "register_operand" "0,r") + (match_operand:SI 2 "register_operand" "r,0")))] + "" + "@ + sub %2,%0 + subr %1,%0" + [(set_attr "length" "2,2") + (set_attr "cc" "set_zn")]) + +(define_insn "negsi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (neg:SI (match_operand:SI 1 "register_operand" "0")))] + "" + "subr %.,%0" + [(set_attr "length" "2") + (set_attr "cc" "set_zn")]) + +;; ---------------------------------------------------------------------- +;; MULTIPLY INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_expand "mulhisi3" + [(set (match_operand:SI 0 "register_operand" "") + (mult:SI + (sign_extend:SI (match_operand:HI 1 "register_operand" "")) + (sign_extend:SI (match_operand:HI 2 "nonmemory_operand" ""))))] + "" + "") + +(define_insn "*mulhisi3_internal1" + [(set (match_operand:SI 0 "register_operand" "=r") + (mult:SI + (sign_extend:SI (match_operand:HI 1 "register_operand" "%0")) + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] + "" + "mulh %2,%0" + [(set_attr "length" "2") + (set_attr "cc" "none_0hit") + (set_attr "type" "mult")]) + +(define_insn "*mulhisi3_internal2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (mult:SI + (sign_extend:SI (match_operand:HI 1 "register_operand" "%0,r")) + (sign_extend:SI (match_operand 2 "const_int_operand" "J,K"))))] + "" + "@ + mulh %2,%0 + mulhi %2,%1,%0" + [(set_attr "length" "2,4") + (set_attr "cc" "none_0hit,none_0hit") + (set_attr "type" "mult")]) + + +;; ---------------------------------------------------------------------- +;; AND INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "*v850_clr1_1" + [(set (match_operand:QI 0 "memory_operand" "=m") + (subreg:QI + (and:SI (subreg:SI (match_dup 0) 0) + (match_operand:QI 1 "not_power_of_two_operand" "")) 0))] + "" + "* +{ + rtx xoperands[2]; + xoperands[0] = operands[0]; + xoperands[1] = GEN_INT (~INTVAL (operands[1]) & 0xff); + output_asm_insn (\"clr1 %M1,%0\", xoperands); + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_clr1_2" + [(set (match_operand:HI 0 "memory_operand" "=m") + (subreg:HI + (and:SI (subreg:SI (match_dup 0) 0) + (match_operand:HI 1 "not_power_of_two_operand" "")) 0))] + "" + "* +{ + int log2 = exact_log2 (~INTVAL (operands[1]) & 0xffff); + + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"clr1 %1,%0\", xoperands); + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_clr1_3" + [(set (match_operand:SI 0 "memory_operand" "=m") + (and:SI (match_dup 0) + (match_operand:SI 1 "not_power_of_two_operand" "")))] + "" + "* +{ + int log2 = exact_log2 (~INTVAL (operands[1]) & 0xffffffff); + + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"clr1 %1,%0\", xoperands); + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "andsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r,r") + (and:SI (match_operand:SI 1 "register_operand" "%0,0,r") + (match_operand:SI 2 "nonmemory_operand" "r,I,M")))] + "" + "@ + and %2,%0 + and %.,%0 + andi %2,%1,%0" + [(set_attr "length" "2,2,4") + (set_attr "cc" "set_znv")]) + +;; ---------------------------------------------------------------------- +;; OR INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "*v850_set1_1" + [(set (match_operand:QI 0 "memory_operand" "=m") + (subreg:QI (ior:SI (subreg:SI (match_dup 0) 0) + (match_operand 1 "power_of_two_operand" "")) 0))] + "" + "set1 %M1,%0" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_set1_2" + [(set (match_operand:HI 0 "memory_operand" "=m") + (subreg:HI (ior:SI (subreg:SI (match_dup 0) 0) + (match_operand 1 "power_of_two_operand" "")) 0))] + "" + "* +{ + int log2 = exact_log2 (INTVAL (operands[1])); + + if (log2 < 8) + return \"set1 %M1,%0\"; + else + { + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"set1 %1,%0\", xoperands); + } + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_set1_3" + [(set (match_operand:SI 0 "memory_operand" "=m") + (ior:SI (match_dup 0) + (match_operand 1 "power_of_two_operand" "")))] + "" + "* +{ + int log2 = exact_log2 (INTVAL (operands[1])); + + if (log2 < 8) + return \"set1 %M1,%0\"; + else + { + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"set1 %1,%0\", xoperands); + } + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "iorsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r,r") + (ior:SI (match_operand:SI 1 "register_operand" "%0,0,r") + (match_operand:SI 2 "nonmemory_operand" "r,I,M")))] + "" + "@ + or %2,%0 + or %.,%0 + ori %2,%1,%0" + [(set_attr "length" "2,2,4") + (set_attr "cc" "set_znv")]) + +;; ---------------------------------------------------------------------- +;; XOR INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "*v850_not1_1" + [(set (match_operand:QI 0 "memory_operand" "=m") + (subreg:QI (xor:SI (subreg:SI (match_dup 0) 0) + (match_operand 1 "power_of_two_operand" "")) 0))] + "" + "not1 %M1,%0" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_not1_2" + [(set (match_operand:HI 0 "memory_operand" "=m") + (subreg:HI (xor:SI (subreg:SI (match_dup 0) 0) + (match_operand 1 "power_of_two_operand" "")) 0))] + "" + "* +{ + int log2 = exact_log2 (INTVAL (operands[1])); + + if (log2 < 8) + return \"not1 %M1,%0\"; + else + { + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"not1 %1,%0\", xoperands); + } + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "*v850_not1_3" + [(set (match_operand:SI 0 "memory_operand" "=m") + (xor:SI (match_dup 0) + (match_operand 1 "power_of_two_operand" "")))] + "" + "* +{ + int log2 = exact_log2 (INTVAL (operands[1])); + + if (log2 < 8) + return \"not1 %M1,%0\"; + else + { + rtx xoperands[2]; + xoperands[0] = gen_rtx (MEM, QImode, + plus_constant (XEXP (operands[0], 0), log2 / 8)); + xoperands[1] = GEN_INT (log2 % 8); + output_asm_insn (\"not1 %1,%0\", xoperands); + } + return \"\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +(define_insn "xorsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r,r") + (xor:SI (match_operand:SI 1 "register_operand" "%0,0,r") + (match_operand:SI 2 "nonmemory_operand" "r,I,M")))] + "" + "@ + xor %2,%0 + xor %.,%0 + xori %2,%1,%0" + [(set_attr "length" "2,2,4") + (set_attr "cc" "set_znv")]) + +;; ---------------------------------------------------------------------- +;; NOT INSTRUCTIONS +;; ---------------------------------------------------------------------- + +(define_insn "one_cmplsi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (not:SI (match_operand:SI 1 "register_operand" "r")))] + "" + "not %1,%0" + [(set_attr "length" "2") + (set_attr "cc" "set_znv")]) + +;; ----------------------------------------------------------------- +;; BIT FIELDS +;; ----------------------------------------------------------------- +;; Is it worth defining insv and extv for the V850 series?!? + +;; ----------------------------------------------------------------- +;; Scc INSTRUCTIONS +;; ----------------------------------------------------------------- + +(define_insn "sle" + [(set (match_operand:SI 0 "register_operand" "=r") + (le:SI (cc0) (const_int 0)))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0) + return 0; + + return \"setf le,%0\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sleu" + [(set (match_operand:SI 0 "register_operand" "=r") + (leu:SI (cc0) (const_int 0)))] + "" + "setf nh,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sge" + [(set (match_operand:SI 0 "register_operand" "=r") + (ge:SI (cc0) (const_int 0)))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0) + return 0; + + return \"setf ge,%0\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sgeu" + [(set (match_operand:SI 0 "register_operand" "=r") + (geu:SI (cc0) (const_int 0)))] + "" + "setf nl,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "slt" + [(set (match_operand:SI 0 "register_operand" "=r") + (lt:SI (cc0) (const_int 0)))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0) + return 0; + + return \"setf lt,%0\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sltu" + [(set (match_operand:SI 0 "register_operand" "=r") + (ltu:SI (cc0) (const_int 0)))] + "" + "setf l,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sgt" + [(set (match_operand:SI 0 "register_operand" "=r") + (gt:SI (cc0) (const_int 0)))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0) + return 0; + + return \"setf gt,%0\"; +}" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sgtu" + [(set (match_operand:SI 0 "register_operand" "=r") + (gtu:SI (cc0) (const_int 0)))] + "" + "setf h,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "seq" + [(set (match_operand:SI 0 "register_operand" "=r") + (eq:SI (cc0) (const_int 0)))] + "" + "setf z,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + +(define_insn "sne" + [(set (match_operand:SI 0 "register_operand" "=r") + (ne:SI (cc0) (const_int 0)))] + "" + "setf nz,%0" + [(set_attr "length" "4") + (set_attr "cc" "none_0hit")]) + + +;; ---------------------------------------------------------------------- +;; JUMP INSTRUCTIONS +;; ---------------------------------------------------------------------- + +;; Conditional jump instructions + +(define_expand "ble" + [(set (pc) + (if_then_else (le (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bleu" + [(set (pc) + (if_then_else (leu (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bge" + [(set (pc) + (if_then_else (ge (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bgeu" + [(set (pc) + (if_then_else (geu (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "blt" + [(set (pc) + (if_then_else (lt (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bltu" + [(set (pc) + (if_then_else (ltu (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bgt" + [(set (pc) + (if_then_else (gt (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bgtu" + [(set (pc) + (if_then_else (gtu (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "beq" + [(set (pc) + (if_then_else (eq (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_expand "bne" + [(set (pc) + (if_then_else (ne (cc0) + (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "") + +(define_insn "*branch_normal" + [(set (pc) + (if_then_else (match_operator 1 "comparison_operator" + [(cc0) (const_int 0)]) + (label_ref (match_operand 0 "" "")) + (pc)))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0 + && (GET_CODE (operands[1]) == GT + || GET_CODE (operands[1]) == GE + || GET_CODE (operands[1]) == LE + || GET_CODE (operands[1]) == LT)) + return 0; + + if (get_attr_length (insn) == 2) + return \"%b1 %l0\"; + else + return \"%B1 .+6\;jr %l0\"; +}" + [(set (attr "length") + (if_then_else (lt (abs (minus (match_dup 0) (pc))) + (const_int 256)) + (const_int 2) + (const_int 6))) + (set_attr "cc" "none")]) + +(define_insn "*branch_invert" + [(set (pc) + (if_then_else (match_operator 1 "comparison_operator" + [(cc0) (const_int 0)]) + (pc) + (label_ref (match_operand 0 "" ""))))] + "" + "* +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0 + && (GET_CODE (operands[1]) == GT + || GET_CODE (operands[1]) == GE + || GET_CODE (operands[1]) == LE + || GET_CODE (operands[1]) == LT)) + return 0; + if (get_attr_length (insn) == 2) + return \"%B1 %l0\"; + else + return \"%b1 .+6\;jr %l0\"; +}" + [(set (attr "length") + (if_then_else (lt (abs (minus (match_dup 0) (pc))) + (const_int 256)) + (const_int 2) + (const_int 6))) + (set_attr "cc" "none")]) + +;; Unconditional and other jump instructions. + +(define_insn "jump" + [(set (pc) + (label_ref (match_operand 0 "" "")))] + "" + "* +{ + if (get_attr_length (insn) == 2) + return \"br %0\"; + else + return \"jr %0\"; +}" + [(set (attr "length") + (if_then_else (lt (abs (minus (match_dup 0) (pc))) + (const_int 256)) + (const_int 2) + (const_int 4))) + (set_attr "cc" "none")]) + +(define_insn "indirect_jump" + [(set (pc) (match_operand:SI 0 "register_operand" "r"))] + "" + "jmp %0" + [(set_attr "length" "2") + (set_attr "cc" "none")]) + +(define_insn "tablejump" + [(set (pc) (match_operand:SI 0 "register_operand" "r")) + (use (label_ref (match_operand 1 "" "")))] + "" + "jmp %0" + [(set_attr "length" "2") + (set_attr "cc" "none")]) + +;; Call subroutine with no return value. + +(define_expand "call" + [(call (match_operand:QI 0 "general_operand" "") + (match_operand:SI 1 "general_operand" ""))] + "" + " +{ + if (! call_address_operand (XEXP (operands[0], 0)) + || TARGET_LONG_CALLS) + XEXP (operands[0], 0) = force_reg (SImode, XEXP (operands[0], 0)); + emit_call_insn (gen_call_internal (XEXP (operands[0], 0), operands[1])); + DONE; +}") + +(define_insn "call_internal" + [(call (mem:QI (match_operand:SI 0 "call_address_operand" "S,r")) + (match_operand:SI 1 "general_operand" "g,g")) + (clobber (reg:SI 31))] + "" + "@ + jarl %0,r31 + jarl .+4,r31\\n\\tadd 4,r31\\n\\tjmp %0" + [(set_attr "length" "4,8")]) + +;; Call subroutine, returning value in operand 0 +;; (which must be a hard register). + +(define_expand "call_value" + [(set (match_operand 0 "" "") + (call (match_operand:QI 1 "general_operand" "") + (match_operand:SI 2 "general_operand" "")))] + "" + " +{ + if (! call_address_operand (XEXP (operands[1], 0)) + || TARGET_LONG_CALLS) + XEXP (operands[1], 0) = force_reg (SImode, XEXP (operands[1], 0)); + emit_call_insn (gen_call_value_internal (operands[0], + XEXP (operands[1], 0), + operands[2])); + DONE; +}") + +(define_insn "call_value_internal" + [(set (match_operand 0 "" "=r,r") + (call (mem:QI (match_operand:SI 1 "call_address_operand" "S,r")) + (match_operand:SI 2 "general_operand" "g,g"))) + (clobber (reg:SI 31))] + "" + "@ + jarl %1,r31 + jarl .+4,r31\\n\\tadd 4,r31\\n\\tjmp %1" + [(set_attr "length" "4,8")]) + +(define_insn "nop" + [(const_int 0)] + "" + "nop" + [(set_attr "length" "2") + (set_attr "cc" "none")]) + +;; ---------------------------------------------------------------------- +;; EXTEND INSTRUCTIONS +;; ---------------------------------------------------------------------- + + +(define_insn "zero_extendhisi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (zero_extend:SI + (match_operand:HI 1 "register_operand" "r")))] + "" + "andi 65535,%1,%0" + [(set_attr "length" "4") + (set_attr "cc" "set_znv")]) + +(define_insn "zero_extendqisi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (zero_extend:SI + (match_operand:QI 1 "register_operand" "r")))] + "" + "andi 255,%1,%0" + [(set_attr "length" "4") + (set_attr "cc" "set_znv")]) + +;;- sign extension instructions + +(define_expand "extendhisi2" + [(set (match_dup 2) + (ashift:SI (match_operand:HI 1 "register_operand" "") + (const_int 16))) + (set (match_operand:SI 0 "register_operand" "") + (ashiftrt:SI (match_dup 2) + (const_int 16)))] + "" + " +{ + operands[1] = gen_lowpart (SImode, operands[1]); + operands[2] = gen_reg_rtx (SImode); +}") + +(define_expand "extendqisi2" + [(set (match_dup 2) + (ashift:SI (match_operand:QI 1 "register_operand" "") + (const_int 24))) + (set (match_operand:SI 0 "register_operand" "") + (ashiftrt:SI (match_dup 2) + (const_int 24)))] + "" + " +{ + operands[1] = gen_lowpart (SImode, operands[1]); + operands[2] = gen_reg_rtx (SImode); +}") + +;; ---------------------------------------------------------------------- +;; SHIFTS +;; ---------------------------------------------------------------------- + +(define_insn "ashlsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (ashift:SI + (match_operand:SI 1 "register_operand" "0,0") + (match_operand:QI 2 "nonmemory_operand" "r,N")))] + "" + "@ + shl %2,%0 + shl %2,%0" + [(set_attr "length" "4,2") + (set_attr "cc" "set_znv")]) + +(define_insn "lshrsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (lshiftrt:SI + (match_operand:SI 1 "register_operand" "0,0") + (match_operand:QI 2 "nonmemory_operand" "r,J")))] + "" + "@ + shr %2,%0 + shr %2,%0" + [(set_attr "length" "4,2") + (set_attr "cc" "set_znv")]) + +(define_insn "ashrsi3" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (ashiftrt:SI + (match_operand:SI 1 "register_operand" "0,0") + (match_operand:SI 2 "nonmemory_operand" "r,N")))] + "" + "@ + sar %2,%0 + sar %2,%0" + [(set_attr "length" "4,2") + (set_attr "cc" "set_znv")]) + +;; ---------------------------------------------------------------------- +;; PROLOGUE/EPILOGUE +;; ---------------------------------------------------------------------- +(define_expand "prologue" + [(const_int 0)] + "" + "expand_prologue (); DONE;") + +(define_expand "epilogue" + [(return)] + "" + " +{ + /* Try to use the trivial return first. Else use the + full epilogue. */ + if (0) + emit_jump_insn (gen_return ()); + else + expand_epilogue (); + DONE; +}") + +(define_insn "return" + [(return)] + "reload_completed && compute_frame_size (get_frame_size (), (long *)0) == 0" + "jmp [r31]" + [(set_attr "length" "2") + (set_attr "cc" "none")]) + +(define_insn "return_internal" + [(return) + (use (reg:SI 31))] + "" + "jmp [r31]" + [(set_attr "length" "2") + (set_attr "cc" "none")]) + + + +;; ---------------------------------------------------------------------- +;; HELPER INSTRUCTIONS for saving the prologue and epilog registers +;; ---------------------------------------------------------------------- + +;; Save r2, r20-r29, r31, and create 16 byte register call area +(define_insn "save_r2_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -64))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 2)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 20)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -44))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -48))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -52))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -56))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -60))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r2_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r20-r29, r31, and create 16 byte register call area +(define_insn "save_r20_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -60))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 20)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -44))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -48))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -52))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -56))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r20_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r21-r29, r31, and create 16 byte register call area +(define_insn "save_r21_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -56))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -44))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -48))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -52))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r21_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r22-r29, r31, and create 16 byte register call area +(define_insn "save_r22_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -52))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -44))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -48))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r22_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r23-r29, r31, and create 16 byte register call area +(define_insn "save_r23_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -48))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -44))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r23_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r24-r29, r31, and create 16 byte register call area +(define_insn "save_r24_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -44))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r24_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r25-r29, r31, and create 16 byte register call area +(define_insn "save_r25_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -40))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r25_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r26-r29, r31, and create 16 byte register call area +(define_insn "save_r26_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -36))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r26_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r27-r29, r31, and create 16 byte register call area +(define_insn "save_r27_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -32))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r27_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r28-r29, r31, and create 16 byte register call area +(define_insn "save_r28_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -28))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r28_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r29, r31, and create 16 byte register call area +(define_insn "save_r29_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -24))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 29)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r29_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r31, and create 16 byte register call area +(define_insn "save_r31" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -20))) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 31)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r31,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r2, r20-r29 +(define_insn "save_r2_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -44))) + (set (mem:SI (reg:SI 3)) (reg:SI 2)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 20)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -40))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r2_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r20-r29 +(define_insn "save_r20_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -40))) + (set (mem:SI (reg:SI 3)) (reg:SI 20)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -36))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r20_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r21-r29 +(define_insn "save_r21_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -36))) + (set (mem:SI (reg:SI 3)) (reg:SI 21)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -32))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r21_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r22-r29 +(define_insn "save_r22_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -32))) + (set (mem:SI (reg:SI 3)) (reg:SI 22)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -28))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r22_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r23-r29 +(define_insn "save_r23_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -28))) + (set (mem:SI (reg:SI 3)) (reg:SI 23)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -24))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r23_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r24-r29 +(define_insn "save_r24_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -24))) + (set (mem:SI (reg:SI 3)) (reg:SI 24)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -20))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r24_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r25-r29 +(define_insn "save_r25_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -20))) + (set (mem:SI (reg:SI 3)) (reg:SI 25)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -16))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r25_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r26-r29 +(define_insn "save_r26_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -16))) + (set (mem:SI (reg:SI 3)) (reg:SI 26)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r26_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r27-r29 +(define_insn "save_r27_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -12))) + (set (mem:SI (reg:SI 3)) (reg:SI 27)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r27_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r28-r29 +(define_insn "save_r28_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -8))) + (set (mem:SI (reg:SI 3)) (reg:SI 28)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r28_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r29 +(define_insn "save_r29" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -4))) + (set (mem:SI (reg:SI 3)) (reg:SI 29)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r29,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Initialize an interrupt function. Do not depend on TARGET_PROLOG_FUNCTION. +(define_insn "save_interrupt" + [(set (reg:SI 3) (plus:SI (reg:SI 3) (const_int -16))) + (set (mem:SI (reg:SI 3)) (reg:SI 30)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -4))) (reg:SI 10)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -8))) (reg:SI 5)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int -12))) (reg:SI 1))] + "" + "add -16,sp\;st.w r10,12[sp]\;jarl __save_interrupt,r10" + [(set_attr "length" "12") + (set_attr "cc" "clobber")]) + +;; Save all registers except for the registers saved in save_interrupt when +;; an interrupt function makes a call. +;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and +;; all of memory. This blocks insns from being moved across this point. +;; This is needed because the rest of the compiler is not reading to handle +;; insns this compilcated + +(define_insn "save_all_interrupt" + [(unspec_volatile [(const_int 0)] 0)] + "" + "jarl __save_all_interrupt,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r2, r20-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r2_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 64))) + (set (reg:SI 2) (mem:SI (plus:SI (reg:SI 3) (const_int 60)))) + (set (reg:SI 20) (mem:SI (plus:SI (reg:SI 3) (const_int 56)))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 52)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 48)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r2_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r20-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r20_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 60))) + (set (reg:SI 20) (mem:SI (plus:SI (reg:SI 3) (const_int 56)))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 52)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 48)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r20_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r21-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r21_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 56))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 52)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 48)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r21_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r22-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r22_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 52))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 48)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r22_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r23-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r23_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 48))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r23_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r24-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r24_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 44))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r24_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r25-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r25_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 40))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r25_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r26-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r26_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 36))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r26_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r27-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r27_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 32))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r27_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r28-r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r28_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 28))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r28_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r29, r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r29_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 24))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r29_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r31, eliminate 16 byte register call area, and return to user +(define_insn "restore_r31" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 20))) + (set (reg:SI 31) (mem:SI (plus:SI (reg:SI 3) (const_int 16))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r31" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r2, r20-r29, and return to user +(define_insn "restore_r2_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 48))) + (set (reg:SI 2) (mem:SI (plus:SI (reg:SI 3) (const_int 44)))) + (set (reg:SI 20) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r2_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r20-r29, and return to user +(define_insn "restore_r20_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 44))) + (set (reg:SI 20) (mem:SI (plus:SI (reg:SI 3) (const_int 40)))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r20_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r21-r29, and return to user +(define_insn "restore_r21_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 40))) + (set (reg:SI 21) (mem:SI (plus:SI (reg:SI 3) (const_int 36)))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r21_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r22-r29, and return to user +(define_insn "restore_r22_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 36))) + (set (reg:SI 22) (mem:SI (plus:SI (reg:SI 3) (const_int 32)))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r22_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r23-r29, and return to user +(define_insn "restore_r23_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 32))) + (set (reg:SI 23) (mem:SI (plus:SI (reg:SI 3) (const_int 28)))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r23_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r24-r29, and return to user +(define_insn "restore_r24_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 28))) + (set (reg:SI 24) (mem:SI (plus:SI (reg:SI 3) (const_int 24)))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r24_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r25-r29, and return to user +(define_insn "restore_r25_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 24))) + (set (reg:SI 25) (mem:SI (plus:SI (reg:SI 3) (const_int 20)))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r25_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r26-r29, and return to user +(define_insn "restore_r26_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 20))) + (set (reg:SI 26) (mem:SI (plus:SI (reg:SI 3) (const_int 16)))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r26_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r27-r29, and return to user +(define_insn "restore_r27_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 16))) + (set (reg:SI 27) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r27_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r28-r29, and return to user +(define_insn "restore_r28_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 12))) + (set (reg:SI 28) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r28_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r29, and return to user +(define_insn "restore_r29" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 8))) + (set (reg:SI 29) (mem:SI (plus:SI (reg:SI 3) (const_int 4))))] + "TARGET_PROLOG_FUNCTION" + "jr __return_r29" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore r1, r5, r10, and return from the interrupt +(define_insn "restore_interrupt" + [(return) + (set (reg:SI 3) (plus:SI (reg:SI 3) (const_int 16))) + (set (reg:SI 30) (mem:SI (plus:SI (reg:SI 3) (const_int 12)))) + (set (reg:SI 10) (mem:SI (plus:SI (reg:SI 3) (const_int 8)))) + (set (reg:SI 5) (mem:SI (plus:SI (reg:SI 3) (const_int 4)))) + (set (reg:SI 1) (mem:SI (reg:SI 3)))] + "" + "jr __return_interrupt" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Restore all registers saved when an interrupt function makes a call. +;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and +;; all of memory. This blocks insns from being moved across this point. +;; This is needed because the rest of the compiler is not reading to handle +;; insns this compilcated + +(define_insn "restore_all_interrupt" + [(unspec_volatile [(const_int 0)] 1)] + "" + "jarl __restore_all_interrupt,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) + +;; Save r6-r9 for a variable argument function +(define_insn "save_r6_r9" + [(set (mem:SI (reg:SI 3)) (reg:SI 6)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int 4))) (reg:SI 7)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int 8))) (reg:SI 8)) + (set (mem:SI (plus:SI (reg:SI 3) (const_int 12))) (reg:SI 9)) + (clobber (reg:SI 10))] + "TARGET_PROLOG_FUNCTION" + "jarl __save_r6_r9,r10" + [(set_attr "length" "4") + (set_attr "cc" "clobber")]) +;; END CYGNUS LOCAL diff --git a/gcc/config/a29k/xm-unix.h b/gcc/config/v850/xm-v850.h index 206d8fdc41d..2d67cf81788 100644 --- a/gcc/config/a29k/xm-unix.h +++ b/gcc/config/v850/xm-v850.h @@ -1,5 +1,7 @@ -/* Configuration for GNU C-compiler for AMD Am29000 processor. - Copyright (C) 1987, 1988, 1993 Free Software Foundation, Inc. +/* CYGNUS LOCAL entire file v850/law */ +/* Configuration for NEC V850. + Copyright (C) 1996 Free Software Foundation, Inc. + Contributed by Cygnus Support. This file is part of GNU CC. @@ -29,15 +31,21 @@ Boston, MA 02111-1307, USA. */ #define HOST_BITS_PER_LONG 32 #define HOST_BITS_PER_LONGLONG 64 -#define HOST_WORDS_BIG_ENDIAN - -/* target machine dependencies. - tm.h is a symbolic link to the actual target specific file. */ -#include "tm.h" - /* Arguments to use with `exit'. */ #define SUCCESS_EXIT_CODE 0 #define FATAL_EXIT_CODE 33 -/* Ultra is V7, which is closest to USG. */ -#define USG +#ifdef __v850__ +#ifndef __STDC__ +extern char *malloc (), *realloc (), *calloc (); +#else +extern void *malloc (), *realloc (), *calloc (); +#endif +extern void free (); +#endif + +/* target machine dependencies. + tm.h is a symbolic link to the actual target specific file. */ + +#include "tm.h" +/* END CYGNUS LOCAL */ diff --git a/gcc/config/vax/x-vax b/gcc/config/vax/x-vax deleted file mode 100644 index bb58a6a1df3..00000000000 --- a/gcc/config/vax/x-vax +++ /dev/null @@ -1,3 +0,0 @@ -# If compiling GCC with the Unix assembler, -J will handle a large function. -# With GAS, it should have no effect. -X_CPPFLAGS = -J diff --git a/gcc/config/vax/xm-vaxv.h b/gcc/config/vax/xm-vaxv.h deleted file mode 100644 index 18a1d73ac98..00000000000 --- a/gcc/config/vax/xm-vaxv.h +++ /dev/null @@ -1,7 +0,0 @@ -/* Config file for Vax running system V. */ - -#define USG - -#define bcopy(a,b,c) memcpy (b,a,c) -#define bzero(a,b) memset (a,0,b) -#define bcmp(a,b,c) memcmp (a,b,c) diff --git a/gcc/config/xm-alloca.h b/gcc/config/xm-alloca.h new file mode 100644 index 00000000000..3dbdc37a1f0 --- /dev/null +++ b/gcc/config/xm-alloca.h @@ -0,0 +1,4 @@ +/* If not compiled with GNU C, use the portable alloca. */ +#ifndef __GNUC__ +#define USE_C_ALLOCA +#endif diff --git a/gcc/config/xm-freebsd.h b/gcc/config/xm-freebsd.h deleted file mode 100644 index f73c9aa60fa..00000000000 --- a/gcc/config/xm-freebsd.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running FreeBSD. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This file defines machine-independent things specific to a host - running FreeBSD. This file should not be specified as $xm_file itself; - instead $xm_file should be CPU/xm-freebsd.h, which should include both - CPU/xm-CPU.h and this file xm-freebsd.h. */ - -/* FreeBSD has strerror. */ -#define HAVE_STRERROR - -/* We have _sys_siglist, but the declaration in <signal.h> conflicts with - the declarations in collect2.c and mips-tfile.c, so disable the declarations - in those files. */ - -#define DONT_DECLARE_SYS_SIGLIST diff --git a/gcc/config/xm-linux.h b/gcc/config/xm-linux.h deleted file mode 100644 index 88b558cc5bf..00000000000 --- a/gcc/config/xm-linux.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Configuration for GCC for Intel i386 running Linux. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - Contributed by H.J. Lu (hjl@nynexst.com) - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#undef HAVE_VPRINTF -#define HAVE_VPRINTF - -#undef HAVE_STRERROR -#define HAVE_STRERROR - -#undef HAVE_POPEN -#define HAVE_POPEN - -#undef POSIX -#define POSIX - -#undef DONT_DECLARE_SYS_SIGLIST -#define DONT_DECLARE_SYS_SIGLIST - -/* We do have one, but I'd like to use the one come with gcc since - we have been doing that for a long time with USG defined. H.J. */ -#define NO_STAB_H - -#undef BSTRING -#define BSTRING -#undef bcmp -#undef bcopy -#undef bzero -#undef index -#undef rindex diff --git a/gcc/config/xm-netbsd.h b/gcc/config/xm-netbsd.h deleted file mode 100644 index 00000ce9706..00000000000 --- a/gcc/config/xm-netbsd.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running NetBSD. - Copyright (C) 1995 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This file defines machine-independent things specific to a host - running NetBSD. This file should not be specified as $xm_file itself; - instead $xm_file should be CPU/xm-netbsd.h, which should include both - CPU/xm-CPU.h and this file xm-netbsd.h. */ - -#define HAVE_STRERROR -#define HAVE_VPRINTF diff --git a/gcc/config/xm-siglist.h b/gcc/config/xm-siglist.h new file mode 100644 index 00000000000..d6133d6a194 --- /dev/null +++ b/gcc/config/xm-siglist.h @@ -0,0 +1,6 @@ +/* Some systems provide no sys_siglist, but do offer the same data under + another name. */ + +#define sys_siglist _sys_siglist +#undef SYS_SIGLIST_DECLARED +#define SYS_SIGLIST_DECLARED diff --git a/gcc/config/xm-std32.h b/gcc/config/xm-std32.h new file mode 100644 index 00000000000..c52782e9741 --- /dev/null +++ b/gcc/config/xm-std32.h @@ -0,0 +1,34 @@ +/* Configuration for GNU C-compiler for standard 32-bit host machine. + Copyright (C) 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* #defines that need visibility everywhere. */ +#define FALSE 0 +#define TRUE 1 + +/* This describes the machine the compiler is hosted on. */ +#define HOST_BITS_PER_CHAR 8 +#define HOST_BITS_PER_SHORT 16 +#define HOST_BITS_PER_INT 32 +#define HOST_BITS_PER_LONG 32 +#define HOST_BITS_PER_LONGLONG 64 + +/* Arguments to use with `exit'. */ +#define SUCCESS_EXIT_CODE 0 +#define FATAL_EXIT_CODE 33 diff --git a/gcc/config/xm-svr4.h b/gcc/config/xm-svr4.h deleted file mode 100644 index 30084322510..00000000000 --- a/gcc/config/xm-svr4.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Configuration for GNU C-compiler for hosts running System V Release 4 - Copyright (C) 1988 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#define bcopy(src,dst,len) memcpy ((dst),(src),(len)) -#define bzero(dst,len) memset ((dst),0,(len)) -#define bcmp(left,right,len) memcmp ((left),(right),(len)) - -#define rindex strrchr -#define index strchr - -#define USG -#define HAVE_VPRINTF - -#define POSIX - -/* SVR4 provides no sys_siglist, - but does offer the same data under another name. */ -#define sys_siglist _sys_siglist diff --git a/gcc/configure b/gcc/configure deleted file mode 100755 index b3181529acc..00000000000 --- a/gcc/configure +++ /dev/null @@ -1,4911 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.12 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-gnu-ld arrange to work with GNU ld." -ac_help="$ac_help - --with-gnu-as arrange to work with GNU as." -ac_help="$ac_help - --with-stabs arrange to use stabs instead of host debug format." -ac_help="$ac_help - --with-elf arrange to use ELF instead of host debug format." -ac_help="$ac_help - --with-local-prefix=DIR specifies directory to put local include." -ac_help="$ac_help - --with-gxx-include-dir=DIR - specifies directory to put g++ header files." -ac_help="$ac_help - --enable-c-cpplib Use cpplib for C." -ac_help="$ac_help - --enable-threads enable thread usage for target GCC. - --enable-threads=LIB use LIB thread package for target GCC." - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.12" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=tree.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - - -native_prefix=/usr -remove=rm -hard_link=ln -symbolic_link='ln -s' -copy=cp - -# Check for additional parameters - -# With GNU ld -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - gnu_ld=yes -else - gnu_ld=no -fi - - -# With GNU as -# Check whether --with-gnu-as or --without-gnu-as was given. -if test "${with_gnu_as+set}" = set; then - withval="$with_gnu_as" - gas=yes -else - gas=no -fi - - -# With stabs -# Check whether --with-stabs or --without-stabs was given. -if test "${with_stabs+set}" = set; then - withval="$with_stabs" - stabs=yes -else - stabs=no -fi - - -# With ELF -# Check whether --with-elf or --without-elf was given. -if test "${with_elf+set}" = set; then - withval="$with_elf" - elf=yes -else - elf=no -fi - - -# Specify the local prefix -# Check whether --with-local-prefix or --without-local-prefix was given. -if test "${with_local_prefix+set}" = set; then - withval="$with_local_prefix" - local_prefix=$with_local_prefix -else - local_prefix=/usr/local -fi - - -# Default local prefix if it is empty -if [ x$local_prefix = x ]; then - local_prefix=/usr/local -fi - -# Specify the g++ header file directory -# Check whether --with-gxx-include-dir or --without-gxx-include-dir was given. -if test "${with_gxx_include_dir+set}" = set; then - withval="$with_gxx_include_dir" - gxx_include_dir=$with_gxx_include_dir -else - gxx_include_dir='${prefix}/include/g++' -fi - - -# Default g++ header file directory if it is empty -if [ x$gxx_include_dir = x ]; then - gxx_include_dir='${prefix}/include/g++' -fi - -# Enable use of cpplib for C. -# Check whether --enable-c-cpplib or --disable-c-cpplib was given. -if test "${enable_c_cpplib+set}" = set; then - enableval="$enable_c_cpplib" - if [ x$enable_c_cpplib != xno ]; then - extra_c_objs="${extra_c_objs} cpplib.o cppexp.o cpphash.o cpperror.o" - extra_c_flags=-DUSE_CPPLIB=1 -fi -fi - - -# Enable threads -# Pass with no value to take the default -# Pass with a value to specify a thread package -# Check whether --enable-threads or --disable-threads was given. -if test "${enable_threads+set}" = set; then - enableval="$enable_threads" - if [ x$enable_threads = xno ]; then - enable_threads='' -fi -else - enable_threads='' -fi - - -# Check if a valid thread package -case x${enable_threads} in - x | xno) - # No threads - thread_file='single' - ;; - xyes) - # default - thread_file='' - ;; - xdecosf1 | xirix | xmach | xos2 | xposix | xpthreads | xsingle | \ - xsolaris | xwin32) - thread_file=$enable_threads - ;; - *) - echo "$enable_threads is an unknown thread package" 1>&2 - exit 1 - ;; -esac - -# Determine the host, build, and target systems -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:713: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`$ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`$ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:734: checking target system type" >&5 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`$ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:752: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`$ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - -# Find some useful tools -for ac_prog in mawk gawk nawk awk -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:781: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AWK="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -AWK="$ac_cv_prog_AWK" -if test -n "$AWK"; then - echo "$ac_t""$AWK" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$AWK" && break -done - -# Extract the first word of "flex", so it can be a program name with args. -set dummy flex; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:812: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="flex" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$LEXLIB" -then - case "$LEX" in - flex*) ac_lib=fl ;; - *) ac_lib=l ;; - esac - echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:845: checking for yywrap in -l$ac_lib" >&5 -ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-l$ac_lib $LIBS" -cat > conftest.$ac_ext <<EOF -#line 853 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char yywrap(); - -int main() { -yywrap() -; return 0; } -EOF -if { (eval echo configure:864: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LEXLIB="-l$ac_lib" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:887: checking whether ln -s works" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - rm -f conftestdata -if ln -s X conftestdata 2>/dev/null -then - rm -f conftestdata - ac_cv_prog_LN_S="ln -s" -else - ac_cv_prog_LN_S=ln -fi -fi -LN_S="$ac_cv_prog_LN_S" -if test "$ac_cv_prog_LN_S" = "ln -s"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:910: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -for ac_prog in 'bison -y' byacc -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:941: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_YACC="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -YACC="$ac_cv_prog_YACC" -if test -n "$YACC"; then - echo "$ac_t""$YACC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:981: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -# Find the native compiler -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1035: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1064: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - ac_prog_rejected=no - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1112: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext <<EOF -#line 1122 "configure" -#include "confdefs.h" -main(){return(0);} -EOF -if { (eval echo configure:1126: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1146: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1151: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1160: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS= - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1175: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-O2" - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:1203: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1231: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 1246 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1252: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 1263 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -for ac_hdr in stddef.h string.h strings.h stdlib.h time.h unistd.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1295: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1300 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1305: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - -echo $ac_n "checking whether malloc must be declared""... $ac_c" 1>&6 -echo "configure:1333: checking whether malloc must be declared" >&5 -if eval "test \"`echo '$''{'gcc_cv_decl_needed_malloc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1338 "configure" -#include "confdefs.h" - -#include <stdio.h> -#ifdef HAVE_STRING_H -#include <string.h> -#else -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -int main() { -char *(*pfn) = (char *(*)) malloc -; return 0; } -EOF -if { (eval echo configure:1359: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - gcc_cv_decl_needed_malloc=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gcc_cv_decl_needed_malloc=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$gcc_cv_decl_needed_malloc" 1>&6 -if test $gcc_cv_decl_needed_malloc = yes; then - gcc_tr_decl=NEED_DECLARATION_`echo malloc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $gcc_tr_decl 1 -EOF - -fi - -echo $ac_n "checking whether realloc must be declared""... $ac_c" 1>&6 -echo "configure:1381: checking whether realloc must be declared" >&5 -if eval "test \"`echo '$''{'gcc_cv_decl_needed_realloc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1386 "configure" -#include "confdefs.h" - -#include <stdio.h> -#ifdef HAVE_STRING_H -#include <string.h> -#else -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -int main() { -char *(*pfn) = (char *(*)) realloc -; return 0; } -EOF -if { (eval echo configure:1407: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - gcc_cv_decl_needed_realloc=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gcc_cv_decl_needed_realloc=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$gcc_cv_decl_needed_realloc" 1>&6 -if test $gcc_cv_decl_needed_realloc = yes; then - gcc_tr_decl=NEED_DECLARATION_`echo realloc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $gcc_tr_decl 1 -EOF - -fi - -echo $ac_n "checking whether free must be declared""... $ac_c" 1>&6 -echo "configure:1429: checking whether free must be declared" >&5 -if eval "test \"`echo '$''{'gcc_cv_decl_needed_free'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1434 "configure" -#include "confdefs.h" - -#include <stdio.h> -#ifdef HAVE_STRING_H -#include <string.h> -#else -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -int main() { -char *(*pfn) = (char *(*)) free -; return 0; } -EOF -if { (eval echo configure:1455: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - gcc_cv_decl_needed_free=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gcc_cv_decl_needed_free=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$gcc_cv_decl_needed_free" 1>&6 -if test $gcc_cv_decl_needed_free = yes; then - gcc_tr_decl=NEED_DECLARATION_`echo free | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $gcc_tr_decl 1 -EOF - -fi - - -# File extensions -manext='.1' -objext='.o' - - - -build_xm_file= -build_broken_install= -build_install_headers_dir=install-headers-tar -build_exeext= -host_xm_file= -host_xmake_file= -host_truncate_target= - -# Decode the host machine, then the target machine. -# For the host machine, we save the xm_file variable as host_xm_file; -# then we decode the target machine and forget everything else -# that came from the host machine. -for machine in $build $host $target; do - - out_file= - xmake_file= - tmake_file= - extra_headers= - extra_passes= - extra_parts= - extra_programs= - extra_objs= - extra_host_objs= - extra_gcc_objs= - float_format= - # Set this to force installation and use of collect2. - use_collect2= - # Set this to override the default target model. - target_cpu_default= - # Set this to force use of install.sh. - broken_install= - # Set this to control which fixincludes program to use. - fixincludes=fixincludes - # Set this to control how the header file directory is installed. - install_headers_dir=install-headers-tar - # Set this to a non-empty list of args to pass to cpp if the target - # wants its .md file passed through cpp. - md_cppflags= - # Set this if directory names should be truncated to 14 characters. - truncate_target= - # Set this if gdb needs a dir command with `dirname $out_file` - gdb_needs_out_file_path= - # Set this if the build machine requires executables to have a - # file name suffix. - exeext= - - # Set default cpu_type, tm_file and xm_file so it can be updated in - # each machine entry. - cpu_type=`echo $machine | sed 's/-.*$//'` - case $machine in - alpha*-*-*) - cpu_type=alpha - ;; - arm*-*-*) - cpu_type=arm - ;; - c*-convex-*) - cpu_type=convex - ;; - i[3456]86-*-*) - cpu_type=i386 - ;; - hppa*-*-*) - cpu_type=pa - ;; - m68000-*-*) - cpu_type=m68k - ;; - mips*-*-*) - cpu_type=mips - ;; - powerpc*-*-*) - cpu_type=rs6000 - ;; - pyramid-*-*) - cpu_type=pyr - ;; - sparc*-*-*) - cpu_type=sparc - ;; - esac - - tm_file=${cpu_type}/${cpu_type}.h - xm_file=${cpu_type}/xm-${cpu_type}.h - - case $machine in - # Support site-specific machine types. - *local*) - cpu_type=`echo $machine | sed -e 's/-.*//'` - rest=`echo $machine | sed -e "s/$cpu_type-//"` - xm_file=${cpu_type}/xm-$rest.h - tm_file=${cpu_type}/$rest.h - if [ -f $srcdir/config/${cpu_type}/x-$rest ] ; \ - then xmake_file=${cpu_type}/x-$rest; \ - else true; \ - fi - if [ -f $srcdir/config/${cpu_type}/t-$rest ] ; \ - then tmake_file=${cpu_type}/t-$rest; \ - else true; \ - fi - ;; - 1750a-*-*) - ;; - a29k-*-bsd* | a29k-*-sym1*) - tm_file="${tm_file} a29k/unix.h" - xm_file=a29k/xm-unix.h - xmake_file=a29k/x-unix - use_collect2=yes - ;; - a29k-*-udi | a29k-*-coff) - tm_file="${tm_file} dbxcoff.h a29k/udi.h" - tmake_file=a29k/t-a29kbare - ;; - a29k-*-vxworks*) - tm_file="${tm_file} dbxcoff.h a29k/udi.h a29k/vx29k.h" - tmake_file=a29k/t-vx29k - extra_parts="crtbegin.o crtend.o" - ;; - a29k-*-*) # Default a29k environment. - use_collect2=yes - ;; - alpha*-*-linux-gnuecoff*) - tm_file="${tm_file} alpha/linux.h" - xm_file="${xm_file} alpha/xm-linux.h" - target_cpu_default="MASK_GAS" - gas=no - xmake_file=none - fixincludes=Makefile.in - gas=yes gnu_ld=yes - ;; - alpha*-*-linux-gnu*) - tm_file="${tm_file} alpha/linux.h alpha/elf.h" - xm_file="${xm_file} alpha/xm-linux.h" - target_cpu_default="MASK_GAS" - gas=no - tmake_file="t-linux alpha/t-linux" - xmake_file=none - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - gas=yes gnu_ld=yes - if [ x$enable_threads = xyes ]; then - thread_file='posix' - fi - ;; - alpha*-dec-osf[456789]*) - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas != xyes ] - then - extra_passes="mips-tfile mips-tdump" - fi - broken_install=yes - use_collect2=yes - # Some versions of OSF4 (specifically X4.0-9 296.7) have - # a broken tar, so we use cpio instead. - case $machine in - alpha*-dec-osf4*) - install_headers_dir=install-headers-cpio - ;; - esac - ;; - alpha*-dec-osf[23]*) - tm_file="${tm_file} alpha/osf2or3.h" - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas != xyes ] - then - extra_passes="mips-tfile mips-tdump" - fi - broken_install=yes - use_collect2=yes - ;; - alpha*-dec-osf1.2) - tm_file="${tm_file} alpha/osf12.h" - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas != xyes ] - then - extra_passes="mips-tfile mips-tdump" - fi - broken_install=yes - use_collect2=yes - ;; - alpha*-*-osf*) - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas != xyes ] - then - extra_passes="mips-tfile mips-tdump" - fi - broken_install=yes - use_collect2=yes - ;; - alpha*-*-winnt3*) - tm_file="${tm_file} alpha/win-nt.h" - target_cpu_default=MASK_WINDOWS_NT - xm_file="${xm_file} config/winnt/xm-winnt.h alpha/xm-winnt.h" - tmake_file=t-libc-ok - xmake_file=winnt/x-winnt - extra_host_objs=oldnames.o - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if [ x$gnu_ld != xyes ] - then - extra_programs=ld.exe - fi - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - ;; - alpha*-dec-vms*) - tm_file=alpha/vms.h - xm_file="${xm_file} alpha/xm-vms.h" - tmake_file=alpha/t-vms - fixincludes=Makefile.in - ;; - arm-*-coff* | armel-*-coff*) - tm_file=arm/coff.h - tmake_file=arm/t-bare - ;; - arm-*-riscix1.[01]*) # Acorn RISC machine (early versions) - tm_file=arm/riscix1-1.h - use_collect2=yes - ;; - arm-*-riscix*) # Acorn RISC machine - if [ x$gas = xyes ] - then - tm_file=arm/rix-gas.h - else - tm_file=arm/riscix.h - fi - xmake_file=arm/x-riscix - tmake_file=arm/t-riscix - use_collect2=yes - ;; - arm-semi-aout | armel-semi-aout) - tm_file=arm/semi.h - tmake_file=arm/t-semi - fixincludes=Makefile.in # There is nothing to fix - ;; - arm-semi-aof | armel-semi-aof) - tm_file=arm/semiaof.h - tmake_file=arm/t-semiaof - fixincludes=Makefile.in # There is nothing to fix - ;; - arm-*-netbsd*) - tm_file=arm/netbsd.h - xm_file=arm/xm-netbsd.h - tmake_file=arm/t-netbsd - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - use_collect2=yes - ;; - arm-*-linux-gnuaout*) # ARM Linux - cpu_type=arm - xm_file=arm/xm-linux.h - xmake_file=x-linux - tm_file=arm/linux-gas.h - tmake_file=arm/t-linux - fixincludes=Makefile.in - broken_install=yes - gnu_ld=yes - ;; - arm-*-aout) - tm_file=arm/aout.h - ;; - c1-convex-*) # Convex C1 - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - c2-convex-*) # Convex C2 - target_cpu_default=2 - use_collect2=yes - fixincludes=Makefile.in - ;; - c32-convex-*) - target_cpu_default=4 - use_collect2=yes - fixincludes=Makefile.in - ;; - c34-convex-*) - target_cpu_default=8 - use_collect2=yes - fixincludes=Makefile.in - ;; - c38-convex-*) - target_cpu_default=16 - use_collect2=yes - fixincludes=Makefile.in - ;; - clipper-intergraph-clix*) - tm_file="${tm_file} svr3.h clipper/clix.h" - xm_file=clipper/xm-clix.h - xmake_file=clipper/x-clix - extra_headers=va-clipper.h - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - broken_install=yes - ;; - dsp16xx-*) - ;; - elxsi-elxsi-*) - use_collect2=yes - ;; -# This hasn't been upgraded to GCC 2. -# fx80-alliant-*) # Alliant FX/80 -# ;; - h8300-*-*) - float_format=i32 - ;; - hppa1.1-*-pro*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.1-*-osf*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-rtems*) - tm_file="pa/pa-pro.h ${tm_file} pa/pa-pro-end.h libgloss.h pa/rtems.h" - xm_file=pa/xm-papro.h - tmake_file=pa/t-pro - ;; - hppa1.0-*-osf*) - tm_file="${tm_file} pa/pa-osf.h" - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.1-*-bsd*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-bsd*) - use_collect2=yes - fixincludes=Makefile.in - ;; - hppa1.0-*-hpux7*) - tm_file="pa/pa-oldas.h ${tm_file} pa/pa-hpux7.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux8.0[0-2]*) - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux8.0[0-2]*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - else - tm_file="pa/pa-oldas.h ${tm_file}" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux8*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux8*) - tm_file="${tm_file} pa/pa-hpux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux10*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux10*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hpux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hpux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux9.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.1-*-hiux*) - target_cpu_default=1 - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa1.0-*-hiux*) - tm_file="${tm_file} pa/pa-hpux.h pa/pa-hiux.h" - xm_file=pa/xm-pahpux.h - xmake_file=pa/x-pa-hpux - if [ x$gas = xyes ] - then - tm_file="${tm_file} pa/pa-gas.h" - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - ;; - hppa*-*-lites*) - target_cpu_default=1 - use_collect2=yes - fixincludes=Makefile.in - ;; - i370-*-mvs*) - ;; - i[3456]86-ibm-aix*) # IBM PS/2 running AIX - if [ x$gas = xyes ] - then - tm_file=i386/aix386.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - else - tm_file=i386/aix386ng.h - use_collect2=yes - fi - xm_file=i386/xm-aix.h - xmake_file=i386/x-aix - broken_install=yes - ;; - i486-ncr-sysv4*) # NCR 3000 - i486 running system V.4 - xm_file=i386/xm-sysv4.h - xmake_file=i386/x-ncr3000 - if [ x$stabs = xyes -a x$gas = xyes ] - then - tm_file=i386/sysv4gdb.h - else - tm_file=i386/sysv4.h - fi - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtpic - ;; - i[3456]86-next-*) - tm_file=i386/next.h - xm_file=i386/xm-next.h - tmake_file=i386/t-next - xmake_file=i386/x-next - extra_objs=nextstep.o - if [ x$enable_threads = xyes ]; then - thread_file='mach' - fi - ;; - i[3456]86-sequent-bsd*) # 80386 from Sequent - use_collect2=yes - if [ x$gas = xyes ] - then - tm_file=i386/seq-gas.h - else - tm_file=i386/sequent.h - fi - ;; - i[3456]86-sequent-ptx1*) - xm_file=i386/xm-sysv3.h - xmake_file=i386/x-sysv3 - tm_file=i386/seq-sysv3.h - tmake_file=i386/t-crtstuff - fixincludes=fixinc.ptx - extra_parts="crtbegin.o crtend.o" - install_headers_dir=install-headers-cpio - broken_install=yes - ;; - i[3456]86-sequent-ptx2* | i[3456]86-sequent-sysv3*) - xm_file=i386/xm-sysv3.h - xmake_file=i386/x-sysv3 - tm_file=i386/seq2-sysv3.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - broken_install=yes - ;; - i[3456]86-sequent-ptx4* | i[3456]86-sequent-sysv4*) - xm_file=i386/xm-sysv4.h - xmake_file=x-svr4 - tm_file=i386/ptx4-i.h - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - fixincludes=fixinc.ptx - install_headers_dir=install-headers-cpio - broken_install=yes - ;; - i386-sun-sunos*) # Sun i386 roadrunner - xm_file=i386/xm-sun.h - tm_file=i386/sun.h - use_collect2=yes - ;; - i[3456]86-*-aout*) - tm_file=i386/i386-aout.h - tmake_file=i386/t-i386bare - ;; - i[3456]86-*-bsdi* | i[345]86-*-bsd386*) - tm_file=i386/bsd386.h - xm_file=i386/xm-bsd386.h -# tmake_file=t-libc-ok - ;; - i[3456]86-*-bsd*) - tm_file=i386/386bsd.h - xm_file=i386/xm-bsd386.h -# tmake_file=t-libc-ok -# Next line turned off because both 386BSD and BSD/386 use GNU ld. -# use_collect2=yes - ;; - i[3456]86-*-freebsdelf*) - tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h" - xm_file=i386/xm-freebsd.h - # On FreeBSD, the headers are already ok. - fixincludes=Makefile.in - tmake_file=i386/t-freebsd - gas=yes - gnu_ld=yes - stabs=yes - ;; - i[3456]86-*-freebsd*) - tm_file=i386/freebsd.h - xm_file=i386/xm-freebsd.h - # On FreeBSD, the headers are already ok. - fixincludes=Makefile.in - tmake_file=i386/t-freebsd - ;; - i[3456]86-*-netbsd*) - tm_file=i386/netbsd.h - xm_file=i386/xm-netbsd.h - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - ;; - i[3456]86-*-coff*) - tm_file=i386/i386-coff.h - tmake_file=i386/t-i386bare - ;; - i[3456]86-*-isc*) # 80386 running ISC system - xm_file=i386/xm-isc.h - case $machine in - i[345]86-*-isc[34]*) - xmake_file=i386/x-isc3 - ;; - *) - xmake_file=i386/x-isc - ;; - esac - if [ x$gas = xyes -a x$stabs = xyes ] - then - tm_file=i386/iscdbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.ifile" - else - tm_file=i386/isccoff.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - install_headers_dir=install-headers-cpio - broken_install=yes - ;; - i[3456]86-*-linux-gnuoldld*) # Intel 80386's running Linux - xm_file=i386/xm-linux.h # with a.out format using pre BFD linkers - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-oldld.h - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - ;; - i[3456]86-*-linux-gnuaout*) # Intel 80386's running Linux - xm_file=i386/xm-linux.h # with a.out format - xmake_file=x-linux-aout - tmake_file="t-linux-aout i386/t-crtstuff" - tm_file=i386/linux-aout.h - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - ;; - i[3456]86-*-linux-gnulibc1) - xm_file=i386/xm-linux.h # Intel 80386's running Linux - xmake_file=x-linux # with ELF format using the - tm_file=i386/linux.h # Linux C library 5 - tmake_file="t-linux t-linux-gnulibc1 i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - if [ x$enable_threads = xyes ]; then - thread_file='single' - fi - ;; - i[3456]86-*-linux-gnu*) # Intel 80386's running Linux - xm_file=i386/xm-linux.h # with ELF format using glibc 2 - xmake_file=x-linux # aka Linux C library 6 - tm_file=i386/linux.h - tmake_file="t-linux i386/t-crtstuff" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - if [ x$enable_threads = xyes ]; then - thread_file='posix' - fi - ;; - i[3456]86-*-gnu*) - ;; - i[3456]86-go32-msdos | i[3456]86-*-go32*) - xm_file=i386/xm-go32.h - tm_file=i386/go32.h - tmake_file=i386/t-go32 - ;; - i[3456]86-moss-msdos* | i[3456]86-*-moss*) - tm_file=i386/moss.h - tmake_file=t-libc-ok - fixincludes=Makefile.in - gnu_ld=yes - gas=yes - ;; - i[3456]86-*-lynxos*) - if [ x$gas = xyes ] - then - tm_file=i386/lynx.h - else - tm_file=i386/lynx-ng.h - fi - xm_file=i386/xm-lynx.h - tmake_file=i386/t-i386bare - xmake_file=x-lynx - ;; - i[3456]86-*-mach*) - tm_file=i386/mach.h -# tmake_file=t-libc-ok - use_collect2=yes - ;; - i[3456]86-*-osfrose*) # 386 using OSF/rose - if [ x$elf = xyes ] - then - tm_file=i386/osfelf.h - use_collect2= - else - tm_file=i386/osfrose.h - use_collect2=yes - fi - xm_file=i386/xm-osf.h - xmake_file=i386/x-osfrose - tmake_file=i386/t-osf - extra_objs=halfpic.o - ;; - i[345]86-go32-rtems*) - cpu_type=i386 - xm_file=i386/xm-go32.h - tm_file=i386/go32-rtems.h - tmake_file="i386/t-go32 t-rtems" - ;; - i[345]86-*-rtems*) - cpu_type=i386 - tm_file=i386/rtems.h - tmake_file="i386/t-i386bare t-rtems" - ;; - i[3456]86-*-sco3.2v5*) # 80386 running SCO Open Server 5 - xm_file=i386/xm-sco5.h - xmake_file=i386/x-sco5 - fixincludes=fixinc.sco - broken_install=yes - tm_file=i386/sco5.h - tmake_file=i386/t-sco5 - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" - ;; - i[3456]86-*-sco3.2v4*) # 80386 running SCO 3.2v4 system - xm_file=i386/xm-sco.h - xmake_file=i386/x-sco4 - fixincludes=fixinc.sco - broken_install=yes - install_headers_dir=install-headers-cpio - if [ x$stabs = xyes ] - then - tm_file=i386/sco4dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco4.h - tmake_file=i386/t-crtstuff - extra_parts="crtbegin.o crtend.o" - fi - truncate_target=yes - ;; - i[3456]86-*-sco*) # 80386 running SCO system - xm_file=i386/xm-sco.h - xmake_file=i386/x-sco - broken_install=yes - install_headers_dir=install-headers-cpio - if [ x$stabs = xyes ] - then - tm_file=i386/scodbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/sco.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - truncate_target=yes - ;; - i[3456]86-*-solaris2*) - xm_file=i386/xm-sysv4.h - if [ x$stabs = xyes ] - then - tm_file=i386/sol2dbg.h - else - tm_file=i386/sol2.h - fi - tmake_file=i386/t-sol2 - extra_parts="crt1.o crti.o crtn.o crtbegin.o crtend.o" - xmake_file=x-svr4 - fixincludes=fixinc.svr4 - broken_install=yes - if [ x$enable_threads = xyes ]; then - thread_file='solaris' - fi - ;; - i[3456]86-*-sysv4*) # Intel 80386's running system V.4 - xm_file=i386/xm-sysv4.h - tm_file=i386/sysv4.h - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - tmake_file=i386/t-crtpic - xmake_file=x-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i[3456]86-*-sysv*) # Intel 80386's running system V - xm_file=i386/xm-sysv3.h - xmake_file=i386/x-sysv3 - if [ x$gas = xyes ] - then - if [ x$stabs = xyes ] - then - tm_file=i386/svr3dbx.h - tmake_file=i386/t-svr3dbx - extra_parts="svr3.ifile svr3z.rfile" - else - tm_file=i386/svr3gas.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - else - tm_file=i386/sysv3.h - extra_parts="crtbegin.o crtend.o" - tmake_file=i386/t-crtstuff - fi - ;; - i386-*-vsta) # Intel 80386's running VSTa kernel - xm_file=i386/xm-vsta.h - tm_file=i386/vsta.h - tmake_file=i386/t-vsta - xmake_file=i386/x-vsta - ;; - i[3456]86-*-pe | i[3456]86-*-cygwin32) - xm_file="${xm_file} i386/xm-cygwin32.h" - tmake_file=i386/t-cygwin32 - tm_file=i386/cygwin32.h - xmake_file=i386/x-cygwin32 - extra_objs=winnt.o - fixincludes=Makefile.in - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - exeext=.exe - ;; - i[3456]86-*-mingw32) - tm_file=i386/mingw32.h - xm_file="${xm_file} i386/xm-mingw32.h" - tmake_file=i386/t-cygwin32 - extra_objs=winnt.o - xmake_file=i386/x-cygwin32 - fixincludes=Makefile.in - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - exeext=.exe - ;; - i[3456]86-*-winnt3*) - tm_file=i386/win-nt.h - out_file=i386/i386.c - xm_file=i386/xm-winnt.h - xmake_file=winnt/x-winnt - tmake_file=i386/t-winnt - extra_host_objs="winnt.o oldnames.o" - extra_gcc_objs="spawnv.o oldnames.o" - fixincludes=fixinc.winnt - if [ x$gnu_ld != xyes ] - then - extra_programs=ld.exe - fi - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - ;; - i[3456]86-dg-dgux) - xm_file=i386/xm-dgux.h - out_file=i386/dgux.c - tm_file=i386/dgux.h - tmake_file=i386/t-dgux - xmake_file=i386/x-dgux - fixincludes=fixinc.dgux - install_headers_dir=install-headers-cpio - ;; - i860-alliant-*) # Alliant FX/2800 - tm_file="${tm_file} svr4.h i860/sysv4.h i860/fx2800.h" - xm_file="${xm_file} i860/xm-fx2800.h" - xmake_file=i860/x-fx2800 - tmake_file=i860/t-fx2800 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-bsd*) - tm_file="${tm_file} i860/bsd.h" - if [ x$gas = xyes ] - then - tm_file="${tm_file} i860/bsd-gas.h" - fi - use_collect2=yes - ;; - i860-*-mach*) - tm_file="${tm_file} i860/mach.h" - tmake_file=t-libc-ok - ;; - i860-*-osf*) # Intel Paragon XP/S, OSF/1AD - tm_file="${tm_file} svr3.h i860/paragon.h" - xm_file="${xm_file} xm-svr3.h" - tmake_file=t-osf - broken_install=yes - ;; - i860-*-sysv3*) - tm_file="${tm_file} svr3.h i860/sysv3.h" - xm_file="${tm_file} xm-svr3.h" - xmake_file=i860/x-sysv3 - extra_parts="crtbegin.o crtend.o" - ;; - i860-*-sysv4*) - tm_file="${tm_file} svr4.h i860/sysv4.h" - xm_file="${xm_file} xm-svr3.h" - xmake_file=i860/x-sysv4 - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - ;; - i960-wrs-vxworks5 | i960-wrs-vxworks5.0*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - ;; - i960-wrs-vxworks5*) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h i960/vx960-coff.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - ;; - i960-wrs-vxworks*) - tm_file="${tm_file} i960/vx960.h" - tmake_file=i960/t-vxworks960 - use_collect2=yes - ;; - i960-*-coff*) - tm_file="${tm_file} dbxcoff.h i960/i960-coff.h libgloss.h" - tmake_file=i960/t-960bare - use_collect2=yes - ;; - i960-*-rtems) - tmake_file="i960/t-960bare t-rtems" - tm_file="${tm_file} dbxcoff.h i960/rtems.h" - use_collect2=yes - ;; - i960-*-*) # Default i960 environment. - use_collect2=yes - ;; - m32r-*-elf*) - extra_parts="crtinit.o crtfini.o" - ;; - m68000-convergent-sysv*) - tm_file=m68k/ctix.h - xm_file=m68k/xm-3b1.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-bsd*) # HP 9000/200 running BSD - tm_file=m68k/hp2bsd.h - xmake_file=m68k/x-hp2bsd - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-hp-hpux*) # HP 9000 series 300 - xm_file=m68k/xm-hp320.h - if [ x$gas = xyes ] - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp310g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp310.h - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos3*) - tm_file=m68k/sun2.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-sun-sunos4*) - tm_file=m68k/sun2o4.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68000-att-sysv*) - xm_file=m68k/xm-3b1.h - if [ x$gas = xyes ] - then - tm_file=m68k/3b1g.h - else - tm_file=m68k/3b1.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-apple-aux*) # Apple Macintosh running A/UX - xm_file=m68k/xm-aux.h - tmake_file=m68k/t-aux - broken_install=yes - install_headers_dir=install-headers-cpio - extra_headers=math-68881.h - extra_parts="crt1.o mcrt1.o maccrt1.o crt2.o crtn.o" - tm_file= - if [ "$gnu_ld" = yes ] - then - tm_file="${tm_file} m68k/auxgld.h" - else - tm_file="${tm_file} m68k/auxld.h" - fi - if [ "$gas" = yes ] - then - tm_file="${tm_file} m68k/auxgas.h" - else - tm_file="${tm_file} m68k/auxas.h" - fi - tm_file="${tm_file} m68k/a-ux.h" - ;; - m68k-apollo-*) - tm_file=m68k/apollo68.h - xmake_file=m68k/x-apollo68 - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-altos-sysv*) # Altos 3068 - if [ x$gas = xyes ] - then - tm_file=m68k/altos3068.h - xm_file=m68k/xm-altos3068.h - else - echo "The Altos is supported only with the GNU assembler" 1>&2 - exit 1 - fi - extra_headers=math-68881.h - ;; - m68k-bull-sysv*) # Bull DPX/2 - if [ x$gas = xyes ] - then - if [ x$stabs = xyes ] - then - tm_file=m68k/dpx2cdbx.h - else - tm_file=m68k/dpx2g.h - fi - else - tm_file=m68k/dpx2.h - fi - xm_file=m68k/xm-m68kv.h - xmake_file=m68k/x-dpx2 - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-atari-sysv4*) # Atari variant of V.4. - tm_file=m68k/atari.h - xm_file=m68k/xm-atari.h - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-motorola-sysv*) - tm_file=m68k/mot3300.h - xm_file=m68k/xm-mot3300.h - if [ x$gas = xyes ] - then - xmake_file=m68k/x-mot3300-gas - if [ x$gnu_ld = xyes ] - then - tmake_file=m68k/t-mot3300-gald - else - tmake_file=m68k/t-mot3300-gas - use_collect2=yes - fi - else - xmake_file=m68k/x-mot3300 - if [ x$gnu_ld = xyes ] - then - tmake_file=m68k/t-mot3300-gld - else - tmake_file=m68k/t-mot3300 - use_collect2=yes - fi - fi - gdb_needs_out_file_path=yes - extra_parts="crt0.o mcrt0.o" - extra_headers=math-68881.h - ;; - m68k-ncr-sysv*) # NCR Tower 32 SVR3 - tm_file=m68k/tower-as.h - xm_file=m68k/xm-tower.h - xmake_file=m68k/x-tower - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-plexus-sysv*) - tm_file=m68k/plexus.h - xm_file=m68k/xm-plexus.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-tti-*) - tm_file=m68k/pbb.h - xm_file=m68k/xm-m68kv.h - extra_headers=math-68881.h - ;; - m68k-crds-unos*) - xm_file=m68k/xm-crds.h - xmake_file=m68k/x-crds - tm_file=m68k/crds.h - broken_install=yes - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-cbm-sysv4*) # Commodore variant of V.4. - tm_file=m68k/amix.h - xm_file=m68k/xm-amix.h - xmake_file=m68k/x-amix - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-ccur-rtu) - tm_file=m68k/ccur-GAS.h - xmake_file=m68k/x-ccur - extra_headers=math-68881.h - use_collect2=yes - broken_install=yes - ;; - m68k-hp-bsd4.4*) # HP 9000/3xx running 4.4bsd - tm_file=m68k/hp3bsd44.h - xmake_file=m68k/x-hp3bsd44 - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-hp-bsd*) # HP 9000/3xx running Berkeley Unix - tm_file=m68k/hp3bsd.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-isi-bsd*) - if [ x$with_fp = xno ] - then - tm_file=m68k/isi-nfp.h - else - tm_file=m68k/isi.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-hp-hpux7*) # HP 9000 series 300 running HPUX version 7. - xm_file=m68k/xm-hp320.h - if [ x$gas = xyes ] - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hpux7.h - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-hp-hpux*) # HP 9000 series 300 - xm_file=m68k/xm-hp320.h - if [ x$gas = xyes ] - then - xmake_file=m68k/x-hp320g - tm_file=m68k/hp320g.h - else - xmake_file=m68k/x-hp320 - tm_file=m68k/hp320.h - fi - broken_install=yes - install_headers_dir=install-headers-cpio - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sun-mach*) - tm_file=m68k/sun3mach.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sony-newsos3*) - if [ x$gas = xyes ] - then - tm_file=m68k/news3gas.h - else - tm_file=m68k/news3.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sony-bsd* | m68k-sony-newsos*) - if [ x$gas = xyes ] - then - tm_file=m68k/newsgas.h - else - tm_file=m68k/news.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-next-nextstep2*) - tm_file=m68k/next21.h - xm_file=m68k/xm-next.h - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_headers=math-68881.h - use_collect2=yes - ;; - m68k-next-nextstep3*) - tm_file=m68k/next.h - xm_file=m68k/xm-next.h - tmake_file=m68k/t-next - xmake_file=m68k/x-next - extra_objs=nextstep.o - extra_headers=math-68881.h - if [ x$enable_threads = xyes ]; then - thread_file='mach' - fi - ;; - m68k-sun-sunos3*) - if [ x$with_fp = xno ] - then - tm_file=m68k/sun3n3.h - else - tm_file=m68k/sun3o3.h - fi - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-sun-sunos*) # For SunOS 4 (the default). - if [ x$with_fp = xno ] - then - tm_file=m68k/sun3n.h - else - tm_file=m68k/sun3.h - fi - xm_file=m68k/xm-sun3.h - use_collect2=yes - extra_headers=math-68881.h - ;; - m68k-wrs-vxworks*) - tm_file=m68k/vxm68k.h - tmake_file=m68k/t-vxworks68 - extra_headers=math-68881.h - ;; - m68k-*-aout*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-aout.h libgloss.h" - extra_headers=math-68881.h - ;; - m68k-*-coff*) - tmake_file=m68k/t-m68kbare - tm_file="m68k/m68k-coff.h dbx.h libgloss.h" - extra_headers=math-68881.h - ;; - m68k-*-lynxos*) - if [ x$gas = xyes ] - then - tm_file=m68k/lynx.h - else - tm_file=m68k/lynx-ng.h - fi - xm_file=m68k/xm-lynx.h - xmake_file=x-lynx - tmake_file=m68k/t-lynx - extra_headers=math-68881.h - ;; - m68k-*-netbsd*) - tm_file=m68k/netbsd.h - xm_file=m68k/xm-netbsd.h - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - ;; - m68k-*-sysv3*) # Motorola m68k's running system V.3 - xm_file=m68k/xm-m68kv.h - xmake_file=m68k/x-m68kv - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-*-sysv4*) # Motorola m68k's running system V.4 - tm_file=m68k/m68kv4.h - xm_file=m68k/xm-m68kv.h - tmake_file=t-svr4 - extra_parts="crtbegin.o crtend.o" - extra_headers=math-68881.h - ;; - m68k-*-linux-gnuaout*) # Motorola m68k's running Linux - xm_file=m68k/xm-linux.h # with a.out format - xmake_file=x-linux - tm_file=m68k/linux-aout.h - tmake_file="t-linux-aout m68k/t-linux-aout" - fixincludes=Makefile.in #On Linux, the headers are ok already. - extra_headers=math-68881.h - gnu_ld=yes - ;; - m68k-*-linux-gnulibc1) # Motorola m68k's running Linux - xm_file=m68k/xm-linux.h # with ELF format using the - xmake_file=x-linux # Linux C library 5 - tm_file=m68k/linux.h - tmake_file="t-linux t-linux-gnulibc1 m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - extra_headers=math-68881.h - gnu_ld=yes - ;; - m68k-*-linux-gnu*) # Motorola m68k's running Linux - xm_file=m68k/xm-linux.h # with ELF format using glibc 2 - xmake_file=x-linux # aka the Linux C library 6. - tm_file=m68k/linux.h - tmake_file="t-linux m68k/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - extra_headers=math-68881.h - gnu_ld=yes - if [ x$enable_threads = xyes ]; then - thread_file='posix' - fi - ;; - m68k-*-psos*) - tmake_file=m68k/t-m68kbare - tm_file=m68k/m68k-psos.h - extra_headers=math-68881.h - ;; - m68k-*-rtems*) - tmake_file="m68k/t-m68kbare t-rtems" - tm_file=m68k/rtems.h - extra_headers=math-68881.h - ;; - - m88k-dg-dgux*) - case $machine in - m88k-dg-dguxbcs*) - tm_file=m88k/dguxbcs.h - tmake_file=m88k/t-dguxbcs - ;; - *) - tm_file=m88k/dgux.h - tmake_file=m88k/t-dgux - ;; - esac - extra_parts="crtbegin.o bcscrtbegin.o crtend.o m88kdgux.ld" - broken_install=yes - xmake_file=m88k/x-dgux - if [ x$gas = xyes ] - then - tmake_file=m88k/t-dgux-gas - fi - fixincludes=fixinc.dgux - ;; - m88k-dolphin-sysv3*) - tm_file=m88k/dolph.h - extra_parts="crtbegin.o crtend.o" - xm_file=m88k/xm-sysv3.h - xmake_file=m88k/x-dolph - if [ x$gas = xyes ] - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-tektronix-sysv3) - tm_file=m88k/tekXD88.h - extra_parts="crtbegin.o crtend.o" - xm_file=m88k/xm-sysv3.h - xmake_file=m88k/x-tekXD88 - if [ x$gas = xyes ] - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-aout*) - tm_file=m88k/m88k-aout.h - ;; - m88k-*-coff*) - tm_file=m88k/m88k-coff.h - tmake_file=m88k/t-bug - ;; - m88k-*-luna*) - tm_file=m88k/luna.h - extra_parts="crtbegin.o crtend.o" - if [ x$gas = xyes ] - then - tmake_file=m88k/t-luna-gas - else - tmake_file=m88k/t-luna - fi - ;; - m88k-*-sysv3*) - tm_file=m88k/sysv3.h - extra_parts="crtbegin.o crtend.o" - xm_file=m88k/xm-sysv3.h - xmake_file=m88k/x-sysv3 - if [ x$gas = xyes ] - then - tmake_file=m88k/t-m88k-gas - fi - ;; - m88k-*-sysv4*) - tm_file=m88k/sysv4.h - extra_parts="crtbegin.o crtend.o" - xmake_file=m88k/x-sysv4 - tmake_file=m88k/t-sysv4 - ;; - mips-sgi-irix6*) # SGI System V.4., IRIX 6 - tm_file=mips/iris6.h - xm_file=mips/xm-iris6.h - broken_install=yes - fixincludes=fixinc.irix - xmake_file=mips/x-iris6 - tmake_file=mips/t-iris6 - if [ x$enable_threads = xyes ]; then - thread_file='irix' - fi - ;; - mips-sgi-irix5cross64) # Irix5 host, Irix 6 target, cross64 - tm_file=mips/cross64.h - xm_file=mips/xm-iris5.h - broken_install=yes - fixincludes=Makefile.in - xmake_file=mips/x-iris - tmake_file=mips/t-cross64 - # See comment in mips/iris[56].h files. - use_collect2=yes - if [ x$enable_threads = xyes ]; then - thread_file='irix' - fi - ;; - mips-sni-sysv4) - if [ x$gas = xyes ] - then - if [ x$stabs = xyes ] - then - tm_file=mips/iris5gdb.h - else - tm_file=mips/sni-gas.h - fi - else - tm_file=mips/sni-svr4.h - fi - xm_file=mips/xm-sysv.h - xmake_file=mips/x-sni-svr4 - tmake_file=mips/t-mips-gas - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-sgi-irix5*) # SGI System V.4., IRIX 5 - if [ x$gas = xyes ] - then - tm_file=mips/iris5gas.h - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - else - tm_file=mips/iris5.h - fi - xm_file=mips/xm-iris5.h - broken_install=yes - fixincludes=fixinc.irix - xmake_file=mips/x-iris - # mips-tfile doesn't work yet - tmake_file=mips/t-mips-gas - # See comment in mips/iris5.h file. - use_collect2=yes - if [ x$enable_threads = xyes ]; then - thread_file='irix' - fi - ;; - mips-sgi-irix4loser*) # Mostly like a MIPS. - tm_file=mips/iris4loser.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-iris4.h - broken_install=yes - xmake_file=mips/x-iris - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - if [ x$enable_threads = xyes ]; then - thread_file='irix' - fi - ;; - mips-sgi-irix4*) # Mostly like a MIPS. - tm_file=mips/iris4.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-iris4.h - broken_install=yes - xmake_file=mips/x-iris - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - if [ x$enable_threads = xyes ]; then - thread_file='irix' - fi - ;; - mips-sgi-*) # Mostly like a MIPS. - tm_file=mips/iris3.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-iris3.h - broken_install=yes - xmake_file=mips/x-iris3 - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips-dec-osfrose*) # Decstation running OSF/1 reference port with OSF/rose. - tm_file=mips/osfrose.h - xmake_file=mips/x-osfrose - tmake_file=mips/t-osfrose - extra_objs=halfpic.o - use_collect2=yes - ;; - mips-dec-osf*) # Decstation running OSF/1 as shipped by DIGITAL - tm_file=mips/dec-osf1.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-dec-osf1 - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips-dec-bsd*) # Decstation running 4.4 BSD - tm_file=mips/dec-bsd.h - fixincludes= - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips-dec-netbsd*) # Decstation running NetBSD - tm_file=mips/netbsd.h - xm_file=mips/xm-netbsd.h - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - if [ x$prefix = xNONE ]; then - prefix=$native_prefix - fi - prefix=$native_prefix - ;; - mips-sony-bsd* | mips-sony-newsos*) # Sony NEWS 3600 or risc/news. - tm_file=mips/news4.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - xmake_file=mips/x-sony - ;; - mips-sony-sysv*) # Sony NEWS 3800 with NEWSOS5.0. - # That is based on svr4. - # t-svr4 is not right because this system doesn't use ELF. - tm_file=mips/news5.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-news.h - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips-tandem-sysv4*) # Tandem S2 running NonStop UX - tm_file=mips/svr4-t.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-sysv4.h - xmake_file=mips/x-sysv - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - extra_parts="crtbegin.o crtend.o" - else - tmake_file=mips/t-mips - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-ultrix* | mips-dec-mach3) # Decstation. - tm_file=mips/ultrix.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xmake_file=mips/x-ultrix - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - tmake_file=mips/t-ultrix - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mips-*-riscos[56789]bsd*) - tm_file=mips/bsd-5.h # MIPS BSD 4.3, RISC-OS 5.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas = xyes ] - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-bsd* | mips-*-riscosbsd* | mips-*-riscos[1234]bsd*) - tm_file=mips/bsd-4.h # MIPS BSD 4.3, RISC-OS 4.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas = xyes ] - then - tmake_file=mips/t-bsd-gas - else - tmake_file=mips/t-bsd - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-riscos[56789]sysv4*) - tm_file=mips/svr4-5.h # MIPS System V.4., RISC-OS 5.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-sysv4.h - xmake_file=mips/x-sysv - if [ x$gas = xyes ] - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-sysv4* | mips-*-riscos[1234]sysv4* | mips-*-riscossysv4*) - tm_file=mips/svr4-4.h # MIPS System V.4. RISC-OS 4.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-sysv.h - xmake_file=mips/x-sysv - if [ x$gas = xyes ] - then - tmake_file=mips/t-svr4-gas - else - tmake_file=mips/t-svr4 - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-riscos[56789]sysv*) - tm_file=mips/svr3-5.h # MIPS System V.3, RISC-OS 5.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-sysv.h - xmake_file=mips/x-sysv - if [ x$gas = xyes ] - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-sysv* | mips-*-riscos*sysv*) - tm_file=mips/svr3-4.h # MIPS System V.3, RISC-OS 4.0 - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - xm_file=mips/xm-sysv.h - xmake_file=mips/x-sysv - if [ x$gas = xyes ] - then - tmake_file=mips/t-svr3-gas - else - tmake_file=mips/t-svr3 - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-riscos[56789]*) # Default MIPS RISC-OS 5.0. - tm_file=mips/mips-5.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - broken_install=yes - ;; - mips-*-gnu*) - ;; - mipsel-*-ecoff*) - tm_file=mips/ecoffl.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - ;; - mips-*-ecoff*) - tm_file=mips/ecoff.h - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - tmake_file=mips/t-ecoff - broken_install=yes - ;; - mipsel-*-elf*) - tm_file="mips/elfl.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips-*-elf*) - tm_file="mips/elf.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips64el-*-elf*) - tm_file="mips/elfl64.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips64orionel-*-elf*) - tm_file="mips/elflorion.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips64-*-elf*) - tm_file="mips/elf64.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips64orion-*-elf*) - tm_file="mips/elforion.h libgloss.h" - tmake_file=mips/t-ecoff - ;; - mips64orion-*-rtems*) - tm_file=mips/rtems64.h - tmake_file="mips/t-ecoff t-rtems" - ;; - mips-*-*) # Default MIPS RISC-OS 4.0. - if [ x$stabs = xyes ]; then - tm_file="${tm_file} dbx.h" - fi - if [ x$gas = xyes ] - then - tmake_file=mips/t-mips-gas - else - extra_passes="mips-tfile mips-tdump" - fi - if [ x$gnu_ld != xyes ] - then - use_collect2=yes - fi - ;; - mn10200-*-*) - cpu_type=mn10200 - tm_file="mn10200/mn10200.h" - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - mn10300-*-*) - cpu_type=mn10300 - tm_file="mn10300/mn10300.h" - if [ x$stabs = xyes ] - then - tm_file="${tm_file} dbx.h" - fi - use_collect2=no - ;; - ns32k-encore-bsd*) - tm_file=ns32k/encore.h - use_collect2=yes - ;; - ns32k-sequent-bsd*) - tm_file=ns32k/sequent.h - use_collect2=yes - ;; - ns32k-tek6100-bsd*) - tm_file=ns32k/tek6100.h - broken_install=yes - use_collect2=yes - ;; - ns32k-tek6200-bsd*) - tm_file=ns32k/tek6200.h - broken_install=yes - use_collect2=yes - ;; -# This has not been updated to GCC 2. -# ns32k-ns-genix*) -# xm_file=ns32k/xm-genix.h -# xmake_file=ns32k/x-genix -# tm_file=ns32k/genix.h -# broken_install=yes -# use_collect2=yes -# ;; - ns32k-merlin-*) - tm_file=ns32k/merlin.h - use_collect2=yes - ;; - ns32k-pc532-mach*) - tm_file=ns32k/pc532-mach.h - use_collect2=yes - ;; - ns32k-pc532-minix*) - tm_file=ns32k/pc532-min.h - xm_file=ns32k/xm-pc532-min.h - use_collect2=yes - ;; - ns32k-pc532-netbsd*) - tm_file=ns32k/netbsd.h - xm_file=ns32k/xm-netbsd.h - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - ;; - pdp11-*-bsd) - tm_file="${tm_file} pdp11/2bsd.h" - ;; - pdp11-*-*) - ;; - pyramid-*-*) - cpu_type=pyr - xmake_file=pyr/x-pyr - use_collect2=yes - ;; - romp-*-aos*) - use_collect2=yes - ;; - romp-*-mach*) - xmake_file=romp/x-mach - use_collect2=yes - ;; - powerpc-*-sysv* | powerpc-*-elf*) - tm_file=rs6000/sysv4.h - xm_file=rs6000/xm-sysv4.h - extra_headers=ppc-asm.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - ;; - powerpc-*-eabiaix*) - tm_file=rs6000/eabiaix.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabisim*) - tm_file=rs6000/eabisim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-eabi*) - tm_file=rs6000/eabi.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-rtems*) - tm_file=rs6000/rtems.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcgas t-rtems rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-rtems rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpc-*-linux-gnu*) - tm_file=rs6000/linux.h - xm_file=rs6000/xm-sysv4.h - out_file=rs6000/rs6000.c - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcos t-linux rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc t-linux rs6000/t-ppccomm" - fi - xmake_file=x-linux - fixincludes=Makefile.in - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - extra_headers=ppc-asm.h - if [ x$enable_threads = xyes ]; then - thread_file='posix' - fi - ;; - powerpc-*-vxworks*) - cpu_type=rs6000 - xm_file=rs6000/xm-sysv4.h - tm_file=rs6000/vxppc.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - extra_headers=ppc-asm.h - ;; - powerpcle-*-sysv* | powerpcle-*-elf*) - tm_file=rs6000/sysv4le.h - xm_file=rs6000/xm-sysv4.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabisim*) - tm_file=rs6000/eabilesim.h - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-eabi*) - tm_file=rs6000/eabile.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - fixincludes=Makefile.in - extra_headers=ppc-asm.h - ;; - powerpcle-*-winnt* ) - tm_file=rs6000/win-nt.h - tmake_file=rs6000/t-winnt -# extra_objs=pe.o - fixincludes=Makefile.in - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - extra_headers=ppc-asm.h - ;; - powerpcle-*-pe | powerpcle-*-cygwin32) - tm_file=rs6000/cygwin32.h - xm_file=rs6000/xm-cygwin32.h - tmake_file=rs6000/t-winnt - xmake_file=rs6000/x-cygwin32 -# extra_objs=pe.o - fixincludes=Makefile.in - if [ x$enable_threads = xyes ]; then - thread_file='win32' - fi - exeext=.exe - extra_headers=ppc-asm.h - ;; - powerpcle-*-solaris2*) - tm_file=rs6000/sol2.h - xm_file=rs6000/xm-sysv4.h - if [ x$gas = xyes ] - then - tmake_file="rs6000/t-ppcos rs6000/t-ppccomm" - else - tmake_file="rs6000/t-ppc rs6000/t-ppccomm" - fi - xmake_file=rs6000/x-sysv4 - fixincludes=fixinc.svr4 - extra_headers=ppc-asm.h - ;; - rs6000-ibm-aix3.[01]*) - tm_file=rs6000/aix31.h - xmake_file=rs6000/x-aix31 - use_collect2=yes - ;; - rs6000-ibm-aix3.2.[456789]* | powerpc-ibm-aix3.2.[456789]*) - tm_file=rs6000/aix3newas.h - if [ x$host != x$target ] - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - use_collect2=yes - ;; - rs6000-ibm-aix[456789].* | powerpc-ibm-aix[456789].*) - tm_file=rs6000/aix41.h - if [ x$host != x$target ] - then - tmake_file=rs6000/t-xnewas - else - tmake_file=rs6000/t-newas - fi - xmake_file=rs6000/x-aix31 - use_collect2=yes - ;; - rs6000-ibm-aix*) - use_collect2=yes - ;; - rs6000-bull-bosx) - use_collect2=yes - ;; - rs6000-*-mach*) - tm_file=rs6000/mach.h - xm_file=rs6000/xm-mach.h - xmake_file=rs6000/x-mach - use_collect2=yes - ;; - rs6000-*-lynxos*) - tm_file=rs6000/lynx.h - xm_file=rs6000/xm-lynx.h - tmake_file=rs6000/t-rs6000 - xmake_file=rs6000/x-lynx - use_collect2=yes - ;; - sh-*-elf*) - tm_file=sh/elf.h - float_format=sh - ;; - sh-*-*) - float_format=sh - ;; - sparc-tti-*) - tm_file=sparc/pbd.h - xm_file=sparc/xm-pbd.h - ;; - sparc-wrs-vxworks* | sparclite-wrs-vxworks*) - tm_file=sparc/vxsparc.h - tmake_file=sparc/t-vxsparc - use_collect2=yes - ;; - sparc-*-aout*) - tmake_file=sparc/t-sparcbare - tm_file="sparc/aout.h libgloss.h" - ;; - sparc-*-netbsd*) - tm_file=sparc/netbsd.h - xm_file=sparc/xm-netbsd.h - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - ;; - sparc-*-bsd*) - tm_file=sparc/bsd.h - ;; - sparc-*-linux-gnuaout*) # Sparc's running Linux, a.out - xm_file=sparc/xm-linux.h - tm_file=sparc/linux-aout.h - xmake_file=x-linux - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - ;; - sparc-*-linux-gnulibc1*) # Sparc's running Linux - xm_file=sparc/xm-linux.h # with ELF format using the - xmake_file=x-linux # Linux C library 5. - tm_file=sparc/linux.h - tmake_file="t-linux t-linux-gnulibc1 sparc/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - ;; - sparc-*-linux-gnu*) # Sparc's running Linux - xm_file=sparc/xm-linux.h # with ELF format using glibc 2 - xmake_file=x-linux # aka the Linux C library 6. - tm_file=sparc/linux.h - tmake_file="t-linux sparc/t-linux" - extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" - fixincludes=Makefile.in #On Linux, the headers are ok already. - broken_install=yes - gnu_ld=yes - if [ x$enable_threads = xyes ]; then - thread_file='posix' - fi - ;; - sparc-*-lynxos*) - if [ x$gas = xyes ] - then - tm_file=sparc/lynx.h - else - tm_file=sparc/lynx-ng.h - fi - xm_file=sparc/xm-lynx.h - tmake_file=sparc/t-sunos41 - xmake_file=x-lynx - ;; - sparc-*-rtems*) - tmake_file="sparc/t-sparcbare t-rtems" - tm_file=sparc/rtems.h - ;; - sparc-*-solaris2*) - tm_file=sparc/sol2.h - xm_file=sparc/xm-sol2.h - tmake_file=sparc/t-sol2 - xmake_file=sparc/x-sysv4 - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - fixincludes=fixinc.svr4 - broken_install=yes - if [ x$enable_threads = xyes ]; then - thread_file='solaris' - fi - ;; - sparc-*-sunos4.0*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos40 - use_collect2=yes - ;; - sparc-*-sunos4*) - tm_file=sparc/sunos4.h - tmake_file=sparc/t-sunos41 - use_collect2=yes - ;; - sparc-*-sunos3*) - tm_file=sparc/sun4o3.h - use_collect2=yes - ;; - sparc-*-sysv4*) - tm_file=sparc/sysv4.h - xm_file=sparc/xm-sysv4.h - tmake_file=t-svr4 - xmake_file=sparc/x-sysv4 - extra_parts="crtbegin.o crtend.o" - ;; - sparc-*-vxsim*) - xm_file=sparc/xm-sol2.h - tm_file=sparc/vxsim.h - tmake_file=sparc/t-vxsparc - xmake_file=sparc/x-sysv4 - ;; - sparclet-*-aout*) - tm_file="sparc/splet.h libgloss.h" - tmake_file=sparc/t-splet - ;; - sparclite-*-coff*) - tm_file="sparc/litecoff.h libgloss.h" - tmake_file=sparc/t-sparclite - ;; - sparclite-*-aout*) - tm_file="sparc/lite.h aoutos.h libgloss.h" - tmake_file=sparc/t-sparclite - ;; - sparc64-*-aout*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-aout.h - ;; - sparc64-*-elf*) - tmake_file=sparc/t-sp64 - tm_file=sparc/sp64-elf.h - extra_parts="crtbegin.o crtend.o" - ;; -# This hasn't been upgraded to GCC 2. -# tahoe-harris-*) # Harris tahoe, using COFF. -# tm_file=tahoe/harris.h -# ;; -# tahoe-*-bsd*) # tahoe running BSD -# ;; -# This hasn't been upgraded to GCC 2. -# tron-*-*) -# cpu_type=gmicro -# use_collect2=yes -# ;; - vax-*-bsd*) # vaxen running BSD - use_collect2=yes - float_format=vax - ;; - vax-*-sysv*) # vaxen running system V - tm_file="${tm_file} vax/vaxv.h" - xm_file="${tm_file} vax/xm-vaxv.h" - float_format=vax - ;; - vax-*-netbsd*) - tm_file="${tm_file} netbsd.h vax/netbsd.h" - xm_file="${xm_file} xm-netbsd.h" - # On NetBSD, the headers are already okay. - fixincludes=Makefile.in - tmake_file=t-netbsd - float_format=vax - ;; - vax-*-ultrix*) # vaxen running ultrix - tm_file="${tm_file} vax/ultrix.h" - use_collect2=yes - float_format=vax - ;; - vax-*-vms*) # vaxen running VMS - xm_file=vax/xm-vms.h - tm_file=vax/vms.h - float_format=vax - ;; - vax-*-*) # vax default entry - float_format=vax - ;; - we32k-att-sysv*) - xm_file="${xm_file} xm-svr3" - use_collect2=yes - ;; - *) - echo "Configuration $machine not supported" 1>&2 - exit 1 - ;; - esac - - case $machine in - *-*-linux-gnu*) - ;; # Existing Linux/GNU systems do not use the GNU setup. - *-*-gnu*) - # On the GNU system, the setup is just about the same on - # each different CPU. The specific machines that GNU - # supports are matched above and just set $cpu_type. - xm_file=${cpu_type}/xm-gnu.h - tm_file=${cpu_type}/gnu.h - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" - # GNU always uses ELF. - elf=yes - # GNU tools are the only tools. - gnu_ld=yes - gas=yes - # On GNU, the headers are already okay. - fixincludes=Makefile.in - xmake_file=x-linux # These details are the same as Linux. - tmake_file=t-gnu # These are not. - ;; - *-*-sysv4*) - fixincludes=fixinc.svr4 - xmake_try_sysv=x-sysv - broken_install=yes - install_headers_dir=install-headers-cpio - ;; - *-*-sysv*) - broken_install=yes - install_headers_dir=install-headers-cpio - ;; - esac - - # Distinguish i[3456]86 - # Also, do not run mips-tfile on MIPS if using gas. - # Process --with-cpu= for PowerPC/rs6000 - target_cpu_default2= - case $machine in - i486-*-*) - target_cpu_default2=1 - ;; - i586-*-*) - target_cpu_default2=2 - ;; - i686-*-*) - target_cpu_default2=3 - ;; - alpha*-*-*) - case $machine in - alphaev56*) - target_cpu_default2="MASK_CPU_EV5|MASK_BYTE_OPS" - ;; - alphaev5*) - target_cpu_default2="MASK_CPU_EV5" - ;; - esac - - if [ x$gas = xyes ] - then - if [ x$target_cpu_default2 = x ] - then - target_cpu_default2="MASK_GAS" - else - target_cpu_default2="${target_cpu_default2}|MASK_GAS" - fi - fi - ;; - mips*-*-ecoff* | mips*-*-elf*) - if [ x$gas = xyes ] - then - if [ x$gnu_ld = xyes ] - then - target_cpu_default2=20 - else - target_cpu_default2=16 - fi - fi - ;; - mips*-*-*) - if [ x$gas = xyes ] - then - target_cpu_default2=16 - fi - ;; - powerpc*-*-* | rs6000-*-*) - case "x$with_cpu" in - x) - ;; - - xcommon | xpower | xpower2 | xpowerpc | xrios \ - | xrios1 | xrios2 | xrsc | xrsc1 \ - | x601 | x602 | x603 | x603e | x604 | x604e | x620 \ - | x403 | x505 | x801 | x821 | x823 | x860) - target_cpu_default2="'\"$with_cpu\"'" - ;; - - xyes | xno) - echo "--with-cpu must be passed a value" 1>&2 - exit 1 - ;; - - *) - echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2 - exit 1 - ;; - esac - ;; - sparc*-*-*) - case ".$with_cpu" in - .) - target_cpu_default2=TARGET_CPU_"`echo $machine | sed 's/-.*$//'`" - ;; - .supersparc | .ultrasparc | .v7 | .v8) - target_cpu_default2="TARGET_CPU_$with_cpu" - ;; - *) - echo "Unknown cpu used with --with-cpu=$with_cpu" 1>&2 - exit 1 - ;; - esac - ;; - esac - - if [ x$target_cpu_default2 != x ] - then - if [ x$target_cpu_default != x ] - then - target_cpu_default="(${target_cpu_default}|${target_cpu_default2})" - else - target_cpu_default=$target_cpu_default2 - fi - fi - - # No need for collect2 if we have the GNU linker. - case x$gnu_ld in - xyes) - use_collect2= - ;; - esac - -# Save data on machine being used to compile GCC in build_xm_file. -# Save data on host machine in vars host_xm_file and host_xmake_file. - if [ x$pass1done = x ] - then - if [ x"$xm_file" = x ] - then build_xm_file=$cpu_type/xm-$cpu_type.h - else build_xm_file=$xm_file - fi - build_broken_install=$broken_install - build_install_headers_dir=$install_headers_dir - build_exeext=$exeext - pass1done=yes - else - if [ x$pass2done = x ] - then - if [ x"$xm_file" = x ] - then host_xm_file=$cpu_type/xm-$cpu_type.h - else host_xm_file=$xm_file - fi - if [ x"$xmake_file" = x ] - then xmake_file=$cpu_type/x-$cpu_type - fi - host_xmake_file="$xmake_file" - host_truncate_target=$truncate_target - host_extra_gcc_objs=$extra_gcc_objs - host_extra_objs=$extra_host_objs - pass2done=yes - fi - fi -done - -extra_objs="${host_extra_objs} ${extra_objs}" - -# Default the target-machine variables that were not explicitly set. -if [ x"$tm_file" = x ] -then tm_file=$cpu_type/$cpu_type.h; fi - -if [ x$extra_headers = x ] -then extra_headers=; fi - -if [ x"$xm_file" = x ] -then xm_file=$cpu_type/xm-$cpu_type.h; fi - -md_file=$cpu_type/$cpu_type.md - -if [ x$out_file = x ] -then out_file=$cpu_type/$cpu_type.c; fi - -if [ x"$tmake_file" = x ] -then tmake_file=$cpu_type/t-$cpu_type -fi - -if [ x$float_format = x ] -then float_format=i64 -fi - -# Say what files are being used for the output code and MD file. -echo "Using \`$srcdir/config/$out_file' to output insns." -echo "Using \`$srcdir/config/$md_file' as machine description file." - -count=a -for f in $tm_file; do - count=${count}x -done -if [ $count = ax ]; then - echo "Using \`$srcdir/config/$tm_file' as target machine macro file." -else - echo "Using the following target machine macro files:" - for f in $tm_file; do - echo " $srcdir/config/$f" - done -fi - -count=a -for f in $host_xm_file; do - count=${count}x -done -if [ $count = ax ]; then - echo "Using \`$srcdir/config/$host_xm_file' as host machine macro file." -else - echo "Using the following host machine macro files:" - for f in $host_xm_file; do - echo " $srcdir/config/$f" - done -fi - -if [ "$host_xm_file" != "$build_xm_file" ]; then - count=a - for f in $build_xm_file; do - count=${count}x - done - if [ $count = ax ]; then - echo "Using \`$srcdir/config/$build_xm_file' as build machine macro file." - else - echo "Using the following build machine macro files:" - for f in $build_xm_file; do - echo " $srcdir/config/$f" - done - fi -fi - -if [ x$thread_file = x ] -then thread_file='single' -fi - -# Set up the header files. -# $links is the list of header files to create. -# $vars is the list of shell variables with file names to include. -# config2.h is the old config.h. It is included by the new config.h which -# created from config.in. The goal is to simplify the transition to autoconf. -vars="host_xm_file tm_file xm_file build_xm_file" -links="config2.h tm.h tconfig.h hconfig.h" - -rm -f config.bak -if [ -f config.status ]; then mv -f config.status config.bak; fi - -# Make the links. -while [ -n "$vars" ] -do - # set file to car of files, files to cdr of files - set $vars; var=$1; shift; vars=$* - set $links; link=$1; shift; links=$* - - rm -f $link - - # Define TARGET_CPU_DEFAULT if the system wants one. - # This substitutes for lots of *.h files. - if [ x$target_cpu_default != x -a $link = tm.h ] - then - echo "#define TARGET_CPU_DEFAULT $target_cpu_default" >>$link - fi - - for file in `eval echo '$'$var`; do - echo "#include \"$file\"" >>$link - done -done - -# Truncate the target if necessary -if [ x$host_truncate_target != x ]; then - target=`echo $target | sed -e 's/\(..............\).*/\1/'` -fi - -# Get the version number from the toplevel -version=`sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < ${srcdir}/version.c` - -# Are we using gcc as the native compiler? -case $host in -*linux*) # All Linux's use gcc as the native compiler. - if [ x$prefix = xNONE ]; then - prefix=$native_prefix - fi - ;; -esac - -# Get an absolute path to the GCC top-level source directory -holddir=`pwd` -cd $srcdir -topdir=`pwd` -cd $holddir - -# Conditionalize the makefile for this host machine. -# Make-host contains the concatenation of all host makefile fragments -# [there can be more than one]. This file is built by configure.frag. -host_overrides=Make-host -dep_host_xmake_file= -for f in .. ${host_xmake_file} -do - if [ -f ${srcdir}/config/$f ] - then - dep_host_xmake_file="${dep_host_xmake_file} ${srcdir}/config/$f" - fi -done - -# Conditionalize the makefile for this target machine. -# Make-target contains the concatenation of all host makefile fragments -# [there can be more than one]. This file is built by configure.frag. -target_overrides=Make-target -dep_tmake_file= -for f in .. ${tmake_file} -do - if [ -f ${srcdir}/config/$f ] - then - dep_tmake_file="${dep_tmake_file} ${srcdir}/config/$f" - fi -done - -# If the host doesn't support symlinks, modify CC in -# FLAGS_TO_PASS so CC="stage1/xgcc -Bstage1/" works. -# Otherwise, we can use "CC=$(CC)". -rm -f symtest.tem -if $symbolic_link symtest1.tem symtest.tem 2>/dev/null -then - cc_set_by_configure="\$(CC)" - stage_prefix_set_by_configure="\$(STAGE_PREFIX)" -else - cc_set_by_configure="\`case '\$(CC)' in stage*) echo '\$(CC)' | sed -e 's|stage|../stage|g';; *) echo '\$(CC)';; esac\`" - stage_prefix_set_by_configure="\`case '\$(STAGE_PREFIX)' in stage*) echo '\$(STAGE_PREFIX)' | sed -e 's|stage|../stage|g';; *) echo '\$(STAGE_PREFIX)';; esac\`" -fi -rm -f symtest.tem - -out_object_file=`basename $out_file .c`.o - -tm_file_list= -for f in $tm_file; do - tm_file_list="${tm_file_list} \$(srcdir)/config/$f" -done - -host_xm_file_list= -for f in $host_xm_file; do - host_xm_file_list="${host_xm_file_list} \$(srcdir)/config/$f" -done - -build_xm_file_list= -for f in $build_xm_file; do - build_xm_file_list="${build_xm_file_list} \$(srcdir)/config/$f" -done - -# Define macro CROSS_COMPILE in compilation -# if this is a cross-compiler. -# Also use all.cross instead of all.internal -# and add cross-make to Makefile. -cross_overrides="/dev/null" -if [ x$host != x$target ] -then - cross_defines="CROSS=-DCROSS_COMPILE" - cross_overrides="${topdir}/cross-make" -fi - -# When building gcc with a cross-compiler, we need to fix a few things. -# This must come after cross-make as we want all.build to override -# all.cross. -build_overrides="/dev/null" -if [ x$build != x$host ] -then - build_overrides="${topdir}/build-make" -fi - -# Expand extra_headers to include complete path. -# This substitutes for lots of t-* files. -extra_headers_list= -if [ "x$extra_headers" = x ] -then true -else - # Prepend ${srcdir}/ginclude/ to every entry in extra_headers. - for file in $extra_headers; - do - extra_headers_list="${extra_headers_list} \$(srcdir)/ginclude/${file}" - done -fi - -# Add a definition of USE_COLLECT2 if system wants one. -# Also tell toplev.c what to do. -# This substitutes for lots of t-* files. -if [ x$use_collect2 = x ] -then - will_use_collect2= - maybe_use_collect2= -else - will_use_collect2="ld" - maybe_use_collect2="-DUSE_COLLECT2" -fi - -# NEED TO CONVERT -# Set MD_DEPS if the real md file is in md.pre-cpp. -# Set MD_CPP to the cpp to pass the md file through. Md files use ';' -# for line oriented comments, so we must always use a GNU cpp. If -# building gcc with a cross compiler, use the cross compiler just -# built. Otherwise, we can use the cpp just built. -md_file_sub= -if [ "x$md_cppflags" = x ] -then - md_file_sub=$srcdir/config/$md_file -else - md_file=md -fi - -# If we have gas in the build tree, make a link to it. -if [ -f ../gas/Makefile ]; then - rm -f as; $symbolic_link ../gas/as.new as 2>/dev/null -fi - -# If we have ld in the build tree, make a link to it. -if [ -f ../ld/Makefile ]; then - if [ x$use_collect2 = x ]; then - rm -f ld; $symbolic_link ../ld/ld.new ld 2>/dev/null - else - rm -f collect-ld; $symbolic_link ../ld/ld.new collect-ld 2>/dev/null - fi -fi - -# Figure out what language subdirectories are present. -subdirs= -for lang in ${srcdir}/*/config-lang.in .. -do - case $lang in - ..) ;; - # The odd quoting in the next line works around - # an apparent bug in bash 1.12 on linux. - ${srcdir}/[*]/config-lang.in) ;; - *) subdirs="$subdirs `echo $lang | sed -e 's,^.*/\([^/]*\)/config-lang.in$,\1,'`" ;; - esac -done - -# Make empty files to contain the specs and options for each language. -# Then add #include lines to for a compiler that has specs and/or options. - -lang_specs_files= -lang_options_files= -rm -f specs.h options.h -touch specs.h options.h -for subdir in . $subdirs -do - if [ -f $srcdir/$subdir/lang-specs.h ]; then - echo "#include \"$subdir/lang-specs.h\"" >>specs.h - lang_specs_files="$lang_specs_files $srcdir/$subdir/lang-specs.h" - fi - if [ -f $srcdir/$subdir/lang-options.h ]; then - echo "#include \"$subdir/lang-options.h\"" >>options.h - lang_options_files="$lang_options_files $srcdir/$subdir/lang-options.h" - fi -done - -# These (without "all_") are set in each config-lang.in. -# `language' must be a single word so is spelled singularly. -all_languages= -all_boot_languages= -all_compilers= -all_stagestuff= -all_diff_excludes= -all_outputs=Makefile -# List of language makefile fragments. -all_lang_makefiles= -all_headers= -all_lib2funcs= - -# Add the language fragments. -# Languages are added via two mechanisms. Some information must be -# recorded in makefile variables, these are defined in config-lang.in. -# We accumulate them and plug them into the main Makefile. -# The other mechanism is a set of hooks for each of the main targets -# like `clean', `install', etc. - -language_fragments="Make-lang" -language_hooks="Make-hooks" -oldstyle_subdirs= - -for s in .. $subdirs -do - if [ $s != ".." ] - then - language= - boot_language= - compilers= - stagestuff= - diff_excludes= - headers= - outputs= - lib2funcs= - . ${srcdir}/$s/config-lang.in - if [ "x$language" = x ] - then - echo "${srcdir}/$s/config-lang.in doesn't set \$language." 1>&2 - exit 1 - fi - all_lang_makefiles="$all_lang_makefiles ${srcdir}/$s/Make-lang.in ${srcdir}/$s/Makefile.in" - all_languages="$all_languages $language" - if [ "x$boot_language" = xyes ] - then - all_boot_languages="$all_boot_languages $language" - fi - all_compilers="$all_compilers $compilers" - all_stagestuff="$all_stagestuff $stagestuff" - all_diff_excludes="$all_diff_excludes $diff_excludes" - all_headers="$all_headers $headers" - all_outputs="$all_outputs $outputs" - if [ x$outputs = x ] - then - oldstyle_subdirs="$oldstyle_subdirs $s" - fi - all_lib2funcs="$all_lib2funcs $lib2funcs" - fi -done - -# Since we can't use `::' targets, we link each language in -# with a set of hooks, reached indirectly via lang.${target}. - -rm -f Make-hooks -touch Make-hooks -target_list="all.build all.cross start.encap rest.encap \ - info dvi \ - install-normal install-common install-info install-man \ - uninstall distdir \ - mostlyclean clean distclean extraclean maintainer-clean \ - stage1 stage2 stage3 stage4" -for t in $target_list -do - x= - for l in .. $all_languages - do - if [ $l != ".." ]; then - x="$x $l.$t" - fi - done - echo "lang.$t: $x" >> Make-hooks -done - -# If we're not building in srcdir, create .gdbinit. - -if [ ! -f Makefile.in ]; then - echo "dir ." > .gdbinit - echo "dir ${srcdir}" >> .gdbinit - if [ x$gdb_needs_out_file_path = xyes ] - then - echo "dir ${srcdir}/config/"`dirname ${out_file}` >> .gdbinit - fi - if [ "x$subdirs" != x ]; then - for s in $subdirs - do - echo "dir ${srcdir}/$s" >> .gdbinit - done - fi - echo "source ${srcdir}/.gdbinit" >> .gdbinit -fi - -# Process the language and host/target makefile fragments. -${CONFIG_SHELL-/bin/sh} $srcdir/configure.frag $srcdir "$subdirs" "$dep_host_xmake_file" "$dep_tmake_file" - -# Substitute configuration variables - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Echo that links are built -if [ x$host = x$target ] -then - str1="native " -else - str1="cross-" - str2=" from $host" -fi - -if [ x$host != x$build ] -then - str3=" on a $build system" -fi - -if [ "x$str2" != x ] || [ "x$str3" != x ] -then - str4= -fi - -echo "Links are now set up to build a ${str1}compiler for ${target}$str4" 1>&2 - -if [ "x$str2" != x ] || [ "x$str3" != x ] -then - echo " ${str2}${str3}." 1>&2 -fi - -# Configure the subdirectories -# AC_CONFIG_SUBDIRS($subdirs) - -# Create the Makefile -# and configure language subdirectories -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.12" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "$all_outputs config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@AWK@%$AWK%g -s%@LEX@%$LEX%g -s%@LEXLIB@%$LEXLIB%g -s%@LN_S@%$LN_S%g -s%@RANLIB@%$RANLIB%g -s%@YACC@%$YACC%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@CC@%$CC%g -s%@SET_MAKE@%$SET_MAKE%g -s%@CPP@%$CPP%g -s%@manext@%$manext%g -s%@objext@%$objext%g -s%@subdirs@%$subdirs%g -s%@all_languages@%$all_languages%g -s%@all_boot_languages@%$all_boot_languages%g -s%@all_compilers@%$all_compilers%g -s%@all_lang_makefiles@%$all_lang_makefiles%g -s%@all_stagestuff@%$all_stagestuff%g -s%@all_diff_excludes@%$all_diff_excludes%g -s%@all_lib2funcs@%$all_lib2funcs%g -s%@all_headers@%$all_headers%g -s%@extra_passes@%$extra_passes%g -s%@extra_programs@%$extra_programs%g -s%@extra_parts@%$extra_parts%g -s%@extra_c_objs@%$extra_c_objs%g -s%@extra_c_flags@%$extra_c_flags%g -s%@extra_objs@%$extra_objs%g -s%@host_extra_gcc_objs@%$host_extra_gcc_objs%g -s%@extra_headers_list@%$extra_headers_list%g -s%@dep_host_xmake_file@%$dep_host_xmake_file%g -s%@dep_tmake_file@%$dep_tmake_file%g -s%@out_file@%$out_file%g -s%@out_object_file@%$out_object_file%g -s%@md_file@%$md_file%g -s%@tm_file_list@%$tm_file_list%g -s%@build_xm_file_list@%$build_xm_file_list%g -s%@host_xm_file_list@%$host_xm_file_list%g -s%@lang_specs_files@%$lang_specs_files%g -s%@lang_options_files@%$lang_options_files%g -s%@thread_file@%$thread_file%g -s%@version@%$version%g -s%@local_prefix@%$local_prefix%g -s%@gxx_include_dir@%$gxx_include_dir%g -s%@fixincludes@%$fixincludes%g -s%@build_install_headers_dir@%$build_install_headers_dir%g -s%@build_exeext@%$build_exeext%g -s%@float_format@%$float_format%g -s%@will_use_collect2@%$will_use_collect2%g -s%@maybe_use_collect2@%$maybe_use_collect2%g -s%@cc_set_by_configure@%$cc_set_by_configure%g -s%@stage_prefix_set_by_configure@%$stage_prefix_set_by_configure%g -/@target_overrides@/r $target_overrides -s%@target_overrides@%%g -/@host_overrides@/r $host_overrides -s%@host_overrides@%%g -s%@cross_defines@%$cross_defines%g -/@cross_overrides@/r $cross_overrides -s%@cross_overrides@%%g -/@build_overrides@/r $build_overrides -s%@build_overrides@%%g -/@language_fragments@/r $language_fragments -s%@language_fragments@%%g -/@language_hooks@/r $language_hooks -s%@language_hooks@%%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"$all_outputs"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <<EOF - CONFIG_HEADERS="config.h:config.in" -EOF -cat >> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <<EOF - -host='${host}' -build='${build}' -target='${target}' -target_alias='${target_alias}' -srcdir='${srcdir}' -subdirs='${subdirs}' -oldstyle_subdirs='${oldstyle_subdirs}' -symbolic_link='${symbolic_link}' -program_transform_set='${program_transform_set}' -program_transform_name='${program_transform_name}' -dep_host_xmake_file='${dep_host_xmake_file}' -host_xmake_file='${host_xmake_file}' -dep_tmake_file='${dep_tmake_file}' -tmake_file='${tmake_file}' -thread_file='${thread_file}' -version='${version}' -local_prefix='${local_prefix}' -build_install_headers_dir='${build_install_headers_dir}' -build_exeext='${build_exeext}' -gdb_needs_out_file_path='${gdb_needs_out_file_path}' -SET_MAKE='${SET_MAKE}' -build_broken_install='${build_broken_install}' -target_list='${target_list}' -target_overrides='${target_overrides}' -host_overrides='${host_overrides}' -cross_defines='${cross_defines}' -cross_overrides='${cross_overrides}' -build_overrides='${build_overrides}' - -EOF -cat >> $CONFIG_STATUS <<\EOF - -. $srcdir/configure.lang -case x$CONFIG_HEADERS in -xconfig.h:config.in) -echo > cstamp-h ;; -esac - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/gcc/cp/ChangeLog.1 b/gcc/cp/ChangeLog.1 new file mode 100644 index 00000000000..024a4e62126 --- /dev/null +++ b/gcc/cp/ChangeLog.1 @@ -0,0 +1,9451 @@ +Sun Nov 26 14:47:42 1995 Richard Kenner <kenner@mole.gnu.ai.mit.edu> + + * Version 2.7.2 released. + +Mon Nov 20 14:05:00 1995 Mike Stump <mrs@cygnus.com> + + * g++.c (pfatal_with_name): Add missing third argument to concat. + +Thu Oct 26 13:59:54 1995 Mike Stump <mrs@cygnus.com> + + * init.c (expand_aggr_init): Handle cv qualifiers on the object's + type. + +Sat Nov 11 08:25:55 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Version 2.7.1 released. + +Thu Nov 2 17:02:47 1995 Jason Merrill <jason@yorick.cygnus.com> + + * call.c (convert_harshness): Handle references to arrays. + +Fri Oct 27 14:20:21 1995 Jason Merrill <jason@yorick.cygnus.com> + + * typeck.c (comp_target_types): Check multi-level pointer + conversions in both directions. + +Tue Oct 17 21:39:05 1995 Jason Merrill <jason@yorick.cygnus.com> + + * parse.y (explicit_instantiation): Fix 'extern template' with no + return type. + +Mon Oct 16 14:35:20 1995 Jason Merrill <jason@yorick.cygnus.com> + + * parse.y (explicit_instantiation): Support automatic instantiation + of constructors. + (named_class_head_*): Support out-of-class definition of nested + types. + +Wed Oct 11 12:20:56 1995 Mike Stump <mrs@cygnus.com> + + * search.c (envelope_add_decl): New routine. Fix so that + methods are hidden in the same way that other members are. + (dfs_pushdecls): Cleanup and move functionality out of line, + into envelope_add_decl. + +Tue Oct 10 15:46:01 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (mark_addressable): Only call assemble_external if we + have started the output file. + +Tue Oct 10 11:27:18 1995 Jason Merrill <jason@yorick.cygnus.com> + + * decl.c (start_function): Fix earlier cv-quals change. + +Mon Oct 9 23:53:05 1995 Mike Stump <mrs@cygnus.com> + + * parse.y (complex_direct_notype_declarator): Only push the class if + we are not already in the class. + +Mon Oct 9 11:22:03 1995 Doug Evans <dje@canuck.cygnus.com> + + * decl.c (duplicate_decls): Call merge_machine_decl_attributes. + Update olddecl's attributes too. + (grokdeclarator): #if 0 out call to build_decl_attribute_variant. + * typeck.c (common_type): Call merge_machine_type_attributes. + +Fri Oct 6 14:44:27 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (mark_addressable): Add missing call to + assemble_external. + +Wed Oct 4 15:06:39 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (store_parm_decls): Make sure the unwinder start comes + before the exception specification start. + * except.c (expand_exception_blocks): Make sure the unwinder end + comes after the terminate protected catch clause region and after + the end of the exception specification region. + +Wed Oct 4 12:47:02 1995 Jason Merrill <jason@yorick.cygnus.com> + + * lex.c (real_yylex): Fix identifier case for linemode. + (handle_sysv_pragma): Don't abort when we see a pragma we don't + recognize. + +Tue Oct 3 14:09:46 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (store_parm_decls): Add a call to start_eh_unwinder. + * except.c (init_exception_processing): __throw doesn't take any + arguments. + (expand_builtin_throw): Likewise. Always use Pmode, instead of SImode + for all pointers. Use expand_builtin_return_addr to unwind the + first level off the stack. + (do_unwind): Always use Pmode, instead of SImode for all pointers. + (expand_exception_blocks): Add a call to end_eh_unwinder. + (start_eh_unwinder, end_eh_unwinder): New routines to build machine + independent stack unwinders for function/method calls. + +Mon Oct 2 17:20:42 1995 Mike Stump <mrs@cygnus.com> + + * tree.c (unsave_expr_now): Make sure we process the argument list + of any called functions. Fixes incorrect code generation for + cleanups. + +Mon Oct 2 13:04:16 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (get_member_function_from_ptrfunc): Save function if it + needs it. Cures core dump on things like (this->*(f()))(). + +Sat Sep 23 22:51:25 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_function): Conform to gcc cv-quals convention (no + expression has a cv-qualified type) in RESULT_DECLs. + * method.c (make_thunk): Likewise. + +Fri Sep 22 10:21:13 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (pushtag): Add in the namespace name for the tag. + +Thu Sep 21 13:11:13 1995 Mike Stump <mrs@cygnus.com> + + * parse.y (maybe_base_class_list, base_class_list, base_class, + base_class_access_list): Make sure we see the typenames for base + classes. + * lex.c (see_typename): Instead of failing to see a typename when + there is no next token, perfer a typename, and get the next token. + +Wed Sep 20 12:35:27 1995 Michael Meissner <meissner@cygnus.com> + + * decl.c (init_decl_processing): Add __builtin_expect. + +Tue Sep 19 16:48:11 1995 Mike Stump <mrs@cygnus.com> + + * cvt.c (cp_convert_to_pointer): Don't allow leftover conversions to + or from pointer to member functions, they must all be handled before + this point. + +Fri Sep 15 17:14:47 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (resolve_offset_ref): Fix wording of non-static member + being referenced as a static. + +Fri Sep 15 12:39:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_indirect_ref): Only bash pointer if we actually + call build_expr_type_conversion. + +Thu Sep 14 18:24:56 1995 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_expr_type_conversion): Handle conversion from + reference. + * typeck.c (build_indirect_ref): Avoid infinite recursion. + +Thu Sep 14 17:23:28 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (expand_start_early_try_stmts): New routine to start a try + block at the start of the function, for function-try-blocks. + * cp-tree.h (expand_start_early_try_stmts): Declare it. + * parse.y (function_try_block): Use it, instead of doing it here, as + we don't want to include rtl.h here, as that conflicts with RETURN + in the parser. + +Wed Sep 13 18:32:24 1995 Mike Stump <mrs@cygnus.com> + + * lex.c (reinit_parse_for_block): Support saving inline + function-try-blocks, uses peekyylex. + * parse.y (eat_saved_input): New rule, permit the parser to see that + END_OF_SAVED_INPUT is ok, as it can see this when parsing the + handlers of a function-try-block. + (fndef): Use it. + (component_decl): Make sure TRY and RETURN can come after fn.def2. + * spew.c (peekyylex): New routine to peek at what will come next. + +Wed Sep 13 16:52:06 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (comptypes): Tighten up comparisons of template type + parms. + + * decl.c (duplicate_decls): Turn off whining about virtual functions + redeclared inline for now. + +Wed Sep 13 11:13:40 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (store_in_parms): New routine to put things before we + put base inits. + * cp-tree.h (store_in_parms): Declare it. + * decl.c (store_parm_decls): Use it to makr sure the starting of the + eh spec comes before base inits. + (finish_function): Use sequences instead of the obsolete + reorder_insns. + * parse.y (fndef): Enhance readability and maintainability. Update + to include function_try_block syntax. + (function_try_block): Add. + +Tue Sep 12 17:43:07 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * call.c (convert_harshness): Use comptypes, not ==, to check if + TYPE and PARMTYPE are equivalent on a function type. + +Tue Sep 12 17:31:33 1995 Douglas Rupp <drupp@cs.washington.edu> + + * Make-lang.in (cc1plus) : Removed unnecessary $(exeext). + +Mon Sep 11 23:24:07 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Never allocate storage for thrown pointer + to objects. + +Mon Sep 11 19:36:45 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_catch_block): Pointers to objects come + back from catch matching already dereferenced, don't dereference + again. + +Mon Sep 11 15:46:28 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Only decay the throw expression, don't do + any default conversions. This is so that one can throw and catch + characters, and not have them match integers. + +Mon Sep 11 13:46:45 1995 Mike Stump <mrs@cygnus.com> + + * error.c (dump_aggr_type): Deal with anonymous unions that don't + have a TYPE_NAME. + +Fri Sep 8 20:40:27 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * lex.c (handle_sysv_pragma): Deal with getting a comma from yylex. + +Fri Sep 8 15:51:41 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_end_eh_spec): Handle empty EH specifications. + +Fri Sep 8 15:27:22 1995 Mike Stump <mrs@cygnus.com> + + * cp-tree.h (expand_start_eh_spec): Declare new routine. + (expand_end_eh_spec): Likewise. + * decl.c (store_parm_decls): Call expand_start_eh_spec to process + exception specifications. + * except.c (expand_leftover_cleanups): Remove unused parameter. + (expand_end_catch_block): Likewise. + (expand_exception_blocks): Likewise. + (expand_start_eh_spec): New routine to mark the start of an + exception specification region. + (expand_end_eh_spec): New routine to mark the end of an exception + specification region. + (expand_exception_blocks): Call expand_end_eh_spec to process + exception specifications. + +Fri Sep 8 14:40:48 1995 Per Bothner <bothner@kalessin.cygnus.com> + + * lex.c (do_identifier): Use global binding in preference of + dead for local variable. + +Wed Sep 6 19:32:59 1995 Mike Stump <mrs@cygnus.com> + + * cp-tree.h (build_exception_variant): Remove used first argument. + * decl.c (duplicate_decls): Likewise. + (grokfndecl): Likewise. + (revert_static_member_fn): Likewise. + * decl2.c (grok_method_quals): Likewise. + * tree.c (build_exception_variant): Likewise. + * typeck.c (common_type): Likewise. + * decl2.c (grokclassfn): After changing the type, call + build_exception_variant, if necessary. + +Tue Sep 5 15:56:27 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Run cleanups for the throw expression. + +Wed Aug 30 15:24:38 1995 Stephen L. Favor <sfavor@tigger.intecom.com> + + * except.c (expand_builtin_throw): Moved gen_label_rtx calls beyond + the store_parm_decls call which does initialization in the emit_* + code concerning label numbering. + +Thu Aug 31 09:01:07 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_internal_throw): Let the frontend be responsible + for managing all frontend EH parameters, the backend routine only + needs to deal with backend values. type and value are no longer + passed to __throw. + (init_exception_processing): Likewise. + (expand_start_all_catch): Likewise. + (expand_end_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + +Tue Aug 29 15:04:36 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cp-tree.h (DECL_REAL_CONTEXT): Give the real declaration context + for a decl. + * decl.c (cp_finish_decl): Use it. + +Tue Aug 29 10:30:27 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_internal_throw): Oops, almost forgot type and + value are now trees. + +Mon Aug 28 17:57:45 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + Fix the attribute handling to make sure they get noted before we + create the function's RTL, in case they can affect that. + * decl.c (grokfndecl): New arg ATTRLIST. Run + cplus_decl_attributes before creating the decl's rtl. + (grokdeclarator): New arg ATTRLIST, passed down into grokfndecl. + (shadow_tag, groktypename, start_decl, start_method): Pass a + NULL_TREE to grokdeclarator's new last arg. + * decl2.c (grokfield): New arg ATTRLIST, passed into grokdeclarator. + (grokbitfield, grokoptypename): Pass a NULL_TREE to + grokdeclarator's new last arg. + * except.c (expand_start_catch_block): Likewise. + * pt.c (process_template_parm, end_template_decl, + do_function_instantiation): Likewise. + * cp-tree.h (grokfield): Add arg. + (grokdeclarator): Move the prototype from here... + * decl.h: ...to here. + * lex.c (cons_up_default_function): Pass NULL_TREE to grokfield + ATTRLIST argument. + * parse.y: Create a list for the grokfield arg where appropriate, + and pass it down instead of calling cplus_decl_attributes. + +Mon Aug 28 15:07:24 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Always allow turning on exception handling. Allow cross + compilations to use EH. + +Thu Aug 24 17:39:24 1995 Mike Stump <mrs@cygnus.com> + + * except.c (saved_pc, saved_throw_type, saved_throw_value): Use + trees, instead of rtxs, and don't depend on using special machine + dependent registers. + (expand_internal_throw): Likewise. + (init_exception_processing): Likewise. + (expand_start_all_catch): Likewise. + (expand_end_all_catch): Likewise. + (expand_start_catch_block): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + +Wed Aug 23 17:25:51 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (build_expr_type_conversion): Handle conversions to + reference types. + +Wed Aug 23 15:33:59 1995 Mike Stump <mrs@cygnus.com> + + * except.c (do_unwind): Work around backend bug with -fpic. + +Tue Aug 22 17:20:07 1995 Per Bothner <bothner@kalessin.cygnus.com> + + * decl2.c (flag_new_for_scope): Add a new mode that follows ANSI + for-scoping, but supports (and warns about) old programs. + Make the new mode (with value 1) the default. + (lang_f_options): The on-value for flag_new_for_scope is now 2. + * cp-tree.h (DECL_DEAD_FOR_LOCAL, DECL_ERROR_REPORTED): New macros + (DECL_SHADOWED_FOR_VAR): Likewise. + * decl.c (struct binding_level): New fields dead_vars_from_for + and is_for_scope. + (note_level_for_for): New function. + (poplevel): Special processing if is_for_scope. + (pushdecl): Warn if for-scope variable shadows local. + * lex.c (do_identifier): Handle old (non-ANSI) for scoping, + and warn if conflicts. + * parse.y (FOR): Call note_level_for_for. + +Mon Aug 21 10:28:31 1995 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (import_export_inline): Class interface hackery does not + apply to synthesized methods. + +Sun Aug 20 16:29:00 1995 Mike Stump <mrs@cygnus.com> + + * search.c (virtual_context): Find the right context more often. + Solves a `recoverable compiler error, fixups for virtual function' + problem. + +Sun Aug 20 13:53:24 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_all_catch): Ensure that we always transfer + control to the right EH handler, by rethrowing the end label on the + region, instead of hoping we are nested and falling through. + (expand_leftover_cleanups): Likewise. + (end_protect): Since we now rethrow the end label, put a + nop after it, so that outer regions are recognized. + * init.c (build_vec_delete_1): New routine to handle most of vector + deleting, all code moved here from build_vec_delete. + (build_array_eh_cleanup): Use build_vec_delete_1 to do all the real + work. + (expand_vec_init): If the array needs partial destructing, setup an + EH region to handle it. + (build_vec_delete): Move lots of code to build_vec_delete_1, use + build_vec_delete_1 to do the grunt work. + +Sat Aug 19 14:25:33 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + Handle decl attributes properly for function definitions without + previous attribute-loaded declarations. + * decl.c (start_function): New arg ATTRS. Add a call to + cplus_decl_attributes with it before we create the RTL. + * cp-tree.h (start_function): Update prototype. + * parse.y (fn.def1): Pass ATTRS into start_function instead of + trying to call cplus_decl_attributes too late. Pass a NULL_TREE + for other use. + * decl2.c (finish_file): Pass NULL_TREE as fourth arg to + start_function. + * method.c (synthesize_method): Likewise. + * except.c (expand_builtin_throw): Likewise for start on __throw. + +Sat Aug 19 13:36:08 1995 Mike Stump <mrs@cygnus.com> + + * class.c (set_rtti_entry): Turn on -fvtable-thunk -frtti support. + This changes -fvtable-thunks vtable layout, so a recompile will be + necessary, if you use -fvtable-thunks. + (get_vtable_entry): Use n, instead of i to be consistent with the + rest of the compiler. + (get_vtable_entry_n): Likewise. + (add_virtual_function): Add a slot for the tdesc, if -fvtable-thunks + are being used. + (finish_struct_1): Likewise. + (skip_rtti_stuff): New routine to collapse similar code from many + different parts of the compiler. I think I got them all. + (modify_one_vtable): Use it. + (fixup_vtable_deltas1): Likewise. + (override_one_vtable): Likewise. + * decl2.c (mark_vtable_entries): Likewise. + * tree.c (debug_binfo): Likewise. + * search.c (expand_upcast_fixups): Likewise. + (get_abstract_virtuals_1): Likewise. Use virtuals, instead of tmp to + consistent with the rest of the compiler. + (get_abstract_virtuals): Likewise. + * cp-tree.h (skip_rtti_stuff): New routine, declare it. + * gc.c (build_headof): Support -fvtable-thunk and -frtti together. + (build_typeid): Likewise. + (build_classof): Remove old style way of doing rtti. Remove support + for `classof' and `headof'. + * gxx.gperf: Likewise. + * hash.h: Likewise. + * parse.y: Likewise. + +Fri Aug 18 17:31:58 1995 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_function): Clear ctor_label and dtor_label. + + * class.c (finish_struct_1): Fix handling of access decls. + +Tue Aug 15 19:21:54 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_struct): Only do minimal processing here, so it + can be used for class template definitions, as well. + (finish_struct_1): New function with the rest of the code. + +Tue Aug 15 09:46:16 1995 Mike Stump <mrs@cygnus.com> + + * class.c (prepare_fresh_vtable): On second though, always build the + offset (see Aug 10 change), unless -fvtable-thunks is given. It + does this by calling the new routine set_rtti_entry. + (finish_struct): Likewise. + (set_rtti_entry): New routine to update the rtti information at the + start of the vtable. + +Mon Aug 14 12:21:22 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * error.c (dump_decl, case IDENTIFIER_NODE): Only work on a dtor + if it's declared in the C++ language spec. + (dump_function_decl): Likewise. + (dump_function_name): Likewise. + (ident_fndecl): Make sure we got something back from lookup_name. + * decl.c (start_function): Likewise. + +Fri Aug 11 16:52:15 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Don't call build_new when calling a + constructor without an instance. + +Thu Aug 10 20:00:17 1995 Mike Stump <mrs@cygnus.com> + + * class.c (prepare_fresh_vtable): Always build the offset to the + complete object, as it doesn't cost much. This allows dynamic_cast + to void * to work when -frtti isn't given. + (finish_struct): Likewise. + +Thu Aug 10 16:31:28 1995 Mike Stump <mrs@cygnus.com> + + * except.c (build_eh_type): Split out some functionality to new + routine named build_eh_type_type. + (build_eh_type_type): New routine. + (expand_start_catch_block): Use build_eh_type_type, as we never want + the dynamic type of the catch parameter, just the static type. + Fixes core dumps when -frtti is used and one catchs pointers to + classes. + +Thu Aug 10 14:55:29 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_builtin_throw): Since we now use normal calling + conventions for __throw, we have to remove the first layer off the + stack, so that the next context we search for handlers is the outer + context instead of the context that had the call to __throw, if we + don't immediately find the desired context. + +Tue Aug 8 17:44:23 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * tree.c (cp_expand_decl_cleanup): Returns int, not tree. + * cp-tree.h: Update. + + * parse.y (template_type_parm): Add support for `typename'. + +Tue Aug 8 12:06:31 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_internal_throw): New internal routine to throw a + value. + (expand_end_all_catch, expand_leftover_cleanups): All throwers + changed to use `expand_internal_throw' instead of jumping to throw + label. + (expand_end_catch_block, expand_throw): Likewise. + (throw_label): Removed. + (expand_builtin_throw): Changed so that EH parameters are passed by + normal function call conventions. Completes Aug 4th work. + +Fri Aug 4 17:17:08 1995 Mike Stump <mrs@cygnus.com> + + * cp-tree.h (expand_builtin_throw): Declare it. + * decl2.c (finish_file): Call expand_builtin_throw. + * except.c (make_first_label): Remove. + (init_exception_processing): Don't use a LABEL_REF for throw_label, + instead use a SYMBOL_REF, this is so that we don't use LABEL_REFs in + other functions that don't really appear in those functions. This + solves a problem where cc1plus consumed exponential amounts of + memory when -Wall was used. + (expand_end_all_catch, expand_leftover_cleanups, + expand_end_catch_block, expand_throw): Change all uses of + throw_label to match new style. + (do_unwind): Rename parameter to inner_throw_label, as it is now + different from throw_label. Also, assume that our caller will wrap + the passed label with a LABEL_REF, if needed. + (expand_builtin_throw): Make external, change so that the generated + throw is now a real function. + (expand_exception_blocks): Never generate throw code inside another + function. + +Fri Aug 4 12:20:02 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (grokdeclarator): Move checking of mutable const objects + and mutable static objects down, as we might decide during parsing + to unset staticp or constp (for example, when const is part of the + object being pointed to). + +Thu Aug 3 17:13:43 1995 Mike Stump <mrs@cygnus.com> + + * except.c (output_exception_table_entry): Enhance portability to + weird machines. + (emit_exception_table): Likewise. + +Thu Aug 3 16:41:38 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (build_ptrmemfunc): Handle casting of pointer to + non-virtual member functions. + +Wed Aug 2 11:58:25 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_typeid): Strip cv qualifiers so that const T&, T&, T + and const T all match. + +Wed Aug 2 11:25:33 1995 Mike Stump <mrs@cygnus.com> + + * except.c (build_eh_type): Strip cv qualifiers so that const T&, + T&, T and const T all match. + +Tue Aug 1 14:20:16 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Fix up comments, cleanup code and eliminate exceptNode, + exceptStack, exceptstack, push_except_stmts, pop_except_stmts, + new_except_stack, push_last_insn, pop_last_insn, insn_save_node and + InsnSave. Also, numerous speed improvements, and correctness + improvements. Double faulting in all situations should now be + handled correctly. + (expand_start_all_catch): Instead of having many terminate protected + regions, just have one. + (expand_start_catch_block): No longer have to protect + false_label_rtx, as it isn't used for EH region marking. + (expand_end_catch_block): Expand out EH cleanups here by using + expand_leftover_cleanups. + (expand_end_all_catch): Use sequences instead of playing with insn + links directly. + (expand_exception_blocks): Likewise. Also protect all catch clauses + with one terminate region. + +Mon Jul 31 13:24:30 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (report_type_mismatch): Don't talk about an object + parameter for non-methods. + +Sun Jul 30 13:13:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_struct): Catch private and protected members of + anonymous unions here. + * decl2.c (finish_anon_union): And here. + * parse.y: Instead of here. + + * errfn.c (ARGSLIST): Support passing four args. + * error.c (cv_as_string): New function. + (cp_printers): Add it. + * call.c (build_method_call): Report 'const' at end of pseudo-decl. + + * method.c (report_type_mismatch): Deal with a bad_arg of 0. + + * init.c (expand_aggr_init): Handle volatile objects, too. + +Sat Jul 29 13:42:03 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (struct binding_level): Keep list of incomplete decls. + (print_binding_level): Use list_length to count them. + (pushdecl): Build up the list. + (hack_incomplete_structures): Walk it and prune completed decls. + +Fri Jul 28 15:26:44 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (comp_target_types): Don't check const and volatile for + function types. + (comp_ptr_ttypes_real): Likewise. + +Thu Jul 27 15:40:48 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (comp_target_types): Fix. + +Thu Jul 27 15:10:48 1995 Mike Stump <mrs@cygnus.com> + + * cp-tree.h (unsave_expr_now, build_unsave_expr, + cp_expand_decl_cleanup): Declare new routines. + * decl.c (cp_finish_decl, store_parm_decls, + hack_incomplete_structures): Change all cals from + expand_decl_cleanup to cp_expand_decl_cleanup. + * gc.c (protect_value_from_gc): Likewise. + * expr.c (cplus_expand_expr): Handle UNSAVE_EXPRs. + * tree.c (unsave_expr): New routine to build an UNSAVE_EXPR. + (unsave_expr_now): Backend routine used by tree expander. + (cp_expand_decl_cleanup): Wrap second argument in an UNSAVE_EXPR to + work around a limitation in the backend. The backend uses the + cleanups multiple times, on disjoint control flows, so we cannot + pass unsaved SAVE_EXPRs to the backend. + * tree.def (UNSAVE_EXPR): New tree code. + * typeck.c (c_expand_return): Move goto/return code up inside + conditional, as we don't always want to do this, we only want to do + this when we don't otherwise finish with this control flow. + +Thu Jul 27 10:38:43 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (typespec): Only complain about typeof if we're not + getting it from a system header. + +Thu Jul 27 10:26:23 1995 Doug Evans <dje@canuck.cygnus.com> + + Clean up prefix attribute handling. + * parse.y (reserved_declspecs): Link prefix attributes with declspecs. + (declmods): Likewise. + (all rules that reference typed_declspecs and declmods): Call + split_specs_attrs or strip_attrs to separate declspecs and attrs. + (lang_extdef): Delete resetting of prefix_attributes. + (template_def, notype_declarator rule): Use NULL_TREE for + prefix_attributes. + (condition): Use NULL_TREE for prefix_attributes. + (setattrs): Deleted. + (nomods_initdcl0): Set prefix_attributes to NULL_TREE. + (component_decl): Delete resetting of prefix_attributes. + (component_decl_1, notype_components rule): Use NULL_TREE for + prefix_attributes. + (simple_stmt): Delete resetting of prefix_attributes. + +Mon Jul 24 13:37:53 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (convert_harshness): Deal with reference conversions before + others. Actually do array->pointer decay. Call comp_target_types + with pointer types rather than their targets. + + * typeck.c (comp_target_types): Avoid assigning D const * to B *. + +Mon Jul 24 08:54:46 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * pt.c (to_be_restored): Move decl to global scope. + +Sat Jul 22 12:22:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_decl): Put back clearing of DECL_IN_AGGR_P. + +Fri Jul 21 17:09:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grokdeclarator): Downgrade error about 'extern int A::i' + to pedwarn. + + * pt.c (instantiate_template): Also avoid instantiation if the + function has already been declared to be a specialization. + + * decl2.c (check_classfn): Ignore cname argument, and return the + matching function. + + * decl.c (start_decl): Handle declarations of member functions + outside of the class (i.e. specialization declarations). + +Thu Jul 20 10:34:48 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_struct): Don't mess with the type of bitfields. + + * various.c: s/TYPE_POINTER_TO/build_pointer_type/. + +Thu Jul 20 01:43:10 1995 Mike Stump <mrs@cygnus.com> + + * init.c (expand_aggr_init): Assume LOOKUP_ONLYCONVERTING if init + is not a parameter list (TREE_LIST). + (expand_default_init): If LOOKUP_ONLYCONVERTING is set, then set + LOOKUP_NO_CONVERSION so that we don't allow two-level conversions, + but don't set it otherwise. + +Wed Jul 19 20:32:01 1995 Mike Stump <mrs@cygnus.com> + + * init.c (expand_default_init): Don't allow two-level conversions + during construction. + +Wed Jul 19 18:06:37 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_headof): The type of dyncasting to a pointer to cv + void, should be pointer to cv void. + +Wed Jul 19 17:25:43 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_dynamic_cast): Allow casting in const. + +Wed Jul 19 16:34:27 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (build_const_cast): If we are passed error_mark_node, + return it. + +Wed Jul 19 15:24:48 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * class.c (push_nested_class): Make sure TYPE is non-nil. + + * cvt.c (type_promotes_to): Watch for error_mark_node on the + incoming TYPE. + +Wed Jul 19 13:23:12 1995 Gerald Baumgartner <gb@alexander.cs.purdue.edu> + + * cp-tree.h (SIGTABLE_VT_OFF_NAME): Renamed from SIGTABLE_OFFSET_NAME. + (SIGTABLE_VB_OFF_NAME): New macro. + (vt_off_identifier): Renamed from offset_identifier. + (vb_off_identifier): Added extern declaration. + + * decl.c (vt_off_identifier): Renamed from offset identifier. + (vb_off_identifier): New variable to hold the identifier for the + sigtable field vb_off. + (init_decl_processing): Initialize vb_off_identifier. + Renamed vt_off_identifier from offset_identifier. + * sig.c (build_signature_method_call): Renamed offset_identifier and + local variable offset to vt_off_identifer and vt_off, respecitively. + * sig.c (build_signature_table_constructor): Renamed offset to vt_off. + + * decl.c (init_decl_processing): Add vb_off field to + sigtable_entry_type. Reorder fields so that pfn gets properly + aligned at a 64 bit boundary on the Alpha. + * sig.c (build_signature_table_constructor): Build the constructor + according to the new layout. Set the vb_off field to -1 for now. + + * decl.c (init_decl_processing): Align sigtable_entry_type on word + boundaries instead of double word boundaries to save space. + +Tue Jul 18 16:58:37 1995 Mike Stump <mrs@cygnus.com> + + * cvt.c (cp_convert): Always call build_cplus_new for a ctor. + +Tue Jul 18 14:24:53 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (opt.component_decl_list): Only forbid private/protected + in anonymous unions. We need to make this know when the type is + defined for an object, to not give the error. + +Mon Jul 17 14:22:44 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (opt.component_decl_list): Don't allow access control + as private or protected for union members. + +Sun Jul 16 14:01:00 1995 Jim Wilson <wilson@chestnut.cygnus.com> + + * lex.c (check_newline): For 'p' case, move goto skipline line to + before end brace for 'pragma'. + +Fri Jul 7 13:55:58 1995 Mike Stump <mrs@cygnus.com> + + * g++.1: Tiny updates. + +Fri Jul 7 13:05:20 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (cp_finish_decl): Only destruct local static variables if + they are constructed, and only construct the first time control + passes completely through its declaration (if not initialized with a + constant-expression). + (expand_static_init): Likewise. + +Wed Jul 5 14:05:04 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * typeck.c (comptypes, case OFFSET_REF): If either offset basetype + is a TEMPLATE_TYPE_PARM, give a match. + +Fri Jun 30 15:42:57 1995 Mike Stump <mrs@cygnus.com> + + * method.c (build_overload_value): Handle encoding of null pointer + constants (or any pointer with a constant numeric value) for + templates. + +Fri Jun 30 13:45:51 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * call.c (convert_harshness): Add QUAL_CODE when we're faced with + const vs non-const for void conversions. + +Fri Jun 30 10:19:52 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_all_catch): Fix problem with finding an + outer nested try block when there is no code to separate it from an + inner try block. + +Fri Jun 30 02:22:26 1995 Mike Stump <mrs@cygnus.com> + + * search.c (dfs_pushdecls): Consume 2 or 3 orders of magnitude less + memory please when virtual bases are used. + +Thu Jun 29 19:03:47 1995 Mike Stump <mrs@cygnus.com> + + * class.c (build_vbase_path): Avoid testing things that cannot be + null to see if they are null. + * cvt.c (convert_pointer_to_vbase): Remove code that doesn't work. + * decl.c (finish_function): Pass a type into the new + convert_pointer_to_vbase instead of a binfo. + * search.c (convert_pointer_to_vbase): Rewritten to use get_vbase + and convert_pointer_to_real. + (expand_indirect_vtbls_init): Use convert_pointer_to_vbase instead + of the more cryptic call to get_vbase. + +Thu Jun 29 09:35:05 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (BOOL_TYPE_SIZE): Fix broken SLOW_BYTE_ACCESS check. + +Thu Jun 29 03:43:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (instantiate_template): Don't strip 'this' twice. + + * pt.c (coerce_template_parms): Allow null pointer constants. + + * decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is + set. + +Wed Jun 28 18:39:03 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (revert_static_member_fn): Also remove 'this' from + DECL_ARGUMENTS. + * decl2.c (check_classfn): Don't revert this function until we get a + match. + +Wed Jun 28 14:07:27 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (component_decl): Clear PREFIX_ATTRIBUTES here. + +Wed Jun 28 11:05:13 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_file): Handle global vector news. + * init.c (build_new): Encode vector news so that later we will know + how many elements there are. + +Mon Jun 26 13:38:06 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * expr.c (cplus_expand_expr): Don't mess with temp slots. + + * decl2.c (warn_if_unknown_interface): Don't crash if tinst_for_decl + returns null. + + * decl2.c (check_classfn): Use revert_static_member_fn. + * decl.c (revert_static_member_fn): Diagnose static member functions + declared const or volatile. + + * decl2.c (grokfield): Check for missing default args here, too. + (check_default_args): Function to do the checking. + * decl.c (pushdecl): Use it. + + * decl.c (pushdecl): Don't warn about shadowing a member of `this' + if there is no `this'. + +Sun Jun 25 11:34:25 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Downgrade 'called before definition' + to a warning, as it ought to go away after Monterey. + +Sat Jun 24 14:18:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (coerce_template_parms): Don't do extra checking on pointer + to member arguments. + + * class.c (finish_struct): const and reference members don't prevent + a class from being an aggregate. + + * class.c (finish_struct): Signatures are always aggregates. + +Fri Jun 23 17:20:29 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (check_classfn): Improve error message. + + * pt.c (tsubst): Handle PROMOTE_PROTOTYPES. + +Thu Jun 22 01:50:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (comptypes): Don't ignore method quals. + + * class.c (finish_struct): Non-abstract virtuals are always USED. + + * decl.c (build_ptrmemfunc_type): The underlying union type isn't + IS_AGGR_TYPE, either. + * class.c (finish_struct): Use CLASSTYPE_NON_AGGREGATE instead. + * cp-tree.h: Likewise. + + * cp-tree.h (lang_type): Add aggregate. + (CLASSTYPE_AGGREGATE): New macro. + (TYPE_NON_AGGREGATE_CLASS): Likewise. + * class.c (finish_struct): Determine whether a class is an + aggregate. + * decl.c (cp_finish_decl): Check TYPE_NON_AGGREGATE_CLASS instead of + TYPE_NEEDS_CONSTRUCTING. + * typeck2.c (digest_init): Check TYPE_NON_AGGREGATE_CLASS for + subobjects, too. + + * pt.c (tsubst, PARM_TYPE): Propagate DECL_ARTIFICIAL. + + * decl.c (start_function): For pre-parsed functions, layout all of + the parm decls again. + (grokvardecl): TREE_PUBLIC depends on DECL_THIS_EXTERN, not + DECL_EXTERNAL. + + * pt.c (coerce_template_parms): Improve checking for invalid + template parms. + +Wed Jun 21 12:01:16 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Forbid declaration of a static member + with the same name as its enclosing class. + +Mon Jun 19 10:28:14 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_function): Clear current_class_decl. + + * typeck.c (build_conditional_expr): Use convert (boolean_type_node + instead of truthvalue_conversion. + + * class.c (finish_struct): A data member with the same name as the + class doesn't suppress constructors. + +Fri Jun 16 18:11:39 1995 Gerald Baumgartner <gb@alexander.cs.purdue.edu> + + * decl.c (start_function): If current_class_decl is a signature + pointer, don't dereference it but set C_C_D to current_class_decl. + +Fri Jun 16 17:06:28 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (duplicate_decls): Complain about virtual functions + redeclared to be inline. + +Fri Jun 16 13:20:38 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (get_unique_name): New routine to name unnamed namespaces. + (push_namespace): Use get_unique_name for naming unnamed namespaces. + +Thu Jun 15 15:00:41 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y: Call cplus_decl_attributes with prefix_attributes where + appropriate. + +Wed Jun 14 19:24:49 1995 Mike Stump <mrs@cygnus.com> + + * search.c (get_vbase): New routine to switch hierarchies from the + CLASSTYPE_VBASECLASSES to the normal one. + (expand_indirect_vtbls_init): Use get_vbase to figure out how we + want to convert to a vbase pointer. + +Mon Jun 12 17:50:30 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (instantiate_class_template): Add the new instantiation to + template_classes. + (do_pending_expansions): Call instantiate_member_templates on all of + the classes in template_classes. + +Mon Jun 12 12:36:59 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (complete_array_type): Fill in the TYPE_DOMAIN of our + TYPE_MAIN_VARIANT if it is not filled in. + * init.c (build_delete): If the TYPE_DOMAIN is not set, give an + error instead of core dumping. + +Mon Jun 12 10:41:40 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (can_convert): Also check for distance > 0. + (can_convert_arg): Likewise. + (user_harshness): Likewise. + +Fri Jun 9 19:17:21 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * g++.c (MATH_LIBRARY): Provide default. + (main): Always link with the math library if we link with libstdc++. + + * decl.c (start_function): Complain about redefinition of a function + even when the pending_inline version is compiled after the other + version. + +Thu Jun 8 15:44:38 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * gc.c (build_dynamic_cast): Build up a reference to a parameter of + aggregate type. + +Wed Jun 7 15:31:57 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (build_vec_delete): Resolve an offset ref before we try to + use it. + +Wed Jun 7 14:19:32 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): If the class lacks a constructor or + assignment operator, return error_mark_node. + (common_type): Use build_cplus_array_type. + +Tue Jun 6 09:41:27 1995 Mike Stump <mrs@cygnus.com> + + * class.c (dont_allow_type_definitions): New variable set when types + cannot be defined. + (finish_struct): Use it. + * cp-tree.h (dont_allow_type_definitions): Define it. + * parse.y (primary, handler_seq): Set it. + +Mon Jun 5 18:49:38 1995 Mike Stump <mrs@cygnus.com> + + * method.c (build_opfncall): Use DECL_CHAIN, not TREE_CHAIN for + results from lookup_fnfields. Always give warning/error on bad + code. + +Mon Jun 5 11:39:37 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (member_init_ok_or_else): Don't allow initialization of + an ancestor's member from within a constructor. + +Mon Jun 5 11:20:34 1995 Gerald Baumgartner <gb@alexander.cs.purdue.edu> + + * sig.c (build_signature_table_constructor): Use DECL_CONTEXT + instead of DECL_CLASS_CONTEXT for calculating the vfield offset so + abstract virtual functions are handled correctly. + + * sig.c (build_signature_table_constructor): Store the correct + delta in signature table entries. It does not yet work for + classes with virtual base classes as implementations of signatures. + (build_signature_method_call): Add the delta to the object_ptr + before generating the function call. + + * call.c (build_method_call): Make instance_ptr the signature + pointer itself instead of dereferencing the optr. + * sig.c (build_signature_method_call): Dereference the optr for the + direct and virtual calls. + + * sig.c (build_signature_table_constructor): Make the tag for + default implementations -1 instead of 2. + (build_signature_method_call): Change the generated conditional + expression correspondingly. + + * sig.c (build_signature_pointer_constructor): Deleted the sorry + message that said we can't handle multiple inheritance for + implementations of signatures + (build_signature_method_call): Use the offset from the sigtable + entry instead of the vptr field from the signature pointer for + building a virtual function call. + + * class.c (build_vfn_ref): Deleted signature specific code, we don't + call this function anymore from build_signature_method_call. + + * cp-tree.h (SIGNATURE_VPTR_NAME): Deleted. We use the right vptr + field in the object now instead of in the signature pointer/ref. + (build_vptr_ref): Deleted extern declaration. + * sig.c (build_vptr_ref): Deleted. + (build_signature_pointer_or_reference_type): Deleted construction of + the vptr field. + (build_signature_pointer_constructor): Deleted initialization of/ + assignment to the vptr field. + + * sig.c (build_signature_table_constructor): Convert the signature + table entry fields to their correct types. + + * sig.c (build_signature_table_constructor): Don't call digest_init + for the fields of a sigtable entry, it's wasted time. + + * sig.c (build_signature_table_constructor): Correctly set the + offset and index fields of a sigtable entry. Build the constructor + the way digest_init does, digest_init can't handle initializing an + anonymous union inside a struct. + (build_signature_method_call): Use the index field instead of the + delta field to get the vtable index. + + * decl.c (init_decl_processing): Fix number of fields for building + sigtable_entry_type. + + * cp-tree.h (tag_identifier, offset_identifier): Added extern decls. + (SIGTABLE_CODE_NAME): Renamed to SIGTABLE_TAG_NAME. + (SIGTABLE_PFN_NAME): Deleted, we'll use VTABLE_PFN_NAME instead. + * decl.c (tag_identifier, offset_identifier): New variables to + hold the identifiers for the sigtable fields tag and offset. + (init_decl_processing): Initialize these variables. + (init_decl_processing): Use these variables to build the + sigtable_entry_type structure. Rename the code and offset fields + to tag and delta, respectively; add offset and index fields. Changed + types of fields from short_integer_type_node to delta_type_node. + * sig.c (build_signature_table_constructor): Rename code and offset + to tag and delta, respectively. + (build_signature_method_call): Likewise. Use above variables. + +Thu Jun 1 17:03:51 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (lookup_name_real): Don't try to look anything up in an + erroneous object. + +Fri Jun 2 10:30:14 1995 Mike Stump <mrs@cygnus.com> + + * method.c (build_overload_int): New routine. Break out + functionality from build_overload_value so we can reuse it. + (build_overload_value): Handle pointer to member functions as value + parameters for templates. + (build_overload_identifier): Since template parameters are shared + among all instantiations, we have to substitute in the real types + in TREE_TYPE (parm). + pt.c (coerce_template_parms): Likewise. + (push_template_decls): Likewise. + (grok_template_type): Deleted as template parameters are shared + among all instantiations. + +Wed May 31 19:10:32 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (grokdeclarator): Always give errors on constant overflow + for array indices. + +Wed May 31 11:39:43 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (commonparms): Don't abort if simple_cst_equal returns < 0. + (build_c_cast): Don't tack on a NON_LVALUE_EXPR when casting to + reference type. + (build_indirect_ref): Fix check for *&. + +Fri Jun 16 06:54:03 1995 Mike Stump <mrs@cygnus.com> + + * Version 2.7.0 released. + +Fri Jun 16 15:07:29 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Make-lang.in (DEMANGLER_PROG): Add LIBS. + +Thu Jun 15 15:00:41 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (define_function): Don't set DECL_INTERFACE_KNOWN. + +Wed Jun 7 20:00:31 1995 Mike Stump <mrs@cygnus.com> + + * *.[chy]: Change all callers of finish_decl to cp_finish_decl. + * decl.c (finish_decl): New routine to handle call backs from the + mid end (declare_hidden_char_array). + +Wed Jun 7 19:02:50 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_function): Handle setting C_C_D here. + (set_C_C_D): Removed. + (struct saved_scope): Remove class_decl. + (push_to_top_level): Don't save current_class_decl. + (pop_from_top_level): Don't restore current_class_decl or C_C_D. + (struct cp_function): Add C_C_D. + (push_cp_function_context): Save C_C_D. + (pop_cp_function_context): Restore C_C_D. + +Fri Jun 2 11:05:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (set_C_C_D): New function. suspend_momentary before + building C_C_D. + (pop_from_top_level): Call it. + (start_function): Likewise. + (pop_cp_function_context): Likewise. + + * class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references + to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR. + + * decl.c (push_cp_function_context): Save current_class_decl. + (pop_cp_function_context): Restore current_class_decl and set C_C_D. + (pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D. + (start_function): Likewise. + + * class.c (popclass): Don't mess with current_class_decl, + current_vtable_decl, or C_C_D. + +Mon May 29 12:45:10 1995 Paul Eggert <eggert@twinsun.com> + + * Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG). + +Wed May 24 15:55:18 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * decl.c (duplicate_decls): Check simple_cst_equal result against 0. + * decl2.c (finish_anon_union): Likewise. + * method.c (largest_union_member): Likewise. + +Wed May 24 14:41:11 1995 H.J. Lu <hjl@nynexst.com> + + * Make-lang.in (cxxmain.o): Replace single quotes with backslashes. + +Mon May 22 17:38:48 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Make-lang.in (g++, g++-cross, cc1plus, DEMANGLER_PROG): + Use $@ instead of output name so works even if have .exe. + (cxxmain.o): Use cp if ln -s fails. + (c++.install-man): Use $(exeext) in executable names. + (c++.mostlyclean, stage[1-4]): Use $(objext) in object file names. + * Makefile.in (../cc1plus): Use $(exeext) in name of executable. + +Wed May 24 01:39:03 1995 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): parms can be null, duh. + +Tue May 23 01:32:09 1995 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): If convert_arguments failed, just bail. + +Fri May 19 10:31:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (convert_force): Pass LOOKUP_NORMAL to cp_convert. + + * tree.c (copy_to_permanent): Oops. + +Fri May 19 10:01:07 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-tree.h (break_out_target_exprs): Add decl. + +Thu May 18 13:02:30 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_function): Move *all* interface handling stuff after + the pushdecl. + + * tree.c (mapcar): Renamed from make_deep_copy and generalized. + (perm_manip): Return t if permanent, otherwise 0. + (copy_to_permanent): Use them. + (bot_manip): Helper for break_out_target_exprs. + (break_out_target_exprs): New function. Uses mapcar. + + * typeck.c (convert_arguments): Use it. + + * method.c (hack_identifier): Use convert_from_reference to + dereference a reference. + +Wed May 17 17:54:54 1995 Mike Stump <mrs@cygnus.com> + + * call.c (convert_harshness): Move reference bashing before pointer + to member bashing. + +Wed May 17 16:57:53 1995 Mike Stump <mrs@cygnus.com> + + * cvt.c (convert_to_reference): Only complain, if complaints are + wanted. + * typeck.c (build_function_call_real): Likewise. If + LOOKUP_SPECULATIVELY is set and something won't work, return + NULL_TREE. + * cvt.c (cp_convert): Likewise. Pass flags down to build_method_call. + (convert): Pass LOOKUP_NORMAL to cp_convert. + * typeck.c (convert_for_assignment): Likewise. + (convert_force): Pass LOOKUP_COMPLAIN to cp_convert. + (convert_arguments): Get out early if we get an error_mark_node. + (convert_for_initialization): Use cp_convert instead of convert so + that we can pass flags down. + * cp-tree.h (LOOKUP_SPECULATIVELY): Added documentation. + +Wed May 17 01:43:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck2.c (store_init_value): Don't take the MAIN_VARIANT of the + decl type. + + * class.c (finish_struct): Don't complain about a class with no + user-defined constructors but with a member that has no default + constructor, as this is OK for aggregates. + + * expr.c (cplus_expand_expr, NEW_EXPR): If this is an explicit + constructor call, mark slot addressable. + +Tue May 16 18:37:51 1995 Douglas Rupp <drupp@cs.washington.edu> + + * g++.c: Changed WINNT to _WIN32. + +Tue May 16 12:40:16 1995 Jason Merrill <jason@lisa.cygnus.com> + + * lex.c (handle_sysv_pragma): Don't use token_buffer. + +Tue May 16 12:05:26 1995 Mike Stump <mrs@cygnus.com> + + * call.c (resolve_scope_to_name): Add initial semantic support for + namespaces. + * class.c (finish_struct): Likewise. + * cp-tree.h (NAMESPACE_LEVEL): Likewise. + * cvt.c (build_up_reference, convert_to_reference): Likewise. + * decl.c (binding_level::namespace_p, suspend_binding_level): Likewise. + (resume_binding_level, toplevel_bindings_p): Likewise + (namespace_bindings_p, declare_namespace_level): Likewise. + (resume_level, push_namespace, pop_namespace): Likewise. + (pop_everything, pushtag, duplicate_decls, pushdecl): Likewise. + (implicitly_declare, lookup_namespace_name): Likewise. + (lookup_name_real, start_decl, make_temporary_for_reference): Likewise. + (obscure_complex_init, finish_decl, expand_static_init): Likewise. + (grokvardecl, grokdeclarator, parmlist_is_exprlist): Likewise. + (store_parm_decls, hack_incomplete_structures): Likewise. + * decl2.c (get_temp_name, finish_anon_union): Likewise. + (current_namespace, push_namespace, pop_namespace): Likewise. + (do_namespace_alias, do_toplevel_using_decl): Likewise. + (do_class_using_decl): Likewise. + * error.c (dump_decl): Likewise. + * init.c (build_member_call, build_offset_ref): Likewise. + * lex.c (identifier_type): Likewise. + * parse.y (lang_extdef, using_decl, extdef): Likewise. + (component_decl_1, nested_name_specifier_1): Likewise. + * spew.c (yylex): Likewise. + * tree.def (NAMESPACE_DECL): Likewise. + +Tue May 16 11:55:35 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (push_overloaded_decl): Return the new decl even if it + can't be pushed. + +Tue May 16 11:00:37 1995 Jason Merrill <jason@lisa.cygnus.com> + + * typeck.c (decay_conversion): Split out from default_conversion. + (default_conversion): Call it. + (build_binary_op): Likewise. + (build_binary_op_nodefault): Use decay_conversion for truth ops. + +Mon May 15 12:47:56 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (warn_extern_redeclared_static): This is a pedwarn. + (duplicate_decls): Always use the old decl's linkage info. Don't + play with linkage of consts. + (pushdecl): Don't play with linkage of consts. + (redeclaration_error_message): Don't complain about an old public + decl and a new non-public decl here. + (grokvardecl): Handle linkage of consts here. + (grokdeclarator): An 'extern inline' is public. Pass constp to + grokvardecl. + (start_function): Wait until after the pushdecl to do some linkage + stuff. + + * decl2.c (import_export_vtable): Make duplicates weak rather than + static if supported. + (import_export_inline): Likewise. + * pt.c (do_pending_expansions): Likewise. + + * class.c (build_vbase_path): flag_assume_nonnull_objects only + affects reference conversion. + + * init.c (emit_base_init): Build up an RTL_EXPR and add it to + rtl_expr_chain. + * decl.c, decl2.c: s/base_init_insns/base_init_expr/. + +Tue May 16 07:06:28 1995 Paul Eggert <eggert@twinsun.com> + + * method.c (numeric_output_need_bar): Renamed from misspelling. + + * typeck.c (build_ptrmemfunc): Fix misspellings in messages. + +Sun May 14 10:26:22 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * lang-options.h, lang-specs.h: New files. + +Thu May 11 00:31:48 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (default_conversion): Don't check for BLKmode before + pulling out the decl_constant_value. + + * decl.c (start_function): Clear named_labels and shadowed_labels. + + * typeck.c (build_function_call_real): Also synthesize methods here. + +Wed May 10 00:55:59 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_file): Synthesize exported methods before the + reconsider loop. + + * parse.y: Move declaration of flag_new_for_scope to file scope. + +Tue May 9 19:10:33 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c: Add flag_new_for_scope for new -ffor-scope flag. + * parse.y (FOR): Conditionalize the pushing and poping of scope for + the for-init-statement upon the new flag_new_for_scope. + * parse.y (try_block): Simplify and use compstmt. + +Mon May 8 12:41:52 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (define_function): Mark function decl artificial. + +Sun May 7 00:51:28 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (simple_stmt, FOR): Put back push/pop for condition scope. + + * decl2.c (grokclassfn): DECLs don't have cv-qualified types. + * tree.c (build_cplus_method_type): Likewise. + + * cp-tree.h (SET_DECL_ARTIFICIAL): Just set DECL_ARTIFICIAL to 1. + + * typeck.c (build_function_call_real): If convert_arguments failed, + just bail. + (convert_arguments): If one of the arguments is error_mark_node, + just bail. + +Sat May 6 02:39:41 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (duplicate_decls): Don't check DECL_NOT_REALLY_EXTERN for + decls that don't include it. + +Fri May 5 14:23:30 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (duplicate_decls): Decls that have DECL_INTERFACE_KNOWN or + DECL_NOT_REALLY_EXTERN set aren't extern decls. + + * typeck.c (build_indirect_ref): Don't call default_conversion for a + parameter of reference_type. + * cvt.c (convert_from_reference): Just use build_indirect_ref. + + * pt.c (do_type_instantiation): Only instantiate member functions + that actually come from templates. + +Fri May 5 09:46:05 1995 Mike Stump <mrs@cygnus.com> + + * parse.y: Generalized cleanup of poplevels, and compound statements + and compound statements in try blocks. Rewritten `for' rule so that + the scope of variables declared in the for clause is shortened to + span just to the end of the statement, instead of the whole + containing block. + +Fri May 5 00:37:14 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (convert_harshness): Handle pointers to members better. + +Thu May 4 16:00:26 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (delete_sanity): Do access control here. + * init.c (build_delete): Instead of here. + + * Make-lang.in: Build c++filt. + +Wed May 3 02:59:53 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (cplus_decl_attributes): If we just modified a TYPE_DECL, + update our IDENTIFIER_TYPE_VALUE. + +Fri Apr 28 07:58:41 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * lex.c (cons_up_default_function): Fix linkage of #pragma + implemented functions. + +Thu Apr 27 16:56:24 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (build_overload_name): Simplify and fix repeated type + folding. + + * decl.c (grokdeclarator): Prohibit pointers to void or reference + members. + +Thu Apr 27 09:49:07 1995 Mike Stump <mrs@cygnus.com> + + * typeck2.c (process_init_constructor): Make sure initializers are + fully digested. + +Thu Apr 27 01:11:55 1995 Jason Merrill <jason@python.cygnus.com> + + * lex.c (cons_up_default_function): Always defer synthesis. + +Thu Apr 27 00:20:37 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (mark_inline_for_output): Don't play with pending_inline + stuff. + +Wed Apr 26 17:48:24 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (user_harshness): New function; like build_type_conversion, + but doesn't actually build anything. + (compute_conversion_costs): Use it instead of build_type_conversion. + +Wed Apr 26 17:11:25 1995 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_function_call_real): Improve error message for + calling a non-function. + + * method.c (hack_identifier): Lose check for calling a data member. + +Wed Apr 26 16:59:13 1995 Mike Stump <mrs@cygnus.com> + + * typeck2.c (build_functional_cast): Remove very old cruft. + Seems like good code is generated without it. + +Wed Apr 26 00:47:16 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (do_build_assign_ref): Fix handling of anonymous unions. + (do_build_copy_constructor): Likewise. + + * parse.y (simple_stmt, SWITCH): Call {push,pop}_switch. + + * decl.c (push_switch): New function. + (pop_switch): Likewise. + (define_case_label): Check for jumping over initialization. + + * call.c (build_method_call): Check for an inline function being + called before its definition has been seen. + * typeck.c (build_function_call_real): Likewise. + + * decl.c (duplicate_decls): Check for a function being redeclared + inline after its address has been taken. + + * typeck.c (build_conditional_expr): Handle related class lvalues. + +Tue Apr 25 13:20:45 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (do_pending_expansions): Don't expand unused templates. + + * parse.y (component_decl): Accept a lone semicolon. + +Tue Apr 25 00:25:56 1995 Jason Merrill <jason@rtl.cygnus.com> + + * call.c (build_method_call): Don't allow an RTL_EXPR to serve as the + object parameter anymore. + + * expr.c (cplus_expand_expr): Don't create RTL_EXPRs with no insns. + +Mon Apr 24 12:35:48 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (simple_stmt, decl case): Clear prefix_attributes. + (lang_extdef): Likewise. + + * parse.y (maybe_parmlist): New rule for use in declarators where + this could either be a list of expressions or parameters. Calls + suspend_momentary before deciding which. + (direct_after_type_declarator): Use it. + (complex_direct_notype_declarator): Use it. + + * pt.c (tsubst): Propagate attributes const and noreturn. + + * typeck.c (build_modify_expr): If warn_synth, call build_opfncall + before doing the default thing. + +Thu Apr 27 21:49:36 1995 Doug Evans <dje@cygnus.com> + + * typeck.c (common_type): Call lookup_attribute instead of + value_member. + +Tue Apr 25 18:07:43 1995 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * Make-lang.in: Change "realclean" to "maintainer-clean". + +Sun Apr 23 12:32:38 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_file): Fix broken linked list handling. + +Fri Apr 21 18:08:43 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_base_struct): Don't set TYPE_HAS_COMPLEX_*_REF + as often. + (finish_struct): Likewise. + + * various: Use TYPE_HAS_TRIVIAL_* instead of TYPE_HAS_COMPLEX_*. + + * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): New macro. + (TYPE_HAS_TRIVIAL_ASSIGN_REF): New macro. + +Fri Apr 21 15:52:22 1995 Jason Merrill <jason@python.cygnus.com> + + * typeck.c (c_expand_return): Only expand a returned TARGET_EXPR if + it is of the same type as the return value. + +Fri Apr 21 03:01:46 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_file): Reconsider if synthesizing a method wrote + out its assembly. + + * typeck.c (convert_for_initialization): Don't call a trivial copy + constructor. + + * typeck2.c (store_init_value): Only abort if the type has a + non-trivial copy constructor. + + * typeck.c (c_expand_return): If we're returning in a register and + the return value is a TARGET_EXPR, expand it. Only do + expand_aggr_init if we're returning in memory. + (expand_target_expr): Function to expand a TARGET_EXPR. + (build_modify_expr): Use it. + + * tree.c (build_cplus_new): Layout the slot. + + * expr.c (cplus_expand_expr): Use expand_call to expand the call + under a NEW_EXPR, so the target is not discarded. + +Thu Apr 20 14:59:31 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_dynamic_cast): Tighten error checking. + +Thu Apr 20 11:23:54 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * expr.c (cplus_expand_expr): Only abort if the returned target is + different from what we expected if the type has a non-trivial copy + constructor. + + * decl2.c (cplus_decl_attributes): Attributes applied to a template + really apply to the template's result. + + * tree.c (lvalue_p): Check IS_AGGR_TYPE instead of TREE_ADDRESSABLE + to decide whether to consider a CALL_EXPR an lvalue. + + * class.c (finish_struct_bits): Only set TREE_ADDRESSABLE if the + type has a non-trivial copy constructor. + + * decl.c (start_function): If interface_known, unset + DECL_NOT_REALLY_EXTERN on the function. + +Wed Apr 19 16:53:13 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (do_function_instantiation): Handle explicit instantiation of + member functions. + (do_type_instantiation): Handle 'inline template class foo<int>', + meaning just spit out the vtable. + + * lex.c (cons_up_default_function): Set DECL_NOT_REALLY_EXTERN on + the consed functions. + + * decl2.c (import_export_inline): Set DECL_INTERFACE_KNOWN. + +Wed Apr 19 16:28:17 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * call.c, class.c, decl2.c, gc.c, init.c, parse.y, pt.c, search.c, + typeck.c: Include output.h. + +Wed Apr 19 14:57:21 1995 Gerald Baumgartner <gb@alexander.cs.purdue.edu> + + * call.c (build_method_call): Allow a signature member functions to + be called from a default implementation. + +Wed Apr 19 10:21:17 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c (finish_repo): Remember what directory we are in. + + * search.c (expand_upcast_fixups): Don't mess with abort_fndecl. + + * repo.c: Use obstacks instead of fixed-size buffers. Don't spit + out the second copy of the symbol name. Don't remember COLLECT_GCC. + +Wed Apr 19 02:32:40 1995 Mike Stump <mrs@cygnus.com> + + * search.c (virtual_context): New function to get the virtual + context of a function. + (expand_upcast_fixups): New function to generate runtime vtables. + (fixup_virtual_upcast_offsets): Likewise. + (expand_indirect_vtbls_init): Use fixup_virtual_upcast_offsets to + ensure that the this offsets for upcasts from virtual bases into + other virtual bases or non-virtual bases are correct at construction + time and destruction time. + * class.c (fixup_vtable_deltas): Modify to fixup all offsets in all + vtables in all virtual bases, instead of just one vtable in each + virtual base. + (fixup_vtable_deltas1): Likewise. + +Tue Apr 18 03:57:35 1995 Michael Meissner <meissner@cygnus.com> + + * Makefile.in (lex.o): Add dependency on c-pragma.h. + + * lex.c (handle_sysv_pragma): Use NULL_PTR and NULL_TREE as + appropriate, instead of 0. + +Mon Apr 17 12:28:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (pushdecl): Use decls_match, not duplicate_decls, for + comparing local and global decls. + +Fri Apr 14 01:46:52 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (convert_arguments): Only prohibit passing to ... of + types with non-trivial copy constructors. + + * repo.c (repo_template_used): Don't try to mess with no id. + +Fri Apr 14 23:32:50 1995 Per Bothner <bothner@rtl.cygnus.com> + + * decl.c (duplicate_decls): Use cp_warning_at for redundant-decls. + +Thu Apr 13 15:37:42 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-tree.h (current_tinst_level): Delete declaration, since it's + static inside pt.c. + + * typeck.c (build_modify_expr): Catch incompatible array assignment. + + * parse.y (attribute_list, attrib): Rewrite actions to feed the + right stuff to decl_attributes. + +Thu Apr 13 11:24:10 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * search.c (dfs_debug_mark): Check for magic virtual like + import_export_vtable. + + * typeck.c (build_binary_op_nodefault): Don't call cp_pedwarn with + four args. + +Wed Apr 12 12:02:57 1995 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (finish_file): Move prevtable pass before needs_messing_up + decision. + +Tue Apr 11 11:20:27 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_decl): If we're writing out a static data member of + a class, we want the debug info for that class. + + * gc.c (build_t_desc): Check linkage of a class properly. + + * class.c (finish_struct): Set the 'headof' offset for the main + vtable properly. + (prepare_fresh_vtable): Fix typeinfo pointer here. + (modify_one_vtable): Instead of here. + +Mon Apr 10 12:15:59 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c (repo_get_id): New function to return the interesting + identifier for a repo entity. + (repo_template_used): Use it. + (repo_template_instantiated): Mark the id as chosen. + (init_repo): Record whether or not the id was chosen. + (finish_repo): Note if an id was newly chosen. + + * pt.c (do_function_instantiation): Call repo_template_instantiated. + (do_type_instantiation): Likewise. Don't diagnose multiple + instantiation. + + * decl2.c (finish_file): Use DECL_NOT_REALLY_EXTERN when deciding + whether or not to synthesize a method. + + Undo these changes: + * class.c (finish_vtbls): build more vtables if flag_rtti is on. + * class.c (modify_all_direct_vtables): ditto. + * init.c (expand_direct_vtbls_init): expand more vtables if + flag_rtti is on. + +Sat Apr 8 17:45:41 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_headof): Use ptrdiff_type_node instead of + integer_type_node on pointer arithmetic. + +Sat Apr 8 11:57:04 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): Undo previous change. + +Thu Apr 6 01:23:50 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * Makefile.in (compiler): Remove ../cc1plus before rebuilding it. + + * repo.c (get_base_filename): Put the .rpo file in the directory + with the object file, not the source. + + * typeck.c (build_conditional_expr): Handle pmf's better. + + * repo.c (finish_repo): Also use ASM_OUTPUT_LABELREF to print out + the name of the symbol. + +Wed Apr 5 15:24:12 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c (open_repo_file): Make repo filename DOS-compliant. + (*): Also write a new repo file if some previously-used + templates are no longer used. Only remember the identifier. + + * lex.c (cons_up_default_function): If this function belongs to a + template class, call repo_template_used for it. + + * repo.c (repo_template_used): Using a class means using its vtable, + if any. + (finish_repo): Likewise. + + * typeck.c (build_modify_expr): Only wrap TARGET_EXPRs in RTL_EXPRs + if the type has a complex copy constructor. + + * decl2.c (lang_decode_option): -frepo implies + -fno-implicit-templates. + + * decl.c (start_function): Clear current_{base,member}_init_list. + + * lex.c (init_lex): Also unset *_eq if ! flag_operator_names. + +Tue Apr 4 16:11:08 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (struct cp_function): Add {base,member}_init_list. + (push_cp_function_context): Save current_{base,member}_init_list. + (pop_cp_function_context): Restore them. + +Mon Apr 3 16:55:08 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c (get_base_filename): Take filename parm, fix logic bug. + + * typeck.c (build_compound_expr): Do not warn about a compound expr + in which the first expression has no side effects. + (build_x_compound_expr): Warn here instead. + (build_conditional_expr): Don't warn about a conditional expression + between an enum and the type it promotes to. + + * init.c (build_new): Handle initialization of arrays of builtins + properly. + +Mon Apr 3 15:08:04 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * repo.c: Include config.h to get definitions of bcopy and rindex + on systems that don't have them (e.g., SVR4). + +Mon Apr 3 14:41:55 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_table): Pass NULL_TREE instead of init to + finish_decl so that it won't try and do error checking on the + initializer. + +Mon Apr 3 10:45:50 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c (get_base_filename): Analyze COLLECT_GCC_OPTIONS to + determine whether this compile used -c -o. + (open_repo_file): Use get_base_filename. Remove the extension. + (finish_repo): Spit out the values of main_input_filename, + COLLECT_GCC and COLLECT_GCC_OPTIONS. + + * parse.y (structsp): Add TYPENAME_KEYWORD complex_type_name. + +Sun Apr 2 23:43:51 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * search.c (compute_access): Don't try to do access control on + nested types. + +Fri Mar 31 10:14:23 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * repo.c: New file to handle things repo. + + * pt.c (instantiate_template): Call repo_template_used if the + definition is accessible. + (mark_function_instantiated): Split out from + do_function_instantiation. + (mark_class_instantiated): Split out from do_type_instantiation. + + * parse.y (template_instantiate_once): Call repo_template_used. + + * lex.c (lang_init): Call init_repo. + + * decl2.c: Handle flag_use_repository. + (finish_file): Call finish_repo. + + * decl.c (start_method): Call repo_template_used if this is a + template method. + + * Makefile.in (CXX_OBJS): Add repo.o. + (repo.o): Add dependencies. + + * Make-lang.in (CXX_SRCS): Add repo.c. + + * decl.c (start_function): If DECL_INTERFACE_KNOWN and + DECL_NOT_REALLY_EXTERN are both set, unset DECL_EXTERNAL. + + * typeck.c (build_binary_op_nodefault): Identify the invalid operand + types used. + + * decl.c (duplicate_decls): Propagate DECL_NOT_REALLY_EXTERN. + +Thu Mar 30 17:54:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Tidy up use of build_type + and result_type. When checking for comparison between signed + and unsigned, use result_type rather than the (possibly shortened) + type of op0. Also, don't warn about equality comparison of a + signed operand to an unsigned constant that fits in the signed + type. + + * method.c (do_build_copy_constructor): Reverse + current_base_init_list after we've built it up. + +Thu Mar 30 14:35:18 1995 Mike Stump <mrs@cygnus.com> + + * except.c (build_throw): Never warn about the value of throw not + being used. + +Thu Mar 30 13:16:54 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_catch_block): Check for bad catch parameter + declarations. + +Thu Mar 30 13:06:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_function): Only set DECL_NOT_REALLY_EXTERN if + DECL_EXTERNAL is not already set. + +Thu Mar 30 11:26:24 1995 Mike Stump <mrs@cygnus.com> + + * method.c (emit_thunk): Let poplevel know that the last level is + for a function so it can create a BLOCK_NODE and set DECL_INITIAL. + +Thu Mar 30 11:15:06 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (import_export_inline): Don't set DECL_NOT_REALLY_EXTERN + here. + + * decl.c (grokdeclarator): OK, don't abort if we see a decl with + METHOD_TYPE. + (finish_function): Set DECL_EXTERNAL and DECL_NOT_REALLY_EXTERN on + all deferred inlines. + +Wed Mar 29 19:35:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cp-tree.h (DECL_THIS_INLINE): New macro. + (DECL_NOT_REALLY_EXTERN): New macro. + (DECL_THIS_STATIC): New macro. + + * decl.c: Lose all references to current_extern_inline. Break + inline semantics into DECL_INLINE for actual inlining and + DECL_THIS_INLINE for the linkage wierdness. Use DECL_THIS_STATIC. + * decl2.c: Use DECL_NOT_REALLY_EXTERN to indicate that we want to + emit an inline here. Associated changes. + * lex.c: Likewise. + * pt.c: Likewise. + * typeck.c: Likewise. + + * call.c (build_method_call): Don't bother trying to handle inlines + specially. + * cvt.c (convert_to_aggr): Likewise. + + * pt.c (do_function_instantiation): Handle instantiation of + public inlines, too. + +Wed Mar 29 16:04:25 1995 Mike Stump <mrs@cygnus.com> + + * except.c (init_exception_processing): Change the interface for + __throw_type_match and add decl for new rtti matching routine + __throw_type_match_rtti. + (build_eh_type): New routine to build a run time descriptor for the + expression given. + (expand_start_catch_block): Update to use new calling convention for + the matcher. + (expand_throw): Update to use build_eh_type. + +Mon Mar 27 07:14:33 1995 Warner Losh <imp@village.org> + + * g++.c: Removed __NetBSD__ from conditional. + Declare strerror if HAVE_STRERROR is defined; otherwise + declare sys_errlist and sys_nerr. + (my_strerror): New function. + +Tue Mar 28 14:16:35 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * search.c (get_binfo): Don't try to be so clever. + + * tree.c (copy_to_permanent): Also suspend_momentary(). + + * cvt.c (cp_convert_to_pointer): Hand off to convert_fn_pointer even + if the types are the same. + + * decl.c (start_function): Handle extern inlines more like C++ says + we should. + + * init.c (build_member_call): Hand constructor calls off to + build_functional_cast. + + * typeck2.c (build_functional_cast): Use DECL_NESTED_TYPENAME to get + the name of the type. + +Tue Mar 28 13:13:56 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Check for the decl returned by + grokfndecl to be null before using build_decl_attribute_variant. + +Mon Mar 27 18:04:41 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (build_new): Use build_pointer_type instead of + TYPE_POINTER_TO. + +Fri Mar 24 12:11:24 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_conditional_expr): Handle pmfs. + (convert_for_assignment): Fix pmf support. + + * cvt.c (convert_fn_ptr): Support !flag_vtable_thunks. + (cp_convert_to_pointer): Handle pmfs. + (cp_convert): Pass pmfs to cp_convert_to_pointer. + + * typeck.c (common_type): Handle inheritance for pmfs. + + * typeck2.c (build_m_component_ref): Do access control. + + * typeck.c (comp_target_types): Check for conversion to void * + before checking trickier conversions. + + * decl.c (duplicate_decls): Propagate DECL_ABSTRACT_VIRTUAL_P. + + * pt.c (push_tinst_level): Complain if template instantiation depth + is greater than max_tinst_depth. + + * typeck.c (common_type): Assume that we can call common_type to + unify the target type of a pointer. + +Thu Mar 23 00:48:44 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_file): Don't synthesize methods at + finish_vtable_prevardecl time. Do synthesize methods that are not + used, but are public and not external. + + * cvt.c (build_type_conversion): Only give an error if for_sure. + + * typeck.c (comp_target_types): Only support pointer conversions if + nptrs > 0. + +Wed Mar 22 19:30:15 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (build_new): Catch use of an initializer list where it + shouldn't be. + +Wed Mar 22 16:21:07 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_new): Wrap alloc_expr in an RTL_EXPR if nelts is + non-constant. + + * decl2.c: temp_name_counter is now public. + + * decl.c (struct cp_function): Add temp_name_counter field. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + + * typeck.c (common_type): Handle unifying function types, and unify + unmatched things to void* with a compiler_error, rather than + silently like before. + +Wed Mar 22 15:10:34 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_prevtable_vardecl, finish_vtable_vardecl): Revert + Brendan's last change and fix latent problem that causes TD entries + to not come out when the things that need them has yet to be + expanded. + +Wed Mar 22 15:12:00 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op_nodefault, comparison ops): Update type0 + and type1, since we might have changed op0 or op1. + +Wed Mar 22 13:33:45 1995 Jason Merrill <jason@python.cygnus.com> + + * typeck.c (common_type): Don't mess up templates. + +Wed Mar 22 04:56:00 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (common_type): Handle ptms properly. Also handle + T* -> void*. + (build_binary_op_nodefault): New variable build_type controls what + type is given to the expression when it is created. Set this to + boolean_type_node for comparison ops instead of using result_type. + (comp_target_types): Allow T * -> void *. + + * cvt.c (cp_convert_to_pointer): Do access control when converting + ptms, too. + +Tue Mar 21 17:25:06 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (extern_lang_string): Catch use of linkage specs that + aren't all naming the same language. + + * class.c (finish_struct): Delete accidental duplicate code. + +Tue Mar 21 14:00:57 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Disable pedwarns about + comparing functions and incomplete types. + + * decl.c (finish_function): Only unset current_function_decl if + !nested. + (duplicate_decls): Last change went too far; we only want to stop + checking for value/reference ambiguity. + +Tue Mar 21 01:26:39 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (build_generic_desc): Zap the DECL_SIZE so that we can lay it + out fresh, as the new type may be larger. + +Mon Mar 20 19:01:10 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * expr.c (extract_init): Try to expand the RTL for the + initialization and figure out what it will look like so we can avoid + run-time initialization. Disabled for now. + (extract_scalar_init): Helper for scalar initialization. + (extract_aggr_init): Helper for aggregate initialization. + + * decl.c (duplicate_decls): Don't complain about ambiguous + declarations. + (obscure_complex_init): Now returns a tree. Call extract_init if + we're optimizing and this is a toplevel decl. + (finish_decl): Update accordingly. + + * lex.c (check_newline): If we're just changing files (not pushing + or popping), update input_file_stack->name. + +Mon Mar 20 17:55:04 1995 Mike Stump <mrs@cygnus.com> + + * pt.c (type_unification): Only TEMPLATE_DECLs are handled right now + in the transitive unification code. + +Mon Mar 20 16:07:50 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (shadow_tag): Don't allow inline, virtual, or explicit on + non-functions. + (grokdeclarator): Don't allow friends to be defined in local classes. + +Sat Mar 18 04:03:33 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_prevtable_vardecl): Use DECL_DECLARED_STATIC + rather than DECL_SAVED_INSNS to decide whether or not this method + was declared inline. + + * method.c (synthesize_method): Turn off DECL_INLINE if + function_cannot_inline_p thinks we're too large. + + * typeck.c (build_indirect_ref): Use build_expr_type_conversion. + +Fri Mar 17 17:47:36 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (instantiate_type): Handle pmfs. + + * typeck.c (convert_for_assignment): Check types when assigning one + pmf to another. + + * decl.c (define_label): Fix logic for printing out the name of the + label in an error message. + + * error.c (dump_expr): Support ARRAY_REF. + +Fri Mar 17 17:43:02 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl2.c (finish_vtable_vardecl): Call build_t_desc here. + (finish_prevtable_vardecl): Instead of here. + +Fri Mar 17 14:40:45 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (expand_static_init): Also use expand_aggr_init if the + initializer is a TREE_LIST. + (grokdeclarator): Only pedwarn about extra qualification if -pedantic. + + * pt.c (unify): Fix unification of return type. + + * expr.c (fixup_result_decl): Use store_expr, rather than + emit_move_insn, to move the return value into the place where + callers will expect it. + +Thu Mar 16 22:05:25 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_offset_ref): Call assmble_external on functions. + * typeck.c (build_component_ref): Likewise. + +Thu Mar 16 20:28:16 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (struct saved_scope): Add members base_init_list and + member_init_list. + (push_to_top_level): Save current_base_init_list and + current_member_init_list to them. + (pop_from_top_level): Put it back. + +Thu Mar 16 19:21:14 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (instantiate_template): Call assemble_external. + +Thu Mar 16 18:07:54 1995 Brendan Kehoe <brendan@phydeaux.cygnus.com> + + * class.c: Include rtl.h, to get NULL_RTX. + (finish_struct): Also zero out DECL_SAVED_INSNS, to avoid problems + on hosts with different sizes for each part of the union. + * tree.c: Also include rtl.h. + (layout_basetypes): Same change for DECL_SAVED_INSNS. + +Thu Mar 16 13:57:36 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (unify): Fix array domain unification for 64-bit targets. + + * decl2.c (finish_file): Push bizarre type decl before walking the + vtables the first time. + (walk_vtables): OK, don't set prev to vars if the vardecl_fn messed + with TREE_CHAIN (prev). + + * init.c (emit_base_init): Use convert_pointer_to_real instead of + convert_pointer_to when converting to a direct base. + +Wed Mar 15 20:26:29 1995 Mike Stump <mrs@cygnus.com> + + * pt.c (type_unification): Handle transitive unification better. + +Wed Mar 15 13:56:16 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (walk_vtables): Always set prev to vars. + (mark_vtable_entries): Call assemble_external on the vtable entries. + + * class.c (finish_struct): Set the vtable's size to NULL_TREE before + calling layout_decl, so that it gets updated properly. + + Finally re-enable dynamic synthesis. This time it works. + * method.c (synthesize_method): Pass decl_function_context (fndecl) + to {push,pop}_cp_function_context. + * decl.c (push_cp_function_context): Now takes a tree argument. + (pop_cp_function_context): Likewise. + * call.c (build_method_call): Enable synthesis. + * lex.c (cons_up_default_function): Likewise. + +Tue Mar 14 19:14:19 1995 Doug Evans <dje@chestnut.cygnus.com> + + * parse.y (setattrs): Chain onto prefix_attributes rather than + setting it. + +Wed Mar 15 13:00:00 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (pushdecl): Check if the type of the VAR_DECL is an + error_mark_node before trying to read TYPE_LANG_SPECIFIC. + +Mon Mar 13 21:00:28 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator, case ARRAY_REF): Wrap the exp with fold, + and convert the size and integer_one_node to the index type. + +Mon Mar 13 08:01:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (get_member_function_from_ptrfunc): Save the instance + argument, and tack it onto the front of the COND_EXPR to make the + semantics come out right. Grab the instance argument from + '*instance_ptrptr', rather than having it passed in separately. + + * various: Change various consed-up comparison operations to have + boolean type. Remove the instance argument in calls to + get_member_function_from_ptrfunc. + + * error.c (dump_expr): Dump true and false as "true" and "false". + + * decl2.c (finish_file): Also set DECL_STATIC_FUNCTION_P on the + global init function. + + * decl.c (finish_function): Only set DECL_EXTERNAL here if the + inline function is public. + +Sat Mar 11 00:58:03 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (is_friend): Be more careful about checking + DECL_CLASS_CONTEXT on non-member functions. + + * decl2.c (finish_vtable_vardecl): Don't bother calling + assemble_external here. + (prune_vtable_vardecl): New function that just splices out the + vtable decl from the top-level decls. + (import_export_inline): Unset DECL_EXTERNAL at first. + (finish_file): Don't bother calling assemble_external here. Do + splice out all of the vtables. + +Fri Mar 10 14:42:29 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_function): If we're not emitting the function yet, + call assemble_external for it. + + * decl2.c (finish_prevtable_vardecl): Don't call mark_vtable_entries + here. + (finish_vtable_vardecl): Don't do the linkage deduction thing here. + Also don't splice out the current vtable if it is unused. + (finish_file): Move the second walk_vtables and the synthesis check + inside the 'reconsider' loop. Move thunk emission after the + 'reconsider' loop. + +Thu Mar 9 16:28:16 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * pt.c (tsubst): Don't bother calling cp_build_type_variant, since it + was passing bogus values for readonly and volatile from the original + template decl, not the resultant type of the tsubst call. + + * class.c (duplicate_tag_error): Use cp_error_at to point out the + previous definition of the tag. + +Thu Mar 9 10:46:17 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_function): Clear base_init_insns and protect_list. + (struct cp_function): Add base_init_insns field. + (push_cp_function_context): Also save base_init_insns. + (pop_cp_function_context): Also restore base_init_insns. + +Wed Mar 8 13:31:44 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (member_init_ok_or_else): Check for initializing a static + member here. + (emit_base_init): Instead of here. + +Tue Mar 7 16:03:26 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Disable synthesis as needed. + * lex.c (cons_up_default_function): Likewise. + +Tue Mar 7 10:14:29 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y: New rules to allow attributes in a prefix position. + (prefix_attributes): New variable. Pass it into cplus_decl_attributes. + (setattr): New rule. + (reserved_declspecs, declmods): Catch attributes here. + * decl2.c (cplus_decl_attributes): Add PREFIX_ATTRIBUTES argument. + * decl.c (duplicate_decls): Pass DECL_MACHINE_ATTRIBUTES to + descendent typedef. + (grokdeclarator): Added code to support machine attributes. + * Makefile.in (stamp-parse): Expect 5 shift/reduce failures. + +Mon Mar 6 15:07:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Don't synthesize methods outside of a + function. + + Make base initialization more re-entrant so that synthesis on the + fly will work (and, eventually, template instantation on the fly). + * init.c (sort_member_init): Don't bother with members that can't be + initialized. Reorganize a bit. Don't initialize base members here. + (sort_base_init): New function, like sort_member_init, but for base + classes. Steals some code from emit_base_init. + (emit_base_init): Simplify. Call sort_{member,base}_init before + doing any initialization, so we don't have to save + current_{member,base}_init_list in push_cp_function_context. + (expand_aggr_vbase_init_1): Adjust for sort_base_init. + (expand_aggr_vbase_init): Simplify. + * decl.c (struct cp_function): Add protect_list field. + (push_cp_function_context): Also save protect_list. + (pop_cp_function_context): Also restore protect_list. + * call.c (build_method_call): Enable synthesis at point of call. + * lex.c (cons_up_default_function): Likewise. + + * parse.y: Turn -ansi checks back into -pedantic checks. + + * init.c (build_new): Fix -fcheck-new for array new. + +Sat Mar 4 15:55:42 1995 Fergus Henderson <fjh@cs.mu.oz.au> + + * typeck.c (build_compound_expr): warn if left-hand operand of + comma expression has no side-effects. + +Fri Mar 3 15:16:45 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (primary): Change 'object qualified_id *' rules to 'object + overqualified_id *'. + +Fri Mar 3 12:48:17 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (unary_expr): Catch doing sizeof an overloaded function. + Make the error look the same as the one we issue in c_sizeof. + + * typeck.c (build_binary_op_nodefault): Give an error for trying + to compare a pointer-to-member to `void *'. + +Fri Mar 3 11:28:50 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_unary_op): Handle bool increment with smoke and + mirrors here, rather than in expand_increment where it belongs, + because Kenner doesn't agree with me. + +Fri Mar 3 00:08:10 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokparms): Catch a PARM_DECL being used for a default + argument as well. + +Thu Mar 2 20:05:54 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * init.c (build_new): Don't allow new on a function type. + + * parse.y (primary): Avoid a crash when seeing if the arg is of + the same type as that given for the typespec in an explicit dtor call. + +Thu Mar 2 00:49:38 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_function): Change test for calling + mark_inline_for_output. + +Wed Mar 1 11:23:46 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): Complain if + build_default_binary_type_conversion fails. + + * init.c (expand_default_init): Handle arguments of unknown type + properly. + + * cvt.c (build_expr_type_conversion): Only complain about ambiguity + if 'complain'. + * various: Pass 'complain'. + + * typeck.c (comptypes): Be more picky about comparing UPTs. + +Wed Mar 1 11:03:41 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): If declarator is null, say that the + type used has an incomplete type. + +Wed Mar 1 10:06:20 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (instantiate_template): Copy the template arguments to the + permanent_obstack. Also use simple_cst_equal to compare them when + looking for a previous instantiation. + + * tree.c (make_deep_copy): Support copying INTEGER_TYPEs (assuming + they are array domain types). + +Tue Feb 28 23:24:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cp-tree.h: Define WANT_* constants for passing to + build_expr_type_conversion. + * cvt.c (build_expr_type_conversion): New function to build + conversion to one of a group of suitable types. + (build_default_binary_type_conversion): Use it. + * decl2.c (grok_array_decl): Likewise. + * typeck.c (build_unary_op): Likewise. + (build_array_ref): Tidy up a bit. + (build_binary_op): Likewise. + +Tue Feb 28 19:57:31 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Don't allow decl of an argument as `void'. + +Tue Feb 28 17:23:36 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (typed_declspecs1): Add 'typespec reserved_typespecquals + reserved_declspecs' rule. + + * parse.y (expr_or_declarator): Remove notype_qualified_id rule. + (direct_notype_declarator): Likewise. + (complex_direct_notype_declarator): Add notype_qualified_id rule. + + * lex.c (real_yylex): Handle :> digraph properly. + +Tue Feb 28 12:26:29 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Check if it's a friend, not if it's + non-virtual, that's being initialized. Move the check up to + before FRIENDP would get cleared. Catch an unnamed var/field + being declared void. Say just `field' instead of `structure field' + in the error message. Only go for the operator name if DECLARATOR + is non-null. + +Tue Feb 28 00:08:01 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (start_function): Complain about abstract return type. + (grokdeclarator): Complain about declaring constructors and + destructors to be const or volatile. Complain about declaring + destructors to be static. + + * pt.c (uses_template_parms): Handle pmfs. + + * decl.c (grokdeclarator): Don't call variable_size for array bounds + that only depend on template constant parameters. + +Mon Feb 27 15:38:16 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * error.c (dump_decl): Only look to see if it's a vtable if we + actually have a name to check out. + +Mon Feb 27 13:37:53 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (convert_to_aggr): Lose misleading shortcut. + +Sun Feb 26 17:27:32 1995 Doug Evans <dje@canuck.cygnus.com> + + * decl.c (set_nested_typename): Always set DECL_IGNORED_P, + not just for dwarf. + +Sun Feb 26 00:10:18 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Don't allow a static member to be + declared `register'. + + * init.c (make_friend_class): Move up to a pedwarn for the warning + about a class declaring friends with itself. + + * decl.c (grokdeclarator): You can't do `volatile friend class foo' + or `inline friend class foo'. Only try to make a friend out of + TYPE if we didn't already reset it to integer_type_node. + +Sat Feb 25 22:32:03 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Don't allow initialization of a + non-virtual function. + + * decl.c (start_function): Do a pedwarn if we're changing `main' + to have an int return type. + +Sat Feb 25 00:02:05 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): Handle simple assignment from + TARGET_EXPRs by building up an RTL_EXPR to force expansion. Whew. + +Fri Feb 24 18:27:14 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Also don't allow virtual outside of a + class decl for a scope method definition performed at global binding. + + * init.c (build_offset_ref): Don't allow creation of an OFFSET_REF + of a bitfield. + + * decl.c (grokdeclarator): Don't allow a const to be declared mutable. + + * typeck.c (build_binary_op): Return an error_mark_node if either + one of the args turned into an error_mark_node when we tried to + use default_conversion. + + * typeck.c (build_unary_op): Forbid using postfix -- on a bool. + + * decl.c (grokdeclarator): Allow `signed' and `unsigned' to be + used on `__wchar_t'. + +Fri Feb 24 13:59:53 1995 Mike Stump <mrs@cygnus.com> + + * except.c (end_protect_partials): Do it the right way. + +Wed Feb 22 15:42:56 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Upgrade warning about + comparing distinct pointer types to pedwarn. + + * typeck2.c (digest_init): Cope with extra braces. + + * typeck.c (build_binary_op_nodefault): Use tree_int_cst_sgn instead + of INT_CST_LT (..., interger_zero_node). + +Wed Feb 22 14:45:52 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * except.c [!TRY_NEW_EH] (end_protect_partials): Define dummy + function for systems that don't have EH. + +Tue Feb 21 19:18:31 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (can_convert_arg): Like can_convert, but takes an arg as + well. + + * pt.c (type_unification): Allow implicit conversions for parameters + that do not depend on template parameters. + +Tue Feb 21 18:43:48 1995 Douglas Rupp <drupp@cs.washington.edu> + + * Make-lang.in, config-lang.in: ($exeext): New macro. + * Make-lang.in: Try a "cp" if "ln" fails. + * cp-tree.h (decl_attributes): Added argument. + * decl2.c (cplus_decl_attribute): Add arg to decl_attributes. + * cp/g++.c: Added #ifdefs for sys/file.h and process.h for NT. + Modified spawnvp to have to correct number of arguments for OS/2, NT. + +Tue Feb 21 18:36:55 1995 Mike Stump <mrs@cygnus.com> + + * decl.c (finish_function): Add calls to end_protect_partials to end + the exception region that protects constructors so that partially + constructed objects can be partially destructed when the constructor + throws an exception. + * init.c (perform_member_init, sort_member_init, emit_base_init): + Added support for partially constructed objects. + * init.c (build_partial_cleanup_for): New routine to do partial + cleanups of a base class. + * decl2.c (finish_file): Move the emitting of the exception table + down, after we emit all code that might have exception regions in + them. + * except.c (end_protect_partials, might_have_exceptions_p): New + routines. + (emit_exception_table): Always output table if called. + * cp-tree.h (protect_list, end_protect_partials, + might_have_exceptions_p, emit_exception_table): Added. + +Tue Feb 21 16:05:59 1995 Brendan Kehoe <brendan@lisa.cygnus.com> + + * gc.c (build_typeid): Pass a NULL_TREE, not the bogus, unused + address of a local variable. + * class.c (build_vfn_ref): Only try to build the PLUS_EXPR if we + were given a non-null PTR_TO_INSTPTR. + +Tue Feb 21 01:53:18 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (duplicate_decls): Always lay out the merged decl. + + * decl2.c (finish_vtable_vardecl): Don't do vtable hack on templates. + (finish_prevtable_vardecl): Likewise. + + * method.c (synthesize_method): Set interface_{unknown,only} + according to the settings for our class, not the file where it comes + from. + +Sat Feb 18 12:26:48 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Handle systems that define __i386__ but not __i386. + +Fri Feb 17 15:31:31 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (reparse_decl_as_expr): Support being called without a + type argument. + + * parse.y (primary): Add '(' expr_or_declarator ')'. Adds 4 r/r + conflicts. Sigh. + +Fri Feb 17 12:02:06 1995 Mike Stump <mrs@cygnus.com> + + * parse.y (template_def, fndef, fn.def1, return_init, condition, + initdcl0, initdcl, notype_initdcl0, nomods_initdcl0, + component_decl_1, after_type_component_declarator0, + notype_component_declarator0, after_type_component_declarator, + notype_component_declarator, after_type_component_declarator, + full_parm, maybe_raises, exception_specification_opt): Fix up, + include exception_specification_opt maybeasm maybe_attribute and + maybe_init if missing. Rename maybe_raises to + exception_specification_opt to match draft wording. Use maybe_init + to simplify rules. + +Fri Feb 17 01:54:46 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_new): Set TREE_NO_UNUSED_WARNING on COMPOUND_EXPRs + built for news of scalar types. + +Thu Feb 16 17:48:28 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Update code for warning + about signed/unsigned comparisons from C frontend. Realize that the + code in the C frontend is, if anything, even more bogus. Fix it. + (build_binary_op): Undo default_conversion if it wasn't useful. + + * typeck.c (build_unary_op, ADDR_EXPR): Lose bogus special case for + PRE*CREMENT_EXPR. + + * decl2.c (import_export_vtable): Don't try the vtable hack + if the class doesn't have any real non-inline virtual functions. + (finish_vtable_vardecl): Don't bother trying to find a non-inline + virtual function in a non-polymorphic class. + (finish_prevtable_vardecl): Likewise. + + * decl2.c (import_export_vtable): Use and set DECL_INTERFACE_KNOWN. + + * cp-tree.h (DECL_INTERFACE_KNOWN): Use DECL_LANG_FLAG_5. + + * init.c (expand_virtual_init): Always call assemble_external. + + * class.c (build_vfn_ref): Always call assemble_external. + (build_vtable): Always call import_export_vtable. + (prepare_fresh_vtable): Likewise. + (add_virtual_function): Don't bother setting TREE_ADDRESSABLE. + +Thu Feb 16 03:28:49 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_struct): Use TYPE_{MIN,MAX}_VALUE to determine + whether an enumerated type fits in a bitfield. + +Wed Feb 15 15:38:12 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (grow_method): Update method_vec after growing the class + obstack. + +Wed Feb 15 13:42:59 1995 Mike Stump <mrs@cygnus.com> + + * parse.y (handler_seq): Push a level for the catch parameters. + +Wed Feb 15 12:42:57 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (emit_base_init): Update BINFO_INHERITANCE_CHAIN on my + bases, in case they've been clobbered. + +Wed Feb 15 12:07:29 1995 Mike Stump <mrs@cygnus.com> + + * class.c (finish_base_struct): Set up BINFO_INHERITANCE_CHAIN here, + so that one day it will always be valid. + * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. + + * cp-tree.h (copy_binfo): Removed, unused. + * tree.c (copy_binfo): Likewise. + +Wed Feb 15 00:05:30 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_new): Save the allocation before calling + expand_vec_init on it. + + * decl.c (finish_enum): The TYPE_PRECISION of the enum type mush + match the TYPE_PRECISION of the underlying type for constant folding + to work. + +Tue Feb 14 15:31:25 1995 Mike Stump <mrs@cygnus.com> + + * except.c (push_eh_entry, expand_start_all_catch, + expand_leftover_cleanups, expand_end_catch_block): Keep track of + the context in which the exception region occurs. + (build_exception_table): If the region was not output, don't output + the entry in the eh table for it. + +Tue Feb 14 02:15:43 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (expand_default_init): Only use a previous constructor call + if it's a call to our constructor. Does the word "Duh" mean + anything to you? + + * decl.c (grokparms): Fine, just don't call + convert_for_initialization at all. OK? Happy now? + +Mon Feb 13 02:23:44 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Make sure that the class + method vector has a second element before returning it. + + * decl.c (grokparms): Don't strip REFERENCE_TYPE before calling + convert_for_initialization. + +Sun Feb 12 03:57:06 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): Compare function name to + constructor_name (current_class_type) instead of current_class_name. + + * decl.c (grokparms): Don't do anything with the return value of + convert_for_initialization. + + * error.c (dump_decl): Also dump_readonly_or_volatile on the decl. + + * decl.c (duplicate_decls): Tweak error message. + + * typeck.c (build_const_cast): Implement checking. + (build_reinterpret_cast): Implement some checking. + + * cp-tree.h (CONV_FORCE_TEMP): Require a new temporary when + converting to the same aggregate type. + (CONV_STATIC_CAST): Include it. + (CONV_C_CAST): Likewise. + * cvt.c (convert_force): Use CONV_C_CAST instead of CONV_OLD_CONVERT. + (cp_convert): Only force a new temporary if CONV_FORCE_TEMP. + +Fri Feb 10 16:18:52 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_c_cast): Use non_lvalue to tack something on + where necessary. + + * decl.c (auto_function): Now a function. + * except.c (init_exception_processing): terminate, unexpected, + set_terminate, and set_unexpected have C++ linkage. + + * typeck.c (build_unary_op, TRUTH_NOT_EXPR): Use convert instead of + truthvalue_conversion for converting to bool, as it handles + user-defined conversions properly. + (condition_conversion): Likewise. + + * except.c (expand_throw): Don't call convert_to_reference. + Pass the correct parameters to build_new. + + * method.c (do_build_assign_ref): Don't use access control when + converting to a base reference here. + (do_build_copy_constructor): Or here. + + * init.c (build_new): Unset TREE_READONLY on the dereferenced + pointer before assigning to it. + + * decl.c (maybe_build_cleanup): Don't bother stripping const here. + + * decl2.c (delete_sanity): You can now delete pointer to const. + +Fri Feb 10 13:28:38 1995 Jason Merrill <jason@python.cygnus.com> + + * decl.c (finish_function): Don't rely on actual parameters being + evaluated left-to-right. + * except.c (expand_end_catch_block): Likewise. + +Fri Feb 10 00:52:04 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * tree.c (real_lvalue_p): Like lvalue_p, but class temps aren't + considered lvalues. + * cvt.c (convert_to_reference): Use real_lvalue_p instead of + lvalue_p. + + * cvt.c (build_type_conversion_1): Don't call convert on aggregate + types. + (convert_to_reference): Fix erroneous text substitution. + + * typeck2.c (initializer_constant_valid_p): Update from C frontend. + Add new argument to all callers. + + * typeck.c (convert_arguments): Check for error_mark_node before + trying to do anything with the actual parameter. + + * typeck.c (condition_conversion): Build up a CLEANUP_POINT_EXPR and + fold it. + (bool_truthvalue_conversion): Remove. Fix all callers to call + truthvalue_conversion instead. + (various): Fold CLEANUP_POINT_EXPRs. + + * parse.y (conditions): Call condition_conversion rather than + building up a CLEANUP_POINT_EXPR. + + * pt.c (end_template_decl): Don't warn_if_unknown_interface here + under -falt-external-templates. + +Thu Feb 9 05:24:10 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_new): Complain about new of const type without + initializer. Other cleanup. + + * call.c (compute_conversion_costs): Don't call + build_type_conversion with a reference type; convert to the target + type and check its lvaluetude. + * cvt.c (convert_to_reference): Likewise. + + * cvt.c (build_type_conversion_1): There will never be any need to + dereference references here now. + +Thu Feb 9 00:37:47 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_builtin_throw): Make sure we only `use' the + value of return_val_rtx. + +Wed Feb 8 15:45:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (structsp): Don't complain about declaring a type being + defined to be a friend. + + * decl2.c (warn_if_unknown_interface): Note the template in question + and the point of instantiation, for -falt-external-templates. + * lex.c (reinit_parse_for_method): Pass the decl to + warn_if_unknown_interface. + * pt.c (instantiate_template): Likewise. + (end_template_decl): Likewise. + + * decl.c (set_nested_typename): Set IDENTIFIER_TYPE_VALUE on the + nested name again, to make local classes work a bit better. + + * typeck.c (build_function_call_real): Dereference reference after + checking for incomplete type. + + * init.c (build_new): Accept new of const and volatile types. + +Wed Feb 8 14:04:16 1995 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Fix error message. + +Wed Feb 8 03:16:15 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (convert_for_initialization): Do bash arrays when + converting to a reference to non-array. + +Tue Feb 7 15:50:33 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (cp_convert): Don't call convert_to_reference, or + automatically dereference references. Do pass reference conversions + to cp_convert_to_pointer. + (cp_convert_to_pointer): Support references. + + * call.c (build_method_call): Don't build up a reference to the + parameter here; let build_overload_call handle that. + + * typeck.c (build_c_cast): Call convert_to_reference directly if + converting to a reference type. + * method.c (do_build_copy_constructor): Likewise. + * method.c (do_build_copy_constructor): Likewise. + (do_build_assign_ref): Likewise. + + * call.c (build_method_call): Dereference a returned reference. + * typeck.c (build_function_call_real): Likewise. + + * decl.c (xref_basetypes): Check for unions with basetypes here. + (xref_tag): Instead of here. + + * pt.c (process_template_parm): Template type parm decls are + artificial. + +Mon Feb 6 04:32:09 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y (typed_declspecs): Add missing semicolon. + (do_xref_defn): Resurrect. + (named_class_head_sans_basetype): Move template specialization + definition cases to named_class_head_sans_basetype_defn. + + * decl2.c (grokfield): Call pushdecl_class_level after setting the + TYPE_NAME, not before. + +Sun Feb 5 02:50:45 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (convert_harshness): Don't call sorry here. Don't allow + conversions between function pointer types if pedantic. + + * pt.c (overload_template_name): Pass globalize=1 to xref_tag. + + * lex.c (cons_up_default_function): Use the full name for the return + type of op=. + + * decl.c (set_nested_typename): Don't worry about anonymous types, + as they already have a unique name. + (pushdecl): Remove redundant set_nested_typename + (xref_tag): Split out base handling into xref_basetypes. + + * cp-tree.h (TYPE_INCOMPLETE): New macro; TEMPLATE_TYPE_PARMs are + not considered incomplete even though their definition is unknown. + + * decl.c (xref_defn_tag): Lose. + (xref_tag): xref_next_defn = ! globalize. + (pushdecl): Don't set DECL_NESTED_TYPENAME on artificial decls. The + ones that should have it set will have it set by pushtag. + (pushdecl_class_level): Likewise. + (pushtag): Tidy up a bit. + (set_nested_typename): Push a decl for the nested typename from + here, rather than from xref_defn_tag. + + * parse.y (do_xref): Lose. + (named_class_head): If we see 'class foo:' we know it's a + definition, so don't worry about base lists for non-definitions. + + * pt.c (push_template_decls): Template parm decls are artificial. + + * decl.c (duplicate_decls): Restore check for qualifier + disagreement for non-functions. + (decls_match): Remove check for qualifier disagreement. + +Fri Feb 3 14:58:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grok_reference_init): Convert initializer from + reference. + * typeck.c (convert_for_initialization): Likewise. + + * decl.c (duplicate_decls): Propagate DECL_NESTED_TYPENAME. + + * cvt.c (cp_convert): Don't convert to the same class type by just + tacking on a NOP_EXPR. + (convert_to_reference): Use comp_target_types instead of comptypes + so that we don't allow conversions two levels down. + +Thu Feb 2 15:07:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (build_vbase_path): Bash types to make the backend happy. + * cvt.c (build_up_reference): Bash the types bashed by + build_vbase_path to be reference types instead of pointer types. + (convert_to_reference): Likewise. + + * typeck.c (build_c_cast): Don't strip NOPs if we're converting to a + reference type. + + * parse.y (structsp): Put back error for 'struct B: public A;'. + +Wed Feb 1 23:02:06 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Add support for mips systems that don't define __mips + but do define mips, like Ultrix. + +Wed Feb 1 22:39:07 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Add support for exception handling on the Alpha. + +Wed Feb 1 10:12:14 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_file): Fix bug in Jan 31st change. + +Tue Jan 31 16:59:15 1995 Gerald Baumgartner <gb@lorenzo.cs.purdue.edu> + + * sig.c (build_signature_pointer_or_reference_type): Don't set + IS_AGGR_TYPE for signature pointers/reference so expand_default_init + doesn't expect to find a copy constructor. + * call.c (build_method_call): Treat signature pointers/reference + as if IS_AGGR_TYPE were set. + +Tue Jan 31 13:28:56 1995 Mike Stump <mrs@cygnus.com> + + * gc.c (get_typeid): Pawn off error messages to build_t_desc. + (build_t_desc): Inform the user here if they try and build + with -frtti and don't include <typeinfo.h>. + + * decl2.c (finish_prevtable_vardecl): Support rescanning. + (finish_file): Move finish_prevtable_vardecl up to before the global + initializers are done as tdecls are initialized in the global + initializer. Also Pick up any new tdecls or vtables needed by + synthesized methods. + + * class.c (finish_struct): Simplify. We have to do rtti scanning at + end, so we might as well do all of it there. + +Tue Jan 31 05:35:02 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Fix -fthis-is-variable for 32-bit + targets, too. + +Tue Jan 31 00:11:04 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_prevtable_vardecl): New routine, mostly split from + finish_vtable_vardecl. It has the first half functionality from + that routine. + * decl2.c (finish_vtable_vardecl): Update to not include stuff not + in finish_prevtable_vardecl. + * decl2.c (finish_file): Call finish_prevtable_vardecl. + * gc.c (build_generic_desc): Allow it to be called when not at the + global binding layer, but behave as if we were. + (build_t_desc): Rearrange a bit so that it really works and is + easier to follow. + * class.c (finish_struct): Don't decide on tdecls here, as we have + to wait until the end of the file in general to decide whether or + not they come out. + +Mon Jan 30 01:00:40 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_delete): Check access to operator delete before + calling the destructor. + * method.c (build_opfncall, DELETE_EXPR): build_method is allowed to + return error_mark_node. + * call.c (build_method_call): Use the one-argument op delete even if + it's an error. + + * init.c (build_new): Fix -fthis-is-variable support. + * call.c (build_method_call): Likewise. + + * call.c (convert_harshness): Make conversion from a pointer to bool + worse than conversion to another pointer. + +Sat Jan 28 16:46:10 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (build_new): Check new return value if -fcheck-new. + + * lex.c (check_newline): Clear end_of_file when we're done, too. + +Sat Jan 28 10:38:39 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_vtable_vardecl): Make rtti TD tables follow + vtables whereever they go. + + * gc.c (build_t_desc): Remove old way of setting it up, as it wasn't + right. + +Sat Jan 28 09:10:44 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (finish_vtable_vardecl): Now set the + interface/implementation of vtables on the first virtual function, + if one exists, otherwise we use the old method. This is a major win + in terms of cutting down the size of objects and executables in + terms of text space and data space. Now most of the savings that + #pragma interface/implementation gives is automatic in a fair number + of cases. + +Sat Jan 28 04:57:33 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grokdeclarator): Discard the template parameters in a + template constructor declaration so that the function is always + named constructor_name (ctype). + + * lex.c (check_newline): Use ungetc to put back the character before + calling HANDLE_PRAGMA. + +Fri Jan 27 17:23:47 1995 Mike Stump <mrs@cygnus.com> + + * decl2.c (check_classfn): If the cname is T<int> and fn_name is T, + make sure we still match them. + +Fri Jan 27 16:32:10 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y: Add END_OF_LINE token. + + * lex.c (check_newline): Set linemode when we see a # directive, and + unset it when we're done. Turn all 'return's into 'goto skipline'. + Fix all uses of '\n', since we won't see it anymore. Put back the + character we read before checking for a sysv or target pragma. + (real_yylex): If we see an EOF in linemode, return END_OF_LINE. + (handle_sysv_pragma): Don't look at the input stream; quit when we + see an END_OF_LINE token. + + * input.c (getch): Return EOF if we're in line mode and at the end + of a line. + (put_back): Don't put back an EOF. + +Thu Jan 26 19:26:34 1995 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Do the newing of the exception object + before we load the type descriptor or the address so that we don't + wipe any of the values out. + +Thu Jan 26 19:20:00 1995 Mike Stump <mrs@cygnus.com> + + * except.c (init_exception_processing): Don't use r12 on the rs6000. + +Tue Jan 24 16:36:31 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grokparms): Don't try to build up a reference at this point. + + * typeck2.c (build_functional_cast): Don't assume that a NOP_EXPR + will suffice to convert from integer_zero_node. + +Wed Jan 25 15:02:09 1995 David S. Miller <davem@nadzieja.rutgers.edu> + + * class.c (instantiate_type): Change error message text. + * typeck2.c (store_init_value): Likewise. + +Mon Jan 23 21:57:14 1995 Mike Stump <mrs@cygnus.com> + + * pt.c (tsubst): When we copy a node, don't forget to copy + TREE_CHAIN, we use it later. + +Mon Jan 23 03:33:47 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (convert_for_assignment): Initialize variable before use. + +Fri Jan 20 01:17:59 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * g++.c (main): Link with both libstdc++ and libg++ if called as + something ending with "g++", otherwise only libstdc++. Move -lm to + the end of the line. + +Thu Jan 19 15:43:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Don't mess with 'this' before calling + compute_conversion_costs. + +Wed Jan 18 15:40:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * search.c (get_matching_virtual): Give line number for previous + declaration. + + * call.c (convert_harshness): Handle conversions to references + better. + + * cvt.c (build_up_reference): OK, handle {MIN,MAX}_EXPR *properly*. + +Wed Jan 18 15:21:38 1995 Mike Stump <mrs@cygnus.com> + + * class.c (instantiate_type): Use DECL_CHAIN to walk lists instead, + as the TREE_CHAIN for methods will take us to the next differently + named function, DECL_CHAIN won't. + +Wed Jan 18 14:26:59 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * tree.c (lvalue_p): Handle {MIN,MAX}_EXPR. + + * decl2.c (lang_decode_option): -Wall implies -Wparentheses. + warn_parentheses defaults to 0. + + * decl.c (grokparms): Put back call to require_instantiated_type. + +Tue Jan 17 19:56:15 1995 Mike Stump <mrs@cygnus.com> + + * except.c (exception_section): Use the data section on the rs6000. + Change calling convention for named_section. + +Wed Jan 17 18:20:57 1994 Fergus Henderson <fjh@munta.cs.mu.oz.au> + + * cp-tree.h : Make if (x=0) warn with wall + * parse.y : Make if (x=0) warn with wall + +Tue Jan 17 14:12:00 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (BOOL_TYPE_SIZE): BITS_PER_WORD if SLOW_BYTE_ACCESS, + BITS_PER_UNIT otherwise. + + * search.c (get_matching_virtual): Don't check the binfo if the + types are the same. + + * cvt.c (cp_convert): Just call truthvalue_conversion to convert to + bool. + +Mon Jan 16 13:28:48 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * various: Use boolean_type_node, boolean_true_node, + boolean_false_node. + + * search.c (get_matching_virtual): Allow covariant returns that + don't require pointer adjustment. + + * typeck.c (build_conditional_expr): Don't call default_conversion + on ifexp. + + * cvt.c (build_up_reference): Handle MIN_EXPR and MAX_EXPR. + + * decl.c (grokdeclarator): Upgrade warning about &const to pedwarn. + +Sun Jan 15 22:17:32 1995 David Binderman <dcb@lovat.fmrco.COM> + + * pt.c (do_function_instantiation): Free targs once we're done. + +Sun Jan 15 22:17:32 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (BOOL_TYPE_SIZE): Defaults to BITS_PER_WORD. + (init_decl_processing): Use BOOL_TYPE_SIZE instead of CHAR_TYPE_SIZE + for bool. + +Sat Jan 14 05:33:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_file): We need to mess up if there are any + variables in the list, not just if there is one with a constructor. + +Fri Jan 13 14:42:55 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (duplicate_decls): Propagate DECL_STATIC_{CON,DE}STRUCTOR. + (finish_function): Handle DECL_STATIC_{CON,DE}STRUCTOR. + (finish_function): Trust rest_of_compilation. + + * decl2.c (finish_file): Also call functions designated as static + constructors/destructors. + + * decl.c (grokdeclarator): Allow access decls of operator functions. + (grokparms): Only do convert_for_initialization if the initializer + has a type. + (duplicate_decls): Put back push_obstacks_nochange call. + + * lex.c (real_yylex): Downgrade complaint about the escape sequence + being too large from pedwarn to warning. + + * decl.c (grokdeclarator): Don't complain about long long in system + headers. + + * lex.c (real_yylex): Handle digraphs. + +Thu Jan 12 12:17:24 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (init_decl_processing): -f{no-,}strict-prototype only + affects C linkage declarations now. + + * typeck.c (comp_target_types): Grok simple contravariant conversions. + (common_type): t1 and t2 are interchangeable. + + * various: Test return value of comp_target_types differently in + different places; it now returns -1 for a contravariant conversion + (which is fine in symmetric cases). + + (common_type): Prefer long double to double even when + they have the same precision. + + * decl.c (grokparms): Call convert_for_initialization to check + default arguments. + + * init.c (build_new): void_type_node has a size (of 0). + + * decl.c (decls_match): Also check for agreement of TREE_READONLY + and TREE_THIS_VOLATILE. + (push_class_level_binding): Properly handle shadowing of + nested tags by fields. + + * search.c (dfs_pushdecls): Likewise. + + * decl2.c (finish_file): Don't second-guess self-initialization. + + * cvt.c (convert_to_reference): Work with expr directly, rather than + a copy. + + * decl.c (push_overloaded_decl): Only shadow artificial TYPE_DECLs. + + * init.c (add_friend): Downgrade duplicate friend message from + pedwarn to warning. + + * decl.c (duplicate_decls): Push obstacks before calling common_type. + +Thu Jan 12 17:15:21 1995 Michael Ben-Gershon <mybg@cs.huji.ac.il> + + * except.c (push_eh_entry): set LABEL_PRESERVE_P flag for + exception table labels. + (expand_start_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + * except.c (make_first_label): new function. + (expand_start_all_catch): add a call to make_first_label() before + using a label as a jump destination. + (expand_end_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + * except.c: Add ARM processor support for exception handling. + +Thu Jan 12 12:17:24 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + (complete_array_type): Copy code from C frontend. + + * lex.c (real_yylex): Don't multiply the length of a wide string + literal by WCHAR_BYTES. + + * decl.c (pushdecl): Check for redeclaration of wchar_t here. + (duplicate_decls): Instead of here. + (define_label): Complain about a label named wchar_t. + (grokdeclarator): Complain about declarations of + operator-function-ids as non-functions. + + * typeck.c (unary_complex_lvalue): Also wrap prefix -- and ++ in + COMPOUND_EXPRs. + (build_unary_op): Wrap unary plus in a NON_LVALUE_EXPR. + + * lex.c (real_yylex): Don't skip whitespace when reading the next + character after ->. + +Wed Jan 11 16:32:49 1995 Mike Stump <mrs@cygnus.com> + + * except.c: Allow cc1plus to be built with native compiler on rs6000. + (expand_start_all_catch): Add assemble_external calls for various + routines we call. + (expand_leftover_cleanups): Likewise. + (expand_start_catch_block): Likewise. + (do_unwind): Likewise. + (expand_builtin_throw): Likewise. + +Wed Jan 11 01:05:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (pushtag): Only look for a previous decl in the current + binding level. Use explicit global scope in DECL_NESTED_TYPENAME. + + * gxx.gperf: Add __signature__ and __sigof__ keywords. + + * decl2.c (lang_decode_option): -ansi does not set flag_no_asm. It + does set flag_no_gnu_keywords and flag_operator_names. + + * lex.c (init_lex): 'overload' is not a keyword unless -traditional. + Unset extension keywords if -fno-gnu-keywords. + Allow operator names ('bitand') if -foperator-names. + Never unset 'asm'; -fno-asm only affects 'typeof'. + + * decl.c (lookup_name_real): The got_object special lookup only + applies to types. + +Tue Jan 10 18:07:51 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * spew.c (yylex): Also use DECL_NESTED_TYPENAME if got_object is set. + + * parse.y (primary): Unset got_object after all rules that use the + 'object' nonterminal. + (object): Set got_object. + + * lex.h: Declare got_object. + + * decl.c (lookup_name_real): Also lookup names in the context of an + object specified. + +Tue Jan 10 14:30:30 1995 Mike Stump <mrs@cygnus.com> + + * typeck.c (get_member_function_from_ptrfunc): Use ptrdiff_type_node + for things that have to be added to pointers, not size_type. Cures + problems with pointer to members on Alphas. + (build_binary_op_nodefault): Likewise. + (get_delta_difference_: Likewise. + (build_ptrmemfunc): Likewise. + +Tue Jan 10 01:49:25 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (pushtag): Stick the new decl in TYPE_NAME before pushing + it. + + * typeck.c (build_component_ref): Don't build up a COMPONENT_REF + when dealing with overloaded member functions; just act like + build_offset_ref. + (commonparms): Remove misleading comment. + + * decl.c (duplicate_decls): Complain about repeated default + arguments here. + (redeclaration_error_message): Instead of here. + (pushdecl): Complain about missing default arguments here. + (grokparms): Instead of here. + (lookup_name_current_level): Also match on DECL_ASSEMBLER_NAME. + (grok_reference_init): Do not complain about missing initializer if + declared 'extern'. + + * search.c (lookup_field): Don't return a TYPE_DECL if there is a + function alternative and want_type is not set. + +Mon Jan 9 18:16:23 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (pushtag): Don't set TYPE_NAME to an identifier. Do push + the decl when the type has no TYPE_NAME. + (lookup_nested_type): Don't assume that type has TYPE_NAME set. + (lookup_name_real): Call lookup_field with want_type = + prefer_type. + + * search.c (lookup_field): Handle want_type properly in the presence + of fields with the same name. + + * decl.c (set_nested_typename): Set nested name for file-scope types + to include leading ::. + (pushdecl): Set the nested typename if the decl doesn't have one, + rather than if the type's canonical decl doesn't have one. + +Mon Jan 9 03:44:33 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (convert_for_assignment): Complain about contravariance + violation here. + (comp_target_types): Instead of here. + (build_unary_op): resolve_offset_ref before checking for a valid + type. + + * spew.c (yylex): Decrement looking_for_typename after we see a + _DEFN. + + * decl.c (pushdecl): Don't install an artificial TYPE_DECL in + IDENTIFIER_LOCAL_VALUE if we already have a decl with that name. + + * typeck.c (convert_for_assignment): Converting pointers to bool + does not need a cast. + +Sun Jan 8 18:16:45 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (instantiate_type): Initialize nsubsts parm. + + * pt.c (do_function_instantiation): Likewise. + +Sat Jan 7 14:37:05 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (tsubst): Use TREE_STATIC instead of DECL_INLINE && + DECL_SAVED_INSNS to determine whether or not we've seen a definition + of this function. + (instantiate_template): Likewise. + + * call.c (convert_harshness): Allow const reference binding when + called from the overloading code, but not when called from + can_convert (since it isn't a conversion). + (convert_harshness): Put back some disabled code. + +Fri Jan 6 14:10:57 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (convert_harshness): There is no implicit conversion from + void* to other pointer types (unless the parameter is (void*)0). + (convert_harshness): Non-lvalues do not convert to reference types. + + * class.c (finish_struct_methods): Still set + TYPE_HAS_{INT,REAL}_CONVERSION. + + * call.c (can_convert): Don't use aggregate initialization. + + * cp-tree.h: Declare lookup_conversions. + +Thu Jan 5 21:08:00 1995 Mike Stump <mrs@cygnus.com> + + * parse.y (simple_stmt): Fix duplicate case value error messages to + be more readable. + +Wed Jan 4 16:44:19 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (build_type_conversion): Total rewrite to use + convert_harshness instead of reproducing conversion logic here. Now + much shorter. + + * call.c (convert_harshness): Support conversions to bool. + (can_convert): Checks whether a conversion is less harsh + than USER_CODE, for build_type_conversion. + + * search.c (add_conversions): Function for passing to dfs_walk which + adds all the type conversion operators in the current type to a list. + (lookup_conversions): Calls dfs_walk with add_conversions and return + the list. + (dfs_walk): Don't require a qfn. + + * cp-tree.h: Lose CLASSTYPE_CONVERSIONS hackery. + (CLASSTYPE_FIRST_CONVERSION): Points to elt 1 of CLASSTYPE_METHOD_VEC. + + * class.c (finish_struct_bits): Lose CLASSTYPE_CONVERSIONS hackery. + (grow_method): A separate function for building onto the growing + method vector. + (finish_struct_methods): Use it. Put all type conversion operators + right after the constructors. Perhaps we should sort the methods + alphabetically? + +Mon Jan 2 14:42:58 1995 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Lose another misleading shortcut. + +Fri Dec 30 17:57:30 1994 Mike Stump <mrs@cygnus.com> + + * gc.c (build_bltn_desc): Handle bool as a built-in type. + +Fri Dec 30 14:20:21 1994 Mike Stump <mrs@cygnus.com> + + * tree.c (layout_vbasetypes): Ensure that we don't loose alignment + on the complete type because of small virtual bases. + +Fri Dec 30 12:22:29 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (n_incomplete): Bump n_incomplete up to int to match C + front end. + (pushdecl): Also count decls pushed that are of a type being defined + as incomplete things. + * class.c (finish_struct): Move hack_incomplete_structures up to + just after we set it as not being defined, so that the decls we + build for RTTI don't count as incomplete. + +Thu Dec 29 18:20:57 1994 Mike Stump <mrs@cygnus.com> + + * pt.c (tsubst): Fix problem with defining constructors in templated + classes with virtual bases. + +Wed Dec 28 08:31:00 1994 Mike Stump <mrs@cygnus.com> + + * parse.y (TYPEID): Strip top-level cv-qualifiers on typeid + expressions. + * gc.c (build_typeid): Likewise. + +Thu Dec 22 17:26:33 1994 Mike Stump <mrs@cygnus.com> + + * cvt.c (build_up_reference): Fix breakage introduced on Nov 29, + don't assert on complex AGGR inits. + +Thu Dec 22 14:32:31 1994 Mike Stump <mrs@cygnus.com> + + * method.c (build_overload_value): Handle pointer to members as + template arguments. + +Thu Dec 22 13:09:07 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (unary_complex_lvalue): Don't call sorry if we know how + to do take the address of a data member for a pointer to data + member. + +Thu Dec 22 10:04:19 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (grokdeclarator): Use the typedef name for linkage if the + type doesn't otherwise have a name. + + * decl2.c (grokfield): Likewise. + + * class.c (finish_struct): Since we reuse the TYPE_DECL for the + DECL_NAME of enums, structs and classes, we have to avoid trying to + put it in the TYPE_FIELDS again. + +Wed Dec 21 11:07:05 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (check_classfn): Ignore this parameter on static functions + when checking to see if we match. + +Tue Dec 20 17:47:02 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (unary_complex_lvalue): Handle address of non-left most + pointers to members by calling get_delta_difference. + +Mon Dec 19 22:40:53 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (check_classfn): Don't use decls_match yet, as it modifies + static functions to early. + +Thu Dec 19 22:37:48 1994 Mike Stump <mrs@cygnus.com> + + * method.c (make_thunk): Handle encoding of positive thunk offsets. + +Sat Dec 17 13:29:50 1994 Doug Evans <dje@canuck.cygnus.com> + + * Make-lang.in (.PHONY): Tell GNU make C++ and c++ are phony targets. + +Thu Dec 15 16:32:12 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (check_classfn): Use decls_match to check if this has + already been declared, as the DECL_ASSEMBLER_NAME may have been + changed via asm("new_name"). + * decl.c (decls_match): Make public. + +Thu Dec 15 15:17:55 1994 Mike Stump <mrs@cygnus.com> + + * *.[chy] (expand_aggr_init) Add fourth argument to handle + distinction between = init and (init) style of initializations. + * *.[chy] (finish_decl): Add fifth argument to to handle + distinction between = init and (init) style of initializations. + +Tue Dec 13 19:16:05 1994 Mike Stump <mrs@cygnus.com> + + Fix some random `explicit' bugs. + + * cvt.c (convert_to_reference): Add third parameter to + convert_force. + (convert_force): Likewise. + * call.c (build_method_call): Likewise. + * decl2.c (setup_vtbl_ptr): Likewise. + * init.c (expand_virtual_init): Likewise. + (build_member_call): Likewise. + (build_delete): Likewise. + (build_vbase_delete): Likewise. + * typeck.c (build_component_addr): Likewise. + (build_c_cast): Likewise. + (build_modify_expr): Likewise. + * cp-tree.h (CONV_NONCONVERTING): Likewise. Add so that we can + distinguish the context in which the conversion appears. Add thrid + argument to build_c_cast. + * cvt.c (cp_convert): Pass whether or not we want to consider + non-converting constructors down to build_method_call. + * decl2.c (reparse_absdcl_as_casts): Add third argument to + build_c_cast. + * gc.c (build_m_desc): Likewise. + * init.c (build_new): Likewise. + * parse.y (expr_no_commas): Likewise. + (primary): Likewise. + * typeck.c (build_x_function_call): Likewise. + (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (build_c_cast): Likewise. + (build_ptrmemfunc): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * init.c (expand_aggr_init): Added LOOKUP_ONLYCONVERTING to + expand_aggr_init_1 as inits are converted to the destination type. + +Tue Dec 13 16:18:57 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * Make-lang.in (cc1plus): Depends on c-pragma.o. + + * Makefile.in (OBJ{DEP,}S): Add ../c-pragma.o. + + * lex.c (check_newline): If the #pragma is not recognized by g++, + try machine-specific ones too. + (handle_sysv_pragma): Copied from c-lex.c. + +Mon Dec 12 23:53:06 1994 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Fix Dec 6th change, build_new likes a + reference better. + +Mon Dec 12 18:01:00 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_binary_op): Lose checks on TYPE_PTRMEMFUNC_P with + IS_AGGR_TYPE, since now they will not both be set on the same type. + + * pt.c (do_pending_expansions): Don't clear TREE_PUBLIC on + instantiations controlled by -fexternal-templates. + + * decl.c (duplicate_decls): Don't complain about different values of + __attribute__ ((const)) and ((noreturn)). + +Fri Dec 9 18:17:37 1994 Doug Evans <dje@cygnus.com> + + * Makefile.in (BISONFLAGS): Delete --yacc. + (PARSE_H): Depend on $(PARSE_C), for parallel makes. + (PARSE_C): Undo last patch. + +Fri Dec 2 10:44:36 1994 Mike Stump <mrs@cygnus.com> + + * Makefile.in (BISONFLAGS): Add --yacc so that output winds up in + y.tab.c. + +Thu Dec 8 17:39:46 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (finish_decl): Don't call obscure_complex_init for decls + of indeterminate size. + +Wed Dec 7 16:49:22 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (obscure_complex_init): Function to tweak the decl to + prevent expand_decl from tring to initialize it. + (finish_decl): Use it rather than writing the same code in three + different places. + + * parse.y (bad_parm): Stop trying to support parms without types. + +Wed Dec 7 12:06:56 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (grokfield): Make asm specs on static member functions + work. + +Tue Dec 6 15:43:20 1994 Mike Stump <mrs@cygnus.com> + + * except.c (expand_throw): Make a copy of the thrown object. + +Tue Dec 6 14:16:34 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * parse.y: : has lower precedence than =. + +Tue Dec 6 12:46:17 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (pushdecl): Use DECL_NAME of VAR_DECLs to avoid namespace + manglings. + (grokvardecl): Add namespace into variable name. + +Tue Dec 6 11:26:55 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (current_namespace_id): New routine to transform a simple + name into a name in a namespace. + * decl.c (grokdeclarator): Use it. + * decl2.c (get_namespace_id): Find the name of the current + namespace. + (push_namespace, pop_namespace): Complete out missing + functionality. + +Mon Dec 5 17:11:51 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * class.c (finish_struct): Don't use LONG_LONG_TYPE_SIZE, as it may + not be defined. Fix warning message for enums and restore warning + for non-enums. + + * decl2.c (push_namespace): Dummy function. + (pop_namespace): Likewise. + (do_namespace_alias): Likewise. + (do_using_decl): Likewise. + (do_using_directive): Likewise. + + * parse.y: New token NSNAME for namespace names. + (extdef): Add namespace, using definitions. + (using_decl): New rule for using declarations. + (any_id): New rule for identifiers with any degree of scoping. + (identifier): Add NSNAME. + (notype_identifier): Likewise. + (component_decl): Add using_decl. + (nested_name_specifier): Add NSNAME SCOPE. + + * typeck.c (convert_for_assignment): Handle conversions between + enums and bool. + + * decl.c (duplicate_decls): Only propagate DECL_MAIN_VARIANT on + FUNCTION_DECLs. + +Mon Dec 5 13:03:16 1994 Mike Stump <mrs@cygnus.com> + + * class.c (finish_struct): Give an error if one tries to declare a + bit-field's size greater than a long long, as the backend will dump. + It is not an error to declare an enum bit-field greater than its + precision. Warn if an enum bit-field is too small to hold all + its values. + +Mon Dec 5 11:41:50 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (convert_for_assignment): Use cp_convert instead of + convert so that we don't get static casts. + +Sun Dec 4 11:59:01 1994 Mike Stump <mrs@cygnus.com> + + * cvt.c (cp_convert): Don't complain about int->enum conversion if + we are doing static casts. + +Fri Dec 2 18:32:41 1994 Mike Stump <mrs@cygnus.com> + + * error.c (dump_expr): Do something more intelligent with SAVE_EXPRs + when dumping expressions in error messages. + +Fri Dec 2 17:04:27 1994 Mike Stump <mrs@cygnus.com> + + * gc.c (build_dynamic_cast): Change interface to libg++, ensure that + the return type is the right type, and make references work. + +Fri Dec 2 16:36:43 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (poplevel): Don't be confused by function-scope + declarations of non-nested functions. + (duplicate_decls): Propagate DECL_MAIN_VARIANT. + (pushdecl): Use duplicate_decls to copy info from old decl into new + function-scope one rather than doing it here. + + * decl2.c (mark_inline_for_output): Deal with the DECL_MAIN_VARIANT + of this decl, in case this is a function-scope declaration. + + * decl.c (finish_enum): Make sure that the type has the right + precision when we call fixup_*_type. + +Tue Nov 29 19:12:07 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (build_up_reference): Strip superfluous NOP_EXPRs; we do + want to build up references to rvalues if possible. + (cp_convert): Stick on a NOP_EXPR when converting to the same type. + +Tue Nov 29 11:28:59 1994 Mike Stump <mrs@cygnus.com> + + * parse.y (maybe_raises): Handle throw (). + * parse.y (ansi_raise_identifier): grok type-ids in exception + specifications. + * tree.c (build_exception_variant): Use list compare to check if + two exception specifications match. + * decl.c (duplicate_decls, bad_specifiers): Enhance wording on error + messages. + * call.c (build_method_call): Remove TREE_RAISES. + * cvt.c (convert_to_aggr): Likewise. + * typeck.c (build_function_call_real, convert_arguments): Likewise. + * init.c (expand_aggr_init_1): Likewise. + +Tue Nov 29 09:50:39 1994 Mike Stump <mrs@cygnus.com> + + * except.c: Add support for m68k and mips exception handling + support. + +Tue Nov 29 08:48:33 1994 Mike Stump <mrs@cygnus.com> + + * except.c (expand_end_all_catch): Throw into outer context, if we + fall off end of catch handlers. + +Mon Nov 28 16:44:41 1994 Mike Stump <mrs@cygnus.com> + + * Makefile.in: Make is easier to decide where parse.[ch] will be + built. + +Thu Nov 17 20:11:24 1994 Doug Evans <dje@cygnus.com> + + * cp/Make-lang.in (CXX_INSTALL_NAME) Use program_transform_name. + (GXX_INSTALL_NAME) Likewise. + (CXX_CROSS_NAME) Use program_transform_cross_name. + (GXX_CROSS_NAME) Likewise. + (c++.install-man): Use program_transform_name on g++.1. + (c++.uninstall): Likewise. + +Mon Nov 28 13:53:03 1994 Mike Stump <mrs@cygnus.com> + + * parse.y (THROW): Fix precedence of throw expressions. + +Mon Nov 28 13:15:16 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (build_unary_op): Allow promotions from bool to int on + unary ~. + +Sun Nov 27 00:16:21 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (build_overload_name): Use DECL_ASSEMBLER_NAME for + classes when appropriate. + (build_overload_nested_name): When dealing with a function context, + use ASM_FORMAT_PRIVATE_NAME to tweak the name of the function to + avoid conflicts between local classes of the same name. + +Wed Nov 23 17:59:42 1994 Mike Stump <mrs@cygnus.com> + + * gxx.gperf, parse.y, lex.h, hash.h, lex.c (init_lex), delc.c + (duplicate_decls, grokdeclarator), cp-tree.h: Add support for + `explicit'. + * cvt.c (convert_to_reference, cp_convert, build_type_conversion_1, + build_type_conversion): Use LOOKUP_ONLYCONVERTING in + build_method_calls so that non-converting constructors are not used. + * call.c (build_method_call): If we shouldn't use a non-converting + constructor, then don't. + +Wed Nov 23 14:46:56 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_method_call): Don't try to synthesize methods yet. + +Tue Nov 22 12:45:21 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (push_template_decls): Create CONST_DECLs for template + constant parameters, not VAR_DECLs. + +Sat Nov 19 15:28:31 1994 Jim Wilson <wilson@chestnut.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Can shorten shift only if + shift count is less than size in bits of arg0. + +Thu Nov 17 15:30:50 1994 Mike Stump <mrs@cygnus.com> + + * gxx.gperf, hash.h, lex.c (init_lex, real_yylex), parse.y: Add new + ANSI keywords and, and_eq, bitand, bitor, explicit, namespace, not, + not_eq, or, or_eq, typename, using, xor, xor_eq to g++. Still need + to add support for explicit, namespace, typename, and using, support + for the rest is already in. + +Fri Nov 4 19:04:18 1994 Mike Stump <mrs@cygnus.com> + + * gc.c (get_bad_cast_node): New routine to support compile time + throws of bad_cast. + * gc.c (build_dynamic_cast): Support throwing of bad_cast at compile + time. + +Fri Nov 4 11:12:00 1994 Mike Stump <mrs@cygnus.com> + + * except.c: Add hppa support. + +Fri Nov 4 10:50:50 1994 Mike Stump <mrs@cygnus.com> + + * except.c: Add rs6000 support. + +Thu Nov 3 14:24:23 1994 Mike Stump <mrs@cygnus.com> + + * except.c (do_unwind): Add i[34]86 support. + +Thu Nov 3 00:10:46 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (do_pending_expansions): Unset TREE_PUBLIC on implicit + instantiations. + +Wed Nov 2 15:08:24 1994 Kung Hsu <kung@mexican.cygnus.com> + + * decl.c (finish_function): Emit types used in method parameters + into symbol table. + +Wed Nov 2 15:05:47 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (process_template_parm): Allow pointer to member function + template parameter types. + (uses_template_parms): Handle pointer to member function + CONSTRUCTORs. + + * g++.c (main): Cast first argument of bzero to (char *). + Pass -lstdc++ instead of -lg++ unless we are invoked as 'g++'. + +Mon Oct 31 14:50:48 1994 Kung Hsu <kung@mexican.cygnus.com> + + * gc.c (build_dynamic_cast): rewrite to make it work. + * class.c (finish_vtbls): build more vtables if flag_rtti is on. + * class.c (modify_all_direct_vtables): ditto. + * init.c (expand_direct_vtbls_init): expand more vtables if + flag_rtti is on. + * decl.c (init_type_desc): add default return. + +Tue Oct 25 17:13:09 1994 Kung Hsu <kung@mexican.cygnus.com> + + * tree.c (debug_binfo): get rid of the initial size entry of + vtable. + * cp-tree.h: change flag_dossier to flag rtti, define type + descriptor type nodes. + * decl.c (init_type_desc): new function to initialize type + descriptor type nodes. + * decl.c (record_builtin_type): change flag_dossier to flag_rtti. + * lex.c (init_lex): ditto. + * decl.c : change variable flag_dossier to flag_rtti. + * decl.c (duplicate_decls): get rid initial size entry of vtable. + * decl.c (hack_incomplete_structures): take out assert 164. + * search.c (get_abstract_virtuals_1): ditto. + * search.c (dfs_init_vbase_pointers): change CLASSTYPE_DOSSIER to + CLASSTYPE_RTTI. + * parse.y: ditto. + * class.c (prepare_fresh_vtable): for virtual bases, get right + offset. + * class.c (add_virtual_function): change flag_dossier to + flag_rtti. + * class.c (modify_one_vtable): modify the right rtti entry. + * class.c (override_one_vtable): get rid of size entry. + * class.c (finish_struct): change flag_dossier to flag_rtti, and + build extra vtables, build type descriptors for polymorphic + classes. + * gc.c (build_headof): make headof() works correctly with new + rtti. + * gc.c (build_typeid): make this function work with new rtti. + * gc.c (get_typeid): make this function work with new rtti. + * gc.c (build_bltn_desc): new function for new rtti. + * gc.c (build_user_desc): ditto. + * gc.c (build_class_desc): ditto. + * gc.c (build_ptr_desc): ditto. + * gc.c (build_attr_desc): ditto. + * gc.c (build_func_desc): ditto. + * gc.c (build_ptmf_desc): ditto. + * gc.c (build_ptmd_desc): ditto. + * gc.c (build_t_desc): ditto. + * gc.c : comment out old build_t_desc, build_i_desc, build_m_desc. + +Tue Oct 25 13:37:41 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (convert_harshness): Check for TREE_UNSIGNED differences + after checking for integral conversions. + +Wed Nov 30 19:13:50 1994 Mike Stump <mrs@cygnus.com> + + * Version 2.6.3 released. + +Thu Nov 17 10:56:50 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck2.c (build_m_component_ref): Check the basetype of the + member pointer against the main variant of the object type. + +Mon Nov 14 14:21:52 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (convert_to_reference): Make sure that the original expr + gets its type back when converting a reference. + + * method.c (build_overload_name): Clear numeric_outputed_need_bar here. + (build_decl_overload): Instead of here. + +Tue Nov 8 17:11:24 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a + function. + + * typeck.c (convert_for_initialization): Handle initialization from + a TARGET_EXPR. + +Sun Nov 6 01:34:24 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (lookup_nested_type_by_name): Fix list-walking logic. + (tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate + TYPE_READONLY and TYPE_VOLATILE from the argument. + (unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals + present in parm from arg. + (type_unification): Strip REFERENCE_TYPE from the argument type. + (unify): Don't strip REFERENCE_TYPE from the argument type. + +Sat Nov 5 22:42:15 1994 Greg McGary <gkm@magilla.cichlid.com> + + * pt.c (do_type_instantiation): Check to see if there's a + IDENTIFIER_TEMPLATE on a class before calling + instantiate_member_templates(). + +Sat Nov 12 06:35:42 1994 Mike Stump <mrs@cygnus.com> + + * Version 2.6.2 released. + +Thu Nov 3 18:48:19 1994 Paul Eggert <eggert@twinsun.com> + + * Makefile.in (spew.o, lex.o, pt.o): + Depend on $(srcdir)/parse.h, not parse.h. + +Tue Nov 1 19:19:41 1994 Mike Stump <mrs@cygnus.com> + + * Version 2.6.1 released. + +Sun Oct 23 13:19:55 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c: Declare flag_access_control. + (struct lang_f_options): Add access-control. + * expr.c (cplus_expand_expr, NEW_EXPR): Unset flag_access_control + for the call to expand_aggr_init to copy the object out of the + pcc_struct_return slot. + * search.c (compute_access): if (!flag_access_control) return + access_public. + +Fri Oct 21 00:32:54 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * lex.c (cons_up_default_function): Don't try to defer method + synthesis now. + + * decl.c (init_decl_processing): Use __pure_virtual for abort_fndecl + instead of abort, since the OSF/1 dynamic linker doesn't like to see + relocation entries for abort. + + * tree.c (array_type_nelts_total): Use sizetype, not + integer_type_node. + (array_type_nelts_top): Likewise. + +Thu Oct 20 15:48:27 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (grokdeclarator): Added handling for catch parameters + (CATCHPARM). + * except.c (expand_start_catch_block): Use the new CATCHPARM context + instead of NORMAL. + * except.c (expand_throw): Don't let convert_to_reference complain + about what we are doing. + +Thu Oct 20 12:55:24 1994 Jim Wilson <wilson@cygnus.com> + + * method.c (emit_thunk): Call instantiate_virtual_regs. + +Wed Oct 19 14:15:33 1994 Mike Stump <mrs@cygnus.com> + + * except.c (expand_exception_blocks): Make sure throw code doesn't + get put in function that won't be output. + +Mon Oct 17 18:03:15 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (init_decl_processing): Make alloca a builtin. + +Thu Oct 27 21:10:25 1994 Craig Burley <craig@burley> + + * g++.c (main): Only decrement "added" and set "library" to + NULL when "library" != NULL (just like 940829 fix). + +Mon Oct 17 15:56:11 1994 Mike Stump <mrs@cygnus.com> + + * except.c (expand_start_catch_block): Make sure the false label + gets onto the permanent obstack, as it is used for the exception + table. + +Fri Oct 14 18:54:48 1994 Mike Stump <mrs@cygnus.com> + + * class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can + be set just below, use current_fndecl instead. + +Fri Oct 14 15:12:22 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * init.c (expand_aggr_vbase_init_1): Don't call expand_aggr_init_1 + with LOOKUP_SPECULATIVELY. + (expand_default_init): Abort if build_method_call returns NULL_TREE. + + * typeck.c (build_modify_expr): Don't just build a MODIFY_EXPR if + the rhs is a TARGET_EXPR. + + * parse.y (left_curly): Anonymous types are not affected by #pragma + interface/implementation. + + * method.c (synthesize_method): Don't call setup_vtbl_ptr for the + default constructor if it isn't needed. + + * lex.c (cons_up_default_function): Do synthesize methods for + anonymous types if necessary. + +Thu Oct 13 17:44:55 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (build_decl_overload): Set numeric_outputed_need_bar to 0. + +Wed Oct 12 13:27:57 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * typeck.c (build_modify_expr): Understand how to copy an aggregate. + + * init.c (expand_default_init): Likewise. Also remove some of the + crufty code that assumes methods will not be synthesized properly. + + * lex.c (cons_up_default_function): If the containing type has no + name, these functions should never need to be called, so just + declare them. + + * lex.c (real_yylex): Use HOST_BITS_PER_WIDE_INT to determine the + bitmask for lexing character constants. + + * call.c (build_method_call): Disable code that tries to do tricky + stuff with a default parameter that is a constructor call, but + actually does other tricky stuff that breaks things. + +Wed Oct 12 16:14:01 1994 Benoit Belley <belley@cae.ca> + + * decl.c (finish_enum): Disable code which forces enums to be signed, + since this conflicts with their use as bitfields. type_promotes_to + handles promotion of enums of underlying unsigned types to signed + integer types. + +Wed Oct 12 13:24:03 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * cvt.c (type_promotes_to): Also promote enums to long if + appropriate. + + * typeck.c (default_conversion): Don't expect type_promotes_to to + return a main variant. + +Wed Oct 12 12:19:45 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_scoped_method_call): Don't lose side effects in the + object expression when calling a non-existent destructor. + +Fri Sep 2 19:05:21 1994 Rohan Lenard <rjl@iassf.easams.com.au> + + * call.c (build_scoped_method_call): Remove erroneous error message + when destructor call is written as a scoped call. + +Tue Oct 11 23:48:31 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * various: Cast pointer arguments to bzero and bcopy to char *. + +Tue Oct 11 19:34:32 1994 Mike Stump <mrs@cygnus.com> + + * class.c (get_derived_offset): Added a type parameter to limit how + far up the CLASSTYPE_VFIELD_PARENT chain we search. + * class.c (modify_one_vtable, fixup_vtable_deltas): When forming the + offset to put into the vtable for the this parameter, make sure we + don't offset from a parent of the DECL_CONTEXT of the function. + +Tue Oct 11 16:10:52 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * pt.c (do_function_instantiation): Set DECL_EXTERNAL and + TREE_STATIC when setting DECL_INTERFACE_KNOWN. + (do_type_instantiation): Likewise. + + * lex.c (cons_up_default_function): Set DECL_INTERFACE_KNOWN, + DECL_EXTERNAL and TREE_STATIC as appropriate. + + * decl2.c (finish_file): Also synthesize methods that don't have + DECL_EXTERNAL set. Set interface_unknown before doing so. + + * decl.c (start_function): If DECL_INTERFACE_KNOWN is set on the + function decl, don't muck with TREE_PUBLIC and DECL_EXTERNAL. + +Mon Oct 10 00:56:53 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * lex.c (cons_up_default_function): Mark methods in a template class + as template instances. Store the values of interface_unknown and + interface_only for do_pending_inlines. + (do_pending_inlines): Use them. + + * decl2.c (finish_file): If we haven't seen a definition of a + function declared static, make the decl non-PUBLIC so compile_file + can give an error. + +Sun Oct 9 02:42:29 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * method.c (do_build_copy_constructor): Handle anonymous unions. + (do_build_assign_ref): Likewise. + (largest_union_member): Move from lex.c. + +Sat Oct 8 14:59:43 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + Re-implement g++'s vague linkage independent of TREE_PUBLIC. + * pt.c (instantiate_member_templates): Lose redundant + -fexternal-templates handling. + (tsubst): Set TREE_PUBLIC and DECL_EXTERNAL on new decls. Don't set + TREE_STATIC or DECL_INTERFACE_KNOWN. + (do_pending_expansions): Predicate on DECL_INTERFACE_KNOWN instead + of DECL_EXTERNAL for explicit instantiations. + (do_function_instantiation): Do the new thing. + (do_type_instantiation): Likewise. + (instantiate_template): Deal with member templates defined in a .cc + file with -fexternal-templates. + * except.c (expand_exception_blocks): Use DECL_LINKAGE_KNOWN to + decide whether to stick builtin_throw here. + * decl2.c (import_export_inline): Predicate on DECL_INTERFACE_KNOWN + rather than TREE_PUBLIC. Generally fix rules. + (finish_file): Use DECL_INITIAL to determine whether or not a method + has been synthesized, rather than TREE_ASM_WRITTEN. + * decl.c (warn_extern_redeclared_static): Use DECL_PUBLIC instead of + TREE_PUBLIC. + (pushdecl): Likewise. + (duplicate_decls): Likewise. Deal with DECL_DECLARED_STATIC and + DECL_INTERFACE_KNOWN. + (redeclaration_error_message): Fix checking for conflicting linkage. + (define_function): Set DECL_INTERFACE_KNOWN. + (grokfndecl): Function decls are PUBLIC until we are sure about + their linkage. Set DECL_DECLARED_STATIC as needed. + (start_function): Deal with linkage. Move pushdecl after linkage + magic. + (finish_function): Don't set TREE_ASM_WRITTEN on discarded inlines. + * cp-tree.h (lang_decl_flags): Add interface_known and + declared_static. + (DECL_INTERFACE_KNOWN): New macro. + (DECL_DECLARED_STATIC): New macro. + (DECL_PUBLIC): New macro. + + Clean up bogus use of TREE_PUBLIC. + * class.c (alter_access): Fix mistaken use of TREE_PUBLIC (it + doesn't correspond to TREE_PROTECTED and TREE_PRIVATE). + * init.c (do_friend): Don't arbitrarily set TREE_PUBLIC. + +Wed Oct 5 13:44:41 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * call.c (build_overload_call_real): Don't immediately do + array->pointer conversion. + + * pt.c (type_unification): If not passing to a reference, strip + cv-quals. Also handle array->pointer conversion. + +Tue Oct 4 17:45:37 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grokdeclarator): Don't warn about applying const to a + const typedef or template type parameter. + + * decl2.c (finish_file): Also synthesize methods after walking the + vtables. Ugly ugly ugly. + +Mon Oct 3 15:02:41 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * various: Remove lingering remnants of old exception handling code. + + * decl2.c (finish_file): Synthesize methods before walking the + vtables, so that the vtables get emitted as needed. + + * decl.c (shadow_tag): Remove obsolete code for pushing tags and + dealing with exceptions. + +Mon Oct 3 13:05:27 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> + + * Make-lang.in (g++-cross): Depend upon version.o and $(LIBDEPS). + +Mon Oct 3 02:59:28 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl2.c (finish_file): Fix inline handling. + +Sun Oct 2 00:21:56 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + * decl.c (grokdeclarator): Handle redundant scope even better. + ({push,pop}_cp_function_context): Take toplev parameter. + + * method.c (synthesize_method): Pass toplev parameter to + {push,pop}_cp_function_context depending on decl_function_context + (fndecl). + + * typeck.c (build_x_unary_op): Unary & on OFFSET_REFs is always the + built-in version. + + * method.c (synthesize_method): Don't be confused by __in_chrg + parameter. + + * class.c (popclass): Set C_C_D like start_function does. + + * decl.c (grokdeclarator): Handle redundant scope better. + + * parse.y (expr_or_declarator): Add '(' expr_or_declarator ')' rule. + (direct_notype_declarator): Likewise. + (complex_direct_notype_declarator): Remove it here. + +Sat Oct 1 21:42:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (resolve_offset_ref): Fix types used in resolving .* + expressions. + +Sat Oct 1 15:18:49 1994 Jason Merrill <jason@phydeaux.cygnus.com> + + Beginnings of work to synthesize methods only when needed. + * call.c (build_method_call): Synthesize methods as necessary + (currently never necessary). + * class.c (popclass): Don't try to set C_C_D here, as it'll end up + on the wrong obstack. + * decl.c (push_cp_function_context): Mostly copied from + push_c_function_context. + (pop_cp_function_context): Similarly. + (finish_function): Reverse order of poplevel and pop_nested_class so + that current_class_decl is restored properly. + (start_function): Likewise. + (finish_function): Add parameter 'nested'. Don't call + permanent_allocation if (nested). + * various: Pass extra parameter to finish_function. + * decl2.c (finish_file): Reorganize end-of-file inline handling, + synthesizing methods as necessary. + * lex.c (cons_up_default_function): Call mark_inline_for_output. + Only synthesize methods immediately if #pragma implementation + (currently disabled). + (do_pending_inlines): Call synthesize_method. + * method.c (synthesize_method): New function; all method synthesis + goes through here. Calls do_build_assign_ref and + do_build_copy_constructor. + (build_default_constructor): Remove. + (build_dtor): Likewise. + (build_assign_ref): Rename to do_build_assign_ref and remove stuff + done by synthesize_method. + (build_copy_constructor): Similarly. + +Thu Sep 29 16:58:52 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (c_expand_return): Use magic so the backend can fixup the + assignment into the return register, so cleanups won't clobber it. + +Thu Sep 29 13:08:50 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (hack_identifier): Don't call assemble_external for + template decls. + + * decl.c (finish_decl): Also end temporary allocation if the decl in + question has a type of error_mark_node. + +Wed Sep 28 21:45:00 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure + that if the ?: was a reference type, that the subparts will be also. + +Wed Sep 28 16:14:04 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * except.c (register_exception_table): Use Pmode, not PTRmode. + +Fri Sep 23 13:54:27 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (do_pending_inlines): Do method synthesis after the + pending_inlines have been reversed. + +Thu Sep 22 12:53:03 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl2.c (finish_file): Fix Brendan's fix: Only call + register_exception_table if there is a non-empty exception table. + +Thu Sep 22 12:03:46 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl2.c (finish_file): Only do register_exception_table if + -fhandle-exceptions is being used. + +Wed Sep 21 19:01:51 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * except.c (output_exception_table_entry): Simplify + by using assemble_integer. + (build_exception_table): Change to return a count. + Cleanup to use standard macros, instead of hard-wired + sparc asm format. Don't make __EXCEPTION_TABLE__ global. + (register_exception_table): New function. Generate call to builtin. + * decl2.c (finish_file): Call register_exception_table. + * cp-tree.h (build_exception_table): Fix prototype. + +Wed Sep 21 13:20:42 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * tree.c (break_out_calls): Don't try to duplicate the DECL_INITIAL. + + * decl2.c (delete_sanity): Give an error at trying to delete a + function. + +Wed Sep 21 11:47:10 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (cons_up_default_function): Mark synthesized destructors + inline. + + * decl.c (duplicate_decls): Ignore redeclarations of wchar_t as + something other than __wchar_t, complaining if -pedantic and not in + a system header. + +Tue Sep 20 09:43:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (xref_tag): Set up BINFO_INHERITANCE_CHAIN on base binfos + here. + + * typeck.c (build_modify_expr): Require complete type after checking + for error_mark_node. + + * call.c (build_method_call): Print parmtypes when complaining of + ambiguous call. + + * typeck.c (build_modify_expr): Handle assignment to array from + non-array. + + * decl.c (lookup_name_real): Deal with got_scope == error_mark_node. + + * call.c (build_method_call): Don't bother with the exact match. + +Mon Sep 19 00:51:39 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (expand_aggr_init): If we munge the type of the variable, + also munge the type of the initializer. + + * decl.c (grokdeclarator): Use <= when comparing to RID_LAST_MODIFIER. + (init_decl_processing): Push artificial declaration of wchar_t so + people don't have to declare it before they can use it. + + * error.c (cp_line_of): return lineno in lieu of 0. + + * typeck.c (convert_for_assignment): Handle conversion of pmfs to + int and bool. + (build_component_ref): Fold the COMPONENT_REF in case it can be + reduced. + + * typeck2.c (store_init_value): Don't pedwarn about non-constant + bracketed initializers for automatic variables. + +Sun Sep 18 10:12:12 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_decl): Don't say `typedef enum foo foo'. + + * decl.c (start_decl): Don't set TREE_PUBLIC on template decls just + because they're affected by #pragma i/i. We'll deal with that when + they get instantiated. + + * typeck.c (build_unary_op): Clean up cruft in ADDR_EXPR case. + + * class.c (instantiate_type): Set TREE_CONSTANT on instantiated + ADDR_EXPRs if appropriate. + + * decl.c (build_ptrmemfunc_type): Unset IS_AGGR_TYPE on pmf types. + + * typeck.c (build_ptrmemfunc): Handle &overloaded_method as an + initializer properly. + * typeck2.c (digest_init): Likewise. + + * tree.c (cp_build_type_variant): Like c_build_type_variant, except + it uses build_cplus_array_type. + * *.c: Use cp_build_type_variant instead of c_build_type_variant. + + * pt.c (do_type_instantiation): Don't try to instantiate nested + enums. + +Tue Sep 13 10:56:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_up_reference): Handle preincrement and predecrement + properly. + +Tue Sep 13 09:51:59 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (finish_decl): Only lay out the rtl for DECL if it is, in + fact, static. + +Mon Sep 12 14:40:30 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (finish_decl): Lay out the rtl for DECL before doing + grok_reference_init, in case it's static. + +Mon Sep 12 12:45:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Don't synthesize constructors if the + class has a field with the same name as the class. Don't die on + classes with no constructors or destructors. Don't die if the head + and tail of the class are in different files. + + * decl.c (grokdeclarator): Don't treat a function pointer field + with the same name as the class as a constructor. + +Fri Sep 9 13:17:00 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_c_cast): Pull constant values out of their + variables here. + + * decl.c (duplicate_decls): Only propagate DECL_CHAIN in + FUNCTION_DECLs and TEMPLATE_DECLs. + +Thu Sep 8 10:07:48 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (duplicate_decls): Propagate DECL_CHAIN in all DECLs that + have it. + + * pt.c (unify): REALs and INTEGERs only unify with their own genus. + (instantiate_member_templates): Don't muck with DECL_EXTERNAL and + TREE_PUBLIC unless -fexternal-templates. + +Wed Sep 7 13:17:10 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (do_type_instantiation): Call instantiate_member_templates. + Deal with specializations. + (tsubst): Don't stick the mangled name in DECL_NAME for function + instantiations. Don't push them, either. + + * decl2.c (grokfield): Move code for generating the + DECL_ASSEMBLER_NAME for static members from here. + * method.c (build_static_name): To here. + * decl.c (grokvardecl): Call build_static_name. + (duplicate_decls): Keep old DECL_ASSEMBLER_NAME. + +Mon Sep 5 12:49:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): if -Wsynth, warn when selecting + synthesized op= over user-supplied one cfront would select. + * decl2.c (lang_decode_option): Handle -Wsynth. + +Fri Sep 2 15:11:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (finish_enum): Overhaul to fix several bugs. + (start_enum): Disable useless code. + +Thu Sep 1 16:04:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (c_expand_return): Warn about returning a reference to a + temporary. + (convert_arguments): Increment argument counter when using default + arguments, too. + +Wed Aug 31 14:29:22 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (finish_decl): If the type of decl is error_mark_node, + don't bother trying to do anything. + + * typeck.c (convert_for_initialization): If the rhs contains a + constructor call, pretend the lhs type needs to be constructed. + + * init.c (expand_default_init): If we stick the object inside the + initializer, mark the initializer used. + +Tue Aug 30 13:50:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (build_assign_ref): return *this; + (build_assign_ref): Fix base assignment order. + (build_copy_constructor): Fix member init order. + +Mon Aug 29 13:54:39 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * g++.c (main): Remember to clear out SAW_SPECLANG after we see + its argument. + +Sat Aug 27 09:36:03 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (build_copy_constructor): Also copy virtual bases. + +Fri Aug 26 17:05:15 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (do_pending_inlines): Clear out pending_inlines before doing + any synthesis. Also first set deja_vu on all pending_inlines. + + * method.c (build_assign_ref): Use build_member_call to invoke base + operator=, rather than build_modify_expr. And use + build_reference_type instead of TYPE_REFERENCE_TO. + (build_copy_constructor): Use TYPE_NESTED_NAME to identify the + basetype. + + * decl2.c (grokfield): Don't complain about undefined local class + methods. + + * class.c (finish_struct): Don't try to synthesize methods here. + * lex.c (do_pending_inlines): Instead, synthesize them here. + (init_lex): Initialize synth_obstack. + (cons_up_default_function): Stick synthesis request on + pending_inlines. + +Fri Aug 26 12:24:14 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * call.c (build_method_call) [PCC_STATIC_STRUCT_RETURN]: Also + accept an RTL_EXPR in what we're about to use for the instance, + since anything which would end up with pcc_struct_return set + inside cplus_expand_expr. + + * cp-tree.h (cons_up_default_function): Note change of prototype. + +Thu Aug 25 23:05:30 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * class.c (finish_struct): Undid change from Aug 21 testing + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. + * parse.y (left_curly): Likewise, undid change from Aug 21. + * decl.c (xref_tag): Undid change from Aug 21, set + CLASSTYPE_INTERFACE correctly, and added comments. + +Thu Aug 25 00:36:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + Rework approach to synthesized methods; don't go through the parser + anymore. + * class.c (finish_struct): Use new synthesis approach. + * lex.c (cons_up_default_function): Now just creates declaration, + not code. + (largest_union_member): #if 0 out. + (default_assign_ref_body): Likewise. + (default_copy_constructor_body): Likewise. + * method.c (build_default_constructor): New function to synthesize X(). + (build_copy_constructor): Synthesize X(X&). + (build_assign_ref): Synthesize X::operator=(X&). + (build_dtor): Synthesize ~X(). + + * error.c (cp_line_of): If we're dealing with an artificial + TYPE_DECL, look at the type instead. + +Wed Aug 24 11:11:50 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (sort_member_init): Check warn_reorder. + * decl2.c (lang_decode_option): Handle -W{no-,}reorder. + + * cp-tree.h (CLASSTYPE_SOURCE_LINE): New macro. + * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates. + * class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE. + +Tue Aug 23 09:28:35 1994 Mike Stump <mrs@cygnus.com> + + * error.c (dump_decl): Improve wording, so that error messages + dont't read template<, class foo>... + +Mon Aug 22 15:30:51 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (label_colon): Also match a TYPENAME as a label name, + since they may have declared a class by that name but have also + tried to have a local label under the same name. + + * pt.c (coerce_template_parms): Call cp_error, not cp_error_at, + for the message so they know at what point it was instantiated. + +Sun Aug 21 23:07:35 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING for signatures up to left_curly time. + * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING for signatures down to left_curly time. + * parse.y (left_curly): New final resting place for setting + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING for signatures. + + * class.c (finish_struct): Don't test for function/field name + conflicts in signatures, since all the fields are compiler-constructed. + +Fri Aug 19 14:04:47 1994 Kung Hsu <kung@mexican.cygnus.com> + + * method.c (build_overload_nested_name): in qualified name + mangling, the template with value instantiation will have numeric + at end and may mixed with the name length of next nested level. + Add a '_' in between. + * method.c (build_overload_name): ditto. + * method.c (build_overload_identifier): ditto. + +Thu Aug 18 16:24:43 1994 Mike Stump <mrs@cygnus.com> + + * error.c (dump_decl): Handle NULL args. + +Thu Sep 29 16:15:36 1994 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu> + + * g++.c: Rework last change so it's done like collect.c (and + gcc.c). + +Wed Sep 14 10:17:27 1994 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu> + + * g++.c: Include <sys/errno.h> in case `errno' is a macro + as permitted by ANSI C. + +Thu Aug 18 12:48:09 1994 Mike Stump <mrs@cygnus.com> + + * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time. + * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING down to left_curly time. + * parse.y (left_curly): New final resting place for setting + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. + +Thu Aug 11 11:32:42 1994 H.J. Lu <hjl@nynexst.com> + + * g++.c (main): Only decrement "added" and set "library" to + NULL when "library" != NULL. + +Sat Aug 13 00:14:52 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Don't set TREE_PUBLIC on a function decl + just because its class has a known interface. + (decls_match): Deal with new format of template parms. + + * lex.c (cons_up_default_function): Don't play with TREE_PUBLIC and + DECL_EXTERNAL here. + +Fri Aug 12 01:55:15 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (pushtag): SET_DECL_ARTIFICIAL on gratuitous typedefs. + (xref_defn_tag): Likewise. + (pushdecl): Only allow artificial typedefs to be shadowed. + + * init.c (emit_base_init): Pass the right binfos to + expand_aggr_init_1. + + * class.c (delete_duplicate_fields_1): Make it work right. + (finish_struct): Catch function/field name conflict. + + * decl2.c (check_classfn): Pass the function to cp_error, not just + the name. + + * init.c (sort_member_init): Warn when order of member initializers + does not match order of member declarations. + (emit_base_init): Call expand_aggr_init_1 with LOOKUP_PROTECT. + + * error.c (dump_expr): Handle lists of functions. + + * decl.c (start_function): #pragma interface only affects functions + that would otherwise be static. + (finish_decl): Don't warn about an unused variable if it has both + constructor and destructor, since the 'resource allocation is + initialization' idiom is relatively common. + + * typeck.c (comp_target_types): Don't handle TEMPLATE_TYPE_PARMs. + (comp_target_parms): Likewise. + (compparms): Never consider default parms. + (common_base_type): Don't choose a virtual baseclass if there is a + more derived class in common. + (build_conditional_expr): If pedantic, pedwarn about conversion to + common base in conditional expr. + + * class.c (instantiate_type): Handle template instantiation better. + + * typeck.c (convert_arguments): Don't try to get tricky and convert + to int directly when PROMOTE_PROTOTYPES is set, as it breaks + user-defined conversions. + + * lex.c (check_for_missing_semicolon): Also give error at end of + file. + + * call.c (build_method_call): Don't promote arrays to pointers here. + + * typeck.c (convert_arguments): Don't require the actual parameter + to be of a complete type if the formal parameter is a reference. + +Thu Aug 11 15:21:40 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Soften 'static' on member function error + to pedwarn. + + * init.c (build_new): Don't automatically save rval. + (build_offset_ref): Do field lookup with proper basetype_path. + +Thu Aug 11 12:46:54 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * errfn.c (cp_silent): Declare to mark when we should avoid + emitting warnings and errors. + (cp_error): Check it. + (cp_warning): Likewise. + (cp_pedwarn): Likewise. + (cp_compiler_error): Likewise. + (cp_error_at): Likewise. + (cp_warning_at): Likewise. + (cp_pedwarn_at): Likewise. + * call.c (compute_conversion_costs): Set CP_SILENT when we start + out, and make sure we turn it off before we leave. + +Thu Aug 11 00:02:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (grok_array_decl): Try computing *(A+B) if neither + argument is obviously an array. + +Wed Aug 10 15:32:04 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (c_expand_start_case): Do cleanups here. + + * parse.y (xcond): Do bool conversion here, too. + (simple_stmt, SWITCH case): Don't do cleanups here. + + * decl.c (duplicate_decls): Don't treat builtins that have been + explicitly declared specially. + +Tue Aug 9 01:16:09 1994 Jason Merrill <jason@deneb.cygnus.com> + + * tree.c (make_deep_copy): Support copying pointer, reference, + function, array, offset and method types. + + * decl.c (init_decl_processing): Mark exit and abort as + BUILT_IN_NONANSI so that duplicate_decls is kinder about + redeclaration. + (duplicate_decls): Don't give two errors for redeclaring a C + function with the same parms but a different return type. + + * parse.y (paren_cond_or_null): Do cleanup and bool conversion here. + (condition): Instead of here. + (simple_stmt, SWITCH case): Also do cleanup here. + + * decl2.c (finish_anon_union): Only break out FIELD_DECLs. + + * call.c (build_method_call): Don't throw away the side effects of + the object in a call to a non-existent constructor. + * parse.y (primary): Likewise. + + * method.c (build_decl_overload): Oop. + + * decl2.c (lang_decode_option): Deal with flag_no_nonansi_builtin, + warn about uselessness of specifying -fansi-overloading. + + * method.c (build_decl_overload): Treat any non-member new with one + parameter as __builtin_new. + + * decl.c (init_decl_processing): Setup built-in meanings of exit, + _exit and abort. + +Mon Aug 8 15:03:30 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_readonly_or_volatile): Put a space between const and + volatile if both apply. + + * init.c (perform_member_init): Clean up after this initialization. + (emit_base_init): Clean up after each base init, not after all have + been done. + (expand_aggr_vbase_init_1): Clean up after this init. + +Sun Aug 7 14:55:05 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Deal with destroying references. + + * parse.y (condition): Do bool_truthvalue_conversion here. + (paren_expr_or_null): And here. + (simple_if): Not here. + (simple_stmt): Or here. + +Sat Aug 6 22:29:45 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (paren_expr_or_null): Wrap the expression in a + CLEANUP_POINT_EXPR. + (condition): Likewise. + +Sat Aug 6 19:46:37 1994 Rohan Lenard <rjl@easams.com.au> + + * call.c (build_scoped_method_call): Fix error message when + destructor call refers to a nonexistent type. + +Sat Apr 16 22:43:30 1993 Gerald Baumgartner <gb@cs.purdue.edu> + + * lex.h (rid): Deleted RID_RAISES, it's never used. + Moved RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, RID_EXCEPTION, + RID_TEMPLATE and RID_SIGNATURE to the end of the enumeration, + they don't need to be touched in `grokdeclarator.' + (RID_LAST_MODIFIER): Defined macro to be RID_MUTABLE. + + * decl.c (grokdeclarator): Use RID_LAST_MODIFIER instead of + RID_MAX as loop limit for finding declaration specifiers. + +Sat Apr 3 21:59:07 1993 Gerald Baumgartner <gb@cs.purdue.edu> + + * lex.c (debug_yytranslate): Moved to parse.y since it needs to + access `yytname,' which is static in parse.c. + +Fri Apr 2 23:36:57 1993 Gerald Baumgarnter <gb@cs.purdue.edu> + + * cp-tree.h (GNU_xref_ref): Fixed typo in extern declaration, it + was `GNU_xref_def' instead of `GNU_xref_ref.' + +Fri Aug 5 14:20:16 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (do_function_instantiation): Don't set TREE_PUBLIC and + DECL_EXTERNAL on 'extern' instantiations; wait until EOF to do that. + (do_type_instantiation): Likewise. + + * decl2.c (import_export_inline): Decides at EOF what an inline's + linkage should be. + (finish_file): Call it. + + * decl.c (start_function): Don't rely on the settings of TREE_PUBLIC + and DECL_EXTERNAL from do_*_instantiation. Only set + DECL_DEFER_OUTPUT on inlines whose linkage might actually change. + (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to + mark for later consideration, rather than DECL_FUNCTION_MEMBER_P. + +Fri Aug 5 01:12:20 1994 Mike Stump <mrs@cygnus.com> + + * class.c (get_class_offset_1, get_class_offset): New routine to + find the offset of the class where a virtual function is defined, + from the complete type. + * class.c (modify_one_vtable, fixup_vtable_deltas): Use + get_class_offset instead of virtual_offset as get_class_offset will + always provide the right answer. + * tree.c (virtual_offset): Remove. It only ever worked some of the + time. + +Tue Aug 2 12:44:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Put back unary_complex_lvalue call + that I thought was redundant. + + * typeck.c (c_expand_return): Fix a case I missed before. + +Sun Jul 31 17:54:02 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (unify): Strip cv-quals from template type arguments (when + 'const T*' is matched to 'const char*', that does not mean that T is + 'const char'). + +Fri Jul 29 01:03:06 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (do_type_instantiation): Instantiate nested TAGS, not + typedefs. Third time's the charm? + + * parse.y (template_parm): Support default template parms. + * pt.c (process_template_parm): Likewise. + (end_template_parm_list): Likewise. + (coerce_template_parms): Likewise. + (mangle_class_name_for_template): Likewise. + (push_template_decls): Likewise. + (unify): Likewise. + * method.c (build_overload_identifier): Likewise. + * error.c (dump_decl): Likewise. + +Wed Jul 27 17:47:00 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (do_type_instantiation): Only instantiate nested *classes*. + +Tue Jul 26 13:22:40 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (note_debug_info_needed): Also emit debugging information + for the types of fields. + +Mon Jul 25 00:34:44 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (lookup_template_class): Pass 'template' to + coerce_template_parms instead of 'in_decl', since it's a more + meaningful context. + + * typeck.c (c_expand_return): Make sure any cleanups for the return + expression get run. + (build_c_cast): Use CONVERT_EXPR for conversion to void. + + * pt.c (do_type_instantiation): Also instantiate nested types. + + * typeck.c (convert_for_assignment): Don't die when comparing + pointers with different levels of indirection. + + * decl.c (grokdeclarator): The sub-call to grokdeclarator for + class-local typedefs sets DECL_ARGUMENTS, so we need to clear it + out. + + * decl2.c (finish_anon_union): Don't die if the union has no + members. + + * decl.c (grokdeclarator): Undo changes to declspecs when we're done + so that 'typedef int foo, bar;' will work. + + * decl2.c (finish_file): Don't call expand_aggr_init for + non-aggregates. + +Mon Jul 25 00:03:10 1994 Teemu Torma <tot@trema.fi> + + * decl.c (finish_function): We can't inline constructors and + destructors under some conditions with -fpic, but don't unset + DECL_INLINE. + +Mon Jul 25 00:03:10 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_object_ref): Make sure 'datum' is a valid object. + +Sun Jul 24 14:19:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Don't set DECL_FIELD_BITPOS on + non-fields. + (finish_struct_methods): Use copy_assignment_arg_p. + + * cvt.c (cp_convert): If expr is an OFFSET_REF, resolve it instead + of giving an error. + + * typeck.c (build_binary_op_nodefault): Don't set result_type if we + don't know how to compare the operands. + + * decl.c (grokdeclarator): Avoid seg fault when someone uses '__op' + as a declarator-id in their program. Like the Linux headers do. + Arrgh. + + * tree.c (lvalue_p): Treat calls to functions returning objects by + value as lvalues again. + + * typeck.c (build_component_addr): Use convert_force to convert the + pointer in case the component type is also a private base class. + + * search.c (get_matching_virtual): Fix bogus warning of overloaded + virtual. + + * pt.c (overload_template_name): Set DECL_ARTIFICIAL on the created + TYPE_DECL to fix bogus shadowing warnings. + +Fri Jul 22 01:15:32 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (expand_aggr_init_1): const and volatile mismatches do not + prevent a TARGET_EXPR from initializing an object directly. + +Tue Jul 19 17:55:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_up_reference): Allow building up references to + `this', don't warn about making references to artificial variables + (like `this'). + + * tree.c (lvalue_p): `this' is not an lvalue. + + * call.c (build_method_call): Accept using a typedef name (or + template type parameter) for explicit destructor calls. + +Thu Jul 14 09:42:23 1994 Mike Stump <mrs@cygnus.com> + + * Version 2.6.0 released. + +Wed Jul 13 03:57:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (hack_identifier): Put back old code so lists of + non-functions will be handled properly. + + * cp-tree.h (TYPE_NEEDS_CONSTRUCTING): #if 0 out; this macro is now + defined in the language-independent tree.h. + + * tree.c (count_functions): Avoid bogus warning when compiling this + function. + +Mon Jul 11 18:37:20 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_reference_init): Always save the initializer of a + reference. + +Fri Jul 8 17:41:46 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside + CLEANUP_POINT_EXPRs so that the stack slots can be reused. + (disabled for now) + +Fri Jul 8 12:59:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (hack_identifier): Fix for new overloading. + + * typeck.c (build_binary_op_nodefault): Don't mess with division by + zero. + +Fri Jul 8 13:20:28 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * decl2.c (finish_file): Only call walk_sigtables, if + flag_handle_signatures is turned on, don't waste time otherwise. + +Fri Jul 8 02:27:41 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (push_overloaded_decl): Don't create overloads of one when + shadowing a class type. + * typeck.c (build_x_function_call): Complain about overloads of one. + + * decl.c (grokdeclarator): Don't try to treat a char* as a tree. + (grokdeclarator): Fix setting of TREE_STATIC. + (start_decl): Clear DECL_IN_AGGR_P after calling duplicate_decls. + +Thu Jul 7 22:20:46 1994 Gerald Baumgartner <gb@andros.cygnus.com> + + * cp-tree.h (walk_sigtables): Created extern declaration. + * decl2.c (walk_sigtables): Created function, patterned after + walk_vtables, even though we only need it to write out sigtables. + (finish_sigtable_vardecl): Created function. + (finish_vtable_vardecl): Changed 0 to NULL_PTR. + (finish_file): Call walk_sigtables. + + * sig.c (build_signature_table_constructor): Mark class member + function pointed to from signature table entry as addressable. + +Thu Jul 7 13:39:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_decl): Check new decl of static member variable + against the declaration in the class here. + (grokvardecl): Instead of here. + + * class.c (prepare_fresh_vtable): Call import_export_vtable if not + -fvtable-thunks. + (build_vtable): Likewise. + + * decl2.c (import_export_vtable): Move logic for deciding the + interface of a template class from here. + (import_export_template): To here. + (finish_vtable_vardecl): Call import_export_template before + import_export_vtable. + +Wed Jul 6 20:25:48 1994 Mike Stump <mrs@cygnus.com> + + * except.c (init_exception_processing): Setup interim_eh_hook to + call lang_interim_eh. + * except.c (do_unwind): Propagate throw object value across + stack unwinding. + * except.c (saved_throw_value): Used to hold the value of the object + being thrown. It is always a reference to the real value. + * except.c (expand_start_catch_block): Add handling for the + value of the exception object. + * except.c (expand_start_catch_block): Add handler for the handler, + so that throws inside the handler go to the outer block. + * except.c (expand_end_catch_block): Likewise. + * parse.y (handler_args): Use parm instead, as the other doesn't yet + handle references correctly. + +Wed Jul 6 17:55:32 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl2.c (mark_vtable_entries): If -ftable-thunks, set the + vtable entry properly to abort. + +Tue Jul 5 14:07:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Downgrade division by zero + errors to warnings. + + * call.c (build_overload_call_real): Handle fnname being a list of + functions. + * typeck.c (build_x_function_call): Pass list of functions to + build_overload_call, not just the name. + * tree.c (count_functions): Complain when called for invalid + argument. + + * decl.c (grokdeclarator): Fix settings of TREE_STATIC, TREE_PUBLIC + and DECL_EXTERNAL on static members and initialized const members. + * decl2.c (grokfield): Reflect this change. + +Fri Jul 1 09:35:51 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (init): ANSI C++ does not forbid { }. + +Thu Jun 30 00:35:22 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (lang_decode_option): Set warn_nonvdtor along with -Wall. + warn_nonvdtor defaults to off. + + * class.c (instantiate_type): Use comptypes rather than relying on + types to satisfy ==. + + * decl.c (start_function): Set DECL_DEFER_OUTPUT on all inlines that + might be static. + + * tree.c (build_cplus_new): Never build WITH_CLEANUP_EXPRs. + + * decl.c (grok_reference_init): Deal with ADDR_EXPRs of TARGET_EXPRs. + + * cvt.c (cp_convert): Pass 0 to with_cleanup_p arg of + build_cplus_new. + +Wed Jun 29 22:31:09 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (finish_file): Maybe consider static inlines multiple + times, in case they reference each other. + +Tue Jun 28 11:58:38 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * class.c (finish_struct): Don't `cons_up_default_function's + for signatures. + (finish_struct): Handle an empty method_vec correctly. + + * decl.c (grokdeclarator): Don't warn about a signature being + empty in a signature pointer declaration if we only saw a + forward declaration of the signature. Changed `warning's into + `cp_warning's. + + * sig.c (build_sigtable): Don't die if a null signature table + constructor is returned. + (build_signature_pointer_constructor): If the signature table + constructor is null, the _sptr field is set to a null pointer + and cast to the appropriate type. Make copies of all null + pointers so that the type null_pointer_node doesn't get changed. + (build_signature_table_constructor): Added comments. + + * sig.c (build_signature_pointer_constructor): Complain if we + try to assign to/initialize a signature pointer/reference of + an undefined signature. + +Mon Jun 27 14:05:16 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * typeck2.c (store_init_value): Don't be pedantic about + non-constant initializers of signature tables/pointers/references. + +Fri Jun 24 16:49:41 1994 Gerald Baumgartner <gb@cs.purdue.edu> + + * decl.c (grokdeclarator): If we are grokking an opaque typedef + in a signature, don't complain about it begin static. + +Wed Jun 29 16:44:45 1994 Mike Stump <mrs@cygnus.com> + + Fixes a problem of the this pointer being wrong in virtual calls to + methods that are not overridden in more derived classes. + + * class.c (fixup_vtable_delta): New routine. It will fixup the + delta entries in vtables, wheever they need updating. + * class.c (finish_struct): Call the new routine for all virtual + bases, as they can have different offsets, than those used in base + classes that we derive our vtable from. + +Tue Jun 28 23:49:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_binary_op): Use the types before default + conversions in the error message. + + * *.c: Use c_build_type_variant instead of build_type_variant where + the type might be an array. + + * call.c (build_method_call): Call build_type_variant and + build_reference_type in the right order. + * decl.c (record_builtin_type): Likewise. + +Wed Jun 29 16:58:53 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Call build_type_variant and + build_reference_type in the right order. + * decl.c (record_builtin_type): Likewise. + +Tue Jun 28 23:49:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_binary_op): Use the types before default + conversions in the error message. + + * *.c: Use c_build_type_variant instead of build_type_variant where + the type might be an array. + +Sat Jun 25 11:50:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): Try UDC's before doing the + reinterpret_cast thang, though. + +Fri Jun 24 01:24:01 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (c_expand_return): Don't USE the return value location + after we've expanded the jump. + + * decl2.c (finish_file): Make sure DECL_SAVED_INSNS is not 0 before + trying to write out an inline. + + * cvt.c (build_up_reference): Also do address adjustment when the + target type uses MI. + (convert_to_reference): Try UDCs only after built-in conversions. + (build_type_conversion_1): Don't play games with the argument to the + method. + (build_type_conversion): #if 0 out code for binding to reference. + +Thu Jun 23 00:22:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (finish_file): Use TREE_SYMBOL_REFERENCED to decide + whether to emit inlines. + + * decl.c (grokdeclarator): Set explicit_int for decls that just + specify, say, 'long'. + + * init.c (do_friend): Do overload C functions (or call pushdecl, + anyaway). + +Wed Jun 22 13:40:49 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_up_reference): Don't call readonly_error. + (convert_to_reference): Propagate const and volatile from expr to + its type. + + * tree.c (lvalue_p): Random CALL_EXPRs are not lvalues. + + * cvt.c (build_up_reference): Break out WITH_CLEANUP_EXPR when + creating a temporary. + (convert_to_reference): Lose excessive and incorrect trickiness. + (cp_convert): Call build_cplus_new with with_cleanup_p set. + + * typeck2.c (build_functional_cast): Likewise. + +Tue Jun 21 17:38:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): signed, unsigned, long and short all + imply 'int'. + + * decl.c (grokdeclarator): Allow "this is a type" syntax. + (grok_reference_init): Simplify and fix. + +Sun Jun 19 17:08:48 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): pedwarn about a typedef that specifies no + type. + +Sat Jun 18 04:16:50 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_function): Move TREE_PUBLIC and DECL_EXTERNAL + tinkering to after call to pushdecl. + +Fri Jun 17 14:48:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Handle destructors for non-aggregate + types properly. + +Thu Jun 16 16:48:05 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Make sure that the name given for the + destructor matches the constructor_name of the instance. + + * pt.c (do_function_instantiation): A non-extern instantiation + overrides a later extern one. + (do_type_instantiation): Likewise. + +Wed Jun 15 19:34:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (expand_aggr_init): Use TYPE_MAIN_VARIANT to get the + unqualified array type. + + * cp-tree.h (EMPTY_CONSTRUCTOR_P): Tests whether NODE is a + CONSTRUCTOR with no elements. + + * decl.c (various): Lose empty_init_node. + (finish_decl): Use EMPTY_CONSTRUCTOR_P, do the empty CONSTRUCTOR + thing depending on the value of DECL_COMMON instead of + flag_conserve_space, do the empty CONSTRUCTOR thing for types that + don't have constructors, don't treat a real empty CONSTRUCTOR + specially. + + * typeck2.c (process_init_constructor): Don't treat empty_init_node + specially. + +Wed Jun 15 19:05:25 1994 Mike Stump <mrs@cygnus.com> + + * class.c (override_one_vtable): Don't forget to merge in an old + overrider when we wanted to reuse a vtable, but couldn't. + +Wed Jun 15 15:03:16 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_decl): Put statics in common again. + + * decl.c (grokdeclarator): Return NULL_TREE for an error rather than + setting the type to error_mark_node. + + * typeck.c (build_modify_expr): Build up a COMPOUND_EXPR for enum + bitfield assignments. + +Tue Jun 14 12:23:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_op_properties): Const objects can be passed by value. + +Mon Jun 13 03:10:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (import_export_vtable): Force implicit instantiations to + be interface_only when -fno-implicit-templates. + + * decl.c (duplicate_decls): Redeclaring a class template name is an + error. + + * pt.c (end_template_decl): Call GNU_xref_decl for class templates. + * xref.c (GNU_xref_decl): Support templates. + +Sat Jun 11 17:09:05 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_op_properties): Split out checking for whether this + function should suppress the default assignment operator. + * decl2.c (grok_function_init): Likewise. + (copy_assignment_arg_p): New function do do just that. + Now considers virtual assignment operators that take a base as an + argument to count as copy assignment operators. + + * search.c (dfs_debug_mark): Lose checks for DWARF_DEBUG and + TREE_ASM_WRITTEN, as they are redundant. + + * pt.c (end_template_decl): Don't try to set DECL_CLASS_CONTEXT on a + decl that has no LANG_SPECIFIC part. + (do_type_instantiation): Force the debugging information for this + type to be emitted. + + * decl.c (start_decl): Clear up uses of various types of templates + (say sorry for static data members, rather than "invalid template"). + (expand_static_init): Fix initialization of static data members of + template classes. + +Fri Jun 10 00:41:19 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Set DECL_CONTEXT on static data members. + + * g++.c (main): Use -xc++-cpp-output for .i files. + + * pt.c (tsubst): Give meaningful error about declaring template for + a copy constructor which was not declared in the class template. + (do_type_instantiation): Explicit instantiation before the class + template is an error. + (instantiate_template): Don't die if tsubst returns error_mark_node. + +Thu Jun 9 19:04:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + Don't synthesize the copy assignment operator if the one in a base + class is pure virtual. + * cp-tree.h (TYPE_HAS_ABSTRACT_ASSIGN_REF): New macro to indicate + whether the type has a pure virtual copy assignment operator. + * class.c (finish_base_struct): Don't generate the copy assignment + operator if a base class has a pure virtual one. + * decl.c (grok_op_properties): Add disabled code to set + TYPE_HAS_ABSTRACT_ASSIGN_REF with comment pointing to where it is + actually set. + * decl2.c (grok_function_init): Set TYPE_HAS_ABSTRACT_ASSIGN_REF. + + * decl2.c (import_export_vtable): Always treat template + instantiations as if write_virtuals >= 2, and treat implicit + instantiations as external if -fno-implicit-templates. + (finish_file): Output all pending inlines if + flag_keep_inline_functions. + +Wed Jun 8 20:48:02 1994 Mike Stump <mrs@cygnus.com> + + * tree.c (layout_vbasetypes): Align virtual base classes inside + complete objects, so that we don't core dump on machines such as + SPARCs when we access members that require larger than normal + alignments, such as a double. Also, we bump up the total alignment + on the complete type, as necessary. + +Wed Jun 8 16:18:14 1994 Jason Merrill <jason@deneb.cygnus.com> + + * gxxint.texi (Free Store): New section with code for examining + cookie. + (Limitations of g++): Remove operator delete entry, since it is no + longer accurate. Fix access control entry. + + * typeck.c (build_unary_op): Pedwarn about taking the address of or + incrementing a cast to non-reference type. + (build_modify_expr): Use convert instead of convert_force again. + + * search.c (get_base_distance): Use IS_AGGR_TYPE_CODE to check for + class type, not == RECORD_TYPE. + + * decl.c (grokdeclarator): Cope with grokfndecl returning NULL_TREE. + + * typeck2.c (report_case_error): #if 0 out. + * lex.c (real_yylex): Lose RANGE. + * parse.y: Likewise. + +Tue Jun 7 18:17:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (simple_stmt, case ranges): Use ELLIPSIS instead of RANGE. + +Mon Jun 6 19:39:57 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_c_cast): Don't shortcut conversions to the same + type. Don't replace consts with their values here, since that's now + done in cp_convert. + + * cvt.c (cp_convert): When converting to bool, take + integer_zero_node to false_node and all other INTEGER_CSTs to + true_node. + (build_type_conversion): Don't complain about multiple conversions + to float if we're not really converting. + +Fri Jun 3 02:10:56 1994 Jason Merrill <jason@deneb.cygnus.com> + + Implement 'extern template class A<int>;' syntax for suppressing + specific implicit instantiations. + * cp-tree.h: Update prototypes for do_*_instantiation. + * pt.c (do_pending_expansions): Don't compile 'extern' explicit + instantiations. + (do_function_instantiation): Set DECL_EXTERNAL on 'extern' explicit + instantiations. + (do_type_instantiation): Likewise. + * parse.y (explicit_instantiation): Support 'extern template class + A<int>;' syntax. + * decl.c (start_function): Don't modify the settings of TREE_PUBLIC + and DECL_EXTERNAL on explicit instantiations. + + * cvt.c (cp_convert): Replace constants with their values before + converting. + (cp_convert): Consistently use 'e' instead of 'expr'. + +Thu Jun 2 03:53:30 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck2.c (build_x_arrow): Resolve OFFSET_REFs first. + +Wed Jun 1 18:57:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck2.c (digest_init): Handle initializing a pmf with an + overloaded method. + * typeck.c (build_ptrmemfunc): Handle overloaded methods. + + * decl.c (pushtag): Use build_decl to make TYPE_DECLs. + (xref_defn_tag): Likewise. + * pt.c (process_template_parm): Likewise. + (lookup_template_class): Likewise. + (push_template_decls): Likewise. + (instantiate_class_template): Likewise. + (create_nested_upt): Likewise. + * class.c (finish_struct): Don't try to set DECL_CLASS_CONTEXT on + TYPE_DECLs. + + * typeck.c (convert_arguments): Make sure type is not NULL before + checking its TREE_CODE. + +Wed Jun 1 17:40:39 1994 Mike Stump <mrs@cygnus.com> + + * class.c (get_derived_offset): New routine. + * class.c (finish_base_struct): Make sure we set BINFO_VTABLE and + BINFO_VIRTUALS when we choose a new base class to inherit from. + * class.c (modify_one_vtable): Use get_derived_offset to get the + offset to the most base class subobject that we derived this binfo + from. + * class.c (finish_struct): Move code to calculate the + DECL_FIELD_BITPOS of the vfield up, as we need might need it for + new calls to get_derived_offset in modify_one_vtable. + +Wed Jun 1 16:50:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_member_call): Use build_pointer_type instead of + TYPE_POINTER_TO. + +Wed Jun 1 11:11:15 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (grokdeclarator): Make sure we have a DNAME set before we + try to use it in an error. + +Wed Jun 1 09:48:49 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (convert_arguments, convert_for_initialization): Don't + strip NOP_EXPRs, when we are converting to a reference. + +Wed Jun 1 01:11:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_modify_expr): Don't dereference references when + initializing them. + + * decl2.c (grokfield): Don't check for grokdeclarator returning + error_mark_node any more. + + * decl.c (grokfndecl): Return NULL_TREE instead of error_mark_node. + (start_method): Return void_type_node instead of error_mark_node. + + * typeck.c (build_modify_expr): Resolve offset refs earlier. + +Tue May 31 16:06:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Resolve OFFSET_REFs in the object. + + * typeck.c (build_modify_expr): Dereference references before trying + to assign to them. + + * call.c (build_method_call): Don't confuse type conversion + operators with constructors. + * typeck2.c (build_functional_cast): Just call build_c_cast if there + was only one parameter. + * method.c (build_typename_overload): Don't set + IDENTIFIER_GLOBAL_VALUE on these identifiers. + * decl.c (grok_op_properties): Warn about defining a type conversion + operator that converts to a base class (or reference to it). + * cvt.c (cp_convert): Don't try to use a type conversion operator + when converting to a base class. + (build_type_conversion_1): Don't call constructor_name_full on an + identifier. + * cp-tree.h (DERIVED_FROM_P): Should be self-explanatory. + + * decl.c (start_decl): Don't complain that error_mark_node is an + incomplete type. + (finish_decl): Check for type == error_mark_node. + +Mon May 30 23:38:55 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_function): Set DECL_DEFER_OUTPUT on implicit + instantiations and inline members. + + * spew.c (yylex): Set looking_for_template if the next token is a '<'. + + * lex.h: Declare looking_for_template. + + * decl.c (lookup_name_real): Use looking_for_template to arbitrate + between type and template interpretations of an identifier. + +Sat May 28 04:07:40 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (instantiate_template): Zero out p if we found a + specialization. + + * decl.c (grokdeclarator): Elucidate warning. + (grokdeclarator): If pedantic AND -ansi, complain about long long. + + Make explicit instantiation work reasonably. It is now appropriate + to deprecate the use of -fexternal-templates. + * pt.c (instantiate_template): Set DECL_TEMPLATE_SPECIALIZATION or + DECL_IMPLICIT_INSTANTIATION on fndecl as appropriate. + (end_template_instantiation): Reflect changes in USE_TEMPLATE + semantics. + (do_pending_expansions): if (!flag_implicit_templates) DECIDE(0); + (do_function_instantiation): Don't set EXPLICIT_INST if + flag_external_templates is set. Do set TREE_PUBLIC and DECL_EXTERN + appropriately otherwise. + (do_type_instantiation): Set interface info for class. Set + TREE_PUBLIC and DECL_EXTERN for methods. Do none of this if + flag_external_templates is set. + * parse.y: Reflect changes in USE_TEMPLATE semantics. + * decl2.c: New flag flag_implicit_templates determines whether or + not implicit instantiations get emitted. This flag currently + defaults to true, and must be true for -fexternal-templates to work. + (finish_file): Consider flag_implement_inlines when + setting DECL_EXTERNAL. Consider flag_implicit_templates when + deciding whether or not to emit a static copy. + * decl.c (start_function): Set TREE_PUBLIC and DECL_EXTERNAL + properly for template instantiations. + (start_method): Set DECL_IMPLICIT_INSTANTIATION on methods of a + template class. + * cp-tree.h (CLASSTYPE_USE_TEMPLATE): Change semantics. + (DECL_USE_TEMPLATE): Parallel macro for FUNCTION and VAR_DECLs. + (various others): Accessor macros for the above. + +Fri May 27 13:57:40 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Division by constant zero is + an error. + +Fri May 27 13:50:15 1994 Mike Stump <mrs@cygnus.com> + + * class.c (override_one_vtable): Don't modify things we don't own. + +Fri May 27 01:42:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (finish_decl): Don't postpone processing the initializer of + a decl with DECL_EXTERNAL set, and do call rest_of_compilation for a + PUBLIC const at toplevel. + (grokdeclarator): pedwarn about initializing non-const or + non-integral statics in the class body. + + * decl.c (pushtag): Don't try to set DECL_CLASS_CONTEXT on a + TYPE_DECL. + + * call.c (convert_harshness): Dereference reference on rhs before + proceeding, properly grok passing const things to non-const + references. + + * typeck.c (build_unary_op): Soften error about taking the address + of main() to a pedwarn. + + * lex.c (default_copy_constructor_body): Unambiguously specify base + classes (i.e. A((const class ::A&)_ctor_arg) ). + (default_assign_ref_body): Likewise. + +Thu May 26 13:13:55 1994 Gerald Baumgartner <gb@mexican.cygnus.com> + + * decl2.c (grokfield): Don't complain about local signature + method declaration without definition. + + * call.c (convert_harshness): If `type' is a signature pointer + and `parmtype' is a pointer to a signature, just return 0. We + don't really convert in this case; it's a result of making the + `this' parameter of a signature method a signature pointer. + + * call.c (build_method_call): Distinguish calling the default copy + constructor of a signature pointer/reference from a signature + member function call. + +Thu May 26 12:56:25 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (grokfield): Don't set TREE_PUBLIC on member function + declarations. + + * decl.c (duplicate_decls): A previous function declaration as + static overrides a subsequent non-static definition. + (grokdeclarator): Don't set TREE_PUBLIC on inline method + declarations. + +Wed May 25 14:36:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Handle initialization of static const + members. + (finish_decl): Likewise. + + * decl2.c (grokfield): Allow initialization of static const members + even when pedantic. + + * decl2.c (grokfield): Deal with grokdeclarator returning + error_mark_node. + + * decl.c (grok_ctor_properties): Return 0 for A(A) constructor. + (grokfndecl): Check the return value of grok_ctor_properties. + (start_method): Likewise. + + * parse.y (absdcl): Expand type_quals inline. + +Tue May 24 19:10:32 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (pushtag): Use IS_AGGR_TYPE rather than checking for a + RECORD_TYPE. + +Tue May 24 18:09:16 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, + always use "__vt_%s". + * decl2.c (finish_vtable_vardecl): Don't consider abstract virtuals + when looking for a "sentinal" method (to decide on emitting vtables). + * decl2.c (finish_file): Scan all decls for thunks that need + to be emitted. + * decl2.c (finish_vtable_vardecl): Don't bother calling emit_thunk. + * method.c (make_thunk): Use a more meaningful label. If there + exists a matching top-level THUNK_DECL re-use it; otherwise + create a new THUNK_DECL (and declare it). + * method.c (emit_thunk): Make thunk external/public depending + on the underlying method. + +Tue May 24 00:22:04 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (tsubst): Use lookup_name_nonclass to find guiding decls, not + lookup_name. + + * call.c (build_overload_call_real): Don't immediately pick a + function which matches perfectly. + + * decl.c (grokdeclarator): Use c_build_type_variant for arrays. + (grokdeclarator): Warn about, and throw away, cv-quals attached to a + reference (like 'int &const j'). + + * typeck.c (convert_arguments): Don't mess with i for methods. + * call.c (build_method_call): Pass the function decl to + convert_arguments. + + * typeck.c (comp_ptr_ttypes_real): New function. Implements the + checking for which multi-level pointer conversions are allowed. + (comp_target_types): Call it. + (convert_for_assignment): Check const parity on the ultimate target + type, too. And make those warnings pedwarns. + +Mon May 23 14:11:24 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_char): Use TARGET_* for character constants. + +Mon May 23 13:03:03 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * tree.c (debug_no_list_hash): Make static. + + * decl.c (decls_match): Say the types don't match if newdecl ends up + with a null type, after we've checked if olddecl does. + (pushdecl): Check if the decls themselves match before looking for + an extern redeclared as static, to avoid inappropriate and incorrect + warnings. + +Fri May 20 14:04:34 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Make warning about duplicate short, etc. + a pedwarn. + + * typeck.c (build_c_cast): Casting to function or method type is an + error. + + * class.c (finish_struct): Make warning for anonymous class with no + instances a pedwarn. + + * Makefile.in (stamp-parse): Expect a s/r conflict. + + * typeck.c (build_modify_expr): pedwarn about using a non-lvalue + cast as an lvalue. + +Thu May 19 12:08:48 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (type_promotes_to): Make sure bool promotes to int rather + than unsigned on platforms where sizeof(char)==sizeof(int). + +Wed May 18 14:27:06 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_c_cast): Tack on a NOP_EXPR when casting to + another variant. + (build_modify_expr): Don't strip NOP_EXPRs, and don't get tricky + and treat them as lvalues. + + * decl.c (shadow_tag): Do complain about forward declarations of + enums and empty declarations. + * parse.y: Don't complain about forward declarations of enums and + empty declarations. + + * typeck.c (convert_for_assignment): Complain about changing + the signedness of a pointer's target type. + + * parse.y (stmt): Move duplicated code for checking case values from + here. + * decl2.c (check_cp_case_value): To here. And add a call to + constant_expression_warning. + + * typeck.c (convert_for_assignment): Don't complain about assigning + a negative value to bool. + + * decl.c (init_decl_processing): Make bool unsigned. + + * class.c (finish_struct): Allow bool bitfields. + +Wed May 18 12:35:27 1994 Ian Lance Taylor <ian@tweedledumb.cygnus.com> + + * Make-lang.in (c++.install-man): Get g++.1 from $(srcdir)/cp. + +Wed May 18 03:28:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_type_conversion): Lose special handling of + truthvalues. + + * search.c (dfs_pushdecls): Improve shadowing warning. + +Tue May 17 13:34:46 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_delete): Throw away const and volatile on `this'. + + * decl.c (finish_enum): Put the constants in TYPE_VALUES again, + rather than the enumerators. + (pushtag): s/cdecl/c_decl/g + +Mon May 16 23:04:01 1994 Stephen R. van den Berg <berg@pool.informatik.rwth-aachen.de> + + * cp/typeck.c (common_type): Attribute merging. + (comp_types): Utilise COMP_TYPE_ATTRIBUTES macro. + + * cp/parse.y: Revamp attribute parsing. + +Mon May 16 01:40:34 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (shadow_tag): Also check for inappropriate use of auto and + register. + + * method.c (build_overload_name): Clarify that the illegal case is a + pointer or reference to array of unknown bound. + + * error.c (dump_type_prefix): Print references to arrays properly. + + * typeck.c (various): Be more helpful in pointer + comparison diagnostics. + + * tree.c (lvalue_p): MODIFY_EXPRs are lvalues again. Isn't this + fun? + + * parse.y: Also catch an error after valid stmts. + + * search.c (dfs_init_vbase_pointers): Don't abort because `this' is + const. + + * typeck.c (convert_for_initialization): If call to + convert_to_reference generated a diagnostic, print out the parm + number and function decl if any. + + * errfn.c (cp_thing): Check atarg1 to determine whether or not we're + specifying a line, not atarg. + + * tree.c (build_cplus_method_type): Always make `this' const. + + * decl2.c (grokclassfn): If -fthis-is-variable and this function is + a constructor or destructor, make `this' non-const. + + * typeck.c (build_modify_expr): Don't warn specially about + assignment to `this' here anymore, since it will be caught by the + usual machinery. + + * various: Disallow specific GNU extensions (variable-size arrays, + etc.) when flag_ansi is set, not necessarily when pedantic is set, + so that people can compile with -pedantic-errors for tighter const + checking and such without losing desirable extensions. + + * typeck2.c (build_functional_cast): Call build_method_call with + LOOKUP_PROTECT. + (process_init_constructor): Only process FIELD_DECLs. + + * decl.c (finish_decl): Also force static consts with no explicit + initializer that need constructing into the data segment. + + * init.c (build_delete): Undo last patch, as it interferes with + automatic cleanups. + +Sat May 14 01:59:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c, class.h, cp-tree.h, cvt.c, decl2.c: Lose old overloading + code. + + * init.c (build_delete): pedwarn about using plain delete to delete + an array. + +Fri May 13 16:45:07 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (comp_target_types): Be more helpful in contravariance + warnings, and make them pedwarns. + + * decl.c (grokdeclarator): Use decl_context to decide whether or not + this is an access declaration. + + * class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it + has a conversion to enum or bool, too. + +Fri May 13 16:31:27 1994 Mike Stump <mrs@cygnus.com> + + * method.c (emit_thunk): Make declaration for + current_call_is_indirect local (needed for hppa). + +Fri May 13 16:16:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (uses_template_parms): Grok BOOLEAN_TYPE. + (tsubst): Likewise. + +Fri May 13 16:23:32 1994 Mike Stump <mrs@cygnus.com> + + * pt.c (tsubst): If there is already a function for this expansion, + use it. + * pt.c (instantiate_template): Likewise. + +Fri May 13 10:30:42 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * parse.y (implicitly_scoped_stmt, simple_stmt case): Use + kept_level_p for MARK_ENDS argument to expand_end_bindings, to avoid + generating debug info for unemitted symbols on some systems. + + * cp-tree.h (build_static_cast, build_reinterpret_cast, + build_const_cast): Add declarations. + +Fri May 13 09:50:31 1994 Mike Stump <mrs@cygnus.com> + + * search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27 + fix. We now try get_binfo, and if that doesn't find what we want, + we go back to the old method, which still sometimes fails. + +Fri May 13 01:43:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (initdcl): Call cplus_decl_attributes on the right + variable. + * decl2.c (cplus_decl_attributes): Don't call decl_attributes for + void_type_node. + + * typeck.c (build_binary_op_nodefault): Change result_type for + comparison ops to bool. + (build_binary_op): Convert args of && and || to bool. + * cvt.c (build_default_binary_type_conversion): Convert args of && + and || to bool. + (build_default_unary_type_conversion): Convert arg of ! to bool. + (type_promotes_to): bool promotes to int. + +Fri May 13 01:43:18 1994 Mike Stump <mrs@cygnus.com> + + Implement the new builtin `bool' type. + * typeck.c (build_binary_op_nodefault): Convert args of && and || to + bool. + (build_unary_op): Convert arg of ! to bool. + * parse.y: Know true and false. Use bool_truthvalue_conversion. + * method.c (build_overload_value): Know bool. + (build_overload_name): Likewise. + * lex.c (init_lex): Set up RID_BOOL. + * gxx.gperf: Add bool, true, false. + * error.c (*): Know bool. + * decl.c (init_decl_processing): Set up bool, true, false. + * cvt.c (cp_convert): Handle conversion to bool. + (build_type_conversion): Likewise. + * *.c: Accept bool where integers and enums are accepted (use + INTEGRAL_CODE_P macro). + +Thu May 12 19:13:54 1994 Richard Earnshaw <rwe11@cl.cam.ac.uk> + + * g++.c: Use #ifdef for __MSDOS__, not #if. + +Thu May 12 18:05:18 1994 Mike Stump <mrs@cygnus.com> + + * decl2.c (lang_f_options): Handle -fshort-temps. -fshort-temps + gives old behavior , and destroys temporaries earlier. Default + behavior now conforms to the ANSI working paper. + +Thu May 12 14:45:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_modify_expr): Understand MODIFY_EXPR as an lvalue. + Use convert_force to convert the result of a recursive call when we + are dealing with a NOP_EXPR. Don't automatically wrap MODIFY_EXPRs + in COMPOUND_EXPRs any more. + (various): Lose pedantic_lvalue_warning. + (unary_complex_lvalue): Understand MODIFY_EXPR. + + * cvt.c (convert_to_reference): Allow DECL to be error_mark_node if + we don't know what we're initializing. + +Wed May 11 01:59:36 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): Modify to use convtype parameter. + Only create temporaries when initializing a reference, not when + casting. + (cp_convert): New main function. + (convert): Call cp_convert. + * cvt.c, decl.c, typeck.c: Fix calls to convert_to_reference. + * cp-tree.h (CONV_*): New constants used by conversion code for + selecting conversions to perform. + + * tree.c (lvalue_p): MODIFY_EXPRs are no longer lvalues. + + * typeck.c (build_{static,reinterpret,const_cast): Stubs that just + call build_c_cast. + * parse.y: Add {static,reinterpret,const}_cast. + * gxx.gperf: Likewise. + + * typeck.c (common_type): Allow methods with basetypes of different + UPTs. + (comptypes): Deal with UPTs. + (build_modify_expr): Wrap all MODIFY_EXPRs in a COMPOUND_EXPR. + + * pt.c (end_template_decl): Check for multiple definitions of member + templates. + + * call.c (build_method_call): Complain about calling an abstract + virtual from a constructor. + + * typeck.c (pointer_int_sum): Check for the integer operand being 0 + after checking the validity of the pointer operand. + + * typeck2.c (digest_init): Pedwarn about string initializer being + too long. + +Tue May 10 12:10:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (push_overloaded_decl): Only throw away a builtin if the + decl in question is the artificial one. + + * parse.y (simple_stmt, switch): Use implicitly_scoped_stmt because + expand_{start,end}_case cannot happen in the middle of a block. + + * cvt.c (build_type_conversion_1): Use convert again. + +Tue May 10 11:52:04 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * typeck2.c (digest_init): Make sure we check for signed and + unsigned chars as well when warning about string initializers. + + * init.c (emit_base_init): Check if there's a DECL_NAME on the + member before trying to do an initialization for it. + +Tue May 10 11:34:37 1994 Mike Stump <mrs@cygnus.com> + + * except.c: Don't do anything useful when cross compiling. + +Tue May 10 03:04:13 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (duplicate_decls): Fix up handling of builtins yet again. + (push_overloaded_decl): Likewise. + + * cvt.c (convert): Don't look for void type conversion. + +Mon May 9 18:05:41 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (do_friend): Only do a pushdecl for friends, not + pushdecl_top_level. + +Mon May 9 13:36:34 1994 Jim Wilson <wilson@sphagnum.cygnus.com> + + * decl.c (lookup_name_current_level): Put empty statement after + the label OUT to make the code valid C. + +Mon May 9 12:20:57 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_binary_op_nodefault): Only complain about + comparing void * and a function pointer if void * is smaller. + +Sun May 8 01:29:13 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (lookup_name_current_level): Move through temporary binding + levels. + + * parse.y (already_scoped_stmt): Revive. + (simple_stmt): Use it again. + + * decl.c (poplevel): Always call poplevel recursively if we're + dealing with a temporary binding level. + +Sat May 7 10:52:28 1994 Mike Stump <mrs@cygnus.com> + + * decl.c (finish_decl): Make sure we run cleanups for initial values + of decls. Cures memory leak. + * decl.c (expand_static_init): Likewise for static variables. + * decl2.c (finish_file): Likewise for globals. + +Sat May 7 03:57:44 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (commonparms): Don't complain about redefining default + args. + + * decl.c (duplicate_decls): Don't complain twice about conflicting + function decls. + (decls_match): Don't look at default args. + (redeclaration_error_message): Complain about redefining default + args. + + * call.c (build_overload_call_real): Also deal with guiding + declarations coming BEFORE the template decl. + + * pt.c (unify): Allow different parms to have different + cv-qualifiers. + (unify): Allow trivial conversions on non-template parms. + +Fri May 6 03:53:23 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (tsubst): Support OFFSET_TYPEs. + (unify): Likewise. + + * decl2.c (finish_decl_parsing): Call push_nested_class with a type. + + * init.c (build_offset_ref): Fix error message. + * search.c (lookup_field): Likewise. + + * call.c (build_scoped_method_call): Pass binfo to + build_method_call. + * typeck.c (build_object_ref): Likewise. + + * typeck2.c (binfo_or_else): Don't return a _TYPE. + + * class.c (finish_struct): Don't complain about re-use of inherited + names or shadowing of type decls. + * decl.c (pushdecl_class_level): Likewise. + + * decl.c (finish_enum): Set the type of all the enums. + + * class.c (finish_struct): Don't get confused by access decls. + + * cp-tree.h (TYPE_MAIN_DECL): New macro to get the _DECL for a + _TYPE. You can stop using TYPE_NAME for that now. + + * parse.y: Lose doing_explicit (check $0 instead). + * gxx.gperf: 'template' now has a RID. + * lex.h (rid): Likewise. + * lex.c (init_lex): Set up the RID for 'template'. + + * parse.y (type_specifier_seq): typed_typespecs or + nonempty_type_quals. Use it. + (handler_args): Fix bogus syntax. + (raise_identifier{,s}, optional_identifier): Lose. + * except.c (expand_start_catch_block): Use grokdeclarator to parse + the catch variable. + (init_exception_processing): The second argument to + __throw_type_match is ptr_type_node. + + Fri May 6 07:18:54 1994 Chip Salzenberg <chip@fin.uucp> + + [ change propagated from c-decl.c of snapshot 940429 ] + * cp/decl.c (finish_decl): Setting asmspec_tree should not + zero out the old RTL. + +Fri May 6 01:25:38 1994 Mike Stump <mrs@cygnus.com> + + Add alpha exception handling support to the compiler. + Quick and dirty backend in except.c. + + * cp/*: Remove most remnants of old exception handling support. + * decl.c (finish_function): Call expand_exception_blocks to put + the exception hanlding blocks at the end of the function. + * dec.c (hack_incomplete_structures): Make sure expand_decl_cleanup + comes after expand_decl_init. + * except.c: Reimplementation. + * expr.c (cplus_expand_expr): Handle THROW_EXPRs. + * lex.c (init_lex): Always have catch, try and throw be reserved + words, so that we may always parse exception handling. + * parse.y: Cleanup to support new interface into exception handling. + * tree.def (THROW_EXPR): Add. + +Thu May 5 17:35:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (simple_stmt, for loops): Use implicitly_scoped_stmt. + (various): Lose .kindof_pushlevel and partially_scoped_stmt. + +Thu May 5 16:17:27 1994 Kung Hsu <kung@mexican.cygnus.com> + + * parse.y (already_scoped_stmt): move expand_end_binding() to + fix the unmatched LBB/LBE in stabs. + +Thu May 5 14:36:17 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (set_nested_typename): Set TREE_MANGLED on the new + identifiers. + (pushdecl): Check TREE_MANGLED. + (xref_tag): Likewise. + * cp-tree.h (TREE_MANGLED): This identifier is a + DECL_NESTED_TYPENAME (named to allow for future use to denote + mangled function names as well). + + Implement inconsistency checking specified in [class.scope0]. + * decl.c (lookup_name_real): Don't set ICV here after all. + (finish_enum): Also set the type of the enumerators themselves. + (build_enumerator): Put the CONST_DECL in the list instead of its + initial value. + (pushdecl_class_level): Check inconsistent use of a name in the + class body. + * class.c (finish_struct): Check inconsistent use of a name in the + class body. Don't set DECL_CONTEXT on types here anymore. + * parse.y (qualified_type_name): Note that the identifier has now + been used (as a type) in the class body. + * lex.c (do_identifier): Note that the identifier has now been used + (as a constant) in the class body. + * error.c (dump_decl): Print type and enum decls better. + +Thu May 5 09:35:35 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * typeck.c (build_modify_expr): Warn about assignment to `this'. + +Wed May 4 15:55:49 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_delete): Use the global operator delete when + requested. + + * decl.c (lookup_name_real): If we find the type we're looking in a + base class while defining a class, set IDENTIFIER_CLASS_VALUE for + the type. + + * class.c (finish_struct): Remove a couple of dependencies on + language linkage. + + * decl.c (pushtag): Classes do nest in extern "C" blocks. + (pushdecl): Only set DECL_NESTED_TYPENAME on the canonical one for + the type. + (pushtag): Remove another dependency on the language linkage. + + * lex.c (cons_up_default_function): Don't set DECL_CLASS_CONTEXT to + a const-qualified type. + + * decl.c (push_overloaded_decl): Throw away built-in decls here. + (duplicate_decls): Instead of here. + +Wed May 4 15:27:40 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * typeck.c (get_member_function_from_ptrfunc): Do The Right + Thing (I hope) if we're using thunks. + +Wed May 4 13:52:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (specialization): aggr template_type_name ';'. + (named_class_head_sans_basetype): Use it. + (explicit_instantiation): Likewise. + (tmpl.2): Revert. + + * cvt.c (build_type_conversion_1): Use convert_for_initialization, + rather than convert, to do conversions after the UDC. + + * cp-tree.h (SHARED_MEMBER_P): This member is shared between all + instances of the class. + + * search.c (lookup_field): If the entity found by two routes is the + same, it's not ambiguous. + +Wed May 4 12:10:00 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (lookup_name_real): Check for a NULL TREE_VALUE, + to prevent the compiler from crashing ... + +Wed May 4 11:19:45 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): If we don't have an object, check + basetype_path to figure out where to look up the function. + + * typeck.c (convert_for_initialization): Pass TYPE_BINFO (type) to + build_method_call in case exp is NULL_TREE. + +Tue May 3 16:02:53 1994 Per Bothner <bothner@kalessin.cygnus.com> + + Give a vtable entries a unique named type, for the sake of gdb. + * class.c (build_vtable_entry): The addres of a thunk now has + type vtable_entry_type, not ptr_type_node. + * method.c (make_thunk): Fix type of THUNK_DECL. + * class.c (add_virtual_function, override_one_vtable): Use + vfunc_ptr_type_node, instead of ptr_type_node. + * cp-tree.h (vfunc_ptr_type_node): New macro. + * decl.c (init_decl_processing): Make vtable_entry_type + be a unique type of pointer to a unique function type. + +Tue May 3 09:20:44 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (do_explicit): Sets doing_explicit to 1. + (explicit_instantiation): Use do_explicit rather than TEMPLATE + directly, add "do_explicit error" rule. + (datadef): Set doing_explicit to 0 after an explicit instantiation. + (tmpl.2): Don't instantiate if we see a ';' unless we're doing an + explicit instantiation. + (named_class_head_sans_basetype): Remove aggr template_type_name + ';' again. + +Mon May 2 23:17:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (lookup_nested_tag): Lose. + + * decl2.c (grokfield): Set DECL_CONTEXT on TYPE_DECLs. + (lookup_name_nonclass): Lose. + + * decl.c (poplevel_class): Add force parameter. + (lookup_name_real): Fix handling of explicit scoping which specifies + a class currently being defined. Add 'nonclass' argument. + (lookup_name, lookup_name_nonclass): Shells for lookup_name_real. + + * class.c (finish_struct): Don't unset IDENTIFIER_CLASS_VALUEs here. + (popclass): Force clearing of IDENTIFIER_CLASS_VALUEs if we're being + called from finish_struct. + +Mon May 2 19:06:21 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (init_decl_processing), cp-tree.h: Removed memptr_type. + (It seeems redundant, given build_ptrmemfunc_type.) + * typeck.c (get_member_function_from_ptrfunc), gc.c (build_headof, + build_classof): Use vtable_entry_type instead of memptr_type. + * method.c (emit_thunk): Call poplevel with functionbody==0 + to prevent DECL_INITIAL being set to a BLOCK. + +Mon May 2 15:02:11 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (named_class_head_sans_basetype): Add "aggr + template_type_name ';'" rule for forward declaration of + specializations. + +Mon May 2 15:02:11 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (instantiate_type): Deal with pmf's. + + * Make-lang.in (cc1plus): Don't depend on OBJS or BC_OBJS, since + stamp-objlist does. + + * Makefile.in (../cc1plus): Depend on OBJDEPS. + (OBJDEPS): Dependency version of OBJS. + +Mon May 2 12:51:31 1994 Kung Hsu <kung@mexican.cygnus.com> + + * search.c (dfs_debug_mark): unmark TYPE_DECL_SUPPRESS_DEBUG, not + DECL_IGNORED_P. + +Fri Apr 29 12:29:56 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Clear out memory of local tags. And + typedefs. + + * decl2.c (grokclassfn): Don't set DECL_CONTEXT to a cv-qualified + type. + * search.c (get_matching_virtual): Be more helpful in error message. + + * *: Use DECL_ARTIFICIAL (renamed from DECL_SYNTHESIZED). + + * lex.c (default_assign_ref_body): Expect TYPE_NESTED_NAME to work. + (default_copy_constructor_body): Likewise. + + * class.c (finish_struct): Don't gratuitously create multiple decls + for nested classes. + +Thu Apr 28 23:39:38 1994 Jason Merrill <jason@deneb.cygnus.com> + + Avoid clobbering the arg types of other functions when reverting + static member functions. + * decl.c (revert_static_member_fn): Rearrange arguments, don't + require values for 'fn' and 'argtypes', add warning to comment + above. + (decls_match): Rearrange arguments in call to rsmf. + (grok_op_properties): Don't pass values for fn and argtypes. + * pt.c (instantiate_template): Don't pass values for fn and argtypes. + +Thu Apr 28 16:29:11 1994 Doug Evans <dje@canuck.cygnus.com> + + * Make-lang.in (cc1plus): Depend on stamp-objlist. + * Makefile.in (BC_OBJS): Delete. + (OBJS): Cat ../stamp-objlist to get language independent files. + Include ../c-common.o. + (../cc1plus): Delete reference to BC_OBJS. + +Thu Apr 28 02:12:08 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (compute_access): No really, deal with static members + properly. Would I lie to you? + + Implement lexical hiding of function declarations. + * pt.c (tsubst): Use lookup_name to look for function decls to guide + instantiation. + * method.c (build_opfncall): Use lookup_name_nonclass to look for + non-member functions. + * init.c (do_friend): Use lookup_name_nonclass to look for + functions. + * error.c (ident_fndecl): Use lookup_name to look for functions. + * decl2.c (lookup_name_nonclass): New function, skips over + CLASS_VALUE. + * decl.c (struct binding_level): Lose overloads_shadowed field. + (poplevel): Don't deal with overloads_shadowed. + (push_overloaded_decl): Do lexical hiding for functions. + * class.c (instantiate_type): Don't check non-members if we have + members with the same name. + * call.c (build_method_call): Use lookup_name_nonclass instead of + IDENTIFIER_GLOBAL_VALUE to check for non-member functions. + (build_overload_call_real): Likewise. + + * decl.c (duplicate_decls): Check for ambiguous overloads here. + (push_overloaded_decl): Instead of here. + + * decl.c (pushdecl): Back out Chip's last change. + + * decl.c (grok_op_properties): operators cannot be static members. + + * cp-tree.h (DECL_SYNTHESIZED): DECL_SOURCE_LINE == 0 + (SET_DECL_SYNTHESIZED): DECL_SOURCE_LINE = 0 + * lex.c (cons_up_default_function): Use SET_DECL_SYNTHESIZED. + + * method.c (do_inline_function_hair): Don't put friends of local + classes into global scope, either. + + * typeck2.c (build_functional_cast): Don't look for a function call + interpretation. + +Thu Apr 28 15:19:46 1994 Mike Stump <mrs@cygnus.com> + + * cp-tree.h: disable use of backend EH. + +Wed Apr 27 21:01:24 1994 Doug Evans <dje@canuck.cygnus.com> + + * Make-lang.in (c++.distdir): mkdir tmp/cp first. + * Makefile.in (INCLUDES): Move definition to same place as + parent makefile. + (ALLOCA): Define. + (OLDAR_FLAGS): Delete. + (OLDCC): Define. + (DIR): Delete. + (CLIB): Define. + (####site): Delete. + (SUBDIR_USE_ALLOCA): Don't use ALLOCA if compiling with gcc. + +Wed Apr 27 19:10:04 1994 Kung Hsu <kung@mexican.cygnus.com> + + * decl.c (xref_tag): not to use strstr(), it's not available on + all platforms. + +Wed Apr 27 18:10:12 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Resolve yet another class/pmf confusion. + + * call.c (build_overload_call_real): Don't take the single-function + shortcut if we're dealing with an overloaded operator. + +Wed Apr 27 17:35:37 1994 Mike Stump <mrs@cygnus.com> + + * search.c (get_base_distance): Search the virtual base class + binfos, incase someone wants to convert to a real virtual base + class. + * search.c (expand_indirect_vtbls_init): Use convert_pointer_to_real + instead of convert_pointer_to, as it now will work. + +Wed Apr 27 15:36:49 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): Don't complain about casting away + const and volatile. + + * typeck.c (build_unary_op): References are too lvalues. + +Wed Apr 27 13:58:05 1994 Mike Stump <mrs@cygnus.com> + + * class.c (override_one_vtable): We have to prepare_fresh_vtable + before we modify it, not after, also, we cannot reuse an old vtable, + once we commit to a new vtable. Implement ambiguous overrides in + virtual bases as abstract. Hack until we make the class + ill-formed. + +Wed Apr 27 01:17:08 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (unary_expr): Expand new_placement[opt] and + new_initializer[opt] inline. + + * search.c (lookup_fnfields): Don't throw away the inheritance + information here, either. + (compute_access): Handle static members properly. + + * init.c (build_member_call): Always set basetype_path, and pass it + to lookup_fnfields. + + * search.c (lookup_field): Deal properly with the case where + xbasetype is a chain of binfos; don't throw away the inheritance + information. + (compute_access): protected_ok always starts out at 0. + + * init.c (resolve_offset_ref): Don't cast `this' to the base type + until we've got our basetype_path. + + * cp-tree.h (IS_OVERLOAD_TYPE): aggregate or enum. + + * cvt.c (build_up_reference): Use build_pointer_type rather than + TYPE_POINTER_TO. + + * call.c (convert_harshness_ansi): Call type_promotes_to for reals + as well. + + * cvt.c (type_promotes_to): Retain const and volatile, add + float->double promotion. + + * decl.c (grokdeclarator): Don't bash references to arrays into + references to pointers in function parms. Use type_promotes_to. + +Tue Apr 26 23:44:36 1994 Mike Stump <mrs@cygnus.com> + + Finish off Apr 19th work. + + * class.c (finish_struct_bits): Rename has_abstract_virtuals to + might_have_abstract_virtuals. + * class.c (strictly_overrides, override_one_vtable, + merge_overrides): New routines to handle virtual base overrides. + * class.c (finish_struct): Call merge_overrides to handle overrides + in virtual bases. + +Tue Apr 26 12:45:53 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_function_call): Call build_function_call_real with + LOOKUP_NORMAL. + + * *: Don't deal with TYPE_EXPRs. + + * tree.c (lvalue_p): If the type of the expression is a reference, + it's an lvalue. + + * cvt.c (convert_to_reference): Complain about passing const + lvalues to non-const references. + (convert_from_reference): Don't arbitrarily throw away const and + volatile on the target type. + + * parse.y: Simplify and fix rules for `new'. + + * decl.c (grok_op_properties): operator void is illegal. + +Mon Apr 25 02:36:28 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (components): Anonymous bitfields can still have declspecs. + + * decl.c (pushdecl): Postpone handling of function templates like we + do C functions. + + * search.c (expand_indirect_vtbls_init): Fix infinite loop when + convert_pointer_to fails. + + * call.c (compute_conversion_costs_ansi): A user-defined conversion + by itself is better than that UDC followed by standard conversions. + Don't treat integers and reals specially. + + * cp-tree.h: Declare flag_ansi. + + * typeck.c (c_expand_return): pedwarn on return in void function + even if the expression is of type void. + (build_c_cast): Don't do as much checking for casts to void. + (build_modify_expr): pedwarn about array assignment if this code + wasn't generated by the compiler. + + * tree.c (lvalue_p): A comma expression is an lvalue if its second + operand is. + + * typeck.c (default_conversion): Move code for promoting enums and + ints from here. + * cvt.c (type_promotes_to): To here. + * call.c (convert_harshness_ansi): Use type_promotes_to. Also fix + promotion semantics for reals. + +Sun Apr 24 16:52:51 1994 Doug Evans <dje@canuck.cygnus.com> + + * Make-lang.in (c++.install-common): Check for g++-cross. + * Makefile.in: Remove Cygnus cruft. + (config.status): Delete. + (RTL_H): Define. + (TREE_H): Use complete pathname, some native makes have minimal + VPATH support. + (*.o): Use complete pathname to headers in parent dir. + (doc, info, dvi): Delete. + +Sun Apr 24 16:52:51 1994 Doug Evans <dje@canuck.cygnus.com> + + * Make-lang.in (c++.install-common): Check for g++-cross. + * Makefile.in: Remove Cygnus cruft. + (config.status): Delete. + (RTL_H): Define. + (TREE_H): Use complete pathname, some native makes have minimal + VPATH support. + (*.o): Use complete pathname to headers in parent dir. + (doc, info, dvi): Delete. + +Sun Apr 24 00:47:49 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (pushdecl): Avoid redundant warning on redeclaring function + with different return type. + (decls_match): Compare return types strictly. + +Fri Apr 22 12:55:42 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (build_type_conversion): Do try to convert through other + pointers. This will fail if the class defines multiple pointer + conversions. + + * error.c (dump_type_prefix): Print out pointers to arrays properly. + (dump_type_suffix): Likewise. (was 'int *[]', now 'int (*)[]') + + * typeck.c (build_unary_op): Disallow ++/-- on pointers to + incomplete type. + + * decl.c (duplicate_decls): Check mismatched TREE_CODES after + checking for shadowing a builtin. If we're redeclaring a builtin + function, bash the old decl to avoid an ambiguous overload. + + * cvt.c (convert_to_reference): Don't force arrays to decay here. + + * tree.c (lvalue_p): A MODIFY_EXPR is an lvalue. + + * decl.c (duplicate_decls): Don't assume that the decls will have + types. + + Mon Apr 18 11:35:32 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940318 snapshot ] + * c-decl.c (pushdecl): Warn if type mismatch with another external decl + in a global scope. + + Fri Apr 22 06:38:56 1994 Chip Salzenberg <chip@fin.uucp> + + * cp/typeck2.c (signature_error): Use cp_error for "%T". + + Mon Apr 18 11:59:59 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940415 snapshot ] + * cp/decl.c (duplicate_decls, pushdecl, builtin_function): + Use DECL_FUNCTION_CODE instead of DECL_SET_FUNCTION_CODE. + + Mon Apr 18 11:55:18 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940409 snapshot ] + * cp/decl.c (duplicate_decls): Put new type in same obstack as + old ones, or permanent if old ones in different obstacks. + + Mon Apr 18 11:48:49 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940401 snapshot ] + * cp/parse.y (attrib): Handle string args as expressions, + merging the two rules. `mode' attribute now takes a string arg. + Delete the rule for an identifier as arg. + + Mon Apr 18 11:24:00 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940312 snapshot ] + * cp/typeck.c (pointer_int_sum): Multiplication should be done signed. + (pointer_diff): Likewise the division. + + Sun Mar 6 19:43:39 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940304 snapshot ] + * cp/decl.c (finish_decl): Issue warning for large objects, + if requested. + + Sat Feb 19 22:20:32 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940218 snapshot ] + * cp/parse.y (attrib): Handle attribute ((section ("string"))). + * cp/decl.c (duplicate_decls): Merge section name into new decl. + + Tue Feb 8 09:49:17 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp/* changes propagated from c-* changes in 940206 snapshot ] + * cp/typeck.c (signed_or_unsigned_type): Check for any + INTEGRAL_TYPE_P not just INTEGER_TYPE. + + Mon Dec 6 13:35:31 1993 Norbert Kiesel (norbert@i3.INformatik.rwth-aachen.DE) + + * cp/decl.c (finish_enum): Start from 0 when determining precision + for short enums. + + Fri Dec 3 17:07:58 1993 Ralph Campbell (ralphc@pyramid.COM) + + * cp/parse.y (unary_expr): Look at $1 for tree_code rather than + casting $$. + + Wed Nov 17 19:22:09 1993 Chip Salzenberg <chip@fin.uucp> + + * cp/typeck.c (build_binary_op_nodefault): Propagate code + from C front-end to optimize unsigned short division. + (build_conditional_expr): Fix bug in "1 ? 42 : (void *) 8". + + Wed Nov 17 19:17:18 1993 Chip Salzenberg <chip@fin.uucp> + + * cp/call.c (convert_harshness_ansi): Given an (e.g.) char + constant, prefer 'const char &' to 'int'. + + Wed Feb 3 13:11:48 1993 Chip Salzenberg <chip@fin.uucp> + + * cp/class.c (finish_struct_methods): Handle multiple + constructors in fn_fields list. + +Fri Apr 22 12:48:10 1994 Kung Hsu <kung@mexican.cygnus.com> + + * class.c (finish_struct): use TYPE_DECL_SUPPRESS_DEBUG to flag + types not to be dumped in stabs, like types in #pragma interface. + * decl.c (init_decl_processing): use TYPE_DECL_SUPPRESS_DEBUG to + mark unknown type. + +Fri Apr 22 03:27:26 1994 Doug Evans <dje@cygnus.com> + + * Language directory reorganization. + See parent makefile. + +Thu Apr 21 18:27:57 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * cp-tree.h (THUNK_DELTA): It is normally negative, so + use signed .i variant of frame_size rather than unsigned .u. + * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, + use "VT" rather than "vt" due to binary incompatibility. + * class.c (get_vtable_name): Use strlen of VTABLE_NAME_FORMAT, + rather than sizeof, since it is now an expression. + * class.c (modify_one_vtable): Modify to skip initial element + containing a count of the vtable. + +Thu Apr 21 00:09:02 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (check_newline): Force interface_unknown on main input file. + + * pt.c (do_pending_expansions): Always emit functions that have been + explicitly instantiated. + (do_function_instantiation): Set DECL_EXPLICITLY_INSTANTIATED. + (do_type_instantiation): Set CLASSTYPE_VTABLE_NEEDS_WRITING and + DECL_EXPLICITLY_INSTANTIATED on all my methods. + * parse.y (explicit_instantiation): Call do_type_instantiation for + types. + * decl2.c (finish_vtable_vardecl): Call import_export_vtable. + * decl.c (start_function): Don't set DECL_EXTERNAL on a function + that has been explicitly instantiated. + * cp-tree.h (DECL_EXPLICITLY_INSTANTIATED): Alias for + DECL_LANG_FLAG_4. + * class.c: Move import_export_vtable to decl2.c, and comment out all + uses. + +Wed Apr 20 16:51:06 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (process_next_inline): Don't muck with DECL_INLINE. + (do_pending_inlines): Likewise. + +Tue Apr 19 22:25:41 1994 Mike Stump <mrs@cygnus.com> + + Reimplement vtable building, and most vtable pointer setting. + Allows for earier maintenance, easier understandability, and most + importantly, correct semantics. + + * class.c (build_vtable): Removed unneeded + SET_BINFO_VTABLE_PATH_MARKED. + * class.c (prepare_fresh_vtable): Likewise. Added argument. + * class.c (modify_vtable_entry): General cleanup. + * class.c (related_vslot, is_normal, modify_other_vtable_entries, + modify_vtable_entries): Removed. + * class.c (add_virtual_function): General cleanup. + * class.c (finish_base_struct): Setup BINFO_VTABLE and + BINFO_VIRTUALS as early as we can, so that modify_all_vtables can + work. + * class.c (finish_vtbls): New routine, mostly from + unmark_finished_struct. + * class.c (overrides): New routine. + * class.c (modify_one_vtable): New routine, mostly from + modify_other_vtable_entries and modify_vtable_entries. + * class.c (modify_all_direct_vtables, modify_all_indirect_vtables, + modify_all_vtables): New routines. + * class.c (finish_struct): Added arguemnt to prepare_fresh_vtable + call. General cleanup on how pending_hard_virtuals are handled. + General cleanup on modifying vtables. Use finish_vtbls, instead of + unmark_finished_struct. + * cp-tree.h (init_vtbl_ptrs, expand_direct_vtbls_init, + get_first_matching_virtual, get_matching_virtual, + expand_vbase_vtables_init, expand_indirect_vtbls_init): Update. + * cvt.c (convert_pointer_to_real): cleanup error message. + * decl.c (grokfndecl): General cleanup. + * decl.c (finish_function): Change init_vtbl_ptrs call to + expand_direct_vtbls_init. Change expand_vbase_vtables_init call to + expand_indirect_vtbls_init. + * init.c (expand_virtual_init): Remove unneeded argument. + * init.c (init_vtbl_ptrs): Rename to expand_direct_vtbls_init, added + two arguments to make more general. Made more general. Now can be + used for vtable pointer initialization from virtual bases. + * init.c (emit_base_init): Change expand_vbase_vtables_init call to + expand_indirect_vtbls_init. Change init_vtbl_ptrs call to + expand_direct_vtbls_init. + * init.c (expand_virtual_init): General cleanup. + * init.c (expand_default_init): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * init.c (expand_recursive_init_1): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * init.c (expand_recursive_init): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * search.c (get_first_matching_virtual): Rename to + get_matching_virtual. General cleanup and remove setting of + DECL_CONTEXT. That is now done in a cleaner way in + modify_vtable_entry and add_virtual_function. + * search.c (expand_vbase_vtables_init): Rename to + expand_indirect_vtbls_init. General cleanup. Use + expand_direct_vtbls_init to do hard work. Ensures that _all_ vtable + pointers from virtual bases are set up. + * search.c (bfs_unmark_finished_struct, unmark_finished_struct): + Removed. + + * *.[chy]: Remove support for VTABLE_USES_MASK. + +Tue Apr 19 12:51:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): Use NOP_EXPRs to switch between + reference and pointer types instead of bashing the types directly. + + * call.c (build_overload_call_real): Use the TREE_CODE to determine + whether the function is overloaded or not, rather than + TREE_OVERLOADED. + * *: Remove all uses of TREE_OVERLOADED. + + * decl.c (grokdeclarator): Only complain about initializing const + fields when -ansi or -pedantic. + +Tue Apr 19 12:42:42 1994 Doug Evans <dje@canuck.cygnus.com> + + * cp-tree.h (THUNK_DELTA): frame_size is now a union. + +Mon Apr 18 00:17:13 1994 Jason Merrill <jason@deneb.cygnus.com> + + Do overloading on a block-by-block basis, not function-by-function. + * decl.c: Lose overloads_to_forget. + (struct binding_level): Add overloads_shadowed field. + (poplevel): Restore overloads_shadowed. + (push_overloaded_decl): Use overloads_shadowed instead of + overloads_to_forget. + (finish_function): Don't look at overloads_to_forget. + + Copy enum_overflow logic from c-decl.c. + * decl.c (start_enum): Initialize enum_overflow. + (build_enumerator): Use enum_overflow. Also use current_scope(). + + * search.c (current_scope): Move Brendan's comment from + build_enumerator here. + + * typeck.c (convert_for_assignment): Change warnings to pedwarns for + discarding const/volatile. + +Sat Apr 16 01:18:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (comp_target_parms): Accept TEMPLATE_TYPE_PARMs on the rhs. + (comp_target_types): Likewise. + + * decl.c (lookup_name): Don't unset got_scope here. + + * spew.c (yylex): Only replace yylval with the TYPE_NESTED_NAME if + got_scope != NULL_TREE. + +Fri Apr 15 16:36:33 1994 Jason Merrill <jason@deneb.cygnus.com> + + Horrible kludge to prevent templates from being instantiated by + their base classes. + * parse.y (template_instantiate_once): Unset TYPE_BEING_DEFINED + before we get to left_curly. + * pt.c (instantiate_class_template): Set TYPE_BEING_DEFINED. + + * error.c (dump_decl): If it's a typedef, print out the name of the + decl, not just the underlying type. + + * decl.c (pushdecl): If the old duplicate decl was a TYPE_DECL, + update the IDENTIFIER_TYPE_VALUE of its name. + + * decl2.c (finish_file): When processing the initializer for a + static member, pretend that the dummy function is a member of the + same class. + +Fri Apr 15 15:56:35 1994 Kung Hsu <kung@mexican.cygnus.com> + + * class.c (build_vtable_entry): revert Apr 4 change. + * decl2.c (mark_vtable_entries): replace pure virtual function + decl with abort's. + +Fri Apr 15 13:49:33 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_conditional_expr): Pedwarn on pointer/integer + mismatch, and don't pedwarn on 0/function pointer mismatch. + + * typeck2.c (digest_init): Lose code for special handling of unions. + (process_init_constructor): Since they're handled just fine here. + Pedwarn on excess elements. + + * decl2.c (grokfield): Complain about local class method declaration + without definition. + +Fri Apr 15 13:19:40 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * method.c (emit_thunk): Add extern declaration for + current_call_is_indirect (needed for hppa). + +Thu Apr 14 16:12:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + Improve local class support; allow classes in different blocks to + have the same name. + * decl.c (pushtag): Support local classes better. + (pushdecl_nonclass_level): New function for pushing mangled decls of + nested types into the appropriate scope. + (xref_defn_tag): Use pushdecl_nonclass_level instead of + pushdecl_top_level. + (grokfndecl): Don't mess with IDENTIFIER_GLOBAL_VALUE for local + class methods. + * method.c (do_inline_function_hair): Likewise. + + * class.c (finish_struct): It is legal for a class with no + constructors to have nonstatic const and reference members. + +Thu Apr 14 07:15:11 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * decl.c (push_overloaded_decl): Avoid giving errors about + built-ins, since duplicate_decls will have given warnings/errors + for them. + +Thu Apr 14 03:45:12 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): Warn about casting pointer type to + reference type when this is probably not what they wanted. + +Wed Apr 13 13:12:35 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (finish_decl): Don't mindlessly set TREE_USED for + static consts any more (toplev.c has now been modified to + not emit warnings if they are unused). + +Wed Apr 13 00:22:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_op_properties): If op new/delete get here with + METHOD_TYPEs, do a revert_static_member_fn. + + * cp-tree.h (IDENTIFIER_CLASS_TYPE_VALUE): Lose. + * init.c (is_aggr_typedef): Don't look at + IDENTIFIER_CLASS_TYPE_VALUE. + (get_aggr_from_typedef): Likewise. + (get_type_value): Likewise. + * call.c (build_scoped_method_call): Don't rely on overloaded + template names having IDENTIFIER_CLASS_VALUE set. + + * parse.y (component_decl_1, fn.def2): Revert rules for + constructors. + (component_decl_1, fn.def2): Use $1 instead of $$, since $$ is being + clobbered. + + * decl.c (start_function): Only warn about `void main()' if pedantic + || warn_return_type. + +Tue Apr 12 02:14:17 1994 Jason Merrill <jason@deneb.cygnus.com> + + Clean up overloading of the template name. + * class.c (pushclass): overload the template name whenever pushing + into the scope of a template class, not just if it is + uninstantiated. + (popclass): Correspondingly. + * search.c (push_class_decls): Don't overload_template_name. + * pt.c (overload_template_name): Don't set IDENTIFIER_LOCAL_VALUE or + DECL_CONTEXT on things. + * parse.y (left_curly): Don't overload_template_name. + * class.c (finish_struct): Don't undo_template_name_overload. + + * method.c (build_opfncall): Only pass one argument to global op + delete. + + * call.c (build_method_call): Use TYPE_VEC_DELETE_TAKES_SIZE to + decide how many arguments to use for vec delete. + + * decl.c (grok_op_properties): Be consistent in modifying + current_class_type. + (grokdeclarator): Only complain about function decls with no return + type if we're being pedantic. + +Mon Apr 11 00:10:53 1994 Jason Merrill <jason@deneb.cygnus.com> + + Add support for operator new [] and operator delete []. + + * tree.def: Add VEC_NEW_EXPR and VEC_DELETE_EXPR. + * ptree.c (print_lang_type): Indicate vec new/delete. + * parse.y: Support vec new/delete. + * method.c (build_decl_overload): Deal with vec new/delete. + (build_opfncall): Likewise. + * lex.c (init_lex): Set up values of ansi_opname and opname_tab for + vec new/delete. vec new uses "__vn", and vec delete uses "__vd". + * init.c (init_init_processing): Set up BIVN and BIVD. + (do_friend): Don't clean up after mistaken setting of TREE_GETS_NEW, + since it doesn't happen any more. + (build_new): Support vec new. Always call something. + (build_x_delete): Support vec delete. + (build_vec_delete): Lose dtor_dummy argument, add use_global_delete, + and pass it to build_x_delete. + * decl2.c (delete_sanity): Don't change behavior by whether or not + the type has a destructor. Pass use_global_delete to + build_vec_delete. + (coerce_delete_type): Make sure that the type returned has a first + argument of ptr_type_node. + * decl.c (init_decl_processing): Also declare the global vec + new/delete. + (grokdeclarator): Also force vec new/delete to be static. + (grok_op_properties): Note presence of vec new/delete, and play with + their args. If vec delete takes the optional size_t argument, set + TYPE_VEC_DELETE_TAKES_SIZE. + * cp-tree.h (TYPE_GETS_{REG,VEC}_DELETE): New macros to simplify + checking for one delete or the other. + (lang_type): gets_new and gets_delete are now two bits long. The + low bit is for the non-array version. Lose gets_placed_new. + (TYPE_VEC_DELETE_TAKES_SIZE): New macro indicating that the vec + delete defined by this class wants to know how much space it is + deleting. + (TYPE_VEC_NEW_USES_COOKIE): New macro to indicate when vec new must + add a header containing the number of elements in the vector; i.e. + when the elements need to be destroyed or vec delete wants to know + the size. + * class.c (finish_struct_methods): Also check for overloading vec + delete. + * call.c (build_method_call): Also delete second argument for vec + delete. + + * decl.c (grokdeclarator): Correct complaints again. + (grokdeclarator): Fix segfault on null declarator. + (decls_match): Also accept redeclaration with no arguments if both + declarations were in C context. Bash TREE_TYPE (newdecl) here. + (duplicate_decls): Instead of here. + + * parse.y (nested_name_specifier_1): Lose rules for dealing with + syntax errors nicely, since they break parsing of 'const i;'. + + * decl.c (lookup_name): if (got_scope == current_class_type) + val = IDENTIFIER_CLASS_VALUE (name). + + * search.c (lookup_nested_tag): Look in enclosing classes, too. + + * spew.c (yylex): Only look one character ahead when checking for a + SCOPE. + + * lex.c (check_newline): Read first nonwhite char before + incrementing lineno. + + * decl.c (grokdeclarator): Don't claim that typedefs are variables + in warning. + + * parse.y: Divide up uses of unqualified_id into + notype_unqualified_id and unqualified_id, so that TYPENAME can be + used as an identifier after an object. + + * class.c (push_nested_class): Don't push into non-class scope. + + * decl.c (grokdeclarator): If an identifier could be a type + conversion operator, but has no associated type, it's not a type + conversion operator. + + * pt.c (unify): Check for equality of constants better. + + * decl.c (grokdeclarator): Don't complain about access decls. + +Sun Apr 10 02:39:55 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): pedwarn about data definitions without + types here. + + * parse.y (datadef): Don't pedwarn about decls without types here, + since that is valid for functions. + (fn.def2, component_decl): Support constructors with declmods again. + (nomods_initdecls): For decls without any mods, so that we don't try + to get declspecs from some arbitrary $0. + + * search.c (lookup_field): Use cp_error. + + * parse.y (nested_name_specifier_1): Don't check aggr/non-aggr type + here; it breaks destructors for non-aggr types. + + * decl.c (lookup_name): Only look for TYPE_DECLs in base classes of + a type being defined, like the comment says. + If got_scope is not an aggregate, just return NULL_TREE. + + * pt.c (create_nested_upt): Kung's code for creating types nested + within uninstantiated templates now lives here (it used to live in + hack_more_ids). It needs to be expanded. + + * parse.y: Stop calling see_typename so much. + + * decl.c (lookup_name): Deal with TTPs and UPTs. + + * lex.c (real_yylex): Don't set looking_for_typename just because we + saw a 'new'. + (dont_see_typename): #if 0 out. + + * spew.c (yylex): Increment looking_for_typename if the next + character is SCOPE, rather than setting it to 1; this way, the value + from seeing an aggr specifier will not be lost. This kinda relies + on looking_for_typename never being < 0, which is now true. + + * parse.y (nested_name_specifier_1): Accept TEMPLATE_TYPE_PARMs, + too. + (named_class_head_sans_basetype): Accept template types, too. Oops. + +Fri Apr 8 16:39:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (reparse_decl_as_expr1): Handle SCOPE_REFs. + + * parse.y: Lose START_DECLARATOR. + + * search.c (lookup_nested_tag): New function to scan CLASSTYPE_TAGS + for a class. + + * parse.y: Simplify fn.def2 and component_decl. Support 'enum + A::foo' syntax. Catch invalid scopes better. + + * parse.y, lex.c: lose TYPENAME_COLON. + + * decl2.c (groktypefield): #if 0 out. + + * decl.c (lookup_name): If the type denoted by got_scope is + currently being defined, look in CLASSTYPE_TAGS rather than FIELDS. + + * class.c (push_nested_class): Don't try to push into + error_mark_node. + +Fri Apr 8 07:26:36 1994 Brendan Kehoe <brendan@lisa.cygnus.com> + + * Makefile.in (stamp-parse): Update count of conflicts to 33. + +Thu Apr 7 17:47:53 1994 Jason Merrill <jason@deneb.cygnus.com> + + A saner implementation of nested types that treats template types + no differently from non-template types. There are still some + shortcomings of our system; most notably, it is difficult to look + for a nested type that is hidden by another name, because of the way + we keep track of hidden types. But this shouldn't be a problem for + just about anyone. Perhaps lookup_field should be fixed up a bit. + + * spew.c: Moved handling of nested types/scoping from the lexer + into the parser. Removed variable template_type_seen_before_scope. + Removed functions frob_identifier, hack_more_ids, and various cruft + that was #if 0'd out in the past, reducing the size of the file from + 1146 lines to 450 lines. We can't quite do away with spew.c yet, + though; we still need it for do_aggr () and checking for SCOPE after + the current identifier. And setting lastiddecl. + + * parse.y: Moved handling of nested types/scoping from the lexer + into the parser, using a new global variable `got_scope'. Reduced + the number of states by 53. Implemented all uses of explicit global + scope. Removed terminals SCOPED_TYPENAME and SCOPED_NAME. Removed + nonterminals tmpl.1, scoped_base_class, id_scope, typename_scope, + scoped_typename. Added nonterminals nested_type, + qualified_type_name, complete_type_name, qualified_id, ptr_to_mem, + nested_name_specifier, global_scope, overqualified_id, type_name. + Changed many others. Added 9 new reduce/reduce conflicts, which are + nested type parallels of 9 that were already in the grammar for + non-nested types. Eight of the now 33 conflicts should be removed + in the process of resolving the late binding between variable and + function decls. + + * gxxint.texi (Parser): Update. + + * cp-tree.h (IS_AGGR_TYPE_CODE): Add UNINSTANTIATED_P_TYPE. + + * lex.h: Add decl for got_scope. + + * lex.c (see_typename): Claim to be the lexer when calling + lookup_name. + + * decl.c (lookup_name): When called from the lexer, look at + got_scope and looking_at_typename; otherwise don't. + +Thu Apr 7 22:05:47 1994 Mike Stump <mrs@cygnus.com> + + 31th Cygnus<->FSF merge. + +Thu Apr 7 17:47:53 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (mark_vtable_entries): Call this to mark all the + entries in the vtable addressable. + (finish_decl_parsing): Handle SCOPE_REFs. + + * decl.c (decls_match): Always call compparms with strict == 1. + Handle the special case of C function redecl here. + (duplicate_decls): Only keep the old type if the new decl takes no + arguments. + + * typeck.c (compparms): Also allow t1 to be ... if strict == 0. + +Thu Apr 7 16:17:50 1994 Mike Stump <mrs@cygnus.com> + + * class.c (build_vtable_entry): Fix breakage introduced Apr 5 + 17:48:41. + +Wed Apr 6 16:05:10 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * init.c (build_virtual_init), search.c (build_vbase_vtables_init), + ch-tree.h: Every place these functions were called, the result was + immediately passed to expand_expr_stmt. Reduce redundancy by + calling expand_expr_init *inside* these functions. These + makes for a simpler interface, and we don't have to build + compound expressions. Hence, rename these function to: + expand_virtual_init and expand_vbase_vtables_init respectively. + * init.c, decl.c: Change callers of these functions. + * init.c, cp-tree.h (expand_virtual_init): Make static. + + * decl2.c (finish_file): Check TREE_PUBLIC||TREE_ADDRESSABLE + rather than DECL_SAVED_INSNS before emitting inlines. + +Wed Apr 6 13:06:39 1994 Jason Merrill <jason@deneb.cygnus.com> + + * spew.c (init_spew): #if 0 out stuff used by arbitrate_lookup. + + * decl.c (duplicate_decls): If this is a new declaration of an + extern "C" function, keep the type (for the argtypes). + (redeclaration_error_message): Don't check DECL_LANGUAGE here. + (decls_match): Call compparms with a value of strict dependent on + the value of strict_prototypes for DECL_LANGUAGE (oldecl). + + * typeck.c (compparms): ... is only equivalent to non-promoting + parms if we're not being strict. + + * parse.y (empty_parms): Don't check flag_ansi || pedantic here. + + * decl.c (init_decl_processing): if (flag_ansi || pedantic) + strict_prototypes_lang_c = strict_prototypes_lang_cplusplus; + + * decl2.c (grok_function_init): Don't set DECL_INITIAL on pure + virtuals. + +Tue Apr 5 17:48:41 1994 Per Bothner <bothner@kalessin.cygnus.com> + + Support for implementing vtables with thunks. + * tree.def (THUNK_DECL): New TREE_CODE. + * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY), tree.c + (fnaddr_from_vtable_entry): Handle flag_vtable_thunks case. + * cp-tree.h (memptr_type): New variable. + * class.c (build_vtable_entry): Build thunk if necessary. + * class.c (build_vfn_ref): If using thunks, don't need + to add delta field from vtable (there is none!). + * decl.c: Add memptr_type as well as vtable_entry_type. + If using thunks, the latter is just ptr_type_node. + * gc.c, typeck.c: Use memptr_typeChange, not vtable_entry_type. + * decl2.c (finish_vtable_vardecl): Handle thunks. + * expr.c (cplus_expand_expr): Support THUNK_DECL. + + * decl.c (grokdeclarator): Set DECL_THIS_EXTERN if "extern". + * decl.c (start_function): Set current_extern_inline based on + DECL_THIS_EXTERN, not TREE_PUBLIC. + * decl.c (finish_function): Call mark_inline_for_output if needed, + + Improve intelligence about when to emit inlines. + * cp-tree.h (lang_decl_flags): New field saved_inline. + * cp-tree.h (DECL_SAVED_INLINE): New macro. + * class.c (add_virtual_function): Don't set TREE_ADDRESSABLE. + * decl.h, decl.c (pending_addressable_inlines): Removed. + * decl2.c (pending_addressable_inlines): Renamed to saved_inlines. + * decl2.c (mark_inline_for_output): Do nothing if + DECL_SAVED_INLINE; otherwise set it (and add to saved_inlines list). + * decl2.c (finish_vtable_vardecl): SET_CLASSTYPE_INTERFACE_KNOWN + and set CLASSTYPE_INTERFACE_ONLY if there is a non-inline virtual. + * decl2.c (finish_file): Writing out inlines later, so we can + also handle the ones needed for vtbales. + * decl2.c (write_vtable_entries, finish_vtable_typedecl): Removed. + + * cp-tree.h, class.c, decl2.c, search.c: Remove -fvtable-hack + and flag_vtable_hack. Use -fvtable-thunks and flag_vtable_thunks + instead. (The rationale is that these optimizations both break binary + compatibility, but should become the default in a future release.) + +Wed Apr 6 10:53:56 1994 Mike Stump <mrs@cygnus.com> + + * class.c (modify_vtable_entries): Never reset the DECL_CONTEXT + of a fndecl, as we might not be from that vfield. + +Tue Apr 5 17:43:35 1994 Kung Hsu <kung@mexican.cygnus.com> + + * class.c (add_virtual_function): fix bug for pure virtual, so + that DECL_VINDEX of the dummy decl copied won't be error. + (see also Apr 4 change) + +Tue Apr 5 17:23:45 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * typeck.c (c_expand_return): Before checking that we're not + returning the address of a local, make sure it's a VAR_DECL. + (And don't worry about it being a TREE_LIST.) + +Tue Apr 5 13:26:42 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (YYDEBUG): Always define. + * lex.c (YYDEBUG): Likewise. + +Mon Apr 4 11:28:17 1994 Kung Hsu <kung@mexican.cygnus.com> + + * class.c (finish_struct): backup out the change below, put the + new change for the same purpose. The change below breaks code. + + * class.c (finish_struct): if pure virtual, copy node and make + RTL point to abort, then put in virtual table. + * decl2.c (grok_function_iit): reinstate Mar 31 change. + +Sat Apr 2 03:12:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_new): pedwarn about newing const and volatile + types. + + * tree.c (get_identifier_list): Only do the special handling + thing if we're dealing with the main variant of the record type. + + * cvt.c (convert_to_reference): When converting between + compatible reference types, use the pointer conversion machinery. + Don't just blindly overwrite the old type. + +Fri Apr 1 17:14:42 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): When looking at global functions, + be sure to use instance_ptr for the first argument, not some version + of it that has been cast to a base class. Also do this before + comparing candidates. + +Thu Mar 31 19:50:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Constructors can be called for + const objects. + +Thu Mar 31 16:20:16 1994 Kung Hsu <kung@mexican.cygnus.com> + + * decl2.c (grok_func_init): do not abort as rtl for pur virtual + fucntions. They can be defined somewhere else. + +Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aachen.de) + + * decl.c (init_decl_processing): Declare __builtin_return_address + and __builtin_frame_address for C++ as well. + +Thu Mar 31 12:35:49 1994 Mike Stump <mrs@cygnus.com> + + * typeck2.c (store_init_value): Integral constant variables are + always constant, even when doing -fpic. + +Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aachen.de) + + * decl.c (redeclaration_error_message): Pass the types to + comptypes. + +Wed Mar 30 21:29:25 1994 Mike Stump <mrs@cygnus.com> + + Cures incorrect errors about pure virtuals in a class, when they + have been overridden in a derived class. + + * search.c (get_abstract_virtuals): Reimplement. + * search.c (get_abstract_virtuals_1): New routine. + +Wed Mar 30 14:10:04 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (push_template_decls): Make the pushed level pseudo + global. + + * parse.y (extdefs): Don't pop everything if the current binding + level is pseudo_global. + + * decl.c (pop_everything): Stop on reaching a pseudo-global + binding level. + + * cp-tree.h (DECL_FUNCTION_MEMBER_P): Change to more reliable test. + + * decl.c (duplicate_decls): Only copy DECL_SOURCE_{FILE_LINE} if + the old decl actually had an initializer. + + * {various}: Clean up gcc -W complaints. + + * cp-tree.h (DECL_FUNCTION_MEMBER_P): Currently defined to be + (DECL_CONTEXT (NODE) != NULL_TREE). + + * parse.y (lang_extdef): Call pop_everything if necessary. + + * decl.c (pop_everything): New function for popping binding + levels left over after a syntax error. + (pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not + a function is a member. + +Wed Mar 30 14:20:50 1994 Mike Stump <mrs@cygnus.com> + + Cures calling a more base base class function, when a more derived + base class member should be called in some MI situations. + + * search.c (make_binfo): Use more the more specialized base + binfos from the binfo given as the second argument to make_binfo, + instead of the unspecialized ones from the TYPE_BINFO. + * class.c (finish_base_struct): Likewise, update callers. + * search.c (dfs_get_vbase_types): Likewise. + * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. + * decl.c (xref_tag): Use NULL_TREE instead of 0. + * lex.c (make_lang_type): Likewise. + +Wed Mar 30 14:10:04 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (pushdecl): If pushing a C-linkage function, only do a + push_overloaded_decl. + (duplicate_decls): Standard overloading does not shadow built-ins. + +Tue Mar 29 00:54:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (end_template_decl): Don't call push_overloaded_decl. + + * init.c (do_friend): Don't call push_overloaded_decl. + + * decl.c (pushdecl): Call push_overloaded_decl for functions and + function templates. + (duplicate_decls): functions and function templates are not + duplicates, but don't complain about calling this function to + compare them. + (push_overloaded_decl): Don't deal with linkage. Call + duplicate_decls. + (redeclaration_error_message): Deal with linkage. + + * decl.c (start_function): If push_overloaded_decl returns an + older version of the function, deal with it. + + * decl.c (start_function): Be sure only to push_overloaded_decl + for non-members. + + * decl.c (grokfndecl): Put back clearing of DECL_CHAIN for + methods. + (start_function): Lose broken and redundant code for checking old + decl. + + * init.c (add_friend): Give line numbers of both friend decls + when warning about re-friending. + + * pt.c (tsubst): Use comptypes rather than == to compare the + types of the method as declared and as defined, since default + parameters may be different. + + * call.c (build_method_call): Use brendan's candidate printing + routine. + + * decl.c (start_method): Methods defined in the class body are + inline whether or not it's a template class. + +Mon Mar 28 16:39:26 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (initdcl0): Add "extern" to current_declspecs if + have_extern_spec && ! used_extern_spcec. + + * tree.c (really_overloaded_fn): A fn with more than one + overload. + + * pt.c (end_template_decl): Use really_overloaded_fn. + + * decl.c (duplicate_decls): When smashing a decl into a previous + definition, keep the old file and line. + Don't deal with overloaded functions. + Lose old code for checking arg types of functions. + Check for overloaded C functions. + (pushdecl): Deal with overloaded functions. + (start_decl): Expect pushdecl to return an appropriate function decl. + (start_function): Likewise. + (push_overloaded_decl): Don't check for overloaded C functions. + + * *.c: Stop using DECL_OVERLOADED, it being archaic. + TREE_OVERLOADED should probably go, too. + +Mon Mar 28 14:00:45 1994 Ron Guilmette <rfg@netcom.com> + + * typeck.c (comp_target_types): Call comp_target_parms with + strict == 1. + +Sun Mar 27 00:07:45 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (empty_parms): Don't parse () as (...) in extern "C" + sections if we're compiling with -ansi or -pedantic. + + * decl.c (decls_match): Don't treat (int) and (int&) as matching. + + * decl2.c (grokfield): Don't pedwarn twice about initializing + field. + + * decl.c (push_overloaded_decl): Warn about shadowing + constructor. + (redeclaration_error_message): Don't allow 'int a; int a;' + + * cvt.c (build_up_reference): Only check for valid upcast if + LOOKUP_PROTECT is set, not just any flag. + +Fri Mar 25 01:22:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (check_newline): When we see a #pragma implementation, + also set it for the main input file. + + * init.c (build_new): Convert array size argument to size_t. + + * parse.y (primary): If we're doing a parenthesized type-id, call + groktypename before passing it to build_new. + + * call.c (build_method_call): Deal properly with const and + volatile for instances of reference type. + + * decl.c (store_return_init): Change 'if (pedantic) error' to 'if + (pedantic) pedwarn'. + + * decl.c (grokdeclarator): Don't complain about putting `static' + and `inline' on template function decls. + +Thu Mar 24 23:18:19 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Preserve const & volatile on + `this'. + +Thu Mar 24 16:21:52 1994 Mike Stump <mrs@cygnus.com> + + * init.c (build_new, build_vec_delete): Use global new and delete + for arrays. + * decl2.c (delete_sanity): Likewise. + +Thu Mar 24 02:10:46 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): If i is an lvalue, + (int &)i -> *(int*)&i, as per 5.2.8p9 of the latest WP. + (convert_force): Call convert_to_reference with LOOKUP_COMPLAIN. + +Wed Mar 23 17:45:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (duplicate_decls): Also propagate DECL_TEMPLATE_MEMBERS + and DECL_TEMPLATE_INSTANTIATIONS. + + * init.c (build_new): Handle array typedefs properly. + +Wed Mar 23 18:23:33 1994 Mike Stump <mrs@cygnus.com> + + 30th Cygnus<->FSF merge. + +Wed Mar 23 00:46:24 1994 Mike Stump <mrs@cygnus.com> + + * class.c (modify_vtable_entries): Avoid running off the end of the + virtuals list when processing a virtual destructor. + * class.c (get_vtable_entry): Likewise. + +Wed Mar 23 00:23:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (duplicate_decls): If two template decls don't match, + just return 0. + +Tue Mar 22 23:49:41 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (convert_for_assignment): Don't pedwarn about + converting function pointer to void *. + +Tue Mar 22 22:23:19 1994 Mike Stump <mrs@cygnus.com> + + Major revamp of pointer to member functions. Cures major + nonfunctionality when used in casts, and MI situations. + + * cvt.c (convert_force): Update call site of build_ptrmemfunc. + * typeck.c (convert_for_assignment): Likewise. + * typeck2.c (digest_init): Likewise. + * typeck2.c (process_init_constructor): Simplify by moving code into + digest_init. + * typeck2.c (digest_init): Do default_conversions on init value, if + we are processing pointer to member functions. + * class.c (get_vfield_offset): Now non-static. Convert bit offset + into byte offset. + * cp-tree.h (get_vfield_offset): Likewise. + * typeck.c (get_member_function_from_ptrfunc): Convert down to right + instance, before fetching vtable pointer. + * typeck.c (get_delta_difference): New routine. + * typeck.c (build_ptrmemfunc): Revamp to handle casting better, also + get vtable pointer out of right subobject. + +Tue Mar 22 17:56:48 1994 Mike Stump <mrs@cygnus.com> + + * search.c (get_binfo): Return NULL instead of aborting, when + passed a UNION_TYPE. + +Tue Mar 22 12:44:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + These patches implement handling of redefinition/redeclaration of + templates. + + * typeck.c (comptypes): Simplify. All TEMPLATE_TYPE_PARMs are + considered compatible. + + * parse.y (template_def): Pass defn argument to end_template_decl. + + * pt.c (end_template_decl): Add defn argument. Check for + redefinition. Simplify. + + * error.c (OB_UNPUT): New macro, to remove mistakes. + (aggr_variety): Subroutine of dump_aggr_type. + + * decl.c (decls_match): Support templates. + (duplicate_decls): No longer static. Don't try to lay out template + decls. + (pushdecl): Simplify. + + * cp-tree.h (DECL_TEMPLATE_MEMBERS): Use DECL_SIZE instead of + DECL_INITIAL. + +Mon Mar 21 11:46:55 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_decl): Support class template decls. + (dump_type): Don't adorn template type parms. + + * decl.c (duplicate_decls): Save DECL_TEMPLATE_INFO from old decl + if it was a definition. + (redeclaration_error_message): Do the cp_error thang, and reject + redefinition of templates. + +Mon Mar 21 19:36:06 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (grokdeclarator): Set TREE_PUBLIC for METHOD_TYPE + in FIELD context, when appropriate. Also, + CLASSTYPE_INTERFACE_ONLY is irrelevant to setting TREE_PUBLIC. + Also, simplify check for bogus return specifiers. + +Mon Mar 21 11:46:55 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (after_type_declarator1): Expand type_quals. + (notype_declarator1): Likewise. + (absdcl1): Likewise. + +Sat Mar 19 01:05:17 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Treat class-local typedefs like static + members; i.e. 'typedef int f();' means that f is a function type, + not a method type. + + * parse.y (decl): Change direct_* back to *. + (type_id): Change direct_abstract_declarator to absdcl. + (direct_declarator, direct_initdecls, direct_initdcl0): Remove again. + +Fri Mar 18 12:47:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + These two patches fix crashes on instantiating a template inside a + function with C linkage or containing labels. + + * class.c (current_lang_stacksize): No longer static. + + * decl.c (struct saved_scope): Add lang_base, lang_stack, + lang_name, lang_stacksize, and named_labels. + (push_to_top_level): Save them. + (pop_from_top_level): Restore them. + + * gxxint.texi (Parser): Update. + + These two patches finish moving the task of expr/declarator + ambiguity resolution from the lexer to the parser, and add one more + r/r conflict. START_DECLARATOR can now be nuked. + + * parse.y (decl): Add "direct_" in typespec X rules. + (direct_declarator): New nonterminal for + direct_after_type_declarator and direct_notype_declarator. + (direct_initdecls): Like initdecls, but uses direct_initdcl0. + (direct_initdcl0): Like initdcl0, but uses direct_declarator. + (named_parm): Add typespec direct_declarator rule. + + * spew.c (yylex): #if 0 out START_DECLARATOR insertion. + + These two patches disable some excessive cleverness on the part of + g++; a non-class declaration always hides a class declaration in the + same scope, and g++ was trying to unhide it depending on the + enclosing expression. + + * spew.c (arbitrate_lookup): #if 0 out. + + * decl.c (lookup_name): Never call arbitrate_lookup. + + * parse.y (complex_notype_declarator1): Add '*' + complex_notype_declarator1 and '&' complex_notype_declarator1 rules. + + * parse.y (complex_direct_notype_declarator): Restore id_scope + see_typename TYPENAME rule, remove all other rules beginning with + those tokens. + (notype_unqualified_id): Add '~' see_typename IDENTIFIER rule. + +Thu Mar 17 17:30:01 1994 Jason Merrill <jason@deneb.cygnus.com> + + These changes fix the compiler's handling of the functional cast/ + object declaration ambiguities in section 6.8 of the ARM. They also + add 11 reduce/reduce conflicts. Sigh. + + * parse.y: Add precedence decls for OPERATOR and '~'. + (notype_unqualified_id): New nonterminal, encompasses all of the + ANSI unqualified-id nonterminal except TYPENAMEs. + (expr_or_declarator): New nonterminal to delay parsing of code like + `int (*a)'. + (primary): Use notype_unqualified_id. + (decl): Add typespec initdecls ';' and typespec declarator ';' + rules. + (initdcl0): Deal with the above. + (complex_notype_declarator1): A notype_declarator that is not also + an expr_or_declarator. + (complex_direct_notype_declarator): A direct_notype_declarator that + doesn't conflict with expr_or_declarator. Use + notype_unqualified_id. Remove id_scope see_typename TYPENAME rule. + (functional_cast): New nonterminal, for the three functional cast + rules. So that they can be moved after + complex_direct_notype_declarator. + (see_typename): Don't accept type_quals any more. + + * decl2.c (reparse_decl_as_expr): New function to deal with parse + nodes for code like `int (*a)++;'. + (reparse_decl_as_expr1): Recursive subroutine of the above. + (finish_decl_parsing): New function to deal with parse nodes for + code like `int (*a);'. See the difference? + +Thu Mar 17 12:16:10 1994 Mike Stump <mrs@cygnus.com> + + These changes break binary compatibility in code with classes + that use virtual bases. + + * search.c (dfs_get_vbase_types): Simplify and correct to make + sure virtual bases are initialized in dfs ordering. + * search.c (get_vbase_types): Simplify and make readable. + +Thu Mar 17 12:01:10 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y: s/ typename / type_id /g + +Wed Mar 16 17:42:52 1994 Kung Hsu <kung@mexican.cygnus.com> + + * parse.y (typespec): add SCOPE TYPENAME for global scoped + type. e.g. ::B x. + + * decl.c (complete_array_type): fix a bug that in -pendantic + mode even there's no initializer, it will continue to build + default index. + +Wed Mar 16 17:43:07 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (direct_notype_declarator): Add PTYPENAME rule, remove + all of the scoped PTYPENAME rules. + +Wed Mar 16 16:39:02 1994 Mike Stump <mrs@cygnus.com> + + * init.c (build_offset_ref): The value of A::typedef_name is + always the TYPE_DECL, and never an error. + +Tue Mar 15 20:02:35 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (get_base_distance_recursive): Two binfos can only + represent the same object if they are both via_virtual. + + * class.c (finish_base_struct): Check vbases for ambiguity, too. + + * search.c (get_vbase_types): Accept binfo argument, too. + +Tue Mar 15 19:22:05 1994 Kung Hsu <kung@mexican.cygnus.com> + + * decl.c (complete_array_type): complete TYPE_DOMAIN of the + initializer also, because back-end requires it. + +Tue Mar 15 15:33:31 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_expr): Support member functions (which show up as + OFFSET_REFs). + +Mon Mar 14 16:24:36 1994 Mike Stump <mrs@cygnus.com> + + * init.c (build_new): Set the return type of multidimensional + news correctly. + +Fri Mar 11 15:35:39 1994 Kung Hsu <kung@mexican.cygnus.com> + + * call.c (build_method_call): if basetype not equal to type + of the instance, use the type of the instance in building + destructor. + +Thu Mar 10 17:07:10 1994 Kung Hsu <kung@mexican.cygnus.com> + + * parse.y (direct_notype_declarator): add push_nested_type for + 'template_type SCOPED_NAME' rule. + +Tue Mar 8 00:19:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (parm): Add typed_declspec1 {absdcl, epsilon} rules. + +Sat Mar 5 04:47:48 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (regcast_or_absdcl): New nonterminal to implement late + reduction of constructs like `int ((int)(int)(int))'. + (cast_expr): Use it. + (sub_cast_expr): Everything that can come after a cast. + (typed_declspecs1): typed_declspecs that are not typed_typespecs. + (direct_after_type_declarator): Lose PAREN_STAR_PAREN rule. + (direct_abstract_declarator): Replace '(' parmlist ')' rule with + '(' complex_parmlist ')' and regcast_or_absdcl. + (parmlist): Split + (complex_parmlist): Parmlists that are not also typenames. + (parms_comma): Enabler. + (named_parm): A parm that is not also a typename. Use declarator + rather than dont_see_typename abs_or_notype_decl. Expand + typed_declspecs inline. + (abs_or_notype_decl): Lose. + (dont_see_typename): Comment out. + (bad_parm): Break out abs_or_notype_decl into two rules. + +Fri Mar 4 18:22:39 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl2.c (reparse_decl_as_casts): New function to change parse + nodes for `(int)(int)(int)' from "function taking int and returning + function taking int and returning function taking int" to "... cast + to int, cast to int, cast to int". + + * decl2.c (reparse_decl_as_expr): Recursive function to change + parse nodes for `A()()' from "function returning function returning + A" to "A().operator()". + + * parse.y (primary): Replace `typespec LEFT_RIGHT' rule with + `typespec fcast_or_absdcl' rule. + (fcast_or_absdcl): New nonterminal to implement late reduction of + constructs like `A()()()()'. + (typename): Replace `typespec absdcl1' rule with + `typespec direct_abstract_declarator' rule. + (direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule + with `fcast_or_absdcl type_quals' rule. + +Fri Mar 4 16:18:03 1994 Mike Stump <mrs@cygnus.com> + + * tree.c (lvalue_p): Improve OFFSET_REF handling, so that it + matches Section 5.5. + +Fri Mar 4 14:01:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * error.c (dump_type_prefix): Don't print basetype twice for + pmfs. + +Fri Mar 4 13:24:33 1994 Mike Stump <mrs@cygnus.com> + + * typeck.c (convert_arguments): Handle setHandler(A::handlerFn) + so that it is like setHandler(&A::handlerFn). Cures an `invalid + lvalue in unary `&''. + +Fri Mar 4 11:15:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * gxxint.texi (Copying Objects): New section discussing default + op= problems with virtual inheritance. + + * decl2.c (grokoptypename): Just does grokdeclarator and + build_typename_overload, since the parser can't call grokdeclarator + directly. + + * method.c (build_typename_overload): Set IDENTIFIER_GLOBAL_VALUE + and TREE_TYPE on generated identifiers. + + * decl.c (grokdeclarator): Don't deal with TYPE_EXPRs anymore. + + * parse.y (parm): Convert `const char *' to `__opPCc' here. + + * error.c (dump_decl): Say sorry rather than my_friendly_aborting + if we can't figure out what to do. + (dump_type*): Likewise. + + * typeck2.c (build_m_component_ref): 'component' is an expr, not + a decl. Also move the IS_AGGR_TYPE check after the stripping of + REFERENCE_TYPE. + +Fri Mar 4 04:46:05 1994 Mike Stump <mrs@cygnus.com> + + * call.c (build_method_call): Handle b->setHandler(A::handlerFn) + so that it is like b->setHandler(&A::handlerFn). Cures an `invalid + lvalue in unary `&''. + +Thu Mar 3 12:38:15 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y: Add precedence specification for START_DECLARATOR. + (type_quals): Move before primary. + (typename): Move before typed_declspecs, add 'typespec absdcl1' rule. + + * decl2.c (grokoptypename): Lose. + + * decl.c (grokdeclarator): Parse TYPE_EXPRs in the initial scan, + rather than waiting until later. + +Wed Mar 2 14:12:23 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (unary_expr): Use 'typename' in 'new' rules, rather + than expanding it inline. + (typename): Expand empty option of (former) absdcl inline. + (abs_or_notype_decl): Likewise. + (absdcl): Lose empty rule. + (conversion_declarator): New nonterminal for 'typename' of 'operator + typename'. + (operator_name): Use it instead of absdcl. + + * parse.y: Add precedence declarations for SCOPED_TYPENAME, + TYPEOF, and SIGOF. + (typed_declspecs): Accept typed_typespecs, rather than typespec + directly. Add rules with reserved_typespecquals. + (reserved_declspecs): Don't accept typespecqual_reserved at the + beginning of the list. The typed_declspecs rule will deal with this + omission. + (declmods): Accept nonempty_type_quals, rather than TYPE_QUAL + directly. + + * parse.y (direct_notype_declarator, + direct_after_type_declarator, direct_abstract_declarator): Split up + the declarator1 nonterminals to match the draft standard and avoid + ambiguities. + (new_type_id, new_declarator, direct_new_declarator, + new_member_declarator): New nonterminals to implement the subset of + 'typename' allowed in new expressions. + (unary_expr): Use new_type_id instead of typename. + (after_type_declarator1, absdcl1): Fix semantics of member pointers. + (abs_member_declarator, after_type_member_declarator): Lose. + + * parse.y (absdcl1): Don't require parens around + abs_member_declarator. + (abs_member_declarator): Lose see_typename from rules. + (after_type_member_declarator): Likewise. + + * tree.c (get_identifier_list): New function, containing code + previously duplicated in get_decl_list and list_hash_lookup_or_cons. + (get_decl_list): Use it. + (list_hash_lookup_or_cons): Likewise. + + * parse.y (typed_declspecs, declmods): It's not necessary to hash + the declspecs on class_obstack, so don't. This way typed_typespecs + can reduce to typed_declspecs. + +Wed Mar 2 14:29:18 1994 Jason Merrill <jason@cygnus.com> + + * cvt.c (build_up_reference): If we aren't checking visibility, + also allow base->derived conversions. + +Mon Feb 28 15:14:29 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * typeck.c (build_c_cast): Remove bogus hack when converting + to a reference type. + + * cp-tree.h (lang_decl::vbase_init_list, DECL_VBASE_INIT_LIST): + Removed, not used. + (lang_stype::methods, lang_decl::next_method): New fields. + (CLASSTYPE_METHODS, DECL_NEXT_METHOD): New macros. + * decl.c (duplicate_decls): Preserve DECL_NEXT_METHOD. + + * cp-tree.h, decl2.c (flag_vtable_hack): New flag. + * decl2.c (finish_vtable_vardecl): If flag_vtable_hack, + and !CLASSTYPE_INTERFACE_KNOWN, try to use the presence of + a non-inline virtual function to control emitting of vtables. + * class.c (finish_struct): Build CLASSTYPE_METHODS list. + * search.c (build_vbase_vtables_init): Don't assemble_external + (yet) if flag_vtable_hack. + * class.c (build_vfn_ref): Likewise. + +Mon Feb 28 14:54:13 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (component_decl): Don't include "typed_declspecs + declarator ';'" speedup, since it breaks enums. + +Fri Feb 25 15:43:44 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * class.c (finish_struct): Minor optimization for building + fn_fields list. + +Fri Feb 25 15:23:42 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (start_function): Fix detection of function overloading. + +Thu Feb 24 22:26:19 1994 Mike Stump <mrs@cygnus.com> + + * lex.c (check_newline): #pragma interface can take a string + argument, just like #pragma implementation. #pragma implementation + checks for garbage on the line, line #pragma interface does. Main + input files do not auto implement like named files, #pragma + implementation must be used explicitly. + +Thu Feb 24 17:09:01 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y (components): Handle list of one again. + (notype_components): Likewise. + (after_type_declarator1): Take maybe_raises out again. + + * gxxint.texi (Parser): Document additional r/r conflict. + +Wed Feb 23 14:42:55 1994 Jason Merrill <jason@deneb.cygnus.com> + + * gxxint.texi (Parser): Add node. + + * Makefile.in (stamp-parse): Update expected conflict count. + + * parse.y (various): Replace "declmods declarator" with "declmods + notype_declarator". The comment saying that "declmods declarator ';'" + corresponds to "int i;" was wrong; it corresponds to "const i;". + (component_decl): Add "typed_declspecs declarator ';'" rule; this + *does* correspond to "int i;". Change "declmods components" to + "declmods notype_components". + (components): Don't deal with a list of one anymore. + (notype_components): New nonterminal, corresponds to notype_declarator. + ({after_,no}type_component_decl{,0}): More new nonterminals. + ({after_,no}type_declarator): Fold in START_DECLARATOR token. + Eliminates four reduce/reduce conflicts. + + (expr): Depend on nontrivial_exprlist instead of nonnull_exprlist. + (nontrivial_exprlist): New nonterminal: A list of at least two + expr_no_commas's. + (nonnull_exprlist): Depend on nontrival_exprlist. + Eliminates four reduce/reduce conflicts. + + (named_class_head): Move intermediate code block into separate + nonterminal so that we can stick %prec EMPTY on it. + + Add more %prec EMPTY's to eliminate remaining shift/reduce + conflicts. + + (after_type_declarator): Add maybe_raises to fndecl rules. + (after_type_declarator_no_typename): Remove. + For correctness. + + Document remaining reduce/reduce conflicts. + +Tue Feb 22 12:10:32 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (get_base_distance): Only bash BINFO_INHERITANCE_CHAIN + (TYPE_BINFO (type)) if we care about the path. + + * tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the + options are. + +Mon Feb 21 19:59:40 1994 Mike Stump <mrs@cygnus.com> + + * Makefile.in (mostlyclean): lex.c is a source file, don't + remove. + +Sat Feb 19 01:27:14 1994 Jason Merrill <jason@deneb.cygnus.com> + + * parse.y: Eliminate 20 shift/reduce conflicts. + +Fri Feb 18 11:49:42 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (type_unification): Add subr argument; if set, it means + that we are calling ourselves recursively, so a partial match is OK. + (unify): Support pointers to methods and functions. + (tsubst): Support method pointers. + * decl.c (build_ptrmemfunc_type): No longer static, so that + tsubst can get at it. + + * init.c (is_aggr_typedef): Pretend template type parms are + aggregates. + * decl2.c (build_push_scope): If cname refers to a template type + parm, just grin and nod. + + * call.c (build_overload_call_real): Pass subr argument to + type_unification. + * pt.c (do_function_instantiation): Likewise. + * class.c (instantiate_type): Likewise. + + * search.c (get_base_distance): If BINFO is a binfo, use it and + don't mess with its BINFO_INHERITANCE_CHAIN. + + * cvt.c (convert_to_reference): Fix temporary generation. + If ambiguous, return error_mark_node. + + * init.c (build_new): Put back some necessary code. + +Thu Feb 17 15:39:47 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_new): Deal with array types properly. + + * search.c (get_binfo): Become a shell for get_base_distance. + (get_binfo_recursive): Lose. + (get_base_distance_recursive): Find the path to the via_virtual base + that provides the most access. + (get_base_distance): Likewise. + + * parse.y (explicit_instantiation): Syntax is 'template class + A<int>', not 'template A<int>'. + + * typeck.c (convert_for_initialization): Remove bogus warning. + + * parse.y (datadef): Revert patch of Oct 27. + +Thu Feb 17 15:12:29 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * class.c (build_vfn_ref): Cast delta field to ptrdiff_type_node, + rather than integer_type_node. Does wonders for the Alpha. + +Thu Feb 17 13:36:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (build_ptrmemfunc_type): Make sure that the pmf type + goes onto the same obstack as its target type. + +Wed Feb 16 00:34:46 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cvt.c (convert_to_reference): If converting via constructor + on local level, go back to build_cplus_new approach. + + * tree.c (build_cplus_new): If with_cleanup_p, set cleanup slot + to error_mark_node to prevent expand_expr from building a cleanup + for this variable. + + * lex.c (default_assign_ref_body): Return *this from the memcpy + version, too. + + * decl.c (grok_reference_init): Just return if called with + error_mark_node, don't worry about initializing non-const reference + with temporary. + + * cvt.c (convert_to_reference): Do the right thing for + non-aggregate reference conversions, pedwarn when generating a + non-const reference to a temporary. + + * class.c (finish_struct): TYPE_HAS_COMPLEX_{INIT,ASSIGN}_REF and + TYPE_NEEDS_CONSTRUCTING all depend on TYPE_USES_VIRTUAL_BASECLASSES + again. + +Tue Feb 15 19:47:19 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_reference_init): Pawn off a lot of the work on + convert_to_reference. Generally do the right thing. + + * cvt.c (convert_to_reference): Conform to the initial comment; + i.e. don't create temps if decl != error_mark_node. Handle + cleanups better for temps that do get created. Don't pretend + that we can use an 'A' to initialize a 'const double &' just by + tacking on a NOP_EXPR. Support LOOKUP_SPECULATIVELY. + + * call.c (build_method_call): Set TREE_HAS_CONSTRUCTOR on + constructor calls. + +Mon Feb 14 14:50:17 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grok_reference_init): Make a temporary for initializing + const reference from constant expression. + +Mon Feb 14 11:31:31 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * cp-tree.h, decl.c (set_identifier_local_value): Deleted function. + * decl.c (pushdecl): Define decl in correct binding_level + (which isn't always the inner_binding_level). + + * cvt.c (build_up_reference): Don't ever call expand_aggr_init. + It's ugly, and I don't think it's the right thing to do. + + * cp-tree.h, class.c, decl.c, decl2.c, sp/search.c: + Remove NEW_CLASS_SCOPING, assuming it is always 1. + * decl.c (pop_decl_level): Removed; manually inlined. + +Sun Feb 13 19:04:56 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.h (candidate): Add basetypes field. + + * call.c (build_method_call): Do access checking after choosing a + function, not before. + + * Makefile.in (cvt.o, call.o, method.o): Depend on class.h. + (mostlyclean): Remove ../cc1plus. + +Fri Feb 11 11:52:26 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Don't allow adjusting access to a field + of a base class if a local field has the same name. + + * error.c (dump_type_prefix): Output basetype for METHOD_TYPEs. + +hu Jan 13 17:55:51 EST 1994 Gnanasekaran Swaminathan <gs4t@virginia.edu> + + * cp-tree.h (DESTRUCTOR_NAME_P): do not confuse AUTO_TEMP names + with destructor names when either NO_DOLLAR_IN_LABEL or + NO_DOT_IN_LABEL are not defined. + + Now `template <class T, T f(T&), const T*> class A {...}' works. + + * pt.c (grok_template_type): substitute template parm types + with actual types in complex type as well. + (coerce_template_parms): update the grok_template_type () + function call. + + * pt.c (tsubst): Traverse method list using DECL_CHAIN. + + * decl.c (grok_op_properties): Allow operator++/-- to have + default arguments. + + * typeck2.c (store_init_value): Don't abort when called to + initialize a type that needs constructing with a CONSTRUCTOR. + + * init.c (expand_aggr_init_1, CONSTRUCTOR case): If + store_init_value fails, build and expand an INIT_EXPR. If + store_init_value succeeds, call expand_decl_init. + +Fri Feb 11 02:49:23 1994 Mike Stump <mrs@cygnus.com> + + * class.c (build_vbase_path): Use complete_type_p instead of + resolves_to_fixed_type_p to determine if the virtual bases are in + their right place for the type of expr. Cures problem of thinking a + virtual base class is one place, when it is in fact someplace else. + +Fri Feb 11 00:26:46 1994 Mike Stump <mrs@cygnus.com> + + * init.c (resolve_offset_ref): Make sure we first convert to + intermediate type, if given, when dealing with members off `this'. + Solves an incorrrect `type `foo' is not a base type for type + `multiple'' when it is infact, a base type. + +Thu Feb 10 21:49:35 1994 Mike Stump <mrs@cygnus.com> + + * class.c (modify_other_vtable_entries): Use get_binfo, instead + of binfo_value. Solves problem with compiler giving a `base class + `B' ambiguous in binfo_value (compiler error)' on complex MI + herarchies, when a virtual function is first defied in a virtual + base class. + +Thu Feb 10 17:19:32 1994 Mike Stump <mrs@cygnus.com> + + * class.c (build_vbase_path): Don't complain about ambiguous + intermediate conversion when converting down to a virtual base + class, even if they might seem to be ambiguous. + +Thu Feb 10 12:18:26 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck2.c (build_functional_cast): #if 0 out constructor + inheritance code, improve error messages. + + * class.c (finish_base_struct): Complain about base with only + non-default constructors in derived class with no constructors. + + * decl.c (grokdeclarator): Fix detection of virtual new/delete. + +Wed Feb 9 22:02:32 1994 Mike Stump <mrs@cygnus.com> + + * search.c (build_mi_virtuals, add_mi_virtuals, + report_ambiguous_mi_virtuals): Removed unneeded code. + * class.c (finish_struct_bits): Likewise. + +Wed Feb 9 11:27:17 1994 Jason Merrill <jason@deneb.cygnus.com> + + * pt.c (end_template_instantiation): Push decl before + pop_from_top_level. + + * typeck2.c (build_m_component_ref): Make sure datum is of + aggregate type. + + * init.c (get_type_value): New function, returns + IDENTIFIER_TYPE_VALUE or IDENTIFIER_CLASS_TYPE_VALUE or NULL_TREE. + + * call.c (build_method_call): Don't die on call to destructor for + non-type. + + * decl.c (grokdeclarator): Complain about virtual op new and op + delete, make static virtuals unvirtual instead of unstatic. + + * typeck.c (build_c_cast): Also call default_conversion on + methods. + + * decl.c (grokdeclarator): Don't complain about anonymous + bitfields. + + * parse.y (simple_stmt, for loops): Move the continue point after + the cleanups. + + * class.c (finish_struct): Fix setting of + TYPE_HAS_COMPLEX_INIT_REF. + +Tue Feb 8 13:21:40 1994 Jason Merrill <jason@deneb.cygnus.com> + + * init.c (build_new): Deal with `new double (1)'. + + * class.c (finish_struct): TYPE_HAS_COMPLEX_*_REF are supersets of + TYPE_HAS_REAL_*_REF, but TYPE_HAS_COMPLEX_INIT_REF is independent of + TYPE_NEEDS_CONSTRUCTING. + + * decl.c (duplicate_decls): Propagate access decls. + + * typeck2.c (process_init_constructor): Accept empty_init_node + for initializing unions. + + * class.c, lex.c, cp-tree.h: Use + TYPE_HAS_COMPLEX_ASSIGN_REF where TYPE_HAS_REAL_ASSIGN_REF was used + before, use TYPE_HAS_COMPLEX_INIT_REF for TYPE_NEEDS_CONSTRUCTING in + some places. + + * decl.c (finish_decl): Don't complain about uninitialized const + if it was initialized before. + +Mon Feb 7 18:12:34 1994 Jason Merrill <jason@deneb.cygnus.com> + + * lex.c (default_assign_ref_body): Don't deal with vbases for + now. + + * decl.c (finish_decl): Fix reversed logic for objects and other + things that need to be constructed but have no initializer. + + * class.c (finish_struct): Don't set TYPE_HAS_* flags that are + set by grok_op_properties or finish_decl. + + * decl.c: Don't warn about extern redeclared inline unless + -Wextern-inline is given. + * decl2.c (lang_decode_option): Likewise. + * cp-tree.h: Likewise. + +Mon Feb 7 17:29:24 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (pushdecl_with_scope): Fix thinko. Add forward + declaration. + + * decl.c (pushdecl_with_scope): New function. + * decl.c (pushdecl_top_level): Use new function. + * decl.c (pushtag): Initialize newdecl. + * decl.c (pushtag): Push new type decl into correct scope. + +Mon Feb 7 14:42:03 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c, cvt.c, init.c, search.c, cp-tree.h: + Eradicate LOOKUP_PROTECTED_OK. + +Mon Feb 7 13:57:19 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * decl.c (pushtag, xref_tag), cp-tree.h: Add extra parameter + 'globalize' to signify implicit declarations. + * decl.c (globalize_nested_type, maybe_globalize_type): Removed. + * decl.c (set_identifier_type_value_with_scope): New function. + * decl.c (set_identifier_local_value): Simplify. + * spew.c (yylex, do_addr): Modify to return a _DEFN if a + forward declaration (followed by ';' and not preceded by 'friend'). + * class.c, decl.c, except.c, init.c, parse.y, + pt.c, search.c: Add new argument to calls to xref_tag and + pushtag. + +Mon Feb 7 00:22:59 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.h (ACCESSIBLY_UNIQUELY_DERIVED_P): New macro, means what + ACCESSIBLY_DERIVED_FROM_P meant before. + (ACCESSIBLY_DERIVED_FROM_P): Now disregards ambiguity. + + * cvt.c (build_up_reference): Call get_binfo with PROTECT == 1. + + * search.c (get_base_distance_recursive): Members and friends of + a class X can implicitly convert an X* to a pointer to a private or + protected immediate base class of X. + (get_binfo_recursive): Likewise. + (get_base_distance): Ignore ambiguity if PROTECT < 0. + (get_binfo): Lose multiple values of PROTECT. + (compute_access): Protected is OK if the start of the + search is an accessible base class of current_class_type. + + * method.c (build_opfncall): Do check access on operator new here. + + * decl.c (finish_function): Don't check access on operator new + here. + +Sun Feb 6 14:06:58 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (xref_tag): The base of a derived struct is NOT always + public. Duh. + + * pt.c (do_explicit_instantiation): New function, called from + parser to do explicit function instantiation. + (type_unification): Allow the args list to be terminated with + void_list_node. + (do_pending_expansions): Look at i->interface for non-member + templates. + + * parse.y (datadef): Move explicit_instantiation here. + (structsp): From here. + (datadef): Complain about `int;'. + +Sun Feb 6 12:33:18 1994 Per Bothner <bothner@kalessin.cygnus.com> + + * pt.c (end_template_instantiation), cp-tree.h: Remove unused + second parameter, and simplify first from a TREE_LIST where + we only care about its TREE_VALUE to just the value (an IDENTIFIER). + * pt.c (instantiate_member_templates): Simplify argument list + from a TREE_LIST to just an IDENTIFIER. + * lex.c (yyprint): PRE_PARSED_CLASS_DECL is now just an IDENTIFIER. + * parse.y (template_instantiate_once): Simplify accordingly. + * decl.c (inner_binding_level): New. Use various places to + simplify. + +Sun Feb 6 02:49:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck2.c (build_functional_cast): int() -> int(0). + +Sat Feb 5 00:53:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Don't do a bitwise copy for op= if the + class has a virtual function table. + + * typeck.c (convert_for_initialization): Restore warnings about + not using defined op=. Should really be my_friendly_aborts, I + s'pose. + +Fri Feb 4 14:21:00 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Tidy up conditions for doing bitwise + copies of objects. + + * decl.c (build_default_constructor): #if 0 out. + + * *: Eradicate TYPE_GETS_{ASSIGNMENT,ASSIGN_REF,CONST_ASSIGN_REF, + CONST_INIT_REF}, TYPE_HAS_REAL_CONSTRUCTOR. + + * decl.c (grokdeclarator): Don't return void_type_node for + friends being defined here. + + * init.c (perform_member_init): Only do the init if it's useful. + + * lex.c (default_copy_constructor_body): If we don't need to do + memberwise init, just call __builtin_memcpy. + (default_assign_ref_body): Likewise. + + * decl.c (grokdeclarator): If friendp && virtualp, friendp = 0. + +Fri Feb 4 13:02:56 1994 Mike Stump <mrs@cygnus.com> + + * lex.c (reinit_parse_for_method, cons_up_default_function): + Don't give warn_if_unknown_interface warning when it came from a + system header file. + * pt.c (end_template_decl, instantiate_template): Likewise. + * decl.c (start_decl): Likewise. + +Fri Feb 4 00:41:21 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Don't try to set TYPE_WAS_ANONYMOUS on + enums. + + * decl2.c (constructor_name_full): Use IS_AGGR_TYPE_CODE instead of + IS_AGGR_TYPE, since we don't know it's a type. + +Thu Feb 3 11:36:46 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokdeclarator): Don't complain about anonymous unions. + + * cp-tree.h (TYPE_WAS_ANONYMOUS): This struct was originally + anonymous, but had a name given to it by a typedef. + + * decl.c (grokdeclarator): When renaming an anonymous struct, set + TYPE_WAS_ANONYMOUS. + + * decl2.c (constructor_name_full): Use TYPE_WAS_ANONYMOUS. + + * cp-tree.h (DECL_UNDEFINED_FRIENDS): #if 0 out. + + * init.c (xref_friend): Don't set up DECL_UNDEFINED_FRIENDS. + (embrace_waiting_friends): Don't use DECL_UNDEFINED_FRIENDS. + + * decl.c (grokdeclarator): Set TYPE_NESTED_NAME properly on nested + anonymous structs that get typedef'd. + + * decl.c (grokdeclarator): Always return void_type_node for + friends. + + * error.c (dump_function_decl): Don't use DECL_CLASS_CONTEXT for + friends. + (dump_function_decl): Don't print out default args for + a function used in an expression. + + * decl.c (grokdeclarator): Give error on abstract declarator used + in an invalid context (i.e. `void (*)();'). + + * error.c (cp_line_of): Support _TYPE nodes. + (cp_file_of): Likewise. + + * cvt.c (build_up_reference): Don't abort if passed a SAVE_EXPR; + it can happen for the RHS of an assignment stmt where the LHS is + a COND_EXPR. + + * init.c (expand_aggr_init_1): Deal with bracketed initializer + lists properly. + + * class.c (finish_struct): Deal with enumerators and typedefs + again. + +Wed Feb 2 11:30:22 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Tidy up loop over fields. + + * errfn.c (cp_thing): Don't advance twice after a format. + + * class.c (finish_struct): Complain about needing a constructor + if a member has only non-default constructors, and don't try to + generate a default constructor. + + * decl.c (finish_decl): Also do the constructor thing if + TYPE_NEEDS_CONSTRUCTING is set (for arrays). + + * search.c (unuse_fields): New function: mark all fields in this + type unused. + (dfs_unuse_fields): Helper function. + + * class.c (pushclass): If the new class is the same as the old + class, still unuse the fields. + (unuse_fields): Move to search.c. + + * decl.c (grok_op_properties): Add friendp argument. + (grokfndecl): Pass it. + (start_method): Likewise. + + * decl2.c (delete_sanity): Add use_global_delete parameter to catch + ::delete calls. + + * parse.y (unary_expr): Pass new parameter to delete_sanity. + + * lex.c (default_copy_constructor_body): Don't choke if the union + has no fields. + (default_assign_ref_body): Likewise. + + * call.c (compute_conversion_costs_ansi): Do the right thing for + ellipsis matches. + + * decl.c (push_to_top_level): Optimize. + + * decl.c (start_function): Look for the lexical scope of a friend + in DECL_CLASS_CONTEXT. + + * init.c (do_friend): Set DECL_CLASS_CONTEXT on global friends. + +Tue Feb 1 15:59:24 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.h (TREE_GETS_PLACED_NEW): New macro. + + * init.c (init_init_processing): Don't assign BIN/BID to the + IDENTIFIER_GLOBAL_VALUEs of their respective operators. + (build_new): Check TREE_GETS_PLACED_NEW. + + * decl.c (grok_op_properties): Don't set TREE_GETS_NEW for a decl of + op new with placement, set TREE_GETS_PLACED_NEW. + + * cp-tree.h (ANON_UNION_P): New macro. Applies to decls. + + * class.c (finish_struct): Don't treat anonymous unions like + other aggregate members. Do synthesize methods for unions without + a name, since they may or may not be "anonymous unions". + + * decl2.c (grok_x_components): Wipe out memory of synthesized methods + in anonymous unions. + + * lex.c (default_copy_constructor_body): Support unions. + (default_assign_ref_body): Likewise. + +Mon Jan 31 12:07:30 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.h: Fix documentation of LOOKUP_GLOBAL, add prototypes. + + * error.c (args_as_string): New function (%A), like type_as_string + except NULL_TREE -> "..." + + * call.c (build_overload_call_real): Fix for new overloading. + + * decl.c (grok_op_properties): Set all of the TYPE_OVERLOADS_* flags + here. + + * parse.y (operator_name): Instead of here. + + * typeck2.c (build_functional_cast): Treat a TREE_LIST as a list + of functions. + + * call.c (build_overload_call_real): Support LOOKUP_SPECULATIVELY. + + * method.c (build_opfncall): Don't need to massage return value + any more, call build_overload_call with all flags. + + * typeck.c (build_x_binary_op): Put back speculative call to + build_opfncall. + (build_x_unary_op): Likewise. + (build_x_conditional_expr): Likewise. + +Mon Jan 31 10:00:30 1994 Mike Stump <mrs@cygnus.com> + + * cvt.c (build_type_conversion_1): Change call to pedwarn into + warning, and conditionalize upon warn_cast_qual. + +Fri Jan 28 11:48:15 1994 Jason Merrill <jason@deneb.cygnus.com> + + * search.c (lookup_field): If xbasetype is a binfo, copy it to + avoid clobbering its inheritance info. + + * call.c (build_method_call): Don't overwrite basetype_path with + TYPE_BINFO (inst_ptr_basetype) if they have the same type. + + * search.c (compute_access): Fix handling of protected inheritance + and friendship with the enclosing class. + + * typeck2.c (store_init_value): Allow passing of TREE_CHAIN for + initialization of arbitrary variable. + + * typeck2.c (build_functional_cast): Only try calling a method if + one exists. + + * decl.c (grokdeclarator): Move handling of constructor syntax + initialization into first loop for generality. + (parmlist_is_random): Lose. + + * lex.c (cons_up_default_function): Set TREE_PARMLIST on arguments + to default function. + +Thu Jan 27 19:26:51 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (grokparms): Abort if we get called with something we don't + expect. + +Thu Jan 27 17:37:25 1994 Mike Stump <mrs@cygnus.com> + + * call.c (build_overload_call_real): Change argument complain to + flags to match style of rest of code. Pass it down to + build_function_call_real as necessary. + * call.c (build_overload_call, build_overload_call_maybe): Change + argument complain to flags to match style of rest of code. + * cp-tree.h (build_function_call_real): Added fourth flags + argument. + * cvt.c (convert_to_reference): Only give warning messages, if + LOOKUP_COMPLAIN is set. + * typeck.c (build_x_function_call): Change simple complain + argument to build_overload_call_maybe and build_overload_call, to + LOOKUP_COMPLAIN to match style of rest of code. + * typeck2.c (build_functional_cast): Likewise. + * typeck.c (build_function_call_real): Add flags, so that we can + not complain, if we don't want to complain. Complain about + arguments, if we are complaining, otherwise don't. + * typeck.c (build_function_call, build_function_call_maybe): + Stick in flags argument. + * typeck.c (build_x_binary_op, build_x_unary_op, + build_x_conditional_expr, build_x_compound_expr): Follow style of + build_x_indirect_ref, as it is more correct and more common. + +Thu Jan 27 14:36:20 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (build_method_call): Don't check for being called with + a pointer. + + * decl2.c (finish_file): Don't play with DECL_CLASS_CONTEXT for the + static initializer function. + + * init.c (build_member_call): Use convert_force here, too. + + * search.c (compute_access): Only treat static members specially + if they are referenced directly. + +Wed Jan 26 18:28:14 1994 Jason Merrill <jason@deneb.cygnus.com> + + * gxxint.texi (Access Control): New node. + + * search.c (current_scope): New function; returns whichever of + current_class_type and current_function_decl is the most nested. + (compute_access): Total overhaul to make it clearer and more + correct. Don't use the cache for now; in the only situation where + it was used before, it gained nothing. This frees up three of the + DECL_LANG_FLAGs for possible other use! + + * cp-tree.h: #if 0 out DECL_PUBLIC & friends. + + * typeck.c (build_component_ref_1): Don't check DECL_PUBLIC. + + * call.c (build_method_call): Use convert_force to cast `this' -- + rely on the access checking for the method itself. + + * init.c (is_friend): Do the nesting thing, handle types. I am + my own friend. + (is_friend_type): Become a shell for is_friend. + (add_friend): Never stick in ctype. + Why are the friendship functions in init.c, anyway? + +Wed Jan 26 17:50:00 1994 Mike Stump <mrs@cygnus.com> + + * cvt.c (build_type_conversion_1): Don't conditionalize call to + pedwarn upon pedantic. + +Wed Jan 26 17:20:46 1994 Mike Stump <mrs@cygnus.com> + + * cvt.c (convert_to_reference): Add 8.4.3 checking so that one + gets a warning if one tries to initialize a non-const & from a + non-lvalue. + * cvt.c (convert_to_reference): Use %P format for argument + numbers in warnings. + +Wed Jan 26 14:35:06 1994 Mike Stump <mrs@cygnus.com> + + * init.c (build_delete): Follow style in call.c to construct the + virtual call to the desctructor, as that code is right. Fixes a + problem of the compiler saying a pointer conversion is ambiguous. + +Wed Jan 26 11:28:14 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.h (VTABLE_NAME_P): Change other occurrence of + VTABLE_NAME_FORMAT to VTABLE_NAME. + + * *: s/visibility/access/g + +Tue Jan 25 18:39:12 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_modify_expr): Don't smash references if INIT_EXPR. + +Tue Jan 25 13:54:29 1994 Mike Stump <mrs@cygnus.com> + + * init.c (build_delete): Back out Jan 17th & 18th pacthes, as + they break libg++. + +Tue Jan 25 13:11:45 1994 Jason Merrill <jason@deneb.cygnus.com> + + * decl.c (duplicate_decls): Fix pointer arithmetic. + +Mon Jan 24 15:50:06 1994 Chip Salzenberg <chip@fin.uucp> + + [ cp-* changes propagated from c-* changes in 940114 snapshot ] + * cp-parse.y (maybe_attribute): Allow multiple __attribute__ + clauses on a declaration. + +Mon Jan 24 17:06:23 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Do synthesize methods for anon + structs, just not unions. + +Mon Jan 24 13:50:13 1994 Kung Hsu <kung@mexican.cygnus.com> + + * decl.c (xref_tag): handle anonymous nested type. + * decl.c (globalize_nested_type): add no globalize bit check. + * spew.c (hack_more_ids) : templated nested decl not push top + level. + + * parse.y : get rid of 'goto do_components'. It is much better + for debugging. + + * decl.c (is_anon_name): get rid of the function and use the + macro ANON_AGGRNAME_P. + * pt.c : ditto. + +Fri Jan 21 14:06:02 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct): Don't synthesize any methods for + anonymous structs/unions. + + * typeck.c (build_modify_expr): Don't treat pmf's as class objects. + +Thu Jan 20 18:56:46 1994 Jason Merrill <jason@deneb.cygnus.com> + + * method.c (build_opfncall): Call build_indirect_ref on + synthesized instance for operator delete. + + * pt.c (type_unification): Don't abort if called with a list of + types in ARGS. + + * class.c (instantiate_type): Deal with function templates. + +Thu Jan 20 16:55:35 1994 Jim Wilson <wilson@sphagnum.cygnus.com> + + * Makefile.in (CC): Default to cc not gcc. + +Thu Jan 20 13:47:54 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_modify_expr): Call constructor if appropriate. + + * decl.c (push_to_top_level): Clear out class-level bindings cache. + +Wed Jan 19 13:51:22 1994 Jason Merrill <jason@deneb.cygnus.com> + + * call.c (resolve_scope_to_name): Work recursively (previously only + looked down one level). + + * lex.c (do_pending_inlines): If we're still dealing with the last + batch of inlines, don't start working on a new one. + + * Makefile.in (stamp-parse): Update conflict count. + (TAGS): Fix. + + * parse.y (explicit_instantiation): New rule; implements + 'template A<int>' syntax (though not 'template foo(int)' yet). + (structsp): Add explicit_instantiation. + +Tue Jan 18 13:53:05 1994 Jason Merrill <jason@deneb.cygnus.com> + + * class.c (finish_struct, etc.): Simplify decision to synthesize + a destructor. + + * call.c, class.c, cp-tree.h, decl.c, init.c, + ptree.c, search.c, typeck.c, typeck2.c: Nuke + TYPE_NEEDS_CONSTRUCTOR (change all calls to TYPE_NEEDS_CONSTRUCTING). + * init.c (expand_aggr_init_1): Don't try non-constructor methods + of initializing objects. + (build_new): Don't try other methods if the constructor lookup fails. + + * class.c (finish_base_struct): Set cant_have_default_ctor and + cant_synth_copy_ctor properly. + (finish_struct): Likewise. + +Mon Jan 17 13:58:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * typeck.c (build_modify_expr_1): #if 0 out again. + (build_modify_expr): #if 0 out memberwise init code again. + + * lex.c (default_copy_constructor_body): Be const-correct. + (default_assign_ref_body): Likewise. + + * init.c (perform_member_init): Use TYPE_HAS_CONSTRUCTOR to decide + whether or not to use it, rather than TYPE_NEEDS_CONSTRUCTING. + (expand_aggr_init): Disable silent conversion from initializer list + to list of args for a constructor. + + * class.c (base_info): Lose needs_default_ctor. + (finish_base_struct): Likewise. + (finish_struct): Likewise. + + * decl.c (init_decl_processing): Don't turn off flag_default_inline + just because flag_no_inline is on. + (finish_decl): Use TYPE_HAS_CONSTRUCTOR to decide to use + constructor. + + * class.c (finish_struct): Synthesize default ctor whenever + allowed. + + * Makefile.in (TAGS): Don't try to run etags on cp-parse.y. + +Sat Jan 15 18:34:33 1994 Mike Stump <mrs@cygnus.com> + + * Makefile.in, configure: Handle the C++ front-end in a + subdirectory. + * cp-*: Move C++ front-end to cp/*. + +Fri Jan 14 14:09:37 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-typeck.c (build_function_call_real): Modify to match other + instances of taking the address of the function. + + * cp-class.c (finish_struct): Set TYPE_HAS_REAL_CONSTRUCTOR to 1 if + there are non-synthesized constructors. + Only set TYPE_NEEDS_CONSTRUCTOR if TYPE_HAS_REAL_CONSTRUCTOR. + Always generate copy constructor if possible. + + * cp-tree.h (lang_type): Add has_real_constructor bitfield. + (TYPE_HAS_REAL_CONSTRUCTOR): Define. + + * cp-lex.c (default_copy_constructor_body): Use init syntax + for all bases. + + * cp-type2.c (store_init_value): Only give error for initializer list + if TYPE_HAS_REAL_CONSTRUCTOR. + +Thu Jan 13 15:38:29 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.h (DECL_SYNTHESIZED): Add defn. + (lang_decl): Add synthesized bitfield to decl_flags. + + * cp-lex.c (cons_up_default_function): Use DECL_SYNTHESIZED to mark + artificial methods, rather than a line # of 0. + +Fri Jan 14 18:25:29 1994 Kung Hsu <kung@mexican.cygnus.com> + + * cp-decl (xref_tag): fix a bug in conflict type. + * cp-parse.y : add SCOPED_NAME for uninstantiated template nested + type reference. + * cp-spew.c (yylex) : generated SCOPED_NAME token. + * cp-lex.c (yyprint): handle SCOPED_NAME. + +Fri Jan 14 17:00:29 1994 Mike Stump <mrs@cygnus.com> + + * cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is + not right. + +Thu Jan 13 14:00:35 1994 Kung Hsu <kung@mexican.cygnus.com> + + * cp-decl2.c (grok_x_components): fix a bug that enum type does not + have type_flags. + +Thu Jan 13 11:39:34 1994 Mike Stump <mrs@cygnus.com> + + Ensure that all vtable pointers are initialized with all the right + values. + + * cp-class.c (is_normal): Changed to reflect new meaning of + CLASSTYPE_VFIELD_PARENT. + * cp-class.c (maybe_fixup_vptrs): Use of + CLASSTYPE_NEEDS_VIRTUAL_REINIT here is misguided. Use + BINFO_MODIFIED instead. + * cp-class.c (finish_struct): Changed to reflect new meaning of + CLASSTYPE_VFIELD_PARENT. + * cp-decl.c (get_binfo_from_vfield): Removed, unneeded now. + * cp-decl.c (finish_function): Use init_vtbl_ptrs, instead of open + coding it here. + * cp-init.c (init_vfields): Changed name to init_vtbl_ptrs, and + re-implement. + * cp-init.c (emit_base_init): Use new name init_vtbl_ptrs. + * cp-tree.h (vfield_parent): Changed to integer. + * cp-tree.h (CLASSTYPE_VFIELD_PARENT): Changed docs to reflect new + meaning. + * cp-tree.h (init_vtbl_ptrs): Added init_vtbl_ptrs. + +Wed Jan 12 18:24:16 1994 Kung Hsu <kung@mexican.cygnus.com> + + * cp-decl.c (xref_tag): re-implement globalize nested type. + * cp-decl2.c (grok_x_components): ditto. + * cp-parse.y: ditto. + * cp-tree.h (lang_type): add no_globalize bit in type_flags. + +Wed Jan 12 14:08:09 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (grokdeclarator): Don't set TREE_PUBLIC on friend + decls with a definition attached. + + * cp-typeck.c (build_modify_expr): Undo previous change in the case + of INIT_EXPRs. + +Tue Jan 11 19:33:03 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-typeck.c (build_modify_expr): Replace code for generating + assignment semantics for classes with an error. + (build_modify_expr_1): #if 0 out. + + * cp-decl.c (pushdecl): Patch bogus design of pushdecl + behavior for overloaded functions (it doesn't push anything). + + * cp-class.c (finish_struct): When generating default op=, + set TYPE_HAS_ASSIGNMENT. + +Mon Jan 10 18:48:06 1994 Mike Stump <mrs@cygnus.com> + + * cp-cvt.c (convert): Make {double, clashing enum} -> enum + invalid. + * cp-typeck.c (convert_for_assignment): Simplify. + * cp-decl2.c (warn_enum_clash): Removed. + * invoke.texi (-Wenum-clash): Removed. + * toplev.c (-Wenum-clash): Removed. + +Mon Jan 10 17:48:37 1994 Kung Hsu <kung@mexican.cygnus.com> + + * cp-decl.c (finish_decl): fix incorrect popclass call. + + * cp-decl.c (is_anon_name): new function, check whether the name + is anonymous name generated by compiler. + * cp-decl.c (grokdeclarator): allow nested SCOPE_REF + * cp-spew.c (hack_more_ids): handle nested type in template. + * cp-parse.y : handle nested type reference in uninstantiated + template. + * cp-call.c (build_method_call): handle uninstantiated template + case. + * cp-pt.c (search_nested_type_in_tmpl): new function, search nested + type in template. + * cp-pt.c (lookup_nested_type_by_name): new function, lookup nested + type by name. + * cp-pt.c (tsubst): handle nested type search by name. + +Mon Jan 10 14:32:18 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-init.c (build_member_call): Propagate qualifiers to new type. + + * cp-call.c (build_method_call): Count functions the new way. + +Fri Jan 7 19:03:26 1994 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (pushtag): Set DECL_ASSEMBLER_NAME for nested classes, + too. + +Tue Jan 4 16:45:51 1994 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-parse.y: change to handle whether to globalize nested class. + * cp-decl.c(xref_tag, maybe_globalize_type): Likewise. + +Mon Jan 3 22:22:32 1994 Gerald Baumgartner <gb@cygnus.com> + + * Makefile.in cp-call.c cp-class.c cp-cvt.c cp-decl.c cp-decl2.c + cp-error.c cp-init.c cp-lex.c cp-lex.h cp-method.c cp-parse.y + cp-spew.c cp-tree.c cp-tree.h cp-type2.c cp-typeck.c cp-xref.c + gplus.gperf toplev.c: Incorporated C++ signature extension. + * cp-sig.c: New file, contains most of signature processing. + * cp-hash.h: Regenerated from gplus.gperf. + + * gcc.1 g++.1: Added explanation for the `-fhandle-signatures' + and `-fno-handle-signatures' command line flags. + + * gcc.texi: Changed the last-modification date. + * invoke.texi: Added `-fhandle-signatures' in the list of + C++ language options. Added explanation for this option. + +Tue Dec 28 21:10:03 1993 Mike Stump <mrs@cygnus.com> + + * cp-init.c (expand_vec_init): Remove comptypes test, as it is too + harsh here. + +Tue Dec 28 13:42:22 1993 Mike Stump <mrs@cygnus.com> + + * cp-pt.c (do_pending_expansions): Decide to expand a template + member function, based upon it's class type, not the class type of + the first place it was declared. + +Tue Dec 28 05:42:31 1993 Mike Stump <mrs@cygnus.com> + + * cp-class.c (is_normal): New routine, use to determine when the + given binfo is the normal one. (The one that should have the simple + vtable name.) + * cp-class.c (modify_other_vtable_entries): Use DECL_ASSEMBLER_NAME + to check if two fndecls are `the same'. Sometimes this routine can + modify the main vtable, and normal should be 1, in that case, so use + is_normal() to determine if this is the main vtable for the class. + Don't recurse down virtual bases, as they are shared, and we take + care of them elsewhere. + * cp-class.c (modify_vtable_entries): If we have already updated the + vtable with the new virtual, don't do it again. + * cp-class.c (finish_struct): Set CLASSTYPE_VFIELD_PARENT as + appropriate. Do virtual function overriding in virtual bases, after + normal overriding, so that the base function list in DECL_VINDEX is + not overridden, before we have a chance to run through the list. + Use DECL_ASSEMBLER_NAME to check if two fndecls are `the same'. + Make sure we pass the right address into modify_vtable_entries. + * cp-tree.h (CLASSTYPE_VFIELD_PARENT): New field to indicate which + binfo is the one that has the vtable that we based our vtable on. + +Fri Dec 24 09:40:52 1993 Michael Tiemann <tiemann@blues.cygnus.com> + + * cp-typeck.c (c_expand_start_case): Use default_conversion to + convert expression from reference type if necessary. + +Wed Dec 22 17:58:43 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-typeck.c (build_unary_op): Make sure that it's a TREE_LIST before + trying to read its TREE_VALUE. + + * cp-class.c (finish_struct_methods): Clear DECL_IN_AGGR_P here. + (finish_struct): Instead of here. + +Tue Dec 21 14:34:25 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-tree.c (list_hash_lookup_or_cons): Make sure the type doesn't + have TYPE_PTRMEMFUNC_P set before we try to build its + CLASSTYPE_ID_AS_LIST. + (get_decl_list): Likewise, when trying to read it. + + * cp-tree.h (VTABLE_NAME): No def with NO_{DOLLAR,DOT} defined. + (VTABLE_NAME_P): Use it instead of VTABLE_NAME_FORMAT. + +Mon Dec 20 13:35:03 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-typeck.c (rationalize_conditional_expr): New function. + (unary_complex_lvalue): Use it. + (build_modify_expr): Use it, since trying to do an ADDR_EXPR of it + with build_unary_op won't cut it. Don't wrap the COND_EXPR with a + SAVE_EXPR either. + + * cp-decl2.c (explicit_warn_return_type): Deleted variable. + (lang_decode_option): Set warn_return_type, not explicit_*, for + -Wreturn-type and -Wall. This is what rest_of_compilation uses to + decide if it should go into jump_optimize or not. + * cp-tree.h (explicit_warn_return_type): Deleted. + * cp-decl.c (grokdeclarator): Use warn_return_type, not explicit_*. + (finish_function): Also complain about no return in a non-void fn if + we're being pedantic (don't rely on use of -Wreturn-type). + +Fri Dec 17 15:45:46 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-decl.c (grokdeclarator): Forbid declaration of a function as + static if it's being done inside another function. + + * cp-search.c (compute_visibility): Check for friendship both ways. + +Fri Dec 17 14:28:25 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-cvt.c (build_default_binary_type_conversion): Make error + messages more helpful. + + * cp-error.c (op_as_string): New function, returns "operator ==" + given EQ_EXPR or suchlike. + +Fri Dec 17 13:28:11 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-call.c (print_n_candidates): New function. + (build_overload_call_real): Use it when we complain about a call + being ambiguous. + +Fri Dec 17 12:41:17 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-call.c (build_method_call): Fix checking for static call + context. + + * cp-method.c (build_opfncall): Call build_indirect_ref on argument + to operator new. + + * cp-init.c (build_new): Don't mess with rval when building + indirect ref. + +Thu Dec 16 16:48:05 1993 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-lex.c (default_assign_ref_body): add check when TYPE_NESTED_ + NAME(type) may not be exist. It's not a problem for old compiler. + +Thu Dec 16 14:46:06 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-tree.h (CLASSTYPE_ALTERS_VISIBILITIES_P): Delete macro, it's + never used for anything. + (struct lang_type, member type_flags): Delete field + `alters_visibility', and up `dummy' by 1. + * cp-class.c (finish_base_struct): Delete code that copies the + setting of CLASSTYPE_ALTERS_VISIBILITIES_P. + (finish_struct): Delete code that sets it. + +Thu Dec 16 14:44:39 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c, cp-init.c, cp-typeck.c: Fix arguments to + build_method_call that I messed up before. + + * cp-search.c (get_base_distance): If protect > 1, allow immediate + private base. + + * cp-class.c (finish_base_struct): Set cant_synth_* correctly. + (finish_struct): Likewise. Well, nigh-correctly; it won't deal + properly with the case where a class contains an object of an + ambiguous base class which has a protected op=. Should be fixed + when the access control code gets overhauled. + (finish_struct_methods): Set TYPE_HAS_NONPUBLIC_* correctly. + +Thu Dec 16 12:17:06 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-lex.c (real_yylex): Turn the code back on that deals with + __FUNCTION__ and __PRETTY_FUNCTION__. Don't use lookup_name, to + avoid the ambiguity problems that led to it being turned off in the + first place. + + * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P + to see if something is a method. + +Wed Dec 15 18:35:58 1993 Mike Stump <mrs@cygnus.com> + + * cp-typeck.c (build_modify_expr): Avoid error messages on small + enum bit fields. + * cp-typeck.c (convert_for_assignment): Add missing argument to + cp_warning and cp_pedwarn calls. + +Wed Dec 15 18:25:32 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-parse.y (member_init): ANSI C++ doesn't forbid old-style base + initializers; it's just anachronistic. + + * cp-decl.c (finish_decl): Don't require external-linkage arrays + to have a complete type at declaration time when pedantic. + +Tue Dec 14 11:37:23 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (pushdecl): Don't set DECL_CONTEXT if it's already set. + + * cp-call.c (build_method_call): Don't dereference pointer given + as instance. + + * cp-decl.c (finish_function): Don't pass pointer to + build_method_call. + (finish_function): Likewise. + + * cp-typeck.c (build_x_function_call): Likewise. + + * cp-method.c (build_component_type_expr): Likewise. + + * cp-init.c (build_member_call): Likewise. + (build_new): Likewise. + +Mon Dec 13 18:04:33 1993 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-decl.c (xref_tag): fix regression created by changes made + in Dec. 7 1993. + * cp-decl.c (xref_defn_tag): fix parallel nested class problem. + +Fri Dec 10 12:40:25 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-call.c (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print + out the final evaluation of the function, so we can see if ELLIPSIS, + USER, and EVIL were set at the end. + + * cp-call.c (convert_harshness_ansi): When the parm isn't an lvalue, + only go for setting TRIVIAL_CODE if we are dealing with types that + are compatible. + +Thu Dec 9 18:27:22 1993 Mike Stump <mrs@cygnus.com> + + * cp-decl.c (flag_huge_objects): New flag to allow large objects. + * toplev.c (lang_options): Likewise. + * cp-decl2.c (flag_huge_objects, lang_f_options): Likewise. + * cp-decl.c (delta_type_node): New type for delta entries. + * cp-tree.h (delta_type_node): Likewise. + * cp-decl.c (init_decl_processing): Setup delta_type_node. + * cp-decl.c (init_decl_processing, build_ptrmemfunc_type): Use + delta_type_node instead of short_integer_type_node. + * cp-class.c (build_vtable_entry): Likewise. + +Thu Dec 9 16:19:05 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-tree.h (OPERATOR_TYPENAME_P): Define outside of + NO_{DOLLAR,DOT} macro checks, so it always gets defined. + (VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL. + +Wed Dec 8 17:38:06 1993 Mike Stump <mrs@cygnus.com> + + * cp-decl.c (finish_decl): Make sure things that can go into + "common", do go into common, if -fcommon is given. + +Wed Dec 8 13:01:54 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-call.c (print_harshness) [DEBUG_MATCHING]: New function. + (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print out + argument matching diagnostics to make instantly clear what the + compiler is doing. + + * cp-call.c (convert_harshness_ansi): If the parm isn't an lvalue, + then check to see if the penalty was increased due to + signed/unsigned mismatch, and use a TRIVIAL_CODE if it wasn't. + +Tue Dec 7 18:29:14 1993 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-decl.c (xref_tag, pushtag): Fix nested class search/resolution + problem. + +Tue Dec 7 16:09:34 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-class.c (finish_struct): Before synthesizing methods, if no + methods have yet been declared then set nonprivate_method. Don't + set non_private method after synthesizing a method. + + * cp-lex.c (extract_interface_info): If flag_alt_external_templates + is set, tie emitted code to the location of template instantiation, + rather than definition. + + * cp-tree.h: Declare flag_alt_external_templates. + + * cp-decl2.c (lang_decode_option): Support -falt-external-templates. + + * toplev.c (lang_options): Likewise. + +Mon Oct 4 12:50:02 1993 Chip Salzenberg <chip@fin.uucp> + + [changes propagated from 930810 snapshot] + * cp-decl.c (init_decl_processing): Make long long available for use + as SIZE_TYPE and PTRDIFF_TYPE. + (finish_decl): Allow file-scope static incomplete array. + (grokdeclarator): Don't pass on const and volatile fron function + value type to function type. + Warn here for volatile fn returning non-void type. + * cp-parse.y (attrib): Accept attributes `volatile' with alias + `noreturn', and `const'. + * cp-typeck.c (default_conversion): Don't lose const and volatile. + (build_binary_op_nodefault): Generate pedantic warning for comparison + of complete pointer type with incomplete pointer type. + (build_c_cast): Be careful that null pointer constant be INTEGER_CST. + +Tue Dec 7 10:46:48 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-init.c (expand_vec_init): When creating a temporary for copying + arrays, use the type of the source, not the target. + + * cp-cvt.c (convert): Pass an argument for errtype to + convert_to_reference. + + * cp-error.c (dump_expr, COMPONENT_REF & CALL_EXPR): Deal with + methods, -> and `this'. + +Mon Dec 6 17:12:33 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-error.c (parm_as_string): New function; returns `this' or arg + number. Corresponds to %P. + (dump_expr): Deal with method calls. + + * cp-cvt.c (convert_to_reference): Stop using warn_for_assignment. + * cp-typeck.c (convert_for_assignment): Likewise. + (warn_for_assignment): Lose. + +Mon Dec 6 11:33:35 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-call.c (ideal_candidate_ansi): Delete code that was never + doing anything useful. Instead, sort once, and DO NOT wipe + out any codes with EVIL_CODE, since that's what we use as a + marker for the end of the list of candidates. + + * cp-cvt.c (convert_to_aggr): Make sure to always set H_LEN. + +Mon Dec 6 12:49:17 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-init.c (get_aggr_from_typedef): New function, like + is_aggr_typedef but returns the _TYPE. + + * cp-call.c, cp-init.c, cp-method.c: Eradicate err_name. + +Sun Dec 5 18:12:48 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-lex.c (readescape): Pedwarn when a hex escape is out of range. + +Thu Nov 25 23:50:19 1993 Chip Salzenberg <chip@fin.uucp> + + Delay language context change until beginning of next decl. + + * cp-lex.h (c_header_level): Removed. + (pending_lang_change): Declared. + * cp-lex.c (c_header_level): Renamed from in_c_header, made static. + (pending_lang_change): Defined. + (check_newline): Rework code that recognizes line number and + filename changes. Instead of pushing and popping lang context, + increment and decrement pending_lang_change. + (do_pending_lang_change): Push and pop lang context according + to value of pending_lang_change. + * cp-parse.y (extdefs): Use lang_extdef instead of extdef. + (extdef): Same as extdef, but call do_pending_lang_change() first. + +Mon Nov 15 15:39:15 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-typeck.c (build_binary_op_nodefault): Warn for ordered + compare of ptr with 0 only if pedantic in both cases. + +Thu Nov 25 13:31:37 1993 Chip Salzenberg <chip@fin.uucp> + + Reinstate the below patch, which got lost in the Cygnus merge: + Tue Nov 23 13:59:24 1993 Hallvard B Furuseth (hbf@durin.uio.no) + * cp-parse.y (maybe_type_qual): Don't fail to set $$. + +Wed Nov 17 19:03:30 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-parse.y (attrib): Allow "ident(ident)" like the C front end. + +Fri Oct 22 20:43:37 1993 Paul Eggert <eggert@twinsun.com> + + * cp-lex.c (real_yylex): Diagnose floating point constants + that are too large. + +Wed Nov 17 19:10:37 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-type2.c (build_functional_cast): ARM page 16: When a class + and an object, function or enumerator are declared in the same + scope with the same name, the class name is hidden. + +Wed Nov 17 19:07:18 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-call.c (convert_harshness_ansi): Distinguish float, double, + and long double from each other when overloading. + (compute_conversion_costs_{ansi,old}, build_method_call, + build_overlay_call_real, convert_to_aggr): Always set and + always use H_LEN member of candidate structure. + +Mon Oct 11 23:10:53 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-decl.c (duplicate_decls): Note redeclarations of library + functions, and generate distinct warnings for them. + +Mon Oct 4 12:26:49 1993 Chip Salzenberg <chip@fin.uucp> + + Support format warnings in G++. + + * cp-tree.h: Protect against multiple inclusion. + Declare all public functions in c-common.c (copy from c-tree.h). + (STDIO_PROTO): Define. + (warn_format): Declare. + (record_format_info): Remove declaration. + * cp-decl.c (init_decl_processing): Call init_function_format_info. + * cp-decl2.c (lang_decode_option): Make "-Wall" include warn_format. + * cp-typeck.c (build_function_call_real): Call check_function_format. + (record_format_info): Remove -- obsolete stub. + +Sat Jul 24 12:04:29 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-decl.c (duplicate_decls): Don't warn for non-extern var decl + following an extern one (for -Wredundant-decls). + * cp-parse.y (primary): In statement expression case, if compstmt + returns something other than a BLOCK, return it unchanged. + +Thu Dec 2 20:44:58 1993 Chip Salzenberg <chip@fin.uucp> + + * cp-decl.c (warn_extern_redeclared_static): New function made + from code extracted from pushdecl. + (duplicate_decls, pushdecl): Call new function. + (lookup_name_current_level): Allow for IDENTIFIER_GLOBAL_VALUE + to be a TREE_LIST when function is declared in 'extern "C" {}'. + +Fri Dec 3 16:01:10 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-class.c (duplicate_tag_error): Use cp_error. + (finish_base_struct): Check for ambiguity with direct base, and don't + generate op= or copy ctor if it exists. + +Fri Dec 3 15:32:34 1993 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-init.c (expand_member_init): when initializer name is null, + don't try to build it now because emit_base_init will handle it. + +Fri Dec 3 12:28:59 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-lex.c (init_lex): Initialize input_filename to "<internal>" for + code such as ExceptionHandler::operator=. + +Fri Dec 3 10:32:08 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (grokdeclarator): Don't try to print out dname when + complaining about arrays of references if decl_context==TYPENAME, + since it will be null. + + * cp-decl2.c: Default to flag_ansi_overloading. + +Thu Dec 2 18:05:56 1993 Kung Hsu <kung@cirdan.cygnus.com> + + * cp-call.c (build_method_call): use binfo from instance if it's + different from binfo (basetype_path) passed from above. + +Wed Nov 17 19:14:29 1993 Chip Salzenberg <chip@fin.uucp> + + cp-error.c (dump_expr): Use unsigned chars to output a + TREE_REAL_CST in hex. + +Thu Dec 2 11:05:48 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-class.c (finish_struct): Fix typo in setting + cant_synth_asn_ref. + + * cp-tree.h (TYPE_NESTED_NAME): New macro, does + DECL_NESTED_TYPENAME (TYPE_NAME (NODE)). + + * cp-lex.c (default_copy_constructor_body): Change + DECL_NAME (TYPE_NAME (btype)) to TYPE_NESTED_NAME (btype). + (default_assign_ref_body): Likewise. + (default_copy_constructor_body): Call operator= explicitly for + base classes that have no constructor. + +Thu Dec 2 10:47:15 1993 Michael Tiemann <tiemann@blues.cygnus.com> + + * cp-call.c (build_method_call): If the instance variable is + converted to error_mark_node when we're trying to convert it to the + base type of a method we're looking up, return error_mark_node. + +Thu Dec 2 10:41:16 1993 Torbjorn Granlund <tege@cygnus.com> + + * cp-typeck.c (build_binary_op_nodefault): In *_DIV_EXPR *_MOD_EXPR + cases, tests for unsigned operands by peeking inside a NOP_EXPR. + +Wed Dec 1 13:33:34 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-call.c (compute_conversion_costs_ansi): Use the size of struct + harshness_code, not the size of short, for clearing out the + ansi_harshness. + + * cp-call.c (print_candidates): New function. + (build_method_call): When we had some candidates, but didn't get a + usable match, don't report that we got an error with the first + candidate. Instead, say there were no matches, and list the + candidates with print_candidates. In the second pass, make sure we + clear out ever_seen, so we can accurately count the number of + functions that qualified. + +Wed Dec 1 09:53:59 1993 Torbjorn Granlund <tege@cygnus.com> + + * cp-typeck.c (build_binary_op_nodefault): Shorten for *_MOD_EXPR + only if op1 is known to be != -1. + (build_binary_op_nodefault): Handle *_DIV_EXPR likewise. + +Tue Nov 30 14:07:26 1993 Brendan Kehoe <brendan@lisa.cygnus.com> + + * cp-method.c (hack_identifier): If the field itself is private, and + not from a private base class, say so. + +Mon Nov 29 03:00:56 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (grokdeclarator): Always warn on initialization of + const member. + +Wed Nov 24 00:49:35 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-class.c (finish_struct): Set TYPE_GETS_CONST_* properly. + (finish_base_struct): Set cant_synth_asn_ref properly. + + * cp-lex.c (cons_up_default_function): Add section for operator=. + (default_assign_ref_body): New function, mostly cribbed from + default_copy_constructor_body. + + * cp-class.c (base_info): Add members cant_synth_copy_ctor, + cant_synth_asn_ref, no_const_asn_ref. + (finish_base_struct): Update no_const_asn_ref, note that you should + update cant_synth_*, propagate TYPE_GETS_ASSIGN_REF. + (finish_struct): Add decls for cant_synth_*, no_const_asn_ref, and + initialize them properly. Set no_const_asn_ref properly. Set + cant_synth_* in some of the situations where they should be set. + Propagate TYPE_GETS_ASSIGN_REF. Use cant_synth_copy_ctor. Add call + to cons_up_default_function for operator=. + +Tue Nov 23 20:24:58 1993 Mike Stump <mrs@cygnus.com> + + * cp-cvt.c (convert_force): Add code to perform casting of pointer + to member function types. + * cp-typeck.c (build_ptrmemfunc): Add FORCE parameter to indicate + when the conversion should be done, regardless. + * cp-tree.h (build_ptrmemfunc): Likewise. + * cp-type2.c (digest_init): Likewise. + * cp-typeck.c (convert_for_assignment): Likewise. + +Tue Nov 23 18:06:58 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-error.c (dump_expr): Do the right thing for variables of + reference type. + + * cp-decl.c (grok_op_properties): Set TYPE_HAS_ASSIGN_REF + and its kin properly. + (xref_tag): Propagate TYPE_GETS_ASSIGN_REF. + +Tue Nov 23 12:26:13 1993 Mike Stump <mrs@cygnus.com> + + * cp-method.c (build_opfncall): Don't count pointer to member + functions as aggregates here, as we don't want to look up methods in + them. The compiler would core dump if we did, as they don't have + normal names. + * cp-typeck.c (build_indirect_ref): Improve wording on error + message. + +Mon Nov 22 14:22:23 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c (grok_op_properties): Allow operator?: with pedwarn + (since it's supported in other compiler bits). + + * cp-method.c (report_type_mismatch): Use cp_error; ignore err_name + argument. + + * cp-error.c (dump_function_decl): Don't print return type for + constructors and destructors. + + * cp-cvt.c (cp_convert_to_pointer): Import code from + convert_to_pointer so we can return error_mark_node in the case of an + error, and to allow more meaningful error messages. + (build_type_conversion): Don't go through void* when trying + to convert to a pointer type. + + * cp-decl.c (grokfndecl): Move call to grok_op_properties back + after grokclassfn so that it's dealing with the right decl. + (grok_op_properties): Don't assert !methodp for op new and op delete. + + * cp-init.c (build_delete): Don't use TYPE_BUILT_IN (there are now + no uses of it in the compiler). + + * cp-call.c (build_scoped_method_call): Fix for destructors of simple + types. + (build_method_call): Likewise. + +Fri Nov 19 12:59:38 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.c (count_functions): Abstraction function. + + * cp-call.c (build_overload_call_real): Deal with new overloading + properly, remove dead code. + + * gcc.c (default_compilers): Generate and use .ii files in the + intermediate stage of compiling C++ source. + +Fri Nov 19 11:26:09 1993 Jim Wilson <wilson@sphagnum.cygnus.com> + + * cp-expr.c (cplus_expand_expr): Make call_target a valid memory + address before using it, so it can be later safely compared. + +Fri Nov 12 15:30:27 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-pt.c (tsubst): Deal with new overloading. + + * cp-typeck.c (fntype_p): is the arg function type? + (comp_target_parms): pedwarn on conversion from (anything) to (...). + (build_x_function_call): Deal with new overloading. + + * cp-tree.c (decl_list_length): Deal with new overloading. + (decl_value_member): Like value_member, but for DECL_CHAINs. + + * cp-decl.c (duplicate_decls): Deal with new overloading. + (start_decl): Likewise. + + * cp-class.c (instantiate_type): Deal with new overloading. + + * cp-call.c (convert_harshness_ansi): Deal with new overloading. + (convert_harshness_old): Deal with new overloading. + (build_overload_call_real): Likewise. + +Mon Nov 8 13:50:49 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-tree.c (get_unique_fn): New function; returns FUNCTION_DECL + if unambiguous, NULL_TREE otherwise. + (get_first_fn): Returns the first appropriate FUNCTION_DECL. + (is_overloaded_fn): Returns whether or not the passed tree is + a function or list of functions. + + * cp-init.c (init_init_processing): use `get_first_fn' to find + the FUNCTION_DEFN for new and delete. + + * cp-decl.c (push_overloaded_decl): Use new overloading strategy, cut + code size in half (I spit on special cases). + +Tue Sep 7 20:03:33 1993 Jason Merrill <jason@deneb.cygnus.com> + + * cp-decl.c: Allow references and template type parameters as well diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS new file mode 100644 index 00000000000..8f057ef5815 --- /dev/null +++ b/gcc/cp/NEWS @@ -0,0 +1,139 @@ +*** Changes since G++ version 2.7.2: + +* A public review copy of the December 1996 Draft of the ANSI C++ + proto-standard is now available. See + + http://www.cygnus.com/misc/wp/ + + for more information. + +* Default function arguments in templates will not be evaluated (or + checked for semantic validity) unless they are needed. + +* The -ftemplate-depth-NN flag can be used to increase the maximum + recursive template instantiation depth, defaulting to 17. If you need + to use this flag, the compiler will tell you. + +* The internal interface between RTTI-using code and the RTTI support + library has changed, so code that uses dynamic_cast should be + recompiled. The RTTI support library has moved from libstdc++ to + libgcc, so you no longer need to link against libstdc++ for a program + that doesn't use the "hosted" library. + +* bool is now always the same size as another built-in type. Previously, + a 64-bit RISC target using a 32-bit ABI would have 32-bit pointers and a + 64-bit bool. This should only affect Irix 6, which was not supported in + 2.7.2. + +* new (nothrow) is now supported. + +* A flag -Weffc++ has been added for violations of some of the style + guidelines in Scott Meyers' _Effective C++_ books. + +* On ELF systems, duplicate copies of symbols with 'initialized common' + linkage (such as template instantiations, vtables, and extern inlines) + will now be discarded by the GNU linker, so you don't need to use -frepo. + This support requires GNU ld from binutils 2.8 or later. + +* Partial specialization of class templates is now supported. + +* The overload resolution code has been rewritten to conform to the latest + C++ Working Paper. Built-in operators are now considered as candidates + in operator overload resolution. Function template overloading chooses + the more specialized template, and handles base classes in type deduction + and guiding declarations properly. In this release the old code can + still be selected with -fno-ansi-overloading, although this is not + supported and will be removed in a future release. + +* RTTI support has been rewritten to work properly and is now on by default. + This means code that uses virtual functions will have a modest space + overhead. You can use the -fno-rtti flag to disable RTTI support. + +* Synthesized destructors are no longer made virtual just because the class + already has virtual functions, only if they override a virtual destructor + in a base class. The compiler will warn if this affects your code. + +* The g++ driver no longer links with libg++ by default; it is now + functionally identical to the c++ driver. + +* (void *)0 is no longer considered a null pointer constant; NULL in + <stddef.h> is now defined as __null, a magic constant of type (void *) + normally, or (size_t) with -ansi. + +* The new 'template <>' specialization syntax is now accepted and ignored. + +* The name of a class is now implicitly declared in its own scope; A::A + refers to A. + +* g++ now uses a new implementation of templates. The basic idea is that + now templates are minimally parsed when seen and then expanded later. + This allows conformant early name binding and instantiation controls, + since instantiations no longer have to go through the parser. + + What you get: + + + Inlining of template functions works without any extra effort or + modifications. + + Instantiations of class templates and methods defined in the class + body are deferred until they are actually needed (unless + -fexternal-templates is specified). + + Nested types in class templates work. + + Static data member templates work. + + Possible problems: + + + Types and class templates used in templates must be declared + first, or the compiler will assume they are not types, and fail. + + Similarly, nested types of template type parameters must be tagged + with the 'typename' keyword. In many cases, the compiler will tell + you where you need to add 'typename'. + + Syntax errors in templates that are never instantiated will now be + diagnosed. + +* Synthesized methods are now emitted in any translation units that need + an out-of-line copy. They are no longer affected by #pragma interface + or #pragma implementation. + +* Local classes are now supported. + +* -Wall no longer implies -W. + The new warning flag, -Wsign-compare, included in -Wall, warns about + dangerous comparisons of signed and unsigned values. Only the flag is + new; it was previously part of -W. + +* The new flag, -fno-weak, disables the use of weak symbols. + +* __attribute__ can now be attached to types as well as declarations. + +* -Woverloaded-virtual now warns if a virtual function in a base class is + hidden in a derived class, rather than warning about virtual functions + being overloaded (even if all of the inherited signatures are + overridden) as it did before. + +* The compiler no longer emits a warning if an ellipsis is used as a + function's argument list. + +* Exception handling support has been significantly improved and is on by + default. This can result in significant runtime overhead. You can turn + it off with -fno-exceptions. + +* Definition of nested types outside of their containing class is now + supported. Use the following source code, as an example. + + struct A { + struct B; + B* bp; + }; + + struct A::B { + int member; + }; + +* Explicit instantiation of template constructors and destructors is now + supported. Use the following source code, as an example. + + template A<int>::A(const A&); + +* On the HPPA, some classes that do not define a copy constructor + will be passed and returned in memory again so that functions + returning those types can be inlined. diff --git a/gcc/cp/g++FAQ.texi b/gcc/cp/g++FAQ.texi new file mode 100644 index 00000000000..09c812bc585 --- /dev/null +++ b/gcc/cp/g++FAQ.texi @@ -0,0 +1,2158 @@ +\input texinfo.tex @c -*-texinfo-*- +@c %**start of header +@setfilename g++FAQ.info +@settitle Frequently asked questions about the GNU C++ compiler +@setchapternewpage off +@c version: @(#)g++FAQ.texi 1.56 09/15/97 +@c %**end of header + +@iftex +@finalout +@end iftex +@titlepage +@title G++ FAQ +@subtitle Frequently asked questions about the GNU C++ compiler +@subtitle September 14, 1997 +@sp 1 +@author Joe Buck +@page +@end titlepage + +@ifinfo +@node Top, basics, (dir), (dir) +@top +@unnumbered FAQ for g++ and libg++, by Joe Buck (jbuck@@synopsys.com) +@end ifinfo + +@cindex FAQ for g++, latest version +@cindex Archive site for FAQ lists +@cindex rtfm.mit.edu +@cindex Joe Buck <jbuck@@synopsys.com> +@cindex FAQ for C++ + +This is a list of frequently asked questions (FAQ) for g++ users; thanks to +all those who sent suggestions for improvements. Thanks to Marcus Speh +for doing the index. A hypertext version is available on the World Wide +Web at @file{http://www.cygnus.com/misc/g++FAQ_toc.html}. + +This document has just been reorganized a bit. There is some new +information about upcoming g++ releases and egcs; more needs to be done +but that will need to wait for next time. A diff would look misleadingly +large, since I blew away and rebuilt the texinfo menus. + +Please send updates and corrections to the FAQ to +@code{jbuck@@synopsys.com}. Please do @emph{not} use me as a resource +to get your questions answered; that's what @file{gnu.g++.help} is for and I +don't have the time to support the net's use of g++. + +Many FAQs, including this one, are available on the archive site +``rtfm.mit.edu''; see @* +@file{ftp://rtfm.mit.edu/pub/usenet/news.answers}. +This FAQ may be found in the subdirectory g++-FAQ. + +@cindex Marshall Cline +@cindex comp.lang.c++ +@cindex C++ FAQ +This FAQ is intended to supplement, not replace, Marshall Cline's +excellent FAQ for the C++ language and for the newsgroup +@file{comp.lang.c++}. Especially if g++ is the first C++ +compiler you've ever used, the question ``How do I do <X> with g++?'' +is probably really ``How do I do <X> in C++?''. +You can find this FAQ at +@file{ftp://rtfm.mit.edu/pub/usenet/comp.lang.c++}, +or in HTML form at @file{http://www.cerfnet.com/~mpcline/On-Line-C++-FAQs/}. + +@menu +* basics:: What is g++? How do I get it? +* installation:: How to install, installation problems +* evolution:: The Evolution of g++ +* User Problems:: Commonly reported problems and bugs +* legalities:: Lawyer stuff, GPL, LGPL, etc. +* index:: Index of terms + + --- The Detailed Node Listing --- + +The basics: what is g++? + +* latest versions:: +* g++ for Unix:: +* g++ for HP:: +* g++ for Solaris 2.x:: +* g++ for other platforms:: +* 1.x vs 2.x versions:: + +Installation Issues and Problems + +* gcc-2 + g++-1:: +* what else do I need?:: +* use GNU linker?:: +* Use GNU assembler?:: +* shared libraries:: +* repository:: +* repo bugs:: +* Use GNU C library?:: +* Global constructor problems:: +* Strange assembler errors:: +* Other problems building libg++:: +* More size_t problems:: +* Rebuild libg++?:: +* co-existing versions:: +* Installing on Linux:: +* Linux Slackware 3.0:: + +The Evolution of g++ + +* version 2.7.x:: +* libstdc++:: +* new work:: +* egcs:: +* When?:: + +User Problems + +* missing virtual table:: +* for scope:: +* const constructor:: +* unused parameter warnings:: +* jump crosses initialization:: +* Demangler:: +* static data members:: +* internal compiler error:: +* bug reports:: +* porting to g++:: +* name mangling:: +* problems linking with other libraries:: +* documentation:: +* templates:: +* undefined templates:: +* redundant templates:: +* Standard Template Library:: +* STL and string:: +* exceptions:: +* namespaces:: +* agreement with standards:: +* compiling standard libraries:: +* debugging on SVR4 systems:: +* debugging problems on Solaris:: +* X11 conflicts with libg++:: +* assignment to streams:: +@end menu + +@node basics, installation, Top, Top +@chapter The basics: what is g++? + +@cindex Free Software Foundation +@cindex GNU Public License +@cindex GPL + +g++ is the traditional nickname of GNU C++, a freely redistributable +C++ compiler produced by the Free Software Foundation plus dozens of +skilled volunteers. I say ``traditional nickname'' because the GNU +compiler suite, gcc, bundles together compilers for C, Objective-C, +and C++ in one package. + +While the source code to gcc/g++ can be downloaded for free, +it is not public domain, but is protected by the GNU Public License, +or GPL (@pxref{legalities}). + +@menu +* latest versions:: +* g++ for Unix:: +* g++ for HP:: +* g++ for Solaris 2.x:: +* g++ for other platforms:: +* 1.x vs 2.x versions:: +@end menu + +@node latest versions, g++ for Unix, basics, basics +@section What is the latest version of gcc, g++, and libg++? + +@cindex gcc/g++, version date +The current version of gcc/g++ is 2.7.2.3, released August 20, 1997. +Although that looks very recent, the only change is a minor patch to +resolve a problem with Linux and the GNU C library; users not interested +in that functionality have no reason to upgrade. + +The current version of libg++ is 2.7.2, released July 4, 1996. +The last release of gcc/g++ with improvements to the C++ front end was +2.7.2, released Nov. 25, 1995, nearly two years ago. + +I would strongly recommend that anyone using a g++ version earlier +than 2.7.2 should upgrade if at all possible (@pxref{version 2.7.x}). + +For some non-Unix platforms, the latest port of gcc may be an earlier +version (2.6.3, say). You'll need to use a version of libg++ that +has the same first two digits as the compiler version, e.g. use libg++ +2.6.x (for the latest x you can find) with gcc version 2.6.3. + +The latest "1.x" version of gcc is 1.42, and the latest "1.x" version of +g++ is 1.42.0. +While gcc 1.42 is quite usable for C programs, +I recommend against using g++ 1.x except in special circumstances +(and I can't think of any such circumstances). + +@node g++ for Unix, g++ for HP, latest versions, basics +@section How do I get a copy of g++ for Unix? + +First, you may already have it if you have gcc for your platform; +g++ and gcc are combined now (as of gcc version 2.0). +@cindex GNU gcc, version +@cindex GNU g++ and gcc + +You can get g++ from a friend who has a copy, by anonymous FTP or +UUCP, or by ordering a tape or CD-ROM from the Free Software +Foundation. +@cindex g++, ordering +@cindex g++, getting a copy + +The Free Software Foundation is a nonprofit organization that +distributes software and manuals to raise funds for more GNU +development. Getting your copy from the FSF contributes directly to +paying staff to develop GNU software. CD-ROMs cost $400 if an +organization is buying, or $100 if an individual is buying. Tapes +cost around $200 depending on media type. I recommend asking for +version 2, not version 1, of g++. +@cindex FSF [Free Software Foundation] +@cindex GNU [GNU's not unix] + +For more information about ordering from the FSF, contact +gnu@@prep.ai.mit.edu, phone (617) 542-5942 or anonymous ftp file +@file{ftp://prep.ai.mit.edu/pub/gnu/GNUinfo/ORDERS} (you can +also use one of the sites listed below if you can't get into ``prep''). + +@cindex FSF, contact <gnu@@prep.ai.mit.edu> + +Here is a list of anonymous FTP archive sites for GNU software. +If no directory is given, look in @file{/pub/gnu}. + +@cindex GNUware, anonymous FTP sites + +@example +ASIA: ftp.cs.titech.ac.jp, tron.um.u-tokyo.ac.jp:/pub/GNU/prep +cair-archive.kaist.ac.kr, ftp.nectec.or.th:/pub/mirrors/gnu + +AUSTRALIA: archie.au:/gnu (archie.oz or archie.oz.au for ACSnet) + +AFRICA: ftp.sun.ac.za + +MIDDLE-EAST: ftp.technion.ac.il:/pub/unsupported/gnu + +EUROPE: irisa.irisa.fr, ftp.univ-lyon1.fr, +ftp.mcc.ac.uk, unix.hensa.ac.uk:/mirrors/uunet/systems/gnu, +src.doc.ic.ac.uk:/gnu, ftp.ieunet.ie, ftp.eunet.ch, +nic.switch.ch:/mirror/gnu, ftp.informatik.rwth-aachen.de, +ftp.informatik.tu-muenchen.de, ftp.win.tue.nl, ftp.nl.net, +ftp.etsimo.uniovi.es, ftp.funet.fi, ftp.denet.dk, +ftp.stacken.kth.se, isy.liu.se, ftp.luth.se:/pub/unix/gnu, +ftp.sunet.se, archive.eu.net + +SOUTH AMERICA: ftp.inf.utfsm.cl, ftp.unicamp.br + +WESTERN CANADA: ftp.cs.ubc.ca:/mirror2/gnu + +USA: wuarchive.wustl.edu:/systems/gnu, labrea.stanford.edu, +ftp.digex.net, ftp.kpc.com:/pub/mirror/gnu, f.ms.uky.edu:/pub3/gnu, +jaguar.utah.edu:/gnustuff, ftp.hawaii.edu:/mirrors/gnu, +uiarchive.cso.uiuc.edu, ftp.cs.columbia.edu:/archives/gnu/prep, +gatekeeper.dec.com:/pub/GNU, ftp.uu.net:/systems/gnu +@end example + +The ``official site'' is prep.ai.mit.edu, but your transfer will probably +go faster if you use one of the above machines. + +@cindex gzip +Most GNU utilities are compressed with ``gzip'', the GNU compression +utility. All GNU archive sites should have a copy of this program, +which you will need to uncompress the distributions. + +@cindex libg++ +Don't forget to retrieve libg++ as well! + +@node g++ for HP, g++ for Solaris 2.x, g++ for Unix, basics +@section Getting gcc/g++ for the HP Precision Architecture + +@cindex HP Precision Architecture +@cindex Hewlett-Packard +@cindex GNU GAS +@cindex GNU gdb + +If you use the HP Precision Architecture (HP-9000/7xx and HP-9000/8xx) +and you want to use debugging, you'll need to use the GNU assembler, GAS +(version 2.3 or later). If you build from source, you must tell the +configure program that you are using GAS or you won't get debugging +support. A non-standard debug format is used, since until recently HP +considered their debug format a trade secret. Thanks to the work of +lots of good folks both inside and outside HP, the company has seen the +error of its ways and has now released the required information. The +team at the University of Utah that did the gcc port now has code that +understands the native HP format. + +There are binaries for GNU tools in +@file{ftp://jaguar.cs.utah.edu/dist/}, +but these are older versions. + +Jeff Law has left the University of Utah, so the Utah prebuilt +binaries may be discontinued. + +@node g++ for Solaris 2.x, g++ for other platforms, g++ for HP, basics +@section Getting gcc/g++ binaries for Solaris 2.x + +``Sun took the C compiler out of Solaris 2.x. Am I stuck?'' + +@cindex Solaris +@cindex gcc/g++ binaries for Solaris + +You'll need to get prebuilt binaries from someone. + +It used to be that you could get GCC binaries from prep.ai.mit.edu; +these are no longer there. + +@cindex Solaris pkgadd utility +The WWW site @file{http://smc.vnet.net/solaris_2.5.html} +contains various +GNU and freeware programs for Solaris2.5 running on the sparc. These are +packaged to enable easy installation using the Solaris ``pkgadd'' utility. +These include GNU emacs, gcc, gdb, perl, and others. These versions +are more recent than the binaries at ``prep'' (gcc 2.7.2 and libg++ +2.7.1 are there). + +@node g++ for other platforms, 1.x vs 2.x versions, g++ for Solaris 2.x, basics +@section How do I get a copy of g++ for (some other platform)? + +@cindex Windows NT support +As of gcc-2.7.x, there is Windows NT support in gcc. Some special +utilities are required. See the INSTALL file from the distribution. +If you're interested in GNU tools on Windows NT, see +@file{http://www.cygnus.com/misc/gnu-win32/} on the WWW, or the +anonymous FTP directory +@file{ftp://ftp.cygnus.com/pub/gnu-win32/}. + +@cindex VMS support +@cindex VAX +@cindex VMS, g++/libg++ precompiled + +The standard gcc/g++ distribution includes VMS support for the Vax. +Since the FSF people don't use VMS, it's likely to be somewhat less +solid than the Unix version. Precompiled copies of g++ and libg++ in +VMS-installable form for the Vax are available by FTP from +@file{ftp://mango.rsmas.miami.edu/pub/VMS-gcc/}. + +@cindex OpenVMS/Alpha +Klaus Kaempf (kkaempf@@progis.de) +has done a port to OpenVMS for the Alpha; this is not yet a +part of the official gcc/g++. +The port includes g++ and all libraries from the libg++ distribution. See +@file{http://www.progis.de} for more details. + +@cindex MS-DOS support +@cindex Delorie's gcc/g++ +@cindex DJGPP +@cindex EMX +There are two different versions of gcc/g++ for MS-DOS: EMX and DJGPP. +EMX also works for OS/2 and is described later. +DJGPP is DJ Delorie's port. It can be found on many FTP archive +sites; try +@file{ftp://ftp.coast.net/SimTel/vendors/djgpp/} +or, for a complete list, see +@file{http://www.delorie.com/djgpp/getting.html}. + + +The latest version of DJGPP is 2.00. See +@file{http://www.delorie.com/djgpp/v2/} for information on this version. + +FSF sells floppies with DJGPP on them; see above for ordering software +from the FSF. + +DJGPP has its own newsgroup: @file{comp.os.msdos.djgpp}. + +@cindex Amiga support +Development and porting efforts for GNU tools, including gcc/g++, for +the Amiga are maintained by an initiative named ADE (Amiga Developers +Environment. More information about ADE is available at +@file{http://www.ninemoons.com/}. + +For more information on Amiga ports of gcc/g++, retrieve the file +@file{ftp://prep.ai.mit.edu/pub/gnu/MicrosPorts/Amiga}. + +@cindex Atari ST support +A port of gcc to the Atari ST can be found at @* +@file{ftp://atari.archive.umich.edu/atari/Gnustuff/Tos} +along with many +other GNU programs. This version is usually the same as the latest FSF +release. See the ``Software FAQ'' for the Usenet group +@file{comp.sys.atari.st} for more information. + +@cindex EMX port +@cindex OS/2 support + +EMX is a port of gcc to OS/2; it can also be used on MS-DOS. In addition to +the compiler port, the EMX port's C library attempts to provide a +Unix-like environment. For more information ask around on +@file{comp.os.os2.programmer.porting}. Version 0.9c, based on gcc-2.7.2.1, +was released in +November 1996. It is available by FTP and the WWW from, among other +places + +@example +@file{http://www.os2ss.com/unix/emx09c/} +@file{ftp://ftp.cdrom.com/pub/os2/emx09c/} (US) +@file{ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/} (Germany) +@end example + +Eberhard Mattes did the EMX port. His address is +mattes@@azu.informatik.uni-stuttgart.de. +Read the FAQ file included with the distribution before harrassing the author. + +@cindex Apple support +@cindex Macintosh support + +I'm looking for more information on gcc/g++ support on the Apple +Macintosh. Until recently, this FAQ did not provide such information, +but FSF is no longer boycotting Apple as the League for Programming +Freedom boycott has been dropped. + +Versions 1.37.1 and 2.3.3 of gcc were ported by Stan Shebs and are available +at @* +@file{ftp://ftp.cygnus.com/pub/mac} + +They are both interfaced to MPW. +Stan is working on a version using the current (post-2.7) sources, contact +him directly (shebs@@cygnus.com) for more information. + +@node 1.x vs 2.x versions, , g++ for other platforms, basics +@section But I can only find g++-1.42! + +``I keep hearing people talking about g++ 2.7.2 (or some other number +starting with 2), but the latest version I can find is g++ 1.42. +Where is it?'' + +@cindex Objective-C +@cindex g++, version number +As of gcc 2.0, C, C++, and Objective-C as well are all combined into a +single distribution called gcc. If you get gcc you already have g++. The +standard installation procedure for any gcc version 2 compiler will +install the C++ compiler as well. + +One could argue that we shouldn't even refer to "g++-2.x.y" but it's a +convention. It means ``the C++ compiler included with gcc-2.x.y.'' + +@node installation, evolution, basics, Top +@chapter Installation Issues and Problems + +@menu +* gcc-2 + g++-1:: +* what else do I need?:: +* use GNU linker?:: +* Use GNU assembler?:: +* shared libraries:: +* repository:: +* repo bugs:: +* Use GNU C library?:: +* Global constructor problems:: +* Strange assembler errors:: +* Other problems building libg++:: +* More size_t problems:: +* Rebuild libg++?:: +* co-existing versions:: +* Installing on Linux:: +* Linux Slackware 3.0:: +@end menu + +@node gcc-2 + g++-1, what else do I need?, installation, installation +@section I can't build g++ 1.x.y with gcc-2.x.y! + +``I obtained gcc-2.x.y and g++ 1.x.y and I'm trying to build it, but +I'm having major problems. What's going on?'' + +@cindex g++, building +If you wish to build g++-1.42, you must obtain gcc-1.42 first. The +installation instructions for g++ version 1 leave a lot to be desired, +unfortunately, and I would recommend that, unless you have a special +reason for needing the 1.x compiler, that C++ users use the latest +g++-2.x version, as it +is the version that is being actively maintained. + +@cindex g++, template support +@cindex Templates +@cindex ANSI draft standard +There is no template support in g++-1.x, and it is generally much further +away from the ANSI draft standard than g++-2.x is. + +@node what else do I need?, use GNU linker?, gcc-2 + g++-1, installation +@section OK, I've obtained gcc; what else do I need? + +@cindex libg++ +First off, you'll want libg++ as you can do almost nothing without it +(unless you replace it with some other class library). + +@cindex GNU GAS +@cindex GNU GAS [assembler] +Second, depending on your platform, you may need "GAS", the GNU assembler, +or the GNU linker (see next question). + +@cindex GNU gdb +Finally, while it is not required, you'll almost certainly want the GNU +debugger, gdb. The latest version is +4.16, released April 22, 1996. +Other debuggers (like dbx, for example) will normally not be able to +understand at least some of the debug information produced by g++. + +@node use GNU linker?, Use GNU assembler?, what else do I need?, installation +@section Should I use the GNU linker, or should I use "collect"? + +@cindex Linker +@cindex System VR3, linker +@cindex System VR4, linker +First off, for novices: special measures must be taken with C++ to arrange +for the calling of constructors for global or static objects before the +execution of your program, and for the calling of destructors at the end. +(Exception: System VR3 and System VR4 linkers, Linux/ELF, and some other +systems support user-defined +segments; g++ on these systems requires neither the GNU linker nor +collect. So if you have such a system, the answer is that you don't +need either one, though using GNU ld does have some advantages over +the native linker in some cases). + +@cindex AT&T cfront +@cindex Cfront-end +@cindex collect program +@cindex GNU linker +@cindex GNU binutils +If you have experience with AT&T's "cfront", this function is performed +there by programs named "patch" or "munch". With GNU C++, it is performed +either by the GNU linker or by a program known as "collect". The collect +program is part of the gcc-2.x distribution; you can obtain the GNU linker +separately as part of the "binutils" package. The latest version of +binutils is 2.7, released July 10, 1996; 2.6 is in common use and works +well. + +(To be technical, it's "collect2"; there were originally several +alternative versions of collect, and this is the one that survived). + +There are advantages and disadvantages to either choice. + +Advantages of the GNU linker: +@cindex GNU linker, advantages +@cindex GNU ld +@cindex ld [GNU linker] + +It's faster than using collect -- collect basically runs the standard Unix +linker on your program twice, inserting some extra code after the first +pass to call the constructors. This is a sizable time penalty for large +programs. The GNU linker does not require this extra pass. + +GNU ld reports undefined symbols using their true names, not the mangled +names (but as of 2.7.0 so does collect). + +If there are undefined symbols, GNU ld reports which object file(s) refer to +the undefined symbol(s). On some OSes (e.g. SunOS, Solaris) the native +linker does not do this, so you have to track down who's referring to +the missing symbols yourself. + +As of binutils version 2.2, on systems that use the so-called "a.out" +debug format (e.g. Suns running SunOS 4.x), the GNU linker compresses +the debug symbol table considerably. The 2.7 version adds some symbol +table compression for ELF and Solaris targets. + +@cindex collect linker, advantages +Advantages of collect: + +@cindex Shared libraries +If your native linker supports shared libraries, you can use shared +libraries with collect. This used to be a strong reason @emph{not} +to use the GNU linker, but recent versions of GNU ld support linking +with shared libraries on many platforms, and creating shared libraries +on a few (such as Intel x86 systems that use ELF object format as well +as SunOS and Solaris). + +@xref{shared libraries} + +@cindex GNU linker, porting +The GNU linker has not been ported to as many platforms as g++ has, so you +may be forced to use collect. + +If you use collect, you don't need to get something extra and figure out +how to install it; the standard gcc installation procedure will do it for you. + +I used to say at this point that I don't see a clear win for either +linking alternative, but with all the improvements in the GNU linker +I think that it is now the better choice. Take your pick. + +If you run Linux, the only available linker is the GNU linker. + +@node Use GNU assembler?, shared libraries, use GNU linker?, installation +@section Should I use the GNU assembler, or my vendor's assembler? + +@cindex Assembler +@cindex GNU GAS +This depends on your platform and your decision about the GNU linker. For +most platforms, you'll need to use GAS if you use the GNU linker. For +some platforms, you have no choice; check the gcc installation notes to +see whether you must use GAS. But you can usually use the vendor's +assembler if you don't use the GNU linker. + +The GNU assembler assembles faster than many native assemblers; however, +on many platforms it cannot support the local debugging format. + +It used to be that the GNU assembler couldn't handle +position-independent code on SunOS. This is no longer true if you +have version 2.6 or newer. + +On HPUX or IRIX, you must use GAS (and configure gcc with the +@code{--with-gnu-as} option) to debug your programs. GAS is +strongly recommended particularly on the HP platform because of +limitations in the HP assembler. + +The GNU assembler has been merged with the binutils +distribution, so the GNU assembler and linker are now together in +this package (as of binutils version 2.5.1). + +On Linux the assembler is the GNU assembler. + +@node shared libraries, repository, Use GNU assembler?, installation +@section How do I build shared libraries with g++? + +For gcc-2.7.0 and later, building C++ shared libraries should work fine +on supported platforms (HPUX 9+, IRIX 5+, DEC UNIX (formerly OSF/1), +SGI/IRIX, AIX, SunOS 4, Linux/ELF and all targets using SVR4-style ELF shared +libraries). There are two separate issues: building libg++ as a shared +library, and making your own shared libraries. For libg++ it is simply +a matter of giving the @code{--enable-shared} option to the configure +program. When compiling your own code for shared libraries you +generally +must use the @code{-fPIC} flag to get position-independent code. + +@cindex -shared flag of gcc + +If your shared library contains global or static objects with +constructors, then make sure to use @code{gcc -shared}, not +@code{ld}, to create the shared library. This will make sure +that any processor-specific magic needed to execute the constructors +is included. + +In theory, constructors for objects in your shared library should be +called when the library is opened (by dlopen or equivalent). This +does not work on some platforms (e.g. SunOS4; it does work on Solaris +and ELF systems such as Linux): on the broken platforms, the +constructors are not called correctly. + +David Nilsen has suggested the following workaround: + +The thing to realize is that if you link your dynamic module with the +@code{-shared} flag, the collect program nicely groups all the static +ctors/dtors for you into a list and sets up a function that will call +them (Note: this means that this trick won't work if you use the GNU +linker without collect (@pxref{use GNU linker?}). + +The magic is knowing these function names. Currently, they're called: + +@example +_GLOBAL__DI <-- calls all module constructors +_GLOBAL__DD <-- calls all module destructors +@end example + +[ possibly the leading underscore will differ between platforms: jbuck ] + +Therefore, if you make a wrapper around dlopen that looks up the +symbol @code{_GLOBAL__DI} (or @code{__GLOBAL__DI} on SunOS4 machines), and +calls it, you'll simulate getting the constructors called. + +You also need to set up the destructors to be called as well, so you +need to put a wrapper around dlclose, which will call the +@code{_GLOBAL__DD} function in the module when/if it's unloaded. + +Lastly, to get things 100% correct, you need to set up the destructors +to also be called if the module is not unloaded, but the main program +exits. I do this by registering a single function with @code{atexit()} that +calls all the destructors left in dynamically loaded modules. + +@cindex Shared version of libg++ +Check the file @file{README.SHLIB} from the libg++ distribution for more +about making and using shared libraries. + +@cindex Shared libraries with HP + +A patch is needed to build shared versions of version 2.7.2 of libg++ +and libstdc++ on the HP-PA architecture. You can find the patch at +@file{ftp://ftp.cygnus.com/pub/g++/libg++-2.7.2-hppa-gcc-fix}. + +@node repository, repo bugs, shared libraries, installation +@section How do I use the new repository code? + +@cindex repo patch +Because there is some disagreement about the details of the template +repository mechanism, you'll need to obtain a patch from Cygnus Support +to enable the 2.7.2 repository code. You can obtain the patch by +anonymous FTP: @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz}. + +There are patches for 2.7.0 and 2.7.1 in the same directory, though +if you're going to rebuild the compiler you should use the latest one. + +@cindex repo patch for BSD +If you're running NetBSD or BSDI, the Cygnus repo patch is not quite +correct. Tim Liddelow has made an alternate version available at +@file{ftp://ftp.cst.com.au/pub/gcc-2.7.2-repo-bsd.gz}. + +After you've applied the patch, the @code{-frepo} flag will enable the +repository mechanism. The flag works much like the existing +@code{-fno-implicit-templates} flag, except that auxiliary files, with +an @file{.rpo} extension, are built that specify what template +expansions are needed. At link time, the (patched) collect program +detects missing templates and recompiles some of the object files +so that the required templates are expanded. + +Note that the mechanism differs from that of cfront in that template +definitions still must be visible at the point where they are to be +expanded. No assumption is made that @file{foo.C} contains template +definitions corresponding to template declarations in @file{foo.h}. + +@cindex closure with repo +@cindex template closure +Jason Merrill writes: ``To perform closure on a set of objects, just try +to link them together. It will fail, but as a side effect all needed +instances will be generated in the objects.'' + +@node repo bugs, Use GNU C library?, repository, installation +@section Known bugs and problems with the repo patch + +``The @code{-frepo} won't expand templated friend functions!'' + +This is a known bug; currently you'll have to explicitly instantiate +friend functions when using @code{-frepo} due to this bug (in 2.7.0 +through 2.7.2 at least). + +With earlier versions of the repo patch, there was a bug that happens +when you have given a quoted command line switch, something like + +@example +-D'MESSAGE="hello there"' +@end example + +The repo code tries to recompile files using the same flags you +originally specified, but doesn't quote arguments that need quoting, +resulting in failures in some cases. This is no longer a problem +with the 2.7.2 patch. + +@node Use GNU C library?, Global constructor problems, repo bugs, installation +@section Should I use the GNU C library? + +@cindex GNU C library +@cindex libg++ +At this point in time, no (unless you are running Linux or the GNU Hurd +system). The GNU C library is still very young, and +libg++ still conflicts with it in some places. Use your native C library +unless you know a lot about the gory details of libg++ and gnu-libc. This +will probably change in the future. + +@node Global constructor problems, Strange assembler errors, Use GNU C library?, installation +@section Global constructors aren't being called + +@cindex global constructors +``I've installed gcc and it almost works, but constructors and +destructors for global objects and objects at file scope aren't being +called. What did I do wrong?'' + +@cindex collect program +It appears that you are running on a platform that requires you to +install either "collect2" or the GNU linker, and you have done neither. +For more information, see the section discussing the GNU linker +(@pxref{use GNU linker?}). + +@cindex constructor problems on Solaris +@cindex Solaris, constructor problems +On Solaris 2.x, you shouldn't need a collect program and GNU ld doesn't run. +If your global constructors aren't being called, you may need to install +a patch, available from Sun, to fix your linker. The number of the +``jumbo patch'' that applies is 101409-03. Thanks to Russell Street +(r.street@@auckland.ac.nz) for this info. + +@cindex IRIX, installing collect +It appears that on IRIX, the collect2 program is not being installed +by default during the installation process, though it is required; +you can install it manually by executing + +@example +make install-collect2 +@end example + +from the gcc source directory after installing the compiler. (I'm +not certain for which versions of gcc this problem occurs, and whether +it is still present). + +@node Strange assembler errors, Other problems building libg++, Global constructor problems, installation +@section Strange assembler errors when linking C++ programs + +``I've installed gcc and it seemed to go OK, but when I attempt to link +any C++ program, I'm getting strange errors from the assembler! How +can that be?'' + +The messages in question might look something like + +@example +as: "/usr/tmp/cca14605.s", line 8: error: statement syntax +as: "/usr/tmp/cca14605.s", line 14: error: statement syntax +@end example + +(on a Sun, different on other platforms). The important thing is that +the errors come out at the link step, @emph{not} when a C++ file is +being compiled. + +@cindex nm program +@cindex GNU nm program +Here's what's going on: the collect2 program uses the Unix ``nm'' +program to obtain a list of symbols for the global constructors and +destructors, and it builds a little assembly language module that +will permit them all to be called. If you're seeing this symptom, +you have an old version of GNU nm somewhere on your path. This old +version prints out symbol names in a format that the collect2 program +does not expect, so bad assembly code is generated. + +The solution is either to remove the old version of GNU nm from your +path (and that of everyone else who uses g++), or to install a newer +version (it is part of the GNU "binutils" package). Recent versions +of GNU nm do not have this problem. + +@node Other problems building libg++, More size_t problems, Strange assembler errors, installation +@section Other problems building libg++ +@cindex libg++ on Ultrix +@cindex libg++ on SunOS + +``I am having trouble building libg++. Help!'' + +On some platforms (for example, Ultrix), you may see errors complaining +about being unable to open dummy.o. On other platforms (for example, +SunOS), you may see problems having to do with the type of size_t. +The fix for these problems is to make libg++ by saying "make CC=gcc". +According to Per Bothner, it should no longer be necessary to specify +"CC=gcc" for libg++-2.3.1 or later. + +``I built and installed libg++, but g++ can't find it. Help!'' + +The string given to @file{configure} that identifies your system must +be the same when you install libg++ as it was when you installed gcc. +Also, if you used the @code{--prefix} option to install gcc somewhere +other than @file{/usr/local}, you must use the same value for +@code{--prefix} when installing libg++, or else g++ will not be able +to find libg++. + +@cindex patch for libg++-2.6.2 + +The toplevel Makefile in the libg++ 2.6.2 distribution is broken, which +along with a bug in g++ 2.6.3 causes problems linking programs that use the +libstdc++ complex classes. A patch for this is available from +@file{ftp://ftp.cygnus.com//pub/g++/libg++-2.6.2-fix.gz}. + +@node More size_t problems, Rebuild libg++?, Other problems building libg++, installation +@section But I'm @emph{still} having problems with @code{size_t}! + +@cindex Type of size_t +``I did all that, and I'm @emph{still} having problems with disagreeing +definitions of size_t, SIZE_TYPE, and the type of functions like +@code{strlen}.'' + +@cindex _G_config.h +The problem may be that you have an old version of @file{_G_config.h} +lying around. As of libg++ version 2.4, @file{_G_config.h}, since it is +platform-specific, is inserted into a different directory; most include +files are in @file{$prefix/lib/g++-include}, but this file now lives in +@file{$prefix/$arch/include}. If, after upgrading your libg++, you find that +there is an old copy of @file{_G_config.h} left around, remove it, +otherwise g++ will find the old one first. + +@node Rebuild libg++?, co-existing versions, More size_t problems, installation +@section Do I need to rebuild libg++ to go with my new g++? + +``After I upgraded g++ to the latest version, I'm seeing undefined +symbols.'' + +or + +``If I upgrade to a new version of g++, do I need to reinstall libg++?'' + +@cindex Incompatibilities between g++ versions + +As a rule, the first two digits of your g++ and libg++ should be the +same. Normally when you do an upgrade in the ``minor version number'' +(2.5.7 to 2.5.8, say) there isn't a need to rebuild libg++, but there +have been a couple of exceptions in the past. + +@node co-existing versions, Installing on Linux, Rebuild libg++?, installation +@section I want several versions of g++ and libg++ to co-exist. + +I recommend against using the @code{-V} flag to make multiple versions +of gcc/g++ co-exist, unless they are different minor releases that can use +the same compiled version of libg++. The reason is that all these +versions will try to use the same libg++ version, which usually will +not work. + +Instead, use the @code{--prefix} flag when configuring gcc. Use a +different value of @code{--prefix} for each gcc version. Use the +same value of @code{--prefix} when configuring libg++. You can then +have any number of co-existing gcc/libg++ pairs. Symbolic links can +be used so that users don't need to put all these different directories +on their paths. + +One possible system to use is to set @code{--prefix} to +@file{/usr/local/gcc-2.x.y} for version 2.x.y of gcc, and to link +whichever version of gcc you wish to be the default into +@file{/usr/local/bin/gcc} and @file{/usr/local/bin/g++}. + +@node Installing on Linux, Linux Slackware 3.0, co-existing versions, installation +@section Trouble installing g++ and libg++ on Linux + +``I've downloaded the latest g++ and libg++ and I'm trying to install +them on Linux, and I'm having lots of problems.'' + +@cindex Linux +FSF releases of libg++ won't install on Linux unchanged, since Linux +uses are part of the libio library from libg++ for its standard C +library, only this is changed in a way that it clashes with libg++. +This means that you'll need a patched version of libg++ for it to +work. + +If you want to upgrade to a new gcc/libg++ combination, the easiest +thing to do is to grab the prebuilt versions of gcc and libg++ for Linux +from @file{ftp://tsx-11.mit.edu/pub/linux/packages/GCC}. Follow the +directions carefully. If you want to build from source, you'll need +a patch for libg++; the Linux developers have named the patched libg++ +version libg++-2.7.1.3 and there is a patch file in the above-named +directory. + +See @file{http://sunsite.unc.edu/LDP/HOWTO/GCC-HOWTO.html}, +the Linux GCC HOWTO, for more on gcc/g++ and Linux. + +Linux is in the process of switching over to the GNU C library, version +2, which will become Linux libc version 6. Once this process is +complete, there's a good chance that the installation process on Linux +will be smoother, but only experts should try making this new library +work at this point. + +@node Linux Slackware 3.0, , Installing on Linux, installation +@section Problems with g++ on Linux Slackware 3.0 + +@cindex Slackware +@cindex Linux Slackware +``When I try to compile the traditional Hello, world program on Linux, +the compiler can't find @file{iostream.h}. What's the deal?'' + +You probably have the Slackware 3.0 release. There's an error in the +setup. It's easy to fix, though; log in as root, and make a symbolic +link: + +@example +ln -s /usr/lib/g++-include /usr/include/g++ +@end example + +@node evolution, User Problems, installation, Top +@chapter The Evolution of g++ + +This chapter discusses the evolution of g++ and describes what can be expected +in the future. + +@menu +* version 2.7.x:: What's changed in 2.7.x from earlier versions +* libstdc++:: The GNU C++ standard library +* new work:: What's been done since 2.7.x +* egcs:: The Experimental GNU Compiler System +* When?:: When can I get all this new stuff? +@end menu + +@node version 2.7.x, libstdc++, evolution, evolution +@section What's new in version 2.7.x of gcc/g++ + +The current version of gcc/g++ is 2.7.2.2, released February 10, 1997. +The only change between 2.7.2.1 and 2.7.2.2 is that support was added +for using the GNU C library, version 2, on Linux; users not interested +in that functionality have no reason to upgrade. +The previous version of gcc/g++ is 2.7.2.1, released August 14, 1996. +The current version of libg++ is 2.7.2, released July 4, 1996. + +Note that gcc 2.7.2.1 just consists of several small patches to +gcc-2.7.2. The release is mainly +intended to fix platform-specific bugs and does not affect the C++ +``front end'' of the compiler (the part that parses your C++ code). + +The 2.7.x releases represent a great deal of work on the part of the g++ +maintainers to fix outstanding bugs and move the compiler closer to the +current ANSI/ISO standards committee's working paper, including +supporting many of the new features that have been added to the +language. I recommend that everyone read the NEWS file contained in the +distribution (and that system administrators make the file available to +their users). I've borrowed liberally from this file here. + +@cindex C++ working paper +If any features seem unfamiliar, you will probably want to +look at the recently-released public review copy of the C++ Working +Paper. A new draft, dated 2 December 1996, has been released for +public comment. You can find it on the web at +@file{http://www.cygnus.com/misc/wp/} or +@file{http://www.maths.warwick.ac.uk/c++/pub/wp/html/cd2/}. +See +@file{http://www.setech.com/x3.html} +or +@file{http://www.maths.warwick.ac.uk/c++/pub/} to download the +document in PostScript, PDF (Adobe Acrobat), HTML, or ASCII +form. + +Here are the main points: + +@itemize @bullet +@item +@cindex for scope +As described above, the scope of variables declared in the +initialization part of a for statement has been changed; such variables +are now visible only in the loop body. Use @code{-fno-for-scope} to get +the old behavior. You'll need this flag to build groff version 1.09, +Ptolemy, and many other free software packages. + +@item +@cindex vtable duplication +Code that does not use #pragma interface/implementation will most +likely shrink dramatically, as g++ now only emits the vtable for a +class in the translation unit where its first non-inline, non-abstract +virtual function is defined. + +@item +@cindex automatic template instantiation +Support for automatic template instantiation has @emph{not} been enabled +in the official distribution, due to a disagreement over design philosophies. +But you can get a patch from Cygnus to turn it on; retrieve the patch +from @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz} to patch +gcc-2.7.2 (there are also patches for earlier gcc versions). + +@item +@cindex exception handling, 2.7.0 + +@xref{exceptions} + +@item +@cindex run-time type identification +Support for Run-Time Type Identification has been added with @code{-frtti}. +This support is still in alpha; one major restriction is that any file +compiled with @code{-frtti} must include @code{<typeinfo>} (@emph{not} +@code{typeinfo.h} as the NEWS file says). +Also, all C++ code you link with (including libg++) has to be built with +@code{-frtti}, so it's still tricky to use. + +@item +@cindex compiler-generated operators +Synthesis of compiler-generated constructors, destructors and +assignment operators is now deferred until the functions are used. + +@item +@cindex assignment in conditional expressions +The parsing of expressions such as @code{a ? b : c = 1} +has changed from +@code{(a ? b : c) = 1} to @code{a ? b : (c = 1)}. This is a new C/C++ +incompatibility brought to you by the ANSI/ISO standards committee. + +@item +@cindex new operator keywords +The operator keywords and, and_eq, bitand, bitor, compl, not, not_eq, +or, or_eq, xor and xor_eq are now supported. Use @code{-ansi} or +@code{-foperator-names} to enable them. + +@item +@cindex explicit keyword +The @code{explicit} keyword is now supported. @code{explicit} is used to mark +constructors and type conversion operators that should not be used +implicitly. + +@item +@cindex user-defined type conversion +Handling of user-defined type conversion has been improved. + +@item +@cindex explicit template instantiation +Explicit instantiation of template methods is now supported. Also, +@code{inline template class foo<int>;} +can be used to emit only the vtable +for a template class. + +@item +@cindex -fcheck-new +With -fcheck-new, g++ will check the return value of all calls to +operator new, and not attempt to modify a returned null pointer. + +@item +collect2 now demangles linker output, and c++filt has become part of +the gcc distribution. + +@item +Improvements to template instantiation: only members actually used +are instantiated. (Actually this is not quite true: some inline +templates that are not successfully inlined may be expanded even +though they are not needed). + +@end itemize + +@node libstdc++, new work, version 2.7.x, evolution +@section The GNU Standard C++ Library + +The GNU Standard C++ Library (also called the ``GNU ANSI C++ Library'' +in places in the code) is not libg++, though it is included in the +libg++ distribution. Rather, it contains classes and functions +required by the ANSI/ISO standard. The copyright conditions are the +same as those for for the iostreams classes; the LGPL is not used +(@pxref{legalities}). + +This library, libstdc++, is in the libg++ distribution in versions 2.6.2 +and later. It requires at least gcc 2.6.3 to build the libg++-2.6.2 +version; use at least gcc 2.7.0 to build the libg++ 2.7.0 version. It +contains a hacked-up version of HP's implementation of the Standard +Template Library (@pxref{Standard Template Library}). I've +successfully used this Standard Template Library version to build +a number of the demos you'll see on various web pages. + +As of version 2.7.0, the streams classes are now in libstdc++ instead of +libg++, and libiostream is being phased out (don't use it). The g++ +program searches this library. + +The maintainers of libg++ have de-emphasized work on the older libg++ classes +in favor of enhancing libstdc++ to cover the full language, so while libg++ +will always be available, enhancements to it should not be expected. + +@node new work, egcs, libstdc++, evolution +@section What can we expect in future gcc releases? + +A great deal of work has gone into enhancements to the C++ front end, as well +as to other aspects of the compiler. + +The next major release(s) of gcc/g++ can be expected to have the following +features: + +@itemize @bullet +@cindex new template implementation +@item +A completely new template implementation, much closer to the draft +standard. Limitations in 2.7.2.x concerning inlining template functions +will be eliminated. Static template data members, template class member +functions, partial specification, and default template arguments will be +supported. An instantiation method resembling that used in Borland C++ +(instantiating functions possibly in multiple .o files and using weak +symbols to link correctly) will be provided, in addition to other +options. The SGI version of STL will be shipped with libstdc++ and will +compile unchanged. + +@item +@cindex new exception implementation +Exception handling has been re-worked; exceptions will work together +with optimization. +Actually, there are two separate implementations: one based on setjmp/longjmp +and designed to be highly portable, and one designed to be more efficient but +requiring more processor-specific support (getting exceptions right has proven +to be extremely difficult and has been the chief obstacle to getting a new +release out). + +@item +@cindex RTTI +RTTI has been re-done to work correctly and is on by default. + +@item +@cindex overloading +Overloading has been re-worked to conform to the latest draft of the +standard. +@end itemize + +Features that are still missing include namespaces and templates as +template arguments. + +@node egcs, When?, new work, evolution +@section What's this I hear about egcs? + +The egcs effort is a new effort to merge several threads of gcc +development and to provide a faster development process. +For more information see @file{http://www.cygnus.com/egcs/}. + +@node When?, , egcs, evolution +@section OK, when can I get this stuff? + +The FSF has a policy of never announcing release dates in advance. +I'm sure this is frustrating to a lot of people, since it's taken +so long, and this frustration was one of the reasons the egcs effort +was created. An egcs release should be expected to occur in the +very near future. [ More on this next time ]. + +@node User Problems, legalities, evolution, Top +@chapter User Problems + +@menu +* missing virtual table:: +* for scope:: +* const constructor:: +* unused parameter warnings:: +* jump crosses initialization:: +* Demangler:: +* static data members:: +* internal compiler error:: +* bug reports:: +* porting to g++:: +* name mangling:: +* problems linking with other libraries:: +* documentation:: +* templates:: +* undefined templates:: +* redundant templates:: +* Standard Template Library:: +* STL and string:: +* exceptions:: +* namespaces:: +* agreement with standards:: +* compiling standard libraries:: +* debugging on SVR4 systems:: +* debugging problems on Solaris:: +* X11 conflicts with libg++:: +* assignment to streams:: +@end menu + +@node missing virtual table, for scope, User Problems, User Problems +@section Linker complains about missing virtual table + +``I'm getting a message complaining about an undefined virtual table. Is +this a compiler bug?'' + +(On platforms that run neither collect nor the GNU linker, like Solaris, +you may see an odd undefined symbol like "_vt.3foo", where foo is a +class name). + +This is probably because you are missing a definition for the first +(non-inline) virtual function of the class. Since gcc-2.7.0, g++ uses +a trick borrowed from cfront: the .o file containing the definition for +the first non-inline virtual function for the class will also contain +the virtual function table. + +@node for scope, const constructor, missing virtual table, User Problems +@section gcc-2.7.0 breaks declarations in "for" statements! + +@cindex declarations in for statements +@cindex for statements: declarations + +gcc-2.7.0 implements the new ANSI/ISO rule on the scope of variables +declared in for loops. + +@example +for (int i = 1; i <= 10; i++) @{ + // do something here +@} +foo(i); +@end example + +In the above example, most existing C++ compilers would pass the +value 11 to the function @code{foo}. In gcc 2.7 and in the ANSI/ISO +working paper, the scope of @code{i} is only the for loop body, so +this is an error. So that old code can be compiled, the new gcc has +a flag @code{-fno-for-scope} that causes the old rule to be used. +@cindex -fno-for-scope + +As of 2.7.1, the compiler attempts to issue warnings about code that +has different meanings under the two sets of rules, but the code is +not perfect: the intent was that code that has valid, but different, +meanings under the ARM rules and the working paper rules would give +warnings but have the new behavior, and this doesn't seem to happen. + +The @code{-ffor-scope} flag under 2.7.1 and 2.7.2 gives the 2.7.0 behavior. + +@node const constructor, unused parameter warnings, for scope, User Problems +@section g++ seems to want a const constructor. What's that? + +gcc-2.7.1 introduced a bug that causes the compiler to ask for a +const constructor (there's no such thing in C++) in certain situations +where a const object appears in a template class. Most cases have been +fixed in gcc-2.7.2, but unfortunately not all. Still, if you're running +gcc-2.7.1 and have this problem, upgrade to 2.7.2; it is a vast improvement. + +@cindex ObjectSpace<STL> + +The default constructor for the template @code{pair} in ObjectSpace's +implementation of STL triggers the bug in one place, for gcc 2.7.2. If +you're using ObjectSpace<STL> and having this problem, simply +change the default constructor from + +@example +os_pair () : first (T1 ()), second (T2 ()) @{@} +@end example + +to just + +@example +os_pair () @{@} +@end example + +Once this is done, ObjectSpace<STL> works fairly well. + +@node unused parameter warnings, jump crosses initialization, const constructor, User Problems +@section How to silence ``unused parameter'' warnings + +@cindex -Wall +@cindex -Wunused + +``When I use @code{-Wall} (or @code{-Wunused}), g++ warns about +unused parameters. But the parameters have to be there, for use +in derived class functions. How do I get g++ to stop complaining?'' + +The answer is to simply omit the names of the unused parameters when +defining the function. This makes clear, both to g++ and to readers +of your code, that the parameter is unused. For example: + +@example +int Foo::bar(int arg) @{ return 0; @} +@end example + +will give a warning for the unused parameter @code{arg}. To suppress +the warning write + +@example +int Foo::bar(int) @{ return 0; @} +@end example + +@node jump crosses initialization, Demangler, unused parameter warnings, User Problems +@section g++ objects to a declaration in a case statement + +``The compiler objects to my declaring a variable in one of the branches +of a case statement. Earlier versions used to accept this code. Why?'' + +The draft standard does not allow a goto or a jump to a case label to +skip over an initialization of a variable or a class object. For +example: + +@example +switch ( i ) @{ + case 1: + Object obj(0); + ... + break; + case 2: + ... + break; +@} +@end example + +The reason is that @code{obj} is also in scope in the rest of the switch +statement. + +As of version 2.7.0, the compiler will object that the jump to the +second case level crosses the initialization of @code{obj}. Older +compiler versions would object only if class Object has a destructor. +In either case, the solution is to add a set of curly braces around +the case branch: + +@example + case 1: + @{ + Object obj(0); + ... + break; + @} +@end example + +@node Demangler, static data members, jump crosses initialization, User Problems +@section Where can I find a demangler? + +@cindex demangler program +A g++-compatible demangler named @code{c++filt} can be found in the +@file{binutils} distribution. This distribution (which also contains +the GNU linker) can be found at any GNU archive site. + +As of version 2.7.0, @code{c++filt} is included with gcc and is +installed automatically. Even better, it is used by the @code{collect} +linker, so you don't see mangled symbols anymore (except on platforms +that use neither collect nor the GNU linker, like Solaris). + +@node static data members, internal compiler error, Demangler, User Problems +@section Linker reports undefined symbols for static data members + +@cindex Static data members +``g++ reports undefined symbols for all my static data members when I link, +even though the program works correctly for compiler XYZ. What's going on?'' + +The problem is almost certainly that you don't give definitions for +your static data members. If you have + +@example +class Foo @{ + ... + void method(); + static int bar; +@}; +@end example + +you have only declared that there is an int named Foo::bar and a member +function named Foo::method that is defined somewhere. You still need to +define @emph{both} method() and bar in some source file. According to +the draft ANSI standard, you must supply an initializer, such as + +@example +int Foo::bar = 0; +@end example + +@noindent +in one (and only one) source file. + +@node internal compiler error, bug reports, static data members, User Problems +@section What does ``Internal compiler error'' mean? + +It means that the compiler has detected a bug in itself. Unfortunately, +g++ still has many bugs, though it is a lot better than it used to be. +If you see this message, please send in a complete bug report (see next +section). + +@node bug reports, porting to g++, internal compiler error, User Problems +@section I think I have found a bug in g++. + +@cindex Bug in g++, newly found +``I think I have found a bug in g++, but I'm not sure. How do I know, +and who should I tell?'' + +@cindex Manual, for gcc +First, see the excellent section on bugs and bug reports in the gcc manual +(which is included in the gcc distribution). As a short summary of that +section: if the compiler gets a fatal signal, for any input, it's a bug +(newer versions of g++ will ask you to send in a bug report when they +detect an error in themselves). Same thing for producing invalid +assembly code. + +When you report a bug, make sure to describe your platform (the type of +computer, and the version of the operating system it is running) and the +version of the compiler that you are running. See the output of the +command @code{g++ -v} if you aren't sure. Also provide enough code +so that the g++ maintainers can duplicate your bug. Remember that the +maintainers won't have your header files; one possibility is to send +the output of the preprocessor (use @code{g++ -E} to get this). This +is what a ``complete bug report'' means. + +I will add some extra notes that are C++-specific, since the notes from +the gcc documentation are generally C-specific. + +@cindex g++ bug report +First, mail your bug report to "bug-g++@@prep.ai.mit.edu". You may also +post to @file{gnu.g++.bug}, but it's better to use mail, particularly if you +have any doubt as to whether your news software generates correct reply +addresses. Don't mail C++ bugs to bug-gcc@@prep.ai.mit.edu. + +@strong{News:} as I write this (late February 1996) the gateway +connecting the bug-g++ mailing list and the @file{gnu.g++.bug} newsgroup +is (temporarily?) broken. Please mail, do not post bug reports. + +@cindex libg++ bug report +If your bug involves libg++ rather than the compiler, mail to +bug-lib-g++@@prep.ai.mit.edu. If you're not sure, choose one, and if you +guessed wrong, the maintainers will forward it to the other list. + +@cindex C++, reference books +@cindex ARM [Annotated C++ Ref Manual] +Second, if your program does one thing, and you think it should do +something else, it is best to consult a good reference if in doubt. +The standard reference is the draft working paper from the ANSI/ISO +C++ standardization committee, which you can get on the net. +For PostScript and PDF (Adobe Acrobat) versions, see the +archive at @file{ftp://research.att.com/dist/stdc++/WP}. For HTML and ASCII +versions, see @file{ftp://ftp.cygnus.com/pub/g++}. On the World Wide Web, see +@file{http://www.cygnus.com/misc/wp/}. + +An older +standard reference is "The Annotated C++ Reference Manual", by Ellis and +Stroustrup (copyright 1990, ISBN #0-201-51459-1). This is what they're +talking about on the net when they refer to ``the ARM''. But you should +know that changes have been made to the language since then. + +The ANSI/ISO C++ standards committee have adopted some changes to the +C++ language since the publication of the original ARM, and newer +versions of g++ (2.5.x and later) support some of these changes, notably +the mutable keyword (added in 2.5.0), the bool type (added in 2.6.0), +and changes in the scope of variables defined in for statements (added +in 2.7.0). +You can obtain an addendum to the ARM explaining many of these changes by FTP +from @file{ftp://ftp.std.com/AW/stroustrup2e/new_iso.ps}. + +@cindex AT&T cfront +Note that the behavior of (any version of) AT&T's "cfront" compiler is +NOT the standard for the language. + +@node porting to g++, name mangling, bug reports, User Problems +@section Porting programs from other compilers to g++ + +``I have a program that runs on <some other C++ compiler>, and I want +to get it running under g++. Is there anything I should watch out +for?'' + +@cindex Porting to g++ + +Note that g++ supports many of the newer keywords that have recently +been added to the language. Your other C++ compiler may not support +them, so you may need to rename variables and members that conflict +with these keywords. + +There are two other reasons why a program that worked under one compiler +might fail under another: your program may depend on the order of +evaluation of side effects in an expression, or it may depend on the +lifetime of a temporary (you may be assuming that a temporary object +"lives" longer than the standard guarantees). As an example of the +first: + +@example +void func(int,int); + +int i = 3; +func(i++,i++); +@end example + +@cindex Order of evaluation, problems in porting +Novice programmers think that the increments will be evaluated in strict +left-to-right order. Neither C nor C++ guarantees this; the second +increment might happen first, for example. func might get 3,4, or it +might get 4,3. + +@cindex Classes, problems in porting +@cindex Problems in porting, class +The second problem often happens with classes like the libg++ String +class. Let's say I have + +@example +String func1(); +void func2(const char*); +@end example + +and I say + +@example +func2(func1()); +@end example + +because I know that class String has an "operator const char*". So what +really happens is + +@example +func2(func1().convert()); +@end example + +@cindex temporaries +where I'm pretending I have a convert() method that is the same as the +cast. This is unsafe in g++ versions before 2.6.0, because the +temporary String object may be deleted after its last use (the call to +the conversion function), leaving the pointer pointing to garbage, so by +the time func2 is called, it gets an invalid argument. + +@cindex ANSI draft standard +Both the cfront and the old g++ behaviors are legal according to the ARM, +but the powers that be have decided that compiler writers were given +too much freedom here. + +The ANSI C++ committee has now come to a resolution of the lifetime of +temporaries problem: they specify that temporaries should be deleted at +end-of-statement (and at a couple of other points). This means that g++ +versions before 2.6.0 now delete temporaries too early, and cfront +deletes temporaries too late. As of version 2.6.0, g++ does things +according to the new standard. + +@cindex Scope, problems in porting +@cindex Problems in porting, scope +For now, the safe way to write such code is to give the temporary a name, +which forces it to live until the end of the scope of the name. For +example: + +@example +String& tmp = func1(); +func2(tmp); +@end example + +Finally, like all compilers (but especially C++ compilers, it seems), +g++ has bugs, and you may have tweaked one. If so, please file a bug +report (after checking the above issues). + +@node name mangling, problems linking with other libraries, porting to g++, User Problems +@section Why does g++ mangle names differently from other C++ compilers? + +See the answer to the next question. +@cindex Mangling names + +@node problems linking with other libraries, documentation, name mangling, User Problems +@section Why can't g++ code link with code from other C++ compilers? + +``Why can't I link g++-compiled programs against libraries compiled by +some other C++ compiler?'' + +@cindex Mangling names +@cindex Cygnus Support +Some people think that, +if only the FSF and Cygnus Support folks would stop being +stubborn and mangle names the same way that, say, cfront does, then any +g++-compiled program would link successfully against any cfront-compiled +library and vice versa. Name mangling is the least of the problems. +Compilers differ as to how objects are laid out, how multiple inheritance +is implemented, how virtual function calls are handled, and so on, so if +the name mangling were made the same, your programs would link against +libraries provided from other compilers but then crash when run. For this +reason, the ARM @emph{encourages} compiler writers to make their name mangling +different from that of other compilers for the same platform. +Incompatible libraries are then detected at link time, rather than at run +time. +@cindex ARM [Annotated C++ Ref Manual] +@cindex Compiler differences + +@node documentation, templates, problems linking with other libraries, User Problems +@section What documentation exists for g++ 2.x? + +@cindex g++, documentation +Relatively little. +While the gcc manual that comes with the distribution has some coverage +of the C++ part of the compiler, it focuses mainly on the C compiler +(though the information on the ``back end'' pertains to C++ as well). +Still, there is useful information on the command line options and the +#pragma interface and #pragma implementation directives in the manual, +and there is a useful section on template instantiation in the 2.6 version. +There is a Unix-style manual entry, "g++.1", in the gcc-2.x +distribution; the information here is a subset of what is in the manual. + +You can buy a nicely printed and bound copy of this manual from the FSF; +see above for ordering information. + +A draft of a document describing the g++ internals appears in the gcc +distribution (called g++int.texi); it is incomplete but gives lots of +information. + +For class libraries, there are several resources available: + +@itemize @bullet +@item +The libg++ distribution has a manual +@file{libg++/libg++.texi} describing the old libg++ classes, and +another manual @file{libio/iostream.texi} describing the iostreams +implementation. +@item +While there is no libg++-specific document describing the STL +implementation, SGI's web site, at @file{http://www.sgi.com/Technology/STL/}, +is an excellent resource. +@end itemize + +@node templates, undefined templates, documentation, User Problems +@section Problems with the template implementation + +@cindex g++, template support +@cindex Templates + +g++ does not implement a separate pass to instantiate template functions +and classes at this point; for this reason, it will not work, for the most +part, to declare your template functions in one file and define them in +another. The compiler will need to see the entire definition of the +function, and will generate a static copy of the function in each file +in which it is used. + +(The experimental template repository code (@pxref{repository}) that +can be added to 2.7.0 or later does implement a separate pass, but there +is still no searching of files that the compiler never saw). + +@cindex -fno-implicit-templates +For version 2.6.0, however, a new switch @code{-fno-implicit-templates} +was added; with this switch, templates are expanded only under user +control. I recommend that all g++ users that use templates read the +section ``Template Instantiation'' in the gcc manual (version 2.6.x +and newer). g++ now supports explicit template expansion using the +syntax from the latest C++ working paper: + +@example +template class A<int>; +template ostream& operator << (ostream&, const A<int>&); +@end example + +@cindex template limitations +As of version 2.6.3, there are still a few limitations in the template +implementation besides the above (thanks to Jason Merrill for this info): +These are still present in version 2.7.2, but a new implementation of +templates planned for version 2.8 will eliminate them. + +@enumerate 1 +@item +Static data member templates are not supported. You can work around +this by explicitly declaring the static variable for each template +specialization: + +@example +template <class T> struct A @{ + static T t; +@}; + +template <class T> T A<T>::t = 0; // gets bogus error +int A<int>::t = 0; // OK (workaround) +@end example + +(still a limitation in 2.7.2) + +@item +Template member names are not available when defining member function +templates. + +@example +template <class T> struct A @{ + typedef T foo; + void f (foo); + void g (foo arg) @{ ... @}; // this works +@}; + +template <class T> void A<T>::f (foo) @{ @} // gets bogus error +@end example + +@item +Templates are instantiated using the parser. This results in two +problems: + +a) Class templates are instantiated in some situations where such +instantiation should not occur. + +@example +template <class T> class A @{ @}; +A<int> *aip = 0; // should not instantiate A<int> (but does) +@end example + +b) Function templates cannot be inlined at the site of their +instantiation. + +@example +template <class T> inline T min (T a, T b) @{ return a < b ? a : b; @} + +void f () @{ + int i = min (1, 0); // not inlined +@} + +void g () @{ + int j = min (1, 0); // inlined +@} +@end example + +A workaround that works in version 2.6.1 and later is to specify + +@example +extern template int min (int, int); +@end example + +before @code{f()}; this will force it to be instantiated (though not +emitted). + +@item +Member function templates are always instantiated when their containing +class is. This is wrong. +@end enumerate + +@node undefined templates, redundant templates, templates, User Problems +@section I get undefined symbols when using templates + +(Thanks to Jason Merrill for this section). + +@cindex template instantiation +g++ does not automatically instantiate templates defined in other files. +Because of this, code written for cfront will often produce undefined +symbol errors when compiled with g++. You need to tell g++ which template +instances you want, by explicitly instantiating them in the file where they +are defined. For instance, given the files + +@file{templates.h}: +@example +template <class T> +class A @{ +public: + void f (); + T t; +@}; + +template <class T> void g (T a); +@end example + +@file{templates.cc}: +@example +#include "templates.h" + +template <class T> +void A<T>::f () @{ @} + +template <class T> +void g (T a) @{ @} +@end example + + +main.cc: +@example +#include "templates.h" + +main () +@{ + A<int> a; + a.f (); + g (a); +@} +@end example + +compiling everything with @code{g++ main.cc templates.cc} will result in +undefined symbol errors for @samp{A<int>::f ()} and @samp{g (A<int>)}. To +fix these errors, add the lines + +@example +template class A<int>; +template void g (A<int>); +@end example + +to the bottom of @samp{templates.cc} and recompile. + +@node redundant templates, Standard Template Library, undefined templates, User Problems +@section I get multiply defined symbols using templates + +You may be running into a bug that was introduced in version 2.6.1 +(and is still present in 2.6.3) that generated external linkage +for templates even when neither @code{-fexternal-templates} nor +@code{-fno-implicit-templates} is specified. There is a patch for +this problem at @* +@file{ftp://ftp.cygnus.com/pub/g++/gcc-2.6.3-template-fix}. + +I recommend either applying the patch or +using @code{-fno-implicit-templates} +together with explicit template instantiation as described in previous +sections. + +This bug is fixed in 2.7.0. + +@node Standard Template Library, STL and string, redundant templates, User Problems +@section Does g++ support the Standard Template Library? + +@cindex STL +@cindex Standard Template Library +The Standard Template Library (STL) uses many of the extensions that the +ANSI/ISO committee has made to templates, and g++ doesn't support +some of these yet. So if you grab HP's free implementation of STL it +isn't going to work. However, starting with libg++-2.6.2 libg++ contains a +hacked version of STL, based on work by Carsten Bormann, which permits +g++ to compile at least the containers (thanks to Per Bothner for this +text). + +Actually, as of libg++ version 2.7.2 most of this works quite well, most +of the time; +I've succeeded +in making significant use of it. +Almost all of the ObjectSpace examples (a set of +over 200 simple examples of STL usage) now work. + +When version 2.8.0 is out (with its complete redesign of the template +implementation) a much more complete implementation of the +STL (based on a newer free implementation from SGI) will be included. +In the meantime, a group at the Moscow Center for Sparc Technology has +a port of the SGI STL implementation that mostly works with gcc-2.7.2. +See +@file{http://www.ipmce.su/people/fbp/stl/stlport.html}. + +In addition, there are several commercial suppliers of STL implementations; +ObjectSpace's version supports gcc-2.7.x. + +Mumit Khan has produced an ``STL newbie guide'' with lots of information +on using STL with gcc. See + +@file{http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html} + +@node STL and string, exceptions, Standard Template Library, User Problems +@section I'm having problems mixing STL and the standard string class + +This is due to a bug in g++ version 2.7.2 and 2.7.2.1; the compiler +is confused by the operator declarations. There is an easy workaround, +however; just make sure that the @code{<string>} header is included +before any STL headers. That is, just say + +@example +#include <string> +@end example + +before any other @code{#include} directives. + +Unfortunately, this doesn't solve all problems; you may still have +difficulty with the relational operators !=, <=, >, and >=, thanks +to a conflict with the very general definition of these operators +in function.h. One trick that sometimes works is to try to use == +and < in your code instead of the other operators. Another is to +use a derived class of <string>. The only completely satisfactory +solution, I'm afraid, is to wait for the new release. + +@node exceptions, namespaces, STL and string, User Problems +@section Problems and limitations with exceptions + +Recent g++ versions provide limited support for exceptions. You must +provide the @code{-fhandle-exceptions} flag to enable exception +handling. As of version 2.7.2, exceptions may not work properly +(and you may get odd error messages when compiling) if you turn +on optimization (the @code{-O} flag). + +You must give the @code{-frtti} switch to enable catching +of derived exception objects with handlers for the base exception class; +if @code{-frtti} is not given, only exact type matching works. + +For exception handling to work with 2.7.0 your CPU must be a SPARC, +RS6000/PowerPC, 386/486/Pentium, or ARM. Release 2.7.1 added support +for the Alpha, and ``m68k is rumored to work on some platforms'' +and ``VAX may also work'' (according to Mike Stump). +@emph{It still doesn't work on HP-PA or MIPS platforms.} + +@node namespaces, agreement with standards, exceptions, User Problems +@section Does g++ support namespaces? + +As of version 2.7.2, g++ recognizes the keywords @code{namespace} and +@code{using}, and there is some rudimentary code present, but almost +nothing connected with namespaces works yet. It appears that this will +still be true when 2.8.0 is released. + +@node agreement with standards, compiling standard libraries, namespaces, User Problems +@section What are the differences between g++ and the ARM specification of C++? + +@cindex ARM [Annotated C++ Ref Manual] +@cindex exceptions +As of version 2.7.0, g++ has exception support on most but not all +platforms +(no support on MIPS-based platforms yet), but +it doesn't work right if optimizaton is enabled, which means the +exception +implementation is still +not really ready for production use. + + +@cindex mutable +Some features that the ANSI/ISO standardization committee has voted in +that don't appear in the ARM are supported, notably the @code{mutable} +keyword, in version 2.5.x. 2.6.x adds support for the built-in boolean +type @code{bool}, with constants @code{true} and @code{false}. The +beginnings of run-time type identification are present, so there are +more reserved words: @code{typeid}, @code{static_cast}, +@code{reinterpret_cast}, @code{const_cast}, and @code{dynamic_cast}. + +@cindex g++ bugs +As with any beta-test compiler, there are bugs. You can help improve +the compiler by submitting detailed bug reports. + +One of the weakest areas of g++ other than templates is the resolution +of overloaded functions and operators in complex cases. The usual +symptom is that in a case where the ARM says that it is ambiguous which +function should be chosen, g++ chooses one (often the first one +declared). This is usually not a problem when porting C++ code from +other compilers to g++, but shows up as errors when code developed under +g++ is ported to other compilers. (I believe this is no longer a +significant problem in 2.7.0). + +[A full bug list would be very long indeed, so I won't put one here. +I may add a list of frequently-reported bugs and "non-bugs" like the +static class members issue mentioned above]. + +@node compiling standard libraries, debugging on SVR4 systems, agreement with standards, User Problems +@section Will g++ compile InterViews? The NIH class library? Rogue Wave? + +@cindex NIH class library +@cindex NIHCL with g++ +The NIH class library uses a non-portable, compiler-dependent hack +to initialize itself, which makes life difficult for g++ users. +It will not work without modification, and I don't know what modifications +are required or whether anyone has done them successfully. + +In short, it's not going to happen any time soon (previous FAQs referred +to patches that a new NIHCL release would hopefully contain, but this +hasn't happened). + +@strong{Note:} I thought I saw an item indicating that someone +@emph{had} patched NIHCL to work with g++. Any pointers? + +@cindex InterViews +I think that as of version 2.5.6, the standard g++ will compile the +standard 3.1 InterViews completely successfully. +Note that you'll need the @code{-fno-for-scope} flag +if you use gcc-2.7.0; with 2.7.2 you may be able to omit this flag +but you'll get warnings. + +@cindex Rogue Wave +According to Jason Merrill, gcc-2.7.0 and newer works with Rogue +Wave's @code{tools.h++} class library, but you may want to grab +@file{ftp://ftp.cygnus.com/pub/g++/Tools.h++-6.1-patch}. Again, +you'll need the @code{-fno-for-scope} flag since Rogue Wave hasn't +fixed their code to comply with the new standard yet. + +@node debugging on SVR4 systems, debugging problems on Solaris, compiling standard libraries, User Problems +@section Debugging on SVR4 systems +@cindex System VR4, debugging + +``How do I get debugging to work on my System V Release 4 system?'' + +@cindex DWARF debug format + +Most systems based on System V Release 4 (except Solaris) encode symbolic +debugging information in a format known as `DWARF'. + +Although the GNU C compiler already knows how to write out symbolic debugging +information in the DWARF format, the GNU C++ compiler does not yet have this +feature yet. However, work is in progress for DWARF 2 debug support for +gcc and g++ and will be available in a future release (probably 2.8.0). + +@cindex stabs +@cindex --with-stabs + +In the meantime, you @emph{can} get g++ debugging under SVR4 systems by +configuring gcc with the @code{--with-stabs} option. This causes gcc to +use an alternate debugging format, one more like that used under SunOS4. +You won't need to do anything special to GDB; it will always understand +the ``stabs'' format. + +@node debugging problems on Solaris, X11 conflicts with libg++, debugging on SVR4 systems, User Problems +@section debugging problems on Solaris + +``I'm on Solaris, and gdb says it doesn't know about some of my local +symbols. Help!'' + +This problem was introduced in gcc 2.7.2; debug symbols for +locals that aren't declared at the beginning of a block come out in the +wrong order, and gdb can't find such symbols. + +This problem is fixed in gcc-2.7.2.1. + +@node X11 conflicts with libg++, assignment to streams, debugging problems on Solaris, User Problems +@section X11 conflicts with libg++ in definition of String +@cindex String, conflicts in definition + +``X11 and Motif define String, and this conflicts with the String class +in libg++. How can I use both together?'' + +One possible method is the following: + +@example +#define String XString +#include <X11/Intrinsic.h> +/* include other X11 and Motif headers */ +#undef String +@end example + +and remember to use the correct @code{String} or @code{XString} when +you declare things later. + +@node assignment to streams, , X11 conflicts with libg++, User Problems +@section Why can't I assign one stream to another? + +[ Thanks to Per Bothner and Jerry Schwarz for this section. ] + +Assigning one stream to another seems like a reasonable thing to do, but +it's a bad idea. Usually, this comes up because people want to assign +to @code{cout}. This is poor style, especially for libraries, and is +contrary to good object-oriented design. (Libraries that write directly +to @code{cout} are less flexible, modular, and object-oriented). + +The iostream classes do not allow assigning to arbitrary streams, because +this can violate typing: + +@example +ifstream foo ("foo"); +istrstream str(...); +foo = str; +foo->close (); /* Oops! Not defined for istrstream! */ +@end example + +@cindex assignment to cout + +The original cfront implementation of iostreams by Jerry Schwarz allows +you to assign to @code{cin}, @code{cout}, @code{cerr}, and @code{clog}, +but this is not part of the draft standard for iostreams and generally +isn't considered a good idea, so standard-conforming code shouldn't use +this technique. + +The GNU implementation of iostream did not support assigning to +@code{cin}, @code{cout}, @code{cerr}, and @code{clog} +for quite a while, but it now does, for backward +compatibility with cfront iostream (versions 2.6.1 and later of libg++). + +The ANSI/ISO C++ Working Paper does provide ways of changing the +streambuf associated with a stream. Assignment isn't allowed; +there is an explicit named member that must be used. + +However, it is not wise to do this, and the results are confusing. For +example: @code{fstream::rdbuf} is supposed to return the @emph{original} +filebuf, not the one you assigned. (This is not yet implemented in GNU +iostream.) This must be so because @code{fstream::rdbuf} is defined to +return a @code{filebuf *}. + +@node legalities, index, User Problems, Top +@chapter What are the rules for shipping code built with g++ and libg++? +@cindex Shipping rules +@cindex GPL [GNU Public License] + +``Is it is possible to distribute programs for profit that are created +with g++ and use the g++ libraries?'' + +I am not a lawyer, and this is not legal advice. In any case, I have +little interest in telling people how to violate the spirit of the +GNU licenses without violating the letter. This section tells you +how to comply with the intention of the GNU licenses as best I understand +them. + +@cindex FSF [Free Software Foundation] +The FSF has no objection to your making money. Its only interest is that +source code to their programs, and libraries, and to modified versions of +their programs and libraries, is always available. + +The short answer is that you do not need to release the source to +your program, but you can't just ship a stripped executable either, +unless you use only the subset of libg++ that includes the iostreams +classes (see discussion below) or the new libstdc++ library (available +in libg++ 2.6.2 and later). + +Compiling your code with a GNU compiler does not affect its copyright; +it is still yours. However, in order to ship code that links in a GNU +library such as libg++ there are certain rules you must follow. The +rules are described in the file COPYING.LIB that accompanies gcc +distributions; it is also included in the libg++ distribution. +See that file for the exact rules. The agreement is called the +Library GNU Public License or LGPL. It is much "looser" than the +GNU Public License, or GPL, that covers must GNU programs. + +@cindex libg++, shipping code +Here's the deal: let's say that you use some version of libg++, +completely unchanged, in your software, and you want to ship only +a binary form of your code. You can do this, but there are several +special requirements. If you want to use libg++ but ship only object +code for your code, you have to ship source for libg++ (or ensure +somehow that your customer already has the source for the exact +version you are using), and ship your application in linkable form. +You cannot forbid your customer from reverse-engineering or extending +your program by exploiting its linkable form. + +@cindex libg++, modifying +Furthermore, if you modify libg++ itself, you must provide source +for your modifications (making a derived class does not count as +modifying the library -- that is "a work that uses the library"). + +@cindex special copying conditions for iostreams +For certain portions of libg++ that implement required parts of the C++ +language (such as iostreams and other standard classes), the FSF has +loosened the copyright requirement still more by adding the ``special +exception'' clause, which reads as follows: + +@quotation +As a special exception, if you link this library with files +compiled with GCC to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. +@end quotation + +If your only use of libg++ uses code with this exception, you may ship +stripped executables or license your executables under different +conditions without fear of violating an FSF copyright. It is the intent +of FSF and Cygnus that, as the other classes required by the ANSI/ISO +draft standard are developed, these will also be placed under this +``special exception'' license. +The code in the new libstdc++ library, intended to implement standard +classes as defined by ANSI/ISO, is also licensed this way. + +To avoid coming under the influence of the LGPL, you can link with +@file{-liostream} rather than @file{-lg++} (for version 2.6.x and +earlier), or @file{-lstdc++} now that it is available. In version 2.7.0 +all the standard classes are in @file{-lstdc++}; you can do the link +step with @code{c++} instead of @code{g++} to search only the +@file{-lstdc++} library and avoid the LGPL'ed code in @file{-lg++}. + +If you wish to discuss legal issues connected with GNU software on the +net, please use @file{gnu.misc.discuss}, not the technical newsgroups. + +@node index, , legalities, Top +@comment node-name, next, previous, up +@appendix Concept Index + +@printindex cp + +@page +@contents +@bye diff --git a/gcc/cp/parse.c b/gcc/cp/parse.c deleted file mode 100644 index 9119e6485d7..00000000000 --- a/gcc/cp/parse.c +++ /dev/null @@ -1,8338 +0,0 @@ - -/* A Bison parser, made from parse.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SELFNAME 260 -#define SCSPEC 261 -#define TYPESPEC 262 -#define CV_QUALIFIER 263 -#define CONSTANT 264 -#define STRING 265 -#define ELLIPSIS 266 -#define SIZEOF 267 -#define ENUM 268 -#define IF 269 -#define ELSE 270 -#define WHILE 271 -#define DO 272 -#define FOR 273 -#define SWITCH 274 -#define CASE 275 -#define DEFAULT 276 -#define BREAK 277 -#define CONTINUE 278 -#define RETURN 279 -#define GOTO 280 -#define ASM_KEYWORD 281 -#define GCC_ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define SIGOF 285 -#define ATTRIBUTE 286 -#define EXTENSION 287 -#define LABEL 288 -#define REALPART 289 -#define IMAGPART 290 -#define AGGR 291 -#define VISSPEC 292 -#define DELETE 293 -#define NEW 294 -#define THIS 295 -#define OPERATOR 296 -#define CXX_TRUE 297 -#define CXX_FALSE 298 -#define NAMESPACE 299 -#define TYPENAME_KEYWORD 300 -#define USING 301 -#define LEFT_RIGHT 302 -#define TEMPLATE 303 -#define TYPEID 304 -#define DYNAMIC_CAST 305 -#define STATIC_CAST 306 -#define REINTERPRET_CAST 307 -#define CONST_CAST 308 -#define SCOPE 309 -#define EMPTY 310 -#define PTYPENAME 311 -#define NSNAME 312 -#define THROW 313 -#define ASSIGN 314 -#define OROR 315 -#define ANDAND 316 -#define MIN_MAX 317 -#define EQCOMPARE 318 -#define ARITHCOMPARE 319 -#define LSHIFT 320 -#define RSHIFT 321 -#define POINTSAT_STAR 322 -#define DOT_STAR 323 -#define UNARY 324 -#define PLUSPLUS 325 -#define MINUSMINUS 326 -#define HYPERUNARY 327 -#define PAREN_STAR_PAREN 328 -#define POINTSAT 329 -#define TRY 330 -#define CATCH 331 -#define TYPENAME_ELLIPSIS 332 -#define PRE_PARSED_FUNCTION_DECL 333 -#define EXTERN_LANG_STRING 334 -#define ALL 335 -#define PRE_PARSED_CLASS_DECL 336 -#define DEFARG 337 -#define DEFARG_MARKER 338 -#define TYPENAME_DEFN 339 -#define IDENTIFIER_DEFN 340 -#define PTYPENAME_DEFN 341 -#define END_OF_LINE 342 -#define END_OF_SAVED_INPUT 343 - -#line 29 "parse.y" - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#include "config.h" - -#include <stdio.h> -#include <errno.h> - -#include "tree.h" -#include "input.h" -#include "flags.h" -#include "lex.h" -#include "cp-tree.h" -#include "output.h" - -/* Since parsers are distinct for each language, put the language string - definition here. (fnf) */ -char *language_string = "GNU C++"; - -extern tree void_list_node; -extern struct obstack permanent_obstack; - -#ifndef errno -extern int errno; -#endif - -extern int end_of_file; -extern int current_class_depth; -extern tree last_tree; - -/* FSF LOCAL dje prefix attributes */ -extern tree strip_attrs PROTO((tree)); -/* END FSF LOCAL */ - -void yyerror (); - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -#define OP0(NODE) (TREE_OPERAND (NODE, 0)) -#define OP1(NODE) (TREE_OPERAND (NODE, 1)) - -/* Contains the statement keyword (if/while/do) to include in an - error message if the user supplies an empty conditional expression. */ -static char *cond_stmt_keyword; - -/* Nonzero if we have an `extern "C"' acting as an extern specifier. */ -int have_extern_spec; -int used_extern_spec; - -void yyhook (); - -/* Cons up an empty parameter list. */ -#ifdef __GNUC__ -__inline -#endif -static tree -empty_parms () -{ - tree parms; - - if (strict_prototype - /* Only go ahead with using the void list node if we're actually - parsing a class in C++, not a struct in extern "C" mode. */ - || (current_class_type != NULL - && current_lang_name == lang_name_cplusplus)) - parms = void_list_node; - else - parms = NULL_TREE; - return parms; -} - -#line 105 "parse.y" -typedef union {long itype; tree ttype; char *strtype; enum tree_code code; flagged_type_tree ftype; } YYSTYPE; -#line 288 "parse.y" - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs = NULL_TREE; -/* List of prefix attributes in effect. - Prefix attributes are parsed by the reserved_declspecs and declmods - rules. They create a list that contains *both* declspecs and attrs. */ -/* ??? It is not clear yet that all cases where an attribute can now appear in - a declspec list have been updated. */ -static tree prefix_attributes = NULL_TREE; - -/* When defining an aggregate, this is the most recent one being defined. */ -static tree current_aggr; - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint (); -extern tree combine_strings PROTO((tree)); - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 1459 -#define YYFLAG -32768 -#define YYNTBASE 113 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 343 ? yytranslate[x] : 366) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 111, 2, 2, 2, 82, 70, 2, 93, - 109, 80, 78, 59, 79, 92, 81, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 62, 60, 74, - 64, 75, 65, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 94, 2, 112, 69, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 58, 68, 110, 88, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 61, 63, 66, 67, 71, 72, 73, 76, - 77, 83, 84, 85, 86, 87, 89, 90, 91, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 1, 3, 4, 7, 10, 12, 13, 14, 15, - 17, 19, 21, 22, 25, 28, 30, 32, 38, 43, - 49, 54, 55, 62, 63, 69, 75, 78, 83, 86, - 89, 93, 97, 99, 101, 104, 107, 109, 112, 113, - 119, 123, 125, 129, 131, 134, 136, 139, 141, 145, - 147, 151, 154, 157, 160, 164, 168, 171, 174, 177, - 180, 183, 185, 187, 189, 190, 192, 195, 196, 198, - 203, 207, 211, 212, 221, 227, 228, 238, 245, 246, - 255, 261, 262, 272, 279, 282, 285, 287, 290, 292, - 299, 304, 311, 316, 319, 321, 324, 327, 329, 332, - 334, 337, 340, 345, 348, 352, 353, 354, 356, 360, - 363, 367, 369, 374, 377, 382, 385, 390, 393, 395, - 397, 399, 401, 403, 405, 407, 409, 411, 413, 415, - 419, 423, 426, 429, 434, 439, 443, 447, 452, 456, - 461, 465, 467, 472, 476, 478, 480, 482, 486, 488, - 490, 492, 494, 496, 498, 500, 502, 504, 506, 510, - 512, 516, 517, 519, 521, 522, 530, 532, 534, 538, - 543, 547, 548, 552, 554, 558, 562, 566, 570, 572, - 574, 576, 579, 582, 585, 588, 591, 594, 597, 602, - 605, 610, 613, 617, 621, 626, 631, 637, 643, 650, - 653, 658, 664, 667, 670, 674, 678, 682, 684, 688, - 691, 695, 700, 702, 705, 711, 713, 717, 721, 725, - 729, 733, 737, 741, 745, 749, 753, 757, 761, 765, - 769, 773, 777, 781, 785, 789, 795, 799, 803, 805, - 808, 812, 814, 816, 818, 820, 822, 824, 826, 828, - 831, 834, 838, 840, 842, 846, 848, 850, 852, 854, - 858, 862, 866, 867, 872, 877, 880, 885, 888, 891, - 893, 898, 900, 908, 916, 924, 932, 937, 942, 945, - 948, 950, 955, 958, 961, 964, 970, 974, 980, 984, - 989, 996, 999, 1001, 1004, 1006, 1009, 1011, 1013, 1015, - 1018, 1019, 1022, 1025, 1029, 1033, 1037, 1040, 1043, 1046, - 1048, 1050, 1052, 1055, 1058, 1061, 1064, 1066, 1068, 1070, - 1072, 1075, 1078, 1082, 1086, 1090, 1095, 1097, 1100, 1103, - 1106, 1108, 1110, 1112, 1115, 1118, 1121, 1123, 1125, 1128, - 1131, 1135, 1137, 1140, 1142, 1144, 1146, 1151, 1156, 1161, - 1166, 1168, 1170, 1172, 1174, 1178, 1180, 1184, 1186, 1190, - 1191, 1196, 1197, 1204, 1208, 1209, 1216, 1220, 1221, 1228, - 1232, 1233, 1240, 1244, 1245, 1247, 1249, 1252, 1259, 1261, - 1265, 1266, 1268, 1273, 1280, 1285, 1287, 1289, 1291, 1293, - 1295, 1299, 1300, 1303, 1305, 1308, 1312, 1317, 1319, 1321, - 1325, 1330, 1337, 1341, 1347, 1349, 1354, 1358, 1362, 1363, - 1367, 1371, 1375, 1376, 1379, 1382, 1383, 1391, 1396, 1397, - 1404, 1408, 1411, 1414, 1418, 1423, 1424, 1425, 1435, 1437, - 1438, 1440, 1441, 1443, 1445, 1448, 1451, 1454, 1457, 1460, - 1463, 1467, 1470, 1474, 1475, 1477, 1481, 1484, 1487, 1489, - 1491, 1492, 1495, 1499, 1501, 1506, 1508, 1512, 1514, 1518, - 1523, 1528, 1533, 1536, 1539, 1543, 1547, 1549, 1550, 1552, - 1555, 1560, 1564, 1566, 1569, 1572, 1575, 1578, 1581, 1584, - 1587, 1589, 1592, 1595, 1598, 1603, 1608, 1611, 1613, 1619, - 1624, 1626, 1627, 1629, 1633, 1634, 1636, 1640, 1642, 1644, - 1646, 1648, 1653, 1658, 1663, 1668, 1673, 1677, 1682, 1687, - 1692, 1697, 1701, 1703, 1707, 1709, 1713, 1716, 1718, 1725, - 1726, 1729, 1731, 1734, 1735, 1738, 1743, 1748, 1751, 1756, - 1760, 1764, 1767, 1770, 1774, 1776, 1778, 1781, 1783, 1786, - 1789, 1794, 1799, 1803, 1807, 1810, 1812, 1816, 1820, 1823, - 1826, 1830, 1832, 1836, 1840, 1843, 1846, 1850, 1852, 1857, - 1861, 1866, 1870, 1872, 1875, 1878, 1880, 1883, 1888, 1893, - 1896, 1898, 1900, 1902, 1904, 1907, 1910, 1913, 1916, 1919, - 1922, 1924, 1927, 1930, 1934, 1936, 1940, 1943, 1947, 1950, - 1953, 1957, 1959, 1963, 1968, 1972, 1975, 1978, 1980, 1984, - 1987, 1990, 1992, 1995, 1999, 2001, 2005, 2007, 2014, 2019, - 2024, 2028, 2034, 2038, 2042, 2046, 2049, 2051, 2053, 2056, - 2059, 2062, 2063, 2064, 2065, 2067, 2069, 2072, 2076, 2078, - 2081, 2082, 2088, 2089, 2090, 2097, 2099, 2100, 2105, 2107, - 2109, 2111, 2114, 2115, 2116, 2123, 2125, 2126, 2127, 2135, - 2136, 2137, 2145, 2146, 2147, 2148, 2149, 2164, 2165, 2166, - 2176, 2177, 2183, 2184, 2192, 2193, 2198, 2201, 2204, 2207, - 2211, 2218, 2227, 2238, 2251, 2256, 2260, 2263, 2266, 2268, - 2270, 2271, 2272, 2279, 2280, 2281, 2287, 2289, 2292, 2293, - 2294, 2295, 2304, 2306, 2308, 2312, 2316, 2319, 2322, 2325, - 2328, 2331, 2333, 2336, 2337, 2339, 2340, 2342, 2344, 2345, - 2347, 2349, 2353, 2358, 2360, 2364, 2365, 2367, 2369, 2371, - 2374, 2377, 2380, 2382, 2384, 2387, 2390, 2393, 2396, 2397, - 2401, 2403, 2405, 2407, 2410, 2413, 2416, 2421, 2424, 2427, - 2430, 2433, 2436, 2439, 2441, 2444, 2446, 2449, 2451, 2453, - 2454, 2455, 2457, 2458, 2463, 2466, 2468, 2470, 2474, 2475, - 2479, 2483, 2487, 2489, 2492, 2495, 2498, 2501, 2504, 2507, - 2510, 2513, 2516, 2519, 2522, 2525, 2528, 2531, 2534, 2537, - 2540, 2543, 2546, 2549, 2552, 2555, 2558, 2562, 2565, 2568, - 2571, 2574, 2578, 2581, 2584, 2589, 2594, 2598 -}; - -static const short yyrhs[] = { -1, - 114, 0, 0, 115, 121, 0, 114, 121, 0, 114, - 0, 0, 0, 0, 32, 0, 26, 0, 27, 0, - 0, 122, 123, 0, 139, 138, 0, 135, 0, 134, - 0, 120, 93, 190, 109, 60, 0, 128, 58, 116, - 110, 0, 128, 117, 139, 118, 138, 0, 128, 117, - 135, 118, 0, 0, 44, 154, 58, 124, 116, 110, - 0, 0, 44, 58, 125, 116, 110, 0, 44, 154, - 64, 127, 60, 0, 126, 60, 0, 46, 44, 127, - 60, 0, 119, 123, 0, 46, 281, 0, 46, 290, - 281, 0, 46, 290, 182, 0, 182, 0, 281, 0, - 290, 281, 0, 290, 182, 0, 99, 0, 128, 99, - 0, 0, 48, 74, 130, 131, 75, 0, 48, 74, - 75, 0, 133, 0, 131, 59, 133, 0, 239, 0, - 239, 154, 0, 45, 0, 45, 154, 0, 132, 0, - 132, 64, 196, 0, 357, 0, 357, 64, 180, 0, - 129, 123, 0, 129, 1, 0, 207, 60, 0, 200, - 206, 60, 0, 197, 205, 60, 0, 200, 60, 0, - 157, 60, 0, 197, 60, 0, 1, 60, 0, 1, - 110, 0, 60, 0, 191, 0, 150, 0, 0, 149, - 0, 149, 60, 0, 0, 108, 0, 145, 137, 136, - 302, 0, 145, 137, 327, 0, 145, 137, 1, 0, - 0, 286, 5, 93, 141, 348, 109, 269, 360, 0, - 286, 5, 47, 269, 360, 0, 0, 290, 286, 5, - 93, 142, 348, 109, 269, 360, 0, 290, 286, 5, - 47, 269, 360, 0, 0, 286, 159, 93, 143, 348, - 109, 269, 360, 0, 286, 159, 47, 269, 360, 0, - 0, 290, 286, 159, 93, 144, 348, 109, 269, 360, - 0, 290, 286, 159, 47, 269, 360, 0, 197, 194, - 0, 200, 278, 0, 278, 0, 200, 140, 0, 140, - 0, 5, 93, 348, 109, 269, 360, 0, 5, 47, - 269, 360, 0, 159, 93, 348, 109, 269, 360, 0, - 159, 47, 269, 360, 0, 200, 146, 0, 146, 0, - 197, 194, 0, 200, 278, 0, 278, 0, 200, 140, - 0, 140, 0, 24, 3, 0, 148, 224, 0, 148, - 93, 174, 109, 0, 148, 47, 0, 62, 151, 152, - 0, 0, 0, 153, 0, 152, 59, 153, 0, 152, - 1, 0, 93, 174, 109, 0, 47, 0, 155, 93, - 174, 109, 0, 155, 47, 0, 275, 93, 174, 109, - 0, 275, 47, 0, 282, 93, 174, 109, 0, 282, - 47, 0, 3, 0, 4, 0, 5, 0, 56, 0, - 57, 0, 3, 0, 56, 0, 57, 0, 105, 0, - 104, 0, 106, 0, 48, 239, 158, 0, 48, 197, - 194, 0, 48, 278, 0, 48, 140, 0, 6, 48, - 239, 158, 0, 6, 48, 197, 194, 0, 6, 48, - 278, 0, 6, 48, 140, 0, 56, 74, 161, 160, - 0, 56, 74, 160, 0, 4, 74, 161, 160, 0, - 4, 74, 160, 0, 159, 0, 5, 74, 161, 160, - 0, 5, 74, 160, 0, 75, 0, 77, 0, 162, - 0, 161, 59, 162, 0, 196, 0, 180, 0, 79, - 0, 78, 0, 86, 0, 87, 0, 111, 0, 173, - 0, 180, 0, 47, 0, 93, 164, 109, 0, 47, - 0, 93, 168, 109, 0, 0, 168, 0, 1, 0, - 0, 338, 194, 208, 217, 64, 169, 225, 0, 164, - 0, 110, 0, 299, 295, 110, 0, 299, 295, 1, - 110, 0, 299, 1, 110, 0, 0, 58, 172, 170, - 0, 311, 0, 180, 59, 180, 0, 180, 59, 1, - 0, 173, 59, 180, 0, 173, 59, 1, 0, 180, - 0, 173, 0, 185, 0, 119, 179, 0, 80, 179, - 0, 70, 179, 0, 88, 179, 0, 163, 179, 0, - 67, 154, 0, 12, 175, 0, 12, 93, 196, 109, - 0, 29, 175, 0, 29, 93, 196, 109, 0, 187, - 268, 0, 187, 268, 177, 0, 187, 176, 268, 0, - 187, 176, 268, 177, 0, 187, 93, 196, 109, 0, - 187, 93, 196, 109, 177, 0, 187, 176, 93, 196, - 109, 0, 187, 176, 93, 196, 109, 177, 0, 188, - 179, 0, 188, 94, 112, 179, 0, 188, 94, 164, - 112, 179, 0, 34, 179, 0, 35, 179, 0, 93, - 174, 109, 0, 58, 174, 110, 0, 93, 174, 109, - 0, 47, 0, 93, 203, 109, 0, 64, 225, 0, - 93, 196, 109, 0, 178, 93, 196, 109, 0, 175, - 0, 178, 175, 0, 178, 58, 226, 237, 110, 0, - 179, 0, 180, 83, 180, 0, 180, 84, 180, 0, - 180, 78, 180, 0, 180, 79, 180, 0, 180, 80, - 180, 0, 180, 81, 180, 0, 180, 82, 180, 0, - 180, 76, 180, 0, 180, 77, 180, 0, 180, 73, - 180, 0, 180, 74, 180, 0, 180, 75, 180, 0, - 180, 72, 180, 0, 180, 71, 180, 0, 180, 70, - 180, 0, 180, 68, 180, 0, 180, 69, 180, 0, - 180, 67, 180, 0, 180, 66, 180, 0, 180, 65, - 343, 62, 180, 0, 180, 64, 180, 0, 180, 63, - 180, 0, 61, 0, 61, 180, 0, 88, 358, 154, - 0, 365, 0, 3, 0, 56, 0, 57, 0, 181, - 0, 4, 0, 5, 0, 181, 0, 80, 183, 0, - 70, 183, 0, 93, 183, 109, 0, 280, 0, 181, - 0, 93, 183, 109, 0, 181, 0, 9, 0, 189, - 0, 190, 0, 93, 164, 109, 0, 93, 183, 109, - 0, 93, 1, 109, 0, 0, 93, 186, 303, 109, - 0, 185, 93, 174, 109, 0, 185, 47, 0, 185, - 94, 164, 112, 0, 185, 86, 0, 185, 87, 0, - 40, 0, 8, 93, 174, 109, 0, 284, 0, 50, - 74, 196, 75, 93, 164, 109, 0, 51, 74, 196, - 75, 93, 164, 109, 0, 52, 74, 196, 75, 93, - 164, 109, 0, 53, 74, 196, 75, 93, 164, 109, - 0, 49, 93, 164, 109, 0, 49, 93, 196, 109, - 0, 290, 3, 0, 290, 365, 0, 283, 0, 283, - 93, 174, 109, 0, 283, 47, 0, 192, 182, 0, - 192, 283, 0, 192, 182, 93, 174, 109, 0, 192, - 182, 47, 0, 192, 283, 93, 174, 109, 0, 192, - 283, 47, 0, 192, 88, 7, 47, 0, 192, 7, - 54, 88, 7, 47, 0, 192, 1, 0, 39, 0, - 290, 39, 0, 38, 0, 290, 188, 0, 42, 0, - 43, 0, 10, 0, 190, 10, 0, 0, 185, 92, - 0, 185, 91, 0, 203, 205, 60, 0, 197, 205, - 60, 0, 200, 206, 60, 0, 197, 60, 0, 200, - 60, 0, 119, 193, 0, 274, 0, 278, 0, 47, - 0, 195, 47, 0, 201, 293, 0, 270, 293, 0, - 203, 293, 0, 201, 0, 270, 0, 201, 0, 198, - 0, 200, 203, 0, 203, 199, 0, 203, 202, 199, - 0, 200, 203, 199, 0, 200, 203, 202, 0, 200, - 203, 202, 199, 0, 6, 0, 199, 204, 0, 199, - 6, 0, 199, 218, 0, 218, 0, 270, 0, 6, - 0, 200, 8, 0, 200, 6, 0, 200, 218, 0, - 218, 0, 203, 0, 270, 203, 0, 203, 202, 0, - 270, 203, 202, 0, 204, 0, 202, 204, 0, 232, - 0, 7, 0, 275, 0, 28, 93, 164, 109, 0, - 28, 93, 196, 109, 0, 30, 93, 164, 109, 0, - 30, 93, 196, 109, 0, 7, 0, 8, 0, 232, - 0, 209, 0, 205, 59, 211, 0, 213, 0, 206, - 59, 211, 0, 215, 0, 207, 59, 211, 0, 0, - 120, 93, 190, 109, 0, 0, 194, 208, 217, 64, - 210, 225, 0, 194, 208, 217, 0, 0, 194, 208, - 217, 64, 212, 225, 0, 194, 208, 217, 0, 0, - 278, 208, 217, 64, 214, 225, 0, 278, 208, 217, - 0, 0, 278, 208, 217, 64, 216, 225, 0, 278, - 208, 217, 0, 0, 218, 0, 219, 0, 218, 219, - 0, 31, 93, 93, 220, 109, 109, 0, 221, 0, - 220, 59, 221, 0, 0, 222, 0, 222, 93, 3, - 109, 0, 222, 93, 3, 59, 174, 109, 0, 222, - 93, 174, 109, 0, 154, 0, 6, 0, 7, 0, - 8, 0, 154, 0, 223, 59, 154, 0, 0, 64, - 225, 0, 180, 0, 58, 110, 0, 58, 226, 110, - 0, 58, 226, 59, 110, 0, 1, 0, 225, 0, - 226, 59, 225, 0, 94, 180, 112, 225, 0, 226, - 59, 20, 180, 62, 225, 0, 154, 62, 225, 0, - 226, 59, 154, 62, 225, 0, 98, 0, 227, 137, - 136, 302, 0, 227, 137, 327, 0, 227, 137, 1, - 0, 0, 229, 228, 138, 0, 103, 180, 108, 0, - 103, 1, 108, 0, 0, 231, 230, 0, 231, 1, - 0, 0, 13, 154, 58, 233, 266, 238, 110, 0, - 13, 154, 58, 110, 0, 0, 13, 58, 234, 266, - 238, 110, 0, 13, 58, 110, 0, 13, 154, 0, - 13, 288, 0, 45, 286, 154, 0, 45, 290, 286, - 154, 0, 0, 0, 246, 252, 254, 110, 217, 235, - 231, 236, 229, 0, 246, 0, 0, 59, 0, 0, - 59, 0, 36, 0, 239, 6, 0, 239, 7, 0, - 239, 8, 0, 239, 36, 0, 239, 154, 0, 239, - 156, 0, 239, 286, 154, 0, 239, 158, 0, 239, - 286, 158, 0, 0, 240, 0, 241, 243, 247, 0, - 242, 247, 0, 239, 58, 0, 245, 0, 244, 0, - 0, 62, 358, 0, 62, 358, 248, 0, 249, 0, - 248, 59, 358, 249, 0, 250, 0, 251, 358, 250, - 0, 275, 0, 45, 286, 154, 0, 45, 290, 286, - 154, 0, 30, 93, 164, 109, 0, 30, 93, 196, - 109, 0, 37, 358, 0, 6, 358, 0, 251, 37, - 358, 0, 251, 6, 358, 0, 58, 0, 0, 253, - 0, 253, 255, 0, 254, 37, 62, 255, 0, 254, - 37, 62, 0, 256, 0, 255, 256, 0, 257, 60, - 0, 257, 110, 0, 147, 62, 0, 147, 95, 0, - 147, 24, 0, 147, 58, 0, 60, 0, 119, 256, - 0, 197, 258, 0, 200, 259, 0, 278, 208, 217, - 224, 0, 140, 208, 217, 224, 0, 62, 180, 0, - 1, 0, 200, 146, 208, 217, 224, 0, 146, 208, - 217, 224, 0, 126, 0, 0, 260, 0, 258, 59, - 261, 0, 0, 263, 0, 259, 59, 265, 0, 262, - 0, 263, 0, 264, 0, 265, 0, 274, 208, 217, - 224, 0, 4, 62, 180, 217, 0, 278, 208, 217, - 224, 0, 140, 208, 217, 224, 0, 3, 62, 180, - 217, 0, 62, 180, 217, 0, 274, 208, 217, 224, - 0, 4, 62, 180, 217, 0, 278, 208, 217, 224, - 0, 3, 62, 180, 217, 0, 62, 180, 217, 0, - 267, 0, 266, 59, 267, 0, 154, 0, 154, 64, - 180, 0, 338, 291, 0, 338, 0, 93, 196, 109, - 94, 164, 112, 0, 0, 269, 8, 0, 8, 0, - 270, 8, 0, 0, 271, 164, 0, 271, 93, 174, - 109, 0, 271, 93, 348, 109, 0, 271, 47, 0, - 271, 93, 1, 109, 0, 80, 270, 274, 0, 70, - 270, 274, 0, 80, 274, 0, 70, 274, 0, 289, - 269, 274, 0, 277, 0, 285, 0, 290, 285, 0, - 276, 0, 290, 276, 0, 286, 285, 0, 277, 273, - 269, 360, 0, 277, 94, 272, 112, 0, 277, 94, - 112, 0, 93, 274, 109, 0, 286, 285, 0, 285, - 0, 80, 270, 278, 0, 70, 270, 278, 0, 80, - 278, 0, 70, 278, 0, 289, 269, 278, 0, 184, - 0, 80, 270, 278, 0, 70, 270, 278, 0, 80, - 279, 0, 70, 279, 0, 289, 269, 278, 0, 280, - 0, 184, 273, 269, 360, 0, 93, 279, 109, 0, - 184, 94, 272, 112, 0, 184, 94, 112, 0, 282, - 0, 286, 182, 0, 286, 181, 0, 282, 0, 290, - 282, 0, 203, 93, 174, 109, 0, 203, 93, 183, - 109, 0, 203, 195, 0, 4, 0, 5, 0, 158, - 0, 287, 0, 286, 287, 0, 4, 54, 0, 5, - 54, 0, 57, 54, 0, 158, 54, 0, 290, 285, - 0, 276, 0, 290, 276, 0, 286, 80, 0, 290, - 286, 80, 0, 54, 0, 80, 269, 291, 0, 80, - 269, 0, 70, 269, 291, 0, 70, 269, 0, 289, - 269, 0, 289, 269, 291, 0, 292, 0, 94, 164, - 112, 0, 292, 94, 272, 112, 0, 80, 270, 293, - 0, 80, 293, 0, 80, 270, 0, 80, 0, 70, - 270, 293, 0, 70, 293, 0, 70, 270, 0, 70, - 0, 289, 269, 0, 289, 269, 293, 0, 294, 0, - 93, 293, 109, 0, 90, 0, 294, 93, 348, 109, - 269, 360, 0, 294, 47, 269, 360, 0, 294, 94, - 272, 112, 0, 294, 94, 112, 0, 93, 349, 109, - 269, 360, 0, 178, 269, 360, 0, 195, 269, 360, - 0, 94, 272, 112, 0, 94, 112, 0, 310, 0, - 296, 0, 295, 310, 0, 295, 296, 0, 1, 60, - 0, 0, 0, 0, 300, 0, 301, 0, 300, 301, - 0, 33, 223, 60, 0, 303, 0, 1, 303, 0, - 0, 58, 304, 297, 170, 298, 0, 0, 0, 14, - 306, 297, 166, 307, 308, 0, 303, 0, 0, 297, - 309, 311, 298, 0, 303, 0, 311, 0, 193, 0, - 164, 60, 0, 0, 0, 305, 15, 312, 308, 313, - 298, 0, 305, 0, 0, 0, 16, 314, 297, 166, - 315, 171, 298, 0, 0, 0, 17, 316, 308, 16, - 317, 165, 60, 0, 0, 0, 0, 0, 18, 318, - 93, 341, 319, 297, 167, 60, 320, 343, 109, 321, - 171, 298, 0, 0, 0, 19, 297, 93, 168, 109, - 322, 308, 323, 298, 0, 0, 20, 180, 62, 324, - 310, 0, 0, 20, 180, 11, 180, 62, 325, 310, - 0, 0, 21, 62, 326, 310, 0, 22, 60, 0, - 23, 60, 0, 24, 60, 0, 24, 164, 60, 0, - 120, 342, 93, 190, 109, 60, 0, 120, 342, 93, - 190, 62, 344, 109, 60, 0, 120, 342, 93, 190, - 62, 344, 62, 344, 109, 60, 0, 120, 342, 93, - 190, 62, 344, 62, 344, 62, 347, 109, 60, 0, - 25, 80, 164, 60, 0, 25, 154, 60, 0, 340, - 310, 0, 340, 110, 0, 60, 0, 330, 0, 0, - 0, 95, 328, 136, 302, 329, 333, 0, 0, 0, - 95, 331, 303, 332, 333, 0, 334, 0, 333, 334, - 0, 0, 0, 0, 96, 335, 297, 339, 336, 303, - 337, 298, 0, 201, 0, 270, 0, 93, 11, 109, - 0, 93, 357, 109, 0, 3, 62, 0, 56, 62, - 0, 4, 62, 0, 5, 62, 0, 343, 60, 0, - 193, 0, 58, 170, 0, 0, 8, 0, 0, 164, - 0, 1, 0, 0, 345, 0, 346, 0, 345, 59, - 346, 0, 10, 93, 164, 109, 0, 10, 0, 347, - 59, 10, 0, 0, 349, 0, 196, 0, 353, 0, - 354, 11, 0, 353, 11, 0, 196, 11, 0, 11, - 0, 97, 0, 353, 97, 0, 196, 97, 0, 353, - 62, 0, 196, 62, 0, 0, 64, 351, 352, 0, - 102, 0, 225, 0, 355, 0, 357, 350, 0, 354, - 356, 0, 354, 359, 0, 354, 359, 64, 225, 0, - 353, 59, 0, 196, 59, 0, 198, 194, 0, 201, - 194, 0, 203, 194, 0, 198, 293, 0, 198, 0, - 200, 278, 0, 357, 0, 357, 350, 0, 355, 0, - 196, 0, 0, 0, 278, 0, 0, 61, 93, 362, - 109, 0, 61, 47, 0, 196, 0, 361, 0, 362, - 59, 361, 0, 0, 80, 269, 363, 0, 70, 269, - 363, 0, 289, 269, 363, 0, 41, 0, 364, 80, - 0, 364, 81, 0, 364, 82, 0, 364, 78, 0, - 364, 79, 0, 364, 70, 0, 364, 68, 0, 364, - 69, 0, 364, 88, 0, 364, 59, 0, 364, 73, - 0, 364, 74, 0, 364, 75, 0, 364, 72, 0, - 364, 63, 0, 364, 64, 0, 364, 76, 0, 364, - 77, 0, 364, 86, 0, 364, 87, 0, 364, 67, - 0, 364, 66, 0, 364, 111, 0, 364, 65, 62, - 0, 364, 71, 0, 364, 91, 0, 364, 83, 0, - 364, 47, 0, 364, 94, 112, 0, 364, 39, 0, - 364, 38, 0, 364, 39, 94, 112, 0, 364, 38, - 94, 112, 0, 364, 338, 363, 0, 364, 1, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 309, 311, 325, 328, 329, 333, 335, 338, 343, 347, - 353, 355, 358, 361, 365, 368, 370, 372, 375, 377, - 380, 383, 385, 387, 389, 391, 393, 395, 401, 405, - 408, 410, 414, 416, 417, 419, 423, 426, 432, 435, - 437, 441, 444, 448, 461, 463, 465, 469, 479, 481, - 483, 487, 491, 496, 499, 501, 505, 507, 508, 515, - 516, 517, 520, 523, 527, 529, 530, 533, 535, 538, - 541, 543, 547, 557, 559, 569, 578, 580, 590, 599, - 601, 611, 620, 622, 634, 642, 649, 654, 661, 668, - 671, 673, 675, 681, 691, 693, 696, 699, 701, 704, - 708, 717, 720, 722, 726, 739, 759, 762, 764, 765, - 768, 775, 781, 783, 785, 787, 790, 794, 800, 802, - 803, 804, 805, 808, 810, 811, 814, 816, 817, 820, - 823, 826, 828, 830, 832, 835, 837, 845, 852, 858, - 864, 870, 873, 880, 888, 890, 898, 901, 905, 908, - 911, 914, 916, 918, 920, 924, 927, 930, 935, 939, - 944, 948, 951, 953, 957, 977, 984, 987, 989, 990, - 991, 994, 1005, 1014, 1018, 1022, 1025, 1027, 1031, 1034, - 1037, 1041, 1044, 1046, 1048, 1050, 1057, 1068, 1070, 1072, - 1074, 1080, 1083, 1086, 1089, 1092, 1096, 1099, 1102, 1106, - 1108, 1112, 1116, 1118, 1122, 1125, 1132, 1135, 1137, 1145, - 1154, 1160, 1167, 1169, 1171, 1184, 1187, 1189, 1191, 1193, - 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, - 1215, 1217, 1219, 1221, 1223, 1225, 1227, 1231, 1233, 1235, - 1252, 1255, 1256, 1257, 1258, 1261, 1263, 1264, 1267, 1269, - 1271, 1273, 1277, 1279, 1280, 1284, 1292, 1293, 1294, 1302, - 1310, 1318, 1320, 1328, 1349, 1356, 1363, 1365, 1374, 1379, - 1402, 1446, 1447, 1451, 1455, 1459, 1463, 1465, 1469, 1471, - 1479, 1481, 1486, 1492, 1494, 1499, 1514, 1529, 1540, 1552, - 1560, 1569, 1613, 1616, 1620, 1623, 1627, 1630, 1635, 1637, - 1641, 1654, 1657, 1664, 1671, 1676, 1678, 1683, 1685, 1692, - 1694, 1698, 1702, 1708, 1712, 1715, 1718, 1721, 1731, 1733, - 1736, 1740, 1743, 1746, 1749, 1752, 1758, 1764, 1766, 1771, - 1773, 1782, 1785, 1787, 1790, 1796, 1798, 1808, 1812, 1815, - 1818, 1823, 1826, 1834, 1836, 1838, 1840, 1843, 1846, 1861, - 1880, 1883, 1885, 1888, 1890, 1893, 1895, 1898, 1900, 1903, - 1906, 1910, 1929, 1931, 1951, 1957, 1958, 1964, 1973, 1975, - 1985, 1994, 1996, 2008, 2011, 2015, 2018, 2022, 2027, 2030, - 2034, 2037, 2039, 2041, 2043, 2050, 2052, 2053, 2054, 2058, - 2061, 2065, 2068, 2074, 2076, 2079, 2082, 2085, 2091, 2094, - 2097, 2099, 2101, 2103, 2107, 2113, 2121, 2123, 2127, 2129, - 2134, 2137, 2140, 2142, 2144, 2148, 2152, 2157, 2161, 2164, - 2169, 2173, 2176, 2179, 2182, 2186, 2221, 2227, 2233, 2245, - 2247, 2250, 2252, 2257, 2259, 2261, 2263, 2265, 2269, 2274, - 2279, 2294, 2296, 2300, 2305, 2308, 2315, 2343, 2349, 2351, - 2354, 2357, 2359, 2363, 2365, 2369, 2395, 2424, 2426, 2428, - 2430, 2451, 2474, 2476, 2480, 2506, 2515, 2598, 2605, 2608, - 2616, 2627, 2636, 2640, 2655, 2658, 2663, 2665, 2667, 2669, - 2671, 2673, 2678, 2684, 2686, 2689, 2692, 2694, 2705, 2710, - 2713, 2719, 2722, 2723, 2734, 2737, 2738, 2749, 2751, 2754, - 2756, 2759, 2766, 2774, 2781, 2787, 2793, 2801, 2805, 2810, - 2814, 2817, 2826, 2828, 2832, 2835, 2840, 2844, 2849, 2859, - 2862, 2866, 2870, 2878, 2883, 2889, 2892, 2894, 2896, 2902, - 2905, 2907, 2909, 2911, 2915, 2918, 2939, 2947, 2948, 2952, - 2957, 2960, 2962, 2964, 2966, 2970, 2976, 2979, 2981, 2983, - 2985, 2989, 2992, 2995, 2997, 2999, 3001, 3005, 3008, 3011, - 3013, 3015, 3017, 3026, 3032, 3038, 3040, 3044, 3047, 3049, - 3053, 3055, 3056, 3059, 3061, 3067, 3082, 3088, 3098, 3112, - 3121, 3122, 3126, 3129, 3135, 3141, 3144, 3146, 3148, 3150, - 3154, 3158, 3162, 3165, 3170, 3173, 3175, 3177, 3179, 3181, - 3183, 3185, 3187, 3191, 3195, 3199, 3203, 3204, 3206, 3208, - 3210, 3212, 3214, 3216, 3218, 3220, 3228, 3230, 3231, 3232, - 3235, 3243, 3248, 3255, 3257, 3262, 3264, 3267, 3281, 3284, - 3287, 3296, 3308, 3319, 3339, 3349, 3352, 3360, 3372, 3375, - 3378, 3381, 3397, 3400, 3411, 3412, 3416, 3431, 3450, 3462, - 3476, 3490, 3503, 3522, 3540, 3559, 3567, 3588, 3606, 3619, - 3620, 3623, 3623, 3626, 3626, 3629, 3629, 3635, 3641, 3644, - 3649, 3656, 3665, 3674, 3683, 3691, 3704, 3706, 3710, 3712, - 3715, 3722, 3725, 3733, 3749, 3760, 3772, 3774, 3777, 3787, - 3797, 3808, 3810, 3812, 3815, 3832, 3838, 3846, 3848, 3850, - 3854, 3857, 3858, 3866, 3870, 3874, 3877, 3878, 3884, 3887, - 3890, 3892, 3896, 3901, 3904, 3914, 3919, 3920, 3928, 3934, - 3939, 3943, 3948, 3952, 3956, 3960, 3965, 3976, 3990, 3994, - 3997, 3999, 4003, 4007, 4010, 4013, 4015, 4019, 4021, 4028, - 4035, 4038, 4041, 4045, 4049, 4055, 4059, 4064, 4066, 4069, - 4074, 4080, 4090, 4093, 4095, 4099, 4104, 4106, 4113, 4116, - 4118, 4120, 4126, 4131, 4134, 4136, 4138, 4140, 4142, 4144, - 4146, 4148, 4150, 4152, 4154, 4156, 4158, 4160, 4162, 4164, - 4166, 4168, 4170, 4172, 4174, 4176, 4178, 4180, 4182, 4184, - 4186, 4188, 4190, 4192, 4194, 4196, 4199, 4201 -}; - -static const char * const yytname[] = { "$","error","$undefined.","IDENTIFIER", -"TYPENAME","SELFNAME","SCSPEC","TYPESPEC","CV_QUALIFIER","CONSTANT","STRING", -"ELLIPSIS","SIZEOF","ENUM","IF","ELSE","WHILE","DO","FOR","SWITCH","CASE","DEFAULT", -"BREAK","CONTINUE","RETURN","GOTO","ASM_KEYWORD","GCC_ASM_KEYWORD","TYPEOF", -"ALIGNOF","SIGOF","ATTRIBUTE","EXTENSION","LABEL","REALPART","IMAGPART","AGGR", -"VISSPEC","DELETE","NEW","THIS","OPERATOR","CXX_TRUE","CXX_FALSE","NAMESPACE", -"TYPENAME_KEYWORD","USING","LEFT_RIGHT","TEMPLATE","TYPEID","DYNAMIC_CAST","STATIC_CAST", -"REINTERPRET_CAST","CONST_CAST","SCOPE","EMPTY","PTYPENAME","NSNAME","'{'","','", -"';'","THROW","':'","ASSIGN","'='","'?'","OROR","ANDAND","'|'","'^'","'&'","MIN_MAX", -"EQCOMPARE","ARITHCOMPARE","'<'","'>'","LSHIFT","RSHIFT","'+'","'-'","'*'","'/'", -"'%'","POINTSAT_STAR","DOT_STAR","UNARY","PLUSPLUS","MINUSMINUS","'~'","HYPERUNARY", -"PAREN_STAR_PAREN","POINTSAT","'.'","'('","'['","TRY","CATCH","TYPENAME_ELLIPSIS", -"PRE_PARSED_FUNCTION_DECL","EXTERN_LANG_STRING","ALL","PRE_PARSED_CLASS_DECL", -"DEFARG","DEFARG_MARKER","TYPENAME_DEFN","IDENTIFIER_DEFN","PTYPENAME_DEFN", -"END_OF_LINE","END_OF_SAVED_INPUT","')'","'}'","'!'","']'","program","extdefs", -"@1","extdefs_opt",".hush_warning",".warning_ok","extension","asm_keyword","lang_extdef", -"@2","extdef","@3","@4","using_decl","any_id","extern_lang_string","template_header", -"@5","template_parm_list","template_type_parm","template_parm","template_def", -"datadef","ctor_initializer_opt","maybe_return_init","eat_saved_input","fndef", -"constructor_declarator","@6","@7","@8","@9","fn.def1","component_constructor_declarator", -"fn.def2","return_id","return_init","base_init",".set_base_init","member_init_list", -"member_init","identifier","notype_identifier","identifier_defn","explicit_instantiation", -"template_type","self_template_type","template_close_bracket","template_arg_list", -"template_arg","unop","expr","paren_expr_or_null","paren_cond_or_null","xcond", -"condition","@10","compstmtend","already_scoped_stmt","@11","nontrivial_exprlist", -"nonnull_exprlist","unary_expr","new_placement","new_initializer","regcast_or_absdcl", -"cast_expr","expr_no_commas","notype_unqualified_id","unqualified_id","expr_or_declarator", -"direct_notype_declarator","primary","@12","new","delete","boolean.literal", -"string","nodecls","object","decl","declarator","fcast_or_absdcl","type_id", -"typed_declspecs","typed_declspecs1","reserved_declspecs","declmods","typed_typespecs", -"reserved_typespecquals","typespec","typespecqual_reserved","initdecls","notype_initdecls", -"nomods_initdecls","maybeasm","initdcl0","@13","initdcl","@14","notype_initdcl0", -"@15","nomods_initdcl0","@16","maybe_attribute","attributes","attribute","attribute_list", -"attrib","any_word","identifiers_or_typenames","maybe_init","init","initlist", -"fn.defpen","pending_inline","pending_inlines","defarg_again","pending_defargs", -"structsp","@17","@18","@19","@20","maybecomma","maybecomma_warn","aggr","named_class_head_sans_basetype", -"named_class_head_sans_basetype_defn","named_complex_class_head_sans_basetype", -"do_xref_defn","named_class_head","unnamed_class_head","class_head","maybe_base_class_list", -"base_class_list","base_class","base_class.1","base_class_access_list","left_curly", -"self_reference","opt.component_decl_list","component_decl_list","component_decl", -"component_decl_1","components","notype_components","component_declarator0", -"component_declarator","after_type_component_declarator0","notype_component_declarator0", -"after_type_component_declarator","notype_component_declarator","enumlist","enumerator", -"new_type_id","cv_qualifiers","nonempty_cv_qualifiers","suspend_mom","nonmomentary_expr", -"maybe_parmlist","after_type_declarator","complete_type_name","nested_type", -"direct_after_type_declarator","notype_declarator","complex_notype_declarator", -"complex_direct_notype_declarator","qualified_id","notype_qualified_id","overqualified_id", -"functional_cast","type_name","nested_name_specifier","nested_name_specifier_1", -"complex_type_name","ptr_to_mem","global_scope","new_declarator","direct_new_declarator", -"absdcl","direct_abstract_declarator","stmts","errstmt",".pushlevel",".poplevel", -"maybe_label_decls","label_decls","label_decl","compstmt_or_error","compstmt", -"@21","simple_if","@22","@23","implicitly_scoped_stmt","@24","stmt","simple_stmt", -"@25","@26","@27","@28","@29","@30","@31","@32","@33","@34","@35","@36","@37", -"@38","@39","function_try_block","@40","@41","try_block","@42","@43","handler_seq", -"handler","@44","@45","@46","type_specifier_seq","handler_args","label_colon", -"for.init.statement","maybe_cv_qualifier","xexpr","asm_operands","nonnull_asm_operands", -"asm_operand","asm_clobbers","parmlist","complex_parmlist","defarg","@47","defarg1", -"parms","parms_comma","named_parm","full_parm","parm","see_typename","bad_parm", -"exception_specification_opt","ansi_raise_identifier","ansi_raise_identifiers", -"conversion_declarator","operator","operator_name","" -}; -#endif - -static const short yyr1[] = { 0, - 113, 113, 115, 114, 114, 116, 116, 117, 118, 119, - 120, 120, 122, 121, 123, 123, 123, 123, 123, 123, - 123, 124, 123, 125, 123, 123, 123, 123, 123, 126, - 126, 126, 127, 127, 127, 127, 128, 128, 130, 129, - 129, 131, 131, 132, 132, 132, 132, 133, 133, 133, - 133, 134, 134, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 136, 136, 137, 137, 137, 138, 138, 139, - 139, 139, 141, 140, 140, 142, 140, 140, 143, 140, - 140, 144, 140, 140, 145, 145, 145, 145, 145, 146, - 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, - 148, 149, 149, 149, 150, 151, 152, 152, 152, 152, - 153, 153, 153, 153, 153, 153, 153, 153, 154, 154, - 154, 154, 154, 155, 155, 155, 156, 156, 156, 157, - 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, - 158, 158, 159, 159, 160, 160, 161, 161, 162, 162, - 163, 163, 163, 163, 163, 164, 164, 165, 165, 166, - 166, 167, 167, 167, 169, 168, 168, 170, 170, 170, - 170, 172, 171, 171, 173, 173, 173, 173, 174, 174, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 176, 176, 177, 177, 177, 177, - 178, 178, 179, 179, 179, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 181, 181, 181, 181, 181, 182, 182, 182, 183, 183, - 183, 183, 184, 184, 184, 185, 185, 185, 185, 185, - 185, 185, 186, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 187, 187, 188, 188, 189, 189, 190, 190, - 191, 192, 192, 193, 193, 193, 193, 193, 193, 194, - 194, 195, 195, 196, 196, 196, 196, 196, 197, 197, - 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, - 199, 200, 200, 200, 200, 200, 200, 201, 201, 201, - 201, 202, 202, 203, 203, 203, 203, 203, 203, 203, - 204, 204, 204, 205, 205, 206, 206, 207, 207, 208, - 208, 210, 209, 209, 212, 211, 211, 214, 213, 213, - 216, 215, 215, 217, 217, 218, 218, 219, 220, 220, - 221, 221, 221, 221, 221, 222, 222, 222, 222, 223, - 223, 224, 224, 225, 225, 225, 225, 225, 226, 226, - 226, 226, 226, 226, 227, 228, 228, 228, 229, 229, - 230, 230, 231, 231, 231, 233, 232, 232, 234, 232, - 232, 232, 232, 232, 232, 235, 236, 232, 232, 237, - 237, 238, 238, 239, 239, 239, 239, 239, 240, 241, - 242, 242, 242, 243, 244, 244, 244, 245, 246, 246, - 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, - 250, 250, 251, 251, 251, 251, 252, 253, 254, 254, - 254, 254, 255, 255, 256, 256, 256, 256, 256, 256, - 256, 256, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 258, 258, 258, 259, 259, 259, 260, 260, 261, - 261, 262, 262, 263, 263, 263, 263, 264, 264, 265, - 265, 265, 266, 266, 267, 267, 268, 268, 268, 269, - 269, 270, 270, 271, 272, 273, 273, 273, 273, 274, - 274, 274, 274, 274, 274, 275, 275, 275, 275, 276, - 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, - 278, 278, 279, 279, 279, 279, 279, 279, 280, 280, - 280, 280, 280, 281, 282, 283, 283, 284, 284, 284, - 285, 285, 285, 286, 286, 287, 287, 287, 287, 288, - 288, 288, 289, 289, 290, 291, 291, 291, 291, 291, - 291, 291, 292, 292, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 294, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 294, 295, 295, 295, 295, - 296, 297, 298, 299, 299, 300, 300, 301, 302, 302, - 304, 303, 306, 307, 305, 308, 309, 308, 310, 310, - 311, 311, 312, 313, 311, 311, 314, 315, 311, 316, - 317, 311, 318, 319, 320, 321, 311, 322, 323, 311, - 324, 311, 325, 311, 326, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, - 328, 329, 327, 331, 332, 330, 333, 333, 335, 336, - 337, 334, 338, 338, 339, 339, 340, 340, 340, 340, - 341, 341, 341, 342, 342, 343, 343, 343, 344, 344, - 345, 345, 346, 347, 347, 348, 348, 348, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, 351, 350, - 352, 352, 353, 353, 353, 353, 353, 354, 354, 355, - 355, 355, 355, 355, 355, 356, 356, 357, 357, 358, - 359, 359, 360, 360, 360, 361, 362, 362, 363, 363, - 363, 363, 364, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365 -}; - -static const short yyr2[] = { 0, - 0, 1, 0, 2, 2, 1, 0, 0, 0, 1, - 1, 1, 0, 2, 2, 1, 1, 5, 4, 5, - 4, 0, 6, 0, 5, 5, 2, 4, 2, 2, - 3, 3, 1, 1, 2, 2, 1, 2, 0, 5, - 3, 1, 3, 1, 2, 1, 2, 1, 3, 1, - 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, - 2, 1, 1, 1, 0, 1, 2, 0, 1, 4, - 3, 3, 0, 8, 5, 0, 9, 6, 0, 8, - 5, 0, 9, 6, 2, 2, 1, 2, 1, 6, - 4, 6, 4, 2, 1, 2, 2, 1, 2, 1, - 2, 2, 4, 2, 3, 0, 0, 1, 3, 2, - 3, 1, 4, 2, 4, 2, 4, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 2, 2, 4, 4, 3, 3, 4, 3, 4, - 3, 1, 4, 3, 1, 1, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 3, 0, 1, 1, 0, 7, 1, 1, 3, 4, - 3, 0, 3, 1, 3, 3, 3, 3, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 4, 2, 3, 3, 4, 4, 5, 5, 6, 2, - 4, 5, 2, 2, 3, 3, 3, 1, 3, 2, - 3, 4, 1, 2, 5, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 5, 3, 3, 1, 2, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 3, 1, 1, 3, 1, 1, 1, 1, 3, - 3, 3, 0, 4, 4, 2, 4, 2, 2, 1, - 4, 1, 7, 7, 7, 7, 4, 4, 2, 2, - 1, 4, 2, 2, 2, 5, 3, 5, 3, 4, - 6, 2, 1, 2, 1, 2, 1, 1, 1, 2, - 0, 2, 2, 3, 3, 3, 2, 2, 2, 1, - 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 2, 3, 3, 3, 4, 1, 2, 2, 2, - 1, 1, 1, 2, 2, 2, 1, 1, 2, 2, - 3, 1, 2, 1, 1, 1, 4, 4, 4, 4, - 1, 1, 1, 1, 3, 1, 3, 1, 3, 0, - 4, 0, 6, 3, 0, 6, 3, 0, 6, 3, - 0, 6, 3, 0, 1, 1, 2, 6, 1, 3, - 0, 1, 4, 6, 4, 1, 1, 1, 1, 1, - 3, 0, 2, 1, 2, 3, 4, 1, 1, 3, - 4, 6, 3, 5, 1, 4, 3, 3, 0, 3, - 3, 3, 0, 2, 2, 0, 7, 4, 0, 6, - 3, 2, 2, 3, 4, 0, 0, 9, 1, 0, - 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, - 3, 2, 3, 0, 1, 3, 2, 2, 1, 1, - 0, 2, 3, 1, 4, 1, 3, 1, 3, 4, - 4, 4, 2, 2, 3, 3, 1, 0, 1, 2, - 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 2, 4, 4, 2, 1, 5, 4, - 1, 0, 1, 3, 0, 1, 3, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 3, 4, 4, 4, - 4, 3, 1, 3, 1, 3, 2, 1, 6, 0, - 2, 1, 2, 0, 2, 4, 4, 2, 4, 3, - 3, 2, 2, 3, 1, 1, 2, 1, 2, 2, - 4, 4, 3, 3, 2, 1, 3, 3, 2, 2, - 3, 1, 3, 3, 2, 2, 3, 1, 4, 3, - 4, 3, 1, 2, 2, 1, 2, 4, 4, 2, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 3, 1, 3, 2, 3, 2, 2, - 3, 1, 3, 4, 3, 2, 2, 1, 3, 2, - 2, 1, 2, 3, 1, 3, 1, 6, 4, 4, - 3, 5, 3, 3, 3, 2, 1, 1, 2, 2, - 2, 0, 0, 0, 1, 1, 2, 3, 1, 2, - 0, 5, 0, 0, 6, 1, 0, 4, 1, 1, - 1, 2, 0, 0, 6, 1, 0, 0, 7, 0, - 0, 7, 0, 0, 0, 0, 14, 0, 0, 9, - 0, 5, 0, 7, 0, 4, 2, 2, 2, 3, - 6, 8, 10, 12, 4, 3, 2, 2, 1, 1, - 0, 0, 6, 0, 0, 5, 1, 2, 0, 0, - 0, 8, 1, 1, 3, 3, 2, 2, 2, 2, - 2, 1, 2, 0, 1, 0, 1, 1, 0, 1, - 1, 3, 4, 1, 3, 0, 1, 1, 1, 2, - 2, 2, 1, 1, 2, 2, 2, 2, 0, 3, - 1, 1, 1, 2, 2, 2, 4, 2, 2, 2, - 2, 2, 2, 1, 2, 1, 2, 1, 1, 0, - 0, 1, 0, 4, 2, 1, 1, 3, 0, 3, - 3, 3, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, - 2, 3, 2, 2, 4, 4, 3, 2 -}; - -static const short yydefact[] = { 3, - 13, 13, 5, 0, 4, 0, 243, 571, 572, 333, - 345, 522, 0, 11, 12, 0, 0, 0, 10, 434, - 763, 0, 0, 0, 0, 585, 244, 245, 62, 0, - 0, 750, 0, 37, 0, 0, 14, 0, 8, 0, - 17, 16, 68, 89, 65, 0, 573, 142, 254, 552, - 0, 320, 0, 319, 338, 0, 358, 337, 376, 344, - 0, 445, 444, 451, 450, 449, 429, 332, 346, 538, - 87, 253, 563, 536, 0, 574, 520, 0, 0, 242, - 60, 61, 576, 0, 577, 0, 0, 119, 120, 121, - 122, 123, 419, 422, 0, 581, 0, 423, 0, 0, - 0, 0, 120, 121, 122, 123, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 0, 0, 333, 39, - 133, 0, 0, 0, 132, 0, 578, 0, 550, 0, - 0, 0, 549, 0, 0, 0, 0, 254, 0, 524, - 0, 253, 520, 29, 0, 27, 3, 38, 0, 53, - 52, 69, 15, 0, 0, 392, 66, 58, 579, 524, - 0, 520, 59, 0, 0, 0, 85, 0, 354, 310, - 535, 311, 546, 0, 520, 335, 334, 57, 88, 321, - 0, 356, 336, 86, 327, 351, 352, 322, 340, 342, - 331, 353, 0, 54, 377, 435, 436, 437, 438, 448, - 128, 127, 129, 439, 440, 442, 0, 451, 750, 447, - 467, 468, 523, 339, 0, 0, 374, 572, 583, 142, - 565, 540, 575, 0, 539, 537, 0, 798, 794, 793, - 791, 773, 778, 779, 0, 785, 784, 770, 771, 769, - 788, 777, 774, 775, 776, 780, 781, 767, 768, 764, - 765, 766, 790, 782, 783, 772, 789, 0, 786, 693, - 338, 694, 759, 522, 257, 299, 0, 0, 0, 0, - 295, 293, 270, 297, 298, 0, 0, 0, 0, 0, - 239, 0, 0, 145, 146, 152, 151, 0, 153, 154, - 0, 0, 155, 0, 141, 0, 147, 0, 213, 0, - 216, 150, 256, 181, 0, 0, 258, 259, 0, 149, - 317, 338, 318, 566, 281, 272, 0, 0, 144, 0, - 137, 0, 0, 136, 421, 0, 416, 582, 580, 0, - 156, 157, 0, 0, 0, 381, 3, 22, 0, 424, - 0, 247, 248, 0, 246, 33, 34, 0, 564, 32, - 31, 41, 0, 131, 442, 139, 0, 548, 0, 547, - 241, 251, 0, 556, 250, 0, 555, 0, 255, 560, - 0, 0, 13, 0, 0, 9, 9, 101, 72, 106, - 681, 0, 64, 63, 71, 104, 0, 0, 102, 67, - 562, 0, 0, 528, 0, 753, 0, 533, 0, 532, - 0, 0, 0, 0, 520, 374, 0, 56, 524, 520, - 545, 0, 324, 325, 0, 55, 374, 329, 328, 330, - 323, 343, 360, 359, 441, 443, 446, 452, 0, 0, - 341, 0, 373, 375, 520, 73, 520, 79, 521, 551, - 572, 584, 142, 0, 0, 787, 792, 340, 520, 520, - 0, 520, 797, 0, 0, 0, 188, 0, 0, 190, - 203, 204, 0, 0, 0, 0, 0, 240, 187, 184, - 183, 185, 0, 0, 0, 0, 0, 256, 0, 0, - 0, 182, 0, 140, 186, 0, 0, 214, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 266, 268, 269, 303, 302, 0, 0, 0, 0, 0, - 192, 518, 0, 200, 300, 292, 0, 750, 284, 285, - 0, 0, 312, 602, 598, 607, 0, 524, 520, 520, - 520, 314, 605, 0, 570, 316, 0, 0, 315, 283, - 0, 279, 294, 296, 567, 0, 280, 143, 135, 442, - 515, 432, 513, 418, 0, 347, 0, 0, 348, 349, - 350, 387, 388, 389, 386, 0, 379, 382, 0, 3, - 0, 425, 28, 36, 35, 46, 0, 48, 42, 749, - 744, 0, 317, 338, 44, 318, 748, 50, 138, 554, - 553, 255, 557, 0, 19, 21, 68, 107, 301, 0, - 631, 70, 629, 398, 0, 394, 393, 180, 0, 179, - 525, 561, 0, 723, 724, 0, 718, 338, 0, 717, - 719, 751, 733, 0, 0, 559, 531, 530, 0, 0, - 544, 0, 364, 355, 543, 0, 753, 534, 326, 357, - 370, 374, 750, 0, 750, 0, 453, 454, 456, 750, - 458, 488, 572, 0, 481, 0, 0, 491, 100, 95, - 0, 142, 492, 495, 0, 473, 0, 98, 0, 374, - 0, 371, 753, 716, 753, 716, 520, 76, 520, 82, - 796, 795, 759, 759, 759, 0, 0, 0, 570, 0, - 0, 0, 0, 338, 0, 0, 0, 262, 0, 260, - 261, 0, 211, 148, 243, 571, 572, 244, 245, 0, - 0, 399, 430, 0, 238, 237, 708, 707, 0, 235, - 234, 232, 233, 231, 230, 229, 226, 227, 228, 224, - 225, 219, 220, 221, 222, 223, 217, 218, 0, 0, - 0, 0, 0, 0, 194, 208, 0, 0, 193, 520, - 520, 0, 520, 517, 592, 0, 0, 0, 0, 287, - 0, 289, 0, 601, 600, 597, 596, 749, 0, 0, - 616, 0, 0, 753, 313, 753, 603, 520, 716, 524, - 602, 598, 0, 0, 520, 0, 0, 0, 0, 0, - 0, 433, 0, 432, 178, 177, 176, 175, 381, 0, - 0, 25, 0, 26, 47, 0, 40, 0, 602, 598, - 0, 740, 520, 743, 745, 741, 742, 439, 0, 18, - 20, 124, 112, 125, 126, 0, 105, 108, 0, 0, - 0, 0, 630, 622, 395, 0, 103, 529, 526, 722, - 739, 728, 726, 0, 527, 721, 738, 727, 725, 720, - 752, 735, 746, 736, 729, 734, 755, 0, 362, 542, - 541, 368, 367, 464, 0, 463, 0, 0, 750, 750, - 750, 0, 520, 716, 487, 482, 374, 374, 479, 480, - 477, 478, 520, 716, 243, 571, 0, 360, 96, 483, - 493, 498, 499, 360, 360, 0, 0, 360, 94, 484, - 496, 360, 474, 475, 476, 374, 0, 426, 361, 0, - 75, 0, 81, 0, 753, 716, 753, 716, 761, 760, - 762, 271, 189, 191, 277, 278, 0, 0, 0, 0, - 261, 264, 0, 0, 0, 0, 212, 0, 265, 267, - 206, 205, 196, 0, 195, 210, 0, 0, 589, 587, - 0, 590, 524, 201, 0, 0, 290, 0, 0, 599, - 595, 606, 520, 615, 613, 614, 604, 753, 0, 611, - 0, 568, 569, 0, 282, 516, 514, 420, 0, 380, - 378, 243, 0, 23, 43, 49, 601, 597, 602, 598, - 0, 536, 0, 520, 603, 51, 0, 110, 0, 114, - 0, 116, 0, 118, 0, 682, 624, 0, 396, 602, - 598, 0, 256, 0, 566, 747, 0, 0, 756, 757, - 0, 0, 0, 365, 0, 0, 459, 0, 0, 466, - 465, 457, 753, 0, 392, 392, 753, 0, 0, 0, - 374, 374, 0, 374, 374, 0, 374, 0, 392, 0, - 413, 372, 520, 520, 78, 0, 84, 0, 0, 0, - 0, 0, 0, 403, 0, 0, 400, 215, 236, 0, - 197, 198, 207, 209, 588, 586, 593, 591, 0, 202, - 0, 286, 288, 753, 609, 520, 610, 417, 0, 383, - 385, 601, 597, 540, 603, 111, 109, 0, 0, 0, - 0, 0, 168, 623, 0, 625, 626, 397, 0, 569, - 737, 731, 732, 730, 0, 754, 363, 369, 0, 461, - 462, 460, 455, 91, 520, 486, 490, 93, 520, 374, - 374, 507, 392, 243, 571, 0, 494, 500, 501, 360, - 360, 392, 392, 0, 392, 497, 485, 0, 753, 753, - 520, 520, 0, 0, 0, 0, 401, 0, 0, 0, - 199, 594, 291, 612, 753, 0, 113, 115, 117, 689, - 683, 687, 390, 0, 632, 0, 243, 571, 572, 633, - 647, 650, 653, 622, 0, 0, 0, 0, 0, 0, - 244, 679, 684, 0, 704, 0, 641, 0, 0, 338, - 0, 618, 639, 646, 617, 640, 680, 0, 627, 261, - 758, 366, 753, 753, 506, 503, 505, 0, 0, 374, - 374, 374, 502, 504, 489, 415, 0, 414, 409, 74, - 80, 753, 753, 273, 274, 275, 276, 0, 404, 519, - 608, 384, 622, 688, 0, 628, 621, 171, 697, 699, - 700, 622, 622, 622, 0, 0, 0, 665, 667, 668, - 669, 0, 0, 0, 698, 0, 309, 705, 0, 642, - 307, 360, 0, 308, 0, 360, 0, 0, 0, 169, - 620, 619, 643, 678, 677, 90, 92, 374, 374, 512, - 392, 392, 0, 0, 428, 77, 83, 402, 0, 391, - 0, 0, 637, 636, 0, 0, 0, 0, 661, 0, - 670, 0, 676, 685, 0, 305, 306, 0, 0, 0, - 304, 170, 622, 511, 509, 508, 510, 412, 411, 405, - 65, 68, 0, 690, 160, 0, 634, 648, 0, 651, - 624, 702, 654, 0, 167, 0, 338, 0, 0, 0, - 666, 675, 0, 0, 644, 0, 410, 0, 0, 0, - 0, 622, 0, 623, 0, 703, 622, 701, 658, 360, - 663, 662, 686, 709, 0, 623, 408, 0, 407, 695, - 696, 691, 161, 635, 172, 623, 174, 638, 158, 0, - 0, 0, 622, 374, 0, 0, 0, 710, 711, 671, - 645, 406, 623, 624, 649, 0, 652, 164, 0, 163, - 659, 0, 664, 0, 709, 0, 0, 692, 173, 159, - 655, 623, 165, 0, 0, 672, 712, 0, 660, 0, - 713, 0, 0, 0, 166, 714, 0, 673, 656, 0, - 0, 0, 715, 674, 623, 657, 0, 0, 0 -}; - -static const short yydefgoto[] = { 1457, - 373, 2, 374, 149, 606, 294, 216, 3, 4, 37, - 580, 337, 668, 344, 39, 40, 353, 587, 588, 589, - 41, 42, 382, 155, 153, 43, 669, 684, 926, 686, - 928, 45, 670, 671, 156, 157, 383, 608, 837, 838, - 204, 839, 205, 46, 47, 48, 295, 296, 297, 298, - 1206, 1401, 1347, 1419, 1356, 1440, 1114, 1396, 1414, 331, - 794, 299, 520, 759, 300, 301, 332, 303, 346, 362, - 50, 304, 480, 305, 306, 307, 308, 384, 309, 1207, - 423, 540, 627, 1208, 52, 188, 592, 311, 189, 458, - 190, 168, 181, 56, 406, 169, 1032, 424, 1129, 182, - 1033, 57, 920, 433, 58, 59, 576, 577, 578, 1184, - 389, 722, 723, 1341, 1342, 1305, 1238, 1158, 60, 565, - 326, 1061, 1239, 946, 803, 61, 62, 63, 64, 208, - 65, 66, 67, 210, 657, 658, 659, 660, 212, 429, - 430, 675, 676, 677, 900, 910, 901, 1147, 902, 903, - 1148, 1149, 562, 563, 521, 784, 313, 392, 393, 162, - 170, 69, 70, 171, 172, 141, 72, 116, 314, 315, - 316, 74, 317, 76, 98, 77, 318, 764, 765, 779, - 543, 1211, 1212, 1313, 1185, 1115, 1116, 1117, 612, 1213, - 844, 1214, 1262, 1372, 1315, 1349, 1215, 1216, 1333, 1386, - 1263, 1373, 1264, 1375, 1265, 1377, 1438, 1452, 1403, 1432, - 1360, 1405, 1320, 385, 609, 1111, 1217, 1276, 1363, 1181, - 1182, 1253, 1370, 1413, 1358, 1344, 1218, 1353, 1279, 729, - 1407, 1408, 1409, 1447, 629, 630, 866, 1028, 1124, 631, - 632, 633, 862, 634, 134, 864, 636, 1030, 1031, 453, - 79, 80 -}; - -static const short yypact[] = { 45, - 109,-32768,-32768, 9869,-32768, 44,-32768, 294, 414, 76, --32768,-32768, 392,-32768,-32768, 42, 59, 94,-32768,-32768, --32768, 573, 707, 1336, 10054,-32768, 154, 170,-32768, 1480, - 1480,-32768, 3768,-32768, 9869, 142,-32768, 203, 126, 9939, --32768,-32768, 213,-32768, 260, 236, 271,-32768,-32768, 426, - 1790,-32768, 5098,-32768, 1518, 558,-32768, 301,-32768,-32768, - 881,-32768,-32768, 285,-32768,-32768, 302, 4449,-32768,-32768, - 1373,-32768,-32768,-32768, 324,-32768,-32768, 358, 6789,-32768, --32768,-32768,-32768, 8390,-32768, 8390, 10260,-32768, 294, 414, - 154, 170, 259, 344, 271,-32768, 358,-32768, 358, 8839, - 8839, 320,-32768,-32768,-32768,-32768,-32768, 49, 294, 414, - 154, 170, 939, 401, 553,-32768, 646, 646,-32768, 360, --32768, 4051, 3013, 881,-32768, 8390,-32768, 2670,-32768, 943, - 401, 2670,-32768, 1076, 2820, 2820, 3768, 334, 356, 399, - 397, 435,-32768,-32768, 500,-32768, 413,-32768, 1691, 44, --32768,-32768,-32768, 547, 72, 250, 521,-32768,-32768, 481, - 143,-32768,-32768, 2911, 2911, 4193, 1373, 608,-32768,-32768, - 502,-32768,-32768, 1243,-32768,-32768,-32768,-32768,-32768, 1518, - 672,-32768, 301, 1373,-32768,-32768,-32768, 1821, 1518,-32768, - 301,-32768, 4051,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 271, 939, 285,-32768,-32768, --32768,-32768,-32768, 1227, 358, 505, 301, 393,-32768, 176, --32768,-32768,-32768, 3112,-32768,-32768, 695,-32768, 512, 517, --32768,-32768,-32768,-32768, 559,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 503,-32768,-32768, - 1227, 4449, 1007, 533,-32768,-32768, 9453, 9540, 9627, 9627, --32768,-32768,-32768,-32768,-32768, 568, 600, 615, 621, 630, - 8926, 1076, 9627,-32768,-32768,-32768,-32768, 9627,-32768,-32768, - 9627, 6881,-32768, 9627,-32768, 557,-32768, 9627,-32768, 9013, --32768, 5963,-32768, 1585, 2305, 9100,-32768, 662, 1440,-32768, - 566, 2295, 2056,-32768, 240,-32768, 737, 1989,-32768, 557, --32768, 4051, 881,-32768,-32768, 1076, 606,-32768,-32768, 599, - 677, 10414, 611, 637, 648, 1302, 413,-32768, 553,-32768, - 939, 294, 414, 711,-32768,-32768,-32768, 646,-32768,-32768, --32768,-32768, 4374,-32768, 257,-32768, 557,-32768, 818,-32768, --32768,-32768, 2670,-32768,-32768, 2670,-32768, 653,-32768,-32768, - 3112, 55, 667, 678, 10260,-32768,-32768,-32768,-32768,-32768, --32768, 102,-32768,-32768,-32768,-32768, 6972, 8926,-32768,-32768, --32768, 8926, 686,-32768, 5379, 121, 3290,-32768, 3290,-32768, - 3538, 3538, 4193, 709,-32768, 301, 4051,-32768, 690,-32768, --32768, 3629, 1821, 1518, 4051,-32768, 301,-32768,-32768, 301, - 1821,-32768, 348,-32768,-32768, 271,-32768, 3069, 3964, 48, - 1227, 500, 747, 301,-32768,-32768,-32768,-32768,-32768,-32768, - 453,-32768, 289, 704, 714,-32768,-32768, 1227,-32768,-32768, - 826,-32768,-32768, 8926, 533, 6881,-32768, 340, 6881,-32768, --32768,-32768, 8839, 4846, 4846, 4846, 4846, 10482,-32768,-32768, --32768,-32768, 732, 9714, 9714, 6881, 738, 334, 740, 798, - 758,-32768, 8839,-32768,-32768, 6634, 6881,-32768, 8926, 8926, - 7063, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, - 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, --32768,-32768,-32768,-32768,-32768, 8926, 8926, 8926, 8839, 2689, - 381, 362, 7696,-32768,-32768,-32768, 814, 862, 343, 361, - 1612, 401,-32768, 1557, 1557,-32768, 2917, 764, 777, 844, --32768,-32768, 561, 8200, 1177,-32768, 847, 358,-32768,-32768, - 8926,-32768,-32768,-32768,-32768, 551,-32768,-32768,-32768, 476, - 831, 837,-32768,-32768, 1076,-32768, 7427, 7518,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 52,-32768, 807, 789, 413, - 841,-32768,-32768,-32768,-32768, 804, 598, 848,-32768,-32768, - 702, 10315, 702, 1911, 881, 3617,-32768, 850,-32768,-32768, --32768, 809,-32768, 855,-32768,-32768, 213, 874, 854, 798, --32768,-32768,-32768,-32768, 6356, 10482,-32768, 677, 817, 10414, --32768,-32768, 820,-32768,-32768, 823, 330, 4985, 824,-32768, - 66, 10109, 871, 876, 383,-32768,-32768,-32768, 3290, 3290, --32768, 3629, 888,-32768,-32768, 843, 121,-32768, 1821,-32768, - 894, 301,-32768, 868,-32768, 707, 905,-32768,-32768, 262, --32768,-32768, 508, 707,-32768, 8926, 10009,-32768, 465, 465, - 188, 404, 3336, 10154, 4767,-32768, 129, 465, 903, 301, - 62,-32768, 121, 1089, 121, 1089,-32768,-32768,-32768,-32768, --32768,-32768, 1487, 1487, 1487, 861, 863, 9192, 844, 864, - 865, 867, 896, 3839, 904, 906, 907,-32768, 879,-32768, --32768, 884,-32768,-32768, 921, 590, 622, 379, 147, 8926, - 936,-32768, 942, 897, 10482, 10482,-32768,-32768, 948, 5235, - 7722, 2193, 5136, 5286, 4683, 2562, 2406, 2406, 2406, 1199, - 1199, 753, 753, 697, 697, 697,-32768,-32768, 915, 893, - 916, 923, 924, 4846, 381,-32768, 6972, 8926,-32768,-32768, --32768, 8926,-32768,-32768, 919, 9627, 922, 928, 991,-32768, - 8926,-32768, 8926, 3429,-32768, 3429,-32768, 157, 932, 937, --32768, 933, 4846, 121,-32768, 121, 3845,-32768, 1089, 941, - 8477, 8477, 6049, 940, 9013, 945, 1243, 1989, 964, 949, - 8926, 1076, 938, 837,-32768, 10482,-32768, 10482, 1302, 950, - 9279,-32768, 955,-32768,-32768, 4374,-32768, 4846, 2139, 2139, - 3183,-32768,-32768,-32768,-32768,-32768,-32768, 655, 8926,-32768, --32768,-32768,-32768, 154, 170, 8926, 1001,-32768, 438, 448, - 471, 102,-32768,-32768,-32768, 82,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 8295,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 876, 1002,-32768,-32768,-32768, 4846,-32768,-32768, --32768,-32768, 1005,-32768, 8839,-32768, 939, 401,-32768,-32768, --32768, 1109,-32768, 1089, 10482,-32768, 301, 301,-32768,-32768, --32768,-32768,-32768, 1089, 1009, 661, 8926, 348,-32768, 1023, --32768,-32768,-32768, 883, 1046, 324, 401, 1203, 465, 1024, --32768, 1359,-32768,-32768,-32768, 301, 4915,-32768,-32768, 6972, --32768, 977,-32768, 982, 121, 1089, 121, 1089,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 999, 1010, 1012, 1014, - 809,-32768, 10346, 6972, 6450, 988,-32768, 8926,-32768,-32768, --32768,-32768, 329, 1000,-32768,-32768, 1013, 150, 1070, 1070, - 998, 1070,-32768,-32768, 9627, 1121,-32768, 1029, 1033,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 121, 1035,-32768, - 1036,-32768,-32768, 1291,-32768, 10482,-32768,-32768, 1037,-32768, --32768, 158, 1040,-32768,-32768,-32768, 2364, 2364, 2492, 2492, - 3183,-32768, 1243,-32768, 2611, 5963, 1043,-32768, 874,-32768, - 8926,-32768, 8926,-32768, 8926,-32768, 68, 6543,-32768, 8569, - 8569, 6170, 144, 1044, 155,-32768, 6972, 6728,-32768,-32768, - 161, 6972, 6972,-32768, 1050, 1051,-32768, 939, 3069,-32768, --32768,-32768, 121, 1053, 1103, 1103, 121, 1059, 8926, 8926, - 5719, 301, 3687, 301, 301, 1032, 301, 3919, 1103, 5493, --32768,-32768,-32768,-32768,-32768, 1060,-32768, 1069, 8926, 8926, - 8926, 8926, 6972,-32768, 8926, 1093,-32768,-32768, 10482, 8926, --32768, 329,-32768,-32768,-32768,-32768,-32768,-32768, 1067,-32768, - 1134,-32768,-32768, 121,-32768,-32768,-32768,-32768, 8926,-32768, --32768, 2364, 2364,-32768, 2611,-32768,-32768, 1075, 1080, 1081, - 1098, 1076,-32768,-32768, 5927, 1166,-32768,-32768, 1094, 1409, --32768,-32768,-32768,-32768, 4846,-32768,-32768,-32768, 6972,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 5719, - 5719,-32768, 1103, 1144, 691, 8926,-32768,-32768,-32768, 348, - 348, 1103, 1103, 453, 1103,-32768,-32768, 5654, 121, 121, --32768,-32768, 1099, 1100, 1101, 1104,-32768, 10437, 6972, 1116, --32768,-32768,-32768,-32768, 121, 1106,-32768,-32768,-32768,-32768, - 1098,-32768,-32768, 679,-32768, 166, 1154, 693, 729,-32768, --32768,-32768,-32768,-32768, 8926, 1159, 1182, 1185, 8661, 582, - 450,-32768,-32768, 8752, 1229, 1189,-32768, 2470, 10215, 3404, - 5816,-32768,-32768, 1238,-32768,-32768,-32768, 7806,-32768, 292, --32768,-32768, 121, 121,-32768,-32768,-32768, 8926, 8926, 5719, - 301, 301,-32768,-32768,-32768,-32768, 7609,-32768,-32768,-32768, --32768, 121, 121,-32768,-32768,-32768,-32768, 6972,-32768,-32768, --32768,-32768,-32768,-32768, 1076,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 798, 1162, 1163, 5543,-32768,-32768,-32768, --32768, 1198, 8926, 1200,-32768, 798,-32768,-32768, 1173,-32768, --32768, 348, 761,-32768, 785, 348, 9366, 806, 172,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 5719, 5719,-32768, - 1103, 1103, 1160, 10368, 1175,-32768,-32768,-32768, 1192,-32768, - 474, 474,-32768,-32768, 1259, 6265, 8839, 8926,-32768, 7915, --32768, 1230,-32768,-32768, 500,-32768,-32768, 9801, 9801, 7154, --32768,-32768, 798,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 260, 213, 3073,-32768,-32768, 8839,-32768,-32768, 8107,-32768, - 68,-32768,-32768, 1232,-32768, 1178, 186, 4051, 10460, 7915, --32768,-32768, 1098, 53,-32768, 145,-32768, 1180, 1184, 798, - 1188, 798, 8011,-32768, 544,-32768,-32768,-32768,-32768, 348, --32768,-32768, 1098, 1292, 1241,-32768,-32768, 102,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 8926, - 1244, 7245, 798, 301, 7915, 1218, 180, 1258,-32768,-32768, --32768,-32768,-32768, 68,-32768, 1210,-32768,-32768, 1261,-32768, --32768, 1269,-32768, 8926, 1292, 1274, 1292,-32768,-32768,-32768, --32768,-32768,-32768, 1235, 229,-32768,-32768, 7336,-32768, 6972, --32768, 1328, 1293, 1246,-32768,-32768, 206,-32768,-32768, 1342, - 1301, 8011,-32768,-32768,-32768,-32768, 1363, 1364,-32768 -}; - -static const short yypgoto[] = {-32768, - 1365,-32768, -276,-32768, 990, 58, 0, 1368,-32768, 311, --32768,-32768, 315, 1048,-32768,-32768,-32768,-32768,-32768, 572, --32768, 1226, -598, 56, -594, 1240, 96,-32768,-32768,-32768, --32768,-32768, 720,-32768,-32768,-32768,-32768,-32768,-32768, 387, - 4,-32768,-32768,-32768, 5114, -9, 22, -10, 920,-32768, - 859,-32768, 90,-32768, -1232,-32768, -1277, -44,-32768, 1705, - -289, -212,-32768, -709, 3691, 211, 1091, 3239, -48, 222, - 136,-32768,-32768,-32768, -300,-32768, -142,-32768,-32768, -1136, - -28, -305, 2329, 2, 872, -122, 46, 173, -170, -4, - -136, -784, 202,-32768, -66,-32768,-32768, -201,-32768,-32768, --32768,-32768,-32768, -101, 2902, -36,-32768, 603,-32768,-32768, - -967, -385, 799,-32768,-32768,-32768,-32768,-32768, -14,-32768, --32768,-32768,-32768,-32768, 618, 3,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 1216,-32768, 386, 545,-32768,-32768,-32768, --32768, 509, -616,-32768,-32768,-32768,-32768,-32768,-32768, 755, --32768, 376, 873, 640, 926, 4194, 8, 10, -379, 1268, - 3163, -412, 6,-32768, 4530, -127, 171, 5, 3723, 1140, --32768, 4271, 1650, 1780,-32768, 4014, 2468, -186,-32768, 2035, --32768,-32768, 239, -824, -695,-32768,-32768, 337, -827, -353, --32768,-32768,-32768,-32768, -1193,-32768, -1079, -1247,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 89,-32768,-32768,-32768,-32768,-32768, 98, - -1149,-32768,-32768,-32768, -54,-32768,-32768,-32768,-32768, -1282, - 32,-32768, 35,-32768, -574, -490, 596,-32768,-32768,-32768, --32768, -352,-32768, -339, -152,-32768, 644, 342,-32768, 160, --32768, -294 -}; - - -#define YYLAST 10566 - - -static const short yytable[] = { 55, - 597, 617, 372, 36, 217, 51, 545, 364, 367, 414, - 842, 68, 831, 598, 1016, 661, 94, 554, 96, 1017, - 55, 195, 167, 557, 263, 108, 122, 124, 613, 646, - 55, 1254, 68, 1354, 36, 55, 51, 128, 132, 36, - 192, 51, 68, 431, -1, 955, 780, 68, 180, 53, - 886, 419, 422, 780, 457, 460, 428, 413, 913, 161, - 579, 35, 525, 214, 525, 220, 421, 1277, 349, 350, - 123, 525, 379, 1376, 261, 320, 856, 1136, 1137, 312, - 53, 312, 55, 225, 679, 53, 262, 488, 322, 323, - 448, 1157, 35, 354, 68, 312, 312, 35, 619, 44, - 1112, 1374, 610, 81, 328, 626, 338, 319, -2, 922, - 809, 924, 339, 1371, 1384, 357, 340, 417, 180, 347, - 121, 312, 351, 87, 857, 1397, 712, 858, 439, -301, - 44, 1292, 123, 380, 100, 44, 1429, 361, 1295, 1365, - 1018, 448, 363, 366, 55, 1387, 195, 356, 179, 161, - 51, 101, 699, 82, 195, 1444, 68, 680, 782, 611, - 810, 1385, 859, 604, 696, 192, 381, 850, 140, 1420, - 919, 397, 399, 192, 192, 1227, 54, 1113, 1394, 1352, - 161, 635, 321, 147, 1233, 1234, 102, 1235, 914, 394, - -254, 1019, 186, 187, 53, 840, 533, 54, 13, 192, - 127, -563, -301, 142, 1397, 644, 380, 54, -123, 1421, - 425, 889, 54, 650, 979, 851, 1099, 443, 852, 1125, - 225, 20, 437, 127, 148, 1257, 749, 126, 751, 752, - 23, 1257, 533, 1254, 145, 395, -254, -254, 915, 381, - 1361, 1425, 698, 1081, 44, 890, 192, -563, -563, 891, - 522, 260, -249, 853, 139, 554, 843, 214, 1084, 54, - 529, 800, 146, -563, 1450, 713, 1100, 880, 438, 1126, - 140, 140, 140, 364, 367, 1258, 419, 422, 698, 597, - 1382, 1332, 892, 154, 419, 469, 550, 312, 1426, 681, - 1442, 649, 863, 559, 422, 158, 386, 192, 881, 584, - 261, 140, 780, 813, 643, 142, 142, 142, 214, 1044, - 159, 422, 262, 387, 1451, 651, -130, 484, 38, 1048, - 152, 54, 545, 225, 159, 1423, 7, 8, 218, 561, - 780, 18, 551, 1336, 1337, 689, 142, 1443, -255, 575, - 850, 558, 388, 347, 582, 144, 209, 83, 594, 38, - 151, 1066, 585, 1068, 38, 595, 652, 365, 368, 211, - 596, 8, 9, 780, 21, 109, 110, 84, 325, 1266, - 55, 956, 1171, 14, 15, 756, 122, 124, 599, 27, - 28, 690, 68, 195, -255, -255, 533, 139, 851, 770, - 628, 852, 757, -749, 88, 89, 90, 195, 192, 192, - -252, 327, 596, 219, 109, 110, 192, 772, 639, 640, - 981, 32, 336, 111, 112, 26, 192, 111, 112, 672, - 123, 758, 1080, 1283, 55, 1288, 853, 756, 1309, 867, - 673, 760, 698, 192, 352, 771, 68, 1311, 1312, 435, - -122, 761, -249, 913, 757, 26, 85, 91, 92, 93, - 893, 312, 126, 773, 312, 762, 111, 112, 312, 704, - 704, 704, 704, 597, 369, 522, 86, 85, 957, 661, - 121, 312, -524, 758, 674, 868, 598, 260, 312, 461, - 462, 968, 312, 969, 1010, 436, 667, 86, 613, 721, - 14, 15, 160, 470, 1012, -360, 894, 554, 471, 687, - 874, 472, 876, 557, 482, 370, 85, 882, 485, 266, - 780, 1275, 419, 479, 312, 261, 524, 1014, -524, 160, - 1345, 993, -7, 126, -360, 593, 86, 262, -360, 159, - 1011, 780, 594, 448, 1062, -134, 140, 140, 140, 628, - 1013, 774, 776, -558, 596, 688, 1007, 54, -524, 378, - 873, 596, 1402, 225, 883, 7, 342, 343, 1074, 1077, - 1412, 85, 822, 1015, 826, 827, 1346, 593, 561, 109, - 110, 142, 142, 142, -360, 88, 103, 104, 918, 192, - 390, 86, 488, 1089, 88, 103, 104, 180, 271, 815, - 1399, 214, 391, 21, -524, 409, 840, 432, 828, 827, - 884, 54, 887, 888, 26, 444, 26, 788, 27, 28, - 445, 916, 533, 192, 447, 483, 193, 194, 721, 26, - 446, 111, 112, 365, 368, 454, 661, 594, 105, 106, - 107, 284, 1077, 285, 192, 534, 1400, 105, 106, 596, - 32, 1121, 1123, 83, 899, 535, 1127, 1128, 7, 342, - 343, -120, 699, 789, 790, 536, 816, 672, 537, 538, - 463, 1273, 55, 84, 672, 672, 407, 408, 673, 180, - 55, 525, 817, 464, 68, 85, 673, 479, 1398, 594, - 479, 594, 68, -121, 470, 471, 21, 1167, 465, 192, - 1411, 596, 260, 596, 466, 86, 365, 709, 8, 441, - 1415, 27, 28, 467, 7, 8, 9, 566, 479, 593, - 109, 110, 674, -45, 83, 564, 593, 1428, -45, 569, - 674, 1108, 1050, 1109, 667, 1110, 1039, 1040, 1041, -45, - 415, 416, 667, 32, 84, 567, 1439, 1255, 1256, 7, - 8, 9, 21, 1222, 83, 570, 83, 1367, 533, 704, - 111, 112, 1229, 958, 1260, 26, 571, 27, 28, 1456, - 26, 602, 111, 112, 84, 796, 84, 1388, 898, 908, - 583, 819, 1085, 1086, 442, 1088, -6, 21, 704, 509, - 510, 820, 85, 1249, 594, 1045, 1046, 605, 628, 32, - 1261, 536, 27, 28, 821, 538, 596, 622, 774, 776, - 596, 645, 86, 225, 593, 561, 88, 89, 90, 1176, - 682, 594, 575, 704, 1059, 691, 594, 641, 595, 407, - 1326, 109, 110, 596, 32, 692, 997, 998, 596, 109, - 110, 1052, 506, 507, 508, 509, 510, 1054, 1055, 54, - 708, 1052, 1057, 415, 1327, 1055, 710, 54, 711, 628, - 8, 9, 929, 930, 931, 611, 593, 26, 593, 91, - 92, 596, 1308, 704, 407, 1331, 713, 768, 769, 783, - 312, 364, 367, 111, 112, 781, 832, 8, 9, 594, - 1037, 111, 112, 88, 89, 90, 196, 197, 198, 594, - 785, 596, 364, 367, 801, 802, 220, 442, 812, 811, - 814, 596, 111, 112, 699, 219, -310, 672, 14, 15, - 1314, 818, 55, 829, 830, 380, 199, -252, 673, 796, - 833, 594, 1324, 594, 68, 847, 219, 26, 848, 834, - 835, 849, 855, 596, -748, 596, 91, 92, 200, 865, - -310, 88, 89, 90, -310, 7, 109, 110, 1076, 1142, - 1143, 869, 1152, 1153, 870, 1155, 140, 872, 330, 334, - 875, 593, 674, 879, 917, 593, 836, 8, 9, 932, - 937, 933, 934, 935, 667, 936, 964, -310, 938, 1314, - 939, 940, -119, 21, 201, 202, 203, 941, 593, 140, - 597, 142, 942, 593, 91, 92, 594, 944, 27, 28, - 945, 470, 471, 1369, 950, 947, 1102, 1103, 596, 948, - 109, 110, 963, 365, 709, 966, 1392, 628, 1314, 111, - 112, 1076, 219, 949, 142, 951, 593, 1102, 1103, 596, - 32, 952, 953, 965, 613, 109, 1154, 967, 1225, 1226, - 972, 1132, 139, 442, 974, 973, 443, 988, 982, 1314, - 672, 699, 980, 983, 1445, 55, 593, 985, 991, 1009, - 26, 673, 111, 112, 994, 1027, 593, 68, 1034, -311, - 1049, 14, 15, 109, 110, 1024, 449, 439, 88, 103, - 104, 1053, 1058, 1231, 1232, 1063, 450, 111, 112, 54, - 1064, 1069, 8, 9, 119, 11, 12, 1078, 593, 624, - 593, 13, 1070, -311, 1071, 674, 1072, -311, 1082, 1087, - 1210, 442, 8, 9, 1205, 1183, 16, 667, 17, 18, - 704, 1083, 68, 26, 20, 111, 112, 1091, 1300, 1301, - 1302, 105, 106, 23, 140, 140, 140, 1092, 654, 760, - -311, 1093, 26, 1096, 111, 112, 1098, 1097, 1101, 761, - 477, 1106, 1120, 656, 1169, 140, 140, 140, 1130, 1131, - 1209, 1135, 26, 762, 111, 112, 387, 1139, 1161, 142, - 142, 142, 1204, 593, 302, 1090, 302, 1162, 1172, 1282, - 1173, 1282, 1364, 1177, -520, 625, 448, -520, 1178, 1179, - 142, 142, 142, 1180, 593, 192, 1334, 1335, 1112, 1210, - 364, 367, 1220, 1274, 180, 1228, 1210, 1244, 1245, 1246, - 1205, 68, 1247, 1210, 1252, 1259, 302, 1205, 68, 417, - 1268, 365, 368, 785, 591, 68, -99, 1250, 14, 15, - 470, 471, 54, 186, 187, -520, 1278, -520, -520, 13, - -520, 1269, 365, 1119, 1270, 7, 8, 9, 1280, 1209, - 621, -520, 1293, -520, 1316, 1317, 1209, 1321, 1310, 1323, - -99, 1204, 20, 1209, -99, 1325, 591, 1338, 1204, -520, - -520, 23, 1340, -520, 1350, 1204, 504, 505, 506, 507, - 508, 509, 510, 21, 1343, -520, 1379, 54, 1390, 1362, - 871, 1378, 1391, 7, 8, 9, 1393, -99, 27, 28, - 1410, 1406, 1422, 1417, 88, 103, 104, 572, 573, 574, - 1424, 1210, 1357, 1404, 477, 1210, 1427, 477, 1430, 1205, - 1431, 701, 219, 68, 262, 312, 921, 68, 923, 1380, - 32, 21, 1433, 1436, 477, 639, 640, 1446, 594, 109, - 110, 1357, 192, 1441, 1210, 477, 27, 28, 1205, 728, - 596, 1453, 1448, 262, 1449, 1210, 68, 105, 106, 1205, - 1454, 1209, 1458, 1459, 1, 1209, 607, 68, 1210, 5, - 442, 468, 1205, 1204, 376, 750, 54, 1204, 32, 115, - 68, 767, -97, 54, 14, 15, 581, 995, 377, 26, - 54, 111, 112, 909, 1209, 1107, 1366, 1357, 14, 15, - 1210, 1348, 714, -360, 1205, 1209, 1204, 1455, 591, 262, - 1285, 990, 68, 846, 482, 591, -97, 1204, 1209, -255, - -97, 989, 140, 427, 1133, 1060, 1042, 975, 911, 976, - 1204, -360, -360, 1156, -255, -255, -360, 804, 410, -255, - 526, 987, 7, 342, 343, 755, 527, 1210, 530, 1291, - 1209, 1205, 1219, -97, 1389, -255, 1435, 142, 1026, 68, - 1383, 1437, 1204, 140, 140, 140, 1221, -255, -255, 0, - -255, 0, -255, 0, 0, 0, 0, 616, 620, 0, - 21, 0, 7, 109, 110, 620, 0, 12, 54, 260, - 109, 110, 54, 26, 439, 27, 28, 1209, 142, 142, - 142, -255, -255, 591, 0, -255, 0, 0, 1024, 1204, - 0, 0, 0, 0, 0, 593, 0, -255, 260, 0, - 21, 54, 0, 185, 186, 187, 0, 528, 0, 0, - 13, 0, 54, 26, 0, 27, 28, 0, 470, 471, - 26, 0, 111, 112, 620, 54, 0, 0, 18, 30, - 365, 1119, 0, 20, 0, 591, 449, 591, 0, 31, - 109, 110, 23, 0, 12, 0, 450, 32, 1065, 0, - 1067, 0, 33, 302, 260, 0, 616, 54, 0, 725, - 726, 0, 730, 731, 732, 733, 734, 735, 736, 737, - 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, - 748, 0, 0, 533, 0, 0, 620, 0, 620, 620, - 26, 0, 111, 112, 7, 109, 110, 0, 0, 0, - 961, 1095, 0, 0, 54, 0, 534, 0, 0, 0, - 0, 511, 0, 0, 620, 0, 535, 0, 0, 0, - 0, 620, 0, 0, 0, 0, 536, 0, 0, 537, - 538, 477, 21, 75, 0, 0, 0, 806, 808, 0, - 591, 0, 97, 0, 591, 0, 0, 27, 28, 0, - 512, 513, 113, 117, 75, 514, 515, 516, 517, 130, - 130, 0, 130, 0, 75, 0, 1134, 591, 0, 75, - 1138, 6, 591, 7, 8, 9, 10, 11, 12, 32, - 174, 0, 75, 13, 0, 616, 0, 0, 0, 0, - 207, 0, 0, 0, 0, 0, 0, 97, 16, 0, - 17, 18, 0, 0, 0, 591, 20, 227, 97, 0, - 0, 21, 0, 1035, 0, 23, 75, 1174, 375, 0, - 0, 0, 0, 0, 26, 0, 27, 28, 97, 0, - 29, 0, 0, 0, 0, 591, 885, 0, 0, 0, - 30, 0, 0, 341, 117, 591, 0, 117, 0, 0, - 31, 174, 97, 207, 0, 0, 0, 130, 32, 0, - 359, 130, 0, 33, 130, 130, 130, 0, 620, 0, - 0, 0, 7, 8, 9, 0, 0, 591, 75, 591, - 0, 0, 1240, 1241, 0, 0, 0, 0, 0, 0, - 943, 0, 0, 174, 174, 174, 0, 0, 1251, 0, - 0, 0, 0, 0, 0, 0, 418, 186, 187, 0, - 21, 0, 0, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 174, 26, 0, 27, 28, 616, 620, 163, - 0, 18, 0, 0, 223, 0, 20, 0, 0, 164, - 0, 620, 0, 620, 97, 23, 1296, 1297, 0, 165, - 0, 0, 591, 130, 0, 0, 223, 32, 0, 0, - 477, 0, 166, 0, 0, 1306, 1307, 0, 0, 0, - 0, 986, 223, 591, 0, 0, 223, 0, 0, 0, - 0, 620, 0, 0, 0, 0, 0, 0, 0, 223, - 0, 97, 451, 7, 8, 9, 185, 186, 187, 1006, - 0, 0, 0, 13, 0, 0, 620, 1163, 1164, 1165, - 1166, 0, 0, 0, 0, 0, 0, 0, 1170, 0, - 0, 18, 0, 0, 620, 0, 20, 0, 0, 0, - 0, 21, 0, 223, 97, 23, 0, 533, 531, 0, - 451, 451, 547, 0, 26, 0, 27, 28, 0, 0, - 0, 174, 207, 0, 0, 0, 0, 0, 0, 0, - 819, 0, 0, 0, 0, 0, 223, 1051, 117, 0, - 820, 552, 8, 9, 0, 0, 0, 117, 32, 0, - 536, 0, 97, 821, 538, 0, 223, 0, 0, 0, - 616, 0, 130, 0, 0, 130, 0, 0, 0, 0, - 130, 0, 0, 0, 75, 0, 271, 553, 0, 21, - 0, 0, 0, 0, 616, 616, 0, 0, 1079, 0, - 0, 0, 26, 0, 111, 112, 174, 0, 174, 0, - 174, 174, 174, 0, 0, 0, 174, 1272, 0, 8, - 9, 174, 11, 213, 174, 0, 0, 0, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 75, 0, - 0, 0, 0, 16, 0, 17, 0, 0, 0, 0, - 0, 20, 618, 0, 0, 0, 223, 0, 0, 618, - 23, 620, 533, 620, 0, 620, 0, 0, 616, 26, - 0, 111, 112, 97, 97, 97, 97, 616, 616, 0, - 223, 0, 616, 616, 0, 534, 0, 0, 0, 0, - 0, 1322, 0, 0, 0, 535, 0, 0, 223, 1140, - 1141, 7, 8, 9, 0, 536, 12, 0, 537, 538, - 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, - 0, 0, 0, 616, 0, 1168, 0, 0, 0, 97, - 0, 451, 0, 0, 728, 1355, 0, 0, 0, 21, - 0, 531, 0, 451, 451, 533, 547, 0, 477, 620, - 0, 0, 26, 797, 27, 28, 0, 799, 0, 0, - 0, 0, 0, 0, 1355, 0, 0, 0, 819, 0, - 0, 0, 0, 0, 591, 0, 0, 0, 820, 616, - 618, 0, 618, 618, 0, 0, 32, 0, 536, 0, - 223, 821, 538, 0, 0, 113, 1230, 0, 0, 0, - 174, 797, 174, 174, 207, 547, 0, 0, 618, 0, - 0, 0, 0, 0, 0, 618, 0, 0, 1416, 616, - 1355, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 174, 0, 0, - 0, 797, 1434, 0, 0, 1267, 0, 0, 174, 174, - 0, 174, 0, 0, 0, 0, 728, 0, 109, 110, - 0, 186, 187, 0, 0, 877, 0, 13, 8, 9, - 223, 11, 12, 117, 0, 0, 75, 13, 1298, 1299, - 0, 0, 906, 75, 75, 0, 223, 1304, 0, 0, - 20, 0, 16, 97, 17, 97, 0, 0, 616, 23, - 20, 533, 451, 451, 451, 542, 546, 549, 26, 23, - 111, 112, 0, 451, 0, 0, 0, 0, 26, 0, - 111, 112, 518, 0, 534, 0, 7, 8, 9, 0, - 0, 213, 0, 0, 535, 0, 0, 620, 0, 0, - 0, 0, 0, 0, 536, 0, 0, 544, 538, 0, - 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, - 0, 0, 618, 97, 21, 0, 0, 0, 1359, 0, - 533, 0, 310, 0, 310, 0, 0, 26, 0, 27, - 28, 0, 0, 451, 0, 451, 0, 0, 333, 335, - 0, 0, 97, 819, 0, 0, 451, 0, 97, 0, - 797, 797, 797, 820, 0, 0, 0, 984, 0, 0, - 0, 32, 0, 536, 310, 0, 821, 538, 0, 0, - 0, 0, 618, 0, 0, 97, 0, 97, 174, 174, - 1003, 78, 7, 8, 9, 618, 0, 618, 0, 0, - 99, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 114, 118, 78, 0, 7, 8, 9, 131, 131, 12, - 131, 0, 78, 1003, 0, 0, 0, 78, 0, 0, - 21, 0, 0, 0, 0, 618, 0, 97, 131, 0, - 78, 0, 0, 26, 0, 27, 28, 1038, 0, 1281, - 616, 97, 21, 97, 0, 215, 0, 0, 533, 164, - 618, 0, 0, 97, 0, 26, 215, 27, 28, 165, - 0, 0, 0, 0, 78, 0, 1056, 32, 618, 0, - 0, 999, 166, 0, 0, 0, 75, 0, 775, 777, - 0, 1000, 0, 0, 0, 97, 223, 97, 223, 32, - 0, 536, 348, 0, 1001, 538, 0, 0, 0, 131, - 215, 0, 0, 0, 0, 131, 0, 0, 0, 131, - 0, 0, 131, 131, 131, 0, 0, 0, 451, 451, - 0, 451, 0, 7, 8, 9, 78, 0, 439, 0, - 481, 0, 0, 0, 0, 824, 0, 542, 546, 0, - 549, 131, 131, 131, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 174, 174, 174, 174, - 1003, 21, 0, 0, 174, 0, 223, 533, 0, 0, - 131, 0, 546, 0, 26, 0, 27, 28, 0, 1003, - 1003, 1003, 7, 109, 110, 0, 0, 213, 0, 0, - 819, 590, 0, 0, 0, 223, 0, 0, 97, 0, - 820, 131, 8, 9, 0, 11, 12, 0, 32, 0, - 536, 13, 174, 821, 538, 0, 0, 130, 0, 75, - 21, 0, 0, 0, 0, 618, 16, 618, 17, 618, - 0, 0, 0, 26, 20, 27, 28, 0, 0, 215, - 131, 0, 0, 23, 0, 0, 0, 0, 546, 30, - 0, 0, 26, 0, 111, 112, 0, 0, 0, 31, - 0, 174, 174, 0, 174, 0, 0, 32, 0, 0, - 0, 0, 33, 223, 0, 0, 0, 0, 0, 0, - 0, 0, 215, 0, 97, 0, 532, 0, 131, 131, - 548, 754, 223, 0, 697, 556, 0, 700, 0, 131, - 0, 702, 703, 705, 706, 707, 0, 0, 0, 0, - 0, 0, 0, 618, 481, 0, 348, 0, 970, 0, - 971, 310, 0, 0, 0, 724, 0, 223, 0, 0, - 215, 977, 7, 109, 110, 775, 777, 12, 0, 0, - 131, 0, 0, 131, 0, 223, 0, 0, 131, 0, - 0, 0, 78, 0, 0, 0, 0, 753, 0, 0, - 0, 0, 0, 775, 777, 0, 0, 174, 797, 174, - 21, 0, 0, 0, 131, 778, 131, 0, 131, 131, - 131, 0, 778, 26, 131, 27, 28, 0, 0, 131, - 0, 0, 131, 0, 0, 0, 0, 0, 0, 135, - 0, 0, 0, 0, 0, 215, 78, 0, 0, 136, - 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 137, 7, 8, 9, 0, 0, 12, 0, - 8, 9, 119, 11, 12, 0, 0, 624, 0, 13, - 0, 215, 215, 215, 215, 0, 1003, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 17, 18, 0, 0, - 0, 21, 20, 0, 183, 0, 191, 0, 0, 0, - 590, 23, 0, 533, 26, 0, 27, 28, 0, 0, - 26, 0, 111, 112, 0, 0, 0, 1003, 1003, 1003, - 164, 0, 0, 0, 0, 0, 534, 215, 0, 131, - 165, 618, 97, 0, 0, 0, 535, 0, 32, 0, - 0, 131, 131, 166, 548, 0, 536, 174, 0, 537, - 538, 798, 0, 625, 0, 0, 8, 9, 176, 11, - 177, 0, 0, 556, 183, 13, 0, 0, 0, 0, - 0, 970, 971, 775, 777, 0, 0, 0, 0, 977, - 16, 0, 17, 18, 0, 0, 0, 0, 20, 0, - 0, 0, 0, 114, 775, 777, 0, 23, 131, 548, - 131, 131, 0, 548, 0, 0, 26, 0, 111, 112, - 0, 0, 8, 9, 653, 215, 8, 9, 119, 11, - 12, 191, 954, 1368, 0, 13, 0, 0, 0, 420, - 191, 0, 0, 0, 0, 131, 0, 0, 654, 548, - 16, 0, 17, 18, 0, 655, 131, 131, 20, 131, - 0, 724, 0, 656, 7, 109, 110, 23, 434, 439, - 0, 778, 26, 878, 111, 112, 26, 0, 111, 112, - 0, 118, 0, 0, 78, 0, 970, 971, 0, 977, - 907, 78, 78, 0, 590, 0, 996, 0, 0, 778, - 0, 215, 21, 215, 0, 0, 0, 0, 0, 0, - 131, 131, 131, 0, 0, 26, 0, 27, 28, 0, - 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 30, 778, 0, 0, 7, 8, 9, 119, 11, - 12, 31, 0, 624, 0, 13, 1029, 0, 0, 32, - 0, 0, 0, 1036, 33, 0, 0, 0, 0, 0, - 16, 0, 17, 18, 0, 0, 0, 0, 20, 0, - 0, 215, 0, 21, 0, 0, 0, 23, 0, 533, - 0, 0, 0, 0, 0, 0, 26, 0, 27, 28, - 0, 131, 49, 131, 0, 0, 0, 0, 0, 0, - 215, 0, 999, 0, 131, 0, 215, 0, 798, 798, - 798, 0, 1000, 49, 0, 556, 0, 0, 49, 49, - 32, 138, 536, 49, 0, 1001, 538, 0, 49, 625, - 0, 0, 0, 215, 0, 215, 131, 131, 548, 49, - 0, 49, 7, 8, 9, 0, 0, 213, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, - 0, 0, 0, 221, 420, 191, 0, 0, 434, 0, - 0, 798, 420, 0, 0, 49, 398, 400, 404, 778, - 21, 0, 0, 0, 0, 215, 0, 0, 895, 896, - 9, 0, 0, 26, 0, 27, 28, 0, 0, 215, - 778, 215, 0, 345, 0, 345, 345, 0, 0, 164, - 49, 215, 0, 0, 0, 0, 49, 0, 221, 165, - 49, 0, 0, 138, 138, 138, 21, 32, 0, 0, - 0, 0, 166, 0, 78, 0, 0, 49, 0, 26, - 0, 27, 28, 215, 0, 215, 0, 897, 0, 0, - 0, 0, 49, 49, 138, 164, 7, 8, 9, 185, - 186, 187, 221, 0, 0, 165, 13, 0, 0, 0, - 0, 0, 0, 32, 0, 0, 131, 131, 166, 131, - 0, 49, 109, 110, 18, 0, 213, 0, 0, 20, - 0, 0, 0, 0, 21, 0, 0, 0, 23, 0, - 533, 0, 0, 1029, 0, 0, 0, 26, 0, 27, - 28, 0, 49, 0, 131, 131, 131, 131, 548, 0, - 0, 0, 131, 164, 0, 533, 215, 0, 0, 0, - 0, 0, 26, 165, 111, 112, 0, 798, 798, 798, - 0, 32, 0, 183, 0, 191, 1287, 0, 534, 0, - 0, 0, 0, 0, 0, 0, 215, 0, 535, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 536, 0, - 131, 537, 538, 0, 0, 131, 0, 78, 0, 191, - 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 9, 0, 0, 12, 0, 345, 0, 0, - 420, 0, 0, 434, 0, 221, 0, 0, 0, 637, - 49, 638, 0, 398, 400, 404, 0, 0, 0, 131, - 131, 0, 131, 0, 648, 183, 0, 345, 21, 0, - 0, 434, 0, 0, 0, 0, 345, 0, 0, 0, - 0, 26, 215, 27, 28, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 49, 0, 0, 401, 0, 49, - 0, 0, 0, 49, 0, 0, 0, 402, 0, -332, - 8, 9, -332, 11, 213, 32, 0, 0, 0, 13, - 403, 7, 8, 9, 0, 49, 439, 49, 0, 138, - 138, 138, 0, 0, 16, 49, 17, -332, 0, 0, - 49, 0, 20, 49, 0, 0, 0, -332, 481, 0, - 0, 23, 0, 533, 0, 0, 0, 49, 0, 21, - 26, 590, 111, 112, 0, 131, 548, 131, 0, 0, - 0, 0, 26, 0, 27, 28, 534, 0, 0, 1144, - 1145, 9, 0, 0, 478, 0, 535, 478, 164, 0, - 0, 0, 0, 0, -332, 0, 536, 0, 165, 537, - 538, 0, 478, 478, 478, 0, 32, 0, 0, 0, - 0, 166, 0, 0, 0, 478, 73, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 27, 28, 0, 0, 0, 73, 1146, 0, - 0, 0, 73, 73, 798, 73, 164, 73, 0, 0, - 0, 0, 73, 0, 0, 0, 165, 0, 0, 221, - 7, 109, 110, 73, 32, 73, 0, 0, 0, 166, - 0, 0, 478, 0, 0, 0, 0, 0, 434, 434, - 0, 0, 0, 0, 0, 798, 798, 798, 0, 0, - 0, 637, 638, 0, 648, 0, 0, 0, 21, 73, - 215, 0, 0, 0, 0, 0, 0, 434, 0, 0, - 0, 26, 0, 27, 28, 131, 0, 0, 0, 49, - 49, 49, 49, 0, 0, 904, 0, 135, 0, 0, - 0, 0, 109, 110, 73, 186, 187, 136, 109, 110, - 73, 13, 439, 0, 73, 32, 0, 73, 73, 73, - 137, 0, 0, 0, 0, 0, 49, 0, 0, 0, - 49, 73, 0, 0, 20, 0, 0, 49, 49, 0, - 49, 0, 0, 23, 0, 533, 73, 73, 73, 0, - 0, 533, 26, 0, 111, 112, 0, 0, 26, 0, - 111, 112, 0, 0, 0, 49, 0, 0, 534, 0, - 0, 49, 49, 49, 534, 73, 0, 0, 535, 0, - 0, 1144, 109, 110, 535, 0, 0, 0, 536, 0, - 0, 537, 538, 0, 536, 0, 478, 537, 538, 0, - 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, - 0, 0, 434, 434, 0, 434, 434, 0, 434, 21, - 0, 0, 0, 0, 662, 0, 7, 8, 663, 119, - 11, 12, 26, 0, 27, 28, 13, 0, 0, 0, - 1146, 398, 400, 404, 0, 0, 0, 0, 30, 0, - 0, 16, 0, 17, 18, 19, 0, 0, 31, 20, - -469, 539, 539, 539, 21, 0, 32, 0, 23, 664, - 0, 33, 0, 0, 0, 0, 404, 26, 0, 27, - 28, 0, 0, 665, 0, 666, 0, 0, 0, 478, - 478, 478, 0, 30, 0, 221, 0, 0, 0, 0, - 555, 434, 434, 31, 73, 0, 143, 0, 0, 0, - 0, 32, 0, 7, 8, 9, 33, 49, 49, 138, - 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, - 0, 0, 0, -469, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 73, 0, 0, 73, 0, - 0, 21, 1023, 73, 0, 0, 0, 73, 0, 0, - 0, 0, 0, 0, 26, 0, 27, 28, 0, 0, - 183, 191, 0, 0, 0, 0, 0, 0, 0, 73, - 164, 73, 0, 73, 73, 73, 0, 0, 0, 73, - 165, 434, 434, 434, 73, 175, 0, 73, 32, 0, - 0, 0, 0, 166, 221, 0, 0, 0, 143, 143, - 143, 73, 0, 0, 0, 49, 0, 0, 0, 637, - 638, 398, 400, 404, 0, 0, 0, 648, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 175, 175, 405, - 0, 0, 398, 400, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 8, 9, 0, 434, - 434, 0, 0, 0, 0, 0, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 1150, 0, 0, 0, 0, - 0, 0, 221, 0, 539, 539, 0, 539, 0, 0, - 0, 0, 0, 21, 795, 49, 49, 138, 138, 138, - 0, 221, 0, 49, 0, 0, 26, 0, 27, 28, - 0, 0, 0, 0, 555, 0, 0, 0, 1023, 1023, - 1023, 0, 401, 0, 637, 638, 0, 648, 0, 0, - 224, 0, 402, 0, 0, 0, 452, 0, 0, 0, - 32, 539, 0, 539, 539, 403, 539, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 49, 0, 49, 0, - 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, - 0, 0, 0, 73, 73, 73, 73, 0, 539, 0, - 0, 173, 0, 0, 541, 541, 541, 0, 0, 0, - 841, 0, 0, 0, 0, 175, 371, 0, 0, 0, - 49, 49, 0, 49, 0, 222, 0, 0, 226, 0, - 73, 0, 0, 0, 73, 396, 0, 0, 0, 0, - 0, 73, 73, 0, 73, 0, 0, 222, 412, 329, - 0, 0, 0, 0, 0, 0, 0, 8, 9, 119, - 11, 12, 0, 0, 0, 0, 13, 0, 0, 73, - 0, 0, 173, 0, 539, 73, 73, 73, 0, 0, - 0, 16, 0, 17, 18, 0, 0, 0, 0, 20, - 175, 0, 175, 0, 405, 405, 405, 0, 586, 0, - 175, 0, 0, 0, 0, 175, 0, 26, 175, 111, - 112, 0, 0, 0, 173, 173, 173, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 49, 49, 49, 404, - 0, 0, 8, 9, 0, 11, 213, 0, 0, 0, - 0, 13, 0, 173, 539, 0, 539, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 539, 17, 0, - 0, 795, 795, 795, 20, 226, 0, 0, 0, 0, - 398, 400, 404, 23, 0, 0, 0, 222, 0, 0, - 0, 0, 26, 0, 111, 112, 0, 0, 0, 539, - 539, 539, 0, 0, 0, 0, 0, 0, 0, 0, - 555, 0, 0, 0, 0, 1023, 0, 0, 0, 0, - 0, 0, 0, 71, 0, 763, 0, 0, 0, 0, - 0, 73, 73, 73, 795, 0, 0, 541, 541, 0, - 541, 0, 0, 0, 125, 0, 0, 541, 0, 129, - 133, 0, 0, 0, 71, 0, 1023, 1023, 1023, 71, - 0, 0, 0, 0, 0, 0, 1025, 0, 0, 0, - 0, 0, 184, 0, 0, 0, 0, 222, 226, 0, - 0, 0, 173, 0, 0, 0, 49, 0, 642, 0, - 0, 0, 0, 647, 823, 0, 823, 823, 0, 541, - 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 683, 0, - 685, 0, 0, 0, 0, 0, 0, 0, 0, 73, - 0, 823, 693, 694, 0, 695, 0, 0, 0, 0, - 0, 0, 175, 175, 0, 175, 0, 358, 0, 0, - 0, 360, 0, 0, 0, 0, 0, 173, 0, 173, - 0, 173, 173, 173, 0, 0, 0, 173, 71, 0, - 0, 0, 173, 0, 0, 173, 175, 539, 539, 539, - 539, 539, 0, 129, 133, 539, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 452, 452, 452, 0, - 795, 795, 795, 0, 0, 0, 0, 541, 0, 73, - 73, 73, 73, 73, 0, 0, 0, 73, 0, 0, - 0, 841, 0, 786, 787, 0, 0, 0, 786, 0, - 0, 0, 1025, 1025, 1025, 0, 0, 0, 0, 0, - 0, 0, 0, 440, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 662, 0, 7, - 8, 663, 119, 11, 12, 73, 0, 0, 0, 13, - 73, 0, 73, 0, 0, 0, 0, 541, 0, 541, - 0, 0, 539, 539, 16, 539, 17, 18, 19, 0, - 541, 0, 20, -470, 541, 541, 541, 21, 0, 0, - 0, 23, 664, 0, 0, 0, 0, 222, 226, 0, - 26, 0, 27, 28, 73, 73, 665, 73, 666, 0, - 0, 0, 823, 823, 1004, 0, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 8, - 9, 0, 11, 12, 32, 0, 0, 0, 13, 33, - 0, 173, 0, 173, 173, 0, 0, 1004, 0, 0, - 0, 0, 0, 16, 0, 17, -470, 0, 0, 0, - 925, 20, 927, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 600, 0, 0, 601, 0, 0, 173, 26, - 603, 111, 112, 0, 125, 0, 0, 0, 0, 173, - 173, 0, 173, 0, 0, 662, 0, 7, 8, 663, - 119, 11, 12, 0, 0, 0, 358, 13, 360, 0, - 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, - 0, 440, 16, 173, 17, 18, 19, 0, 0, 0, - 20, -472, 0, 959, 960, 21, 962, 0, 678, 23, - 664, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 27, 28, 763, 763, 665, 763, 666, 0, 0, 0, - 0, 978, 0, 0, 30, 0, 0, 7, 8, 9, - 185, 186, 187, 0, 31, 0, 0, 13, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 33, 0, 1025, - 823, 823, 1004, 1004, 1004, 18, 1005, 0, 823, 0, - 20, 0, 0, 0, -472, 21, 0, 0, 0, 23, - 0, 533, 0, 1004, 1004, 1004, 0, 0, 26, 0, - 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 1025, 1025, 1025, 0, 819, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 820, 0, 175, 222, 226, 222, - 0, 0, 32, 0, 536, 0, 1043, 854, 538, 0, - 73, 0, 0, 0, 0, 0, 1047, 0, 0, 173, - 173, 1002, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 9, 176, 11, 177, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 823, 823, 0, 823, 0, - 0, 825, 0, 0, 1002, 16, 95, 17, 18, 0, - 0, 0, 0, 20, 0, 0, 95, 95, 21, 0, - 0, 0, 23, 95, 95, 0, 95, 0, 0, 0, - 0, 26, 0, 27, 28, 0, 0, 178, 0, 0, - 0, 861, 0, 0, 0, 0, 1094, 30, 600, 601, - 0, 603, 0, 0, 206, 0, 411, 31, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 678, 1105, 0, 0, - 0, 0, 905, 912, 678, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 0, 175, 0, 175, 0, 0, 95, 95, 95, 0, - 95, 95, 0, 0, 0, 0, 0, 355, 0, 0, - 0, 95, 0, 95, 95, 95, 0, 0, 95, 95, - 95, 0, 0, 0, 222, 0, 1159, 1160, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, - 173, 1002, 0, 1104, 0, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1175, - 1002, 1002, 1002, 0, 0, 0, 0, 0, 0, 0, - 405, 493, 494, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 0, - 426, 0, 0, 173, 0, 0, 0, 0, 1223, 0, - 0, 0, 1224, 0, 0, 0, 0, 95, 0, 0, - 0, 405, 405, 405, 0, 0, 0, 0, 129, 133, - 0, 0, 0, 0, 1242, 1243, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 0, 175, 173, 173, 0, 173, 95, 0, 0, 623, - 0, 7, 8, 9, 119, 11, 264, 265, 266, 624, - 267, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 268, 17, 18, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 95, 23, 95, 95, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, 560, 0, 0, 281, - 0, 0, 0, 0, 0, 282, 678, 0, 283, 0, - 0, 0, 95, 0, 95, 0, 286, 287, 288, 0, - 0, 95, 0, 0, 289, 290, 291, 0, 0, 0, - 0, 292, 95, 0, 0, 625, 95, 0, 173, 95, - 173, 0, 0, 0, 95, 0, 0, -716, 0, 293, - 0, 0, 0, 662, 0, 7, 8, 663, 119, 11, - 12, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 17, 18, 19, 0, 358, 360, 20, -471, - 0, 0, 0, 21, 440, 0, 0, 23, 664, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 27, 28, - 0, 0, 665, 1318, 666, 0, 0, 1002, 0, 0, - 0, 0, 30, 0, 95, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 1151, 0, 0, 33, 0, 1151, 0, 678, - 0, 0, 0, 0, 0, 0, 0, 0, 1002, 1002, - 1002, 0, -471, 0, 1319, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 0, 173, 0, - 0, 600, 601, 0, 603, 95, 0, 0, 0, 0, - 0, 0, 0, 0, 95, 95, 0, 95, 95, 0, - 0, 0, 0, 0, 1236, 0, -427, -427, -427, -427, - -427, -427, 0, 0, -427, 0, -427, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -427, 0, -427, - -427, 0, 0, 0, -427, 0, 0, 0, 0, -427, - 0, 0, 0, 0, -427, 0, 0, 0, -427, 95, - -427, 0, 0, 0, 0, 0, 0, -427, 206, -427, - -427, -427, -427, -427, 0, -427, -427, -427, -427, -427, - -427, -427, -427, -427, -427, -427, -427, -427, -427, -427, - -427, -427, -427, -427, -427, -427, -427, -427, 1286, -427, - -427, -427, 0, -427, -427, -427, -427, -427, -427, 18, - -427, -427, 0, 0, 0, 0, 1237, 0, 0, 0, - 0, -427, -427, -427, 0, -427, 0, 0, 0, 95, - 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, - 0, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 0, 0, 0, 95, 95, 95, 0, - 0, 0, 0, 0, 0, 0, 1289, 95, 1187, 1188, - 1189, 119, 11, 264, 265, 266, 0, 267, 13, 1190, - 0, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 14, 15, 16, 268, 17, 18, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 1201, 28, 611, 0, 1202, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 95, 0, 95, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 95, 289, 290, 291, 0, 0, 0, 0, 292, 0, - 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1290, 293, 1186, 0, 1187, - 1188, 1189, 119, 11, 264, 265, 266, 0, 267, 13, - 1190, 0, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1199, 1200, 14, 15, 16, 268, 17, 18, 19, 0, - 269, 270, 20, 0, 271, 272, 273, 21, 274, 275, - 0, 23, 0, 0, 0, 276, 277, 278, 279, 280, - 26, 0, 1201, 28, 611, 0, 1202, 281, 0, 0, - 95, 95, 0, 282, 0, 0, 283, 0, 0, 0, - 0, 0, 0, 0, 286, 287, 288, 0, 0, 0, - 0, 0, 289, 290, 291, 0, 0, 0, 0, 292, - 95, 1203, 0, 0, 0, 489, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 293, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 0, 0, 473, - 0, 7, 8, 9, 119, 11, 264, 265, 266, 624, - 267, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 95, 0, 95, 16, 268, 17, 18, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 0, 23, 0, 533, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, -263, 0, 0, 281, - 0, 0, 0, 0, 0, 282, 0, 0, 791, 0, - 0, 0, 0, 0, 0, 0, 286, 287, 792, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 536, 0, - 0, 793, 538, 0, 0, 625, 0, 0, 0, 0, - 0, 95, 0, 0, 0, 0, 0, 0, 0, 293, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, - 473, 95, 7, 8, 9, 119, 11, 264, 265, 266, - 624, 267, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 268, 17, - 18, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 533, 0, 276, 277, - 278, 279, 280, 26, 0, 27, 28, -263, 0, 0, - 281, 0, 0, 0, 0, 0, 282, 0, 0, 1020, - 0, 0, 0, 0, 0, 0, 0, 286, 287, 1021, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 536, - 0, 0, 1022, 538, 0, 727, 625, 7, 8, 9, - 119, 11, 264, 265, 266, 0, 267, 13, 0, 0, - 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 268, 17, 18, 19, 0, 269, 270, - 20, 0, 271, 272, 273, 21, 274, 275, 0, 23, - 0, 0, 0, 276, 277, 278, 279, 280, 26, 0, - 27, 28, 1351, 0, -706, 281, 0, 0, 0, 0, - 0, 282, 0, 0, 283, 0, 0, 0, 0, 0, - 0, 0, 286, 287, 288, 0, 0, 0, 0, 0, - 289, 290, 291, 0, 0, 0, 614, 292, 715, 716, - 717, 0, 11, 455, 265, 266, 0, 267, 13, 0, - 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, - 0, 0, 0, 16, 268, 17, 0, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 718, 719, 615, 0, 0, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 0, 0, 0, 292, 720, - 614, 0, 715, 716, 717, 0, 11, 455, 265, 266, - 0, 267, 13, 0, 0, 845, 293, 0, 0, 1075, - 0, 0, 0, 0, 0, 0, 0, 16, 268, 17, - 0, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 0, 0, 276, 277, - 278, 279, 280, 26, 0, 718, 719, 615, 0, 0, - 281, 0, 0, 0, 0, 0, 282, 0, 0, 283, - 0, 0, 0, 0, 0, 0, 0, 286, 287, 288, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 0, - 0, 0, 292, 614, 0, 715, 716, 717, 0, 11, - 455, 265, 266, 0, 267, 13, 0, 0, 0, -431, - 293, 0, 1075, 0, 0, 0, 0, 0, 0, 0, - 16, 268, 17, 0, 19, 0, 269, 270, 20, 0, - 271, 272, 273, 21, 274, 275, 0, 23, 0, 0, - 0, 276, 277, 278, 279, 280, 26, 0, 718, 719, - 615, 0, 0, 281, 0, 0, 0, 0, 0, 282, - 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, - 286, 287, 288, 0, 0, 0, 0, 0, 289, 290, - 291, 0, 0, 0, 614, 292, 715, 716, 717, 0, - 11, 455, 265, 266, 0, 267, 13, 0, 0, 0, - 0, 0, 1118, 293, 0, 0, 0, 0, 0, 0, - 0, 16, 268, 17, 0, 19, 0, 269, 270, 20, - 0, 271, 272, 273, 21, 274, 275, 0, 23, 0, - 0, 0, 276, 277, 278, 279, 280, 26, 0, 718, - 719, 615, 0, 0, 281, 0, 0, 0, 0, 0, - 282, 0, 0, 283, 0, 0, 0, 0, 0, 0, - 0, 286, 287, 288, 0, 0, 0, 0, 0, 289, - 290, 291, 0, 0, 0, 0, 292, 720, 614, 0, - 7, 8, 9, 0, 11, 455, 265, 266, 0, 267, - 13, 0, 0, 0, 293, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 268, 17, 0, 19, - 0, 269, 270, 20, 0, 271, 272, 273, 21, 274, - 275, 0, 23, 0, 0, 0, 276, 277, 278, 279, - 280, 26, 0, 27, 28, 615, 0, 0, 281, 228, - 0, 0, 8, 9, 282, 11, 12, 283, 0, 0, - 0, 13, 0, 0, 0, 286, 287, 288, 0, 0, - 0, 0, 0, 289, 290, 291, 16, 0, 17, 0, - 292, 0, 0, 0, 20, 0, 229, 230, 0, 1122, - 0, 0, 0, 23, 0, 231, 0, 0, 293, 0, - 0, 0, 26, 0, 111, 112, 0, 232, 0, 0, - 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 0, 0, 254, 255, 256, 0, 0, 257, - 0, 473, 258, 7, 8, 9, 0, 11, 264, 265, - 266, 0, 267, 13, 0, 0, 0, 0, 0, 259, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 268, - 17, 0, 19, 0, 269, 270, 20, 0, 271, 272, - 273, 21, 274, 275, 0, 23, 0, 0, 0, 276, - 277, 278, 279, 280, 26, 0, 27, 28, -263, 0, - 0, 281, 0, 0, 0, 0, 0, 282, 0, 0, - 474, 0, 0, 0, 0, 0, 0, 0, 286, 287, - 475, 0, 0, 0, 0, 0, 289, 290, 291, 0, - 0, 0, 614, 476, 7, 8, 9, 0, 11, 455, - 265, 266, 0, 267, 13, 0, 0, 0, 0, 0, - 0, 293, 0, 0, 0, 0, 0, 0, 0, 16, - 268, 17, 0, 19, 0, 269, 270, 20, 0, 271, - 272, 273, 21, 274, 275, 0, 23, 0, 0, 0, - 276, 277, 278, 279, 280, 26, 0, 27, 28, 615, - 0, 0, 281, 0, 0, 0, 0, 0, 282, 0, - 0, 283, 0, 0, 0, 0, 0, 0, 0, 286, - 287, 288, 0, 0, 0, 0, 0, 289, 290, 291, - 0, 0, 0, 727, 292, 7, 8, 9, 0, 11, - 455, 265, 266, 0, 267, 13, 0, 0, 0, 0, - 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, - 16, 268, 17, 0, 19, 0, 269, 270, 20, 0, - 271, 272, 273, 21, 274, 275, 0, 23, 0, 0, - 0, 276, 277, 278, 279, 280, 26, 0, 27, 28, - 0, 0, 0, 281, -706, 0, 0, 0, 0, 282, - 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, - 286, 287, 288, 0, 0, 0, 0, 0, 289, 290, - 291, 0, 0, 0, 473, 292, 7, 8, 9, 0, - 11, 264, 265, 266, 0, 267, 13, 0, 0, 0, - 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, - 0, 16, 268, 17, 0, 19, 0, 269, 270, 20, - 0, 271, 272, 273, 21, 274, 275, 0, 23, 0, - 0, 0, 276, 277, 278, 279, 280, 26, 0, 27, - 28, -263, 0, 0, 281, 0, 0, 0, 0, 0, - 282, 0, 0, 1328, 0, 0, 0, 0, 0, 0, - 0, 286, 287, 1329, 0, 0, 0, 0, 0, 289, - 290, 291, 0, 0, 0, 1418, 1330, 7, 8, 9, - 0, 11, 264, 265, 266, 0, 267, 13, 0, 0, - 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, - 0, 0, 16, 268, 17, 0, 19, 0, 269, 270, - 20, 0, 271, 272, 273, 21, 274, 275, 0, 23, - 0, 0, 0, 276, 277, 278, 279, 280, 26, 0, - 27, 28, 0, 0, -162, 281, 0, 0, 0, 0, - 0, 282, 0, 0, 283, 0, 0, 0, 0, 0, - 0, 0, 286, 287, 288, 0, 0, 0, 0, 0, - 289, 290, 291, 0, 0, 0, 727, 292, 7, 8, - 9, 0, 11, 455, 265, 266, 0, 267, 13, 0, - 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, - 0, 0, 0, 16, 268, 17, 0, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 27, 28, 0, 0, 0, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 0, 0, 805, 292, 7, - 8, 9, 0, 11, 455, 265, 266, 0, 267, 13, - 0, 0, 0, 0, -706, 0, 293, 0, 0, 0, - 0, 0, 0, 0, 16, 268, 17, 0, 19, 0, - 269, 270, 20, 0, 271, 272, 273, 21, 274, 275, - 0, 23, 0, 0, 0, 276, 277, 278, 279, 280, - 26, 0, 27, 28, 0, 0, 0, 281, 0, 0, - 0, 0, 0, 282, 0, 0, 283, 0, 0, 0, - 0, 0, 0, 0, 286, 287, 288, 0, 0, 0, - 0, 0, 289, 290, 291, 0, 0, 0, 807, 292, - 7, 8, 9, 0, 11, 455, 265, 266, 0, 267, - 13, 0, 0, 0, 0, 0, 0, 293, 0, 0, - 0, 0, 0, 0, 0, 16, 268, 17, 0, 19, - 0, 269, 270, 20, 0, 271, 272, 273, 21, 274, - 275, 0, 23, 0, 0, 0, 276, 277, 278, 279, - 280, 26, 0, 27, 28, 0, 0, 0, 281, 0, - 0, 0, 0, 0, 282, 0, 0, 283, 0, 0, - 0, 0, 0, 0, 0, 286, 287, 288, 0, 0, - 0, 0, 0, 289, 290, 291, 0, 0, 0, 1303, - 292, 7, 8, 9, 0, 11, 455, 265, 266, 0, - 267, 13, 0, 0, 0, 0, 0, 0, 293, 0, - 0, 0, 0, 0, 0, 0, 16, 268, 17, 0, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 0, 23, 0, 0, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, 0, 0, 0, 281, - 0, 0, 0, 0, 0, 282, 0, 0, 283, 0, - 0, 0, 0, 0, 0, 0, 286, 287, 288, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 7, 8, - 9, 292, 11, 455, 265, 266, 0, 267, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, - 0, 0, 0, 16, 268, 17, 0, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 27, 28, 0, 0, 0, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 0, 0, 0, 292, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 293, 766, 1187, 1188, - 1189, 119, 11, 264, 265, 266, 0, 267, 13, 1190, - 0, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 14, 15, 16, 268, 17, 18, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 1201, 28, 611, 0, 1202, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 0, 0, 0, 292, 0, - 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1294, 293, 1187, 1188, 1189, - 119, 11, 264, 265, 266, 0, 267, 13, 1190, 0, - 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, - 14, 15, 16, 268, 17, 18, 19, 0, 269, 270, - 20, 0, 271, 272, 273, 21, 274, 275, 0, 23, - 0, 0, 0, 276, 277, 278, 279, 280, 26, 0, - 1201, 28, 611, 0, 1202, 281, 0, 0, 0, 0, - 0, 282, 0, 0, 283, 0, 0, 0, 0, 0, - 0, 0, 286, 287, 288, 0, 0, 0, 0, 0, - 289, 290, 291, 0, 0, 0, 0, 292, 0, 1203, - 0, 0, 0, 1187, 1188, 1189, 119, 11, 264, 265, - 266, 0, 267, 13, 1190, 293, 1191, 1192, 1193, 1194, - 1195, 1196, 1197, 1198, 1199, 1200, 14, 15, 16, 268, - 17, 18, 19, 0, 269, 270, 20, 0, 271, 272, - 273, 21, 274, 275, 0, 23, 0, 0, 0, 276, - 277, 278, 279, 280, 26, 0, 1201, 28, 1395, 0, - 1202, 281, 0, 0, 0, 0, 0, 282, 0, 0, - 283, 0, 0, 0, 0, 0, 0, 0, 286, 287, - 288, 0, 0, 0, 0, 0, 289, 290, 291, 0, - 0, 0, 0, 292, 0, 1203, 0, 0, 0, 1187, - 1188, 1189, 119, 11, 264, 265, 266, 0, 267, 13, - 1190, 293, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1199, 1200, 14, 15, 16, 268, 17, 18, 19, 0, - 269, 270, 20, 0, 271, 272, 273, 21, 274, 275, - 0, 23, 0, 0, 0, 276, 277, 278, 279, 280, - 26, 0, 1201, 28, 0, 0, 1202, 281, 0, 0, - 0, 0, 0, 282, 0, 0, 283, 0, 0, 0, - 0, 0, 0, 0, 286, 287, 288, 0, 0, 0, - 0, 0, 289, 290, 291, 0, 0, 0, 0, 292, - 0, 1203, 7, 8, 9, 119, 11, 264, 265, 266, - 624, 267, 13, 0, 0, 0, 0, 293, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 268, 17, - 18, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 533, 0, 276, 277, - 278, 279, 280, 26, 0, 27, 28, 0, 0, 0, - 281, 0, 0, 0, 0, 0, 282, 0, 0, 791, - 0, 0, 0, 0, 0, 0, 0, 286, 287, 792, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 536, - 0, 0, 793, 538, 0, 0, 625, 7, 8, 9, - 119, 11, 264, 265, 266, 624, 267, 13, 0, 0, - 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 268, 17, 18, 19, 0, 269, 270, - 20, 0, 271, 272, 273, 21, 274, 275, 0, 23, - 0, 533, 0, 276, 277, 278, 279, 280, 26, 0, - 27, 28, 0, 0, 0, 281, 0, 0, 0, 0, - 0, 282, 0, 0, 1020, 0, 0, 0, 0, 0, - 0, 0, 286, 287, 1021, 0, 0, 0, 0, 0, - 289, 290, 291, 0, 536, 0, 0, 1022, 538, 0, - 0, 625, 7, 8, 9, 0, 11, 264, 265, 266, - 0, 267, 13, 0, 0, 293, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 268, 17, - 0, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 0, 0, 276, 277, - 278, 279, 280, 26, 0, 27, 28, 0, 0, 0, - 281, 0, 0, 0, 0, 0, 282, 0, 0, 283, - 0, 0, 0, 0, 284, 0, 285, 286, 287, 288, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 7, - 8, 9, 292, 11, 264, 265, 266, 0, 267, 13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 293, 0, 0, 0, 16, 268, 17, 0, 19, 0, - 269, 270, 20, 0, 271, 272, 273, 21, 274, 275, - 0, 23, 0, 533, 0, 276, 277, 278, 279, 280, - 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 282, 0, 0, 791, 0, 0, 0, - 0, 0, 0, 0, 286, 287, 792, 0, 0, 0, - 0, 0, 289, 290, 291, 0, 536, 0, 0, 793, - 538, 7, 8, 9, 0, 11, 264, 265, 266, 0, - 267, 13, 0, 0, 0, 0, 0, 293, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 268, 17, 0, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 0, 23, 0, 533, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 282, 0, 0, 1020, 0, - 0, 0, 0, 0, 0, 0, 286, 287, 1021, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 536, 0, - 0, 1022, 538, 7, 8, 9, 0, 11, 455, 265, - 266, 0, 267, 13, 0, 0, 0, 0, 0, 293, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 268, - 17, 0, 19, 0, 269, 270, 20, 0, 271, 272, - 273, 21, 274, 275, 0, 23, 0, 0, 0, 276, - 277, 278, 279, 280, 26, 0, 27, 28, 0, 0, - 1271, 281, 0, 0, 0, 0, 0, 282, 0, 0, - 283, 0, 0, 0, 0, 0, 0, 0, 286, 287, - 288, 0, 0, 0, 0, 0, 289, 290, 291, 0, - 0, 0, 0, 292, 7, 8, 9, 119, 11, 264, - 265, 266, 0, 267, 13, 0, 0, 0, 0, 0, - 0, 293, 0, 0, 0, 0, 0, 0, 0, 16, - 268, 17, 18, 19, 0, 269, 270, 20, 0, 271, - 272, 273, 21, 274, 275, 0, 23, 0, 0, 0, - 276, 277, 278, 279, 280, 26, 0, 27, 28, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, - 0, 283, 0, 0, 0, 0, 0, 0, 0, 286, - 287, 288, 0, 0, 0, 0, 0, 289, 290, 291, - 0, 7, 8, 9, 292, 11, 264, 265, 266, 0, - 267, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 293, 0, 0, 0, 16, 268, 17, 0, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 0, 23, 0, 0, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, 0, 0, 0, 281, - 0, 0, 0, 0, 0, 282, 0, 0, 283, 0, - 0, 0, 0, 0, 0, 0, 286, 287, 288, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 7, 8, - 9, 292, 11, 455, 265, 266, 0, 267, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, - 0, 0, 0, 16, 268, 17, 0, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 27, 28, 0, 0, 0, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 283, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 288, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 7, 8, 9, 292, 11, - 455, 265, 266, 0, 267, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, - 16, 268, 17, 0, 19, 0, 269, 270, 20, 0, - 271, 272, 273, 21, 274, 275, 0, 23, 0, 0, - 0, 276, 277, 278, 279, 280, 26, 0, 27, 28, - 486, 0, 0, 0, 0, 0, 0, 0, 0, 282, - 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, - 286, 287, 288, 0, 0, 0, 0, 0, 289, 290, - 291, 0, 7, 8, 9, 487, 11, 455, 265, 266, - 0, 267, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 0, 0, 0, 16, 268, 17, - 0, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 0, 0, 276, 277, - 278, 279, 280, 26, 0, 27, 28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 282, 0, 0, 283, - 0, 0, 0, 0, 0, 0, 0, 286, 287, 288, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 0, - 0, 0, 292, 523, 7, 8, 9, 0, 11, 455, - 265, 266, 0, 267, 13, 0, 0, 0, 0, 0, - 293, 0, 0, 0, 0, 0, 0, 0, 0, 16, - 268, 17, 0, 19, 0, 269, 270, 20, 0, 271, - 272, 273, 21, 274, 275, 0, 23, 0, 0, 0, - 276, 277, 278, 279, 280, 26, 0, 27, 28, 0, - 0, 0, 281, 0, 0, 0, 0, 0, 282, 0, - 0, 474, 0, 0, 0, 0, 0, 0, 0, 286, - 287, 475, 0, 0, 0, 0, 0, 289, 290, 291, - 0, 992, 8, 9, 476, 11, 455, 265, 266, 0, - 267, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 293, 0, 0, 0, 16, 268, 17, 0, - 19, 0, 269, 270, 20, 0, 271, 272, 273, 21, - 274, 275, 0, 23, 0, 0, 0, 276, 277, 278, - 279, 280, 26, 0, 27, 28, 0, 0, 0, 281, - 0, 0, 0, 0, 0, 282, 0, 0, 283, 0, - 0, 0, 0, 0, 0, 0, 286, 287, 288, 0, - 0, 0, 0, 0, 289, 290, 291, 0, 7, 8, - 9, 292, 11, 455, 265, 266, 0, 267, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, - 0, 0, 0, 16, 268, 17, 0, 19, 0, 269, - 270, 20, 0, 271, 272, 273, 21, 274, 275, 0, - 23, 0, 0, 0, 276, 277, 278, 279, 280, 26, - 0, 27, 28, 0, 0, 0, 281, 0, 0, 0, - 0, 0, 282, 0, 0, 1328, 0, 0, 0, 0, - 0, 0, 0, 286, 287, 1329, 0, 0, 0, 0, - 0, 289, 290, 291, 0, 7, 8, 9, 1330, 11, - 455, 265, 266, 0, 267, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, - 16, 268, 17, 0, 19, 0, 269, 270, 20, 0, - 271, 272, 273, 21, 274, 275, 0, 23, 0, 0, - 0, 276, 277, 278, 279, 280, 26, 0, 27, 28, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, - 0, 0, 283, 0, 0, 0, 0, 0, 0, 0, - 286, 287, 288, 0, 0, 0, 0, 0, 289, 290, - 291, 0, 7, 8, 9, 456, 11, 455, 265, 266, - 0, 267, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 293, 0, 0, 0, 16, 268, 17, - 0, 19, 0, 269, 270, 20, 0, 271, 272, 273, - 21, 274, 275, 0, 23, 0, 0, 0, 276, 277, - 278, 279, 280, 26, 0, 27, 28, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 282, 0, 0, 283, - 0, 0, 0, 0, 0, 0, 0, 286, 287, 288, - 0, 0, 0, 0, 0, 289, 290, 291, 0, 7, - 8, 9, 459, 11, 455, 265, 266, 0, 267, 13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 293, 0, 0, 0, 16, 268, 17, 0, 19, 0, - 269, 270, 20, 0, 271, 272, 273, 21, 274, 275, - 0, 23, 0, 0, 0, 276, 277, 278, 279, 280, - 26, 0, 27, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 282, 0, 0, 283, 0, 0, 0, - 0, 0, 0, 0, 286, 287, 288, 0, 0, 0, - 0, 0, 289, 290, 291, 0, 7, 8, 9, 292, - 11, 455, 265, 266, 0, 267, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, - 0, 16, 268, 17, 0, 19, 0, 269, 270, 20, - 0, 271, 272, 273, 21, 274, 275, 0, 23, 0, - 0, 0, 276, 277, 278, 279, 280, 26, 0, 27, - 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 282, 0, 0, 474, 0, 0, 0, 0, 0, 0, - 0, 286, 287, 475, 0, 0, 0, 0, 0, 289, - 290, 291, 0, 7, 8, 9, 476, 11, 264, 265, - 266, 0, 267, 13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 293, 0, 0, 0, 16, 268, - 17, 0, 19, 0, 269, 270, 20, 0, 271, 272, - 273, 21, 274, 275, 0, 23, 0, 0, 0, 276, - 277, 278, 279, 280, 26, 0, 27, 28, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 282, 0, 6, - 1328, 7, 8, 9, 10, 11, 12, 0, 286, 287, - 1329, 13, 0, 0, 0, 0, 289, 290, 291, 0, - 0, 0, 0, 1330, 14, 15, 16, 0, 17, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 0, 21, - 0, 293, 22, 23, 24, 0, 25, 0, 0, 0, - 0, 0, 26, 0, 27, 28, 0, 0, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 150, - 0, 7, 8, 9, 10, 11, 12, 0, 31, 0, - 0, 13, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 33, 0, 0, 14, 15, 16, 34, 17, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 0, 21, - 0, 0, 22, 23, 24, 0, 25, 0, 0, 0, - 0, 0, 26, 0, 27, 28, 0, 0, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 662, - 0, 7, 8, 663, 119, 11, 12, 0, 31, 0, - 0, 13, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 33, 0, 0, 0, 0, 16, 34, 17, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 0, 21, - 0, 0, 0, 23, 664, 0, 7, 8, 9, 119, - 11, 12, 26, 0, 27, 28, 13, 0, 665, 0, - 666, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 16, 0, 17, 18, 0, 0, 0, 31, 20, - 0, 0, 0, 0, 21, 0, 32, 0, 23, 0, - 0, 33, 0, 0, 0, 0, 0, 26, 0, 27, - 28, 7, 8, 9, 119, 11, 12, 0, 0, 860, - 0, 13, 0, 30, 0, 0, 0, 120, 0, 0, - 0, 0, 0, 31, 0, 0, 16, 0, 17, 18, - 0, 32, 0, 0, 20, 0, 33, 0, 0, 21, - 0, 0, 0, 23, 0, 0, 895, 8, 663, 176, - 11, 177, 26, 0, 27, 28, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 16, 0, 17, 18, 0, 0, 0, 31, 20, - 0, 0, 0, 0, 21, 0, 32, 0, 23, 0, - 0, 33, 0, 0, 0, 0, 0, 26, 0, 27, - 28, 0, 0, 0, 0, 897, 0, 7, 8, 9, - 176, 11, 177, 30, 0, 0, 0, 13, 0, 0, - 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, - 0, 32, 16, 0, 17, 18, 33, 0, 0, 0, - 20, 0, 0, 0, 0, 21, 0, 0, 0, 23, - 0, 0, 7, 8, 9, 119, 11, 12, 26, 0, - 27, 28, 13, 0, 1284, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, 0, 16, 0, 17, - 18, 0, 0, 0, 31, 20, 0, 0, 0, 0, - 21, 0, 32, 0, 23, 0, 0, 33, 0, 0, - 0, 0, 0, 26, 0, 27, 28, 7, 8, 9, - 176, 11, 177, 0, 0, 0, 0, 13, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 0, 0, 16, 0, 17, 18, 0, 32, 0, 0, - 20, 0, 33, 0, 0, 21, 0, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 33, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 0, 0, 0, 0, 0, 1073, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 568, 0, 0, 1339, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 1248, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 1381, 489, 490, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510 -}; - -static const short yycheck[] = { 4, - 353, 387, 145, 4, 71, 4, 312, 135, 136, 180, - 609, 4, 607, 353, 842, 428, 13, 318, 13, 844, - 25, 58, 51, 318, 79, 22, 25, 25, 382, 409, - 35, 1181, 25, 1316, 35, 40, 35, 30, 31, 40, - 55, 40, 35, 214, 0, 755, 537, 40, 53, 4, - 667, 188, 189, 544, 267, 268, 209, 180, 675, 50, - 337, 4, 10, 68, 10, 75, 189, 1204, 117, 118, - 25, 10, 1, 1351, 79, 86, 11, 1045, 1046, 84, - 35, 86, 87, 78, 37, 40, 79, 300, 87, 87, - 261, 1059, 35, 122, 87, 100, 101, 40, 388, 4, - 33, 1349, 1, 60, 99, 395, 58, 86, 0, 684, - 59, 686, 64, 1346, 62, 126, 113, 184, 123, 115, - 25, 126, 118, 48, 59, 1373, 480, 62, 8, 58, - 35, 1211, 87, 62, 93, 40, 1414, 134, 1218, 1333, - 59, 312, 135, 136, 149, 1, 183, 126, 53, 140, - 149, 93, 458, 110, 191, 1438, 149, 110, 538, 58, - 109, 109, 97, 109, 454, 180, 95, 11, 33, 1402, - 109, 164, 165, 188, 189, 1143, 4, 110, 1372, 1316, - 171, 61, 87, 58, 1152, 1153, 93, 1155, 60, 47, - 47, 110, 7, 8, 149, 608, 47, 25, 13, 214, - 54, 47, 58, 33, 1452, 407, 62, 35, 62, 1403, - 207, 24, 40, 415, 789, 59, 59, 227, 62, 59, - 215, 36, 47, 54, 99, 60, 516, 74, 518, 519, - 45, 60, 47, 1383, 93, 93, 93, 94, 110, 95, - 1320, 62, 93, 953, 149, 58, 261, 93, 94, 62, - 305, 79, 109, 97, 33, 556, 610, 262, 109, 87, - 309, 551, 60, 109, 59, 109, 109, 6, 93, 109, - 135, 136, 137, 401, 402, 110, 413, 414, 93, 632, - 1360, 110, 95, 24, 421, 282, 47, 292, 109, 432, - 62, 414, 632, 322, 431, 60, 47, 312, 37, 348, - 305, 166, 793, 580, 406, 135, 136, 137, 313, 884, - 54, 448, 305, 64, 109, 417, 60, 296, 4, 894, - 108, 149, 628, 318, 54, 1405, 3, 4, 5, 326, - 821, 31, 93, 1301, 1302, 47, 166, 109, 47, 336, - 11, 320, 93, 339, 341, 35, 62, 54, 353, 35, - 40, 926, 348, 928, 40, 353, 423, 136, 137, 58, - 353, 4, 5, 854, 41, 4, 5, 74, 110, 1194, - 375, 757, 1082, 26, 27, 47, 375, 375, 357, 56, - 57, 93, 375, 420, 93, 94, 47, 166, 59, 47, - 395, 62, 64, 64, 3, 4, 5, 434, 413, 414, - 109, 58, 395, 80, 4, 5, 421, 47, 401, 402, - 790, 88, 93, 56, 57, 54, 431, 56, 57, 429, - 375, 93, 94, 1208, 429, 1210, 97, 47, 1253, 47, - 429, 70, 93, 448, 75, 93, 429, 1262, 1263, 47, - 62, 80, 109, 1060, 64, 54, 54, 56, 57, 58, - 47, 456, 74, 93, 459, 94, 56, 57, 463, 464, - 465, 466, 467, 816, 109, 520, 74, 54, 758, 882, - 375, 476, 47, 93, 429, 93, 816, 305, 483, 269, - 270, 771, 487, 773, 47, 93, 429, 74, 842, 486, - 26, 27, 94, 283, 47, 31, 93, 798, 288, 47, - 653, 291, 655, 798, 294, 109, 54, 660, 298, 10, - 1001, 62, 649, 292, 519, 520, 306, 47, 93, 94, - 47, 811, 110, 74, 60, 353, 74, 520, 64, 54, - 93, 1022, 537, 704, 920, 60, 401, 402, 403, 544, - 93, 534, 535, 109, 537, 93, 836, 375, 47, 3, - 652, 544, 1377, 548, 47, 3, 4, 5, 944, 945, - 1388, 54, 591, 93, 593, 594, 93, 395, 565, 4, - 5, 401, 402, 403, 110, 3, 4, 5, 680, 594, - 60, 74, 795, 963, 3, 4, 5, 592, 38, 586, - 47, 596, 112, 41, 93, 94, 1009, 93, 595, 628, - 93, 429, 669, 670, 54, 94, 54, 47, 56, 57, - 94, 678, 47, 628, 112, 59, 59, 60, 615, 54, - 62, 56, 57, 402, 403, 93, 1039, 632, 56, 57, - 58, 75, 1018, 77, 649, 70, 93, 56, 57, 632, - 88, 1027, 1028, 54, 673, 80, 1032, 1033, 3, 4, - 5, 62, 958, 93, 94, 90, 59, 667, 93, 94, - 93, 80, 667, 74, 674, 675, 59, 60, 667, 674, - 675, 10, 75, 74, 667, 54, 675, 456, 1374, 684, - 459, 686, 675, 62, 474, 475, 41, 1073, 74, 704, - 1386, 684, 520, 686, 74, 74, 475, 476, 4, 5, - 1396, 56, 57, 74, 3, 4, 5, 109, 487, 537, - 4, 5, 667, 59, 54, 110, 544, 1413, 64, 109, - 675, 1011, 62, 1013, 667, 1015, 879, 880, 881, 75, - 59, 60, 675, 88, 74, 59, 1432, 59, 60, 3, - 4, 5, 41, 1129, 54, 109, 54, 1342, 47, 754, - 56, 57, 62, 758, 62, 54, 109, 56, 57, 1455, - 54, 109, 56, 57, 74, 544, 74, 1366, 673, 674, - 60, 70, 959, 960, 80, 962, 110, 41, 783, 83, - 84, 80, 54, 1169, 789, 887, 888, 110, 793, 88, - 62, 90, 56, 57, 93, 94, 789, 112, 791, 792, - 793, 112, 74, 798, 632, 802, 3, 4, 5, 1099, - 64, 816, 809, 818, 916, 112, 821, 109, 816, 59, - 60, 4, 5, 816, 88, 112, 819, 820, 821, 4, - 5, 898, 80, 81, 82, 83, 84, 904, 905, 667, - 109, 908, 909, 59, 60, 912, 109, 675, 109, 854, - 4, 5, 693, 694, 695, 58, 684, 54, 686, 56, - 57, 854, 1248, 868, 59, 60, 109, 54, 7, 93, - 875, 999, 1000, 56, 57, 112, 3, 4, 5, 884, - 877, 56, 57, 3, 4, 5, 6, 7, 8, 894, - 47, 884, 1020, 1021, 64, 59, 906, 80, 110, 93, - 60, 894, 56, 57, 1210, 80, 24, 917, 26, 27, - 1264, 64, 917, 64, 60, 62, 36, 109, 917, 698, - 47, 926, 1276, 928, 917, 109, 80, 54, 109, 56, - 57, 109, 109, 926, 64, 928, 56, 57, 58, 64, - 58, 3, 4, 5, 62, 3, 4, 5, 945, 1051, - 1052, 64, 1054, 1055, 112, 1057, 821, 64, 100, 101, - 93, 789, 917, 59, 62, 793, 93, 4, 5, 109, - 75, 109, 109, 109, 917, 109, 766, 95, 75, 1333, - 75, 75, 62, 41, 104, 105, 106, 109, 816, 854, - 1343, 821, 109, 821, 56, 57, 1001, 62, 56, 57, - 59, 791, 792, 1343, 112, 109, 999, 1000, 1001, 62, - 4, 5, 94, 792, 793, 88, 1370, 1022, 1372, 56, - 57, 1018, 80, 109, 854, 110, 854, 1020, 1021, 1022, - 88, 109, 109, 112, 1388, 4, 5, 47, 1140, 1141, - 109, 1038, 821, 80, 112, 109, 1056, 110, 109, 1403, - 1060, 1357, 112, 109, 1440, 1060, 884, 109, 109, 59, - 54, 1060, 56, 57, 110, 64, 894, 1060, 64, 24, - 62, 26, 27, 4, 5, 854, 70, 8, 3, 4, - 5, 59, 59, 1150, 1151, 109, 80, 56, 57, 917, - 109, 93, 4, 5, 6, 7, 8, 110, 926, 11, - 928, 13, 93, 58, 93, 1060, 93, 62, 109, 112, - 1115, 80, 4, 5, 1115, 1112, 28, 1060, 30, 31, - 1125, 109, 1115, 54, 36, 56, 57, 7, 1230, 1231, - 1232, 56, 57, 45, 999, 1000, 1001, 109, 30, 70, - 95, 109, 54, 109, 56, 57, 110, 112, 109, 80, - 292, 109, 109, 45, 62, 1020, 1021, 1022, 109, 109, - 1115, 109, 54, 94, 56, 57, 64, 109, 109, 999, - 1000, 1001, 1115, 1001, 84, 965, 86, 109, 112, 1208, - 47, 1210, 1325, 109, 8, 97, 1357, 11, 109, 109, - 1020, 1021, 1022, 96, 1022, 1210, 1298, 1299, 33, 1204, - 1328, 1329, 109, 1200, 1209, 62, 1211, 109, 109, 109, - 1211, 1204, 109, 1218, 109, 62, 126, 1218, 1211, 1286, - 62, 1000, 1001, 47, 353, 1218, 24, 112, 26, 27, - 1020, 1021, 1060, 7, 8, 59, 8, 61, 62, 13, - 64, 60, 1021, 1022, 60, 3, 4, 5, 60, 1204, - 392, 75, 15, 77, 93, 93, 1211, 60, 1255, 60, - 58, 1204, 36, 1218, 62, 93, 395, 108, 1211, 93, - 94, 45, 98, 97, 16, 1218, 78, 79, 80, 81, - 82, 83, 84, 41, 93, 109, 109, 1115, 109, 60, - 647, 60, 109, 3, 4, 5, 109, 95, 56, 57, - 60, 10, 1404, 60, 3, 4, 5, 6, 7, 8, - 93, 1316, 1317, 1380, 456, 1320, 59, 459, 109, 1320, - 60, 463, 80, 1316, 1317, 1330, 683, 1320, 685, 1358, - 88, 41, 64, 60, 476, 1328, 1329, 10, 1343, 4, - 5, 1346, 1357, 109, 1349, 487, 56, 57, 1349, 491, - 1343, 10, 60, 1346, 109, 1360, 1349, 56, 57, 1360, - 60, 1316, 0, 0, 0, 1320, 377, 1360, 1373, 2, - 80, 281, 1373, 1316, 149, 517, 1204, 1320, 88, 44, - 1373, 523, 24, 1211, 26, 27, 339, 816, 149, 54, - 1218, 56, 57, 674, 1349, 1009, 1341, 1402, 26, 27, - 1405, 1312, 483, 31, 1405, 1360, 1349, 1452, 537, 1402, - 1209, 809, 1405, 615, 1204, 544, 58, 1360, 1373, 11, - 62, 804, 1287, 208, 1039, 917, 882, 784, 674, 786, - 1373, 59, 60, 1058, 26, 27, 64, 565, 171, 31, - 1, 802, 3, 4, 5, 520, 7, 1452, 309, 1211, - 1405, 1452, 1116, 95, 1366, 47, 1425, 1287, 863, 1452, - 1363, 1427, 1405, 1328, 1329, 1330, 1125, 59, 60, -1, - 62, -1, 64, -1, -1, -1, -1, 387, 388, -1, - 41, -1, 3, 4, 5, 395, -1, 8, 1316, 1317, - 4, 5, 1320, 54, 8, 56, 57, 1452, 1328, 1329, - 1330, 93, 94, 632, -1, 97, -1, -1, 1287, 1452, - -1, -1, -1, -1, -1, 1343, -1, 109, 1346, -1, - 41, 1349, -1, 6, 7, 8, -1, 88, -1, -1, - 13, -1, 1360, 54, -1, 56, 57, -1, 1328, 1329, - 54, -1, 56, 57, 454, 1373, -1, -1, 31, 70, - 1329, 1330, -1, 36, -1, 684, 70, 686, -1, 80, - 4, 5, 45, -1, 8, -1, 80, 88, 925, -1, - 927, -1, 93, 483, 1402, -1, 486, 1405, -1, 489, - 490, -1, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, -1, -1, 47, -1, -1, 516, -1, 518, 519, - 54, -1, 56, 57, 3, 4, 5, -1, -1, -1, - 762, 978, -1, -1, 1452, -1, 70, -1, -1, -1, - -1, 47, -1, -1, 544, -1, 80, -1, -1, -1, - -1, 551, -1, -1, -1, -1, 90, -1, -1, 93, - 94, 793, 41, 4, -1, -1, -1, 567, 568, -1, - 789, -1, 13, -1, 793, -1, -1, 56, 57, -1, - 86, 87, 23, 24, 25, 91, 92, 93, 94, 30, - 31, -1, 33, -1, 35, -1, 1043, 816, -1, 40, - 1047, 1, 821, 3, 4, 5, 6, 7, 8, 88, - 51, -1, 53, 13, -1, 615, -1, -1, -1, -1, - 61, -1, -1, -1, -1, -1, -1, 68, 28, -1, - 30, 31, -1, -1, -1, 854, 36, 78, 79, -1, - -1, 41, -1, 875, -1, 45, 87, 1094, 48, -1, - -1, -1, -1, -1, 54, -1, 56, 57, 99, -1, - 60, -1, -1, -1, -1, 884, 666, -1, -1, -1, - 70, -1, -1, 114, 115, 894, -1, 118, -1, -1, - 80, 122, 123, 124, -1, -1, -1, 128, 88, -1, - 131, 132, -1, 93, 135, 136, 137, -1, 698, -1, - -1, -1, 3, 4, 5, -1, -1, 926, 149, 928, - -1, -1, 1159, 1160, -1, -1, -1, -1, -1, -1, - 720, -1, -1, 164, 165, 166, -1, -1, 1175, -1, - -1, -1, -1, -1, -1, -1, 6, 7, 8, -1, - 41, -1, -1, 13, -1, -1, -1, -1, -1, -1, - -1, -1, 193, 54, -1, 56, 57, 757, 758, 60, - -1, 31, -1, -1, 75, -1, 36, -1, -1, 70, - -1, 771, -1, 773, 215, 45, 1223, 1224, -1, 80, - -1, -1, 1001, 224, -1, -1, 97, 88, -1, -1, - 1022, -1, 93, -1, -1, 1242, 1243, -1, -1, -1, - -1, 801, 113, 1022, -1, -1, 117, -1, -1, -1, - -1, 811, -1, -1, -1, -1, -1, -1, -1, 130, - -1, 262, 263, 3, 4, 5, 6, 7, 8, 829, - -1, -1, -1, 13, -1, -1, 836, 1069, 1070, 1071, - 1072, -1, -1, -1, -1, -1, -1, -1, 1080, -1, - -1, 31, -1, -1, 854, -1, 36, -1, -1, -1, - -1, 41, -1, 174, 305, 45, -1, 47, 309, -1, - 311, 312, 313, -1, 54, -1, 56, 57, -1, -1, - -1, 322, 323, -1, -1, -1, -1, -1, -1, -1, - 70, -1, -1, -1, -1, -1, 207, 897, 339, -1, - 80, 3, 4, 5, -1, -1, -1, 348, 88, -1, - 90, -1, 353, 93, 94, -1, 227, -1, -1, -1, - 920, -1, 363, -1, -1, 366, -1, -1, -1, -1, - 371, -1, -1, -1, 375, -1, 38, 39, -1, 41, - -1, -1, -1, -1, 944, 945, -1, -1, 948, -1, - -1, -1, 54, -1, 56, 57, 397, -1, 399, -1, - 401, 402, 403, -1, -1, -1, 407, 1199, -1, 4, - 5, 412, 7, 8, 415, -1, -1, -1, 13, -1, - -1, -1, -1, -1, -1, -1, -1, 428, 429, -1, - -1, -1, -1, 28, -1, 30, -1, -1, -1, -1, - -1, 36, 388, -1, -1, -1, 317, -1, -1, 395, - 45, 1011, 47, 1013, -1, 1015, -1, -1, 1018, 54, - -1, 56, 57, 464, 465, 466, 467, 1027, 1028, -1, - 341, -1, 1032, 1033, -1, 70, -1, -1, -1, -1, - -1, 1273, -1, -1, -1, 80, -1, -1, 359, 1049, - 1050, 3, 4, 5, -1, 90, 8, -1, 93, 94, - -1, -1, -1, -1, -1, -1, -1, -1, 454, -1, - -1, -1, -1, 1073, -1, 1075, -1, -1, -1, 520, - -1, 522, -1, -1, 1316, 1317, -1, -1, -1, 41, - -1, 532, -1, 534, 535, 47, 537, -1, 1330, 1099, - -1, -1, 54, 544, 56, 57, -1, 548, -1, -1, - -1, -1, -1, -1, 1346, -1, -1, -1, 70, -1, - -1, -1, -1, -1, 1343, -1, -1, -1, 80, 1129, - 516, -1, 518, 519, -1, -1, 88, -1, 90, -1, - 451, 93, 94, -1, -1, 586, 1146, -1, -1, -1, - 591, 592, 593, 594, 595, 596, -1, -1, 544, -1, - -1, -1, -1, -1, -1, 551, -1, -1, 1400, 1169, - 1402, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 628, -1, -1, - -1, 632, 1424, -1, -1, 1195, -1, -1, 639, 640, - -1, 642, -1, -1, -1, -1, 1438, -1, 4, 5, - -1, 7, 8, -1, -1, 656, -1, 13, 4, 5, - 531, 7, 8, 664, -1, -1, 667, 13, 1228, 1229, - -1, -1, 673, 674, 675, -1, 547, 1237, -1, -1, - 36, -1, 28, 684, 30, 686, -1, -1, 1248, 45, - 36, 47, 693, 694, 695, 311, 312, 313, 54, 45, - 56, 57, -1, 704, -1, -1, -1, -1, 54, -1, - 56, 57, 58, -1, 70, -1, 3, 4, 5, -1, - -1, 8, -1, -1, 80, -1, -1, 1287, -1, -1, - -1, -1, -1, -1, 90, -1, -1, 93, 94, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - -1, -1, 698, 754, 41, -1, -1, -1, 1318, -1, - 47, -1, 84, -1, 86, -1, -1, 54, -1, 56, - 57, -1, -1, 774, -1, 776, -1, -1, 100, 101, - -1, -1, 783, 70, -1, -1, 787, -1, 789, -1, - 791, 792, 793, 80, -1, -1, -1, 798, -1, -1, - -1, 88, -1, 90, 126, -1, 93, 94, -1, -1, - -1, -1, 758, -1, -1, 816, -1, 818, 819, 820, - 821, 4, 3, 4, 5, 771, -1, 773, -1, -1, - 13, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 23, 24, 25, -1, 3, 4, 5, 30, 31, 8, - 33, -1, 35, 854, -1, -1, -1, 40, -1, -1, - 41, -1, -1, -1, -1, 811, -1, 868, 51, -1, - 53, -1, -1, 54, -1, 56, 57, 878, -1, 60, - 1440, 882, 41, 884, -1, 68, -1, -1, 47, 70, - 836, -1, -1, 894, -1, 54, 79, 56, 57, 80, - -1, -1, -1, -1, 87, -1, 907, 88, 854, -1, - -1, 70, 93, -1, -1, -1, 917, -1, 534, 535, - -1, 80, -1, -1, -1, 926, 797, 928, 799, 88, - -1, 90, 115, -1, 93, 94, -1, -1, -1, 122, - 123, -1, -1, -1, -1, 128, -1, -1, -1, 132, - -1, -1, 135, 136, 137, -1, -1, -1, 959, 960, - -1, 962, -1, 3, 4, 5, 149, -1, 8, -1, - 292, -1, -1, -1, -1, 591, -1, 593, 594, -1, - 596, 164, 165, 166, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 997, 998, 999, 1000, - 1001, 41, -1, -1, 1005, -1, 877, 47, -1, -1, - 193, -1, 628, -1, 54, -1, 56, 57, -1, 1020, - 1021, 1022, 3, 4, 5, -1, -1, 8, -1, -1, - 70, 353, -1, -1, -1, 906, -1, -1, 1039, -1, - 80, 224, 4, 5, -1, 7, 8, -1, 88, -1, - 90, 13, 1053, 93, 94, -1, -1, 1058, -1, 1060, - 41, -1, -1, -1, -1, 1011, 28, 1013, 30, 1015, - -1, -1, -1, 54, 36, 56, 57, -1, -1, 262, - 263, -1, -1, 45, -1, -1, -1, -1, 704, 70, - -1, -1, 54, -1, 56, 57, -1, -1, -1, 80, - -1, 1102, 1103, -1, 1105, -1, -1, 88, -1, -1, - -1, -1, 93, 984, -1, -1, -1, -1, -1, -1, - -1, -1, 305, -1, 1125, -1, 309, -1, 311, 312, - 313, 93, 1003, -1, 456, 318, -1, 459, -1, 322, - -1, 463, 464, 465, 466, 467, -1, -1, -1, -1, - -1, -1, -1, 1099, 476, -1, 339, -1, 774, -1, - 776, 483, -1, -1, -1, 487, -1, 1038, -1, -1, - 353, 787, 3, 4, 5, 791, 792, 8, -1, -1, - 363, -1, -1, 366, -1, 1056, -1, -1, 371, -1, - -1, -1, 375, -1, -1, -1, -1, 519, -1, -1, - -1, -1, -1, 819, 820, -1, -1, 1208, 1209, 1210, - 41, -1, -1, -1, 397, 537, 399, -1, 401, 402, - 403, -1, 544, 54, 407, 56, 57, -1, -1, 412, - -1, -1, 415, -1, -1, -1, -1, -1, -1, 70, - -1, -1, -1, -1, -1, 428, 429, -1, -1, 80, - -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, - -1, -1, 93, 3, 4, 5, -1, -1, 8, -1, - 4, 5, 6, 7, 8, -1, -1, 11, -1, 13, - -1, 464, 465, 466, 467, -1, 1287, -1, -1, -1, - -1, -1, -1, -1, 28, -1, 30, 31, -1, -1, - -1, 41, 36, -1, 53, -1, 55, -1, -1, -1, - 632, 45, -1, 47, 54, -1, 56, 57, -1, -1, - 54, -1, 56, 57, -1, -1, -1, 1328, 1329, 1330, - 70, -1, -1, -1, -1, -1, 70, 520, -1, 522, - 80, 1287, 1343, -1, -1, -1, 80, -1, 88, -1, - -1, 534, 535, 93, 537, -1, 90, 1358, -1, 93, - 94, 544, -1, 97, -1, -1, 4, 5, 6, 7, - 8, -1, -1, 556, 123, 13, -1, -1, -1, -1, - -1, 997, 998, 999, 1000, -1, -1, -1, -1, 1005, - 28, -1, 30, 31, -1, -1, -1, -1, 36, -1, - -1, -1, -1, 586, 1020, 1021, -1, 45, 591, 592, - 593, 594, -1, 596, -1, -1, 54, -1, 56, 57, - -1, -1, 4, 5, 6, 608, 4, 5, 6, 7, - 8, 180, 754, 11, -1, 13, -1, -1, -1, 188, - 189, -1, -1, -1, -1, 628, -1, -1, 30, 632, - 28, -1, 30, 31, -1, 37, 639, 640, 36, 642, - -1, 783, -1, 45, 3, 4, 5, 45, 217, 8, - -1, 793, 54, 656, 56, 57, 54, -1, 56, 57, - -1, 664, -1, -1, 667, -1, 1102, 1103, -1, 1105, - 673, 674, 675, -1, 816, -1, 818, -1, -1, 821, - -1, 684, 41, 686, -1, -1, -1, -1, -1, -1, - 693, 694, 695, -1, -1, 54, -1, 56, 57, -1, - -1, 704, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 70, 854, -1, -1, 3, 4, 5, 6, 7, - 8, 80, -1, 11, -1, 13, 868, -1, -1, 88, - -1, -1, -1, 875, 93, -1, -1, -1, -1, -1, - 28, -1, 30, 31, -1, -1, -1, -1, 36, -1, - -1, 754, -1, 41, -1, -1, -1, 45, -1, 47, - -1, -1, -1, -1, -1, -1, 54, -1, 56, 57, - -1, 774, 4, 776, -1, -1, -1, -1, -1, -1, - 783, -1, 70, -1, 787, -1, 789, -1, 791, 792, - 793, -1, 80, 25, -1, 798, -1, -1, 30, 31, - 88, 33, 90, 35, -1, 93, 94, -1, 40, 97, - -1, -1, -1, 816, -1, 818, 819, 820, 821, 51, - -1, 53, 3, 4, 5, -1, -1, 8, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 406, -1, -1, - -1, -1, -1, 75, 413, 414, -1, -1, 417, -1, - -1, 854, 421, -1, -1, 87, 164, 165, 166, 1001, - 41, -1, -1, -1, -1, 868, -1, -1, 3, 4, - 5, -1, -1, 54, -1, 56, 57, -1, -1, 882, - 1022, 884, -1, 115, -1, 117, 118, -1, -1, 70, - 122, 894, -1, -1, -1, -1, 128, -1, 130, 80, - 132, -1, -1, 135, 136, 137, 41, 88, -1, -1, - -1, -1, 93, -1, 917, -1, -1, 149, -1, 54, - -1, 56, 57, 926, -1, 928, -1, 62, -1, -1, - -1, -1, 164, 165, 166, 70, 3, 4, 5, 6, - 7, 8, 174, -1, -1, 80, 13, -1, -1, -1, - -1, -1, -1, 88, -1, -1, 959, 960, 93, 962, - -1, 193, 4, 5, 31, -1, 8, -1, -1, 36, - -1, -1, -1, -1, 41, -1, -1, -1, 45, -1, - 47, -1, -1, 1125, -1, -1, -1, 54, -1, 56, - 57, -1, 224, -1, 997, 998, 999, 1000, 1001, -1, - -1, -1, 1005, 70, -1, 47, 1009, -1, -1, -1, - -1, -1, 54, 80, 56, 57, -1, 1020, 1021, 1022, - -1, 88, -1, 592, -1, 594, 93, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 1039, -1, 80, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 90, -1, - 1053, 93, 94, -1, -1, 1058, -1, 1060, -1, 628, - 292, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3, 4, 5, -1, -1, 8, -1, 309, -1, -1, - 649, -1, -1, 652, -1, 317, -1, -1, -1, 397, - 322, 399, -1, 401, 402, 403, -1, -1, -1, 1102, - 1103, -1, 1105, -1, 412, 674, -1, 339, 41, -1, - -1, 680, -1, -1, -1, -1, 348, -1, -1, -1, - -1, 54, 1125, 56, 57, -1, -1, -1, -1, -1, - -1, 363, -1, -1, 366, -1, -1, 70, -1, 371, - -1, -1, -1, 375, -1, -1, -1, 80, -1, 3, - 4, 5, 6, 7, 8, 88, -1, -1, -1, 13, - 93, 3, 4, 5, -1, 397, 8, 399, -1, 401, - 402, 403, -1, -1, 28, 407, 30, 31, -1, -1, - 412, -1, 36, 415, -1, -1, -1, 41, 1330, -1, - -1, 45, -1, 47, -1, -1, -1, 429, -1, 41, - 54, 1343, 56, 57, -1, 1208, 1209, 1210, -1, -1, - -1, -1, 54, -1, 56, 57, 70, -1, -1, 3, - 4, 5, -1, -1, 456, -1, 80, 459, 70, -1, - -1, -1, -1, -1, 88, -1, 90, -1, 80, 93, - 94, -1, 474, 475, 476, -1, 88, -1, -1, -1, - -1, 93, -1, -1, -1, 487, 4, 41, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 54, -1, 56, 57, -1, -1, -1, 25, 62, -1, - -1, -1, 30, 31, 1287, 33, 70, 35, -1, -1, - -1, -1, 40, -1, -1, -1, 80, -1, -1, 531, - 3, 4, 5, 51, 88, 53, -1, -1, -1, 93, - -1, -1, 544, -1, -1, -1, -1, -1, 887, 888, - -1, -1, -1, -1, -1, 1328, 1329, 1330, -1, -1, - -1, 639, 640, -1, 642, -1, -1, -1, 41, 87, - 1343, -1, -1, -1, -1, -1, -1, 916, -1, -1, - -1, 54, -1, 56, 57, 1358, -1, -1, -1, 591, - 592, 593, 594, -1, -1, 673, -1, 70, -1, -1, - -1, -1, 4, 5, 122, 7, 8, 80, 4, 5, - 128, 13, 8, -1, 132, 88, -1, 135, 136, 137, - 93, -1, -1, -1, -1, -1, 628, -1, -1, -1, - 632, 149, -1, -1, 36, -1, -1, 639, 640, -1, - 642, -1, -1, 45, -1, 47, 164, 165, 166, -1, - -1, 47, 54, -1, 56, 57, -1, -1, 54, -1, - 56, 57, -1, -1, -1, 667, -1, -1, 70, -1, - -1, 673, 674, 675, 70, 193, -1, -1, 80, -1, - -1, 3, 4, 5, 80, -1, -1, -1, 90, -1, - -1, 93, 94, -1, 90, -1, 698, 93, 94, -1, - -1, -1, -1, -1, -1, -1, 224, -1, -1, -1, - -1, -1, 1051, 1052, -1, 1054, 1055, -1, 1057, 41, - -1, -1, -1, -1, 1, -1, 3, 4, 5, 6, - 7, 8, 54, -1, 56, 57, 13, -1, -1, -1, - 62, 819, 820, 821, -1, -1, -1, -1, 70, -1, - -1, 28, -1, 30, 31, 32, -1, -1, 80, 36, - 37, 311, 312, 313, 41, -1, 88, -1, 45, 46, - -1, 93, -1, -1, -1, -1, 854, 54, -1, 56, - 57, -1, -1, 60, -1, 62, -1, -1, -1, 791, - 792, 793, -1, 70, -1, 797, -1, -1, -1, -1, - 318, 1140, 1141, 80, 322, -1, 33, -1, -1, -1, - -1, 88, -1, 3, 4, 5, 93, 819, 820, 821, - -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, - -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 363, -1, -1, 366, -1, - -1, 41, 854, 371, -1, -1, -1, 375, -1, -1, - -1, -1, -1, -1, 54, -1, 56, 57, -1, -1, - 1209, 1210, -1, -1, -1, -1, -1, -1, -1, 397, - 70, 399, -1, 401, 402, 403, -1, -1, -1, 407, - 80, 1230, 1231, 1232, 412, 122, -1, 415, 88, -1, - -1, -1, -1, 93, 906, -1, -1, -1, 135, 136, - 137, 429, -1, -1, -1, 917, -1, -1, -1, 997, - 998, 999, 1000, 1001, -1, -1, -1, 1005, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 164, 165, 166, - -1, -1, 1020, 1021, 1022, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, 4, 5, -1, 1298, - 1299, -1, -1, -1, -1, -1, 193, -1, -1, -1, - -1, -1, -1, -1, -1, 1053, -1, -1, -1, -1, - -1, -1, 984, -1, 534, 535, -1, 537, -1, -1, - -1, -1, -1, 41, 544, 997, 998, 999, 1000, 1001, - -1, 1003, -1, 1005, -1, -1, 54, -1, 56, 57, - -1, -1, -1, -1, 532, -1, -1, -1, 1020, 1021, - 1022, -1, 70, -1, 1102, 1103, -1, 1105, -1, -1, - 77, -1, 80, -1, -1, -1, 263, -1, -1, -1, - 88, 591, -1, 593, 594, 93, 596, -1, -1, -1, - -1, 1053, -1, -1, -1, -1, 1058, -1, 1060, -1, - -1, -1, -1, -1, -1, 1404, -1, -1, -1, -1, - -1, -1, -1, 591, 592, 593, 594, -1, 628, -1, - -1, 51, -1, -1, 311, 312, 313, -1, -1, -1, - 608, -1, -1, -1, -1, 322, 143, -1, -1, -1, - 1102, 1103, -1, 1105, -1, 75, -1, -1, 78, -1, - 628, -1, -1, -1, 632, 162, -1, -1, -1, -1, - -1, 639, 640, -1, 642, -1, -1, 97, 175, 99, - -1, -1, -1, -1, -1, -1, -1, 4, 5, 6, - 7, 8, -1, -1, -1, -1, 13, -1, -1, 667, - -1, -1, 122, -1, 704, 673, 674, 675, -1, -1, - -1, 28, -1, 30, 31, -1, -1, -1, -1, 36, - 397, -1, 399, -1, 401, 402, 403, -1, 45, -1, - 407, -1, -1, -1, -1, 412, -1, 54, 415, 56, - 57, -1, -1, -1, 164, 165, 166, -1, -1, -1, - -1, -1, -1, -1, 174, -1, 1208, 1209, 1210, 1287, - -1, -1, 4, 5, -1, 7, 8, -1, -1, -1, - -1, 13, -1, 193, 774, -1, 776, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 787, 30, -1, - -1, 791, 792, 793, 36, 215, -1, -1, -1, -1, - 1328, 1329, 1330, 45, -1, -1, -1, 227, -1, -1, - -1, -1, 54, -1, 56, 57, -1, -1, -1, 819, - 820, 821, -1, -1, -1, -1, -1, -1, -1, -1, - 798, -1, -1, -1, -1, 1287, -1, -1, -1, -1, - -1, -1, -1, 4, -1, 522, -1, -1, -1, -1, - -1, 819, 820, 821, 854, -1, -1, 534, 535, -1, - 537, -1, -1, -1, 25, -1, -1, 544, -1, 30, - 31, -1, -1, -1, 35, -1, 1328, 1329, 1330, 40, - -1, -1, -1, -1, -1, -1, 854, -1, -1, -1, - -1, -1, 53, -1, -1, -1, -1, 317, 318, -1, - -1, -1, 322, -1, -1, -1, 1358, -1, 405, -1, - -1, -1, -1, 410, 591, -1, 593, 594, -1, 596, - -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 435, -1, - 437, -1, -1, -1, -1, -1, -1, -1, -1, 917, - -1, 628, 449, 450, -1, 452, -1, -1, -1, -1, - -1, -1, 639, 640, -1, 642, -1, 128, -1, -1, - -1, 132, -1, -1, -1, -1, -1, 397, -1, 399, - -1, 401, 402, 403, -1, -1, -1, 407, 149, -1, - -1, -1, 412, -1, -1, 415, 673, 997, 998, 999, - 1000, 1001, -1, 164, 165, 1005, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 693, 694, 695, -1, - 1020, 1021, 1022, -1, -1, -1, -1, 704, -1, 997, - 998, 999, 1000, 1001, -1, -1, -1, 1005, -1, -1, - -1, 1009, -1, 540, 541, -1, -1, -1, 545, -1, - -1, -1, 1020, 1021, 1022, -1, -1, -1, -1, -1, - -1, -1, -1, 224, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 1, -1, 3, - 4, 5, 6, 7, 8, 1053, -1, -1, -1, 13, - 1058, -1, 1060, -1, -1, -1, -1, 774, -1, 776, - -1, -1, 1102, 1103, 28, 1105, 30, 31, 32, -1, - 787, -1, 36, 37, 791, 792, 793, 41, -1, -1, - -1, 45, 46, -1, -1, -1, -1, 547, 548, -1, - 54, -1, 56, 57, 1102, 1103, 60, 1105, 62, -1, - -1, -1, 819, 820, 821, -1, 70, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 80, -1, -1, 4, - 5, -1, 7, 8, 88, -1, -1, -1, 13, 93, - -1, 591, -1, 593, 594, -1, -1, 854, -1, -1, - -1, -1, -1, 28, -1, 30, 110, -1, -1, -1, - 687, 36, 689, -1, -1, -1, -1, -1, -1, -1, - 45, -1, 363, -1, -1, 366, -1, -1, 628, 54, - 371, 56, 57, -1, 375, -1, -1, -1, -1, 639, - 640, -1, 642, -1, -1, 1, -1, 3, 4, 5, - 6, 7, 8, -1, -1, -1, 397, 13, 399, -1, - 1208, 1209, 1210, -1, -1, -1, -1, -1, -1, -1, - -1, 412, 28, 673, 30, 31, 32, -1, -1, -1, - 36, 37, -1, 760, 761, 41, 763, -1, 429, 45, - 46, -1, -1, -1, -1, -1, -1, -1, 54, -1, - 56, 57, 959, 960, 60, 962, 62, -1, -1, -1, - -1, 788, -1, -1, 70, -1, -1, 3, 4, 5, - 6, 7, 8, -1, 80, -1, -1, 13, -1, -1, - -1, -1, 88, -1, -1, -1, -1, 93, -1, 1287, - 997, 998, 999, 1000, 1001, 31, 823, -1, 1005, -1, - 36, -1, -1, -1, 110, 41, -1, -1, -1, 45, - -1, 47, -1, 1020, 1021, 1022, -1, -1, 54, -1, - 56, 57, -1, -1, -1, -1, -1, -1, -1, -1, - 1328, 1329, 1330, -1, 70, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 80, -1, 1053, 797, 798, 799, - -1, -1, 88, -1, 90, -1, 883, 93, 94, -1, - 1358, -1, -1, -1, -1, -1, 893, -1, -1, 819, - 820, 821, -1, -1, -1, -1, -1, -1, -1, -1, - 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, - 13, -1, -1, -1, -1, 1102, 1103, -1, 1105, -1, - -1, 592, -1, -1, 854, 28, 13, 30, 31, -1, - -1, -1, -1, 36, -1, -1, 23, 24, 41, -1, - -1, -1, 45, 30, 31, -1, 33, -1, -1, -1, - -1, 54, -1, 56, 57, -1, -1, 60, -1, -1, - -1, 632, -1, -1, -1, -1, 973, 70, 639, 640, - -1, 642, -1, -1, 61, -1, 906, 80, -1, -1, - -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, 667, 1004, -1, -1, - -1, -1, 673, 674, 675, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - -1, 1208, -1, 1210, -1, -1, 113, 114, 115, -1, - 117, 118, -1, -1, -1, -1, -1, 124, -1, -1, - -1, 128, -1, 130, 131, 132, -1, -1, 135, 136, - 137, -1, -1, -1, 984, -1, 1063, 1064, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 997, 998, 999, - 1000, 1001, -1, 1003, -1, 1005, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1096, - 1020, 1021, 1022, -1, -1, -1, -1, -1, -1, -1, - 1287, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, -1, - 207, -1, -1, 1053, -1, -1, -1, -1, 1135, -1, - -1, -1, 1139, -1, -1, -1, -1, 224, -1, -1, - -1, 1328, 1329, 1330, -1, -1, -1, -1, 819, 820, - -1, -1, -1, -1, 1161, 1162, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - -1, 1358, 1102, 1103, -1, 1105, 263, -1, -1, 1, - -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, 309, 45, 311, 312, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, 323, -1, -1, 61, - -1, -1, -1, -1, -1, 67, 917, -1, 70, -1, - -1, -1, 339, -1, 341, -1, 78, 79, 80, -1, - -1, 348, -1, -1, 86, 87, 88, -1, -1, -1, - -1, 93, 359, -1, -1, 97, 363, -1, 1208, 366, - 1210, -1, -1, -1, 371, -1, -1, 109, -1, 111, - -1, -1, -1, 1, -1, 3, 4, 5, 6, 7, - 8, -1, -1, -1, -1, 13, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 28, -1, 30, 31, 32, -1, 997, 998, 36, 37, - -1, -1, -1, 41, 1005, -1, -1, 45, 46, -1, - -1, -1, -1, -1, -1, -1, 54, -1, 56, 57, - -1, -1, 60, 11, 62, -1, -1, 1287, -1, -1, - -1, -1, 70, -1, 451, -1, -1, -1, -1, -1, - -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, - 88, -1, 1053, -1, -1, 93, -1, 1058, -1, 1060, - -1, -1, -1, -1, -1, -1, -1, -1, 1328, 1329, - 1330, -1, 110, -1, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, -1, 1358, -1, - -1, 1102, 1103, -1, 1105, 522, -1, -1, -1, -1, - -1, -1, -1, -1, 531, 532, -1, 534, 535, -1, - -1, -1, -1, -1, 1, -1, 3, 4, 5, 6, - 7, 8, -1, -1, 11, -1, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 24, -1, 26, - 27, -1, -1, -1, 31, -1, -1, -1, -1, 36, - -1, -1, -1, -1, 41, -1, -1, -1, 45, 586, - 47, -1, -1, -1, -1, -1, -1, 54, 595, 56, - 57, 58, 59, 60, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 1209, 86, - 87, 88, -1, 90, 91, 92, 93, 94, 95, 31, - 97, 98, -1, -1, -1, -1, 103, -1, -1, -1, - -1, 108, 109, 110, -1, 112, -1, -1, -1, 656, - -1, -1, -1, -1, -1, -1, -1, 664, -1, -1, - -1, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, -1, -1, -1, 693, 694, 695, -1, - -1, -1, -1, -1, -1, -1, 1, 704, 3, 4, - 5, 6, 7, 8, 9, 10, -1, 12, 13, 14, - -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, 58, -1, 60, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, 774, -1, 776, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - 787, 86, 87, 88, -1, -1, -1, -1, 93, -1, - 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 110, 111, 1, -1, 3, - 4, 5, 6, 7, 8, 9, 10, -1, 12, 13, - 14, -1, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, -1, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, 58, -1, 60, 61, -1, -1, - 877, 878, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, -1, -1, -1, -1, 93, - 907, 95, -1, -1, -1, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 111, 76, 77, - 78, 79, 80, 81, 82, 83, 84, -1, -1, 1, - -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 959, 960, -1, 962, 28, 29, 30, 31, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, 47, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, 58, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, -1, 90, -1, - -1, 93, 94, -1, -1, 97, -1, -1, -1, -1, - -1, 1038, -1, -1, -1, -1, -1, -1, -1, 111, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1056, - 1, 1058, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, 47, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, 58, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, 90, - -1, -1, 93, 94, -1, 1, 97, 3, 4, 5, - 6, 7, 8, 9, 10, -1, 12, 13, -1, -1, - 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, 58, -1, 60, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, -1, - 86, 87, 88, -1, -1, -1, 1, 93, 3, 4, - 5, -1, 7, 8, 9, 10, -1, 12, 13, -1, - -1, -1, -1, -1, -1, 111, -1, -1, -1, -1, - -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, 58, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, -1, -1, -1, 93, 94, - 1, -1, 3, 4, 5, -1, 7, 8, 9, 10, - -1, 12, 13, -1, -1, 110, 111, -1, -1, 20, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, 58, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, -1, - -1, -1, 93, 1, -1, 3, 4, 5, -1, 7, - 8, 9, 10, -1, 12, 13, -1, -1, -1, 110, - 111, -1, 20, -1, -1, -1, -1, -1, -1, -1, - 28, 29, 30, -1, 32, -1, 34, 35, 36, -1, - 38, 39, 40, 41, 42, 43, -1, 45, -1, -1, - -1, 49, 50, 51, 52, 53, 54, -1, 56, 57, - 58, -1, -1, 61, -1, -1, -1, -1, -1, 67, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, -1, -1, -1, -1, -1, 86, 87, - 88, -1, -1, -1, 1, 93, 3, 4, 5, -1, - 7, 8, 9, 10, -1, 12, 13, -1, -1, -1, - -1, -1, 110, 111, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, 58, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, -1, 86, - 87, 88, -1, -1, -1, -1, 93, 94, 1, -1, - 3, 4, 5, -1, 7, 8, 9, 10, -1, 12, - 13, -1, -1, -1, 111, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, 58, -1, -1, 61, 1, - -1, -1, 4, 5, 67, 7, 8, 70, -1, -1, - -1, 13, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, -1, 86, 87, 88, 28, -1, 30, -1, - 93, -1, -1, -1, 36, -1, 38, 39, -1, 102, - -1, -1, -1, 45, -1, 47, -1, -1, 111, -1, - -1, -1, 54, -1, 56, 57, -1, 59, -1, -1, - -1, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, -1, -1, 86, 87, 88, -1, -1, 91, - -1, 1, 94, 3, 4, 5, -1, 7, 8, 9, - 10, -1, 12, 13, -1, -1, -1, -1, -1, 111, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, -1, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, -1, 45, -1, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, 58, -1, - -1, 61, -1, -1, -1, -1, -1, 67, -1, -1, - 70, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, -1, - -1, -1, 1, 93, 3, 4, 5, -1, 7, 8, - 9, 10, -1, 12, 13, -1, -1, -1, -1, -1, - -1, 111, -1, -1, -1, -1, -1, -1, -1, 28, - 29, 30, -1, 32, -1, 34, 35, 36, -1, 38, - 39, 40, 41, 42, 43, -1, 45, -1, -1, -1, - 49, 50, 51, 52, 53, 54, -1, 56, 57, 58, - -1, -1, 61, -1, -1, -1, -1, -1, 67, -1, - -1, 70, -1, -1, -1, -1, -1, -1, -1, 78, - 79, 80, -1, -1, -1, -1, -1, 86, 87, 88, - -1, -1, -1, 1, 93, 3, 4, 5, -1, 7, - 8, 9, 10, -1, 12, 13, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, - 28, 29, 30, -1, 32, -1, 34, 35, 36, -1, - 38, 39, 40, 41, 42, 43, -1, 45, -1, -1, - -1, 49, 50, 51, 52, 53, 54, -1, 56, 57, - -1, -1, -1, 61, 62, -1, -1, -1, -1, 67, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, -1, -1, -1, -1, -1, 86, 87, - 88, -1, -1, -1, 1, 93, 3, 4, 5, -1, - 7, 8, 9, 10, -1, 12, 13, -1, -1, -1, - -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, 58, -1, -1, 61, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, -1, 86, - 87, 88, -1, -1, -1, 1, 93, 3, 4, 5, - -1, 7, 8, 9, 10, -1, 12, 13, -1, -1, - -1, -1, -1, -1, 111, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, -1, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, 60, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, -1, - 86, 87, 88, -1, -1, -1, 1, 93, 3, 4, - 5, -1, 7, 8, 9, 10, -1, 12, 13, -1, - -1, -1, -1, -1, -1, 111, -1, -1, -1, -1, - -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, -1, -1, 1, 93, 3, - 4, 5, -1, 7, 8, 9, 10, -1, 12, 13, - -1, -1, -1, -1, 109, -1, 111, -1, -1, -1, - -1, -1, -1, -1, 28, 29, 30, -1, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, -1, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, -1, -1, -1, 61, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, -1, -1, -1, 1, 93, - 3, 4, 5, -1, 7, 8, 9, 10, -1, 12, - 13, -1, -1, -1, -1, -1, -1, 111, -1, -1, - -1, -1, -1, -1, -1, 28, 29, 30, -1, 32, - -1, 34, 35, 36, -1, 38, 39, 40, 41, 42, - 43, -1, 45, -1, -1, -1, 49, 50, 51, 52, - 53, 54, -1, 56, 57, -1, -1, -1, 61, -1, - -1, -1, -1, -1, 67, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, 78, 79, 80, -1, -1, - -1, -1, -1, 86, 87, 88, -1, -1, -1, 1, - 93, 3, 4, 5, -1, 7, 8, 9, 10, -1, - 12, 13, -1, -1, -1, -1, -1, -1, 111, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, -1, 3, 4, - 5, 93, 7, 8, 9, 10, -1, 12, 13, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 111, - -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, -1, -1, -1, 93, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 111, 112, 3, 4, - 5, 6, 7, 8, 9, 10, -1, 12, 13, 14, - -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, 58, -1, 60, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, -1, -1, -1, 93, -1, - 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 110, 111, 3, 4, 5, - 6, 7, 8, 9, 10, -1, 12, 13, 14, -1, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, -1, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, 58, -1, 60, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, -1, - 86, 87, 88, -1, -1, -1, -1, 93, -1, 95, - -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, - 10, -1, 12, 13, 14, 111, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, -1, 45, -1, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, 58, -1, - 60, 61, -1, -1, -1, -1, -1, 67, -1, -1, - 70, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, -1, - -1, -1, -1, 93, -1, 95, -1, -1, -1, 3, - 4, 5, 6, 7, 8, 9, 10, -1, 12, 13, - 14, 111, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, -1, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, -1, -1, 60, 61, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, -1, -1, -1, -1, 93, - -1, 95, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, -1, -1, -1, -1, 111, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, 47, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, 90, - -1, -1, 93, 94, -1, -1, 97, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, -1, -1, - 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 28, 29, 30, 31, 32, -1, 34, 35, - 36, -1, 38, 39, 40, 41, 42, 43, -1, 45, - -1, 47, -1, 49, 50, 51, 52, 53, 54, -1, - 56, 57, -1, -1, -1, 61, -1, -1, -1, -1, - -1, 67, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, 78, 79, 80, -1, -1, -1, -1, -1, - 86, 87, 88, -1, 90, -1, -1, 93, 94, -1, - -1, 97, 3, 4, 5, -1, 7, 8, 9, 10, - -1, 12, 13, -1, -1, 111, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - 61, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, 75, -1, 77, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, 3, - 4, 5, 93, 7, 8, 9, 10, -1, 12, 13, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 111, -1, -1, -1, 28, 29, 30, -1, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, 47, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, -1, 90, -1, -1, 93, - 94, 3, 4, 5, -1, 7, 8, 9, 10, -1, - 12, 13, -1, -1, -1, -1, -1, 111, -1, -1, - -1, -1, -1, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, 47, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, -1, 90, -1, - -1, 93, 94, 3, 4, 5, -1, 7, 8, 9, - 10, -1, 12, 13, -1, -1, -1, -1, -1, 111, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 29, - 30, -1, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, -1, 45, -1, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, -1, -1, - 60, 61, -1, -1, -1, -1, -1, 67, -1, -1, - 70, -1, -1, -1, -1, -1, -1, -1, 78, 79, - 80, -1, -1, -1, -1, -1, 86, 87, 88, -1, - -1, -1, -1, 93, 3, 4, 5, 6, 7, 8, - 9, 10, -1, 12, 13, -1, -1, -1, -1, -1, - -1, 111, -1, -1, -1, -1, -1, -1, -1, 28, - 29, 30, 31, 32, -1, 34, 35, 36, -1, 38, - 39, 40, 41, 42, 43, -1, 45, -1, -1, -1, - 49, 50, 51, 52, 53, 54, -1, 56, 57, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 67, -1, - -1, 70, -1, -1, -1, -1, -1, -1, -1, 78, - 79, 80, -1, -1, -1, -1, -1, 86, 87, 88, - -1, 3, 4, 5, 93, 7, 8, 9, 10, -1, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, -1, 3, 4, - 5, 93, 7, 8, 9, 10, -1, 12, 13, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 111, - -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, 3, 4, 5, 93, 7, - 8, 9, 10, -1, 12, 13, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, - 28, 29, 30, -1, 32, -1, 34, 35, 36, -1, - 38, 39, 40, 41, 42, 43, -1, 45, -1, -1, - -1, 49, 50, 51, 52, 53, 54, -1, 56, 57, - 58, -1, -1, -1, -1, -1, -1, -1, -1, 67, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, -1, -1, -1, -1, -1, 86, 87, - 88, -1, 3, 4, 5, 93, 7, 8, 9, 10, - -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 111, -1, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, -1, - -1, -1, 93, 94, 3, 4, 5, -1, 7, 8, - 9, 10, -1, 12, 13, -1, -1, -1, -1, -1, - 111, -1, -1, -1, -1, -1, -1, -1, -1, 28, - 29, 30, -1, 32, -1, 34, 35, 36, -1, 38, - 39, 40, 41, 42, 43, -1, 45, -1, -1, -1, - 49, 50, 51, 52, 53, 54, -1, 56, 57, -1, - -1, -1, 61, -1, -1, -1, -1, -1, 67, -1, - -1, 70, -1, -1, -1, -1, -1, -1, -1, 78, - 79, 80, -1, -1, -1, -1, -1, 86, 87, 88, - -1, 3, 4, 5, 93, 7, 8, 9, 10, -1, - 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, 28, 29, 30, -1, - 32, -1, 34, 35, 36, -1, 38, 39, 40, 41, - 42, 43, -1, 45, -1, -1, -1, 49, 50, 51, - 52, 53, 54, -1, 56, 57, -1, -1, -1, 61, - -1, -1, -1, -1, -1, 67, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, - -1, -1, -1, -1, 86, 87, 88, -1, 3, 4, - 5, 93, 7, 8, 9, 10, -1, 12, 13, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 111, - -1, -1, -1, 28, 29, 30, -1, 32, -1, 34, - 35, 36, -1, 38, 39, 40, 41, 42, 43, -1, - 45, -1, -1, -1, 49, 50, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, 61, -1, -1, -1, - -1, -1, 67, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, 78, 79, 80, -1, -1, -1, -1, - -1, 86, 87, 88, -1, 3, 4, 5, 93, 7, - 8, 9, 10, -1, 12, 13, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, - 28, 29, 30, -1, 32, -1, 34, 35, 36, -1, - 38, 39, 40, 41, 42, 43, -1, 45, -1, -1, - -1, 49, 50, 51, 52, 53, 54, -1, 56, 57, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, -1, -1, -1, -1, -1, 86, 87, - 88, -1, 3, 4, 5, 93, 7, 8, 9, 10, - -1, 12, 13, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 111, -1, -1, -1, 28, 29, 30, - -1, 32, -1, 34, 35, 36, -1, 38, 39, 40, - 41, 42, 43, -1, 45, -1, -1, -1, 49, 50, - 51, 52, 53, 54, -1, 56, 57, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 67, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, 78, 79, 80, - -1, -1, -1, -1, -1, 86, 87, 88, -1, 3, - 4, 5, 93, 7, 8, 9, 10, -1, 12, 13, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 111, -1, -1, -1, 28, 29, 30, -1, 32, -1, - 34, 35, 36, -1, 38, 39, 40, 41, 42, 43, - -1, 45, -1, -1, -1, 49, 50, 51, 52, 53, - 54, -1, 56, 57, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 67, -1, -1, 70, -1, -1, -1, - -1, -1, -1, -1, 78, 79, 80, -1, -1, -1, - -1, -1, 86, 87, 88, -1, 3, 4, 5, 93, - 7, 8, 9, 10, -1, 12, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 111, -1, -1, - -1, 28, 29, 30, -1, 32, -1, 34, 35, 36, - -1, 38, 39, 40, 41, 42, 43, -1, 45, -1, - -1, -1, 49, 50, 51, 52, 53, 54, -1, 56, - 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 67, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, 78, 79, 80, -1, -1, -1, -1, -1, 86, - 87, 88, -1, 3, 4, 5, 93, 7, 8, 9, - 10, -1, 12, 13, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 111, -1, -1, -1, 28, 29, - 30, -1, 32, -1, 34, 35, 36, -1, 38, 39, - 40, 41, 42, 43, -1, 45, -1, -1, -1, 49, - 50, 51, 52, 53, 54, -1, 56, 57, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 67, -1, 1, - 70, 3, 4, 5, 6, 7, 8, -1, 78, 79, - 80, 13, -1, -1, -1, -1, 86, 87, 88, -1, - -1, -1, -1, 93, 26, 27, 28, -1, 30, 31, - 32, -1, -1, -1, 36, -1, -1, -1, -1, 41, - -1, 111, 44, 45, 46, -1, 48, -1, -1, -1, - -1, -1, 54, -1, 56, 57, -1, -1, 60, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 1, - -1, 3, 4, 5, 6, 7, 8, -1, 80, -1, - -1, 13, -1, -1, -1, -1, 88, -1, -1, -1, - -1, 93, -1, -1, 26, 27, 28, 99, 30, 31, - 32, -1, -1, -1, 36, -1, -1, -1, -1, 41, - -1, -1, 44, 45, 46, -1, 48, -1, -1, -1, - -1, -1, 54, -1, 56, 57, -1, -1, 60, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 70, 1, - -1, 3, 4, 5, 6, 7, 8, -1, 80, -1, - -1, 13, -1, -1, -1, -1, 88, -1, -1, -1, - -1, 93, -1, -1, -1, -1, 28, 99, 30, 31, - 32, -1, -1, -1, 36, -1, -1, -1, -1, 41, - -1, -1, -1, 45, 46, -1, 3, 4, 5, 6, - 7, 8, 54, -1, 56, 57, 13, -1, 60, -1, - 62, -1, -1, -1, -1, -1, -1, -1, 70, -1, - -1, 28, -1, 30, 31, -1, -1, -1, 80, 36, - -1, -1, -1, -1, 41, -1, 88, -1, 45, -1, - -1, 93, -1, -1, -1, -1, -1, 54, -1, 56, - 57, 3, 4, 5, 6, 7, 8, -1, -1, 11, - -1, 13, -1, 70, -1, -1, -1, 74, -1, -1, - -1, -1, -1, 80, -1, -1, 28, -1, 30, 31, - -1, 88, -1, -1, 36, -1, 93, -1, -1, 41, - -1, -1, -1, 45, -1, -1, 3, 4, 5, 6, - 7, 8, 54, -1, 56, 57, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, - -1, 28, -1, 30, 31, -1, -1, -1, 80, 36, - -1, -1, -1, -1, 41, -1, 88, -1, 45, -1, - -1, 93, -1, -1, -1, -1, -1, 54, -1, 56, - 57, -1, -1, -1, -1, 62, -1, 3, 4, 5, - 6, 7, 8, 70, -1, -1, -1, 13, -1, -1, - -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, - -1, 88, 28, -1, 30, 31, 93, -1, -1, -1, - 36, -1, -1, -1, -1, 41, -1, -1, -1, 45, - -1, -1, 3, 4, 5, 6, 7, 8, 54, -1, - 56, 57, 13, -1, 60, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 70, -1, -1, 28, -1, 30, - 31, -1, -1, -1, 80, 36, -1, -1, -1, -1, - 41, -1, 88, -1, 45, -1, -1, 93, -1, -1, - -1, -1, -1, 54, -1, 56, 57, 3, 4, 5, - 6, 7, 8, -1, -1, -1, -1, 13, -1, 70, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, - -1, -1, 28, -1, 30, 31, -1, 88, -1, -1, - 36, -1, 93, -1, -1, 41, -1, -1, -1, 45, - -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, - 56, 57, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, - -1, -1, 88, -1, -1, -1, -1, 93, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, -1, -1, -1, -1, -1, 112, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, 108, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include <malloc.h> -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include <malloc.h> - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 2: -#line 312 "parse.y" -{ - /* In case there were missing closebraces, - get us back to the global binding level. */ - while (! global_bindings_p ()) - poplevel (0, 0, 0); - finish_file (); - ; - break;} -case 3: -#line 326 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 4: -#line 328 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 5: -#line 330 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 8: -#line 339 "parse.y" -{ have_extern_spec = 1; - used_extern_spec = 0; - yyval.ttype = NULL_TREE; ; - break;} -case 9: -#line 344 "parse.y" -{ have_extern_spec = 0; ; - break;} -case 10: -#line 349 "parse.y" -{ yyval.itype = pedantic; - pedantic = 0; ; - break;} -case 13: -#line 359 "parse.y" -{ if (pending_lang_change) do_pending_lang_change(); ; - break;} -case 14: -#line 361 "parse.y" -{ if (! toplevel_bindings_p () && ! pseudo_global_level_p()) - pop_everything (); ; - break;} -case 15: -#line 367 "parse.y" -{ if (pending_inlines) do_pending_inlines (); ; - break;} -case 16: -#line 369 "parse.y" -{ if (pending_inlines) do_pending_inlines (); ; - break;} -case 17: -#line 371 "parse.y" -{ if (pending_inlines) do_pending_inlines (); ; - break;} -case 18: -#line 373 "parse.y" -{ if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); - assemble_asm (yyvsp[-2].ttype); ; - break;} -case 19: -#line 376 "parse.y" -{ pop_lang_context (); ; - break;} -case 20: -#line 378 "parse.y" -{ if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ; - break;} -case 21: -#line 381 "parse.y" -{ if (pending_inlines) do_pending_inlines (); - pop_lang_context (); ; - break;} -case 22: -#line 384 "parse.y" -{ push_namespace (yyvsp[-1].ttype); ; - break;} -case 23: -#line 386 "parse.y" -{ pop_namespace (); ; - break;} -case 24: -#line 388 "parse.y" -{ push_namespace (NULL_TREE); ; - break;} -case 25: -#line 390 "parse.y" -{ pop_namespace (); ; - break;} -case 26: -#line 392 "parse.y" -{ do_namespace_alias (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 27: -#line 394 "parse.y" -{ do_toplevel_using_decl (yyvsp[-1].ttype); ; - break;} -case 28: -#line 396 "parse.y" -{ - if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) - yyvsp[-1].ttype = lastiddecl; - do_using_directive (yyvsp[-1].ttype); - ; - break;} -case 29: -#line 402 "parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 30: -#line 407 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 31: -#line 409 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 32: -#line 411 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 35: -#line 418 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 36: -#line 420 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 37: -#line 425 "parse.y" -{ push_lang_context (yyvsp[0].ttype); ; - break;} -case 38: -#line 427 "parse.y" -{ if (current_lang_name != yyvsp[0].ttype) - cp_error ("use of linkage spec `%D' is different from previous spec `%D'", yyvsp[0].ttype, current_lang_name); - pop_lang_context (); push_lang_context (yyvsp[0].ttype); ; - break;} -case 39: -#line 434 "parse.y" -{ begin_template_parm_list (); ; - break;} -case 40: -#line 436 "parse.y" -{ yyval.ttype = end_template_parm_list (yyvsp[-1].ttype); ; - break;} -case 41: -#line 438 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 42: -#line 443 "parse.y" -{ yyval.ttype = process_template_parm (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 43: -#line 445 "parse.y" -{ yyval.ttype = process_template_parm (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 44: -#line 450 "parse.y" -{ - yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); - ttpa: - if (TREE_PURPOSE (yyval.ttype) == signature_type_node) - sorry ("signature as template type parameter"); - else if (TREE_PURPOSE (yyval.ttype) != class_type_node) - { - pedwarn ("template type parameters must use the keyword `class'"); - TREE_PURPOSE (yyval.ttype) = class_type_node; - } - ; - break;} -case 45: -#line 462 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); goto ttpa; ; - break;} -case 46: -#line 464 "parse.y" -{ yyval.ttype = build_tree_list (class_type_node, NULL_TREE); ; - break;} -case 47: -#line 466 "parse.y" -{ yyval.ttype = build_tree_list (class_type_node, yyvsp[0].ttype); ; - break;} -case 48: -#line 478 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 49: -#line 480 "parse.y" -{ yyval.ttype = build_tree_list (groktypename (yyvsp[0].ftype.t), yyvsp[-2].ttype); ; - break;} -case 50: -#line 482 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; - break;} -case 51: -#line 484 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-2].ftype.t); ; - break;} -case 52: -#line 490 "parse.y" -{ end_template_decl (); ; - break;} -case 53: -#line 493 "parse.y" -{ end_template_decl (); ; - break;} -case 54: -#line 498 "parse.y" -{; - break;} -case 55: -#line 500 "parse.y" -{; - break;} -case 56: -#line 502 "parse.y" -{ - note_list_got_semicolon (yyvsp[-2].ftype.t); - ; - break;} -case 57: -#line 506 "parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 59: -#line 509 "parse.y" -{ - tree t, attrs; - split_specs_attrs (yyvsp[-1].ftype.t, &t, &attrs); - shadow_tag (t); - note_list_got_semicolon (yyvsp[-1].ftype.t); - ; - break;} -case 63: -#line 522 "parse.y" -{ yyval.itype = 0; ; - break;} -case 64: -#line 524 "parse.y" -{ yyval.itype = 1; ; - break;} -case 70: -#line 540 "parse.y" -{ finish_function (lineno, (int)yyvsp[-1].itype, 0); ; - break;} -case 71: -#line 542 "parse.y" -{ ; - break;} -case 72: -#line 544 "parse.y" -{ ; - break;} -case 73: -#line 549 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, yyvsp[-1].ttype); - if (yyvsp[-2].ttype != current_class_type) - { - push_nested_class (yyvsp[-2].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - ; - break;} -case 74: -#line 558 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 75: -#line 560 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-4].ttype, yyvsp[-3].ttype); - if (yyvsp[-4].ttype != current_class_type) - { - push_nested_class (yyvsp[-4].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 76: -#line 570 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, yyvsp[-1].ttype); - if (yyvsp[-2].ttype != current_class_type) - { - push_nested_class (yyvsp[-2].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - ; - break;} -case 77: -#line 579 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 78: -#line 581 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-4].ttype, yyvsp[-3].ttype); - if (yyvsp[-4].ttype != current_class_type) - { - push_nested_class (yyvsp[-4].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 79: -#line 591 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, yyvsp[-1].ttype); - if (yyvsp[-2].ttype != current_class_type) - { - push_nested_class (yyvsp[-2].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - ; - break;} -case 80: -#line 600 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 81: -#line 602 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-4].ttype, yyvsp[-3].ttype); - if (yyvsp[-4].ttype != current_class_type) - { - push_nested_class (yyvsp[-4].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 82: -#line 612 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, yyvsp[-1].ttype); - if (yyvsp[-2].ttype != current_class_type) - { - push_nested_class (yyvsp[-2].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - ; - break;} -case 83: -#line 621 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 84: -#line 623 "parse.y" -{ - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-4].ttype, yyvsp[-3].ttype); - if (yyvsp[-4].ttype != current_class_type) - { - push_nested_class (yyvsp[-4].ttype, 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 85: -#line 636 "parse.y" -{ tree specs, attrs; - split_specs_attrs (yyvsp[-1].ftype.t, &specs, &attrs); - if (! start_function (specs, yyvsp[0].ttype, attrs, 0)) - YYERROR1; - reinit_parse_for_function (); - yyval.ttype = NULL_TREE; ; - break;} -case 86: -#line 643 "parse.y" -{ tree specs, attrs; - split_specs_attrs (yyvsp[-1].ttype, &specs, &attrs); - if (! start_function (specs, yyvsp[0].ttype, attrs, 0)) - YYERROR1; - reinit_parse_for_function (); - yyval.ttype = NULL_TREE; ; - break;} -case 87: -#line 650 "parse.y" -{ if (! start_function (NULL_TREE, yyval.ttype, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); - yyval.ttype = NULL_TREE; ; - break;} -case 88: -#line 655 "parse.y" -{ tree specs, attrs; - split_specs_attrs (yyvsp[-1].ttype, &specs, &attrs); - if (! start_function (specs, yyvsp[0].ttype, attrs, 0)) - YYERROR1; - reinit_parse_for_function (); - yyval.ttype = NULL_TREE; ; - break;} -case 89: -#line 662 "parse.y" -{ if (! start_function (NULL_TREE, yyval.ttype, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); - yyval.ttype = NULL_TREE; ; - break;} -case 90: -#line 670 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 91: -#line 672 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 92: -#line 674 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-5].ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 93: -#line 676 "parse.y" -{ yyval.ttype = make_call_declarator (yyvsp[-3].ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 94: -#line 683 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ttype); - yyval.ttype = start_method (specs, yyvsp[0].ttype); - rest_of_mdef: - if (! yyval.ttype) - YYERROR1; - if (yychar == YYEMPTY) - yychar = YYLEX; - reinit_parse_for_method (yychar, yyval.ttype); ; - break;} -case 95: -#line 692 "parse.y" -{ yyval.ttype = start_method (NULL_TREE, yyvsp[0].ttype); goto rest_of_mdef; ; - break;} -case 96: -#line 694 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ftype.t); - yyval.ttype = start_method (specs, yyvsp[0].ttype); goto rest_of_mdef; ; - break;} -case 97: -#line 697 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ttype); - yyval.ttype = start_method (specs, yyvsp[0].ttype); goto rest_of_mdef; ; - break;} -case 98: -#line 700 "parse.y" -{ yyval.ttype = start_method (NULL_TREE, yyval.ttype); goto rest_of_mdef; ; - break;} -case 99: -#line 702 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ttype); - yyval.ttype = start_method (specs, yyvsp[0].ttype); goto rest_of_mdef; ; - break;} -case 100: -#line 705 "parse.y" -{ yyval.ttype = start_method (NULL_TREE, yyval.ttype); goto rest_of_mdef; ; - break;} -case 101: -#line 710 "parse.y" -{ - if (! current_function_parms_stored) - store_parm_decls (); - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 102: -#line 719 "parse.y" -{ store_return_init (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 103: -#line 721 "parse.y" -{ store_return_init (yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 104: -#line 723 "parse.y" -{ store_return_init (yyval.ttype, NULL_TREE); ; - break;} -case 105: -#line 728 "parse.y" -{ - if (yyvsp[0].itype == 0) - error ("no base initializers given following ':'"); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - ; - break;} -case 106: -#line 741 "parse.y" -{ - if (! current_function_parms_stored) - store_parm_decls (); - - if (DECL_CONSTRUCTOR_P (current_function_decl)) - { - /* Make a contour for the initializer list. */ - pushlevel (0); - clear_last_expr (); - expand_start_bindings (0); - } - else if (current_class_type == NULL_TREE) - error ("base initializers not allowed for non-member functions"); - else if (! DECL_CONSTRUCTOR_P (current_function_decl)) - error ("only constructors take base initializers"); - ; - break;} -case 107: -#line 761 "parse.y" -{ yyval.itype = 0; ; - break;} -case 108: -#line 763 "parse.y" -{ yyval.itype = 1; ; - break;} -case 111: -#line 770 "parse.y" -{ - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, yyvsp[-1].ttype); - ; - break;} -case 112: -#line 776 "parse.y" -{ - if (current_class_name) - pedwarn ("anachronistic old style base class initializer"); - expand_member_init (current_class_ref, NULL_TREE, void_type_node); - ; - break;} -case 113: -#line 782 "parse.y" -{ expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 114: -#line 784 "parse.y" -{ expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; - break;} -case 115: -#line 786 "parse.y" -{ expand_member_init (current_class_ref, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 116: -#line 788 "parse.y" -{ expand_member_init (current_class_ref, yyvsp[-1].ttype, void_type_node); ; - break;} -case 117: -#line 791 "parse.y" -{ - do_member_init (OP0 (yyvsp[-3].ttype), OP1 (yyvsp[-3].ttype), yyvsp[-1].ttype); - ; - break;} -case 118: -#line 795 "parse.y" -{ - do_member_init (OP0 (yyvsp[-1].ttype), OP1 (yyvsp[-1].ttype), void_type_node); - ; - break;} -case 130: -#line 822 "parse.y" -{ do_type_instantiation (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 131: -#line 824 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ftype.t); - do_decl_instantiation (specs, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 132: -#line 827 "parse.y" -{ do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 133: -#line 829 "parse.y" -{ do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 134: -#line 831 "parse.y" -{ do_type_instantiation (yyvsp[0].ttype, yyvsp[-3].ttype); ; - break;} -case 135: -#line 833 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ftype.t); - do_decl_instantiation (specs, yyvsp[0].ttype, yyvsp[-3].ttype); ; - break;} -case 136: -#line 836 "parse.y" -{ do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype); ; - break;} -case 137: -#line 838 "parse.y" -{ do_decl_instantiation (NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype); ; - break;} -case 138: -#line 847 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 139: -#line 853 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-2].ttype, NULL_TREE, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 140: -#line 859 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 141: -#line 865 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-2].ttype, NULL_TREE, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 143: -#line 875 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 144: -#line 881 "parse.y" -{ - yyval.ttype = lookup_template_class (yyvsp[-2].ttype, NULL_TREE, NULL_TREE); - if (yyval.ttype != error_mark_node) - yyval.ttype = TYPE_STUB_DECL (yyval.ttype); - ; - break;} -case 146: -#line 891 "parse.y" -{ - /* Handle `Class<Class<Type>>' without space in the `>>' */ - pedwarn ("`>>' should be `> >' in template class name"); - yyungetc ('>', 1); - ; - break;} -case 147: -#line 900 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; - break;} -case 148: -#line 902 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 149: -#line 907 "parse.y" -{ yyval.ttype = groktypename (yyvsp[0].ftype.t); ; - break;} -case 151: -#line 913 "parse.y" -{ yyval.code = NEGATE_EXPR; ; - break;} -case 152: -#line 915 "parse.y" -{ yyval.code = CONVERT_EXPR; ; - break;} -case 153: -#line 917 "parse.y" -{ yyval.code = PREINCREMENT_EXPR; ; - break;} -case 154: -#line 919 "parse.y" -{ yyval.code = PREDECREMENT_EXPR; ; - break;} -case 155: -#line 921 "parse.y" -{ yyval.code = TRUTH_NOT_EXPR; ; - break;} -case 156: -#line 926 "parse.y" -{ yyval.ttype = build_x_compound_expr (yyval.ttype); ; - break;} -case 158: -#line 932 "parse.y" -{ error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - yyval.ttype = integer_zero_node; ; - break;} -case 159: -#line 936 "parse.y" -{ yyval.ttype = condition_conversion (yyvsp[-1].ttype); ; - break;} -case 160: -#line 941 "parse.y" -{ error ("ANSI C++ forbids an empty condition for `%s'", - cond_stmt_keyword); - yyval.ttype = integer_zero_node; ; - break;} -case 161: -#line 945 "parse.y" -{ yyval.ttype = condition_conversion (yyvsp[-1].ttype); ; - break;} -case 162: -#line 950 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 163: -#line 952 "parse.y" -{ yyval.ttype = condition_conversion (yyval.ttype); ; - break;} -case 164: -#line 954 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 165: -#line 959 "parse.y" -{ { - tree d; - for (d = getdecls (); d; d = TREE_CHAIN (d)) - if (TREE_CODE (d) == TYPE_DECL) { - tree s = TREE_TYPE (d); - if (TREE_CODE (s) == RECORD_TYPE) - cp_error ("definition of class `%T' in condition", s); - else if (TREE_CODE (s) == ENUMERAL_TYPE) - cp_error ("definition of enum `%T' in condition", s); - } - } - current_declspecs = yyvsp[-4].ftype.t; - yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); - cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype, - /*prefix_attributes*/ NULL_TREE); - ; - break;} -case 166: -#line 977 "parse.y" -{ - cp_finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-3].ttype, 1, LOOKUP_ONLYCONVERTING); - resume_momentary (yyvsp[-2].itype); - yyval.ttype = yyvsp[-1].ttype; - if (TREE_CODE (TREE_TYPE (yyval.ttype)) == ARRAY_TYPE) - cp_error ("definition of array `%#D' in condition", yyval.ttype); - ; - break;} -case 172: -#line 996 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (COMPOUND_STMT, NULL_TREE); - COMPOUND_STMT_NO_SCOPE (yyval.ttype) = 1; - add_tree (yyval.ttype); - } - ; - break;} -case 173: -#line 1005 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-1].ttype, 0) = TREE_CHAIN (yyvsp[-1].ttype); - TREE_CHAIN (yyvsp[-1].ttype) = NULL_TREE; - last_tree = yyvsp[-1].ttype; - } - finish_stmt (); - ; - break;} -case 175: -#line 1020 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, - build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 176: -#line 1023 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, - build_tree_list (NULL_TREE, error_mark_node)); ; - break;} -case 177: -#line 1026 "parse.y" -{ chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 178: -#line 1028 "parse.y" -{ chainon (yyval.ttype, build_tree_list (NULL_TREE, error_mark_node)); ; - break;} -case 179: -#line 1033 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; - break;} -case 181: -#line 1039 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 182: -#line 1042 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 183: -#line 1045 "parse.y" -{ yyval.ttype = build_x_indirect_ref (yyvsp[0].ttype, "unary *"); ; - break;} -case 184: -#line 1047 "parse.y" -{ yyval.ttype = build_x_unary_op (ADDR_EXPR, yyvsp[0].ttype); ; - break;} -case 185: -#line 1049 "parse.y" -{ yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, yyvsp[0].ttype); ; - break;} -case 186: -#line 1051 "parse.y" -{ yyval.ttype = build_x_unary_op (yyvsp[-1].code, yyvsp[0].ttype); - if (yyvsp[-1].code == NEGATE_EXPR && TREE_CODE (yyvsp[0].ttype) == INTEGER_CST) - TREE_NEGATED_INT (yyval.ttype) = 1; - overflow_warning (yyval.ttype); - ; - break;} -case 187: -#line 1058 "parse.y" -{ tree label = lookup_label (yyvsp[0].ttype); - if (label == NULL_TREE) - yyval.ttype = null_pointer_node; - else - { - TREE_USED (label) = 1; - yyval.ttype = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT (yyval.ttype) = 1; - } - ; - break;} -case 188: -#line 1069 "parse.y" -{ yyval.ttype = expr_sizeof (yyvsp[0].ttype); ; - break;} -case 189: -#line 1071 "parse.y" -{ yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ftype.t)); ; - break;} -case 190: -#line 1073 "parse.y" -{ yyval.ttype = grok_alignof (yyvsp[0].ttype); ; - break;} -case 191: -#line 1075 "parse.y" -{ yyval.ttype = c_alignof (groktypename (yyvsp[-1].ftype.t)); - check_for_new_type ("alignof", yyvsp[-1].ftype); ; - break;} -case 192: -#line 1081 "parse.y" -{ yyval.ttype = build_new (NULL_TREE, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-1].itype); - check_for_new_type ("new", yyvsp[0].ftype); ; - break;} -case 193: -#line 1084 "parse.y" -{ yyval.ttype = build_new (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-2].itype); - check_for_new_type ("new", yyvsp[-1].ftype); ; - break;} -case 194: -#line 1087 "parse.y" -{ yyval.ttype = build_new (yyvsp[-1].ttype, yyvsp[0].ftype.t, NULL_TREE, yyvsp[-2].itype); - check_for_new_type ("new", yyvsp[0].ftype); ; - break;} -case 195: -#line 1090 "parse.y" -{ yyval.ttype = build_new (yyvsp[-2].ttype, yyvsp[-1].ftype.t, yyvsp[0].ttype, yyvsp[-3].itype); - check_for_new_type ("new", yyvsp[-1].ftype); ; - break;} -case 196: -#line 1093 "parse.y" -{ yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-1].ftype.t), - NULL_TREE, yyvsp[-3].itype); - check_for_new_type ("new", yyvsp[-1].ftype); ; - break;} -case 197: -#line 1097 "parse.y" -{ yyval.ttype = build_new (NULL_TREE, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-4].itype); - check_for_new_type ("new", yyvsp[-2].ftype); ; - break;} -case 198: -#line 1100 "parse.y" -{ yyval.ttype = build_new (yyvsp[-3].ttype, groktypename(yyvsp[-1].ftype.t), NULL_TREE, yyvsp[-4].itype); - check_for_new_type ("new", yyvsp[-1].ftype); ; - break;} -case 199: -#line 1103 "parse.y" -{ yyval.ttype = build_new (yyvsp[-4].ttype, groktypename(yyvsp[-2].ftype.t), yyvsp[0].ttype, yyvsp[-5].itype); - check_for_new_type ("new", yyvsp[-2].ftype); ; - break;} -case 200: -#line 1107 "parse.y" -{ yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 0, yyvsp[-1].itype); ; - break;} -case 201: -#line 1109 "parse.y" -{ yyval.ttype = delete_sanity (yyvsp[0].ttype, NULL_TREE, 1, yyvsp[-3].itype); - if (yychar == YYEMPTY) - yychar = YYLEX; ; - break;} -case 202: -#line 1113 "parse.y" -{ yyval.ttype = delete_sanity (yyvsp[0].ttype, yyvsp[-2].ttype, 2, yyvsp[-4].itype); - if (yychar == YYEMPTY) - yychar = YYLEX; ; - break;} -case 203: -#line 1117 "parse.y" -{ yyval.ttype = build_x_unary_op (REALPART_EXPR, yyvsp[0].ttype); ; - break;} -case 204: -#line 1119 "parse.y" -{ yyval.ttype = build_x_unary_op (IMAGPART_EXPR, yyvsp[0].ttype); ; - break;} -case 205: -#line 1124 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 206: -#line 1126 "parse.y" -{ - yyval.ttype = yyvsp[-1].ttype; - pedwarn ("old style placement syntax, use () instead"); - ; - break;} -case 207: -#line 1134 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 208: -#line 1136 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 209: -#line 1138 "parse.y" -{ - cp_error ("`%T' is not a valid expression", yyvsp[-1].ftype.t); - yyval.ttype = error_mark_node; - ; - break;} -case 210: -#line 1146 "parse.y" -{ - if (pedantic) - pedwarn ("ANSI C++ forbids initialization of new expression with `='"); - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 211: -#line 1156 "parse.y" -{ yyvsp[-1].ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, void_list_node); - TREE_PARMLIST (yyvsp[-1].ftype.t) = 1; - yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", yyvsp[-1].ftype); ; - break;} -case 212: -#line 1161 "parse.y" -{ yyvsp[-1].ftype.t = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, void_list_node); - TREE_PARMLIST (yyvsp[-1].ftype.t) = 1; - yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-1].ftype.t, NULL_TREE, NULL_TREE); - check_for_new_type ("cast", yyvsp[-1].ftype); ; - break;} -case 214: -#line 1170 "parse.y" -{ yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 215: -#line 1172 "parse.y" -{ - tree init = build_nt (CONSTRUCTOR, NULL_TREE, - nreverse (yyvsp[-2].ttype)); - if (pedantic) - pedwarn ("ANSI C++ forbids constructor-expressions"); - /* Indicate that this was a GNU C constructor expression. */ - TREE_HAS_CONSTRUCTOR (init) = 1; - - yyval.ttype = reparse_absdcl_as_casts (yyval.ttype, init); - ; - break;} -case 217: -#line 1188 "parse.y" -{ yyval.ttype = build_x_binary_op (MEMBER_REF, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 218: -#line 1190 "parse.y" -{ yyval.ttype = build_m_component_ref (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 219: -#line 1192 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 220: -#line 1194 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 221: -#line 1196 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 222: -#line 1198 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 223: -#line 1200 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 224: -#line 1202 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 225: -#line 1204 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 226: -#line 1206 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 227: -#line 1208 "parse.y" -{ yyval.ttype = build_x_binary_op (LT_EXPR, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 228: -#line 1210 "parse.y" -{ yyval.ttype = build_x_binary_op (GT_EXPR, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 229: -#line 1212 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 230: -#line 1214 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 231: -#line 1216 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 232: -#line 1218 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 233: -#line 1220 "parse.y" -{ yyval.ttype = build_x_binary_op (yyvsp[-1].code, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 234: -#line 1222 "parse.y" -{ yyval.ttype = build_x_binary_op (TRUTH_ANDIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 235: -#line 1224 "parse.y" -{ yyval.ttype = build_x_binary_op (TRUTH_ORIF_EXPR, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 236: -#line 1226 "parse.y" -{ yyval.ttype = build_x_conditional_expr (yyval.ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 237: -#line 1228 "parse.y" -{ yyval.ttype = build_x_modify_expr (yyval.ttype, NOP_EXPR, yyvsp[0].ttype); - if (yyval.ttype != error_mark_node) - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; - break;} -case 238: -#line 1232 "parse.y" -{ yyval.ttype = build_x_modify_expr (yyval.ttype, yyvsp[-1].code, yyvsp[0].ttype); ; - break;} -case 239: -#line 1234 "parse.y" -{ yyval.ttype = build_throw (NULL_TREE); ; - break;} -case 240: -#line 1236 "parse.y" -{ yyval.ttype = build_throw (yyvsp[0].ttype); ; - break;} -case 241: -#line 1254 "parse.y" -{ yyval.ttype = build_parse_node (BIT_NOT_EXPR, yyvsp[0].ttype); ; - break;} -case 250: -#line 1270 "parse.y" -{ yyval.ttype = build_parse_node (INDIRECT_REF, yyvsp[0].ttype); ; - break;} -case 251: -#line 1272 "parse.y" -{ yyval.ttype = build_parse_node (ADDR_EXPR, yyvsp[0].ttype); ; - break;} -case 252: -#line 1274 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 255: -#line 1281 "parse.y" -{ yyval.ttype = finish_decl_parsing (yyvsp[-1].ttype); ; - break;} -case 256: -#line 1286 "parse.y" -{ - if (TREE_CODE (yyval.ttype) == BIT_NOT_EXPR) - yyval.ttype = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (yyval.ttype, 0)); - else - yyval.ttype = do_identifier (yyval.ttype, 1); - ; - break;} -case 259: -#line 1295 "parse.y" -{ - if (processing_template_decl) - push_obstacks (&permanent_obstack, &permanent_obstack); - yyval.ttype = combine_strings (yyval.ttype); - if (processing_template_decl) - pop_obstacks (); - ; - break;} -case 260: -#line 1303 "parse.y" -{ char class; - yyval.ttype = yyvsp[-1].ttype; - class = TREE_CODE_CLASS (TREE_CODE (yyval.ttype)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, ERROR_MARK); ; - break;} -case 261: -#line 1311 "parse.y" -{ char class; - yyval.ttype = reparse_decl_as_expr (NULL_TREE, yyvsp[-1].ttype); - class = TREE_CODE_CLASS (TREE_CODE (yyval.ttype)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, ERROR_MARK); ; - break;} -case 262: -#line 1319 "parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 263: -#line 1321 "parse.y" -{ if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - keep_next_level (); - yyval.ttype = expand_start_stmt_expr (); ; - break;} -case 264: -#line 1329 "parse.y" -{ tree rtl_exp; - if (pedantic) - pedwarn ("ANSI C++ forbids braced-groups within expressions"); - rtl_exp = expand_end_stmt_expr (yyvsp[-2].ttype); - /* The statements have side effects, so the group does. */ - TREE_SIDE_EFFECTS (rtl_exp) = 1; - - if (TREE_CODE (yyvsp[-1].ttype) == BLOCK) - { - /* Make a BIND_EXPR for the BLOCK already made. */ - yyval.ttype = build (BIND_EXPR, TREE_TYPE (rtl_exp), - NULL_TREE, rtl_exp, yyvsp[-1].ttype); - /* Remove the block from the tree at this point. - It gets put back at the proper place - when the BIND_EXPR is expanded. */ - delete_block (yyvsp[-1].ttype); - } - else - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 265: -#line 1350 "parse.y" -{ - yyval.ttype = build_x_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype, current_class_ref); - if (TREE_CODE (yyval.ttype) == CALL_EXPR - && TREE_TYPE (yyval.ttype) != void_type_node) - yyval.ttype = require_complete_type (yyval.ttype); - ; - break;} -case 266: -#line 1357 "parse.y" -{ - yyval.ttype = build_x_function_call (yyval.ttype, NULL_TREE, current_class_ref); - if (TREE_CODE (yyval.ttype) == CALL_EXPR - && TREE_TYPE (yyval.ttype) != void_type_node) - yyval.ttype = require_complete_type (yyval.ttype); - ; - break;} -case 267: -#line 1364 "parse.y" -{ yyval.ttype = grok_array_decl (yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 268: -#line 1366 "parse.y" -{ /* If we get an OFFSET_REF, turn it into what it really - means (e.g., a COMPONENT_REF). This way if we've got, - say, a reference to a static member that's being operated - on, we don't end up trying to find a member operator for - the class it's in. */ - if (TREE_CODE (yyval.ttype) == OFFSET_REF) - yyval.ttype = resolve_offset_ref (yyval.ttype); - yyval.ttype = build_x_unary_op (POSTINCREMENT_EXPR, yyval.ttype); ; - break;} -case 269: -#line 1375 "parse.y" -{ if (TREE_CODE (yyval.ttype) == OFFSET_REF) - yyval.ttype = resolve_offset_ref (yyval.ttype); - yyval.ttype = build_x_unary_op (POSTDECREMENT_EXPR, yyval.ttype); ; - break;} -case 270: -#line 1380 "parse.y" -{ if (current_class_ptr) - { -#ifdef WARNING_ABOUT_CCD - TREE_USED (current_class_ptr) = 1; -#endif - yyval.ttype = current_class_ptr; - } - else if (current_function_decl - && DECL_STATIC_FUNCTION_P (current_function_decl)) - { - error ("`this' is unavailable for static member functions"); - yyval.ttype = error_mark_node; - } - else - { - if (current_function_decl) - error ("invalid use of `this' in non-member function"); - else - error ("invalid use of `this' at top level"); - yyval.ttype = error_mark_node; - } - ; - break;} -case 271: -#line 1403 "parse.y" -{ - tree type; - tree id = yyval.ttype; - - /* This is a C cast in C++'s `functional' notation. */ - if (yyvsp[-1].ttype == error_mark_node) - { - yyval.ttype = error_mark_node; - break; - } -#if 0 - if (yyvsp[-1].ttype == NULL_TREE) - { - error ("cannot cast null list to type `%s'", - IDENTIFIER_POINTER (TYPE_NAME (id))); - yyval.ttype = error_mark_node; - break; - } -#endif -#if 0 - /* type is not set! (mrs) */ - if (type == error_mark_node) - yyval.ttype = error_mark_node; - else -#endif - { - if (id == ridpointers[(int) RID_CONST]) - type = build_type_variant (integer_type_node, 1, 0); - else if (id == ridpointers[(int) RID_VOLATILE]) - type = build_type_variant (integer_type_node, 0, 1); -#if 0 - /* should not be able to get here (mrs) */ - else if (id == ridpointers[(int) RID_FRIEND]) - { - error ("cannot cast expression to `friend' type"); - yyval.ttype = error_mark_node; - break; - } -#endif - else my_friendly_abort (79); - yyval.ttype = build_c_cast (type, build_compound_expr (yyvsp[-1].ttype)); - } - ; - break;} -case 273: -#line 1448 "parse.y" -{ tree type = groktypename (yyvsp[-4].ftype.t); - check_for_new_type ("dynamic_cast", yyvsp[-4].ftype); - yyval.ttype = build_dynamic_cast (type, yyvsp[-1].ttype); ; - break;} -case 274: -#line 1452 "parse.y" -{ tree type = groktypename (yyvsp[-4].ftype.t); - check_for_new_type ("static_cast", yyvsp[-4].ftype); - yyval.ttype = build_static_cast (type, yyvsp[-1].ttype); ; - break;} -case 275: -#line 1456 "parse.y" -{ tree type = groktypename (yyvsp[-4].ftype.t); - check_for_new_type ("reinterpret_cast", yyvsp[-4].ftype); - yyval.ttype = build_reinterpret_cast (type, yyvsp[-1].ttype); ; - break;} -case 276: -#line 1460 "parse.y" -{ tree type = groktypename (yyvsp[-4].ftype.t); - check_for_new_type ("const_cast", yyvsp[-4].ftype); - yyval.ttype = build_const_cast (type, yyvsp[-1].ttype); ; - break;} -case 277: -#line 1464 "parse.y" -{ yyval.ttype = build_x_typeid (yyvsp[-1].ttype); ; - break;} -case 278: -#line 1466 "parse.y" -{ tree type = groktypename (yyvsp[-1].ftype.t); - check_for_new_type ("typeid", yyvsp[-1].ftype); - yyval.ttype = get_typeid (TYPE_MAIN_VARIANT (type)); ; - break;} -case 279: -#line 1470 "parse.y" -{ yyval.ttype = do_scoped_id (yyvsp[0].ttype, 1); ; - break;} -case 280: -#line 1472 "parse.y" -{ - got_scope = NULL_TREE; - if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) - yyval.ttype = do_scoped_id (yyvsp[0].ttype, 1); - else - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 281: -#line 1480 "parse.y" -{ yyval.ttype = build_offset_ref (OP0 (yyval.ttype), OP1 (yyval.ttype)); ; - break;} -case 282: -#line 1482 "parse.y" -{ if (processing_template_decl) - yyval.ttype = build_min_nt (CALL_EXPR, copy_to_permanent (yyvsp[-3].ttype), yyvsp[-1].ttype, NULL_TREE); - else - yyval.ttype = build_member_call (OP0 (yyval.ttype), OP1 (yyval.ttype), yyvsp[-1].ttype); ; - break;} -case 283: -#line 1487 "parse.y" -{ if (processing_template_decl) - yyval.ttype = build_min_nt (CALL_EXPR, copy_to_permanent (yyvsp[-1].ttype), - NULL_TREE, NULL_TREE); - else - yyval.ttype = build_member_call (OP0 (yyval.ttype), OP1 (yyval.ttype), NULL_TREE); ; - break;} -case 284: -#line 1493 "parse.y" -{ yyval.ttype = build_x_component_ref (yyval.ttype, yyvsp[0].ttype, NULL_TREE, 1); ; - break;} -case 285: -#line 1495 "parse.y" -{ if (processing_template_decl) - yyval.ttype = build_min_nt (COMPONENT_REF, yyvsp[-1].ttype, copy_to_permanent (yyvsp[0].ttype)); - else - yyval.ttype = build_object_ref (yyval.ttype, OP0 (yyvsp[0].ttype), OP1 (yyvsp[0].ttype)); ; - break;} -case 286: -#line 1500 "parse.y" -{ -#if 0 - /* This is a future direction of this code, but because - build_x_function_call cannot always undo what is done - in build_component_ref entirely yet, we cannot do this. */ - yyval.ttype = build_x_function_call (build_component_ref (yyval.ttype, yyvsp[-3].ttype, NULL_TREE, 1), yyvsp[-1].ttype, current_class_ref); - if (TREE_CODE (yyval.ttype) == CALL_EXPR - && TREE_TYPE (yyval.ttype) != void_type_node) - yyval.ttype = require_complete_type (yyval.ttype); -#else - yyval.ttype = build_method_call (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE, - LOOKUP_NORMAL); -#endif - ; - break;} -case 287: -#line 1515 "parse.y" -{ -#if 0 - /* This is a future direction of this code, but because - build_x_function_call cannot always undo what is done - in build_component_ref entirely yet, we cannot do this. */ - yyval.ttype = build_x_function_call (build_component_ref (yyval.ttype, yyvsp[-1].ttype, NULL_TREE, 1), NULL_TREE, current_class_ref); - if (TREE_CODE (yyval.ttype) == CALL_EXPR - && TREE_TYPE (yyval.ttype) != void_type_node) - yyval.ttype = require_complete_type (yyval.ttype); -#else - yyval.ttype = build_method_call (yyval.ttype, yyvsp[-1].ttype, NULL_TREE, NULL_TREE, - LOOKUP_NORMAL); -#endif - ; - break;} -case 288: -#line 1530 "parse.y" -{ - if (IS_SIGNATURE (OP0 (yyvsp[-3].ttype))) - { - warning ("signature name in scope resolution ignored"); - yyval.ttype = build_method_call (yyval.ttype, OP1 (yyvsp[-3].ttype), yyvsp[-1].ttype, NULL_TREE, - LOOKUP_NORMAL); - } - else - yyval.ttype = build_scoped_method_call (yyval.ttype, OP0 (yyvsp[-3].ttype), OP1 (yyvsp[-3].ttype), yyvsp[-1].ttype); - ; - break;} -case 289: -#line 1541 "parse.y" -{ - if (IS_SIGNATURE (OP0 (yyvsp[-1].ttype))) - { - warning ("signature name in scope resolution ignored"); - yyval.ttype = build_method_call (yyval.ttype, OP1 (yyvsp[-1].ttype), NULL_TREE, NULL_TREE, - LOOKUP_NORMAL); - } - else - yyval.ttype = build_scoped_method_call (yyval.ttype, OP0 (yyvsp[-1].ttype), OP1 (yyvsp[-1].ttype), NULL_TREE); - ; - break;} -case 290: -#line 1553 "parse.y" -{ - if (IDENTIFIER_GLOBAL_VALUE (yyvsp[-1].ttype) - && (TREE_CODE (TREE_TYPE (yyvsp[-3].ttype)) - != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (yyvsp[-1].ttype))))) - cp_error ("`%E' is not of type `%T'", yyvsp[-3].ttype, yyvsp[-1].ttype); - yyval.ttype = cp_convert (void_type_node, yyvsp[-3].ttype); - ; - break;} -case 291: -#line 1561 "parse.y" -{ - if (yyvsp[-4].ttype != yyvsp[-1].ttype) - cp_error ("destructor specifier `%T::~%T()' must have matching names", yyvsp[-4].ttype, yyvsp[-1].ttype); - if (TREE_CODE (TREE_TYPE (yyvsp[-5].ttype)) - != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (yyvsp[-4].ttype)))) - cp_error ("`%E' is not of type `%T'", yyvsp[-5].ttype, yyvsp[-4].ttype); - yyval.ttype = cp_convert (void_type_node, yyvsp[-5].ttype); - ; - break;} -case 292: -#line 1570 "parse.y" -{ - yyval.ttype = error_mark_node; - ; - break;} -case 293: -#line 1615 "parse.y" -{ yyval.itype = 0; ; - break;} -case 294: -#line 1617 "parse.y" -{ got_scope = NULL_TREE; yyval.itype = 1; ; - break;} -case 295: -#line 1622 "parse.y" -{ yyval.itype = 0; ; - break;} -case 296: -#line 1624 "parse.y" -{ got_scope = NULL_TREE; yyval.itype = 1; ; - break;} -case 297: -#line 1629 "parse.y" -{ yyval.ttype = boolean_true_node; ; - break;} -case 298: -#line 1631 "parse.y" -{ yyval.ttype = boolean_false_node; ; - break;} -case 300: -#line 1638 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 301: -#line 1643 "parse.y" -{ - if (! current_function_parms_stored) - store_parm_decls (); - setup_vtbl_ptr (); - /* Always keep the BLOCK node associated with the outermost - pair of curley braces of a function. These are needed - for correct operation of dwarfout.c. */ - keep_next_level (); - ; - break;} -case 302: -#line 1656 "parse.y" -{ got_object = TREE_TYPE (yyval.ttype); ; - break;} -case 303: -#line 1658 "parse.y" -{ - yyval.ttype = build_x_arrow (yyval.ttype); - got_object = TREE_TYPE (yyval.ttype); - ; - break;} -case 304: -#line 1666 "parse.y" -{ - resume_momentary (yyvsp[-1].itype); - if (yyvsp[-2].ftype.t && IS_AGGR_TYPE_CODE (TREE_CODE (yyvsp[-2].ftype.t))) - note_got_semicolon (yyvsp[-2].ftype.t); - ; - break;} -case 305: -#line 1672 "parse.y" -{ - resume_momentary (yyvsp[-1].itype); - note_list_got_semicolon (yyvsp[-2].ftype.t); - ; - break;} -case 306: -#line 1677 "parse.y" -{ resume_momentary (yyvsp[-1].itype); ; - break;} -case 307: -#line 1679 "parse.y" -{ - shadow_tag (yyvsp[-1].ftype.t); - note_list_got_semicolon (yyvsp[-1].ftype.t); - ; - break;} -case 308: -#line 1684 "parse.y" -{ warning ("empty declaration"); ; - break;} -case 309: -#line 1686 "parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 312: -#line 1700 "parse.y" -{ yyval.ttype = make_call_declarator (NULL_TREE, empty_parms (), - NULL_TREE, NULL_TREE); ; - break;} -case 313: -#line 1703 "parse.y" -{ yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), NULL_TREE, - NULL_TREE); ; - break;} -case 314: -#line 1710 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 315: -#line 1713 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 316: -#line 1716 "parse.y" -{ yyval.ftype.t = build_decl_list (get_decl_list (yyvsp[-1].ftype.t), yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 317: -#line 1719 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[0].ftype.t, NULL_TREE); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 318: -#line 1722 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[0].ftype.t, NULL_TREE); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 321: -#line 1738 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ttype); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 322: -#line 1741 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 323: -#line 1744 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-2].ftype.t, chainon (yyvsp[-1].ttype, yyvsp[0].ttype)); - yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; - break;} -case 324: -#line 1747 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ttype)); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 325: -#line 1750 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ttype)); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 326: -#line 1753 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-2].ftype.t, - chainon (yyvsp[-1].ttype, chainon (yyvsp[0].ttype, yyvsp[-3].ttype))); - yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; - break;} -case 327: -#line 1760 "parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyval.ttype)); - yyval.ttype = build_decl_list (NULL_TREE, yyval.ttype); ; - break;} -case 328: -#line 1765 "parse.y" -{ yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyval.ttype); ; - break;} -case 329: -#line 1767 "parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 330: -#line 1772 "parse.y" -{ yyval.ttype = decl_tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 331: -#line 1774 "parse.y" -{ yyval.ttype = decl_tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; - break;} -case 332: -#line 1784 "parse.y" -{ yyval.ttype = yyvsp[0].ftype.t; TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 333: -#line 1786 "parse.y" -{ yyval.ttype = IDENTIFIER_AS_LIST (yyval.ttype); ; - break;} -case 334: -#line 1788 "parse.y" -{ yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); - TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 335: -#line 1791 "parse.y" -{ if (extra_warnings && TREE_STATIC (yyval.ttype)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); - TREE_STATIC (yyval.ttype) = TREE_STATIC (yyvsp[-1].ttype); ; - break;} -case 336: -#line 1797 "parse.y" -{ yyval.ttype = decl_tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 337: -#line 1799 "parse.y" -{ yyval.ttype = decl_tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; - break;} -case 338: -#line 1810 "parse.y" -{ yyval.ftype.t = get_decl_list (yyvsp[0].ftype.t); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 339: -#line 1813 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ftype.t); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 340: -#line 1816 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 341: -#line 1819 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[-1].ftype.t, chainon (yyvsp[0].ttype, yyvsp[-2].ftype.t)); - yyval.ftype.new_type_flag = yyvsp[-2].ftype.new_type_flag; ; - break;} -case 342: -#line 1825 "parse.y" -{ yyval.ttype = build_decl_list (NULL_TREE, yyvsp[0].ftype.t); ; - break;} -case 343: -#line 1827 "parse.y" -{ yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ftype.t, yyvsp[-1].ttype); ; - break;} -case 345: -#line 1837 "parse.y" -{ yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; - break;} -case 346: -#line 1839 "parse.y" -{ yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; - break;} -case 347: -#line 1841 "parse.y" -{ yyval.ftype.t = TREE_TYPE (yyvsp[-1].ttype); - yyval.ftype.new_type_flag = 0; ; - break;} -case 348: -#line 1844 "parse.y" -{ yyval.ftype.t = groktypename (yyvsp[-1].ftype.t); - yyval.ftype.new_type_flag = 0; ; - break;} -case 349: -#line 1847 "parse.y" -{ tree type = TREE_TYPE (yyvsp[-1].ttype); - - yyval.ftype.new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - yyval.ftype.t = type; - } - else - { - error ("`sigof' applied to non-aggregate expression"); - yyval.ftype.t = error_mark_node; - } - ; - break;} -case 350: -#line 1862 "parse.y" -{ tree type = groktypename (yyvsp[-1].ftype.t); - - yyval.ftype.new_type_flag = 0; - if (IS_AGGR_TYPE (type)) - { - sorry ("sigof type specifier"); - yyval.ftype.t = type; - } - else - { - error("`sigof' applied to non-aggregate type"); - yyval.ftype.t = error_mark_node; - } - ; - break;} -case 351: -#line 1882 "parse.y" -{ yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; - break;} -case 352: -#line 1884 "parse.y" -{ yyval.ftype.t = yyvsp[0].ttype; yyval.ftype.new_type_flag = 0; ; - break;} -case 360: -#line 1905 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 361: -#line 1907 "parse.y" -{ if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 362: -#line 1912 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - if (current_declspecs - && TREE_CODE (current_declspecs) != TREE_LIST) - current_declspecs = get_decl_list (current_declspecs); - if (have_extern_spec && !used_extern_spec) - { - current_declspecs = decl_tree_cons - (NULL_TREE, get_identifier ("extern"), - current_declspecs); - used_extern_spec = 1; - } - yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); - cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype, prefix_attributes); ; - break;} -case 363: -#line 1929 "parse.y" -{ cp_finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 1, LOOKUP_ONLYCONVERTING); - yyval.itype = yyvsp[-2].itype; ; - break;} -case 364: -#line 1932 "parse.y" -{ tree d; - split_specs_attrs (yyvsp[-3].ttype, ¤t_declspecs, - &prefix_attributes); - if (current_declspecs - && TREE_CODE (current_declspecs) != TREE_LIST) - current_declspecs = get_decl_list (current_declspecs); - if (have_extern_spec && !used_extern_spec) - { - current_declspecs = decl_tree_cons - (NULL_TREE, get_identifier ("extern"), - current_declspecs); - used_extern_spec = 1; - } - yyval.itype = suspend_momentary (); - d = start_decl (yyvsp[-2].ttype, current_declspecs, 0); - cplus_decl_attributes (d, yyvsp[0].ttype, prefix_attributes); - cp_finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 1, 0); ; - break;} -case 365: -#line 1953 "parse.y" -{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); - cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype, prefix_attributes); ; - break;} -case 366: -#line 1957 "parse.y" -{ cp_finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 1, LOOKUP_ONLYCONVERTING); ; - break;} -case 367: -#line 1959 "parse.y" -{ yyval.ttype = start_decl (yyvsp[-2].ttype, current_declspecs, 0); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); - cp_finish_decl (yyval.ttype, NULL_TREE, yyvsp[-1].ttype, 1, 0); ; - break;} -case 368: -#line 1966 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); - cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype, prefix_attributes); ; - break;} -case 369: -#line 1973 "parse.y" -{ cp_finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 1, LOOKUP_ONLYCONVERTING); - yyval.itype = yyvsp[-2].itype; ; - break;} -case 370: -#line 1976 "parse.y" -{ tree d; - split_specs_attrs (yyvsp[-3].ttype, ¤t_declspecs, - &prefix_attributes); - yyval.itype = suspend_momentary (); - d = start_decl (yyvsp[-2].ttype, current_declspecs, 0); - cplus_decl_attributes (d, yyvsp[0].ttype, prefix_attributes); - cp_finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 1, 0); ; - break;} -case 371: -#line 1987 "parse.y" -{ current_declspecs = NULL_TREE; - prefix_attributes = NULL_TREE; - yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); - cplus_decl_attributes (yyval.ttype, yyvsp[-1].ttype, prefix_attributes); ; - break;} -case 372: -#line 1994 "parse.y" -{ cp_finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype, 1, LOOKUP_ONLYCONVERTING); - yyval.itype = yyvsp[-2].itype; ; - break;} -case 373: -#line 1997 "parse.y" -{ tree d; - current_declspecs = NULL_TREE; - prefix_attributes = NULL_TREE; - yyval.itype = suspend_momentary (); - d = start_decl (yyvsp[-2].ttype, current_declspecs, 0); - cplus_decl_attributes (d, yyvsp[0].ttype, prefix_attributes); - cp_finish_decl (d, NULL_TREE, yyvsp[-1].ttype, 1, 0); ; - break;} -case 374: -#line 2010 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 375: -#line 2012 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 376: -#line 2017 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 377: -#line 2019 "parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 378: -#line 2024 "parse.y" -{ yyval.ttype = yyvsp[-2].ttype; ; - break;} -case 379: -#line 2029 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 380: -#line 2031 "parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 381: -#line 2036 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 382: -#line 2038 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 383: -#line 2040 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; - break;} -case 384: -#line 2042 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; - break;} -case 385: -#line 2044 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 390: -#line 2060 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 391: -#line 2062 "parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 392: -#line 2067 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 393: -#line 2069 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 395: -#line 2077 "parse.y" -{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); - TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; - break;} -case 396: -#line 2080 "parse.y" -{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-1].ttype)); - TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; - break;} -case 397: -#line 2083 "parse.y" -{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); - TREE_HAS_CONSTRUCTOR (yyval.ttype) = 1; ; - break;} -case 398: -#line 2086 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 399: -#line 2093 "parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyval.ttype); ; - break;} -case 400: -#line 2095 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 401: -#line 2098 "parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 402: -#line 2100 "parse.y" -{ yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 403: -#line 2102 "parse.y" -{ yyval.ttype = build_tree_list (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 404: -#line 2104 "parse.y" -{ yyval.ttype = tree_cons (yyvsp[-2].ttype, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 405: -#line 2109 "parse.y" -{ start_function (NULL_TREE, TREE_VALUE (yyvsp[0].ttype), - NULL_TREE, 1); - reinit_parse_for_function (); ; - break;} -case 406: -#line 2115 "parse.y" -{ - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - finish_function (lineno, (int)yyvsp[-1].itype, nested); - process_next_inline (yyvsp[-3].ttype); - ; - break;} -case 407: -#line 2122 "parse.y" -{ process_next_inline (yyvsp[-2].ttype); ; - break;} -case 408: -#line 2124 "parse.y" -{ process_next_inline (yyvsp[-2].ttype); ; - break;} -case 411: -#line 2136 "parse.y" -{ replace_defarg (yyvsp[-2].ttype, yyvsp[-1].ttype); ; - break;} -case 412: -#line 2138 "parse.y" -{ replace_defarg (yyvsp[-2].ttype, error_mark_node); ; - break;} -case 414: -#line 2143 "parse.y" -{ do_pending_defargs (); ; - break;} -case 415: -#line 2145 "parse.y" -{ do_pending_defargs (); ; - break;} -case 416: -#line 2150 "parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (yyvsp[-1].ttype); ; - break;} -case 417: -#line 2153 "parse.y" -{ yyval.ftype.t = finish_enum (yyvsp[-3].ttype, yyvsp[-2].ttype); - yyval.ftype.new_type_flag = 1; - resume_momentary ((int) yyvsp[-4].itype); - check_for_missing_semicolon (yyvsp[-3].ttype); ; - break;} -case 418: -#line 2158 "parse.y" -{ yyval.ftype.t = finish_enum (start_enum (yyvsp[-2].ttype), NULL_TREE); - yyval.ftype.new_type_flag = 1; - check_for_missing_semicolon (yyval.ftype.t); ; - break;} -case 419: -#line 2162 "parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (make_anon_name ()); ; - break;} -case 420: -#line 2165 "parse.y" -{ yyval.ftype.t = finish_enum (yyvsp[-3].ttype, yyvsp[-2].ttype); - resume_momentary ((int) yyvsp[-5].itype); - check_for_missing_semicolon (yyvsp[-3].ttype); - yyval.ftype.new_type_flag = 1; ; - break;} -case 421: -#line 2170 "parse.y" -{ yyval.ftype.t = finish_enum (start_enum (make_anon_name()), NULL_TREE); - yyval.ftype.new_type_flag = 1; - check_for_missing_semicolon (yyval.ftype.t); ; - break;} -case 422: -#line 2174 "parse.y" -{ yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, NULL_TREE, 1); - yyval.ftype.new_type_flag = 0; ; - break;} -case 423: -#line 2177 "parse.y" -{ yyval.ftype.t = xref_tag (enum_type_node, yyvsp[0].ttype, NULL_TREE, 1); - yyval.ftype.new_type_flag = 0; ; - break;} -case 424: -#line 2180 "parse.y" -{ yyval.ftype.t = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ftype.new_type_flag = 0; ; - break;} -case 425: -#line 2183 "parse.y" -{ yyval.ftype.t = make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ftype.new_type_flag = 0; ; - break;} -case 426: -#line 2187 "parse.y" -{ - int semi; - tree id; - - yyval.ttype = yyvsp[-4].ttype; -#if 0 - /* Need to rework class nesting in the - presence of nested classes, etc. */ - shadow_tag (CLASSTYPE_AS_LIST (yyvsp[-4].ttype)); */ -#endif - if (yychar == YYEMPTY) - yychar = YYLEX; - semi = yychar == ';'; - /* finish_struct nukes this anyway; if - finish_exception does too, then it can go. */ - if (semi) - note_got_semicolon (yyvsp[-4].ttype); - - if (TREE_CODE (yyvsp[-4].ttype) == ENUMERAL_TYPE) - ; - else - { - yyval.ttype = finish_struct (yyvsp[-4].ttype, yyvsp[-2].ttype, yyvsp[0].ttype, semi); - if (semi) note_got_semicolon (yyval.ttype); - } - - pop_obstacks (); - - if (! semi) - check_for_missing_semicolon (yyvsp[-4].ttype); - if (current_scope () == current_function_decl) - do_pending_defargs (yyvsp[-4].ttype); - ; - break;} -case 427: -#line 2221 "parse.y" -{ - if (pending_inlines - && current_scope () == current_function_decl) - do_pending_inlines (); - ; - break;} -case 428: -#line 2227 "parse.y" -{ - yyval.ftype.t = yyvsp[-3].ttype; - yyval.ftype.new_type_flag = 1; - if (current_scope () == current_function_decl) - clear_inline_text_obstack (); - ; - break;} -case 429: -#line 2234 "parse.y" -{ - yyval.ftype.t = yyvsp[0].ttype; - yyval.ftype.new_type_flag = 0; - /* struct B: public A; is not accepted by the WP grammar. */ - if (TYPE_BINFO_BASETYPES (yyval.ftype.t) && !TYPE_SIZE (yyval.ftype.t) - && ! TYPE_BEING_DEFINED (yyval.ftype.t)) - cp_error ("base clause without member specification for `%#T'", - yyval.ftype.t); - ; - break;} -case 433: -#line 2253 "parse.y" -{ if (pedantic && !in_system_header) - pedwarn ("comma at end of enumerator list"); ; - break;} -case 435: -#line 2260 "parse.y" -{ error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} -case 436: -#line 2262 "parse.y" -{ error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} -case 437: -#line 2264 "parse.y" -{ error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER (yyvsp[0].ttype)); ; - break;} -case 438: -#line 2266 "parse.y" -{ error ("no body nor ';' separates two class, struct or union declarations"); ; - break;} -case 439: -#line 2271 "parse.y" -{ current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; - break;} -case 440: -#line 2276 "parse.y" -{ current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; - break;} -case 441: -#line 2281 "parse.y" -{ - current_aggr = yyvsp[-2].ttype; - if (TREE_CODE (yyvsp[0].ttype) == TYPE_DECL) - yyval.ttype = yyvsp[0].ttype; - else - { - cp_error ("`%T' does not have a nested type named `%D'", - yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = xref_tag - (current_aggr, make_anon_name (), NULL_TREE, 1); - yyval.ttype = TYPE_MAIN_DECL (yyval.ttype); - } - ; - break;} -case 442: -#line 2295 "parse.y" -{ current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; - break;} -case 443: -#line 2297 "parse.y" -{ current_aggr = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; - break;} -case 444: -#line 2302 "parse.y" -{ yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, NULL_TREE, 0); ; - break;} -case 445: -#line 2307 "parse.y" -{ yyval.ttype = xref_tag (current_aggr, yyvsp[0].ttype, NULL_TREE, 1); ; - break;} -case 446: -#line 2310 "parse.y" -{ - yyval.ttype = yyvsp[-1].ttype; - if (yyvsp[0].ttype) - xref_basetypes (current_aggr, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 447: -#line 2316 "parse.y" -{ - yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); - if (TREE_INT_CST_LOW (current_aggr) == union_type - && TREE_CODE (yyval.ttype) != UNION_TYPE) - cp_pedwarn ("`union' tag used in declaring `%#T'", yyval.ttype); - else if (TREE_CODE (yyval.ttype) == UNION_TYPE - && TREE_INT_CST_LOW (current_aggr) != union_type) - cp_pedwarn ("non-`union' tag used in declaring `%#T'", yyval.ttype); - if (yyvsp[0].ttype) - { - if (IS_AGGR_TYPE (yyval.ttype) && CLASSTYPE_USE_TEMPLATE (yyval.ttype)) - { - if (CLASSTYPE_IMPLICIT_INSTANTIATION (yyval.ttype) - && TYPE_SIZE (yyval.ttype) == NULL_TREE) - { - SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (yyval.ttype); - if (processing_template_decl) - push_template_decl (TYPE_MAIN_DECL (yyval.ttype)); - } - else if (CLASSTYPE_TEMPLATE_INSTANTIATION (yyval.ttype)) - cp_error ("specialization after instantiation of `%T'", yyval.ttype); - } - xref_basetypes (current_aggr, yyvsp[-1].ttype, yyval.ttype, yyvsp[0].ttype); - } - ; - break;} -case 448: -#line 2345 "parse.y" -{ yyval.ttype = xref_tag (yyval.ttype, make_anon_name (), NULL_TREE, 0); - yyungetc ('{', 1); ; - break;} -case 451: -#line 2356 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 452: -#line 2358 "parse.y" -{ yyungetc(':', 1); yyval.ttype = NULL_TREE; ; - break;} -case 453: -#line 2360 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 455: -#line 2366 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 456: -#line 2371 "parse.y" -{ - tree type = TREE_TYPE (yyvsp[0].ttype); - if (! is_aggr_type (type, 1)) - yyval.ttype = NULL_TREE; - else if (current_aggr == signature_type_node - && (! type) && (! IS_SIGNATURE (type))) - { - error ("class name not allowed as base signature"); - yyval.ttype = NULL_TREE; - } - else if (current_aggr == signature_type_node) - { - sorry ("signature inheritance, base type `%s' ignored", - IDENTIFIER_POINTER (yyval.ttype)); - yyval.ttype = build_tree_list (access_public_node, type); - } - else if (type && IS_SIGNATURE (type)) - { - error ("signature name not allowed as base class"); - yyval.ttype = NULL_TREE; - } - else - yyval.ttype = build_tree_list (access_default_node, type); - ; - break;} -case 457: -#line 2396 "parse.y" -{ - tree type = TREE_TYPE (yyvsp[0].ttype); - if (current_aggr == signature_type_node) - error ("access and source specifiers not allowed in signature"); - if (! IS_AGGR_TYPE (type)) - yyval.ttype = NULL_TREE; - else if (current_aggr == signature_type_node - && (! type) && (! IS_SIGNATURE (type))) - { - error ("class name not allowed as base signature"); - yyval.ttype = NULL_TREE; - } - else if (current_aggr == signature_type_node) - { - sorry ("signature inheritance, base type `%s' ignored", - IDENTIFIER_POINTER (yyval.ttype)); - yyval.ttype = build_tree_list (access_public_node, type); - } - else if (type && IS_SIGNATURE (type)) - { - error ("signature name not allowed as base class"); - yyval.ttype = NULL_TREE; - } - else - yyval.ttype = build_tree_list (yyval.ttype, type); - ; - break;} -case 459: -#line 2427 "parse.y" -{ yyval.ttype = TYPE_MAIN_DECL (make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype)); ; - break;} -case 460: -#line 2429 "parse.y" -{ yyval.ttype = TYPE_MAIN_DECL (make_typename_type (yyvsp[-1].ttype, yyvsp[0].ttype)); ; - break;} -case 461: -#line 2431 "parse.y" -{ - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (TREE_TYPE (yyvsp[-1].ttype))) - { - sorry ("`sigof' as base signature specifier"); - yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - yyval.ttype = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - yyval.ttype = error_mark_node; - } - ; - break;} -case 462: -#line 2452 "parse.y" -{ - if (current_aggr == signature_type_node) - { - if (IS_AGGR_TYPE (groktypename (yyvsp[-1].ftype.t))) - { - sorry ("`sigof' as base signature specifier"); - yyval.ttype = groktypename (yyvsp[-1].ftype.t); - } - else - { - error ("`sigof' applied to non-aggregate expression"); - yyval.ttype = error_mark_node; - } - } - else - { - error ("`sigof' in struct or class declaration"); - yyval.ttype = error_mark_node; - } - ; - break;} -case 464: -#line 2477 "parse.y" -{ if (yyval.ttype != ridpointers[(int)RID_VIRTUAL]) - sorry ("non-virtual access"); - yyval.ttype = access_default_virtual_node; ; - break;} -case 465: -#line 2481 "parse.y" -{ int err = 0; - if (yyvsp[-1].ttype == access_protected_node) - { - warning ("`protected' access not implemented"); - yyvsp[-1].ttype = access_public_node; - err++; - } - else if (yyvsp[-1].ttype == access_public_node) - { - if (yyvsp[-2].ttype == access_private_node) - { - mixed: - error ("base class cannot be public and private"); - } - else if (yyvsp[-2].ttype == access_default_virtual_node) - yyval.ttype = access_public_virtual_node; - } - else /* $2 == access_private_node */ - { - if (yyvsp[-2].ttype == access_public_node) - goto mixed; - else if (yyvsp[-2].ttype == access_default_virtual_node) - yyval.ttype = access_private_virtual_node; - } - ; - break;} -case 466: -#line 2507 "parse.y" -{ if (yyvsp[-1].ttype != ridpointers[(int)RID_VIRTUAL]) - sorry ("non-virtual access"); - if (yyval.ttype == access_public_node) - yyval.ttype = access_public_virtual_node; - else if (yyval.ttype == access_private_node) - yyval.ttype = access_private_virtual_node; ; - break;} -case 467: -#line 2517 "parse.y" -{ tree t = yyvsp[-1].ttype; - push_obstacks_nochange (); - end_temporary_allocation (); - - if (t == error_mark_node - || ! IS_AGGR_TYPE (t)) - { - t = yyvsp[-1].ttype = make_lang_type (RECORD_TYPE); - pushtag (make_anon_name (), t, 0); - } - if (TYPE_SIZE (t)) - duplicate_tag_error (t); - if (TYPE_SIZE (t) || TYPE_BEING_DEFINED (t)) - { - t = make_lang_type (TREE_CODE (t)); - pushtag (TYPE_IDENTIFIER (yyvsp[-1].ttype), t, 0); - yyvsp[-1].ttype = t; - } - if (processing_template_decl && TYPE_CONTEXT (t) - && ! current_class_type) - push_template_decl (TYPE_STUB_DECL (t)); - pushclass (t, 0); - TYPE_BEING_DEFINED (t) = 1; - if (IS_AGGR_TYPE (t) && CLASSTYPE_USE_TEMPLATE (t)) - { - if (CLASSTYPE_IMPLICIT_INSTANTIATION (t) - && TYPE_SIZE (t) == NULL_TREE) - { - SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (t); - if (processing_template_decl) - push_template_decl (TYPE_MAIN_DECL (t)); - } - else if (CLASSTYPE_TEMPLATE_INSTANTIATION (t)) - cp_error ("specialization after instantiation of `%T'", t); - } - /* Reset the interface data, at the earliest possible - moment, as it might have been set via a class foo; - before. */ - /* Don't change signatures. */ - if (! IS_SIGNATURE (t)) - { - extern tree pending_vtables; - int needs_writing; - tree name = TYPE_IDENTIFIER (t); - - if (! ANON_AGGRNAME_P (name)) - { - CLASSTYPE_INTERFACE_ONLY (t) = interface_only; - SET_CLASSTYPE_INTERFACE_UNKNOWN_X - (t, interface_unknown); - } - - /* Record how to set the access of this class's - virtual functions. If write_virtuals == 2 or 3, then - inline virtuals are ``extern inline''. */ - switch (write_virtuals) - { - case 0: - case 1: - needs_writing = 1; - break; - case 2: - needs_writing = !! value_member (name, pending_vtables); - break; - case 3: - needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t) - && CLASSTYPE_INTERFACE_KNOWN (t); - break; - default: - needs_writing = 0; - } - CLASSTYPE_VTABLE_NEEDS_WRITING (t) = needs_writing; - } -#if 0 - t = TYPE_IDENTIFIER (yyvsp[-1].ttype); - if (t && IDENTIFIER_TEMPLATE (t)) - overload_template_name (t, 1); -#endif - ; - break;} -case 468: -#line 2600 "parse.y" -{ - yyval.ttype = build_self_reference (); - ; - break;} -case 469: -#line 2607 "parse.y" -{ if (yyval.ttype) yyval.ttype = build_tree_list (access_public_node, yyval.ttype); ; - break;} -case 470: -#line 2609 "parse.y" -{ - if (current_aggr == signature_type_node) - yyval.ttype = build_tree_list (access_public_node, yyvsp[0].ttype); - else - yyval.ttype = build_tree_list (access_default_node, yyvsp[0].ttype); - if (yyvsp[-1].ttype) yyval.ttype = tree_cons (access_public_node, yyvsp[-1].ttype, yyval.ttype); - ; - break;} -case 471: -#line 2617 "parse.y" -{ - tree visspec = yyvsp[-2].ttype; - - if (current_aggr == signature_type_node) - { - error ("access specifier not allowed in signature"); - visspec = access_public_node; - } - yyval.ttype = chainon (yyval.ttype, build_tree_list (visspec, yyvsp[0].ttype)); - ; - break;} -case 472: -#line 2628 "parse.y" -{ - if (current_aggr == signature_type_node) - error ("access specifier not allowed in signature"); - ; - break;} -case 473: -#line 2638 "parse.y" -{ if (yyval.ttype == void_type_node) yyval.ttype = NULL_TREE; - ; - break;} -case 474: -#line 2641 "parse.y" -{ /* In pushdecl, we created a reverse list of names - in this binding level. Make sure that the chain - of what we're trying to add isn't the item itself - (which can happen with what pushdecl's doing). */ - if (yyvsp[0].ttype != NULL_TREE && yyvsp[0].ttype != void_type_node) - { - if (TREE_CHAIN (yyvsp[0].ttype) != yyval.ttype) - yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); - else - yyval.ttype = yyvsp[0].ttype; - } - ; - break;} -case 475: -#line 2657 "parse.y" -{ ; - break;} -case 476: -#line 2659 "parse.y" -{ error ("missing ';' before right brace"); - yyungetc ('}', 0); ; - break;} -case 477: -#line 2664 "parse.y" -{ yyval.ttype = finish_method (yyval.ttype); ; - break;} -case 478: -#line 2666 "parse.y" -{ yyval.ttype = finish_method (yyval.ttype); ; - break;} -case 479: -#line 2668 "parse.y" -{ yyval.ttype = finish_method (yyval.ttype); ; - break;} -case 480: -#line 2670 "parse.y" -{ yyval.ttype = finish_method (yyval.ttype); ; - break;} -case 481: -#line 2672 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 482: -#line 2674 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 483: -#line 2683 "parse.y" -{ yyval.ttype = grok_x_components (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 484: -#line 2685 "parse.y" -{ yyval.ttype = grok_x_components (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 485: -#line 2687 "parse.y" -{ yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; - break;} -case 486: -#line 2690 "parse.y" -{ yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; - break;} -case 487: -#line 2693 "parse.y" -{ yyval.ttype = grokbitfield (NULL_TREE, NULL_TREE, yyvsp[0].ttype); ; - break;} -case 488: -#line 2695 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 489: -#line 2706 "parse.y" -{ tree specs, attrs; - split_specs_attrs (yyvsp[-4].ttype, &specs, &attrs); - yyval.ttype = grokfield (yyvsp[-3].ttype, specs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, attrs)); ; - break;} -case 490: -#line 2711 "parse.y" -{ yyval.ttype = grokfield (yyval.ttype, NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, NULL_TREE)); ; - break;} -case 491: -#line 2714 "parse.y" -{ yyval.ttype = do_class_using_decl (yyvsp[0].ttype); ; - break;} -case 492: -#line 2721 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 494: -#line 2724 "parse.y" -{ - /* In this context, void_type_node encodes - friends. They have been recorded elsewhere. */ - if (yyval.ttype == void_type_node) - yyval.ttype = yyvsp[0].ttype; - else - yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); - ; - break;} -case 495: -#line 2736 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 497: -#line 2739 "parse.y" -{ - /* In this context, void_type_node encodes - friends. They have been recorded elsewhere. */ - if (yyval.ttype == void_type_node) - yyval.ttype = yyvsp[0].ttype; - else - yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); - ; - break;} -case 502: -#line 2761 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-4].ttype = current_declspecs; - yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; - break;} -case 503: -#line 2767 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-4].ttype = current_declspecs; - yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 504: -#line 2776 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-4].ttype = current_declspecs; - yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; - break;} -case 505: -#line 2782 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-4].ttype = current_declspecs; - yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; - break;} -case 506: -#line 2788 "parse.y" -{ split_specs_attrs (yyvsp[-4].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-4].ttype = current_declspecs; - yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 507: -#line 2794 "parse.y" -{ split_specs_attrs (yyvsp[-3].ttype, ¤t_declspecs, - &prefix_attributes); - yyvsp[-3].ttype = current_declspecs; - yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 508: -#line 2803 "parse.y" -{ yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; - break;} -case 509: -#line 2806 "parse.y" -{ yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 510: -#line 2812 "parse.y" -{ yyval.ttype = grokfield (yyval.ttype, current_declspecs, yyvsp[0].ttype, yyvsp[-2].ttype, - build_tree_list (yyvsp[-1].ttype, prefix_attributes)); ; - break;} -case 511: -#line 2815 "parse.y" -{ yyval.ttype = grokbitfield (yyval.ttype, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 512: -#line 2818 "parse.y" -{ yyval.ttype = grokbitfield (NULL_TREE, current_declspecs, yyvsp[-1].ttype); - cplus_decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 514: -#line 2829 "parse.y" -{ TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; yyval.ttype = yyvsp[0].ttype; ; - break;} -case 515: -#line 2834 "parse.y" -{ yyval.ttype = build_enumerator (yyval.ttype, NULL_TREE); ; - break;} -case 516: -#line 2836 "parse.y" -{ yyval.ttype = build_enumerator (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 517: -#line 2842 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 518: -#line 2845 "parse.y" -{ yyval.ftype.t = build_decl_list (yyvsp[0].ftype.t, NULL_TREE); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 519: -#line 2850 "parse.y" -{ - if (pedantic) - pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new"); - yyval.ftype.t = build_parse_node (ARRAY_REF, TREE_VALUE (yyvsp[-4].ftype.t), yyvsp[-1].ttype); - yyval.ftype.t = build_decl_list (TREE_PURPOSE (yyvsp[-4].ftype.t), yyval.ftype.t); - yyval.ftype.new_type_flag = yyvsp[-4].ftype.new_type_flag; - ; - break;} -case 520: -#line 2861 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 521: -#line 2863 "parse.y" -{ yyval.ttype = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 522: -#line 2868 "parse.y" -{ yyval.ftype.t = IDENTIFIER_AS_LIST (yyvsp[0].ttype); - yyval.ftype.new_type_flag = 0; ; - break;} -case 523: -#line 2871 "parse.y" -{ yyval.ftype.t = decl_tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ftype.t); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 524: -#line 2880 "parse.y" -{ yyval.itype = suspend_momentary (); ; - break;} -case 525: -#line 2885 "parse.y" -{ resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = yyvsp[0].ttype; ; - break;} -case 526: -#line 2891 "parse.y" -{ resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 527: -#line 2893 "parse.y" -{ resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 528: -#line 2895 "parse.y" -{ resume_momentary ((int) yyvsp[-1].itype); yyval.ttype = empty_parms (); ; - break;} -case 529: -#line 2897 "parse.y" -{ resume_momentary ((int) yyvsp[-3].itype); yyval.ttype = NULL_TREE; ; - break;} -case 530: -#line 2904 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 531: -#line 2906 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 532: -#line 2908 "parse.y" -{ yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 533: -#line 2910 "parse.y" -{ yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 534: -#line 2912 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 536: -#line 2920 "parse.y" -{ - if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) - { - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE (yyvsp[0].ttype)) - { - /* Be sure to get an inherited typedef. */ - yyval.ttype = lookup_name (yyvsp[0].ttype, 1); - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - pushdecl_class_level (yyval.ttype); - } - else - yyval.ttype = identifier_typedecl_value (yyvsp[0].ttype); - } - else - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 537: -#line 2940 "parse.y" -{ - if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) - yyval.ttype = identifier_typedecl_value (yyvsp[0].ttype); - else - yyval.ttype = yyvsp[0].ttype; - got_scope = NULL_TREE; - ; - break;} -case 539: -#line 2949 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 540: -#line 2954 "parse.y" -{ yyval.ttype = get_type_decl (yyvsp[0].ttype); ; - break;} -case 541: -#line 2959 "parse.y" -{ yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 542: -#line 2961 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 543: -#line 2963 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; - break;} -case 544: -#line 2965 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 545: -#line 2967 "parse.y" -{ push_nested_class (yyvsp[-1].ttype, 3); - yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; ; - break;} -case 547: -#line 2978 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 548: -#line 2980 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 549: -#line 2982 "parse.y" -{ yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 550: -#line 2984 "parse.y" -{ yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 551: -#line 2986 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 553: -#line 2994 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 554: -#line 2996 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 555: -#line 2998 "parse.y" -{ yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 556: -#line 3000 "parse.y" -{ yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 557: -#line 3002 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 559: -#line 3010 "parse.y" -{ yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-2].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 560: -#line 3012 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 561: -#line 3014 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 562: -#line 3016 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; - break;} -case 563: -#line 3018 "parse.y" -{ if (OP0 (yyval.ttype) != current_class_type) - { - push_nested_class (OP0 (yyval.ttype), 3); - TREE_COMPLEXITY (yyval.ttype) = current_class_depth; - } - ; - break;} -case 564: -#line 3028 "parse.y" -{ got_scope = NULL_TREE; - yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 565: -#line 3034 "parse.y" -{ got_scope = NULL_TREE; - yyval.ttype = build_parse_node (SCOPE_REF, yyval.ttype, yyvsp[0].ttype); ; - break;} -case 567: -#line 3041 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 568: -#line 3046 "parse.y" -{ yyval.ttype = build_functional_cast (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; - break;} -case 569: -#line 3048 "parse.y" -{ yyval.ttype = reparse_decl_as_expr (yyvsp[-3].ftype.t, yyvsp[-1].ttype); ; - break;} -case 570: -#line 3050 "parse.y" -{ yyval.ttype = reparse_absdcl_as_expr (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 575: -#line 3062 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 576: -#line 3069 "parse.y" -{ - if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) - { - yyval.ttype = lastiddecl; - /* Remember that this name has been used in the class - definition, as per [class.scope0] */ - if (current_class_type - && TYPE_BEING_DEFINED (current_class_type) - && ! IDENTIFIER_CLASS_VALUE (yyvsp[-1].ttype)) - pushdecl_class_level (yyval.ttype); - } - got_scope = yyval.ttype = TREE_TYPE (yyval.ttype); - ; - break;} -case 577: -#line 3083 "parse.y" -{ - if (TREE_CODE (yyvsp[-1].ttype) == IDENTIFIER_NODE) - yyval.ttype = lastiddecl; - got_scope = yyval.ttype = TREE_TYPE (yyval.ttype); - ; - break;} -case 578: -#line 3089 "parse.y" -{ - if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE) - yyval.ttype = lastiddecl; - if (TREE_CODE (yyval.ttype) == NAMESPACE_DECL - && DECL_NAME (yyval.ttype) == get_identifier ("std")) - got_scope = void_type_node; - else - got_scope = yyval.ttype; - ; - break;} -case 579: -#line 3099 "parse.y" -{ got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype)); ; - break;} -case 580: -#line 3114 "parse.y" -{ - if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE) - yyval.ttype = identifier_typedecl_value (yyvsp[0].ttype); - else - yyval.ttype = yyvsp[0].ttype; - got_scope = NULL_TREE; - ; - break;} -case 582: -#line 3123 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 583: -#line 3128 "parse.y" -{ got_scope = NULL_TREE; ; - break;} -case 584: -#line 3130 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ; - break;} -case 585: -#line 3137 "parse.y" -{ got_scope = void_type_node; ; - break;} -case 586: -#line 3143 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 587: -#line 3145 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 588: -#line 3147 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 589: -#line 3149 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 590: -#line 3151 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); - ; - break;} -case 591: -#line 3155 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 593: -#line 3164 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 594: -#line 3166 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 595: -#line 3172 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 596: -#line 3174 "parse.y" -{ yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 597: -#line 3176 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ; - break;} -case 598: -#line 3178 "parse.y" -{ yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ; - break;} -case 599: -#line 3180 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 600: -#line 3182 "parse.y" -{ yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 601: -#line 3184 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ; - break;} -case 602: -#line 3186 "parse.y" -{ yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ; - break;} -case 603: -#line 3188 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg); - ; - break;} -case 604: -#line 3192 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 606: -#line 3201 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 608: -#line 3205 "parse.y" -{ yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 609: -#line 3207 "parse.y" -{ yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 610: -#line 3209 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 611: -#line 3211 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ; - break;} -case 612: -#line 3213 "parse.y" -{ yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 613: -#line 3215 "parse.y" -{ set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 614: -#line 3217 "parse.y" -{ set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 615: -#line 3219 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 616: -#line 3221 "parse.y" -{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ; - break;} -case 622: -#line 3245 "parse.y" -{ do_pushlevel (); ; - break;} -case 623: -#line 3250 "parse.y" -{ yyval.ttype = do_poplevel (); ; - break;} -case 625: -#line 3258 "parse.y" -{ if (pedantic) - pedwarn ("ANSI C++ forbids label declarations"); ; - break;} -case 628: -#line 3269 "parse.y" -{ tree link; - for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - ; - break;} -case 629: -#line 3283 "parse.y" -{; - break;} -case 631: -#line 3289 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (COMPOUND_STMT, NULL_TREE); - add_tree (yyval.ttype); - } - ; - break;} -case 632: -#line 3297 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-3].ttype, 0) = TREE_CHAIN (yyvsp[-3].ttype); - TREE_CHAIN (yyvsp[-3].ttype) = NULL_TREE; - last_tree = yyvsp[-3].ttype; - } - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 633: -#line 3310 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (IF_STMT, NULL_TREE, NULL_TREE, - NULL_TREE); - add_tree (yyval.ttype); - } - cond_stmt_keyword = "if"; - ; - break;} -case 634: -#line 3320 "parse.y" -{ - if (processing_template_decl) - { - if (last_tree != yyvsp[-2].ttype) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = last_tree; - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - else - TREE_OPERAND (yyvsp[-2].ttype, 0) = yyvsp[0].ttype; - } - else - { - emit_line_note (input_filename, lineno); - expand_start_cond (yyvsp[0].ttype, 0); - } - ; - break;} -case 635: -#line 3339 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-4].ttype, 1) = TREE_CHAIN (yyvsp[-4].ttype); - TREE_CHAIN (yyvsp[-4].ttype) = NULL_TREE; - yyval.ttype = last_tree = yyvsp[-4].ttype; - } - ; - break;} -case 636: -#line 3351 "parse.y" -{ finish_stmt (); ; - break;} -case 637: -#line 3353 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (COMPOUND_STMT, NULL_TREE); - add_tree (yyval.ttype); - } - ; - break;} -case 638: -#line 3361 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = TREE_CHAIN (yyvsp[-2].ttype); - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 639: -#line 3374 "parse.y" -{ finish_stmt (); ; - break;} -case 641: -#line 3380 "parse.y" -{ finish_stmt (); ; - break;} -case 642: -#line 3382 "parse.y" -{ - tree expr = yyvsp[-1].ttype; - if (! processing_template_decl) - { - emit_line_note (input_filename, lineno); - /* Do default conversion if safe and possibly important, - in case within ({...}). */ - if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE - && lvalue_p (expr)) - || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE) - expr = default_conversion (expr); - } - cplus_expand_expr_stmt (expr); - clear_momentary (); - finish_stmt (); ; - break;} -case 643: -#line 3398 "parse.y" -{ if (! processing_template_decl) expand_start_else (); ; - break;} -case 644: -#line 3400 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-3].ttype, 2) = TREE_CHAIN (yyvsp[-3].ttype); - TREE_CHAIN (yyvsp[-3].ttype) = NULL_TREE; - last_tree = yyvsp[-3].ttype; - } - else - expand_end_cond (); - ; - break;} -case 645: -#line 3411 "parse.y" -{ finish_stmt (); ; - break;} -case 646: -#line 3413 "parse.y" -{ if (! processing_template_decl) expand_end_cond (); - do_poplevel (); - finish_stmt (); ; - break;} -case 647: -#line 3417 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (WHILE_STMT, NULL_TREE, NULL_TREE); - add_tree (yyval.ttype); - } - else - { - emit_nop (); - emit_line_note (input_filename, lineno); - expand_start_loop (1); - } - cond_stmt_keyword = "while"; - ; - break;} -case 648: -#line 3432 "parse.y" -{ - if (processing_template_decl) - { - if (last_tree != yyvsp[-2].ttype) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = last_tree; - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - else - TREE_OPERAND (yyvsp[-2].ttype, 0) = yyvsp[0].ttype; - } - else - { - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (0, yyvsp[0].ttype); - } - ; - break;} -case 649: -#line 3451 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-5].ttype, 1) = TREE_CHAIN (yyvsp[-5].ttype); - TREE_CHAIN (yyvsp[-5].ttype) = NULL_TREE; - last_tree = yyvsp[-5].ttype; - } - else - expand_end_loop (); - finish_stmt (); - ; - break;} -case 650: -#line 3463 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (DO_STMT, NULL_TREE, NULL_TREE); - add_tree (yyval.ttype); - } - else - { - emit_nop (); - emit_line_note (input_filename, lineno); - expand_start_loop_continue_elsewhere (1); - } - ; - break;} -case 651: -#line 3477 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = TREE_CHAIN (yyvsp[-2].ttype); - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - else - { - expand_loop_continue_here (); - cond_stmt_keyword = "do"; - } - ; - break;} -case 652: -#line 3491 "parse.y" -{ - if (processing_template_decl) - TREE_OPERAND (yyvsp[-5].ttype, 1) = yyvsp[-1].ttype; - else - { - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (0, yyvsp[-1].ttype); - expand_end_loop (); - } - clear_momentary (); - finish_stmt (); - ; - break;} -case 653: -#line 3504 "parse.y" -{ if (processing_template_decl) - { - yyval.ttype = build_min_nt (FOR_STMT, NULL_TREE, NULL_TREE, - NULL_TREE, NULL_TREE); - add_tree (yyval.ttype); - } - else - emit_line_note (input_filename, lineno); - if (flag_new_for_scope > 0) - { - /* Conditionalize .pushlevel */ - pushlevel (0); - note_level_for_for (); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); - } - ; - break;} -case 654: -#line 3523 "parse.y" -{ - if (processing_template_decl) - { - if (last_tree != yyvsp[-2].ttype) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = TREE_CHAIN (yyvsp[-2].ttype); - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - } - else - { - emit_nop (); - emit_line_note (input_filename, lineno); - expand_start_loop_continue_elsewhere (1); - } - ; - break;} -case 655: -#line 3541 "parse.y" -{ - if (processing_template_decl) - { - if (last_tree != yyvsp[-6].ttype) - { - TREE_OPERAND (yyvsp[-6].ttype, 1) = last_tree; - TREE_CHAIN (yyvsp[-6].ttype) = NULL_TREE; - last_tree = yyvsp[-6].ttype; - } - else - TREE_OPERAND (yyvsp[-6].ttype, 1) = yyvsp[-1].ttype; - } - else - { - emit_line_note (input_filename, lineno); - if (yyvsp[-1].ttype) expand_exit_loop_if_false (0, yyvsp[-1].ttype); - } - ; - break;} -case 656: -#line 3562 "parse.y" -{ - if (processing_template_decl) - TREE_OPERAND (yyvsp[-9].ttype, 2) = yyvsp[-1].ttype; - push_momentary (); - ; - break;} -case 657: -#line 3568 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-12].ttype, 3) = TREE_CHAIN (yyvsp[-12].ttype); - TREE_CHAIN (yyvsp[-12].ttype) = NULL_TREE; - last_tree = yyvsp[-12].ttype; - } - else - { - emit_line_note (input_filename, lineno); - expand_loop_continue_here (); - if (yyvsp[-4].ttype) cplus_expand_expr_stmt (yyvsp[-4].ttype); - expand_end_loop (); - } - pop_momentary (); - if (flag_new_for_scope > 0) - { - do_poplevel (); - } - finish_stmt (); ; - break;} -case 658: -#line 3589 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (SWITCH_STMT, yyvsp[-1].ttype, NULL_TREE); - add_tree (yyval.ttype); - } - else - { - emit_line_note (input_filename, lineno); - c_expand_start_case (yyvsp[-1].ttype); - } - push_switch (); - /* Don't let the tree nodes for $4 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - ; - break;} -case 659: -#line 3606 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-1].ttype, 1) = TREE_CHAIN (yyvsp[-1].ttype); - TREE_CHAIN (yyvsp[-1].ttype) = NULL_TREE; - last_tree = yyvsp[-1].ttype; - } - else - expand_end_case (yyvsp[-3].ttype); - pop_momentary (); - pop_switch (); - ; - break;} -case 660: -#line 3619 "parse.y" -{ finish_stmt (); ; - break;} -case 661: -#line 3621 "parse.y" -{ do_case (yyvsp[-1].ttype, NULL_TREE); ; - break;} -case 663: -#line 3624 "parse.y" -{ do_case (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 665: -#line 3627 "parse.y" -{ do_case (NULL_TREE, NULL_TREE); ; - break;} -case 667: -#line 3630 "parse.y" -{ emit_line_note (input_filename, lineno); - if (processing_template_decl) - add_tree (build_min_nt (BREAK_STMT)); - else if ( ! expand_exit_something ()) - error ("break statement not within loop or switch"); ; - break;} -case 668: -#line 3636 "parse.y" -{ emit_line_note (input_filename, lineno); - if (processing_template_decl) - add_tree (build_min_nt (CONTINUE_STMT)); - else if (! expand_continue_loop (0)) - error ("continue statement not within a loop"); ; - break;} -case 669: -#line 3642 "parse.y" -{ emit_line_note (input_filename, lineno); - c_expand_return (NULL_TREE); ; - break;} -case 670: -#line 3645 "parse.y" -{ emit_line_note (input_filename, lineno); - c_expand_return (yyvsp[-1].ttype); - finish_stmt (); - ; - break;} -case 671: -#line 3650 "parse.y" -{ if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); - emit_line_note (input_filename, lineno); - expand_asm (yyvsp[-2].ttype); - finish_stmt (); - ; - break;} -case 672: -#line 3657 "parse.y" -{ if (TREE_CHAIN (yyvsp[-4].ttype)) yyvsp[-4].ttype = combine_strings (yyvsp[-4].ttype); - emit_line_note (input_filename, lineno); - c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, - yyvsp[-6].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); - finish_stmt (); - ; - break;} -case 673: -#line 3666 "parse.y" -{ if (TREE_CHAIN (yyvsp[-6].ttype)) yyvsp[-6].ttype = combine_strings (yyvsp[-6].ttype); - emit_line_note (input_filename, lineno); - c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, - yyvsp[-8].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); - finish_stmt (); - ; - break;} -case 674: -#line 3676 "parse.y" -{ if (TREE_CHAIN (yyvsp[-8].ttype)) yyvsp[-8].ttype = combine_strings (yyvsp[-8].ttype); - emit_line_note (input_filename, lineno); - c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, - yyvsp[-10].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); - finish_stmt (); - ; - break;} -case 675: -#line 3684 "parse.y" -{ - if (processing_template_decl) - add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype)); - else - { emit_line_note (input_filename, lineno); - expand_computed_goto (yyvsp[-1].ttype); } - ; - break;} -case 676: -#line 3692 "parse.y" -{ - if (processing_template_decl) - add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype)); - else - { - tree decl; - emit_line_note (input_filename, lineno); - decl = lookup_label (yyvsp[-1].ttype); - TREE_USED (decl) = 1; - expand_goto (decl); - } - ; - break;} -case 677: -#line 3705 "parse.y" -{ finish_stmt (); ; - break;} -case 678: -#line 3707 "parse.y" -{ error ("label must be followed by statement"); - yyungetc ('}', 0); - finish_stmt (); ; - break;} -case 679: -#line 3711 "parse.y" -{ finish_stmt (); ; - break;} -case 681: -#line 3717 "parse.y" -{ - if (! current_function_parms_stored) - store_parm_decls (); - expand_start_early_try_stmts (); - ; - break;} -case 682: -#line 3723 "parse.y" -{ expand_start_all_catch (); ; - break;} -case 683: -#line 3725 "parse.y" -{ - int nested = (hack_decl_function_context - (current_function_decl) != NULL_TREE); - expand_end_all_catch (); - finish_function (lineno, (int)yyvsp[-3].itype, nested); - ; - break;} -case 684: -#line 3735 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (TRY_BLOCK, NULL_TREE, - NULL_TREE); - add_tree (yyval.ttype); - } - else - { - emit_line_note (input_filename, lineno); - expand_start_try_stmts (); - } - ; - break;} -case 685: -#line 3749 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-1].ttype, 0) = TREE_CHAIN (yyvsp[-1].ttype); - TREE_CHAIN (yyvsp[-1].ttype) = NULL_TREE; - last_tree = yyvsp[-1].ttype; - } - else - expand_start_all_catch (); - ; - break;} -case 686: -#line 3760 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-3].ttype, 1) = TREE_CHAIN (yyvsp[-3].ttype); - TREE_CHAIN (yyvsp[-3].ttype) = NULL_TREE; - last_tree = yyvsp[-3].ttype; - } - else - expand_end_all_catch (); - ; - break;} -case 689: -#line 3779 "parse.y" -{ - if (processing_template_decl) - { - yyval.ttype = build_min_nt (HANDLER, NULL_TREE, - NULL_TREE); - add_tree (yyval.ttype); - } - ; - break;} -case 690: -#line 3788 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-2].ttype, 0) = TREE_CHAIN (yyvsp[-2].ttype); - TREE_CHAIN (yyvsp[-2].ttype) = NULL_TREE; - last_tree = yyvsp[-2].ttype; - } - ; - break;} -case 691: -#line 3797 "parse.y" -{ - if (processing_template_decl) - { - TREE_OPERAND (yyvsp[-4].ttype, 1) = TREE_CHAIN (yyvsp[-4].ttype); - TREE_CHAIN (yyvsp[-4].ttype) = NULL_TREE; - last_tree = yyvsp[-4].ttype; - } - else - expand_end_catch_block (); - ; - break;} -case 695: -#line 3817 "parse.y" -{ expand_start_catch_block (NULL_TREE, NULL_TREE); ; - break;} -case 696: -#line 3833 "parse.y" -{ check_for_new_type ("inside exception declarations", yyvsp[-1].ftype); - expand_start_catch_block (TREE_PURPOSE (yyvsp[-1].ftype.t), - TREE_VALUE (yyvsp[-1].ftype.t)); ; - break;} -case 697: -#line 3840 "parse.y" -{ tree label; - do_label: - label = define_label (input_filename, lineno, yyvsp[-1].ttype); - if (label && ! minimal_parse_mode) - expand_label (label); - ; - break;} -case 698: -#line 3847 "parse.y" -{ goto do_label; ; - break;} -case 699: -#line 3849 "parse.y" -{ goto do_label; ; - break;} -case 700: -#line 3851 "parse.y" -{ goto do_label; ; - break;} -case 701: -#line 3856 "parse.y" -{ if (yyvsp[-1].ttype) cplus_expand_expr_stmt (yyvsp[-1].ttype); ; - break;} -case 703: -#line 3859 "parse.y" -{ if (pedantic) - pedwarn ("ANSI C++ forbids compound statements inside for initializations"); - ; - break;} -case 704: -#line 3868 "parse.y" -{ emit_line_note (input_filename, lineno); - yyval.ttype = NULL_TREE; ; - break;} -case 705: -#line 3871 "parse.y" -{ emit_line_note (input_filename, lineno); ; - break;} -case 706: -#line 3876 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 708: -#line 3879 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 709: -#line 3886 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 712: -#line 3893 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ; - break;} -case 713: -#line 3898 "parse.y" -{ yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ; - break;} -case 714: -#line 3903 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ; - break;} -case 715: -#line 3905 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ; - break;} -case 716: -#line 3916 "parse.y" -{ - yyval.ttype = empty_parms(); - ; - break;} -case 718: -#line 3921 "parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, void_list_node); - TREE_PARMLIST (yyval.ttype) = 1; - check_for_new_type ("inside parameter list", yyvsp[0].ftype); ; - break;} -case 719: -#line 3930 "parse.y" -{ - yyval.ttype = chainon (yyval.ttype, void_list_node); - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 720: -#line 3935 "parse.y" -{ - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 721: -#line 3940 "parse.y" -{ - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 722: -#line 3944 "parse.y" -{ - yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 723: -#line 3949 "parse.y" -{ - yyval.ttype = NULL_TREE; - ; - break;} -case 724: -#line 3953 "parse.y" -{ - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 725: -#line 3957 "parse.y" -{ - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 726: -#line 3961 "parse.y" -{ - yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); - TREE_PARMLIST (yyval.ttype) = 1; - ; - break;} -case 727: -#line 3966 "parse.y" -{ - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - yyval.ttype = chainon (yyval.ttype, void_list_node); - TREE_PARMLIST (yyval.ttype) = 1; - yyungetc (':', 0); - yychar = ')'; - ; - break;} -case 728: -#line 3977 "parse.y" -{ - /* This helps us recover from really nasty - parse errors, for example, a missing right - parenthesis. */ - yyerror ("possibly missing ')'"); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ftype.t, void_list_node); - TREE_PARMLIST (yyval.ttype) = 1; - yyungetc (':', 0); - yychar = ')'; - ; - break;} -case 729: -#line 3992 "parse.y" -{ maybe_snarf_defarg (); ; - break;} -case 730: -#line 3994 "parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 733: -#line 4005 "parse.y" -{ check_for_new_type ("in a parameter list", yyvsp[0].ftype); - yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ; - break;} -case 734: -#line 4008 "parse.y" -{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype); - yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ; - break;} -case 735: -#line 4011 "parse.y" -{ check_for_new_type ("in a parameter list", yyvsp[0].ftype); - yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ; - break;} -case 736: -#line 4014 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 737: -#line 4016 "parse.y" -{ yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ; - break;} -case 739: -#line 4022 "parse.y" -{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype); - yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ; - break;} -case 740: -#line 4032 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ftype.t); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; - yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); ; - break;} -case 741: -#line 4036 "parse.y" -{ yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 742: -#line 4039 "parse.y" -{ yyval.ftype.t = build_tree_list (get_decl_list (yyvsp[-1].ftype.t), yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 743: -#line 4042 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ftype.t); - yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 744: -#line 4046 "parse.y" -{ tree specs = strip_attrs (yyvsp[0].ftype.t); - yyval.ftype.t = build_tree_list (specs, NULL_TREE); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 745: -#line 4050 "parse.y" -{ tree specs = strip_attrs (yyvsp[-1].ttype); - yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); - yyval.ftype.new_type_flag = 0; ; - break;} -case 746: -#line 4057 "parse.y" -{ yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); - yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ; - break;} -case 747: -#line 4060 "parse.y" -{ yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); - yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ; - break;} -case 750: -#line 4071 "parse.y" -{ see_typename (); ; - break;} -case 751: -#line 4076 "parse.y" -{ - error ("type specifier omitted for parameter"); - yyval.ttype = build_tree_list (integer_type_node, NULL_TREE); - ; - break;} -case 752: -#line 4081 "parse.y" -{ - error ("type specifier omitted for parameter"); - if (TREE_CODE (yyval.ttype) == SCOPE_REF - && TREE_CODE (TREE_OPERAND (yyval.ttype, 0)) == TEMPLATE_TYPE_PARM) - cp_error (" perhaps you want `typename %E' to make it a type", yyval.ttype); - yyval.ttype = build_tree_list (integer_type_node, yyval.ttype); - ; - break;} -case 753: -#line 4092 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 754: -#line 4094 "parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 755: -#line 4096 "parse.y" -{ yyval.ttype = build_decl_list (NULL_TREE, NULL_TREE); ; - break;} -case 756: -#line 4101 "parse.y" -{ yyval.ttype = build_decl_list (NULL_TREE, groktypename(yyvsp[0].ftype.t)); ; - break;} -case 758: -#line 4107 "parse.y" -{ - TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype; - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 759: -#line 4115 "parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 760: -#line 4117 "parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 761: -#line 4119 "parse.y" -{ yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 762: -#line 4121 "parse.y" -{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); - yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg); - ; - break;} -case 763: -#line 4128 "parse.y" -{ got_scope = NULL_TREE; ; - break;} -case 764: -#line 4133 "parse.y" -{ yyval.ttype = ansi_opname[MULT_EXPR]; ; - break;} -case 765: -#line 4135 "parse.y" -{ yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ; - break;} -case 766: -#line 4137 "parse.y" -{ yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ; - break;} -case 767: -#line 4139 "parse.y" -{ yyval.ttype = ansi_opname[PLUS_EXPR]; ; - break;} -case 768: -#line 4141 "parse.y" -{ yyval.ttype = ansi_opname[MINUS_EXPR]; ; - break;} -case 769: -#line 4143 "parse.y" -{ yyval.ttype = ansi_opname[BIT_AND_EXPR]; ; - break;} -case 770: -#line 4145 "parse.y" -{ yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ; - break;} -case 771: -#line 4147 "parse.y" -{ yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ; - break;} -case 772: -#line 4149 "parse.y" -{ yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ; - break;} -case 773: -#line 4151 "parse.y" -{ yyval.ttype = ansi_opname[COMPOUND_EXPR]; ; - break;} -case 774: -#line 4153 "parse.y" -{ yyval.ttype = ansi_opname[yyvsp[0].code]; ; - break;} -case 775: -#line 4155 "parse.y" -{ yyval.ttype = ansi_opname[LT_EXPR]; ; - break;} -case 776: -#line 4157 "parse.y" -{ yyval.ttype = ansi_opname[GT_EXPR]; ; - break;} -case 777: -#line 4159 "parse.y" -{ yyval.ttype = ansi_opname[yyvsp[0].code]; ; - break;} -case 778: -#line 4161 "parse.y" -{ yyval.ttype = ansi_assopname[yyvsp[0].code]; ; - break;} -case 779: -#line 4163 "parse.y" -{ yyval.ttype = ansi_opname [MODIFY_EXPR]; ; - break;} -case 780: -#line 4165 "parse.y" -{ yyval.ttype = ansi_opname[yyvsp[0].code]; ; - break;} -case 781: -#line 4167 "parse.y" -{ yyval.ttype = ansi_opname[yyvsp[0].code]; ; - break;} -case 782: -#line 4169 "parse.y" -{ yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ; - break;} -case 783: -#line 4171 "parse.y" -{ yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ; - break;} -case 784: -#line 4173 "parse.y" -{ yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ; - break;} -case 785: -#line 4175 "parse.y" -{ yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ; - break;} -case 786: -#line 4177 "parse.y" -{ yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ; - break;} -case 787: -#line 4179 "parse.y" -{ yyval.ttype = ansi_opname[COND_EXPR]; ; - break;} -case 788: -#line 4181 "parse.y" -{ yyval.ttype = ansi_opname[yyvsp[0].code]; ; - break;} -case 789: -#line 4183 "parse.y" -{ yyval.ttype = ansi_opname[COMPONENT_REF]; ; - break;} -case 790: -#line 4185 "parse.y" -{ yyval.ttype = ansi_opname[MEMBER_REF]; ; - break;} -case 791: -#line 4187 "parse.y" -{ yyval.ttype = ansi_opname[CALL_EXPR]; ; - break;} -case 792: -#line 4189 "parse.y" -{ yyval.ttype = ansi_opname[ARRAY_REF]; ; - break;} -case 793: -#line 4191 "parse.y" -{ yyval.ttype = ansi_opname[NEW_EXPR]; ; - break;} -case 794: -#line 4193 "parse.y" -{ yyval.ttype = ansi_opname[DELETE_EXPR]; ; - break;} -case 795: -#line 4195 "parse.y" -{ yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ; - break;} -case 796: -#line 4197 "parse.y" -{ yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ; - break;} -case 797: -#line 4200 "parse.y" -{ yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ; - break;} -case 798: -#line 4202 "parse.y" -{ yyval.ttype = ansi_opname[ERROR_MARK]; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/local/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 4205 "parse.y" - - -#ifdef SPEW_DEBUG -const char * -debug_yytranslate (value) - int value; -{ - return yytname[YYTRANSLATE (value)]; -} - -#endif diff --git a/gcc/cp/parse.h b/gcc/cp/parse.h deleted file mode 100644 index 432766b00f2..00000000000 --- a/gcc/cp/parse.h +++ /dev/null @@ -1,91 +0,0 @@ -typedef union {long itype; tree ttype; char *strtype; enum tree_code code; flagged_type_tree ftype; } YYSTYPE; -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SELFNAME 260 -#define SCSPEC 261 -#define TYPESPEC 262 -#define CV_QUALIFIER 263 -#define CONSTANT 264 -#define STRING 265 -#define ELLIPSIS 266 -#define SIZEOF 267 -#define ENUM 268 -#define IF 269 -#define ELSE 270 -#define WHILE 271 -#define DO 272 -#define FOR 273 -#define SWITCH 274 -#define CASE 275 -#define DEFAULT 276 -#define BREAK 277 -#define CONTINUE 278 -#define RETURN 279 -#define GOTO 280 -#define ASM_KEYWORD 281 -#define GCC_ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define SIGOF 285 -#define ATTRIBUTE 286 -#define EXTENSION 287 -#define LABEL 288 -#define REALPART 289 -#define IMAGPART 290 -#define AGGR 291 -#define VISSPEC 292 -#define DELETE 293 -#define NEW 294 -#define THIS 295 -#define OPERATOR 296 -#define CXX_TRUE 297 -#define CXX_FALSE 298 -#define NAMESPACE 299 -#define TYPENAME_KEYWORD 300 -#define USING 301 -#define LEFT_RIGHT 302 -#define TEMPLATE 303 -#define TYPEID 304 -#define DYNAMIC_CAST 305 -#define STATIC_CAST 306 -#define REINTERPRET_CAST 307 -#define CONST_CAST 308 -#define SCOPE 309 -#define EMPTY 310 -#define PTYPENAME 311 -#define NSNAME 312 -#define THROW 313 -#define ASSIGN 314 -#define OROR 315 -#define ANDAND 316 -#define MIN_MAX 317 -#define EQCOMPARE 318 -#define ARITHCOMPARE 319 -#define LSHIFT 320 -#define RSHIFT 321 -#define POINTSAT_STAR 322 -#define DOT_STAR 323 -#define UNARY 324 -#define PLUSPLUS 325 -#define MINUSMINUS 326 -#define HYPERUNARY 327 -#define PAREN_STAR_PAREN 328 -#define POINTSAT 329 -#define TRY 330 -#define CATCH 331 -#define TYPENAME_ELLIPSIS 332 -#define PRE_PARSED_FUNCTION_DECL 333 -#define EXTERN_LANG_STRING 334 -#define ALL 335 -#define PRE_PARSED_CLASS_DECL 336 -#define DEFARG 337 -#define DEFARG_MARKER 338 -#define TYPENAME_DEFN 339 -#define IDENTIFIER_DEFN 340 -#define PTYPENAME_DEFN 341 -#define END_OF_LINE 342 -#define END_OF_SAVED_INPUT 343 - - -extern YYSTYPE yylval; -#define YYEMPTY -2 diff --git a/gcc/cstamp-h.in b/gcc/cstamp-h.in deleted file mode 100644 index 9788f70238c..00000000000 --- a/gcc/cstamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/gcc/dyn-string.c b/gcc/dyn-string.c new file mode 100644 index 00000000000..cfcace95584 --- /dev/null +++ b/gcc/dyn-string.c @@ -0,0 +1,100 @@ +/* An abstract string datatype. + Copyright (C) 1998 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + + This file is part of GNU CC. + + GNU CC 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. + + GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free + Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "config.h" +#include "system.h" +#include "gansidecl.h" +#include "dyn-string.h" + +extern char *xmalloc (); +extern char *xrealloc (); + +/* Create a new dynamic string capable of holding at least SPACE + characters, including the terminating NUL. If SPACE is 0, it + will be silently increased to 1. */ + +dyn_string_t +dyn_string_new (space) + int space; +{ + dyn_string_t result = (dyn_string_t) xmalloc (sizeof (struct dyn_string)); + + if (space == 0) + /* We need at least one byte in which to store the terminating + NUL. */ + space = 1; + + result->allocated = space; + result->s = (char*) xmalloc (space); + result->length = 0; + result->s[0] = '\0'; + + return result; +} + +/* Free the memory used by DS. */ + +void +dyn_string_delete (ds) + dyn_string_t ds; +{ + free (ds->s); + free (ds); +} + +/* Append the NUL-terminated string S to DS, resizing DS if + necessary. */ + +dyn_string_t +dyn_string_append (ds, s) + dyn_string_t ds; + char *s; +{ + int len = strlen (s); + dyn_string_resize (ds, ds->length + len + 1 /* '\0' */); + strcpy (ds->s + ds->length, s); + ds->length += len; + + return ds; +} + +/* Increase the capacity of DS so that it can hold at least SPACE + characters, including the terminating NUL. This function will not + (at present) reduce the capacity of DS. */ + +dyn_string_t +dyn_string_resize (ds, space) + dyn_string_t ds; + int space; +{ + int new_allocated = ds->allocated; + + while (space > new_allocated) + new_allocated *= 2; + + if (new_allocated != ds->allocated) + { + /* We actually need more space. */ + ds->allocated = new_allocated; + ds->s = (char*) xrealloc (ds->s, ds->allocated); + } + + return ds; +} diff --git a/gcc/dyn-string.h b/gcc/dyn-string.h new file mode 100644 index 00000000000..ed8071f8b08 --- /dev/null +++ b/gcc/dyn-string.h @@ -0,0 +1,31 @@ +/* An abstract string datatype. + Copyright (C) 1998 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + + This file is part of GNU CC. + + GNU CC 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. + + GNU CC 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 GNU CC; see the file COPYING. If not, write to the Free + Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +typedef struct dyn_string +{ + int allocated; /* The amount of space allocated for the string. */ + int length; /* The actual length of the string. */ + char *s; /* The string itself, NUL-terminated. */ +}* dyn_string_t; + +extern dyn_string_t dyn_string_new PROTO((int)); +extern void dyn_string_delete PROTO((dyn_string_t)); +extern dyn_string_t dyn_string_append PROTO((dyn_string_t, char*)); +extern dyn_string_t dyn_string_resize PROTO((dyn_string_t, int)); diff --git a/gcc/exgettext b/gcc/exgettext new file mode 100755 index 00000000000..93d553cba76 --- /dev/null +++ b/gcc/exgettext @@ -0,0 +1,118 @@ +#! /bin/sh +# Wrapper around gettext for GCC sources. +# Copyright 1998 Free Software Foundation, Inc. + +# Written by Paul Eggert <eggert@twinsun.com>. + +# This file is part of GNU CC. + +# GNU CC 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. + +# GNU CC 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 GNU CC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# Set environment to default value, if not already set. +: ${AWK=awk} + +# The argument to this wrapper is the xgettext command to be executed. +# Extract the xgettext program name from the rest of the command. +xgettext=${1?} +shift + +# Save work if we're just wrapping a no-op. +case $xgettext in +:) exit;; +esac + +# Find the files to be scanned, and the directory to scan them from. +directory=. +files= +for i +do + case $i in + --directory=*) + directory=`expr " $i" : ' --directory=\(.*\)'`;; + --files-from=*) + files_from=`expr " $i" : ' --files-from=\(.*\)'` + files=`$AWK '/^[^#]/ { print }' $files_from`;; + esac +done + +# Generate keyword options for xgettext, +# by scanning for declarations of functions +# whose parameter names end in "msgid". +generate_keyword_options=' + /^[A-Z_a-z].*\(.*msgid[,)]/ { + + paren_index = index($0, "(") + + name = substr($0, 1, paren_index - 1) + sub(/[^0-9A-Z_a-z]*$/, "", name) + sub(/[ ]+PARAMS/, "", name) + sub(/[ ]+VPROTO/, "", name) + sub(/.*[^0-9A-Z_a-z]/, "", name) + + args = substr($0, paren_index) + sub(/msgid[,)].*/, "", args) + for (n = 1; sub(/^[^,]*,/, "", args); n++) { + continue; + } + + if (n == 1) { + keyword = name + } else { + keyword = name ":" n + } + + if (! keyword_seen[keyword]++) { + print "--keyword=" keyword + } + } +' +keyword_options=`( + cd $directory && + $AWK "$generate_keyword_options" $files < /dev/null +)` || exit + +# Generate temporary file reflecting the %e strings in the scanned files. +tmp=tmp-emsgids.c + +generate_emsgids=' + /%e.*}/ { + line = $0 + while ((percent_index = index(line, "%e")) != 0) { + line = substr(line, percent_index + 2) + bracket_index = index(line, "}") + if (bracket_index == 0) { + continue + } + msgid = substr(line, 1, bracket_index - 1) + if (index(msgid, "%") != 0) { + continue + } + printf "#line %d \"%s\"\n", FNR, FILENAME + printf "_(\"%s\")\n", msgid + line = substr(line, bracket_index + 1) + } + } +' +(cd $directory && + $AWK "$generate_emsgids" $files < /dev/null +) > $directory/$tmp || exit + +# Run the xgettext command, with temporary added as a file to scan. +"$xgettext" $keyword_options ${1+"$@"} $tmp || exit + +# Clean up. +# If we don't get here, `make clean' will remove this file later. +rm -f $directory/$tmp diff --git a/gcc/fixinc.wrap b/gcc/fixinc.wrap new file mode 100755 index 00000000000..406c87e9c03 --- /dev/null +++ b/gcc/fixinc.wrap @@ -0,0 +1,86 @@ +#! /bin/sh +# Create wrappers for include files instead of replacing them. +# +# This script is designed for systems whose include files can be fixed +# by creating small wrappers around them. +# An advantage of this method is that if the system include files are changed +# (e.g. by OS upgrade), you need not re-run fixincludes. +# +# See README-fixinc for more information. + +# Directory containing the original header files. +# (This was named INCLUDES, but that conflicts with a name in Makefile.in.) +INPUT=${2-${INPUT-/usr/include}} + +# Directory in which to store the results. +LIB=${1?"fixincludes: output directory not specified"} + +# Make sure it exists. +if [ ! -d $LIB ]; then + mkdir $LIB || exit 1 +fi + +echo Building fixed headers in ${LIB} + +# Some math.h files define struct exception, which conflicts with +# the class exception defined in the C++ file std/stdexcept.h. We +# redefine it to __math_exception. This is not a great fix, but I +# haven't been able to think of anything better. +file=math.h +if [ -r $INPUT/$file ]; then + echo Checking $INPUT/$file + if grep 'struct exception' $INPUT/$file >/dev/null + then + echo Fixed $file + rm -f $LIB/$file + cat <<'__EOF__' >$LIB/$file +#ifndef _MATH_H_WRAPPER +#ifdef __cplusplus +# define exception __math_exception +#endif +#include_next <math.h> +#ifdef __cplusplus +# undef exception +#endif +#define _MATH_H_WRAPPER +#endif /* _MATH_H_WRAPPER */ +__EOF__ + # Define _MATH_H_WRAPPER at the end of the wrapper, not the start, + # so that if #include_next gets another instance of the wrapper, + # this will follow the #include_next chain until we arrive at + # the real <math.h>. + chmod a+r $LIB/$file + fi +fi + +# Avoid the definition of the bool type in the Solaris 2.x curses.h when using +# g++, since it's now an official type in the C++ language. +file=curses.h +if [ -r $INPUT/$file ]; then + echo Checking $INPUT/$file + w='[ ]' + if grep "typedef$w$w*char$w$w*bool$w*;" $INPUT/$file >/dev/null + then + echo Fixed $file + rm -f $LIB/$file + cat <<'__EOF__' >$LIB/$file +#ifndef _CURSES_H_WRAPPER +#ifdef __cplusplus +# define bool __curses_bool_t +#endif +#include_next <curses.h> +#ifdef __cplusplus +# undef bool +#endif +#define _CURSES_H_WRAPPER +#endif /* _CURSES_H_WRAPPER */ +__EOF__ + # Define _CURSES_H_WRAPPER at the end of the wrapper, not the start, + # so that if #include_next gets another instance of the wrapper, + # this will follow the #include_next chain until we arrive at + # the real <curses.h>. + chmod a+r $LIB/$file + fi +fi + +exit 0 diff --git a/gcc/frame.c b/gcc/frame.c new file mode 100644 index 00000000000..a9e5e231e7d --- /dev/null +++ b/gcc/frame.c @@ -0,0 +1,607 @@ +/* Subroutines needed for unwinding stack frames for exception handling. */ +/* Compile this one with gcc. */ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Jason Merrill <jason@cygnus.com>. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* As a special exception, if you link this library with other files, + some of which are compiled with GCC, to produce an executable, + this library does not by itself cause the resulting executable + to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + +/* It is incorrect to include config.h here, because this file is being + compiled for the target, and hence definitions concerning only the host + do not apply. */ + +#include "tconfig.h" +#include "defaults.h" + +#ifdef DWARF2_UNWIND_INFO +#include "dwarf2.h" +#include "frame.h" +#include <stddef.h> + +/* Don't use `fancy_abort' here even if config.h says to use it. */ +#ifdef abort +#undef abort +#endif + +/* Some types used by the DWARF 2 spec. */ + +typedef unsigned int uword __attribute__ ((mode (SI))); +typedef unsigned int uaddr __attribute__ ((mode (pointer))); +typedef int saddr __attribute__ ((mode (pointer))); +typedef unsigned char ubyte; + +/* The first few fields of a CIE. The CIE_id field is 0xffffffff for a CIE, + to distinguish it from a valid FDE. FDEs are aligned to an addressing + unit boundary, but the fields within are unaligned. */ + +struct dwarf_cie { + uword length; + uaddr CIE_id; + ubyte version; + char augmentation[0]; +} __attribute__ ((packed, aligned (__alignof__ (void *)))); + +/* The first few fields of an FDE. */ + +struct dwarf_fde { + uword length; + struct dwarf_cie* CIE_pointer; + void* pc_begin; + uaddr pc_range; +} __attribute__ ((packed, aligned (__alignof__ (void *)))); + +typedef struct dwarf_fde fde; + +/* The representation for an "object" to be searched for frame unwind info. + For targets with named sections, one object is an executable or shared + library; for other targets, one object is one translation unit. */ + +struct object { + void *pc_begin; + void *pc_end; + fde *fde_begin; + fde ** fde_array; + size_t count; + struct object *next; +}; + +static struct object *objects; + +/* The information we care about from a CIE. */ + +struct cie_info { + char *augmentation; + int code_align; + int data_align; + unsigned ra_regno; +}; + +/* The current unwind state, plus a saved copy for DW_CFA_remember_state. */ + +struct frame_state_internal +{ + struct frame_state s; + struct frame_state_internal *saved_state; +}; + +/* Decode the unsigned LEB128 constant at BUF into the variable pointed to + by R, and return the new value of BUF. */ + +static void * +decode_uleb128 (unsigned char *buf, unsigned *r) +{ + unsigned shift = 0; + unsigned result = 0; + + while (1) + { + unsigned byte = *buf++; + result |= (byte & 0x7f) << shift; + if ((byte & 0x80) == 0) + break; + shift += 7; + } + *r = result; + return buf; +} + +/* Decode the signed LEB128 constant at BUF into the variable pointed to + by R, and return the new value of BUF. */ + +static void * +decode_sleb128 (unsigned char *buf, int *r) +{ + unsigned shift = 0; + unsigned result = 0; + unsigned byte; + + while (1) + { + byte = *buf++; + result |= (byte & 0x7f) << shift; + shift += 7; + if ((byte & 0x80) == 0) + break; + } + if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0) + result |= - (1 << shift); + + *r = result; + return buf; +} + +/* Read unaligned data from the instruction buffer. */ + +union unaligned { + void *p; + unsigned b2 __attribute__ ((mode (HI))); + unsigned b4 __attribute__ ((mode (SI))); + unsigned b8 __attribute__ ((mode (DI))); +} __attribute__ ((packed)); +static inline void * +read_pointer (void *p) +{ union unaligned *up = p; return up->p; } +static inline unsigned +read_1byte (void *p) +{ return *(unsigned char *)p; } +static inline unsigned +read_2byte (void *p) +{ union unaligned *up = p; return up->b2; } +static inline unsigned +read_4byte (void *p) +{ union unaligned *up = p; return up->b4; } +static inline unsigned long +read_8byte (void *p) +{ union unaligned *up = p; return up->b8; } + +/* Ordering function for FDEs. Functions can't overlap, so we just compare + their starting addresses. */ + +static inline saddr +fde_compare (fde *x, fde *y) +{ + return (saddr)x->pc_begin - (saddr)y->pc_begin; +} + +/* Return the address of the FDE after P. */ + +static inline fde * +next_fde (fde *p) +{ + return (fde *)(((char *)p) + p->length + sizeof (p->length)); +} + +/* One iteration of an insertion sort, for adding new FDEs to the array. + Usually the new FDE will go in at the end, so we can expect close to + O(n) performance. If this turns out to be overly optimistic, we can have + the linker sort the FDEs so we don't have to do it at run time. */ + +static void +fde_insert (fde **array, size_t i, fde *this_fde) +{ + array[i] = this_fde; + + for (; i > 0 && fde_compare (array[i], array[i-1]) < 0; --i) + { + this_fde = array[i]; + array[i] = array[i-1]; + array[i-1] = this_fde; + } +} + +static size_t +count_fdes (fde *this_fde) +{ + size_t count; + + for (count = 0; this_fde->length != 0; this_fde = next_fde (this_fde)) + { + /* Skip CIEs. */ + if ((uaddr)(this_fde->CIE_pointer) == (uaddr)-1) + continue; + + ++count; + } + + return count; +} + +static void +add_fdes (fde *this_fde, fde **array, size_t *i_ptr, + void **beg_ptr, void **end_ptr) +{ + size_t i = *i_ptr; + void *pc_begin = *beg_ptr; + void *pc_end = *end_ptr; + + for (; this_fde->length != 0; this_fde = next_fde (this_fde)) + { + /* Skip CIEs. */ + if ((uaddr)(this_fde->CIE_pointer) == (uaddr)-1) + continue; + + fde_insert (array, i++, this_fde); + + if (this_fde->pc_begin < pc_begin) + pc_begin = this_fde->pc_begin; + if (this_fde->pc_begin + this_fde->pc_range > pc_end) + pc_end = this_fde->pc_begin + this_fde->pc_range; + } + + *i_ptr = i; + *beg_ptr = pc_begin; + *end_ptr = pc_end; +} + +/* Set up a sorted array of pointers to FDEs for a loaded object. We + count up the entries before allocating the array because it's likely to + be faster. */ + +static void +frame_init (struct object* ob) +{ + fde *this_fde; + size_t count; + fde **array; + void *pc_begin, *pc_end; + + if (ob->fde_array) + { + fde **p = ob->fde_array; + for (count = 0; *p; ++p) + count += count_fdes (*p); + } + else + count = count_fdes (ob->fde_begin); + + ob->count = count; + array = (fde **) malloc (sizeof (fde *) * count); + + pc_begin = (void*)(uaddr)-1; + pc_end = 0; + count = 0; + + if (ob->fde_array) + { + fde **p = ob->fde_array; + for (; *p; ++p) + add_fdes (*p, array, &count, &pc_begin, &pc_end); + } + else + add_fdes (ob->fde_begin, array, &count, &pc_begin, &pc_end); + + ob->fde_array = array; + ob->pc_begin = pc_begin; + ob->pc_end = pc_end; +} + +/* Return a pointer to the FDE for the function containing PC. */ + +static fde * +find_fde (void *pc) +{ + struct object *ob; + size_t lo, hi; + + for (ob = objects; ob; ob = ob->next) + { + if (ob->pc_begin == 0) + frame_init (ob); + if (pc >= ob->pc_begin && pc < ob->pc_end) + break; + } + + if (ob == 0) + return 0; + + /* Standard binary search algorithm. */ + for (lo = 0, hi = ob->count; lo < hi; ) + { + size_t i = (lo + hi) / 2; + fde *f = ob->fde_array[i]; + + if (pc < f->pc_begin) + hi = i; + else if (pc > f->pc_begin + f->pc_range) + lo = i + 1; + else + return f; + } + + return 0; +} + +/* Extract any interesting information from the CIE for the translation + unit F belongs to. */ + +static void * +extract_cie_info (fde *f, struct cie_info *c) +{ + void *p; + int i; + + c->augmentation = f->CIE_pointer->augmentation; + + if (strcmp (c->augmentation, "") != 0 + && strcmp (c->augmentation, "e") != 0 + && c->augmentation[0] != 'z') + return 0; + + p = c->augmentation + strlen (c->augmentation) + 1; + + p = decode_uleb128 (p, &c->code_align); + p = decode_sleb128 (p, &c->data_align); + c->ra_regno = *(unsigned char *)p++; + + /* If the augmentation starts with 'z', we now see the length of the + augmentation fields. */ + if (c->augmentation[0] == 'z') + { + p = decode_uleb128 (p, &i); + p += i; + } + + return p; +} + +/* Decode one instruction's worth of of DWARF 2 call frame information. + Used by __frame_state_for. Takes pointers P to the instruction to + decode, STATE to the current register unwind information, INFO to the + current CIE information, and PC to the current PC value. Returns a + pointer to the next instruction. */ + +static void * +execute_cfa_insn (void *p, struct frame_state_internal *state, + struct cie_info *info, void **pc) +{ + unsigned insn = *(unsigned char *)p++; + unsigned reg; + int offset; + + if (insn & DW_CFA_advance_loc) + *pc += ((insn & 0x3f) * info->code_align); + else if (insn & DW_CFA_offset) + { + reg = (insn & 0x3f); + p = decode_uleb128 (p, &offset); + offset *= info->data_align; + state->s.saved[reg] = REG_SAVED_OFFSET; + state->s.reg_or_offset[reg] = offset; + } + else if (insn & DW_CFA_restore) + { + reg = (insn & 0x3f); + state->s.saved[reg] = REG_UNSAVED; + } + else switch (insn) + { + case DW_CFA_set_loc: + *pc = read_pointer (p); + p += sizeof (void *); + break; + case DW_CFA_advance_loc1: + *pc += read_1byte (p); + p += 1; + break; + case DW_CFA_advance_loc2: + *pc += read_2byte (p); + p += 2; + break; + case DW_CFA_advance_loc4: + *pc += read_4byte (p); + p += 4; + break; + + case DW_CFA_offset_extended: + p = decode_uleb128 (p, ®); + p = decode_uleb128 (p, &offset); + offset *= info->data_align; + state->s.saved[reg] = REG_SAVED_OFFSET; + state->s.reg_or_offset[reg] = offset; + break; + case DW_CFA_restore_extended: + p = decode_uleb128 (p, ®); + state->s.saved[reg] = REG_UNSAVED; + break; + + case DW_CFA_undefined: + case DW_CFA_same_value: + case DW_CFA_nop: + break; + + case DW_CFA_register: + { + unsigned reg2; + p = decode_uleb128 (p, ®); + p = decode_uleb128 (p, ®2); + state->s.saved[reg] = REG_SAVED_REG; + state->s.reg_or_offset[reg] = reg2; + } + break; + + case DW_CFA_def_cfa: + p = decode_uleb128 (p, ®); + p = decode_uleb128 (p, &offset); + state->s.cfa_reg = reg; + state->s.cfa_offset = offset; + break; + case DW_CFA_def_cfa_register: + p = decode_uleb128 (p, ®); + state->s.cfa_reg = reg; + break; + case DW_CFA_def_cfa_offset: + p = decode_uleb128 (p, &offset); + state->s.cfa_offset = offset; + break; + + case DW_CFA_remember_state: + { + struct frame_state_internal *save = + (struct frame_state_internal *) + malloc (sizeof (struct frame_state_internal)); + memcpy (save, state, sizeof (struct frame_state_internal)); + state->saved_state = save; + } + break; + case DW_CFA_restore_state: + { + struct frame_state_internal *save = state->saved_state; + memcpy (state, save, sizeof (struct frame_state_internal)); + free (save); + } + break; + + /* FIXME: Hardcoded for SPARC register window configuration. */ + case DW_CFA_GNU_window_save: + for (reg = 16; reg < 32; ++reg) + { + state->s.saved[reg] = REG_SAVED_OFFSET; + state->s.reg_or_offset[reg] = (reg - 16) * sizeof (void *); + } + break; + + case DW_CFA_GNU_args_size: + p = decode_uleb128 (p, &offset); + state->s.args_size = offset; + break; + + default: + abort (); + } + return p; +} + +/* Called from crtbegin.o to register the unwind info for an object. */ + +void +__register_frame (void *begin) +{ + struct object *ob = (struct object *) malloc (sizeof (struct object)); + + ob->fde_begin = begin; + + ob->pc_begin = ob->pc_end = 0; + ob->fde_array = 0; + ob->count = 0; + + ob->next = objects; + objects = ob; +} + +/* Similar, but BEGIN is actually a pointer to a table of unwind entries + for different translation units. Called from the file generated by + collect2. */ + +void +__register_frame_table (void *begin) +{ + struct object *ob = (struct object *) malloc (sizeof (struct object)); + + ob->fde_begin = begin; + ob->fde_array = begin; + + ob->pc_begin = ob->pc_end = 0; + ob->count = 0; + + ob->next = objects; + objects = ob; +} + +/* Called from crtend.o to deregister the unwind info for an object. */ + +void +__deregister_frame (void *begin) +{ + struct object **p = &objects; + + while (*p) + { + if ((*p)->fde_begin == begin) + { + struct object *ob = *p; + *p = (*p)->next; + + if (ob->fde_array) + free (ob->fde_array); + free (ob); + + return; + } + p = &((*p)->next); + } + abort (); +} + +/* Called from __throw to find the registers to restore for a given + PC_TARGET. The caller should allocate a local variable of `struct + frame_state' (declared in frame.h) and pass its address to STATE_IN. */ + +struct frame_state * +__frame_state_for (void *pc_target, struct frame_state *state_in) +{ + fde *f; + void *insn, *end, *pc; + struct cie_info info; + struct frame_state_internal state; + + f = find_fde (pc_target); + if (f == 0) + return 0; + + insn = extract_cie_info (f, &info); + if (insn == 0) + return 0; + + memset (&state, 0, sizeof (state)); + state.s.retaddr_column = info.ra_regno; + + /* First decode all the insns in the CIE. */ + end = next_fde ((fde*) f->CIE_pointer); + while (insn < end) + insn = execute_cfa_insn (insn, &state, &info, 0); + + insn = ((fde *)f) + 1; + + if (info.augmentation[0] == 'z') + { + int i; + insn = decode_uleb128 (insn, &i); + insn += i; + } + else if (strcmp (info.augmentation, "e") == 0) + { + state.s.eh_ptr = read_pointer (insn); + insn += sizeof (void *); + } + + /* Then the insns in the FDE up to our target PC. */ + end = next_fde (f); + pc = f->pc_begin; + while (insn < end && pc < pc_target) + insn = execute_cfa_insn (insn, &state, &info, &pc); + + memcpy (state_in, &state.s, sizeof (state.s)); + return state_in; +} +#endif /* DWARF2_UNWIND_INFO */ diff --git a/gcc/frame.h b/gcc/frame.h new file mode 100644 index 00000000000..3b380536884 --- /dev/null +++ b/gcc/frame.h @@ -0,0 +1,35 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of GNU CC. */ + +typedef struct frame_state +{ + void *cfa; + void *eh_ptr; + long cfa_offset; + long args_size; + long reg_or_offset[FIRST_PSEUDO_REGISTER+1]; + unsigned short cfa_reg; + unsigned short retaddr_column; + char saved[FIRST_PSEUDO_REGISTER+1]; +} frame_state; + +/* Values for 'saved' above. */ +#define REG_UNSAVED 0 +#define REG_SAVED_OFFSET 1 +#define REG_SAVED_REG 2 + +/* Called either from crtbegin.o or a static constructor to register the + unwind info for an object or translation unit, respectively. */ + +extern void __register_frame (void *); + +/* Called from crtend.o to deregister the unwind info for an object. */ + +extern void __deregister_frame (void *); + +/* Called from __throw to find the registers to restore for a given + PC_TARGET. The caller should allocate a local variable of `struct + frame_state' (declared in frame.h) and pass its address to STATE_IN. + Returns NULL on failure, otherwise returns STATE_IN. */ + +extern struct frame_state *__frame_state_for (void *, struct frame_state *); diff --git a/gcc/gencheck.c b/gcc/gencheck.c new file mode 100644 index 00000000000..6b5612ded31 --- /dev/null +++ b/gcc/gencheck.c @@ -0,0 +1,62 @@ +/* Generate check macros for tree codes. + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include "hconfig.h" +#include "system.h" + +#define DEFTREECODE(SYM, NAME, TYPE, LEN) STRINGIFY(SYM), + +char *tree_codes[] = { +#include "tree.def" +(char*)0 +}; + +void usage () +{ + fprintf (stderr,"Usage: gencheck\n"); +} + +int main (argc, argv) + int argc; + char *argv[]; +{ + int i; + switch (argc) + { + case 1: + break; + default: + usage (); + exit (1); + } + + printf ("/* This file is generated using gencheck. Do not edit. */\n"); + for (i = 0; tree_codes[i]; i++) + { + printf ("#define %s_CHECK(t)\tTREE_CHECK (t, %s)\n", + tree_codes[i], tree_codes[i]); + printf ("#define %s_CHECK1(t)\tTREE_CHECK1 (t, %s)\n", + tree_codes[i], tree_codes[i]); + } + + return 0; +} + diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c new file mode 100644 index 00000000000..977305d9a82 --- /dev/null +++ b/gcc/gengenrtl.c @@ -0,0 +1,287 @@ +/* Generate code to allocate RTL structures. + Copyright (C) 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +#include "hconfig.h" +#include <stdio.h> + +#include "obstack.h" +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free + +#define NO_GENRTL_H +#include "rtl.h" + + +struct rtx_definition +{ + const char *enumname, *name, *format; +}; + +#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { # ENUM, NAME, FORMAT }, + +struct rtx_definition defs[] = +{ +#include "rtl.def" /* rtl expressions are documented here */ +}; + +const char *formats[NUM_RTX_CODE]; + +static const char * +type_from_format (char c) +{ + switch (c) + { + case 'i': + return "int"; + case 'w': + return "HOST_WIDE_INT"; + case 's': + return "char *"; + case 'e': + case 'u': + return "rtx"; + case 'E': + return "rtvec"; + default: + abort (); + } +} + +static const char * +accessor_from_format (char c) +{ + switch (c) + { + case 'i': + return "XINT"; + case 'w': + return "XWINT"; + case 's': + return "XSTR"; + case 'e': + case 'u': + return "XEXP"; + case 'E': + return "XVEC"; + default: + abort (); + } +} + +static int +special_format (fmt) + const char *fmt; +{ + return (strchr (fmt, '*') != 0 + || strchr (fmt, 'V') != 0 + || strchr (fmt, 'S') != 0 + || strchr (fmt, 'n') != 0); +} + +static int +special_rtx (idx) + int idx; +{ + return (strcmp (defs[idx].enumname, "CONST_INT") == 0 + || strcmp (defs[idx].enumname, "REG") == 0); +} + +static void +find_formats () +{ + int i; + + for (i = 0; i < NUM_RTX_CODE; ++i) + { + const char **f; + + if (special_format (defs[i].format)) + continue; + + for (f = formats; *f ; ++f) + if (!strcmp(*f, defs[i].format)) + break; + + if (!*f) + *f = defs[i].format; + } +} + +static void +gendecl (f, format) + FILE *f; + const char *format; +{ + const char *p; + int i; + + fprintf (f, "extern rtx gen_rtx_fmt_%s PROTO((RTX_CODE, enum machine_mode mode", + format); + for (p = format, i = 0; *p ; ++p) + if (*p != '0') + fprintf (f, ", %s arg%d", type_from_format (*p), i++); + fprintf (f, "));\n"); +} + +static void +genmacro (f, idx) + FILE *f; + int idx; +{ + const char *p; + int i; + + fprintf (f, "#define gen_rtx_%s%s(mode", + (special_rtx (idx) ? "raw_" : ""), defs[idx].enumname); + + for (p = defs[idx].format, i = 0; *p ; ++p) + if (*p != '0') + fprintf (f, ", arg%d", i++); + fprintf (f, ") "); + + fprintf (f, "gen_rtx_fmt_%s(%s,(mode)", defs[idx].format, defs[idx].enumname); + for (p = defs[idx].format, i = 0; *p ; ++p) + if (*p != '0') + fprintf (f, ",(arg%d)", i++); + fprintf (f, ")\n"); +} + +static void +gendef (f, format) + FILE *f; + const char *format; +{ + const char *p; + int i, j; + + fprintf (f, "rtx\ngen_rtx_fmt_%s (code, mode", format); + for (p = format, i = 0; *p ; ++p) + if (*p != '0') + fprintf (f, ", arg%d", i++); + + fprintf (f, ")\n RTX_CODE code;\n enum machine_mode mode;\n"); + for (p = format, i = 0; *p ; ++p) + if (*p != '0') + fprintf (f, " %s arg%d;\n", type_from_format (*p), i++); + + /* See rtx_alloc in rtl.c for comments. */ + fprintf (f, "{\n"); + fprintf (f, " register int length = sizeof (struct rtx_def)"); + fprintf (f, " + %d * sizeof (rtunion);\n", strlen (format) - 1); + fprintf (f, " rtx rt = (rtx)obstack_alloc (rtl_obstack, length);\n"); + + fprintf (f, " if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(int))\n"); + fprintf (f, " *(int *)rt = 0;\n"); + fprintf (f, " else if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(HOST_WIDE_INT))\n"); + fprintf (f, " *(HOST_WIDE_INT *)rt = 0;\n"); + fprintf (f, " else\n"); + fprintf (f, " bzero(rt, sizeof(struct rtx_def) - sizeof(rtunion));\n\n"); + + fprintf (f, " PUT_CODE (rt, code);\n"); + fprintf (f, " PUT_MODE (rt, mode);\n"); + + for (p = format, i = j = 0; *p ; ++p, ++i) + if (*p != '0') + { + fprintf (f, " %s (rt, %d) = arg%d;\n", + accessor_from_format (*p), i, j++); + } + + fprintf (f, "\n return rt;\n}\n\n"); +} + +static void +genlegend (f) + FILE *f; +{ + fprintf (f, "/* Generated automaticaly by the program `gengenrtl'\n"); + fprintf (f, " from the RTL description file `rtl.def' */\n\n"); +} + +static void +genheader (f) + FILE *f; +{ + int i; + const char **fmt; + + for (fmt = formats; *fmt; ++fmt) + gendecl (f, *fmt); + + fprintf(f, "\n"); + + for (i = 0; i < NUM_RTX_CODE; i++) + { + if (special_format (defs[i].format)) + continue; + genmacro (f, i); + } +} + +static void +gencode (f) + FILE *f; +{ + const char **fmt; + + fprintf(f, "#include \"config.h\"\n"); + fprintf(f, "#include \"obstack.h\"\n"); + fprintf(f, "#include \"rtl.h\"\n\n"); + fprintf(f, "extern struct obstack *rtl_obstack;\n\n"); + + for (fmt = formats; *fmt; ++fmt) + gendef (f, *fmt); +} + +int +main(argc, argv) + int argc; + char **argv; +{ + FILE *f; + + if (argc != 3) + exit (1); + + find_formats (); + + f = fopen (argv[1], "w"); + if (f == NULL) + { + perror(argv[1]); + exit (1); + } + genlegend (f); + genheader (f); + fclose(f); + + f = fopen (argv[2], "w"); + if (f == NULL) + { + perror(argv[2]); + exit (1); + } + genlegend (f); + gencode (f); + fclose(f); + + exit (0); +} diff --git a/gcc/ginclude/va-arc.h b/gcc/ginclude/va-arc.h new file mode 100644 index 00000000000..a718ad6245d --- /dev/null +++ b/gcc/ginclude/va-arc.h @@ -0,0 +1,111 @@ +/* stdarg/varargs support for the ARC */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void * __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +/* See arc_setup_incoming_varargs for reasons for the oddity in va_start. */ +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ +(AP = (__gnuc_va_list) ((int *) __builtin_next_arg (LASTARG) \ + + (__builtin_args_info (0) < 8 \ + ? (__builtin_args_info (0) & 1) \ + : 0))) +#else +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) \ +(AP = (__gnuc_va_list) ((int *) &__builtin_va_alist \ + + (__builtin_args_info (0) < 8 \ + ? (__builtin_args_info (0) & 1) \ + : 0))) +#endif + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ + +/* Values returned by __builtin_classify_type. */ + +enum __va_type_classes { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +#endif +#define va_end(AP) ((void)0) + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +/* All aggregates are passed by reference. All scalar types larger than 8 + bytes are passed by reference. */ +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. + The casts to char * avoid warnings about invalid pointer arithmetic. */ + +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) + +#ifdef __big_endian__ +#define va_arg(AP,TYPE) \ +__extension__ \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || __va_rounded_size (TYPE) > 8) \ + ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ + *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ + : ((TYPE *) (void *) \ + (AP = (void *) ((__alignof__ (TYPE) > 4 \ + ? ((int) AP + 8 - 1) & -8 \ + : (int) AP) \ + + __va_rounded_size (TYPE))) - 1));})) +#else +#define va_arg(AP,TYPE) \ +__extension__ \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || __va_rounded_size (TYPE) > 8) \ + ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ + *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ + : ((AP = (void *) ((__alignof__ (TYPE) > 4 \ + ? ((int) AP + 8 - 1) & -8 \ + : (int) AP) \ + + __va_rounded_size (TYPE))), \ + (TYPE *) (void *) (AP - __va_rounded_size (TYPE))));})) +#endif + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/gcc/ginclude/va-v850.h b/gcc/ginclude/va-v850.h new file mode 100644 index 00000000000..3fd812ab228 --- /dev/null +++ b/gcc/ginclude/va-v850.h @@ -0,0 +1,37 @@ +/* CYGNUS LOCAL v850/law (entire file ) */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) +#else +#define __va_ellipsis ... +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP=(char *) &__builtin_va_alist +#endif + +/* Now stuff common to both varargs & stdarg implementations. */ +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#undef va_end +void va_end (__gnuc_va_list); +#define va_end(AP) ((void)0) +#define va_arg(AP, TYPE) \ + (sizeof (TYPE) > 8 \ + ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ + **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ + : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) +#endif +/* END CYGNUS LOCAL */ diff --git a/gcc/intl.c b/gcc/intl.c new file mode 100644 index 00000000000..e0399096d03 --- /dev/null +++ b/gcc/intl.c @@ -0,0 +1,6 @@ +/* intl.c - internationalization */ + +#include "gansidecl.h" +#include "intl.h" + +const char localedir[] = LOCALEDIR; diff --git a/gcc/intl.h b/gcc/intl.h new file mode 100644 index 00000000000..56c075e6c05 --- /dev/null +++ b/gcc/intl.h @@ -0,0 +1,52 @@ +/* intl.h - internationalization + Copyright 1998 Free Software Foundation, Inc. + + 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. */ + +#ifdef HAVE_LOCALE_H +# include <locale.h> +#endif + +#ifndef HAVE_SETLOCALE +# define setlocale(category, locale) (locale) +#endif + +#ifdef ENABLE_NLS +# include <libintl.h> + extern const char localedir[]; +#else +/* Stubs that do something close enough. */ +# ifdef textdomain +# undef textdomain +# endif +# define textdomain(domain) (domain) +# ifdef bindtextdomain +# undef bindtextdomain +# endif +# define bindtextdomain(domain, directory) (domain) +# ifdef gettext +# undef gettext +# endif +# define gettext(msgid) (msgid) +#endif + +#ifndef _ +# define _(msgid) gettext (msgid) +#endif + +#ifndef N_ +# define N_(msgid) (msgid) +#endif diff --git a/gcc/intl/ChangeLog b/gcc/intl/ChangeLog new file mode 100644 index 00000000000..198950159da --- /dev/null +++ b/gcc/intl/ChangeLog @@ -0,0 +1,1086 @@ +1998-04-29 Ulrich Drepper <drepper@cygnus.com> + + * intl/localealias.c (read_alias_file): Use unsigned char for + local variables. Remove unused variable tp. + * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * + for type of codeset. For loosing Solaris systems. + * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. + * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable + len if not needed. + Patches by Jim Meyering. + +1998-04-28 Ulrich Drepper <drepper@cygnus.com> + + * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if + mmap is not supported. + + * hash-string.h: Don't include <values.h>. + +1998-04-27 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Use strdup is available. + + * localealias.c: Define HAVE_MEMPCPY so that we can use this + function. Define and use semapahores to protect modfication of + global objects when compiling for glibc. Add code to allow + freeing alias table. + + * l10nflist.c: Don't assume stpcpy not being a macro. + + * gettextP.h: Define internal_function macri if not already done. + Use glibc byte-swap macros instead of defining SWAP when compiled + for glibc. + (struct loaded_domain): Add elements to allow unloading. + + * Makefile.in (distclean): Don't remove libintl.h here. + + * bindtextdomain.c: Carry over changes from glibc. Use strdup if + available. + + * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal + functions. Add memory freeing code for glibc. + + * dgettext.c: Update copyright. + + * explodename.c: Include stdlib.h and string.h only if they exist. + Use strings.h eventually. + + * finddomain.c: Mark internal functions. Use strdup if available. + Add memory freeing code for glibc. + +1997-10-10 20:00 Ulrich Drepper <drepper@cygnus.com> + + * libgettext.h: Fix dummy textdomain and bindtextdomain macros. + They should return reasonable values. + Reported by Tom Tromey <tromey@cygnus.com>. + +1997-09-16 03:33 Ulrich Drepper <drepper@cygnus.com> + + * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. + * intlh.inst.in: Likewise. + Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>. + + * libintl.glibc: Update from current glibc version. + +1997-09-06 02:10 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in: Reformat copyright. + +1997-08-19 15:22 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (DCGETTEXT): Remove wrong comment. + +1997-08-16 00:13 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install-data): Don't change directory to install. + +1997-08-01 14:30 Ulrich Drepper <drepper@cygnus.com> + + * cat-compat.c: Fix copyright. + + * localealias.c: Don't define strchr unless !HAVE_STRCHR. + + * loadmsgcat.c: Update copyright. Fix typos. + + * l10nflist.c: Don't define strchr unless !HAVE_STRCHR. + (_nl_make_l10nflist): Handle sponsor and revision correctly. + + * gettext.c: Update copyright. + * gettext.h: Likewise. + * hash-string.h: Likewise. + + * finddomain.c: Remoave dead code. Define strchr only if + !HAVE_STRCHR. + + * explodename.c: Include <sys/types.h>. + + * explodename.c: Reformat copyright text. + (_nl_explode_name): Fix typo. + + * dcgettext.c: Define and use __set_errno. + (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is + not defined. + + * bindtextdom.c: Pretty printing. + +1997-05-01 02:25 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (guess_category_value): Don't depend on + HAVE_LC_MESSAGES. We don't need the macro here. + Patch by Bruno Haible <haible@ilog.fr>. + + * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL + macro. Instead use HAVE_LOCALE_NULL and define it when using + glibc, as in dcgettext.c. + Patch by Bruno Haible <haible@ilog.fr>. + + * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois + Pinard. + +Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in: Implement handling of libtool. + + * gettextP.h: Change data structures for use of generic lowlevel + i18n file handling. + +Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Put parentheses around arguments of memcpy macro + definition. + * localealias.c: Likewise. + * l10nflist.c: Likewise. + * finddomain.c: Likewise. + * bindtextdom.c: Likewise. + Reported by Thomas Esken. + +Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper@cygnus.com> + + * textdomain.c: Move definition of `memcpy` macro to right + position. + +Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper@cygnus.com> + + * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using + bcopy if not already defined. Reported by Thomas Esken. + * bindtextdom.c: Likewise. + * l10nflist.c: Likewise. + * localealias.c: Likewise. + * textdomain.c: Likewise. + +Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (libdir): Change to use exec_prefix instead of + prefix. Reported by Knut-HåvardAksnes <etokna@eto.ericsson.se>. + +Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (_nl_normalize_codeset): We convert to lower case, + so don't prepend uppercase `ISO' for only numeric arg. + +Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after + definition of _GNU_SOURCE. Patch by Roland McGrath. + + * Makefile.in (uninstall): Fix another bug with `for' loop and + empty arguments. Patch by Jim Meyering. Correct name os + uninstalled files: no intl- prefix anymore. + + * Makefile.in (install-data): Again work around shells which + cannot handle mpty for list. Reported by Jim Meyering. + +Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Split goal. Now depend on install-exec + and install-data. + (install-exec, install-data): New goals. Created from former + install goal. + Reported by Karl Berry. + +Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (MKINSTALLDIRS): New variable. Path to + mkinstalldirs script. + (install): use MKINSTALLDIRS variable or if the script is not present + try to find it in the $top_scrdir). + +Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Linux libc *partly* includes the argz_* functions. + Grr. Work around by renaming the static version and use macros + for renaming. + +Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c: Correct presence test macros of __argz_* functions. + + * l10nflist.c: Include <argz.h> based on test of it instead when + __argz_* functions are available. + Reported by Andreas Schwab. + +Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper@cygnus.com> + + * explodename.c, l10nflist.c: Define NULL for dumb systems. + +Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in, libgettext.h (dcgettext): Rename local variable + result to __result to prevent name clash. + + * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to + get prototype for stpcpy and strcasecmp. + + * intlh.inst.in, libgettext.h: Move declaration of + `_nl_msg_cat_cntr' outside __extension__ block to prevent warning + from gcc's -Wnested-extern option. + +Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Remove comment. + +Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (install): Work around for another Buglix stupidity. + Always use an `else' close for `if's. Reported by Nelson Beebe. + + * Makefile.in (intlh.inst): Correct typo in phony rule. + Reported by Nelson Beebe. + +Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper@cygnus.com> + + * dcgettext.c (read_alias_file): Rename variable alloca_list to + block_list as the macro calls assume. + Patch by Eric Backus. + + * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using + malloc. + (read_alias_file): Rename varriabe alloca_list to block_list as the + macro calls assume. + Patch by Eric Backus. + + * l10nflist.c: Correct conditional for <argz.h> inclusion. + Reported by Roland McGrath. + + * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not + all-@USE_NLS@. + + * Makefile.in (install): intlh.inst comes from local dir, not + $(srcdir). + + * Makefile.in (intlh.inst): Special handling of this goal. If + used in gettext, this is really a rul to construct this file. If + used in any other package it is defined as a .PHONY rule with + empty body. + + * finddomain.c: Extract locale file information handling into + l10nfile.c. Rename local stpcpy__ function to stpcpy. + + * dcgettext.c (stpcpy): Add local definition. + + * l10nflist.c: Solve some portability problems. Patches partly by + Thomas Esken. Add local definition of stpcpy. + +Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper@cygnus.com> + + * intlh.inst.in: Don't depend including <locale.h> on + HAVE_LOCALE_H. Instead configure must rewrite this fiile + depending on the result of the configure run. + + * Makefile.in (install): libintl.inst is now called intlh.inst. + Add rules for updating intlh.inst from intlh.inst.in. + + * libintl.inst: Renamed to intlh.inst.in. + + * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 + because gcc has __buitlin_alloca. + Reported by Roland McGrath. + +Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper@cygnus.com> + + * Makefile.in (installcheck): New goal to fulfill needs of + automake's distcheck. + + * Makefile.in (install): Reorder commands so that VERSION is + found. + + * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in + @datadir@/gettext. + (COMSRCS): Add l10nfile.c. + (OBJECTS): Add l10nfile.o. + (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). + (DISTFILE.gettext): Remove $(DISTFILES.common). + (all-gettext): Remove goal. + (install): If $(PACKAGE) = gettext install, otherwose do nothing. No + package but gettext itself should install libintl.h + headers. + (dist): Extend goal to work for gettext, too. + (dist-gettext): Remove goal. + + * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. + +Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper@cygnus.com> + + * loadmsgcat.c (_nl_load_domain): Parameter is now comes from + find_l10nfile. + +Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper@cygnus.com> + + * l10nflist.c (__argz_next): Add definition. + + * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca + code. Use new l10nfile handling. + + * localealias.c [!HAVE_ALLOCA]: Add code for handling missing + alloca code. + + * l10nflist.c: Initial revision. + +Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-gettext): New goal. Same as all-yes. + +Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke@ke.central.de> + + * Makefile.in (gettextsrcdir): Define using @datadir@. + +Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c: Include <ctype.h>. Reported by Roland McGrath. + +Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing + with external declaration. + +Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all-no): Rename from all_no. + +Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper@myware> + + * gettextP.h [loaded_domain]: Array `successor' must now contain up + to 63 elements (because of codeset name normalization). + + * finddomain.c: Implement codeset name normalization. + +Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper@myware> + + * Makefile.in (all): Define to `all-@USE_NLS@'. + (all-yes, all_no): New goals. `all-no' is noop, `all-yes' + is former all. + +Mon Jan 15 21:46:01 1996 Howard Gayle <howard@hal.com> + + * localealias.c (alias_compare): Increment string pointers in loop + of strcasecmp replacement. + +Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Who commented this goal out ? :-) + +Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls + should not effect it because a missing catalog is no error. + Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>. + +Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (Makefile): Explicitly use $(SHELL) for running + shell scripts. + +Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile.in (install-src): Only install library and header when + we use the own implementation. Don't do it when using the + system's gettext or catgets functions. + + * dcgettext.c (find_msg): Must not swap domain->hash_size here. + +Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper@myware> + + * localealias.c, libintl.inst, libgettext.h, hash-string.h, + gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: + Use PARAMS instead of __P. Suggested by Roland McGrath. + +Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud@cyclone.stanford.edu> + + * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if + !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. + +Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): + Install libintl.inst instead of libintl.h.install. + +Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus@sysc.pdx.edu> + + * cat-compat.c (textdomain): + Reverse order in which files are tried you load. First + try local file, when this failed absolute path. + +Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * cat-compat.c (bindtextdomain): Add missing { }. + +Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware> + + * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. + + * Makefile.in: + Add dummy `all' and `dvi' goals. Reported by Tom Tromey. + +Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard@iro.umontreal.ca> + + * hash-string.h: Capitalize arguments of macros. + +Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Prevent files names longer than 13 + characters. libintl.h.glibc->libintl.glibc, + libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. + +Sat Nov 25 11:31:12 1995 Eric Backus <ericb@lsid.hp.com> + + * dcgettext.c: Fix bug in preprocessor conditionals. + +Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe@math.utah.edu> + + * libgettext.h: Solaris cc does not understand + #if !SYMBOL1 && !SYMBOL2. Sad but true. + +Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): + Fix for machine with >32 bit `unsigned long's. + + * dcgettext.c (DCGETTEXT): + Fix horrible bug in loop for alternative translation. + +Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: + Some further simplifications in message number generation. + +Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware> + + * libintl.h.glibc: Use __const instead of const in prototypes. + + * Makefile.in (install-src): + Install libintl.h.install instead of libintl.h. This + is a stripped-down version. Suggested by Peter Miller. + + * libintl.h.install, libintl.h.glibc: Initial revision. + + * localealias.c (_nl_expand_alias, read_alias_file): + Protect prototypes in type casts by __P. + +Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h: Correct prototype for hash_string. + +Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware> + + * hash-string.h (hash_string): Add prototype. + + * gettextP.h: Fix copyright. + (SWAP): Add prototype. + +Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): Forgot sizeof. + Avoid calling *printf function. This introduces a big overhead. + Patch by Roland McGrath. + +Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. + + * finddomain.c (stpcpy): + Define substitution function local. The macro was to flaky. + + * cat-compat.c: Fix typo. + + * xopen-msg.sed, linux-msg.sed: + While bringing message number to right place only accept digits. + + * linux-msg.sed, xopen-msg.sed: Now that the counter does not have + leading 0s we don't need to remove them. Reported by Marcus + Daniels. + + * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in + dependency. Reported by Marcus Daniels. + + * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. + Generally cleanup using #if instead of #ifndef. + + * Makefile.in: Correct typos in comment. By Franc,ois Pinard. + +Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (install-src): Don't install libintl.h and libintl.a + if we use an available gettext implementation. + +Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported + by Franc,ois Pinard. + + * libgettext.h: Use #if instead of #ifdef/#ifndef. + + * finddomain.c: + Comments describing what has to be done should start with FIXME. + +Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. + DISTFILES.common names the files common to both dist goals. + DISTFILES.gettext are the files only distributed in GNU gettext. + +Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (DCGETTEXT): Correct searching in derived locales. + This was necessary since a change in _nl_find_msg several weeks + ago. I really don't know this is still not fixed. + +Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This + might mark a special condition. + + * finddomain.c (make_entry_rec): Don't make illegal entry as decided. + + * Makefile.in (dist): Suppress error message when ln failed. + Get files from $(srcdir) explicitly. + + * libgettext.h (gettext_const): Rename to gettext_noop. + +Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (make_entry_rec): + Protect against wrong locale names by testing mask. + + * libgettext.h (gettext_const): Add macro definition. + Capitalize macro arguments. + +Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Test for pointer != NULL before accessing value. + Reported by Tom Tromey. + + * gettext.c (NULL): + Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. + +Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. + +Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h: Disable dcgettext optimization for Solaris 2.3. + + * localealias.c (alias_compare): + Peter Miller reported that tolower in some systems is + even dumber than I thought. Protect call by `isupper'. + +Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (libdir, includedir): New variables. + (install-src): Install libintl.a and libintl.h in correct dirs. + +Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. + + * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. + + * localealias.c: + Fix typo and superflous test. Reported by Christian von Roques. + +Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Correct some remainder from the pre-CEN syntax. Now + we don't have a constant number of successors anymore. + +Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): Add libintl.h.glibc. + + * Makefile.in (dist-libc): Add goal for packing sources for glibc. + (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. + + * loadmsgcat.c: Forget to continue #if line. + + * localealias.c: + [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name + space clean. + + * dcgettext.c, finddomain.c: Better comment to last change. + + * loadmsgcat.c: + [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to + __fstat, __open, __close, __read, __mmap, and __munmap resp + to keep ANSI C name space clean. + + * finddomain.c: + [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. + + * dcgettext.c: + [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to + keep ANSI C name space clean. + + * libgettext.h: + Include sys/types.h for those old SysV systems out there. + Reported by Francesco Potorti`. + + * loadmsgcat.c (use_mmap): Define if compiled for glibc. + + * bindtextdom.c: Include all those standard headers + unconditionally if _LIBC is defined. + + * finddomain.c: Fix 2 times defiend -> defined. + + * textdomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. + + * gettext.c: + Include libintl.h instead of libgettext.h when compiling for glibc. + Get NULL from stddef.h if we compile for glibc. + + * finddomain.c: Include libintl.h instead of libgettext.h when + compiling for glibc. Include all those standard headers + unconditionally if _LIBC is defined. + + * dcgettext.c: Include all those standard headers unconditionally + if _LIBC is defined. + + * dgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. + + * dcgettext.c: If compiled in glibc include libintl.h instead of + libgettext.h. + (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. + + * bindtextdom.c: + If compiled in glibc include libintl.h instead of libgettext.h. + +Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. + Reported by Marcus Daniels. + + * cat-compat.c (bindtextdomain): + String used in putenv must not be recycled. + Reported by Marcus Daniels. + + * libgettext.h (__USE_GNU_GETTEXT): + Additional symbol to signal that we use GNU gettext + library. + + * cat-compat.c (bindtextdomain): + Fix bug with the strange stpcpy replacement. + Reported by Nelson Beebe. + +Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: Include <string.h> for stpcpy prototype. + + * localealias.c (read_alias_file): + While expand strdup code temporary variable `cp' hided + higher level variable with same name. Rename to `tp'. + + * textdomain.c (textdomain): + Avoid warning by using temporary variable in strdup code. + + * finddomain.c (_nl_find_domain): Remove unused variable `application'. + +Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (alias_compare): + Use strcasecmp() only if available. Else use + implementation in place. + + * intl-compat.c: + Wrapper functions now call *__ functions instead of __*. + + * libgettext.h: Declare prototypes for *__ functions instead for __*. + + * cat-compat.c, loadmsgcat.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + + * bindtextdom.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Rename to bindtextdomain__ if not used in GNU C Library. + + * dgettext.c: + Rename function to dgettext__ if not used in GNU C Library. + + * gettext.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + Functions now called gettext__ if not used in GNU C Library. + + * dcgettext.c, localealias.c, textdomain.c, finddomain.c: + Don't use xmalloc, xstrdup, and stpcpy. These functions are not part + of the standard libc and so prevent libintl.a from being used + standalone. + +Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Correct some bugs in handling of CEN standard + locale definitions. + +Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c: Implement CEN syntax. + + * gettextP.h (loaded_domain): Extend number of successors to 31. + +Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (aliaspath): Remove path to X11 locale dir. + + * Makefile.in: Make install-src depend on install. This helps + gettext to install the sources and other packages can use the + install goal. + +Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (uninstall): Remove stuff installed by install-src. + +Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware> + + * VERSION.in: Initial revision. + + * Makefile.in (DISTFILES): + Add VERSION file. This is not necessary for gettext, but + for other packages using this library. + +Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_find_domain): + New prototype after changing search strategy. + + * finddomain.c (_nl_find_domain): + We now try only to find a specified catalog. Fall back to other + catalogs listed in the locale list is now done in __dcgettext. + + * dcgettext.c (__dcgettext): + Now we provide message fall back even to different languages. + I.e. if a message is not available in one language all the other + in the locale list a tried. Formerly fall back was only possible + within one language. Implemented by moving one loop from + _nl_find_domain to here. + +Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gettextsrcdir): + Directory where source of GNU gettext library are made + available. + (INSTALL, INSTALL_DATA): Programs used for installing sources. + (gettext-src): New. Rule to install GNU gettext sources for use in + gettextize shell script. + +Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c (_nl_load_domain): + Use mmap for loading only when munmap function is + also available. + + * Makefile.in (install): Depend on `all' goal. + +Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware> + + * localealias.c (read_alias_file): + Do not overwrite '\n' when terminating alias value string. + + * localealias.c (read_alias_file): + Handle long lines. Ignore the rest not fitting in + the buffer after the initial `fgets' call. + +Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware> + + * gettextP.h (_nl_load_domain): + Add prototype, replacing prototype for _nl_load_msg_cat. + + * finddomain.c (_nl_find_domain): + Remove unneeded variable filename and filename_len. + (expand_alias): Remove prototype because functions does not + exist anymore. + + * localealias.c (read_alias_file): + Change type of fname_len parameter to int. + (xmalloc): Add prototype. + + * loadmsgcat.c: Better prototypes for xmalloc. + +Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (_nl_find_domain): + Allow alias name to be constructed from the four components. + + * Makefile.in (aliaspath): New variable. Set to preliminary value. + (SOURCES): Add localealias.c. + (OBJECTS): Add localealias.o. + + * gettextP.h: Add prototype for _nl_expand_alias. + + * finddomain.c: Aliasing handled in intl/localealias.c. + + * localealias.c: Aliasing for locale names. + + * bindtextdom.c: Better prototypes for xmalloc and xstrdup. + +Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): gettext.perl is now found in misc/. + + * cat-compat.c (bindtextdomain): + Correct implementation. dirname parameter was not used. + Reported by Marcus Daniels. + + * gettextP.h (loaded_domain): + New fields `successor' and `decided' for oo, lazy + message handling implementation. + + * dcgettext.c: + Adopt for oo, lazy message handliing. + Now we can inherit translations from less specific locales. + (find_msg): New function. + + * loadmsgcat.c, finddomain.c: + Complete rewrite. Implement oo, lazy message handling :-). + We now have an additional environment variable `LANGUAGE' with + a higher priority than LC_ALL for the LC_MESSAGE locale. + Here we can set a colon separated list of specifications each + of the form `language[_territory[.codeset]][@modifier]'. + +Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (unistd.h): + Include to get _PC_PATH_MAX defined on system having it. + +Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware> + + * finddomain.c (stpcpy): Include prototype. + + * Makefile.in (dist): Remove `copying instead' message. + +Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ID, TAGS): Do not use $^. + +Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (TAGS, ID): Use $^ as command argument. + (TAGS): Give etags -o option t write to current directory, + not $(srcdir). + (ID): Use $(srcdir) instead os $(top_srcdir)/src. + (distclean): Remove ID. + +Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (gnulocaledir): + New variable, always using share/ for data directory. + (DEFS): Add GNULOCALEDIR, used in finddomain.c. + + * finddomain.c (_nl_default_dirname): + Set to GNULOCALEDIR, because it always has to point + to the directory where GNU gettext Library writes it to. + + * intl-compat.c (textdomain, bindtextdomain): + Undefine macros before function definition. + +Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware> + + * libgettext.h (_LIBINTL_H): + Protect definition in case where this file is included as + libgettext.h on Solaris machines. Add comment about this. + +Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware> + + * intl-compat.c (textdomain): Correct typo. + +Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware> + + * dcgettext.c (dcgettext): Function now called __dcgettext. + + * dgettext.c (dgettext): Now called __dgettext and calls + __dcgettext. + + * gettext.c (gettext): + Function now called __gettext and calls __dgettext. + + * textdomain.c (textdomain): Function now called __textdomain. + + * bindtextdom.c (bindtextdomain): Function now called + __bindtextdomain. + + * intl-compat.c: Initial revision. + + * Makefile.in (SOURCES): Add intl-compat.c. + (OBJECTS): We always compile the GNU gettext library functions. + OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, + and intl-compat.o. + (GETTOBJS): Contains now only intl-compat.o. + + * libgettext.h: + Re-include protection matches dualistic character of libgettext.h. + For all functions in GNU gettext library define __ counter part. + + * finddomain.c (strchr): Define as index if not found in C library. + (_nl_find_domain): For relative paths paste / in between. + +Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware> + + * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. + + * xopen-msg.sed: Fix bug with `msgstr ""' lines. + A little bit better comments. + +Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + po-mode.el, makelinks, combine-sh are now found in ../misc. + + * po-mode.el, makelinks, combine-sh, elisp-comp: + Moved to ../misc/. + + * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. + +Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (INSTALL, INSTALL_DATA): New variables. + (install-data, uninstall): Install/uninstall .elc file. + + * po-mode.el (Installation comment): + Add .pox as possible extension of .po files. + +Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware> + + * elisp-comp: Complete new version by Franc,ois: This does not + fail when not compiling in the source directory. + +Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (../po/cat-id-tbl.o): + Use $(MAKE) instead of make for recursive make. + + * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. + (install-exec): Add missing dummy goal. + (install-data, uninstall): @ in multi-line shell command at + beginning, not in front of echo. Reported by Eric Backus. + +Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (DISTFILES): + Rename libgettext.perl to gettext.perl to fit in 14 chars + file systems. + + * gettext.perl: + Rename to gettext.perl to fit in 14 chars file systems. + +Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware> + + * cat-compat.c: If !STDC_HEADERS try to include malloc.h. + +Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware> + + * po2tbl.sed.in: Pretty printing. + + * linux-msg.sed, xopen-msg.sed: + Correct bugs with handling substitute flags in branches. + + * hash-string.h (hash_string): + Old K&R compilers don't under stand `unsigned char'. + + * gettext.h (nls_uint32): + Some old K&R compilers (eg HP) don't understand `unsigned int'. + + * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. + +Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (ELCFILES): New variable. + (DISTFILES): Add elisp-comp. + Add implicit rule for .el -> .elc compilation. + (install-data): install $ELCFILES + (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. + + * elisp-comp: Initial revision + +Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: + cat-id-tbl.c is now found in po/. This enables us to use an identical + intl/ directory in all packages. + + * dcgettext.c (dcgettext): hashing does not work for table size <= 2. + + * textdomain.c: fix typo (#if def -> #if defined) + +Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in (stamp-cat-id): use top_srcdir to address source files + (DISTFILES,distclean): move tupdate.perl to src/ + + * po-to-tbl.sed.in: + add additional jump to clear change flag to recognize multiline strings + +Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware> + + * textdomain.c: Protect inclusion of stdlib.h and string.h. + + * loadmsgcat.c: Protect inclusion of stdlib.h. + + * libgettext.h: Protect inclusion of locale.h. + Allow use in C++ programs. + Define NULL is not happened already. + + * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of + po-to-tbl.sed. + (distclean): remove po-to-tbl.sed and tupdate.perl. + + * tupdate.perl.in: Substitute Perl path even in exec line. + Don't include entries without translation from old .po file. + +Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: use "Updated: " in msgid "". + + * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). + Define getenv if !__STDC__. + + * bindtextdom.c: Protect stdlib.h and string.h inclusion. + Define free if !__STDC__. + + * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + Define free if !__STDC__. + + * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. + +Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware> + + * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. + Remove unneeded $(srcdir) from Makefile.in dependency. + + * makelinks: Add copyright and short description. + + * po-mode.el: Last version for 0.7. + + * tupdate.perl.in: Fix die message. + + * dcgettext.c: Protect include of string.h. + + * gettext.c: Protect include of stdlib.h and further tries to get NULL. + + * finddomain.c: Some corrections in includes. + + * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. + + * po-to-tbl.sed: Adopt for new .po file format. + + * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. + +Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware> + + * tupdate.perl.in: Complete rewrite for new .po file format. + +Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware> + + * First official release. This directory contains all the code + needed to internationalize own packages. It provides functions + which allow to use the X/Open catgets function with an interface + like the Uniforum gettext function. For system which does not + have neither of those a complete implementation is provided. diff --git a/gcc/intl/Makefile.in b/gcc/intl/Makefile.in new file mode 100644 index 00000000000..cc1d6cef7f9 --- /dev/null +++ b/gcc/intl/Makefile.in @@ -0,0 +1,218 @@ +# Makefile for directory with message catalog handling in GNU NLS Utilities. +# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +# +# 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, 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. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = $(exec_prefix)/lib +includedir = $(prefix)/include +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = @datadir@/gettext/intl +aliaspath = $(localedir):. +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ + +l = @l@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \ +-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = $(COMHDRS) libgettext.h loadinfo.h +COMHDRS = gettext.h gettextP.h hash-string.h +SOURCES = $(COMSRCS) intl-compat.c cat-compat.c +COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ +finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ +explodename.c +OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ +finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ +explodename.$lo +CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo +GETTOBJS = intl-compat.$lo +DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \ +xopen-msg.sed $(HEADERS) $(SOURCES) +DISTFILES.normal = VERSION +DISTFILES.gettext = libintl.glibc intlh.inst.in + +.SUFFIXES: +.SUFFIXES: .c .o .lo +.c.o: + $(COMPILE) $< +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) $< + +INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib + +all: all-@USE_INCLUDED_LIBINTL@ + +all-yes: libintl.$la intlh.inst +all-no: + +libintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \ + -version-info 1:0 -rpath $(libdir) + +../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot + cd ../po && $(MAKE) cat-id-tbl.$lo + +check: all + +# This installation goal is only used in GNU gettext. Packages which +# only use the library should use install instead. + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the gettext() function in its C library or in a +# separate library or use the catgets interface. A special case is +# where configure found a previously installed GNU gettext library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(libdir) $(includedir); \ + else \ + $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \ + fi; \ + $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \ + $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext"; then \ + if test -r $(MKINSTALLDIRS); then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \ + dists="$(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + if test "$(PACKAGE)" = "gettext"; then \ + dists="$(DISTFILES.common)"; \ + for file in $$dists; do \ + rm -f $(gettextsrcdir)/$$file; \ + done + else \ + : ; \ + fi + +info dvi: + +$(OBJECTS): ../config.h libgettext.h +bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h +dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.o *.lo core core.* + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS po2msg.sed po2tbl.sed + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile $(DISTFILES) + if test "$(PACKAGE)" = gettext; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + for file in $(DISTFILES.common) $$additional; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +dist-libc: + tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc + +Makefile: Makefile.in ../config.status + cd .. \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# The dependency for intlh.inst is different in gettext and all other +# packages. Because we cannot you GNU make features we have to solve +# the problem while rewriting Makefile.in. +@GT_YES@intlh.inst: intlh.inst.in ../config.status +@GT_YES@ cd .. \ +@GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \ +@GT_YES@ $(SHELL) ./config.status +@GT_NO@.PHONY: intlh.inst +@GT_NO@intlh.inst: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gcc/intl/VERSION b/gcc/intl/VERSION new file mode 100644 index 00000000000..ee66b0612bc --- /dev/null +++ b/gcc/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.10.35 diff --git a/gcc/intl/bindtextdom.c b/gcc/intl/bindtextdom.c new file mode 100644 index 00000000000..d9c3f349e04 --- /dev/null +++ b/gcc/intl/bindtextdom.c @@ -0,0 +1,203 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + 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, 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 + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN bindtextdomain__ +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + struct binding *binding; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + return NULL; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (dirname == NULL) + /* The current binding has be to returned. */ + return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; + + if (binding != NULL) + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + if (strcmp (dirname, binding->dirname) != 0) + { + char *new_dirname; + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_dirname = strdup (dirname); + if (new_dirname == NULL) + return NULL; +#else + size_t len = strlen (dirname) + 1; + new_dirname = (char *) malloc (len); + if (new_dirname == NULL) + return NULL; + + memcpy (new_dirname, dirname, len); +#endif + } + + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = new_dirname; + } + } + else + { + /* We have to create a new binding. */ +#if !defined _LIBC && !defined HAVE_STRDUP + size_t len; +#endif + struct binding *new_binding = + (struct binding *) malloc (sizeof (*new_binding)); + + if (new_binding == NULL) + return NULL; + +#if defined _LIBC || defined HAVE_STRDUP + new_binding->domainname = strdup (domainname); + if (new_binding->domainname == NULL) + return NULL; +#else + len = strlen (domainname) + 1; + new_binding->domainname = (char *) malloc (len); + if (new_binding->domainname == NULL) + return NULL; + memcpy (new_binding->domainname, domainname, len); +#endif + + if (strcmp (dirname, _nl_default_dirname) == 0) + new_binding->dirname = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + new_binding->dirname = strdup (dirname); + if (new_binding->dirname == NULL) + return NULL; +#else + len = strlen (dirname) + 1; + new_binding->dirname = (char *) malloc (len); + if (new_binding->dirname == NULL) + return NULL; + memcpy (new_binding->dirname, dirname, len); +#endif + } + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + binding = new_binding; + } + + return binding->dirname; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +#endif diff --git a/gcc/intl/dcgettext.c b/gcc/intl/dcgettext.c new file mode 100644 index 00000000000..c4c7a2c7d14 --- /dev/null +++ b/gcc/intl/dcgettext.c @@ -0,0 +1,624 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + 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, 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 <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif +#include "hash-string.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) +# include <limits.h> +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) +# include <sys/param.h> +#endif + +#if !defined(PATH_MAX) && defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. And even worse: POSIX + defines this not at all. So we can use this feature only on selected + system (e.g. those using GNU C Library). */ +#ifdef _LIBC +# define HAVE_LOCALE_NULL +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +const char _nl_default_dirname[] = GNULOCALEDIR; + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, + const char *msgid)) internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +#else +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + int saved_errno = errno; + + /* If no real MSGID is given return NULL. */ + if (msgid == NULL) + return NULL; + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + defintion left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (binding->dirname[0] == '/') + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) + { + path_max += PATH_INCR; + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + __set_errno (0); + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + xdomainname = (char *) alloca (strlen (categoryname) + + strlen (domainname) + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for th translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return (char *) msgid; + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname); + + if (domain != NULL) + { + retval = find_msg (domain, msgid); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = find_msg (domain->successor[cnt], msgid); + + if (retval != NULL) + break; + } + } + + if (retval != NULL) + { + FREE_BLOCKS (block_list); + __set_errno (saved_errno); + return retval; + } + } + } + /* NOTREACHED */ +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcgettext, dcgettext); +#endif + + +static char * +internal_function +find_msg (domain_file, msgid) + struct loaded_l10nfile *domain_file; + const char *msgid; +{ + size_t top, act, bottom; + struct loaded_domain *domain; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) == 0) + return (char *) domain->data + W (domain->must_swap, + domain->trans_tab[nstr - 1].offset); + + while (1) + { + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + + nstr = W (domain->must_swap, domain->hash_tab[idx]); + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0) + return (char *) domain->data + + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); + } + /* NOTREACHED */ + } + + /* Now we try the default method: binary search in the sorted + array of messages. */ + bottom = 0; + top = domain->nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset)); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + break; + } + + /* If an translation is found return this. */ + return bottom >= top ? NULL : (char *) domain->data + + W (domain->must_swap, + domain->trans_tab[act].offset); +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = getenv ("LANGUAGE"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ +#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + return setlocale (category, NULL); +#else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* We use C as the default domain. POSIX says this is implementation + defined. */ + return "C"; +#endif +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + struct binding *runp; + + for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) + { + free (runp->domainname); + if (runp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (runp->dirname); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/gcc/intl/dgettext.c b/gcc/intl/dgettext.c new file mode 100644 index 00000000000..0510c2b071f --- /dev/null +++ b/gcc/intl/dgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + 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, 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 + +#if defined HAVE_LOCALE_H || defined _LIBC +# include <locale.h> +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT __dcgettext +#else +# define DGETTEXT dgettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/gcc/intl/explodename.c b/gcc/intl/explodename.c new file mode 100644 index 00000000000..8066dc29962 --- /dev/null +++ b/gcc/intl/explodename.c @@ -0,0 +1,188 @@ +/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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 + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +#endif +#include <sys/types.h> + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',') + ++cp; + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/gcc/intl/finddomain.c b/gcc/intl/finddomain.c new file mode 100644 index 00000000000..81ea29bf4e4 --- /dev/null +++ b/gcc/intl/finddomain.c @@ -0,0 +1,216 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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 <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <sys/types.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#include "gettext.h" +#include "gettextP.h" +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname) + const char *dirname; + char *locale; + const char *domainname; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt]); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/gcc/intl/gettext.c b/gcc/intl/gettext.c new file mode 100644 index 00000000000..d929f98d68a --- /dev/null +++ b/gcc/intl/gettext.c @@ -0,0 +1,70 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + 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, 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 + +#ifdef _LIBC +# define __need_NULL +# include <stddef.h> +#else +# ifdef STDC_HEADERS +# include <stdlib.h> /* Just for NULL. */ +# else +# ifdef HAVE_STRING_H +# include <string.h> +# else +# define NULL ((void *) 0) +# endif +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DGETTEXT __dgettext +#else +# define GETTEXT gettext__ +# define DGETTEXT dgettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DGETTEXT (NULL, msgid); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/gcc/intl/gettext.h b/gcc/intl/gettext.h new file mode 100644 index 00000000000..3cd23d7d6ad --- /dev/null +++ b/gcc/intl/gettext.h @@ -0,0 +1,105 @@ +/* Internal header for GNU gettext internationalization functions. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + 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, 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 Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include <stdio.h> + +#if HAVE_LIMITS_H || _LIBC +# include <limits.h> +#endif + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have <limits.h>) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/gcc/intl/gettextP.h b/gcc/intl/gettextP.h new file mode 100644 index 00000000000..00c52031972 --- /dev/null +++ b/gcc/intl/gettextP.h @@ -0,0 +1,89 @@ +/* Header describing internals of gettext library + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include "loadinfo.h" + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include <byteswap.h> +# define SWAP(i) bswap_32 (i) +#else +static nls_uint32 SWAP PARAMS ((nls_uint32 i)); + +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +struct loaded_domain +{ + const char *data; + int use_mmap; + size_t mmap_size; + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; +}; + +struct binding +{ + struct binding *next; + char *domainname; + char *dirname; +}; + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/gcc/intl/hash-string.h b/gcc/intl/hash-string.h new file mode 100644 index 00000000000..cacb38e479f --- /dev/null +++ b/gcc/intl/hash-string.h @@ -0,0 +1,59 @@ +/* Implements a string hashing function. + Copyright (C) 1995, 1997 Free Software Foundation, Inc. + + 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, 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 Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long) *str++; + g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/gcc/intl/l10nflist.c b/gcc/intl/l10nflist.c new file mode 100644 index 00000000000..9c7dc18360f --- /dev/null +++ b/gcc/intl/l10nflist.c @@ -0,0 +1,411 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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 + + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined _LIBC || defined HAVE_ARGZ_H +# include <argz.h> +#endif +#include <ctype.h> +#include <sys/types.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile *last = NULL; + struct loaded_l10nfile *retval; + char *cp; + size_t entries; + int cnt; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + retval = NULL; + last = NULL; + + /* Construct file name. */ + memcpy (abs_filename, dirlist, dirlist_len); + __argz_stringify (abs_filename, dirlist_len, ':'); + cp = abs_filename + (dirlist_len - 1); + *cp++ = '/'; + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + last = NULL; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + last = retval; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + retval = (struct loaded_l10nfile *) + malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) + * (1 << pop (mask)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + retval->decided = (__argz_count (dirlist, dirlist_len) != 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + if (last == NULL) + { + retval->next = *l10nfile_list; + *l10nfile_list = retval; + } + else + { + retval->next = last->next; + last->next = retval; + } + + entries = 0; + /* If the DIRLIST is a real list the RETVAL entry corresponds not to + a real file. So we have to use the DIRLIST separation mechanism + of the inner loop. */ + cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; + for (; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, + language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const unsigned char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum (codeset[cnt])) + { + ++len; + + if (isalpha (codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha (codeset[cnt])) + *wp++ = tolower (codeset[cnt]); + else if (isdigit (codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/gcc/intl/libgettext.h b/gcc/intl/libgettext.h new file mode 100644 index 00000000000..3a92960ae3e --- /dev/null +++ b/gcc/intl/libgettext.h @@ -0,0 +1,182 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + 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, 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. */ + +/* Because on some systems (e.g. Solaris) we sometimes have to include + the systems libintl.h as well as this file we have more complex + include protection above. But the systems header might perhaps also + define _LIBINTL_H and therefore we have to protect the definition here. */ + +#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H +#ifndef _LIBINTL_H +# define _LIBINTL_H 1 +#endif +#define _LIBGETTEXT_H 1 + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +#include <sys/types.h> + +#if HAVE_LOCALE_H +# include <locale.h> +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ || defined __cplusplus +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef NULL +# if !defined __cplusplus || defined __GNUC__ +# define NULL ((void *) 0) +# else +# define NULL (0) +# endif +#endif + +#if !HAVE_LC_MESSAGES +/* This value determines the behaviour of the gettext() and dgettext() + function. But some system does not have this defined. Define it + to a default value. */ +# define LC_MESSAGES (-1) +#endif + + +/* Declarations for gettext-using-catgets interface. Derived from + Jim Meyering's libintl.h. */ +struct _msg_ent +{ + const char *_msg; + int _msg_number; +}; + + +#if HAVE_CATGETS +/* These two variables are defined in the automatically by po-to-tbl.sed + generated file `cat-id-tbl.c'. */ +extern const struct _msg_ent _msg_tbl[]; +extern int _msg_tbl_length; +#endif + + +/* For automatical extraction of messages sometimes no real + translation is needed. Instead the string itself is the result. */ +#define gettext_noop(Str) (Str) + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +extern char *gettext PARAMS ((const char *__msgid)); +extern char *gettext__ PARAMS ((const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); +extern char *dgettext__ PARAMS ((const char *__domainname, + const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, + int __category)); +extern char *dcgettext__ PARAMS ((const char *__domainname, + const char *__msgid, int __category)); + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +extern char *textdomain PARAMS ((const char *__domainname)); +extern char *textdomain__ PARAMS ((const char *__domainname)); + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +extern char *bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *bindtextdomain__ PARAMS ((const char *__domainname, + const char *__dirname)); + +#if ENABLE_NLS + +/* Solaris 2.3 has the gettext function but dcgettext is missing. + So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 + has dcgettext. */ +# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) + +# define gettext(Msgid) \ + dgettext (NULL, Msgid) + +# define dgettext(Domainname, Msgid) \ + dcgettext (Domainname, Msgid, LC_MESSAGES) + +# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 +/* This global variable is defined in loadmsgcat.c. We need a sign, + whether a new catalog was loaded, which can be associated with all + translations. */ +extern int _nl_msg_cat_cntr; + +# define dcgettext(Domainname, Msgid, Category) \ + (__extension__ \ + ({ \ + char *__result; \ + if (__builtin_constant_p (Msgid)) \ + { \ + static char *__translation__; \ + static int __catalog_counter__; \ + if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ + { \ + __translation__ = \ + dcgettext__ (Domainname, Msgid, Category); \ + __catalog_counter__ = _nl_msg_cat_cntr; \ + } \ + __result = __translation__; \ + } \ + else \ + __result = dcgettext__ (Domainname, Msgid, Category); \ + __result; \ + })) +# endif +# endif + +#else + +# define gettext(Msgid) (Msgid) +# define dgettext(Domainname, Msgid) (Msgid) +# define dcgettext(Domainname, Msgid, Category) (Msgid) +# define textdomain(Domainname) ((char *) Domainname) +# define bindtextdomain(Domainname, Dirname) ((char *) Dirname) + +#endif + +/* @@ begin of epilog @@ */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gcc/intl/loadinfo.h b/gcc/intl/loadinfo.h new file mode 100644 index 00000000000..f4ebf6d8112 --- /dev/null +++ b/gcc/intl/loadinfo.h @@ -0,0 +1,76 @@ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + 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, 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. */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset, + size_t name_len)); + +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + + +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); diff --git a/gcc/intl/loadmsgcat.c b/gcc/intl/loadmsgcat.c new file mode 100644 index 00000000000..515892dfb86 --- /dev/null +++ b/gcc/intl/loadmsgcat.c @@ -0,0 +1,222 @@ +/* Load needed message catalogs. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + + 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, 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 <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include <unistd.h> +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC +# include <sys/mman.h> +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr = 0; + + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file) + struct loaded_l10nfile *domain_file; +{ + int fd; + size_t size; + struct stat st; + struct mo_file_header *data = (struct mo_file_header *) -1; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + int use_mmap = 0; +#endif + struct loaded_domain *domain; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if (fstat (fd, &st) != 0 + || (size = (size_t) st.st_size) != st.st_size + || size < sizeof (struct mo_file_header)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (data != (struct mo_file_header *) -1) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb == -1) + { + close (fd); + return; + } + + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) + { + /* The magic number is wrong: not a message catalog file. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain_file->data + = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain_file->data == NULL) + return; + + domain = (struct loaded_domain *) domain_file->data; + domain->data = (char *) data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + domain->use_mmap = use_mmap; +#endif + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an illegal revision. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Show that one domain is changed. This might make some cached + translations invalid. */ + ++_nl_msg_cat_cntr; +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/gcc/intl/localealias.c b/gcc/intl/localealias.c new file mode 100644 index 00000000000..bca555a610f --- /dev/null +++ b/gcc/intl/localealias.c @@ -0,0 +1,424 @@ +/* Handle aliases for locale names. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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 <ctype.h> +#include <stdio.h> +#include <sys/types.h> + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#else +char *getenv (); +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# else +void free (); +# endif +#endif + +#if defined HAVE_STRING_H || defined _LIBC +# ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +# endif +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#include "gettext.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# define mempcpy __mempcpy +# define HAVE_MEMPCPY 1 + +/* We need locking here since we can be called from different places. */ +# include <bits/libc-lock.h> + +__libc_lock_define_initialized (static, lock); +#endif + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space = NULL; +static size_t string_space_act = 0; +static size_t string_space_max = 0; +static struct alias_map *map; +static size_t nmap = 0; +static size_t maxmap = 0; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static void extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path = LOCALE_ALIAS_PATH; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == ':') + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); + ADD_BLOCK (block_list, full_fname); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + if (fp == NULL) + { + FREE_BLOCKS (block_list); + return 0; + } + + added = 0; + while (!feof (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + unsigned char buf[BUFSIZ]; + unsigned char *alias; + unsigned char *value; + unsigned char *cp; + + if (fgets (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (fgets (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace (cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace (cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + extend_alias_table (); + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + { + FREE_BLOCKS (block_list); + return added; + } + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + FREE_BLOCKS (block_list); + return added; +} + + +static void +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return; + + map = new_map; + maxmap = new_size; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/gcc/intl/textdomain.c b/gcc/intl/textdomain.c new file mode 100644 index 00000000000..88557460f3b --- /dev/null +++ b/gcc/intl/textdomain.c @@ -0,0 +1,108 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + 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, 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 + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +# ifndef memcpy +# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) +# endif +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "libgettext.h" +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[]; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN textdomain__ +#endif + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *old; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + old = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + _nl_current_default_domain = _nl_default_default_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + _nl_current_default_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + char *cp = (char *) malloc (len); + if (cp != NULL) + memcpy (cp, domainname, len); + _nl_current_default_domain = cp; +#endif + } + + if (old != _nl_default_default_domain) + free (old); + + return (char *) _nl_current_default_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/gcc/mbchar.c b/gcc/mbchar.c new file mode 100644 index 00000000000..d54a49749ce --- /dev/null +++ b/gcc/mbchar.c @@ -0,0 +1,288 @@ +/* Multibyte Character Functions. + Copyright (C) 1998 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* These functions are used to manipulate multibyte characters. */ + +/* Note regarding cross compilation: + + In general translation of multibyte characters to wide characters can + only work in a native compiler since the translation function (mbtowc) + needs to know about both the source and target character encoding. However, + this particular implementation for JIS, SJIS and EUCJP source characters + will work for any compiler with a newlib target. Other targets may also + work provided that their wchar_t implementation is 2 bytes and the encoding + leaves the source character values unchanged (except for removing the + state shifting markers). */ + +#ifdef MULTIBYTE_CHARS +#include "config.h" +#include "system.h" +#include "gansidecl.h" +#include "mbchar.h" +#include <locale.h> + +typedef enum +{ + ESCAPE, DOLLAR, BRACKET, AT, B, J, NUL, JIS_CHAR, OTHER, JIS_C_NUM +} JIS_CHAR_TYPE; + +typedef enum +{ + ASCII, A_ESC, A_ESC_DL, JIS, JIS_1, JIS_2, J_ESC, J_ESC_BR, + J2_ESC, J2_ESC_BR, INV, JIS_S_NUM +} JIS_STATE; + +typedef enum +{ + COPYA, COPYJ, COPYJ2, MAKE_A, MAKE_J, NOOP, EMPTY, ERROR +} JIS_ACTION; + +/***************************************************************************** + * state/action tables for processing JIS encoding + * Where possible, switches to JIS are grouped with proceding JIS characters + * and switches to ASCII are grouped with preceding JIS characters. + * Thus, maximum returned length is: + * 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6. + *****************************************************************************/ +static JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = { +/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER*/ +/*ASCII*/ { A_ESC, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII,ASCII,ASCII}, +/*A_ESC*/ { ASCII, A_ESC_DL,ASCII, ASCII, ASCII, ASCII, ASCII,ASCII,ASCII}, +/*A_ESC_DL*/{ ASCII, ASCII, ASCII, JIS, JIS, ASCII, ASCII,ASCII,ASCII}, +/*JIS*/ { J_ESC, JIS_1, JIS_1, JIS_1, JIS_1, JIS_1, INV, JIS_1,INV }, +/*JIS_1*/ { INV, JIS_2, JIS_2, JIS_2, JIS_2, JIS_2, INV, JIS_2,INV }, +/*JIS_2*/ { J2_ESC,JIS, JIS, JIS, JIS, JIS, INV, JIS, JIS }, +/*J_ESC*/ { INV, INV, J_ESC_BR, INV, INV, INV, INV, INV, INV }, +/*J_ESC_BR*/{ INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV }, +/*J2_ESC*/ { INV, INV, J2_ESC_BR,INV, INV, INV, INV, INV, INV }, +/*J2_ESC_BR*/{INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV }, +}; + +static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = { +/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER */ +/*ASCII */ {NOOP, COPYA, COPYA, COPYA, COPYA, COPYA, EMPTY, COPYA, COPYA}, +/*A_ESC */ {COPYA, NOOP, COPYA, COPYA, COPYA, COPYA, COPYA, COPYA, COPYA}, +/*A_ESC_DL */{COPYA, COPYA, COPYA, MAKE_J, MAKE_J, COPYA, COPYA, COPYA, COPYA}, +/*JIS */ {NOOP, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR }, +/*JIS_1 */ {ERROR, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR }, +/*JIS_2 */ {NOOP, COPYJ2,COPYJ2,COPYJ2, COPYJ2, COPYJ2,ERROR, COPYJ2,COPYJ2}, +/*J_ESC */ {ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR }, +/*J_ESC_BR */{ERROR, ERROR, ERROR, ERROR, NOOP, NOOP, ERROR, ERROR, ERROR }, +/*J2_ESC */ {ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR }, +/*J2_ESC_BR*/{ERROR, ERROR, ERROR, ERROR, COPYJ, COPYJ, ERROR, ERROR, ERROR }, +}; + + +char *literal_codeset = NULL; + +int +local_mbtowc (pwc, s, n) + wchar_t *pwc; + const char *s; + size_t n; +{ + static JIS_STATE save_state = ASCII; + JIS_STATE curr_state = save_state; + unsigned char *t = (unsigned char *)s; + + if (s != NULL && n == 0) + return -1; + + if (literal_codeset == NULL || strlen (literal_codeset) <= 1) + { + /* This must be the "C" locale or unknown locale -- fall thru */ + } + else if (! strcmp (literal_codeset, "C-SJIS")) + { + int char1; + if (s == NULL) + return 0; /* not state-dependent */ + char1 = *t; + if (ISSJIS1 (char1)) + { + int char2 = t[1]; + if (n <= 1) + return -1; + if (ISSJIS2 (char2)) + { + if (pwc != NULL) + *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1)); + return 2; + } + return -1; + } + if (pwc != NULL) + *pwc = (wchar_t)*t; + if (*t == '\0') + return 0; + return 1; + } + else if (! strcmp (literal_codeset, "C-EUCJP")) + { + int char1; + if (s == NULL) + return 0; /* not state-dependent */ + char1 = *t; + if (ISEUCJP (char1)) + { + int char2 = t[1]; + if (n <= 1) + return -1; + if (ISEUCJP (char2)) + { + if (pwc != NULL) + *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1)); + return 2; + } + return -1; + } + if (pwc != NULL) + *pwc = (wchar_t)*t; + if (*t == '\0') + return 0; + return 1; + } + else if (! strcmp (literal_codeset, "C-JIS")) + { + JIS_ACTION action; + JIS_CHAR_TYPE ch; + unsigned char *ptr; + int i, curr_ch; + + if (s == NULL) + { + save_state = ASCII; + return 1; /* state-dependent */ + } + + ptr = t; + + for (i = 0; i < n; ++i) + { + curr_ch = t[i]; + switch (curr_ch) + { + case JIS_ESC_CHAR: + ch = ESCAPE; + break; + case '$': + ch = DOLLAR; + break; + case '@': + ch = AT; + break; + case '(': + ch = BRACKET; + break; + case 'B': + ch = B; + break; + case 'J': + ch = J; + break; + case '\0': + ch = NUL; + break; + default: + if (ISJIS (curr_ch)) + ch = JIS_CHAR; + else + ch = OTHER; + } + + action = JIS_action_table[curr_state][ch]; + curr_state = JIS_state_table[curr_state][ch]; + + switch (action) + { + case NOOP: + break; + case EMPTY: + if (pwc != NULL) + *pwc = (wchar_t)0; + save_state = curr_state; + return i; + case COPYA: + if (pwc != NULL) + *pwc = (wchar_t)*ptr; + save_state = curr_state; + return (i + 1); + case COPYJ: + if (pwc != NULL) + *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1)); + save_state = curr_state; + return (i + 1); + case COPYJ2: + if (pwc != NULL) + *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1)); + save_state = curr_state; + return (ptr - t) + 2; + case MAKE_A: + case MAKE_J: + ptr = (char *)(t + i + 1); + break; + case ERROR: + default: + return -1; + } + } + + return -1; /* n < bytes needed */ + } + +#ifdef CROSS_COMPILE + if (s == NULL) + return 0; /* not state-dependent */ + if (pwc != NULL) + *pwc = *s; + return 1; +#else + /* This must be the "C" locale or unknown locale. */ + return mbtowc (pwc, s, n); +#endif +} + +int +local_mblen (s, n) + const char *s; + size_t n; +{ + return local_mbtowc (NULL, s, n); +} + +int +local_mb_cur_max () +{ + if (literal_codeset == NULL || strlen (literal_codeset) <= 1) + ; + else if (! strcmp (literal_codeset, "C-SJIS")) + return 2; + else if (! strcmp (literal_codeset, "C-EUCJP")) + return 2; + else if (! strcmp (literal_codeset, "C-JIS")) + return 8; /* 3 + 2 + 3 */ + +#ifdef CROSS_COMPILE + return 1; +#else + return MB_CUR_MAX; +#endif +} +#endif /* MULTIBYTE_CHARS */ diff --git a/gcc/mbchar.h b/gcc/mbchar.h new file mode 100644 index 00000000000..a4b82c0558d --- /dev/null +++ b/gcc/mbchar.h @@ -0,0 +1,25 @@ +/* mbchar.h - Various declarations for functions found in mbchar.c + Copyright (C) 1998 Free Software Foundation, Inc. + */ + +#ifndef __GCC_MBCHAR_H__ +#define __GCC_MBCHAR_H__ + +#ifdef MULTIBYTE_CHARS +/* escape character used for JIS encoding */ +#define JIS_ESC_CHAR 0x1b + +#define ISSJIS1(c) ((c) >= 0x81 && (c) <= 0x9f || (c) >= 0xe0 && (c) <= 0xef) +#define ISSJIS2(c) ((c) >= 0x40 && (c) <= 0x7e || (c) >= 0x80 && (c) <= 0xfc) +#define ISEUCJP(c) ((c) >= 0xa1 && (c) <= 0xfe) +#define ISJIS(c) ((c) >= 0x21 && (c) <= 0x7e) + +int local_mbtowc PROTO ((wchar_t *, const char *, size_t)); +int local_mblen PROTO ((const char *, size_t)); +int local_mb_cur_max PROTO ((void)); + +/* The locale being used for multibyte characters in string/char literals. */ +extern char *literal_codeset; +#endif /* MULTIBYTE_CHARS */ + +#endif /* __GCC_MBCHAR_H__ */ diff --git a/gcc/mkinstalldirs b/gcc/mkinstalldirs new file mode 100644 index 00000000000..f427ab4a24b --- /dev/null +++ b/gcc/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 1998/05/19 07:09:56 drepper Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/gcc/objc/objc-parse.c b/gcc/objc/objc-parse.c deleted file mode 100644 index 6a04682d341..00000000000 --- a/gcc/objc/objc-parse.c +++ /dev/null @@ -1,5103 +0,0 @@ - -/* A Bison parser, made from objc-parse.y with Bison version GNU Bison version 1.24 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define IDENTIFIER 258 -#define TYPENAME 259 -#define SCSPEC 260 -#define TYPESPEC 261 -#define TYPE_QUAL 262 -#define CONSTANT 263 -#define STRING 264 -#define ELLIPSIS 265 -#define SIZEOF 266 -#define ENUM 267 -#define STRUCT 268 -#define UNION 269 -#define IF 270 -#define ELSE 271 -#define WHILE 272 -#define DO 273 -#define FOR 274 -#define SWITCH 275 -#define CASE 276 -#define DEFAULT 277 -#define BREAK 278 -#define CONTINUE 279 -#define RETURN 280 -#define GOTO 281 -#define ASM_KEYWORD 282 -#define TYPEOF 283 -#define ALIGNOF 284 -#define ATTRIBUTE 285 -#define EXTENSION 286 -#define LABEL 287 -#define REALPART 288 -#define IMAGPART 289 -#define ASSIGN 290 -#define OROR 291 -#define ANDAND 292 -#define EQCOMPARE 293 -#define ARITHCOMPARE 294 -#define LSHIFT 295 -#define RSHIFT 296 -#define UNARY 297 -#define PLUSPLUS 298 -#define MINUSMINUS 299 -#define HYPERUNARY 300 -#define POINTSAT 301 -#define INTERFACE 302 -#define IMPLEMENTATION 303 -#define END 304 -#define SELECTOR 305 -#define DEFS 306 -#define ENCODE 307 -#define CLASSNAME 308 -#define PUBLIC 309 -#define PRIVATE 310 -#define PROTECTED 311 -#define PROTOCOL 312 -#define OBJECTNAME 313 -#define CLASS 314 -#define ALIAS 315 -#define OBJC_STRING 316 - -#line 33 "objc-parse.y" - -#include <stdio.h> -#include <errno.h> -#include <setjmp.h> - -#include "config.h" -#include "tree.h" -#include "input.h" -#include "c-lex.h" -#include "c-tree.h" -#include "flags.h" - -#ifdef MULTIBYTE_CHARS -#include <stdlib.h> -#include <locale.h> -#endif - -#include "objc-act.h" - -/* Since parsers are distinct for each language, put the language string - definition here. */ -char *language_string = "GNU Obj-C"; - -#ifndef errno -extern int errno; -#endif - -void yyerror (); - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 - -#line 71 "objc-parse.y" -typedef union {long itype; tree ttype; enum tree_code code; - char *filename; int lineno; int ends_in_label; } YYSTYPE; -#line 198 "objc-parse.y" - -/* Number of statements (loosely speaking) seen so far. */ -static int stmt_count; - -/* Input file and line number of the end of the body of last simple_if; - used by the stmt-rule immediately after simple_if returns. */ -static char *if_stmt_file; -static int if_stmt_line; - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs = NULL_TREE; -static tree prefix_attributes = NULL_TREE; - -/* Stack of saved values of current_declspecs and prefix_attributes. */ -static tree declspec_stack; - -/* 1 if we explained undeclared var errors. */ -static int undeclared_variable_notice; - -/* Objective-C specific information */ - -tree objc_interface_context; -tree objc_implementation_context; -tree objc_method_context; -tree objc_ivar_chain; -tree objc_ivar_context; -enum tree_code objc_inherit_code; -int objc_receiver_context; -int objc_public_flag; - - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint (); - -#ifndef YYLTYPE -typedef - struct yyltype - { - int timestamp; - int first_line; - int first_column; - int last_line; - int last_column; - char *text; - } - yyltype; - -#define YYLTYPE yyltype -#endif - -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 940 -#define YYFLAG -32768 -#define YYNTBASE 84 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 316 ? yytranslate[x] : 305) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 80, 2, 2, 2, 52, 43, 2, 59, - 76, 50, 48, 81, 49, 58, 51, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 38, 77, 2, - 36, 2, 37, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 60, 2, 83, 42, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 82, 41, 78, 79, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 39, 40, 44, 45, 46, 47, 53, 54, 55, 56, - 57, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 1, 3, 4, 7, 8, 12, 14, 16, 18, - 24, 27, 31, 36, 41, 44, 47, 50, 53, 55, - 56, 57, 65, 70, 71, 72, 80, 85, 86, 87, - 94, 98, 100, 102, 104, 106, 108, 110, 112, 114, - 116, 118, 120, 122, 123, 125, 127, 131, 133, 136, - 139, 142, 145, 148, 153, 156, 161, 164, 167, 169, - 171, 173, 178, 179, 187, 189, 193, 197, 201, 205, - 209, 213, 217, 221, 225, 229, 233, 237, 238, 243, - 244, 249, 250, 251, 259, 260, 266, 270, 274, 276, - 278, 280, 284, 288, 289, 294, 299, 304, 308, 312, - 315, 318, 320, 322, 324, 326, 328, 330, 333, 335, - 338, 339, 341, 344, 348, 350, 352, 355, 358, 363, - 368, 371, 374, 378, 380, 382, 385, 388, 389, 390, - 395, 400, 404, 408, 411, 414, 417, 420, 424, 425, - 428, 431, 434, 437, 441, 442, 445, 448, 450, 452, - 455, 458, 460, 462, 465, 468, 471, 475, 476, 479, - 481, 483, 485, 488, 491, 493, 498, 503, 505, 507, - 509, 511, 515, 517, 521, 522, 527, 528, 535, 539, - 540, 547, 551, 552, 554, 556, 559, 566, 568, 572, - 573, 575, 580, 587, 592, 594, 596, 598, 600, 602, - 603, 608, 610, 611, 614, 616, 620, 622, 623, 628, - 630, 631, 636, 637, 643, 644, 645, 651, 652, 653, - 659, 661, 663, 667, 671, 676, 680, 684, 688, 690, - 692, 696, 701, 705, 709, 713, 715, 719, 723, 727, - 732, 736, 740, 742, 743, 751, 757, 760, 761, 769, - 775, 778, 779, 788, 789, 797, 800, 801, 803, 804, - 806, 808, 811, 812, 816, 819, 824, 828, 830, 834, - 836, 838, 841, 843, 847, 852, 859, 865, 867, 871, - 873, 875, 879, 882, 885, 886, 888, 890, 893, 894, - 897, 901, 905, 908, 912, 917, 921, 924, 928, 931, - 933, 935, 938, 941, 942, 944, 947, 948, 949, 951, - 953, 956, 960, 962, 965, 968, 975, 981, 987, 990, - 993, 998, 999, 1004, 1005, 1006, 1010, 1015, 1019, 1021, - 1023, 1025, 1027, 1030, 1031, 1036, 1038, 1042, 1043, 1044, - 1052, 1058, 1061, 1062, 1063, 1064, 1077, 1078, 1085, 1088, - 1091, 1094, 1098, 1105, 1114, 1125, 1138, 1142, 1147, 1149, - 1151, 1152, 1159, 1163, 1169, 1172, 1175, 1176, 1178, 1179, - 1181, 1182, 1184, 1186, 1190, 1195, 1197, 1201, 1202, 1205, - 1208, 1209, 1214, 1217, 1218, 1220, 1222, 1226, 1228, 1232, - 1237, 1242, 1247, 1252, 1257, 1258, 1261, 1263, 1266, 1268, - 1272, 1274, 1278, 1280, 1282, 1284, 1286, 1288, 1290, 1292, - 1294, 1298, 1302, 1307, 1308, 1309, 1320, 1321, 1328, 1329, - 1330, 1343, 1344, 1353, 1354, 1361, 1364, 1365, 1374, 1379, - 1380, 1390, 1396, 1397, 1404, 1405, 1407, 1411, 1415, 1417, - 1419, 1421, 1423, 1424, 1428, 1431, 1435, 1439, 1441, 1442, - 1444, 1448, 1450, 1454, 1457, 1458, 1459, 1460, 1468, 1469, - 1470, 1471, 1479, 1480, 1481, 1484, 1486, 1488, 1491, 1492, - 1496, 1498, 1500, 1501, 1502, 1508, 1509, 1510, 1516, 1521, - 1523, 1529, 1532, 1533, 1536, 1537, 1539, 1541, 1543, 1546, - 1549, 1554, 1557, 1560, 1562, 1566, 1569, 1572, 1575, 1576, - 1579, 1580, 1584, 1586, 1588, 1591, 1593, 1595, 1597, 1599, - 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1615, 1617, 1619, - 1621, 1623, 1625, 1627, 1629, 1631, 1633, 1635, 1637, 1639, - 1641, 1648, 1652, 1658, 1661, 1663, 1665, 1667, 1670, 1672, - 1676, 1679, 1681, 1683, 1684, 1685, 1692, 1694, 1696, 1698, - 1701, 1704, 1706, 1711, 1716 -}; - -static const short yyrhs[] = { -1, - 85, 0, 0, 86, 88, 0, 0, 85, 87, 88, - 0, 90, 0, 89, 0, 236, 0, 27, 59, 99, - 76, 77, 0, 235, 88, 0, 123, 137, 77, 0, - 130, 123, 137, 77, 0, 126, 123, 136, 77, 0, - 130, 77, 0, 126, 77, 0, 1, 77, 0, 1, - 78, 0, 77, 0, 0, 0, 126, 123, 163, 91, - 117, 92, 194, 0, 126, 123, 163, 1, 0, 0, - 0, 130, 123, 166, 93, 117, 94, 194, 0, 130, - 123, 166, 1, 0, 0, 0, 123, 166, 95, 117, - 96, 194, 0, 123, 166, 1, 0, 3, 0, 4, - 0, 72, 0, 67, 0, 43, 0, 49, 0, 48, - 0, 54, 0, 55, 0, 79, 0, 80, 0, 101, - 0, 0, 101, 0, 107, 0, 101, 81, 107, 0, - 113, 0, 50, 105, 0, 235, 105, 0, 98, 105, - 0, 40, 97, 0, 103, 102, 0, 103, 59, 181, - 76, 0, 104, 102, 0, 104, 59, 181, 76, 0, - 33, 105, 0, 34, 105, 0, 11, 0, 29, 0, - 102, 0, 59, 181, 76, 105, 0, 0, 59, 181, - 76, 82, 106, 151, 78, 0, 105, 0, 107, 48, - 107, 0, 107, 49, 107, 0, 107, 50, 107, 0, - 107, 51, 107, 0, 107, 52, 107, 0, 107, 46, - 107, 0, 107, 47, 107, 0, 107, 45, 107, 0, - 107, 44, 107, 0, 107, 43, 107, 0, 107, 41, - 107, 0, 107, 42, 107, 0, 0, 107, 40, 108, - 107, 0, 0, 107, 39, 109, 107, 0, 0, 0, - 107, 37, 110, 99, 38, 111, 107, 0, 0, 107, - 37, 112, 38, 107, 0, 107, 36, 107, 0, 107, - 35, 107, 0, 3, 0, 8, 0, 115, 0, 59, - 99, 76, 0, 59, 1, 76, 0, 0, 59, 114, - 195, 76, 0, 113, 59, 100, 76, 0, 113, 60, - 99, 83, 0, 113, 58, 97, 0, 113, 57, 97, - 0, 113, 54, 0, 113, 55, 0, 296, 0, 302, - 0, 303, 0, 304, 0, 116, 0, 9, 0, 115, - 9, 0, 75, 0, 116, 75, 0, 0, 119, 0, - 119, 10, 0, 200, 201, 120, 0, 118, 0, 189, - 0, 119, 118, 0, 118, 189, 0, 128, 123, 136, - 77, 0, 131, 123, 137, 77, 0, 128, 77, 0, - 131, 77, 0, 200, 201, 125, 0, 121, 0, 189, - 0, 122, 121, 0, 121, 189, 0, 0, 0, 126, - 123, 136, 77, 0, 130, 123, 137, 77, 0, 126, - 123, 157, 0, 130, 123, 160, 0, 126, 77, 0, - 130, 77, 0, 235, 125, 0, 134, 127, 0, 130, - 134, 127, 0, 0, 127, 135, 0, 127, 5, 0, - 127, 144, 0, 134, 129, 0, 131, 134, 129, 0, - 0, 129, 135, 0, 129, 5, 0, 131, 0, 144, - 0, 130, 131, 0, 130, 144, 0, 7, 0, 5, - 0, 131, 7, 0, 131, 5, 0, 134, 133, 0, - 183, 134, 133, 0, 0, 133, 135, 0, 6, 0, - 167, 0, 4, 0, 67, 252, 0, 72, 252, 0, - 253, 0, 28, 59, 99, 76, 0, 28, 59, 181, - 76, 0, 6, 0, 7, 0, 167, 0, 139, 0, - 136, 81, 139, 0, 141, 0, 137, 81, 139, 0, - 0, 27, 59, 115, 76, 0, 0, 163, 138, 143, - 36, 140, 149, 0, 163, 138, 143, 0, 0, 166, - 138, 143, 36, 142, 149, 0, 166, 138, 143, 0, - 0, 144, 0, 145, 0, 144, 145, 0, 30, 59, - 59, 146, 76, 76, 0, 147, 0, 146, 81, 147, - 0, 0, 148, 0, 148, 59, 3, 76, 0, 148, - 59, 3, 81, 101, 76, 0, 148, 59, 100, 76, - 0, 97, 0, 5, 0, 6, 0, 7, 0, 107, - 0, 0, 82, 150, 151, 78, 0, 1, 0, 0, - 152, 172, 0, 153, 0, 152, 81, 153, 0, 107, - 0, 0, 82, 154, 151, 78, 0, 1, 0, 0, - 97, 38, 155, 153, 0, 0, 58, 97, 36, 156, - 153, 0, 0, 0, 163, 158, 117, 159, 195, 0, - 0, 0, 166, 161, 117, 162, 195, 0, 164, 0, - 166, 0, 59, 164, 76, 0, 164, 59, 230, 0, - 164, 60, 99, 83, 0, 164, 60, 83, 0, 50, - 184, 164, 0, 144, 124, 164, 0, 4, 0, 72, - 0, 165, 59, 230, 0, 165, 60, 99, 83, 0, - 165, 60, 83, 0, 50, 184, 165, 0, 144, 124, - 165, 0, 4, 0, 166, 59, 230, 0, 59, 166, - 76, 0, 50, 184, 166, 0, 166, 60, 99, 83, - 0, 166, 60, 83, 0, 144, 124, 166, 0, 3, - 0, 0, 13, 97, 82, 168, 174, 78, 143, 0, - 13, 82, 174, 78, 143, 0, 13, 97, 0, 0, - 14, 97, 82, 169, 174, 78, 143, 0, 14, 82, - 174, 78, 143, 0, 14, 97, 0, 0, 12, 97, - 82, 170, 179, 173, 78, 143, 0, 0, 12, 82, - 171, 179, 173, 78, 143, 0, 12, 97, 0, 0, - 81, 0, 0, 81, 0, 175, 0, 175, 176, 0, - 0, 175, 176, 77, 0, 175, 77, 0, 65, 59, - 67, 76, 0, 132, 123, 177, 0, 132, 0, 183, - 123, 177, 0, 183, 0, 1, 0, 235, 176, 0, - 178, 0, 177, 81, 178, 0, 200, 201, 163, 143, - 0, 200, 201, 163, 38, 107, 143, 0, 200, 201, - 38, 107, 143, 0, 180, 0, 179, 81, 180, 0, - 1, 0, 97, 0, 97, 36, 107, 0, 132, 182, - 0, 183, 182, 0, 0, 185, 0, 7, 0, 183, - 7, 0, 0, 184, 7, 0, 59, 185, 76, 0, - 50, 184, 185, 0, 50, 184, 0, 185, 59, 223, - 0, 185, 60, 99, 83, 0, 185, 60, 83, 0, - 59, 223, 0, 60, 99, 83, 0, 60, 83, 0, - 187, 0, 203, 0, 187, 203, 0, 187, 189, 0, - 0, 186, 0, 1, 77, 0, 0, 0, 192, 0, - 193, 0, 192, 193, 0, 32, 234, 77, 0, 195, - 0, 1, 195, 0, 82, 78, 0, 82, 190, 191, - 122, 188, 78, 0, 82, 190, 191, 1, 78, 0, - 82, 190, 191, 186, 78, 0, 197, 202, 0, 197, - 1, 0, 15, 59, 99, 76, 0, 0, 18, 199, - 202, 17, 0, 0, 0, 200, 201, 205, 0, 200, - 201, 216, 202, 0, 200, 201, 204, 0, 205, 0, - 216, 0, 195, 0, 213, 0, 99, 77, 0, 0, - 196, 16, 206, 202, 0, 196, 0, 196, 16, 1, - 0, 0, 0, 17, 207, 59, 99, 76, 208, 202, - 0, 198, 59, 99, 76, 77, 0, 198, 1, 0, - 0, 0, 0, 19, 59, 218, 77, 209, 218, 77, - 210, 218, 76, 211, 202, 0, 0, 20, 59, 99, - 76, 212, 202, 0, 23, 77, 0, 24, 77, 0, - 25, 77, 0, 25, 99, 77, 0, 27, 217, 59, - 99, 76, 77, 0, 27, 217, 59, 99, 38, 219, - 76, 77, 0, 27, 217, 59, 99, 38, 219, 38, - 219, 76, 77, 0, 27, 217, 59, 99, 38, 219, - 38, 219, 38, 222, 76, 77, 0, 26, 97, 77, - 0, 26, 50, 99, 77, 0, 77, 0, 214, 0, - 0, 19, 59, 113, 76, 215, 202, 0, 21, 107, - 38, 0, 21, 107, 10, 107, 38, 0, 22, 38, - 0, 97, 38, 0, 0, 7, 0, 0, 99, 0, - 0, 220, 0, 221, 0, 220, 81, 221, 0, 9, - 59, 99, 76, 0, 115, 0, 222, 81, 115, 0, - 0, 224, 225, 0, 227, 76, 0, 0, 228, 77, - 226, 225, 0, 1, 76, 0, 0, 10, 0, 228, - 0, 228, 81, 10, 0, 229, 0, 228, 81, 229, - 0, 126, 123, 165, 143, 0, 126, 123, 166, 143, - 0, 126, 123, 182, 143, 0, 130, 123, 166, 143, - 0, 130, 123, 182, 143, 0, 0, 231, 232, 0, - 225, 0, 233, 76, 0, 3, 0, 233, 81, 3, - 0, 97, 0, 234, 81, 97, 0, 31, 0, 240, - 0, 238, 0, 239, 0, 250, 0, 260, 0, 63, - 0, 97, 0, 237, 81, 97, 0, 73, 237, 77, - 0, 74, 97, 97, 77, 0, 0, 0, 61, 97, - 252, 82, 241, 254, 78, 242, 267, 63, 0, 0, - 61, 97, 252, 243, 267, 63, 0, 0, 0, 61, - 97, 38, 97, 252, 82, 244, 254, 78, 245, 267, - 63, 0, 0, 61, 97, 38, 97, 252, 246, 267, - 63, 0, 0, 62, 97, 82, 247, 254, 78, 0, - 62, 97, 0, 0, 62, 97, 38, 97, 82, 248, - 254, 78, 0, 62, 97, 38, 97, 0, 0, 61, - 97, 59, 97, 76, 252, 249, 267, 63, 0, 62, - 97, 59, 97, 76, 0, 0, 71, 97, 252, 251, - 267, 63, 0, 0, 253, 0, 45, 237, 45, 0, - 254, 255, 256, 0, 256, 0, 69, 0, 70, 0, - 68, 0, 0, 256, 257, 77, 0, 256, 77, 0, - 132, 123, 258, 0, 183, 123, 258, 0, 1, 0, - 0, 259, 0, 258, 81, 259, 0, 163, 0, 163, - 38, 107, 0, 38, 107, 0, 0, 0, 0, 48, - 261, 277, 262, 278, 263, 194, 0, 0, 0, 0, - 49, 264, 277, 265, 278, 266, 194, 0, 0, 0, - 268, 269, 0, 272, 0, 89, 0, 269, 272, 0, - 0, 269, 270, 89, 0, 77, 0, 1, 0, 0, - 0, 48, 273, 277, 274, 271, 0, 0, 0, 49, - 275, 277, 276, 271, 0, 59, 181, 76, 286, 0, - 286, 0, 59, 181, 76, 287, 284, 0, 287, 284, - 0, 0, 77, 279, 0, 0, 280, 0, 281, 0, - 189, 0, 280, 281, 0, 281, 189, 0, 126, 123, - 282, 77, 0, 126, 77, 0, 130, 77, 0, 283, - 0, 282, 81, 283, 0, 165, 143, 0, 166, 143, - 0, 182, 143, 0, 0, 81, 10, 0, 0, 81, - 285, 227, 0, 288, 0, 290, 0, 287, 290, 0, - 3, 0, 4, 0, 72, 0, 289, 0, 12, 0, - 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, - 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, - 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, - 11, 0, 28, 0, 29, 0, 6, 0, 7, 0, - 288, 38, 59, 181, 76, 97, 0, 288, 38, 97, - 0, 38, 59, 181, 76, 97, 0, 38, 97, 0, - 288, 0, 292, 0, 294, 0, 292, 294, 0, 101, - 0, 288, 38, 293, 0, 38, 293, 0, 99, 0, - 67, 0, 0, 0, 60, 297, 295, 298, 291, 83, - 0, 288, 0, 300, 0, 301, 0, 300, 301, 0, - 288, 38, 0, 38, 0, 64, 59, 299, 76, 0, - 71, 59, 97, 76, 0, 66, 59, 181, 76, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 236, 241, 255, 257, 257, 258, 260, 262, 263, 264, - 272, 276, 287, 292, 297, 299, 301, 302, 303, 308, - 315, 317, 322, 327, 333, 335, 340, 345, 351, 353, - 358, 365, 367, 368, 369, 372, 374, 376, 378, 380, - 382, 384, 388, 392, 395, 398, 401, 405, 407, 410, - 413, 417, 445, 451, 454, 457, 460, 462, 466, 470, - 474, 476, 479, 483, 510, 512, 514, 516, 518, 520, - 522, 524, 526, 528, 530, 532, 534, 536, 540, 542, - 546, 548, 551, 555, 557, 564, 567, 570, 576, 736, - 737, 739, 745, 747, 761, 784, 786, 788, 800, 814, - 816, 818, 820, 822, 824, 826, 831, 833, 839, 841, - 845, 847, 848, 858, 863, 865, 866, 867, 874, 880, - 885, 888, 896, 901, 903, 904, 905, 912, 923, 927, - 933, 938, 943, 948, 950, 952, 961, 964, 968, 970, - 972, 977, 981, 984, 988, 991, 993, 1005, 1008, 1010, - 1012, 1016, 1020, 1022, 1025, 1038, 1041, 1045, 1047, 1055, - 1056, 1057, 1061, 1063, 1068, 1070, 1072, 1078, 1079, 1080, - 1083, 1085, 1088, 1090, 1093, 1096, 1102, 1109, 1111, 1118, - 1125, 1128, 1135, 1138, 1142, 1145, 1149, 1154, 1157, 1161, - 1164, 1166, 1168, 1170, 1177, 1179, 1180, 1181, 1186, 1188, - 1193, 1201, 1206, 1210, 1213, 1215, 1220, 1223, 1225, 1227, - 1231, 1234, 1234, 1237, 1239, 1250, 1258, 1262, 1273, 1281, - 1288, 1290, 1295, 1298, 1303, 1305, 1307, 1314, 1316, 1317, - 1325, 1331, 1333, 1335, 1342, 1344, 1350, 1356, 1358, 1360, - 1362, 1369, 1371, 1374, 1379, 1381, 1385, 1387, 1389, 1391, - 1395, 1397, 1400, 1403, 1406, 1409, 1413, 1415, 1418, 1420, - 1424, 1427, 1432, 1434, 1436, 1440, 1464, 1471, 1476, 1482, - 1487, 1489, 1494, 1496, 1500, 1504, 1508, 1518, 1520, 1525, - 1530, 1533, 1537, 1540, 1544, 1547, 1550, 1553, 1557, 1560, - 1564, 1568, 1570, 1572, 1574, 1576, 1578, 1580, 1582, 1592, - 1600, 1602, 1604, 1608, 1610, 1613, 1616, 1629, 1631, 1636, - 1638, 1641, 1655, 1658, 1661, 1663, 1671, 1679, 1690, 1695, - 1698, 1711, 1719, 1723, 1727, 1731, 1737, 1741, 1746, 1749, - 1754, 1757, 1758, 1775, 1780, 1783, 1795, 1797, 1807, 1817, - 1818, 1826, 1829, 1841, 1845, 1862, 1872, 1881, 1886, 1891, - 1896, 1900, 1904, 1915, 1922, 1929, 1936, 1947, 1953, 1956, - 1961, 1984, 2018, 2043, 2074, 2089, 2100, 2104, 2108, 2111, - 2116, 2118, 2121, 2123, 2127, 2132, 2135, 2141, 2146, 2151, - 2153, 2162, 2163, 2169, 2171, 2181, 2183, 2187, 2190, 2196, - 2206, 2215, 2224, 2234, 2248, 2253, 2258, 2260, 2269, 2272, - 2277, 2280, 2284, 2292, 2294, 2295, 2296, 2297, 2298, 2312, - 2315, 2319, 2325, 2331, 2338, 2343, 2349, 2356, 2362, 2368, - 2373, 2379, 2386, 2392, 2398, 2404, 2412, 2418, 2424, 2432, - 2439, 2445, 2454, 2461, 2469, 2474, 2477, 2487, 2489, 2492, - 2494, 2495, 2498, 2503, 2504, 2521, 2528, 2534, 2538, 2541, - 2542, 2545, 2553, 2559, 2568, 2578, 2585, 2589, 2594, 2603, - 2610, 2614, 2624, 2626, 2627, 2629, 2631, 2632, 2633, 2634, - 2636, 2638, 2641, 2647, 2652, 2652, 2657, 2661, 2663, 2669, - 2674, 2679, 2688, 2690, 2696, 2698, 2701, 2703, 2704, 2705, - 2708, 2714, 2716, 2720, 2723, 2730, 2736, 2741, 2748, 2753, - 2758, 2763, 2770, 2774, 2777, 2783, 2785, 2786, 2787, 2790, - 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, - 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2810, - 2813, 2819, 2824, 2829, 2835, 2837, 2840, 2842, 2849, 2861, - 2866, 2872, 2874, 2880, 2884, 2885, 2891, 2893, 2896, 2898, - 2904, 2909, 2915, 2922, 2931 -}; - -static const char * const yytname[] = { "$","error","$undefined.","IDENTIFIER", -"TYPENAME","SCSPEC","TYPESPEC","TYPE_QUAL","CONSTANT","STRING","ELLIPSIS","SIZEOF", -"ENUM","STRUCT","UNION","IF","ELSE","WHILE","DO","FOR","SWITCH","CASE","DEFAULT", -"BREAK","CONTINUE","RETURN","GOTO","ASM_KEYWORD","TYPEOF","ALIGNOF","ATTRIBUTE", -"EXTENSION","LABEL","REALPART","IMAGPART","ASSIGN","'='","'?'","':'","OROR", -"ANDAND","'|'","'^'","'&'","EQCOMPARE","ARITHCOMPARE","LSHIFT","RSHIFT","'+'", -"'-'","'*'","'/'","'%'","UNARY","PLUSPLUS","MINUSMINUS","HYPERUNARY","POINTSAT", -"'.'","'('","'['","INTERFACE","IMPLEMENTATION","END","SELECTOR","DEFS","ENCODE", -"CLASSNAME","PUBLIC","PRIVATE","PROTECTED","PROTOCOL","OBJECTNAME","CLASS","ALIAS", -"OBJC_STRING","')'","';'","'}'","'~'","'!'","','","'{'","']'","program","extdefs", -"@1","@2","extdef","datadef","fndef","@3","@4","@5","@6","@7","@8","identifier", -"unop","expr","exprlist","nonnull_exprlist","unary_expr","sizeof","alignof", -"cast_expr","@9","expr_no_commas","@10","@11","@12","@13","@14","primary","@15", -"string","objc_string","old_style_parm_decls","lineno_datadecl","datadecls", -"datadecl","lineno_decl","decls","setspecs","setattrs","decl","typed_declspecs", -"reserved_declspecs","typed_declspecs_no_prefix_attr","reserved_declspecs_no_prefix_attr", -"declmods","declmods_no_prefix_attr","typed_typespecs","reserved_typespecquals", -"typespec","typespecqual_reserved","initdecls","notype_initdecls","maybeasm", -"initdcl","@16","notype_initdcl","@17","maybe_attribute","attributes","attribute", -"attribute_list","attrib","any_word","init","@18","initlist_maybe_comma","initlist1", -"initelt","@19","@20","@21","nested_function","@22","@23","notype_nested_function", -"@24","@25","declarator","after_type_declarator","parm_declarator","notype_declarator", -"structsp","@26","@27","@28","@29","maybecomma","maybecomma_warn","component_decl_list", -"component_decl_list2","component_decl","components","component_declarator", -"enumlist","enumerator","typename","absdcl","nonempty_type_quals","type_quals", -"absdcl1","stmts","lineno_stmt_or_labels","xstmts","errstmt","pushlevel","maybe_label_decls", -"label_decls","label_decl","compstmt_or_error","compstmt","simple_if","if_prefix", -"do_stmt_start","@30","save_filename","save_lineno","lineno_labeled_stmt","lineno_stmt_or_label", -"stmt_or_label","stmt","@31","@32","@33","@34","@35","@36","@37","all_iter_stmt", -"all_iter_stmt_simple","@38","label","maybe_type_qual","xexpr","asm_operands", -"nonnull_asm_operands","asm_operand","asm_clobbers","parmlist","@39","parmlist_1", -"@40","parmlist_2","parms","parm","parmlist_or_identifiers","@41","parmlist_or_identifiers_1", -"identifiers","identifiers_or_typenames","extension","objcdef","identifier_list", -"classdecl","aliasdecl","classdef","@42","@43","@44","@45","@46","@47","@48", -"@49","@50","protocoldef","@51","protocolrefs","non_empty_protocolrefs","ivar_decl_list", -"visibility_spec","ivar_decls","ivar_decl","ivars","ivar_declarator","methoddef", -"@52","@53","@54","@55","@56","@57","methodprotolist","@58","methodprotolist2", -"@59","semi_or_error","methodproto","@60","@61","@62","@63","methoddecl","optarglist", -"myxdecls","mydecls","mydecl","myparms","myparm","optparmlist","@64","unaryselector", -"keywordselector","selector","reservedwords","keyworddecl","messageargs","keywordarglist", -"keywordexpr","keywordarg","receiver","objcmessageexpr","@65","@66","selectorarg", -"keywordnamelist","keywordname","objcselectorexpr","objcprotocolexpr","objcencodeexpr", -"" -}; -#endif - -static const short yyr1[] = { 0, - 84, 84, 86, 85, 87, 85, 88, 88, 88, 88, - 88, 89, 89, 89, 89, 89, 89, 89, 89, 91, - 92, 90, 90, 93, 94, 90, 90, 95, 96, 90, - 90, 97, 97, 97, 97, 98, 98, 98, 98, 98, - 98, 98, 99, 100, 100, 101, 101, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 103, 104, - 105, 105, 106, 105, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 108, 107, 109, - 107, 110, 111, 107, 112, 107, 107, 107, 113, 113, - 113, 113, 113, 114, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 115, 115, 116, 116, - 117, 117, 117, 118, 119, 119, 119, 119, 120, 120, - 120, 120, 121, 122, 122, 122, 122, 123, 124, 125, - 125, 125, 125, 125, 125, 125, 126, 126, 127, 127, - 127, 127, 128, 128, 129, 129, 129, 130, 130, 130, - 130, 131, 131, 131, 131, 132, 132, 133, 133, 134, - 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, - 136, 136, 137, 137, 138, 138, 140, 139, 139, 142, - 141, 141, 143, 143, 144, 144, 145, 146, 146, 147, - 147, 147, 147, 147, 148, 148, 148, 148, 149, 150, - 149, 149, 151, 151, 152, 152, 153, 154, 153, 153, - 155, 153, 156, 153, 158, 159, 157, 161, 162, 160, - 163, 163, 164, 164, 164, 164, 164, 164, 164, 164, - 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, - 166, 166, 166, 168, 167, 167, 167, 169, 167, 167, - 167, 170, 167, 171, 167, 167, 172, 172, 173, 173, - 174, 174, 175, 175, 175, 175, 176, 176, 176, 176, - 176, 176, 177, 177, 178, 178, 178, 179, 179, 179, - 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, - 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, - 187, 187, 187, 188, 188, 189, 190, 191, 191, 192, - 192, 193, 194, 194, 195, 195, 195, 195, 196, 196, - 197, 199, 198, 200, 201, 202, 202, 203, 204, 204, - 205, 205, 205, 206, 205, 205, 205, 207, 208, 205, - 205, 205, 209, 210, 211, 205, 212, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 213, - 215, 214, 216, 216, 216, 216, 217, 217, 218, 218, - 219, 219, 220, 220, 221, 222, 222, 224, 223, 225, - 226, 225, 225, 227, 227, 227, 227, 228, 228, 229, - 229, 229, 229, 229, 231, 230, 232, 232, 233, 233, - 234, 234, 235, 236, 236, 236, 236, 236, 236, 237, - 237, 238, 239, 241, 242, 240, 243, 240, 244, 245, - 240, 246, 240, 247, 240, 240, 248, 240, 240, 249, - 240, 240, 251, 250, 252, 252, 253, 254, 254, 255, - 255, 255, 256, 256, 256, 257, 257, 257, 258, 258, - 258, 259, 259, 259, 261, 262, 263, 260, 264, 265, - 266, 260, 267, 268, 267, 269, 269, 269, 270, 269, - 271, 271, 273, 274, 272, 275, 276, 272, 277, 277, - 277, 277, 278, 278, 279, 279, 280, 280, 280, 280, - 281, 281, 281, 282, 282, 283, 283, 283, 284, 284, - 285, 284, 286, 287, 287, 288, 288, 288, 288, 289, - 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 290, 290, 290, 290, 291, 291, 292, 292, 293, 294, - 294, 295, 295, 297, 298, 296, 299, 299, 300, 300, - 301, 301, 302, 303, 304 -}; - -static const short yyr2[] = { 0, - 0, 1, 0, 2, 0, 3, 1, 1, 1, 5, - 2, 3, 4, 4, 2, 2, 2, 2, 1, 0, - 0, 7, 4, 0, 0, 7, 4, 0, 0, 6, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 3, 1, 2, 2, - 2, 2, 2, 4, 2, 4, 2, 2, 1, 1, - 1, 4, 0, 7, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 0, 4, 0, - 4, 0, 0, 7, 0, 5, 3, 3, 1, 1, - 1, 3, 3, 0, 4, 4, 4, 3, 3, 2, - 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, - 0, 1, 2, 3, 1, 1, 2, 2, 4, 4, - 2, 2, 3, 1, 1, 2, 2, 0, 0, 4, - 4, 3, 3, 2, 2, 2, 2, 3, 0, 2, - 2, 2, 2, 3, 0, 2, 2, 1, 1, 2, - 2, 1, 1, 2, 2, 2, 3, 0, 2, 1, - 1, 1, 2, 2, 1, 4, 4, 1, 1, 1, - 1, 3, 1, 3, 0, 4, 0, 6, 3, 0, - 6, 3, 0, 1, 1, 2, 6, 1, 3, 0, - 1, 4, 6, 4, 1, 1, 1, 1, 1, 0, - 4, 1, 0, 2, 1, 3, 1, 0, 4, 1, - 0, 4, 0, 5, 0, 0, 5, 0, 0, 5, - 1, 1, 3, 3, 4, 3, 3, 3, 1, 1, - 3, 4, 3, 3, 3, 1, 3, 3, 3, 4, - 3, 3, 1, 0, 7, 5, 2, 0, 7, 5, - 2, 0, 8, 0, 7, 2, 0, 1, 0, 1, - 1, 2, 0, 3, 2, 4, 3, 1, 3, 1, - 1, 2, 1, 3, 4, 6, 5, 1, 3, 1, - 1, 3, 2, 2, 0, 1, 1, 2, 0, 2, - 3, 3, 2, 3, 4, 3, 2, 3, 2, 1, - 1, 2, 2, 0, 1, 2, 0, 0, 1, 1, - 2, 3, 1, 2, 2, 6, 5, 5, 2, 2, - 4, 0, 4, 0, 0, 3, 4, 3, 1, 1, - 1, 1, 2, 0, 4, 1, 3, 0, 0, 7, - 5, 2, 0, 0, 0, 12, 0, 6, 2, 2, - 2, 3, 6, 8, 10, 12, 3, 4, 1, 1, - 0, 6, 3, 5, 2, 2, 0, 1, 0, 1, - 0, 1, 1, 3, 4, 1, 3, 0, 2, 2, - 0, 4, 2, 0, 1, 1, 3, 1, 3, 4, - 4, 4, 4, 4, 0, 2, 1, 2, 1, 3, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 4, 0, 0, 10, 0, 6, 0, 0, - 12, 0, 8, 0, 6, 2, 0, 8, 4, 0, - 9, 5, 0, 6, 0, 1, 3, 3, 1, 1, - 1, 1, 0, 3, 2, 3, 3, 1, 0, 1, - 3, 1, 3, 2, 0, 0, 0, 7, 0, 0, - 0, 7, 0, 0, 2, 1, 1, 2, 0, 3, - 1, 1, 0, 0, 5, 0, 0, 5, 4, 1, - 5, 2, 0, 2, 0, 1, 1, 1, 2, 2, - 4, 2, 2, 1, 3, 2, 2, 2, 0, 2, - 0, 3, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 6, 3, 5, 2, 1, 1, 1, 2, 1, 3, - 2, 1, 1, 0, 0, 6, 1, 1, 1, 2, - 2, 1, 4, 4, 4 -}; - -static const short yydefact[] = { 3, - 5, 0, 0, 0, 162, 153, 160, 152, 0, 0, - 0, 0, 0, 0, 403, 0, 455, 459, 0, 0, - 409, 435, 0, 435, 0, 0, 19, 4, 8, 7, - 0, 128, 128, 148, 139, 149, 185, 161, 0, 9, - 405, 406, 404, 407, 165, 408, 6, 17, 18, 32, - 33, 35, 34, 254, 256, 263, 247, 263, 251, 0, - 0, 0, 410, 0, 0, 0, 435, 426, 163, 436, - 435, 164, 0, 0, 243, 289, 0, 0, 173, 129, - 0, 16, 0, 15, 0, 150, 139, 151, 155, 154, - 137, 186, 11, 0, 252, 0, 0, 0, 244, 0, - 248, 89, 90, 107, 59, 60, 0, 0, 0, 36, - 38, 37, 0, 39, 40, 0, 544, 0, 0, 0, - 109, 41, 42, 0, 0, 43, 61, 0, 0, 65, - 46, 48, 91, 106, 0, 102, 103, 104, 105, 287, - 0, 285, 158, 0, 285, 190, 437, 0, 506, 507, - 529, 530, 526, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 527, - 528, 0, 0, 508, 456, 480, 499, 503, 509, 504, - 460, 0, 0, 417, 0, 0, 424, 433, 412, 0, - 0, 0, 12, 0, 0, 31, 0, 395, 0, 0, - 183, 229, 289, 0, 230, 0, 171, 129, 0, 221, - 222, 0, 0, 138, 141, 168, 169, 140, 142, 170, - 280, 281, 259, 278, 0, 0, 183, 271, 265, 128, - 262, 128, 0, 263, 183, 263, 57, 58, 52, 49, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 0, 0, 53, 0, 55, 0, 0, 82, 80, 78, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 100, 101, 0, 0, 44, 0, 108, 110, - 50, 166, 289, 378, 0, 283, 286, 156, 167, 288, - 158, 284, 196, 197, 198, 195, 0, 188, 191, 411, - 0, 534, 0, 483, 501, 482, 0, 505, 0, 483, - 435, 0, 414, 464, 429, 0, 443, 464, 413, 290, - 239, 238, 174, 175, 242, 0, 237, 0, 241, 0, - 0, 29, 0, 324, 116, 325, 182, 184, 0, 0, - 14, 0, 0, 23, 0, 183, 395, 0, 13, 27, - 0, 0, 260, 0, 259, 0, 246, 324, 264, 324, - 272, 0, 250, 0, 93, 92, 307, 0, 0, 543, - 542, 545, 552, 547, 0, 548, 549, 0, 0, 10, - 47, 0, 0, 88, 87, 0, 0, 0, 0, 76, - 77, 75, 74, 73, 71, 72, 66, 67, 68, 69, - 70, 99, 98, 0, 45, 0, 293, 0, 297, 0, - 299, 0, 378, 0, 159, 157, 0, 190, 44, 0, - 0, 0, 457, 500, 384, 0, 532, 461, 422, 435, - 443, 0, 0, 427, 432, 0, 0, 0, 0, 0, - 399, 385, 128, 128, 397, 0, 386, 388, 396, 0, - 240, 306, 0, 118, 113, 117, 0, 180, 227, 223, - 172, 228, 21, 179, 224, 226, 0, 25, 282, 279, - 183, 0, 266, 267, 273, 325, 269, 183, 183, 315, - 308, 95, 63, 62, 0, 551, 553, 0, 550, 555, - 554, 54, 56, 0, 0, 81, 79, 96, 97, 292, - 291, 379, 298, 294, 296, 0, 187, 189, 89, 0, - 0, 479, 499, 128, 0, 488, 484, 486, 0, 0, - 502, 386, 0, 0, 419, 464, 430, 0, 418, 473, - 476, 467, 0, 128, 128, 469, 466, 443, 442, 440, - 441, 425, 443, 448, 445, 128, 128, 0, 434, 176, - 383, 285, 285, 380, 381, 0, 398, 0, 0, 30, - 313, 114, 128, 128, 145, 0, 0, 177, 225, 0, - 255, 183, 324, 0, 245, 249, 0, 0, 309, 310, - 0, 0, 535, 0, 536, 537, 83, 86, 295, 192, - 0, 194, 533, 481, 492, 285, 493, 489, 490, 458, - 0, 462, 443, 0, 464, 415, 0, 0, 175, 0, - 0, 0, 468, 0, 0, 449, 449, 444, 236, 289, - 378, 129, 183, 183, 183, 289, 183, 183, 0, 387, - 389, 400, 314, 121, 0, 122, 0, 145, 143, 202, - 200, 199, 181, 22, 0, 26, 253, 274, 0, 183, - 401, 0, 0, 0, 324, 0, 0, 125, 325, 301, - 311, 210, 89, 0, 208, 0, 207, 0, 257, 205, - 539, 541, 0, 546, 0, 538, 0, 0, 183, 183, - 183, 0, 494, 531, 0, 423, 0, 464, 474, 477, - 470, 428, 0, 452, 446, 450, 447, 293, 0, 395, - 0, 390, 391, 392, 293, 393, 394, 382, 0, 0, - 144, 147, 146, 0, 178, 183, 0, 275, 312, 0, - 317, 127, 126, 305, 0, 318, 303, 325, 302, 0, - 0, 0, 211, 64, 0, 204, 540, 84, 193, 496, - 497, 498, 491, 285, 420, 431, 0, 0, 0, 454, - 0, 0, 234, 289, 235, 231, 233, 0, 119, 120, - 0, 277, 183, 402, 316, 0, 162, 0, 338, 322, - 0, 0, 0, 0, 0, 0, 0, 0, 367, 435, - 435, 359, 0, 0, 123, 128, 128, 331, 336, 0, - 0, 328, 329, 332, 360, 330, 0, 213, 0, 0, - 206, 495, 464, 416, 472, 471, 475, 478, 453, 451, - 0, 232, 201, 276, 0, 0, 324, 369, 0, 0, - 365, 349, 350, 351, 0, 0, 0, 368, 0, 366, - 333, 134, 0, 135, 0, 0, 320, 325, 319, 342, - 0, 136, 0, 209, 212, 0, 0, 0, 0, 370, - 48, 0, 0, 0, 363, 352, 0, 357, 0, 0, - 132, 215, 0, 133, 218, 337, 324, 0, 0, 214, - 421, 321, 0, 323, 361, 343, 347, 0, 358, 0, - 130, 0, 131, 0, 335, 326, 324, 0, 339, 324, - 369, 324, 364, 371, 0, 216, 219, 327, 341, 324, - 362, 0, 348, 0, 0, 372, 373, 353, 0, 0, - 340, 344, 0, 371, 0, 0, 217, 220, 369, 0, - 0, 354, 374, 0, 375, 0, 0, 345, 376, 0, - 355, 324, 0, 0, 346, 356, 377, 0, 0, 0 -}; - -static const short yydefgoto[] = { 938, - 1, 2, 3, 28, 29, 30, 345, 567, 351, 570, - 200, 453, 666, 124, 242, 404, 126, 127, 128, 129, - 130, 581, 131, 389, 388, 386, 677, 387, 132, 243, - 133, 134, 332, 333, 334, 562, 654, 655, 31, 195, - 785, 443, 91, 563, 639, 444, 34, 142, 288, 35, - 218, 206, 78, 201, 207, 645, 79, 566, 337, 338, - 37, 297, 298, 299, 643, 714, 668, 669, 670, 732, - 800, 843, 861, 882, 909, 864, 884, 910, 324, 210, - 679, 211, 38, 234, 236, 225, 94, 736, 354, 97, - 98, 231, 474, 475, 223, 224, 144, 681, 145, 191, - 287, 656, 657, 725, 335, 481, 578, 579, 580, 560, - 561, 789, 790, 791, 817, 838, 457, 839, 660, 792, - 793, 867, 816, 900, 891, 919, 932, 892, 794, 795, - 890, 796, 829, 852, 905, 906, 907, 930, 409, 410, - 445, 629, 446, 447, 448, 327, 328, 449, 450, 652, - 135, 40, 64, 41, 42, 43, 431, 688, 314, 603, - 803, 526, 317, 538, 605, 44, 318, 69, 45, 436, - 543, 437, 548, 695, 696, 46, 65, 304, 520, 66, - 310, 524, 432, 433, 536, 612, 807, 537, 607, 748, - 608, 749, 175, 423, 517, 518, 519, 682, 683, 306, - 425, 176, 177, 178, 179, 180, 584, 585, 672, 586, - 372, 136, 245, 485, 375, 376, 377, 137, 138, 139 -}; - -static const short yypact[] = { 128, - 132, 2936, 2936, 108,-32768,-32768,-32768,-32768, 139, 253, - 266, 86, 103, 111,-32768, 99,-32768,-32768, 99, 99, --32768, 158, 99, 158, 99, 99,-32768,-32768,-32768,-32768, - 169, 137, 2416, 115,-32768, 197,-32768,-32768, 2936,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 155, 214, 210, 214, 212, 2645, - 2483, 252,-32768, 50, 3210, 3210, 151, 51,-32768,-32768, - 158,-32768, 209, 99,-32768,-32768, 169, 286,-32768, 197, - 1661,-32768, 319,-32768, 169, 115,-32768, 197,-32768,-32768, - 729,-32768,-32768, 120,-32768, 255, 277, 1592,-32768, 283, --32768,-32768,-32768,-32768,-32768,-32768, 2645, 2645, 99,-32768, --32768,-32768, 2645,-32768,-32768, 932,-32768, 288, 312, 314, --32768,-32768,-32768, 2645, 305, 311,-32768, 2699, 2753,-32768, - 3581, 622, 396, 346, 2645,-32768,-32768,-32768,-32768,-32768, - 356, 267,-32768, 359, 3364, 269,-32768, 99,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 398, 3487,-32768,-32768,-32768, 2377, 415,-32768,-32768, --32768, 99, 99, 377, 99, 99,-32768,-32768,-32768, 397, - 105, 119,-32768, 319, 169,-32768, 420,-32768, 1846, 1806, - 197,-32768,-32768, 319,-32768, 327,-32768, 197, 1759, 434, - 484, 364, 1680, 729,-32768,-32768,-32768,-32768, 197,-32768, --32768, 473, 439,-32768, 120, 448, 197,-32768,-32768, 534, - 445, 352, 3175, 214, 197, 214,-32768,-32768,-32768,-32768, - 454, 456, 472, 481, 2537, 3272, 3487, 99,-32768, 485, - 2645, 932,-32768, 932,-32768, 2645, 2645, 557,-32768,-32768, - 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, - 2645, 2645,-32768,-32768, 99, 99, 2645, 2645,-32768,-32768, --32768,-32768,-32768, 267, 1905,-32768, 562, 766,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 225,-32768, 547,-32768, - 3487,-32768, 542, 550, 624,-32768, 415,-32768, 408, 550, - 158, 560,-32768, 581, 566, 578,-32768, 581,-32768,-32768, - 484,-32768,-32768, 641, 484, 660,-32768, 3089,-32768, 602, - 614,-32768, 682, 83,-32768,-32768, 634, 197, 110, 243, --32768, 319, 319,-32768, 1806, 197,-32768, 1964,-32768,-32768, - 1806, 2645, 99, 619, 439, 627,-32768,-32768,-32768,-32768, --32768, 620,-32768, 628,-32768,-32768, 629, 633, 2297,-32768, --32768,-32768,-32768, 662, 640, 3272,-32768, 642, 644,-32768, - 3581, 648, 650, 3581, 3581, 2645, 679, 2645, 2645, 2456, - 783, 879, 1653, 1750, 760, 760, 537, 537,-32768,-32768, --32768,-32768,-32768, 652, 311, 667, 336, 245,-32768, 3108, --32768, 673,-32768, 2023,-32768, 766, 669, 269, 2807, 695, - 3300, 850,-32768,-32768, 3375, 3487,-32768,-32768, 693, 158, --32768, 718, 3011,-32768,-32768, 184, 2884, 719, 78, 707, --32768,-32768,-32768, 3450,-32768, 711, 430,-32768,-32768, 298, --32768,-32768, 76,-32768,-32768,-32768, 3469,-32768, 434,-32768, --32768, 434,-32768, 752,-32768,-32768, 708,-32768, 3581,-32768, - 197, 715,-32768, 713,-32768,-32768, 713, 197, 197,-32768, - 763,-32768,-32768,-32768, 3336,-32768,-32768, 662,-32768,-32768, --32768,-32768,-32768, 761, 2645, 1473, 1820,-32768,-32768, 562, --32768,-32768,-32768,-32768,-32768, 722,-32768,-32768, 339, 730, - 99,-32768, 2377, 740, 3119,-32768,-32768, 3450, 1778, 76, --32768, 741, 765, 76,-32768, 581,-32768, 348,-32768,-32768, --32768,-32768, 169, 137, 2416, 335,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768, 3506, 767,-32768,-32768, --32768, 593, 238,-32768,-32768, 3439,-32768, 834, 472,-32768, --32768,-32768, 768, 725,-32768, 839, 76,-32768,-32768, 76, --32768, 197,-32768, 257,-32768,-32768, 99, 1101, 763,-32768, - 1421, 2645, 805, 769, 3336,-32768,-32768, 1394,-32768,-32768, - 2645,-32768,-32768,-32768,-32768, 593,-32768,-32768,-32768,-32768, - 99,-32768,-32768, 790, 581,-32768, 3210, 3210, 70, 319, - 169, 3039,-32768, 459, 2902, 280, 280,-32768,-32768,-32768, - 238, 197, 340, 347, 197,-32768, 347, 197, 3108,-32768, --32768,-32768,-32768,-32768, 319,-32768, 169,-32768, 659,-32768, --32768, 3581,-32768,-32768, 839,-32768,-32768,-32768, 2645, 81, --32768, 435, 564, 1021, 780, 782, 1181,-32768,-32768,-32768, --32768,-32768, 828, 99,-32768, 833, 3581, 796, 800,-32768, - 311,-32768, 2645,-32768, 805,-32768, 2645, 427, 340, 347, - 197, 464,-32768,-32768, 515,-32768, 820, 581,-32768,-32768, --32768,-32768, 2645, 846, 804,-32768, 804, 587, 510,-32768, - 2082,-32768,-32768,-32768, 600,-32768,-32768,-32768, 501, 521, - 659,-32768,-32768, 1421,-32768, 3214, 2645,-32768,-32768, 99, --32768,-32768,-32768,-32768, 808,-32768,-32768,-32768,-32768, 2163, - 854, 1421,-32768,-32768, 1501,-32768,-32768, 1394,-32768,-32768, --32768,-32768,-32768, 593,-32768,-32768, 829, 80, 80, 3581, - 2645, 280, 598,-32768, 598,-32768,-32768, 813,-32768,-32768, - 822,-32768, 3214,-32768,-32768, 2243, 853, 842,-32768,-32768, - 843, 845, 2645, 868, 830, 831, 2591, 372, 902, 187, - 226,-32768, 873, 838,-32768, 865, 3138,-32768, 900, 1261, - 91,-32768,-32768,-32768,-32768,-32768, 2405,-32768, 869, 1581, --32768,-32768, 581,-32768,-32768,-32768,-32768,-32768, 3581,-32768, - 278,-32768,-32768,-32768, 2645, 861,-32768, 2645, 2645, 3545, --32768,-32768,-32768,-32768, 871, 2645, 872,-32768, 891,-32768, --32768,-32768, 319,-32768, 169, 1341,-32768,-32768,-32768,-32768, - 2645,-32768, 1581,-32768,-32768, 888, 877, 2645, 937,-32768, - 441, 880, 882, 2645,-32768,-32768, 885,-32768, 2645, 523, --32768, 442, 524,-32768, 663,-32768,-32768, 2243, 892,-32768, --32768,-32768, 893,-32768,-32768,-32768,-32768, 3563,-32768, 58, --32768, 1806,-32768, 1806,-32768,-32768,-32768, 887,-32768,-32768, - 2645,-32768,-32768, 947, 890,-32768,-32768,-32768,-32768,-32768, --32768, 896,-32768, 911, 60, 895,-32768,-32768, 472, 472, --32768,-32768, 2645, 947, 897, 947,-32768,-32768, 2645, 903, - 68,-32768,-32768, 907,-32768, 660, 901,-32768, 396, 429, --32768,-32768, 908, 660,-32768,-32768, 396, 984, 988,-32768 -}; - -static const short yypgoto[] = {-32768, --32768,-32768,-32768, 102, -367,-32768,-32768,-32768,-32768,-32768, --32768,-32768, -9,-32768, -52, 570, -231, 533,-32768,-32768, - -45,-32768, 220,-32768,-32768,-32768,-32768,-32768, 172,-32768, - -295,-32768, -308, 661,-32768,-32768, 342,-32768, 17, -195, - 203, 16, 914,-32768, 367, 21, -11, -65, 703, 11, - -249, -574, -58, -206, -127,-32768,-32768,-32768, 196, 3, - -6,-32768, 584,-32768, 361,-32768, -607,-32768, -662,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -68, -135, - -498, 14, -66,-32768,-32768,-32768,-32768,-32768, 653, 12, --32768, 776, 655, 437, 788, 664, -12, -89, -50, -168, - -232, 363,-32768,-32768, -269,-32768,-32768,-32768, 440, -290, - -205,-32768,-32768,-32768,-32768, -122, -435, -741, 366,-32768, - 148,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 153,-32768, -739, 117,-32768, 121,-32768, 643,-32768, - -351,-32768, 632, 635, 497, -307,-32768,-32768,-32768,-32768, - 18,-32768, 1033,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, -20, 4, -348, --32768, 516,-32768, 450, 310,-32768,-32768,-32768,-32768,-32768, --32768,-32768, -306,-32768,-32768,-32768, 316, 532,-32768,-32768, --32768,-32768, -37, 762,-32768,-32768, 555,-32768, 333, 565, --32768, 658, 665, -145,-32768, -119,-32768,-32768, 409, 498, --32768,-32768,-32768,-32768,-32768,-32768, 714,-32768,-32768,-32768 -}; - - -#define YYLAST 3633 - - -static const short yytable[] = { 55, - 57, 59, 346, 72, 36, 36, 63, 125, 141, 67, - 68, 438, 343, 71, 209, 63, 74, 32, 32, 39, - 39, 86, 33, 33, 220, 70, 212, 70, 181, 92, - 439, 307, 230, 80, 339, 88, 463, 368, 415, 465, - 574, 36, 468, 87, 81, 405, 184, 232, 83, 85, - 188, 408, 286, 623, 32, 292, 39, 308, 502, 33, - 709, 237, 238, 454, 190, 532, 323, 240, 340, 100, - 70, 143, 801, 92, 70, 849, 559, 336, 249, 80, - 805, 92, 528, -112, 222, 208, 279, 80, 185, 281, - 192, 840, 455, 219, 147, 894, 197, 914, 213, 239, - 374, 50, 51, 244, 47, 926, 761, 75, 143, 186, - 14, 320, 75, 202, 407, 233, 320, 346, 717, 89, - 221, 90, 50, 51, 799, 885, 143, -1, 198, 199, - 148, -2, 187, 895, 14, 915, 296, 845, 300, 14, - 93, 50, 51, 927, 60, 898, 330, 220, 901, 841, - 903, 902, 516, 550, 76, 291, 806, 367, 911, 203, - 303, 61, 302, 77, -112, 52, 415, 230, 204, 62, - 53, 75, 311, 312, 500, 315, 316, 198, 199, 924, - 870, 205, 232, 143, 48, 49, 52, 405, 182, 614, - 935, 53, 371, 80, 322, 16, 208, 80, 14, 753, - 755, 92, 16, 459, 321, 52, 208, 462, 325, 183, - 53, 336, 92, 82, 461, 222, 219, 192, 76, 604, - 54, 220, 336, 730, -35, 406, 14, 77, 336, 600, - 488, 16, 412, 602, 378, 476, 95, 476, 379, 382, - 75, 383, 291, 143, 691, 362, 358, 364, 360, 599, - 233, 539, 540, 541, 685, 50, 51, 143, 860, 75, - 202, 542, 143, -34, 143, 402, 403, 14, 50, 51, - 16, 50, 51, 293, 294, 295, 644, 708, 96, 646, - 75, 619, 75, 202, 320, 189, 14, 626, 420, 148, - 429, 99, 766, 101, 649, 467, 621, 285, 687, 427, - 417, 347, 348, 413, 414, 418, 203, 14, 658, 14, - 146, 143, 753, 226, 70, 204, 283, 693, 460, 52, - 501, 75, 202, 484, 53, 284, 285, 754, 205, 203, - 36, 92, 52, 494, 56, 52, 77, 53, 204, 583, - 53, 208, 320, 222, 208, 208, 246, 58, 14, 220, - 671, 205, 321, 633, 227, 5, 325, 7, 290, 678, - 235, 506, 193, 9, 10, 11, 194, 307, 203, 14, - 247, 546, 248, 557, 50, 51, 14, 204, 558, 13, - 250, 747, 530, 531, 722, 283, 547, 727, 408, 713, - 205, 251, 756, 308, 284, 285, 16, -465, 700, 701, - 50, 51, 868, 341, 279, 198, 199, 342, 296, 527, - 50, 51, 36, 523, 590, 539, 540, 541, 22, 591, - 280, 826, 357, 24, 36, 606, 699, 36, -270, -270, - 363, 282, 86, 70, 289, 36, 143, 514, 52, 675, - 349, 671, 515, 53, 194, 564, 88, 143, 534, 533, - 476, 698, 309, 535, 87, 659, 301, 705, 313, 552, - 553, 713, 625, 628, 52, 500, 426, 565, 197, 53, - 381, -175, 500, 319, 52, 384, 385, -175, 326, 53, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 347, 348, 273, 274, 846, 275, 276, 277, - 278, 593, 739, 86, 933, 650, 555, 251, 352, 934, - 556, 719, 75, 619, 356, 720, 875, 88, -175, 353, - 36, 359, -175, 86, 788, 87, 539, 540, 541, 365, - 596, 366, 659, 514, 728, 80, 692, 88, 515, 14, - 743, 464, 198, 199, 744, 87, 609, 694, 694, 546, - 610, 611, 212, 367, 622, 80, 369, 291, 36, 754, - 788, 380, 616, 617, 547, 624, 627, 651, 77, 689, - 690, 469, 220, 896, 638, 897, 208, 759, 710, 635, - 637, 342, 539, 540, 541, 811, 270, 271, 272, 75, - 619, 684, 745, 320, -85, 75, 619, 760, 622, 881, - 883, 194, 75, 342, 194, 419, 320, 496, 497, 680, - -268, -268, 208, 80, 36, 92, 14, 421, 208, 208, - 413, 414, 14, 80, 609, 143, 422, 534, 533, 14, - 929, 36, 535, 424, 192, 430, 620, 208, 937, 80, - 452, 721, 620, -463, 220, 621, 285, 434, 758, 626, - 609, 621, 285, 435, 731, 346, 700, 701, 621, 285, - 253, 255, 788, 712, 216, 217, 571, 197, 104, 458, - 9, 10, 11, 575, 576, 273, 274, 784, 275, 276, - 277, 278, 331, 694, 451, -115, -115, -115, -115, 197, - 452, -115, -175, -115, -115, -115, 471, 478, -175, 486, - 622, 622, 473, 917, 918, 479, 480, 80, 482, -115, - 764, 321, 325, 784, 588, 487, 495, 490, 321, 491, - 783, 198, 199, 492, 825, 493, -115, 498, 5, 89, - 7, 90, 36, 215, 216, 217, 9, 10, 11, -175, - 9, 10, 11, -175, 507, 786, 622, 797, -115, 499, - 787, 281, 13, -115, 208, 503, 783, 680, 14, 336, - 72, 336, 847, -115, 862, 850, 853, 647, 827, 16, - 511, 216, 217, 857, 525, 86, 863, 9, 10, 11, - 529, 549, 551, 70, 70, 642, 554, 568, 869, 88, - 569, 22, 572, 573, 577, 873, 24, 87, 587, 36, - 667, 636, 833, 835, 589, 592, 880, 268, 269, 270, - 271, 272, 786, 622, 797, 784, 595, 787, 702, 703, - 704, 556, 706, 707, 321, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 208, 632, 80, 850, 640, - 601, 102, 673, 618, 634, 718, 103, 104, 865, 105, - 331, 674, 686, 5, 6, 7, 8, -304, 783, 726, - 920, 9, 10, 11, 642, -32, 850, 106, 716, 15, - 733, 107, 108, 734, 740, 741, 742, 13, 109, 14, - 735, 110, 746, 751, 752, 765, 111, 112, 113, 798, - -33, 804, 114, 115, 16, 812, 738, 116, 117, 813, - 815, 818, 118, 819, 119, 821, 822, 823, 828, 120, - 830, 762, 750, 121, 831, 836, 22, 122, 123, 848, - 641, 24, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -485, 241, 667, 102, 5, 763, 7, 140, 103, - 104, 832, 105, 9, 10, 11, 844, 856, 858, 859, - 871, 667, 872, 874, 667, 904, 876, 877, 814, 13, - 106, 879, 15, 899, 107, 108, 908, 888, 889, 913, - 809, 109, 912, 922, 110, 916, 16, 931, 925, 111, - 112, 113, 928, 939, 936, 114, 115, 940, 510, 851, - 116, 117, 820, 416, 456, 118, 723, 119, 22, 842, - 214, 508, 120, 24, 711, 715, 121, 472, 361, 648, - 122, 123, 355, -94, 477, 886, 470, 724, 661, 667, - 887, 331, 729, -124, -124, -124, -124, -124, -124, -124, - 921, -124, -124, -124, -124, -124, 923, -124, -124, -124, - -124, -124, -124, -124, -124, -124, -124, -124, -124, -124, - -124, -124, 631, -124, -124, 504, 521, 73, 615, 522, - -124, 810, 667, -124, 808, -124, 697, 613, -124, -124, - -124, 428, 598, 878, -124, -124, 802, 594, 512, -124, - -124, 737, 676, 0, -124, 513, -124, -124, 0, 489, - 0, -124, -124, 0, 0, -124, 0, -124, -124, -124, - -124, 653, -124, -324, -324, -324, -324, -324, -324, -324, - 0, -324, -324, -324, -324, -324, 0, -324, -324, -324, - -324, -324, -324, -324, -324, -324, -324, -324, -324, -324, - -324, -324, 0, -324, -324, 0, 0, 0, 0, 0, - -324, 0, 0, -324, 0, -324, 0, 0, -324, -324, - -324, 0, 0, 0, -324, -324, 0, 0, 0, -324, - -324, 0, 0, 0, -324, 0, -324, -324, 0, 0, - 0, -324, -324, 0, 0, -324, 0, -324, 0, -324, - -324, 331, -324, -324, -324, 0, 0, 0, -324, -324, - 0, -324, 0, 0, 0, -324, 0, -324, -324, -324, - -324, -324, -324, -324, -324, -324, -324, -324, 0, -324, - 0, -324, 0, -324, -324, 0, 0, 0, 0, 0, - -324, 0, 0, -324, 0, 0, 0, 0, -324, -324, - -324, 0, 0, 0, -324, -324, 0, 0, 0, -324, - -324, 0, 0, 0, -324, 0, -324, -324, 0, 0, - 0, -324, -324, 0, 0, -324, 0, -324, -300, -324, - -324, 837, -324, -324, -324, 0, 0, 0, -324, -324, - 0, -324, 0, 0, 0, -324, 0, -324, -324, -324, - -324, -324, -324, -324, -324, -324, -324, -324, 0, -324, - 0, -324, 0, -324, -324, 0, 0, 0, 0, 0, - -324, 0, 0, -324, 0, 0, 0, 0, -324, -324, - -324, 0, 0, 0, -324, -324, 0, 0, 0, -324, - -324, 0, 0, 0, -324, 0, -324, -324, 0, 0, - 0, -324, -324, 0, 0, -324, 0, -324, 0, -324, - -324, 866, -324, -334, -334, 0, 0, 0, -334, -334, - 0, -334, 0, 0, 0, -334, 0, -334, -334, -334, - -334, -334, -334, -334, -334, -334, -334, -334, 0, -334, - 0, -334, 0, -334, -334, 0, 0, 0, 0, 0, - -334, 0, 0, -334, 0, 0, 0, 0, -334, -334, - -334, 0, 0, 0, -334, -334, 0, 0, 0, -334, - -334, 0, 0, 0, -334, 0, -334, -334, 0, 0, - 0, -334, -334, 0, 0, -334, 0, -334, 0, -334, - -334, 662, -334, 663, 51, 0, 0, 0, 103, 104, - 258, 105, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 0, 0, 0, 106, - 0, 15, 0, 107, 108, 0, 0, 0, 0, 0, - 109, 0, 0, 110, 0, 0, 0, 0, 111, 112, - 113, 0, 0, 0, 114, 115, 0, 0, 664, 116, - 117, 0, 0, 0, 118, 0, 119, 52, 0, 0, - 0, 120, 53, 0, 0, 121, 0, 0, -203, 122, - 123, 662, 665, 663, 51, 0, 0, 0, 103, 104, - 0, 105, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 0, 0, 0, 0, 106, - 0, 15, 0, 107, 108, 0, 0, 0, 0, 0, - 109, 0, 0, 110, 0, 0, 0, 0, 111, 112, - 113, 0, 0, 0, 114, 115, 0, 0, 664, 116, - 117, 0, 0, 0, 118, 0, 119, 52, 0, 0, - 0, 120, 53, 0, 0, 121, 0, 0, -258, 122, - 123, 662, 665, 663, 51, 0, 0, 0, 103, 104, - 0, 105, 228, 0, 0, 5, 0, 7, 140, 0, - 0, 0, 0, 9, 10, 11, 0, 0, 0, 106, - 0, 15, 0, 107, 108, 0, 0, 0, 0, 13, - 109, 0, 15, 110, 0, 0, 0, 0, 111, 112, - 113, 0, 0, 0, 114, 115, 16, 0, 664, 116, - 117, 0, 0, 0, 118, 0, 119, 52, 0, 0, - 0, 120, 53, 0, 0, 121, 0, 0, 22, 122, - 123, 196, 665, 24, -28, -28, -28, -28, 229, -261, - 0, 0, -28, -28, -28, 0, 0, 0, 0, 0, - 350, 0, 0, -24, -24, -24, -24, 197, -28, 0, - -175, -24, -24, -24, 0, 0, -175, 265, 266, 267, - 268, 269, 270, 271, 272, -28, 197, -24, 0, -175, - 0, 0, 0, 0, 0, -175, 0, 0, 0, 198, - 199, 0, 0, 0, -24, 0, 0, -28, 0, 0, - 0, 0, -28, 0, 0, 0, 0, -175, 198, 199, - 0, -175, -28, 0, 0, 0, -24, 0, 0, 0, - 0, -24, 0, 0, 0, 0, -175, 0, 0, 344, - -175, -24, -20, -20, -20, -20, 0, 0, 0, 0, - -20, -20, -20, 0, 0, 0, 0, 0, 331, 0, - 0, -487, -487, -487, -487, 197, -20, 0, -175, -487, - -487, -487, 0, 0, -175, 266, 267, 268, 269, 270, - 271, 272, 0, -20, 0, -487, 331, -487, 0, -324, - -324, -324, -324, 0, 0, 0, 0, -324, -324, -324, - 0, 0, -487, 0, 0, -20, 0, 0, 0, 0, - -20, 0, 0, -324, 0, -175, 0, 0, 0, -175, - -20, 0, 0, 0, -487, 0, 0, 0, 102, -487, - -324, 0, 0, 103, 104, 0, 105, 0, 0, -487, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, -324, 0, 106, 0, 15, -324, 107, 108, - 0, 0, 0, 0, 0, 109, 0, -111, 110, 0, - 0, 0, 0, 111, 112, 113, 0, 0, 0, 114, - 115, 0, 0, 0, 116, 117, 0, 102, 0, 118, - 0, 119, 103, 104, 0, 105, 120, 0, 0, 0, - 121, 0, 0, 0, 122, 123, 0, 0, 329, 0, - 0, 0, 0, 106, 0, 15, 0, 107, 108, 0, - 0, 0, 0, 0, 109, 0, 0, 110, 0, 0, - 0, 0, 111, 112, 113, 0, 0, 0, 114, 115, - 0, 0, 0, 116, 117, 0, 102, 0, 118, 0, - 119, 103, 104, 0, 105, 120, 0, 0, 0, 121, - 0, 0, 0, 122, 123, 0, 0, 411, 0, 0, - 0, 0, 106, 0, 15, 0, 107, 108, 0, 0, - 0, 0, 0, 109, 0, 0, 110, 0, 0, 0, - 0, 111, 112, 113, 0, 0, 0, 114, 115, 0, - 0, 0, 116, 117, 0, 102, 0, 118, 0, 119, - 103, 104, 0, 105, 120, 0, 0, 0, 121, 0, - 0, 0, 122, 123, 0, 0, 466, 0, 0, 0, - 0, 106, 0, 15, 0, 107, 108, 0, 0, 0, - 0, 0, 109, 0, 0, 110, 0, 0, 0, 0, - 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, - 0, 116, 117, 0, 102, 0, 118, 0, 119, 103, - 104, 0, 105, 120, 0, 0, 0, 121, 0, 0, - 0, 122, 123, 0, 0, 505, 0, 0, 0, 0, - 106, 0, 15, 0, 107, 108, 0, 0, 0, 0, - 0, 109, 0, 0, 110, 0, 0, 0, 0, 111, - 112, 113, 0, 0, 0, 114, 115, 0, 0, 0, - 116, 117, 0, 0, 0, 118, 0, 119, 0, 0, - 0, 0, 120, 0, 0, 0, 121, 0, 0, 0, - 122, 123, 0, 0, 757, 663, 767, 6, 7, 8, - 103, 104, 0, 105, 9, 10, 11, 768, 0, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, - 13, 106, 14, 15, 0, 107, 108, 0, 0, 0, - 0, 0, 109, 0, 0, 110, 0, 16, 0, 0, - 111, 112, 113, 0, 0, 0, 114, 115, 0, 0, - 0, 116, 117, 0, 0, 0, 118, 0, 119, 780, - 0, 0, 0, 120, 781, 0, 0, 121, 0, 782, - 0, 122, 123, 0, 367, 663, 51, 0, 0, 0, - 103, 104, 0, 105, 0, 0, 0, 768, 0, 769, - 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, - 0, 106, 0, 15, 0, 107, 108, 0, 0, 0, - 0, 0, 109, 0, 0, 110, 0, 0, 0, 0, - 111, 112, 113, 0, 0, 0, 114, 115, 0, 102, - 0, 116, 117, 0, 103, 104, 118, 105, 119, 52, - 0, 0, 0, 120, 53, 0, 0, 121, 0, 782, - 0, 122, 123, 0, 367, 106, 0, 15, 0, 107, - 108, 0, 0, 0, 0, 0, 109, 0, 0, 110, - 0, 0, 0, 0, 111, 112, 113, 0, 0, 0, - 114, 115, 0, 0, 0, 116, 117, 0, 0, 0, - 118, 0, 119, 0, 0, 0, 0, 120, 0, 0, - 0, 121, 0, 0, 0, 122, 123, 0, 483, 149, - 150, 0, 151, 152, 0, 0, 0, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 0, 102, 5, 6, - 7, 8, 103, 104, 172, 105, 9, 10, 11, 5, - 6, 7, 8, 0, 0, 0, 0, 9, 10, 11, - 0, 0, 13, 106, 14, 15, 0, 107, 108, 0, - 0, 0, 0, 13, 109, 14, 0, 110, 174, 16, - 0, 0, 111, 112, 113, 0, 0, 305, 114, 115, - 16, 0, 0, 116, 117, 0, 0, 0, 118, 0, - 119, 22, 0, 0, 0, 120, 24, 0, 0, 121, - 0, 0, 22, 122, 123, 102, 5, 24, 7, 140, - 103, 104, 84, 105, 9, 10, 11, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 0, 0, - 13, 106, 0, 15, 0, 107, 108, 0, 0, 0, - 0, 0, 109, 0, 0, 110, 0, 16, 0, 0, - 111, 112, 113, 0, 0, 0, 114, 115, 0, 102, - 0, 116, 117, 0, 103, 104, 118, 105, 119, 22, - 0, 0, 0, 120, 24, 0, 0, 121, 0, 0, - 0, 122, 123, 0, 0, 106, 0, 15, 0, 107, - 108, 0, 0, 0, 0, 0, 109, 0, 0, 110, - 0, 0, 0, 0, 111, 112, 113, 0, 0, 0, - 114, 115, 0, 102, 0, 116, 117, 0, 103, 104, - 118, 105, 119, 370, 0, 0, 0, 120, 0, 0, - 0, 121, 0, 0, 0, 122, 123, 0, 0, 106, - 0, 15, 0, 107, 108, 0, 0, 0, 0, 0, - 109, 0, 0, 110, 0, 0, 0, 0, 111, 112, - 113, 0, 0, 0, 114, 115, 0, 102, 0, 116, - 117, 0, 103, 104, 118, 105, 119, 0, 0, 0, - 0, 120, 0, 0, 0, 121, 0, 824, 0, 122, - 123, 0, 0, 106, 0, 15, 0, 107, 108, 0, - 0, 0, 0, 0, 109, 0, 0, 110, 0, 0, - 0, 0, 111, 112, 113, 0, 0, 0, 114, 115, - 0, 102, 0, 116, 117, 0, 103, 104, 118, 105, - 119, 0, 0, 0, 0, 120, 0, 0, 0, 121, - 0, 0, 0, 122, 123, 0, 0, 106, 0, 15, - 0, 107, 108, 0, 0, 0, 0, 0, 109, 0, - 0, 110, 0, 0, 0, 0, 111, 112, 113, 0, - 0, 0, 114, 115, 0, 102, 0, 252, 117, 0, - 103, 104, 118, 105, 119, 0, 0, 0, 0, 120, - 0, 0, 0, 121, 0, 0, 0, 122, 123, 0, - 0, 106, 0, 15, 0, 107, 108, 0, 0, 0, - 0, 0, 109, 0, 0, 110, 0, 0, 0, 0, - 111, 112, 113, 0, 0, 0, 114, 115, 0, 509, - 0, 254, 117, 0, 103, 104, 118, 105, 119, 0, - 0, 0, 0, 120, 0, 0, 0, 121, 0, 0, - 0, 122, 123, 0, 0, 106, 0, 15, 0, 107, - 108, 0, 0, 0, 0, 0, 109, 0, 0, 110, - 0, 0, 0, 0, 111, 112, 113, 0, 0, 0, - 114, 115, 0, 0, 0, 116, 117, 0, 0, 0, - 118, 0, 119, 0, 0, 0, 0, 120, 0, 0, - 0, 121, 0, 0, 544, 122, 123, 5, 0, 7, - 140, 0, 0, 0, 0, 9, 10, 11, 0, 0, - 0, 0, 544, 0, 0, 5, 0, 7, 140, 0, - 0, 13, 0, 9, 10, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 13, - 0, 0, 0, 0, 0, 0, 4, 0, -128, 5, - 6, 7, 8, 0, 0, 0, 16, 9, 10, 11, - 22, -439, -439, -439, 0, 24, 0, 0, 0, 0, - 545, -439, 12, 13, 0, 14, 15, 0, 22, -438, - -438, -438, 0, 24, 0, 0, 0, 0, 545, -438, - 16, 0, 0, 17, 18, -128, 0, 0, 0, 0, - 0, 0, 0, 0, -128, 0, 19, 20, 21, 0, - 0, 0, 22, 0, 0, 0, 23, 24, 25, 26, - 0, 4, 27, -128, 5, 6, 7, 8, 0, 0, - 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 13, 4, - 14, -128, 5, 6, 7, 8, 0, 0, 0, 0, - 9, 10, 11, 0, 0, 16, 0, 0, 530, 531, - -128, 0, 0, 0, 0, 0, 13, 0, 14, -128, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 24, 16, 0, 0, 0, 27, -128, 440, - 0, 441, 5, 6, 7, 8, 0, -128, 442, 0, - 9, 10, 11, 0, 0, 22, 0, 0, 440, 0, - 24, 5, 6, 7, 8, 27, 13, 442, 14, 9, - 10, 11, 5, 6, 7, 8, 0, 0, 0, 0, - 9, 10, 11, 16, 0, 13, 0, 14, 0, 0, - 0, 5, 6, 7, 8, 0, 13, 0, 14, 9, - 10, 11, 16, 0, 0, 22, 0, 0, 0, 0, - 24, 0, 0, 16, -384, 13, 0, 14, 0, 0, - 0, 0, 0, 0, 22, 228, 0, 0, 5, 24, - 7, 140, 16, -384, 0, 22, 9, 10, 11, 0, - 24, 0, 0, 0, 0, 597, 0, 0, 0, 0, - 0, 0, 13, 0, 22, 15, 0, 0, 0, 24, - 0, 0, 149, 150, 834, 151, 152, 0, 0, 16, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, - 0, 22, 0, 14, 0, 0, 24, 172, 256, 257, - 258, 0, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 0, 0, 173, 0, - 0, 0, 0, 0, 149, 150, 0, 151, 152, 0, - 0, 174, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 0, 149, 150, 0, 151, 152, 0, 0, 373, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, - 0, 0, 0, 0, 0, 0, 0, 172, 149, 150, - 0, 151, 152, 174, 0, 0, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 0, 0, 5, 0, 7, - 290, 174, 0, 582, 0, 9, 10, 11, 5, 6, - 7, 8, 0, 0, 442, 0, 9, 10, 11, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 0, 14, 0, 0, 174, 16, 0, - 0, 0, 0, 283, 0, 0, 0, 0, 0, 16, - 0, 0, 284, 285, 0, 0, 0, 0, 0, 0, - 22, 0, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 22, 5, 6, 7, 8, 24, 0, 630, 0, - 9, 10, 11, 5, 6, 7, 8, 0, 0, 0, - 0, 9, 10, 11, 0, 0, 13, 0, 14, 0, - 0, 0, 5, 6, 7, 8, 0, 13, 0, 14, - 9, 10, 11, 16, 0, 0, 0, 0, 0, 0, - 5, 0, 7, 140, 16, 0, 13, 0, 9, 10, - 11, 0, 0, 0, 0, 22, 0, 0, 0, 5, - 24, 7, 290, 16, 13, 0, 22, 9, 10, 11, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 13, 0, 22, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 22, 854, 0, 0, 0, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 22, 0, 0, 0, 0, 24, 0, 256, - 257, 258, 855, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 256, 257, 258, - 893, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 256, 257, 258, 0, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272 -}; - -static const short yycheck[] = { 9, - 10, 11, 209, 24, 2, 3, 16, 60, 61, 19, - 20, 318, 208, 23, 83, 25, 26, 2, 3, 2, - 3, 33, 2, 3, 91, 22, 85, 24, 66, 36, - 326, 177, 98, 31, 203, 33, 345, 243, 288, 347, - 476, 39, 351, 33, 31, 277, 67, 98, 32, 33, - 71, 284, 142, 552, 39, 145, 39, 177, 410, 39, - 635, 107, 108, 333, 74, 433, 194, 113, 204, 58, - 67, 61, 735, 80, 71, 817, 1, 200, 124, 77, - 1, 88, 431, 1, 94, 83, 9, 85, 38, 135, - 77, 1, 10, 91, 45, 38, 27, 38, 85, 109, - 246, 3, 4, 116, 3, 38, 714, 3, 98, 59, - 30, 7, 3, 4, 283, 98, 7, 324, 38, 5, - 1, 7, 3, 4, 732, 867, 116, 0, 59, 60, - 81, 0, 82, 76, 30, 76, 146, 800, 148, 30, - 39, 3, 4, 76, 59, 887, 199, 214, 890, 59, - 892, 891, 422, 76, 50, 145, 77, 82, 900, 50, - 173, 59, 172, 59, 82, 67, 416, 233, 59, 59, - 72, 3, 182, 183, 407, 185, 186, 59, 60, 919, - 843, 72, 233, 173, 77, 78, 67, 419, 38, 538, - 932, 72, 245, 191, 76, 45, 194, 195, 30, 698, - 699, 208, 45, 339, 191, 67, 204, 343, 195, 59, - 72, 334, 219, 77, 342, 225, 214, 204, 50, 526, - 82, 288, 345, 659, 38, 278, 30, 59, 351, 520, - 376, 45, 285, 524, 247, 358, 82, 360, 248, 252, - 3, 254, 232, 233, 612, 234, 230, 236, 232, 519, - 233, 68, 69, 70, 603, 3, 4, 247, 833, 3, - 4, 78, 252, 38, 254, 275, 276, 30, 3, 4, - 45, 3, 4, 5, 6, 7, 567, 629, 65, 570, - 3, 4, 3, 4, 7, 77, 30, 50, 301, 81, - 311, 82, 728, 82, 38, 348, 59, 60, 605, 309, - 76, 59, 60, 59, 60, 81, 50, 30, 578, 30, - 59, 301, 811, 59, 311, 59, 50, 38, 76, 67, - 76, 3, 4, 369, 72, 59, 60, 50, 72, 50, - 328, 338, 67, 386, 82, 67, 59, 72, 59, 485, - 72, 339, 7, 353, 342, 343, 59, 82, 30, 416, - 582, 72, 339, 559, 78, 4, 343, 6, 7, 591, - 78, 414, 77, 12, 13, 14, 81, 513, 50, 30, - 59, 437, 59, 76, 3, 4, 30, 59, 81, 28, - 76, 688, 48, 49, 654, 50, 437, 657, 621, 639, - 72, 81, 700, 513, 59, 60, 45, 63, 59, 60, - 3, 4, 838, 77, 9, 59, 60, 81, 418, 430, - 3, 4, 410, 426, 76, 68, 69, 70, 67, 81, - 75, 50, 227, 72, 422, 78, 622, 425, 77, 78, - 235, 76, 444, 430, 76, 433, 426, 422, 67, 585, - 77, 673, 422, 72, 81, 457, 444, 437, 433, 433, - 573, 620, 38, 433, 444, 578, 59, 626, 82, 443, - 444, 711, 552, 553, 67, 698, 59, 457, 27, 72, - 251, 30, 705, 77, 67, 256, 257, 36, 59, 72, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 59, 60, 54, 55, 803, 57, 58, 59, - 60, 511, 76, 515, 76, 574, 77, 81, 36, 81, - 81, 77, 3, 4, 67, 81, 76, 515, 77, 81, - 518, 77, 81, 535, 730, 515, 68, 69, 70, 76, - 514, 76, 655, 518, 657, 533, 78, 535, 518, 30, - 77, 346, 59, 60, 81, 535, 533, 616, 617, 615, - 534, 535, 611, 82, 552, 553, 76, 547, 556, 50, - 766, 77, 546, 547, 615, 552, 553, 577, 59, 607, - 608, 352, 639, 882, 564, 884, 574, 77, 637, 563, - 564, 81, 68, 69, 70, 754, 50, 51, 52, 3, - 4, 601, 78, 7, 38, 3, 4, 77, 596, 77, - 77, 81, 3, 81, 81, 59, 7, 388, 389, 596, - 77, 78, 610, 611, 612, 622, 30, 76, 616, 617, - 59, 60, 30, 621, 611, 615, 77, 612, 612, 30, - 926, 629, 612, 10, 621, 76, 50, 635, 934, 637, - 77, 78, 50, 63, 711, 59, 60, 82, 701, 50, - 637, 59, 60, 76, 664, 862, 59, 60, 59, 60, - 128, 129, 868, 5, 6, 7, 471, 27, 9, 36, - 12, 13, 14, 478, 479, 54, 55, 730, 57, 58, - 59, 60, 1, 752, 83, 4, 5, 6, 7, 27, - 77, 10, 30, 12, 13, 14, 78, 78, 36, 38, - 698, 699, 76, 909, 910, 78, 78, 705, 76, 28, - 720, 698, 699, 766, 495, 76, 38, 76, 705, 76, - 730, 59, 60, 76, 777, 76, 45, 76, 4, 5, - 6, 7, 730, 5, 6, 7, 12, 13, 14, 77, - 12, 13, 14, 81, 76, 730, 744, 730, 67, 83, - 730, 797, 28, 72, 752, 83, 766, 744, 30, 882, - 781, 884, 815, 82, 833, 818, 819, 572, 778, 45, - 76, 6, 7, 826, 82, 787, 835, 12, 13, 14, - 63, 63, 76, 780, 781, 566, 76, 36, 841, 787, - 83, 67, 78, 81, 32, 848, 72, 787, 38, 797, - 581, 77, 786, 787, 83, 76, 859, 48, 49, 50, - 51, 52, 797, 811, 797, 868, 77, 797, 623, 624, - 625, 81, 627, 628, 811, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 833, 3, 835, 891, 1, - 76, 3, 38, 77, 77, 650, 8, 9, 835, 11, - 1, 83, 63, 4, 5, 6, 7, 78, 868, 78, - 913, 12, 13, 14, 645, 38, 919, 29, 649, 31, - 38, 33, 34, 78, 679, 680, 681, 28, 40, 30, - 81, 43, 63, 38, 81, 78, 48, 49, 50, 36, - 38, 63, 54, 55, 45, 83, 677, 59, 60, 78, - 59, 59, 64, 59, 66, 38, 77, 77, 7, 71, - 38, 716, 693, 75, 77, 16, 67, 79, 80, 59, - 82, 72, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 82, 1, 714, 3, 4, 717, 6, 7, 8, - 9, 77, 11, 12, 13, 14, 78, 77, 77, 59, - 63, 732, 76, 17, 735, 9, 77, 76, 763, 28, - 29, 77, 31, 77, 33, 34, 77, 76, 76, 59, - 751, 40, 77, 77, 43, 81, 45, 77, 76, 48, - 49, 50, 76, 0, 77, 54, 55, 0, 419, 818, - 59, 60, 773, 291, 334, 64, 655, 66, 67, 797, - 87, 418, 71, 72, 638, 645, 75, 355, 233, 573, - 79, 80, 225, 82, 360, 868, 353, 655, 579, 800, - 868, 1, 657, 3, 4, 5, 6, 7, 8, 9, - 914, 11, 12, 13, 14, 15, 916, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 556, 33, 34, 413, 425, 25, 543, 425, - 40, 752, 843, 43, 749, 45, 617, 536, 48, 49, - 50, 310, 518, 854, 54, 55, 744, 513, 421, 59, - 60, 673, 585, -1, 64, 421, 66, 67, -1, 376, - -1, 71, 72, -1, -1, 75, -1, 77, 78, 79, - 80, 1, 82, 3, 4, 5, 6, 7, 8, 9, - -1, 11, 12, 13, 14, 15, -1, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, 45, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, 77, -1, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, 15, -1, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, 77, 78, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, 15, -1, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, 77, -1, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - -1, 11, -1, -1, -1, 15, -1, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, -1, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, 77, -1, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - 37, 11, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, 58, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, -1, 78, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - -1, 11, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, -1, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, -1, 58, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, -1, 78, 79, - 80, 1, 82, 3, 4, -1, -1, -1, 8, 9, - -1, 11, 1, -1, -1, 4, -1, 6, 7, -1, - -1, -1, -1, 12, 13, 14, -1, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, 28, - 40, -1, 31, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, 45, -1, 58, 59, - 60, -1, -1, -1, 64, -1, 66, 67, -1, -1, - -1, 71, 72, -1, -1, 75, -1, -1, 67, 79, - 80, 1, 82, 72, 4, 5, 6, 7, 77, 78, - -1, -1, 12, 13, 14, -1, -1, -1, -1, -1, - 1, -1, -1, 4, 5, 6, 7, 27, 28, -1, - 30, 12, 13, 14, -1, -1, 36, 45, 46, 47, - 48, 49, 50, 51, 52, 45, 27, 28, -1, 30, - -1, -1, -1, -1, -1, 36, -1, -1, -1, 59, - 60, -1, -1, -1, 45, -1, -1, 67, -1, -1, - -1, -1, 72, -1, -1, -1, -1, 77, 59, 60, - -1, 81, 82, -1, -1, -1, 67, -1, -1, -1, - -1, 72, -1, -1, -1, -1, 77, -1, -1, 1, - 81, 82, 4, 5, 6, 7, -1, -1, -1, -1, - 12, 13, 14, -1, -1, -1, -1, -1, 1, -1, - -1, 4, 5, 6, 7, 27, 28, -1, 30, 12, - 13, 14, -1, -1, 36, 46, 47, 48, 49, 50, - 51, 52, -1, 45, -1, 28, 1, 30, -1, 4, - 5, 6, 7, -1, -1, -1, -1, 12, 13, 14, - -1, -1, 45, -1, -1, 67, -1, -1, -1, -1, - 72, -1, -1, 28, -1, 77, -1, -1, -1, 81, - 82, -1, -1, -1, 67, -1, -1, -1, 3, 72, - 45, -1, -1, 8, 9, -1, 11, -1, -1, 82, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 67, -1, 29, -1, 31, 72, 33, 34, - -1, -1, -1, -1, -1, 40, -1, 82, 43, -1, - -1, -1, -1, 48, 49, 50, -1, -1, -1, 54, - 55, -1, -1, -1, 59, 60, -1, 3, -1, 64, - -1, 66, 8, 9, -1, 11, 71, -1, -1, -1, - 75, -1, -1, -1, 79, 80, -1, -1, 83, -1, - -1, -1, -1, 29, -1, 31, -1, 33, 34, -1, - -1, -1, -1, -1, 40, -1, -1, 43, -1, -1, - -1, -1, 48, 49, 50, -1, -1, -1, 54, 55, - -1, -1, -1, 59, 60, -1, 3, -1, 64, -1, - 66, 8, 9, -1, 11, 71, -1, -1, -1, 75, - -1, -1, -1, 79, 80, -1, -1, 83, -1, -1, - -1, -1, 29, -1, 31, -1, 33, 34, -1, -1, - -1, -1, -1, 40, -1, -1, 43, -1, -1, -1, - -1, 48, 49, 50, -1, -1, -1, 54, 55, -1, - -1, -1, 59, 60, -1, 3, -1, 64, -1, 66, - 8, 9, -1, 11, 71, -1, -1, -1, 75, -1, - -1, -1, 79, 80, -1, -1, 83, -1, -1, -1, - -1, 29, -1, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, -1, -1, -1, -1, - 48, 49, 50, -1, -1, -1, 54, 55, -1, -1, - -1, 59, 60, -1, 3, -1, 64, -1, 66, 8, - 9, -1, 11, 71, -1, -1, -1, 75, -1, -1, - -1, 79, 80, -1, -1, 83, -1, -1, -1, -1, - 29, -1, 31, -1, 33, 34, -1, -1, -1, -1, - -1, 40, -1, -1, 43, -1, -1, -1, -1, 48, - 49, 50, -1, -1, -1, 54, 55, -1, -1, -1, - 59, 60, -1, -1, -1, 64, -1, 66, -1, -1, - -1, -1, 71, -1, -1, -1, 75, -1, -1, -1, - 79, 80, -1, -1, 83, 3, 4, 5, 6, 7, - 8, 9, -1, 11, 12, 13, 14, 15, -1, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, -1, 45, -1, -1, - 48, 49, 50, -1, -1, -1, 54, 55, -1, -1, - -1, 59, 60, -1, -1, -1, 64, -1, 66, 67, - -1, -1, -1, 71, 72, -1, -1, 75, -1, 77, - -1, 79, 80, -1, 82, 3, 4, -1, -1, -1, - 8, 9, -1, 11, -1, -1, -1, 15, -1, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - -1, 29, -1, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, -1, -1, -1, -1, - 48, 49, 50, -1, -1, -1, 54, 55, -1, 3, - -1, 59, 60, -1, 8, 9, 64, 11, 66, 67, - -1, -1, -1, 71, 72, -1, -1, 75, -1, 77, - -1, 79, 80, -1, 82, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, -1, -1, 59, 60, -1, -1, -1, - 64, -1, 66, -1, -1, -1, -1, 71, -1, -1, - -1, 75, -1, -1, -1, 79, 80, -1, 82, 3, - 4, -1, 6, 7, -1, -1, -1, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, -1, 3, 4, 5, - 6, 7, 8, 9, 38, 11, 12, 13, 14, 4, - 5, 6, 7, -1, -1, -1, -1, 12, 13, 14, - -1, -1, 28, 29, 30, 31, -1, 33, 34, -1, - -1, -1, -1, 28, 40, 30, -1, 43, 72, 45, - -1, -1, 48, 49, 50, -1, -1, 81, 54, 55, - 45, -1, -1, 59, 60, -1, -1, -1, 64, -1, - 66, 67, -1, -1, -1, 71, 72, -1, -1, 75, - -1, -1, 67, 79, 80, 3, 4, 72, 6, 7, - 8, 9, 77, 11, 12, 13, 14, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, - 28, 29, -1, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, -1, 45, -1, -1, - 48, 49, 50, -1, -1, -1, 54, 55, -1, 3, - -1, 59, 60, -1, 8, 9, 64, 11, 66, 67, - -1, -1, -1, 71, 72, -1, -1, 75, -1, -1, - -1, 79, 80, -1, -1, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, 3, -1, 59, 60, -1, 8, 9, - 64, 11, 66, 67, -1, -1, -1, 71, -1, -1, - -1, 75, -1, -1, -1, 79, 80, -1, -1, 29, - -1, 31, -1, 33, 34, -1, -1, -1, -1, -1, - 40, -1, -1, 43, -1, -1, -1, -1, 48, 49, - 50, -1, -1, -1, 54, 55, -1, 3, -1, 59, - 60, -1, 8, 9, 64, 11, 66, -1, -1, -1, - -1, 71, -1, -1, -1, 75, -1, 77, -1, 79, - 80, -1, -1, 29, -1, 31, -1, 33, 34, -1, - -1, -1, -1, -1, 40, -1, -1, 43, -1, -1, - -1, -1, 48, 49, 50, -1, -1, -1, 54, 55, - -1, 3, -1, 59, 60, -1, 8, 9, 64, 11, - 66, -1, -1, -1, -1, 71, -1, -1, -1, 75, - -1, -1, -1, 79, 80, -1, -1, 29, -1, 31, - -1, 33, 34, -1, -1, -1, -1, -1, 40, -1, - -1, 43, -1, -1, -1, -1, 48, 49, 50, -1, - -1, -1, 54, 55, -1, 3, -1, 59, 60, -1, - 8, 9, 64, 11, 66, -1, -1, -1, -1, 71, - -1, -1, -1, 75, -1, -1, -1, 79, 80, -1, - -1, 29, -1, 31, -1, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, -1, -1, -1, -1, - 48, 49, 50, -1, -1, -1, 54, 55, -1, 3, - -1, 59, 60, -1, 8, 9, 64, 11, 66, -1, - -1, -1, -1, 71, -1, -1, -1, 75, -1, -1, - -1, 79, 80, -1, -1, 29, -1, 31, -1, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - -1, -1, -1, -1, 48, 49, 50, -1, -1, -1, - 54, 55, -1, -1, -1, 59, 60, -1, -1, -1, - 64, -1, 66, -1, -1, -1, -1, 71, -1, -1, - -1, 75, -1, -1, 1, 79, 80, 4, -1, 6, - 7, -1, -1, -1, -1, 12, 13, 14, -1, -1, - -1, -1, 1, -1, -1, 4, -1, 6, 7, -1, - -1, 28, -1, 12, 13, 14, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 45, 28, - -1, -1, -1, -1, -1, -1, 1, -1, 3, 4, - 5, 6, 7, -1, -1, -1, 45, 12, 13, 14, - 67, 68, 69, 70, -1, 72, -1, -1, -1, -1, - 77, 78, 27, 28, -1, 30, 31, -1, 67, 68, - 69, 70, -1, 72, -1, -1, -1, -1, 77, 78, - 45, -1, -1, 48, 49, 50, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, 61, 62, 63, -1, - -1, -1, 67, -1, -1, -1, 71, 72, 73, 74, - -1, 1, 77, 3, 4, 5, 6, 7, -1, -1, - -1, -1, 12, 13, 14, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 28, 1, - 30, 3, 4, 5, 6, 7, -1, -1, -1, -1, - 12, 13, 14, -1, -1, 45, -1, -1, 48, 49, - 50, -1, -1, -1, -1, -1, 28, -1, 30, 59, - -1, -1, -1, -1, -1, -1, -1, 67, -1, -1, - -1, -1, 72, 45, -1, -1, -1, 77, 50, 1, - -1, 3, 4, 5, 6, 7, -1, 59, 10, -1, - 12, 13, 14, -1, -1, 67, -1, -1, 1, -1, - 72, 4, 5, 6, 7, 77, 28, 10, 30, 12, - 13, 14, 4, 5, 6, 7, -1, -1, -1, -1, - 12, 13, 14, 45, -1, 28, -1, 30, -1, -1, - -1, 4, 5, 6, 7, -1, 28, -1, 30, 12, - 13, 14, 45, -1, -1, 67, -1, -1, -1, -1, - 72, -1, -1, 45, 76, 28, -1, 30, -1, -1, - -1, -1, -1, -1, 67, 1, -1, -1, 4, 72, - 6, 7, 45, 76, -1, 67, 12, 13, 14, -1, - 72, -1, -1, -1, -1, 77, -1, -1, -1, -1, - -1, -1, 28, -1, 67, 31, -1, -1, -1, 72, - -1, -1, 3, 4, 77, 6, 7, -1, -1, 45, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, -1, - -1, 67, -1, 30, -1, -1, 72, 38, 35, 36, - 37, -1, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, -1, -1, 59, -1, - -1, -1, -1, -1, 3, 4, -1, 6, 7, -1, - -1, 72, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, -1, 3, 4, -1, 6, 7, -1, -1, 38, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, -1, - -1, -1, -1, -1, -1, -1, -1, 38, 3, 4, - -1, 6, 7, 72, -1, -1, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, -1, -1, 4, -1, 6, - 7, 72, -1, 38, -1, 12, 13, 14, 4, 5, - 6, 7, -1, -1, 10, -1, 12, 13, 14, -1, - -1, 28, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 28, -1, 30, -1, -1, 72, 45, -1, - -1, -1, -1, 50, -1, -1, -1, -1, -1, 45, - -1, -1, 59, 60, -1, -1, -1, -1, -1, -1, - 67, -1, -1, -1, -1, 72, -1, -1, -1, -1, - -1, 67, 4, 5, 6, 7, 72, -1, 10, -1, - 12, 13, 14, 4, 5, 6, 7, -1, -1, -1, - -1, 12, 13, 14, -1, -1, 28, -1, 30, -1, - -1, -1, 4, 5, 6, 7, -1, 28, -1, 30, - 12, 13, 14, 45, -1, -1, -1, -1, -1, -1, - 4, -1, 6, 7, 45, -1, 28, -1, 12, 13, - 14, -1, -1, -1, -1, 67, -1, -1, -1, 4, - 72, 6, 7, 45, 28, -1, 67, 12, 13, 14, - -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 45, -1, 28, -1, 67, -1, -1, -1, -1, - 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 45, -1, -1, 67, 10, -1, -1, -1, 72, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 67, -1, -1, -1, -1, 72, -1, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 35, 36, 37, -1, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/local/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include <malloc.h> -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include <malloc.h> - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/local/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 1: -#line 237 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids an empty source file"); - finish_file (); - ; - break;} -case 2: -#line 242 "objc-parse.y" -{ - /* In case there were missing closebraces, - get us back to the global binding level. */ - while (! global_bindings_p ()) - poplevel (0, 0, 0); - finish_file (); - ; - break;} -case 3: -#line 256 "objc-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 5: -#line 257 "objc-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 10: -#line 265 "objc-parse.y" -{ STRIP_NOPS (yyvsp[-2].ttype); - if ((TREE_CODE (yyvsp[-2].ttype) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (yyvsp[-2].ttype, 0)) == STRING_CST) - || TREE_CODE (yyvsp[-2].ttype) == STRING_CST) - assemble_asm (yyvsp[-2].ttype); - else - error ("argument of `asm' is not a constant string"); ; - break;} -case 11: -#line 273 "objc-parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 12: -#line 278 "objc-parse.y" -{ if (pedantic) - error ("ANSI C forbids data definition with no type or storage class"); - else if (!flag_traditional) - warning ("data definition has no type or storage class"); - - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 13: -#line 288 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 14: -#line 293 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 15: -#line 298 "objc-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 16: -#line 300 "objc-parse.y" -{ shadow_tag (yyvsp[-1].ttype); ; - break;} -case 19: -#line 304 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C does not allow extra `;' outside of a function"); ; - break;} -case 20: -#line 310 "objc-parse.y" -{ if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 21: -#line 315 "objc-parse.y" -{ store_parm_decls (); ; - break;} -case 22: -#line 317 "objc-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 23: -#line 323 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 24: -#line 328 "objc-parse.y" -{ if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 25: -#line 333 "objc-parse.y" -{ store_parm_decls (); ; - break;} -case 26: -#line 335 "objc-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 27: -#line 341 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 28: -#line 346 "objc-parse.y" -{ if (! start_function (NULL_TREE, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); ; - break;} -case 29: -#line 351 "objc-parse.y" -{ store_parm_decls (); ; - break;} -case 30: -#line 353 "objc-parse.y" -{ finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 31: -#line 359 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 36: -#line 373 "objc-parse.y" -{ yyval.code = ADDR_EXPR; ; - break;} -case 37: -#line 375 "objc-parse.y" -{ yyval.code = NEGATE_EXPR; ; - break;} -case 38: -#line 377 "objc-parse.y" -{ yyval.code = CONVERT_EXPR; ; - break;} -case 39: -#line 379 "objc-parse.y" -{ yyval.code = PREINCREMENT_EXPR; ; - break;} -case 40: -#line 381 "objc-parse.y" -{ yyval.code = PREDECREMENT_EXPR; ; - break;} -case 41: -#line 383 "objc-parse.y" -{ yyval.code = BIT_NOT_EXPR; ; - break;} -case 42: -#line 385 "objc-parse.y" -{ yyval.code = TRUTH_NOT_EXPR; ; - break;} -case 43: -#line 389 "objc-parse.y" -{ yyval.ttype = build_compound_expr (yyvsp[0].ttype); ; - break;} -case 44: -#line 394 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 46: -#line 400 "objc-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 47: -#line 402 "objc-parse.y" -{ chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 49: -#line 408 "objc-parse.y" -{ yyval.ttype = build_indirect_ref (yyvsp[0].ttype, "unary *"); ; - break;} -case 50: -#line 411 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 51: -#line 414 "objc-parse.y" -{ yyval.ttype = build_unary_op (yyvsp[-1].code, yyvsp[0].ttype, 0); - overflow_warning (yyval.ttype); ; - break;} -case 52: -#line 418 "objc-parse.y" -{ tree label = lookup_label (yyvsp[0].ttype); - if (pedantic) - pedwarn ("ANSI C forbids `&&'"); - if (label == 0) - yyval.ttype = null_pointer_node; - else - { - TREE_USED (label) = 1; - yyval.ttype = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT (yyval.ttype) = 1; - } - ; - break;} -case 53: -#line 446 "objc-parse.y" -{ skip_evaluation--; - if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF - && DECL_BIT_FIELD (TREE_OPERAND (yyvsp[0].ttype, 1))) - error ("`sizeof' applied to a bit-field"); - yyval.ttype = c_sizeof (TREE_TYPE (yyvsp[0].ttype)); ; - break;} -case 54: -#line 452 "objc-parse.y" -{ skip_evaluation--; - yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ttype)); ; - break;} -case 55: -#line 455 "objc-parse.y" -{ skip_evaluation--; - yyval.ttype = c_alignof_expr (yyvsp[0].ttype); ; - break;} -case 56: -#line 458 "objc-parse.y" -{ skip_evaluation--; - yyval.ttype = c_alignof (groktypename (yyvsp[-1].ttype)); ; - break;} -case 57: -#line 461 "objc-parse.y" -{ yyval.ttype = build_unary_op (REALPART_EXPR, yyvsp[0].ttype, 0); ; - break;} -case 58: -#line 463 "objc-parse.y" -{ yyval.ttype = build_unary_op (IMAGPART_EXPR, yyvsp[0].ttype, 0); ; - break;} -case 59: -#line 467 "objc-parse.y" -{ skip_evaluation++; ; - break;} -case 60: -#line 471 "objc-parse.y" -{ skip_evaluation++; ; - break;} -case 62: -#line 477 "objc-parse.y" -{ tree type = groktypename (yyvsp[-2].ttype); - yyval.ttype = build_c_cast (type, yyvsp[0].ttype); ; - break;} -case 63: -#line 480 "objc-parse.y" -{ start_init (NULL_TREE, NULL, 0); - yyvsp[-2].ttype = groktypename (yyvsp[-2].ttype); - really_start_incremental_init (yyvsp[-2].ttype); ; - break;} -case 64: -#line 484 "objc-parse.y" -{ char *name; - tree result = pop_init_level (0); - tree type = yyvsp[-5].ttype; - finish_init (); - - if (pedantic) - pedwarn ("ANSI C forbids constructor expressions"); - if (TYPE_NAME (type) != 0) - { - if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) - name = IDENTIFIER_POINTER (TYPE_NAME (type)); - else - name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); - } - else - name = ""; - yyval.ttype = result; - if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) - { - int failure = complete_array_type (type, yyval.ttype, 1); - if (failure) - abort (); - } - ; - break;} -case 66: -#line 513 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 67: -#line 515 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 68: -#line 517 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 69: -#line 519 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 70: -#line 521 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 71: -#line 523 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 72: -#line 525 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 73: -#line 527 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 74: -#line 529 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 75: -#line 531 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 76: -#line 533 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 77: -#line 535 "objc-parse.y" -{ yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 78: -#line 537 "objc-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ; - break;} -case 79: -#line 540 "objc-parse.y" -{ skip_evaluation -= yyvsp[-3].ttype == boolean_false_node; - yyval.ttype = parser_build_binary_op (TRUTH_ANDIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 80: -#line 543 "objc-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ; - break;} -case 81: -#line 546 "objc-parse.y" -{ skip_evaluation -= yyvsp[-3].ttype == boolean_true_node; - yyval.ttype = parser_build_binary_op (TRUTH_ORIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 82: -#line 549 "objc-parse.y" -{ yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ; - break;} -case 83: -#line 552 "objc-parse.y" -{ skip_evaluation += ((yyvsp[-4].ttype == boolean_true_node) - - (yyvsp[-4].ttype == boolean_false_node)); ; - break;} -case 84: -#line 555 "objc-parse.y" -{ skip_evaluation -= yyvsp[-6].ttype == boolean_true_node; - yyval.ttype = build_conditional_expr (yyvsp[-6].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 85: -#line 558 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids omitting the middle term of a ?: expression"); - /* Make sure first operand is calculated only once. */ - yyvsp[0].ttype = save_expr (yyvsp[-1].ttype); - yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[0].ttype)); - skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ; - break;} -case 86: -#line 565 "objc-parse.y" -{ skip_evaluation -= yyvsp[-4].ttype == boolean_true_node; - yyval.ttype = build_conditional_expr (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ; - break;} -case 87: -#line 568 "objc-parse.y" -{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, NOP_EXPR, yyvsp[0].ttype); - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, MODIFY_EXPR); ; - break;} -case 88: -#line 571 "objc-parse.y" -{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, yyvsp[-1].code, yyvsp[0].ttype); - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE (yyval.ttype, ERROR_MARK); ; - break;} -case 89: -#line 578 "objc-parse.y" -{ - yyval.ttype = lastiddecl; - if (!yyval.ttype || yyval.ttype == error_mark_node) - { - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - tree decl; - - if (objc_receiver_context - && ! (objc_receiver_context - && strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "super"))) - /* we have a message to super */ - yyval.ttype = get_super_receiver (); - else if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, yyvsp[0].ttype))) - { - if (is_private (decl)) - yyval.ttype = error_mark_node; - else - yyval.ttype = build_ivar_reference (yyvsp[0].ttype); - } - else - { - /* Ordinary implicit function declaration. */ - yyval.ttype = implicitly_declare (yyvsp[0].ttype); - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - } - } - else if (current_function_decl == 0) - { - error ("`%s' undeclared here (not in a function)", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = error_mark_node; - } - else - { - tree decl; - - if (objc_receiver_context - && ! strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "super")) - /* we have a message to super */ - yyval.ttype = get_super_receiver (); - else if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, yyvsp[0].ttype))) - { - if (is_private (decl)) - yyval.ttype = error_mark_node; - else - yyval.ttype = build_ivar_reference (yyvsp[0].ttype); - } - else - { - if (IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) != error_mark_node - || IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) != current_function_decl) - { - error ("`%s' undeclared (first use this function)", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - yyval.ttype = error_mark_node; - /* Prevent repeated error messages. */ - IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) = error_mark_node; - IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) = current_function_decl; - } - } - } - else if (TREE_TYPE (yyval.ttype) == error_mark_node) - yyval.ttype = error_mark_node; - else if (C_DECL_ANTICIPATED (yyval.ttype)) - { - /* The first time we see a build-in function used, - if it has not been declared. */ - C_DECL_ANTICIPATED (yyval.ttype) = 0; - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - /* Omit the implicit declaration we - would ordinarily do, so we don't lose - the actual built in type. - But print a diagnostic for the mismatch. */ - if (objc_method_context - && is_ivar (objc_ivar_chain, yyvsp[0].ttype)) - error ("Instance variable `%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - else - if (TREE_CODE (yyval.ttype) != FUNCTION_DECL) - error ("`%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - else if ((TYPE_MODE (TREE_TYPE (TREE_TYPE (yyval.ttype))) - != TYPE_MODE (integer_type_node)) - && (TREE_TYPE (TREE_TYPE (yyval.ttype)) - != void_type_node)) - pedwarn ("type mismatch in implicit declaration for built-in function `%s'", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - /* If it really returns void, change that to int. */ - if (TREE_TYPE (TREE_TYPE (yyval.ttype)) == void_type_node) - TREE_TYPE (yyval.ttype) - = build_function_type (integer_type_node, - TYPE_ARG_TYPES (TREE_TYPE (yyval.ttype))); - } - else - pedwarn ("built-in function `%s' used without declaration", - IDENTIFIER_POINTER (DECL_NAME (yyval.ttype))); - - /* Do what we would ordinarily do when a fn is used. */ - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - } - else - { - assemble_external (yyval.ttype); - TREE_USED (yyval.ttype) = 1; - /* we have a definition - still check if iVariable */ - - if (!objc_receiver_context - || (objc_receiver_context - && strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "super"))) - { - tree decl; - - if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, yyvsp[0].ttype))) - { - if (IDENTIFIER_LOCAL_VALUE (yyvsp[0].ttype)) - warning ("local declaration of `%s' hides instance variable", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - else - { - if (is_private (decl)) - yyval.ttype = error_mark_node; - else - yyval.ttype = build_ivar_reference (yyvsp[0].ttype); - } - } - } - else /* we have a message to super */ - yyval.ttype = get_super_receiver (); - } - - if (TREE_CODE (yyval.ttype) == CONST_DECL) - { - yyval.ttype = DECL_INITIAL (yyval.ttype); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - yyval.ttype = build1 (NOP_EXPR, TREE_TYPE (yyval.ttype), yyval.ttype); - TREE_CONSTANT (yyval.ttype) = 1; - } - ; - break;} -case 91: -#line 738 "objc-parse.y" -{ yyval.ttype = combine_strings (yyvsp[0].ttype); ; - break;} -case 92: -#line 740 "objc-parse.y" -{ char class = TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - C_SET_EXP_ORIGINAL_CODE (yyvsp[-1].ttype, ERROR_MARK); - yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 93: -#line 746 "objc-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 94: -#line 748 "objc-parse.y" -{ if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - /* We must force a BLOCK for this level - so that, if it is not expanded later, - there is a way to turn off the entire subtree of blocks - that are contained in it. */ - keep_next_level (); - push_iterator_stack (); - push_label_level (); - yyval.ttype = expand_start_stmt_expr (); ; - break;} -case 95: -#line 762 "objc-parse.y" -{ tree rtl_exp; - if (pedantic) - pedwarn ("ANSI C forbids braced-groups within expressions"); - pop_iterator_stack (); - pop_label_level (); - rtl_exp = expand_end_stmt_expr (yyvsp[-2].ttype); - /* The statements have side effects, so the group does. */ - TREE_SIDE_EFFECTS (rtl_exp) = 1; - - if (TREE_CODE (yyvsp[-1].ttype) == BLOCK) - { - /* Make a BIND_EXPR for the BLOCK already made. */ - yyval.ttype = build (BIND_EXPR, TREE_TYPE (rtl_exp), - NULL_TREE, rtl_exp, yyvsp[-1].ttype); - /* Remove the block from the tree at this point. - It gets put back at the proper place - when the BIND_EXPR is expanded. */ - delete_block (yyvsp[-1].ttype); - } - else - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 96: -#line 785 "objc-parse.y" -{ yyval.ttype = build_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 97: -#line 787 "objc-parse.y" -{ yyval.ttype = build_array_ref (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 98: -#line 789 "objc-parse.y" -{ - if (doing_objc_thang) - { - if (is_public (yyvsp[-2].ttype, yyvsp[0].ttype)) - yyval.ttype = build_component_ref (yyvsp[-2].ttype, yyvsp[0].ttype); - else - yyval.ttype = error_mark_node; - } - else - yyval.ttype = build_component_ref (yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 99: -#line 801 "objc-parse.y" -{ - tree expr = build_indirect_ref (yyvsp[-2].ttype, "->"); - - if (doing_objc_thang) - { - if (is_public (expr, yyvsp[0].ttype)) - yyval.ttype = build_component_ref (expr, yyvsp[0].ttype); - else - yyval.ttype = error_mark_node; - } - else - yyval.ttype = build_component_ref (expr, yyvsp[0].ttype); - ; - break;} -case 100: -#line 815 "objc-parse.y" -{ yyval.ttype = build_unary_op (POSTINCREMENT_EXPR, yyvsp[-1].ttype, 0); ; - break;} -case 101: -#line 817 "objc-parse.y" -{ yyval.ttype = build_unary_op (POSTDECREMENT_EXPR, yyvsp[-1].ttype, 0); ; - break;} -case 102: -#line 819 "objc-parse.y" -{ yyval.ttype = build_message_expr (yyvsp[0].ttype); ; - break;} -case 103: -#line 821 "objc-parse.y" -{ yyval.ttype = build_selector_expr (yyvsp[0].ttype); ; - break;} -case 104: -#line 823 "objc-parse.y" -{ yyval.ttype = build_protocol_expr (yyvsp[0].ttype); ; - break;} -case 105: -#line 825 "objc-parse.y" -{ yyval.ttype = build_encode_expr (yyvsp[0].ttype); ; - break;} -case 106: -#line 827 "objc-parse.y" -{ yyval.ttype = build_objc_string_object (yyvsp[0].ttype); ; - break;} -case 108: -#line 834 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 110: -#line 842 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 113: -#line 850 "objc-parse.y" -{ c_mark_varargs (); - if (pedantic) - pedwarn ("ANSI C does not permit use of `varargs.h'"); ; - break;} -case 114: -#line 860 "objc-parse.y" -{ ; - break;} -case 119: -#line 876 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 120: -#line 881 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 121: -#line 886 "objc-parse.y" -{ shadow_tag_warned (yyvsp[-1].ttype, 1); - pedwarn ("empty declaration"); ; - break;} -case 122: -#line 889 "objc-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 123: -#line 898 "objc-parse.y" -{ ; - break;} -case 128: -#line 913 "objc-parse.y" -{ yyval.itype = suspend_momentary (); - pending_xref_error (); - declspec_stack = tree_cons (prefix_attributes, - current_declspecs, - declspec_stack); - split_specs_attrs (yyvsp[0].ttype, - ¤t_declspecs, &prefix_attributes); ; - break;} -case 129: -#line 924 "objc-parse.y" -{ prefix_attributes = chainon (prefix_attributes, yyvsp[0].ttype); ; - break;} -case 130: -#line 929 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 131: -#line 934 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 132: -#line 939 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 133: -#line 944 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 134: -#line 949 "objc-parse.y" -{ shadow_tag (yyvsp[-1].ttype); ; - break;} -case 135: -#line 951 "objc-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 136: -#line 953 "objc-parse.y" -{ pedantic = yyvsp[-1].itype; ; - break;} -case 137: -#line 963 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 138: -#line 965 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 139: -#line 969 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 140: -#line 971 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 141: -#line 973 "objc-parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 142: -#line 978 "objc-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 143: -#line 983 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 144: -#line 985 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 145: -#line 990 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 146: -#line 992 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 147: -#line 994 "objc-parse.y" -{ if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 148: -#line 1007 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 149: -#line 1009 "objc-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ; - break;} -case 150: -#line 1011 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 151: -#line 1013 "objc-parse.y" -{ yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 152: -#line 1018 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); - TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 153: -#line 1021 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 154: -#line 1023 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); - TREE_STATIC (yyval.ttype) = 1; ; - break;} -case 155: -#line 1026 "objc-parse.y" -{ if (extra_warnings && TREE_STATIC (yyvsp[-1].ttype)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER (yyvsp[0].ttype)); - yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); - TREE_STATIC (yyval.ttype) = TREE_STATIC (yyvsp[-1].ttype); ; - break;} -case 156: -#line 1040 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 157: -#line 1042 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; - break;} -case 158: -#line 1046 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 159: -#line 1048 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 162: -#line 1058 "objc-parse.y" -{ /* For a typedef name, record the meaning, not the name. - In case of `foo foo, bar;'. */ - yyval.ttype = lookup_name (yyvsp[0].ttype); ; - break;} -case 163: -#line 1062 "objc-parse.y" -{ yyval.ttype = get_static_reference (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 164: -#line 1064 "objc-parse.y" -{ yyval.ttype = get_object_reference (yyvsp[0].ttype); ; - break;} -case 165: -#line 1069 "objc-parse.y" -{ yyval.ttype = get_object_reference (yyvsp[0].ttype); ; - break;} -case 166: -#line 1071 "objc-parse.y" -{ yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); ; - break;} -case 167: -#line 1073 "objc-parse.y" -{ yyval.ttype = groktypename (yyvsp[-1].ttype); ; - break;} -case 175: -#line 1095 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 176: -#line 1097 "objc-parse.y" -{ if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 177: -#line 1104 "objc-parse.y" -{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1, - yyvsp[-1].ttype, prefix_attributes); - start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ; - break;} -case 178: -#line 1109 "objc-parse.y" -{ finish_init (); - finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; - break;} -case 179: -#line 1112 "objc-parse.y" -{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0, - yyvsp[0].ttype, prefix_attributes); - finish_decl (d, NULL_TREE, yyvsp[-1].ttype); - ; - break;} -case 180: -#line 1120 "objc-parse.y" -{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1, - yyvsp[-1].ttype, prefix_attributes); - start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ; - break;} -case 181: -#line 1125 "objc-parse.y" -{ finish_init (); - decl_attributes (yyvsp[-1].ttype, yyvsp[-3].ttype, prefix_attributes); - finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; - break;} -case 182: -#line 1129 "objc-parse.y" -{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0, - yyvsp[0].ttype, prefix_attributes); - finish_decl (d, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 183: -#line 1137 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 184: -#line 1139 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 185: -#line 1144 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 186: -#line 1146 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 187: -#line 1151 "objc-parse.y" -{ yyval.ttype = yyvsp[-2].ttype; ; - break;} -case 188: -#line 1156 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 189: -#line 1158 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 190: -#line 1163 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 191: -#line 1165 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 192: -#line 1167 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ; - break;} -case 193: -#line 1169 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ; - break;} -case 194: -#line 1171 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 200: -#line 1189 "objc-parse.y" -{ really_start_incremental_init (NULL_TREE); - /* Note that the call to clear_momentary - is in process_init_element. */ - push_momentary (); ; - break;} -case 201: -#line 1194 "objc-parse.y" -{ yyval.ttype = pop_init_level (0); - if (yyval.ttype == error_mark_node - && ! (yychar == STRING || yychar == CONSTANT)) - pop_momentary (); - else - pop_momentary_nofree (); ; - break;} -case 202: -#line 1202 "objc-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 203: -#line 1208 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids empty initializer braces"); ; - break;} -case 207: -#line 1222 "objc-parse.y" -{ process_init_element (yyvsp[0].ttype); ; - break;} -case 208: -#line 1224 "objc-parse.y" -{ push_init_level (0); ; - break;} -case 209: -#line 1226 "objc-parse.y" -{ process_init_element (pop_init_level (0)); ; - break;} -case 211: -#line 1232 "objc-parse.y" -{ set_init_label (yyvsp[-1].ttype); ; - break;} -case 213: -#line 1235 "objc-parse.y" -{ set_init_label (yyvsp[-1].ttype); ; - break;} -case 215: -#line 1241 "objc-parse.y" -{ push_c_function_context (); - if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); ; - break;} -case 216: -#line 1250 "objc-parse.y" -{ store_parm_decls (); ; - break;} -case 217: -#line 1258 "objc-parse.y" -{ finish_function (1); - pop_c_function_context (); ; - break;} -case 218: -#line 1264 "objc-parse.y" -{ push_c_function_context (); - if (! start_function (current_declspecs, yyvsp[0].ttype, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); ; - break;} -case 219: -#line 1273 "objc-parse.y" -{ store_parm_decls (); ; - break;} -case 220: -#line 1281 "objc-parse.y" -{ finish_function (1); - pop_c_function_context (); ; - break;} -case 223: -#line 1297 "objc-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 224: -#line 1299 "objc-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 225: -#line 1304 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 226: -#line 1306 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 227: -#line 1308 "objc-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 228: -#line 1315 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 231: -#line 1327 "objc-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 232: -#line 1332 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 233: -#line 1334 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 234: -#line 1336 "objc-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 235: -#line 1343 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 237: -#line 1352 "objc-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 238: -#line 1357 "objc-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 239: -#line 1359 "objc-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 240: -#line 1361 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 241: -#line 1363 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 242: -#line 1370 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 244: -#line 1376 "objc-parse.y" -{ yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype); - /* Start scope of tag before parsing components. */ - ; - break;} -case 245: -#line 1380 "objc-parse.y" -{ yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 246: -#line 1382 "objc-parse.y" -{ yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), - yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 247: -#line 1386 "objc-parse.y" -{ yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ; - break;} -case 248: -#line 1388 "objc-parse.y" -{ yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ; - break;} -case 249: -#line 1390 "objc-parse.y" -{ yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 250: -#line 1392 "objc-parse.y" -{ yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE), - yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 251: -#line 1396 "objc-parse.y" -{ yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ; - break;} -case 252: -#line 1398 "objc-parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (yyvsp[-1].ttype); ; - break;} -case 253: -#line 1401 "objc-parse.y" -{ yyval.ttype = finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), yyvsp[0].ttype); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 254: -#line 1404 "objc-parse.y" -{ yyvsp[0].itype = suspend_momentary (); - yyval.ttype = start_enum (NULL_TREE); ; - break;} -case 255: -#line 1407 "objc-parse.y" -{ yyval.ttype = finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), yyvsp[0].ttype); - resume_momentary (yyvsp[-5].itype); ; - break;} -case 256: -#line 1410 "objc-parse.y" -{ yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ; - break;} -case 260: -#line 1421 "objc-parse.y" -{ if (pedantic) pedwarn ("comma at end of enumerator list"); ; - break;} -case 261: -#line 1426 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 262: -#line 1428 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); - pedwarn ("no semicolon at end of struct or union"); ; - break;} -case 263: -#line 1433 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 264: -#line 1435 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ; - break;} -case 265: -#line 1437 "objc-parse.y" -{ if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); ; - break;} -case 266: -#line 1441 "objc-parse.y" -{ - tree interface = lookup_interface (yyvsp[-1].ttype); - - if (interface) - yyval.ttype = get_class_ivars (interface); - else - { - error ("Cannot find interface declaration for `%s'", - IDENTIFIER_POINTER (yyvsp[-1].ttype)); - yyval.ttype = NULL_TREE; - } - ; - break;} -case 267: -#line 1466 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 268: -#line 1472 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag(yyvsp[0].ttype); - yyval.ttype = NULL_TREE; ; - break;} -case 269: -#line 1477 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 270: -#line 1483 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag(yyvsp[0].ttype); - yyval.ttype = NULL_TREE; ; - break;} -case 271: -#line 1488 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 272: -#line 1490 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - pedantic = yyvsp[-1].itype; ; - break;} -case 274: -#line 1497 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 275: -#line 1502 "objc-parse.y" -{ yyval.ttype = grokfield (yyvsp[-3].filename, yyvsp[-2].lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 276: -#line 1506 "objc-parse.y" -{ yyval.ttype = grokfield (yyvsp[-5].filename, yyvsp[-4].lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 277: -#line 1509 "objc-parse.y" -{ yyval.ttype = grokfield (yyvsp[-4].filename, yyvsp[-3].lineno, NULL_TREE, current_declspecs, yyvsp[-1].ttype); - decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ; - break;} -case 279: -#line 1521 "objc-parse.y" -{ if (yyvsp[-2].ttype == error_mark_node) - yyval.ttype = yyvsp[-2].ttype; - else - yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ; - break;} -case 280: -#line 1526 "objc-parse.y" -{ yyval.ttype = error_mark_node; ; - break;} -case 281: -#line 1532 "objc-parse.y" -{ yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 282: -#line 1534 "objc-parse.y" -{ yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 283: -#line 1539 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 284: -#line 1541 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 285: -#line 1546 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 287: -#line 1552 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 288: -#line 1554 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 289: -#line 1559 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 290: -#line 1561 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; - break;} -case 291: -#line 1566 "objc-parse.y" -{ yyval.ttype = yyvsp[-1].ttype; ; - break;} -case 292: -#line 1569 "objc-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; - break;} -case 293: -#line 1571 "objc-parse.y" -{ yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; - break;} -case 294: -#line 1573 "objc-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 295: -#line 1575 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 296: -#line 1577 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; - break;} -case 297: -#line 1579 "objc-parse.y" -{ yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; - break;} -case 298: -#line 1581 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 299: -#line 1583 "objc-parse.y" -{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ; - break;} -case 300: -#line 1594 "objc-parse.y" -{ - if (pedantic && yyvsp[0].ends_in_label) - pedwarn ("ANSI C forbids label at end of compound statement"); - ; - break;} -case 302: -#line 1603 "objc-parse.y" -{ yyval.ends_in_label = yyvsp[0].ends_in_label; ; - break;} -case 303: -#line 1605 "objc-parse.y" -{ yyval.ends_in_label = 0; ; - break;} -case 307: -#line 1617 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - pushlevel (0); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); - if (objc_method_context) - add_objc_decls (); - ; - break;} -case 309: -#line 1632 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids label declarations"); ; - break;} -case 312: -#line 1643 "objc-parse.y" -{ tree link; - for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - ; - break;} -case 313: -#line 1657 "objc-parse.y" -{; - break;} -case 315: -#line 1662 "objc-parse.y" -{ yyval.ttype = convert (void_type_node, integer_zero_node); ; - break;} -case 316: -#line 1664 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - yyval.ttype = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 317: -#line 1672 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - yyval.ttype = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 318: -#line 1680 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - yyval.ttype = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 321: -#line 1700 "objc-parse.y" -{ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0); - yyval.itype = stmt_count; - if_stmt_file = yyvsp[-5].filename; - if_stmt_line = yyvsp[-4].lineno; - position_after_white_space (); ; - break;} -case 322: -#line 1713 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno); - /* See comment in `while' alternative, above. */ - emit_nop (); - expand_start_loop_continue_elsewhere (1); - position_after_white_space (); ; - break;} -case 323: -#line 1720 "objc-parse.y" -{ expand_loop_continue_here (); ; - break;} -case 324: -#line 1724 "objc-parse.y" -{ yyval.filename = input_filename; ; - break;} -case 325: -#line 1728 "objc-parse.y" -{ yyval.lineno = lineno; ; - break;} -case 326: -#line 1733 "objc-parse.y" -{ ; - break;} -case 327: -#line 1738 "objc-parse.y" -{ ; - break;} -case 328: -#line 1743 "objc-parse.y" -{ yyval.ends_in_label = yyvsp[0].ends_in_label; ; - break;} -case 329: -#line 1748 "objc-parse.y" -{ yyval.ends_in_label = 0; ; - break;} -case 330: -#line 1750 "objc-parse.y" -{ yyval.ends_in_label = 1; ; - break;} -case 331: -#line 1756 "objc-parse.y" -{ stmt_count++; ; - break;} -case 333: -#line 1759 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); -/* It appears that this should not be done--that a non-lvalue array - shouldn't get an error if the value isn't used. - Section 3.2.2.1 says that an array lvalue gets converted to a pointer - if it appears as a top-level expression, - but says nothing about non-lvalue arrays. */ -#if 0 - /* Call default_conversion to get an error - on referring to a register array if pedantic. */ - if (TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == FUNCTION_TYPE) - yyvsp[-1].ttype = default_conversion (yyvsp[-1].ttype); -#endif - iterator_expand (yyvsp[-1].ttype); - clear_momentary (); ; - break;} -case 334: -#line 1776 "objc-parse.y" -{ expand_start_else (); - yyvsp[-1].itype = stmt_count; - position_after_white_space (); ; - break;} -case 335: -#line 1780 "objc-parse.y" -{ expand_end_cond (); - if (extra_warnings && stmt_count == yyvsp[-3].itype) - warning ("empty body in an else-statement"); ; - break;} -case 336: -#line 1784 "objc-parse.y" -{ expand_end_cond (); - /* This warning is here instead of in simple_if, because we - do not want a warning if an empty if is followed by an - else statement. Increment stmt_count so we don't - give a second error if this is a nested `if'. */ - if (extra_warnings && stmt_count++ == yyvsp[0].itype) - warning_with_file_and_line (if_stmt_file, if_stmt_line, - "empty body in an if-statement"); ; - break;} -case 337: -#line 1796 "objc-parse.y" -{ expand_end_cond (); ; - break;} -case 338: -#line 1798 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno); - /* The emit_nop used to come before emit_line_note, - but that made the nop seem like part of the preceding line. - And that was confusing when the preceding line was - inside of an if statement and was not really executed. - I think it ought to work to put the nop after the line number. - We will see. --rms, July 15, 1991. */ - emit_nop (); ; - break;} -case 339: -#line 1808 "objc-parse.y" -{ /* Don't start the loop till we have succeeded - in parsing the end test. This is to make sure - that we end every loop we start. */ - expand_start_loop (1); - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-1].ttype)); - position_after_white_space (); ; - break;} -case 340: -#line 1817 "objc-parse.y" -{ expand_end_loop (); ; - break;} -case 341: -#line 1820 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-2].ttype)); - expand_end_loop (); - clear_momentary (); ; - break;} -case 342: -#line 1827 "objc-parse.y" -{ expand_end_loop (); - clear_momentary (); ; - break;} -case 343: -#line 1831 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - /* See comment in `while' alternative, above. */ - emit_nop (); - if (yyvsp[-1].ttype) c_expand_expr_stmt (yyvsp[-1].ttype); - /* Next step is to call expand_start_loop_continue_elsewhere, - but wait till after we parse the entire for (...). - Otherwise, invalid input might cause us to call that - fn without calling expand_end_loop. */ - ; - break;} -case 344: -#line 1843 "objc-parse.y" -{ yyvsp[0].lineno = lineno; - yyval.filename = input_filename; ; - break;} -case 345: -#line 1846 "objc-parse.y" -{ - /* Start the loop. Doing this after parsing - all the expressions ensures we will end the loop. */ - expand_start_loop_continue_elsewhere (1); - /* Emit the end-test, with a line number. */ - emit_line_note (yyvsp[-2].filename, yyvsp[-3].lineno); - if (yyvsp[-4].ttype) - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion (yyvsp[-4].ttype)); - /* Don't let the tree nodes for $9 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - yyvsp[-3].lineno = lineno; - yyvsp[-2].filename = input_filename; - position_after_white_space (); ; - break;} -case 346: -#line 1862 "objc-parse.y" -{ /* Emit the increment expression, with a line number. */ - emit_line_note (yyvsp[-4].filename, yyvsp[-5].lineno); - expand_loop_continue_here (); - if (yyvsp[-3].ttype) - c_expand_expr_stmt (yyvsp[-3].ttype); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - expand_end_loop (); ; - break;} -case 347: -#line 1873 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - c_expand_start_case (yyvsp[-1].ttype); - /* Don't let the tree nodes for $3 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - position_after_white_space (); ; - break;} -case 348: -#line 1881 "objc-parse.y" -{ expand_end_case (yyvsp[-3].ttype); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); ; - break;} -case 349: -#line 1887 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - if ( ! expand_exit_something ()) - error ("break statement not within loop or switch"); ; - break;} -case 350: -#line 1892 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - if (! expand_continue_loop (NULL_PTR)) - error ("continue statement not within a loop"); ; - break;} -case 351: -#line 1897 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno); - c_expand_return (NULL_TREE); ; - break;} -case 352: -#line 1901 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno); - c_expand_return (yyvsp[-1].ttype); ; - break;} -case 353: -#line 1905 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-7].filename, yyvsp[-6].lineno); - STRIP_NOPS (yyvsp[-2].ttype); - if ((TREE_CODE (yyvsp[-2].ttype) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND (yyvsp[-2].ttype, 0)) == STRING_CST) - || TREE_CODE (yyvsp[-2].ttype) == STRING_CST) - expand_asm (yyvsp[-2].ttype); - else - error ("argument of `asm' is not a constant string"); ; - break;} -case 354: -#line 1916 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-9].filename, yyvsp[-8].lineno); - c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, - yyvsp[-6].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 355: -#line 1923 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-11].filename, yyvsp[-10].lineno); - c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, - yyvsp[-8].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 356: -#line 1931 "objc-parse.y" -{ stmt_count++; - emit_line_note (yyvsp[-13].filename, yyvsp[-12].lineno); - c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, - yyvsp[-10].ttype == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); ; - break;} -case 357: -#line 1937 "objc-parse.y" -{ tree decl; - stmt_count++; - emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno); - decl = lookup_label (yyvsp[-1].ttype); - if (decl != 0) - { - TREE_USED (decl) = 1; - expand_goto (decl); - } - ; - break;} -case 358: -#line 1948 "objc-parse.y" -{ if (pedantic) - pedwarn ("ANSI C forbids `goto *expr;'"); - stmt_count++; - emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno); - expand_computed_goto (convert (ptr_type_node, yyvsp[-1].ttype)); ; - break;} -case 361: -#line 1963 "objc-parse.y" -{ - /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ - - yyval.itype = 0; - if (TREE_CODE (yyvsp[-1].ttype) != VAR_DECL) - error ("invalid `for (ITERATOR)' syntax"); - else if (! ITERATOR_P (yyvsp[-1].ttype)) - error ("`%s' is not an iterator", - IDENTIFIER_POINTER (DECL_NAME (yyvsp[-1].ttype))); - else if (ITERATOR_BOUND_P (yyvsp[-1].ttype)) - error ("`for (%s)' inside expansion of same iterator", - IDENTIFIER_POINTER (DECL_NAME (yyvsp[-1].ttype))); - else - { - yyval.itype = 1; - iterator_for_loop_start (yyvsp[-1].ttype); - } - ; - break;} -case 362: -#line 1984 "objc-parse.y" -{ - if (yyvsp[-1].itype) - iterator_for_loop_end (yyvsp[-3].ttype); - ; - break;} -case 363: -#line 2019 "objc-parse.y" -{ register tree value = check_case_value (yyvsp[-1].ttype); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - stmt_count++; - - if (value != error_mark_node) - { - tree duplicate; - int success = pushcase (value, convert_and_check, - label, &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); ; - break;} -case 364: -#line 2044 "objc-parse.y" -{ register tree value1 = check_case_value (yyvsp[-3].ttype); - register tree value2 = check_case_value (yyvsp[-1].ttype); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (pedantic) - pedwarn ("ANSI C forbids case ranges"); - stmt_count++; - - if (value1 != error_mark_node && value2 != error_mark_node) - { - tree duplicate; - int success = pushcase_range (value1, value2, - convert_and_check, label, - &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 4) - warning ("empty case range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); ; - break;} -case 365: -#line 2075 "objc-parse.y" -{ - tree duplicate; - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - int success = pushcase (NULL_TREE, 0, label, &duplicate); - stmt_count++; - if (success == 1) - error ("default label not within a switch statement"); - else if (success == 2) - { - error ("multiple default labels in one switch"); - error_with_decl (duplicate, "this is the first default label"); - } - position_after_white_space (); ; - break;} -case 366: -#line 2090 "objc-parse.y" -{ tree label = define_label (input_filename, lineno, yyvsp[-1].ttype); - stmt_count++; - emit_nop (); - if (label) - expand_label (label); - position_after_white_space (); ; - break;} -case 367: -#line 2102 "objc-parse.y" -{ emit_line_note (input_filename, lineno); - yyval.ttype = NULL_TREE; ; - break;} -case 368: -#line 2105 "objc-parse.y" -{ emit_line_note (input_filename, lineno); ; - break;} -case 369: -#line 2110 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 371: -#line 2117 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 374: -#line 2124 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; - break;} -case 375: -#line 2129 "objc-parse.y" -{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; - break;} -case 376: -#line 2134 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ; - break;} -case 377: -#line 2136 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ; - break;} -case 378: -#line 2142 "objc-parse.y" -{ pushlevel (0); - clear_parm_order (); - declare_parm_level (0); ; - break;} -case 379: -#line 2146 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - parmlist_tags_warning (); - poplevel (0, 0, 0); ; - break;} -case 381: -#line 2154 "objc-parse.y" -{ tree parm; - if (pedantic) - pedwarn ("ANSI C forbids forward parameter declarations"); - /* Mark the forward decls as such. */ - for (parm = getdecls (); parm; parm = TREE_CHAIN (parm)) - TREE_ASM_WRITTEN (parm) = 1; - clear_parm_order (); ; - break;} -case 382: -#line 2162 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; ; - break;} -case 383: -#line 2164 "objc-parse.y" -{ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ; - break;} -case 384: -#line 2170 "objc-parse.y" -{ yyval.ttype = get_parm_info (0); ; - break;} -case 385: -#line 2172 "objc-parse.y" -{ yyval.ttype = get_parm_info (0); - /* Gcc used to allow this as an extension. However, it does - not work for all targets, and thus has been disabled. - Also, since func (...) and func () are indistinguishable, - it caused problems with the code in expand_builtin which - tries to verify that BUILT_IN_NEXT_ARG is being used - correctly. */ - error ("ANSI C requires a named argument before `...'"); - ; - break;} -case 386: -#line 2182 "objc-parse.y" -{ yyval.ttype = get_parm_info (1); ; - break;} -case 387: -#line 2184 "objc-parse.y" -{ yyval.ttype = get_parm_info (0); ; - break;} -case 388: -#line 2189 "objc-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 389: -#line 2191 "objc-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 390: -#line 2198 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 391: -#line 2207 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 392: -#line 2216 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 393: -#line 2225 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 394: -#line 2235 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 395: -#line 2249 "objc-parse.y" -{ pushlevel (0); - clear_parm_order (); - declare_parm_level (1); ; - break;} -case 396: -#line 2253 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - parmlist_tags_warning (); - poplevel (0, 0, 0); ; - break;} -case 398: -#line 2261 "objc-parse.y" -{ tree t; - for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t)) - if (TREE_VALUE (t) == NULL_TREE) - error ("`...' in old-style identifier list"); - yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ; - break;} -case 399: -#line 2271 "objc-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 400: -#line 2273 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 401: -#line 2279 "objc-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 402: -#line 2281 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 403: -#line 2286 "objc-parse.y" -{ yyval.itype = pedantic; - pedantic = 0; ; - break;} -case 409: -#line 2299 "objc-parse.y" -{ - if (objc_implementation_context) - { - finish_class (objc_implementation_context); - objc_ivar_chain = NULL_TREE; - objc_implementation_context = NULL_TREE; - } - else - warning ("`@end' must appear in an implementation context"); - ; - break;} -case 410: -#line 2314 "objc-parse.y" -{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; - break;} -case 411: -#line 2316 "objc-parse.y" -{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; - break;} -case 412: -#line 2321 "objc-parse.y" -{ - objc_declare_class (yyvsp[-1].ttype); - ; - break;} -case 413: -#line 2327 "objc-parse.y" -{ - objc_declare_alias (yyvsp[-2].ttype, yyvsp[-1].ttype); - ; - break;} -case 414: -#line 2333 "objc-parse.y" -{ - objc_interface_context = objc_ivar_context - = start_class (CLASS_INTERFACE_TYPE, yyvsp[-2].ttype, NULL_TREE, yyvsp[-1].ttype); - objc_public_flag = 0; - ; - break;} -case 415: -#line 2339 "objc-parse.y" -{ - continue_class (objc_interface_context); - ; - break;} -case 416: -#line 2344 "objc-parse.y" -{ - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 417: -#line 2350 "objc-parse.y" -{ - objc_interface_context - = start_class (CLASS_INTERFACE_TYPE, yyvsp[-1].ttype, NULL_TREE, yyvsp[0].ttype); - continue_class (objc_interface_context); - ; - break;} -case 418: -#line 2357 "objc-parse.y" -{ - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 419: -#line 2363 "objc-parse.y" -{ - objc_interface_context = objc_ivar_context - = start_class (CLASS_INTERFACE_TYPE, yyvsp[-4].ttype, yyvsp[-2].ttype, yyvsp[-1].ttype); - objc_public_flag = 0; - ; - break;} -case 420: -#line 2369 "objc-parse.y" -{ - continue_class (objc_interface_context); - ; - break;} -case 421: -#line 2374 "objc-parse.y" -{ - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 422: -#line 2380 "objc-parse.y" -{ - objc_interface_context - = start_class (CLASS_INTERFACE_TYPE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); - continue_class (objc_interface_context); - ; - break;} -case 423: -#line 2387 "objc-parse.y" -{ - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 424: -#line 2393 "objc-parse.y" -{ - objc_implementation_context = objc_ivar_context - = start_class (CLASS_IMPLEMENTATION_TYPE, yyvsp[-1].ttype, NULL_TREE, NULL_TREE); - objc_public_flag = 0; - ; - break;} -case 425: -#line 2399 "objc-parse.y" -{ - objc_ivar_chain - = continue_class (objc_implementation_context); - ; - break;} -case 426: -#line 2405 "objc-parse.y" -{ - objc_implementation_context - = start_class (CLASS_IMPLEMENTATION_TYPE, yyvsp[0].ttype, NULL_TREE, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - ; - break;} -case 427: -#line 2413 "objc-parse.y" -{ - objc_implementation_context = objc_ivar_context - = start_class (CLASS_IMPLEMENTATION_TYPE, yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); - objc_public_flag = 0; - ; - break;} -case 428: -#line 2419 "objc-parse.y" -{ - objc_ivar_chain - = continue_class (objc_implementation_context); - ; - break;} -case 429: -#line 2425 "objc-parse.y" -{ - objc_implementation_context - = start_class (CLASS_IMPLEMENTATION_TYPE, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - ; - break;} -case 430: -#line 2433 "objc-parse.y" -{ - objc_interface_context - = start_class (CATEGORY_INTERFACE_TYPE, yyvsp[-4].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); - continue_class (objc_interface_context); - ; - break;} -case 431: -#line 2440 "objc-parse.y" -{ - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 432: -#line 2446 "objc-parse.y" -{ - objc_implementation_context - = start_class (CATEGORY_IMPLEMENTATION_TYPE, yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - ; - break;} -case 433: -#line 2456 "objc-parse.y" -{ - remember_protocol_qualifiers (); - objc_interface_context - = start_protocol(PROTOCOL_INTERFACE_TYPE, yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 434: -#line 2462 "objc-parse.y" -{ - forget_protocol_qualifiers(); - finish_protocol(objc_interface_context); - objc_interface_context = NULL_TREE; - ; - break;} -case 435: -#line 2471 "objc-parse.y" -{ - yyval.ttype = NULL_TREE; - ; - break;} -case 437: -#line 2479 "objc-parse.y" -{ - if (yyvsp[-2].code == LT_EXPR && yyvsp[0].code == GT_EXPR) - yyval.ttype = yyvsp[-1].ttype; - else - YYERROR1; - ; - break;} -case 440: -#line 2493 "objc-parse.y" -{ objc_public_flag = 2; ; - break;} -case 441: -#line 2494 "objc-parse.y" -{ objc_public_flag = 0; ; - break;} -case 442: -#line 2495 "objc-parse.y" -{ objc_public_flag = 1; ; - break;} -case 443: -#line 2500 "objc-parse.y" -{ - yyval.ttype = NULL_TREE; - ; - break;} -case 445: -#line 2505 "objc-parse.y" -{ - if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); - ; - break;} -case 446: -#line 2523 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 447: -#line 2529 "objc-parse.y" -{ yyval.ttype = yyvsp[0].ttype; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-1].itype); ; - break;} -case 448: -#line 2535 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 449: -#line 2540 "objc-parse.y" -{ yyval.ttype = NULL_TREE; ; - break;} -case 452: -#line 2547 "objc-parse.y" -{ - yyval.ttype = add_instance_variable (objc_ivar_context, - objc_public_flag, - yyvsp[0].ttype, current_declspecs, - NULL_TREE); - ; - break;} -case 453: -#line 2554 "objc-parse.y" -{ - yyval.ttype = add_instance_variable (objc_ivar_context, - objc_public_flag, - yyvsp[-2].ttype, current_declspecs, yyvsp[0].ttype); - ; - break;} -case 454: -#line 2560 "objc-parse.y" -{ - yyval.ttype = add_instance_variable (objc_ivar_context, - objc_public_flag, - NULL_TREE, - current_declspecs, yyvsp[0].ttype); - ; - break;} -case 455: -#line 2570 "objc-parse.y" -{ - remember_protocol_qualifiers (); - if (objc_implementation_context) - objc_inherit_code = CLASS_METHOD_DECL; - else - fatal ("method definition not in class context"); - ; - break;} -case 456: -#line 2578 "objc-parse.y" -{ - forget_protocol_qualifiers (); - add_class_method (objc_implementation_context, yyvsp[0].ttype); - start_method_def (yyvsp[0].ttype); - objc_method_context = yyvsp[0].ttype; - ; - break;} -case 457: -#line 2585 "objc-parse.y" -{ - continue_method_def (); - ; - break;} -case 458: -#line 2589 "objc-parse.y" -{ - finish_method_def (); - objc_method_context = NULL_TREE; - ; - break;} -case 459: -#line 2595 "objc-parse.y" -{ - remember_protocol_qualifiers (); - if (objc_implementation_context) - objc_inherit_code = INSTANCE_METHOD_DECL; - else - fatal ("method definition not in class context"); - ; - break;} -case 460: -#line 2603 "objc-parse.y" -{ - forget_protocol_qualifiers (); - add_instance_method (objc_implementation_context, yyvsp[0].ttype); - start_method_def (yyvsp[0].ttype); - objc_method_context = yyvsp[0].ttype; - ; - break;} -case 461: -#line 2610 "objc-parse.y" -{ - continue_method_def (); - ; - break;} -case 462: -#line 2614 "objc-parse.y" -{ - finish_method_def (); - objc_method_context = NULL_TREE; - ; - break;} -case 464: -#line 2626 "objc-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 469: -#line 2633 "objc-parse.y" -{yyval.ttype = NULL_TREE; ; - break;} -case 473: -#line 2643 "objc-parse.y" -{ - objc_inherit_code = CLASS_METHOD_DECL; - ; - break;} -case 474: -#line 2647 "objc-parse.y" -{ - add_class_method (objc_interface_context, yyvsp[0].ttype); - ; - break;} -case 476: -#line 2653 "objc-parse.y" -{ - objc_inherit_code = INSTANCE_METHOD_DECL; - ; - break;} -case 477: -#line 2657 "objc-parse.y" -{ - add_instance_method (objc_interface_context, yyvsp[0].ttype); - ; - break;} -case 479: -#line 2665 "objc-parse.y" -{ - yyval.ttype = build_method_decl (objc_inherit_code, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); - ; - break;} -case 480: -#line 2670 "objc-parse.y" -{ - yyval.ttype = build_method_decl (objc_inherit_code, NULL_TREE, yyvsp[0].ttype, NULL_TREE); - ; - break;} -case 481: -#line 2675 "objc-parse.y" -{ - yyval.ttype = build_method_decl (objc_inherit_code, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 482: -#line 2680 "objc-parse.y" -{ - yyval.ttype = build_method_decl (objc_inherit_code, NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 491: -#line 2710 "objc-parse.y" -{ current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary (yyvsp[-2].itype); ; - break;} -case 492: -#line 2715 "objc-parse.y" -{ shadow_tag (yyvsp[-1].ttype); ; - break;} -case 493: -#line 2717 "objc-parse.y" -{ pedwarn ("empty declaration"); ; - break;} -case 494: -#line 2722 "objc-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 495: -#line 2724 "objc-parse.y" -{ push_parm_decl (yyvsp[0].ttype); ; - break;} -case 496: -#line 2732 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); ; - break;} -case 497: -#line 2737 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); ; - break;} -case 498: -#line 2742 "objc-parse.y" -{ yyval.ttype = build_tree_list (build_tree_list (current_declspecs, - yyvsp[-1].ttype), - build_tree_list (prefix_attributes, - yyvsp[0].ttype)); ; - break;} -case 499: -#line 2750 "objc-parse.y" -{ - yyval.ttype = NULL_TREE; - ; - break;} -case 500: -#line 2754 "objc-parse.y" -{ - /* oh what a kludge! */ - yyval.ttype = (tree)1; - ; - break;} -case 501: -#line 2759 "objc-parse.y" -{ - pushlevel (0); - ; - break;} -case 502: -#line 2763 "objc-parse.y" -{ - /* returns a tree list node generated by get_parm_info */ - yyval.ttype = yyvsp[0].ttype; - poplevel (0, 0, 0); - ; - break;} -case 505: -#line 2778 "objc-parse.y" -{ - yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 510: -#line 2791 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 511: -#line 2792 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 512: -#line 2793 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 513: -#line 2794 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 514: -#line 2795 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 515: -#line 2796 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 516: -#line 2797 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 517: -#line 2798 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 518: -#line 2799 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 519: -#line 2800 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 520: -#line 2801 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 521: -#line 2802 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 522: -#line 2803 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 523: -#line 2804 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 524: -#line 2805 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 525: -#line 2806 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 526: -#line 2807 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 527: -#line 2808 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 528: -#line 2809 "objc-parse.y" -{ yyval.ttype = get_identifier (token_buffer); ; - break;} -case 531: -#line 2815 "objc-parse.y" -{ - yyval.ttype = build_keyword_decl (yyvsp[-5].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 532: -#line 2820 "objc-parse.y" -{ - yyval.ttype = build_keyword_decl (yyvsp[-2].ttype, NULL_TREE, yyvsp[0].ttype); - ; - break;} -case 533: -#line 2825 "objc-parse.y" -{ - yyval.ttype = build_keyword_decl (NULL_TREE, yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 534: -#line 2830 "objc-parse.y" -{ - yyval.ttype = build_keyword_decl (NULL_TREE, NULL_TREE, yyvsp[0].ttype); - ; - break;} -case 538: -#line 2843 "objc-parse.y" -{ - yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 539: -#line 2851 "objc-parse.y" -{ - if (TREE_CHAIN (yyvsp[0].ttype) == NULL_TREE) - /* just return the expr., remove a level of indirection */ - yyval.ttype = TREE_VALUE (yyvsp[0].ttype); - else - /* we have a comma expr., we will collapse later */ - yyval.ttype = yyvsp[0].ttype; - ; - break;} -case 540: -#line 2863 "objc-parse.y" -{ - yyval.ttype = build_tree_list (yyvsp[-2].ttype, yyvsp[0].ttype); - ; - break;} -case 541: -#line 2867 "objc-parse.y" -{ - yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); - ; - break;} -case 543: -#line 2875 "objc-parse.y" -{ - yyval.ttype = get_class_reference (yyvsp[0].ttype); - ; - break;} -case 544: -#line 2882 "objc-parse.y" -{ objc_receiver_context = 1; ; - break;} -case 545: -#line 2884 "objc-parse.y" -{ objc_receiver_context = 0; ; - break;} -case 546: -#line 2886 "objc-parse.y" -{ - yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); - ; - break;} -case 550: -#line 2899 "objc-parse.y" -{ - yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); - ; - break;} -case 551: -#line 2906 "objc-parse.y" -{ - yyval.ttype = build_tree_list (yyvsp[-1].ttype, NULL_TREE); - ; - break;} -case 552: -#line 2910 "objc-parse.y" -{ - yyval.ttype = build_tree_list (NULL_TREE, NULL_TREE); - ; - break;} -case 553: -#line 2917 "objc-parse.y" -{ - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 554: -#line 2924 "objc-parse.y" -{ - yyval.ttype = yyvsp[-1].ttype; - ; - break;} -case 555: -#line 2933 "objc-parse.y" -{ - yyval.ttype = groktypename (yyvsp[-1].ttype); - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/local/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 2938 "objc-parse.y" - diff --git a/gcc/objc/objc-parse.y b/gcc/objc/objc-parse.y deleted file mode 100644 index e06359919fb..00000000000 --- a/gcc/objc/objc-parse.y +++ /dev/null @@ -1,2938 +0,0 @@ -/*WARNING: This file is automatically generated!*/ -/* YACC parser for C syntax and for Objective C. -*-c-*- - Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This file defines the grammar of C and that of Objective C. - ifobjc ... end ifobjc conditionals contain code for Objective C only. - ifc ... end ifc conditionals contain code for C only. - Sed commands in Makefile.in are used to convert this file into - c-parse.y and into objc-parse.y. */ - -/* To whomever it may concern: I have heard that such a thing was once - written by AT&T, but I have never seen it. */ - -%expect 66 - -%{ -#include <stdio.h> -#include <errno.h> -#include <setjmp.h> - -#include "config.h" -#include "tree.h" -#include "input.h" -#include "c-lex.h" -#include "c-tree.h" -#include "flags.h" - -#ifdef MULTIBYTE_CHARS -#include <stdlib.h> -#include <locale.h> -#endif - -#include "objc-act.h" - -/* Since parsers are distinct for each language, put the language string - definition here. */ -char *language_string = "GNU Obj-C"; - -#ifndef errno -extern int errno; -#endif - -void yyerror (); - -/* Like YYERROR but do call yyerror. */ -#define YYERROR1 { yyerror ("syntax error"); YYERROR; } - -/* Cause the `yydebug' variable to be defined. */ -#define YYDEBUG 1 -%} - -%start program - -%union {long itype; tree ttype; enum tree_code code; - char *filename; int lineno; int ends_in_label; } - -/* All identifiers that are not reserved words - and are not declared typedefs in the current block */ -%token IDENTIFIER - -/* All identifiers that are declared typedefs in the current block. - In some contexts, they are treated just like IDENTIFIER, - but they can also serve as typespecs in declarations. */ -%token TYPENAME - -/* Reserved words that specify storage class. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token SCSPEC - -/* Reserved words that specify type. - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token TYPESPEC - -/* Reserved words that qualify type: "const" or "volatile". - yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token TYPE_QUAL - -/* Character or numeric constants. - yylval is the node for the constant. */ -%token CONSTANT - -/* String constants in raw form. - yylval is a STRING_CST node. */ -%token STRING - -/* "...", used for functions with variable arglists. */ -%token ELLIPSIS - -/* the reserved words */ -/* SCO include files test "ASM", so use something else. */ -%token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT -%token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF -%token ATTRIBUTE EXTENSION LABEL -%token REALPART IMAGPART - -/* Add precedence rules to solve dangling else s/r conflict */ -%nonassoc IF -%nonassoc ELSE - -/* Define the operator tokens and their precedences. - The value is an integer because, if used, it is the tree code - to use in the expression made from the operator. */ - -%right <code> ASSIGN '=' -%right <code> '?' ':' -%left <code> OROR -%left <code> ANDAND -%left <code> '|' -%left <code> '^' -%left <code> '&' -%left <code> EQCOMPARE -%left <code> ARITHCOMPARE -%left <code> LSHIFT RSHIFT -%left <code> '+' '-' -%left <code> '*' '/' '%' -%right <code> UNARY PLUSPLUS MINUSMINUS -%left HYPERUNARY -%left <code> POINTSAT '.' '(' '[' - -/* The Objective-C keywords. These are included in C and in - Objective C, so that the token codes are the same in both. */ -%token INTERFACE IMPLEMENTATION END SELECTOR DEFS ENCODE -%token CLASSNAME PUBLIC PRIVATE PROTECTED PROTOCOL OBJECTNAME CLASS ALIAS - -/* Objective-C string constants in raw form. - yylval is an OBJC_STRING_CST node. */ -%token OBJC_STRING - - -%type <code> unop - -%type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist -%type <ttype> expr_no_commas cast_expr unary_expr primary string STRING -%type <ttype> typed_declspecs reserved_declspecs -%type <ttype> typed_typespecs reserved_typespecquals -%type <ttype> declmods typespec typespecqual_reserved -%type <ttype> typed_declspecs_no_prefix_attr reserved_declspecs_no_prefix_attr -%type <ttype> declmods_no_prefix_attr -%type <ttype> SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual -%type <ttype> initdecls notype_initdecls initdcl notype_initdcl -%type <ttype> init maybeasm -%type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers -%type <ttype> maybe_attribute attributes attribute attribute_list attrib -%type <ttype> any_word - -%type <ttype> compstmt - -%type <ttype> declarator -%type <ttype> notype_declarator after_type_declarator -%type <ttype> parm_declarator - -%type <ttype> structsp component_decl_list component_decl_list2 -%type <ttype> component_decl components component_declarator -%type <ttype> enumlist enumerator -%type <ttype> typename absdcl absdcl1 type_quals -%type <ttype> xexpr parms parm identifiers - -%type <ttype> parmlist parmlist_1 parmlist_2 -%type <ttype> parmlist_or_identifiers parmlist_or_identifiers_1 -%type <ttype> identifiers_or_typenames - -%type <itype> setspecs - -%type <ends_in_label> lineno_stmt_or_label lineno_stmt_or_labels stmt_or_label - -%type <filename> save_filename -%type <lineno> save_lineno - -/* the Objective-C nonterminals */ - -%type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator -%type <ttype> methoddecl unaryselector keywordselector selector -%type <ttype> keyworddecl receiver objcmessageexpr messageargs -%type <ttype> keywordexpr keywordarglist keywordarg -%type <ttype> myparms myparm optparmlist reservedwords objcselectorexpr -%type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr -%type <ttype> objc_string non_empty_protocolrefs protocolrefs identifier_list objcprotocolexpr - -%type <ttype> CLASSNAME OBJC_STRING OBJECTNAME - -%{ -/* Number of statements (loosely speaking) seen so far. */ -static int stmt_count; - -/* Input file and line number of the end of the body of last simple_if; - used by the stmt-rule immediately after simple_if returns. */ -static char *if_stmt_file; -static int if_stmt_line; - -/* List of types and structure classes of the current declaration. */ -static tree current_declspecs = NULL_TREE; -static tree prefix_attributes = NULL_TREE; - -/* Stack of saved values of current_declspecs and prefix_attributes. */ -static tree declspec_stack; - -/* 1 if we explained undeclared var errors. */ -static int undeclared_variable_notice; - -/* Objective-C specific information */ - -tree objc_interface_context; -tree objc_implementation_context; -tree objc_method_context; -tree objc_ivar_chain; -tree objc_ivar_context; -enum tree_code objc_inherit_code; -int objc_receiver_context; -int objc_public_flag; - - -/* Tell yyparse how to print a token's value, if yydebug is set. */ - -#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) -extern void yyprint (); -%} - -%% -program: /* empty */ - { if (pedantic) - pedwarn ("ANSI C forbids an empty source file"); - finish_file (); - } - | extdefs - { - /* In case there were missing closebraces, - get us back to the global binding level. */ - while (! global_bindings_p ()) - poplevel (0, 0, 0); - finish_file (); - } - ; - -/* the reason for the strange actions in this rule - is so that notype_initdecls when reached via datadef - can find a valid list of type and sc specs in $0. */ - -extdefs: - {$<ttype>$ = NULL_TREE; } extdef - | extdefs {$<ttype>$ = NULL_TREE; } extdef - ; - -extdef: - fndef - | datadef - | objcdef - | ASM_KEYWORD '(' expr ')' ';' - { STRIP_NOPS ($3); - if ((TREE_CODE ($3) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST) - || TREE_CODE ($3) == STRING_CST) - assemble_asm ($3); - else - error ("argument of `asm' is not a constant string"); } - | extension extdef - { pedantic = $<itype>1; } - ; - -datadef: - setspecs notype_initdecls ';' - { if (pedantic) - error ("ANSI C forbids data definition with no type or storage class"); - else if (!flag_traditional) - warning ("data definition has no type or storage class"); - - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - | declmods setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods ';' - { pedwarn ("empty declaration"); } - | typed_declspecs ';' - { shadow_tag ($1); } - | error ';' - | error '}' - | ';' - { if (pedantic) - pedwarn ("ANSI C does not allow extra `;' outside of a function"); } - ; - -fndef: - typed_declspecs setspecs declarator - { if (! start_function (current_declspecs, $3, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator - { if (! start_function (current_declspecs, $3, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | setspecs notype_declarator - { if (! start_function (NULL_TREE, $2, - prefix_attributes, NULL_TREE, 0)) - YYERROR1; - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } - compstmt_or_error - { finish_function (0); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - | setspecs notype_declarator error - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($1); } - ; - -identifier: - IDENTIFIER - | TYPENAME - | OBJECTNAME - | CLASSNAME - ; - -unop: '&' - { $$ = ADDR_EXPR; } - | '-' - { $$ = NEGATE_EXPR; } - | '+' - { $$ = CONVERT_EXPR; } - | PLUSPLUS - { $$ = PREINCREMENT_EXPR; } - | MINUSMINUS - { $$ = PREDECREMENT_EXPR; } - | '~' - { $$ = BIT_NOT_EXPR; } - | '!' - { $$ = TRUTH_NOT_EXPR; } - ; - -expr: nonnull_exprlist - { $$ = build_compound_expr ($1); } - ; - -exprlist: - /* empty */ - { $$ = NULL_TREE; } - | nonnull_exprlist - ; - -nonnull_exprlist: - expr_no_commas - { $$ = build_tree_list (NULL_TREE, $1); } - | nonnull_exprlist ',' expr_no_commas - { chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -unary_expr: - primary - | '*' cast_expr %prec UNARY - { $$ = build_indirect_ref ($2, "unary *"); } - /* __extension__ turns off -pedantic for following primary. */ - | extension cast_expr %prec UNARY - { $$ = $2; - pedantic = $<itype>1; } - | unop cast_expr %prec UNARY - { $$ = build_unary_op ($1, $2, 0); - overflow_warning ($$); } - /* Refer to the address of a label as a pointer. */ - | ANDAND identifier - { tree label = lookup_label ($2); - if (pedantic) - pedwarn ("ANSI C forbids `&&'"); - if (label == 0) - $$ = null_pointer_node; - else - { - TREE_USED (label) = 1; - $$ = build1 (ADDR_EXPR, ptr_type_node, label); - TREE_CONSTANT ($$) = 1; - } - } -/* This seems to be impossible on some machines, so let's turn it off. - You can use __builtin_next_arg to find the anonymous stack args. - | '&' ELLIPSIS - { tree types = TYPE_ARG_TYPES (TREE_TYPE (current_function_decl)); - $$ = error_mark_node; - if (TREE_VALUE (tree_last (types)) == void_type_node) - error ("`&...' used in function with fixed number of arguments"); - else - { - if (pedantic) - pedwarn ("ANSI C forbids `&...'"); - $$ = tree_last (DECL_ARGUMENTS (current_function_decl)); - $$ = build_unary_op (ADDR_EXPR, $$, 0); - } } -*/ - | sizeof unary_expr %prec UNARY - { skip_evaluation--; - if (TREE_CODE ($2) == COMPONENT_REF - && DECL_BIT_FIELD (TREE_OPERAND ($2, 1))) - error ("`sizeof' applied to a bit-field"); - $$ = c_sizeof (TREE_TYPE ($2)); } - | sizeof '(' typename ')' %prec HYPERUNARY - { skip_evaluation--; - $$ = c_sizeof (groktypename ($3)); } - | alignof unary_expr %prec UNARY - { skip_evaluation--; - $$ = c_alignof_expr ($2); } - | alignof '(' typename ')' %prec HYPERUNARY - { skip_evaluation--; - $$ = c_alignof (groktypename ($3)); } - | REALPART cast_expr %prec UNARY - { $$ = build_unary_op (REALPART_EXPR, $2, 0); } - | IMAGPART cast_expr %prec UNARY - { $$ = build_unary_op (IMAGPART_EXPR, $2, 0); } - ; - -sizeof: - SIZEOF { skip_evaluation++; } - ; - -alignof: - ALIGNOF { skip_evaluation++; } - ; - -cast_expr: - unary_expr - | '(' typename ')' cast_expr %prec UNARY - { tree type = groktypename ($2); - $$ = build_c_cast (type, $4); } - | '(' typename ')' '{' - { start_init (NULL_TREE, NULL, 0); - $2 = groktypename ($2); - really_start_incremental_init ($2); } - initlist_maybe_comma '}' %prec UNARY - { char *name; - tree result = pop_init_level (0); - tree type = $2; - finish_init (); - - if (pedantic) - pedwarn ("ANSI C forbids constructor expressions"); - if (TYPE_NAME (type) != 0) - { - if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) - name = IDENTIFIER_POINTER (TYPE_NAME (type)); - else - name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); - } - else - name = ""; - $$ = result; - if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) - { - int failure = complete_array_type (type, $$, 1); - if (failure) - abort (); - } - } - ; - -expr_no_commas: - cast_expr - | expr_no_commas '+' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '-' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '*' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '/' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '%' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas LSHIFT expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas RSHIFT expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas ARITHCOMPARE expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas EQCOMPARE expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '&' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '|' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas '^' expr_no_commas - { $$ = parser_build_binary_op ($2, $1, $3); } - | expr_no_commas ANDAND - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_false_node; } - expr_no_commas - { skip_evaluation -= $1 == boolean_false_node; - $$ = parser_build_binary_op (TRUTH_ANDIF_EXPR, $1, $4); } - | expr_no_commas OROR - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_true_node; } - expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = parser_build_binary_op (TRUTH_ORIF_EXPR, $1, $4); } - | expr_no_commas '?' - { $1 = truthvalue_conversion (default_conversion ($1)); - skip_evaluation += $1 == boolean_false_node; } - expr ':' - { skip_evaluation += (($1 == boolean_true_node) - - ($1 == boolean_false_node)); } - expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = build_conditional_expr ($1, $4, $7); } - | expr_no_commas '?' - { if (pedantic) - pedwarn ("ANSI C forbids omitting the middle term of a ?: expression"); - /* Make sure first operand is calculated only once. */ - $<ttype>2 = save_expr ($1); - $1 = truthvalue_conversion (default_conversion ($<ttype>2)); - skip_evaluation += $1 == boolean_true_node; } - ':' expr_no_commas - { skip_evaluation -= $1 == boolean_true_node; - $$ = build_conditional_expr ($1, $<ttype>2, $5); } - | expr_no_commas '=' expr_no_commas - { $$ = build_modify_expr ($1, NOP_EXPR, $3); - C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); } - | expr_no_commas ASSIGN expr_no_commas - { $$ = build_modify_expr ($1, $2, $3); - /* This inhibits warnings in truthvalue_conversion. */ - C_SET_EXP_ORIGINAL_CODE ($$, ERROR_MARK); } - ; - -primary: - IDENTIFIER - { - $$ = lastiddecl; - if (!$$ || $$ == error_mark_node) - { - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - tree decl; - - if (objc_receiver_context - && ! (objc_receiver_context - && strcmp (IDENTIFIER_POINTER ($1), "super"))) - /* we have a message to super */ - $$ = get_super_receiver (); - else if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, $1))) - { - if (is_private (decl)) - $$ = error_mark_node; - else - $$ = build_ivar_reference ($1); - } - else - { - /* Ordinary implicit function declaration. */ - $$ = implicitly_declare ($1); - assemble_external ($$); - TREE_USED ($$) = 1; - } - } - else if (current_function_decl == 0) - { - error ("`%s' undeclared here (not in a function)", - IDENTIFIER_POINTER ($1)); - $$ = error_mark_node; - } - else - { - tree decl; - - if (objc_receiver_context - && ! strcmp (IDENTIFIER_POINTER ($1), "super")) - /* we have a message to super */ - $$ = get_super_receiver (); - else if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, $1))) - { - if (is_private (decl)) - $$ = error_mark_node; - else - $$ = build_ivar_reference ($1); - } - else - { - if (IDENTIFIER_GLOBAL_VALUE ($1) != error_mark_node - || IDENTIFIER_ERROR_LOCUS ($1) != current_function_decl) - { - error ("`%s' undeclared (first use this function)", - IDENTIFIER_POINTER ($1)); - - if (! undeclared_variable_notice) - { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); - undeclared_variable_notice = 1; - } - } - $$ = error_mark_node; - /* Prevent repeated error messages. */ - IDENTIFIER_GLOBAL_VALUE ($1) = error_mark_node; - IDENTIFIER_ERROR_LOCUS ($1) = current_function_decl; - } - } - } - else if (TREE_TYPE ($$) == error_mark_node) - $$ = error_mark_node; - else if (C_DECL_ANTICIPATED ($$)) - { - /* The first time we see a build-in function used, - if it has not been declared. */ - C_DECL_ANTICIPATED ($$) = 0; - if (yychar == YYEMPTY) - yychar = YYLEX; - if (yychar == '(') - { - /* Omit the implicit declaration we - would ordinarily do, so we don't lose - the actual built in type. - But print a diagnostic for the mismatch. */ - if (objc_method_context - && is_ivar (objc_ivar_chain, $1)) - error ("Instance variable `%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME ($$))); - else - if (TREE_CODE ($$) != FUNCTION_DECL) - error ("`%s' implicitly declared as function", - IDENTIFIER_POINTER (DECL_NAME ($$))); - else if ((TYPE_MODE (TREE_TYPE (TREE_TYPE ($$))) - != TYPE_MODE (integer_type_node)) - && (TREE_TYPE (TREE_TYPE ($$)) - != void_type_node)) - pedwarn ("type mismatch in implicit declaration for built-in function `%s'", - IDENTIFIER_POINTER (DECL_NAME ($$))); - /* If it really returns void, change that to int. */ - if (TREE_TYPE (TREE_TYPE ($$)) == void_type_node) - TREE_TYPE ($$) - = build_function_type (integer_type_node, - TYPE_ARG_TYPES (TREE_TYPE ($$))); - } - else - pedwarn ("built-in function `%s' used without declaration", - IDENTIFIER_POINTER (DECL_NAME ($$))); - - /* Do what we would ordinarily do when a fn is used. */ - assemble_external ($$); - TREE_USED ($$) = 1; - } - else - { - assemble_external ($$); - TREE_USED ($$) = 1; - /* we have a definition - still check if iVariable */ - - if (!objc_receiver_context - || (objc_receiver_context - && strcmp (IDENTIFIER_POINTER ($1), "super"))) - { - tree decl; - - if (objc_method_context - && (decl = is_ivar (objc_ivar_chain, $1))) - { - if (IDENTIFIER_LOCAL_VALUE ($1)) - warning ("local declaration of `%s' hides instance variable", - IDENTIFIER_POINTER ($1)); - else - { - if (is_private (decl)) - $$ = error_mark_node; - else - $$ = build_ivar_reference ($1); - } - } - } - else /* we have a message to super */ - $$ = get_super_receiver (); - } - - if (TREE_CODE ($$) == CONST_DECL) - { - $$ = DECL_INITIAL ($$); - /* This is to prevent an enum whose value is 0 - from being considered a null pointer constant. */ - $$ = build1 (NOP_EXPR, TREE_TYPE ($$), $$); - TREE_CONSTANT ($$) = 1; - } - } - | CONSTANT - | string - { $$ = combine_strings ($1); } - | '(' expr ')' - { char class = TREE_CODE_CLASS (TREE_CODE ($2)); - if (class == 'e' || class == '1' - || class == '2' || class == '<') - C_SET_EXP_ORIGINAL_CODE ($2, ERROR_MARK); - $$ = $2; } - | '(' error ')' - { $$ = error_mark_node; } - | '(' - { if (current_function_decl == 0) - { - error ("braced-group within expression allowed only inside a function"); - YYERROR; - } - /* We must force a BLOCK for this level - so that, if it is not expanded later, - there is a way to turn off the entire subtree of blocks - that are contained in it. */ - keep_next_level (); - push_iterator_stack (); - push_label_level (); - $<ttype>$ = expand_start_stmt_expr (); } - compstmt ')' - { tree rtl_exp; - if (pedantic) - pedwarn ("ANSI C forbids braced-groups within expressions"); - pop_iterator_stack (); - pop_label_level (); - rtl_exp = expand_end_stmt_expr ($<ttype>2); - /* The statements have side effects, so the group does. */ - TREE_SIDE_EFFECTS (rtl_exp) = 1; - - if (TREE_CODE ($3) == BLOCK) - { - /* Make a BIND_EXPR for the BLOCK already made. */ - $$ = build (BIND_EXPR, TREE_TYPE (rtl_exp), - NULL_TREE, rtl_exp, $3); - /* Remove the block from the tree at this point. - It gets put back at the proper place - when the BIND_EXPR is expanded. */ - delete_block ($3); - } - else - $$ = $3; - } - | primary '(' exprlist ')' %prec '.' - { $$ = build_function_call ($1, $3); } - | primary '[' expr ']' %prec '.' - { $$ = build_array_ref ($1, $3); } - | primary '.' identifier - { - if (doing_objc_thang) - { - if (is_public ($1, $3)) - $$ = build_component_ref ($1, $3); - else - $$ = error_mark_node; - } - else - $$ = build_component_ref ($1, $3); - } - | primary POINTSAT identifier - { - tree expr = build_indirect_ref ($1, "->"); - - if (doing_objc_thang) - { - if (is_public (expr, $3)) - $$ = build_component_ref (expr, $3); - else - $$ = error_mark_node; - } - else - $$ = build_component_ref (expr, $3); - } - | primary PLUSPLUS - { $$ = build_unary_op (POSTINCREMENT_EXPR, $1, 0); } - | primary MINUSMINUS - { $$ = build_unary_op (POSTDECREMENT_EXPR, $1, 0); } - | objcmessageexpr - { $$ = build_message_expr ($1); } - | objcselectorexpr - { $$ = build_selector_expr ($1); } - | objcprotocolexpr - { $$ = build_protocol_expr ($1); } - | objcencodeexpr - { $$ = build_encode_expr ($1); } - | objc_string - { $$ = build_objc_string_object ($1); } - ; - -/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ -string: - STRING - | string STRING - { $$ = chainon ($1, $2); } - ; - -/* Produces an OBJC_STRING_CST with perhaps more OBJC_STRING_CSTs chained - onto it. */ -objc_string: - OBJC_STRING - | objc_string OBJC_STRING - { $$ = chainon ($1, $2); } - ; - -old_style_parm_decls: - /* empty */ - | datadecls - | datadecls ELLIPSIS - /* ... is used here to indicate a varargs function. */ - { c_mark_varargs (); - if (pedantic) - pedwarn ("ANSI C does not permit use of `varargs.h'"); } - ; - -/* The following are analogous to lineno_decl, decls and decl - except that they do not allow nested functions. - They are used for old-style parm decls. */ -lineno_datadecl: - save_filename save_lineno datadecl - { } - ; - -datadecls: - lineno_datadecl - | errstmt - | datadecls lineno_datadecl - | lineno_datadecl errstmt - ; - -/* We don't allow prefix attributes here because they cause reduce/reduce - conflicts: we can't know whether we're parsing a function decl with - attribute suffix, or function defn with attribute prefix on first old - style parm. */ -datadecl: - typed_declspecs_no_prefix_attr setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods_no_prefix_attr setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs_no_prefix_attr ';' - { shadow_tag_warned ($1, 1); - pedwarn ("empty declaration"); } - | declmods_no_prefix_attr ';' - { pedwarn ("empty declaration"); } - ; - -/* This combination which saves a lineno before a decl - is the normal thing to use, rather than decl itself. - This is to avoid shift/reduce conflicts in contexts - where statement labels are allowed. */ -lineno_decl: - save_filename save_lineno decl - { } - ; - -decls: - lineno_decl - | errstmt - | decls lineno_decl - | lineno_decl errstmt - ; - -/* records the type and storage class specs to use for processing - the declarators that follow. - Maintains a stack of outer-level values of current_declspecs, - for the sake of parm declarations nested in function declarators. */ -setspecs: /* empty */ - { $$ = suspend_momentary (); - pending_xref_error (); - declspec_stack = tree_cons (prefix_attributes, - current_declspecs, - declspec_stack); - split_specs_attrs ($<ttype>0, - ¤t_declspecs, &prefix_attributes); } - ; - -/* ??? Yuck. See after_type_declarator. */ -setattrs: /* empty */ - { prefix_attributes = chainon (prefix_attributes, $<ttype>0); } - ; - -decl: - typed_declspecs setspecs initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_initdecls ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs nested_function - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_nested_function - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs ';' - { shadow_tag ($1); } - | declmods ';' - { pedwarn ("empty declaration"); } - | extension decl - { pedantic = $<itype>1; } - ; - -/* Declspecs which contain at least one type specifier or typedef name. - (Just `const' or `volatile' is not enough.) - A typedef'd name following these is taken as a name to be declared. - Declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -typed_declspecs: - typespec reserved_declspecs - { $$ = tree_cons (NULL_TREE, $1, $2); } - | declmods typespec reserved_declspecs - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_declspecs: /* empty */ - { $$ = NULL_TREE; } - | reserved_declspecs typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs attributes - { $$ = tree_cons ($2, NULL_TREE, $1); } - ; - -typed_declspecs_no_prefix_attr: - typespec reserved_declspecs_no_prefix_attr - { $$ = tree_cons (NULL_TREE, $1, $2); } - | declmods_no_prefix_attr typespec reserved_declspecs_no_prefix_attr - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_declspecs_no_prefix_attr: - /* empty */ - { $$ = NULL_TREE; } - | reserved_declspecs_no_prefix_attr typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - | reserved_declspecs_no_prefix_attr SCSPEC - { if (extra_warnings) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -/* List of just storage classes, type modifiers, and prefix attributes. - A declaration can start with just this, but then it cannot be used - to redeclare a typedef-name. - Declspecs have a non-NULL TREE_VALUE, attributes do not. */ - -declmods: - declmods_no_prefix_attr - { $$ = $1; } - | attributes - { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); } - | declmods declmods_no_prefix_attr - { $$ = chainon ($2, $1); } - | declmods attributes - { $$ = tree_cons ($2, NULL_TREE, $1); } - ; - -declmods_no_prefix_attr: - TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); - TREE_STATIC ($$) = 1; } - | SCSPEC - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } - | declmods_no_prefix_attr TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); - TREE_STATIC ($$) = 1; } - | declmods_no_prefix_attr SCSPEC - { if (extra_warnings && TREE_STATIC ($1)) - warning ("`%s' is not at beginning of declaration", - IDENTIFIER_POINTER ($2)); - $$ = tree_cons (NULL_TREE, $2, $1); - TREE_STATIC ($$) = TREE_STATIC ($1); } - ; - - -/* Used instead of declspecs where storage classes are not allowed - (that is, for typenames and structure components). - Don't accept a typedef-name if anything but a modifier precedes it. */ - -typed_typespecs: - typespec reserved_typespecquals - { $$ = tree_cons (NULL_TREE, $1, $2); } - | nonempty_type_quals typespec reserved_typespecquals - { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } - ; - -reserved_typespecquals: /* empty */ - { $$ = NULL_TREE; } - | reserved_typespecquals typespecqual_reserved - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -/* A typespec (but not a type qualifier). - Once we have seen one of these in a declaration, - if a typedef name appears then it is being redeclared. */ - -typespec: TYPESPEC - | structsp - | TYPENAME - { /* For a typedef name, record the meaning, not the name. - In case of `foo foo, bar;'. */ - $$ = lookup_name ($1); } - | CLASSNAME protocolrefs - { $$ = get_static_reference ($1, $2); } - | OBJECTNAME protocolrefs - { $$ = get_object_reference ($2); } - -/* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" - - nisse@lysator.liu.se */ - | non_empty_protocolrefs - { $$ = get_object_reference ($1); } - | TYPEOF '(' expr ')' - { $$ = TREE_TYPE ($3); } - | TYPEOF '(' typename ')' - { $$ = groktypename ($3); } - ; - -/* A typespec that is a reserved word, or a type qualifier. */ - -typespecqual_reserved: TYPESPEC - | TYPE_QUAL - | structsp - ; - -initdecls: - initdcl - | initdecls ',' initdcl - ; - -notype_initdecls: - notype_initdcl - | notype_initdecls ',' initdcl - ; - -maybeasm: - /* empty */ - { $$ = NULL_TREE; } - | ASM_KEYWORD '(' string ')' - { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); - $$ = $3; - } - ; - -initdcl: - declarator maybeasm maybe_attribute '=' - { $<ttype>$ = start_decl ($1, current_declspecs, 1, - $3, prefix_attributes); - start_init ($<ttype>$, $2, global_bindings_p ()); } - init -/* Note how the declaration of the variable is in effect while its init is parsed! */ - { finish_init (); - finish_decl ($<ttype>5, $6, $2); } - | declarator maybeasm maybe_attribute - { tree d = start_decl ($1, current_declspecs, 0, - $3, prefix_attributes); - finish_decl (d, NULL_TREE, $2); - } - ; - -notype_initdcl: - notype_declarator maybeasm maybe_attribute '=' - { $<ttype>$ = start_decl ($1, current_declspecs, 1, - $3, prefix_attributes); - start_init ($<ttype>$, $2, global_bindings_p ()); } - init -/* Note how the declaration of the variable is in effect while its init is parsed! */ - { finish_init (); - decl_attributes ($<ttype>5, $3, prefix_attributes); - finish_decl ($<ttype>5, $6, $2); } - | notype_declarator maybeasm maybe_attribute - { tree d = start_decl ($1, current_declspecs, 0, - $3, prefix_attributes); - finish_decl (d, NULL_TREE, $2); } - ; -/* the * rules are dummies to accept the Apollo extended syntax - so that the header files compile. */ -maybe_attribute: - /* empty */ - { $$ = NULL_TREE; } - | attributes - { $$ = $1; } - ; - -attributes: - attribute - { $$ = $1; } - | attributes attribute - { $$ = chainon ($1, $2); } - ; - -attribute: - ATTRIBUTE '(' '(' attribute_list ')' ')' - { $$ = $4; } - ; - -attribute_list: - attrib - { $$ = $1; } - | attribute_list ',' attrib - { $$ = chainon ($1, $3); } - ; - -attrib: - /* empty */ - { $$ = NULL_TREE; } - | any_word - { $$ = build_tree_list ($1, NULL_TREE); } - | any_word '(' IDENTIFIER ')' - { $$ = build_tree_list ($1, build_tree_list (NULL_TREE, $3)); } - | any_word '(' IDENTIFIER ',' nonnull_exprlist ')' - { $$ = build_tree_list ($1, tree_cons (NULL_TREE, $3, $5)); } - | any_word '(' exprlist ')' - { $$ = build_tree_list ($1, $3); } - ; - -/* This still leaves out most reserved keywords, - shouldn't we include them? */ - -any_word: - identifier - | SCSPEC - | TYPESPEC - | TYPE_QUAL - ; - -/* Initializers. `init' is the entry point. */ - -init: - expr_no_commas - | '{' - { really_start_incremental_init (NULL_TREE); - /* Note that the call to clear_momentary - is in process_init_element. */ - push_momentary (); } - initlist_maybe_comma '}' - { $$ = pop_init_level (0); - if ($$ == error_mark_node - && ! (yychar == STRING || yychar == CONSTANT)) - pop_momentary (); - else - pop_momentary_nofree (); } - - | error - { $$ = error_mark_node; } - ; - -/* `initlist_maybe_comma' is the guts of an initializer in braces. */ -initlist_maybe_comma: - /* empty */ - { if (pedantic) - pedwarn ("ANSI C forbids empty initializer braces"); } - | initlist1 maybecomma - ; - -initlist1: - initelt - | initlist1 ',' initelt - ; - -/* `initelt' is a single element of an initializer. - It may use braces. */ -initelt: - expr_no_commas - { process_init_element ($1); } - | '{' - { push_init_level (0); } - initlist_maybe_comma '}' - { process_init_element (pop_init_level (0)); } - | error - /* These are for labeled elements. The syntax for an array element - initializer conflicts with the syntax for an Objective-C message, - so don't include these productions in the Objective-C grammar. */ - | identifier ':' - { set_init_label ($1); } - initelt - | '.' identifier '=' - { set_init_label ($2); } - initelt - ; - -nested_function: - declarator - { push_c_function_context (); - if (! start_function (current_declspecs, $1, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } -/* This used to use compstmt_or_error. - That caused a bug with input `f(g) int g {}', - where the use of YYERROR1 above caused an error - which then was handled by compstmt_or_error. - There followed a repeated execution of that same rule, - which called YYERROR1 again, and so on. */ - compstmt - { finish_function (1); - pop_c_function_context (); } - ; - -notype_nested_function: - notype_declarator - { push_c_function_context (); - if (! start_function (current_declspecs, $1, - prefix_attributes, NULL_TREE, 1)) - { - pop_c_function_context (); - YYERROR1; - } - reinit_parse_for_function (); } - old_style_parm_decls - { store_parm_decls (); } -/* This used to use compstmt_or_error. - That caused a bug with input `f(g) int g {}', - where the use of YYERROR1 above caused an error - which then was handled by compstmt_or_error. - There followed a repeated execution of that same rule, - which called YYERROR1 again, and so on. */ - compstmt - { finish_function (1); - pop_c_function_context (); } - ; - -/* Any kind of declarator (thus, all declarators allowed - after an explicit typespec). */ - -declarator: - after_type_declarator - | notype_declarator - ; - -/* A declarator that is allowed only after an explicit typespec. */ - -after_type_declarator: - '(' after_type_declarator ')' - { $$ = $2; } - | after_type_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | after_type_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | after_type_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | after_type_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '*' type_quals after_type_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs after_type_declarator - { $$ = $3; } - | TYPENAME - | OBJECTNAME - ; - -/* Kinds of declarator that can appear in a parameter list - in addition to notype_declarator. This is like after_type_declarator - but does not allow a typedef name in parentheses as an identifier - (because it would conflict with a function with that typedef as arg). */ - -parm_declarator: - parm_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | parm_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | parm_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | parm_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '*' type_quals parm_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs parm_declarator - { $$ = $3; } - | TYPENAME - ; - -/* A declarator allowed whether or not there has been - an explicit typespec. These cannot redeclare a typedef-name. */ - -notype_declarator: - notype_declarator '(' parmlist_or_identifiers %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } -/* | notype_declarator '(' error ')' %prec '.' - { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); - poplevel (0, 0, 0); } */ - | '(' notype_declarator ')' - { $$ = $2; } - | '*' type_quals notype_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - | notype_declarator '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | notype_declarator '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - /* ??? Yuck. setattrs is a quick hack. We can't use - prefix_attributes because $1 only applies to this - declarator. We assume setspecs has already been done. - setattrs also avoids 5 reduce/reduce conflicts (otherwise multiple - attributes could be recognized here or in `attributes'). */ - | attributes setattrs notype_declarator - { $$ = $3; } - | IDENTIFIER - ; - -structsp: - STRUCT identifier '{' - { $$ = start_struct (RECORD_TYPE, $2); - /* Start scope of tag before parsing components. */ - } - component_decl_list '}' maybe_attribute - { $$ = finish_struct ($<ttype>4, $5, $7); } - | STRUCT '{' component_decl_list '}' maybe_attribute - { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), - $3, $5); - } - | STRUCT identifier - { $$ = xref_tag (RECORD_TYPE, $2); } - | UNION identifier '{' - { $$ = start_struct (UNION_TYPE, $2); } - component_decl_list '}' maybe_attribute - { $$ = finish_struct ($<ttype>4, $5, $7); } - | UNION '{' component_decl_list '}' maybe_attribute - { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE), - $3, $5); - } - | UNION identifier - { $$ = xref_tag (UNION_TYPE, $2); } - | ENUM identifier '{' - { $<itype>3 = suspend_momentary (); - $$ = start_enum ($2); } - enumlist maybecomma_warn '}' maybe_attribute - { $$ = finish_enum ($<ttype>4, nreverse ($5), $8); - resume_momentary ($<itype>3); } - | ENUM '{' - { $<itype>2 = suspend_momentary (); - $$ = start_enum (NULL_TREE); } - enumlist maybecomma_warn '}' maybe_attribute - { $$ = finish_enum ($<ttype>3, nreverse ($4), $7); - resume_momentary ($<itype>2); } - | ENUM identifier - { $$ = xref_tag (ENUMERAL_TYPE, $2); } - ; - -maybecomma: - /* empty */ - | ',' - ; - -maybecomma_warn: - /* empty */ - | ',' - { if (pedantic) pedwarn ("comma at end of enumerator list"); } - ; - -component_decl_list: - component_decl_list2 - { $$ = $1; } - | component_decl_list2 component_decl - { $$ = chainon ($1, $2); - pedwarn ("no semicolon at end of struct or union"); } - ; - -component_decl_list2: /* empty */ - { $$ = NULL_TREE; } - | component_decl_list2 component_decl ';' - { $$ = chainon ($1, $2); } - | component_decl_list2 ';' - { if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); } - /* foo(sizeof(struct{ @defs(ClassName)})); */ - | DEFS '(' CLASSNAME ')' - { - tree interface = lookup_interface ($3); - - if (interface) - $$ = get_class_ivars (interface); - else - { - error ("Cannot find interface declaration for `%s'", - IDENTIFIER_POINTER ($3)); - $$ = NULL_TREE; - } - } - ; - -/* There is a shift-reduce conflict here, because `components' may - start with a `typename'. It happens that shifting (the default resolution) - does the right thing, because it treats the `typename' as part of - a `typed_typespecs'. - - It is possible that this same technique would allow the distinction - between `notype_initdecls' and `initdecls' to be eliminated. - But I am being cautious and not trying it. */ - -component_decl: - typed_typespecs setspecs components - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_typespecs - { if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag($1); - $$ = NULL_TREE; } - | nonempty_type_quals setspecs components - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | nonempty_type_quals - { if (pedantic) - pedwarn ("ANSI C forbids member declarations with no members"); - shadow_tag($1); - $$ = NULL_TREE; } - | error - { $$ = NULL_TREE; } - | extension component_decl - { $$ = $2; - pedantic = $<itype>1; } - ; - -components: - component_declarator - | components ',' component_declarator - { $$ = chainon ($1, $3); } - ; - -component_declarator: - save_filename save_lineno declarator maybe_attribute - { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); - decl_attributes ($$, $4, prefix_attributes); } - | save_filename save_lineno - declarator ':' expr_no_commas maybe_attribute - { $$ = grokfield ($1, $2, $3, current_declspecs, $5); - decl_attributes ($$, $6, prefix_attributes); } - | save_filename save_lineno ':' expr_no_commas maybe_attribute - { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); - decl_attributes ($$, $5, prefix_attributes); } - ; - -/* We chain the enumerators in reverse order. - They are put in forward order where enumlist is used. - (The order used to be significant, but no longer is so. - However, we still maintain the order, just to be clean.) */ - -enumlist: - enumerator - | enumlist ',' enumerator - { if ($1 == error_mark_node) - $$ = $1; - else - $$ = chainon ($3, $1); } - | error - { $$ = error_mark_node; } - ; - - -enumerator: - identifier - { $$ = build_enumerator ($1, NULL_TREE); } - | identifier '=' expr_no_commas - { $$ = build_enumerator ($1, $3); } - ; - -typename: - typed_typespecs absdcl - { $$ = build_tree_list ($1, $2); } - | nonempty_type_quals absdcl - { $$ = build_tree_list ($1, $2); } - ; - -absdcl: /* an absolute declarator */ - /* empty */ - { $$ = NULL_TREE; } - | absdcl1 - ; - -nonempty_type_quals: - TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } - | nonempty_type_quals TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -type_quals: - /* empty */ - { $$ = NULL_TREE; } - | type_quals TYPE_QUAL - { $$ = tree_cons (NULL_TREE, $2, $1); } - ; - -absdcl1: /* a nonempty absolute declarator */ - '(' absdcl1 ')' - { $$ = $2; } - /* `(typedef)1' is `int'. */ - | '*' type_quals absdcl1 %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } - | '*' type_quals %prec UNARY - { $$ = make_pointer_declarator ($2, NULL_TREE); } - | absdcl1 '(' parmlist %prec '.' - { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } - | absdcl1 '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, $3); } - | absdcl1 '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '(' parmlist %prec '.' - { $$ = build_nt (CALL_EXPR, NULL_TREE, $2, NULL_TREE); } - | '[' expr ']' %prec '.' - { $$ = build_nt (ARRAY_REF, NULL_TREE, $2); } - | '[' ']' %prec '.' - { $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); } - /* ??? It appears we have to support attributes here, however - using prefix_attributes is wrong. */ - ; - -/* at least one statement, the first of which parses without error. */ -/* stmts is used only after decls, so an invalid first statement - is actually regarded as an invalid decl and part of the decls. */ - -stmts: - lineno_stmt_or_labels - { - if (pedantic && $1) - pedwarn ("ANSI C forbids label at end of compound statement"); - } - ; - -lineno_stmt_or_labels: - lineno_stmt_or_label - | lineno_stmt_or_labels lineno_stmt_or_label - { $$ = $2; } - | lineno_stmt_or_labels errstmt - { $$ = 0; } - ; - -xstmts: - /* empty */ - | stmts - ; - -errstmt: error ';' - ; - -pushlevel: /* empty */ - { emit_line_note (input_filename, lineno); - pushlevel (0); - clear_last_expr (); - push_momentary (); - expand_start_bindings (0); - if (objc_method_context) - add_objc_decls (); - } - ; - -/* Read zero or more forward-declarations for labels - that nested functions can jump to. */ -maybe_label_decls: - /* empty */ - | label_decls - { if (pedantic) - pedwarn ("ANSI C forbids label declarations"); } - ; - -label_decls: - label_decl - | label_decls label_decl - ; - -label_decl: - LABEL identifiers_or_typenames ';' - { tree link; - for (link = $2; link; link = TREE_CHAIN (link)) - { - tree label = shadow_label (TREE_VALUE (link)); - C_DECLARED_LABEL_FLAG (label) = 1; - declare_nonlocal_label (label); - } - } - ; - -/* This is the body of a function definition. - It causes syntax errors to ignore to the next openbrace. */ -compstmt_or_error: - compstmt - {} - | error compstmt - ; - -compstmt: '{' '}' - { $$ = convert (void_type_node, integer_zero_node); } - | '{' pushlevel maybe_label_decls decls xstmts '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - $$ = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | '{' pushlevel maybe_label_decls error '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - $$ = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | '{' pushlevel maybe_label_decls stmts '}' - { emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), kept_level_p (), 0); - $$ = poplevel (kept_level_p (), 0, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - ; - -/* Value is number of statements counted as of the closeparen. */ -simple_if: - if_prefix lineno_labeled_stmt -/* Make sure expand_end_cond is run once - for each call to expand_start_cond. - Otherwise a crash is likely. */ - | if_prefix error - ; - -if_prefix: - IF '(' expr ')' - { emit_line_note ($<filename>-1, $<lineno>0); - expand_start_cond (truthvalue_conversion ($3), 0); - $<itype>$ = stmt_count; - if_stmt_file = $<filename>-1; - if_stmt_line = $<lineno>0; - position_after_white_space (); } - ; - -/* This is a subroutine of stmt. - It is used twice, once for valid DO statements - and once for catching errors in parsing the end test. */ -do_stmt_start: - DO - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* See comment in `while' alternative, above. */ - emit_nop (); - expand_start_loop_continue_elsewhere (1); - position_after_white_space (); } - lineno_labeled_stmt WHILE - { expand_loop_continue_here (); } - ; - -save_filename: - { $$ = input_filename; } - ; - -save_lineno: - { $$ = lineno; } - ; - -lineno_labeled_stmt: - save_filename save_lineno stmt - { } -/* | save_filename save_lineno error - { } -*/ - | save_filename save_lineno label lineno_labeled_stmt - { } - ; - -lineno_stmt_or_label: - save_filename save_lineno stmt_or_label - { $$ = $3; } - ; - -stmt_or_label: - stmt - { $$ = 0; } - | label - { $$ = 1; } - ; - -/* Parse a single real statement, not including any labels. */ -stmt: - compstmt - { stmt_count++; } - | all_iter_stmt - | expr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); -/* It appears that this should not be done--that a non-lvalue array - shouldn't get an error if the value isn't used. - Section 3.2.2.1 says that an array lvalue gets converted to a pointer - if it appears as a top-level expression, - but says nothing about non-lvalue arrays. */ -#if 0 - /* Call default_conversion to get an error - on referring to a register array if pedantic. */ - if (TREE_CODE (TREE_TYPE ($1)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE ($1)) == FUNCTION_TYPE) - $1 = default_conversion ($1); -#endif - iterator_expand ($1); - clear_momentary (); } - | simple_if ELSE - { expand_start_else (); - $<itype>1 = stmt_count; - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_cond (); - if (extra_warnings && stmt_count == $<itype>1) - warning ("empty body in an else-statement"); } - | simple_if %prec IF - { expand_end_cond (); - /* This warning is here instead of in simple_if, because we - do not want a warning if an empty if is followed by an - else statement. Increment stmt_count so we don't - give a second error if this is a nested `if'. */ - if (extra_warnings && stmt_count++ == $<itype>1) - warning_with_file_and_line (if_stmt_file, if_stmt_line, - "empty body in an if-statement"); } -/* Make sure expand_end_cond is run once - for each call to expand_start_cond. - Otherwise a crash is likely. */ - | simple_if ELSE error - { expand_end_cond (); } - | WHILE - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* The emit_nop used to come before emit_line_note, - but that made the nop seem like part of the preceding line. - And that was confusing when the preceding line was - inside of an if statement and was not really executed. - I think it ought to work to put the nop after the line number. - We will see. --rms, July 15, 1991. */ - emit_nop (); } - '(' expr ')' - { /* Don't start the loop till we have succeeded - in parsing the end test. This is to make sure - that we end every loop we start. */ - expand_start_loop (1); - emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($4)); - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_loop (); } - | do_stmt_start - '(' expr ')' ';' - { emit_line_note (input_filename, lineno); - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($3)); - expand_end_loop (); - clear_momentary (); } -/* This rule is needed to make sure we end every loop we start. */ - | do_stmt_start error - { expand_end_loop (); - clear_momentary (); } - | FOR - '(' xexpr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - /* See comment in `while' alternative, above. */ - emit_nop (); - if ($3) c_expand_expr_stmt ($3); - /* Next step is to call expand_start_loop_continue_elsewhere, - but wait till after we parse the entire for (...). - Otherwise, invalid input might cause us to call that - fn without calling expand_end_loop. */ - } - xexpr ';' - /* Can't emit now; wait till after expand_start_loop... */ - { $<lineno>7 = lineno; - $<filename>$ = input_filename; } - xexpr ')' - { - /* Start the loop. Doing this after parsing - all the expressions ensures we will end the loop. */ - expand_start_loop_continue_elsewhere (1); - /* Emit the end-test, with a line number. */ - emit_line_note ($<filename>8, $<lineno>7); - if ($6) - expand_exit_loop_if_false (NULL_PTR, - truthvalue_conversion ($6)); - /* Don't let the tree nodes for $9 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - $<lineno>7 = lineno; - $<filename>8 = input_filename; - position_after_white_space (); } - lineno_labeled_stmt - { /* Emit the increment expression, with a line number. */ - emit_line_note ($<filename>8, $<lineno>7); - expand_loop_continue_here (); - if ($9) - c_expand_expr_stmt ($9); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - expand_end_loop (); } - | SWITCH '(' expr ')' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_start_case ($3); - /* Don't let the tree nodes for $3 be discarded by - clear_momentary during the parsing of the next stmt. */ - push_momentary (); - position_after_white_space (); } - lineno_labeled_stmt - { expand_end_case ($3); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); } - | BREAK ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - if ( ! expand_exit_something ()) - error ("break statement not within loop or switch"); } - | CONTINUE ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - if (! expand_continue_loop (NULL_PTR)) - error ("continue statement not within a loop"); } - | RETURN ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_return (NULL_TREE); } - | RETURN expr ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_return ($2); } - | ASM_KEYWORD maybe_type_qual '(' expr ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - STRIP_NOPS ($4); - if ((TREE_CODE ($4) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND ($4, 0)) == STRING_CST) - || TREE_CODE ($4) == STRING_CST) - expand_asm ($4); - else - error ("argument of `asm' is not a constant string"); } - /* This is the case with just output operands. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - /* This is the case with input operands as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' asm_operands ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, $8, NULL_TREE, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - /* This is the case with clobbered registers as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' - asm_operands ':' asm_clobbers ')' ';' - { stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - c_expand_asm_operands ($4, $6, $8, $10, - $2 == ridpointers[(int)RID_VOLATILE], - input_filename, lineno); } - | GOTO identifier ';' - { tree decl; - stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - decl = lookup_label ($2); - if (decl != 0) - { - TREE_USED (decl) = 1; - expand_goto (decl); - } - } - | GOTO '*' expr ';' - { if (pedantic) - pedwarn ("ANSI C forbids `goto *expr;'"); - stmt_count++; - emit_line_note ($<filename>-1, $<lineno>0); - expand_computed_goto (convert (ptr_type_node, $3)); } - | ';' - ; - -all_iter_stmt: - all_iter_stmt_simple -/* | all_iter_stmt_with_decl */ - ; - -all_iter_stmt_simple: - FOR '(' primary ')' - { - /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ - - $<itype>$ = 0; - if (TREE_CODE ($3) != VAR_DECL) - error ("invalid `for (ITERATOR)' syntax"); - else if (! ITERATOR_P ($3)) - error ("`%s' is not an iterator", - IDENTIFIER_POINTER (DECL_NAME ($3))); - else if (ITERATOR_BOUND_P ($3)) - error ("`for (%s)' inside expansion of same iterator", - IDENTIFIER_POINTER (DECL_NAME ($3))); - else - { - $<itype>$ = 1; - iterator_for_loop_start ($3); - } - } - lineno_labeled_stmt - { - if ($<itype>5) - iterator_for_loop_end ($3); - } - -/* This really should allow any kind of declaration, - for generality. Fix it before turning it back on. - -all_iter_stmt_with_decl: - FOR '(' ITERATOR pushlevel setspecs iterator_spec ')' - { -*/ /* The value returned by this action is */ - /* 1 if everything is OK */ - /* 0 in case of error or already bound iterator */ -/* - iterator_for_loop_start ($6); - } - lineno_labeled_stmt - { - iterator_for_loop_end ($6); - emit_line_note (input_filename, lineno); - expand_end_bindings (getdecls (), 1, 0); - $<ttype>$ = poplevel (1, 1, 0); - if (yychar == CONSTANT || yychar == STRING) - pop_momentary_nofree (); - else - pop_momentary (); - } -*/ - -/* Any kind of label, including jump labels and case labels. - ANSI C accepts labels only before statements, but we allow them - also at the end of a compound statement. */ - -label: CASE expr_no_commas ':' - { register tree value = check_case_value ($2); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - stmt_count++; - - if (value != error_mark_node) - { - tree duplicate; - int success = pushcase (value, convert_and_check, - label, &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); } - | CASE expr_no_commas ELLIPSIS expr_no_commas ':' - { register tree value1 = check_case_value ($2); - register tree value2 = check_case_value ($4); - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - - if (pedantic) - pedwarn ("ANSI C forbids case ranges"); - stmt_count++; - - if (value1 != error_mark_node && value2 != error_mark_node) - { - tree duplicate; - int success = pushcase_range (value1, value2, - convert_and_check, label, - &duplicate); - if (success == 1) - error ("case label not within a switch statement"); - else if (success == 2) - { - error ("duplicate case value"); - error_with_decl (duplicate, "this is the first entry for that value"); - } - else if (success == 3) - warning ("case value out of range"); - else if (success == 4) - warning ("empty case range"); - else if (success == 5) - error ("case label within scope of cleanup or variable array"); - } - position_after_white_space (); } - | DEFAULT ':' - { - tree duplicate; - register tree label - = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); - int success = pushcase (NULL_TREE, 0, label, &duplicate); - stmt_count++; - if (success == 1) - error ("default label not within a switch statement"); - else if (success == 2) - { - error ("multiple default labels in one switch"); - error_with_decl (duplicate, "this is the first default label"); - } - position_after_white_space (); } - | identifier ':' - { tree label = define_label (input_filename, lineno, $1); - stmt_count++; - emit_nop (); - if (label) - expand_label (label); - position_after_white_space (); } - ; - -/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ - -maybe_type_qual: - /* empty */ - { emit_line_note (input_filename, lineno); - $$ = NULL_TREE; } - | TYPE_QUAL - { emit_line_note (input_filename, lineno); } - ; - -xexpr: - /* empty */ - { $$ = NULL_TREE; } - | expr - ; - -/* These are the operands other than the first string and colon - in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ -asm_operands: /* empty */ - { $$ = NULL_TREE; } - | nonnull_asm_operands - ; - -nonnull_asm_operands: - asm_operand - | nonnull_asm_operands ',' asm_operand - { $$ = chainon ($1, $3); } - ; - -asm_operand: - STRING '(' expr ')' - { $$ = build_tree_list ($1, $3); } - ; - -asm_clobbers: - string - { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE); } - | asm_clobbers ',' string - { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); } - ; - -/* This is what appears inside the parens in a function declarator. - Its value is a list of ..._TYPE nodes. */ -parmlist: - { pushlevel (0); - clear_parm_order (); - declare_parm_level (0); } - parmlist_1 - { $$ = $2; - parmlist_tags_warning (); - poplevel (0, 0, 0); } - ; - -parmlist_1: - parmlist_2 ')' - | parms ';' - { tree parm; - if (pedantic) - pedwarn ("ANSI C forbids forward parameter declarations"); - /* Mark the forward decls as such. */ - for (parm = getdecls (); parm; parm = TREE_CHAIN (parm)) - TREE_ASM_WRITTEN (parm) = 1; - clear_parm_order (); } - parmlist_1 - { $$ = $4; } - | error ')' - { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } - ; - -/* This is what appears inside the parens in a function declarator. - Is value is represented in the format that grokdeclarator expects. */ -parmlist_2: /* empty */ - { $$ = get_parm_info (0); } - | ELLIPSIS - { $$ = get_parm_info (0); - /* Gcc used to allow this as an extension. However, it does - not work for all targets, and thus has been disabled. - Also, since func (...) and func () are indistinguishable, - it caused problems with the code in expand_builtin which - tries to verify that BUILT_IN_NEXT_ARG is being used - correctly. */ - error ("ANSI C requires a named argument before `...'"); - } - | parms - { $$ = get_parm_info (1); } - | parms ',' ELLIPSIS - { $$ = get_parm_info (0); } - ; - -parms: - parm - { push_parm_decl ($1); } - | parms ',' parm - { push_parm_decl ($3); } - ; - -/* A single parameter declaration or parameter type name, - as found in a parmlist. */ -parm: - typed_declspecs setspecs parm_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs notype_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs setspecs absdcl maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | declmods setspecs notype_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - - | declmods setspecs absdcl maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $3), - build_tree_list (prefix_attributes, - $4)); - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - ; - -/* This is used in a function definition - where either a parmlist or an identifier list is ok. - Its value is a list of ..._TYPE nodes or a list of identifiers. */ -parmlist_or_identifiers: - { pushlevel (0); - clear_parm_order (); - declare_parm_level (1); } - parmlist_or_identifiers_1 - { $$ = $2; - parmlist_tags_warning (); - poplevel (0, 0, 0); } - ; - -parmlist_or_identifiers_1: - parmlist_1 - | identifiers ')' - { tree t; - for (t = $1; t; t = TREE_CHAIN (t)) - if (TREE_VALUE (t) == NULL_TREE) - error ("`...' in old-style identifier list"); - $$ = tree_cons (NULL_TREE, NULL_TREE, $1); } - ; - -/* A nonempty list of identifiers. */ -identifiers: - IDENTIFIER - { $$ = build_tree_list (NULL_TREE, $1); } - | identifiers ',' IDENTIFIER - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -/* A nonempty list of identifiers, including typenames. */ -identifiers_or_typenames: - identifier - { $$ = build_tree_list (NULL_TREE, $1); } - | identifiers_or_typenames ',' identifier - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -extension: - EXTENSION - { $<itype>$ = pedantic; - pedantic = 0; } - ; - -/* Objective-C productions. */ - -objcdef: - classdef - | classdecl - | aliasdecl - | protocoldef - | methoddef - | END - { - if (objc_implementation_context) - { - finish_class (objc_implementation_context); - objc_ivar_chain = NULL_TREE; - objc_implementation_context = NULL_TREE; - } - else - warning ("`@end' must appear in an implementation context"); - } - ; - -/* A nonempty list of identifiers. */ -identifier_list: - identifier - { $$ = build_tree_list (NULL_TREE, $1); } - | identifier_list ',' identifier - { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } - ; - -classdecl: - CLASS identifier_list ';' - { - objc_declare_class ($2); - } - -aliasdecl: - ALIAS identifier identifier ';' - { - objc_declare_alias ($2, $3); - } - -classdef: - INTERFACE identifier protocolrefs '{' - { - objc_interface_context = objc_ivar_context - = start_class (CLASS_INTERFACE_TYPE, $2, NULL_TREE, $3); - objc_public_flag = 0; - } - ivar_decl_list '}' - { - continue_class (objc_interface_context); - } - methodprotolist - END - { - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - } - - | INTERFACE identifier protocolrefs - { - objc_interface_context - = start_class (CLASS_INTERFACE_TYPE, $2, NULL_TREE, $3); - continue_class (objc_interface_context); - } - methodprotolist - END - { - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - } - - | INTERFACE identifier ':' identifier protocolrefs '{' - { - objc_interface_context = objc_ivar_context - = start_class (CLASS_INTERFACE_TYPE, $2, $4, $5); - objc_public_flag = 0; - } - ivar_decl_list '}' - { - continue_class (objc_interface_context); - } - methodprotolist - END - { - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - } - - | INTERFACE identifier ':' identifier protocolrefs - { - objc_interface_context - = start_class (CLASS_INTERFACE_TYPE, $2, $4, $5); - continue_class (objc_interface_context); - } - methodprotolist - END - { - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - } - - | IMPLEMENTATION identifier '{' - { - objc_implementation_context = objc_ivar_context - = start_class (CLASS_IMPLEMENTATION_TYPE, $2, NULL_TREE, NULL_TREE); - objc_public_flag = 0; - } - ivar_decl_list '}' - { - objc_ivar_chain - = continue_class (objc_implementation_context); - } - - | IMPLEMENTATION identifier - { - objc_implementation_context - = start_class (CLASS_IMPLEMENTATION_TYPE, $2, NULL_TREE, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - } - - | IMPLEMENTATION identifier ':' identifier '{' - { - objc_implementation_context = objc_ivar_context - = start_class (CLASS_IMPLEMENTATION_TYPE, $2, $4, NULL_TREE); - objc_public_flag = 0; - } - ivar_decl_list '}' - { - objc_ivar_chain - = continue_class (objc_implementation_context); - } - - | IMPLEMENTATION identifier ':' identifier - { - objc_implementation_context - = start_class (CLASS_IMPLEMENTATION_TYPE, $2, $4, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - } - - | INTERFACE identifier '(' identifier ')' protocolrefs - { - objc_interface_context - = start_class (CATEGORY_INTERFACE_TYPE, $2, $4, $6); - continue_class (objc_interface_context); - } - methodprotolist - END - { - finish_class (objc_interface_context); - objc_interface_context = NULL_TREE; - } - - | IMPLEMENTATION identifier '(' identifier ')' - { - objc_implementation_context - = start_class (CATEGORY_IMPLEMENTATION_TYPE, $2, $4, NULL_TREE); - objc_ivar_chain - = continue_class (objc_implementation_context); - } - ; - -protocoldef: - PROTOCOL identifier protocolrefs - { - remember_protocol_qualifiers (); - objc_interface_context - = start_protocol(PROTOCOL_INTERFACE_TYPE, $2, $3); - } - methodprotolist END - { - forget_protocol_qualifiers(); - finish_protocol(objc_interface_context); - objc_interface_context = NULL_TREE; - } - ; - -protocolrefs: - /* empty */ - { - $$ = NULL_TREE; - } - | non_empty_protocolrefs - ; - -non_empty_protocolrefs: - ARITHCOMPARE identifier_list ARITHCOMPARE - { - if ($1 == LT_EXPR && $3 == GT_EXPR) - $$ = $2; - else - YYERROR1; - } - ; - -ivar_decl_list: - ivar_decl_list visibility_spec ivar_decls - | ivar_decls - ; - -visibility_spec: - PRIVATE { objc_public_flag = 2; } - | PROTECTED { objc_public_flag = 0; } - | PUBLIC { objc_public_flag = 1; } - ; - -ivar_decls: - /* empty */ - { - $$ = NULL_TREE; - } - | ivar_decls ivar_decl ';' - | ivar_decls ';' - { - if (pedantic) - pedwarn ("extra semicolon in struct or union specified"); - } - ; - - -/* There is a shift-reduce conflict here, because `components' may - start with a `typename'. It happens that shifting (the default resolution) - does the right thing, because it treats the `typename' as part of - a `typed_typespecs'. - - It is possible that this same technique would allow the distinction - between `notype_initdecls' and `initdecls' to be eliminated. - But I am being cautious and not trying it. */ - -ivar_decl: - typed_typespecs setspecs ivars - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | nonempty_type_quals setspecs ivars - { $$ = $3; - current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | error - { $$ = NULL_TREE; } - ; - -ivars: - /* empty */ - { $$ = NULL_TREE; } - | ivar_declarator - | ivars ',' ivar_declarator - ; - -ivar_declarator: - declarator - { - $$ = add_instance_variable (objc_ivar_context, - objc_public_flag, - $1, current_declspecs, - NULL_TREE); - } - | declarator ':' expr_no_commas - { - $$ = add_instance_variable (objc_ivar_context, - objc_public_flag, - $1, current_declspecs, $3); - } - | ':' expr_no_commas - { - $$ = add_instance_variable (objc_ivar_context, - objc_public_flag, - NULL_TREE, - current_declspecs, $2); - } - ; - -methoddef: - '+' - { - remember_protocol_qualifiers (); - if (objc_implementation_context) - objc_inherit_code = CLASS_METHOD_DECL; - else - fatal ("method definition not in class context"); - } - methoddecl - { - forget_protocol_qualifiers (); - add_class_method (objc_implementation_context, $3); - start_method_def ($3); - objc_method_context = $3; - } - optarglist - { - continue_method_def (); - } - compstmt_or_error - { - finish_method_def (); - objc_method_context = NULL_TREE; - } - - | '-' - { - remember_protocol_qualifiers (); - if (objc_implementation_context) - objc_inherit_code = INSTANCE_METHOD_DECL; - else - fatal ("method definition not in class context"); - } - methoddecl - { - forget_protocol_qualifiers (); - add_instance_method (objc_implementation_context, $3); - start_method_def ($3); - objc_method_context = $3; - } - optarglist - { - continue_method_def (); - } - compstmt_or_error - { - finish_method_def (); - objc_method_context = NULL_TREE; - } - ; - -/* the reason for the strange actions in this rule - is so that notype_initdecls when reached via datadef - can find a valid list of type and sc specs in $0. */ - -methodprotolist: - /* empty */ - | {$<ttype>$ = NULL_TREE; } methodprotolist2 - ; - -methodprotolist2: /* eliminates a shift/reduce conflict */ - methodproto - | datadef - | methodprotolist2 methodproto - | methodprotolist2 {$<ttype>$ = NULL_TREE; } datadef - ; - -semi_or_error: - ';' - | error - ; - -methodproto: - '+' - { - objc_inherit_code = CLASS_METHOD_DECL; - } - methoddecl - { - add_class_method (objc_interface_context, $3); - } - semi_or_error - - | '-' - { - objc_inherit_code = INSTANCE_METHOD_DECL; - } - methoddecl - { - add_instance_method (objc_interface_context, $3); - } - semi_or_error - ; - -methoddecl: - '(' typename ')' unaryselector - { - $$ = build_method_decl (objc_inherit_code, $2, $4, NULL_TREE); - } - - | unaryselector - { - $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, NULL_TREE); - } - - | '(' typename ')' keywordselector optparmlist - { - $$ = build_method_decl (objc_inherit_code, $2, $4, $5); - } - - | keywordselector optparmlist - { - $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, $2); - } - ; - -/* "optarglist" assumes that start_method_def has already been called... - if it is not, the "xdecls" will not be placed in the proper scope */ - -optarglist: - /* empty */ - | ';' myxdecls - ; - -/* to get around the following situation: "int foo (int a) int b; {}" that - is synthesized when parsing "- a:a b:b; id c; id d; { ... }" */ - -myxdecls: - /* empty */ - | mydecls - ; - -mydecls: - mydecl - | errstmt - | mydecls mydecl - | mydecl errstmt - ; - -mydecl: - typed_declspecs setspecs myparms ';' - { current_declspecs = TREE_VALUE (declspec_stack); - prefix_attributes = TREE_PURPOSE (declspec_stack); - declspec_stack = TREE_CHAIN (declspec_stack); - resume_momentary ($2); } - | typed_declspecs ';' - { shadow_tag ($1); } - | declmods ';' - { pedwarn ("empty declaration"); } - ; - -myparms: - myparm - { push_parm_decl ($1); } - | myparms ',' myparm - { push_parm_decl ($3); } - ; - -/* A single parameter declaration or parameter type name, - as found in a parmlist. DOES NOT ALLOW AN INITIALIZER OR ASMSPEC */ - -myparm: - parm_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $1), - build_tree_list (prefix_attributes, - $2)); } - | notype_declarator maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $1), - build_tree_list (prefix_attributes, - $2)); } - | absdcl maybe_attribute - { $$ = build_tree_list (build_tree_list (current_declspecs, - $1), - build_tree_list (prefix_attributes, - $2)); } - ; - -optparmlist: - /* empty */ - { - $$ = NULL_TREE; - } - | ',' ELLIPSIS - { - /* oh what a kludge! */ - $$ = (tree)1; - } - | ',' - { - pushlevel (0); - } - parmlist_2 - { - /* returns a tree list node generated by get_parm_info */ - $$ = $3; - poplevel (0, 0, 0); - } - ; - -unaryselector: - selector - ; - -keywordselector: - keyworddecl - - | keywordselector keyworddecl - { - $$ = chainon ($1, $2); - } - ; - -selector: - IDENTIFIER - | TYPENAME - | OBJECTNAME - | reservedwords - ; - -reservedwords: - ENUM { $$ = get_identifier (token_buffer); } - | STRUCT { $$ = get_identifier (token_buffer); } - | UNION { $$ = get_identifier (token_buffer); } - | IF { $$ = get_identifier (token_buffer); } - | ELSE { $$ = get_identifier (token_buffer); } - | WHILE { $$ = get_identifier (token_buffer); } - | DO { $$ = get_identifier (token_buffer); } - | FOR { $$ = get_identifier (token_buffer); } - | SWITCH { $$ = get_identifier (token_buffer); } - | CASE { $$ = get_identifier (token_buffer); } - | DEFAULT { $$ = get_identifier (token_buffer); } - | BREAK { $$ = get_identifier (token_buffer); } - | CONTINUE { $$ = get_identifier (token_buffer); } - | RETURN { $$ = get_identifier (token_buffer); } - | GOTO { $$ = get_identifier (token_buffer); } - | ASM_KEYWORD { $$ = get_identifier (token_buffer); } - | SIZEOF { $$ = get_identifier (token_buffer); } - | TYPEOF { $$ = get_identifier (token_buffer); } - | ALIGNOF { $$ = get_identifier (token_buffer); } - | TYPESPEC | TYPE_QUAL - ; - -keyworddecl: - selector ':' '(' typename ')' identifier - { - $$ = build_keyword_decl ($1, $4, $6); - } - - | selector ':' identifier - { - $$ = build_keyword_decl ($1, NULL_TREE, $3); - } - - | ':' '(' typename ')' identifier - { - $$ = build_keyword_decl (NULL_TREE, $3, $5); - } - - | ':' identifier - { - $$ = build_keyword_decl (NULL_TREE, NULL_TREE, $2); - } - ; - -messageargs: - selector - | keywordarglist - ; - -keywordarglist: - keywordarg - | keywordarglist keywordarg - { - $$ = chainon ($1, $2); - } - ; - - -keywordexpr: - nonnull_exprlist - { - if (TREE_CHAIN ($1) == NULL_TREE) - /* just return the expr., remove a level of indirection */ - $$ = TREE_VALUE ($1); - else - /* we have a comma expr., we will collapse later */ - $$ = $1; - } - ; - -keywordarg: - selector ':' keywordexpr - { - $$ = build_tree_list ($1, $3); - } - | ':' keywordexpr - { - $$ = build_tree_list (NULL_TREE, $2); - } - ; - -receiver: - expr - | CLASSNAME - { - $$ = get_class_reference ($1); - } - ; - -objcmessageexpr: - '[' - { objc_receiver_context = 1; } - receiver - { objc_receiver_context = 0; } - messageargs ']' - { - $$ = build_tree_list ($3, $5); - } - ; - -selectorarg: - selector - | keywordnamelist - ; - -keywordnamelist: - keywordname - | keywordnamelist keywordname - { - $$ = chainon ($1, $2); - } - ; - -keywordname: - selector ':' - { - $$ = build_tree_list ($1, NULL_TREE); - } - | ':' - { - $$ = build_tree_list (NULL_TREE, NULL_TREE); - } - ; - -objcselectorexpr: - SELECTOR '(' selectorarg ')' - { - $$ = $3; - } - ; - -objcprotocolexpr: - PROTOCOL '(' identifier ')' - { - $$ = $3; - } - ; - -/* extension to support C-structures in the archiver */ - -objcencodeexpr: - ENCODE '(' typename ')' - { - $$ = groktypename ($3); - } - ; - -%% diff --git a/gcc/patch-apollo-includes b/gcc/patch-apollo-includes new file mode 100755 index 00000000000..8daf88cb54e --- /dev/null +++ b/gcc/patch-apollo-includes @@ -0,0 +1,69 @@ +#!/bin/sh +# patch-apollo-includes -- fix some (but not all!) Apollo brain damage. + +FILES_TO_PATCH='sys/types.h setjmp.h' + +mkdir sys + +for i in $FILES_TO_PATCH; +do + cp /bsd4.3/usr/include/$i ./$i +done + +patch -b -apollo <<'EOP' +*** /bsd4.3/usr/include/sys/types.h Fri Apr 8 20:29:06 1988 +--- sys/types.h Wed Feb 26 21:17:57 1992 +*************** +*** 38,44 **** +--- 38,47 ---- + typedef char * caddr_t; + typedef u_long ino_t; + typedef long swblk_t; ++ #ifndef _SIZE_T ++ #define _SIZE_T + typedef long size_t; ++ #endif + typedef long time_t; + typedef long dev_t; + typedef long off_t; +*** /bsd4.3/usr/include/setjmp.h Fri Feb 3 21:40:21 1989 +--- setjmp.h Sun Feb 23 19:06:55 1992 +*************** +*** 24,30 **** +--- 24,39 ---- + #endif + + ++ #ifdef __GNUC__ + #ifdef _PROTOTYPES ++ extern int sigsetjmp (sigjmp_buf env, int savemask); ++ extern void siglongjmp (sigjmp_buf env, int val); ++ #else ++ extern int sigsetjmp(); ++ extern void siglongjmp(); ++ #endif /* _PROTOTYPES */ ++ #else /* not __GNUC__ */ ++ #ifdef _PROTOTYPES + extern int sigsetjmp( + sigjmp_buf env, + int savemask +*************** +*** 37,43 **** + extern int sigsetjmp() #options(abnormal); + extern void siglongjmp() #options(noreturn); + #endif /* _PROTOTYPES */ +! + #undef _PROTOTYPES + + #ifdef __cplusplus +--- 46,52 ---- + extern int sigsetjmp() #options(abnormal); + extern void siglongjmp() #options(noreturn); + #endif /* _PROTOTYPES */ +! #endif /* not __GNUC__ */ + #undef _PROTOTYPES + + #ifdef __cplusplus +EOP + +exit 0 diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/gcc/po/ChangeLog diff --git a/gcc/po/Makefile.in.in b/gcc/po/Makefile.in.in new file mode 100644 index 00000000000..746d521d9db --- /dev/null +++ b/gcc/po/Makefile.in.in @@ -0,0 +1,249 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file file be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = $(prefix)/@DATADIRNAME@ +localedir = $(datadir)/locale +gnulocaledir = $(prefix)/share/locale +gettextsrcdir = $(prefix)/share/gettext/po +subdir = po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ + +CC = @CC@ +GENCAT = @GENCAT@ +GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ +MSGMERGE = PATH=../src:$$PATH msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +SOURCES = cat-id-tbl.c +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +INSTOBJEXT = @INSTOBJEXT@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(srcdir)/$(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && $(GENCAT) $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: $(srcdir)/cat-id-tbl.c $(CATALOGS) +all-no: + +$(srcdir)/$(PACKAGE).pot: $(POTFILES) + $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=$(srcdir)/POTFILES.in \ + && test ! -f $(PACKAGE).po \ + || ( rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) + +$(srcdir)/cat-id-tbl.c: $(srcdir)/stamp-cat-id; @: +$(srcdir)/stamp-cat-id: $(srcdir)/$(PACKAGE).pot + rm -f cat-id-tbl.tmp + sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ + | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp + if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ + rm cat-id-tbl.tmp; \ + else \ + echo cat-id-tbl.c changed; \ + rm -f $(srcdir)/cat-id-tbl.c; \ + mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ + fi + cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(datadir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ + fi + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + case "$$cat" in \ + *.gmo) destdir=$(gnulocaledir);; \ + *) destdir=$(localedir);; \ + esac; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + dir=$$destdir/$$lang/LC_MESSAGES; \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $$dir; \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ + fi; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ + fi; \ + if test -r $$cat.m; then \ + $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + if test -r $(srcdir)/$$cat.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$cat.m \ + $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ + else \ + true; \ + fi; \ + fi; \ + done + if test "$(PACKAGE)" = "gettext"; then \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(gettextsrcdir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ + $(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ + rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ + done + rm -f $(gettextsrcdir)/po-Makefile.in.in + +check: all + +cat-id-tbl.o: $(srcdir)/cat-id-tbl.c $(top_srcdir)/intl/libgettext.h + $(COMPILE) $(srcdir)/cat-id-tbl.c + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) cat-id-tbl.c stamp-cat-id + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: update-po $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(srcdir)/$(PACKAGE).pot + PATH=`pwd`/../src:$$PATH; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + mv $$lang.po $$lang.old.po; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ + rm -f $$lang.old.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$lang.po; \ + mv $$lang.old.po $$lang.po; \ + fi; \ + done + +POTFILES: POTFILES.in + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ + posrcprefix="../"; \ + fi; \ + rm -f $@-t $@ \ + && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ + -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ + | sed -e '$$s/\\$$//') > $@-t \ + && chmod a-w $@-t \ + && mv $@-t $@ ) + +Makefile: Makefile.in.in ../config.status POTFILES + cd .. \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gcc/po/POTFILES.in b/gcc/po/POTFILES.in new file mode 100644 index 00000000000..a0727132e96 --- /dev/null +++ b/gcc/po/POTFILES.in @@ -0,0 +1,816 @@ +# List of files that contain translatable strings. +# Copyright 1998 Free Software Foundation, Inc. + +# This file is part of GNU CC. + +# GNU CC 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. + +# GNU CC 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 GNU CC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston MA 02111-1307, USA. + + +# This should list all .c and .h files in this distribution. +# Files that are intentionally excluded should be commented out, not removed. +# To exclude a file, prepend a '#' to its name, and follow it by a space +# and a comment as to why it was excluded. + +# By convention, if any file included in this list defines a function +# with an argument whose name ends in `msgid', that function +# is expected to translate the argument before presenting it to the user. +# ../exgettext uses this convention to scan for strings that need translation. +# A function can have at most one msgid argument. +# Two functions with the same name in different programs +# must agree about which argument (if any) is a msgid. + +# Here are some reasons why a file might be commented-out in the list below: + +# It is part of the GCC library. + +# It is part of the translation machinery itself. + +# It is meant to be executed only by GCC maintainers or installers. +# Such files do not need to be translated, +# as these people typically need to be able to read English anyway. + +# It is not yet internationalized, because it contains many strings +# that require a lot of analysis, and the file is little-used. + + +acconfig.h +alloca.c +assert.h +basic-block.h +bc-emit.c +bc-emit.h +bc-optab.c +bc-optab.h +bc-typecd.h +bi-arity.c +bi-defs.h +bi-lexer.c +bi-opcode.c +bi-opname.c +bi-parser.c +bi-parser.h +bi-reverse.c +bi-run.h +bitmap.c +bitmap.h +bytecode.h +bytetypes.h +c-aux-info.c +c-common.c +c-convert.c +c-decl.c +c-gperf.h +c-iterate.c +c-lang.c +c-lex.c +c-lex.h +c-parse.c +c-parse.h +c-pragma.c +c-pragma.h +c-tree.h +c-typeck.c +caller-save.c +calls.c +cccp.c +cexp.c +choose-temp.c +collect2.c +combine.c +conditions.h +config/a29k/a29k.c +config/a29k/a29k.h +config/a29k/udi.h +config/a29k/unix.h +config/a29k/vx29k.h +config/a29k/xm-a29k.h +config/alpha/alpha.c +config/alpha/alpha.h +config/alpha/elf.h +config/alpha/linux.h +config/alpha/osf12.h +config/alpha/osf2or3.h +config/alpha/vms.h +config/alpha/vxworks.h +config/alpha/win-nt.h +config/alpha/xm-alpha.h +config/alpha/xm-vms.h +config/alpha/xm-winnt.h +config/aoutos.h +config/arc/arc.c +config/arc/arc.h +config/arc/initfini.c +config/arc/xm-arc.h +config/arm/aof.h +config/arm/aout.h +config/arm/arm.c +config/arm/arm.h +config/arm/coff.h +config/arm/linux-gas.h +config/arm/linux.h +config/arm/netbsd.h +config/arm/riscix.h +config/arm/riscix1-1.h +config/arm/rix-gas.h +config/arm/semi.h +config/arm/semiaof.h +config/arm/xm-arm.h +config/clipper/clipper.c +config/clipper/clipper.h +config/clipper/clix.h +config/clipper/xm-clix.h +config/convex/convex.c +config/convex/convex.h +config/convex/xm-convex.h +config/dbx.h +config/dbxcoff.h +config/dsp16xx/dsp16xx.c +config/dsp16xx/dsp16xx.h +config/dsp16xx/xm-dsp16xx.h +config/elxsi/elxsi.c +config/elxsi/elxsi.h +config/elxsi/xm-elxsi.h +config/float-i128.h +config/float-i32.h +config/float-i64.h +config/float-sh.h +config/float-vax.h +config/fp-bit.c +config/fx80/fx80.c +config/fx80/fx80.h +config/fx80/xm-fx80.h +config/gmicro/gmicro.c +config/gmicro/gmicro.h +config/gnu.h +config/gofast.h +config/h8300/h8300.c +config/h8300/h8300.h +config/h8300/xm-h8300.h +config/i370/i370.c +config/i370/i370.h +config/i370/xm-i370.h +config/i386/aix386.h +config/i386/aix386ng.h +config/i386/att.h +config/i386/bsd.h +config/i386/bsd386.h +config/i386/crtdll.h +config/i386/cygwin32.h +config/i386/dgux.c +config/i386/dgux.h +config/i386/freebsd-elf.h +config/i386/freebsd.h +config/i386/gas.h +config/i386/gmon-sol2.c +config/i386/gnu.h +config/i386/go32-rtems.h +config/i386/go32.h +config/i386/gstabs.h +config/i386/i386-aout.h +config/i386/i386-coff.h +config/i386/i386.c +config/i386/i386.h +config/i386/isc.h +config/i386/isccoff.h +config/i386/iscdbx.h +config/i386/linux-aout.h +config/i386/linux-oldld.h +config/i386/linux.h +config/i386/lynx-ng.h +config/i386/lynx.h +config/i386/mach.h +config/i386/mingw32.h +config/i386/moss.h +config/i386/netbsd.h +config/i386/next.h +config/i386/os2.h +config/i386/osf1elf.h +config/i386/osf1elfgdb.h +config/i386/osfelf.h +config/i386/osfrose.h +config/i386/perform.h +config/i386/ptx4-i.h +config/i386/rtems.h +config/i386/rtemself.h +config/i386/sco.h +config/i386/sco4.h +config/i386/sco4dbx.h +config/i386/sco5.h +config/i386/scodbx.h +config/i386/seq-gas.h +config/i386/seq-sysv3.h +config/i386/seq2-sysv3.h +config/i386/sequent.h +config/i386/sol2.h +config/i386/sol2dbg.h +config/i386/sun.h +config/i386/sun386.h +config/i386/svr3dbx.h +config/i386/svr3gas.h +config/i386/sysv3.h +config/i386/sysv4.h +config/i386/unix.h +config/i386/v3gas.h +config/i386/vsta.h +config/i386/win-nt.h +config/i386/winnt.c +config/i386/xm-aix.h +config/i386/xm-cygwin32.h +config/i386/xm-dos.h +config/i386/xm-go32.h +config/i386/xm-i386.h +config/i386/xm-isc.h +config/i386/xm-lynx.h +config/i386/xm-mingw32.h +config/i386/xm-next.h +config/i386/xm-os2.h +config/i386/xm-osf.h +config/i386/xm-osf1elf.h +config/i386/xm-sco.h +config/i386/xm-sco5.h +config/i386/xm-sysv4.h +config/i386/xm-vsta.h +config/i860/bsd-gas.h +config/i860/bsd.h +config/i860/fx2800.h +config/i860/i860.c +config/i860/i860.h +config/i860/mach.h +config/i860/paragon.h +config/i860/sysv3.h +config/i860/sysv4.h +config/i860/xm-i860.h +config/i960/i960-coff.h +config/i960/i960.c +config/i960/i960.h +config/i960/rtems.h +config/i960/vx960-coff.h +config/i960/vx960.h +config/i960/xm-i960.h +config/libgloss.h +config/linux-aout.h +config/linux.h +config/lynx-ng.h +config/lynx.h +config/m32r/initfini.c +config/m32r/m32r.c +config/m32r/m32r.h +config/m32r/xm-m32r.h +config/m68k/a-ux.h +config/m68k/altos3068.h +config/m68k/amix.h +config/m68k/apollo68.h +config/m68k/atari.h +config/m68k/aux-crt1.c +config/m68k/aux-exit.c +config/m68k/aux-mcount.c +config/m68k/auxas.h +config/m68k/auxgas.h +config/m68k/auxgld.h +config/m68k/auxld.h +config/m68k/ccur-GAS.h +config/m68k/coff.h +config/m68k/crds.h +config/m68k/ctix.h +config/m68k/dpx2.h +config/m68k/dpx2cdbx.h +config/m68k/dpx2g.h +config/m68k/fpgnulib.c +config/m68k/hp2bsd.h +config/m68k/hp310.h +config/m68k/hp310g.h +config/m68k/hp320.h +config/m68k/hp320g.h +config/m68k/hp3bsd.h +config/m68k/hp3bsd44.h +config/m68k/hpux7.h +config/m68k/isi-nfp.h +config/m68k/isi.h +config/m68k/linux-aout.h +config/m68k/linux.h +config/m68k/lynx-ng.h +config/m68k/lynx.h +config/m68k/m68k-aout.h +config/m68k/m68k-coff.h +config/m68k/m68k-none.h +config/m68k/m68k-psos.h +config/m68k/m68k.c +config/m68k/m68k.h +config/m68k/m68kemb.h +config/m68k/m68kv4.h +config/m68k/mot3300.h +config/m68k/netbsd.h +config/m68k/news.h +config/m68k/news3.h +config/m68k/news3gas.h +config/m68k/newsgas.h +config/m68k/next.h +config/m68k/next21.h +config/m68k/pbb.h +config/m68k/plexus.h +config/m68k/rtems.h +config/m68k/sgs.h +config/m68k/sun2.h +config/m68k/sun2o4.h +config/m68k/sun3.h +config/m68k/sun3mach.h +config/m68k/sun3n.h +config/m68k/sun3n3.h +config/m68k/sun3o3.h +config/m68k/tower-as.h +config/m68k/tower.h +config/m68k/vxm68k.h +config/m68k/xm-3b1.h +config/m68k/xm-atari.h +config/m68k/xm-crds.h +config/m68k/xm-lynx.h +config/m68k/xm-m68k.h +config/m68k/xm-mot3300.h +config/m68k/xm-next.h +config/m68k/xm-plexus.h +config/m88k/dgux.h +config/m88k/dguxbcs.h +config/m88k/dolph.h +config/m88k/luna.h +config/m88k/m88k-aout.h +config/m88k/m88k-coff.h +config/m88k/m88k.c +config/m88k/m88k.h +config/m88k/sysv3.h +config/m88k/sysv4.h +config/m88k/tekXD88.h +config/m88k/xm-m88k.h +config/m88k/xm-sysv3.h +config/mips/abi64.h +config/mips/bsd-4.h +config/mips/bsd-5.h +config/mips/cross64.h +config/mips/dec-bsd.h +config/mips/dec-osf1.h +config/mips/ecoff.h +config/mips/ecoffl.h +config/mips/elf.h +config/mips/elf64.h +config/mips/elfl.h +config/mips/elfl64.h +config/mips/elforion.h +config/mips/gnu.h +config/mips/iris3.h +config/mips/iris4.h +config/mips/iris4loser.h +config/mips/iris5.h +config/mips/iris5gas.h +config/mips/iris6.h +config/mips/mips-5.h +config/mips/mips.c +config/mips/mips.h +config/mips/netbsd.h +config/mips/news4.h +config/mips/news5.h +config/mips/osfrose.h +config/mips/r3900.h +config/mips/rtems64.h +config/mips/sni-gas.h +config/mips/sni-svr4.h +config/mips/svr3-4.h +config/mips/svr3-5.h +config/mips/svr4-4.h +config/mips/svr4-5.h +config/mips/svr4-t.h +config/mips/ultrix.h +config/mips/xm-iris6.h +config/mips/xm-mips.h +config/mn10200/divmod.c +config/mn10200/mn10200.c +config/mn10200/mn10200.h +config/mn10200/udivmod.c +config/mn10200/udivmodsi4.c +config/mn10200/xm-mn10200.h +config/mn10300/mn10300.c +config/mn10300/mn10300.h +config/mn10300/xm-mn10300.h +config/msdos/mklibgcc.c +config/netbsd.h +config/nextstep.c +config/nextstep.h +config/nextstep21.h +config/ns32k/encore.h +config/ns32k/genix.h +config/ns32k/merlin.h +config/ns32k/netbsd.h +config/ns32k/ns32k.c +config/ns32k/ns32k.h +config/ns32k/pc532-mach.h +config/ns32k/pc532-min.h +config/ns32k/pc532.h +config/ns32k/sequent.h +config/ns32k/tek6000.h +config/ns32k/tek6100.h +config/ns32k/tek6200.h +config/ns32k/xm-ns32k.h +config/ns32k/xm-pc532-min.h +config/pa/pa-gas.h +config/pa/pa-hiux.h +config/pa/pa-hpux.h +config/pa/pa-hpux10.h +config/pa/pa-hpux7.h +config/pa/pa-hpux9.h +config/pa/pa-oldas.h +config/pa/pa-osf.h +config/pa/pa-pro-end.h +config/pa/pa-pro.h +config/pa/pa.c +config/pa/pa.h +config/pa/pa1.h +config/pa/rtems.h +config/pa/xm-pa.h +config/pa/xm-pahpux.h +config/pa/xm-papro.h +config/pdp11/pdp11.c +config/pdp11/pdp11.h +config/pdp11/xm-pdp11.h +config/psos.h +config/ptx4.h +config/pyr/pyr.c +config/pyr/pyr.h +config/pyr/xm-pyr.h +config/romp/romp.c +config/romp/romp.h +config/romp/xm-romp.h +config/rs6000/aix31.h +config/rs6000/aix3newas.h +config/rs6000/aix41.h +config/rs6000/cygwin32.h +config/rs6000/eabi-ctors.c +config/rs6000/eabi.h +config/rs6000/eabiaix.h +config/rs6000/eabile.h +config/rs6000/eabilesim.h +config/rs6000/eabisim.h +config/rs6000/linux.h +config/rs6000/lynx.h +config/rs6000/mach.h +config/rs6000/netware.h +config/rs6000/powerpc.h +config/rs6000/rs6000.c +config/rs6000/rs6000.h +config/rs6000/rtems.h +config/rs6000/sol-c0.c +config/rs6000/sol2.h +config/rs6000/sysv4.h +config/rs6000/sysv4le.h +config/rs6000/vxppc.h +config/rs6000/win-nt.h +config/rs6000/xm-cygwin32.h +config/rs6000/xm-lynx.h +config/rs6000/xm-mach.h +config/rs6000/xm-rs6000.h +config/rs6000/xm-sysv4.h +config/sh/elf.h +config/sh/rtems.h +config/sh/sh.c +config/sh/sh.h +config/sh/xm-sh.h +config/sparc/aout.h +config/sparc/bsd.h +config/sparc/elf.h +config/sparc/gmon-sol2.c +config/sparc/hal.h +config/sparc/linux-aout.h +config/sparc/linux.h +config/sparc/linux64.h +config/sparc/lite.h +config/sparc/litecoff.h +config/sparc/lynx-ng.h +config/sparc/lynx.h +config/sparc/netbsd.h +config/sparc/pbd.h +config/sparc/rtems.h +config/sparc/sol2-sld.h +config/sparc/sol2.h +config/sparc/sp64-aout.h +config/sparc/sp64-elf.h +config/sparc/sparc.c +config/sparc/sparc.h +config/sparc/splet.h +config/sparc/sun4gas.h +config/sparc/sun4o3.h +config/sparc/sunos4.h +config/sparc/sysv4.h +config/sparc/vxsim.h +config/sparc/vxsparc.h +config/sparc/xm-linux.h +config/sparc/xm-lynx.h +config/sparc/xm-sol2.h +config/sparc/xm-sp64.h +config/sparc/xm-sparc.h +config/sparc/xm-sysv4.h +config/spur/spur.c +config/spur/spur.h +config/spur/xm-spur.h +config/svr3.h +config/svr4.h +config/tahoe/harris.h +config/tahoe/tahoe.c +config/tahoe/tahoe.h +config/tahoe/xm-tahoe.h +config/v850/v850.c +config/v850/v850.h +config/v850/xm-v850.h +config/vax/netbsd.h +config/vax/ultrix.h +config/vax/vax.c +config/vax/vax.h +config/vax/vaxv.h +config/vax/vms.h +config/vax/xm-vax.h +config/vax/xm-vms.h +config/we32k/we32k.c +config/we32k/we32k.h +config/we32k/xm-we32k.h +config/winnt/dirent.c +config/winnt/dirent.h +config/winnt/fixinc-nt.c +config/winnt/ld.c +config/winnt/mklibgcc.c +config/winnt/oldnames.c +config/winnt/spawnv.c +config/winnt/win-nt.h +config/winnt/xm-winnt.h +config/xm-alloca.h +config/xm-gnu.h +config/xm-lynx.h +config/xm-siglist.h +config/xm-std32.h +convert.c +convert.h +cp/call.c +cp/class.c +cp/class.h +cp/cp-tree.h +cp/cvt.c +cp/decl.c +cp/decl.h +cp/decl2.c +cp/errfn.c +cp/error.c +cp/except.c +cp/expr.c +cp/friend.c +cp/g++spec.c +cp/hash.h +cp/inc/new.h +cp/init.c +cp/input.c +cp/lang-options.h +cp/lang-specs.h +cp/lex.c +cp/lex.h +cp/method.c +cp/parse.c +cp/parse.h +cp/pt.c +cp/ptree.c +cp/repo.c +cp/rtti.c +cp/search.c +cp/sig.c +cp/spew.c +cp/tinfo.h +cp/tree.c +cp/typeck.c +cp/typeck2.c +cp/xref.c +cplus-dem.c +cppalloc.c +cpperror.c +cppexp.c +cpphash.c +cpphash.h +cpplib.c +cpplib.h +cppmain.c +#crtstuff.c is part of the GCC library +cse.c +dbxout.c +dbxstclass.h +defaults.h +demangle.h +doschk.c +dwarf.h +dwarf2.h +dwarf2out.c +dwarfout.c +emit-rtl.c +#enquire.c is used only by GCC maintainers and installers +except.c +except.h +explow.c +expmed.c +expr.c +expr.h +final.c +#fix-header.c is used only by GCC maintainers and installers +flags.h +floatlib.c +flow.c +fold-const.c +fp-test.c +frame.c +#frame.h is part of the GCC library +function.c +function.h +gansidecl.h +#gbl-ctors.h is part of the GCC library +gcc.c +gcov-io.h +gcov.c +#gen-protos.c is used only by GCC maintainers and installers +#genattr.c is used only by GCC maintainers and installers +#genattrtab.c is used only by GCC maintainers and installers +#gencheck.c is used only by GCC maintainers and installers +#gencodes.c is used only by GCC maintainers and installers +#genconfig.c is used only by GCC maintainers and installers +#genemit.c is used only by GCC maintainers and installers +#genextract.c is used only by GCC maintainers and installers +#genflags.c is used only by GCC maintainers and installers +#genopinit.c is used only by GCC maintainers and installers +#genoutput.c is used only by GCC maintainers and installers +#genpeep.c is used only by GCC maintainers and installers +#genrecog.c is used only by GCC maintainers and installers +getopt.c +getopt.h +getopt1.c +getpwd.c +ginclude/iso646.h +ginclude/math-3300.h +ginclude/math-68881.h +ginclude/ppc-asm.h +ginclude/proto.h +ginclude/stdarg.h +ginclude/stddef.h +ginclude/va-alpha.h +ginclude/va-arc.h +ginclude/va-clipper.h +ginclude/va-h8300.h +ginclude/va-i860.h +ginclude/va-i960.h +ginclude/va-m32r.h +ginclude/va-m88k.h +ginclude/va-mips.h +ginclude/va-mn10200.h +ginclude/va-mn10300.h +ginclude/va-pa.h +ginclude/va-ppc.h +ginclude/va-pyr.h +ginclude/va-sh.h +ginclude/va-sparc.h +ginclude/va-spur.h +ginclude/va-v850.h +ginclude/varargs.h +glimits.h +global.c +gmon.c +gstab.h +gsyms.h +gsyslimits.h +halfpic.c +halfpic.h +hard-reg-set.h +input.h +integrate.c +integrate.h +intl.c +intl.h +intl/bindtextdom.c +intl/cat-compat.c +intl/dcgettext.c +intl/dgettext.c +intl/explodename.c +intl/finddomain.c +intl/gettext.c +intl/gettext.h +intl/gettextP.h +intl/hash-string.h +intl/intl-compat.c +intl/l10nflist.c +intl/libgettext.h +intl/loadinfo.h +intl/loadmsgcat.c +intl/localealias.c +intl/textdomain.c +jump.c +#libgcc1-test.c is used only by GCC maintainers and installers +#libgcc1.c is part of the GCC library +#libgcc2.c is part of the GCC library +limitx.h +limity.h +local-alloc.c +#longlong.h is part of the GCC library +loop.c +loop.h +machmode.h +#mips-tdump.c is not yet internationalized +#mips-tfile.c is not yet internationalized +objc/NXConstStr.h +objc/Object.h +objc/Protocol.h +objc/archive.c +objc/class.c +objc/encoding.c +objc/encoding.h +objc/hash.c +objc/hash.h +objc/init.c +objc/libobjc_entry.c +objc/misc.c +objc/nil_method.c +objc/objc-act.c +objc/objc-act.h +objc/objc-api.h +objc/objc-list.h +objc/objc-parse.c +objc/objc.h +objc/objects.c +objc/runtime.h +objc/sarray.c +objc/sarray.h +objc/selector.c +objc/sendmsg.c +objc/thr-decosf1.c +objc/thr-irix.c +objc/thr-mach.c +objc/thr-os2.c +objc/thr-posix.c +objc/thr-pthreads.c +objc/thr-single.c +objc/thr-solaris.c +objc/thr-win32.c +objc/thr.c +objc/thr.h +objc/typedstream.h +obstack.c +obstack.h +optabs.c +output.h +pcp.h +pexecute.c +#po/cat-id-tbl.c contains the translation tables themselves +prefix.c +print-rtl.c +print-tree.c +profile.c +protoize.c +pself.c +pself1.c +pself2.c +pself3.c +real.c +real.h +recog.c +recog.h +reg-stack.c +regclass.c +regmove.c +regs.h +reload.c +reload.h +reload1.c +reorg.c +rtl.c +rtl.h +rtlanal.c +#scan-decls.c is used only by GCC maintainers and installers +#scan.c is used only by GCC maintainers and installers +scan.h +sched.c +sdbout.c +stack.h +stmt.c +stor-layout.c +stupid.c +sys-protos.h +sys-types.h +toplev.c +tree.c +tree.h +typeclass.h +unprotoize.c +unroll.c +varasm.c +version.c +xcoffout.c +xcoffout.h diff --git a/gcc/po/en_UK.po b/gcc/po/en_UK.po new file mode 100644 index 00000000000..829b7b5344d --- /dev/null +++ b/gcc/po/en_UK.po @@ -0,0 +1,491 @@ +# British English messages for GNU CC +# Copyright (C) 1998 Free Software Foundation, Inc. +# Paul Eggert <eggert@twinsun.com>, 1998. +# +msgid "" +msgstr "" +"Project-Id-Version: cc 2.8.1.19980813\n" +"POT-Creation-Date: 1998-07-26 00:33-0700\n" +"PO-Revision-Date: 1998-09-27 21:34-0700\n" +"Last-Translator: Paul Eggert <eggert@twinsun.com>\n" +"Language-Team: English <en@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=us-ascii\n" +"Content-Transfer-Encoding: 7bit\n" + +#: c-common.c:643 +msgid "unrecognized format specifier" +msgstr "unrecognised format specifier" + +#: c-common.c:659 +#, c-format +msgid "`%s' is an unrecognized format function type" +msgstr "`%s' is an unrecognised format function type" + +#: c-decl.c:3673 +#, c-format +msgid "typedef `%s' is initialized" +msgstr "typedef `%s' is initialised" + +#: c-decl.c:3680 +#, c-format +msgid "function `%s' is initialized like a variable" +msgstr "function `%s' is initialised like a variable" + +#. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. +#: c-decl.c:3687 +#, c-format +msgid "parameter `%s' is initialized" +msgstr "parameter `%s' is initialised" + +#: c-decl.c:3702 c-typeck.c:4924 +msgid "variable-sized object may not be initialized" +msgstr "variable-sized object may not be initialised" + +#: c-decl.c:3708 +#, c-format +msgid "variable `%s' has initializer but incomplete type" +msgstr "variable `%s' has initialiser but incomplete type" + +#: c-decl.c:3726 +#, c-format +msgid "declaration of `%s' has `extern' and is initialized" +msgstr "declaration of `%s' has `extern' and is initialised" + +#: c-decl.c:3865 +#, c-format +msgid "initializer fails to determine size of `%s'" +msgstr "initialiser fails to determine size of `%s'" + +#: c-decl.c:4626 cp/decl.c:8536 +#, c-format +msgid "`%s' initialized and declared `extern'" +msgstr "`%s' initialised and declared `extern'" + +#: c-decl.c:4628 cp/decl.c:8539 +#, c-format +msgid "`%s' has both `extern' and initializer" +msgstr "`%s' has both `extern' and initialiser" + +#: c-lex.c:406 cp/lex.c:2158 +msgid "stray '\\' in program" +msgstr "stray '\\' in programme" + +#: c-lex.c:859 +msgid "unrecognized text at end of #line" +msgstr "unrecognised text at end of #line" + +#: c-parse.y:1106 objc-parse.y:1212 +msgid "ANSI C forbids empty initializer braces" +msgstr "ANSI C forbids empty initialiser braces" + +#: c-typeck.c:4544 +msgid "initializer for static variable is not constant" +msgstr "initialiser for static variable is not constant" + +#: c-typeck.c:4550 +msgid "initializer for static variable uses complicated arithmetic" +msgstr "initialiser for static variable uses complicated arithmetic" + +#: c-typeck.c:4558 +msgid "aggregate initializer is not constant" +msgstr "aggregate initialiser is not constant" + +#: c-typeck.c:4560 +msgid "aggregate initializer uses complicated arithmetic" +msgstr "aggregate initialiser uses complicated arithmetic" + +#: c-typeck.c:4724 c-typeck.c:4740 c-typeck.c:4756 +#, c-format +msgid "(near initialization for `%s')" +msgstr "(near initialisation for `%s')" + +#: c-typeck.c:4804 cp/typeck2.c:787 +msgid "char-array initialized from wide string" +msgstr "char-array initialised from wide string" + +#: c-typeck.c:4811 cp/typeck2.c:794 +msgid "int-array initialized from non-wide string" +msgstr "int-array initialised from non-wide string" + +#: c-typeck.c:4828 cp/typeck2.c:815 +msgid "initializer-string for array of chars is too long" +msgstr "initialiser-string for array of chars is too long" + +#: c-typeck.c:4855 +msgid "array initialized from non-constant array expression" +msgstr "array initialised from non-constant array expression" + +#: c-typeck.c:4872 c-typeck.c:4874 c-typeck.c:4880 c-typeck.c:4907 +#: c-typeck.c:6107 +msgid "initializer element is not constant" +msgstr "initialiser element is not constant" + +#: c-typeck.c:4886 c-typeck.c:4913 c-typeck.c:6113 +msgid "initializer element is not computable at load time" +msgstr "initialiser element is not computable at load time" + +#: c-typeck.c:4902 +msgid "initialization" +msgstr "initialisation" + +#: c-typeck.c:4950 c-typeck.c:4966 cp/typeck2.c:893 +msgid "invalid initializer" +msgstr "invalid initialiser" + +#: c-typeck.c:5444 +msgid "extra brace group at end of initializer" +msgstr "extra brace group at end of initialiser" + +#: c-typeck.c:5456 +msgid "missing braces around initializer" +msgstr "missing braces around initialiser" + +#: c-typeck.c:5486 +msgid "braces around scalar initializer" +msgstr "braces around scalar initialiser" + +#: c-typeck.c:5560 +msgid "empty braces in initializer" +msgstr "empty braces in initialiser" + +#: c-typeck.c:5624 +msgid "empty scalar initializer" +msgstr "empty scalar initialiser" + +#: c-typeck.c:5629 +msgid "extra elements in scalar initializer" +msgstr "extra elements in scalar initialiser" + +#: c-typeck.c:5763 c-typeck.c:5765 +msgid "nonconstant array index in initializer" +msgstr "nonconstant array index in initialiser" + +#: c-typeck.c:5767 +msgid "array index in non-array initializer" +msgstr "array index in non-array initialiser" + +#: c-typeck.c:5769 +msgid "duplicate array index in initializer" +msgstr "duplicate array index in initialiser" + +#: c-typeck.c:5776 +msgid "empty index range in initializer" +msgstr "empty index range in initialiser" + +#: c-typeck.c:5780 +msgid "ANSI C forbids specifying element to initialize" +msgstr "ANSI C forbids specifying element to initialise" + +#: c-typeck.c:5810 +#, c-format +msgid "unknown field `%s' specified in initializer" +msgstr "unknown field `%s' specified in initialiser" + +#: c-typeck.c:5813 +#, c-format +msgid "field `%s' already initialized" +msgstr "field `%s' already initialised" + +#: c-typeck.c:5819 +msgid "ANSI C forbids specifying structure member to initialize" +msgstr "ANSI C forbids specifying structure member to initialise" + +#: c-typeck.c:6129 +msgid "duplicate initializer" +msgstr "duplicate initialiser" + +#: c-typeck.c:6475 c-typeck.c:6510 +msgid "excess elements in struct initializer" +msgstr "excess elements in struct initialiser" + +#: c-typeck.c:6574 +msgid "excess elements in union initializer" +msgstr "excess elements in union initialiser" + +#: c-typeck.c:6648 c-typeck.c:6659 +msgid "excess elements in array initializer" +msgstr "excess elements in array initialiser" + +#: c-typeck.c:6710 +msgid "excess elements in scalar initializer" +msgstr "excess elements in scalar initialiser" + +#: cccp.c:2708 +msgid "preprocessing directive not recognized within macro arg" +msgstr "preprocessing directive not recognised within macro arg" + +#: config/h8300/h8300.c:2948 config/h8300/h8300.c:2960 +msgid "Only initialized variables can be placed into the 8-bit area." +msgstr "Only initialised variables can be placed into the 8-bit area." + +#: config/nextstep.c:70 +msgid "optimization turned on" +msgstr "optimisation turned on" + +#: config/nextstep.c:76 +msgid "optimization turned off" +msgstr "optimisation turned off" + +#: config/nextstep.c:91 +msgid "optimization level restored" +msgstr "optimisation level restored" + +#: cp/class.c:4897 +#, c-format +msgid "language string `\"%s\"' not recognized" +msgstr "language string `\"%s\"' not recognised" + +#: cp/decl.c:6372 +msgid "assignment (not initialization) in declaration" +msgstr "assignment (not initialisation) in declaration" + +#: cp/decl.c:8913 +#, c-format +msgid "can't initialize friend function `%s'" +msgstr "can't initialise friend function `%s'" + +#: cp/decl.c:9385 +msgid "typedef declaration includes an initializer" +msgstr "typedef declaration includes an initialiser" + +#: cp/decl2.c:1609 +msgid "function declarations cannot have initializers in signature" +msgstr "function declarations cannot have initialisers in signature" + +#: cp/decl2.c:1655 +msgid "field initializer is not constant" +msgstr "field initialiser is not constant" + +#: cp/decl2.c:1697 +msgid "initializer invalid for static member with constructor" +msgstr "initialiser invalid for static member with constructor" + +#: cp/decl2.c:1699 +msgid "(you really want to initialize it separately)" +msgstr "(you really want to initialise it separately)" + +#: cp/init.c:213 +msgid "initializer list treated as compound expression" +msgstr "initialiser list treated as compound expression" + +#: cp/init.c:945 +msgid "base class initializer specified, but no base class to initialize" +msgstr "base class initialiser specified, but no base class to initialise" + +#: cp/init.c:951 +msgid "initializer for unnamed base class ambiguous" +msgstr "initialiser for unnamed base class ambiguous" + +#: cp/init.c:979 +msgid "no base class to initialize" +msgstr "no base class to initialise" + +#: cp/init.c:1010 +msgid " will be re-ordered to precede member initializations" +msgstr " will be re-ordered to precede member initialisations" + +#. Handle bad initializers like: +#. class COMPLEX { +#. public: +#. double re, im; +#. COMPLEX(double r = 0.0, double i = 0.0) {re = r; im = i;}; +#. ~COMPLEX() {}; +#. }; +#. +#. int main(int argc, char **argv) { +#. COMPLEX zees(1.0, 0.0)[10]; +#. } +#. +#: cp/init.c:1199 +msgid "bad array initializer" +msgstr "bad array initialiser" + +#: cp/init.c:1519 cp/typeck.c:6093 +msgid "return value from function receives multiple initializations" +msgstr "return value from function receives multiple initialisations" + +#: cp/init.c:1536 cp/init.c:2590 cp/typeck2.c:601 cp/typeck2.c:1445 +msgid "initializer list being treated as compound expression" +msgstr "initialiser list being treated as compound expression" + +#: cp/init.c:2593 +msgid "initializer list appears where operand should be used" +msgstr "initialiser list appears where operand should be used" + +#: cp/init.c:3069 +msgid "initialization of array from dissimilar array type" +msgstr "initialisation of array from dissimilar array type" + +#: cp/init.c:3083 +msgid "initializer ends prematurely" +msgstr "initialiser ends prematurely" + +#: cp/init.c:3116 +msgid "cannot initialize multi-dimensional array with initializer" +msgstr "cannot initialise multi-dimensional array with initialiser" + +#: parse.y:763 +msgid "no base initializers given following ':'" +msgstr "no base initialisers given following ':'" + +#: parse.y:786 +msgid "base initializers not allowed for non-member functions" +msgstr "base initialisers not allowed for non-member functions" + +#: parse.y:788 +msgid "only constructors take base initializers" +msgstr "only constructors take base initialisers" + +#: parse.y:805 parse.y:811 +msgid "anachronistic old style base class initializer" +msgstr "anachronistic old style base class initialiser" + +#: parse.y:1182 +msgid "ANSI C++ forbids initialization of new expression with `='" +msgstr "ANSI C++ forbids initialisation of new expression with `='" + +#: parse.y:4029 +msgid "ANSI C++ forbids compound statements inside for initializations" +msgstr "ANSI C++ forbids compound statements inside for initialisations" + +#: cp/pt.c:504 +msgid "Explicit specialization not preceded by `template <>'" +msgstr "Explicit specialisation not preceded by `template <>'" + +#: cp/tree.c:1609 +msgid "initializer contains unrecognized tree code" +msgstr "initialiser contains unrecognised tree code" + +#: cp/typeck.c:189 +msgid "argument list may not have an initializer list" +msgstr "argument list may not have an initialiser list" + +#: cp/typeck.c:2643 +msgid "ANSI C++ forbids calling `main' from within program" +msgstr "ANSI C++ forbids calling `main' from within programme" + +#: cp/typeck2.c:576 +msgid "comma expression used to initialize return value" +msgstr "comma expression used to initialise return value" + +#: cp/typeck2.c:592 +msgid "cannot initialize arrays using this syntax" +msgstr "cannot initialise arrays using this syntax" + +#: cp/typeck2.c:658 +msgid "ANSI C++ forbids non-constant aggregate initializer expressions" +msgstr "ANSI C++ forbids non-constant aggregate initialiser expressions" + +#: cp/typeck2.c:741 cp/typeck2.c:757 +msgid "ANSI C++ forbids initializing array from array expression" +msgstr "ANSI C++ forbids initialising array from array expression" + +#: cp/typeck2.c:759 +msgid "ANSI C++ forbids single nonscalar initializer with braces" +msgstr "ANSI C++ forbids single nonscalar initialiser with braces" + +#: cp/typeck2.c:802 +msgid "ANSI C++ forbids string initializer except for `char' elements" +msgstr "ANSI C++ forbids string initialiser except for `char' elements" + +#: cp/typeck2.c:834 +msgid "initializer for scalar variable requires one element" +msgstr "initialiser for scalar variable requires one element" + +#: cp/typeck2.c:931 +msgid "aggregate has a partly bracketed initializer" +msgstr "aggregate has a partly bracketed initialiser" + +#: cp/typeck2.c:974 +msgid "non-empty initializer for array of empty elements" +msgstr "non-empty initialiser for array of empty elements" + +#: cp/typeck2.c:1003 +msgid "initializer list for object of class with virtual baseclasses" +msgstr "initialiser list for object of class with virtual baseclasses" + +#: cp/typeck2.c:1009 +msgid "initializer list for object of class with baseclasses" +msgstr "initialiser list for object of class with baseclasses" + +#: cp/typeck2.c:1015 +msgid "initializer list for object using virtual functions" +msgstr "initialiser list for object using virtual functions" + +#: cp/typeck2.c:1076 +#, c-format +msgid "uninitialized const member `%s'" +msgstr "uninitialised const member `%s'" + +#: cp/typeck2.c:1080 +#, c-format +msgid "member `%s' with uninitialized const fields" +msgstr "member `%s' with uninitialised const fields" + +#: cp/typeck2.c:1083 +#, c-format +msgid "member `%s' is uninitialized reference" +msgstr "member `%s' is uninitialised reference" + +#: cp/typeck2.c:1108 +msgid "index value instead of field name in union initializer" +msgstr "index value instead of field name in union initialiser" + +#: cp/typeck2.c:1120 +#, c-format +msgid "no field `%s' in union being initialized" +msgstr "no field `%s' in union being initialised" + +#: cp/typeck2.c:1164 +msgid "excess elements in aggregate initializer" +msgstr "excess elements in aggregate initialiser" + +#: function.c:4809 +#, c-format +msgid "`%s' might be used uninitialized in this function" +msgstr "`%s' might be used uninitialised in this function" + +#: gcc.c:2268 +#, c-format +msgid "Internal compiler error: program %s got fatal signal %d" +msgstr "Internal compiler error: programme %s got fatal signal %d" + +#: gcc.c:4606 +#, c-format +msgid "unrecognized option `-%s'" +msgstr "unrecognised option `-%s'" + +#: gcc.c:4862 +#, c-format +msgid "language %s not recognized" +msgstr "language %s not recognised" + +#: gcov.c:449 +#, c-format +msgid "Could not open program flow graph file %s.\n" +msgstr "Could not open programme flow graph file %s.\n" + +#. --option +#: getopt.c:755 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: unrecognised option `--%s'\n" + +#. +option or -option +#: getopt.c:759 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: unrecognised option `%c%s'\n" + +#: tree.c:4771 +msgid "invalid initializer for bit string" +msgstr "invalid initialiser for bit string" + +#: varasm.c:4086 +msgid "initializer for integer value is too complicated" +msgstr "initialiser for integer value is too complicated" + +#: varasm.c:4092 +msgid "initializer for floating value is not a floating constant" +msgstr "initialiser for floating value is not a floating constant" diff --git a/gcc/prefix.c b/gcc/prefix.c new file mode 100644 index 00000000000..3ffda1ab528 --- /dev/null +++ b/gcc/prefix.c @@ -0,0 +1,314 @@ +/* Utility to update paths from internal to external forms. + Copyright (C) 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* This file contains routines to update a path, both to canonicalize + the directory format and to handle any prefix translation. + + This file must be compiled with -DPREFIX= to specify the "prefix" + value used by configure. If a filename does not begin with this + prefix, it will not be affected other than by directory canonicalization. + + Each caller of 'update_path' may specify both a filename and + a translation prefix and consist of the name of the package that contains + the file ("@GCC", "@BINUTIL", "@GNU", etc). + + If the prefix is not specified, the filename will only undergo + directory canonicalization. + + If it is specified, the string given by PREFIX will be replaced + by the specified prefix (with a '@' in front unless the prefix begins + with a '$') and further translation will be done as follows + until none of the two conditions below are met: + + 1) If the filename begins with '@', the string between the '@' and + the end of the name or the first '/' or directory separator will + be considered a "key" and looked up as follows: + + -- If this is a Win32 OS, then the Registry will be examined for + an entry of "key" in + + HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\ + + if found, that value will be used. + + -- If not found (or not a Win32 OS), the environment variable + key_ROOT (the value of "key" concatenated with the constant "_ROOT") + is tried. If that fails, then PREFIX (see above) is used. + + 2) If the filename begins with a '$', the rest of the string up + to the end or the first '/' or directory separator will be used + as an environment variable, whose value will be returned. + + Once all this is done, any '/' will be converted to DIR_SEPARATOR, + if they are different. + + NOTE: using resolve_keyed_path under Win32 requires linking with + advapi32.dll. */ + + +#include "config.h" +#include "gansidecl.h" +#include "stdarg.h" + +#ifdef _WIN32 +#include <windows.h> +#endif + +static char *get_key_value PROTO((char *)); +static char *translate_name PROTO((char *)); +static char *concat PVPROTO((char *, ...)); +static char *save_string PROTO((char *, int)); + +#ifdef _WIN32 +static char *lookup_key PROTO((char *)); +static HKEY reg_key = (HKEY) INVALID_HANDLE_VALUE; +#endif + +extern char *getenv (); + +/* Given KEY, as above, return its value. */ + +static char * +get_key_value (key) + char *key; +{ + char *prefix = 0; + +#ifdef _WIN32 + prefix = lookup_key (key); +#endif + + if (prefix == 0) + prefix = getenv (concat (key, "_ROOT", NULL_PTR)); + + if (prefix == 0) + prefix = PREFIX; + + return prefix; +} + +/* Concatenate a sequence of strings, returning the result. + + This function is based on the one in libiberty. */ + +static char * +concat VPROTO((char *first, ...)) +{ + register int length; + register char *newstr; + register char *end; + register char *arg; + va_list args; +#ifndef __STDC__ + char *first; +#endif + + /* First compute the size of the result and get sufficient memory. */ + + VA_START (args, first); +#ifndef __STDC__ + first = va_arg (args, char *); +#endif + + arg = first; + length = 0; + + while (arg != 0) + { + length += strlen (arg); + arg = va_arg (args, char *); + } + + newstr = (char *) malloc (length + 1); + va_end (args); + + /* Now copy the individual pieces to the result string. */ + + VA_START (args, first); +#ifndef __STDC__ + first = va_arg (args, char *); +#endif + + end = newstr; + arg = first; + while (arg != 0) + { + while (*arg) + *end++ = *arg++; + arg = va_arg (args, char *); + } + *end = '\000'; + va_end (args); + + return (newstr); +} + +/* Return a copy of a string that has been placed in the heap. */ + +static char * +save_string (s, len) + char *s; + int len; +{ + register char *result = (char *) malloc (len + 1); + + bcopy (s, result, len); + result[len] = 0; + return result; +} + +#ifdef _WIN32 + +/* Look up "key" in the registry, as above. */ + +static char * +lookup_key (key) + char *key; +{ + char *dst; + DWORD size; + DWORD type; + LONG res; + + if (reg_key == (HKEY) INVALID_HANDLE_VALUE) + { + res = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE", 0, + KEY_READ, ®_key); + + if (res == ERROR_SUCCESS) + res = RegOpenKeyExA (reg_key, "Free Software Foundation", 0, + KEY_READ, ®_key); + + if (res != ERROR_SUCCESS) + { + reg_key = (HKEY) INVALID_HANDLE_VALUE; + return 0; + } + } + + size = 32; + dst = (char *) malloc (size); + + res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); + if (res == ERROR_MORE_DATA && type == REG_SZ) + { + dst = (char *) realloc (dst, size); + res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size); + } + + if (type != REG_SZ || res != ERROR_SUCCESS) + { + free (dst); + dst = 0; + } + + return dst; +} +#endif + +/* If NAME starts with a '@' or '$', apply the translation rules above + and return a new name. Otherwise, return the given name. */ + +static char * +translate_name (name) + char *name; +{ + char code = name[0]; + char *key, *prefix; + int keylen; + + if (code != '@' && code != '$') + return name; + + for (keylen = 0; + (name[keylen + 1] != 0 && name[keylen + 1] != '/' +#ifdef DIR_SEPARATOR + && name[keylen + 1] != DIR_SEPARATOR +#endif + ); + keylen++) + ; + + key = alloca (keylen + 1); + strncpy (key, &name[1], keylen); + key[keylen] = 0; + + name = &name[keylen + 1]; + + if (code == '@') + { + prefix = get_key_value (key); + if (prefix == 0) + prefix = PREFIX; + } + else + { + prefix = getenv (key); + if (prefix == 0) + prefix = concat ("$", key, NULL_PTR); + } + + /* Remove any trailing directory separator from what we got. */ + if (prefix[strlen (prefix) - 1] == '/' +#ifdef DIR_SEPARATOR + || prefix[strlen (prefix) - 1] == DIR_SEPARATOR +#endif + ) + { + prefix = save_string (prefix, strlen (prefix)); + prefix[strlen (prefix) - 1] = 0; + } + + return concat (prefix, name, NULL_PTR); +} + +/* Update PATH using KEY if PATH starts with PREFIX. */ + +char * +update_path (path, key) + char *path; + char *key; +{ + if (! strncmp (path, PREFIX, strlen (PREFIX)) && key != 0) + { + if (key[0] != '$') + key = concat ("@", key, NULL_PTR); + + path = concat (key, &path[strlen (PREFIX)], NULL_PTR); + + while (path[0] == '@' || path[0] == '$') + path = translate_name (path); + } + +#ifdef DIR_SEPARATOR + if (DIR_SEPARATOR != '/') + { + int i; + int len = strlen (path); + + path = save_string (path, len); + for (i = 0; i < len; i++) + if (path[i] == '/') + path[i] = DIR_SEPARATOR; + } +#endif + + return path; +} diff --git a/gcc/regmove.c b/gcc/regmove.c new file mode 100644 index 00000000000..639059b3686 --- /dev/null +++ b/gcc/regmove.c @@ -0,0 +1,983 @@ +/* Move registers around to reduce number of move instructions needed. + Copyright (C) 1987, 88, 89, 92-5, 1996, 1997 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + + +/* This module looks for cases where matching constraints would force + an instruction to need a reload, and this reload would be a register + to register move. It then attempts to change the registers used by the + instruction to avoid the move instruction. */ + +#include "config.h" +#ifdef __STDC__ +#include <stdarg.h> +#else +#include <varargs.h> +#endif + +/* Must precede rtl.h for FFS. */ +#include <stdio.h> + +#include "rtl.h" +#include "insn-config.h" +#include "recog.h" +#include "output.h" +#include "reload.h" +#include "regs.h" + +static int stable_but_for_p PROTO((rtx, rtx, rtx)); + +#if defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) \ + || defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) + +/* INC_INSN is an instruction that adds INCREMENT to REG. + Try to fold INC_INSN as a post/pre in/decrement into INSN. + Iff INC_INSN_SET is nonzero, inc_insn has a destination different from src. + Return nonzero for success. */ +static int +try_auto_increment (insn, inc_insn, inc_insn_set, reg, increment, pre) + rtx reg, insn, inc_insn ,inc_insn_set; + HOST_WIDE_INT increment; + int pre; +{ + enum rtx_code inc_code; + + rtx pset = single_set (insn); + if (pset) + { + /* Can't use the size of SET_SRC, we might have something like + (sign_extend:SI (mem:QI ... */ + rtx use = find_use_as_address (pset, reg, 0); + if (use != 0 && use != (rtx) 1) + { + int size = GET_MODE_SIZE (GET_MODE (use)); + if (0 +#ifdef HAVE_POST_INCREMENT + || (pre == 0 && (inc_code = POST_INC, increment == size)) +#endif +#ifdef HAVE_PRE_INCREMENT + || (pre == 1 && (inc_code = PRE_INC, increment == size)) +#endif +#ifdef HAVE_POST_DECREMENT + || (pre == 0 && (inc_code = POST_DEC, increment == -size)) +#endif +#ifdef HAVE_PRE_DECREMENT + || (pre == 1 && (inc_code = PRE_DEC, increment == -size)) +#endif + ) + { + if (inc_insn_set) + validate_change + (inc_insn, + &SET_SRC (inc_insn_set), + XEXP (SET_SRC (inc_insn_set), 0), 1); + validate_change (insn, &XEXP (use, 0), + gen_rtx (inc_code, + Pmode, + reg), 1); + if (apply_change_group ()) + { + REG_NOTES (insn) + = gen_rtx (EXPR_LIST, REG_INC, + reg, REG_NOTES (insn)); + if (! inc_insn_set) + { + PUT_CODE (inc_insn, NOTE); + NOTE_LINE_NUMBER (inc_insn) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (inc_insn) = 0; + } + return 1; + } + } + } + } + return 0; +} +#endif /* defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) */ + +void +regmove_optimize (f, nregs, regmove_dump_file) + rtx f; + int nregs; + FILE *regmove_dump_file; +{ +#ifdef REGISTER_CONSTRAINTS + rtx insn; + int matches[MAX_RECOG_OPERANDS][MAX_RECOG_OPERANDS]; + int modified[MAX_RECOG_OPERANDS]; + int early_clobber[MAX_RECOG_OPERANDS]; + int commutative; + int pass; + + /* A forward/backward pass. Replace output operands with input operands. */ + + for (pass = 0; pass < 2; pass++) + { + if (regmove_dump_file) + fprintf (regmove_dump_file, "Starting %s pass...\n", + pass ? "backward" : "forward"); + + for (insn = pass ? get_last_insn () : f; insn; + insn = pass ? PREV_INSN (insn) : NEXT_INSN (insn)) + { + if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') + { + int insn_code_number = recog_memoized (insn); + int operand_number, match_number; + + if (insn_code_number < 0) + continue; + + insn_extract (insn); + if (! constrain_operands (insn_code_number, 0)) + continue; + + commutative = -1; + + /* Must initialize this before the loop, because the code for + the commutative case may set matches for operands other than + the current one. */ + bzero (matches, sizeof (matches)); + + for (operand_number = 0; + operand_number < insn_n_operands[insn_code_number]; + operand_number++) + { + int output_operand = 0; + int matching_operand = operand_number; + char *p, c; + int i = 0; + + modified[operand_number] = 0; + early_clobber[operand_number] = 0; + + p = insn_operand_constraint[insn_code_number][operand_number]; + + if (*p == '=') + modified[operand_number] = 2; + else if (*p == '+') + modified[operand_number] = 1; + + for (;*p && i < which_alternative; p++) + if (*p == ',') + i++; + + while ((c = *p++) != '\0' && c != ',') + switch (c) + { + case '=': + break; + case '+': + break; + case '&': + early_clobber[operand_number] = 1; + break; + case '%': + commutative = operand_number; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + c -= '0'; + matches[operand_number][c] = 1; + if (commutative >= 0) + { + if (c == commutative || c == commutative + 1) + { + int other = c + (c == commutative ? 1 : -1); + matches[operand_number][other] = 1; + } + if (operand_number == commutative + || operand_number == commutative + 1) + { + int other = (operand_number + + (operand_number == commutative + ? 1 : -1)); + matches[other][c] = 1; + } + } + break; + } + } + + /* Now scan through the operands looking for a source operand + which is supposed to match the destination operand. + Then scan forward for an instruction which uses the dest + operand. + If it dies there, then replace the dest in both operands with + the source operand. */ + + for (operand_number = 0; + operand_number < insn_n_operands[insn_code_number]; + operand_number++) + { + for (match_number = 0; + match_number < insn_n_operands[insn_code_number]; + match_number++) + { + rtx set, p, src, dst, src_subreg; + rtx post_inc = 0, post_inc_set = 0, search_end = 0; + rtx src_note, dst_note; + int success = 0; + int num_calls = 0; + enum rtx_code code = NOTE; + HOST_WIDE_INT insn_const, newconst; + rtx overlap = 0; /* need to move insn ? */ + + /* Nothing to do if the two operands aren't supposed to + match. */ + if (matches[operand_number][match_number] == 0) + continue; + + src = recog_operand[operand_number]; + dst = recog_operand[match_number]; + + if (GET_CODE (src) != REG + || REGNO (src) < FIRST_PSEUDO_REGISTER) + continue; + + src_subreg = src; + if (GET_CODE (dst) == SUBREG + && GET_MODE_SIZE (GET_MODE (dst)) + >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (dst)))) + { + src_subreg + = gen_rtx(SUBREG, GET_MODE (SUBREG_REG (dst)), + src, SUBREG_WORD (dst)); + dst = SUBREG_REG (dst); + } + if (GET_CODE (dst) != REG + || REGNO (dst) < FIRST_PSEUDO_REGISTER) + continue; + + /* If the operands already match, then there is nothing + to do. */ + if (operands_match_p (src, dst)) + continue; + + set = single_set (insn); + if (! set) + continue; + + /* operand_number/src must be a read-only operand, and + match_operand/dst must be a write-only operand. */ + if (modified[match_number] != 2) + continue; + + if (early_clobber[match_number] == 1) + continue; + + if (modified[operand_number] != 0) + continue; + + /* Make sure match_operand is the destination. */ + if (recog_operand[match_number] != SET_DEST (set)) + continue; + + src_note = find_reg_note (insn, REG_DEAD, src); + + if (! src_note) + { + /* Look for (set (regX) (op regA constX)) + (set (regY) (op regA constY)) + and change that to + (set (regA) (op regA constX)). + (set (regY) (op regA constY-constX)). + This works for add and shift operations, if + regA is dead after or set by the second insn. */ + + code = GET_CODE (SET_SRC (set)); + if ((code == PLUS || code == LSHIFTRT + || code == ASHIFT || code == ASHIFTRT) + && XEXP (SET_SRC (set), 0) == src + && (GET_CODE (XEXP (SET_SRC (set), 1)) + == CONST_INT)) + insn_const = INTVAL (XEXP (SET_SRC (set), 1)); + else if (! stable_but_for_p (SET_SRC (set), src, dst)) + continue; + else + /* We might find a src_note while scanning. */ + code = NOTE; + } + + if (regmove_dump_file) + fprintf (regmove_dump_file, + "Could fix operand %d of insn %d matching operand %d.\n", + operand_number, INSN_UID (insn), match_number); + + /* ??? If src is set once, and is set equal to a + constant, then do not use it for this optimization, + as this would make it no longer equivalent to a + constant? */ + + /* Scan forward to find the next instruction that + uses the output operand. If the operand dies here, + then replace it in both instructions with + operand_number. */ + + for (p = NEXT_INSN (insn); p; p = NEXT_INSN (p)) + { + if (GET_CODE (p) == CODE_LABEL + || GET_CODE (p) == JUMP_INSN + || (GET_CODE (p) == NOTE + && ((NOTE_LINE_NUMBER (p) + == NOTE_INSN_LOOP_BEG) + || (NOTE_LINE_NUMBER (p) + == NOTE_INSN_LOOP_END)))) + break; + + if (GET_RTX_CLASS (GET_CODE (p)) != 'i') + continue; + + if (reg_set_p (src, p) || reg_set_p (dst, p) + || (GET_CODE (PATTERN (p)) == USE + && reg_overlap_mentioned_p (src, + XEXP (PATTERN (p), + 0)))) + break; + + /* See if all of DST dies in P. This test is + slightly more conservative than it needs to be. */ + if ((dst_note + = find_regno_note (p, REG_DEAD, REGNO (dst))) + && (GET_MODE (XEXP (dst_note, 0)) + == GET_MODE (dst))) + { + if (! src_note) + { + rtx q; + rtx set2; + + /* If an optimization is done, the value + of SRC while P is executed will be + changed. Check that this is OK. */ + if (reg_overlap_mentioned_p (src, + PATTERN (p))) + break; + for (q = p; q; q = NEXT_INSN (q)) + { + if (GET_CODE (q) == CODE_LABEL + || GET_CODE (q) == JUMP_INSN + || (GET_CODE (q) == NOTE + && ((NOTE_LINE_NUMBER (q) + == NOTE_INSN_LOOP_BEG) + || (NOTE_LINE_NUMBER (q) + == NOTE_INSN_LOOP_END)))) + { + q = 0; + break; + } + if (GET_RTX_CLASS (GET_CODE (q)) != 'i') + continue; + if (reg_overlap_mentioned_p (src, + PATTERN (q)) + || reg_set_p (src, q)) + break; + } + if (q) + set2 = single_set (q); + if (! q || ! set2 + || GET_CODE (SET_SRC (set2)) != code + || XEXP (SET_SRC (set2), 0) != src + || (GET_CODE (XEXP (SET_SRC (set2), 1)) + != CONST_INT) + || (SET_DEST (set2) != src + && !find_reg_note (q, REG_DEAD, src))) + { + /* If this is a PLUS, we can still save + a register by doing + src += insn_const; + P; + src -= insn_const; . + This also gives opportunities for + subsequent optimizations in the + backward pass, so do it there. */ + if (code == PLUS && pass == 1 +#ifdef HAVE_cc0 + /* We man not emit an insn directly + after P if the latter sets CC0. */ + && ! sets_cc0_p (PATTERN (p)) +#endif + ) + + { + search_end = q; + q = insn; + set2 = set; + newconst = -insn_const; + code = MINUS; + } + else + break; + } + else + { + newconst + = (INTVAL (XEXP (SET_SRC (set2), 1)) + - insn_const); + /* Reject out of range shifts. */ + if (code != PLUS + && (newconst < 0 + || (newconst + >= GET_MODE_BITSIZE (GET_MODE (SET_SRC (set2)))))) + break; + if (code == PLUS) + { + post_inc = q; + if (SET_DEST (set2) != src) + post_inc_set = set2; + } + } + /* We use 1 as last argument to + validate_change so that all changes + are accepted or rejected together by + apply_change_group when it is called + by validate_replace_rtx . */ + validate_change (q, &XEXP (SET_SRC (set2), 1), + GEN_INT (newconst), 1); + } + validate_change (insn, + recog_operand_loc[match_number], + src, 1); + if (validate_replace_rtx (dst, src_subreg, p)) + success = 1; + break; + } + + if (reg_overlap_mentioned_p (dst, PATTERN (p))) + break; + if (! src_note + && reg_overlap_mentioned_p (src, PATTERN (p))) + { + /* INSN was already checked to be movable when + we found no REG_DEAD note for src on it. */ + overlap = p; + src_note = find_reg_note (p, REG_DEAD, src); + } + + /* If we have passed a call instruction, and the + pseudo-reg SRC is not already live across a call, + then don't perform the optimization. */ + if (GET_CODE (p) == CALL_INSN) + { + num_calls++; + + if (REG_N_CALLS_CROSSED (REGNO (src)) == 0) + break; + } + } + + if (success) + { + /* Remove the death note for DST from P. */ + remove_note (p, dst_note); + if (code == MINUS) + { + post_inc + = emit_insn_after (copy_rtx (PATTERN (insn)), + p); +#if defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) + if (search_end + && try_auto_increment (search_end, post_inc, + 0, src, newconst, 1)) + post_inc = 0; +#endif + validate_change (insn, &XEXP (SET_SRC (set), 1), + GEN_INT (insn_const), 0); + REG_N_SETS (REGNO (src))++; + } + if (overlap) + { + /* The lifetime of src and dest overlap, + but we can change this by moving insn. */ + rtx pat = PATTERN (insn); + if (src_note) + remove_note (overlap, src_note); +#if defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) + if (code == PLUS + && try_auto_increment (overlap, insn, 0, + src, insn_const, 0)) + insn = overlap; + else +#endif + { + emit_insn_after_with_line_notes + (pat, PREV_INSN (p), insn); + PUT_CODE (insn, NOTE); + NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (insn) = 0; + /* emit_insn_after_with_line_notes + has no return value, so search + for the new insn. */ + for (insn = p; PATTERN (insn) != pat; ) + insn = PREV_INSN (insn); + } + } + /* Sometimes we'd generate src = const; src += n; + if so, replace the instruction that set src + in the first place. */ + + if (! overlap && (code == PLUS || code == MINUS)) + { + rtx note + = find_reg_note (insn, REG_EQUAL, NULL_RTX); + rtx q, set2; + int num_calls2 = 0; + + if (note && CONSTANT_P (XEXP (note, 0))) + { + for (q = PREV_INSN (insn); q; + q = PREV_INSN(q)) + { + if (GET_CODE (q) == JUMP_INSN) + { + q = 0; + break; + } + if (GET_RTX_CLASS (GET_CODE (q)) != 'i') + continue; + if (reg_set_p (src, q)) + { + set2 = single_set (q); + break; + } + if (reg_overlap_mentioned_p (src, + PATTERN (q))) + { + q = 0; + break; + } + if (GET_CODE (p) == CALL_INSN) + num_calls2++; + } + if (q && set2 && SET_DEST (set2) == src + && CONSTANT_P (SET_SRC (set2)) + && validate_change (insn, &SET_SRC (set), + XEXP (note, 0), 0)) + { + PUT_CODE (q, NOTE); + NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (q) = 0; + REG_N_SETS (REGNO (src))--; + REG_N_CALLS_CROSSED (REGNO (src)) + -= num_calls2; + insn_const = 0; + } + } + } + if (0) ; +#if defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) + else if ((code == PLUS || code == MINUS) + && insn_const + && try_auto_increment (p, insn, 0, + src, insn_const, 1)) + insn = p; +#endif +#if defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) + else if (post_inc + && try_auto_increment (p, post_inc, + post_inc_set, src, + newconst, 0)) + post_inc = 0; +#endif +#if defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) + /* If post_inc still prevails, try to find an + insn where it can be used as a pre-in/decrement. + If code is MINUS, this was already tried. */ + if (post_inc && code == PLUS + /* Check that newconst is likely to be usable + in a pre-in/decrement before starting the + search. */ + && (0 +#if defined (HAVE_PRE_INCREMENT) + || (newconst > 0 && newconst <= MOVE_MAX) +#endif +#if defined (HAVE_PRE_DECREMENT) + || (newconst < 0 && newconst >= -MOVE_MAX) +#endif + ) && exact_log2 (newconst)) + { + rtx q, inc_dest; + + inc_dest + = post_inc_set ? SET_DEST (post_inc_set) : src; + for (q = post_inc; q = NEXT_INSN (q); ) + { + if (GET_CODE (q) == CODE_LABEL + || GET_CODE (q) == JUMP_INSN + || (GET_CODE (q) == NOTE + && ((NOTE_LINE_NUMBER (q) + == NOTE_INSN_LOOP_BEG) + || (NOTE_LINE_NUMBER (q) + == NOTE_INSN_LOOP_END)))) + break; + if (GET_RTX_CLASS (GET_CODE (q)) != 'i') + continue; + if (src != inc_dest + && (reg_overlap_mentioned_p (src, + PATTERN (q)) + || reg_set_p (src, q))) + break; + if (reg_set_p (inc_dest, q)) + break; + if (reg_overlap_mentioned_p (inc_dest, + PATTERN (q))) + { + try_auto_increment (q, post_inc, + post_inc_set, + inc_dest, + newconst, 1); + break; + } + } + } +#endif /* defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) */ + /* Move the death note for DST to INSN if it is used + there. */ + if (reg_overlap_mentioned_p (dst, PATTERN (insn))) + { + XEXP (dst_note, 1) = REG_NOTES (insn); + REG_NOTES (insn) = dst_note; + } + + if (src_note) + { + /* Move the death note for SRC from INSN to P. */ + if (! overlap) + remove_note (insn, src_note); + XEXP (src_note, 1) = REG_NOTES (p); + REG_NOTES (p) = src_note; + + REG_N_CALLS_CROSSED (REGNO (src)) += num_calls; + } + + REG_N_SETS (REGNO (src))++; + REG_N_SETS (REGNO (dst))--; + + REG_N_CALLS_CROSSED (REGNO (dst)) -= num_calls; + + /* ??? Must adjust reg_live_length, and reg_n_refs for + both registers. Must keep track of loop_depth in + order to get reg_n_refs adjustment correct. */ + + if (regmove_dump_file) + fprintf (regmove_dump_file, + "Fixed operand %d of insn %d matching operand %d.\n", + operand_number, INSN_UID (insn), + match_number); + + goto done_forwards; + } + } + } + done_forwards: + ; + } + } + } + + /* A backward pass. Replace input operands with output operands. */ + + if (regmove_dump_file) + fprintf (regmove_dump_file, "Starting backward pass...\n"); + + for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) + { + if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') + { + int insn_code_number = recog_memoized (insn); + int operand_number, match_number; + + if (insn_code_number < 0) + continue; + + insn_extract (insn); + if (! constrain_operands (insn_code_number, 0)) + continue; + + commutative = -1; + + /* Must initialize this before the loop, because the code for + the commutative case may set matches for operands other than + the current one. */ + bzero (matches, sizeof (matches)); + + for (operand_number = 0; + operand_number < insn_n_operands[insn_code_number]; + operand_number++) + { + int output_operand = 0; + int matching_operand = operand_number; + char *p, c; + int i = 0; + + modified[operand_number] = 0; + early_clobber[operand_number] = 0; + + p = insn_operand_constraint[insn_code_number][operand_number]; + + if (*p == '=') + modified[operand_number] = 2; + else if (*p == '+') + modified[operand_number] = 1; + + for (; *p && i < which_alternative; p++) + if (*p == ',') + i++; + + while ((c = *p++) != '\0' && c != ',') + switch (c) + { + case '=': + break; + case '+': + break; + case '&': + early_clobber[operand_number] = 1; + break; + case '%': + commutative = operand_number; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + c -= '0'; + matches[c][operand_number] = 1; + if (commutative >= 0) + { + if (c == commutative || c == commutative + 1) + { + int other = c + (c == commutative ? 1 : -1); + matches[other][operand_number] = 1; + } + if (operand_number == commutative + || operand_number == commutative + 1) + { + int other = (operand_number + + (operand_number == commutative + ? 1 : -1)); + matches[c][other] = 1; + } + } + break; + } + } + + /* Now scan through the operands looking for a destination operand + which is supposed to match a source operand. + Then scan backward for an instruction which sets the source + operand. If safe, then replace the source operand with the + dest operand in both instructions. */ + + for (operand_number = 0; + operand_number < insn_n_operands[insn_code_number]; + operand_number++) + { + for (match_number = 0; + match_number < insn_n_operands[insn_code_number]; + match_number++) + { + rtx set, p, src, dst; + rtx src_note, dst_note; + int success = 0; + int num_calls = 0; + + /* Nothing to do if the two operands aren't supposed to + match. */ + if (matches[operand_number][match_number] == 0) + continue; + + dst = recog_operand[operand_number]; + src = recog_operand[match_number]; + + if (GET_CODE (src) != REG + || REGNO (src) < FIRST_PSEUDO_REGISTER) + continue; + + if (GET_CODE (dst) != REG + || REGNO (dst) < FIRST_PSEUDO_REGISTER) + continue; + + /* If the operands already match, then there is nothing + to do. */ + if (operands_match_p (src, dst)) + continue; + + set = single_set (insn); + if (! set) + continue; + + /* operand_number/dst must be a write-only operand, and + match_operand/src must be a read-only operand. */ + if (modified[match_number] != 0) + continue; + + if (early_clobber[operand_number] == 1) + continue; + + if (modified[operand_number] != 2) + continue; + + /* Make sure operand_number is the destination. */ + if (recog_operand[operand_number] != SET_DEST (set)) + continue; + + if (! (src_note = find_reg_note (insn, REG_DEAD, src))) + continue; + + /* Can not modify an earlier insn to set dst if this insn + uses an old value in the source. */ + if (reg_overlap_mentioned_p (dst, SET_SRC (set))) + continue; + + if (regmove_dump_file) + fprintf (regmove_dump_file, + "Could fix operand %d of insn %d matching operand %d.\n", + operand_number, INSN_UID (insn), match_number); + + /* ??? If src is set once, and is set equal to a constant, + then do not use it for this optimization, as this would + make it no longer equivalent to a constant? */ + + /* Scan backward to find the first instruction that uses + the input operand. If the operand is set here, then + replace it in both instructions with operand_number. */ + + for (p = PREV_INSN (insn); p; p = PREV_INSN (p)) + { + rtx pset; + + if (GET_CODE (p) == CODE_LABEL + || GET_CODE (p) == JUMP_INSN + || (GET_CODE (p) == NOTE + && (NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_BEG + || NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END))) + break; + + if (GET_RTX_CLASS (GET_CODE (p)) != 'i') + continue; + + /* ??? See if all of SRC is set in P. This test is much + more conservative than it needs to be. */ + pset = single_set (p); + if (pset && SET_DEST (pset) == src) + { + /* We use validate_replace_rtx, in case there + are multiple identical source operands. All of + them have to be changed at the same time. */ + if (validate_replace_rtx (src, dst, insn)) + { + if (validate_change (p, &SET_DEST (pset), + dst, 0)) + success = 1; + else + { + /* Change all source operands back. + This modifies the dst as a side-effect. */ + validate_replace_rtx (dst, src, insn); + /* Now make sure the dst is right. */ + validate_change (insn, + recog_operand_loc[operand_number], + dst, 0); + } + } + break; + } + + if (reg_overlap_mentioned_p (src, PATTERN (p)) + || reg_overlap_mentioned_p (dst, PATTERN (p))) + break; + + /* If we have passed a call instruction, and the + pseudo-reg DST is not already live across a call, + then don't perform the optimization. */ + if (GET_CODE (p) == CALL_INSN) + { + num_calls++; + + if (REG_N_CALLS_CROSSED (REGNO (dst)) == 0) + break; + } + } + + if (success) + { + /* Remove the death note for SRC from INSN. */ + remove_note (insn, src_note); + /* Move the death note for SRC to P if it is used + there. */ + if (reg_overlap_mentioned_p (src, PATTERN (p))) + { + XEXP (src_note, 1) = REG_NOTES (p); + REG_NOTES (p) = src_note; + } + /* If there is a REG_DEAD note for DST on P, then remove + it, because DST is now set there. */ + if (dst_note = find_reg_note (p, REG_DEAD, dst)) + remove_note (p, dst_note); + + REG_N_SETS (REGNO (dst))++; + REG_N_SETS (REGNO (src))--; + + REG_N_CALLS_CROSSED (REGNO (dst)) += num_calls; + REG_N_CALLS_CROSSED (REGNO (src)) -= num_calls; + + /* ??? Must adjust reg_live_length, and reg_n_refs for + both registers. Must keep track of loop_depth in + order to get reg_n_refs adjustment correct. */ + + if (regmove_dump_file) + fprintf (regmove_dump_file, + "Fixed operand %d of insn %d matching operand %d.\n", + operand_number, INSN_UID (insn), match_number); + + goto done_backwards; + } + } + } + done_backwards: + ; + } + } +#endif /* REGISTER_CONSTRAINTS */ +} + +/* return nonzero if X is stable but for mentioning SRC or mentioning / + changing DST . If in doubt, presume it is unstable. */ +static int +stable_but_for_p (x, src, dst) + rtx x, src, dst; +{ + RTX_CODE code = GET_CODE (x); + switch (GET_RTX_CLASS (code)) + { + case '<': case '1': case 'c': case '2': case 'b': case '3': + { + int i; + char *fmt = GET_RTX_FORMAT (code); + for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) + if (fmt[i] == 'e' && ! stable_but_for_p (XEXP (x, i), src, dst)) + return 0; + return 1; + } + case 'o': + if (x == src || x == dst) + return 1; + /* fall through */ + default: + return ! rtx_unstable_p (x); + } +} diff --git a/gcc/system.h b/gcc/system.h new file mode 100644 index 00000000000..920e5128c68 --- /dev/null +++ b/gcc/system.h @@ -0,0 +1,188 @@ +/* system.h - Get common system includes and various definitions and + declarations based on autoconf macros. + Copyright (C) 1998 Free Software Foundation, Inc. + + */ + +#ifndef __GCC_SYSTEM_H__ +#define __GCC_SYSTEM_H__ + +#include <stdio.h> +#include <ctype.h> + +/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + + Bruno Haible adds: + + "... Furthermore, isupper(c) etc. have an undefined result if c is + outside the range -1 <= c <= 255. One is tempted to write isupper(c) + with c being of type `char', but this is wrong if c is an 8-bit + character >= 128 which gets sign-extended to a negative value. + The macro ISUPPER protects against this as well." */ + +#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) +# define IN_CTYPE_DOMAIN(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) isascii(c) +#endif + +#ifdef isblank +# define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c)) +#else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +#endif +#ifdef isgraph +# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c)) +#else +# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c)) +#endif + +#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) +#define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) +#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) +#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c)) +#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) +#define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c)) +#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) +#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) +#define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) +#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) + +/* ISDIGIT differs from ISDIGIT_LOCALE, as follows: + - Its arg may be any int or unsigned int; it need not be an unsigned char. + - It's guaranteed to evaluate its argument exactly once. + - It's typically faster. + Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that + only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless + it's important to use the locale's definition of `digit' even when the + host does not conform to Posix. */ +#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) + + +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> + +#ifndef errno +extern int errno; +#endif + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# ifdef HAVE_STRINGS_H +# include <strings.h> +# endif +#endif + +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif + +#if HAVE_LIMITS_H +# include <limits.h> +#endif + +#ifdef TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +#endif +#endif + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#else +# include <sys/file.h> +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 +# define SEEK_CUR 1 +# define SEEK_END 2 +#endif +#ifndef F_OK +# define F_OK 0 +# define X_OK 1 +# define W_OK 2 +# define R_OK 4 +#endif + + + +#ifndef bcopy +# ifdef HAVE_BCOPY +# ifdef NEED_DECLARATION_BCOPY +void bcopy (); +# endif +# else /* ! HAVE_BCOPY */ +# define bcopy(src,dst,len) memcpy ((dst),(src),(len)) +# endif +#endif + +#ifndef bcmp +# ifdef HAVE_BCMP +# ifdef NEED_DECLARATION_BCMP +void bcmp (); +# endif +# else /* ! HAVE_BCMP */ +# define bcmp(left,right,len) memcmp ((left),(right),(len)) +# endif +#endif + +#ifndef bzero +# ifdef HAVE_BZERO +# ifdef NEED_DECLARATION_BZERO +void bzero (); +# endif +# else /* ! HAVE_BZERO */ +# define bzero(dst,len) memset ((dst),0,(len)) +# endif +#endif + +#ifndef index +# ifdef HAVE_INDEX +# ifdef NEED_DECLARATION_INDEX +extern char *index (); +# endif +# else /* ! HAVE_INDEX */ +# define index strchr +# endif +#endif + +#ifndef rindex +# ifdef HAVE_RINDEX +# ifdef NEED_DECLARATION_RINDEX +extern char *rindex (); +# endif +# else /* ! HAVE_RINDEX */ +# define rindex strrchr +# endif +#endif + +#ifdef NEED_DECLARATION_FREE +extern void free (); +#endif + +#endif /* __GCC_SYSTEM_H__ */ diff --git a/gcc/version.c b/gcc/version.c deleted file mode 100644 index b1829cb7c81..00000000000 --- a/gcc/version.c +++ /dev/null @@ -1 +0,0 @@ -char *version_string = "testgcc-2.7.90 970802 experimental"; |