IMPORTANT: After applying this patch, you must rebuild the Info documentation derived from the Texinfo files in the g77 distribution, as this patch does not include patches to any derived files (to keep the size of the patch file down). Use the following command sequence after applying this patch to the `g77' directory: cd g77; make -k -f f/Makefile.in g77-only If that fails due to `makeinfo' not being installed, obtain texinfo-3.11.tar.gz from a GNU distribution site, unpack, build, and install it, and try the above command sequence again. Alternately, instead of using this patch, obtain the full g77 distribution named g77-0.5.22.tar.gz. This distribution contains the derived Info documentation, plus other derived files like f/BUGS, f/INSTALL, f/NEWS, f/runtime/configure, and f/runtime/libU77/configure. diff -rcp2N g77-0.5.21/README.g77 g77-0.5.22/README.g77 *** g77-0.5.21/README.g77 Tue Sep 2 21:25:23 1997 --- g77-0.5.22/README.g77 Sun Mar 8 21:18:29 1998 *************** *** 1,11 **** ! 1997-09-02 ! This directory contains the version 0.5.21 release of the GNU Fortran compiler. The GNU Fortran compiler is free software. See the file COPYING.g77 for copying permission. ! * IMPORTANT: Things you _must_ do are marked with a * at the beginning of the line in this file!!! This README is for GNU Fortran, and describes the files in the f/ directory. The f/ directory is intended to be a subdirectory of a --- 1,20 ---- ! 1998-03-08 ! This directory contains the version 0.5.22 release of the GNU Fortran compiler. The GNU Fortran compiler is free software. See the file COPYING.g77 for copying permission. ! * IMPORTANT: Things you *must* do are marked with a * at the beginning of the line in this file!!! + * DO NOT send any email (reporting bugs, asking questions, etc.) to + without *first* reading the g77 documentation, + using `info', Info mode in GNU Emacs, or a text viewer such as `more'. + The g77 documentation is in the files named `g77.info', `g77.info-1', + `g77.info-2', and so on in g77 `f' directory. If these files are + not present or you can't find them, contact the person or organization + that put together the g77 distribution you are using (probably not the + FSF), or ask your system administrator for help. + This README is for GNU Fortran, and describes the files in the f/ directory. The f/ directory is intended to be a subdirectory of a *************** you must merge the contents of the g77 d *** 29,38 **** gcc distribution on your system before proceeding. ! * Read and follow the instructions in g77-0.5.21/f/INSTALL that explain how to merge a g77 source directory into a gcc source directory. You can use Info to read the same installation instructions via: ! info -f g77-0.5.21/f/g77.info -n Unpacking The resulting directory layout includes the following, where gcc/ might be --- 38,47 ---- gcc distribution on your system before proceeding. ! * Read and follow the instructions in g77-0.5.22/f/INSTALL that explain how to merge a g77 source directory into a gcc source directory. You can use Info to read the same installation instructions via: ! info -f g77-0.5.22/f/g77.info -n Unpacking The resulting directory layout includes the following, where gcc/ might be *************** a link to, for example, gcc-2.7.2.3/: *** 49,53 **** gcc/f/ as a whole contains the program GNU Fortran (g77), plus a portion ! of the separate program f2c, which is in gcc/f/runtime. NOTE: The f2c code is not part of the program g77, just distributed with it. --- 58,62 ---- gcc/f/ as a whole contains the program GNU Fortran (g77), plus a portion ! of the separate program f2c, which is in gcc/f/runtime. NOTE: The libf2c code is not part of the program g77, just distributed with it. *************** and installing g77. *** 67,73 **** Applying g77 patches in the form of .diff files is done by typing ! "patch -p1 -d gcc" (where gcc/f/ is the active version). That is, g77 patches are distributed in the same form, and at the same directory ! level, as patches to the gcc distribution. gcc/f/ has text files that document the Fortran compiler, source --- 76,84 ---- Applying g77 patches in the form of .diff files is done by typing ! `patch -p1 -d gcc' (where gcc/f/ is the active version). That is, g77 patches are distributed in the same form, and at the same directory ! level, as patches to the gcc distribution. (Note: make sure you're ! using GNU patch, version 2.5 or later! Other versions of patch ! have trouble with g77-related patches.) gcc/f/ has text files that document the Fortran compiler, source *************** seen in gcc/f/DOC) listed in the ~fortra *** 109,114 **** * Read gcc/f/BUGS, gcc/f/INSTALL, and gcc/f/NEWS at the very least! All users of g77 (not just installers) should read gcc/f/g77.info* ! as well, using the "more" command if the "info" command is ! unavailable or they aren't accustomed to using it. If you want to get into the FFE code, which lives entirely in gcc/f/, here --- 120,126 ---- * Read gcc/f/BUGS, gcc/f/INSTALL, and gcc/f/NEWS at the very least! All users of g77 (not just installers) should read gcc/f/g77.info* ! as well, using the `more' command if neither the `info' command, ! nor GNU Emacs (with its Info mode), are available, or if they ! aren't yet accustomed to using these tools. If you want to get into the FFE code, which lives entirely in gcc/f/, here *************** the compiler is in the second pass, othe *** 162,164 **** a bug in g77 until a fix is available.) ! Any questions or comments on these topics, email fortran@gnu.ai.mit.edu. --- 174,176 ---- a bug in g77 until a fix is available.) ! Any questions or comments on these topics, email . diff -rcp2N g77-0.5.21/f/ChangeLog g77-0.5.22/f/ChangeLog *** g77-0.5.21/f/ChangeLog Tue Sep 9 06:11:33 1997 --- g77-0.5.22/f/ChangeLog Mon Mar 16 20:42:46 1998 *************** *** 1,2 **** --- 1,245 ---- + Mon Mar 16 15:38:50 1998 Craig Burley + + * Version 0.5.22 released. + + Mon Mar 16 14:36:02 1998 Craig Burley + + Make -g work better for ENTRY: + * com.c (ffecom_start_progunit_): Master function + for ENTRY-laden procedure is not really invented, + so it can be debugged. + (ffecom_do_entry_): Push/set/pop lineno for each + entry point. + + Sun Mar 15 05:48:49 1998 Craig Burley + + * intrin.def: Fix spelling of mixed-case form + of `CPU_Time' (was `Cpu_Time'). + + 1998-03-09 Dave Love + + * Make-lang.in: Set CONFIG_SITE to a non-existent file since + /dev/null loses with bash 2.0/autoconf 2.12. Put + F77_FLAGS_TO_PASS before CC. + + Sun Mar 8 16:35:34 1998 Craig Burley + + * intrin.def: Use tabs instead of blanks more + consistently (excepting DEFGEN section for now). + + Sat Feb 28 15:24:38 1998 Craig Burley + + * intrin.def: Make CPU_TIME's arg generic real to be just + like SECOND_subr. + + Fri Feb 20 12:45:53 1998 Craig Burley + + * expr.c (ffeexpr_token_arguments_): Make sure + outer exprstack isn't null. + + 1998-02-16 Dave Love + + * Makefile.in (f/fini): Don't use -W -Wall with HOST_CC. + + Sun Jan 11 02:14:47 1998 Craig Burley + + Support FORMAT(I<1+2>) (constant variable-FORMAT + expressions): + * bad.def (FFEBAD_FORMAT_VARIABLE): New diagnostic. + * std.c (ffestd_R1001rtexpr_): New function. + (ffestd_R1001dump_, ffestd_R1001dump_1005_1_, + ffestd_R1001dump_1005_2_, ffestd_R1001dump_1005_3_, + ffestd_R1001dump_1005_4_, ffestd_R1001dump_1005_5_, + ffestd_R1001dump_1010_2_, ffestd_R1001dump_1010_3_, + ffestd_R1001dump_1010_4_, ffestd_R1001dump_1010_5_): + Use new function instead of ffestd_R1001error_. + + * stb.c (ffestb_R10014_, ffestb_R10016_, ffestb_R10018_, + ffestb_R100110_): Restructure `for' loop for style. + + Fix 970626-2.f by not doing most back-end processing + when current_function_decl is an ERROR_MARK, and by + making that the case when its type would be an ERROR_MARK: + * com.c (ffecom_start_progunit_, finish_function, + lang_printable_name, start_function, + ffecom_finish_symbol_transform_): Test for ERROR_MARK. + * std.c (ffestd_stmt_pass_): Don't do any downstream + processing if ERROR_MARK. + + * Make-lang.in (f77.install-common): Don't install, and + don't uninstall existing, Info files if f/g77.info + doesn't exit. (This is a somewhat modified version + of an egcs patch on 1998-01-07 12:05:51 by Bruno Haible + .) + + Fri Jan 9 19:09:07 1998 Craig Burley + + Fix -fpedantic combined with `F()' invocation, + also -fugly-comma combined with `IARGC()' invocation: + * bad.def (FFEBAD_NULL_ARGUMENT_W): New diagnostic. + * expr.c (ffeexpr_finished_): Don't reject null expressions + in the argument-expression context -- let outer context + handle that. + (ffeexpr_token_arguments_): Warn about null expressions + here if -fpedantic (as appropriate). + Obey -fugly-comma for only external-procedure invocations. + * intrin.c (ffeintrin_check_): No longer ignore explicit + omitted trailing args. + + Tue Dec 23 14:58:04 1997 Craig Burley + + * intrin.c (ffeintrin_fulfill_generic): Don't generate + FFEBAD_INTRINSIC_TYPE for CHARACTER*(*) intrinsic. + + * com.c (ffecom_gfrt_basictype): + (ffecom_gfrt_kindtype): + (ffecom_make_gfrt_): + (FFECOM_rttypeVOIDSTAR_): New return type `void *', for + the SIGNAL intrinsic. + * com-rt.def (FFECOM_rttypeSIGNAL): Now returns `void *'. + * intdoc.c: Replace `p' kind specifier with `7'. + * intrin.c (ffeintrin_check_, ffeintrin_init_0): Replace + `p' kind specifier with `7'. + * intrin.def (FFEINTRIN_impLOC, FFEINTRIN_impSIGNAL_func, + FFEINTRIN_impSIGNAL_subr): Replace `p' specifier with `7'. + Also, SIGNAL now returns a `void *' status, not `int'. + + Improve run-time diagnostic for "PRINT '(I1', 42": + * com.c (ffecom_char_args_x_): Renamed from ffecom_char_args_, + which is now a macro (to avoid lots of changes to other code) + with new arg, ffecom_char_args_with_null_ being another new + macro to call same function with different value for new arg. + This function now appends a null byte to opCONTER expression + if the new arg is TRUE. + (ffecom_arg_ptr_to_expr): Support NULL length pointer. + * ste.c (ffeste_io_cilist_): + (ffeste_io_icilist_): Pass NULL length ptr for + FORMAT expression, so null byte gets appended where + feasible. + * target.c (ffetarget_character1): + (ffetarget_concatenate_character1): + (ffetarget_substr_character1): + (ffetarget_convert_character1_character1): + (ffetarget_convert_character1_hollerith): + (ffetarget_convert_character1_integer4): + (ffetarget_convert_character1_logical4): + (ffetarget_convert_character1_typeless): + (ffetarget_hollerith): Append extra phantom null byte as + part of FFETARGET-NULL-BYTE kludge. + + * intrin.def (FFEINTRIN_impCPU_TIME): Point to + FFECOM_gfrtSECOND as primary run-time routine. + + Mon Dec 22 12:41:07 1997 Craig Burley + + * intrin.c (ffeintrin_init_0): Remove duplicate + check for `!'. + + Sun Dec 14 02:49:58 1997 Craig Burley + + * intrin.c (ffeintrin_init_0): Fix up indentation a bit. + Fix bug that prevented checking of arguments other + than the first. + + * intdoc.c: Fix up indentation a bit. + + Tue Dec 9 16:20:57 1997 Richard Henderson + + * com.c (ffecom_type_vardesc_): Vardesc.dims is a `ftnlen*'. + + Mon Dec 1 19:12:36 1997 Craig Burley + + * intrin.c (ffeintrin_check_): Fix up indentation a bit more. + + Mon Dec 1 16:21:08 1997 Craig Burley + + * com.c (ffecom_arglist_expr_): Crash if non-supplied + optional arg isn't passed as an address. + Pass null pointer explicitly, instead of via ffecom routine. + If incoming argstring is NULL, substitute pointer to "0". + Recognize '0' as ending the usual arg stuff, just like '\0'. + + Sun Nov 30 22:22:22 1997 Craig Burley + + * intdoc.c: Minor fix-ups. + + * intrin.c (ffeintrin_check_): Fix up indentation a bit. + + * intrin.def: Fix up spacing a bit. + + 1997-11-17 Dave Love + + * com.c (ffecom_arglist_expr_): Pass null pointers for optional + args which aren't supplied. + + Sun Nov 16 21:45:43 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * Make-lang.in (f77.install-info): Depend on f77.info. + + 1997-11-06 Dave Love + + * intrin.def: Allow non-integer args for INT2 and INT8 (per + documentation). + + Tue Oct 28 02:21:25 1997 Craig Burley + + * lang-options.h: Add -fgnu-intrinsics-* and + -fbadu77-intrinsics-* options. + + Sun Oct 26 02:36:21 1997 Craig Burley + + * com.c (lang_print_error_function): Fix to more + reliably notice when the diagnosed region changes. + + Sat Oct 25 23:43:36 1997 Craig Burley + + Fix 950327-0.f: + * sta.c, sta.h (ffesta_outpooldisp): New function. + * std.c (ffestd_stmt_pass_): Don't kill NULL pool. + (ffestd_R842): If pool already preserved, save NULL + for pool, because it should be killed only once. + + * malloc.c [MALLOC_DEBUG]: Put initializer for `name' + component in braces, to avoid compiler warning. + + Fri Oct 10 13:00:48 1997 Craig Burley + + * ste.c (ffeste_begin_iterdo_): Fix loop setup so iteration + variable is modified only after the #iterations is calculated; + otherwise if the iteration variable is aliased to any of the + operands in the start, end, or increment expressions, the + wrong #iterations might be calculated. + + * com.c (ffecom_save_tree): Fix indentation. + + 1997-10-05 Dave Love + + * intrin.def: Make SECOND_subr's arg generic real for people + porting from Cray and making everything double precision. + + Mon Sep 29 16:18:21 1997 Craig Burley + + * stu.c (ffestu_list_exec_transition_, + ffestu_dummies_transition_): Specify `bool' type for + `in_progress' variables. + + * com.h (assemble_string): Declare this routine (instead + of #include'ing "output.h" from gcc) to eliminate warnings + from lex.c. + + Fri Sep 19 01:12:27 1997 Craig Burley + + * expr.c (ffeexpr_reduced_eqop2_): + (ffeexpr_reduced_relop2_): Minor fixes to diagnostic code. + + * fini.c (main): Change return type to `int'. + + Wed Sep 17 10:47:08 1997 Craig Burley + + * com-rt.def (FFECOM_gfrtDSIGN, FFECOM_gfrtISIGN, + FFECOM_gfrtSIGN): Add second argument. + + * expr.c (ffeexpr_cb_comma_c_): Trivial fixes. + Tue Sep 9 01:59:35 1997 Craig Burley diff -rcp2N g77-0.5.21/f/Make-lang.in g77-0.5.22/f/Make-lang.in *** g77-0.5.21/f/Make-lang.in Tue Sep 2 21:25:24 1997 --- g77-0.5.22/f/Make-lang.in Sun Mar 15 10:56:31 1998 *************** f77-runtime-unsafe: *** 267,270 **** --- 267,276 ---- # appropriate (cross-)compiler has been built, thus depend on GCC_PARTS. # NB, sh uses the *first* value of $a from `a=fred a=joe prog'. + + # We want to specify CONFIG_SITE for `configure' to override any site + # configuration, the canonical version of which will force the wrong + # compiler; it turns out that if we use /dev/null we lose with the + # current autoconf and bash 2.0. Rather than create an empty one to + # read, we may as well use a non-existent one, `no-such-file' below. include/f2c.h \ f/runtime/Makefile \ *************** f/runtime/libU77/Makefile: \ *** 285,300 **** src=`cd $(srcdir); pwd`; \ cd f/runtime; \ CC="`case '$(GCC_FOR_TARGET)' in \ './xgcc -B./') echo $${top}/xgcc -B$${top}/;; \ *) echo '$(GCC_FOR_TARGET)';; esac`" \ ! $(F77_FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) \ $${src}/f/runtime/configure --srcdir=$${src}/f/runtime top=`pwd`; \ src=`cd $(srcdir); pwd`; \ cd f/runtime/libU77; \ CC="`case '$(GCC_FOR_TARGET)' in \ './xgcc -B./') echo $${top}/xgcc -B$${top}/;; \ *) echo '$(GCC_FOR_TARGET)';; esac`" \ ! $(F77_FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) \ $${src}/f/runtime/libU77/configure --srcdir=$${src}/f/runtime/libU77 --- 291,310 ---- src=`cd $(srcdir); pwd`; \ cd f/runtime; \ + rm -f no-such-file; \ + $(F77_FLAGS_TO_PASS) \ CC="`case '$(GCC_FOR_TARGET)' in \ './xgcc -B./') echo $${top}/xgcc -B$${top}/;; \ *) echo '$(GCC_FOR_TARGET)';; esac`" \ ! CONFIG_SITE=no-such-file $(SHELL) \ $${src}/f/runtime/configure --srcdir=$${src}/f/runtime top=`pwd`; \ src=`cd $(srcdir); pwd`; \ cd f/runtime/libU77; \ + rm -f no-such-file; \ + $(F77_FLAGS_TO_PASS) \ CC="`case '$(GCC_FOR_TARGET)' in \ './xgcc -B./') echo $${top}/xgcc -B$${top}/;; \ *) echo '$(GCC_FOR_TARGET)';; esac`" \ ! CONFIG_SITE=no-such-file $(SHELL) \ $${src}/f/runtime/libU77/configure --srcdir=$${src}/f/runtime/libU77 *************** f77.install-common: *** 459,467 **** else true; fi ! f77.install-info: ! -rm -f $(infodir)/g77.info* ! cd $(srcdir)/f; for f in g77.info*; \ ! do $(INSTALL_DATA) $$f $(infodir)/$$f; done ! -chmod a-x $(infodir)/g77.info* f77.install-man: $(srcdir)/f/g77.1 --- 469,479 ---- else true; fi ! f77.install-info: f77.info ! if [ -f $(srcdir)/f/g77.info ] ; then \ ! rm -f $(infodir)/g77.info*; \ ! cd $(srcdir)/f; for f in g77.info*; \ ! do $(INSTALL_DATA) $$f $(infodir)/$$f; done; \ ! chmod a-x $(infodir)/g77.info*; \ ! fi f77.install-man: $(srcdir)/f/g77.1 diff -rcp2N g77-0.5.21/f/Makefile.in g77-0.5.22/f/Makefile.in *** g77-0.5.21/f/Makefile.in Tue Sep 2 21:25:24 1997 --- g77-0.5.22/f/Makefile.in Thu Feb 26 21:27:50 1998 *************** f/str-ot.h f/str-ot.j: f/fini f/str-ot.f *** 502,506 **** f/fini: f/fini.o f/proj-h.o ! $(HOST_CC) $(HOST_CFLAGS) -W -Wall $(HOST_LDFLAGS) -o f/fini f/fini.o f/proj-h.o f/fini.o: --- 502,506 ---- f/fini: f/fini.o f/proj-h.o ! $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o f/fini f/fini.o f/proj-h.o f/fini.o: diff -rcp2N g77-0.5.21/f/bad.def g77-0.5.22/f/bad.def *** g77-0.5.21/f/bad.def Sun Jul 13 20:42:34 1997 --- g77-0.5.22/f/bad.def Sun Jan 11 20:55:49 1998 *************** FFEBAD_MSGS2 (FFEBAD_TOO_MANY_DIMS, FATA *** 540,543 **** --- 540,545 ---- FFEBAD_MSGS1 (FFEBAD_NULL_ARGUMENT, FATAL, "Null argument at %0 for statement function reference at %1") + FFEBAD_MSGS1 (FFEBAD_NULL_ARGUMENT_W, WARN, + "Null argument at %0 for procedure invocation at %1") FFEBAD_MSGS1 (FFEBAD_TOO_FEW_ARGUMENTS, FATAL, "%A too few arguments (starting with dummy argument `%B') as of %0 for statement function reference at %1") *************** FFEBAD_MSGS1 (FFEBAD_ARRAY_AS_SFARG, FAT *** 548,551 **** --- 550,555 ---- FFEBAD_MSGS1 (FFEBAD_FORMAT_UNSUPPORTED, FATAL, "Unsupported FORMAT specifier at %0") + FFEBAD_MSGS1 (FFEBAD_FORMAT_VARIABLE, FATAL, + "Variable-expression FORMAT specifier at %0 -- unsupported") FFEBAD_MSGS2 (FFEBAD_OPEN_UNSUPPORTED, WARN, "Unsupported OPEN control item at %0 -- ACTION=, ASSOCIATEVARIABLE=, BLOCKSIZE=, BUFFERCOUNT=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, DISPOSE=, EXTENDSIZE=, INITIALSIZE=, KEY=, MAXREC=, NOSPANBLOCKS, ORGANIZATION=, PAD=, POSITION=, READONLY=, RECORDTYPE=, SHARED=, and USEROPEN= are not supported", diff -rcp2N g77-0.5.21/f/bugs.texi g77-0.5.22/f/bugs.texi *** g77-0.5.21/f/bugs.texi Tue Sep 9 06:10:52 1997 --- g77-0.5.22/f/bugs.texi Sun Mar 15 10:12:06 1998 *************** *** 1,3 **** ! @c Copyright (C) 1995-1997 Free Software Foundation, Inc. @c This is part of the G77 manual. @c For copying conditions, see the file g77.texi. --- 1,3 ---- ! @c Copyright (C) 1995-1998 Free Software Foundation, Inc. @c This is part of the G77 manual. @c For copying conditions, see the file g77.texi. *************** *** 6,10 **** @c in the G77 distribution, as well as in the G77 manual. ! @c 1996-09-09 @ifclear BUGSONLY --- 6,10 ---- @c in the G77 distribution, as well as in the G77 manual. ! @c 1998-03-15 @ifclear BUGSONLY *************** in this case, @samp{R} might be initiali *** 41,83 **** Until this bug is fixed, use only @samp{-O1} or no optimization. - @cindex DNRM2 - @cindex stack, 387 coprocessor - @cindex ix86 - @cindex -O2 - @item - A code-generation bug afflicts - Intel x86 targets when @samp{-O2} is specified - compiling, for example, an old version of - the @samp{DNRM2} routine. - The x87 coprocessor stack is being somewhat - mismanaged in cases where assigned @code{GOTO} - and @code{ASSIGN} are involved. - - Version 0.5.21 of @code{g77} contains an initial - effort to fix the problem, but this effort is - incomplete, and a more complete fix is planned - for the next release. - - @cindex SIGNAL() intrinsic - @cindex intrinsics, SIGNAL() - @item - Work is needed on the @code{SIGNAL()} intrinsic to ensure - that pointers and integers are properly handled on all - targets, including 64-bit machines. - - @cindex -fugly-comma option - @cindex options, -fugly-comma - @item - When using @samp{-fugly-comma}, @code{g77} assumes an extra - @samp{%VAL(0)} argument is to be passed to intrinsics - taking no arguments, such as @code{IARGC()}, which in - turn reject such a call. - Although this has been worked around for 0.5.18 due - to changes in the handling of intrinsics, - @code{g77} needs to do the ugly-argument-appending trick - only for external-function invocation, as this would - probably be more consistent with compilers that default - to using that trick. - @item Something about @code{g77}'s straightforward handling of --- 41,44 ---- *************** in the way such areas are laid out betwe *** 226,265 **** compilers. - @item - Some crashes occur when compiling under Solaris on x86 - machines. - - Nothing has been heard about any such problems for some time, - so this is considering a closed item as of 0.5.20. - Please submit any bug reports pertinent to @code{g77}'s support - for Solaris/x86 systems. - - @cindex RS/6000 support - @cindex support, RS/6000 - @item - RS/6000 support is not complete as of the gcc 2.6.3 back end. - The 2.7.0 back end appears to fix this problem, or at least mitigate - it significantly, but there is at least one known problem that is - likely to be a code-generation bug in @file{gcc-2.7.0} plus - @file{g77-0.5.16}. - This problem shows up only when compiling the Fortran program with @samp{-O}. - - Nothing has been heard about any RS/6000 problems for some time, - so this is considering a closed item as of 0.5.20. - Please submit any bug reports pertinent to @code{g77}'s support - for RS/6000 systems. - - @cindex SGI support - @cindex support, SGI - @item - SGI support is known to be a bit buggy. - The known problem shows up only when compiling the Fortran program with - @samp{-O}. - - It is possible these problems have all been fixed in 0.5.20 by - emulating complex arithmetic in the front end. - Please submit any bug reports pertinent to @code{g77}'s support - for SGI systems. - @cindex Alpha, support @cindex support, Alpha --- 187,190 ---- *************** when compiling on some systems (such as *** 313,320 **** when compiling for ELF targets. The symptom is that the assembler complains about invalid opcodes. ! More investigation is needed, but the problem is almost certainly ! in the gcc back end, and it apparently occurs only when compiling sufficiently complicated functions @emph{without} the @samp{-O} option. @end itemize - --- 238,244 ---- when compiling for ELF targets. The symptom is that the assembler complains about invalid opcodes. ! This bug is in the gcc back end, ! and it apparently occurs only when compiling sufficiently complicated functions @emph{without} the @samp{-O} option. @end itemize diff -rcp2N g77-0.5.21/f/com-rt.def g77-0.5.22/f/com-rt.def *** g77-0.5.21/f/com-rt.def Tue Sep 2 21:25:25 1997 --- g77-0.5.22/f/com-rt.def Wed Dec 24 04:03:30 1997 *************** DEFGFRT (FFECOM_gfrtDMOD, "d_mod", FFECO *** 163,167 **** DEFGFRT (FFECOM_gfrtDNINT, "d_nint", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDPROD, "d_prod", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtDSIGN, "d_sign", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDSIN, "d_sin", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDSINH, "d_sinh", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) --- 163,167 ---- DEFGFRT (FFECOM_gfrtDNINT, "d_nint", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDPROD, "d_prod", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtDSIGN, "d_sign", FFECOM_rttypeDOUBLE_, "&d&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDSIN, "d_sin", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDSINH, "d_sinh", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) *************** DEFGFRT (FFECOM_gfrtIERRNO, "G77_ierrno_ *** 204,208 **** DEFGFRT (FFECOM_gfrtINDEX, "i_indx", FFECOM_rttypeINTEGER_, "&a&a", FALSE, FALSE) DEFGFRT (FFECOM_gfrtIRAND, "G77_irand_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtISIGN, "i_sign", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtISATTY, "G77_isatty_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtITIME, "G77_itime_0", FFECOM_rttypeVOID_, "&i", FALSE, FALSE) --- 204,208 ---- DEFGFRT (FFECOM_gfrtINDEX, "i_indx", FFECOM_rttypeINTEGER_, "&a&a", FALSE, FALSE) DEFGFRT (FFECOM_gfrtIRAND, "G77_irand_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtISIGN, "i_sign", FFECOM_rttypeINTEGER_, "&i&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtISATTY, "G77_isatty_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtITIME, "G77_itime_0", FFECOM_rttypeVOID_, "&i", FALSE, FALSE) *************** DEFGFRT (FFECOM_gfrtRENAME, "G77_rename_ *** 225,230 **** DEFGFRT (FFECOM_gfrtSECNDS, "G77_secnds_0", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSECOND, "G77_second_0", FFECOM_rttypeREAL_F2C_, 0, FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtSIGN, "r_sign", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtL_SIGNAL, "G77_signal_0", FFECOM_rttypeFTNINT_, "&i0", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSIN, "r_sin", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSINH, "r_sinh", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) --- 225,230 ---- DEFGFRT (FFECOM_gfrtSECNDS, "G77_secnds_0", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSECOND, "G77_second_0", FFECOM_rttypeREAL_F2C_, 0, FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtSIGN, "r_sign", FFECOM_rttypeREAL_F2C_, "&f&f", FALSE, FALSE) ! DEFGFRT (FFECOM_gfrtL_SIGNAL, "G77_signal_0", FFECOM_rttypeVOIDSTAR_, "&i0", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSIN, "r_sin", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) DEFGFRT (FFECOM_gfrtSINH, "r_sinh", FFECOM_rttypeREAL_F2C_, "&f", FALSE, FALSE) diff -rcp2N g77-0.5.21/f/com.c g77-0.5.22/f/com.c *** g77-0.5.21/f/com.c Tue Sep 2 21:25:26 1997 --- g77-0.5.22/f/com.c Mon Mar 16 19:33:32 1998 *************** *** 1,4 **** /* com.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1997 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* com.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** typedef enum *** 346,349 **** --- 346,350 ---- { FFECOM_rttypeVOID_, + FFECOM_rttypeVOIDSTAR_, /* C's `void *' type. */ FFECOM_rttypeFTNINT_, /* f2c's `ftnint' type. */ FFECOM_rttypeINTEGER_, /* f2c's `integer' type. */ *************** static tree ffecom_call_binop_ (tree fn, *** 420,425 **** bool *dest_used, tree callee_commons, bool scalar_args); ! static void ffecom_char_args_ (tree *xitem, tree *length, ! ffebld expr); static tree ffecom_check_size_overflow_ (ffesymbol s, tree type, bool dummy); static tree ffecom_char_enhance_arg_ (tree *xtype, ffesymbol s); --- 421,426 ---- bool *dest_used, tree callee_commons, bool scalar_args); ! static void ffecom_char_args_x_ (tree *xitem, tree *length, ! ffebld expr, bool with_null); static tree ffecom_check_size_overflow_ (ffesymbol s, tree type, bool dummy); static tree ffecom_char_enhance_arg_ (tree *xtype, ffesymbol s); *************** static char *ffecom_gfrt_argstring_[FFEC *** 653,656 **** --- 654,660 ---- #define ffecom_end_compstmt_ bison_rule_compstmt_ + #define ffecom_char_args_(i,l,e) ffecom_char_args_x_((i),(l),(e),FALSE) + #define ffecom_char_args_with_null_(i,l,e) ffecom_char_args_x_((i),(l),(e),TRUE) + /* For each binding contour we allocate a binding_level structure * which records the names defined in that contour. *************** ffecom_arglist_expr_ (char *c, ffebld ex *** 1093,1096 **** --- 1097,1104 ---- bool ptr = FALSE; tree wanted = NULL_TREE; + static char zed[] = "0"; + + if (c == NULL) + c = &zed[0]; while (expr != NULL) *************** ffecom_arglist_expr_ (char *c, ffebld ex *** 1185,1188 **** --- 1193,1229 ---- } + /* We've run out of args in the call; if the implementation expects + more, supply null pointers for them, which the implementation can + check to see if an arg was omitted. */ + + while (*c != '\0' && *c != '0') + { + if (*c == '&') + ++c; + else + assert ("missing arg to run-time routine!" == NULL); + + switch (*(c++)) + { + case '\0': + case 'a': + case 'c': + case 'd': + case 'e': + case 'f': + case 'i': + case 'j': + break; + + default: + assert ("bad arg string code" == NULL); + break; + } + *plist + = build_tree_list (NULL_TREE, + null_pointer_node); + plist = &TREE_CHAIN (*plist); + } + *plist = trail; *************** ffecom_call_binop_ (tree fn, ffeinfoKind *** 1609,1631 **** #endif ! /* ffecom_char_args_ -- Return ptr/length args for char subexpression tree ptr_arg; tree length_arg; ffebld expr; ! ffecom_char_args_(&ptr_arg,&length_arg,expr); Handles CHARACTER-type CONTER, SYMTER, SUBSTR, ARRAYREF, and FUNCREF subexpressions by constructing the appropriate trees for the ptr-to- character-text and length-of-character-text arguments in a calling ! sequence. */ #if FFECOM_targetCURRENT == FFECOM_targetGCC static void ! ffecom_char_args_ (tree *xitem, tree *length, ffebld expr) { tree item; tree high; ffetargetCharacter1 val; switch (ffebld_op (expr)) --- 1650,1677 ---- #endif ! /* ffecom_char_args_x_ -- Return ptr/length args for char subexpression tree ptr_arg; tree length_arg; ffebld expr; ! bool with_null; ! ffecom_char_args_x_(&ptr_arg,&length_arg,expr,with_null); Handles CHARACTER-type CONTER, SYMTER, SUBSTR, ARRAYREF, and FUNCREF subexpressions by constructing the appropriate trees for the ptr-to- character-text and length-of-character-text arguments in a calling ! sequence. ! ! Note that if with_null is TRUE, and the expression is an opCONTER, ! a null byte is appended to the string. */ #if FFECOM_targetCURRENT == FFECOM_targetGCC static void ! ffecom_char_args_x_ (tree *xitem, tree *length, ffebld expr, bool with_null) { tree item; tree high; ffetargetCharacter1 val; + ffetargetCharacterSize newlen; switch (ffebld_op (expr)) *************** ffecom_char_args_ (tree *xitem, tree *le *** 1633,1642 **** case FFEBLD_opCONTER: val = ffebld_constant_character1 (ffebld_conter (expr)); ! *length = build_int_2 (ffetarget_length_character1 (val), 0); TREE_TYPE (*length) = ffecom_f2c_ftnlen_type_node; ! high = build_int_2 (ffetarget_length_character1 (val), ! 0); TREE_TYPE (high) = ffecom_f2c_ftnlen_type_node; ! item = build_string (ffetarget_length_character1 (val), ffetarget_text_character1 (val)); TREE_TYPE (item) --- 1679,1693 ---- case FFEBLD_opCONTER: val = ffebld_constant_character1 (ffebld_conter (expr)); ! newlen = ffetarget_length_character1 (val); ! if (with_null) ! { ! if (newlen != 0) ! ++newlen; /* begin FFETARGET-NULL-KLUDGE. */ ! } ! *length = build_int_2 (newlen, 0); TREE_TYPE (*length) = ffecom_f2c_ftnlen_type_node; ! high = build_int_2 (newlen, 0); TREE_TYPE (high) = ffecom_f2c_ftnlen_type_node; ! item = build_string (newlen, /* end FFETARGET-NULL-KLUDGE. */ ffetarget_text_character1 (val)); TREE_TYPE (item) *************** ffecom_do_entry_ (ffesymbol fn, int entr *** 2312,2315 **** --- 2363,2371 ---- bool altreturning = FALSE; /* This entry point has alternate returns. */ int yes; + int old_lineno = lineno; + char *old_input_filename = input_filename; + + input_filename = ffesymbol_where_filename (fn); + lineno = ffesymbol_where_filelinenum (fn); /* c-parse.y indeed does call suspend_momentary and not only ignores the *************** ffecom_do_entry_ (ffesymbol fn, int entr *** 2658,2661 **** --- 2714,2720 ---- finish_function (0); + lineno = old_lineno; + input_filename = old_input_filename; + ffecom_doing_entry_ = FALSE; } *************** ffecom_expr_power_integer_ (ffebld left, *** 6166,6171 **** ({ typeof (r) rtmp = r; ! typeof (l) ltmp = l; ! typeof (l) result; if (rtmp == 0) --- 6225,6230 ---- ({ typeof (r) rtmp = r; ! typeof (l) ltmp = l; ! typeof (l) result; if (rtmp == 0) *************** static ffesymbol *** 6584,6588 **** ffecom_finish_symbol_transform_ (ffesymbol s) { ! if (s == NULL) return s; --- 6643,6647 ---- ffecom_finish_symbol_transform_ (ffesymbol s) { ! if ((s == NULL) || (TREE_CODE (current_function_decl) == ERROR_MARK)) return s; *************** ffecom_make_gfrt_ (ffecomGfrt ix) *** 7424,7427 **** --- 7483,7490 ---- break; + case FFECOM_rttypeVOIDSTAR_: + ttype = TREE_TYPE (null_pointer_node); /* `void *'. */ + break; + case FFECOM_rttypeFTNINT_: ttype = ffecom_f2c_ftnint_type_node; *************** ffecom_start_progunit_ () *** 7778,7784 **** if (altentries) ! id = ffecom_get_invented_identifier ("__g77_masterfun_%s", ! ffesymbol_text (fn), ! 0); #if FFETARGET_isENFORCED_MAIN else if (main_program) --- 7841,7850 ---- if (altentries) ! { ! id = ffecom_get_invented_identifier ("__g77_masterfun_%s", ! ffesymbol_text (fn), ! 0); ! IDENTIFIER_INVENTED (id) = 0; /* Allow this to be debugged. */ ! } #if FFETARGET_isENFORCED_MAIN else if (main_program) *************** ffecom_start_progunit_ () *** 7869,7873 **** resume_momentary (yes); ! store_parm_decls (main_program ? 1 : 0); ffecom_start_compstmt_ (); --- 7935,7940 ---- resume_momentary (yes); ! if (TREE_CODE (current_function_decl) != ERROR_MARK) ! store_parm_decls (main_program ? 1 : 0); ffecom_start_compstmt_ (); *************** ffecom_type_vardesc_ () *** 9897,9901 **** string_type_node); dimsfield = ffecom_decl_field (type, addrfield, "dims", ! ffecom_f2c_ftnlen_type_node); typefield = ffecom_decl_field (type, dimsfield, "type", integer_type_node); --- 9964,9968 ---- string_type_node); dimsfield = ffecom_decl_field (type, addrfield, "dims", ! ffecom_f2c_ptr_to_ftnlen_type_node); typefield = ffecom_decl_field (type, dimsfield, "type", integer_type_node); *************** ffecom_arg_expr (ffebld expr, tree *leng *** 10748,10752 **** generates code to evaluate the character expression, returns the proper pointer to the result, AND sets the length return value to a tree that ! specifies the length of the result. */ #if FFECOM_targetCURRENT == FFECOM_targetGCC --- 10815,10831 ---- generates code to evaluate the character expression, returns the proper pointer to the result, AND sets the length return value to a tree that ! specifies the length of the result. ! ! If the length argument is NULL, this is a slightly special ! case of building a FORMAT expression, that is, an expression that ! will be used at run time without regard to length. For the current ! implementation, which uses the libf2c library, this means it is nice ! to append a null byte to the end of the expression, where feasible, ! to make sure any diagnostic about the FORMAT string terminates at ! some useful point. ! ! For now, treat %REF(char-expr) as the same as char-expr with a NULL ! length argument. This might even be seen as a feature, if a null ! byte can always be appended. */ #if FFECOM_targetCURRENT == FFECOM_targetGCC *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10758,10762 **** ffecomConcatList_ catlist; ! *length = NULL_TREE; if (expr == NULL) --- 10837,10842 ---- ffecomConcatList_ catlist; ! if (length != NULL) ! *length = NULL_TREE; if (expr == NULL) *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10780,10785 **** if (ffeinfo_basictype (ffebld_info (expr)) != FFEINFO_basictypeCHARACTER) return ffecom_ptr_to_expr (ffebld_left (expr)); ! ign_length = NULL_TREE; ! length = &ign_length; expr = ffebld_left (expr); break; --- 10860,10868 ---- if (ffeinfo_basictype (ffebld_info (expr)) != FFEINFO_basictypeCHARACTER) return ffecom_ptr_to_expr (ffebld_left (expr)); ! if (length != NULL) ! { ! ign_length = NULL_TREE; ! length = &ign_length; ! } expr = ffebld_left (expr); break; *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10807,10811 **** #ifdef PASS_HOLLERITH_BY_DESCRIPTOR ! if (ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeHOLLERITH) { /* Pass Hollerith by descriptor. */ ffetargetHollerith h; --- 10890,10895 ---- #ifdef PASS_HOLLERITH_BY_DESCRIPTOR ! if ((ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeHOLLERITH) ! && (length != NULL)) { /* Pass Hollerith by descriptor. */ ffetargetHollerith h; *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10830,10841 **** { case 0: /* Shouldn't happen, but in case it does... */ ! *length = ffecom_f2c_ftnlen_zero_node; ! TREE_TYPE (*length) = ffecom_f2c_ftnlen_type_node; ffecom_concat_list_kill_ (catlist); return null_pointer_node; case 1: /* The (fairly) easy case. */ ! ffecom_char_args_ (&item, length, ! ffecom_concat_list_expr_ (catlist, 0)); ffecom_concat_list_kill_ (catlist); assert (item != NULL_TREE); --- 10914,10932 ---- { case 0: /* Shouldn't happen, but in case it does... */ ! if (length != NULL) ! { ! *length = ffecom_f2c_ftnlen_zero_node; ! TREE_TYPE (*length) = ffecom_f2c_ftnlen_type_node; ! } ffecom_concat_list_kill_ (catlist); return null_pointer_node; case 1: /* The (fairly) easy case. */ ! if (length == NULL) ! ffecom_char_args_with_null_ (&item, &ign_length, ! ffecom_concat_list_expr_ (catlist, 0)); ! else ! ffecom_char_args_ (&item, length, ! ffecom_concat_list_expr_ (catlist, 0)); ffecom_concat_list_kill_ (catlist); assert (item != NULL_TREE); *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10873,10878 **** for (i = 0; i < count; ++i) { ! ffecom_char_args_ (&citem, &clength, ! ffecom_concat_list_expr_ (catlist, i)); if ((citem == error_mark_node) || (clength == error_mark_node)) --- 10964,10974 ---- for (i = 0; i < count; ++i) { ! if ((i == count) ! && (length == NULL)) ! ffecom_char_args_with_null_ (&citem, &clength, ! ffecom_concat_list_expr_ (catlist, i)); ! else ! ffecom_char_args_ (&citem, &clength, ! ffecom_concat_list_expr_ (catlist, i)); if ((citem == error_mark_node) || (clength == error_mark_node)) *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10893,10900 **** items); clength = ffecom_save_tree (clength); ! known_length ! = ffecom_2 (PLUS_EXPR, ffecom_f2c_ftnlen_type_node, ! known_length, ! clength); lengths = ffecom_2 (COMPOUND_EXPR, TREE_TYPE (lengths), --- 10989,10997 ---- items); clength = ffecom_save_tree (clength); ! if (length != NULL) ! known_length ! = ffecom_2 (PLUS_EXPR, ffecom_f2c_ftnlen_type_node, ! known_length, ! clength); lengths = ffecom_2 (COMPOUND_EXPR, TREE_TYPE (lengths), *************** ffecom_arg_ptr_to_expr (ffebld expr, tre *** 10945,10949 **** temporary); ! *length = known_length; } --- 11042,11047 ---- temporary); ! if (length != NULL) ! *length = known_length; } *************** ffecom_gfrt_basictype (ffecomGfrt gfrt) *** 11604,11607 **** --- 11702,11706 ---- { case FFECOM_rttypeVOID_: + case FFECOM_rttypeVOIDSTAR_: return FFEINFO_basictypeNONE; *************** ffecom_gfrt_kindtype (ffecomGfrt gfrt) *** 11650,11653 **** --- 11749,11753 ---- { case FFECOM_rttypeVOID_: + case FFECOM_rttypeVOIDSTAR_: return FFEINFO_kindtypeNONE; *************** ffecom_return_expr (ffebld expr) *** 13269,13273 **** #if FFECOM_targetCURRENT == FFECOM_targetGCC ! tree ffecom_save_tree (tree t) { return save_expr (t); --- 13369,13374 ---- #if FFECOM_targetCURRENT == FFECOM_targetGCC ! tree ! ffecom_save_tree (tree t) { return save_expr (t); *************** finish_function (int nested) *** 14093,14100 **** assert (fndecl != NULL_TREE); ! if (nested) ! assert (DECL_CONTEXT (fndecl) != NULL_TREE); ! else ! assert (DECL_CONTEXT (fndecl) == NULL_TREE); /* TREE_READONLY (fndecl) = 1; --- 14194,14204 ---- assert (fndecl != NULL_TREE); ! if (TREE_CODE (fndecl) != ERROR_MARK) ! { ! if (nested) ! assert (DECL_CONTEXT (fndecl) != NULL_TREE); ! else ! assert (DECL_CONTEXT (fndecl) == NULL_TREE); ! } /* TREE_READONLY (fndecl) = 1; *************** finish_function (int nested) *** 14103,14121 **** poplevel (1, 0, 1); - BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; ! /* Must mark the RESULT_DECL as being in this function. */ ! DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; ! /* Obey `register' declarations if `setjmp' is called in this fn. */ ! /* Generate rtl for function exit. */ ! expand_function_end (input_filename, lineno, 0); ! /* So we can tell if jump_optimize sets it to 1. */ ! can_reach_end = 0; ! /* Run the optimizers and output the assembler code for this function. */ ! rest_of_compilation (fndecl); /* Free all the tree nodes making up this function. */ --- 14207,14229 ---- poplevel (1, 0, 1); ! if (TREE_CODE (fndecl) != ERROR_MARK) ! { ! BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; ! /* Must mark the RESULT_DECL as being in this function. */ ! DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; ! /* Obey `register' declarations if `setjmp' is called in this fn. */ ! /* Generate rtl for function exit. */ ! expand_function_end (input_filename, lineno, 0); ! /* So we can tell if jump_optimize sets it to 1. */ ! can_reach_end = 0; ! ! /* Run the optimizers and output the assembler code for this function. */ ! rest_of_compilation (fndecl); ! } /* Free all the tree nodes making up this function. */ *************** finish_function (int nested) *** 14125,14129 **** permanent_allocation (1); ! if (DECL_SAVED_INSNS (fndecl) == 0 && !nested) { /* Stop pointing to the local nodes about to be freed. */ --- 14233,14237 ---- permanent_allocation (1); ! if (DECL_SAVED_INSNS (fndecl) == 0 && !nested && (TREE_CODE (fndecl) != ERROR_MARK)) { /* Stop pointing to the local nodes about to be freed. */ *************** lang_printable_name (tree decl, char **k *** 14158,14161 **** --- 14266,14271 ---- { *kind = "program unit"; + if (TREE_CODE (decl) == ERROR_MARK) + return "erroneous code"; return IDENTIFIER_POINTER (DECL_NAME (decl)); } *************** lang_print_error_function (file) *** 14169,14214 **** char *file; { static ffesymbol last_s = NULL; ffesymbol s; char *kind; ! if (ffecom_primary_entry_ == NULL) { s = NULL; kind = NULL; } ! else if (ffecom_nested_entry_ == NULL) { ! s = ffecom_primary_entry_; ! switch (ffesymbol_kind (s)) { ! case FFEINFO_kindFUNCTION: ! kind = "function"; ! break; ! case FFEINFO_kindSUBROUTINE: ! kind = "subroutine"; ! break; ! case FFEINFO_kindPROGRAM: ! kind = "program"; ! break; ! case FFEINFO_kindBLOCKDATA: ! kind = "block-data"; ! break; ! default: ! kind = ffeinfo_kind_message (ffesymbol_kind (s)); ! break; } - } - else - { - s = ffecom_nested_entry_; - kind = "statement function"; } ! if (last_s != s) { if (file) --- 14279,14332 ---- char *file; { + static ffeglobal last_g = NULL; static ffesymbol last_s = NULL; + ffeglobal g; ffesymbol s; char *kind; ! if ((ffecom_primary_entry_ == NULL) ! || (ffesymbol_global (ffecom_primary_entry_) == NULL)) { + g = NULL; s = NULL; kind = NULL; } ! else { ! g = ffesymbol_global (ffecom_primary_entry_); ! if (ffecom_nested_entry_ == NULL) { ! s = ffecom_primary_entry_; ! switch (ffesymbol_kind (s)) ! { ! case FFEINFO_kindFUNCTION: ! kind = "function"; ! break; ! case FFEINFO_kindSUBROUTINE: ! kind = "subroutine"; ! break; ! case FFEINFO_kindPROGRAM: ! kind = "program"; ! break; ! case FFEINFO_kindBLOCKDATA: ! kind = "block-data"; ! break; ! default: ! kind = ffeinfo_kind_message (ffesymbol_kind (s)); ! break; ! } ! } ! else ! { ! s = ffecom_nested_entry_; ! kind = "statement function"; } } ! if ((last_g != g) || (last_s != s)) { if (file) *************** lang_print_error_function (file) *** 14224,14227 **** --- 14342,14346 ---- } + last_g = g; last_s = s; } *************** start_function (tree name, tree type, in *** 14496,14518 **** } ! decl1 = build_decl (FUNCTION_DECL, ! name, ! type); ! TREE_PUBLIC (decl1) = public ? 1 : 0; ! if (nested) ! DECL_INLINE (decl1) = 1; ! TREE_STATIC (decl1) = 1; ! DECL_EXTERNAL (decl1) = 0; ! ! announce_function (decl1); ! /* Make the init_value nonzero so pushdecl knows this is not tentative. ! error_mark_node is replaced below (in poplevel) with the BLOCK. */ ! DECL_INITIAL (decl1) = error_mark_node; ! /* Record the decl so that the function name is defined. If we already have ! a decl for this name, and it is a FUNCTION_DECL, use the old decl. */ - current_function_decl = pushdecl (decl1); if (!nested) ffecom_outer_function_decl_ = current_function_decl; --- 14615,14643 ---- } ! if (TREE_CODE (type) == ERROR_MARK) ! decl1 = current_function_decl = error_mark_node; ! else ! { ! decl1 = build_decl (FUNCTION_DECL, ! name, ! type); ! TREE_PUBLIC (decl1) = public ? 1 : 0; ! if (nested) ! DECL_INLINE (decl1) = 1; ! TREE_STATIC (decl1) = 1; ! DECL_EXTERNAL (decl1) = 0; ! ! announce_function (decl1); ! ! /* Make the init_value nonzero so pushdecl knows this is not tentative. ! error_mark_node is replaced below (in poplevel) with the BLOCK. */ ! DECL_INITIAL (decl1) = error_mark_node; ! /* Record the decl so that the function name is defined. If we already have ! a decl for this name, and it is a FUNCTION_DECL, use the old decl. */ ! current_function_decl = pushdecl (decl1); ! } if (!nested) ffecom_outer_function_decl_ = current_function_decl; *************** start_function (tree name, tree type, in *** 14520,14528 **** pushlevel (0); ! make_function_rtl (current_function_decl); ! restype = TREE_TYPE (TREE_TYPE (current_function_decl)); ! DECL_RESULT (current_function_decl) ! = build_decl (RESULT_DECL, NULL_TREE, restype); if (!nested) --- 14645,14656 ---- pushlevel (0); ! if (TREE_CODE (current_function_decl) != ERROR_MARK) ! { ! make_function_rtl (current_function_decl); ! restype = TREE_TYPE (TREE_TYPE (current_function_decl)); ! DECL_RESULT (current_function_decl) ! = build_decl (RESULT_DECL, NULL_TREE, restype); ! } if (!nested) *************** start_function (tree name, tree type, in *** 14531,14535 **** temporary_allocation (); ! if (!nested) TREE_ADDRESSABLE (current_function_decl) = 1; --- 14659,14663 ---- temporary_allocation (); ! if (!nested && (TREE_CODE (current_function_decl) != ERROR_MARK)) TREE_ADDRESSABLE (current_function_decl) = 1; diff -rcp2N g77-0.5.21/f/com.h g77-0.5.22/f/com.h *** g77-0.5.21/f/com.h Thu Aug 7 15:24:30 1997 --- g77-0.5.22/f/com.h Mon Sep 29 20:18:18 1997 *************** void emit_nop (void); *** 349,352 **** --- 349,353 ---- void announce_function (tree decl); extern FILE *asm_out_file; + void assemble_string (char *, int); void assemble_variable (tree decl, int top_level, int at_end, int dont_output_data); diff -rcp2N g77-0.5.21/f/expr.c g77-0.5.22/f/expr.c *** g77-0.5.21/f/expr.c Fri Aug 1 02:21:56 1997 --- g77-0.5.22/f/expr.c Sun Mar 8 21:37:20 1998 *************** *** 1,4 **** /* expr.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1997 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* expr.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** ffeexpr_cb_comma_c_ (ffelexToken ft, ffe *** 7505,7510 **** { ffeexprExpr_ e; ! ffeinfoBasictype lty = ffeinfo_basictype (ffebld_info (ffeexpr_stack_->expr)); ! ffeinfoBasictype rty = ffeinfo_basictype (ffebld_info (expr)); ffeinfoKindtype lkt; ffeinfoKindtype rkt; --- 7505,7512 ---- { ffeexprExpr_ e; ! ffeinfoBasictype lty = (ffeexpr_stack_->expr == NULL) ! ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (ffeexpr_stack_->expr)); ! ffeinfoBasictype rty = (expr == NULL) ! ? FFEINFO_basictypeNONE : ffeinfo_basictype (ffebld_info (expr)); ffeinfoKindtype lkt; ffeinfoKindtype rkt; *************** ffeexpr_cb_comma_c_ (ffelexToken ft, ffe *** 7513,7517 **** ffebld orig; ! if ((expr == NULL) || (ffebld_op (ffeexpr_stack_->expr) != FFEBLD_opCONTER) || (((orig = ffebld_conter_orig (ffeexpr_stack_->expr)) != NULL) --- 7515,7519 ---- ffebld orig; ! if ((ffeexpr_stack_->expr == NULL) || (ffebld_op (ffeexpr_stack_->expr) != FFEBLD_opCONTER) || (((orig = ffebld_conter_orig (ffeexpr_stack_->expr)) != NULL) *************** ffeexpr_reduced_eqop2_ (ffebld reduced, *** 10590,10594 **** { if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL) ! && (rbt != FFEINFO_basictypeCOMPLEX) && (lbt != FFEINFO_basictypeCHARACTER)) { if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY) --- 10592,10596 ---- { if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL) ! && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER)) { if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY) *************** ffeexpr_reduced_relop2_ (ffebld reduced, *** 11207,11211 **** { if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL) ! && (lbt != FFEINFO_basictypeCHARACTER)) { if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY) --- 11209,11213 ---- { if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL) ! && (rbt != FFEINFO_basictypeCHARACTER)) { if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY) *************** again: /* :::::::::::::::::::: */ *** 12256,12261 **** break; } ! error = ((expr == NULL) && ffe_is_pedantic ()) ! || ((expr != NULL) && (ffeinfo_rank (info) != 0)); break; --- 12258,12262 ---- break; } ! error = (expr != NULL) && (ffeinfo_rank (info) != 0); break; *************** ffeexpr_token_arguments_ (ffelexToken ft *** 18304,18381 **** info = ffebld_info (procedure->u.operand); ! if (ffeinfo_where (info) == FFEINFO_whereCONSTANT) ! { /* Statement function (or subroutine, if ! there was such a thing). */ ! if ((expr == NULL) ! && ((ffe_is_pedantic () ! && (ffeexpr_stack_->expr != NULL)) ! || (ffelex_token_type (t) == FFELEX_typeCOMMA))) { ! if (ffebad_start (FFEBAD_NULL_ARGUMENT)) { ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]), ! ffelex_token_where_column (ffeexpr_stack_->tokens[0])); ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t)); ffebad_finish (); } - if (ffeexpr_stack_->next_dummy != NULL) - { /* Don't bother if we're going to complain - later! */ - expr = ffebld_new_conter - (ffebld_constant_new_integerdefault_val (0)); - ffebld_set_info (expr, ffeinfo_new_any ()); - } - } ! if (expr == NULL) ! ; ! else ! { ! if (ffeexpr_stack_->next_dummy == NULL) ! { /* Report later which was the first extra ! argument. */ ! if (ffeexpr_stack_->tokens[1] == NULL) ! { ! ffeexpr_stack_->tokens[1] = ffelex_token_use (ft); ! ffeexpr_stack_->num_args = 0; ! } ! ++ffeexpr_stack_->num_args; /* Count # of extra ! arguments. */ ! } else { ! if (ffeinfo_rank (ffebld_info (expr)) != 0) { ! if (ffebad_start (FFEBAD_ARRAY_AS_SFARG)) { ffebad_here (0, ! ffelex_token_where_line (ffeexpr_stack_->tokens[0]), ! ffelex_token_where_column (ffeexpr_stack_->tokens[0])); ffebad_here (1, ffelex_token_where_line (ft), ffelex_token_where_column (ft)); ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent ! (ffebld_symter (ffebld_head ! (ffeexpr_stack_->next_dummy))))); ffebad_finish (); } } - else - { - expr = ffeexpr_convert_expr (expr, ft, - ffebld_head (ffeexpr_stack_->next_dummy), - ffeexpr_stack_->tokens[0], - FFEEXPR_contextLET); - ffebld_append_item (&ffeexpr_stack_->bottom, expr); - } - --ffeexpr_stack_->num_args; /* Count down # of args. */ - ffeexpr_stack_->next_dummy - = ffebld_trail (ffeexpr_stack_->next_dummy); } } } - else if ((expr != NULL) || ffe_is_ugly_comma () - || (ffelex_token_type (t) == FFELEX_typeCOMMA)) - ffebld_append_item (&ffeexpr_stack_->bottom, expr); switch (ffelex_token_type (t)) --- 18305,18397 ---- info = ffebld_info (procedure->u.operand); ! /* Is there an expression to add? If the expression is nil, ! it might still be an argument. It is if: ! ! - The current token is comma, or ! ! - The -fugly-comma flag was specified *and* the procedure ! being invoked is external. ! ! Otherwise, if neither of the above is the case, just ! ignore this (nil) expression. */ ! ! if ((expr != NULL) ! || (ffelex_token_type (t) == FFELEX_typeCOMMA) ! || (ffe_is_ugly_comma () ! && (ffeinfo_where (info) == FFEINFO_whereGLOBAL))) ! { ! /* This expression, even if nil, is apparently intended as an argument. */ ! ! /* Internal procedure (CONTAINS, or statement function)? */ ! ! if (ffeinfo_where (info) == FFEINFO_whereCONSTANT) { ! if ((expr == NULL) ! && ffebad_start (FFEBAD_NULL_ARGUMENT)) { ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]), ! ffelex_token_where_column (ffeexpr_stack_->tokens[0])); ffebad_here (1, ffelex_token_where_line (t), ffelex_token_where_column (t)); ffebad_finish (); } ! if (expr == NULL) ! ; else { ! if (ffeexpr_stack_->next_dummy == NULL) ! { /* Report later which was the first extra argument. */ ! if (ffeexpr_stack_->tokens[1] == NULL) ! { ! ffeexpr_stack_->tokens[1] = ffelex_token_use (ft); ! ffeexpr_stack_->num_args = 0; ! } ! ++ffeexpr_stack_->num_args; /* Count # of extra arguments. */ ! } ! else { ! if ((ffeinfo_rank (ffebld_info (expr)) != 0) ! && ffebad_start (FFEBAD_ARRAY_AS_SFARG)) { ffebad_here (0, ! ffelex_token_where_line (ffeexpr_stack_->tokens[0]), ! ffelex_token_where_column (ffeexpr_stack_->tokens[0])); ffebad_here (1, ffelex_token_where_line (ft), ffelex_token_where_column (ft)); ffebad_string (ffesymbol_text (ffesymbol_sfdummyparent ! (ffebld_symter (ffebld_head ! (ffeexpr_stack_->next_dummy))))); ffebad_finish (); } + else + { + expr = ffeexpr_convert_expr (expr, ft, + ffebld_head (ffeexpr_stack_->next_dummy), + ffeexpr_stack_->tokens[0], + FFEEXPR_contextLET); + ffebld_append_item (&ffeexpr_stack_->bottom, expr); + } + --ffeexpr_stack_->num_args; /* Count down # of args. */ + ffeexpr_stack_->next_dummy + = ffebld_trail (ffeexpr_stack_->next_dummy); } } } + else + { + if ((expr == NULL) + && ffe_is_pedantic () + && ffebad_start (FFEBAD_NULL_ARGUMENT_W)) + { + ffebad_here (0, ffelex_token_where_line (ffeexpr_stack_->tokens[0]), + ffelex_token_where_column (ffeexpr_stack_->tokens[0])); + ffebad_here (1, ffelex_token_where_line (t), + ffelex_token_where_column (t)); + ffebad_finish (); + } + ffebld_append_item (&ffeexpr_stack_->bottom, expr); + } } switch (ffelex_token_type (t)) *************** ffeexpr_token_arguments_ (ffelexToken ft *** 18515,18518 **** --- 18531,18535 ---- if ((ffeexpr_stack_->previous != NULL) + && (ffeexpr_stack_->previous->exprstack != NULL) && (ffeexpr_stack_->previous->exprstack->type == FFEEXPR_exprtypeOPERAND_) && ((reduced = ffeexpr_stack_->previous->exprstack->u.operand) != NULL) diff -rcp2N g77-0.5.21/f/fini.c g77-0.5.22/f/fini.c *** g77-0.5.21/f/fini.c Wed Aug 30 19:53:36 1995 --- g77-0.5.22/f/fini.c Fri Sep 19 05:12:12 1997 *************** void testname (bool nested, int indent, *** 229,233 **** void testnames (bool nested, int indent, int len, name first, name last); ! void main (int argc, char **argv) { --- 229,233 ---- void testnames (bool nested, int indent, int len, name first, name last); ! int main (int argc, char **argv) { diff -rcp2N g77-0.5.21/f/g77.1 g77-0.5.22/f/g77.1 *** g77-0.5.21/f/g77.1 Tue Sep 9 06:11:33 1997 --- g77-0.5.22/f/g77.1 Sun Mar 8 21:33:05 1998 *************** *** 2,6 **** .\" See section COPYING for conditions for redistribution .\" FIXME: no info here on predefines. Should there be? extra for F77... ! .TH G77 1 "1997-09-09" "GNU Tools" "GNU Tools" .de BP .sp --- 2,6 ---- .\" See section COPYING for conditions for redistribution .\" FIXME: no info here on predefines. Should there be? extra for F77... ! .TH G77 1 "1998-03-08" "GNU Tools" "GNU Tools" .de BP .sp *************** *** 9,13 **** .. .SH NAME ! g77 \- GNU project Fortran Compiler (v0.5.21) .SH SYNOPSIS .RB g77 " [" \c --- 9,13 ---- .. .SH NAME ! g77 \- GNU project Fortran Compiler (v0.5.22) .SH SYNOPSIS .RB g77 " [" \c *************** g77 \- GNU project Fortran Compiler (v0. *** 15,19 **** .SH WARNING The information in this man page is an extract from the full ! documentation of the GNU Fortran compiler (version 0.5.21), and is limited to the meaning of some of the options. .PP --- 15,19 ---- .SH WARNING The information in this man page is an extract from the full ! documentation of the GNU Fortran compiler (version 0.5.22), and is limited to the meaning of some of the options. .PP *************** software, please check the Info file, wh *** 23,28 **** documentation. .\" .PP ! .\" The version of GNU Fortran documented by the Info file is 0.5.21, ! .\" which includes substantial improvements and changes since 0.5.21, .\" the version documented in this man page. .PP --- 23,28 ---- documentation. .\" .PP ! .\" The version of GNU Fortran documented by the Info file is 0.5.22, ! .\" which includes substantial improvements and changes since 0.5.22, .\" the version documented in this man page. .PP *************** For complete and current documentation, *** 38,42 **** \&\|' or the manual .I ! Using and Porting GNU Fortran (for version 0.5.21)\c \&. Both are made from the Texinfo source file .BR g77.texi . --- 38,42 ---- \&\|' or the manual .I ! Using and Porting GNU Fortran (for version 0.5.22)\c \&. Both are made from the Texinfo source file .BR g77.texi . *************** entries in *** 334,338 **** .br .I ! Using and Porting GNU Fortran (for version 0.5.21)\c , James Craig Burley; .I --- 334,338 ---- .br .I ! Using and Porting GNU Fortran (for version 0.5.22)\c , James Craig Burley; .I diff -rcp2N g77-0.5.21/f/g77.texi g77-0.5.22/f/g77.texi *** g77-0.5.21/f/g77.texi Tue Sep 9 06:11:34 1997 --- g77-0.5.22/f/g77.texi Sun Jan 11 21:22:38 1998 *************** original English. *** 92,96 **** @end ifinfo ! Contributed by James Craig Burley (@email{burley@@gnu.ai.mit.edu}). Inspired by a first pass at translating @file{g77-0.5.16/f/DOC} that was contributed to Craig by David Ronis (@email{ronis@@onsager.chem.mcgill.ca}). --- 92,96 ---- @end ifinfo ! Contributed by James Craig Burley (@email{burley@@gnu.org}). Inspired by a first pass at translating @file{g77-0.5.16/f/DOC} that was contributed to Craig by David Ronis (@email{ronis@@onsager.chem.mcgill.ca}). *************** was contributed to Craig by David Ronis *** 103,107 **** @center James Craig Burley @sp 3 ! @center Last updated 1997-09-09 @sp 1 @c The version number appears some more times in this file. --- 103,107 ---- @center James Craig Burley @sp 3 ! @center Last updated 1998-01-11 @sp 1 @c The version number appears some more times in this file. *************** without royalty; alteration is not permi *** 763,767 **** Work on GNU Fortran is still being done mostly by its author, ! James Craig Burley (@email{burley@@gnu.ai.mit.edu}), who is a volunteer for, not an employee of, the Free Software Foundation (FSF). As with other GNU software, funding is important because it can pay for --- 763,767 ---- Work on GNU Fortran is still being done mostly by its author, ! James Craig Burley (@email{burley@@gnu.org}), who is a volunteer for, not an employee of, the Free Software Foundation (FSF). As with other GNU software, funding is important because it can pay for *************** could thus devote that time to work on p *** 802,806 **** changes for 0.6) that require longer timeframes to complete. For the latest information on the status of the author, do ! @kbd{finger -l burley@@gate.gnu.ai.mit.edu} on a UNIX system (or any system with a command like UNIX @code{finger}). --- 802,806 ---- changes for 0.6) that require longer timeframes to complete. For the latest information on the status of the author, do ! @kbd{finger -l burley@@gnu.org} on a UNIX system (or any system with a command like UNIX @code{finger}). *************** to various machines, and in some cases, *** 811,815 **** changes planned for version 0.6 make it difficult to add manpower to this area). ! Email @email{fortran@@gnu.ai.mit.edu} to volunteer for this work. @xref{Funding,,Funding Free Software}, for more information. --- 811,815 ---- changes planned for version 0.6 make it difficult to add manpower to this area). ! Email @email{fortran@@gnu.org} to volunteer for this work. @xref{Funding,,Funding Free Software}, for more information. *************** by type. Explanations are in the follow *** 1346,1349 **** --- 1346,1351 ---- -ff2c-intrinsics-delete -ff2c-intrinsics-hide -ff2c-intrinsics-disable -ff2c-intrinsics-enable + -fbadu77-intrinsics-delete -fbadu77-intrinsics-hide + -fbadu77-intrinsics-disable -fbadu77-intrinsics-enable -ff90-intrinsics-delete -ff90-intrinsics-hide -ff90-intrinsics-disable -ff90-intrinsics-enable *************** had read @samp{DIMENSION X(*)}. *** 1828,1834 **** @cindex options, -fugly-comma @item -fugly-comma ! Treat a trailing comma in an argument list as specification ! of a trailing null argument, and treat an empty argument ! list as specification of a single null argument. For example, @samp{CALL FOO(,)} is treated as --- 1830,1838 ---- @cindex options, -fugly-comma @item -fugly-comma ! In an external-procedure invocation, ! treat a trailing comma in the argument list ! as specification of a trailing null argument, ! and treat an empty argument list ! as specification of a single null argument. For example, @samp{CALL FOO(,)} is treated as *************** And @samp{F = FUNC()} is treated as @sam *** 1840,1843 **** --- 1844,1849 ---- The default behavior, @samp{-fno-ugly-comma}, is to ignore a single trailing comma in an argument list. + So, by default, @samp{CALL FOO(X,)} is treated + exactly the same as @samp{CALL FOO(X)}. @xref{Ugly Null Arguments}, for more information. *************** For example, @samp{call Foo(i,I)} would *** 2047,2050 **** --- 2053,2074 ---- variables named @samp{i} and @samp{I} to a procedure named @samp{Foo}.) + @cindex -fbadu77-intrinsics-delete option + @cindex options, -fbadu77-intrinsics-delete + @item -fbadu77-intrinsics-delete + @cindex -fbadu77-intrinsics-hide option + @cindex options, -fbadu77-intrinsics-hide + @item -fbadu77-intrinsics-hide + @cindex -fbadu77-intrinsics-disable option + @cindex options, -fbadu77-intrinsics-disable + @item -fbadu77-intrinsics-disable + @cindex -fbadu77-intrinsics-enable option + @cindex options, -fbadu77-intrinsics-enable + @item -fbadu77-intrinsics-enable + @cindex badu77 intrinsics + @cindex intrinsics, badu77 + Specify status of UNIX intrinsics having inappropriate forms. + @samp{-fbadu77-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. + @cindex -ff2c-intrinsics-delete option @cindex options, -ff2c-intrinsics-delete *************** variables named @samp{i} and @samp{I} to *** 2063,2066 **** --- 2087,2091 ---- Specify status of f2c-specific intrinsics. @samp{-ff2c-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -ff90-intrinsics-delete option *************** Specify status of f2c-specific intrinsic *** 2080,2083 **** --- 2105,2109 ---- Specify status of F90-specific intrinsics. @samp{-ff90-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -fgnu-intrinsics-delete option *************** Specify status of F90-specific intrinsic *** 2098,2101 **** --- 2124,2128 ---- Specify status of Digital's COMPLEX-related intrinsics. @samp{-fgnu-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -fmil-intrinsics-delete option *************** Specify status of Digital's COMPLEX-rela *** 2115,2118 **** --- 2142,2146 ---- Specify status of MIL-STD-1753-specific intrinsics. @samp{-fmil-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -funix-intrinsics-delete option *************** Specify status of MIL-STD-1753-specific *** 2132,2135 **** --- 2160,2164 ---- Specify status of UNIX intrinsics. @samp{-funix-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -fvxt-intrinsics-delete option *************** Specify status of UNIX intrinsics. *** 2149,2152 **** --- 2178,2182 ---- Specify status of VXT intrinsics. @samp{-fvxt-intrinsics-enable} is the default. + @xref{Intrinsic Groups}. @cindex -ffixed-line-length-@var{n} option *************** such changes to @code{g77}. *** 3252,3258 **** To find out about existing bugs and ongoing plans for GNU ! Fortran, retrieve @uref{ftp://alpha.gnu.ai.mit.edu/g77.plan} or, if you cannot do that, email ! @email{fortran@@gnu.ai.mit.edu} asking for a recent copy of the GNU Fortran @file{.plan} file. --- 3282,3288 ---- To find out about existing bugs and ongoing plans for GNU ! Fortran, retrieve @uref{ftp://alpha.gnu.org/g77.plan} or, if you cannot do that, email ! @email{fortran@@gnu.org} asking for a recent copy of the GNU Fortran @file{.plan} file. *************** C *** 5727,5731 **** C Version 0: C Written by James Craig Burley 1997-02-20. ! C Contact via Internet email: burley@@gnu.ai.mit.edu C C Purpose: --- 5757,5761 ---- C Version 0: C Written by James Craig Burley 1997-02-20. ! C Contact via Internet email: burley@@gnu.org C C Purpose: *************** without conversion. *** 7061,7069 **** @cindex arguments, null ! The @samp{-fugly-comma} option enables ! use of a single trailing comma to mean ``pass an extra trailing null ! argument'' in a list of actual arguments to a procedure other than a ! statement function, and use of an empty list of arguments to ! mean ``pass a single null argument''. @cindex omitting arguments --- 7091,7099 ---- @cindex arguments, null ! The @samp{-fugly-comma} option enables use of a single trailing comma ! to mean ``pass an extra trailing null argument'' ! in a list of actual arguments to an external procedure, ! and use of an empty list of arguments to such a procedure ! to mean ``pass a single null argument''. @cindex omitting arguments *************** The groups are: *** 7599,7622 **** --- 7629,7659 ---- @cindex groups of intrinsics @table @code + @cindex @code{badu77} intrinsics group @item badu77 UNIX intrinsics having inappropriate forms (usually functions that have intended side effects). + @cindex @code{gnu} intrinsics group @item gnu Intrinsics the GNU Fortran language supports that are extensions to the Fortran standards (77 and 90). + @cindex @code{f2c} intrinsics group @item f2c Intrinsics supported by AT&T's @code{f2c} converter and/or @code{libf2c}. + @cindex @code{f90} intrinsics group @item f90 Fortran 90 intrinsics. + @cindex @code{mil} intrinsics group @item mil MIL-STD 1753 intrinsics (@code{MVBITS}, @code{IAND}, @code{BTEST}, and so on). + @cindex @code{mil} intrinsics group @item unix UNIX intrinsics (@code{IARGC}, @code{EXIT}, @code{ERF}, and so on). + @cindex @code{mil} intrinsics group @item vxt VAX/VMS FORTRAN (current as of v4) intrinsics. *************** or installing @code{g77} is not provided *** 10165,10169 **** To find out about major bugs discovered in the current release and possible workarounds for them, retrieve ! @uref{ftp://alpha.gnu.ai.mit.edu/g77.plan}. (Note that some of this portion of the manual is lifted --- 10202,10206 ---- To find out about major bugs discovered in the current release and possible workarounds for them, retrieve ! @uref{ftp://alpha.gnu.org/g77.plan}. (Note that some of this portion of the manual is lifted *************** bugs that lead to these behaviors is, ul *** 10542,10546 **** responsibility, as difficult as that task can sometimes be. ! @cindex `infinite spaces' printed @cindex spaces, endless printing of @cindex libc, non-ANSI or non-default --- 10579,10583 ---- responsibility, as difficult as that task can sometimes be. ! @cindex ``infinite spaces'' printed @cindex spaces, endless printing of @cindex libc, non-ANSI or non-default *************** Supporting this requires a significant r *** 11030,11036 **** of @code{libf2c}. ! However, a future version of @code{g77} might support ! this construct when the expression is constant. For ! example: @smallexample --- 11067,11074 ---- of @code{libf2c}. ! However, @code{g77} does support ! this construct when the expression is constant ! (as of version 0.5.22). ! For example: @smallexample *************** example: *** 11039,11043 **** @end smallexample ! In the meantime, at least for output (@code{PRINT} and @code{WRITE}), Fortran code making use of this feature can be rewritten to avoid it by constructing the @code{FORMAT} --- 11077,11081 ---- @end smallexample ! Otherwise, at least for output (@code{PRINT} and @code{WRITE}), Fortran code making use of this feature can be rewritten to avoid it by constructing the @code{FORMAT} *************** tool. *** 12276,12279 **** --- 12314,12374 ---- or @uref{ftp://ftp.dsm.fordham.edu}. + @pindex make + @cindex Makefile example + Here are some sample @file{Makefile} rules using @code{ftnchek} + ``project'' files to do cross-file checking and @code{sfmakedepend} + (from @uref{ftp://ahab.rutgers.edu/pub/perl/sfmakedepend}) + to maintain dependencies automatically. + These assume the use of GNU @code{make}. + + @smallexample + # Dummy suffix for ftnchek targets: + .SUFFIXES: .chek + .PHONY: chekall + + # How to compile .f files (for implicit rule): + FC = g77 + # Assume `include' directory: + FFLAGS = -Iinclude -g -O -Wall + + # Flags for ftnchek: + CHEK1 = -array=0 -include=includes -noarray + CHEK2 = -nonovice -usage=1 -notruncation + CHEKFLAGS = $(CHEK1) $(CHEK2) + + # Run ftnchek with all the .prj files except the one corresponding + # to the target's root: + %.chek : %.f ; \ + ftnchek $(filter-out $*.prj,$(PRJS)) $(CHEKFLAGS) \ + -noextern -library $< + + # Derive a project file from a source file: + %.prj : %.f ; \ + ftnchek $(CHEKFLAGS) -noextern -project -library $< + + # The list of objects is assumed to be in variable OBJS. + # Sources corresponding to the objects: + SRCS = $(OBJS:%.o=%.f) + # ftnchek project files: + PRJS = $(OBJS:%.o=%.prj) + + # Build the program + prog: $(OBJS) ; \ + $(FC) -o $@ $(OBJS) + + chekall: $(PRJS) ; \ + ftnchek $(CHEKFLAGS) $(PRJS) + + prjs: $(PRJS) + + # For Emacs M-x find-tag: + TAGS: $(SRCS) ; \ + etags $(SRCS) + + # Rebuild dependencies: + depend: ; \ + sfmakedepend -I $(PLTLIBDIR) -I includes -a prj $(SRCS1) + @end smallexample + @item Try your code out using other Fortran compilers, such as @code{f2c}. *************** exposes it more readily than other compi *** 12291,12296 **** @section Where to Report Bugs @cindex bug report mailing lists ! @kindex fortran@@gnu.ai.mit.edu ! Send bug reports for GNU Fortran to @email{fortran@@gnu.ai.mit.edu}. Often people think of posting bug reports to a newsgroup instead of --- 12386,12391 ---- @section Where to Report Bugs @cindex bug report mailing lists ! @kindex fortran@@gnu.org ! Send bug reports for GNU Fortran to @email{fortran@@gnu.org}. Often people think of posting bug reports to a newsgroup instead of *************** If you would like to write bug fixes or *** 12628,12632 **** compiler, that is very helpful. Send suggested fixes to the bug report ! mailing list, @email{fortran@@gnu.ai.mit.edu}. Please follow these guidelines so we can study your patches efficiently. --- 12723,12727 ---- compiler, that is very helpful. Send suggested fixes to the bug report ! mailing list, @email{fortran@@gnu.org}. Please follow these guidelines so we can study your patches efficiently. *************** GNU CC distribution. *** 12753,12757 **** @item ! Send a message to @email{fortran@@gnu.ai.mit.edu}. @end itemize --- 12848,12852 ---- @item ! Send a message to @email{fortran@@gnu.org}. @end itemize *************** identify the appropriate explanation. *** 13353,13357 **** Identification uses the GNU Info format---specifically, the @code{info} ! command that displays the explanation is given in within square brackets in the diagnostic. For example: --- 13448,13452 ---- Identification uses the GNU Info format---specifically, the @code{info} ! command that displays the explanation is given within square brackets in the diagnostic. For example: *************** The following sample program might help: *** 13557,13561 **** C C Written by James Craig Burley 1997-02-23. ! C Contact via Internet email: burley@@gnu.ai.mit.edu C C Determine how compilers handle non-standard REAL --- 13652,13656 ---- C C Written by James Craig Burley 1997-02-23. ! C Contact via Internet email: burley@@gnu.org C C Determine how compilers handle non-standard REAL diff -rcp2N g77-0.5.21/f/gbe/2.7.2.3.diff g77-0.5.22/f/gbe/2.7.2.3.diff *** g77-0.5.21/f/gbe/2.7.2.3.diff Tue Sep 9 06:11:36 1997 --- g77-0.5.22/f/gbe/2.7.2.3.diff Sun Mar 15 11:21:46 1998 *************** really important to non-developers of gc *** 34,43 **** ! diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog ! *** gcc-2.7.2.3/ChangeLog Sun Aug 31 09:41:00 1997 ! --- gcc-2.7.2.3.f.1/ChangeLog Tue Sep 9 04:24:28 1997 *************** *** 1,6 **** ! --- 1,36 ---- + Wed Sep 3 12:26:33 1997 Jim Wilson + --- 34,118 ---- ! diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.2/ChangeLog ! *** gcc-2.7.2.3/ChangeLog Sun Mar 15 10:46:38 1998 ! --- gcc-2.7.2.3.f.2/ChangeLog Tue Mar 3 18:05:03 1998 *************** *** 1,6 **** ! --- 1,111 ---- ! + Sun Mar 1 01:11:48 1998 Craig Burley ! + ! + * genattrtab.c (pc_rtx): Define global here, so linking works. ! + ! + Sun Mar 1 01:10:16 1998 Bernd Schmidt ! + ! + * basic-block.h (basic_block_computed_jump_target): Declare. ! + * flags.h: (current_function_has_computed_jump): Declare. ! + * flow.c: (basic_block_computed_jump_target): Define. ! + (flow_analysis): Allocate it. Set current_function_has_computed_jump ! + to 0. ! + (find_basic_blocks): Set current_function_has_computed_jump and ! + elements of basic_block_computed_jump_target to 1 as appropriate. ! + * function.c: (current_function_has_computed_jump): Define. ! + * global.c (global_conflicts): Don't allocate pseudos into stack regs ! + at the start of a block that is reachable by a computed jump. ! + * reg-stack.c (stack_reg_life_analysis): If must restart, do so ! + immediately. ! + (subst_stack_regs): Undo change from Aug 26 1997. ! + (uses_reg_or_mem): Now unused, deleted. ! + * stupid.c (stupid_life_analysis): Compute ! + current_function_has_computed_jump. ! + (stupid_find_reg): Don't allocate stack regs if the function has a ! + computed goto. ! + ! + Thu Feb 26 16:13:44 1998 Craig Burley ! + ! + * emit-rtl.c (gen_lowpart_common): Install fix from ! + to get right subword. ! + ! + Fri Feb 13 08:41:49 1998 Robert Lipe ! + ! + * rtlanal.c (computed_jump_p): Remove unused variable 'computed_jump'. ! + ! + Thu Dec 4 06:34:40 1997 Richard Kenner ! + ! + * stmt.c (pushcase_range): Clean up handling of "infinite" values. ! + ! + Mon Oct 6 18:27:12 1997 Richard Henderson ! + ! + * alpha.h (FLOAT_STORE_FLAG_VALUE): It's 2.0 not 0.5. ! + ! + Mon Sep 29 16:12:38 1997 Craig Burley ! + ! + * c-parse.gperf: Replace `restrict' with `__restrict__', ! + to avoid collisions with C programs that use `restrict' ! + as a variable name -- this makes `restrict' support much ! + more like `complex' support. ! + ! + Sun Sep 28 17:13:34 1997 Richard Henderson ! + ! + * alias.c (base_alias_check): Two symbols can conflict if they ! + are accessed via AND. ! + (memrefs_conflict_p): Likewise. ! + ! + Tue Sep 23 00:59:54 1997 Jeffrey A Law (law@cygnus.com) ! + ! + * rtlanal.c (computed_jump_p): Fix typo in last change. ! + ! + Sun Sep 21 17:45:45 1997 Jeffrey A Law (law@cygnus.com) ! + ! + * flow.c (jmp_uses_reg_or_mem): Deleted unused function. ! + (find_basic_blocks): Use computed_jump_p to determine if a ! + particular JUMP_INSN is a computed jump. ! + * reg-stack.c (find_blocks): Use computed_jump_p to determine ! + if a particular JUMP_INSN is a computed jump. ! + * rtlanal.c (jmp_uses_reg_or_mem): New function. ! + (computed_jump_p): Likewise. ! + * rtl.h (computed_jump_p): Declare. ! + ! + Mon Sep 15 17:47:12 1997 Craig Burley ! + ! + * expr.c (safe_from_p_1): Fix thinko, avoid trashing stack ! + when compiling complicated (complex?) expressions. ! + + Wed Sep 3 12:26:33 1997 Jim Wilson + *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 86,90 **** Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu) ! --- 56,81 ---- (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New. --- 161,165 ---- Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu) ! --- 131,156 ---- (FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New. *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 115,119 **** *************** Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@ *** 38,41 **** ! --- 86,143 ---- * install1.texi: New. --- 190,194 ---- *************** Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@ *** 38,41 **** ! --- 161,218 ---- * install1.texi: New. *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 176,180 **** *************** Mon Jul 21 22:47:13 1997 H.J. Lu (hjl@ *** 43,46 **** ! --- 145,213 ---- for Linux. --- 251,255 ---- *************** Mon Jul 21 22:47:13 1997 H.J. Lu (hjl@ *** 43,46 **** ! --- 220,288 ---- for Linux. *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 272,276 **** Tue Jan 29 02:47:13 1997 Richard Stallman ! --- 236,433 ---- to biv_count for reduced givs. --- 347,351 ---- Tue Jan 29 02:47:13 1997 Richard Stallman ! --- 311,512 ---- to biv_count for reduced givs. *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 321,324 **** --- 396,403 ---- ! in constant case. ! + ! Thu May 29 15:42:59 1997 Stan Cox + ! + ! * i386.h (ASM_OUTPUT_REG_{PUSH,POP}): add %% before register name. + ! ! Sun May 18 21:18:48 1997 Craig Burley ! *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 473,477 **** *************** Tue Jan 29 02:47:13 1997 Richard Stallm *** 109,112 **** ! --- 450,532 ---- [! LIBC_VERSION_1] (LIB_SPEC): New override definition. --- 552,556 ---- *************** Tue Jan 29 02:47:13 1997 Richard Stallm *** 109,112 **** ! --- 529,616 ---- [! LIBC_VERSION_1] (LIB_SPEC): New override definition. *************** diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2. *** 555,563 **** + fields. + Sat Jun 29 12:33:39 1996 Richard Kenner *************** Tue Jun 11 20:18:03 1996 Per Bothner *************** Tue Jun 11 20:18:03 1996 Per Bothner ! diff -rcp2N gcc-2.7.2.3/Makefile.in gcc-2.7.2.3.f.1/Makefile.in ! *** gcc-2.7.2.3/Makefile.in Sun Aug 31 09:39:41 1997 ! --- gcc-2.7.2.3.f.1/Makefile.in Sun Aug 31 09:29:51 1997 *************** all: all.indirect *** 397,401 **** --- 765,771 ---- Sun Nov 26 14:47:42 1995 Richard Kenner ! diff -rcp2N gcc-2.7.2.3/Makefile.in gcc-2.7.2.3.f.2/Makefile.in ! *** gcc-2.7.2.3/Makefile.in Fri Aug 8 15:58:17 1997 ! --- gcc-2.7.2.3.f.2/Makefile.in Tue Sep 9 07:01:12 1997 *************** all: all.indirect *** 397,401 **** *************** diff -rcp2N gcc-2.7.2.3/Makefile.in gcc- *** 953,962 **** # These exist for maintenance purposes. ! diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c *** gcc-2.7.2.3/alias.c Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/alias.c Tue Sep 9 04:23:32 1997 *************** *** 0 **** ! --- 1,1004 ---- + /* Alias analysis for GNU C, by John Carr (jfc@mit.edu). + Derived in part from sched.c */ --- 1037,1046 ---- # These exist for maintenance purposes. ! diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.2/alias.c *** gcc-2.7.2.3/alias.c Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/alias.c Thu Feb 26 21:15:44 1998 *************** *** 0 **** ! --- 1,1022 ---- + /* Alias analysis for GNU C, by John Carr (jfc@mit.edu). + Derived in part from sched.c */ *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1438,1445 **** + + /* The base addresses of the read and write are different ! + expressions. If they are both symbols there is no ! + conflict. */ + if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS) ! + return 0; + + /* If one address is a stack reference there can be no alias: --- 1522,1536 ---- + + /* The base addresses of the read and write are different ! + expressions. If they are both symbols and they are not accessed ! + via AND, there is no conflict. */ ! + /* XXX: We can bring knowledge of object alignment and offset into ! + play here. For example, on alpha, "char a, b;" can alias one ! + another, though "char a; long b;" cannot. Similarly, offsets ! + into strutures may be brought into play. Given "char a, b[40];", ! + a and b[1] may overlap, but a and b[20] do not. */ + if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS) ! + { ! + return GET_CODE (x) == AND || GET_CODE (y) == AND; ! + } + + /* If one address is a stack reference there can be no alias: *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1471,1474 **** --- 1562,1569 ---- + assumptions. + + + If XSIZE or YSIZE is negative, we may access memory outside the object + + being referenced as a side effect. This can happen when using AND to + + align memory references, as is done on the Alpha. + + + We recognize the following cases of non-conflicting memory: + *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1502,1506 **** + if (rtx_equal_for_memref_p (x, y)) + { ! + if (xsize == 0 || ysize == 0) + return 1; + if (c >= 0 && xsize > c) --- 1597,1601 ---- + if (rtx_equal_for_memref_p (x, y)) + { ! + if (xsize <= 0 || ysize <= 0) + return 1; + if (c >= 0 && xsize > c) *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1534,1538 **** + { + c += INTVAL (y1); ! + return (xsize == 0 || ysize == 0 + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); + } --- 1629,1633 ---- + { + c += INTVAL (y1); ! + return (xsize <= 0 || ysize <= 0 + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); + } *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1632,1638 **** + as an access with indeterminate size. */ + if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT) ! + return memrefs_conflict_p (0, XEXP (x, 0), ysize, y, c); + if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT) ! + return memrefs_conflict_p (xsize, x, 0, XEXP (y, 0), c); + + if (CONSTANT_P (x)) --- 1727,1739 ---- + as an access with indeterminate size. */ + if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT) ! + return memrefs_conflict_p (-1, XEXP (x, 0), ysize, y, c); + if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT) ! + { ! + /* XXX: If we are indexing far enough into the array/structure, we ! + may yet be able to determine that we can not overlap. But we ! + also need to that we are far enough from the end not to overlap ! + a following reference, so we do nothing for now. */ ! + return memrefs_conflict_p (xsize, x, -1, XEXP (y, 0), c); ! + } + + if (CONSTANT_P (x)) *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1641,1645 **** + { + c += (INTVAL (y) - INTVAL (x)); ! + return (xsize == 0 || ysize == 0 + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); + } --- 1742,1746 ---- + { + c += (INTVAL (y) - INTVAL (x)); ! + return (xsize <= 0 || ysize <= 0 + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)); + } *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1659,1665 **** + + if (CONSTANT_P (y)) ! + return (rtx_equal_for_memref_p (x, y) ! + && (xsize == 0 || ysize == 0 ! + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0))); + + return 1; --- 1760,1767 ---- + + if (CONSTANT_P (y)) ! + return (xsize < 0 || ysize < 0 ! + || (rtx_equal_for_memref_p (x, y) ! + && (xsize == 0 || ysize == 0 ! + || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)))); + + return 1; *************** diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7. *** 1963,1969 **** + reg_base_value_size = 0; + } ! diff -rcp2N gcc-2.7.2.3/c-decl.c gcc-2.7.2.3.f.1/c-decl.c *** gcc-2.7.2.3/c-decl.c Fri Oct 27 09:44:43 1995 ! --- gcc-2.7.2.3.f.1/c-decl.c Sun Aug 10 22:46:24 1997 *************** init_decl_processing () *** 3207,3210 **** --- 2065,2086 ---- + reg_base_value_size = 0; + } ! diff -rcp2N gcc-2.7.2.3/basic-block.h gcc-2.7.2.3.f.2/basic-block.h ! *** gcc-2.7.2.3/basic-block.h Thu Jun 15 11:03:29 1995 ! --- gcc-2.7.2.3.f.2/basic-block.h Sun Mar 1 03:28:56 1998 ! *************** extern rtx *basic_block_head; ! *** 53,56 **** ! --- 53,61 ---- ! extern rtx *basic_block_end; ! ! + /* Index by basic block number, determine whether the block can be reached ! + through a computed jump. */ ! + ! + extern char *basic_block_computed_jump_target; ! + ! /* Index by basic block number, get address of regset ! describing the registers live at the start of that block. */ ! diff -rcp2N gcc-2.7.2.3/c-decl.c gcc-2.7.2.3.f.2/c-decl.c *** gcc-2.7.2.3/c-decl.c Fri Oct 27 09:44:43 1995 ! --- gcc-2.7.2.3.f.2/c-decl.c Tue Sep 9 07:01:13 1997 *************** init_decl_processing () *** 3207,3210 **** *************** diff -rcp2N gcc-2.7.2.3/c-decl.c gcc-2.7 *** 2072,2575 **** /* Use the width of the narrowest normal C type which is wide enough. */ TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1)); ! diff -rcp2N gcc-2.7.2.3/c-gperf.h gcc-2.7.2.3.f.1/c-gperf.h ! *** gcc-2.7.2.3/c-gperf.h Fri Mar 4 19:15:53 1994 ! --- gcc-2.7.2.3.f.1/c-gperf.h Mon Aug 11 06:58:47 1997 ! *************** ! *** 1,15 **** ! /* C code produced by gperf version 2.5 (GNU C++ version) */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ c-parse.gperf */ ! struct resword { char *name; short token; enum rid rid; }; ! ! #define TOTAL_KEYWORDS 79 ! #define MIN_WORD_LENGTH 2 ! #define MAX_WORD_LENGTH 20 ! ! #define MIN_HASH_VALUE 10 ! ! #define MAX_HASH_VALUE 144 ! ! /* maximum key range = 135, duplicates = 0 */ ! #ifdef __GNUC__ ! ! __inline ! #endif ! static unsigned int ! --- 1,16 ---- ! /* C code produced by gperf version 2.5 (GNU C++ version) */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ../g77-new/c-parse.gperf */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ ! struct resword { char *name; short token; enum rid rid; }; ! ! #define TOTAL_KEYWORDS 81 ! #define MIN_WORD_LENGTH 2 ! #define MAX_WORD_LENGTH 20 ! ! #define MIN_HASH_VALUE 11 ! ! #define MAX_HASH_VALUE 157 ! ! /* maximum key range = 147, duplicates = 0 */ ! #ifdef __GNUC__ ! ! inline ! #endif ! static unsigned int ! *************** hash (str, len) ! *** 20,36 **** ! static unsigned char asso_values[] = ! { ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 25, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 1, 145, 46, 8, 15, ! ! 61, 6, 36, 48, 3, 5, 145, 18, 63, 25, ! ! 29, 76, 1, 145, 13, 2, 1, 51, 37, 9, ! ! 9, 1, 3, 145, 145, 145, 145, 145, ! }; ! register int hval = len; ! --- 21,37 ---- ! static unsigned char asso_values[] = ! { ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 2, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, ! ! 158, 158, 158, 158, 158, 1, 158, 18, 1, 58, ! ! 56, 6, 44, 64, 13, 45, 158, 4, 26, 68, ! ! 2, 74, 1, 158, 2, 13, 1, 33, 48, 5, ! ! 5, 3, 12, 158, 158, 158, 158, 158, ! }; ! register int hval = len; ! *************** hash (str, len) ! *** 44,47 **** ! --- 45,49 ---- ! case 1: ! hval += asso_values[str[0]]; ! + break; ! } ! return hval + asso_values[str[len - 1]]; ! *************** hash (str, len) ! *** 50,166 **** ! static struct resword wordlist[] = ! { ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, ! ! {"int", TYPESPEC, RID_INT}, ! ! {"",}, {"",}, ! ! {"__typeof__", TYPEOF, NORID}, ! ! {"__signed__", TYPESPEC, RID_SIGNED}, ! ! {"__imag__", IMAGPART, NORID}, ! ! {"switch", SWITCH, NORID}, ! ! {"__inline__", SCSPEC, RID_INLINE}, ! ! {"else", ELSE, NORID}, ! ! {"__iterator__", SCSPEC, RID_ITERATOR}, ! ! {"__inline", SCSPEC, RID_INLINE}, ! ! {"__extension__", EXTENSION, NORID}, ! ! {"struct", STRUCT, NORID}, ! ! {"__real__", REALPART, NORID}, ! ! {"__const", TYPE_QUAL, RID_CONST}, ! ! {"while", WHILE, NORID}, ! ! {"__const__", TYPE_QUAL, RID_CONST}, ! ! {"case", CASE, NORID}, ! ! {"__complex__", TYPESPEC, RID_COMPLEX}, ! ! {"__iterator", SCSPEC, RID_ITERATOR}, ! ! {"bycopy", TYPE_QUAL, RID_BYCOPY}, ! ! {"",}, {"",}, {"",}, ! ! {"__complex", TYPESPEC, RID_COMPLEX}, ! ! {"",}, ! ! {"in", TYPE_QUAL, RID_IN}, ! ! {"break", BREAK, NORID}, ! ! {"@defs", DEFS, NORID}, ! ! {"",}, {"",}, {"",}, ! ! {"extern", SCSPEC, RID_EXTERN}, ! ! {"if", IF, NORID}, ! ! {"typeof", TYPEOF, NORID}, ! ! {"typedef", SCSPEC, RID_TYPEDEF}, ! ! {"__typeof", TYPEOF, NORID}, ! ! {"sizeof", SIZEOF, NORID}, ! ! {"",}, ! ! {"return", RETURN, NORID}, ! ! {"const", TYPE_QUAL, RID_CONST}, ! ! {"__volatile__", TYPE_QUAL, RID_VOLATILE}, ! ! {"@private", PRIVATE, NORID}, ! ! {"@selector", SELECTOR, NORID}, ! ! {"__volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"__asm__", ASM_KEYWORD, NORID}, ! ! {"",}, {"",}, ! ! {"continue", CONTINUE, NORID}, ! ! {"__alignof__", ALIGNOF, NORID}, ! ! {"__imag", IMAGPART, NORID}, ! ! {"__attribute__", ATTRIBUTE, NORID}, ! ! {"",}, {"",}, ! ! {"__attribute", ATTRIBUTE, NORID}, ! ! {"for", FOR, NORID}, ! ! {"",}, ! ! {"@encode", ENCODE, NORID}, ! ! {"id", OBJECTNAME, RID_ID}, ! ! {"static", SCSPEC, RID_STATIC}, ! ! {"@interface", INTERFACE, NORID}, ! ! {"",}, ! ! {"__signed", TYPESPEC, RID_SIGNED}, ! ! {"",}, ! ! {"__label__", LABEL, NORID}, ! ! {"",}, {"",}, ! ! {"__asm", ASM_KEYWORD, NORID}, ! ! {"char", TYPESPEC, RID_CHAR}, ! ! {"",}, ! ! {"inline", SCSPEC, RID_INLINE}, ! ! {"out", TYPE_QUAL, RID_OUT}, ! ! {"register", SCSPEC, RID_REGISTER}, ! ! {"__real", REALPART, NORID}, ! ! {"short", TYPESPEC, RID_SHORT}, ! ! {"",}, ! ! {"enum", ENUM, NORID}, ! ! {"inout", TYPE_QUAL, RID_INOUT}, ! ! {"",}, ! ! {"oneway", TYPE_QUAL, RID_ONEWAY}, ! ! {"union", UNION, NORID}, ! ! {"",}, ! ! {"__alignof", ALIGNOF, NORID}, ! ! {"",}, ! ! {"@implementation", IMPLEMENTATION, NORID}, ! ! {"",}, ! ! {"@class", CLASS, NORID}, ! ! {"",}, ! ! {"@public", PUBLIC, NORID}, ! ! {"asm", ASM_KEYWORD, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"default", DEFAULT, NORID}, ! ! {"",}, ! ! {"void", TYPESPEC, RID_VOID}, ! ! {"",}, ! ! {"@protected", PROTECTED, NORID}, ! ! {"@protocol", PROTOCOL, NORID}, ! ! {"",}, {"",}, {"",}, ! ! {"volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"",}, {"",}, ! ! {"signed", TYPESPEC, RID_SIGNED}, ! ! {"float", TYPESPEC, RID_FLOAT}, ! ! {"@end", END, NORID}, ! ! {"",}, {"",}, ! ! {"unsigned", TYPESPEC, RID_UNSIGNED}, ! ! {"@compatibility_alias", ALIAS, NORID}, ! ! {"double", TYPESPEC, RID_DOUBLE}, ! ! {"",}, {"",}, ! ! {"auto", SCSPEC, RID_AUTO}, ! ! {"",}, ! ! {"goto", GOTO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"do", DO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"long", TYPESPEC, RID_LONG}, ! }; ! ! #ifdef __GNUC__ ! ! __inline ! #endif ! struct resword * ! --- 52,167 ---- ! static struct resword wordlist[] = ! { ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, {"",}, ! ! {"return", RETURN, NORID}, ! ! {"__real__", REALPART, NORID}, ! ! {"__typeof__", TYPEOF, NORID}, ! ! {"__restrict", TYPE_QUAL, RID_RESTRICT}, ! ! {"extern", SCSPEC, RID_EXTERN}, ! ! {"break", BREAK, NORID}, ! ! {"@encode", ENCODE, NORID}, ! ! {"@private", PRIVATE, NORID}, ! ! {"@selector", SELECTOR, NORID}, ! ! {"@interface", INTERFACE, NORID}, ! ! {"__extension__", EXTENSION, NORID}, ! ! {"struct", STRUCT, NORID}, ! ! {"",}, ! ! {"restrict", TYPE_QUAL, RID_RESTRICT}, ! ! {"__signed__", TYPESPEC, RID_SIGNED}, ! ! {"@defs", DEFS, NORID}, ! ! {"__asm__", ASM_KEYWORD, NORID}, ! ! {"",}, ! ! {"else", ELSE, NORID}, ! ! {"",}, ! ! {"__alignof__", ALIGNOF, NORID}, ! ! {"",}, ! ! {"__attribute__", ATTRIBUTE, NORID}, ! ! {"",}, ! ! {"__real", REALPART, NORID}, ! ! {"__attribute", ATTRIBUTE, NORID}, ! ! {"__label__", LABEL, NORID}, ! ! {"",}, ! ! {"@protocol", PROTOCOL, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"@class", CLASS, NORID}, ! ! {"",}, ! ! {"in", TYPE_QUAL, RID_IN}, ! ! {"int", TYPESPEC, RID_INT}, ! ! {"for", FOR, NORID}, ! ! {"typeof", TYPEOF, NORID}, ! ! {"typedef", SCSPEC, RID_TYPEDEF}, ! ! {"__typeof", TYPEOF, NORID}, ! ! {"__imag__", IMAGPART, NORID}, ! ! {"",}, ! ! {"__inline__", SCSPEC, RID_INLINE}, ! ! {"__iterator", SCSPEC, RID_ITERATOR}, ! ! {"__iterator__", SCSPEC, RID_ITERATOR}, ! ! {"__inline", SCSPEC, RID_INLINE}, ! ! {"while", WHILE, NORID}, ! ! {"__volatile__", TYPE_QUAL, RID_VOLATILE}, ! ! {"",}, ! ! {"@end", END, NORID}, ! ! {"__volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"const", TYPE_QUAL, RID_CONST}, ! ! {"__const", TYPE_QUAL, RID_CONST}, ! ! {"bycopy", TYPE_QUAL, RID_BYCOPY}, ! ! {"__const__", TYPE_QUAL, RID_CONST}, ! ! {"@protected", PROTECTED, NORID}, ! ! {"__complex__", TYPESPEC, RID_COMPLEX}, ! ! {"__alignof", ALIGNOF, NORID}, ! ! {"__complex", TYPESPEC, RID_COMPLEX}, ! ! {"continue", CONTINUE, NORID}, ! ! {"sizeof", SIZEOF, NORID}, ! ! {"register", SCSPEC, RID_REGISTER}, ! ! {"switch", SWITCH, NORID}, ! ! {"__signed", TYPESPEC, RID_SIGNED}, ! ! {"out", TYPE_QUAL, RID_OUT}, ! ! {"",}, ! ! {"case", CASE, NORID}, ! ! {"char", TYPESPEC, RID_CHAR}, ! ! {"inline", SCSPEC, RID_INLINE}, ! ! {"",}, ! ! {"union", UNION, NORID}, ! ! {"",}, ! ! {"@implementation", IMPLEMENTATION, NORID}, ! ! {"volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"oneway", TYPE_QUAL, RID_ONEWAY}, ! ! {"",}, ! ! {"if", IF, NORID}, ! ! {"__asm", ASM_KEYWORD, NORID}, ! ! {"short", TYPESPEC, RID_SHORT}, ! ! {"",}, ! ! {"static", SCSPEC, RID_STATIC}, ! ! {"long", TYPESPEC, RID_LONG}, ! ! {"auto", SCSPEC, RID_AUTO}, ! ! {"",}, {"",}, ! ! {"@public", PUBLIC, NORID}, ! ! {"double", TYPESPEC, RID_DOUBLE}, ! ! {"",}, ! ! {"id", OBJECTNAME, RID_ID}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"default", DEFAULT, NORID}, ! ! {"@compatibility_alias", ALIAS, NORID}, ! ! {"unsigned", TYPESPEC, RID_UNSIGNED}, ! ! {"enum", ENUM, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"__imag", IMAGPART, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"float", TYPESPEC, RID_FLOAT}, ! ! {"inout", TYPE_QUAL, RID_INOUT}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"do", DO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"signed", TYPESPEC, RID_SIGNED}, ! ! {"",}, {"",}, {"",}, ! ! {"goto", GOTO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"void", TYPESPEC, RID_VOID}, ! ! {"",}, {"",}, {"",}, ! ! {"asm", ASM_KEYWORD, NORID}, ! }; ! ! #ifdef __GNUC__ ! ! inline ! #endif ! struct resword * ! diff -rcp2N gcc-2.7.2.3/c-lex.c gcc-2.7.2.3.f.1/c-lex.c ! *** gcc-2.7.2.3/c-lex.c Thu Jun 15 11:11:39 1995 ! --- gcc-2.7.2.3.f.1/c-lex.c Sun Aug 10 22:46:49 1997 ! *************** init_lex () ! *** 173,176 **** ! --- 173,177 ---- ! ridpointers[(int) RID_CONST] = get_identifier ("const"); ! ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); ! + ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict"); ! ridpointers[(int) RID_AUTO] = get_identifier ("auto"); ! ridpointers[(int) RID_STATIC] = get_identifier ("static"); ! *************** init_lex () ! *** 206,209 **** ! --- 207,211 ---- ! UNSET_RESERVED_WORD ("iterator"); ! UNSET_RESERVED_WORD ("complex"); ! + UNSET_RESERVED_WORD ("restrict"); ! } ! if (flag_no_asm) ! *************** init_lex () ! *** 214,217 **** ! --- 216,220 ---- ! UNSET_RESERVED_WORD ("iterator"); ! UNSET_RESERVED_WORD ("complex"); ! + UNSET_RESERVED_WORD ("restrict"); ! } ! } ! *************** yylex () ! *** 1433,1437 **** ! /* Create a node with determined type and value. */ ! if (imag) ! ! yylval.ttype = build_complex (convert (type, integer_zero_node), ! build_real (type, value)); ! else ! --- 1436,1441 ---- ! /* Create a node with determined type and value. */ ! if (imag) ! ! yylval.ttype = build_complex (NULL_TREE, ! ! convert (type, integer_zero_node), ! build_real (type, value)); ! else ! *************** yylex () ! *** 1624,1629 **** ! <= TYPE_PRECISION (integer_type_node)) ! yylval.ttype ! ! = build_complex (integer_zero_node, ! ! convert (integer_type_node, yylval.ttype)); ! else ! error ("complex integer constant is too wide for `complex int'"); ! --- 1628,1634 ---- ! <= TYPE_PRECISION (integer_type_node)) ! yylval.ttype ! ! = build_complex (NULL_TREE, integer_zero_node, ! ! convert (integer_type_node, ! ! yylval.ttype)); ! else ! error ("complex integer constant is too wide for `complex int'"); ! diff -rcp2N gcc-2.7.2.3/c-lex.h gcc-2.7.2.3.f.1/c-lex.h ! *** gcc-2.7.2.3/c-lex.h Thu Jun 15 11:12:22 1995 ! --- gcc-2.7.2.3.f.1/c-lex.h Sun Aug 10 22:10:55 1997 ! *************** enum rid ! *** 43,47 **** ! RID_VOLATILE, ! RID_INLINE, ! ! RID_NOALIAS, ! RID_ITERATOR, ! RID_COMPLEX, ! --- 43,47 ---- ! RID_VOLATILE, ! RID_INLINE, ! ! RID_RESTRICT, ! RID_ITERATOR, ! RID_COMPLEX, ! diff -rcp2N gcc-2.7.2.3/c-parse.gperf gcc-2.7.2.3.f.1/c-parse.gperf ! *** gcc-2.7.2.3/c-parse.gperf Fri Apr 9 23:00:44 1993 ! --- gcc-2.7.2.3.f.1/c-parse.gperf Sun Aug 10 22:10:55 1997 ! *************** __label__, LABEL, NORID ! *** 36,39 **** ! --- 36,40 ---- ! __real, REALPART, NORID ! __real__, REALPART, NORID ! + __restrict, TYPE_QUAL, RID_RESTRICT ! __signed, TYPESPEC, RID_SIGNED ! __signed__, TYPESPEC, RID_SIGNED ! *************** oneway, TYPE_QUAL, RID_ONEWAY ! *** 69,72 **** ! --- 70,74 ---- ! out, TYPE_QUAL, RID_OUT ! register, SCSPEC, RID_REGISTER ! + restrict, TYPE_QUAL, RID_RESTRICT ! return, RETURN, NORID ! short, TYPESPEC, RID_SHORT ! diff -rcp2N gcc-2.7.2.3/c-typeck.c gcc-2.7.2.3.f.1/c-typeck.c ! *** gcc-2.7.2.3/c-typeck.c Sat Jun 29 16:27:15 1996 ! --- gcc-2.7.2.3.f.1/c-typeck.c Sun Aug 10 22:46:29 1997 ! *************** pointer_int_sum (resultcode, ptrop, into ! *** 2681,2686 **** ! so the multiply won't overflow spuriously. */ ! ! ! if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE) ! ! intop = convert (type_for_size (POINTER_SIZE, 0), intop); ! ! /* Replace the integer argument with a suitable product by the object size. ! --- 2681,2688 ---- ! so the multiply won't overflow spuriously. */ ! ! ! if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype) ! ! || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype)) ! ! intop = convert (type_for_size (TYPE_PRECISION (sizetype), ! ! TREE_UNSIGNED (sizetype)), intop); ! ! /* Replace the integer argument with a suitable product by the object size. ! diff -rcp2N gcc-2.7.2.3/calls.c gcc-2.7.2.3.f.1/calls.c ! *** gcc-2.7.2.3/calls.c Fri Oct 27 01:53:43 1995 ! --- gcc-2.7.2.3.f.1/calls.c Fri Aug 29 07:52:07 1997 ! *************** expand_call (exp, target, ignore) ! *** 564,567 **** ! --- 564,569 ---- ! /* Nonzero if it is plausible that this is a call to alloca. */ ! int may_be_alloca; ! + /* Nonzero if this is a call to malloc or a related function. */ ! + int is_malloc; ! /* Nonzero if this is a call to setjmp or a related function. */ ! int returns_twice; ! *************** expand_call (exp, target, ignore) ! *** 741,745 **** ! if (stack_arg_under_construction || i >= 0) ! { ! ! rtx insn = NEXT_INSN (before_call), seq; ! ! /* Look for a call in the inline function code. ! --- 743,749 ---- ! if (stack_arg_under_construction || i >= 0) ! { ! ! rtx first_insn ! ! = before_call ? NEXT_INSN (before_call) : get_insns (); ! ! rtx insn, seq; ! ! /* Look for a call in the inline function code. ! *************** expand_call (exp, target, ignore) ! *** 749,753 **** ! ! if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0) ! ! for (; insn; insn = NEXT_INSN (insn)) ! if (GET_CODE (insn) == CALL_INSN) ! break; ! --- 753,757 ---- ! ! if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0) ! ! for (insn = first_insn; insn; insn = NEXT_INSN (insn)) ! if (GET_CODE (insn) == CALL_INSN) ! break; ! *************** expand_call (exp, target, ignore) ! *** 781,785 **** ! seq = get_insns (); ! end_sequence (); ! ! emit_insns_before (seq, NEXT_INSN (before_call)); ! emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX); ! } ! --- 785,789 ---- ! seq = get_insns (); ! end_sequence (); ! ! emit_insns_before (seq, first_insn); ! emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX); ! } ! *************** expand_call (exp, target, ignore) ! *** 852,855 **** ! --- 856,860 ---- ! returns_twice = 0; ! is_longjmp = 0; ! + is_malloc = 0; ! ! if (name != 0 && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 15) ! *************** expand_call (exp, target, ignore) ! *** 891,894 **** ! --- 896,903 ---- ! && ! strcmp (tname, "longjmp")) ! is_longjmp = 1; ! + /* Only recognize malloc when alias analysis is enabled. */ ! + else if (tname[0] == 'm' && flag_alias_check ! + && ! strcmp(tname, "malloc")) ! + is_malloc = 1; } --- 2189,2367 ---- /* Use the width of the narrowest normal C type which is wide enough. */ TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1)); ! diff -rcp2N gcc-2.7.2.3/c-lex.c gcc-2.7.2.3.f.2/c-lex.c ! *** gcc-2.7.2.3/c-lex.c Thu Jun 15 11:11:39 1995 ! --- gcc-2.7.2.3.f.2/c-lex.c Mon Sep 29 19:55:33 1997 ! *************** init_lex () ! *** 173,176 **** ! --- 173,177 ---- ! ridpointers[(int) RID_CONST] = get_identifier ("const"); ! ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); ! + ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict"); ! ridpointers[(int) RID_AUTO] = get_identifier ("auto"); ! ridpointers[(int) RID_STATIC] = get_identifier ("static"); ! *************** init_lex () ! *** 206,209 **** ! --- 207,211 ---- ! UNSET_RESERVED_WORD ("iterator"); ! UNSET_RESERVED_WORD ("complex"); ! + UNSET_RESERVED_WORD ("restrict"); ! } ! if (flag_no_asm) ! *************** init_lex () ! *** 214,217 **** ! --- 216,220 ---- ! UNSET_RESERVED_WORD ("iterator"); ! UNSET_RESERVED_WORD ("complex"); ! + UNSET_RESERVED_WORD ("restrict"); ! } ! } ! *************** yylex () ! *** 1433,1437 **** ! /* Create a node with determined type and value. */ ! if (imag) ! ! yylval.ttype = build_complex (convert (type, integer_zero_node), ! build_real (type, value)); ! else ! --- 1436,1441 ---- ! /* Create a node with determined type and value. */ ! if (imag) ! ! yylval.ttype = build_complex (NULL_TREE, ! ! convert (type, integer_zero_node), ! build_real (type, value)); ! else ! *************** yylex () ! *** 1624,1629 **** ! <= TYPE_PRECISION (integer_type_node)) ! yylval.ttype ! ! = build_complex (integer_zero_node, ! ! convert (integer_type_node, yylval.ttype)); ! else ! error ("complex integer constant is too wide for `complex int'"); ! --- 1628,1634 ---- ! <= TYPE_PRECISION (integer_type_node)) ! yylval.ttype ! ! = build_complex (NULL_TREE, integer_zero_node, ! ! convert (integer_type_node, ! ! yylval.ttype)); ! else ! error ("complex integer constant is too wide for `complex int'"); ! diff -rcp2N gcc-2.7.2.3/c-lex.h gcc-2.7.2.3.f.2/c-lex.h ! *** gcc-2.7.2.3/c-lex.h Thu Jun 15 11:12:22 1995 ! --- gcc-2.7.2.3.f.2/c-lex.h Tue Sep 9 07:01:13 1997 ! *************** enum rid ! *** 43,47 **** ! RID_VOLATILE, ! RID_INLINE, ! ! RID_NOALIAS, ! RID_ITERATOR, ! RID_COMPLEX, ! --- 43,47 ---- ! RID_VOLATILE, ! RID_INLINE, ! ! RID_RESTRICT, ! RID_ITERATOR, ! RID_COMPLEX, ! diff -rcp2N gcc-2.7.2.3/c-parse.gperf gcc-2.7.2.3.f.2/c-parse.gperf ! *** gcc-2.7.2.3/c-parse.gperf Fri Apr 9 23:00:44 1993 ! --- gcc-2.7.2.3.f.2/c-parse.gperf Mon Sep 29 19:49:21 1997 ! *************** __label__, LABEL, NORID ! *** 36,39 **** ! --- 36,41 ---- ! __real, REALPART, NORID ! __real__, REALPART, NORID ! + __restrict, TYPE_QUAL, RID_RESTRICT ! + __restrict__, TYPE_QUAL, RID_RESTRICT ! __signed, TYPESPEC, RID_SIGNED ! __signed__, TYPESPEC, RID_SIGNED ! diff -rcp2N gcc-2.7.2.3/c-typeck.c gcc-2.7.2.3.f.2/c-typeck.c ! *** gcc-2.7.2.3/c-typeck.c Sat Jun 29 16:27:15 1996 ! --- gcc-2.7.2.3.f.2/c-typeck.c Tue Sep 9 07:01:14 1997 ! *************** pointer_int_sum (resultcode, ptrop, into ! *** 2681,2686 **** ! so the multiply won't overflow spuriously. */ ! ! if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE) ! ! intop = convert (type_for_size (POINTER_SIZE, 0), intop); ! /* Replace the integer argument with a suitable product by the object size. ! --- 2681,2688 ---- ! so the multiply won't overflow spuriously. */ ! ! if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype) ! ! || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype)) ! ! intop = convert (type_for_size (TYPE_PRECISION (sizetype), ! ! TREE_UNSIGNED (sizetype)), intop); ! /* Replace the integer argument with a suitable product by the object size. ! diff -rcp2N gcc-2.7.2.3/calls.c gcc-2.7.2.3.f.2/calls.c ! *** gcc-2.7.2.3/calls.c Fri Oct 27 01:53:43 1995 ! --- gcc-2.7.2.3.f.2/calls.c Tue Sep 9 07:01:14 1997 ! *************** expand_call (exp, target, ignore) ! *** 564,567 **** ! --- 564,569 ---- ! /* Nonzero if it is plausible that this is a call to alloca. */ ! int may_be_alloca; ! + /* Nonzero if this is a call to malloc or a related function. */ ! + int is_malloc; ! /* Nonzero if this is a call to setjmp or a related function. */ ! int returns_twice; ! *************** expand_call (exp, target, ignore) ! *** 741,745 **** ! if (stack_arg_under_construction || i >= 0) ! { ! ! rtx insn = NEXT_INSN (before_call), seq; ! ! /* Look for a call in the inline function code. ! --- 743,749 ---- ! if (stack_arg_under_construction || i >= 0) ! { ! ! rtx first_insn ! ! = before_call ? NEXT_INSN (before_call) : get_insns (); ! ! rtx insn, seq; ! ! /* Look for a call in the inline function code. ! *************** expand_call (exp, target, ignore) ! *** 749,753 **** ! ! if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0) ! ! for (; insn; insn = NEXT_INSN (insn)) ! if (GET_CODE (insn) == CALL_INSN) ! break; ! --- 753,757 ---- ! ! if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0) ! ! for (insn = first_insn; insn; insn = NEXT_INSN (insn)) ! if (GET_CODE (insn) == CALL_INSN) ! break; ! *************** expand_call (exp, target, ignore) ! *** 781,785 **** ! seq = get_insns (); ! end_sequence (); ! ! emit_insns_before (seq, NEXT_INSN (before_call)); ! emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX); ! } ! --- 785,789 ---- ! seq = get_insns (); ! end_sequence (); ! ! emit_insns_before (seq, first_insn); ! emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX); ! } ! *************** expand_call (exp, target, ignore) ! *** 852,855 **** ! --- 856,860 ---- ! returns_twice = 0; ! is_longjmp = 0; ! + is_malloc = 0; ! ! if (name != 0 && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 15) ! *************** expand_call (exp, target, ignore) ! *** 891,894 **** ! --- 896,903 ---- ! && ! strcmp (tname, "longjmp")) ! is_longjmp = 1; ! + /* Only recognize malloc when alias analysis is enabled. */ ! + else if (tname[0] == 'm' && flag_alias_check ! + && ! strcmp(tname, "malloc")) ! + is_malloc = 1; } *************** diff -rcp2N gcc-2.7.2.3/calls.c gcc-2.7. *** 2633,2639 **** } ! diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2.3.f.1/cccp.c *** gcc-2.7.2.3/cccp.c Thu Oct 26 22:07:26 1995 ! --- gcc-2.7.2.3.f.1/cccp.c Sun Aug 10 22:45:53 1997 *************** initialize_builtins (inp, outp) *** 9626,9629 **** --- 2425,2431 ---- } ! diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2.3.f.2/cccp.c *** gcc-2.7.2.3/cccp.c Thu Oct 26 22:07:26 1995 ! --- gcc-2.7.2.3.f.2/cccp.c Tue Sep 9 07:01:15 1997 *************** initialize_builtins (inp, outp) *** 9626,9629 **** *************** diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2 *** 2644,2650 **** if (debug_output) ! diff -rcp2N gcc-2.7.2.3/combine.c gcc-2.7.2.3.f.1/combine.c *** gcc-2.7.2.3/combine.c Sun Nov 26 19:32:07 1995 ! --- gcc-2.7.2.3.f.1/combine.c Fri Aug 29 07:52:16 1997 *************** try_combine (i3, i2, i1) *** 2011,2016 **** --- 2436,2442 ---- if (debug_output) ! diff -rcp2N gcc-2.7.2.3/combine.c gcc-2.7.2.3.f.2/combine.c *** gcc-2.7.2.3/combine.c Sun Nov 26 19:32:07 1995 ! --- gcc-2.7.2.3.f.2/combine.c Tue Sep 9 07:01:17 1997 *************** try_combine (i3, i2, i1) *** 2011,2016 **** *************** diff -rcp2N gcc-2.7.2.3/combine.c gcc-2. *** 2790,2796 **** /* These notes say something about results of an insn. We can only support them if they used to be on I3 in which case they ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.c gcc-2.7.2.3.f.1/config/alpha/alpha.c *** gcc-2.7.2.3/config/alpha/alpha.c Sat Jun 29 16:26:53 1996 ! --- gcc-2.7.2.3.f.1/config/alpha/alpha.c Fri Aug 29 07:51:37 1997 *************** extern int rtx_equal_function_value_matt *** 64,67 **** --- 2582,2588 ---- /* These notes say something about results of an insn. We can only support them if they used to be on I3 in which case they ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.c gcc-2.7.2.3.f.2/config/alpha/alpha.c *** gcc-2.7.2.3/config/alpha/alpha.c Sat Jun 29 16:26:53 1996 ! --- gcc-2.7.2.3.f.2/config/alpha/alpha.c Tue Sep 9 07:01:17 1997 *************** extern int rtx_equal_function_value_matt *** 64,67 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/alp *** 2872,2878 **** for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) if ((GET_CODE (insn) == CALL_INSN) ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.h gcc-2.7.2.3.f.1/config/alpha/alpha.h *** gcc-2.7.2.3/config/alpha/alpha.h Sat Jun 29 16:27:31 1996 ! --- gcc-2.7.2.3.f.1/config/alpha/alpha.h Fri Aug 29 07:52:06 1997 *************** extern int target_flags; *** 112,116 **** --- 2664,2670 ---- for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) if ((GET_CODE (insn) == CALL_INSN) ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.h gcc-2.7.2.3.f.2/config/alpha/alpha.h *** gcc-2.7.2.3/config/alpha/alpha.h Sat Jun 29 16:27:31 1996 ! --- gcc-2.7.2.3.f.2/config/alpha/alpha.h Thu Feb 26 21:16:59 1998 *************** extern int target_flags; *** 112,116 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/alp *** 2896,2911 **** #define CONSTANT_ALIGNMENT(EXP, ALIGN) \ *************** enum reg_class { NO_REGS, GENERAL_REGS, ! *** 664,667 **** ! --- 669,675 ---- ! On Alpha, don't define this because there are no push insns. */ /* #define PUSH_ROUNDING(BYTES) */ ! + + /* Define this to be nonzero if stack checking is built into the ABI. */ + #define STACK_CHECK_BUILTIN 1 ! /* Define this if the maximum size of all the outgoing args is to be ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.md gcc-2.7.2.3.f.1/config/alpha/alpha.md *** gcc-2.7.2.3/config/alpha/alpha.md Fri Oct 27 10:49:59 1995 ! --- gcc-2.7.2.3.f.1/config/alpha/alpha.md Fri Jul 11 00:08:48 1997 *************** *** 1746,1752 **** --- 2688,2716 ---- #define CONSTANT_ALIGNMENT(EXP, ALIGN) \ *************** enum reg_class { NO_REGS, GENERAL_REGS, ! *** 665,668 **** ! --- 670,676 ---- /* #define PUSH_ROUNDING(BYTES) */ ! + /* Define this to be nonzero if stack checking is built into the ABI. */ + #define STACK_CHECK_BUILTIN 1 ! + /* Define this if the maximum size of all the outgoing args is to be ! accumulated and pushed during the prologue. The amount can be ! *************** __enable_execute_stack (addr) \ ! *** 1374,1378 **** ! /* Define the value returned by a floating-point comparison instruction. */ ! ! ! #define FLOAT_STORE_FLAG_VALUE 0.5 ! ! /* Canonicalize a comparison from one we don't have to one we do have. */ ! --- 1382,1386 ---- ! /* Define the value returned by a floating-point comparison instruction. */ ! ! ! #define FLOAT_STORE_FLAG_VALUE 2.0 ! ! /* Canonicalize a comparison from one we don't have to one we do have. */ ! diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.md gcc-2.7.2.3.f.2/config/alpha/alpha.md *** gcc-2.7.2.3/config/alpha/alpha.md Fri Oct 27 10:49:59 1995 ! --- gcc-2.7.2.3.f.2/config/alpha/alpha.md Tue Sep 9 07:01:17 1997 *************** *** 1746,1752 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/alp *** 2925,2931 **** (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))] "TARGET_FP" ! diff -rcp2N gcc-2.7.2.3/config/alpha/elf.h gcc-2.7.2.3.f.1/config/alpha/elf.h *** gcc-2.7.2.3/config/alpha/elf.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/alpha/elf.h Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 2730,2736 ---- (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))] "TARGET_FP" ! diff -rcp2N gcc-2.7.2.3/config/alpha/elf.h gcc-2.7.2.3.f.2/config/alpha/elf.h *** gcc-2.7.2.3/config/alpha/elf.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/alpha/elf.h Tue Sep 9 07:01:18 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/elf *** 3453,3459 **** + #define ENDFILE_SPEC \ + "crtend.o%s crtn.o%s" ! diff -rcp2N gcc-2.7.2.3/config/alpha/linux.h gcc-2.7.2.3.f.1/config/alpha/linux.h *** gcc-2.7.2.3/config/alpha/linux.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/alpha/linux.h Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 3258,3264 ---- + #define ENDFILE_SPEC \ + "crtend.o%s crtn.o%s" ! diff -rcp2N gcc-2.7.2.3/config/alpha/linux.h gcc-2.7.2.3.f.2/config/alpha/linux.h *** gcc-2.7.2.3/config/alpha/linux.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/alpha/linux.h Tue Sep 9 07:01:18 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/lin *** 3531,3537 **** + /* Generate calls to memcpy, etc., not bcopy, etc. */ + #define TARGET_MEM_FUNCTIONS ! diff -rcp2N gcc-2.7.2.3/config/alpha/t-linux gcc-2.7.2.3.f.1/config/alpha/t-linux *** gcc-2.7.2.3/config/alpha/t-linux Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/alpha/t-linux Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 3336,3342 ---- + /* Generate calls to memcpy, etc., not bcopy, etc. */ + #define TARGET_MEM_FUNCTIONS ! diff -rcp2N gcc-2.7.2.3/config/alpha/t-linux gcc-2.7.2.3.f.2/config/alpha/t-linux *** gcc-2.7.2.3/config/alpha/t-linux Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/alpha/t-linux Tue Sep 9 07:01:18 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/t-l *** 3540,3553 **** + FIXINCLUDES = + STMP_FIXPROTO = ! diff -rcp2N gcc-2.7.2.3/config/alpha/x-linux gcc-2.7.2.3.f.1/config/alpha/x-linux *** gcc-2.7.2.3/config/alpha/x-linux Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/alpha/x-linux Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 1 ---- + CLIB=-lbfd -liberty ! diff -rcp2N gcc-2.7.2.3/config/alpha/xm-alpha.h gcc-2.7.2.3.f.1/config/alpha/xm-alpha.h *** gcc-2.7.2.3/config/alpha/xm-alpha.h Thu Aug 31 21:52:27 1995 ! --- gcc-2.7.2.3.f.1/config/alpha/xm-alpha.h Fri Jul 11 00:08:49 1997 *************** Boston, MA 02111-1307, USA. */ *** 46,51 **** --- 3345,3358 ---- + FIXINCLUDES = + STMP_FIXPROTO = ! diff -rcp2N gcc-2.7.2.3/config/alpha/x-linux gcc-2.7.2.3.f.2/config/alpha/x-linux *** gcc-2.7.2.3/config/alpha/x-linux Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/alpha/x-linux Tue Sep 9 07:01:18 1997 *************** *** 0 **** --- 1 ---- + CLIB=-lbfd -liberty ! diff -rcp2N gcc-2.7.2.3/config/alpha/xm-alpha.h gcc-2.7.2.3.f.2/config/alpha/xm-alpha.h *** gcc-2.7.2.3/config/alpha/xm-alpha.h Thu Aug 31 21:52:27 1995 ! --- gcc-2.7.2.3.f.2/config/alpha/xm-alpha.h Tue Sep 9 07:01:18 1997 *************** Boston, MA 02111-1307, USA. */ *** 46,51 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/xm- *** 3571,3577 **** /* OSF/1 has putenv. */ ! diff -rcp2N gcc-2.7.2.3/config/alpha/xm-linux.h gcc-2.7.2.3.f.1/config/alpha/xm-linux.h *** gcc-2.7.2.3/config/alpha/xm-linux.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/alpha/xm-linux.h Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 3376,3382 ---- /* OSF/1 has putenv. */ ! diff -rcp2N gcc-2.7.2.3/config/alpha/xm-linux.h gcc-2.7.2.3.f.2/config/alpha/xm-linux.h *** gcc-2.7.2.3/config/alpha/xm-linux.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/alpha/xm-linux.h Tue Sep 9 07:01:18 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/alpha/xm- *** 3587,3593 **** + #define USE_BFD + #endif ! diff -rcp2N gcc-2.7.2.3/config/i386/i386.c gcc-2.7.2.3.f.1/config/i386/i386.c *** gcc-2.7.2.3/config/i386/i386.c Sun Oct 22 11:13:21 1995 ! --- gcc-2.7.2.3.f.1/config/i386/i386.c Sun Aug 10 22:46:09 1997 *************** standard_80387_constant_p (x) *** 1290,1294 **** --- 3392,3398 ---- + #define USE_BFD + #endif ! diff -rcp2N gcc-2.7.2.3/config/i386/i386.c gcc-2.7.2.3.f.2/config/i386/i386.c *** gcc-2.7.2.3/config/i386/i386.c Sun Oct 22 11:13:21 1995 ! --- gcc-2.7.2.3.f.2/config/i386/i386.c Tue Sep 9 07:01:18 1997 *************** standard_80387_constant_p (x) *** 1290,1294 **** *************** diff -rcp2N gcc-2.7.2.3/config/i386/i386 *** 3603,3609 **** is1 = REAL_VALUES_EQUAL (d, dconst1); set_float_handler (NULL_PTR); ! diff -rcp2N gcc-2.7.2.3/config/i386/i386.h gcc-2.7.2.3.f.1/config/i386/i386.h *** gcc-2.7.2.3/config/i386/i386.h Fri Sep 22 22:42:57 1995 ! --- gcc-2.7.2.3.f.1/config/i386/i386.h Sun Aug 24 10:33:50 1997 *************** extern int target_flags; *** 245,249 **** --- 3408,3414 ---- is1 = REAL_VALUES_EQUAL (d, dconst1); set_float_handler (NULL_PTR); ! diff -rcp2N gcc-2.7.2.3/config/i386/i386.h gcc-2.7.2.3.f.2/config/i386/i386.h *** gcc-2.7.2.3/config/i386/i386.h Fri Sep 22 22:42:57 1995 ! --- gcc-2.7.2.3.f.2/config/i386/i386.h Tue Mar 3 18:04:35 1998 *************** extern int target_flags; *** 245,249 **** *************** diff -rcp2N gcc-2.7.2.3/config/i386/i386 *** 3619,3625 **** /* Allocation boundary (in *bits*) for the code of a function. ! diff -rcp2N gcc-2.7.2.3/config/m68k/m68k.md gcc-2.7.2.3.f.1/config/m68k/m68k.md ! *** gcc-2.7.2.3/config/m68k/m68k.md Sun Aug 31 09:39:43 1997 ! --- gcc-2.7.2.3.f.1/config/m68k/m68k.md Sun Aug 31 09:21:09 1997 *************** *** 288,292 **** --- 3424,3456 ---- /* Allocation boundary (in *bits*) for the code of a function. ! *************** do { long l; \ ! *** 1699,1703 **** ! ! #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \ ! ! fprintf (FILE, "\tpushl e%s\n", reg_names[REGNO]) ! ! /* This is how to output an insn to pop a register from the stack. ! --- 1699,1703 ---- ! ! #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \ ! ! fprintf (FILE, "\tpushl %%e%s\n", reg_names[REGNO]) ! ! /* This is how to output an insn to pop a register from the stack. ! *************** do { long l; \ ! *** 1705,1709 **** ! ! #define ASM_OUTPUT_REG_POP(FILE,REGNO) \ ! ! fprintf (FILE, "\tpopl e%s\n", reg_names[REGNO]) ! ! /* This is how to output an element of a case-vector that is absolute. ! --- 1705,1709 ---- ! ! #define ASM_OUTPUT_REG_POP(FILE,REGNO) \ ! ! fprintf (FILE, "\tpopl %%e%s\n", reg_names[REGNO]) ! ! /* This is how to output an element of a case-vector that is absolute. ! diff -rcp2N gcc-2.7.2.3/config/m68k/m68k.md gcc-2.7.2.3.f.2/config/m68k/m68k.md ! *** gcc-2.7.2.3/config/m68k/m68k.md Wed Aug 13 17:23:23 1997 ! --- gcc-2.7.2.3.f.2/config/m68k/m68k.md Tue Sep 9 07:01:20 1997 *************** *** 288,292 **** *************** diff -rcp2N gcc-2.7.2.3/config/m68k/m68k *** 3648,3654 **** "operands[2] = gen_reg_rtx (DImode);") ! diff -rcp2N gcc-2.7.2.3/config/mips/mips.c gcc-2.7.2.3.f.1/config/mips/mips.c *** gcc-2.7.2.3/config/mips/mips.c Sat Jun 29 16:26:44 1996 ! --- gcc-2.7.2.3.f.1/config/mips/mips.c Sun Aug 10 22:45:43 1997 *************** expand_block_move (operands) *** 2360,2365 **** --- 3479,3485 ---- "operands[2] = gen_reg_rtx (DImode);") ! diff -rcp2N gcc-2.7.2.3/config/mips/mips.c gcc-2.7.2.3.f.2/config/mips/mips.c *** gcc-2.7.2.3/config/mips/mips.c Sat Jun 29 16:26:44 1996 ! --- gcc-2.7.2.3.f.2/config/mips/mips.c Tue Sep 9 07:01:20 1997 *************** expand_block_move (operands) *** 2360,2365 **** *************** diff -rcp2N gcc-2.7.2.3/config/mips/mips *** 3668,3674 **** bytes_rtx, align_rtx)); ! diff -rcp2N gcc-2.7.2.3/config/mips/mips.h gcc-2.7.2.3.f.1/config/mips/mips.h *** gcc-2.7.2.3/config/mips/mips.h Thu Nov 9 16:23:09 1995 ! --- gcc-2.7.2.3.f.1/config/mips/mips.h Sun Aug 10 22:46:44 1997 *************** typedef struct mips_args { *** 2160,2170 **** --- 3499,3505 ---- bytes_rtx, align_rtx)); ! diff -rcp2N gcc-2.7.2.3/config/mips/mips.h gcc-2.7.2.3.f.2/config/mips/mips.h *** gcc-2.7.2.3/config/mips/mips.h Thu Nov 9 16:23:09 1995 ! --- gcc-2.7.2.3.f.2/config/mips/mips.h Tue Sep 9 07:01:21 1997 *************** typedef struct mips_args { *** 2160,2170 **** *************** diff -rcp2N gcc-2.7.2.3/config/mips/mips *** 3710,3716 **** /* A C compound statement that attempts to replace X with a valid ! diff -rcp2N gcc-2.7.2.3/config/mips/sni-gas.h gcc-2.7.2.3.f.1/config/mips/sni-gas.h *** gcc-2.7.2.3/config/mips/sni-gas.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/mips/sni-gas.h Sun Aug 10 22:46:33 1997 *************** *** 0 **** --- 3541,3547 ---- /* A C compound statement that attempts to replace X with a valid ! diff -rcp2N gcc-2.7.2.3/config/mips/sni-gas.h gcc-2.7.2.3.f.2/config/mips/sni-gas.h *** gcc-2.7.2.3/config/mips/sni-gas.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/mips/sni-gas.h Tue Sep 9 07:01:21 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/mips/sni- *** 3759,3765 **** + + ! diff -rcp2N gcc-2.7.2.3/config/mips/sni-svr4.h gcc-2.7.2.3.f.1/config/mips/sni-svr4.h *** gcc-2.7.2.3/config/mips/sni-svr4.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/mips/sni-svr4.h Sun Aug 10 22:46:33 1997 *************** *** 0 **** --- 3590,3596 ---- + + ! diff -rcp2N gcc-2.7.2.3/config/mips/sni-svr4.h gcc-2.7.2.3.f.2/config/mips/sni-svr4.h *** gcc-2.7.2.3/config/mips/sni-svr4.h Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/mips/sni-svr4.h Tue Sep 9 07:01:21 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/mips/sni- *** 3868,3874 **** + #undef SDB_DEBUGGING_INFO + #undef MIPS_DEBUGGING_INFO ! diff -rcp2N gcc-2.7.2.3/config/mips/x-sni-svr4 gcc-2.7.2.3.f.1/config/mips/x-sni-svr4 *** gcc-2.7.2.3/config/mips/x-sni-svr4 Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/mips/x-sni-svr4 Sun Aug 10 22:46:33 1997 *************** *** 0 **** --- 3699,3705 ---- + #undef SDB_DEBUGGING_INFO + #undef MIPS_DEBUGGING_INFO ! diff -rcp2N gcc-2.7.2.3/config/mips/x-sni-svr4 gcc-2.7.2.3.f.2/config/mips/x-sni-svr4 *** gcc-2.7.2.3/config/mips/x-sni-svr4 Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/mips/x-sni-svr4 Tue Sep 9 07:01:21 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/mips/x-sn *** 3892,3898 **** + # For now, just try using it for all SVR* configurations. + ALLOCA = alloca.o ! diff -rcp2N gcc-2.7.2.3/config/msdos/configur.bat gcc-2.7.2.3.f.1/config/msdos/configur.bat *** gcc-2.7.2.3/config/msdos/configur.bat Mon Aug 28 09:55:47 1995 ! --- gcc-2.7.2.3.f.1/config/msdos/configur.bat Sun Aug 10 23:08:05 1997 *************** sed -f config/msdos/top.sed Makefile.in *** 18,21 **** --- 3723,3729 ---- + # For now, just try using it for all SVR* configurations. + ALLOCA = alloca.o ! diff -rcp2N gcc-2.7.2.3/config/msdos/configur.bat gcc-2.7.2.3.f.2/config/msdos/configur.bat *** gcc-2.7.2.3/config/msdos/configur.bat Mon Aug 28 09:55:47 1995 ! --- gcc-2.7.2.3.f.2/config/msdos/configur.bat Tue Sep 9 07:01:21 1997 *************** sed -f config/msdos/top.sed Makefile.in *** 18,21 **** *************** diff -rcp2N gcc-2.7.2.3/config/msdos/con *** 3908,3914 **** if not exist cp\make-lang.in goto no_cp sed -f config/msdos/top.sed cp\make-lang.in >> Makefile ! diff -rcp2N gcc-2.7.2.3/config/pa/pa.c gcc-2.7.2.3.f.1/config/pa/pa.c *** gcc-2.7.2.3/config/pa/pa.c Sun Oct 22 11:45:20 1995 ! --- gcc-2.7.2.3.f.1/config/pa/pa.c Sun Aug 10 22:45:44 1997 *************** output_move_double (operands) *** 1344,1369 **** --- 3739,3745 ---- if not exist cp\make-lang.in goto no_cp sed -f config/msdos/top.sed cp\make-lang.in >> Makefile ! diff -rcp2N gcc-2.7.2.3/config/pa/pa.c gcc-2.7.2.3.f.2/config/pa/pa.c *** gcc-2.7.2.3/config/pa/pa.c Sun Oct 22 11:45:20 1995 ! --- gcc-2.7.2.3.f.2/config/pa/pa.c Tue Sep 9 07:01:22 1997 *************** output_move_double (operands) *** 1344,1369 **** *************** diff -rcp2N gcc-2.7.2.3/config/pa/pa.c g *** 3974,3980 **** if (optype0 == REGOP && optype1 == REGOP && REGNO (operands[0]) == REGNO (operands[1]) + 1) ! diff -rcp2N gcc-2.7.2.3/config/pa/pa.md gcc-2.7.2.3.f.1/config/pa/pa.md *** gcc-2.7.2.3/config/pa/pa.md Mon Aug 14 13:00:49 1995 ! --- gcc-2.7.2.3.f.1/config/pa/pa.md Sun Aug 10 22:45:45 1997 *************** *** 1828,1832 **** --- 3805,3811 ---- if (optype0 == REGOP && optype1 == REGOP && REGNO (operands[0]) == REGNO (operands[1]) + 1) ! diff -rcp2N gcc-2.7.2.3/config/pa/pa.md gcc-2.7.2.3.f.2/config/pa/pa.md *** gcc-2.7.2.3/config/pa/pa.md Mon Aug 14 13:00:49 1995 ! --- gcc-2.7.2.3.f.2/config/pa/pa.md Tue Sep 9 07:01:22 1997 *************** *** 1828,1832 **** *************** diff -rcp2N gcc-2.7.2.3/config/pa/pa.md *** 4029,4035 **** (match_operand:DI 1 "general_operand" "rM,r,r,o,Q,i"))] ! diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.c gcc-2.7.2.3.f.1/config/rs6000/rs6000.c *** gcc-2.7.2.3/config/rs6000/rs6000.c Sat Jun 29 16:26:26 1996 ! --- gcc-2.7.2.3.f.1/config/rs6000/rs6000.c Fri Aug 29 07:51:51 1997 *************** input_operand (op, mode) *** 724,730 **** --- 3860,3866 ---- (match_operand:DI 1 "general_operand" "rM,r,r,o,Q,i"))] ! diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.c gcc-2.7.2.3.f.2/config/rs6000/rs6000.c *** gcc-2.7.2.3/config/rs6000/rs6000.c Sat Jun 29 16:26:26 1996 ! --- gcc-2.7.2.3.f.2/config/rs6000/rs6000.c Tue Sep 9 07:01:23 1997 *************** input_operand (op, mode) *** 724,730 **** *************** diff -rcp2N gcc-2.7.2.3/config/rs6000/rs *** 4197,4203 **** } ! diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.md gcc-2.7.2.3.f.1/config/rs6000/rs6000.md *** gcc-2.7.2.3/config/rs6000/rs6000.md Sat Jun 29 16:27:24 1996 ! --- gcc-2.7.2.3.f.1/config/rs6000/rs6000.md Fri Aug 29 07:52:00 1997 *************** *** 4420,4423 **** --- 4028,4034 ---- } ! diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.md gcc-2.7.2.3.f.2/config/rs6000/rs6000.md *** gcc-2.7.2.3/config/rs6000/rs6000.md Sat Jun 29 16:27:24 1996 ! --- gcc-2.7.2.3.f.2/config/rs6000/rs6000.md Tue Sep 9 07:01:23 1997 *************** *** 4420,4423 **** *************** diff -rcp2N gcc-2.7.2.3/config/rs6000/rs *** 4227,4233 **** ;; A function pointer is a pointer to a data area whose first word contains ! diff -rcp2N gcc-2.7.2.3/config/sparc/sol2.h gcc-2.7.2.3.f.1/config/sparc/sol2.h *** gcc-2.7.2.3/config/sparc/sol2.h Sat Aug 19 21:36:45 1995 ! --- gcc-2.7.2.3.f.1/config/sparc/sol2.h Sun Aug 10 22:45:53 1997 *************** do { \ *** 166,168 **** --- 4058,4064 ---- ;; A function pointer is a pointer to a data area whose first word contains ! diff -rcp2N gcc-2.7.2.3/config/sparc/sol2.h gcc-2.7.2.3.f.2/config/sparc/sol2.h *** gcc-2.7.2.3/config/sparc/sol2.h Sat Aug 19 21:36:45 1995 ! --- gcc-2.7.2.3.f.2/config/sparc/sol2.h Tue Sep 9 07:01:23 1997 *************** do { \ *** 166,168 **** *************** diff -rcp2N gcc-2.7.2.3/config/sparc/sol *** 4239,4245 **** Sparc ABI says that long double is 4 words. */ ! #define LONG_DOUBLE_TYPE_SIZE 64 ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.c gcc-2.7.2.3.f.1/config/sparc/sparc.c *** gcc-2.7.2.3/config/sparc/sparc.c Tue Sep 12 22:32:24 1995 ! --- gcc-2.7.2.3.f.1/config/sparc/sparc.c Sun Aug 10 22:46:03 1997 *************** Boston, MA 02111-1307, USA. */ *** 40,46 **** --- 4070,4076 ---- Sparc ABI says that long double is 4 words. */ ! #define LONG_DOUBLE_TYPE_SIZE 64 ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.c gcc-2.7.2.3.f.2/config/sparc/sparc.c *** gcc-2.7.2.3/config/sparc/sparc.c Tue Sep 12 22:32:24 1995 ! --- gcc-2.7.2.3.f.2/config/sparc/sparc.c Tue Sep 9 07:01:24 1997 *************** Boston, MA 02111-1307, USA. */ *** 40,46 **** *************** diff -rcp2N gcc-2.7.2.3/config/sparc/spa *** 4264,4270 **** /* Global variables for machine-dependent things. */ ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.h gcc-2.7.2.3.f.1/config/sparc/sparc.h *** gcc-2.7.2.3/config/sparc/sparc.h Sat Jun 29 16:25:54 1996 ! --- gcc-2.7.2.3.f.1/config/sparc/sparc.h Sun Aug 10 22:46:13 1997 *************** extern int leaf_function; *** 1526,1533 **** --- 4095,4101 ---- /* Global variables for machine-dependent things. */ ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.h gcc-2.7.2.3.f.2/config/sparc/sparc.h *** gcc-2.7.2.3/config/sparc/sparc.h Sat Jun 29 16:25:54 1996 ! --- gcc-2.7.2.3.f.2/config/sparc/sparc.h Tue Sep 9 07:01:25 1997 *************** extern int leaf_function; *** 1526,1533 **** *************** diff -rcp2N gcc-2.7.2.3/config/sparc/spa *** 4302,4308 **** } while (0) ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.md gcc-2.7.2.3.f.1/config/sparc/sparc.md *** gcc-2.7.2.3/config/sparc/sparc.md Tue Sep 12 22:57:35 1995 ! --- gcc-2.7.2.3.f.1/config/sparc/sparc.md Sun Aug 10 22:46:27 1997 *************** *** 4799,4803 **** --- 4133,4139 ---- } while (0) ! diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.md gcc-2.7.2.3.f.2/config/sparc/sparc.md *** gcc-2.7.2.3/config/sparc/sparc.md Tue Sep 12 22:57:35 1995 ! --- gcc-2.7.2.3.f.2/config/sparc/sparc.md Tue Sep 9 07:01:26 1997 *************** *** 4799,4803 **** *************** diff -rcp2N gcc-2.7.2.3/config/sparc/spa *** 4485,4491 **** ;; Special pattern for the FLUSH instruction. ! diff -rcp2N gcc-2.7.2.3/config/x-linux gcc-2.7.2.3.f.1/config/x-linux *** gcc-2.7.2.3/config/x-linux Tue Mar 28 12:43:37 1995 ! --- gcc-2.7.2.3.f.1/config/x-linux Fri Jul 11 00:08:49 1997 *************** BOOT_CFLAGS = -O $(CFLAGS) -Iinclude *** 13,14 **** --- 4316,4322 ---- ;; Special pattern for the FLUSH instruction. ! diff -rcp2N gcc-2.7.2.3/config/x-linux gcc-2.7.2.3.f.2/config/x-linux *** gcc-2.7.2.3/config/x-linux Tue Mar 28 12:43:37 1995 ! --- gcc-2.7.2.3.f.2/config/x-linux Tue Sep 9 07:01:26 1997 *************** BOOT_CFLAGS = -O $(CFLAGS) -Iinclude *** 13,14 **** *************** diff -rcp2N gcc-2.7.2.3/config/x-linux g *** 4496,4502 **** + # Don't install "assert.h" in gcc. We use the one in glibc. + INSTALL_ASSERT_H = ! diff -rcp2N gcc-2.7.2.3/config/x-linux-aout gcc-2.7.2.3.f.1/config/x-linux-aout *** gcc-2.7.2.3/config/x-linux-aout Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.1/config/x-linux-aout Fri Jul 11 00:08:49 1997 *************** *** 0 **** --- 4327,4333 ---- + # Don't install "assert.h" in gcc. We use the one in glibc. + INSTALL_ASSERT_H = ! diff -rcp2N gcc-2.7.2.3/config/x-linux-aout gcc-2.7.2.3.f.2/config/x-linux-aout *** gcc-2.7.2.3/config/x-linux-aout Thu Jan 1 00:00:00 1970 ! --- gcc-2.7.2.3.f.2/config/x-linux-aout Tue Sep 9 07:01:26 1997 *************** *** 0 **** *************** diff -rcp2N gcc-2.7.2.3/config/x-linux-a *** 4516,4522 **** + # Don't run fixproto + STMP_FIXPROTO = ! diff -rcp2N gcc-2.7.2.3/config.guess gcc-2.7.2.3.f.1/config.guess ! *** gcc-2.7.2.3/config.guess Sun Aug 31 09:39:43 1997 ! --- gcc-2.7.2.3.f.1/config.guess Sun Aug 31 09:21:10 1997 *************** trap 'rm -f dummy.c dummy.o dummy; exit *** 52,63 **** --- 4347,4353 ---- + # Don't run fixproto + STMP_FIXPROTO = ! diff -rcp2N gcc-2.7.2.3/config.guess gcc-2.7.2.3.f.2/config.guess ! *** gcc-2.7.2.3/config.guess Tue Jun 24 18:42:50 1997 ! --- gcc-2.7.2.3.f.2/config.guess Tue Sep 9 07:01:26 1997 *************** trap 'rm -f dummy.c dummy.o dummy; exit *** 52,63 **** *************** diff -rcp2N gcc-2.7.2.3/config.guess gcc *** 4737,4743 **** exit (0); #endif ! diff -rcp2N gcc-2.7.2.3/configure gcc-2.7.2.3.f.1/configure ! *** gcc-2.7.2.3/configure Sun Aug 31 09:39:44 1997 ! --- gcc-2.7.2.3.f.1/configure Sun Aug 31 09:35:10 1997 *************** exec_prefix='$(prefix)' *** 82,85 **** --- 4568,4574 ---- exit (0); #endif ! diff -rcp2N gcc-2.7.2.3/configure gcc-2.7.2.3.f.2/configure ! *** gcc-2.7.2.3/configure Wed Aug 13 17:23:24 1997 ! --- gcc-2.7.2.3.f.2/configure Tue Sep 9 07:01:26 1997 *************** exec_prefix='$(prefix)' *** 82,85 **** *************** diff -rcp2N gcc-2.7.2.3/configure gcc-2. *** 4848,4854 **** echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed ! diff -rcp2N gcc-2.7.2.3/cse.c gcc-2.7.2.3.f.1/cse.c ! *** gcc-2.7.2.3/cse.c Sun Aug 31 09:39:46 1997 ! --- gcc-2.7.2.3.f.1/cse.c Sun Aug 31 09:21:14 1997 *************** static struct table_elt *last_jump_equiv *** 520,544 **** --- 4679,4719 ---- echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed ! diff -rcp2N gcc-2.7.2.3/cp/ChangeLog gcc-2.7.2.3.f.2/cp/ChangeLog ! *** gcc-2.7.2.3/cp/ChangeLog Tue Aug 19 21:26:09 1997 ! --- gcc-2.7.2.3.f.2/cp/ChangeLog Mon Oct 27 08:01:25 1997 ! *************** ! *** 1,2 **** ! --- 1,12 ---- ! + Mon Oct 27 03:00:07 1997 Craig Burley ! + ! + * tree.def (TEMPLATE_CONST_PARM): Word size now 3, not ! + 2, due to Jul 23 1996 change to gcc/tree.h by Richard ! + Kenner to add an `rtl' field to `struct tree_int_cst'. ! + Silently depending on the length or layout of an ! + internal gcc back-end structure is, of course, a ! + kludge, but presumably the g++ people have long since ! + abandoned such kludges. ! + ! Thu Aug 22 23:47:38 1997 H.J. Lu (hjl@gnu.ai.mit.edu) ! ! diff -rcp2N gcc-2.7.2.3/cp/tree.def gcc-2.7.2.3.f.2/cp/tree.def ! *** gcc-2.7.2.3/cp/tree.def Thu Oct 12 02:31:34 1995 ! --- gcc-2.7.2.3.f.2/cp/tree.def Mon Oct 27 07:42:11 1997 ! *************** DEFTREECODE (TEMPLATE_TYPE_PARM, "templa ! *** 93,97 **** ! /* Index into a template parameter list. This parameter must not be a ! type. */ ! ! DEFTREECODE (TEMPLATE_CONST_PARM, "template_const_parm", "c", 2) ! ! /* For uninstantiated parameterized types. ! --- 93,97 ---- ! /* Index into a template parameter list. This parameter must not be a ! type. */ ! ! DEFTREECODE (TEMPLATE_CONST_PARM, "template_const_parm", "c", 3) ! ! /* For uninstantiated parameterized types. ! diff -rcp2N gcc-2.7.2.3/cse.c gcc-2.7.2.3.f.2/cse.c ! *** gcc-2.7.2.3/cse.c Fri Aug 8 15:30:25 1997 ! --- gcc-2.7.2.3.f.2/cse.c Tue Sep 9 07:01:27 1997 *************** static struct table_elt *last_jump_equiv *** 520,544 **** *************** diff -rcp2N gcc-2.7.2.3/cse.c gcc-2.7.2. *** 5777,5783 **** /* See if this is a branch that is part of the path. If so, and it is ! diff -rcp2N gcc-2.7.2.3/dwarfout.c gcc-2.7.2.3.f.1/dwarfout.c *** gcc-2.7.2.3/dwarfout.c Fri Oct 27 01:40:07 1995 ! --- gcc-2.7.2.3.f.1/dwarfout.c Sun Aug 10 22:47:19 1997 *************** output_bound_representation (bound, dim_ *** 1629,1705 **** --- 5642,5648 ---- /* See if this is a branch that is part of the path. If so, and it is ! diff -rcp2N gcc-2.7.2.3/dwarfout.c gcc-2.7.2.3.f.2/dwarfout.c *** gcc-2.7.2.3/dwarfout.c Fri Oct 27 01:40:07 1995 ! --- gcc-2.7.2.3.f.2/dwarfout.c Tue Sep 9 07:01:28 1997 *************** output_bound_representation (bound, dim_ *** 1629,1705 **** *************** diff -rcp2N gcc-2.7.2.3/dwarfout.c gcc-2 *** 5965,5971 **** root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE ! diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2.7.2.3.f.1/emit-rtl.c *** gcc-2.7.2.3/emit-rtl.c Thu Sep 14 20:09:30 1995 ! --- gcc-2.7.2.3.f.1/emit-rtl.c Fri Aug 29 07:51:46 1997 *************** max_label_num () *** 545,548 **** --- 5830,5836 ---- root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE ! diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2.7.2.3.f.2/emit-rtl.c *** gcc-2.7.2.3/emit-rtl.c Thu Sep 14 20:09:30 1995 ! --- gcc-2.7.2.3.f.2/emit-rtl.c Thu Feb 26 21:12:55 1998 *************** max_label_num () *** 545,548 **** *************** diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2 *** 5992,5995 **** --- 5857,5873 ---- /* Return first label number used in this function (if any were used). */ + *************** gen_lowpart_common (mode, x) + *** 610,614 **** + return (GET_MODE (SUBREG_REG (x)) == mode && SUBREG_WORD (x) == 0 + ? SUBREG_REG (x) + ! : gen_rtx (SUBREG, mode, SUBREG_REG (x), SUBREG_WORD (x))); + else if (GET_CODE (x) == REG) + { + --- 627,631 ---- + return (GET_MODE (SUBREG_REG (x)) == mode && SUBREG_WORD (x) == 0 + ? SUBREG_REG (x) + ! : gen_rtx (SUBREG, mode, SUBREG_REG (x), SUBREG_WORD (x) + word)); + else if (GET_CODE (x) == REG) + { *************** subreg_lowpart_p (x) *** 975,978 **** *************** diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2 *** 6011,6017 **** new = gen_rtx (MEM, mode, addr); MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref); ! diff -rcp2N gcc-2.7.2.3/explow.c gcc-2.7.2.3.f.1/explow.c *** gcc-2.7.2.3/explow.c Thu Jun 15 11:30:10 1995 ! --- gcc-2.7.2.3.f.1/explow.c Fri Aug 29 07:52:03 1997 *************** Boston, MA 02111-1307, USA. */ *** 32,36 **** --- 5889,5895 ---- new = gen_rtx (MEM, mode, addr); MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref); ! diff -rcp2N gcc-2.7.2.3/explow.c gcc-2.7.2.3.f.2/explow.c *** gcc-2.7.2.3/explow.c Thu Jun 15 11:30:10 1995 ! --- gcc-2.7.2.3.f.2/explow.c Tue Sep 9 07:01:28 1997 *************** Boston, MA 02111-1307, USA. */ *** 32,36 **** *************** diff -rcp2N gcc-2.7.2.3/explow.c gcc-2.7 *** 6236,6242 **** } ! diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7.2.3.f.1/expmed.c *** gcc-2.7.2.3/expmed.c Thu Jul 13 23:25:37 1995 ! --- gcc-2.7.2.3.f.1/expmed.c Sun Aug 10 22:46:23 1997 *************** store_bit_field (str_rtx, bitsize, bitnu *** 399,402 **** --- 6114,6120 ---- } ! diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7.2.3.f.2/expmed.c *** gcc-2.7.2.3/expmed.c Thu Jul 13 23:25:37 1995 ! --- gcc-2.7.2.3.f.2/expmed.c Tue Sep 9 07:01:29 1997 *************** store_bit_field (str_rtx, bitsize, bitnu *** 399,402 **** *************** diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7 *** 6378,6384 **** if (quotient == 0) /* No divide instruction either. Use library for remainder. */ ! diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2.3.f.1/expr.c *** gcc-2.7.2.3/expr.c Sat Jun 29 16:26:15 1996 ! --- gcc-2.7.2.3.f.1/expr.c Fri Aug 29 08:01:24 1997 *************** Boston, MA 02111-1307, USA. */ *** 27,30 **** --- 6256,6262 ---- if (quotient == 0) /* No divide instruction either. Use library for remainder. */ ! diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2.3.f.2/expr.c *** gcc-2.7.2.3/expr.c Sat Jun 29 16:26:15 1996 ! --- gcc-2.7.2.3.f.2/expr.c Mon Sep 15 21:47:09 1997 *************** Boston, MA 02111-1307, USA. */ *** 27,30 **** *************** diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2 *** 6937,6941 **** + when we're done. */ + ! + if (safe_from_p_count > safe_from_p_size) + return 0; /* For now, don't bother re-sizing the array. */ + safe_from_p_rewritten[safe_from_p_count++] = exp; --- 6815,6819 ---- + when we're done. */ + ! + if (safe_from_p_count >= safe_from_p_size) + return 0; /* For now, don't bother re-sizing the array. */ + safe_from_p_rewritten[safe_from_p_count++] = exp; *************** diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2 *** 7734,7740 **** type = type_for_size (bitsize, unsignedp); ! diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2.3.f.1/expr.h *** gcc-2.7.2.3/expr.h Fri Oct 27 10:16:56 1995 ! --- gcc-2.7.2.3.f.1/expr.h Fri Aug 29 07:52:02 1997 *************** enum direction {none, upward, downward}; *** 229,232 **** --- 7612,7618 ---- type = type_for_size (bitsize, unsignedp); ! diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2.3.f.2/expr.h *** gcc-2.7.2.3/expr.h Fri Oct 27 10:16:56 1995 ! --- gcc-2.7.2.3.f.2/expr.h Tue Sep 9 07:01:31 1997 *************** enum direction {none, upward, downward}; *** 229,232 **** *************** diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2 *** 7798,7804 **** /* Emit code to copy function value to a new temp reg and return that reg. */ ! diff -rcp2N gcc-2.7.2.3/final.c gcc-2.7.2.3.f.1/final.c *** gcc-2.7.2.3/final.c Sun Nov 26 18:50:00 1995 ! --- gcc-2.7.2.3.f.1/final.c Fri Jul 11 00:11:16 1997 *************** profile_function (file) *** 983,991 **** --- 7676,7682 ---- /* Emit code to copy function value to a new temp reg and return that reg. */ ! diff -rcp2N gcc-2.7.2.3/final.c gcc-2.7.2.3.f.2/final.c *** gcc-2.7.2.3/final.c Sun Nov 26 18:50:00 1995 ! --- gcc-2.7.2.3.f.2/final.c Tue Sep 9 07:01:32 1997 *************** profile_function (file) *** 983,991 **** *************** diff -rcp2N gcc-2.7.2.3/final.c gcc-2.7. *** 7891,7897 **** if (sval) ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM); ! diff -rcp2N gcc-2.7.2.3/flags.h gcc-2.7.2.3.f.1/flags.h *** gcc-2.7.2.3/flags.h Thu Jun 15 11:34:11 1995 ! --- gcc-2.7.2.3.f.1/flags.h Fri Aug 29 08:40:01 1997 *************** extern int flag_unroll_loops; *** 204,207 **** --- 7769,7775 ---- if (sval) ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM); ! diff -rcp2N gcc-2.7.2.3/flags.h gcc-2.7.2.3.f.2/flags.h *** gcc-2.7.2.3/flags.h Thu Jun 15 11:34:11 1995 ! --- gcc-2.7.2.3.f.2/flags.h Sun Mar 1 03:29:49 1998 *************** extern int flag_unroll_loops; *** 204,207 **** *************** diff -rcp2N gcc-2.7.2.3/flags.h gcc-2.7. *** 7939,8062 **** /* Other basic status info about current function. */ ! diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2.3.f.1/flow.c *** gcc-2.7.2.3/flow.c Mon Aug 28 10:23:34 1995 ! --- gcc-2.7.2.3.f.1/flow.c Wed Aug 27 11:46:36 1997 *************** static HARD_REG_SET elim_reg_set; *** 288,292 **** /* Forward declarations */ static void find_basic_blocks PROTO((rtx, rtx)); ! ! static int uses_reg_or_mem PROTO((rtx)); ! static void mark_label_ref PROTO((rtx, rtx, int)); ! static void life_analysis PROTO((rtx, int)); ! --- 288,292 ---- ! /* Forward declarations */ ! static void find_basic_blocks PROTO((rtx, rtx)); ! ! static int jmp_uses_reg_or_mem PROTO((rtx)); static void mark_label_ref PROTO((rtx, rtx, int)); static void life_analysis PROTO((rtx, int)); *************** find_basic_blocks (f, nonlocal_label_lis ! *** 554,563 **** ! if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx ! ! && uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i)))) ! computed_jump = 1; ! } ! else if (GET_CODE (pat) == SET ! && SET_DEST (pat) == pc_rtx ! ! && uses_reg_or_mem (SET_SRC (pat))) ! computed_jump = 1; ! ! --- 554,563 ---- ! if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx ! ! && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i)))) ! computed_jump = 1; ! } ! else if (GET_CODE (pat) == SET ! && SET_DEST (pat) == pc_rtx ! ! && jmp_uses_reg_or_mem (SET_SRC (pat))) ! computed_jump = 1; ! ! *************** find_basic_blocks (f, nonlocal_label_lis ! *** 760,767 **** ! /* Subroutines of find_basic_blocks. */ ! ! ! /* Return 1 if X contain a REG or MEM that is not in the constant pool. */ ! ! static int ! ! uses_reg_or_mem (x) ! rtx x; ! { ! --- 760,768 ---- ! /* Subroutines of find_basic_blocks. */ ! ! ! /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is ! ! not in the constant pool and not in the condition of an IF_THEN_ELSE. */ ! ! static int ! ! jmp_uses_reg_or_mem (x) ! rtx x; ! { ! *************** uses_reg_or_mem (x) ! *** 770,778 **** ! char *fmt; ! ! ! if (code == REG ! ! || (code == MEM ! ! && ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF ! ! && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))))) ! ! return 1; ! fmt = GET_RTX_FORMAT (code); ! --- 771,796 ---- ! char *fmt; ! ! switch (code) ! ! { ! ! case CONST: ! ! case LABEL_REF: ! ! case PC: ! ! return 0; ! ! ! case REG: ! ! return 1; ! ! ! case MEM: ! ! return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF ! ! && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))); ! ! ! ! case IF_THEN_ELSE: ! ! return (jmp_uses_reg_or_mem (XEXP (x, 1)) ! ! || jmp_uses_reg_or_mem (XEXP (x, 2))); ! ! ! ! case PLUS: case MINUS: case MULT: ! ! return (jmp_uses_reg_or_mem (XEXP (x, 0)) ! ! || jmp_uses_reg_or_mem (XEXP (x, 1))); ! ! } ! fmt = GET_RTX_FORMAT (code); ! *************** uses_reg_or_mem (x) ! *** 780,789 **** ! { ! if (fmt[i] == 'e' ! ! && uses_reg_or_mem (XEXP (x, i))) ! return 1; ! if (fmt[i] == 'E') ! for (j = 0; j < XVECLEN (x, i); j++) ! ! if (uses_reg_or_mem (XVECEXP (x, i, j))) ! return 1; ! } ! --- 798,807 ---- ! { ! if (fmt[i] == 'e' ! ! && jmp_uses_reg_or_mem (XEXP (x, i))) ! return 1; ! if (fmt[i] == 'E') ! for (j = 0; j < XVECLEN (x, i); j++) ! ! if (jmp_uses_reg_or_mem (XVECEXP (x, i, j))) ! return 1; ! } *************** propagate_block (old, first, last, final *** 1605,1614 **** --- 7817,7976 ---- /* Other basic status info about current function. */ ! *************** extern int current_function_has_nonlocal ! *** 362,363 **** ! --- 393,401 ---- ! ! extern int current_function_has_nonlocal_goto; ! + ! + /* If reg-stack will be run and this function has a computed goto, we can't ! + put pseudos into stack registers, since reg-stack will be unable to cope. ! + This variable is nonzero if we have found a computed goto. This is ! + computed in flow.c or in stupid.c. */ ! + ! + extern int current_function_has_computed_jump; ! diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2.3.f.2/flow.c *** gcc-2.7.2.3/flow.c Mon Aug 28 10:23:34 1995 ! --- gcc-2.7.2.3.f.2/flow.c Sun Mar 1 03:59:40 1998 ! *************** rtx *basic_block_head; ! *** 236,239 **** ! --- 236,244 ---- ! rtx *basic_block_end; ! ! + /* Element N indicates whether basic block N can be reached through a ! + computed jump. */ ! + ! + char *basic_block_computed_jump_target; ! + ! /* Element N is a regset describing the registers live ! at the start of basic block N. *************** static HARD_REG_SET elim_reg_set; *** 288,292 **** /* Forward declarations */ static void find_basic_blocks PROTO((rtx, rtx)); ! - static int uses_reg_or_mem PROTO((rtx)); static void mark_label_ref PROTO((rtx, rtx, int)); static void life_analysis PROTO((rtx, int)); + --- 293,296 ---- + *************** flow_analysis (f, nregs, file) + *** 376,379 **** + --- 380,384 ---- + basic_block_head = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); + basic_block_end = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); + + basic_block_computed_jump_target = (char *) oballoc (n_basic_blocks); + basic_block_drops_in = (char *) alloca (n_basic_blocks); + basic_block_loop_depth = (short *) alloca (n_basic_blocks * sizeof (short)); *************** find_basic_blocks (f, nonlocal_label_lis ! *** 422,425 **** ! --- 427,432 ---- ! bzero (block_live, n_basic_blocks); ! bzero (block_marked, n_basic_blocks); ! + bzero (basic_block_computed_jump_target, n_basic_blocks); ! + current_function_has_computed_jump = 0; ! /* Initialize with just block 0 reachable and no blocks marked. */ ! *************** find_basic_blocks (f, nonlocal_label_lis ! *** 534,574 **** ! for (insn = f; insn; insn = NEXT_INSN (insn)) ! ! if (GET_CODE (insn) == JUMP_INSN) ! { ! ! rtx pat = PATTERN (insn); ! ! int computed_jump = 0; ! ! ! if (GET_CODE (pat) == PARALLEL) ! { ! ! int len = XVECLEN (pat, 0); ! ! int has_use_labelref = 0; ! ! ! for (i = len - 1; i >= 0; i--) ! ! if (GET_CODE (XVECEXP (pat, 0, i)) == USE ! ! && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0)) ! ! == LABEL_REF)) ! ! has_use_labelref = 1; ! ! ! ! if (! has_use_labelref) ! ! for (i = len - 1; i >= 0; i--) ! ! if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! ! && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx ! ! && uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i)))) ! ! computed_jump = 1; ! } ! - else if (GET_CODE (pat) == SET ! - && SET_DEST (pat) == pc_rtx ! - && uses_reg_or_mem (SET_SRC (pat))) ! - computed_jump = 1; ! - ! - if (computed_jump) ! - { ! - for (x = label_value_list; x; x = XEXP (x, 1)) ! - mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! - insn, 0); ! ! ! for (x = forced_labels; x; x = XEXP (x, 1)) ! ! mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! ! insn, 0); ! } ! } ! --- 541,561 ---- ! for (insn = f; insn; insn = NEXT_INSN (insn)) ! ! if (computed_jump_p (insn)) ! { ! ! for (x = label_value_list; x; x = XEXP (x, 1)) ! { ! ! int b = BLOCK_NUM (XEXP (x, 0)); ! ! basic_block_computed_jump_target[b] = 1; ! ! mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, ! ! XEXP (x, 0)), ! ! insn, 0); ! } ! ! for (x = forced_labels; x; x = XEXP (x, 1)) ! ! { ! ! int b = BLOCK_NUM (XEXP (x, 0)); ! ! basic_block_computed_jump_target[b] = 1; ! ! mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)), ! ! insn, 0); ! } ! } ! *************** find_basic_blocks (f, nonlocal_label_lis ! *** 760,795 **** ! /* Subroutines of find_basic_blocks. */ ! - /* Return 1 if X contain a REG or MEM that is not in the constant pool. */ ! - ! - static int ! - uses_reg_or_mem (x) ! - rtx x; ! - { ! - enum rtx_code code = GET_CODE (x); ! - int i, j; ! - char *fmt; ! - ! - if (code == REG ! - || (code == MEM ! - && ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF ! - && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))))) ! - return 1; ! - ! - fmt = GET_RTX_FORMAT (code); ! - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! - { ! - if (fmt[i] == 'e' ! - && uses_reg_or_mem (XEXP (x, i))) ! - return 1; ! - ! - if (fmt[i] == 'E') ! - for (j = 0; j < XVECLEN (x, i); j++) ! - if (uses_reg_or_mem (XVECEXP (x, i, j))) ! - return 1; ! - } ! - ! - return 0; ! - } ! - ! /* Check expression X for label references; ! if one is found, add INSN to the label's chain of references. ! --- 747,750 ---- *************** propagate_block (old, first, last, final *** 1605,1614 **** *************** diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2 *** 8071,8075 **** dead[i / REGSET_ELT_BITS] |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)); ! --- 1623,1633 ---- /* Each call clobbers all call-clobbered regs that are not --- 7985,7989 ---- dead[i / REGSET_ELT_BITS] |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)); ! --- 1560,1570 ---- /* Each call clobbers all call-clobbered regs that are not *************** diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2 *** 8083,8089 **** dead[i / REGSET_ELT_BITS] |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)); ! diff -rcp2N gcc-2.7.2.3/fold-const.c gcc-2.7.2.3.f.1/fold-const.c *** gcc-2.7.2.3/fold-const.c Fri Sep 15 22:26:12 1995 ! --- gcc-2.7.2.3.f.1/fold-const.c Fri Aug 29 07:52:10 1997 *************** static tree unextend PROTO((tree, int, i *** 80,83 **** --- 7997,8003 ---- dead[i / REGSET_ELT_BITS] |= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)); ! diff -rcp2N gcc-2.7.2.3/fold-const.c gcc-2.7.2.3.f.2/fold-const.c *** gcc-2.7.2.3/fold-const.c Fri Sep 15 22:26:12 1995 ! --- gcc-2.7.2.3.f.2/fold-const.c Tue Sep 9 07:01:33 1997 *************** static tree unextend PROTO((tree, int, i *** 80,83 **** *************** diff -rcp2N gcc-2.7.2.3/fold-const.c gcc *** 8739,8748 **** return t; ! diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c ! *** gcc-2.7.2.3/function.c Sun Aug 31 09:39:47 1997 ! --- gcc-2.7.2.3.f.1/function.c Sun Aug 31 09:21:15 1997 *************** assign_stack_temp (mode, size, keep) *** 917,920 **** ! --- 917,925 ---- p->keep = keep; } --- 8653,8676 ---- return t; ! diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.2/function.c ! *** gcc-2.7.2.3/function.c Wed Aug 13 17:23:26 1997 ! --- gcc-2.7.2.3.f.2/function.c Sun Mar 1 03:35:26 1998 ! *************** int current_function_has_nonlocal_label; ! *** 125,128 **** ! --- 125,135 ---- ! int current_function_has_nonlocal_goto; ! ! + /* If reg-stack will be run and this function has a computed goto, we can't ! + put pseudos into stack registers, since reg-stack will be unable to cope. ! + This variable is nonzero if we have found a computed goto. This is ! + computed in flow.c or in stupid.c. */ ! + ! + int current_function_has_computed_jump; ! + ! /* Nonzero if function being compiled contains nested functions. */ ! *************** assign_stack_temp (mode, size, keep) *** 917,920 **** ! --- 924,932 ---- p->keep = keep; } *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8762,8766 **** return p; ! --- 999,1004 ---- if (! p->in_use) continue; --- 8690,8694 ---- return p; ! --- 1006,1011 ---- if (! p->in_use) continue; *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8771,8775 **** *************** free_temps_for_rtl_expr (t) *** 1184,1187 **** ! --- 1189,1207 ---- } --- 8699,8703 ---- *************** free_temps_for_rtl_expr (t) *** 1184,1187 **** ! --- 1196,1214 ---- } *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8793,8797 **** *************** pop_temp_slots () *** 1208,1211 **** ! --- 1228,1242 ---- temp_slot_level--; } --- 8721,8725 ---- *************** pop_temp_slots () *** 1208,1211 **** ! --- 1235,1249 ---- temp_slot_level--; } *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8816,8820 **** need here is to make a copy of the rtx to ensure it isn't being shared if we have to change it to a pseudo. ! --- 2869,2873 ---- case MEM: /* Most cases of MEM that convert to valid addresses have already been --- 8744,8748 ---- need here is to make a copy of the rtx to ensure it isn't being shared if we have to change it to a pseudo. ! --- 2876,2880 ---- case MEM: /* Most cases of MEM that convert to valid addresses have already been *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8829,8833 **** if (instantiate_virtual_regs_1 (&XEXP (x, 0), ! --- 2927,2933 ---- has less restrictions on an address that some other insn. In that case, we will modify the shared address. This case --- 8757,8761 ---- if (instantiate_virtual_regs_1 (&XEXP (x, 0), ! --- 2934,2940 ---- has less restrictions on an address that some other insn. In that case, we will modify the shared address. This case *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8845,8852 **** case SUBREG: case STRICT_LOW_PART: ! --- 2942,2945 ---- *************** instantiate_virtual_regs_1 (loc, object, *** 2927,2930 **** ! --- 2958,2978 ---- goto restart; --- 8773,8780 ---- case SUBREG: case STRICT_LOW_PART: ! --- 2949,2952 ---- *************** instantiate_virtual_regs_1 (loc, object, *** 2927,2930 **** ! --- 2965,2985 ---- goto restart; *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8878,8882 **** } ! --- 3452,3459 ---- /* If this is a memory ref that contains aggregate components, --- 8806,8810 ---- } ! --- 3459,3466 ---- /* If this is a memory ref that contains aggregate components, *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8894,8898 **** /* If this was an item that we received a pointer to, set DECL_RTL ! --- 3677,3681 ---- parmreg = gen_reg_rtx (promoted_nominal_mode); --- 8822,8826 ---- /* If this was an item that we received a pointer to, set DECL_RTL ! --- 3684,3688 ---- parmreg = gen_reg_rtx (promoted_nominal_mode); *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8907,8911 **** emit_move_insn (parmreg, DECL_RTL (parm)); DECL_RTL (parm) = parmreg; ! --- 3745,3749 ---- Pmode above. We must use the actual mode of the parm. */ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm))); --- 8835,8839 ---- emit_move_insn (parmreg, DECL_RTL (parm)); DECL_RTL (parm) = parmreg; ! --- 3752,3756 ---- Pmode above. We must use the actual mode of the parm. */ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm))); *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8923,8927 **** /* Within function body, compute a type's size as soon it is laid out. */ ! --- 4864,4869 ---- rtl_expr_chain = 0; --- 8851,8855 ---- /* Within function body, compute a type's size as soon it is laid out. */ ! --- 4871,4876 ---- rtl_expr_chain = 0; *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8932,8936 **** *************** expand_function_end (filename, line, end *** 5295,5298 **** ! --- 5343,5366 ---- /* Put those insns at entry to the containing function (this one). */ emit_insns_before (seq, tail_recursion_reentry); --- 8860,8864 ---- *************** expand_function_end (filename, line, end *** 5295,5298 **** ! --- 5350,5373 ---- /* Put those insns at entry to the containing function (this one). */ emit_insns_before (seq, tail_recursion_reentry); *************** diff -rcp2N gcc-2.7.2.3/function.c gcc-2 *** 8957,8963 **** } ! diff -rcp2N gcc-2.7.2.3/gcc.c gcc-2.7.2.3.f.1/gcc.c ! *** gcc-2.7.2.3/gcc.c Sun Aug 31 09:39:48 1997 ! --- gcc-2.7.2.3.f.1/gcc.c Sun Aug 31 09:21:16 1997 *************** static int is_directory PROTO((char *, *** 296,300 **** --- 8885,8891 ---- } ! diff -rcp2N gcc-2.7.2.3/gcc.c gcc-2.7.2.3.f.2/gcc.c ! *** gcc-2.7.2.3/gcc.c Tue Jun 24 18:42:50 1997 ! --- gcc-2.7.2.3.f.2/gcc.c Tue Sep 9 07:01:34 1997 *************** static int is_directory PROTO((char *, *** 296,300 **** *************** diff -rcp2N gcc-2.7.2.3/gcc.c gcc-2.7.2. *** 9121,9127 **** switches[switchnum].valid = 1; } ! diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7.2.3.f.1/gcc.texi *** gcc-2.7.2.3/gcc.texi Wed Jul 24 18:57:41 1996 ! --- gcc-2.7.2.3.f.1/gcc.texi Fri Jul 11 00:08:58 1997 *************** original English. *** 149,152 **** --- 9049,9055 ---- switches[switchnum].valid = 1; } ! diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7.2.3.f.2/gcc.texi *** gcc-2.7.2.3/gcc.texi Wed Jul 24 18:57:41 1996 ! --- gcc-2.7.2.3.f.2/gcc.texi Tue Sep 9 07:01:35 1997 *************** original English. *** 149,152 **** *************** diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7 *** 9132,9138 **** @sp 1 @c The version number appears twice more in this file. ! diff -rcp2N gcc-2.7.2.3/glimits.h gcc-2.7.2.3.f.1/glimits.h *** gcc-2.7.2.3/glimits.h Wed Sep 29 21:30:54 1993 ! --- gcc-2.7.2.3.f.1/glimits.h Fri Jul 11 00:08:58 1997 *************** *** 64,68 **** --- 9060,9082 ---- @sp 1 @c The version number appears twice more in this file. ! diff -rcp2N gcc-2.7.2.3/genattrtab.c gcc-2.7.2.3.f.2/genattrtab.c ! *** gcc-2.7.2.3/genattrtab.c Thu Jun 15 11:39:24 1995 ! --- gcc-2.7.2.3.f.2/genattrtab.c Sun Mar 1 04:29:39 1998 ! *************** static char *alternative_name; ! *** 360,364 **** ! ! rtx frame_pointer_rtx, hard_frame_pointer_rtx, stack_pointer_rtx; ! ! rtx arg_pointer_rtx; ! ! static rtx attr_rtx PVPROTO((enum rtx_code, ...)); ! --- 360,364 ---- ! ! rtx frame_pointer_rtx, hard_frame_pointer_rtx, stack_pointer_rtx; ! ! rtx arg_pointer_rtx, pc_rtx; ! ! static rtx attr_rtx PVPROTO((enum rtx_code, ...)); ! diff -rcp2N gcc-2.7.2.3/glimits.h gcc-2.7.2.3.f.2/glimits.h *** gcc-2.7.2.3/glimits.h Wed Sep 29 21:30:54 1993 ! --- gcc-2.7.2.3.f.2/glimits.h Tue Sep 9 07:01:35 1997 *************** *** 64,68 **** *************** diff -rcp2N gcc-2.7.2.3/glimits.h gcc-2. *** 9152,9158 **** #endif #undef LONG_MIN ! diff -rcp2N gcc-2.7.2.3/integrate.c gcc-2.7.2.3.f.1/integrate.c *** gcc-2.7.2.3/integrate.c Fri Oct 20 22:48:13 1995 ! --- gcc-2.7.2.3.f.1/integrate.c Sun Aug 10 22:46:31 1997 *************** static rtx copy_for_inline PROTO((rtx)); *** 67,70 **** --- 9096,9121 ---- #endif #undef LONG_MIN ! diff -rcp2N gcc-2.7.2.3/global.c gcc-2.7.2.3.f.2/global.c ! *** gcc-2.7.2.3/global.c Thu Jun 15 11:44:32 1995 ! --- gcc-2.7.2.3.f.2/global.c Sun Mar 1 03:28:17 1998 ! *************** global_conflicts () ! *** 676,679 **** ! --- 676,688 ---- ! ! record_conflicts (block_start_allocnos, ax); ! + ! + #ifdef STACK_REGS ! + /* Pseudos can't go in stack regs at the start of a basic block ! + that can be reached through a computed goto, since reg-stack ! + can't handle computed gotos. */ ! + if (basic_block_computed_jump_target[b]) ! + for (ax = FIRST_STACK_REG; ax <= LAST_STACK_REG; ax++) ! + record_one_conflict (ax); ! + #endif ! } ! ! diff -rcp2N gcc-2.7.2.3/integrate.c gcc-2.7.2.3.f.2/integrate.c *** gcc-2.7.2.3/integrate.c Fri Oct 20 22:48:13 1995 ! --- gcc-2.7.2.3.f.2/integrate.c Tue Sep 9 07:01:36 1997 *************** static rtx copy_for_inline PROTO((rtx)); *** 67,70 **** *************** diff -rcp2N gcc-2.7.2.3/integrate.c gcc- *** 9223,9229 **** } ! diff -rcp2N gcc-2.7.2.3/invoke.texi gcc-2.7.2.3.f.1/invoke.texi *** gcc-2.7.2.3/invoke.texi Tue Oct 3 15:40:43 1995 ! --- gcc-2.7.2.3.f.1/invoke.texi Fri Aug 29 07:52:17 1997 *************** *** 1,3 **** --- 9186,9192 ---- } ! diff -rcp2N gcc-2.7.2.3/invoke.texi gcc-2.7.2.3.f.2/invoke.texi *** gcc-2.7.2.3/invoke.texi Tue Oct 3 15:40:43 1995 ! --- gcc-2.7.2.3.f.2/invoke.texi Tue Sep 9 07:01:36 1997 *************** *** 1,3 **** *************** diff -rcp2N gcc-2.7.2.3/invoke.texi gcc- *** 9455,9461 **** @end table ! diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2.7.2.3.f.1/libgcc2.c *** gcc-2.7.2.3/libgcc2.c Sun Nov 26 19:39:21 1995 ! --- gcc-2.7.2.3.f.1/libgcc2.c Sun Aug 10 22:46:07 1997 *************** __gcc_bcmp (s1, s2, size) *** 1193,1196 **** --- 9418,9424 ---- @end table ! diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2.7.2.3.f.2/libgcc2.c *** gcc-2.7.2.3/libgcc2.c Sun Nov 26 19:39:21 1995 ! --- gcc-2.7.2.3.f.2/libgcc2.c Tue Sep 9 07:01:36 1997 *************** __gcc_bcmp (s1, s2, size) *** 1193,1196 **** *************** diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2. *** 9470,9476 **** #ifdef L_varargs #ifdef __i860__ ! diff -rcp2N gcc-2.7.2.3/local-alloc.c gcc-2.7.2.3.f.1/local-alloc.c *** gcc-2.7.2.3/local-alloc.c Mon Aug 21 17:15:44 1995 ! --- gcc-2.7.2.3.f.1/local-alloc.c Sun Aug 10 22:46:10 1997 *************** static int this_insn_number; *** 243,246 **** --- 9433,9439 ---- #ifdef L_varargs #ifdef __i860__ ! diff -rcp2N gcc-2.7.2.3/local-alloc.c gcc-2.7.2.3.f.2/local-alloc.c *** gcc-2.7.2.3/local-alloc.c Mon Aug 21 17:15:44 1995 ! --- gcc-2.7.2.3.f.2/local-alloc.c Tue Sep 9 07:01:37 1997 *************** static int this_insn_number; *** 243,246 **** *************** diff -rcp2N gcc-2.7.2.3/local-alloc.c gc *** 9583,9589 **** bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *)); ! diff -rcp2N gcc-2.7.2.3/loop.c gcc-2.7.2.3.f.1/loop.c *** gcc-2.7.2.3/loop.c Sat Jun 29 16:26:59 1996 ! --- gcc-2.7.2.3.f.1/loop.c Sun Aug 10 22:46:43 1997 *************** int *loop_number_exit_count; *** 111,116 **** --- 9546,9552 ---- bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *)); ! diff -rcp2N gcc-2.7.2.3/loop.c gcc-2.7.2.3.f.2/loop.c *** gcc-2.7.2.3/loop.c Sat Jun 29 16:26:59 1996 ! --- gcc-2.7.2.3.f.2/loop.c Tue Sep 9 07:01:37 1997 *************** int *loop_number_exit_count; *** 111,116 **** *************** diff -rcp2N gcc-2.7.2.3/loop.c gcc-2.7.2 *** 9713,9719 **** } ! diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2.3.f.1/loop.h *** gcc-2.7.2.3/loop.h Fri Jul 14 12:23:28 1995 ! --- gcc-2.7.2.3.f.1/loop.h Fri Jul 11 00:09:03 1997 *************** struct induction *** 89,92 **** --- 9676,9682 ---- } ! diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2.3.f.2/loop.h *** gcc-2.7.2.3/loop.h Fri Jul 14 12:23:28 1995 ! --- gcc-2.7.2.3.f.2/loop.h Tue Sep 9 07:01:38 1997 *************** struct induction *** 89,92 **** *************** diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2 *** 9726,9732 **** int lifetime; /* Length of life of this giv */ int times_used; /* # times this giv is used. */ ! diff -rcp2N gcc-2.7.2.3/md.texi gcc-2.7.2.3.f.1/md.texi *** gcc-2.7.2.3/md.texi Sun Nov 26 19:05:33 1995 ! --- gcc-2.7.2.3.f.1/md.texi Fri Aug 29 07:52:18 1997 *************** Some machines require other operations s *** 2334,2337 **** --- 9689,9695 ---- int lifetime; /* Length of life of this giv */ int times_used; /* # times this giv is used. */ ! diff -rcp2N gcc-2.7.2.3/md.texi gcc-2.7.2.3.f.2/md.texi *** gcc-2.7.2.3/md.texi Sun Nov 26 19:05:33 1995 ! --- gcc-2.7.2.3.f.2/md.texi Tue Sep 9 07:01:38 1997 *************** Some machines require other operations s *** 2334,2337 **** *************** diff -rcp2N gcc-2.7.2.3/md.texi gcc-2.7. *** 9746,9752 **** @end table ! diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7.2.3.f.1/optabs.c *** gcc-2.7.2.3/optabs.c Sat Oct 21 22:16:13 1995 ! --- gcc-2.7.2.3.f.1/optabs.c Fri Aug 29 07:51:36 1997 *************** expand_fix (to, from, unsignedp) *** 3878,3885 **** --- 9709,9715 ---- @end table ! diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7.2.3.f.2/optabs.c *** gcc-2.7.2.3/optabs.c Sat Oct 21 22:16:13 1995 ! --- gcc-2.7.2.3.f.2/optabs.c Tue Sep 9 07:01:39 1997 *************** expand_fix (to, from, unsignedp) *** 3878,3885 **** *************** diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7 *** 9771,9777 **** } ! diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2.3.f.1/real.c *** gcc-2.7.2.3/real.c Tue Aug 15 21:57:18 1995 ! --- gcc-2.7.2.3.f.1/real.c Fri Jul 11 00:09:04 1997 *************** make_nan (nan, sign, mode) *** 5625,5633 **** --- 9734,9740 ---- } ! diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2.3.f.2/real.c *** gcc-2.7.2.3/real.c Tue Aug 15 21:57:18 1995 ! --- gcc-2.7.2.3.f.2/real.c Tue Sep 9 07:01:39 1997 *************** make_nan (nan, sign, mode) *** 5625,5633 **** *************** diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2 *** 9876,9882 **** The DFmode is stored as an array of HOST_WIDE_INT in the target's ! diff -rcp2N gcc-2.7.2.3/real.h gcc-2.7.2.3.f.1/real.h *** gcc-2.7.2.3/real.h Thu Jun 15 11:57:56 1995 ! --- gcc-2.7.2.3.f.1/real.h Fri Jul 11 00:09:05 1997 *************** extern void ereal_to_decimal PROTO((REAL *** 152,155 **** --- 9839,9845 ---- The DFmode is stored as an array of HOST_WIDE_INT in the target's ! diff -rcp2N gcc-2.7.2.3/real.h gcc-2.7.2.3.f.2/real.h *** gcc-2.7.2.3/real.h Thu Jun 15 11:57:56 1995 ! --- gcc-2.7.2.3.f.2/real.h Tue Sep 9 07:01:39 1997 *************** extern void ereal_to_decimal PROTO((REAL *** 152,155 **** *************** diff -rcp2N gcc-2.7.2.3/real.h gcc-2.7.2 *** 9901,9907 **** /* d is an array of HOST_WIDE_INT that holds a double precision ! diff -rcp2N gcc-2.7.2.3/recog.c gcc-2.7.2.3.f.1/recog.c *** gcc-2.7.2.3/recog.c Sat Jul 1 10:52:35 1995 ! --- gcc-2.7.2.3.f.1/recog.c Sun Aug 10 22:46:55 1997 *************** register_operand (op, mode) *** 872,876 **** --- 9864,9870 ---- /* d is an array of HOST_WIDE_INT that holds a double precision ! diff -rcp2N gcc-2.7.2.3/recog.c gcc-2.7.2.3.f.2/recog.c *** gcc-2.7.2.3/recog.c Sat Jul 1 10:52:35 1995 ! --- gcc-2.7.2.3.f.2/recog.c Tue Sep 9 07:01:40 1997 *************** register_operand (op, mode) *** 872,876 **** *************** diff -rcp2N gcc-2.7.2.3/recog.c gcc-2.7. *** 9919,9977 **** return 0; #endif ! diff -rcp2N gcc-2.7.2.3/reg-stack.c gcc-2.7.2.3.f.1/reg-stack.c *** gcc-2.7.2.3/reg-stack.c Thu Jun 15 21:36:05 1995 ! --- gcc-2.7.2.3.f.1/reg-stack.c Wed Aug 27 11:44:55 1997 ! *************** subst_stack_regs (insn, regstack) ! *** 2620,2623 **** ! --- 2620,2624 ---- ! register rtx *note_link, note; ! register int i; ! + rtx head, jump, pat, cipat; ! int n_operands; ! *************** subst_stack_regs (insn, regstack) ! *** 2690,2693 **** ! --- 2691,2728 ---- ! if (GET_CODE (insn) == NOTE) ! return; ! + ! + /* If we are reached by a computed goto which sets this same stack register, ! + then pop this stack register, but maintain regstack. */ ! + ! + if (INSN_UID (insn) <= max_uid) ! + { ! + head = block_begin[BLOCK_NUM(insn)]; ! + pat = PATTERN(insn); ! + if (GET_CODE (head) == CODE_LABEL ! + && GET_CODE (pat) == SET && STACK_REG_P (SET_DEST (pat))) ! + for (jump = LABEL_REFS (head); ! + jump != head; ! + jump = LABEL_NEXTREF (jump)) ! + { ! + cipat = PATTERN (CONTAINING_INSN (jump)); ! + if (GET_CODE (cipat) == SET ! + && SET_DEST (cipat) == pc_rtx ! + && uses_reg_or_mem (SET_SRC (cipat)) ! + && INSN_UID (CONTAINING_INSN (jump)) <= max_uid) ! + { ! + int from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ! + if (TEST_HARD_REG_BIT (block_out_reg_set[from_block], ! + REGNO (SET_DEST (pat)))) ! + { ! + struct stack_def old; ! + bcopy (regstack->reg, old.reg, sizeof (old.reg)); ! + emit_pop_insn (insn, regstack, SET_DEST (pat), emit_insn_before); ! + regstack->top += 1; ! + bcopy (old.reg, regstack->reg, sizeof (old.reg)); ! + SET_HARD_REG_BIT (regstack->reg_set, REGNO (SET_DEST (pat))); ! + } ! + } ! + } ! + } ! /* If there is a REG_UNUSED note on a stack register on this insn, ! diff -rcp2N gcc-2.7.2.3/reload.c gcc-2.7.2.3.f.1/reload.c *** gcc-2.7.2.3/reload.c Sat Nov 11 13:23:54 1995 ! --- gcc-2.7.2.3.f.1/reload.c Sat Aug 30 20:42:37 1997 *************** *** 1,4 **** --- 9882,9982 ---- return 0; #endif ! diff -rcp2N gcc-2.7.2.3/reg-stack.c gcc-2.7.2.3.f.2/reg-stack.c *** gcc-2.7.2.3/reg-stack.c Thu Jun 15 21:36:05 1995 ! --- gcc-2.7.2.3.f.2/reg-stack.c Sun Mar 1 05:16:06 1998 ! *************** extern rtx emit_label_after (); ! *** 241,245 **** ! ! static void find_blocks (); ! - static uses_reg_or_mem (); ! static void stack_reg_life_analysis (); ! static void record_reg_life_pat (); ! --- 241,244 ---- ! *************** find_blocks (first) ! *** 1326,1353 **** ! rtx x; ! ! if (GET_CODE (pat) == PARALLEL) ! ! { ! ! int len = XVECLEN (pat, 0); ! ! int has_use_labelref = 0; ! ! int i; ! ! ! ! for (i = len - 1; i >= 0; i--) ! ! if (GET_CODE (XVECEXP (pat, 0, i)) == USE ! ! && GET_CODE (XEXP (XVECEXP (pat, 0, i), 0)) == LABEL_REF) ! ! has_use_labelref = 1; ! ! ! ! if (! has_use_labelref) ! ! for (i = len - 1; i >= 0; i--) ! ! if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! ! && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx ! ! && uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i)))) ! ! computed_jump = 1; ! ! } ! ! else if (GET_CODE (pat) == SET ! ! && SET_DEST (pat) == pc_rtx ! ! && uses_reg_or_mem (SET_SRC (pat))) ! ! computed_jump = 1; ! ! ! ! if (computed_jump) ! { ! for (x = label_value_list; x; x = XEXP (x, 1)) ! --- 1325,1329 ---- ! rtx x; ! ! ! if (computed_jump_p (insn)) ! { ! for (x = label_value_list; x; x = XEXP (x, 1)) ! *************** find_blocks (first) ! *** 1367,1402 **** ! } ! ! - /* Return 1 if X contain a REG or MEM that is not in the constant pool. */ ! - ! - static int ! - uses_reg_or_mem (x) ! - rtx x; ! - { ! - enum rtx_code code = GET_CODE (x); ! - int i, j; ! - char *fmt; ! - ! - if (code == REG ! - || (code == MEM ! - && ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF ! - && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))))) ! - return 1; ! - ! - fmt = GET_RTX_FORMAT (code); ! - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! - { ! - if (fmt[i] == 'e' ! - && uses_reg_or_mem (XEXP (x, i))) ! - return 1; ! - ! - if (fmt[i] == 'E') ! - for (j = 0; j < XVECLEN (x, i); j++) ! - if (uses_reg_or_mem (XVECEXP (x, i, j))) ! - return 1; ! - } ! - ! - return 0; ! - } ! - ! /* If current function returns its result in an fp stack register, ! return the REG. Otherwise, return 0. */ ! --- 1343,1346 ---- ! *************** stack_reg_life_analysis (first, stackent ! *** 1547,1550 **** ! --- 1491,1495 ---- ! block = jump_block; ! must_restart = 1; ! + break; ! win: ! diff -rcp2N gcc-2.7.2.3/reload.c gcc-2.7.2.3.f.2/reload.c *** gcc-2.7.2.3/reload.c Sat Nov 11 13:23:54 1995 ! --- gcc-2.7.2.3.f.2/reload.c Tue Sep 9 07:01:41 1997 *************** *** 1,4 **** *************** diff -rcp2N gcc-2.7.2.3/reload.c gcc-2.7 *** 10637,10643 **** if (reload_secondary_p[r]) ! diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2.7.2.3.f.1/reload1.c *** gcc-2.7.2.3/reload1.c Sun Nov 5 16:22:22 1995 ! --- gcc-2.7.2.3.f.1/reload1.c Fri Aug 29 07:52:04 1997 *************** reload (first, global, dumpfile) *** 542,546 **** --- 10642,10648 ---- if (reload_secondary_p[r]) ! diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2.7.2.3.f.2/reload1.c *** gcc-2.7.2.3/reload1.c Sun Nov 5 16:22:22 1995 ! --- gcc-2.7.2.3.f.2/reload1.c Tue Sep 9 07:01:42 1997 *************** reload (first, global, dumpfile) *** 542,546 **** *************** diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2. *** 10794,10800 **** } #endif ! diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7.2.3.f.1/reorg.c *** gcc-2.7.2.3/reorg.c Fri Sep 15 21:38:55 1995 ! --- gcc-2.7.2.3.f.1/reorg.c Fri Aug 29 07:52:00 1997 *************** redundant_insn (insn, target, delay_list *** 1961,1964 **** --- 10799,10805 ---- } #endif ! diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7.2.3.f.2/reorg.c *** gcc-2.7.2.3/reorg.c Fri Sep 15 21:38:55 1995 ! --- gcc-2.7.2.3.f.2/reorg.c Tue Sep 9 07:01:43 1997 *************** redundant_insn (insn, target, delay_list *** 1961,1964 **** *************** diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7. *** 10837,10843 **** break; } ! diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2.3.f.1/rtl.c *** gcc-2.7.2.3/rtl.c Thu Jun 15 12:02:59 1995 ! --- gcc-2.7.2.3.f.1/rtl.c Fri Jul 11 00:09:06 1997 *************** char *reg_note_name[] = { "", "REG_DEAD" *** 179,183 **** --- 10842,10848 ---- break; } ! diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2.3.f.2/rtl.c *** gcc-2.7.2.3/rtl.c Thu Jun 15 12:02:59 1995 ! --- gcc-2.7.2.3.f.2/rtl.c Tue Sep 9 07:01:43 1997 *************** char *reg_note_name[] = { "", "REG_DEAD" *** 179,183 **** *************** diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2. *** 10853,10859 **** /* Allocate an rtx vector of N elements. ! diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.1/rtl.h *** gcc-2.7.2.3/rtl.h Thu Jun 15 12:03:16 1995 ! --- gcc-2.7.2.3.f.1/rtl.h Fri Jul 11 00:09:07 1997 *************** enum reg_note { REG_DEAD = 1, REG_INC = *** 349,353 **** --- 10858,10864 ---- /* Allocate an rtx vector of N elements. ! diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.2/rtl.h *** gcc-2.7.2.3/rtl.h Thu Jun 15 12:03:16 1995 ! --- gcc-2.7.2.3.f.2/rtl.h Sun Mar 1 04:13:08 1998 *************** enum reg_note { REG_DEAD = 1, REG_INC = *** 349,353 **** *************** diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2. *** 10887,10891 **** *************** extern rtx eliminate_constant_term PROTO *** 817,820 **** ! --- 817,830 ---- extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int)); extern enum machine_mode choose_hard_reg_mode PROTO((int, int)); --- 10892,10896 ---- *************** extern rtx eliminate_constant_term PROTO *** 817,820 **** ! --- 817,831 ---- extern rtx expand_complex_abs PROTO((enum machine_mode, rtx, rtx, int)); extern enum machine_mode choose_hard_reg_mode PROTO((int, int)); *************** diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2. *** 10899,10902 **** --- 10904,10908 ---- + extern int refers_to_regno_p PROTO((int, int, rtx, rtx *)); + extern int reg_overlap_mentioned_p PROTO((rtx, rtx)); + + extern int computed_jump_p PROTO((rtx)); + *************** diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2. *** 10904,10908 **** *************** extern rtx *regno_reg_rtx; *** 967,968 **** ! --- 977,987 ---- extern int rtx_to_tree_code PROTO((enum rtx_code)); --- 10910,10914 ---- *************** extern rtx *regno_reg_rtx; *** 967,968 **** ! --- 978,988 ---- extern int rtx_to_tree_code PROTO((enum rtx_code)); *************** diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2. *** 10916,10922 **** + extern void mark_user_reg PROTO((rtx)); + extern void mark_reg_pointer PROTO((rtx)); ! diff -rcp2N gcc-2.7.2.3/sched.c gcc-2.7.2.3.f.1/sched.c *** gcc-2.7.2.3/sched.c Thu Jun 15 12:06:39 1995 ! --- gcc-2.7.2.3.f.1/sched.c Sun Aug 10 22:46:13 1997 *************** Boston, MA 02111-1307, USA. */ *** 126,129 **** --- 10922,11040 ---- + extern void mark_user_reg PROTO((rtx)); + extern void mark_reg_pointer PROTO((rtx)); ! diff -rcp2N gcc-2.7.2.3/rtlanal.c gcc-2.7.2.3.f.2/rtlanal.c ! *** gcc-2.7.2.3/rtlanal.c Fri Oct 6 17:13:57 1995 ! --- gcc-2.7.2.3.f.2/rtlanal.c Sun Mar 1 04:15:29 1998 ! *************** void note_stores (); ! *** 26,29 **** ! --- 26,32 ---- ! int reg_set_p (); ! ! + /* Forward declarations */ ! + static int jmp_uses_reg_or_mem PROTO((rtx)); ! + ! /* Bit flags that specify the machine subtype we are compiling for. ! Bits are tested using macros TARGET_... defined in the tm.h file ! *************** replace_regs (x, reg_map, nregs, replace ! *** 1838,1840 **** ! --- 1841,1936 ---- ! } ! return x; ! + } ! + ! + /* Return 1 if X, the SRC_SRC of SET of (pc) contain a REG or MEM that is ! + not in the constant pool and not in the condition of an IF_THEN_ELSE. */ ! + ! + static int ! + jmp_uses_reg_or_mem (x) ! + rtx x; ! + { ! + enum rtx_code code = GET_CODE (x); ! + int i, j; ! + char *fmt; ! + ! + switch (code) ! + { ! + case CONST: ! + case LABEL_REF: ! + case PC: ! + return 0; ! + ! + case REG: ! + return 1; ! + ! + case MEM: ! + return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF ! + && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0))); ! + ! + case IF_THEN_ELSE: ! + return (jmp_uses_reg_or_mem (XEXP (x, 1)) ! + || jmp_uses_reg_or_mem (XEXP (x, 2))); ! + ! + case PLUS: case MINUS: case MULT: ! + return (jmp_uses_reg_or_mem (XEXP (x, 0)) ! + || jmp_uses_reg_or_mem (XEXP (x, 1))); ! + ! + default: ! + break; ! + } ! + ! + fmt = GET_RTX_FORMAT (code); ! + for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! + { ! + if (fmt[i] == 'e' ! + && jmp_uses_reg_or_mem (XEXP (x, i))) ! + return 1; ! + ! + if (fmt[i] == 'E') ! + for (j = 0; j < XVECLEN (x, i); j++) ! + if (jmp_uses_reg_or_mem (XVECEXP (x, i, j))) ! + return 1; ! + } ! + ! + return 0; ! + } ! + ! + /* Return nonzero if INSN is an indirect jump (aka computed jump). ! + ! + Tablejumps and casesi insns are not considered indirect jumps; ! + we can recognize them by a (use (lael_ref)). */ ! + ! + int ! + computed_jump_p (insn) ! + rtx insn; ! + { ! + int i; ! + if (GET_CODE (insn) == JUMP_INSN) ! + { ! + rtx pat = PATTERN (insn); ! + ! + if (GET_CODE (pat) == PARALLEL) ! + { ! + int len = XVECLEN (pat, 0); ! + int has_use_labelref = 0; ! + ! + for (i = len - 1; i >= 0; i--) ! + if (GET_CODE (XVECEXP (pat, 0, i)) == USE ! + && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0)) ! + == LABEL_REF)) ! + has_use_labelref = 1; ! + ! + if (! has_use_labelref) ! + for (i = len - 1; i >= 0; i--) ! + if (GET_CODE (XVECEXP (pat, 0, i)) == SET ! + && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx ! + && jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i)))) ! + return 1; ! + } ! + else if (GET_CODE (pat) == SET ! + && SET_DEST (pat) == pc_rtx ! + && jmp_uses_reg_or_mem (SET_SRC (pat))) ! + return 1; ! + } ! + return 0; ! } ! diff -rcp2N gcc-2.7.2.3/sched.c gcc-2.7.2.3.f.2/sched.c *** gcc-2.7.2.3/sched.c Thu Jun 15 12:06:39 1995 ! --- gcc-2.7.2.3.f.2/sched.c Tue Sep 9 07:01:44 1997 *************** Boston, MA 02111-1307, USA. */ *** 126,129 **** *************** diff -rcp2N gcc-2.7.2.3/sched.c gcc-2.7. *** 11777,11783 **** if (write_symbols != NO_DEBUG) ! diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7.2.3.f.1/sdbout.c *** gcc-2.7.2.3/sdbout.c Thu Jun 15 12:07:11 1995 ! --- gcc-2.7.2.3.f.1/sdbout.c Mon Aug 11 05:42:22 1997 *************** plain_type_1 (type, level) *** 539,543 **** --- 11895,11901 ---- if (write_symbols != NO_DEBUG) ! diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7.2.3.f.2/sdbout.c *** gcc-2.7.2.3/sdbout.c Thu Jun 15 12:07:11 1995 ! --- gcc-2.7.2.3.f.2/sdbout.c Tue Sep 9 07:01:44 1997 *************** plain_type_1 (type, level) *** 539,543 **** *************** diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7 *** 11796,11802 **** : 0); return PUSH_DERIVED_LEVEL (DT_ARY, m); ! diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2.3.f.1/stmt.c *** gcc-2.7.2.3/stmt.c Tue Sep 12 23:01:54 1995 ! --- gcc-2.7.2.3.f.1/stmt.c Fri Aug 29 07:52:05 1997 *************** fixup_gotos (thisblock, stack_level, cle *** 1244,1249 **** --- 11914,11920 ---- : 0); return PUSH_DERIVED_LEVEL (DT_ARY, m); ! diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2.3.f.2/stmt.c *** gcc-2.7.2.3/stmt.c Tue Sep 12 23:01:54 1995 ! --- gcc-2.7.2.3.f.2/stmt.c Tue Dec 23 19:52:10 1997 *************** fixup_gotos (thisblock, stack_level, cle *** 1244,1249 **** *************** diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2 *** 11905,11943 **** /* Reference the variable indirect through that rtx. */ ! *************** pushcase_range (value1, value2, converte ! *** 4155,4158 **** ! --- 4152,4159 ---- ! return 1; ! + /* Fail if the range is empty. */ ! + if (tree_int_cst_lt (value2, value1)) ! + return 4; ! + ! if (stack_block_stack ! && stack_block_stack->depth > case_stack->depth) *************** pushcase_range (value1, value2, converte ! *** 4189,4197 **** ! /* Convert VALUEs to type in which the comparisons are nominally done. */ ! if (value1 == 0) /* Negative infinity. */ ! value1 = TYPE_MIN_VALUE(index_type); ! value1 = (*converter) (nominal_type, value1); ! if (value2 == 0) /* Positive infinity. */ ! value2 = TYPE_MAX_VALUE(index_type); value2 = (*converter) (nominal_type, value2); ! --- 4190,4198 ---- ! /* Convert VALUEs to type in which the comparisons are nominally done. */ ! if (value1 == 0) /* Negative infinity. */ ! ! value1 = TYPE_MIN_VALUE (index_type); ! value1 = (*converter) (nominal_type, value1); ! ! if (value2 == 0) /* Positive infinity. */ ! ! value2 = TYPE_MAX_VALUE (index_type); ! value2 = (*converter) (nominal_type, value2); ! ! *************** pushcase_range (value1, value2, converte ! *** 4202,4209 **** ! if (! int_fits_type_p (value2, index_type)) return 3; - --- 12023,12068 ---- /* Reference the variable indirect through that rtx. */ ! *************** pushcase (value, converter, label, dupli ! *** 4133,4141 **** ! } ! ! /* Like pushcase but this case applies to all values ! ! between VALUE1 and VALUE2 (inclusive). ! ! The return value is the same as that of pushcase ! ! but there is one additional error code: ! ! 4 means the specified range was empty. */ ! ! int ! --- 4130,4141 ---- ! } ! ! ! /* Like pushcase but this case applies to all values between VALUE1 and ! ! VALUE2 (inclusive). If VALUE1 is NULL, the range starts at the lowest ! ! value of the index type and ends at VALUE2. If VALUE2 is NULL, the range ! ! starts at VALUE1 and ends at the highest value of the index type. ! ! If both are NULL, this case applies to all values. ! ! ! ! The return value is the same as that of pushcase but there is one ! ! additional error code: 4 means the specified range was empty. */ ! ! int *************** pushcase_range (value1, value2, converte ! *** 4187,4209 **** ! case_stack->data.case_stmt.seenlabel = 1; ! ! ! /* Convert VALUEs to type in which the comparisons are nominally done. */ ! ! if (value1 == 0) /* Negative infinity. */ ! value1 = TYPE_MIN_VALUE(index_type); ! ! value1 = (*converter) (nominal_type, value1); ! ! if (value2 == 0) /* Positive infinity. */ ! value2 = TYPE_MAX_VALUE(index_type); value2 = (*converter) (nominal_type, value2); ! /* Fail if these values are out of range. */ ! ! if (! int_fits_type_p (value1, index_type)) ! return 3; ! ! ! if (! int_fits_type_p (value2, index_type)) return 3; - *************** diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2 *** 11947,11954 **** /* If the bounds are equal, turn this into the one-value case. */ ! --- 4203,4206 ---- ! diff -rcp2N gcc-2.7.2.3/stor-layout.c gcc-2.7.2.3.f.1/stor-layout.c *** gcc-2.7.2.3/stor-layout.c Sat Jun 29 16:26:51 1996 ! --- gcc-2.7.2.3.f.1/stor-layout.c Mon Aug 11 10:47:50 1997 *************** layout_decl (decl, known_align) *** 255,259 **** --- 12072,12106 ---- /* If the bounds are equal, turn this into the one-value case. */ ! --- 4187,4213 ---- ! case_stack->data.case_stmt.seenlabel = 1; ! ! ! /* Convert VALUEs to type in which the comparisons are nominally done ! ! and replace any unspecified value with the corresponding bound. */ ! ! if (value1 == 0) ! ! value1 = TYPE_MIN_VALUE (index_type); ! ! if (value2 == 0) ! ! value2 = TYPE_MAX_VALUE (index_type); ! ! ! ! /* Fail if the range is empty. Do this before any conversion since ! ! we want to allow out-of-range empty ranges. */ ! ! if (tree_int_cst_lt (value2, value1)) ! ! return 4; ! ! ! value1 = (*converter) (nominal_type, value1); ! value2 = (*converter) (nominal_type, value2); ! ! /* Fail if these values are out of range. */ ! ! if (TREE_CONSTANT_OVERFLOW (value1) ! ! || ! int_fits_type_p (value1, index_type)) ! return 3; ! ! ! if (TREE_CONSTANT_OVERFLOW (value2) ! ! || ! int_fits_type_p (value2, index_type)) ! return 3; ! ! /* If the bounds are equal, turn this into the one-value case. */ ! diff -rcp2N gcc-2.7.2.3/stor-layout.c gcc-2.7.2.3.f.2/stor-layout.c *** gcc-2.7.2.3/stor-layout.c Sat Jun 29 16:26:51 1996 ! --- gcc-2.7.2.3.f.2/stor-layout.c Tue Sep 9 07:01:46 1997 *************** layout_decl (decl, known_align) *** 255,259 **** *************** diff -rcp2N gcc-2.7.2.3/stor-layout.c gc *** 12061,12067 **** /* Find the narrowest integer mode that contains the bit field. */ ! diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c *** gcc-2.7.2.3/stupid.c Sun Oct 29 12:45:22 1995 ! --- gcc-2.7.2.3.f.1/stupid.c Sun Aug 10 22:46:01 1997 *************** static int *uid_suid; *** 66,69 **** --- 12213,12219 ---- /* Find the narrowest integer mode that contains the bit field. */ ! diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.2/stupid.c *** gcc-2.7.2.3/stupid.c Sun Oct 29 12:45:22 1995 ! --- gcc-2.7.2.3.f.2/stupid.c Sun Mar 1 03:40:50 1998 *************** static int *uid_suid; *** 66,69 **** *************** diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7 *** 12085,12177 **** + static char *regs_crosses_setjmp; + ! /* Indexed by insn's suid, the set of hard regs live after that insn. */ ! *************** stupid_life_analysis (f, nregs, file) ! *** 149,152 **** ! --- 158,162 ---- ! last_call_suid = i + 1; ! + last_setjmp_suid = i + 1; ! max_suid = i + 1; ! *************** stupid_life_analysis (f, nregs, file) ! *** 167,170 **** ! --- 177,183 ---- ! bzero ((char *) regs_change_size, nregs * sizeof (char)); ! + regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char)); ! + bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char)); ! + ! reg_renumber = (short *) oballoc (nregs * sizeof (short)); ! for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! *************** stupid_life_analysis (f, nregs, file) ! *** 216,219 **** ! --- 229,236 ---- ! stupid_mark_refs (PATTERN (insn), insn); - + if (GET_CODE (insn) == NOTE - + && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) - + last_setjmp_suid = INSN_SUID (insn); + ! /* Mark all call-clobbered regs as live after each call insn ! so that a pseudo whose life span includes this insn ! *************** stupid_life_analysis (f, nregs, file) ! *** 254,259 **** ! register int r = reg_order[i]; ! ! /* Some regnos disappear from the rtl. Ignore them to avoid crash. */ ! ! if (regno_reg_rtx[r] == 0) ! continue; ! --- 271,277 ---- ! register int r = reg_order[i]; ! ! /* Some regnos disappear from the rtl. Ignore them to avoid crash. ! ! Also don't allocate registers that cross a setjmp. */ ! ! if (regno_reg_rtx[r] == 0 || regs_crosses_setjmp[r]) ! continue; ! *************** stupid_reg_compare (r1p, r2p) ! *** 309,314 **** ! that can hold a value of machine-mode MODE ! (but actually we test only the first of the block for holding MODE) ! ! currently free from after insn whose suid is BIRTH ! ! through the insn whose suid is DEATH, ! and return the number of the first of them. ! Return -1 if such a block cannot be found. ! --- 327,332 ---- ! that can hold a value of machine-mode MODE ! (but actually we test only the first of the block for holding MODE) ! ! currently free from after insn whose suid is BORN_INSN ! ! through the insn whose suid is DEAD_INSN, ! and return the number of the first of them. ! Return -1 if such a block cannot be found. ! *************** stupid_find_reg (call_preserved, class, ! *** 338,341 **** ! --- 356,366 ---- ! #endif ! + /* If this register's life is more than 5,000 insns, we probably ! + can't allocate it, so don't waste the time trying. This avoid ! + quadratic behavior on programs that have regularly-occurring ! + SAVE_EXPRs. */ ! + if (dead_insn > born_insn + 5000) ! + return -1; ! + ! COPY_HARD_REG_SET (used, ! call_preserved ? call_used_reg_set : fixed_reg_set); ! *************** stupid_mark_refs (x, insn) ! *** 488,491 **** ! --- 513,519 ---- ! if (last_call_suid < reg_where_dead[regno]) ! reg_n_calls_crossed[regno] += 1; ! + ! + if (last_setjmp_suid < reg_where_dead[regno]) ! + regs_crosses_setjmp[regno] = 1; ! } ! } ! diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7.2.3.f.1/tm.texi *** gcc-2.7.2.3/tm.texi Sun Sep 3 12:59:01 1995 ! --- gcc-2.7.2.3.f.1/tm.texi Fri Aug 29 07:52:19 1997 *************** This describes the stack layout and call *** 1951,1954 **** --- 12237,16246 ---- + static char *regs_crosses_setjmp; + ! /* Indexed by insn's suid, the set of hard regs live after that insn. */ ! ! *************** stupid_life_analysis (f, nregs, file) ! *** 121,124 **** ! --- 130,135 ---- ! int max_uid, max_suid; ! ! + current_function_has_computed_jump = 0; ! + ! bzero (regs_ever_live, sizeof regs_ever_live); ! ! *************** stupid_life_analysis (f, nregs, file) ! *** 149,152 **** ! --- 160,164 ---- ! ! last_call_suid = i + 1; ! + last_setjmp_suid = i + 1; ! max_suid = i + 1; ! ! *************** stupid_life_analysis (f, nregs, file) ! *** 167,170 **** ! --- 179,185 ---- ! bzero ((char *) regs_change_size, nregs * sizeof (char)); ! ! + regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char)); ! + bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char)); ! + ! reg_renumber = (short *) oballoc (nregs * sizeof (short)); ! for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! *************** stupid_life_analysis (f, nregs, file) ! *** 216,219 **** ! --- 231,238 ---- ! stupid_mark_refs (PATTERN (insn), insn); ! ! + if (GET_CODE (insn) == NOTE ! + && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) ! + last_setjmp_suid = INSN_SUID (insn); ! + ! /* Mark all call-clobbered regs as live after each call insn ! so that a pseudo whose life span includes this insn ! *************** stupid_life_analysis (f, nregs, file) ! *** 237,240 **** ! --- 256,263 ---- ! stupid_mark_refs (CALL_INSN_FUNCTION_USAGE (insn), insn); ! } ! + #ifdef STACK_REGS ! + if (GET_CODE (insn) == JUMP_INSN && computed_jump_p (insn)) ! + current_function_has_computed_jump = 1; ! + #endif ! } ! ! *************** stupid_life_analysis (f, nregs, file) ! *** 254,259 **** ! register int r = reg_order[i]; ! ! ! /* Some regnos disappear from the rtl. Ignore them to avoid crash. */ ! ! if (regno_reg_rtx[r] == 0) ! continue; ! ! --- 277,283 ---- ! register int r = reg_order[i]; ! ! ! /* Some regnos disappear from the rtl. Ignore them to avoid crash. ! ! Also don't allocate registers that cross a setjmp. */ ! ! if (regno_reg_rtx[r] == 0 || regs_crosses_setjmp[r]) ! continue; ! ! *************** stupid_reg_compare (r1p, r2p) ! *** 309,314 **** ! that can hold a value of machine-mode MODE ! (but actually we test only the first of the block for holding MODE) ! ! currently free from after insn whose suid is BIRTH ! ! through the insn whose suid is DEATH, ! and return the number of the first of them. ! Return -1 if such a block cannot be found. ! --- 333,338 ---- ! that can hold a value of machine-mode MODE ! (but actually we test only the first of the block for holding MODE) ! ! currently free from after insn whose suid is BORN_INSN ! ! through the insn whose suid is DEAD_INSN, ! and return the number of the first of them. ! Return -1 if such a block cannot be found. ! *************** stupid_find_reg (call_preserved, class, ! *** 338,341 **** ! --- 362,372 ---- ! #endif ! ! + /* If this register's life is more than 5,000 insns, we probably ! + can't allocate it, so don't waste the time trying. This avoid ! + quadratic behavior on programs that have regularly-occurring ! + SAVE_EXPRs. */ ! + if (dead_insn > born_insn + 5000) ! + return -1; ! + ! COPY_HARD_REG_SET (used, ! call_preserved ? call_used_reg_set : fixed_reg_set); ! *************** stupid_find_reg (call_preserved, class, ! *** 354,357 **** ! --- 385,394 ---- ! IOR_HARD_REG_SET (used, after_insn_hard_regs[ins]); ! ! + #ifdef STACK_REGS ! + if (current_function_has_computed_jump) ! + for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++) ! + SET_HARD_REG_BIT (used, i); ! + #endif ! + ! IOR_COMPL_HARD_REG_SET (used, reg_class_contents[(int) class]); ! ! *************** stupid_mark_refs (x, insn) ! *** 488,491 **** ! --- 525,531 ---- ! if (last_call_suid < reg_where_dead[regno]) ! reg_n_calls_crossed[regno] += 1; ! + ! + if (last_setjmp_suid < reg_where_dead[regno]) ! + regs_crosses_setjmp[regno] = 1; ! } ! } ! diff -rcp2N gcc-2.7.2.3/texinfo.tex gcc-2.7.2.3.f.2/texinfo.tex ! *** gcc-2.7.2.3/texinfo.tex Sun Nov 26 19:57:26 1995 ! --- gcc-2.7.2.3.f.2/texinfo.tex Wed Dec 24 01:36:39 1997 ! *************** ! *** 1,5 **** ! ! %% TeX macros to handle texinfo files ! ! ! % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc. ! ! %This texinfo.tex file is free software; you can redistribute it and/or ! --- 1,7 ---- ! ! %% TeX macros to handle Texinfo files. ! ! %% $Id: texinfo.tex,v 2.220 1997/12/23 16:33:04 karl Exp $ ! ! ! % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, ! ! % 94, 95, 96, 97 Free Software Foundation, Inc. ! ! %This texinfo.tex file is free software; you can redistribute it and/or ! *************** ! *** 15,20 **** ! %You should have received a copy of the GNU General Public License ! %along with this texinfo.tex file; see the file COPYING. If not, write ! ! %to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, ! ! %USA. ! ! ! --- 17,22 ---- ! %You should have received a copy of the GNU General Public License ! %along with this texinfo.tex file; see the file COPYING. If not, write ! ! %to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ! ! %Boston, MA 02111-1307, USA. ! ! ! *************** ! *** 35,39 **** ! % This automatically updates the version number based on RCS. ! \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} ! ! \deftexinfoversion$Revision: 2.150 $ ! \message{Loading texinfo package [Version \texinfoversion]:} ! ! --- 37,41 ---- ! % This automatically updates the version number based on RCS. ! \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} ! ! \deftexinfoversion$Revision: 2.220 $ ! \message{Loading texinfo package [Version \texinfoversion]:} ! ! *************** ! *** 46,63 **** ! % Save some parts of plain tex whose names we will redefine. ! ! - \let\ptextilde=\~ ! - \let\ptexlbrace=\{ ! - \let\ptexrbrace=\} ! - \let\ptexdots=\dots ! - \let\ptexdot=\. ! - \let\ptexstar=\* ! - \let\ptexend=\end ! - \let\ptexbullet=\bullet ! \let\ptexb=\b ! \let\ptexc=\c ! \let\ptexi=\i ! \let\ptext=\t ! - \let\ptexl=\l ! - \let\ptexL=\L ! ! % Be sure we're in horizontal mode when doing a tie, since we make space ! --- 48,64 ---- ! % Save some parts of plain tex whose names we will redefine. ! ! \let\ptexb=\b ! + \let\ptexbullet=\bullet ! \let\ptexc=\c ! + \let\ptexcomma=\, ! + \let\ptexdot=\. ! + \let\ptexdots=\dots ! + \let\ptexend=\end ! + \let\ptexequiv = \equiv ! \let\ptexi=\i ! + \let\ptexlbrace=\{ ! + \let\ptexrbrace=\} ! + \let\ptexstar=\* ! \let\ptext=\t ! ! % Be sure we're in horizontal mode when doing a tie, since we make space ! *************** ! *** 70,76 **** ! % if the definition is written into an index file. ! \global\let\tiepenalty = \@M ! ! \gdef\tie{\lvvmode\penalty\tiepenalty\ } ! } ! ! \let\~ = \tie % And make it available as @~. ! ! \message{Basics,} ! --- 71,77 ---- ! % if the definition is written into an index file. ! \global\let\tiepenalty = \@M ! ! \gdef\tie{\leavevmode\penalty\tiepenalty\ } ! } ! ! ! ! \message{Basics,} ! *************** ! *** 101,110 **** ! \hyphenation{mini-buf-fer mini-buf-fers} ! \hyphenation{eshell} ! ! % Margin to add to right of even pages, to left of odd pages. ! ! \newdimen \bindingoffset \bindingoffset=0pt ! ! \newdimen \normaloffset \normaloffset=\hoffset ! \newdimen\pagewidth \newdimen\pageheight ! - \pagewidth=\hsize \pageheight=\vsize ! ! % Sometimes it is convenient to have everything in the transcript file ! --- 102,111 ---- ! \hyphenation{mini-buf-fer mini-buf-fers} ! \hyphenation{eshell} ! + \hyphenation{white-space} ! ! % Margin to add to right of even pages, to left of odd pages. ! ! \newdimen \bindingoffset ! ! \newdimen \normaloffset ! \newdimen\pagewidth \newdimen\pageheight ! ! % Sometimes it is convenient to have everything in the transcript file ! *************** ! *** 119,131 **** ! }% ! ! ! %---------------------Begin change----------------------- ! % ! ! %%%% For @cropmarks command. ! ! % Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 ! % ! \newdimen\cornerlong \newdimen\cornerthick ! ! \newdimen \topandbottommargin ! ! \newdimen \outerhsize \newdimen \outervsize ! ! \cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks ! \outerhsize=7in ! %\outervsize=9.5in ! --- 120,136 ---- ! }% ! ! ! % For @cropmarks command. ! ! % Do @cropmarks to get crop marks. ! ! % ! ! \newif\ifcropmarks ! ! \let\cropmarks = \cropmarkstrue ! % ! ! % Dimensions to add cropmarks at corners. ! ! % Added by P. A. MacKay, 12 Nov. 1986 ! % ! \newdimen\cornerlong \newdimen\cornerthick ! ! \newdimen\topandbottommargin ! ! \newdimen\outerhsize \newdimen\outervsize ! ! \cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks ! \outerhsize=7in ! %\outervsize=9.5in ! *************** ! *** 133,187 **** ! \outervsize=9.25in ! \topandbottommargin=.75in ! ! % ! ! %---------------------End change----------------------- ! ! % \onepageout takes a vbox as an argument. Note that \pagecontents ! ! % does insertions itself, but you have to call it yourself. ! ! \chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} ! ! \def\onepageout#1{\hoffset=\normaloffset ! ! \ifodd\pageno \advance\hoffset by \bindingoffset ! ! \else \advance\hoffset by -\bindingoffset\fi ! ! {\escapechar=`\\\relax % makes sure backslash is used in output files. ! ! \shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% ! ! {\let\hsize=\pagewidth \makefootline}}}% ! ! \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} ! ! ! ! %%%% For @cropmarks command %%%% ! ! ! ! % Here is a modification of the main output routine for Near East Publications ! ! % This provides right-angle cropmarks at all four corners. ! ! % The contents of the page are centerlined into the cropmarks, ! ! % and any desired binding offset is added as an \hskip on either ! ! % site of the centerlined box. (P. A. MacKay, 12 November, 1986) ! ! % ! ! \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up ! ! {\escapechar=`\\\relax % makes sure backslash is used in output files. ! ! \shipout ! ! \vbox to \outervsize{\hsize=\outerhsize ! ! \vbox{\line{\ewtop\hfill\ewtop}} ! ! \nointerlineskip ! ! \line{\vbox{\moveleft\cornerthick\nstop} ! ! \hfill ! ! \vbox{\moveright\cornerthick\nstop}} ! ! \vskip \topandbottommargin ! ! \centerline{\ifodd\pageno\hskip\bindingoffset\fi ! ! \vbox{ ! ! {\let\hsize=\pagewidth \makeheadline} ! ! \pagebody{#1} ! ! {\let\hsize=\pagewidth \makefootline}} ! ! \ifodd\pageno\else\hskip\bindingoffset\fi} ! ! \vskip \topandbottommargin plus1fill minus1fill ! ! \boxmaxdepth\cornerthick ! ! \line{\vbox{\moveleft\cornerthick\nsbot} ! ! \hfill ! ! \vbox{\moveright\cornerthick\nsbot}} ! ! \nointerlineskip ! ! \vbox{\line{\ewbot\hfill\ewbot}} ! ! }} ! \advancepageno ! ! \ifnum\outputpenalty>-20000 \else\dosupereject\fi} ! ! % ! ! % Do @cropmarks to get crop marks ! ! \def\cropmarks{\let\onepageout=\croppageout } ! ! \newinsert\margin \dimen\margin=\maxdimen ! --- 138,217 ---- ! \outervsize=9.25in ! \topandbottommargin=.75in ! ! ! ! % Main output routine. ! ! \chardef\PAGE = 255 ! ! \output = {\onepageout{\pagecontents\PAGE}} ! ! ! ! \newbox\headlinebox ! ! \newbox\footlinebox ! ! % \onepageout takes a vbox as an argument. Note that \pagecontents ! ! % does insertions, but you have to call it yourself. ! ! \def\onepageout#1{% ! ! \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi ! ! % ! ! \ifodd\pageno \advance\hoffset by \bindingoffset ! ! \else \advance\hoffset by -\bindingoffset\fi ! ! % ! ! % Do this outside of the \shipout so @code etc. will be expanded in ! ! % the headline as they should be, not taken literally (outputting ''code). ! ! \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% ! ! \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% ! ! % ! ! {% ! ! % Have to do this stuff outside the \shipout because we want it to ! ! % take effect in \write's, yet the group defined by the \vbox ends ! ! % before the \shipout runs. ! ! % ! ! \escapechar = `\\ % use backslash in output files. ! ! \indexdummies % don't expand commands in the output. ! ! \normalturnoffactive % \ in index entries must not stay \, e.g., if ! ! % the page break happens to be in the middle of an example. ! ! \shipout\vbox{% ! ! \ifcropmarks \vbox to \outervsize\bgroup ! ! \hsize = \outerhsize ! ! \line{\ewtop\hfil\ewtop}% ! ! \nointerlineskip ! ! \line{% ! ! \vbox{\moveleft\cornerthick\nstop}% ! ! \hfill ! ! \vbox{\moveright\cornerthick\nstop}% ! ! }% ! ! \vskip\topandbottommargin ! ! \line\bgroup ! ! \hfil % center the page within the outer (page) hsize. ! ! \ifodd\pageno\hskip\bindingoffset\fi ! ! \vbox\bgroup ! ! \fi ! ! % ! ! \unvbox\headlinebox ! ! \pagebody{#1}% ! ! \ifdim\ht\footlinebox > 0pt ! ! % Only leave this space if the footline is nonempty. ! ! % (We lessened \vsize for it in \oddfootingxxx.) ! ! % The \baselineskip=24pt in plain's \makefootline has no effect. ! ! \vskip 2\baselineskip ! ! \unvbox\footlinebox ! ! \fi ! ! % ! ! \ifcropmarks ! ! \egroup % end of \vbox\bgroup ! ! \hfil\egroup % end of (centering) \line\bgroup ! ! \vskip\topandbottommargin plus1fill minus1fill ! ! \boxmaxdepth = \cornerthick ! ! \line{% ! ! \vbox{\moveleft\cornerthick\nsbot}% ! ! \hfill ! ! \vbox{\moveright\cornerthick\nsbot}% ! ! }% ! ! \nointerlineskip ! ! \line{\ewbot\hfil\ewbot}% ! ! \egroup % \vbox from first cropmarks clause ! ! \fi ! ! }% end of \shipout\vbox ! ! }% end of group with \turnoffactive ! \advancepageno ! ! \ifnum\outputpenalty>-20000 \else\dosupereject\fi ! ! } ! ! \newinsert\margin \dimen\margin=\maxdimen ! *************** ! *** 198,202 **** ! } ! ! - % ! % Here are the rules for the cropmarks. Note that they are ! % offset so that the space between them is truly \outerhsize or \outervsize ! --- 228,231 ---- ! *************** ! *** 366,374 **** ! ! % Used to generate quoted braces. ! - ! \def\mylbrace {{\tt \char '173}} ! \def\myrbrace {{\tt \char '175}} ! \let\{=\mylbrace ! \let\}=\myrbrace ! ! % @: forces normal size whitespace following. ! --- 395,435 ---- ! ! % Used to generate quoted braces. ! \def\mylbrace {{\tt \char '173}} ! \def\myrbrace {{\tt \char '175}} ! \let\{=\mylbrace ! \let\}=\myrbrace ! + \begingroup ! + % Definitions to produce actual \{ & \} command in an index. ! + \catcode`\{ = 12 \catcode`\} = 12 ! + \catcode`\[ = 1 \catcode`\] = 2 ! + \catcode`\@ = 0 \catcode`\\ = 12 ! + @gdef@lbracecmd[\{]% ! + @gdef@rbracecmd[\}]% ! + @endgroup ! + ! + % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent ! + % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. ! + \let\, = \c ! + \let\dotaccent = \. ! + \def\ringaccent#1{{\accent23 #1}} ! + \let\tieaccent = \t ! + \let\ubaraccent = \b ! + \let\udotaccent = \d ! + ! + % Other special characters: @questiondown @exclamdown ! + % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. ! + \def\questiondown{?`} ! + \def\exclamdown{!`} ! + ! + % Dotless i and dotless j, used for accents. ! + \def\imacro{i} ! + \def\jmacro{j} ! + \def\dotless#1{% ! + \def\temp{#1}% ! + \ifx\temp\imacro \ptexi ! + \else\ifx\temp\jmacro \j ! + \else \errmessage{@dotless can be used only with i or j}% ! + \fi\fi ! + } ! ! % @: forces normal size whitespace following. ! *************** where each line of input produces a line ! *** 537,551 **** ! \leftline{\hskip\leftskip{\rm#1}}}} ! ! %\hbox{{\rm#1}}\hfil\break}} ! ! % @include file insert text of that file as input. ! ! ! ! \def\include{\parsearg\includezzz} ! ! %Use \input\thisfile to avoid blank after \input, which may be an active ! ! %char (in which case the blank would become the \input argument). ! ! %The grouping keeps the value of \thisfile correct even when @include ! ! %is nested. ! ! \def\includezzz #1{\begingroup ! ! \def\thisfile{#1}\input\thisfile ! \endgroup} ! ! --- 598,629 ---- ! \leftline{\hskip\leftskip{\rm#1}}}} ! ! + % @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. ! + ! + \def\inmargin#1{% ! + \strut\vadjust{\nobreak\kern-\strutdepth ! + \vtop to \strutdepth{\baselineskip\strutdepth\vss ! + \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} ! + \newskip\inmarginspacing \inmarginspacing=1cm ! + \def\strutdepth{\dp\strutbox} ! + ! %\hbox{{\rm#1}}\hfil\break}} ! ! % @include file insert text of that file as input. ! ! % Allow normal characters that we make active in the argument (a file name). ! ! \def\include{\begingroup ! ! \catcode`\\=12 ! ! \catcode`~=12 ! ! \catcode`^=12 ! ! \catcode`_=12 ! ! \catcode`|=12 ! ! \catcode`<=12 ! ! \catcode`>=12 ! ! \catcode`+=12 ! ! \parsearg\includezzz} ! ! % Restore active chars for included file. ! ! \def\includezzz#1{\endgroup\begingroup ! ! % Read the included file in a group so nested @include's work. ! ! \def\thisfile{#1}% ! ! \input\thisfile ! \endgroup} ! ! *************** where each line of input produces a line ! *** 562,566 **** ! ! \def\sp{\parsearg\spxxx} ! ! \def\spxxx #1{\par \vskip #1\baselineskip} ! ! % @comment ...line which is ignored... ! --- 640,644 ---- ! ! \def\sp{\parsearg\spxxx} ! ! \def\spxxx #1{\vskip #1\baselineskip} ! ! % @comment ...line which is ignored... ! *************** where each line of input produces a line ! *** 575,578 **** ! --- 653,659 ---- ! \let\c=\comment ! ! + % @paragraphindent is defined for the Info formatting commands only. ! + \let\paragraphindent=\comment ! + ! % Prevent errors for section commands. ! % Used in @ignore and in failing conditionals. ! *************** where each line of input produces a line ! *** 609,612 **** ! --- 690,694 ---- ! % ! \def\ignoremorecommands{% ! + \let\defcodeindex = \relax ! \let\defcv = \relax ! \let\deffn = \relax ! *************** where each line of input produces a line ! *** 632,635 **** ! --- 714,726 ---- ! \let\pxref = \relax ! \let\settitle = \relax ! + \let\setchapternewpage = \relax ! + \let\setchapterstyle = \relax ! + \let\everyheading = \relax ! + \let\evenheading = \relax ! + \let\oddheading = \relax ! + \let\everyfooting = \relax ! + \let\evenfooting = \relax ! + \let\oddfooting = \relax ! + \let\headings = \relax ! \let\include = \relax ! \let\lowersections = \relax ! *************** where each line of input produces a line ! *** 640,644 **** ! \let\clear = \relax ! \let\item = \relax ! - \let\message = \relax ! } ! ! --- 731,734 ---- ! *************** where each line of input produces a line ! *** 647,658 **** ! \def\ignore{\doignore{ignore}} ! ! ! % Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. ! % ! \def\ifinfo{\doignore{ifinfo}} ! \def\ifhtml{\doignore{ifhtml}} ! \def\html{\doignore{html}} ! \def\menu{\doignore{menu}} ! \def\direntry{\doignore{direntry}} ! ! % Ignore text until a line `@end #1'. ! % ! --- 737,759 ---- ! \def\ignore{\doignore{ignore}} ! ! ! % Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. ! % ! \def\ifinfo{\doignore{ifinfo}} ! \def\ifhtml{\doignore{ifhtml}} ! + \def\ifnottex{\doignore{ifnottex}} ! \def\html{\doignore{html}} ! \def\menu{\doignore{menu}} ! \def\direntry{\doignore{direntry}} ! ! + % Also ignore @macro ... @end macro. The user must run texi2dvi, ! + % which runs makeinfo to do macro expansion. Ignore @unmacro, too. ! + \def\macro{\doignore{macro}} ! + \let\unmacro = \comment ! + ! + ! + % @dircategory CATEGORY -- specify a category of the dir file ! + % which this file should belong to. Ignore this in TeX. ! + \let\dircategory = \comment ! + ! % Ignore text until a line `@end #1'. ! % ! *************** where each line of input produces a line ! *** 667,670 **** ! --- 768,775 ---- ! \catcode32 = 10 ! % ! + % Ignore braces, too, so mismatched braces don't cause trouble. ! + \catcode`\{ = 9 ! + \catcode`\} = 9 ! + % ! % And now expand that command. ! \doignoretext ! *************** where each line of input produces a line ! *** 686,694 **** ! \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} ! \immediate\write16{ Then upgrade your TeX installation if you can.} ! \immediate\write16{If you are stuck with version 3.0, run the} ! \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} ! \immediate\write16{ to use a workaround.} ! \immediate\write16{} ! ! \warnedobstrue ! \fi ! } ! --- 791,800 ---- ! \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} ! \immediate\write16{ Then upgrade your TeX installation if you can.} ! + \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)} ! \immediate\write16{If you are stuck with version 3.0, run the} ! \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} ! \immediate\write16{ to use a workaround.} ! \immediate\write16{} ! ! \global\warnedobstrue ! \fi ! } ! *************** where each line of input produces a line ! *** 757,761 **** ! % ! % Do not execute instructions in @tex ! ! \def\tex{\doignore{tex}} ! } ! ! --- 863,867 ---- ! % ! % Do not execute instructions in @tex ! ! \def\tex{\doignore{tex}}% ! } ! ! *************** where each line of input produces a line ! *** 766,772 **** ! % empty), we can't just use \parsearg; we have to insert a space of our ! % own to delimit the rest of the line, and then take it out again if we ! ! % didn't need it. ! % ! ! \def\set{\parsearg\setxxx} ! \def\setxxx#1{\setyyy#1 \endsetyyy} ! \def\setyyy#1 #2\endsetyyy{% ! --- 872,881 ---- ! % empty), we can't just use \parsearg; we have to insert a space of our ! % own to delimit the rest of the line, and then take it out again if we ! ! % didn't need it. Make sure the catcode of space is correct to avoid ! ! % losing inside @example, for instance. ! % ! ! \def\set{\begingroup\catcode` =10 ! ! \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. ! ! \parsearg\setxxx} ! \def\setxxx#1{\setyyy#1 \endsetyyy} ! \def\setyyy#1 #2\endsetyyy{% ! *************** where each line of input produces a line ! *** 775,778 **** ! --- 884,888 ---- ! \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. ! \fi ! + \endgroup ! } ! % Can't use \xdef to pre-expand #2 and save some time, since \temp or ! *************** where each line of input produces a line ! *** 788,795 **** ! % @value{foo} gets the text saved in variable foo. ! % ! ! \def\value#1{\expandafter ! ! \ifx\csname SET#1\endcsname\relax ! ! {\{No value for ``#1''\}} ! ! \else \csname SET#1\endcsname \fi} ! ! % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined ! --- 898,911 ---- ! % @value{foo} gets the text saved in variable foo. ! % ! ! \def\value{\begingroup ! ! \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. ! ! \valuexxx} ! ! \def\valuexxx#1{% ! ! \expandafter\ifx\csname SET#1\endcsname\relax ! ! {\{No value for ``#1''\}}% ! ! \else ! ! \csname SET#1\endcsname ! ! \fi ! ! \endgroup} ! ! % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined ! *************** where each line of input produces a line ! *** 823,831 **** ! \defineunmatchedend{ifclear} ! ! ! % @iftex always succeeds; we read the text following, through @end ! ! % iftex). But `@end iftex' should be valid only after an @iftex. ! % ! \def\iftex{\conditionalsucceed{iftex}} ! \defineunmatchedend{iftex} ! ! % We can't just want to start a group at @iftex (for example) and end it ! --- 939,952 ---- ! \defineunmatchedend{ifclear} ! ! ! % @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text ! ! % following, through the first @end iftex (etc.). Make `@end iftex' ! ! % (etc.) valid only after an @iftex. ! % ! \def\iftex{\conditionalsucceed{iftex}} ! + \def\ifnothtml{\conditionalsucceed{ifnothtml}} ! + \def\ifnotinfo{\conditionalsucceed{ifnotinfo}} ! \defineunmatchedend{iftex} ! + \defineunmatchedend{ifnothtml} ! + \defineunmatchedend{ifnotinfo} ! ! % We can't just want to start a group at @iftex (for example) and end it ! *************** where each line of input produces a line ! *** 891,894 **** ! --- 1012,1016 ---- ! \global\let\lastnode=\relax} ! ! + % @refill is a no-op. ! \let\refill=\relax ! ! *************** where each line of input produces a line ! *** 902,913 **** ! \fixbackslash % Turn off hack to swallow `\input texinfo'. ! \global\let\setfilename=\comment % Ignore extra @setfilename cmds. ! \comment % Ignore the actual filename. ! } ! ! \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} ! ! ! \def\inforef #1{\inforefzzz #1,,,,**} ! ! \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, ! ! node \samp{\ignorespaces#1{}}} ! ! \message{fonts,} ! --- 1024,1057 ---- ! \fixbackslash % Turn off hack to swallow `\input texinfo'. ! \global\let\setfilename=\comment % Ignore extra @setfilename cmds. ! + % ! + % If texinfo.cnf is present on the system, read it. ! + % Useful for site-wide @afourpaper, etc. ! + % Just to be on the safe side, close the input stream before the \input. ! + \openin 1 texinfo.cnf ! + \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi ! + \closein1 ! + \temp ! + % ! \comment % Ignore the actual filename. ! } ! ! + % @bye. ! \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} ! ! ! % \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx} ! ! % \def\macroxxx#1#2 \end macro{% ! ! % \expandafter\gdef\macrotemp#1{#2}% ! ! % \endgroup} ! ! ! ! %\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx} ! ! %\def\linemacroxxx#1#2 \end linemacro{% ! ! %\let\parsearg=\relax ! ! %\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}% ! ! %\expandafter\xdef\macrotemp{\parsearg\macrotempx}% ! ! %\expandafter\gdef\macrotempx#1{#2}% ! ! %\endgroup} ! ! ! ! %\def\butfirst#1{} ! ! ! ! \message{fonts,} ! *************** where each line of input produces a line ! *** 921,930 **** ! \let\li = \sf % Sometimes we call it \li, not \sf. ! ! ! %% Try out Computer Modern fonts at \magstephalf ! ! \let\mainmagstep=\magstephalf ! ! % Set the font macro #1 to the font named #2, adding on the ! % specified font prefix (normally `cm'). ! ! \def\setfont#1#2{\font#1=\fontprefix#2} ! ! % Use cm as the default font prefix. ! --- 1065,1079 ---- ! \let\li = \sf % Sometimes we call it \li, not \sf. ! ! ! % We don't need math for this one. ! ! \def\ttsl{\tenttsl} ! ! ! ! % Use Computer Modern fonts at \magstephalf (11pt). ! ! \newcount\mainmagstep ! ! \mainmagstep=\magstephalf ! ! % Set the font macro #1 to the font named #2, adding on the ! % specified font prefix (normally `cm'). ! ! % #3 is the font's design size, #4 is a scale factor ! ! \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} ! ! % Use cm as the default font prefix. ! *************** where each line of input produces a line ! *** 934,1029 **** ! \def\fontprefix{cm} ! \fi ! ! \ifx\bigger\relax ! \let\mainmagstep=\magstep1 ! ! \setfont\textrm{r12} ! ! \setfont\texttt{tt12} ! \else ! ! \setfont\textrm{r10 scaled \mainmagstep} ! ! \setfont\texttt{tt10 scaled \mainmagstep} ! \fi ! % Instead of cmb10, you many want to use cmbx10. ! % cmbx10 is a prettier font on its own, but cmb10 ! % looks better when embedded in a line with cmr10. ! ! \setfont\textbf{b10 scaled \mainmagstep} ! ! \setfont\textit{ti10 scaled \mainmagstep} ! ! \setfont\textsl{sl10 scaled \mainmagstep} ! ! \setfont\textsf{ss10 scaled \mainmagstep} ! ! \setfont\textsc{csc10 scaled \mainmagstep} ! \font\texti=cmmi10 scaled \mainmagstep ! \font\textsy=cmsy10 scaled \mainmagstep ! ! % A few fonts for @defun, etc. ! ! \setfont\defbf{bx10 scaled \magstep1} %was 1314 ! ! \setfont\deftt{tt10 scaled \magstep1} ! \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} ! ! ! % Fonts for indices and small examples. ! % We actually use the slanted font rather than the italic, ! % because texinfo normally uses the slanted fonts for that. ! % Do not make many font distinctions in general in the index, since they ! % aren't very useful. ! ! \setfont\ninett{tt9} ! ! \setfont\indrm{r9} ! ! \setfont\indit{sl9} ! \let\indsl=\indit ! \let\indtt=\ninett ! \let\indsf=\indrm ! \let\indbf=\indrm ! ! \setfont\indsc{csc10 at 9pt} ! \font\indi=cmmi9 ! \font\indsy=cmsy9 ! ! ! % Fonts for headings ! ! \setfont\chaprm{bx12 scaled \magstep2} ! ! \setfont\chapit{ti12 scaled \magstep2} ! ! \setfont\chapsl{sl12 scaled \magstep2} ! ! \setfont\chaptt{tt12 scaled \magstep2} ! ! \setfont\chapsf{ss12 scaled \magstep2} ! \let\chapbf=\chaprm ! ! \setfont\chapsc{csc10 scaled\magstep3} ! \font\chapi=cmmi12 scaled \magstep2 ! \font\chapsy=cmsy10 scaled \magstep3 ! ! ! \setfont\secrm{bx12 scaled \magstep1} ! ! \setfont\secit{ti12 scaled \magstep1} ! ! \setfont\secsl{sl12 scaled \magstep1} ! ! \setfont\sectt{tt12 scaled \magstep1} ! ! \setfont\secsf{ss12 scaled \magstep1} ! ! \setfont\secbf{bx12 scaled \magstep1} ! ! \setfont\secsc{csc10 scaled\magstep2} ! \font\seci=cmmi12 scaled \magstep1 ! \font\secsy=cmsy10 scaled \magstep2 ! ! ! % \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad. ! ! % \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded. ! ! % \setfont\ssecsl{sl10 scaled \magstep1} ! ! % \setfont\ssectt{tt10 scaled \magstep1} ! ! % \setfont\ssecsf{ss10 scaled \magstep1} ! ! ! ! %\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx. ! ! %\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than ! ! %\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1. ! ! %\setfont\ssectt{tt10 scaled 1315} ! ! %\setfont\ssecsf{ss10 scaled 1315} ! ! %\let\ssecbf=\ssecrm ! ! ! \setfont\ssecrm{bx12 scaled \magstephalf} ! ! \setfont\ssecit{ti12 scaled \magstephalf} ! ! \setfont\ssecsl{sl12 scaled \magstephalf} ! ! \setfont\ssectt{tt12 scaled \magstephalf} ! ! \setfont\ssecsf{ss12 scaled \magstephalf} ! ! \setfont\ssecbf{bx12 scaled \magstephalf} ! ! \setfont\ssecsc{csc10 scaled \magstep1} ! \font\sseci=cmmi12 scaled \magstephalf ! ! \font\ssecsy=cmsy10 scaled \magstep1 ! % The smallcaps and symbol fonts should actually be scaled \magstep1.5, ! % but that is not a standard magnification. ! ! - % Fonts for title page: ! - \setfont\titlerm{bx12 scaled \magstep3} ! - \let\authorrm = \secrm ! - ! % In order for the font changes to affect most math symbols and letters, ! % we have to define the \textfont of the standard families. Since ! --- 1083,1210 ---- ! \def\fontprefix{cm} ! \fi ! + % Support font families that don't use the same naming scheme as CM. ! + \def\rmshape{r} ! + \def\rmbshape{bx} %where the normal face is bold ! + \def\bfshape{b} ! + \def\bxshape{bx} ! + \def\ttshape{tt} ! + \def\ttbshape{tt} ! + \def\ttslshape{sltt} ! + \def\itshape{ti} ! + \def\itbshape{bxti} ! + \def\slshape{sl} ! + \def\slbshape{bxsl} ! + \def\sfshape{ss} ! + \def\sfbshape{ss} ! + \def\scshape{csc} ! + \def\scbshape{csc} ! ! \ifx\bigger\relax ! \let\mainmagstep=\magstep1 ! ! \setfont\textrm\rmshape{12}{1000} ! ! \setfont\texttt\ttshape{12}{1000} ! \else ! ! \setfont\textrm\rmshape{10}{\mainmagstep} ! ! \setfont\texttt\ttshape{10}{\mainmagstep} ! \fi ! % Instead of cmb10, you many want to use cmbx10. ! % cmbx10 is a prettier font on its own, but cmb10 ! % looks better when embedded in a line with cmr10. ! ! \setfont\textbf\bfshape{10}{\mainmagstep} ! ! \setfont\textit\itshape{10}{\mainmagstep} ! ! \setfont\textsl\slshape{10}{\mainmagstep} ! ! \setfont\textsf\sfshape{10}{\mainmagstep} ! ! \setfont\textsc\scshape{10}{\mainmagstep} ! ! \setfont\textttsl\ttslshape{10}{\mainmagstep} ! \font\texti=cmmi10 scaled \mainmagstep ! \font\textsy=cmsy10 scaled \mainmagstep ! ! % A few fonts for @defun, etc. ! ! \setfont\defbf\bxshape{10}{\magstep1} %was 1314 ! ! \setfont\deftt\ttshape{10}{\magstep1} ! \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} ! ! ! % Fonts for indices and small examples (9pt). ! % We actually use the slanted font rather than the italic, ! % because texinfo normally uses the slanted fonts for that. ! % Do not make many font distinctions in general in the index, since they ! % aren't very useful. ! ! \setfont\ninett\ttshape{9}{1000} ! ! \setfont\indrm\rmshape{9}{1000} ! ! \setfont\indit\slshape{9}{1000} ! \let\indsl=\indit ! \let\indtt=\ninett ! + \let\indttsl=\ninett ! \let\indsf=\indrm ! \let\indbf=\indrm ! ! \setfont\indsc\scshape{10}{900} ! \font\indi=cmmi9 ! \font\indsy=cmsy9 ! ! ! % Fonts for title page: ! ! \setfont\titlerm\rmbshape{12}{\magstep3} ! ! \setfont\titleit\itbshape{10}{\magstep4} ! ! \setfont\titlesl\slbshape{10}{\magstep4} ! ! \setfont\titlett\ttbshape{12}{\magstep3} ! ! \setfont\titlettsl\ttslshape{10}{\magstep4} ! ! \setfont\titlesf\sfbshape{17}{\magstep1} ! ! \let\titlebf=\titlerm ! ! \setfont\titlesc\scbshape{10}{\magstep4} ! ! \font\titlei=cmmi12 scaled \magstep3 ! ! \font\titlesy=cmsy10 scaled \magstep4 ! ! \def\authorrm{\secrm} ! ! ! ! % Chapter (and unnumbered) fonts (17.28pt). ! ! \setfont\chaprm\rmbshape{12}{\magstep2} ! ! \setfont\chapit\itbshape{10}{\magstep3} ! ! \setfont\chapsl\slbshape{10}{\magstep3} ! ! \setfont\chaptt\ttbshape{12}{\magstep2} ! ! \setfont\chapttsl\ttslshape{10}{\magstep3} ! ! \setfont\chapsf\sfbshape{17}{1000} ! \let\chapbf=\chaprm ! ! \setfont\chapsc\scbshape{10}{\magstep3} ! \font\chapi=cmmi12 scaled \magstep2 ! \font\chapsy=cmsy10 scaled \magstep3 ! ! ! % Section fonts (14.4pt). ! ! \setfont\secrm\rmbshape{12}{\magstep1} ! ! \setfont\secit\itbshape{10}{\magstep2} ! ! \setfont\secsl\slbshape{10}{\magstep2} ! ! \setfont\sectt\ttbshape{12}{\magstep1} ! ! \setfont\secttsl\ttslshape{10}{\magstep2} ! ! \setfont\secsf\sfbshape{12}{\magstep1} ! ! \let\secbf\secrm ! ! \setfont\secsc\scbshape{10}{\magstep2} ! \font\seci=cmmi12 scaled \magstep1 ! \font\secsy=cmsy10 scaled \magstep2 ! ! ! % \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. ! ! % \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. ! ! % \setfont\ssecsl\slshape{10}{\magstep1} ! ! % \setfont\ssectt\ttshape{10}{\magstep1} ! ! % \setfont\ssecsf\sfshape{10}{\magstep1} ! ! ! ! %\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. ! ! %\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than ! ! %\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. ! ! %\setfont\ssectt\ttshape{10}{1315} ! ! %\setfont\ssecsf\sfshape{10}{1315} ! ! %\let\ssecbf=\ssecrm ! ! ! % Subsection fonts (13.15pt). ! ! \setfont\ssecrm\rmbshape{12}{\magstephalf} ! ! \setfont\ssecit\itbshape{10}{1315} ! ! \setfont\ssecsl\slbshape{10}{1315} ! ! \setfont\ssectt\ttbshape{12}{\magstephalf} ! ! \setfont\ssecttsl\ttslshape{10}{1315} ! ! \setfont\ssecsf\sfbshape{12}{\magstephalf} ! ! \let\ssecbf\ssecrm ! ! \setfont\ssecsc\scbshape{10}{\magstep1} ! \font\sseci=cmmi12 scaled \magstephalf ! ! \font\ssecsy=cmsy10 scaled 1315 ! % The smallcaps and symbol fonts should actually be scaled \magstep1.5, ! % but that is not a standard magnification. ! ! % In order for the font changes to affect most math symbols and letters, ! % we have to define the \textfont of the standard families. Since ! *************** where each line of input produces a line ! *** 1042,1073 **** ! % of just \STYLE. We do this so that font changes will continue to work ! % in math mode, where it is the current \fam that is relevant in most ! ! % cases, not the current. Plain TeX does, for example, ! ! % \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need ! ! % to redefine \bf itself. ! \def\textfonts{% ! \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl ! \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc ! ! \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy ! \resetmathfonts} ! \def\chapfonts{% ! \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl ! \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc ! ! \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy ! ! \resetmathfonts} ! \def\secfonts{% ! \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl ! \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc ! ! \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy ! ! \resetmathfonts} ! \def\subsecfonts{% ! \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl ! \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc ! ! \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy ! ! \resetmathfonts} ! \def\indexfonts{% ! \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl ! \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc ! ! \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy ! ! \resetmathfonts} ! ! % Set up the default fonts, so we can use them for creating boxes. ! --- 1223,1262 ---- ! % of just \STYLE. We do this so that font changes will continue to work ! % in math mode, where it is the current \fam that is relevant in most ! ! % cases, not the current font. Plain TeX does \def\bf{\fam=\bffam ! ! % \tenbf}, for example. By redefining \tenbf, we obviate the need to ! ! % redefine \bf itself. ! \def\textfonts{% ! \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl ! \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc ! ! \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl ! \resetmathfonts} ! + \def\titlefonts{% ! + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl ! + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc ! + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy ! + \let\tenttsl=\titlettsl ! + \resetmathfonts \setleading{25pt}} ! + \def\titlefont#1{{\titlefonts\rm #1}} ! \def\chapfonts{% ! \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl ! \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc ! ! \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl ! ! \resetmathfonts \setleading{19pt}} ! \def\secfonts{% ! \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl ! \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc ! ! \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl ! ! \resetmathfonts \setleading{16pt}} ! \def\subsecfonts{% ! \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl ! \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc ! ! \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl ! ! \resetmathfonts \setleading{15pt}} ! ! \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? ! \def\indexfonts{% ! \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl ! \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc ! ! \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl ! ! \resetmathfonts \setleading{12pt}} ! ! % Set up the default fonts, so we can use them for creating boxes. ! *************** where each line of input produces a line ! *** 1079,1085 **** ! ! % Fonts for short table of contents. ! ! \setfont\shortcontrm{r12} ! ! \setfont\shortcontbf{bx12} ! ! \setfont\shortcontsl{sl12} ! ! %% Add scribe-like font environments, plus @l for inline lisp (usually sans ! --- 1268,1274 ---- ! ! % Fonts for short table of contents. ! ! \setfont\shortcontrm\rmshape{12}{1000} ! ! \setfont\shortcontbf\bxshape{12}{1000} ! ! \setfont\shortcontsl\slshape{12}{1000} ! ! %% Add scribe-like font environments, plus @l for inline lisp (usually sans ! *************** where each line of input produces a line ! *** 1113,1117 **** ! \let\ttfont=\t ! \def\samp #1{`\tclose{#1}'\null} ! ! \def\key #1{{\tt \nohyphenation \uppercase{#1}}\null} ! \def\ctrl #1{{\tt \rawbackslash \hat}#1} ! ! --- 1302,1315 ---- ! \let\ttfont=\t ! \def\samp #1{`\tclose{#1}'\null} ! ! \setfont\smallrm\rmshape{8}{1000} ! ! \font\smallsy=cmsy9 ! ! \def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% ! ! \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{% ! ! \vbox{\hrule\kern-0.4pt ! ! \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}% ! ! \kern-0.4pt\hrule}% ! ! \kern-.06em\raise0.4pt\hbox{$\rangle$}}}} ! ! % The old definition, with no lozenge: ! ! %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} ! \def\ctrl #1{{\tt \rawbackslash \hat}#1} ! ! *************** where each line of input produces a line ! *** 1142,1146 **** ! ! % We *must* turn on hyphenation at `-' and `_' in \code. ! ! % Otherwise, it is too hard to avoid overful hboxes ! % in the Emacs manual, the Library manual, etc. ! ! --- 1340,1344 ---- ! ! % We *must* turn on hyphenation at `-' and `_' in \code. ! ! % Otherwise, it is too hard to avoid overfull hboxes ! % in the Emacs manual, the Library manual, etc. ! ! *************** where each line of input produces a line ! *** 1148,1156 **** ! % both hyphenation at - and hyphenation within words. ! % We must therefore turn them both off (\tclose does that) ! ! % and arrange explicitly to hyphenate an a dash. ! % -- rms. ! { ! \catcode`\-=\active ! \catcode`\_=\active ! \global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} ! % The following is used by \doprintindex to insure that long function names ! --- 1346,1355 ---- ! % both hyphenation at - and hyphenation within words. ! % We must therefore turn them both off (\tclose does that) ! ! % and arrange explicitly to hyphenate at a dash. ! % -- rms. ! { ! \catcode`\-=\active ! \catcode`\_=\active ! + \catcode`\|=\active ! \global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} ! % The following is used by \doprintindex to insure that long function names ! *************** where each line of input produces a line ! *** 1158,1168 **** ! % read from the file, as \entry parses the arguments long before \code is ! % ever called. -- mycroft ! ! \global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder} ! } ! ! \def\realdash{-} ! - \def\realunder{_} ! \def\codedash{-\discretionary{}{}{}} ! ! \def\codeunder{\normalunderscore\discretionary{}{}{}} ! \def\codex #1{\tclose{#1}\endgroup} ! ! --- 1357,1371 ---- ! % read from the file, as \entry parses the arguments long before \code is ! % ever called. -- mycroft ! ! % _ is always active; and it shouldn't be \let = to an _ that is a ! ! % subscript character anyway. Then, @cindex @samp{_} (for example) ! ! % fails. --karl ! ! \global\def\indexbreaks{% ! ! \catcode`\-=\active \let-\realdash ! ! } ! } ! ! \def\realdash{-} ! \def\codedash{-\discretionary{}{}{}} ! ! \def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} ! \def\codex #1{\tclose{#1}\endgroup} ! ! *************** where each line of input produces a line ! *** 1172,1180 **** ! % then @kbd has no effect. ! ! \def\xkey{\key} ! \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% ! \ifx\one\xkey\ifx\threex\three \key{#2}% ! ! \else\tclose{\look}\fi ! ! \else\tclose{\look}\fi} ! ! % Typeset a dimension, e.g., `in' or `pt'. The only reason for the ! --- 1375,1434 ---- ! % then @kbd has no effect. ! ! + % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), ! + % `example' (@kbd uses ttsl only inside of @example and friends), ! + % or `code' (@kbd uses normal tty font always). ! + \def\kbdinputstyle{\parsearg\kbdinputstylexxx} ! + \def\kbdinputstylexxx#1{% ! + \def\arg{#1}% ! + \ifx\arg\worddistinct ! + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% ! + \else\ifx\arg\wordexample ! + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% ! + \else\ifx\arg\wordcode ! + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% ! + \fi\fi\fi ! + } ! + \def\worddistinct{distinct} ! + \def\wordexample{example} ! + \def\wordcode{code} ! + ! + % Default is kbdinputdistinct. (Too much of a hassle to call the macro, ! + % the catcodes are wrong for parsearg to work.) ! + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} ! + ! \def\xkey{\key} ! \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% ! \ifx\one\xkey\ifx\threex\three \key{#2}% ! ! \else{\tclose{\kbdfont\look}}\fi ! ! \else{\tclose{\kbdfont\look}}\fi} ! ! ! ! % @url. Quotes do not seem necessary, so use \code. ! ! \let\url=\code ! ! ! ! % @uref (abbreviation for `urlref') takes an optional second argument ! ! % specifying the text to display. First (mandatory) arg is the url. ! ! % Perhaps eventually put in a hypertex \special here. ! ! % ! ! \def\uref#1{\urefxxx #1,,\finish} ! ! \def\urefxxx#1,#2,#3\finish{% ! ! \setbox0 = \hbox{\ignorespaces #2}% ! ! \ifdim\wd0 > 0pt ! ! \unhbox0\ (\code{#1})% ! ! \else ! ! \code{#1}% ! ! \fi ! ! } ! ! ! ! % rms does not like the angle brackets --karl, 17may97. ! ! % So now @email is just like @uref. ! ! %\def\email#1{$\langle${\tt #1}$\rangle$} ! ! \let\email=\uref ! ! ! ! % Check if we are currently using a typewriter font. Since all the ! ! % Computer Modern typewriter fonts have zero interword stretch (and ! ! % shrink), and it is reasonable to expect all typewriter fonts to have ! ! % this property, we can check that font parameter. ! ! % ! ! \def\ifmonospace{\ifdim\fontdimen3\font=0pt } ! ! % Typeset a dimension, e.g., `in' or `pt'. The only reason for the ! *************** where each line of input produces a line ! *** 1186,1195 **** ! \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} ! ! ! \def\l#1{{\li #1}\null} % ! ! ! \def\r#1{{\rm #1}} % roman font ! % Use of \lowercase was suggested. ! ! \def\sc#1{{\smallcaps#1}} % smallcaps font ! ! \def\ii#1{{\it #1}} % italic font ! ! \message{page headings,} ! --- 1440,1456 ---- ! \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} ! ! ! % @l was never documented to mean ``switch to the Lisp font'', ! ! % and it is not used as such in any manual I can find. We need it for ! ! % Polish suppressed-l. --karl, 22sep96. ! ! %\def\l#1{{\li #1}\null} ! ! ! \def\r#1{{\rm #1}} % roman font ! % Use of \lowercase was suggested. ! ! \def\sc#1{{\smallcaps#1}} % smallcaps font ! ! \def\ii#1{{\it #1}} % italic font ! ! ! ! % @pounds{} is a sterling sign. ! ! \def\pounds{{\it\$}} ! ! ! ! \message{page headings,} ! *************** where each line of input produces a line ! *** 1199,1204 **** ! ! % First the title page. Must do @settitle before @titlepage. ! - \def\titlefont#1{{\titlerm #1}} ! - ! \newif\ifseenauthor ! \newif\iffinishedtitlepage ! --- 1460,1463 ---- ! *************** where each line of input produces a line ! *** 1206,1210 **** ! \def\shorttitlepage{\parsearg\shorttitlepagezzz} ! \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% ! ! \endgroup\page\hbox{}\page} ! ! \def\titlepage{\begingroup \parindent=0pt \textfonts ! --- 1465,1469 ---- ! \def\shorttitlepage{\parsearg\shorttitlepagezzz} ! \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% ! ! \endgroup\page\hbox{}\page} ! ! \def\titlepage{\begingroup \parindent=0pt \textfonts ! *************** where each line of input produces a line ! *** 1222,1229 **** ! % Now you can print the title using @title. ! \def\title{\parsearg\titlezzz}% ! ! \def\titlezzz##1{\leftline{\titlefont{##1}} ! ! % print a rule at the page bottom also. ! ! \finishedtitlepagefalse ! ! \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% ! % No rule at page bottom unless we print one at the top with @title. ! \finishedtitlepagetrue ! --- 1481,1488 ---- ! % Now you can print the title using @title. ! \def\title{\parsearg\titlezzz}% ! ! \def\titlezzz##1{\leftline{\titlefonts\rm ##1} ! ! % print a rule at the page bottom also. ! ! \finishedtitlepagefalse ! ! \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% ! % No rule at page bottom unless we print one at the top with @title. ! \finishedtitlepagetrue ! *************** where each line of input produces a line ! *** 1243,1247 **** ! \def\page{% ! \iffinishedtitlepage\else ! ! \finishtitlepage ! \fi ! \oldpage ! --- 1502,1506 ---- ! \def\page{% ! \iffinishedtitlepage\else ! ! \finishtitlepage ! \fi ! \oldpage ! *************** where each line of input produces a line ! *** 1311,1318 **** ! \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! ! ! \gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} ! ! \gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% ! ! \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} ! ! \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! ! \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} ! --- 1570,1574 ---- ! \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! ! ! \gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% ! ! \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} ! *************** where each line of input produces a line ! *** 1322,1342 **** ! \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} ! \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% ! ! \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! ! ! \gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} ! ! \gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% ! ! \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} ! ! \global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} ! % ! }% unbind the catcode of @. ! ! ! % @headings double turns headings on for double-sided printing. ! ! % @headings single turns headings on for single-sided printing. ! ! % @headings off turns them off. ! ! % @headings on same as @headings double, retained for compatibility. ! ! % @headings after turns on double-sided headings after this page. ! ! % @headings doubleafter turns on double-sided headings after this page. ! % @headings singleafter turns on single-sided headings after this page. ! ! % By default, they are off. ! ! \def\headings #1 {\csname HEADINGS#1\endcsname} ! --- 1578,1602 ---- ! \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} ! \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% ! ! \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% ! ! % ! ! % Leave some space for the footline. Hopefully ok to assume ! ! % @evenfooting will not be used by itself. ! ! \global\advance\pageheight by -\baselineskip ! ! \global\advance\vsize by -\baselineskip ! ! } ! ! ! \gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} ! % ! }% unbind the catcode of @. ! ! ! % @headings double turns headings on for double-sided printing. ! ! % @headings single turns headings on for single-sided printing. ! ! % @headings off turns them off. ! ! % @headings on same as @headings double, retained for compatibility. ! ! % @headings after turns on double-sided headings after this page. ! ! % @headings doubleafter turns on double-sided headings after this page. ! % @headings singleafter turns on single-sided headings after this page. ! ! % By default, they are off at the start of a document, ! ! % and turned `on' after @end titlepage. ! ! \def\headings #1 {\csname HEADINGS#1\endcsname} ! *************** where each line of input produces a line ! *** 1352,1356 **** ! % edge of all pages. ! \def\HEADINGSdouble{ ! - %\pagealignmacro ! \global\pageno=1 ! \global\evenfootline={\hfil} ! --- 1612,1615 ---- ! *************** where each line of input produces a line ! *** 1358,1366 **** ! \global\evenheadline={\line{\folio\hfil\thistitle}} ! \global\oddheadline={\line{\thischapter\hfil\folio}} ! } ! % For single-sided printing, chapter title goes across top left of page, ! % page number on top right. ! \def\HEADINGSsingle{ ! - %\pagealignmacro ! \global\pageno=1 ! \global\evenfootline={\hfil} ! --- 1617,1627 ---- ! \global\evenheadline={\line{\folio\hfil\thistitle}} ! \global\oddheadline={\line{\thischapter\hfil\folio}} ! + \global\let\contentsalignmacro = \chapoddpage ! } ! + \let\contentsalignmacro = \chappager ! + ! % For single-sided printing, chapter title goes across top left of page, ! % page number on top right. ! \def\HEADINGSsingle{ ! \global\pageno=1 ! \global\evenfootline={\hfil} ! *************** where each line of input produces a line ! *** 1368,1371 **** ! --- 1629,1633 ---- ! \global\evenheadline={\line{\thischapter\hfil\folio}} ! \global\oddheadline={\line{\thischapter\hfil\folio}} ! + \global\let\contentsalignmacro = \chappager ! } ! \def\HEADINGSon{\HEADINGSdouble} ! *************** where each line of input produces a line ! *** 1378,1381 **** ! --- 1640,1644 ---- ! \global\evenheadline={\line{\folio\hfil\thistitle}} ! \global\oddheadline={\line{\thischapter\hfil\folio}} ! + \global\let\contentsalignmacro = \chapoddpage ! } ! ! *************** where each line of input produces a line ! *** 1386,1389 **** ! --- 1649,1653 ---- ! \global\evenheadline={\line{\thischapter\hfil\folio}} ! \global\oddheadline={\line{\thischapter\hfil\folio}} ! + \global\let\contentsalignmacro = \chappager ! } ! ! *************** July\or August\or September\or October\o ! *** 1409,1412 **** ! --- 1673,1677 ---- ! \def\settitlezzz #1{\gdef\thistitle{#1}} ! ! + ! \message{tables,} ! ! *************** July\or August\or September\or October\o ! *** 1441,1445 **** ! \newif\ifitemxneedsnegativevskip ! ! ! \def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi} ! ! \def\internalBitem{\smallbreak \parsearg\itemzzz} ! --- 1706,1710 ---- ! \newif\ifitemxneedsnegativevskip ! ! ! \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} ! ! \def\internalBitem{\smallbreak \parsearg\itemzzz} ! *************** July\or August\or September\or October\o ! *** 1705,1709 **** ! \advance\itemno by 1 ! {\let\par=\endgraf \smallbreak}% ! ! \ifhmode \errmessage{\in hmode at itemizeitem}\fi ! {\parskip=0in \hskip 0pt ! \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% ! --- 1970,1974 ---- ! \advance\itemno by 1 ! {\let\par=\endgraf \smallbreak}% ! ! \ifhmode \errmessage{In hmode at itemizeitem}\fi ! {\parskip=0in \hskip 0pt ! \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% ! *************** July\or August\or September\or October\o ! *** 1712,1719 **** ! ! % @multitable macros ! ! % Amy Hendrickson, 8/18/94 ! % ! ! % @multitable ... @endmultitable will make as many columns as desired. ! ! % Contents of each column will wrap at width given in preamble. Width ! % can be specified either with sample text given in a template line, ! % or in percent of \hsize, the current width of text on page. ! --- 1977,1984 ---- ! ! % @multitable macros ! ! % Amy Hendrickson, 8/18/94, 3/6/96 ! % ! ! % @multitable ... @end multitable will make as many columns as desired. ! ! % Contents of each column will wrap at width given in preamble. Width ! % can be specified either with sample text given in a template line, ! % or in percent of \hsize, the current width of text on page. ! *************** July\or August\or September\or October\o ! *** 1723,1746 **** ! % To make preamble: ! % ! ! % Either define widths of columns in terms of percent of \hsize: ! ! % @multitable @percentofhsize .2 .3 .5 ! % @item ... ! % ! ! % Numbers following @percentofhsize are the percent of the total ! % current hsize to be used for each column. You may use as many ! % columns as desired. ! ! % Or use a template: ! % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! % @item ... ! % using the widest term desired in each column. ! ! ! ! ! % Each new table line starts with @item, each subsequent new column ! % starts with @tab. Empty columns may be produced by supplying @tab's ! % with nothing between them for as many times as empty columns are needed, ! % ie, @tab@tab@tab will produce two empty columns. ! ! ! % @item, @tab, @multicolumn or @endmulticolumn do not need to be on their ! % own lines, but it will not hurt if they are. ! ! --- 1988,2021 ---- ! % To make preamble: ! % ! ! % Either define widths of columns in terms of percent of \hsize: ! ! % @multitable @columnfractions .25 .3 .45 ! % @item ... ! % ! ! % Numbers following @columnfractions are the percent of the total ! % current hsize to be used for each column. You may use as many ! % columns as desired. ! ! + ! % Or use a template: ! % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! % @item ... ! % using the widest term desired in each column. ! + % ! + % For those who want to use more than one line's worth of words in ! + % the preamble, break the line within one argument and it ! + % will parse correctly, i.e., ! + % ! + % @multitable {Column 1 template} {Column 2 template} {Column 3 ! + % template} ! + % Not: ! + % @multitable {Column 1 template} {Column 2 template} ! + % {Column 3 template} ! ! ! % Each new table line starts with @item, each subsequent new column ! % starts with @tab. Empty columns may be produced by supplying @tab's ! % with nothing between them for as many times as empty columns are needed, ! % ie, @tab@tab@tab will produce two empty columns. ! ! ! % @item, @tab, @multitable or @end multitable do not need to be on their ! % own lines, but it will not hurt if they are. ! ! *************** July\or August\or September\or October\o ! *** 1749,1782 **** ! % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! % @item first col stuff @tab second col stuff @tab third col ! ! % @item ! ! % first col stuff ! ! % @tab ! ! % second col stuff ! ! % @tab ! ! % third col ! ! % @item first col stuff @tab second col stuff ! % @tab Many paragraphs of text may be used in any column. ! ! % ! % They will wrap at the width determined by the template. ! % @item@tab@tab This will be in third column. ! ! % @endmultitable ! ! % Default dimensions may be reset by user. ! ! % @intableparskip will set vertical space between paragraphs in table. ! ! % @intableparindent will set paragraph indent in table. ! ! % @spacebetweencols will set horizontal space to be left between columns. ! ! % @spacebetweenlines will set vertical space to be left between lines. ! ! %%%% ! ! % Dimensions ! ! ! \newdimen\intableparskip ! ! \newdimen\intableparindent ! ! \newdimen\spacebetweencols ! ! \newdimen\spacebetweenlines ! ! \intableparskip=0pt ! ! \intableparindent=6pt ! ! \spacebetweencols=12pt ! ! \spacebetweenlines=12pt ! ! %%%% ! --- 2024,2059 ---- ! % @multitable {Column 1 template} {Column 2 template} {Column 3 template} ! % @item first col stuff @tab second col stuff @tab third col ! ! % @item ! ! % first col stuff ! ! % @tab ! ! % second col stuff ! ! % @tab ! ! % third col ! ! % @item first col stuff @tab second col stuff ! % @tab Many paragraphs of text may be used in any column. ! ! % ! % They will wrap at the width determined by the template. ! % @item@tab@tab This will be in third column. ! ! % @end multitable ! ! % Default dimensions may be reset by user. ! ! % @multitableparskip is vertical space between paragraphs in table. ! ! % @multitableparindent is paragraph indent in table. ! ! % @multitablecolmargin is horizontal space to be left between columns. ! ! % @multitablelinespace is space to leave between table items, baseline ! ! % to baseline. ! ! % 0pt means it depends on current normal line spacing. ! ! %%%% ! ! % Dimensions ! ! ! \newskip\multitableparskip ! ! \newskip\multitableparindent ! ! \newdimen\multitablecolspace ! ! \newskip\multitablelinespace ! ! \multitableparskip=0pt ! ! \multitableparindent=6pt ! ! \multitablecolspace=12pt ! ! \multitablelinespace=0pt ! ! %%%% ! *************** July\or August\or September\or October\o ! *** 1784,1841 **** ! \let\endsetuptable\relax ! \def\xendsetuptable{\endsetuptable} ! ! \let\percentofhsize\relax ! ! \def\xpercentofhsize{\percentofhsize} ! \newif\ifsetpercent ! ! \newcount\colcount ! \def\setuptable#1{\def\firstarg{#1}% ! \ifx\firstarg\xendsetuptable\let\go\relax% ! \else ! ! \ifx\firstarg\xpercentofhsize\global\setpercenttrue% ! \else ! \ifsetpercent ! ! \if#1.\else% ! ! \global\advance\colcount by1 % ! ! \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% ! ! \fi ! \else ! \global\advance\colcount by1 ! ! \setbox0=\hbox{#1}% ! \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% ! \fi% ! \fi% ! ! \let\go\setuptable% ! \fi\go} ! %%%% ! % multitable syntax ! ! \def\tab{&} ! ! %%%% ! ! % @multitable ... @endmultitable definitions: ! ! ! \def\multitable#1\item{\bgroup ! \let\item\cr ! \tolerance=9500 ! \hbadness=9500 ! ! \parskip=\intableparskip ! ! \parindent=\intableparindent ! \overfullrule=0pt ! \global\colcount=0\relax% ! \def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% ! % To parse everything between @multitable and @item : ! ! \def\one{#1}\expandafter\setuptable\one\endsetuptable ! % Need to reset this to 0 after \setuptable. ! ! \global\colcount=0\relax% ! % ! % This preamble sets up a generic column definition, which will ! % be used as many times as user calls for columns. ! ! % \vtop will set a single line and will also let text wrap and ! % continue for many paragraphs if desired. ! \halign\bgroup&\global\advance\colcount by 1\relax% ! ! \vtop{\hsize=\expandafter\csname col\the\colcount\endcsname ! % In order to keep entries from bumping into each other ! ! % we will add a \leftskip of \spacebetweencols to all columns after ! % the first one. ! ! % If a template has been used, we will add \spacebetweencols ! % to the width of each template entry. ! % If user has set preamble in terms of percent of \hsize ! --- 2061,2131 ---- ! \let\endsetuptable\relax ! \def\xendsetuptable{\endsetuptable} ! ! \let\columnfractions\relax ! ! \def\xcolumnfractions{\columnfractions} ! \newif\ifsetpercent ! ! + %% 2/1/96, to allow fractions to be given with more than one digit. ! + \def\pickupwholefraction#1 {\global\advance\colcount by1 % ! + \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% ! + \setuptable} ! + ! \newcount\colcount ! \def\setuptable#1{\def\firstarg{#1}% ! \ifx\firstarg\xendsetuptable\let\go\relax% ! \else ! ! \ifx\firstarg\xcolumnfractions\global\setpercenttrue% ! \else ! \ifsetpercent ! ! \let\go\pickupwholefraction % In this case arg of setuptable ! ! % is the decimal point before the ! ! % number given in percent of hsize. ! ! % We don't need this so we don't use it. ! \else ! \global\advance\colcount by1 ! ! \setbox0=\hbox{#1 }% Add a normal word space as a separator; ! ! % typically that is always in the input, anyway. ! \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% ! \fi% ! \fi% ! ! \ifx\go\pickupwholefraction\else\let\go\setuptable\fi% ! \fi\go} ! + ! %%%% ! % multitable syntax ! ! \def\tab{&\hskip1sp\relax} % 2/2/96 ! ! % tiny skip here makes sure this column space is ! ! % maintained, even if it is never used. ! ! ! ! %%%% ! ! % @multitable ... @end multitable definitions: ! ! ! \def\multitable{\parsearg\dotable} ! ! ! ! \def\dotable#1{\bgroup ! \let\item\cr ! \tolerance=9500 ! \hbadness=9500 ! ! \setmultitablespacing ! ! \parskip=\multitableparskip ! ! \parindent=\multitableparindent ! \overfullrule=0pt ! \global\colcount=0\relax% ! \def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% ! % To parse everything between @multitable and @item : ! ! \setuptable#1 \endsetuptable ! % Need to reset this to 0 after \setuptable. ! ! \global\colcount=0\relax% ! % ! % This preamble sets up a generic column definition, which will ! % be used as many times as user calls for columns. ! ! % \vtop will set a single line and will also let text wrap and ! % continue for many paragraphs if desired. ! \halign\bgroup&\global\advance\colcount by 1\relax% ! ! \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname ! % In order to keep entries from bumping into each other ! ! % we will add a \leftskip of \multitablecolspace to all columns after ! % the first one. ! ! % If a template has been used, we will add \multitablecolspace ! % to the width of each template entry. ! % If user has set preamble in terms of percent of \hsize ! *************** July\or August\or September\or October\o ! *** 1849,1866 **** ! \else ! % If user has set preamble in terms of percent of \hsize ! ! % we will advance \hsize by \spacebetweencols ! ! \advance\hsize by \spacebetweencols ! \fi ! ! % In either case we will make \leftskip=\spacebetweencols: ! ! \leftskip=\spacebetweencols ! \fi ! ! \noindent##}\cr% ! % \everycr will reset column counter, \colcount, at the end of ! ! % each line. Every column entry will cause \colcount to advance by one. ! % The table preamble ! % looks at the current \colcount to find the correct column width. ! ! \global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines ! ! \filbreak%% keeps underfull box messages off when table breaks over pages. ! ! \global\colcount=0\relax}}} ! ! \message{indexing,} ! --- 2139,2194 ---- ! \else ! % If user has set preamble in terms of percent of \hsize ! ! % we will advance \hsize by \multitablecolspace ! ! \advance\hsize by \multitablecolspace ! \fi ! ! % In either case we will make \leftskip=\multitablecolspace: ! ! \leftskip=\multitablecolspace ! \fi ! ! % Ignoring space at the beginning and end avoids an occasional spurious ! ! % blank line, when TeX decides to break the line at the space before the ! ! % box from the multistrut, so the strut ends up on a line by itself. ! ! % For example: ! ! % @multitable @columnfractions .11 .89 ! ! % @item @code{#} ! ! % @tab Legal holiday which is valid in major parts of the whole country. ! ! % Is automatically provided with highlighting sequences respectively marking ! ! % characters. ! ! \noindent\ignorespaces##\unskip\multistrut}\cr ! % \everycr will reset column counter, \colcount, at the end of ! ! % each line. Every column entry will cause \colcount to advance by one. ! % The table preamble ! % looks at the current \colcount to find the correct column width. ! ! \global\everycr{\noalign{% ! ! % \filbreak%% keeps underfull box messages off when table breaks over pages. ! ! % Maybe so, but it also creates really weird page breaks when the table ! ! % breaks over pages Wouldn't \vfil be better? Wait until the problem ! ! % manifests itself, so it can be fixed for real --karl. ! ! \global\colcount=0\relax}} ! ! } ! ! ! ! \def\setmultitablespacing{% test to see if user has set \multitablelinespace. ! ! % If so, do nothing. If not, give it an appropriate dimension based on ! ! % current baselineskip. ! ! \ifdim\multitablelinespace=0pt ! ! %% strut to put in table in case some entry doesn't have descenders, ! ! %% to keep lines equally spaced ! ! \let\multistrut = \strut ! ! %% Test to see if parskip is larger than space between lines of ! ! %% table. If not, do nothing. ! ! %% If so, set to same dimension as multitablelinespace. ! ! \else ! ! \gdef\multistrut{\vrule height\multitablelinespace depth\dp0 ! ! width0pt\relax} \fi ! ! \ifdim\multitableparskip>\multitablelinespace ! ! \global\multitableparskip=\multitablelinespace ! ! \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller ! ! %% than skip between lines in the table. ! ! \fi% ! ! \ifdim\multitableparskip=0pt ! ! \global\multitableparskip=\multitablelinespace ! ! \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller ! ! %% than skip between lines in the table. ! ! \fi} ! ! ! ! \message{indexing,} ! *************** July\or August\or September\or October\o ! *** 1876,1880 **** ! % \fooindex ...rest of line... puts an entry in the index foo. ! % It also defines \fooindfile to be the number of the output channel for ! ! % the file that accumulates this index. The file's extension is foo. ! % The name of an index should be no more than 2 characters long ! % for the sake of vms. ! --- 2204,2208 ---- ! % \fooindex ...rest of line... puts an entry in the index foo. ! % It also defines \fooindfile to be the number of the output channel for ! ! % the file that accumulates this index. The file's extension is foo. ! % The name of an index should be no more than 2 characters long ! % for the sake of vms. ! *************** July\or August\or September\or October\o ! *** 1882,1887 **** ! \def\newindex #1{ ! \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file ! ! \openout \csname#1indfile\endcsname \jobname.#1 % Open the file ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\doindex {#1}} ! } ! --- 2210,2215 ---- ! \def\newindex #1{ ! \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file ! ! \openout \csname#1indfile\endcsname \jobname.#1 % Open the file ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\doindex {#1}} ! } ! *************** July\or August\or September\or October\o ! *** 1895,1900 **** ! \def\newcodeindex #1{ ! \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file ! ! \openout \csname#1indfile\endcsname \jobname.#1 % Open the file ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\docodeindex {#1}} ! } ! --- 2223,2228 ---- ! \def\newcodeindex #1{ ! \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file ! ! \openout \csname#1indfile\endcsname \jobname.#1 % Open the file ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\docodeindex {#1}} ! } ! *************** July\or August\or September\or October\o ! *** 1907,1911 **** ! \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname ! \expandafter\let\csname#1indfile\endcsname=\synindexfoo ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\doindex {#2}}% ! } ! --- 2235,2239 ---- ! \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname ! \expandafter\let\csname#1indfile\endcsname=\synindexfoo ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\doindex {#2}}% ! } ! *************** July\or August\or September\or October\o ! *** 1916,1920 **** ! \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname ! \expandafter\let\csname#1indfile\endcsname=\synindexfoo ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\docodeindex {#2}}% ! } ! --- 2244,2248 ---- ! \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname ! \expandafter\let\csname#1indfile\endcsname=\synindexfoo ! ! \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex ! \noexpand\docodeindex {#2}}% ! } ! *************** July\or August\or September\or October\o ! *** 1964,1971 **** ! \def\ss{\realbackslash ss}% ! % Take care of texinfo commands likely to appear in an index entry. ! \def\_{{\realbackslash _}}% ! \def\w{\realbackslash w }% ! \def\bf{\realbackslash bf }% ! ! \def\rm{\realbackslash rm }% ! \def\sl{\realbackslash sl }% ! \def\sf{\realbackslash sf}% ! --- 2292,2304 ---- ! \def\ss{\realbackslash ss}% ! % Take care of texinfo commands likely to appear in an index entry. ! + % (Must be a way to avoid doing expansion at all, and thus not have to ! + % laboriously list every single command here.) ! + \def\@{@}% will be @@ when we switch to @ as escape char. ! + %\let\{ = \lbracecmd ! + %\let\} = \rbracecmd ! \def\_{{\realbackslash _}}% ! \def\w{\realbackslash w }% ! \def\bf{\realbackslash bf }% ! ! %\def\rm{\realbackslash rm }% ! \def\sl{\realbackslash sl }% ! \def\sf{\realbackslash sf}% ! *************** July\or August\or September\or October\o ! *** 1974,1988 **** ! \def\less{\realbackslash less}% ! \def\hat{\realbackslash hat}% ! ! \def\char{\realbackslash char}% ! \def\TeX{\realbackslash TeX}% ! \def\dots{\realbackslash dots }% ! ! \def\copyright{\realbackslash copyright }% ! \def\tclose##1{\realbackslash tclose {##1}}% ! \def\code##1{\realbackslash code {##1}}% ! \def\samp##1{\realbackslash samp {##1}}% ! ! \def\t##1{\realbackslash r {##1}}% ! \def\r##1{\realbackslash r {##1}}% ! \def\i##1{\realbackslash i {##1}}% ! \def\b##1{\realbackslash b {##1}}% ! \def\cite##1{\realbackslash cite {##1}}% ! \def\key##1{\realbackslash key {##1}}% ! --- 2307,2330 ---- ! \def\less{\realbackslash less}% ! \def\hat{\realbackslash hat}% ! ! %\def\char{\realbackslash char}% ! \def\TeX{\realbackslash TeX}% ! \def\dots{\realbackslash dots }% ! ! \def\result{\realbackslash result}% ! ! \def\equiv{\realbackslash equiv}% ! ! \def\expansion{\realbackslash expansion}% ! ! \def\print{\realbackslash print}% ! ! \def\error{\realbackslash error}% ! ! \def\point{\realbackslash point}% ! ! \def\copyright{\realbackslash copyright}% ! \def\tclose##1{\realbackslash tclose {##1}}% ! \def\code##1{\realbackslash code {##1}}% ! + \def\dotless##1{\realbackslash dotless {##1}}% ! \def\samp##1{\realbackslash samp {##1}}% ! ! \def\,##1{\realbackslash ,{##1}}% ! ! \def\t##1{\realbackslash t {##1}}% ! \def\r##1{\realbackslash r {##1}}% ! \def\i##1{\realbackslash i {##1}}% ! \def\b##1{\realbackslash b {##1}}% ! + \def\sc##1{\realbackslash sc {##1}}% ! \def\cite##1{\realbackslash cite {##1}}% ! \def\key##1{\realbackslash key {##1}}% ! *************** July\or August\or September\or October\o ! *** 1992,1995 **** ! --- 2334,2338 ---- ! \def\dfn##1{\realbackslash dfn {##1}}% ! \def\emph##1{\realbackslash emph {##1}}% ! + \def\value##1{\realbackslash value {##1}}% ! \unsepspaces ! } ! *************** July\or August\or September\or October\o ! *** 2009,2012 **** ! --- 2352,2356 ---- ! \def\indexnofonts{% ! % Just ignore accents. ! + \let\,=\indexdummyfont ! \let\"=\indexdummyfont ! \let\`=\indexdummyfont ! *************** July\or August\or September\or October\o ! *** 2021,2024 **** ! --- 2365,2369 ---- ! \let\v=\indexdummyfont ! \let\H=\indexdummyfont ! + \let\dotless=\indexdummyfont ! % Take care of the plain tex special European modified letters. ! \def\oe{oe}% ! *************** July\or August\or September\or October\o ! *** 2054,2057 **** ! --- 2399,2403 ---- ! \let\TeX=\indexdummytex ! \let\dots=\indexdummydots ! + \def\@{@}% ! } ! ! *************** July\or August\or September\or October\o ! *** 2069,2095 **** ! % #1 is name of index, #2 is stuff to put there ! \def\doind #1#2{% ! ! % Put the index entry in the margin if desired. ! ! \ifx\SETmarginindex\relax\else% ! ! \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% ! ! \fi% ! ! {\count10=\lastpenalty % ! ! {\indexdummies % Must do this here, since \bf, etc expand at this stage ! ! \escapechar=`\\% ! ! {\let\folio=0% Expand all macros now EXCEPT \folio ! ! \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now ! ! % so it will be output as is; and it will print as backslash in the indx. ! ! % ! ! % Now process the index-string once, with all font commands turned off, ! ! % to get the string to sort the index by. ! ! {\indexnofonts ! ! \xdef\temp1{#2}% ! ! }% ! ! % Now produce the complete index entry. We process the index-string again, ! ! % this time with font commands expanded, to get what to print in the index. ! ! \edef\temp{% ! ! \write \csname#1indfile\endcsname{% ! ! \realbackslash entry {\temp1}{\folio}{#2}}}% ! ! \temp }% ! ! }\penalty\count10}} ! ! \def\dosubind #1#2#3{% ! --- 2415,2449 ---- ! % #1 is name of index, #2 is stuff to put there ! \def\doind #1#2{% ! ! % Put the index entry in the margin if desired. ! ! \ifx\SETmarginindex\relax\else ! ! \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% ! ! \fi ! ! {% ! ! \count255=\lastpenalty ! ! {% ! ! \indexdummies % Must do this here, since \bf, etc expand at this stage ! ! \escapechar=`\\ ! ! {% ! ! \let\folio=0% We will expand all macros now EXCEPT \folio. ! ! \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now ! ! % so it will be output as is; and it will print as backslash. ! ! % ! ! % First process the index-string with all font commands turned off ! ! % to get the string to sort by. ! ! {\indexnofonts \xdef\indexsorttmp{#2}}% ! ! % ! ! % Now produce the complete index entry, with both the sort key and the ! ! % original text, including any font commands. ! ! \toks0 = {#2}% ! ! \edef\temp{% ! ! \write\csname#1indfile\endcsname{% ! ! \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% ! ! }% ! ! \temp ! ! }% ! ! }% ! ! \penalty\count255 ! ! }% ! ! } ! ! \def\dosubind #1#2#3{% ! *************** July\or August\or September\or October\o ! *** 2145,2176 **** ! % Define the macros used in formatting output of the sorted index material. ! ! ! % This is what you call to cause a particular index to get printed. ! ! % Write ! ! % @unnumbered Function Index ! ! % @printindex fn ! ! ! \def\printindex{\parsearg\doprintindex} ! ! ! ! \def\doprintindex#1{% ! ! \tex ! ! \dobreak \chapheadingskip {10000} ! ! \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other ! ! \catcode`\$=\other ! ! \catcode`\~=\other ! ! \indexbreaks ! % ! ! % The following don't help, since the chars were translated ! ! % when the raw index was written, and their fonts were discarded ! ! % due to \indexnofonts. ! ! %\catcode`\"=\active ! ! %\catcode`\^=\active ! ! %\catcode`\_=\active ! ! %\catcode`\|=\active ! ! %\catcode`\<=\active ! ! %\catcode`\>=\active ! ! % % ! ! \def\indexbackslash{\rawbackslashxx} ! ! \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt ! ! \begindoublecolumns ! % ! % See if the index file exists and is nonempty. ! --- 2499,2512 ---- ! % Define the macros used in formatting output of the sorted index material. ! ! ! % @printindex causes a particular index (the ??s file) to get printed. ! ! % It does not print any chapter heading (usually an @unnumbered). ! ! % ! \def\printindex{\parsearg\doprintindex} ! ! \def\doprintindex#1{\begingroup ! ! \dobreak \chapheadingskip{10000}% ! % ! ! \indexfonts \rm ! ! \tolerance = 9500 ! ! \indexbreaks ! % ! % See if the index file exists and is nonempty. ! *************** July\or August\or September\or October\o ! *** 2182,2186 **** ! % there is some text. ! (Index is nonexistent) ! ! \else ! % ! % If the index file exists but is empty, then \openin leaves \ifeof ! --- 2518,2522 ---- ! % there is some text. ! (Index is nonexistent) ! ! \else ! % ! % If the index file exists but is empty, then \openin leaves \ifeof ! *************** July\or August\or September\or October\o ! *** 2191,2201 **** ! (Index is empty) ! \else ! \input \jobname.#1s ! \fi ! \fi ! \closein 1 ! ! \enddoublecolumns ! ! \Etex ! ! } ! ! % These macros are used by the sorted index file itself. ! --- 2527,2544 ---- ! (Index is empty) ! \else ! + % Index files are almost Texinfo source, but we use \ as the escape ! + % character. It would be better to use @, but that's too big a change ! + % to make right now. ! + \def\indexbackslash{\rawbackslashxx}% ! + \catcode`\\ = 0 ! + \catcode`\@ = 11 ! + \escapechar = `\\ ! + \begindoublecolumns ! \input \jobname.#1s ! + \enddoublecolumns ! \fi ! \fi ! \closein 1 ! ! \endgroup} ! ! % These macros are used by the sorted index file itself. ! *************** July\or August\or September\or October\o ! *** 2288,2307 **** ! }} ! ! ! %% Define two-column mode, which is used in indexes. ! ! %% Adapted from the TeXbook, page 416. ! ! \catcode `\@=11 ! ! \newbox\partialpage ! - ! \newdimen\doublecolumnhsize ! ! ! \def\begindoublecolumns{\begingroup ! % Grab any single-column material above us. ! ! \output = {\global\setbox\partialpage ! ! =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% ! \eject ! % ! ! % Now switch to the double-column output routine. ! ! \output={\doublecolumnout}% ! % ! % Change the page size parameters. We could do this once outside this ! --- 2631,2665 ---- ! }} ! ! ! % Define two-column mode, which we use to typeset indexes. ! ! % Adapted from the TeXbook, page 416, which is to say, ! ! % the manmac.tex format used to print the TeXbook itself. ! ! \catcode`\@=11 ! ! \newbox\partialpage ! \newdimen\doublecolumnhsize ! ! ! \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns ! % Grab any single-column material above us. ! ! \output = {\global\setbox\partialpage = \vbox{% ! ! % ! ! % Here is a possibility not foreseen in manmac: if we accumulate a ! ! % whole lot of material, we might end up calling this \output ! ! % routine twice in a row (see the doublecol-lose test, which is ! ! % essentially a couple of indexes with @setchapternewpage off). In ! ! % that case, we must prevent the second \partialpage from ! ! % simply overwriting the first, causing us to lose the page. ! ! % This will preserve it until a real output routine can ship it ! ! % out. Generally, \partialpage will be empty when this runs and ! ! % this will be a no-op. ! ! \unvbox\partialpage ! ! % ! ! % Unvbox the main output page. ! ! \unvbox255 ! ! \kern-\topskip \kern\baselineskip ! ! }}% ! \eject ! % ! ! % Use the double-column output routine for subsequent pages. ! ! \output = {\doublecolumnout}% ! % ! % Change the page size parameters. We could do this once outside this ! *************** July\or August\or September\or October\o ! *** 2309,2319 **** ! % format, but then we repeat the same computation. Repeating a couple ! % of assignments once per index is clearly meaningless for the ! ! % execution time, so we may as well do it once. ! % ! % First we halve the line length, less a little for the gutter between ! % the columns. We compute the gutter based on the line length, so it ! % changes automatically with the paper format. The magic constant ! ! % below is chosen so that the gutter has the same value (well, +- < ! ! % 1pt) as it did when we hard-coded it. ! % ! % We put the result in a separate register, \doublecolumhsize, so we ! --- 2667,2677 ---- ! % format, but then we repeat the same computation. Repeating a couple ! % of assignments once per index is clearly meaningless for the ! ! % execution time, so we may as well do it in one place. ! % ! % First we halve the line length, less a little for the gutter between ! % the columns. We compute the gutter based on the line length, so it ! % changes automatically with the paper format. The magic constant ! ! % below is chosen so that the gutter has the same value (well, +-<1pt) ! ! % as it did when we hard-coded it. ! % ! % We put the result in a separate register, \doublecolumhsize, so we ! *************** July\or August\or September\or October\o ! *** 2329,2392 **** ! % since nobody clobbers \vsize.) ! \vsize = 2\vsize ! - \doublecolumnpagegoal ! } ! - ! - \def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage} ! - ! - \def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth ! - \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage ! - \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1} ! - \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3} ! - \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi ! - \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi ! - } ! - \def\doublecolumnpagegoal{% ! - \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@ ! - } ! - \def\pagesofar{\unvbox\partialpage % ! - \hsize=\doublecolumnhsize % have to restore this since output routine ! - \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} ! \def\doublecolumnout{% ! ! \setbox5=\copy255 ! ! {\vbadness=10000 \doublecolumnsplit} ! ! \ifvbox255 ! ! \setbox0=\vtop to\dimen@{\unvbox0} ! ! \setbox2=\vtop to\dimen@{\unvbox2} ! ! \onepageout\pagesofar \unvbox255 \penalty\outputpenalty ! ! \else ! ! \setbox0=\vbox{\unvbox5} ! ! \ifvbox0 ! ! \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip ! ! \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth ! ! {\vbadness=10000 ! ! \loop \global\setbox5=\copy0 ! ! \setbox1=\vsplit5 to\dimen@ ! ! \setbox3=\vsplit5 to\dimen@ ! ! \ifvbox5 \global\advance\dimen@ by1pt \repeat ! ! \setbox0=\vbox to\dimen@{\unvbox1} ! ! \setbox2=\vbox to\dimen@{\unvbox3} ! ! \global\setbox\partialpage=\vbox{\pagesofar} ! ! \doublecolumnpagegoal ! ! } ! ! \fi ! ! \fi ! } ! ! - \catcode `\@=\other ! \message{sectioning,} ! % Define chapters, sections, etc. ! ! ! \newcount \chapno ! ! \newcount \secno \secno=0 ! ! \newcount \subsecno \subsecno=0 ! ! \newcount \subsubsecno \subsubsecno=0 ! ! % This counter is funny since it counts through charcodes of letters A, B, ... ! ! \newcount \appendixno \appendixno = `\@ ! \def\appendixletter{\char\the\appendixno} ! ! ! \newwrite \contentsfile ! % This is called from \setfilename. ! ! \def\opencontents{\openout \contentsfile = \jobname.toc} ! ! % Each @chapter defines this as the name of the chapter. ! --- 2687,2754 ---- ! % since nobody clobbers \vsize.) ! \vsize = 2\vsize ! } ! \def\doublecolumnout{% ! ! \splittopskip=\topskip \splitmaxdepth=\maxdepth ! ! % Get the available space for the double columns -- the normal ! ! % (undoubled) page height minus any material left over from the ! ! % previous page. ! ! \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage ! ! % box0 will be the left-hand column, box2 the right. ! ! \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ ! ! \onepageout\pagesofar ! ! \unvbox255 ! ! \penalty\outputpenalty ! ! } ! ! \def\pagesofar{% ! ! % Re-output the contents of the output page -- any previous material, ! ! % followed by the two boxes we just split. ! ! \unvbox\partialpage ! ! \hsize = \doublecolumnhsize ! ! \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% ! ! } ! ! \def\enddoublecolumns{% ! ! \output = {\balancecolumns}\eject % split what we have ! ! \endgroup % started in \begindoublecolumns ! ! % ! ! % Back to normal single-column typesetting, but take account of the ! ! % fact that we just accumulated some stuff on the output page. ! ! \pagegoal = \vsize ! ! } ! ! \def\balancecolumns{% ! ! % Called at the end of the double column material. ! ! \setbox0 = \vbox{\unvbox255}% ! ! \dimen@ = \ht0 ! ! \advance\dimen@ by \topskip ! ! \advance\dimen@ by-\baselineskip ! ! \divide\dimen@ by 2 ! ! \splittopskip = \topskip ! ! % Loop until we get a decent breakpoint. ! ! {\vbadness=10000 \loop ! ! \global\setbox3=\copy0 ! ! \global\setbox1=\vsplit3 to\dimen@ ! ! \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt ! ! \repeat}% ! ! \setbox0=\vbox to\dimen@{\unvbox1}% ! ! \setbox2=\vbox to\dimen@{\unvbox3}% ! ! \pagesofar ! } ! + \catcode`\@ = \other ! + ! ! \message{sectioning,} ! % Define chapters, sections, etc. ! ! ! \newcount\chapno ! ! \newcount\secno \secno=0 ! ! \newcount\subsecno \subsecno=0 ! ! \newcount\subsubsecno \subsubsecno=0 ! ! % This counter is funny since it counts through charcodes of letters A, B, ... ! ! \newcount\appendixno \appendixno = `\@ ! \def\appendixletter{\char\the\appendixno} ! ! ! \newwrite\contentsfile ! % This is called from \setfilename. ! ! \def\opencontents{\openout\contentsfile = \jobname.toc } ! ! % Each @chapter defines this as the name of the chapter. ! *************** July\or August\or September\or October\o ! *** 2394,2433 **** ! ! \def\thischapter{} \def\thissection{} ! ! \def\seccheck#1{\if \pageno<0 % ! ! \errmessage{@#1 not allowed after generating table of contents}\fi ! ! % ! ! } ! ! \def\chapternofonts{% ! ! \let\rawbackslash=\relax% ! ! \let\frenchspacing=\relax% ! ! \def\result{\realbackslash result} ! ! \def\equiv{\realbackslash equiv} ! ! \def\expansion{\realbackslash expansion} ! ! \def\print{\realbackslash print} ! ! \def\TeX{\realbackslash TeX} ! ! \def\dots{\realbackslash dots} ! ! \def\copyright{\realbackslash copyright} ! ! \def\tt{\realbackslash tt} ! ! \def\bf{\realbackslash bf } ! ! \def\w{\realbackslash w} ! ! \def\less{\realbackslash less} ! ! \def\gtr{\realbackslash gtr} ! ! \def\hat{\realbackslash hat} ! ! \def\char{\realbackslash char} ! ! \def\tclose##1{\realbackslash tclose {##1}} ! ! \def\code##1{\realbackslash code {##1}} ! ! \def\samp##1{\realbackslash samp {##1}} ! ! \def\r##1{\realbackslash r {##1}} ! ! \def\b##1{\realbackslash b {##1}} ! ! \def\key##1{\realbackslash key {##1}} ! ! \def\file##1{\realbackslash file {##1}} ! ! \def\kbd##1{\realbackslash kbd {##1}} ! ! % These are redefined because @smartitalic wouldn't work inside xdef. ! ! \def\i##1{\realbackslash i {##1}} ! ! \def\cite##1{\realbackslash cite {##1}} ! ! \def\var##1{\realbackslash var {##1}} ! ! \def\emph##1{\realbackslash emph {##1}} ! ! \def\dfn##1{\realbackslash dfn {##1}} ! } ! ! --- 2756,2800 ---- ! ! \def\thischapter{} \def\thissection{} ! ! \def\seccheck#1{\ifnum \pageno<0 ! ! \errmessage{@#1 not allowed after generating table of contents}% ! ! \fi} ! ! \def\chapternofonts{% ! ! \let\rawbackslash=\relax ! ! \let\frenchspacing=\relax ! ! \def\result{\realbackslash result}% ! ! \def\equiv{\realbackslash equiv}% ! ! \def\expansion{\realbackslash expansion}% ! ! \def\print{\realbackslash print}% ! ! \def\TeX{\realbackslash TeX}% ! ! \def\dots{\realbackslash dots}% ! ! \def\result{\realbackslash result}% ! ! \def\equiv{\realbackslash equiv}% ! ! \def\expansion{\realbackslash expansion}% ! ! \def\print{\realbackslash print}% ! ! \def\error{\realbackslash error}% ! ! \def\point{\realbackslash point}% ! ! \def\copyright{\realbackslash copyright}% ! ! \def\tt{\realbackslash tt}% ! ! \def\bf{\realbackslash bf}% ! ! \def\w{\realbackslash w}% ! ! \def\less{\realbackslash less}% ! ! \def\gtr{\realbackslash gtr}% ! ! \def\hat{\realbackslash hat}% ! ! \def\char{\realbackslash char}% ! ! \def\tclose##1{\realbackslash tclose{##1}}% ! ! \def\code##1{\realbackslash code{##1}}% ! ! \def\samp##1{\realbackslash samp{##1}}% ! ! \def\r##1{\realbackslash r{##1}}% ! ! \def\b##1{\realbackslash b{##1}}% ! ! \def\key##1{\realbackslash key{##1}}% ! ! \def\file##1{\realbackslash file{##1}}% ! ! \def\kbd##1{\realbackslash kbd{##1}}% ! ! % These are redefined because @smartitalic wouldn't work inside xdef. ! ! \def\i##1{\realbackslash i{##1}}% ! ! \def\cite##1{\realbackslash cite{##1}}% ! ! \def\var##1{\realbackslash var{##1}}% ! ! \def\emph##1{\realbackslash emph{##1}}% ! ! \def\dfn##1{\realbackslash dfn{##1}}% ! } ! ! *************** July\or August\or September\or October\o ! *** 2516,2520 **** ! \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2883,2888 ---- ! \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2535,2540 **** ! \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash chapentry ! ! {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2903,2909 ---- ! \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash chapentry{\the\toks0}% ! ! {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2545,2548 **** ! --- 2914,2921 ---- ! }} ! ! + % @centerchap is like @unnumbered, but the heading is centered. ! + \outer\def\centerchap{\parsearg\centerchapyyy} ! + \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} ! + ! \outer\def\top{\parsearg\unnumberedyyy} ! \outer\def\unnumbered{\parsearg\unnumberedyyy} ! *************** July\or August\or September\or October\o ! *** 2566,2570 **** ! \gdef\thischapter{#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2939,2944 ---- ! \gdef\thischapter{#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2581,2586 **** ! \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% ! {\chapternofonts% ! \edef\temp{{\realbackslash secentry % ! ! {#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2955,2961 ---- ! \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% ! {\chapternofonts% ! + \toks0 = {#1}% ! \edef\temp{{\realbackslash secentry % ! ! {\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2596,2601 **** ! \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% ! {\chapternofonts% ! \edef\temp{{\realbackslash secentry % ! ! {#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2971,2977 ---- ! \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% ! {\chapternofonts% ! + \toks0 = {#1}% ! \edef\temp{{\realbackslash secentry % ! ! {\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2609,2613 **** ! \plainsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2985,2990 ---- ! \plainsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2622,2627 **** ! \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% ! {\chapternofonts% ! \edef\temp{{\realbackslash subsecentry % ! ! {#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 2999,3005 ---- ! \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% ! {\chapternofonts% ! + \toks0 = {#1}% ! \edef\temp{{\realbackslash subsecentry % ! ! {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2636,2641 **** ! \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% ! {\chapternofonts% ! \edef\temp{{\realbackslash subsecentry % ! ! {#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 3014,3020 ---- ! \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% ! {\chapternofonts% ! + \toks0 = {#1}% ! \edef\temp{{\realbackslash subsecentry % ! ! {\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2647,2653 **** ! \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz ! \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% ! ! \plainsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 3026,3033 ---- ! \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz ! \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% ! ! \plainsubsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2663,2668 **** ! {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash subsubsecentry % ! ! {#1} ! {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} ! {\noexpand\folio}}}% ! --- 3043,3048 ---- ! {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash subsubsecentry{\the\toks0} ! {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} ! {\noexpand\folio}}}% ! *************** July\or August\or September\or October\o ! *** 2680,2684 **** ! {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash subsubsecentry{#1}% ! {\appendixletter} ! {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% ! --- 3060,3065 ---- ! {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash subsubsecentry{\the\toks0}% ! {\appendixletter} ! {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% ! *************** July\or August\or September\or October\o ! *** 2692,2698 **** ! \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz ! \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% ! ! \plainsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! --- 3073,3080 ---- ! \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz ! \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% ! ! \plainsubsubsecheading {#1}\gdef\thissection{#1}% ! {\chapternofonts% ! ! \toks0 = {#1}% ! ! \edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}% ! \escapechar=`\\% ! \write \contentsfile \temp % ! *************** July\or August\or September\or October\o ! *** 2730,2737 **** ! % NOTE on use of \vbox for chapter headings, section headings, and ! % such: ! ! % 1) We use \vbox rather than the earlier \line to permit ! ! % overlong headings to fold. ! ! % 2) \hyphenpenalty is set to 10000 because hyphenation in a ! ! % heading is obnoxious; this forbids it. ! % 3) Likewise, headings look best if no \parindent is used, and ! % if justification is not attempted. Hence \raggedright. ! --- 3112,3119 ---- ! % NOTE on use of \vbox for chapter headings, section headings, and ! % such: ! ! % 1) We use \vbox rather than the earlier \line to permit ! ! % overlong headings to fold. ! ! % 2) \hyphenpenalty is set to 10000 because hyphenation in a ! ! % heading is obnoxious; this forbids it. ! % 3) Likewise, headings look best if no \parindent is used, and ! % if justification is not attempted. Hence \raggedright. ! *************** July\or August\or September\or October\o ! *** 2751,2759 **** ! \rm #1\hfill}}\bigskip \par\penalty 200} ! ! ! \def\heading{\parsearg\secheadingi} ! ! ! ! \def\subheading{\parsearg\subsecheadingi} ! ! ! ! \def\subsubheading{\parsearg\subsubsecheadingi} ! ! % These macros generate a chapter, section, etc. heading only ! --- 3133,3140 ---- ! \rm #1\hfill}}\bigskip \par\penalty 200} ! ! ! % @heading, @subheading, @subsubheading. ! ! \def\heading{\parsearg\plainsecheading} ! ! \def\subheading{\parsearg\plainsubsecheading} ! ! \def\subsubheading{\parsearg\plainsubsubsecheading} ! ! % These macros generate a chapter, section, etc. heading only ! *************** July\or August\or September\or October\o ! *** 2769,2773 **** ! % Parameter controlling skip before chapter headings (if needed) ! ! ! \newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt ! ! \def\chapbreak{\dobreak \chapheadingskip {-4000}} ! --- 3150,3154 ---- ! % Parameter controlling skip before chapter headings (if needed) ! ! ! \newskip\chapheadingskip ! ! \def\chapbreak{\dobreak \chapheadingskip {-4000}} ! *************** July\or August\or September\or October\o ! *** 2778,2785 **** ! --- 3159,3168 ---- ! ! \def\CHAPPAGoff{ ! + \global\let\contentsalignmacro = \chappager ! \global\let\pchapsepmacro=\chapbreak ! \global\let\pagealignmacro=\chappager} ! ! \def\CHAPPAGon{ ! + \global\let\contentsalignmacro = \chappager ! \global\let\pchapsepmacro=\chappager ! \global\let\pagealignmacro=\chappager ! *************** July\or August\or September\or October\o ! *** 2787,2790 **** ! --- 3170,3174 ---- ! ! \def\CHAPPAGodd{ ! + \global\let\contentsalignmacro = \chapoddpage ! \global\let\pchapsepmacro=\chapoddpage ! \global\let\pagealignmacro=\chapoddpage ! *************** July\or August\or September\or October\o ! *** 2795,2817 **** ! \def\CHAPFplain{ ! \global\let\chapmacro=\chfplain ! ! \global\let\unnumbchapmacro=\unnchfplain} ! ! ! \def\chfplain #1#2{% ! \pchapsepmacro ! {% ! ! \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! ! \parindent=0pt\raggedright ! ! \rm #2\enspace #1}% ! }% ! ! \bigskip ! ! \penalty5000 ! } ! ! ! \def\unnchfplain #1{% ! ! \pchapsepmacro % ! ! {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! ! \parindent=0pt\raggedright ! ! \rm #1\hfill}}\bigskip \par\penalty 10000 % ! ! } ! \CHAPFplain % The default ! ! --- 3179,3215 ---- ! \def\CHAPFplain{ ! \global\let\chapmacro=\chfplain ! ! \global\let\unnumbchapmacro=\unnchfplain ! ! \global\let\centerchapmacro=\centerchfplain} ! ! ! % Plain chapter opening. ! ! % #1 is the text, #2 the chapter number or empty if unnumbered. ! ! \def\chfplain#1#2{% ! \pchapsepmacro ! {% ! ! \chapfonts \rm ! ! \def\chapnum{#2}% ! ! \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% ! ! \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright ! ! \hangindent = \wd0 \centerparametersmaybe ! ! \unhbox0 #1\par}% ! }% ! ! \nobreak\bigskip % no page break after a chapter title ! ! \nobreak ! } ! ! ! % Plain opening for unnumbered. ! ! \def\unnchfplain#1{\chfplain{#1}{}} ! ! ! ! % @centerchap -- centered and unnumbered. ! ! \let\centerparametersmaybe = \relax ! ! \def\centerchfplain#1{{% ! ! \def\centerparametersmaybe{% ! ! \advance\rightskip by 3\rightskip ! ! \leftskip = \rightskip ! ! \parfillskip = 0pt ! ! }% ! ! \chfplain{#1}{}% ! ! }} ! ! ! \CHAPFplain % The default ! ! *************** July\or August\or September\or October\o ! *** 2827,2883 **** ! } ! ! \def\CHAPFopen{ ! \global\let\chapmacro=\chfopen ! ! \global\let\unnumbchapmacro=\unnchfopen} ! ! - % Parameter controlling skip before section headings. ! ! ! \newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt ! ! \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} ! ! ! ! \newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt ! \def\secheadingbreak{\dobreak \secheadingskip {-1000}} ! ! ! % @paragraphindent is defined for the Info formatting commands only. ! ! \let\paragraphindent=\comment ! ! ! % Section fonts are the base font at magstep2, which produces ! ! % a size a bit more than 14 points in the default situation. ! ! - \def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} ! - \def\plainsecheading #1{\secheadingi {#1}} ! - \def\secheadingi #1{{\advance \secheadingskip by \parskip % ! - \secheadingbreak}% ! - {\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! - \parindent=0pt\raggedright ! - \rm #1\hfill}}% ! - \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } ! - ! - ! - % Subsection fonts are the base font at magstep1, ! - % which produces a size of 12 points. ! - ! - \def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} ! - \def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % ! - \subsecheadingbreak}% ! - {\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! - \parindent=0pt\raggedright ! - \rm #1\hfill}}% ! - \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } ! - ! - \def\subsubsecfonts{\subsecfonts} % Maybe this should change: ! - % Perhaps make sssec fonts scaled ! - % magstep half ! - \def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} ! - \def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % ! - \subsecheadingbreak}% ! - {\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! - \parindent=0pt\raggedright ! - \rm #1\hfill}}% ! - \ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} ! ! ! - \message{toc printing,} ! ! % Finish up the main text and prepare to read what we've written ! % to \contentsfile. ! --- 3225,3285 ---- ! } ! ! + \def\centerchfopen #1{% ! + \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 ! + \parindent=0pt ! + \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 % ! + } ! + ! \def\CHAPFopen{ ! \global\let\chapmacro=\chfopen ! ! \global\let\unnumbchapmacro=\unnchfopen ! ! \global\let\centerchapmacro=\centerchfopen} ! ! ! ! % Section titles. ! ! \newskip\secheadingskip ! \def\secheadingbreak{\dobreak \secheadingskip {-1000}} ! + \def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} ! + \def\plainsecheading#1{\sectionheading{sec}{}{#1}} ! ! ! % Subsection titles. ! ! \newskip \subsecheadingskip ! ! \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} ! ! \def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} ! ! \def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} ! ! ! % Subsubsection titles. ! ! \let\subsubsecheadingskip = \subsecheadingskip ! ! \let\subsubsecheadingbreak = \subsecheadingbreak ! ! \def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} ! ! \def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} ! ! ! + % Print any size section title. ! + % ! + % #1 is the section type (sec/subsec/subsubsec), #2 is the section ! + % number (maybe empty), #3 the text. ! + \def\sectionheading#1#2#3{% ! + {% ! + \expandafter\advance\csname #1headingskip\endcsname by \parskip ! + \csname #1headingbreak\endcsname ! + }% ! + {% ! + % Switch to the right set of fonts. ! + \csname #1fonts\endcsname \rm ! + % ! + % Only insert the separating space if we have a section number. ! + \def\secnum{#2}% ! + \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% ! + % ! + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright ! + \hangindent = \wd0 % zero if no section number ! + \unhbox0 #3}% ! + }% ! + \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak ! + } ! ! ! + \message{toc printing,} ! % Finish up the main text and prepare to read what we've written ! % to \contentsfile. ! *************** July\or August\or September\or October\o ! *** 2885,2899 **** ! \newskip\contentsrightmargin \contentsrightmargin=1in ! \def\startcontents#1{% ! ! \pagealignmacro ! \immediate\closeout \contentsfile ! \ifnum \pageno>0 ! ! \pageno = -1 % Request roman numbered pages. ! \fi ! % Don't need to put `Contents' or `Short Contents' in the headline. ! % It is abundantly clear what they are. ! \unnumbchapmacro{#1}\def\thischapter{}% ! ! \begingroup % Set up to handle contents files properly. ! \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 ! ! \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi ! \raggedbottom % Worry more about breakpoints than the bottom. ! \advance\hsize by -\contentsrightmargin % Don't use the full line length. ! --- 3287,3307 ---- ! \newskip\contentsrightmargin \contentsrightmargin=1in ! \def\startcontents#1{% ! ! % If @setchapternewpage on, and @headings double, the contents should ! ! % start on an odd page, unlike chapters. Thus, we maintain ! ! % \contentsalignmacro in parallel with \pagealignmacro. ! ! % From: Torbjorn Granlund ! ! \contentsalignmacro ! \immediate\closeout \contentsfile ! \ifnum \pageno>0 ! ! \pageno = -1 % Request roman numbered pages. ! \fi ! % Don't need to put `Contents' or `Short Contents' in the headline. ! % It is abundantly clear what they are. ! \unnumbchapmacro{#1}\def\thischapter{}% ! ! \begingroup % Set up to handle contents files properly. ! \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 ! ! % We can't do this, because then an actual ^ in a section ! ! % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. ! ! %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi ! \raggedbottom % Worry more about breakpoints than the bottom. ! \advance\hsize by -\contentsrightmargin % Don't use the full line length. ! *************** July\or August\or September\or October\o ! *** 2919,2922 **** ! --- 3327,3331 ---- ! \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl ! \rm ! + \hyphenpenalty = 10000 ! \advance\baselineskip by 1pt % Open it up a little. ! \def\secentry ##1##2##3##4{} ! *************** July\or August\or September\or October\o ! *** 2962,2966 **** ! % widest letter (M) is 1em, at least in the Computer Modern fonts. ! % (This space doesn't include the extra space that gets added after ! ! % the label; that gets put in in \shortchapentry above.) ! \advance\dimen0 by 1.1em ! \hbox to \dimen0{#1\hfil}% ! --- 3371,3375 ---- ! % widest letter (M) is 1em, at least in the Computer Modern fonts. ! % (This space doesn't include the extra space that gets added after ! ! % the label; that gets put in by \shortchapentry above.) ! \advance\dimen0 by 1.1em ! \hbox to \dimen0{#1\hfil}% ! *************** July\or August\or September\or October\o ! *** 2983,2987 **** ! \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} ! ! - ! % This parameter controls the indentation of the various levels. ! \newdimen\tocindent \tocindent = 3pc ! --- 3392,3395 ---- ! *************** July\or August\or September\or October\o ! *** 2990,3002 **** ! % page number. ! % ! ! % If the toc has to be broken over pages, we would want to be at chapters ! % if at all possible; hence the \penalty. ! \def\dochapentry#1#2{% ! ! \penalty-300 \vskip\baselineskip ! \begingroup ! \chapentryfonts ! \tocentry{#1}{\dopageno{#2}}% ! \endgroup ! ! \nobreak\vskip .25\baselineskip ! } ! ! --- 3398,3410 ---- ! % page number. ! % ! ! % If the toc has to be broken over pages, we want it to be at chapters ! % if at all possible; hence the \penalty. ! \def\dochapentry#1#2{% ! ! \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip ! \begingroup ! \chapentryfonts ! \tocentry{#1}{\dopageno{#2}}% ! \endgroup ! ! \nobreak\vskip .25\baselineskip plus.1\baselineskip ! } ! ! *************** July\or August\or September\or October\o ! *** 3023,3027 **** ! % \turnoffactive is for the sake of @" used for umlauts. ! \def\tocentry#1#2{\begingroup ! ! \hyphenpenalty = 10000 ! \entry{\turnoffactive #1}{\turnoffactive #2}% ! \endgroup} ! --- 3431,3435 ---- ! % \turnoffactive is for the sake of @" used for umlauts. ! \def\tocentry#1#2{\begingroup ! ! \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks ! \entry{\turnoffactive #1}{\turnoffactive #2}% ! \endgroup} ! *************** July\or August\or September\or October\o ! *** 3048,3053 **** ! \newbox\equivbox \newbox\errorbox ! ! - \let\ptexequiv = \equiv ! - ! %{\tentt ! %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} ! --- 3456,3459 ---- ! *************** July\or August\or September\or October\o ! *** 3060,3069 **** ! %} ! ! \def\point{$\star$} ! - ! \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} ! \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} ! \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} ! - ! \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} ! ! --- 3466,3474 ---- ! %} ! ! + % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. ! \def\point{$\star$} ! \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} ! \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} ! \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} ! \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} ! ! *************** July\or August\or September\or October\o ! *** 3097,3101 **** ! \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie ! \catcode `\%=14 ! ! \catcode 43=12 ! \catcode`\"=12 ! \catcode`\==12 ! --- 3502,3506 ---- ! \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie ! \catcode `\%=14 ! ! \catcode 43=12 % plus ! \catcode`\"=12 ! \catcode`\==12 ! *************** July\or August\or September\or October\o ! *** 3105,3109 **** ! \escapechar=`\\ ! % ! ! \let\~=\ptextilde ! \let\{=\ptexlbrace ! \let\}=\ptexrbrace ! --- 3510,3514 ---- ! \escapechar=`\\ ! % ! ! \let\,=\ptexcomma ! \let\{=\ptexlbrace ! \let\}=\ptexrbrace ! *************** July\or August\or September\or October\o ! *** 3111,3118 **** ! \let\*=\ptexstar ! \let\dots=\ptexdots ! \def\@{@}% ! \let\bullet=\ptexbullet ! ! \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl ! ! \let\L=\ptexL ! % ! \let\Etex=\endgroup} ! --- 3516,3524 ---- ! \let\*=\ptexstar ! \let\dots=\ptexdots ! + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% ! + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% ! \def\@{@}% ! \let\bullet=\ptexbullet ! ! \let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext ! % ! \let\Etex=\endgroup} ! *************** July\or August\or September\or October\o ! *** 3173,3181 **** ! \def\cbr{{\hskip 6pt\circle\char'011}} ! \def\carttop{\hbox to \cartouter{\hskip\lskip ! ! \ctl\leaders\hrule height\circthick\hfil\ctr ! ! \hskip\rskip}} ! \def\cartbot{\hbox to \cartouter{\hskip\lskip ! ! \cbl\leaders\hrule height\circthick\hfil\cbr ! ! \hskip\rskip}} ! % ! \newskip\lskip\newskip\rskip ! --- 3579,3587 ---- ! \def\cbr{{\hskip 6pt\circle\char'011}} ! \def\carttop{\hbox to \cartouter{\hskip\lskip ! ! \ctl\leaders\hrule height\circthick\hfil\ctr ! ! \hskip\rskip}} ! \def\cartbot{\hbox to \cartouter{\hskip\lskip ! ! \cbl\leaders\hrule height\circthick\hfil\cbr ! ! \hskip\rskip}} ! % ! \newskip\lskip\newskip\rskip ! *************** July\or August\or September\or October\o ! *** 3183,3220 **** ! \long\def\cartouche{% ! \begingroup ! ! \lskip=\leftskip \rskip=\rightskip ! ! \leftskip=0pt\rightskip=0pt %we want these *outside*. ! ! \cartinner=\hsize \advance\cartinner by-\lskip ! ! \advance\cartinner by-\rskip ! ! \cartouter=\hsize ! ! \advance\cartouter by 18pt % allow for 3pt kerns on either ! ! % side, and for 6pt waste from ! ! % each corner char ! ! \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip ! ! % Flag to tell @lisp, etc., not to narrow margin. ! ! \let\nonarrowing=\comment ! ! \vbox\bgroup ! ! \baselineskip=0pt\parskip=0pt\lineskip=0pt ! ! \carttop ! ! \hbox\bgroup ! ! \hskip\lskip ! ! \vrule\kern3pt ! ! \vbox\bgroup ! ! \hsize=\cartinner ! ! \kern3pt ! ! \begingroup ! ! \baselineskip=\normbskip ! ! \lineskip=\normlskip ! ! \parskip=\normpskip ! ! \vskip -\parskip ! \def\Ecartouche{% ! ! \endgroup ! ! \kern3pt ! ! \egroup ! ! \kern3pt\vrule ! ! \hskip\rskip ! ! \egroup ! ! \cartbot ! ! \egroup ! \endgroup ! }} ! --- 3589,3626 ---- ! \long\def\cartouche{% ! \begingroup ! ! \lskip=\leftskip \rskip=\rightskip ! ! \leftskip=0pt\rightskip=0pt %we want these *outside*. ! ! \cartinner=\hsize \advance\cartinner by-\lskip ! ! \advance\cartinner by-\rskip ! ! \cartouter=\hsize ! ! \advance\cartouter by 18pt % allow for 3pt kerns on either ! ! % side, and for 6pt waste from ! ! % each corner char ! ! \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip ! ! % Flag to tell @lisp, etc., not to narrow margin. ! ! \let\nonarrowing=\comment ! ! \vbox\bgroup ! ! \baselineskip=0pt\parskip=0pt\lineskip=0pt ! ! \carttop ! ! \hbox\bgroup ! ! \hskip\lskip ! ! \vrule\kern3pt ! ! \vbox\bgroup ! ! \hsize=\cartinner ! ! \kern3pt ! ! \begingroup ! ! \baselineskip=\normbskip ! ! \lineskip=\normlskip ! ! \parskip=\normpskip ! ! \vskip -\parskip ! \def\Ecartouche{% ! ! \endgroup ! ! \kern3pt ! ! \egroup ! ! \kern3pt\vrule ! ! \hskip\rskip ! ! \egroup ! ! \cartbot ! ! \egroup ! \endgroup ! }} ! *************** July\or August\or September\or October\o ! *** 3252,3260 **** ! \def\nonfillfinish{\afterenvbreak\endgroup}% ! ! - % This macro is ! \def\lisp{\begingroup ! \nonfillstart ! \let\Elisp = \nonfillfinish ! \tt ! \rawbackslash % have \ input char produce \ char from current font ! \gobble ! --- 3658,3667 ---- ! \def\nonfillfinish{\afterenvbreak\endgroup}% ! ! \def\lisp{\begingroup ! \nonfillstart ! \let\Elisp = \nonfillfinish ! \tt ! + % Make @kbd do something special, if requested. ! + \let\kbdfont\kbdexamplefont ! \rawbackslash % have \ input char produce \ char from current font ! \gobble ! *************** July\or August\or September\or October\o ! *** 3279,3284 **** ! \let\Esmallexample = \nonfillfinish ! % ! ! % Smaller interline space and fonts for small examples. ! ! \setleading{10pt}% ! \indexfonts \tt ! \rawbackslash % make \ output the \ character from the current font (tt) ! --- 3686,3690 ---- ! \let\Esmallexample = \nonfillfinish ! % ! ! % Smaller fonts for small examples. ! \indexfonts \tt ! \rawbackslash % make \ output the \ character from the current font (tt) ! *************** July\or August\or September\or October\o ! *** 3375,3380 **** ! % Definitions of (, ) and & used in args for functions. ! % This is the definition of ( outside of all parentheses. ! ! \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % ! ! \global\advance\parencount by 1 } ! % ! % This is the definition of ( when already inside a level of parens. ! --- 3781,3787 ---- ! % Definitions of (, ) and & used in args for functions. ! % This is the definition of ( outside of all parentheses. ! ! \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested ! ! \global\advance\parencount by 1 ! ! } ! % ! % This is the definition of ( when already inside a level of parens. ! *************** July\or August\or September\or October\o ! *** 3382,3388 **** ! % ! \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. ! ! % also in that case restore the outer-level definition of (. ! ! \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi ! ! \global\advance \parencount by -1 } ! % If we encounter &foo, then turn on ()-hacking afterwards ! \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } ! --- 3789,3795 ---- ! % ! \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. ! ! % also in that case restore the outer-level definition of (. ! ! \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi ! ! \global\advance \parencount by -1 } ! % If we encounter &foo, then turn on ()-hacking afterwards ! \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } ! *************** July\or August\or September\or October\o ! *** 3392,3397 **** ! %% These parens (in \boldbrax) actually are a little bolder than the ! %% contained text. This is especially needed for [ and ] ! ! \def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} ! ! \def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} ! ! % First, defname, which formats the header line itself. ! --- 3799,3807 ---- ! %% These parens (in \boldbrax) actually are a little bolder than the ! %% contained text. This is especially needed for [ and ] ! ! \def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } ! ! \def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } ! ! \def\ampnr{\&} ! ! \def\lbrb{{\bf\char`\[}} ! ! \def\rbrb{{\bf\char`\]}} ! ! % First, defname, which formats the header line itself. ! *************** July\or August\or September\or October\o ! *** 3486,3490 **** ! % This is used for \def{tp,vr}parsebody. It could probably be used for ! % some of the others, too, with some judicious conditionals. ! ! % ! \def\parsebodycommon#1#2#3{% ! \begingroup\inENV % ! --- 3896,3900 ---- ! % This is used for \def{tp,vr}parsebody. It could probably be used for ! % some of the others, too, with some judicious conditionals. ! ! % ! \def\parsebodycommon#1#2#3{% ! \begingroup\inENV % ! *************** July\or August\or September\or October\o ! *** 3520,3534 **** ! ! % Fine, but then we have to eventually remove the \empty *and* the ! ! % braces (if any). That's what this does, putting the result in \tptemp. ! ! % ! ! \def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% ! ! % After \spacesplit has done its work, this is called -- #1 is the final ! % thing to call, #2 the type name (which starts with \empty), and #3 ! % (which might be empty) the arguments. ! ! % ! \def\parsetpheaderline#1#2#3{% ! ! \removeemptybraces#2\relax ! ! #1{\tptemp}{#3}% ! }% ! ! --- 3930,3943 ---- ! ! % Fine, but then we have to eventually remove the \empty *and* the ! ! % braces (if any). That's what this does. ! ! % ! ! \def\removeemptybraces\empty#1\relax{#1} ! ! % After \spacesplit has done its work, this is called -- #1 is the final ! % thing to call, #2 the type name (which starts with \empty), and #3 ! % (which might be empty) the arguments. ! ! % ! \def\parsetpheaderline#1#2#3{% ! ! #1{\removeemptybraces#2\relax}{#3}% ! }% ! ! *************** July\or August\or September\or October\o ! *** 3571,3575 **** ! #1% ! \hyphenchar\tensl=45 ! ! \ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% ! \interlinepenalty=10000 ! \advance\rightskip by 0pt plus 1fil ! --- 3980,3984 ---- ! #1% ! \hyphenchar\tensl=45 ! ! \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% ! \interlinepenalty=10000 ! \advance\rightskip by 0pt plus 1fil ! *************** July\or August\or September\or October\o ! *** 3672,3675 **** ! --- 4081,4085 ---- ! \def\defspecx #1 {\errmessage{@defspecx in invalid context}} ! \def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} ! + \def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}} ! \def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} ! ! *************** July\or August\or September\or October\o ! *** 3687,3690 **** ! --- 4097,4110 ---- ! } ! ! + % @deftypemethod foo-class return-type foo-method args ! + % ! + \def\deftypemethod{% ! + \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} ! + % ! + % #1 is the class name, #2 the data type, #3 the method name, #4 the args. ! + \def\deftypemethodheader#1#2#3#4{% ! + \deftypefnheaderx{Method on #1}{#2}#3 #4\relax ! + } ! + ! % @defmethod == @defop Method ! *************** July\or August\or September\or October\o ! *** 3764,3774 **** ! \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} ! ! ! % #1 is the data type. #2 is the name. ! \def\deftypevarheader #1#2{% ! ! \doind {vr}{\code{#2}}% Make entry in variables index ! \begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% ! \interlinepenalty=10000 ! \endgraf\penalty 10000\vskip -\parskip\penalty 10000 ! \endgroup} ! ! % @deftypevr {Global Flag} int enable ! --- 4184,4196 ---- ! \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} ! ! ! % #1 is the data type. #2 is the name, perhaps followed by text that ! ! % is actually part of the data type, which should not be put into the index. ! \def\deftypevarheader #1#2{% ! ! \dovarind#2 \relax% Make entry in variables index ! \begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% ! \interlinepenalty=10000 ! \endgraf\penalty 10000\vskip -\parskip\penalty 10000 ! \endgroup} ! + \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} ! ! % @deftypevr {Global Flag} int enable ! *************** July\or August\or September\or October\o ! *** 3776,3780 **** ! \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} ! ! ! \def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% ! \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} ! \interlinepenalty=10000 ! --- 4198,4202 ---- ! \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} ! ! ! \def\deftypevrheader #1#2#3{\dovarind#3 \relax% ! \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} ! \interlinepenalty=10000 ! *************** July\or August\or September\or October\o ! *** 3808,3811 **** ! --- 4230,4234 ---- ! \def\deftpx #1 {\errmessage{@deftpx in invalid context}} ! ! + ! \message{cross reference,} ! % Define cross-reference macros ! *************** July\or August\or September\or October\o ! *** 3815,3818 **** ! --- 4238,4246 ---- ! \newif\ifwarnedxrefs % True if we warned once that they aren't known. ! ! + % @inforef is simple. ! + \def\inforef #1{\inforefzzz #1,,,,**} ! + \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, ! + node \samp{\ignorespaces#1{}}} ! + ! % \setref{foo} defines a cross-reference point named foo. ! ! *************** July\or August\or September\or October\o ! *** 3848,3852 **** ! \ifdim \wd0 = 0pt ! % No printed node name was explicitly given. ! ! \ifx\SETxref-automatic-section-title\thisisundefined ! % Use the node name inside the square brackets. ! \def\printednodename{\ignorespaces #1}% ! --- 4276,4280 ---- ! \ifdim \wd0 = 0pt ! % No printed node name was explicitly given. ! ! \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax ! % Use the node name inside the square brackets. ! \def\printednodename{\ignorespaces #1}% ! *************** July\or August\or September\or October\o ! *** 3893,3897 **** ! % Use \turnoffactive so that punctuation chars such as underscore ! % work in node names. ! ! \def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat% ! \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% ! \next}} ! --- 4321,4325 ---- ! % Use \turnoffactive so that punctuation chars such as underscore ! % work in node names. ! ! \def\dosetq #1#2{{\let\folio=0 \turnoffactive ! \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% ! \next}} ! *************** July\or August\or September\or October\o ! *** 3962,4043 **** ! } ! - % Read the last existing aux file, if any. No error if none exists. ! - ! % This is the macro invoked by entries in the aux file. ! ! \def\xrdef #1#2{ ! ! {\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} ! ! ! \def\readauxfile{% ! ! \begingroup ! ! \catcode `\^^@=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\^^C=\other ! ! \catcode `\^^D=\other ! ! \catcode `\^^E=\other ! ! \catcode `\^^F=\other ! ! \catcode `\^^G=\other ! ! \catcode `\^^H=\other ! ! \catcode `\ =\other ! ! \catcode `\^^L=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode `\=\other ! ! \catcode 26=\other ! ! \catcode `\^^[=\other ! ! \catcode `\^^\=\other ! ! \catcode `\^^]=\other ! ! \catcode `\^^^=\other ! ! \catcode `\^^_=\other ! ! \catcode `\@=\other ! ! \catcode `\^=\other ! ! \catcode `\~=\other ! ! \catcode `\[=\other ! ! \catcode `\]=\other ! ! \catcode`\"=\other ! ! \catcode`\_=\other ! ! \catcode`\|=\other ! ! \catcode`\<=\other ! ! \catcode`\>=\other ! ! \catcode `\$=\other ! ! \catcode `\#=\other ! ! \catcode `\&=\other ! ! % `\+ does not work, so use 43. ! ! \catcode 43=\other ! ! % Make the characters 128-255 be printing characters ! ! {% ! ! \count 1=128 ! ! \def\loop{% ! ! \catcode\count 1=\other ! ! \advance\count 1 by 1 ! ! \ifnum \count 1<256 \loop \fi ! }% ! ! }% ! ! % the aux file uses ' as the escape. ! ! % Turn off \ as an escape so we do not lose on ! ! % entries which were dumped with control sequences in their names. ! ! % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ ! ! % Reference to such entries still does not work the way one would wish, ! ! % but at least they do not bomb out when the aux file is read in. ! ! \catcode `\{=1 \catcode `\}=2 ! ! \catcode `\%=\other ! ! \catcode `\'=0 ! ! \catcode`\^=7 % to make ^^e4 etc usable in xref tags ! ! \catcode `\\=\other ! ! \openin 1 \jobname.aux ! ! \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue ! ! \global\warnedobstrue ! ! \fi ! ! % Open the new aux file. Tex will close it automatically at exit. ! ! \openout \auxfile=\jobname.aux ! \endgroup} ! --- 4390,4486 ---- ! } ! % This is the macro invoked by entries in the aux file. ! ! \def\xrdef #1#2{{% ! ! \catcode`\'=\other ! ! \expandafter\gdef\csname X#1\endcsname{#2}% ! ! }} ! ! ! % Read the last existing aux file, if any. No error if none exists. ! ! \def\readauxfile{\begingroup ! ! \catcode`\^^@=\other ! ! \catcode`\^^A=\other ! ! \catcode`\^^B=\other ! ! \catcode`\^^C=\other ! ! \catcode`\^^D=\other ! ! \catcode`\^^E=\other ! ! \catcode`\^^F=\other ! ! \catcode`\^^G=\other ! ! \catcode`\^^H=\other ! ! \catcode`\^^K=\other ! ! \catcode`\^^L=\other ! ! \catcode`\^^N=\other ! ! \catcode`\^^P=\other ! ! \catcode`\^^Q=\other ! ! \catcode`\^^R=\other ! ! \catcode`\^^S=\other ! ! \catcode`\^^T=\other ! ! \catcode`\^^U=\other ! ! \catcode`\^^V=\other ! ! \catcode`\^^W=\other ! ! \catcode`\^^X=\other ! ! \catcode`\^^Z=\other ! ! \catcode`\^^[=\other ! ! \catcode`\^^\=\other ! ! \catcode`\^^]=\other ! ! \catcode`\^^^=\other ! ! \catcode`\^^_=\other ! ! \catcode`\@=\other ! ! \catcode`\^=\other ! ! % It was suggested to define this as 7, which would allow ^^e4 etc. ! ! % in xref tags, i.e., node names. But since ^^e4 notation isn't ! ! % supported in the main text, it doesn't seem desirable. Furthermore, ! ! % that is not enough: for node names that actually contain a ^ ! ! % character, we would end up writing a line like this: 'xrdef {'hat ! ! % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first ! ! % argument, and \hat is not an expandable control sequence. It could ! ! % all be worked out, but why? Either we support ^^ or we don't. ! ! % ! ! % The other change necessary for this was to define \auxhat: ! ! % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter ! ! % and then to call \auxhat in \setq. ! ! % ! ! \catcode`\~=\other ! ! \catcode`\[=\other ! ! \catcode`\]=\other ! ! \catcode`\"=\other ! ! \catcode`\_=\other ! ! \catcode`\|=\other ! ! \catcode`\<=\other ! ! \catcode`\>=\other ! ! \catcode`\$=\other ! ! \catcode`\#=\other ! ! \catcode`\&=\other ! ! % `\+ does not work, so use 43. ! ! \catcode43=\other ! ! % Make the characters 128-255 be printing characters ! ! {% ! ! \count 1=128 ! ! \def\loop{% ! ! \catcode\count 1=\other ! ! \advance\count 1 by 1 ! ! \ifnum \count 1<256 \loop \fi ! ! }% ! }% ! ! % The aux file uses ' as the escape (for now). ! ! % Turn off \ as an escape so we do not lose on ! ! % entries which were dumped with control sequences in their names. ! ! % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ ! ! % Reference to such entries still does not work the way one would wish, ! ! % but at least they do not bomb out when the aux file is read in. ! ! \catcode`\{=1 ! ! \catcode`\}=2 ! ! \catcode`\%=\other ! ! \catcode`\'=0 ! ! \catcode`\\=\other ! ! % ! ! \openin 1 \jobname.aux ! ! \ifeof 1 \else ! ! \closein 1 ! ! \input \jobname.aux ! ! \global\havexrefstrue ! ! \global\warnedobstrue ! ! \fi ! ! % Open the new aux file. TeX will close it automatically at exit. ! ! \openout\auxfile=\jobname.aux ! \endgroup} ! ! *************** July\or August\or September\or October\o ! *** 4050,4057 **** ! % vital for proper filling; pages come out unaligned when you do a ! % pagealignmacro call if that space before the closing brace is ! ! % removed. ! \def\supereject{\par\penalty -20000\footnoteno =0 } ! ! ! % @footnotestyle is meaningful for info output only.. ! \let\footnotestyle=\comment ! ! --- 4493,4501 ---- ! % vital for proper filling; pages come out unaligned when you do a ! % pagealignmacro call if that space before the closing brace is ! ! % removed. (Generally, numeric constants should always be followed by a ! ! % space to prevent strange expansion errors.) ! \def\supereject{\par\penalty -20000\footnoteno =0 } ! ! ! % @footnotestyle is meaningful for info output only. ! \let\footnotestyle=\comment ! ! *************** July\or August\or September\or October\o ! *** 4079,4083 **** ! % footnote text as a parameter. Our footnotes don't need to be so general. ! % ! ! \long\gdef\footnotezzz#1{\insert\footins{% ! % We want to typeset this text as a normal paragraph, even if the ! % footnote reference occurs in (for example) a display environment. ! --- 4523,4531 ---- ! % footnote text as a parameter. Our footnotes don't need to be so general. ! % ! ! % Oh yes, they do; otherwise, @ifset and anything else that uses ! ! % \parseargline fail inside footnotes because the tokens are fixed when ! ! % the footnote is read. --karl, 16nov96. ! ! % ! ! \long\gdef\footnotezzz{\insert\footins\bgroup ! % We want to typeset this text as a normal paragraph, even if the ! % footnote reference occurs in (for example) a display environment. ! *************** July\or August\or September\or October\o ! *** 4101,4106 **** ! % provide a place where TeX can split the footnote. ! \footstrut ! ! #1\strut}% ! } ! ! }%end \catcode `\@=11 ! --- 4549,4559 ---- ! % provide a place where TeX can split the footnote. ! \footstrut ! ! \futurelet\next\fo@t ! } ! + \def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t ! + \else\let\next\f@t\fi \next} ! + \def\f@@t{\bgroup\aftergroup\@foot\let\next} ! + \def\f@t#1{#1\@foot} ! + \def\@foot{\strut\egroup} ! ! }%end \catcode `\@=11 ! *************** July\or August\or September\or October\o ! *** 4159,4165 **** ! --- 4612,4660 ---- ! \def\finalout{\overfullrule=0pt} ! ! + % @image. We use the macros from epsf.tex to support this. ! + % If epsf.tex is not installed and @image is used, we complain. ! + % ! + % Check for and read epsf.tex up front. If we read it only at @image ! + % time, we might be inside a group, and then its definitions would get ! + % undone and the next image would fail. ! + \openin 1 = epsf.tex ! + \ifeof 1 \else ! + \closein 1 ! + \def\epsfannounce{\toks0 = }% do not bother showing banner ! + \input epsf.tex ! + \fi ! + % ! + \newif\ifwarnednoepsf ! + \newhelp\noepsfhelp{epsf.tex must be installed for images to ! + work. It is also included in the Texinfo distribution, or you can get ! + it from ftp://ftp.tug.org/tex/epsf.tex.} ! + % ! + % Only complain once about lack of epsf.tex. ! + \def\image#1{% ! + \ifx\epsfbox\undefined ! + \ifwarnednoepsf \else ! + \errhelp = \noepsfhelp ! + \errmessage{epsf.tex not found, images will be ignored}% ! + \global\warnednoepsftrue ! + \fi ! + \else ! + \imagexxx #1,,,\finish ! + \fi ! + } ! + % ! + % Arguments to @image: ! + % #1 is (mandatory) image filename; we tack on .eps extension. ! + % #2 is (optional) width, #3 is (optional) height. ! + % #4 is just the usual extra ignored arg for parsing this stuff. ! + \def\imagexxx#1,#2,#3,#4\finish{% ! + % \epsfbox itself resets \epsf?size at each figure. ! + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi ! + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi ! + \epsfbox{#1.eps}% ! + } ! ! % End of control word definitions. + ! \message{and turning on texinfo input format.} ! *************** July\or August\or September\or October\o ! *** 4175,4185 **** ! % Set some numeric style parameters, for 8.5 x 11 format. ! ! ! %\hsize = 6.5in ! \newdimen\defaultparindent \defaultparindent = 15pt ! \parindent = \defaultparindent ! ! \parskip 18pt plus 1pt ! ! \setleading{15pt} ! \advance\topskip by 1.2cm ! ! % Prevent underfull vbox error messages. ! \vbadness=10000 ! --- 4670,4685 ---- ! % Set some numeric style parameters, for 8.5 x 11 format. ! ! ! \hsize = 6in ! ! \hoffset = .25in ! \newdimen\defaultparindent \defaultparindent = 15pt ! \parindent = \defaultparindent ! ! \parskip 3pt plus 2pt minus 1pt ! ! \setleading{13.2pt} ! \advance\topskip by 1.2cm ! ! + \chapheadingskip = 15pt plus 4pt minus 2pt ! + \secheadingskip = 12pt plus 3pt minus 2pt ! + \subsecheadingskip = 9pt plus 2pt minus 2pt ! + ! % Prevent underfull vbox error messages. ! \vbadness=10000 ! *************** July\or August\or September\or October\o ! *** 4204,4231 **** ! % Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) ! \def\smallbook{ ! ! ! ! % These values for secheadingskip and subsecheadingskip are ! ! % experiments. RJC 7 Aug 1992 ! ! \global\secheadingskip = 17pt plus 6pt minus 3pt ! ! \global\subsecheadingskip = 14pt plus 6pt minus 3pt ! ! ! ! \global\lispnarrowing = 0.3in ! ! \setleading{12pt} ! ! \advance\topskip by -1cm ! ! \global\parskip 3pt plus 1pt ! ! \global\hsize = 5in ! ! \global\vsize=7.5in ! ! \global\tolerance=700 ! ! \global\hfuzz=1pt ! ! \global\contentsrightmargin=0pt ! ! \global\deftypemargin=0pt ! ! \global\defbodyindent=.5cm ! ! ! ! \global\pagewidth=\hsize ! ! \global\pageheight=\vsize ! ! ! ! \global\let\smalllisp=\smalllispx ! ! \global\let\smallexample=\smalllispx ! ! \global\def\Esmallexample{\Esmalllisp} ! } ! --- 4704,4729 ---- ! % Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) ! \def\smallbook{ ! ! \global\chapheadingskip = 15pt plus 4pt minus 2pt ! ! \global\secheadingskip = 12pt plus 3pt minus 2pt ! ! \global\subsecheadingskip = 9pt plus 2pt minus 2pt ! ! % ! ! \global\lispnarrowing = 0.3in ! ! \setleading{12pt} ! ! \advance\topskip by -1cm ! ! \global\parskip 2pt plus 1pt ! ! \global\hsize = 5in ! ! \global\vsize=7.5in ! ! \global\tolerance=700 ! ! \global\hfuzz=1pt ! ! \global\contentsrightmargin=0pt ! ! \global\deftypemargin=0pt ! ! \global\defbodyindent=.5cm ! ! % ! ! \global\pagewidth=\hsize ! ! \global\pageheight=\vsize ! ! % ! ! \global\let\smalllisp=\smalllispx ! ! \global\let\smallexample=\smalllispx ! ! \global\def\Esmallexample{\Esmalllisp} ! } ! *************** July\or August\or September\or October\o ! *** 4250,4259 **** ! } ! % Allow control of the text dimensions. Parameters in order: textheight; ! ! % textwidth; \voffset; \hoffset (!); binding offset. All require a dimension; ! % header is additional; added length extends the bottom of the page. ! ! ! \def\changepagesizes#1#2#3#4#5{ ! \global\vsize= #1 ! \advance\vsize by \topskip ! \global\voffset= #3 ! --- 4748,4764 ---- ! } ! + \bindingoffset=0pt ! + \normaloffset=\hoffset ! + \pagewidth=\hsize ! + \pageheight=\vsize ! + ! % Allow control of the text dimensions. Parameters in order: textheight; ! ! % textwidth; voffset; hoffset; binding offset; topskip. ! ! % All require a dimension; ! % header is additional; added length extends the bottom of the page. ! ! ! \def\changepagesizes#1#2#3#4#5#6{ ! \global\vsize= #1 ! + \global\topskip= #6 ! \advance\vsize by \topskip ! \global\voffset= #3 ! *************** July\or August\or September\or October\o ! *** 4268,4278 **** ! \global\bindingoffset= #5} ! ! ! % This layout is compatible with Latex on A4 paper. ! ! ! ! \def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}} ! ! % Use @afourwide to print on European A4 paper in wide format. ! \def\afourwide{\afourpaper ! ! \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}} ! ! % Define macros to output various characters with catcode for normal text. ! --- 4773,4790 ---- ! \global\bindingoffset= #5} ! ! ! % A specific text layout, 24x15cm overall, intended for A4 paper. Top margin ! ! % 29mm, hence bottom margin 28mm, nominal side margin 3cm. ! ! \def\afourlatex ! ! {\global\tolerance=700 ! ! \global\hfuzz=1pt ! ! \setleading{12pt} ! ! \global\parskip 15pt plus 1pt ! ! \advance\baselineskip by 1.6pt ! ! \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm} ! ! } ! ! % Use @afourwide to print on European A4 paper in wide format. ! \def\afourwide{\afourpaper ! ! \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}} ! ! % Define macros to output various characters with catcode for normal text. ! *************** July\or August\or September\or October\o ! *** 4317,4321 **** ! \chardef\hat=`\^ ! \catcode`\^=\active ! - \def\auxhat{\def^{'hat}} ! \def^{{\tt \hat}} ! ! --- 4829,4832 ---- ! *************** July\or August\or September\or October\o ! *** 4323,4334 **** ! \def_{\ifusingtt\normalunderscore\_} ! % Subroutine for the previous macro. ! ! \def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} ! ! ! ! % \lvvmode is equivalent in function to \leavevmode. ! ! % Using \leavevmode runs into trouble when written out to ! ! % an index file due to the expansion of \leavevmode into ``\unhbox ! ! % \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our ! ! % magic tricks with @. ! ! \def\lvvmode{\vbox to 0pt{}} ! ! \catcode`\|=\active ! --- 4834,4838 ---- ! \def_{\ifusingtt\normalunderscore\_} ! % Subroutine for the previous macro. ! ! \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} ! ! \catcode`\|=\active ! diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7.2.3.f.2/tm.texi *** gcc-2.7.2.3/tm.texi Sun Sep 3 12:59:01 1995 ! --- gcc-2.7.2.3.f.2/tm.texi Tue Sep 9 07:01:47 1997 *************** This describes the stack layout and call *** 1951,1954 **** *************** diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7. *** 12271,12277 **** @item STACK_POINTER_REGNUM The register number of the stack pointer register, which must also be a ! diff -rcp2N gcc-2.7.2.3/toplev.c gcc-2.7.2.3.f.1/toplev.c *** gcc-2.7.2.3/toplev.c Fri Oct 20 21:56:35 1995 ! --- gcc-2.7.2.3.f.1/toplev.c Fri Aug 29 09:13:14 1997 *************** int flag_unroll_loops; *** 388,391 **** --- 16340,16346 ---- @item STACK_POINTER_REGNUM The register number of the stack pointer register, which must also be a ! diff -rcp2N gcc-2.7.2.3/toplev.c gcc-2.7.2.3.f.2/toplev.c *** gcc-2.7.2.3/toplev.c Fri Oct 20 21:56:35 1995 ! --- gcc-2.7.2.3.f.2/toplev.c Tue Sep 9 07:01:47 1997 *************** int flag_unroll_loops; *** 388,391 **** *************** diff -rcp2N gcc-2.7.2.3/toplev.c gcc-2.7 *** 12419,12425 **** } ! diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2.3.f.1/tree.c *** gcc-2.7.2.3/tree.c Mon Oct 2 01:26:56 1995 ! --- gcc-2.7.2.3.f.1/tree.c Fri Aug 29 08:15:03 1997 *************** build_string (len, str) *** 1428,1436 **** --- 16488,16494 ---- } ! diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2.3.f.2/tree.c *** gcc-2.7.2.3/tree.c Mon Oct 2 01:26:56 1995 ! --- gcc-2.7.2.3.f.2/tree.c Tue Sep 9 07:01:48 1997 *************** build_string (len, str) *** 1428,1436 **** *************** diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2 *** 12975,12981 **** { unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1))); ! diff -rcp2N gcc-2.7.2.3/tree.h gcc-2.7.2.3.f.1/tree.h *** gcc-2.7.2.3/tree.h Mon Sep 25 21:49:40 1995 ! --- gcc-2.7.2.3.f.1/tree.h Sun Aug 10 22:47:08 1997 *************** enum built_in_function *** 98,101 **** --- 17044,17050 ---- { unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1))); ! diff -rcp2N gcc-2.7.2.3/tree.h gcc-2.7.2.3.f.2/tree.h *** gcc-2.7.2.3/tree.h Mon Sep 25 21:49:40 1995 ! --- gcc-2.7.2.3.f.2/tree.h Mon Oct 27 07:40:49 1997 *************** enum built_in_function *** 98,101 **** *************** diff -rcp2N gcc-2.7.2.3/tree.h gcc-2.7.2 *** 13047,13053 **** /* Return the FUNCTION_DECL which provides this _DECL with its context, ! diff -rcp2N gcc-2.7.2.3/unroll.c gcc-2.7.2.3.f.1/unroll.c ! *** gcc-2.7.2.3/unroll.c Sun Aug 31 09:39:49 1997 ! --- gcc-2.7.2.3.f.1/unroll.c Sun Aug 31 09:21:17 1997 *************** unroll_loop (loop_end, insn_count, loop_ *** 268,273 **** --- 17116,17122 ---- /* Return the FUNCTION_DECL which provides this _DECL with its context, ! diff -rcp2N gcc-2.7.2.3/unroll.c gcc-2.7.2.3.f.2/unroll.c ! *** gcc-2.7.2.3/unroll.c Tue Jun 24 18:42:51 1997 ! --- gcc-2.7.2.3.f.2/unroll.c Tue Sep 9 07:01:48 1997 *************** unroll_loop (loop_end, insn_count, loop_ *** 268,273 **** *************** diff -rcp2N gcc-2.7.2.3/unroll.c gcc-2.7 *** 13332,13338 **** emit_iv_add_mult (increment, GEN_INT (loop_n_iterations), bl->initial_value, tem, insert_before); ! diff -rcp2N gcc-2.7.2.3/varasm.c gcc-2.7.2.3.f.1/varasm.c ! *** gcc-2.7.2.3/varasm.c Sun Aug 31 09:39:49 1997 ! --- gcc-2.7.2.3.f.1/varasm.c Sun Aug 31 09:21:18 1997 *************** assemble_variable (decl, top_level, at_e *** 1067,1070 **** --- 17401,17407 ---- emit_iv_add_mult (increment, GEN_INT (loop_n_iterations), bl->initial_value, tem, insert_before); ! diff -rcp2N gcc-2.7.2.3/varasm.c gcc-2.7.2.3.f.2/varasm.c ! *** gcc-2.7.2.3/varasm.c Wed Aug 13 17:23:27 1997 ! --- gcc-2.7.2.3.f.2/varasm.c Tue Sep 9 07:01:49 1997 *************** assemble_variable (decl, top_level, at_e *** 1067,1070 **** *************** diff -rcp2N gcc-2.7.2.3/varasm.c gcc-2.7 *** 13428,13492 **** copy_constant (TREE_IMAGPART (exp))); ! *************** copy_constant (exp) ! *** 2646,2649 **** ! --- 2655,2659 ---- ! case NOP_EXPR: ! case CONVERT_EXPR: ! + case NON_LVALUE_EXPR: ! return build1 (TREE_CODE (exp), TREE_TYPE (exp), ! copy_constant (TREE_OPERAND (exp, 0))); ! *************** output_constant_def (exp) ! *** 2692,2698 **** ! register rtx def; ! - if (TREE_CODE (exp) == INTEGER_CST) ! - abort (); /* No TREE_CST_RTL slot in these. */ ! - ! if (TREE_CST_RTL (exp)) ! return TREE_CST_RTL (exp); ! --- 2702,2705 ---- ! *************** bc_assemble_integer (exp, size) ! *** 3622,3626 **** ! exp = fold (exp); ! ! ! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR) ! exp = TREE_OPERAND (exp, 0); ! if (TREE_CODE (exp) == INTEGER_CST) ! --- 3629,3634 ---- ! exp = fold (exp); ! ! ! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR ! ! || TREE_CODE (exp) == NON_LVALUE_EXPR) ! exp = TREE_OPERAND (exp, 0); ! if (TREE_CODE (exp) == INTEGER_CST) ! *************** bc_assemble_integer (exp, size) ! *** 3633,3641 **** ! const_part = TREE_OPERAND (exp, 0); ! while (TREE_CODE (const_part) == NOP_EXPR ! ! || TREE_CODE (const_part) == CONVERT_EXPR) ! const_part = TREE_OPERAND (const_part, 0); ! addr_part = TREE_OPERAND (exp, 1); ! while (TREE_CODE (addr_part) == NOP_EXPR ! ! || TREE_CODE (addr_part) == CONVERT_EXPR) ! addr_part = TREE_OPERAND (addr_part, 0); ! if (TREE_CODE (const_part) != INTEGER_CST) ! --- 3641,3651 ---- ! const_part = TREE_OPERAND (exp, 0); ! while (TREE_CODE (const_part) == NOP_EXPR ! ! || TREE_CODE (const_part) == CONVERT_EXPR ! ! || TREE_CODE (const_part) == NON_LVALUE_EXPR) ! const_part = TREE_OPERAND (const_part, 0); ! addr_part = TREE_OPERAND (exp, 1); ! while (TREE_CODE (addr_part) == NOP_EXPR ! ! || TREE_CODE (addr_part) == CONVERT_EXPR ! ! || TREE_CODE (addr_part) == NON_LVALUE_EXPR) ! addr_part = TREE_OPERAND (addr_part, 0); ! if (TREE_CODE (const_part) != INTEGER_CST) ! diff -rcp2N gcc-2.7.2.3/version.c gcc-2.7.2.3.f.1/version.c ! *** gcc-2.7.2.3/version.c Sun Aug 31 09:39:50 1997 ! --- gcc-2.7.2.3.f.1/version.c Tue Sep 9 04:13:48 1997 ! *************** ! *** 1 **** ! ! char *version_string = "2.7.2.3"; ! --- 1 ---- ! ! char *version_string = "2.7.2.3.f.1"; --- 17497,17896 ---- copy_constant (TREE_IMAGPART (exp))); ! *************** copy_constant (exp) ! *** 2646,2649 **** ! --- 2655,2659 ---- ! case NOP_EXPR: ! case CONVERT_EXPR: ! + case NON_LVALUE_EXPR: ! return build1 (TREE_CODE (exp), TREE_TYPE (exp), ! copy_constant (TREE_OPERAND (exp, 0))); ! *************** output_constant_def (exp) ! *** 2692,2698 **** ! register rtx def; ! ! - if (TREE_CODE (exp) == INTEGER_CST) ! - abort (); /* No TREE_CST_RTL slot in these. */ ! - ! if (TREE_CST_RTL (exp)) ! return TREE_CST_RTL (exp); ! --- 2702,2705 ---- ! *************** bc_assemble_integer (exp, size) ! *** 3622,3626 **** ! exp = fold (exp); ! ! ! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR) ! exp = TREE_OPERAND (exp, 0); ! if (TREE_CODE (exp) == INTEGER_CST) ! --- 3629,3634 ---- ! exp = fold (exp); ! ! ! while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR ! ! || TREE_CODE (exp) == NON_LVALUE_EXPR) ! exp = TREE_OPERAND (exp, 0); ! if (TREE_CODE (exp) == INTEGER_CST) ! *************** bc_assemble_integer (exp, size) ! *** 3633,3641 **** ! const_part = TREE_OPERAND (exp, 0); ! while (TREE_CODE (const_part) == NOP_EXPR ! ! || TREE_CODE (const_part) == CONVERT_EXPR) ! const_part = TREE_OPERAND (const_part, 0); ! addr_part = TREE_OPERAND (exp, 1); ! while (TREE_CODE (addr_part) == NOP_EXPR ! ! || TREE_CODE (addr_part) == CONVERT_EXPR) ! addr_part = TREE_OPERAND (addr_part, 0); ! if (TREE_CODE (const_part) != INTEGER_CST) ! --- 3641,3651 ---- ! const_part = TREE_OPERAND (exp, 0); ! while (TREE_CODE (const_part) == NOP_EXPR ! ! || TREE_CODE (const_part) == CONVERT_EXPR ! ! || TREE_CODE (const_part) == NON_LVALUE_EXPR) ! const_part = TREE_OPERAND (const_part, 0); ! addr_part = TREE_OPERAND (exp, 1); ! while (TREE_CODE (addr_part) == NOP_EXPR ! ! || TREE_CODE (addr_part) == CONVERT_EXPR ! ! || TREE_CODE (addr_part) == NON_LVALUE_EXPR) ! addr_part = TREE_OPERAND (addr_part, 0); ! if (TREE_CODE (const_part) != INTEGER_CST) ! diff -rcp2N gcc-2.7.2.3/version.c gcc-2.7.2.3.f.2/version.c ! *** gcc-2.7.2.3/version.c Tue Aug 19 21:26:09 1997 ! --- gcc-2.7.2.3.f.2/version.c Tue Sep 16 06:07:36 1997 ! *************** ! *** 1 **** ! ! char *version_string = "2.7.2.3"; ! --- 1 ---- ! ! char *version_string = "2.7.2.3.f.2"; ! diff -rcp2N gcc-2.7.2.3/c-gperf.h gcc-2.7.2.3.f.2/c-gperf.h ! *** gcc-2.7.2.3/c-gperf.h Fri Mar 4 19:15:53 1994 ! --- gcc-2.7.2.3.f.2/c-gperf.h Mon Sep 29 20:55:29 1997 ! *************** ! *** 1,15 **** ! /* C code produced by gperf version 2.5 (GNU C++ version) */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ c-parse.gperf */ ! struct resword { char *name; short token; enum rid rid; }; ! ! ! #define TOTAL_KEYWORDS 79 ! #define MIN_WORD_LENGTH 2 ! #define MAX_WORD_LENGTH 20 ! ! #define MIN_HASH_VALUE 10 ! ! #define MAX_HASH_VALUE 144 ! ! /* maximum key range = 135, duplicates = 0 */ ! ! #ifdef __GNUC__ ! ! __inline ! #endif ! static unsigned int ! --- 1,16 ---- ! /* C code produced by gperf version 2.5 (GNU C++ version) */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ../g77-new/c-parse.gperf */ ! ! /* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ ! struct resword { char *name; short token; enum rid rid; }; ! ! ! #define TOTAL_KEYWORDS 81 ! #define MIN_WORD_LENGTH 2 ! #define MAX_WORD_LENGTH 20 ! ! #define MIN_HASH_VALUE 13 ! ! #define MAX_HASH_VALUE 223 ! ! /* maximum key range = 211, duplicates = 0 */ ! ! #ifdef __GNUC__ ! ! inline ! #endif ! static unsigned int ! *************** hash (str, len) ! *** 20,36 **** ! static unsigned char asso_values[] = ! { ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 25, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ! ! 145, 145, 145, 145, 145, 1, 145, 46, 8, 15, ! ! 61, 6, 36, 48, 3, 5, 145, 18, 63, 25, ! ! 29, 76, 1, 145, 13, 2, 1, 51, 37, 9, ! ! 9, 1, 3, 145, 145, 145, 145, 145, ! }; ! register int hval = len; ! --- 21,37 ---- ! static unsigned char asso_values[] = ! { ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 36, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, ! ! 224, 224, 224, 224, 224, 1, 224, 68, 6, 51, ! ! 53, 6, 34, 36, 2, 13, 224, 2, 68, 16, ! ! 48, 66, 4, 224, 19, 98, 1, 22, 38, 2, ! ! 12, 2, 2, 224, 224, 224, 224, 224, ! }; ! register int hval = len; ! *************** hash (str, len) ! *** 44,47 **** ! --- 45,49 ---- ! case 1: ! hval += asso_values[str[0]]; ! + break; ! } ! return hval + asso_values[str[len - 1]]; ! *************** hash (str, len) ! *** 50,166 **** ! static struct resword wordlist[] = ! { ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, ! ! {"int", TYPESPEC, RID_INT}, ! ! {"",}, {"",}, ! ! {"__typeof__", TYPEOF, NORID}, ! ! {"__signed__", TYPESPEC, RID_SIGNED}, ! ! {"__imag__", IMAGPART, NORID}, ! ! {"switch", SWITCH, NORID}, ! ! {"__inline__", SCSPEC, RID_INLINE}, ! ! {"else", ELSE, NORID}, ! ! {"__iterator__", SCSPEC, RID_ITERATOR}, ! ! {"__inline", SCSPEC, RID_INLINE}, ! ! {"__extension__", EXTENSION, NORID}, ! ! {"struct", STRUCT, NORID}, ! ! {"__real__", REALPART, NORID}, ! ! {"__const", TYPE_QUAL, RID_CONST}, ! ! {"while", WHILE, NORID}, ! ! {"__const__", TYPE_QUAL, RID_CONST}, ! ! {"case", CASE, NORID}, ! ! {"__complex__", TYPESPEC, RID_COMPLEX}, ! ! {"__iterator", SCSPEC, RID_ITERATOR}, ! ! {"bycopy", TYPE_QUAL, RID_BYCOPY}, ! ! {"",}, {"",}, {"",}, ! ! {"__complex", TYPESPEC, RID_COMPLEX}, ! ! {"",}, ! ! {"in", TYPE_QUAL, RID_IN}, ! ! {"break", BREAK, NORID}, ! ! {"@defs", DEFS, NORID}, ! ! {"",}, {"",}, {"",}, ! ! {"extern", SCSPEC, RID_EXTERN}, ! ! {"if", IF, NORID}, ! ! {"typeof", TYPEOF, NORID}, ! ! {"typedef", SCSPEC, RID_TYPEDEF}, ! ! {"__typeof", TYPEOF, NORID}, ! ! {"sizeof", SIZEOF, NORID}, ! ! {"",}, ! ! {"return", RETURN, NORID}, ! ! {"const", TYPE_QUAL, RID_CONST}, ! ! {"__volatile__", TYPE_QUAL, RID_VOLATILE}, ! ! {"@private", PRIVATE, NORID}, ! ! {"@selector", SELECTOR, NORID}, ! ! {"__volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"__asm__", ASM_KEYWORD, NORID}, ! ! {"",}, {"",}, ! ! {"continue", CONTINUE, NORID}, ! ! {"__alignof__", ALIGNOF, NORID}, ! ! {"__imag", IMAGPART, NORID}, ! ! {"__attribute__", ATTRIBUTE, NORID}, ! ! {"",}, {"",}, ! ! {"__attribute", ATTRIBUTE, NORID}, ! ! {"for", FOR, NORID}, ! ! {"",}, ! ! {"@encode", ENCODE, NORID}, ! ! {"id", OBJECTNAME, RID_ID}, ! ! {"static", SCSPEC, RID_STATIC}, ! ! {"@interface", INTERFACE, NORID}, ! ! {"",}, ! ! {"__signed", TYPESPEC, RID_SIGNED}, ! ! {"",}, ! ! {"__label__", LABEL, NORID}, ! ! {"",}, {"",}, ! ! {"__asm", ASM_KEYWORD, NORID}, ! ! {"char", TYPESPEC, RID_CHAR}, ! ! {"",}, ! ! {"inline", SCSPEC, RID_INLINE}, ! ! {"out", TYPE_QUAL, RID_OUT}, ! ! {"register", SCSPEC, RID_REGISTER}, ! ! {"__real", REALPART, NORID}, ! ! {"short", TYPESPEC, RID_SHORT}, ! ! {"",}, ! ! {"enum", ENUM, NORID}, ! ! {"inout", TYPE_QUAL, RID_INOUT}, ! ! {"",}, ! ! {"oneway", TYPE_QUAL, RID_ONEWAY}, ! ! {"union", UNION, NORID}, ! ! {"",}, ! ! {"__alignof", ALIGNOF, NORID}, ! ! {"",}, ! ! {"@implementation", IMPLEMENTATION, NORID}, ! ! {"",}, ! ! {"@class", CLASS, NORID}, ! ! {"",}, ! ! {"@public", PUBLIC, NORID}, ! ! {"asm", ASM_KEYWORD, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"default", DEFAULT, NORID}, ! ! {"",}, ! ! {"void", TYPESPEC, RID_VOID}, ! ! {"",}, ! ! {"@protected", PROTECTED, NORID}, ! ! {"@protocol", PROTOCOL, NORID}, ! ! {"",}, {"",}, {"",}, ! ! {"volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"",}, {"",}, ! ! {"signed", TYPESPEC, RID_SIGNED}, ! ! {"float", TYPESPEC, RID_FLOAT}, ! ! {"@end", END, NORID}, ! ! {"",}, {"",}, ! ! {"unsigned", TYPESPEC, RID_UNSIGNED}, ! ! {"@compatibility_alias", ALIAS, NORID}, ! ! {"double", TYPESPEC, RID_DOUBLE}, ! ! {"",}, {"",}, ! ! {"auto", SCSPEC, RID_AUTO}, ! ! {"",}, ! ! {"goto", GOTO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"do", DO, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"long", TYPESPEC, RID_LONG}, ! }; ! ! #ifdef __GNUC__ ! ! __inline ! #endif ! struct resword * ! --- 52,184 ---- ! static struct resword wordlist[] = ! { ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"__typeof__", TYPEOF, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, ! ! {"int", TYPESPEC, RID_INT}, ! ! {"break", BREAK, NORID}, ! ! {"",}, ! ! {"__extension__", EXTENSION, NORID}, ! ! {"",}, ! ! {"__imag__", IMAGPART, NORID}, ! ! {"",}, ! ! {"__inline__", SCSPEC, RID_INLINE}, ! ! {"while", WHILE, NORID}, ! ! {"__iterator__", SCSPEC, RID_ITERATOR}, ! ! {"__inline", SCSPEC, RID_INLINE}, ! ! {"__real__", REALPART, NORID}, ! ! {"",}, ! ! {"__restrict", TYPE_QUAL, RID_RESTRICT}, ! ! {"",}, ! ! {"__restrict__", TYPE_QUAL, RID_RESTRICT}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"__iterator", SCSPEC, RID_ITERATOR}, ! ! {"__typeof", TYPEOF, NORID}, ! ! {"typeof", TYPEOF, NORID}, ! ! {"typedef", SCSPEC, RID_TYPEDEF}, ! ! {"",}, ! ! {"enum", ENUM, NORID}, ! ! {"if", IF, NORID}, ! ! {"",}, {"",}, ! ! {"__volatile__", TYPE_QUAL, RID_VOLATILE}, ! ! {"",}, {"",}, ! ! {"__volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"__imag", IMAGPART, NORID}, ! ! {"",}, {"",}, {"",}, ! ! {"__const", TYPE_QUAL, RID_CONST}, ! ! {"extern", SCSPEC, RID_EXTERN}, ! ! {"__const__", TYPE_QUAL, RID_CONST}, ! ! {"in", TYPE_QUAL, RID_IN}, ! ! {"__complex__", TYPESPEC, RID_COMPLEX}, ! ! {"bycopy", TYPE_QUAL, RID_BYCOPY}, ! ! {"",}, {"",}, ! ! {"id", OBJECTNAME, RID_ID}, ! ! {"@private", PRIVATE, NORID}, ! ! {"@selector", SELECTOR, NORID}, ! ! {"out", TYPE_QUAL, RID_OUT}, ! ! {"",}, ! ! {"__complex", TYPESPEC, RID_COMPLEX}, ! ! {"return", RETURN, NORID}, ! ! {"for", FOR, NORID}, ! ! {"",}, ! ! {"__asm__", ASM_KEYWORD, NORID}, ! ! {"",}, ! ! {"__label__", LABEL, NORID}, ! ! {"oneway", TYPE_QUAL, RID_ONEWAY}, ! ! {"__alignof__", ALIGNOF, NORID}, ! ! {"register", SCSPEC, RID_REGISTER}, ! ! {"__attribute__", ATTRIBUTE, NORID}, ! ! {"",}, ! ! {"inout", TYPE_QUAL, RID_INOUT}, ! ! {"__attribute", ATTRIBUTE, NORID}, ! ! {"double", TYPESPEC, RID_DOUBLE}, ! ! {"union", UNION, NORID}, ! ! {"",}, ! ! {"__asm", ASM_KEYWORD, NORID}, ! ! {"",}, {"",}, ! ! {"inline", SCSPEC, RID_INLINE}, ! ! {"__real", REALPART, NORID}, ! ! {"default", DEFAULT, NORID}, ! ! {"",}, ! ! {"@encode", ENCODE, NORID}, ! ! {"",}, {"",}, ! ! {"@interface", INTERFACE, NORID}, ! ! {"",}, {"",}, ! ! {"asm", ASM_KEYWORD, NORID}, ! ! {"",}, ! ! {"const", TYPE_QUAL, RID_CONST}, ! ! {"float", TYPESPEC, RID_FLOAT}, ! ! {"goto", GOTO, NORID}, ! ! {"void", TYPESPEC, RID_VOID}, ! ! {"",}, ! ! {"__signed__", TYPESPEC, RID_SIGNED}, ! ! {"",}, ! ! {"__alignof", ALIGNOF, NORID}, ! ! {"continue", CONTINUE, NORID}, ! ! {"else", ELSE, NORID}, ! ! {"@implementation", IMPLEMENTATION, NORID}, ! ! {"@public", PUBLIC, NORID}, ! ! {"",}, ! ! {"@protected", PROTECTED, NORID}, ! ! {"switch", SWITCH, NORID}, ! ! {"volatile", TYPE_QUAL, RID_VOLATILE}, ! ! {"do", DO, NORID}, ! ! {"",}, {"",}, ! ! {"struct", STRUCT, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"@protocol", PROTOCOL, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"auto", SCSPEC, RID_AUTO}, ! ! {"sizeof", SIZEOF, NORID}, ! ! {"@end", END, NORID}, ! ! {"char", TYPESPEC, RID_CHAR}, ! ! {"",}, {"",}, ! ! {"@defs", DEFS, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, ! ! {"long", TYPESPEC, RID_LONG}, ! ! {"",}, {"",}, ! ! {"case", CASE, NORID}, ! ! {"__signed", TYPESPEC, RID_SIGNED}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"short", TYPESPEC, RID_SHORT}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, ! ! {"unsigned", TYPESPEC, RID_UNSIGNED}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, {"",}, ! ! {"signed", TYPESPEC, RID_SIGNED}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"@class", CLASS, NORID}, ! ! {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ! ! {"",}, {"",}, ! ! {"@compatibility_alias", ALIAS, NORID}, ! ! {"",}, {"",}, ! ! {"static", SCSPEC, RID_STATIC}, ! }; ! #ifdef __GNUC__ ! ! inline ! #endif ! struct resword * diff -rcp2N g77-0.5.21/f/gbe/README g77-0.5.22/f/gbe/README *** g77-0.5.21/f/gbe/README Tue Sep 9 06:13:59 1997 --- g77-0.5.22/f/gbe/README Wed Dec 24 02:05:59 1997 *************** *** 1,3 **** ! 970909 This directory contains .diff files for various GNU CC distributions --- 1,3 ---- ! 1997-12-23 This directory contains .diff files for various GNU CC distributions *************** The name of a file includes which gcc ve *** 7,10 **** --- 7,15 ---- For example, 2.7.2.3.diff is the patch file for gcc version 2.7.2.3. + To use this file, you must have a working version of `patch' + installed. For best results, ensure that the command + `patch --version' reports that it is GNU patch, version 2.5 + or higher. + To apply a .diff file to, say, gcc 2.7.2.3, one might use the following command (where the current directory contains the gcc source distribution *************** released. On the other hand, it probabl *** 40,45 **** a more major release like gcc-2.8.0 or gcc-3.0.0, and you shouldn't try it. If the .diff file is missing, don't bother ! asking for it -- it is certainly being worked on. In the meantime, watch our progress at ! for information on support for the recent versions of gcc. --- 45,50 ---- a more major release like gcc-2.8.0 or gcc-3.0.0, and you shouldn't try it. If the .diff file is missing, don't bother ! asking for it -- it is certainly being worked on. In the meantime, watch our progress at ! for information on support for the recent versions of gcc. diff -rcp2N g77-0.5.21/f/install.texi g77-0.5.22/f/install.texi *** g77-0.5.21/f/install.texi Tue Sep 9 06:11:36 1997 --- g77-0.5.22/f/install.texi Sun Mar 15 11:39:41 1998 *************** *** 6,10 **** @c in the G77 distribution, as well as in the G77 manual. ! @c 1997-09-09 @ifclear INSTALLONLY --- 6,22 ---- @c in the G77 distribution, as well as in the G77 manual. ! @c 1998-03-15 ! ! @set version-g77 0.5.22 ! @set version-gcc 2.7.2.3 ! @set version-gcc-patched 2.7.2.3.f.2 ! @set version-gzip 1.2.4 ! @set version-tar 1.12 ! @set version-patch 2.5 ! @set version-make 3.76.1 ! @set version-bison 1.25 ! @set version-makeinfo 1.68 ! @set version-texinfo 3.11 ! @set version-sed 2.05 @ifclear INSTALLONLY *************** most systems, if desired. *** 63,71 **** The version of GNU @code{gzip} used to package this release ! is 1.24. (The version of GNU @code{tar} used to package this release ! is 1.11.2.) ! @item @file{gcc-2.7.2.3.tar.gz} You need to have this, or some other applicable, version of @code{gcc} on your system. --- 75,83 ---- The version of GNU @code{gzip} used to package this release ! is @value{version-gzip}. (The version of GNU @code{tar} used to package this release ! is @value{version-tar}.) ! @item @file{gcc-@value{version-gcc}.tar.gz} You need to have this, or some other applicable, version of @code{gcc} on your system. *************** from the FSF. *** 74,79 **** Its size is approximately 7.1MB. ! If you've already unpacked @file{gcc-2.7.2.3.tar.gz} into a ! directory (named @file{gcc-2.7.2.3}) called the @dfn{source tree} for @code{gcc}, you can delete the distribution itself, but you'll need to remember to skip any instructions to unpack --- 86,91 ---- Its size is approximately 7.1MB. ! If you've already unpacked @file{gcc-@value{version-gcc}.tar.gz} into a ! directory (named @file{gcc-@value{version-gcc}}) called the @dfn{source tree} for @code{gcc}, you can delete the distribution itself, but you'll need to remember to skip any instructions to unpack *************** build @code{g77}. *** 84,88 **** You can obtain an FSF distribution of @code{gcc} from the FSF. ! @item @file{g77-0.5.21.tar.gz} You probably have already unpacked this package, or you are reading an advance copy of these installation instructions, --- 96,100 ---- You can obtain an FSF distribution of @code{gcc} from the FSF. ! @item @file{g77-@value{version-g77}.tar.gz} You probably have already unpacked this package, or you are reading an advance copy of these installation instructions, *************** install (primarily, which languages you *** 100,104 **** The sizes shown below assume all languages distributed ! in @code{gcc-2.7.2.3}, plus @code{g77}, will be built and installed. These sizes are indicative of GNU/Linux systems on --- 112,116 ---- The sizes shown below assume all languages distributed ! in @code{gcc-@value{version-gcc}}, plus @code{g77}, will be built and installed. These sizes are indicative of GNU/Linux systems on *************** are designed for humans to read them. *** 199,203 **** The version of GNU @code{patch} used to develop this release ! is 2.4. @item @code{make} --- 211,215 ---- The version of GNU @code{patch} used to develop this release ! is @value{version-patch}. @item @code{make} *************** referred to as @code{gmake}). *** 207,211 **** The version of GNU @code{make} used to develop this release ! is 3.73. @item @code{cc} --- 219,223 ---- The version of GNU @code{make} used to develop this release ! is @value{version-make}. @item @code{cc} *************** You can obtain @code{bison} the same way *** 224,228 **** The version of GNU @code{bison} used to develop this release ! is 1.25. @xref{Missing bison?}, --- 236,240 ---- The version of GNU @code{bison} used to develop this release ! is @value{version-bison}. @xref{Missing bison?}, *************** You can obtain @code{makeinfo} the same *** 236,240 **** The version of GNU @code{makeinfo} used to develop this release ! is 1.68, from GNU @code{texinfo} version 3.11. @xref{Missing makeinfo?}, --- 248,253 ---- The version of GNU @code{makeinfo} used to develop this release ! is @value{version-makeinfo}, from ! GNU @code{texinfo} version @value{version-texinfo}. @xref{Missing makeinfo?}, *************** installing @code{gcc} or @code{g77}. *** 247,254 **** The version of GNU @code{sed} used to develop this release ! is 2.05. (Note that GNU @code{sed} version 3.0 was withdrawn by the FSF---if you happen to have this version installed, replace ! it with version 2.05 immediately. See a GNU distribution site for further explanation.) --- 260,267 ---- The version of GNU @code{sed} used to develop this release ! is @value{version-sed}. (Note that GNU @code{sed} version 3.0 was withdrawn by the FSF---if you happen to have this version installed, replace ! it with version @value{version-sed} immediately. See a GNU distribution site for further explanation.) *************** either @code{gcc} or @code{g77}. *** 288,291 **** --- 301,305 ---- @menu * General Problems:: Problems afflicting most or all systems. + * System-specific Problems:: Problems afflicting particular systems. * Cross-compiler Problems:: Problems afflicting cross-compilation setups. @end menu *************** These problems can occur on most or all *** 297,304 **** @menu ! * GNU C Required:: Why even ANSI C is not enough. * Patching GNU CC Necessary:: Why @code{gcc} must be patched first. * Building GNU CC Necessary:: Why you can't build @emph{just} Fortran. ! * Missing strtoul:: If linking @code{f771} fails due to an unresolved reference to @code{strtoul}. * Object File Differences:: It's okay that @samp{make compare} will --- 311,318 ---- @menu ! * GNU C Required:: Why even ANSI C is not enough. * Patching GNU CC Necessary:: Why @code{gcc} must be patched first. * Building GNU CC Necessary:: Why you can't build @emph{just} Fortran. ! * Missing strtoul:: If linking @code{f771} fails due to an unresolved reference to @code{strtoul}. * Object File Differences:: It's okay that @samp{make compare} will *************** If the above does not work, definitely s *** 465,469 **** and avoid copying the @code{gcc} using any method that does not reliably preserve date-time-modified information, such ! as the UNIX @samp{cp -r} command. @node Cross-compiler Problems --- 479,502 ---- and avoid copying the @code{gcc} using any method that does not reliably preserve date-time-modified information, such ! as the UNIX @samp{cp -r} command (use @samp{cp -pr} instead). ! ! @node System-specific Problems ! @subsection System-specific Problems ! ! @cindex Digital Alpha ! @cindex Alpha, Digital ! @cindex DEC Alpha ! @cindex AXP ! If your system is based on a Digital Alpha (AXP) architecture ! and employs a 64-bit operating system (such as GNU/Linux), ! you might consider using @code{egcs} instead of versions ! of @code{g77} based on versions of @code{gcc} prior to 2.8. ! @uref{http://www.cygnus.com/egcs} for information on @code{egcs}, ! or obtain a copy from @uref{ftp://egcs.cygnus.com/pub/egcs}. ! ! @cindex Irix 6 ! @cindex SGI ! If your system is Irix 6, to obtain a working version of @code{gcc}, ! @uref{http://reality.sgi.com/knobi/gcc-2.7.2.x-on-irix-6.2-6.3}. @node Cross-compiler Problems *************** it as a cross-compiler *** 680,684 **** for a target when @code{g77} cannot reliably determine the bit pattern of floating-point constants for the target. ! Planned improvements for g77-0.6 will give it the capabilities it needs to not have to crash the build but rather generate correct code for the target. --- 713,717 ---- for a target when @code{g77} cannot reliably determine the bit pattern of floating-point constants for the target. ! Planned improvements for version 0.6 of @code{g77} will give it the capabilities it needs to not have to crash the build but rather generate correct code for the target. *************** used by the author of @code{g77} on his *** 782,787 **** @example ! /usr/FSF/gcc-2.7.2.3.tar.gz ! /usr/FSF/g77-0.5.21.tar.gz @end example --- 815,820 ---- @example ! /usr/FSF/gcc-@value{version-gcc}.tar.gz ! /usr/FSF/g77-@value{version-g77}.tar.gz @end example *************** These explanations follow this list of s *** 824,841 **** sh[ 1]# @kbd{cd /usr/src} @set source-dir 1 ! sh[ 2]# @kbd{gunzip -c < /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -} [Might say "Broken pipe"...that is normal on some systems.] @set unpack-gcc 2 ! sh[ 3]# @kbd{gunzip -c < /usr/FSF/g77-0.5.21.tar.gz | tar xf -} ["Broken pipe" again possible.] @set unpack-g77 3 ! sh[ 4]# @kbd{ln -s gcc-2.7.2.3 gcc} @set link-gcc 4 ! sh[ 5]# @kbd{ln -s g77-0.5.21 g77} @set link-g77 5 sh[ 6]# @kbd{mv -i g77/* gcc} [No questions should be asked by mv here; or, you made a mistake.] @set merge-g77 6 ! sh[ 7]# @kbd{patch -p1 -V t -d gcc < gcc/f/gbe/2.7.2.3.diff} [Unless patch complains about rejected patches, this step worked.] @set apply-patch 7 --- 857,874 ---- sh[ 1]# @kbd{cd /usr/src} @set source-dir 1 ! sh[ 2]# @kbd{gunzip -c < /usr/FSF/gcc-@value{version-gcc}.tar.gz | tar xf -} [Might say "Broken pipe"...that is normal on some systems.] @set unpack-gcc 2 ! sh[ 3]# @kbd{gunzip -c < /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} ["Broken pipe" again possible.] @set unpack-g77 3 ! sh[ 4]# @kbd{ln -s gcc-@value{version-gcc} gcc} @set link-gcc 4 ! sh[ 5]# @kbd{ln -s g77-@value{version-g77} g77} @set link-g77 5 sh[ 6]# @kbd{mv -i g77/* gcc} [No questions should be asked by mv here; or, you made a mistake.] @set merge-g77 6 ! sh[ 7]# @kbd{patch -p1 -E -V t -d gcc < gcc/f/gbe/@value{version-gcc}.diff} [Unless patch complains about rejected patches, this step worked.] @set apply-patch 7 *************** installed version of @code{g77} and @cod *** 899,903 **** @c similar results. ! @item Step @value{unpack-g77}: @kbd{gunzip -d < /usr/FSF/g77-0.5.21.tar.gz | tar xf -} It is not always necessary to obtain the latest version of @code{g77} as a complete @file{.tar.gz} file if you have --- 932,936 ---- @c similar results. ! @item Step @value{unpack-g77}: @kbd{gunzip -d < /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} It is not always necessary to obtain the latest version of @code{g77} as a complete @file{.tar.gz} file if you have *************** If appropriate, you can unpack that earl *** 906,913 **** version of @code{g77}, and then apply the appropriate patches to achieve the same result---a source tree containing version ! 0.5.21 of @code{g77}. ! @item Step @value{link-gcc}: @kbd{ln -s gcc-2.7.2.3 gcc} ! @item Step @value{link-g77}: @kbd{ln -s g77-0.5.21 g77} These commands mainly help reduce typing, and help reduce visual clutter in examples --- 939,946 ---- version of @code{g77}, and then apply the appropriate patches to achieve the same result---a source tree containing version ! @value{version-g77} of @code{g77}. ! @item Step @value{link-gcc}: @kbd{ln -s gcc-@value{version-gcc} gcc} ! @item Step @value{link-g77}: @kbd{ln -s g77-@value{version-g77} g77} These commands mainly help reduce typing, and help reduce visual clutter in examples *************** other than the FSF. *** 923,927 **** @item Step @value{merge-g77}: @kbd{mv -i g77/* gcc} After doing this, you can, if you like, type ! @samp{rm g77} and @samp{rmdir g77-0.5.21} to remove the empty directory and the symbol link to it. But, it might be helpful to leave them around as --- 956,960 ---- @item Step @value{merge-g77}: @kbd{mv -i g77/* gcc} After doing this, you can, if you like, type ! @samp{rm g77} and @samp{rmdir g77-@value{version-g77}} to remove the empty directory and the symbol link to it. But, it might be helpful to leave them around as *************** into the @file{gcc} directory). *** 936,943 **** @c (Or `@kbd{@dots{} < gcc/f/gbe/2.7.2.1.diff}', if appropriate.) @c ! This can produce a wide variety of printed output, ! from @samp{Hmm, I can't seem to find a patch in there anywhere...} ! to long lists of messages indicated that patches are ! being found, applied successfully, and so on. If messages about ``fuzz'', ``offset'', or --- 969,977 ---- @c (Or `@kbd{@dots{} < gcc/f/gbe/2.7.2.1.diff}', if appropriate.) @c ! If you are using ! GNU @code{patch} version @value{version-patch} or later, ! this should produce a list of files patched. ! (Other versions of @code{patch} might not work ! properly.) If messages about ``fuzz'', ``offset'', or *************** To remove these, after @kbd{cd gcc}, typ *** 955,958 **** --- 989,1001 ---- @xref{Merging Distributions}, for more information. + @emph{Note:} @code{gcc} versions circa 2.7.2.2 and 2.7.2.3 + are known to have slightly differing versions of the + @code{gcc/ChangeLog} file, + depending on how they are obtained. + You can safely ignore diagnostics @code{patch} reports + when patching this particular file, + since it is purely a documentation file for implementors. + See @file{gcc/f/gbe/2.7.2.3.diff} for more information. + @item Step @value{f77-install-ok}: @kbd{touch f77-install-ok} Don't do this if you don't want to overwrite an existing *************** and @code{g77} is: *** 1131,1138 **** @example sh# @kbd{cd /usr/src} ! sh# @kbd{gunzip -c /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -} ! sh# @kbd{gunzip -c /usr/FSF/g77-0.5.21.tar.gz | tar xf -} ! sh# @kbd{ln -s gcc-2.7.2.3 gcc} ! sh# @kbd{ln -s g77-0.5.21 g77} sh# @kbd{mv -i g77/* gcc} @end example --- 1174,1181 ---- @example sh# @kbd{cd /usr/src} ! sh# @kbd{gunzip -c /usr/FSF/gcc-@value{version-gcc}.tar.gz | tar xf -} ! sh# @kbd{gunzip -c /usr/FSF/g77-@value{version-g77}.tar.gz | tar xf -} ! sh# @kbd{ln -s gcc-@value{version-gcc} gcc} ! sh# @kbd{ln -s g77-@value{version-g77} g77} sh# @kbd{mv -i g77/* gcc} @end example *************** g77/f *** 1159,1163 **** All three entries should be moved (or copied) into a @code{gcc} source tree (typically named after its version number and ! as it appears in the FSF distributions---e.g. @file{gcc-2.7.2.3}). @file{g77/f} is the subdirectory containing all of the --- 1202,1206 ---- All three entries should be moved (or copied) into a @code{gcc} source tree (typically named after its version number and ! as it appears in the FSF distributions---e.g. @file{gcc-@value{version-gcc}}). @file{g77/f} is the subdirectory containing all of the *************** It is hoped that the GBE interface, and *** 1289,1297 **** for the need for hand-patching to disappear. ! Invoking @code{patch} as described in @file{gcc/f/gbe/README} ! can produce a wide variety of printed output, ! from @samp{Hmm, I can't seem to find a patch in there anywhere...} ! to long lists of messages indicated that patches are ! being found, applied successfully, and so on. If messages about ``fuzz'', ``offset'', or --- 1332,1340 ---- for the need for hand-patching to disappear. ! If you are using ! GNU @code{patch} version @value{version-patch} or later, ! this should produce a list of files patched. ! (Other versions of @code{patch} might not work ! properly.) If messages about ``fuzz'', ``offset'', or *************** have old versions of several files as sa *** 1312,1315 **** --- 1355,1367 ---- To remove these, after @kbd{cd gcc}, type @kbd{rm -i *.~*~}. + @emph{Note:} @code{gcc} versions circa 2.7.2.2 and 2.7.2.3 + are known to have slightly differing versions of the + @code{gcc/ChangeLog} file, + depending on how they are obtained. + You can safely ignore diagnostics @code{patch} reports + when patching this particular file, + since it is purely a documentation file for implementors. + See @file{gcc/f/gbe/2.7.2.3.diff} for more information. + @pindex config-lang.in @emph{Note:} @code{g77}'s configuration file @file{gcc/f/config-lang.in} *************** but could easily produce broken code. *** 1328,1332 **** @cindex patch files, creating @pindex gcc/f/gbe/ ! @samp{diff -rcp2N} is used to create the patch files in @file{gcc/f/gbe/}. --- 1380,1384 ---- @cindex patch files, creating @pindex gcc/f/gbe/ ! @samp{LC_ALL=C TZ=UTC0 diff -rcp2N} is used to create the patch files in @file{gcc/f/gbe/}. *************** printed by them when they work: *** 1779,1788 **** sh# @kbd{cd /usr/src/gcc} sh# @kbd{./g77 --driver=./xgcc -B./ -v} ! g77 version 0.5.21 ./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 @dots{} Reading specs from ./specs ! gcc version 2.7.2.3.f.1 ./cpp -lang-c -v -isystem ./include -undef @dots{} ! GNU CPP version 2.7.2.3.f.1 (Linux/Alpha) #include "..." search starts here: #include <...> search starts here: --- 1831,1840 ---- sh# @kbd{cd /usr/src/gcc} sh# @kbd{./g77 --driver=./xgcc -B./ -v} ! g77 version @value{version-g77} ./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 @dots{} Reading specs from ./specs ! gcc version @value{version-gcc-patched} ./cpp -lang-c -v -isystem ./include -undef @dots{} ! GNU CPP version @value{version-gcc-patched} (Linux/Alpha) #include "..." search starts here: #include <...> search starts here: *************** GNU CPP version 2.7.2.3.f.1 (Linux/Alpha *** 1790,1812 **** /usr/local/include /usr/alpha-unknown-linux/include ! /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include /usr/include End of search list. ./f771 /tmp/cca18048.i -fset-g77-defaults -quiet -dumpbase @dots{} ! GNU F77 version 2.7.2.3.f.1 (Linux/Alpha) compiled @dots{} ! GNU Fortran Front End version 0.5.21 compiled: @dots{} as -nocpp -o /tmp/cca180481.o /tmp/cca18048.s ld -G 8 -O1 -o /tmp/gfa18047 /usr/lib/crt0.o -L. @dots{} ! __G77_LIBF77_VERSION__: 0.5.21 @@(#)LIBF77 VERSION 19970404 ! __G77_LIBI77_VERSION__: 0.5.21 @@(#) LIBI77 VERSION pjw,dmg-mods 19970816 ! __G77_LIBU77_VERSION__: 0.5.21 @@(#) LIBU77 VERSION 19970609 sh# @kbd{./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone} Reading specs from ./specs ! gcc version 2.7.2.3.f.1 ./cpp -lang-c -v -isystem ./include -undef @dots{} ! GNU CPP version 2.7.2.3.f.1 (Linux/Alpha) #include "..." search starts here: #include <...> search starts here: --- 1842,1864 ---- /usr/local/include /usr/alpha-unknown-linux/include ! /usr/lib/gcc-lib/alpha-unknown-linux/@value{version-gcc-patched}/include /usr/include End of search list. ./f771 /tmp/cca18048.i -fset-g77-defaults -quiet -dumpbase @dots{} ! GNU F77 version @value{version-gcc-patched} (Linux/Alpha) compiled @dots{} ! GNU Fortran Front End version @value{version-g77} compiled: @dots{} as -nocpp -o /tmp/cca180481.o /tmp/cca18048.s ld -G 8 -O1 -o /tmp/gfa18047 /usr/lib/crt0.o -L. @dots{} ! __G77_LIBF77_VERSION__: @value{version-g77} @@(#)LIBF77 VERSION 19970404 ! __G77_LIBI77_VERSION__: @value{version-g77} @@(#) LIBI77 VERSION pjw,dmg-mods 19970816 ! __G77_LIBU77_VERSION__: @value{version-g77} @@(#) LIBU77 VERSION 19970609 sh# @kbd{./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone} Reading specs from ./specs ! gcc version @value{version-gcc-patched} ./cpp -lang-c -v -isystem ./include -undef @dots{} ! GNU CPP version @value{version-gcc-patched} (Linux/Alpha) #include "..." search starts here: #include <...> search starts here: *************** GNU CPP version 2.7.2.3.f.1 (Linux/Alpha *** 1814,1822 **** /usr/local/include /usr/alpha-unknown-linux/include ! /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include /usr/include End of search list. ./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version @dots{} ! GNU C version 2.7.2.3.f.1 (Linux/Alpha) compiled @dots{} as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s ld -G 8 -O1 -o /tmp/delete-me /usr/lib/crt0.o -L. @dots{} --- 1866,1874 ---- /usr/local/include /usr/alpha-unknown-linux/include ! /usr/lib/gcc-lib/alpha-unknown-linux/@value{version-gcc-patched}/include /usr/include End of search list. ./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version @dots{} ! GNU C version @value{version-gcc-patched} (Linux/Alpha) compiled @dots{} as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s ld -G 8 -O1 -o /tmp/delete-me /usr/lib/crt0.o -L. @dots{} *************** well tested. *** 2138,2142 **** This especially goes for those of you making any changes to the @code{g77} sources to port @code{g77}, e.g. to OS/2. ! @email{fortran@@gnu.ai.mit.edu} has received a fair number of bug reports that turned out to be problems with other peoples' ports and distributions, about which nothing could be done for the --- 2190,2194 ---- This especially goes for those of you making any changes to the @code{g77} sources to port @code{g77}, e.g. to OS/2. ! @email{fortran@@gnu.org} has received a fair number of bug reports that turned out to be problems with other peoples' ports and distributions, about which nothing could be done for the diff -rcp2N g77-0.5.21/f/intdoc.c g77-0.5.22/f/intdoc.c *** g77-0.5.21/f/intdoc.c Tue Sep 9 06:11:36 1997 --- g77-0.5.22/f/intdoc.c Wed Dec 24 01:18:01 1997 *************** external procedure.\n\ *** 495,499 **** || (argi[0] == 'n') || (argi[0] == '+') ! || (argi[0] == 'p')) printf ("-1, @var{%s}-2, @dots{}, @var{%s}-n", argc, argc); --- 495,499 ---- || (argi[0] == 'n') || (argi[0] == '+') ! || (argi[0] == 'p')) printf ("-1, @var{%s}-2, @dots{}, @var{%s}-n", argc, argc); *************** this intrinsic is valid only when used a *** 560,564 **** #if 0 else if ((c[0] == 'I') ! && (c[1] == 'p')) printf (", the exact type being wide enough to hold a pointer\n\ on the target system (typically @code{INTEGER(KIND=1)} or @code{INTEGER(KIND=4)}).\n\n"); --- 560,564 ---- #if 0 else if ((c[0] == 'I') ! && (c[1] == '7')) printf (", the exact type being wide enough to hold a pointer\n\ on the target system (typically @code{INTEGER(KIND=1)} or @code{INTEGER(KIND=4)}).\n\n"); *************** types of all the arguments.\n\n"); *** 731,738 **** break; - case 'p': - printf ("@code{INTEGER} wide enough to hold a pointer"); - break; - default: assert ("Ia" == NULL); --- 731,734 ---- *************** types of all the arguments.\n\n"); *** 849,853 **** default: ! assert ("N1" == NULL); break; } --- 845,849 ---- default: ! assert ("E1" == NULL); break; } *************** print_type_string (char *c) *** 1210,1217 **** break; - case 'p': - printf ("@code{INTEGER(KIND=0)}"); - break; - default: assert ("Ia" == NULL); --- 1206,1209 ---- *************** print_type_string (char *c) *** 1337,1341 **** default: ! assert ("arg type?" == NULL); break; } --- 1329,1333 ---- default: ! assert ("type?" == NULL); break; } diff -rcp2N g77-0.5.21/f/intdoc.in g77-0.5.22/f/intdoc.in *** g77-0.5.21/f/intdoc.in Tue Sep 2 21:27:06 1997 --- g77-0.5.22/f/intdoc.in Sun Mar 15 10:51:01 1998 *************** DEFDOC (SECOND_func, "Get CPU time for p *** 1283,1288 **** Returns the process's runtime in seconds---the same value as the UNIX function @code{etime} returns. - - This routine is known from Cray Fortran. ") --- 1283,1286 ---- *************** Returns the process's runtime in seconds *** 1291,1295 **** as the UNIX function @code{etime} returns. ! This routine is known from Cray Fortran. @xref{Cpu_Time Intrinsic} for a standard equivalent. ") --- 1289,1293 ---- as the UNIX function @code{etime} returns. ! This routine is known from Cray Fortran. @xref{CPU_Time Intrinsic} for a standard equivalent. ") *************** on success or a non-zero error code othe *** 1446,1449 **** --- 1444,1451 ---- See @code{chdir(3)}. + @emph{Caution:} Using this routine during I/O to a unit connected with a + non-absolute file name can cause subsequent I/O on such a unit to fail + because the I/O library may reopen files by name. + Some non-GNU implementations of Fortran provide this intrinsic as only a function, not as a subroutine, or do not support the *************** Returns 0 on success or a non-zero error *** 1456,1459 **** --- 1458,1465 ---- See @code{chdir(3)}. + @emph{Caution:} Using this routine during I/O to a unit connected with a + non-absolute file name can cause subsequent I/O on such a unit to fail + because the I/O library may reopen files by name. + Due to the side effects performed by this intrinsic, the function form is not recommended. *************** trailing blanks in @var{@1@} are ignored *** 2040,2043 **** --- 2046,2055 ---- DEFDOC (GETLOG, "Get login name.", "\ Returns the login name for the process in @var{@1@}. + + @emph{Caution:} On some systems, the @code{getlogin(3)} + function, which this intrinsic calls at run time, + is either not implemented or returns a null pointer. + In the latter case, this intrinsic returns blanks + in @var{@1@}. ") *************** If @var{@2@} is a an @code{EXTERNAL} rou *** 2191,2200 **** invoked with a single integer argument (of system-dependent length) when signal @var{@1@} occurs. ! If @var{@1@} is an integer, it can be ! used to turn off handling of signal @var{@2@} or revert to its default action. See @code{signal(2)}. ! Note that @var{@2@} will be called using C conventions, so its value in Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it. --- 2203,2213 ---- invoked with a single integer argument (of system-dependent length) when signal @var{@1@} occurs. ! If @var{@2@} is an integer, it can be ! used to turn off handling of signal @var{@1@} or revert to its default action. See @code{signal(2)}. ! Note that @var{@2@} will be called using C conventions, ! so the value of its argument in Fortran terms Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it. *************** Some non-GNU implementations of Fortran *** 2206,2209 **** --- 2219,2250 ---- only a function, not as a subroutine, or do not support the (optional) @var{@3@} argument. + + @emph{Warning:} Use of the @code{libf2c} run-time library function + @samp{signal_} directly + (such as via @samp{EXTERNAL SIGNAL}) + requires use of the @code{%VAL()} construct + to pass an @code{INTEGER} value + (such as @samp{SIG_IGN} or @samp{SIG_DFL}) + for the @var{@2@} argument. + + However, while @samp{CALL SIGNAL(@var{signum}, %VAL(SIG_IGN))} + works when @samp{SIGNAL} is treated as an external procedure + (and resolves, at link time, to @code{libf2c}'s @samp{signal_} routine), + this construct is not valid when @samp{SIGNAL} is recognized + as the intrinsic of that name. + + Therefore, for maximum portability and reliability, + code such references to the @samp{SIGNAL} facility as follows: + + @smallexample + INTRINSIC SIGNAL + @dots{} + CALL SIGNAL(@var{signum}, SIG_IGN) + @end smallexample + + @code{g77} will compile such a call correctly, + while other compilers will generally either do so as well + or reject the @samp{INTRINSIC SIGNAL} statement via a diagnostic, + allowing you to take appropriate action. ") *************** If @var{@2@} is a an @code{EXTERNAL} rou *** 2212,2222 **** invoked with a single integer argument (of system-dependent length) when signal @var{@1@} occurs. ! If @var{@1@} is an integer, it can be ! used to turn off handling of signal @var{@2@} or revert to its default action. See @code{signal(2)}. ! Note that @var{@2@} will be called using C conventions, so its value in ! Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it. The value returned by @code{signal(2)} is returned. --- 2253,2264 ---- invoked with a single integer argument (of system-dependent length) when signal @var{@1@} occurs. ! If @var{@2@} is an integer, it can be ! used to turn off handling of signal @var{@1@} or revert to its default action. See @code{signal(2)}. ! Note that @var{@2@} will be called using C conventions, ! so the value of its argument in Fortran terms ! is obtained by applying @code{%LOC()} (or @var{LOC()}) to it. The value returned by @code{signal(2)} is returned. *************** The value returned by @code{signal(2)} i *** 2224,2227 **** --- 2266,2322 ---- Due to the side effects performed by this intrinsic, the function form is not recommended. + + @emph{Warning:} If the returned value is stored in + an @code{INTEGER(KIND=1)} (default @code{INTEGER}) argument, + truncation of the original return value occurs on some systems + (such as Alphas, which have 64-bit pointers but 32-bit default integers), + with no warning issued by @code{g77} under normal circumstances. + + Therefore, the following code fragment might silently fail on + some systems: + + @smallexample + INTEGER RTN + EXTERNAL MYHNDL + RTN = SIGNAL(@var{signum}, MYHNDL) + @dots{} + ! Restore original handler: + RTN = SIGNAL(@var{signum}, RTN) + @end smallexample + + The reason for the failure is that @samp{RTN} might not hold + all the information on the original handler for the signal, + thus restoring an invalid handler. + This bug could manifest itself as a spurious run-time failure + at an arbitrary point later during the program's execution, + for example. + + @emph{Warning:} Use of the @code{libf2c} run-time library function + @samp{signal_} directly + (such as via @samp{EXTERNAL SIGNAL}) + requires use of the @code{%VAL()} construct + to pass an @code{INTEGER} value + (such as @samp{SIG_IGN} or @samp{SIG_DFL}) + for the @var{@2@} argument. + + However, while @samp{RTN = SIGNAL(@var{signum}, %VAL(SIG_IGN))} + works when @samp{SIGNAL} is treated as an external procedure + (and resolves, at link time, to @code{libf2c}'s @samp{signal_} routine), + this construct is not valid when @samp{SIGNAL} is recognized + as the intrinsic of that name. + + Therefore, for maximum portability and reliability, + code such references to the @samp{SIGNAL} facility as follows: + + @smallexample + INTRINSIC SIGNAL + @dots{} + RTN = SIGNAL(@var{signum}, SIG_IGN) + @end smallexample + + @code{g77} will compile such a call correctly, + while other compilers will generally either do so as well + or reject the @samp{INTRINSIC SIGNAL} statement via a diagnostic, + allowing you to take appropriate action. ") diff -rcp2N g77-0.5.21/f/intrin.c g77-0.5.22/f/intrin.c *** g77-0.5.21/f/intrin.c Fri Aug 8 04:34:55 1997 --- g77-0.5.22/f/intrin.c Sun Mar 8 21:36:59 1998 *************** *** 1,4 **** /* intrin.c -- Recognize references to intrinsics ! Copyright (C) 1995-1997 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* intrin.c -- Recognize references to intrinsics ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** ffeintrin_check_ (ffeintrinImp imp, ffeb *** 399,402 **** --- 399,406 ---- akt = 3; break; + + case 7: + akt = ffecom_pointer_kind (); + break; } } *************** ffeintrin_check_ (ffeintrinImp imp, ffeb *** 520,528 **** } - /* Ignore explicit trailing omitted args. */ - - while ((arg != NULL) && (ffebld_head (arg) == NULL)) - arg = ffebld_trail (arg); - if (arg != NULL) return FFEBAD_INTRINSIC_TOOMANY; --- 524,527 ---- *************** ffeintrin_check_ (ffeintrinImp imp, ffeb *** 594,597 **** --- 593,600 ---- kt = 3; break; + + case 7: + kt = ffecom_pointer_kind (); + break; } } *************** ffeintrin_check_ (ffeintrinImp imp, ffeb *** 604,611 **** break; - case 'p': - kt = ffecom_pointer_kind (); - break; - case '=': need_col = TRUE; --- 607,610 ---- *************** ffeintrin_check_ (ffeintrinImp imp, ffeb *** 992,995 **** --- 991,998 ---- akt = 3; break; + + case 7: + akt = ffecom_pointer_kind (); + break; } } *************** ffeintrin_fulfill_generic (ffebld *expr, *** 1364,1368 **** && (((bt != ffesymbol_basictype (ffebld_symter (symter))) || (kt != ffesymbol_kindtype (ffebld_symter (symter))) ! || (sz != ffesymbol_size (ffebld_symter (symter)))))) { ffebad_start (FFEBAD_INTRINSIC_TYPE); --- 1367,1372 ---- && (((bt != ffesymbol_basictype (ffebld_symter (symter))) || (kt != ffesymbol_kindtype (ffebld_symter (symter))) ! || ((sz != FFETARGET_charactersizeNONE) ! && (sz != ffesymbol_size (ffebld_symter (symter))))))) { ffebad_start (FFEBAD_INTRINSIC_TYPE); *************** ffeintrin_init_0 () *** 1570,1581 **** if ((c[0] != '-') && (c[0] != 'A') ! && (c[0] != 'C') ! && (c[0] != 'I') ! && (c[0] != 'L') ! && (c[0] != 'R') ! && (c[0] != 'B') ! && (c[0] != 'F') ! && (c[0] != 'N') ! && (c[0] != 'S')) { fprintf (stderr, "%s: bad return-base-type\n", --- 1574,1585 ---- if ((c[0] != '-') && (c[0] != 'A') ! && (c[0] != 'C') ! && (c[0] != 'I') ! && (c[0] != 'L') ! && (c[0] != 'R') ! && (c[0] != 'B') ! && (c[0] != 'F') ! && (c[0] != 'N') ! && (c[0] != 'S')) { fprintf (stderr, "%s: bad return-base-type\n", *************** ffeintrin_init_0 () *** 1585,1592 **** if ((c[1] != '-') && (c[1] != '=') ! && ((c[1] < '1') ! || (c[1] > '9')) ! && (c[1] != 'C') ! && (c[1] != 'p')) { fprintf (stderr, "%s: bad return-kind-type\n", --- 1589,1595 ---- if ((c[1] != '-') && (c[1] != '=') ! && ((c[1] < '1') ! || (c[1] > '9')) ! && (c[1] != 'C')) { fprintf (stderr, "%s: bad return-kind-type\n", *************** ffeintrin_init_0 () *** 1614,1619 **** if ((c[colon + 1] != '-') && (c[colon + 1] != '*') ! && ((c[colon + 1] < '0') ! || (c[colon + 1] > '9'))) { fprintf (stderr, "%s: bad COL-spec\n", --- 1617,1622 ---- if ((c[colon + 1] != '-') && (c[colon + 1] != '*') ! && ((c[colon + 1] < '0') ! || (c[colon + 1] > '9'))) { fprintf (stderr, "%s: bad COL-spec\n", *************** ffeintrin_init_0 () *** 1626,1630 **** while ((c[0] != '=') && (c[0] != ',') ! && (c[0] != '\0')) ++c; if (c[0] != '=') --- 1629,1633 ---- while ((c[0] != '=') && (c[0] != ',') ! && (c[0] != '\0')) ++c; if (c[0] != '=') *************** ffeintrin_init_0 () *** 1636,1661 **** if ((c[1] == '?') || (c[1] == '!') - || (c[1] == '!') || (c[1] == '+') ! || (c[1] == '*') || (c[1] == 'n') ! || (c[1] == 'p')) ++c; if (((c[1] != '-') && (c[1] != 'A') ! && (c[1] != 'C') ! && (c[1] != 'I') ! && (c[1] != 'L') ! && (c[1] != 'R') ! && (c[1] != 'B') ! && (c[1] != 'F') ! && (c[1] != 'N') ! && (c[1] != 'S') ! && (c[1] != 'g') ! && (c[1] != 's')) || ((c[2] != '*') && ((c[2] < '1') || (c[2] > '9')) ! && (c[2] != 'A'))) { fprintf (stderr, "%s: bad arg-type\n", --- 1639,1663 ---- if ((c[1] == '?') || (c[1] == '!') || (c[1] == '+') ! || (c[1] == '*') || (c[1] == 'n') ! || (c[1] == 'p')) ++c; if (((c[1] != '-') && (c[1] != 'A') ! && (c[1] != 'C') ! && (c[1] != 'I') ! && (c[1] != 'L') ! && (c[1] != 'R') ! && (c[1] != 'B') ! && (c[1] != 'F') ! && (c[1] != 'N') ! && (c[1] != 'S') ! && (c[1] != 'g') ! && (c[1] != 's')) || ((c[2] != '*') && ((c[2] < '1') || (c[2] > '9')) ! && (c[2] != 'A'))) { fprintf (stderr, "%s: bad arg-type\n", *************** ffeintrin_init_0 () *** 1694,1704 **** if ((c[3] == '&') || (c[3] == 'i') ! || (c[3] == 'w') ! || (c[3] == 'x')) ++c; if (c[3] == ',') { c += 4; ! break; } if (c[3] != '\0') --- 1696,1706 ---- if ((c[3] == '&') || (c[3] == 'i') ! || (c[3] == 'w') ! || (c[3] == 'x')) ++c; if (c[3] == ',') { c += 4; ! continue; } if (c[3] != '\0') diff -rcp2N g77-0.5.21/f/intrin.def g77-0.5.22/f/intrin.def *** g77-0.5.21/f/intrin.def Mon Aug 11 05:58:07 1997 --- g77-0.5.22/f/intrin.def Sun Mar 15 10:48:45 1998 *************** DEFNAME ("AINT", "aint", "AInt", genNO *** 26,30 **** DEFNAME ("AJMAX0", "ajmax0", "AJMax0", genNONE, specAJMAX0) /* VXT */ DEFNAME ("AJMIN0", "ajmin0", "AJMin0", genNONE, specAJMIN0) /* VXT */ ! DEFNAME ("ALARM", "alarm", "Alarm", genNONE, specALARM) /* UNIX */ DEFNAME ("ALL", "all", "All", genNONE, specALL) /* F90 */ DEFNAME ("ALLOCATED", "allocated", "Allocated", genNONE, specALLOCATED) /* F90 */ --- 26,30 ---- DEFNAME ("AJMAX0", "ajmax0", "AJMax0", genNONE, specAJMAX0) /* VXT */ DEFNAME ("AJMIN0", "ajmin0", "AJMin0", genNONE, specAJMIN0) /* VXT */ ! DEFNAME ("ALARM", "alarm", "Alarm", genNONE, specALARM) /* UNIX */ DEFNAME ("ALL", "all", "All", genNONE, specALL) /* F90 */ DEFNAME ("ALLOCATED", "allocated", "Allocated", genNONE, specALLOCATED) /* F90 */ *************** DEFNAME ("COSD", "cosd", "CosD", genNO *** 77,81 **** DEFNAME ("COSH", "cosh", "CosH", genNONE, specCOSH) DEFNAME ("COUNT", "count", "Count", genNONE, specCOUNT) /* F90 */ ! DEFNAME ("CPU_TIME", "cpu_time", "Cpu_Time", genNONE, specCPU_TIME) /* F95 */ DEFNAME ("CSHIFT", "cshift", "CShift", genNONE, specCSHIFT) /* F90 */ DEFNAME ("CSIN", "csin", "CSin", genNONE, specCSIN) --- 77,81 ---- DEFNAME ("COSH", "cosh", "CosH", genNONE, specCOSH) DEFNAME ("COUNT", "count", "Count", genNONE, specCOUNT) /* F90 */ ! DEFNAME ("CPU_TIME", "cpu_time", "CPU_Time", genNONE, specCPU_TIME) /* F95 */ DEFNAME ("CSHIFT", "cshift", "CShift", genNONE, specCSHIFT) /* F90 */ DEFNAME ("CSIN", "csin", "CSin", genNONE, specCSIN) *************** DEFSPEC (NONE, *** 3039,3044 **** 4 (Twice the size of 2) 6 (Twice the size as 3) C Like 1 (F77), except (F90), if COL is COMPLEX, uses kind type of COL - p ffecom_pointer_kind_ is: --- 3039,3044 ---- 4 (Twice the size of 2) 6 (Twice the size as 3) + 7 (Same size as `char *') C Like 1 (F77), except (F90), if COL is COMPLEX, uses kind type of COL is: *************** DEFIMP (TANH, "TANH", L_TANH,TANH,, "R *** 3207,3211 **** DEFIMP (ABORT, "ABORT", ABORT,,, "--:-:") ! DEFIMP (ACCESS, "ACCESS", ACCESS,,, "I1:-:Name=A1,Mode=A1") DEFIMP (ACHAR, "ACHAR", ,,, "A1:-:I=I*") DEFIMP (ALARM, "ALARM", ALARM,,, "--:-:Seconds=I*,Handler=s*,Status=?I1w") --- 3207,3211 ---- DEFIMP (ABORT, "ABORT", ABORT,,, "--:-:") ! DEFIMP (ACCESS, "ACCESS", ACCESS,,, "I1:-:Name=A1,Mode=A1") DEFIMP (ACHAR, "ACHAR", ,,, "A1:-:I=I*") DEFIMP (ALARM, "ALARM", ALARM,,, "--:-:Seconds=I*,Handler=s*,Status=?I1w") *************** DEFIMP (CHMOD_func, "CHMOD_func", CHMOD, *** 3230,3237 **** DEFIMP (CHMOD_subr, "CHMOD_subr", CHMOD,,, "--:-:Name=A1,Mode=A1,Status=?I1w") DEFIMP (COMPLEX, "COMPLEX", ,,, "C=:*:Real=S*,Imag=S*") ! DEFIMP (CPU_TIME, "CPU_TIME", ,,, "--:-:Seconds=R1w") ! DEFIMP (CTIME_func, "CTIME_func", CTIME,,, "A1*:-:STime=I*") ! DEFIMP (CTIME_subr, "CTIME_subr", CTIME,,, "--:-:Result=A1w,STime=I*") ! DEFIMP (DATE, "DATE", DATE,,, "--:-:Date=A1w") DEFIMP (DBESJ0, "DBESJ0", L_BESJ0,,, "R2:-:X=R2") DEFIMP (DBESJ1, "DBESJ1", L_BESJ1,,, "R2:-:X=R2") --- 3230,3237 ---- DEFIMP (CHMOD_subr, "CHMOD_subr", CHMOD,,, "--:-:Name=A1,Mode=A1,Status=?I1w") DEFIMP (COMPLEX, "COMPLEX", ,,, "C=:*:Real=S*,Imag=S*") ! DEFIMP (CPU_TIME, "CPU_TIME", SECOND,,, "--:-:Seconds=R*w") ! DEFIMP (CTIME_func, "CTIME_func", CTIME,,, "A1*:-:STime=I*") ! DEFIMP (CTIME_subr, "CTIME_subr", CTIME,,, "--:-:Result=A1w,STime=I*") ! DEFIMP (DATE, "DATE", DATE,,, "--:-:Date=A1w") DEFIMP (DBESJ0, "DBESJ0", L_BESJ0,,, "R2:-:X=R2") DEFIMP (DBESJ1, "DBESJ1", L_BESJ1,,, "R2:-:X=R2") *************** DEFIMP (DFLOAT, "DFLOAT", ,,, "R2:-:A=I *** 3246,3271 **** DEFIMP (DIMAG, "DIMAG", ,DIMAG,, "R2:-:Z=C2") DEFIMP (DREAL, "DREAL", ,,, "R2:-:A=N*") ! DEFIMP (DTIME_func, "DTIME_func", DTIME,,, "R1:-:TArray=R1(2)w") ! DEFIMP (DTIME_subr, "DTIME_subr", DTIME,,, "--:-:Result=R1w,TArray=R1(2)w") DEFIMP (ERF, "ERF", L_ERF,ERF,, "R=:0:X=R*") DEFIMP (ERFC, "ERFC", L_ERFC,ERFC,, "R=:0:X=R*") ! DEFIMP (ETIME_func, "ETIME_func", ETIME,,, "R1:-:TArray=R1(2)w") ! DEFIMP (ETIME_subr, "ETIME_subr", ETIME,,, "--:-:Result=R1w,TArray=R1(2)w") DEFIMP (EXIT, "EXIT", EXIT,,, "--:-:Status=?I*") ! DEFIMP (FDATE_func, "FDATE_func", FDATE,,, "A1*:-:") ! DEFIMP (FDATE_subr, "FDATE_subr", FDATE,,, "--:-:Date=A1w") ! DEFIMP (FGET_func, "FGET_func", FGET,,, "I1:-:C=A1w") ! DEFIMP (FGET_subr, "FGET_subr", FGET,,, "--:-:C=A1w,Status=?I1w") ! DEFIMP (FGETC_func, "FGETC_func", FGETC,,, "I1:-:Unit=I*,C=A1w") ! DEFIMP (FGETC_subr, "FGETC_subr", FGETC,,, "--:-:Unit=I*,C=A1w,Status=?I1w") DEFIMP (FLUSH, "FLUSH", ,,, "--:-:Unit=?I*") ! DEFIMP (FNUM, "FNUM", FNUM,,, "I1:-:Unit=I*") ! DEFIMP (FPUT_func, "FPUT_func", FPUT,,, "I1:-:C=A1") ! DEFIMP (FPUT_subr, "FPUT_subr", FPUT,,, "--:-:C=A1,Status=?I1w") ! DEFIMP (FPUTC_func, "FPUTC_func", FPUTC,,, "I1:-:Unit=I*,C=A1") ! DEFIMP (FPUTC_subr, "FPUTC_subr", FPUTC,,, "--:-:Unit=I*,C=A1,Status=?I1w") DEFIMP (FSEEK, "FSEEK", FSEEK,,, "--:-:Unit=I*,Offset=I*,Whence=I*,ErrLab=?g*") ! DEFIMP (FSTAT_func, "FSTAT_func", FSTAT,,, "I1:-:Unit=I*,SArray=I1(13)w") ! DEFIMP (FSTAT_subr, "FSTAT_subr", FSTAT,,, "--:-:Unit=I*,SArray=I1(13)w,Status=?I1w") DEFIMP (FTELL_func, "FTELL_func", FTELL,,, "I1:-:Unit=I*") DEFIMP (FTELL_subr, "FTELL_subr", FTELL,,, "--:-:Unit=I*,Offset=I1w") --- 3246,3271 ---- DEFIMP (DIMAG, "DIMAG", ,DIMAG,, "R2:-:Z=C2") DEFIMP (DREAL, "DREAL", ,,, "R2:-:A=N*") ! DEFIMP (DTIME_func, "DTIME_func", DTIME,,, "R1:-:TArray=R1(2)w") ! DEFIMP (DTIME_subr, "DTIME_subr", DTIME,,, "--:-:Result=R1w,TArray=R1(2)w") DEFIMP (ERF, "ERF", L_ERF,ERF,, "R=:0:X=R*") DEFIMP (ERFC, "ERFC", L_ERFC,ERFC,, "R=:0:X=R*") ! DEFIMP (ETIME_func, "ETIME_func", ETIME,,, "R1:-:TArray=R1(2)w") ! DEFIMP (ETIME_subr, "ETIME_subr", ETIME,,, "--:-:Result=R1w,TArray=R1(2)w") DEFIMP (EXIT, "EXIT", EXIT,,, "--:-:Status=?I*") ! DEFIMP (FDATE_func, "FDATE_func", FDATE,,, "A1*:-:") ! DEFIMP (FDATE_subr, "FDATE_subr", FDATE,,, "--:-:Date=A1w") ! DEFIMP (FGET_func, "FGET_func", FGET,,, "I1:-:C=A1w") ! DEFIMP (FGET_subr, "FGET_subr", FGET,,, "--:-:C=A1w,Status=?I1w") ! DEFIMP (FGETC_func, "FGETC_func", FGETC,,, "I1:-:Unit=I*,C=A1w") ! DEFIMP (FGETC_subr, "FGETC_subr", FGETC,,, "--:-:Unit=I*,C=A1w,Status=?I1w") DEFIMP (FLUSH, "FLUSH", ,,, "--:-:Unit=?I*") ! DEFIMP (FNUM, "FNUM", FNUM,,, "I1:-:Unit=I*") ! DEFIMP (FPUT_func, "FPUT_func", FPUT,,, "I1:-:C=A1") ! DEFIMP (FPUT_subr, "FPUT_subr", FPUT,,, "--:-:C=A1,Status=?I1w") ! DEFIMP (FPUTC_func, "FPUTC_func", FPUTC,,, "I1:-:Unit=I*,C=A1") ! DEFIMP (FPUTC_subr, "FPUTC_subr", FPUTC,,, "--:-:Unit=I*,C=A1,Status=?I1w") DEFIMP (FSEEK, "FSEEK", FSEEK,,, "--:-:Unit=I*,Offset=I*,Whence=I*,ErrLab=?g*") ! DEFIMP (FSTAT_func, "FSTAT_func", FSTAT,,, "I1:-:Unit=I*,SArray=I1(13)w") ! DEFIMP (FSTAT_subr, "FSTAT_subr", FSTAT,,, "--:-:Unit=I*,SArray=I1(13)w,Status=?I1w") DEFIMP (FTELL_func, "FTELL_func", FTELL,,, "I1:-:Unit=I*") DEFIMP (FTELL_subr, "FTELL_subr", FTELL,,, "--:-:Unit=I*,Offset=I1w") *************** DEFIMP (GETPID, "GETPID", GETPID,,, "I1: *** 3279,3283 **** DEFIMP (GETUID, "GETUID", GETUID,,, "I1:-:") DEFIMP (GETENV, "GETENV", GETENV,,, "--:-:Name=A1,Value=A1w") ! DEFIMP (GMTIME, "GMTIME", GMTIME,,, "--:-:STime=I1,TArray=I1(9)w") DEFIMP (HOSTNM_func, "HOSTNM_func", HOSTNM,,, "I1:-:Name=A1w") DEFIMP (HOSTNM_subr, "HOSTNM_subr", HOSTNM,,, "--:-:Name=A1w,Status=?I1w") --- 3279,3283 ---- DEFIMP (GETUID, "GETUID", GETUID,,, "I1:-:") DEFIMP (GETENV, "GETENV", GETENV,,, "--:-:Name=A1,Value=A1w") ! DEFIMP (GMTIME, "GMTIME", GMTIME,,, "--:-:STime=I1,TArray=I1(9)w") DEFIMP (HOSTNM_func, "HOSTNM_func", HOSTNM,,, "I1:-:Name=A1w") DEFIMP (HOSTNM_subr, "HOSTNM_subr", HOSTNM,,, "--:-:Name=A1w,Status=?I1w") *************** DEFIMP (IBCLR, "IBCLR", ,,, "I=:0:I=I* *** 3288,3338 **** DEFIMP (IBITS, "IBITS", ,,, "I=:0:I=I*,Pos=I*,Len=I*") DEFIMP (IBSET, "IBSET", ,,, "I=:0:I=I*,Pos=I*") ! DEFIMP (IDATE_unix, "IDATE_unix", IDATE,,, "--:-:TArray=I1(3)w") ! DEFIMP (IDATE_vxt, "IDATE_vxt", VXTIDATE,,, "--:-:M=I1w,D=I1w,Y=I1w") DEFIMP (IEOR, "IEOR", ,,, "I=:*:I=I*,J=I*") DEFIMP (IOR, "IOR", ,,, "I=:*:I=I*,J=I*") ! DEFIMP (IERRNO, "IERRNO", IERRNO,,, "I1:-:") DEFIMP (IMAGPART, "IMAGPART", ,,, "R=:0:Z=C*") ! DEFIMP (INT2, "INT2", ,,, "I6:-:A=I*") ! DEFIMP (INT8, "INT8", ,,, "I2:-:A=I*") ! DEFIMP (IRAND, "IRAND", IRAND,,, "I1:-:Flag=?I*") ! DEFIMP (ISATTY, "ISATTY", ISATTY,,, "L1:-:Unit=I*") DEFIMP (ISHFT, "ISHFT", ,,, "I=:0:I=I*,Shift=I*") DEFIMP (ISHFTC, "ISHFTC", ,,, "I=:0:I=I*,Shift=I*,Size=I*") ! DEFIMP (ITIME, "ITIME", ITIME,,, "--:-:TArray=I1(3)w") ! DEFIMP (KILL_func, "KILL_func", KILL,,, "I1:-:Pid=I*,Signal=I*") ! DEFIMP (KILL_subr, "KILL_subr", KILL,,, "--:-:Pid=I*,Signal=I*,Status=?I1w") ! DEFIMP (LINK_func, "LINK_func", LINK,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (LINK_subr, "LINK_subr", LINK,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") ! DEFIMP (LNBLNK, "LNBLNK", LNBLNK,,, "I1:-:String=A1") DEFIMP (LONG, "LONG", ,,, "I1:-:A=I6") ! DEFIMP (LSTAT_func, "LSTAT_func", LSTAT,,, "I1:-:File=A1,SArray=I1(13)w") ! DEFIMP (LSTAT_subr, "LSTAT_subr", LSTAT,,, "--:-:File=A1,SArray=I1(13)w,Status=?I1w") ! DEFIMP (LTIME, "LTIME", LTIME,,, "--:-:STime=I1,TArray=I1(9)w") ! DEFIMP (LOC, "LOC", ,,, "Ip:-:Entity=-*&&") DEFIMP (LSHIFT, "LSHIFT", ,,, "I=:0:I=I*,Shift=I*") ! DEFIMP (MCLOCK, "MCLOCK", MCLOCK,,, "I1:-:") ! DEFIMP (MCLOCK8, "MCLOCK8", MCLOCK,,, "I2:-:") DEFIMP (MVBITS, "MVBITS", ,,, "--:-:From=I*,FromPos=I*,Len=I*,TO=IAx,ToPos=I*") DEFIMP (NOT, "NOT", ,,, "I=:0:I=I*") DEFIMP (OR, "OR", ,,, "B=:*:I=B*,J=B*") DEFIMP (PERROR, "PERROR", PERROR,,, "--:-:String=A1") ! DEFIMP (RAND, "RAND", RAND,,, "R1:-:Flag=?I*") DEFIMP (REALPART, "REALPART", ,,, "R=:0:Z=C*") ! DEFIMP (RENAME_func, "RENAME_func", RENAME,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (RENAME_subr, "RENAME_subr", RENAME,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") DEFIMP (RSHIFT, "RSHIFT", ,,, "I=:0:I=I*,Shift=I*") ! DEFIMP (SECNDS, "SECNDS", SECNDS,,, "R1:-:T=R1") ! DEFIMP (SECOND_func, "SECOND_func", SECOND,SECOND,, "R1:-:") ! DEFIMP (SECOND_subr, "SECOND_subr", SECOND,,, "--:-:Seconds=R1w") DEFIMP (SHORT, "SHORT", ,,, "I6:-:A=I*") ! DEFIMP (SIGNAL_func, "SIGNAL_func", L_SIGNAL,,, "I1:-:Number=I*,Handler=s*") ! DEFIMP (SIGNAL_subr, "SIGNAL_subr", L_SIGNAL,,, "--:-:Number=I*,Handler=s*,Status=?I1w") DEFIMP (SLEEP, "SLEEP", SLEEP,,, "--:-:Seconds=I1") ! DEFIMP (SRAND, "SRAND", SRAND,,, "--:-:Seed=I*") ! DEFIMP (STAT_func, "STAT_func", STAT,,, "I1:-:File=A1,SArray=I1(13)w") ! DEFIMP (STAT_subr, "STAT_subr", STAT,,, "--:-:File=A1,SArray=I1(13)w,Status=?I1w") ! DEFIMP (SYMLNK_func, "SYMLNK_func", SYMLNK,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (SYMLNK_subr, "SYMLNK_subr", SYMLNK,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") DEFIMP (SYSTEM_func, "SYSTEM_func", SYSTEM,SYSTEM,SYSTEM,"I1:-:Command=A1") DEFIMP (SYSTEM_subr, "SYSTEM_subr", SYSTEM,,, "--:-:Command=A1,Status=?I1w") --- 3288,3338 ---- DEFIMP (IBITS, "IBITS", ,,, "I=:0:I=I*,Pos=I*,Len=I*") DEFIMP (IBSET, "IBSET", ,,, "I=:0:I=I*,Pos=I*") ! DEFIMP (IDATE_unix, "IDATE_unix", IDATE,,, "--:-:TArray=I1(3)w") ! DEFIMP (IDATE_vxt, "IDATE_vxt", VXTIDATE,,, "--:-:M=I1w,D=I1w,Y=I1w") DEFIMP (IEOR, "IEOR", ,,, "I=:*:I=I*,J=I*") DEFIMP (IOR, "IOR", ,,, "I=:*:I=I*,J=I*") ! DEFIMP (IERRNO, "IERRNO", IERRNO,,, "I1:-:") DEFIMP (IMAGPART, "IMAGPART", ,,, "R=:0:Z=C*") ! DEFIMP (INT2, "INT2", ,,, "I6:-:A=N*") ! DEFIMP (INT8, "INT8", ,,, "I2:-:A=N*") ! DEFIMP (IRAND, "IRAND", IRAND,,, "I1:-:Flag=?I*") ! DEFIMP (ISATTY, "ISATTY", ISATTY,,, "L1:-:Unit=I*") DEFIMP (ISHFT, "ISHFT", ,,, "I=:0:I=I*,Shift=I*") DEFIMP (ISHFTC, "ISHFTC", ,,, "I=:0:I=I*,Shift=I*,Size=I*") ! DEFIMP (ITIME, "ITIME", ITIME,,, "--:-:TArray=I1(3)w") ! DEFIMP (KILL_func, "KILL_func", KILL,,, "I1:-:Pid=I*,Signal=I*") ! DEFIMP (KILL_subr, "KILL_subr", KILL,,, "--:-:Pid=I*,Signal=I*,Status=?I1w") ! DEFIMP (LINK_func, "LINK_func", LINK,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (LINK_subr, "LINK_subr", LINK,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") ! DEFIMP (LNBLNK, "LNBLNK", LNBLNK,,, "I1:-:String=A1") DEFIMP (LONG, "LONG", ,,, "I1:-:A=I6") ! DEFIMP (LSTAT_func, "LSTAT_func", LSTAT,,, "I1:-:File=A1,SArray=I1(13)w") ! DEFIMP (LSTAT_subr, "LSTAT_subr", LSTAT,,, "--:-:File=A1,SArray=I1(13)w,Status=?I1w") ! DEFIMP (LTIME, "LTIME", LTIME,,, "--:-:STime=I1,TArray=I1(9)w") ! DEFIMP (LOC, "LOC", ,,, "I7:-:Entity=-*&&") DEFIMP (LSHIFT, "LSHIFT", ,,, "I=:0:I=I*,Shift=I*") ! DEFIMP (MCLOCK, "MCLOCK", MCLOCK,,, "I1:-:") ! DEFIMP (MCLOCK8, "MCLOCK8", MCLOCK,,, "I2:-:") DEFIMP (MVBITS, "MVBITS", ,,, "--:-:From=I*,FromPos=I*,Len=I*,TO=IAx,ToPos=I*") DEFIMP (NOT, "NOT", ,,, "I=:0:I=I*") DEFIMP (OR, "OR", ,,, "B=:*:I=B*,J=B*") DEFIMP (PERROR, "PERROR", PERROR,,, "--:-:String=A1") ! DEFIMP (RAND, "RAND", RAND,,, "R1:-:Flag=?I*") DEFIMP (REALPART, "REALPART", ,,, "R=:0:Z=C*") ! DEFIMP (RENAME_func, "RENAME_func", RENAME,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (RENAME_subr, "RENAME_subr", RENAME,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") DEFIMP (RSHIFT, "RSHIFT", ,,, "I=:0:I=I*,Shift=I*") ! DEFIMP (SECNDS, "SECNDS", SECNDS,,, "R1:-:T=R1") ! DEFIMP (SECOND_func, "SECOND_func", SECOND,SECOND,, "R1:-:") ! DEFIMP (SECOND_subr, "SECOND_subr", SECOND,,, "--:-:Seconds=R*w") DEFIMP (SHORT, "SHORT", ,,, "I6:-:A=I*") ! DEFIMP (SIGNAL_func, "SIGNAL_func", L_SIGNAL,,, "I7:-:Number=I*,Handler=s*") ! DEFIMP (SIGNAL_subr, "SIGNAL_subr", L_SIGNAL,,, "--:-:Number=I*,Handler=s*,Status=?I7w") DEFIMP (SLEEP, "SLEEP", SLEEP,,, "--:-:Seconds=I1") ! DEFIMP (SRAND, "SRAND", SRAND,,, "--:-:Seed=I*") ! DEFIMP (STAT_func, "STAT_func", STAT,,, "I1:-:File=A1,SArray=I1(13)w") ! DEFIMP (STAT_subr, "STAT_subr", STAT,,, "--:-:File=A1,SArray=I1(13)w,Status=?I1w") ! DEFIMP (SYMLNK_func, "SYMLNK_func", SYMLNK,,, "I1:-:Path1=A1,Path2=A1") ! DEFIMP (SYMLNK_subr, "SYMLNK_subr", SYMLNK,,, "--:-:Path1=A1,Path2=A1,Status=?I1w") DEFIMP (SYSTEM_func, "SYSTEM_func", SYSTEM,SYSTEM,SYSTEM,"I1:-:Command=A1") DEFIMP (SYSTEM_subr, "SYSTEM_subr", SYSTEM,,, "--:-:Command=A1,Status=?I1w") *************** DEFIMP (TIME8, "TIME8", TIME,,, "I2:-: *** 3341,3348 **** DEFIMP (TIME_unix, "TIME_unix", TIME,,, "I1:-:") DEFIMP (TIME_vxt, "TIME_vxt", VXTTIME,,, "--:-:Time=A1[8]w") ! DEFIMP (TTYNAM_func, "TTYNAM_func", TTYNAM,,, "A1*:-:Unit=I*") ! DEFIMP (TTYNAM_subr, "TTYNAM_subr", TTYNAM,,, "--:-:Name=A1w,Unit=I*") ! DEFIMP (UMASK_func, "UMASK_func", UMASK,,, "I1:-:Mask=I*") ! DEFIMP (UMASK_subr, "UMASK_subr", UMASK,,, "--:-:Mask=I*,Old=?I1w") DEFIMP (UNLINK_func, "UNLINK_func", UNLINK,,, "I1:-:File=A1") DEFIMP (UNLINK_subr, "UNLINK_subr", UNLINK,,, "--:-:File=A1,Status=?I1w") --- 3341,3348 ---- DEFIMP (TIME_unix, "TIME_unix", TIME,,, "I1:-:") DEFIMP (TIME_vxt, "TIME_vxt", VXTTIME,,, "--:-:Time=A1[8]w") ! DEFIMP (TTYNAM_func, "TTYNAM_func", TTYNAM,,, "A1*:-:Unit=I*") ! DEFIMP (TTYNAM_subr, "TTYNAM_subr", TTYNAM,,, "--:-:Name=A1w,Unit=I*") ! DEFIMP (UMASK_func, "UMASK_func", UMASK,,, "I1:-:Mask=I*") ! DEFIMP (UMASK_subr, "UMASK_subr", UMASK,,, "--:-:Mask=I*,Old=?I1w") DEFIMP (UNLINK_func, "UNLINK_func", UNLINK,,, "I1:-:File=A1") DEFIMP (UNLINK_subr, "UNLINK_subr", UNLINK,,, "--:-:File=A1,Status=?I1w") diff -rcp2N g77-0.5.21/f/lang-options.h g77-0.5.22/f/lang-options.h *** g77-0.5.21/f/lang-options.h Fri Jul 11 00:11:13 1997 --- g77-0.5.22/f/lang-options.h Tue Oct 28 08:48:20 1997 *************** the Free Software Foundation, 59 Temple *** 104,107 **** --- 104,111 ---- "-fcase-lower", "-fcase-preserve", + "-fbadu77-intrinsics-delete", + "-fbadu77-intrinsics-hide", + "-fbadu77-intrinsics-disable", + "-fbadu77-intrinsics-enable", "-fdcp-intrinsics-delete", "-fdcp-intrinsics-hide", *************** the Free Software Foundation, 59 Temple *** 116,119 **** --- 120,127 ---- "-ff90-intrinsics-disable", "-ff90-intrinsics-enable", + "-fgnu-intrinsics-delete", + "-fgnu-intrinsics-hide", + "-fgnu-intrinsics-disable", + "-fgnu-intrinsics-enable", "-fmil-intrinsics-delete", "-fmil-intrinsics-hide", diff -rcp2N g77-0.5.21/f/lex.c g77-0.5.22/f/lex.c *** g77-0.5.21/f/lex.c Sun Jul 13 20:42:39 1997 --- g77-0.5.22/f/lex.c Thu Mar 12 23:43:49 1998 *************** ffelex_append_to_token_ (char c) *** 231,235 **** #ifdef MAP_CHARACTER Sorry, MAP_CHARACTER is not going to work as expected in GNU Fortran, ! please contact fortran@gnu.ai.mit.edu if you wish to fund work to port g77 to non-ASCII machines. #endif --- 231,235 ---- #ifdef MAP_CHARACTER Sorry, MAP_CHARACTER is not going to work as expected in GNU Fortran, ! please contact fortran@gnu.org if you wish to fund work to port g77 to non-ASCII machines. #endif diff -rcp2N g77-0.5.21/f/malloc.c g77-0.5.22/f/malloc.c *** g77-0.5.21/f/malloc.c Tue Sep 2 21:25:48 1997 --- g77-0.5.22/f/malloc.c Sat Oct 25 22:47:03 1997 *************** struct _malloc_root_ malloc_root_ *** 52,56 **** 0, #if MALLOC_DEBUG ! 0, 0, 0, 0, 0, 0, 0, '/' #endif }, --- 52,56 ---- 0, #if MALLOC_DEBUG ! 0, 0, 0, 0, 0, 0, 0, { '/' } #endif }, diff -rcp2N g77-0.5.21/f/news.texi g77-0.5.22/f/news.texi *** g77-0.5.21/f/news.texi Tue Sep 9 06:11:37 1997 --- g77-0.5.22/f/news.texi Mon Mar 16 19:48:53 1998 *************** *** 6,10 **** @c in the G77 distribution, as well as in the G77 manual. ! @c 1997-09-09 @ifclear NEWSONLY --- 6,10 ---- @c in the G77 distribution, as well as in the G77 manual. ! @c 1998-03-16 @ifclear NEWSONLY *************** Changes made to recent versions of GNU F *** 18,27 **** below, with the most recent version first. ! The changes are generally listed with code-generation ! bugs first, followed by compiler crashes involving valid ! code, new features, fixes to existing features, new ! diagnostics, internal improvements, and miscellany. This order is not strict---for example, some items involve a combination of these elements. @heading In 0.5.21: --- 18,200 ---- below, with the most recent version first. ! The changes are generally listed in order: ! ! @enumerate ! @item ! Code-generation and run-time-library bugs ! ! @item ! Compiler and run-time-library crashes involving valid code ! ! @item ! New features ! ! @item ! Fixes and enhancements to existing features ! ! @item ! New diagnostics ! ! @item ! Internal improvements ! ! @item ! Miscellany ! @end enumerate ! This order is not strict---for example, some items involve a combination of these elements. + + @heading In 0.5.22: + @itemize @bullet + @item + Fix code generation for iterative @code{DO} loops that + have one or more references to the iteration variable, + or to aliases of it, in their control expressions. + For example, @samp{DO 10 J=2,J} now is compiled correctly. + + @cindex DNRM2 + @cindex stack, 387 coprocessor + @cindex ix86 + @cindex -O2 + @item + Fix a code-generation bug that afflicted + Intel x86 targets when @samp{-O2} was specified + compiling, for example, an old version of + the @samp{DNRM2} routine. + + The x87 coprocessor stack was being + mismanaged in cases involving assigned @code{GOTO} + and @code{ASSIGN}. + + @item + Fix @code{DTime} intrinsic so as not to truncate + results to integer values (on some systems). + + @item + Fix @code{SIGNAL} intrinsic so it offers portable + support for 64-bit systems (such as Digital Alphas + running GNU/Linux). + + @item + Fix run-time crash involving @code{NAMELIST} on 64-bit + machines such as Alphas. + + @item + Fix @code{g77} version of @code{libf2c} so it no longer + produces a spurious @samp{I/O recursion} diagnostic at run time + when an I/O operation (such as @samp{READ *,I}) is interrupted + in a manner that causes the program to be terminated + via the @samp{f_exit} routine (such as via @kbd{C-c}). + + @item + Fix @code{g77} crash triggered by @code{CASE} statement with + an omitted lower or upper bound. + + @item + Fix @code{g77} crash compiling references to @code{CPU_Time} + intrinsic. + + @item + Fix @code{g77} crash + (or apparently infinite run-time) + when compiling certain complicated expressions + involving @code{COMPLEX} arithmetic + (especially multiplication). + + @item + Fix @code{g77} crash on statements such as + @samp{PRINT *, (REAL(Z(I)),I=1,2)}, where + @samp{Z} is @code{DOUBLE COMPLEX}. + + @item + Fix a @code{g++} crash. + + @item + Support @samp{FORMAT(I<@var{expr}>)} when @var{expr} is a + compile-time constant @code{INTEGER} expression. + + @item + Fix @code{g77} @samp{-g} option so procedures that + use @samp{ENTRY} can be stepped through, line by line, + in @code{gdb}. + + @item + Fix a profiling-related bug in @code{gcc} back end for + Intel x86 architecture. + + @item + Allow any @code{REAL} argument to intrinsics + @code{Second} and @code{CPU_Time}. + + @item + Allow any numeric argument to intrinsics + @code{Int2} and @code{Int8}. + + @item + Use @code{tempnam}, if available, to open scratch files + (as in @samp{OPEN(STATUS='SCRATCH')} + so that the @code{TMPDIR} environment variable, + if present, is used. + + @item + Rename the @code{gcc} keyword @code{restrict} to + @code{__restrict__}, to avoid rejecting valid, existing, + C programs. + Support for @code{restrict} is now more like support + for @code{complex}. + + @item + Fix @samp{-fpedantic} to not reject procedure invocations + such as @samp{I=J()} and @samp{CALL FOO()}. + + @item + Fix @samp{-fugly-comma} to affect invocations of + only external procedures. + Restore rejection of gratuitous trailing omitted + arguments to intrinsics, as in @samp{I=MAX(3,4,,)}. + + @item + Fix compiler so it accepts @samp{-fgnu-intrinsics-*} and + @samp{-fbadu77-intrinsics-*} options. + + @item + Improve diagnostic messages from @code{libf2c} + so it is more likely that the printing of the + active format string is limited to the string, + with no trailing garbage being printed. + + (Unlike @code{f2c}, @code{g77} did not append + a null byte to its compiled form of every + format string specified via a @code{FORMAT} statement. + However, @code{f2c} would exhibit the problem + anyway for a statement like @samp{PRINT '(I)garbage', 1} + by printing @samp{(I)garbage} as the format string.) + + @item + Improve compilation of FORMAT expressions so that + a null byte is appended to the last operand if it + is a constant. + This provides a cleaner run-time diagnostic as provided + by @code{libf2c} for statements like @samp{PRINT '(I1', 42}. + + @item + Fix various crashes involving code with diagnosed errors. + + @item + Fix cross-compilation bug when configuring @code{libf2c}. + + @item + Improve diagnostics. + + @item + Improve documentation and indexing. + + @item + Upgrade to @code{libf2c} as of 1997-09-23. + This fixes a formatted-I/O bug that afflicted + 64-bit systems with 32-bit integers + (such as Digital Alpha running GNU/Linux). + @end itemize @heading In 0.5.21: diff -rcp2N g77-0.5.21/f/runtime/ChangeLog g77-0.5.22/f/runtime/ChangeLog *** g77-0.5.21/f/runtime/ChangeLog Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/runtime/ChangeLog Sat Feb 28 20:32:29 1998 *************** *** 1,2 **** --- 1,60 ---- + Sat Feb 28 15:32:15 1998 Craig Burley + + * libI77/open.c (f_open): Use sizeof(buf) instead of + 256, for the usual reasons. + + Tue Dec 23 22:56:01 1997 Craig Burley + + * libF77/signal_.c (G77_signal_0): Return type is + now `void *', to cope with returning previous signal + handler on 64-bit systems like Alphas. + * f2cext.c (signal_): Changed accordingly. + + Wed Oct 29 01:01:04 1997 Mumit Khan + + * configure.in: Set CC to CC_FOR_TARGET when cross-compiling. + + Fri Oct 24 11:15:22 1997 Mumit Khan + + * libI77/close.c (f_exit): Reset f__init so that f_clos does not + (incorrectly) think there is an I/O recursion when program is + interrupted. + + Wed Oct 15 10:06:29 1997 Richard Henderson + + * libI77/fio.h: Include if STDC_HEADERS. + * libU77/chmod_.c: Likewise. + + Tue Sep 30 00:41:39 1997 Craig Burley + + Do a better job of printing the offending FORMAT string + when producing a diagnostic: + * libI77/err.c (f__fmtlen): New variable to hold operating + length of format string. + (f__fatal): Use new variable to limit length of printed string. + * libI77/fmt.c (f_s): Don't skip spaces after closing paren, + so nicer message results (and nested case already skips them). + (pars_f): Record operating length of format string as indicated + by a successful call to f_s, or ad-hoc-calculate it if failure, + limiting the length to 80 characters (and stopping at NUL). + (do_fio): Use new variable to limit length of printed string. + * libI77/fmt.h (f__fmtlen): Declare new variable. + * libI77/lread.c (c_le): Set new variable to known length. + + Mon Sep 29 16:30:31 1997 Craig Burley + + Update to Netlib version of 1997-09-23: + * libF77/dtime_.c (dtime_), libF77/etime_.c (dtime_): + Return `double' instead of `float' (these are not used + in g77's version of libf2c). + * libI77/fmt.c, libI77/fmt.h, libI77/rdfmt.c, libI77/wrtfmt.c: + Support machines with 64-bit pointers and 32-bit ints (e.g. + Linux on DEC Alpha). + + 1997-09-19 Dave Love + + * libU77/dtime_.c (G77_dtime_0): Fix types in HAVE_GETRUSAGE case + so as not to truncate results to integer values. + Tue Sep 9 00:33:24 1997 Craig Burley *************** Thu Oct 31 22:27:45 1996 Craig Burley *** 490,493 **** --- 548,557 ---- * libI77/Version.c: Use , not "stdio.h". * libF77/Version.c: Likewise. + + 1997-10-03 Dave Love + + * configure.in: Check for tempnam (best because it obeys TMPDIR). + * libI77/open.c: Use it. + * libI77/err.c: New message # 132. Wed Aug 28 13:25:29 1996 Dave Love diff -rcp2N g77-0.5.21/f/runtime/changes.netlib g77-0.5.22/f/runtime/changes.netlib *** g77-0.5.21/f/runtime/changes.netlib Tue Sep 2 21:25:49 1997 --- g77-0.5.22/f/runtime/changes.netlib Mon Sep 29 20:23:51 1997 *************** the right number of 0's for zero under G *** 2837,2841 **** Sat Aug 16 05:45:32 EDT 1997 ! libI77: iio.c: fix bug in internal writes to an array of character strings that sometimes caused one more array element than required by the format to be blank-filled. Example: format(1x). --- 2837,2850 ---- Sat Aug 16 05:45:32 EDT 1997 ! libi77: iio.c: fix bug in internal writes to an array of character strings that sometimes caused one more array element than required by the format to be blank-filled. Example: format(1x). + + Wed Sep 17 00:39:29 EDT 1997 + libi77: fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines + with 64-bit pointers and 32-bit ints that did not 64-bit align + struct syl (e.g., Linux on the DEC Alpha). This change should be + invisible on other machines. + + Sun Sep 21 22:05:19 EDT 1997 + libf77: [de]time_.c (Unix systems only): change return type to double. diff -rcp2N g77-0.5.21/f/runtime/configure.in g77-0.5.22/f/runtime/configure.in *** g77-0.5.21/f/runtime/configure.in Tue Sep 2 21:28:08 1997 --- g77-0.5.22/f/runtime/configure.in Sat Feb 28 20:27:30 1998 *************** AC_INIT(libF77/Version.c) *** 24,36 **** AC_REVISION(1.10) - dnl Checks for programs. - # For g77 we'll set CC to point at the built gcc, but this will get it into - # the makefiles - AC_PROG_CC dnl AC_C_CROSS dnl Gives misleading `(cached)' message from the check. if test "$CROSS";then ac_cv_c_cross=yes else ac_cv_c_cross=no fi --- 24,41 ---- AC_REVISION(1.10) dnl AC_C_CROSS dnl Gives misleading `(cached)' message from the check. if test "$CROSS";then + if test "$CC_FOR_TARGET"; then + CC="$CC_FOR_TARGET" + else + CC="../../xgcc -B../../xgcc/" + fi ac_cv_c_cross=yes else + dnl Checks for programs. + # For g77 we'll set CC to point at the built gcc, but this will get it into + # the makefiles + AC_PROG_CC ac_cv_c_cross=no fi *************** dnl test $ac_cv_func_symlink = yes && SY *** 172,175 **** --- 177,182 ---- dnl test $ac_cv_func_lstat = yes && SYMLNK="$SYMLNK lstat_.o" dnl AC_SUBST(SYMLNK) + + AC_CHECK_FUNCS(tempnam) # posix will guarantee the right behaviour for sprintf, else we can't be diff -rcp2N g77-0.5.21/f/runtime/f2cext.c g77-0.5.22/f/runtime/f2cext.c *** g77-0.5.21/f/runtime/f2cext.c Tue Sep 2 21:25:50 1997 --- g77-0.5.22/f/runtime/f2cext.c Wed Dec 24 03:58:19 1997 *************** Boston, MA 02111-1307, USA. */ *** 19,23 **** #include ! typedef int (*sig_proc)(int); #ifdef Labort --- 19,23 ---- #include ! typedef void *sig_proc; /* For now, this will have to do. */ #ifdef Labort *************** ftnint iargc_ (void) { *** 99,104 **** #ifdef Lsignal ! ftnint signal_ (integer *sigp, sig_proc proc) { ! extern ftnint G77_signal_0 (integer *sigp, sig_proc proc); return G77_signal_0 (sigp, proc); } --- 99,104 ---- #ifdef Lsignal ! void *signal_ (integer *sigp, sig_proc proc) { ! extern void *G77_signal_0 (integer *sigp, sig_proc proc); return G77_signal_0 (sigp, proc); } diff -rcp2N g77-0.5.21/f/runtime/libF77/Version.c g77-0.5.22/f/runtime/libF77/Version.c *** g77-0.5.21/f/runtime/libF77/Version.c Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/runtime/libF77/Version.c Mon Mar 16 20:42:46 1998 *************** *** 1,8 **** ! static char junk[] = "\n@(#)LIBF77 VERSION 19970404\n"; /* */ ! char __G77_LIBF77_VERSION__[] = "0.5.21"; /* --- 1,8 ---- ! static char junk[] = "\n@(#)LIBF77 VERSION 19970919\n"; /* */ ! char __G77_LIBF77_VERSION__[] = "0.5.22"; /* *************** char __G77_LIBF77_VERSION__[] = "0.5.21" *** 54,57 **** --- 54,59 ---- 4 April 1997: [cz]_div.c: tweaks invisible on most systems (that may affect systems using gratuitous extra precision). + 19 Sept. 1997: [de]time_.c (Unix systems only): change return + type to double. */ diff -rcp2N g77-0.5.21/f/runtime/libF77/dtime_.c g77-0.5.22/f/runtime/libF77/dtime_.c *** g77-0.5.21/f/runtime/libF77/dtime_.c Mon Aug 11 23:50:37 1997 --- g77-0.5.22/f/runtime/libF77/dtime_.c Mon Sep 29 20:23:51 1997 *************** *** 16,20 **** #endif ! float #ifdef KR_headers dtime_(tarray) float *tarray; --- 16,20 ---- #endif ! double #ifdef KR_headers dtime_(tarray) float *tarray; diff -rcp2N g77-0.5.21/f/runtime/libF77/etime_.c g77-0.5.22/f/runtime/libF77/etime_.c *** g77-0.5.21/f/runtime/libF77/etime_.c Mon Aug 11 23:51:03 1997 --- g77-0.5.22/f/runtime/libF77/etime_.c Mon Sep 29 20:23:51 1997 *************** *** 16,20 **** #endif ! float #ifdef KR_headers etime_(tarray) float *tarray; --- 16,20 ---- #endif ! double #ifdef KR_headers etime_(tarray) float *tarray; diff -rcp2N g77-0.5.21/f/runtime/libF77/signal_.c g77-0.5.22/f/runtime/libF77/signal_.c *** g77-0.5.21/f/runtime/libF77/signal_.c Fri Jul 11 00:08:13 1997 --- g77-0.5.22/f/runtime/libF77/signal_.c Wed Dec 24 03:55:38 1997 *************** *** 3,9 **** #ifdef KR_headers ! ftnint G77_signal_0 (sigp, proc) integer *sigp; sig_pf proc; #else ! ftnint G77_signal_0 (integer *sigp, sig_pf proc) #endif { --- 3,11 ---- #ifdef KR_headers ! void * ! G77_signal_0 (sigp, proc) integer *sigp; sig_pf proc; #else ! void * ! G77_signal_0 (integer *sigp, sig_pf proc) #endif { *************** ftnint G77_signal_0 (integer *sigp, sig_ *** 11,14 **** sig = (int)*sigp; ! return (ftnint)signal(sig, proc); } --- 13,17 ---- sig = (int)*sigp; ! return (void *) signal(sig, proc); } + diff -rcp2N g77-0.5.21/f/runtime/libI77/Version.c g77-0.5.22/f/runtime/libI77/Version.c *** g77-0.5.21/f/runtime/libI77/Version.c Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/runtime/libI77/Version.c Mon Mar 16 20:42:46 1998 *************** *** 1,8 **** ! static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 19970816\n"; /* */ ! char __G77_LIBI77_VERSION__[] = "0.5.21"; /* --- 1,8 ---- ! static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 19970916\n"; /* */ ! char __G77_LIBI77_VERSION__[] = "0.5.22"; /* *************** wrtfmt.c: *** 265,268 **** --- 265,276 ---- required by the format to be blank-filled. Example: format(1x). */ + /* 16 Sept. 1997:fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines + with 64-bit pointers and 32-bit ints that did not 64-bit + align struct syl (e.g., Linux on the DEC Alpha). */ + + + + /* Changes for GNU Fortran (g77) version of libf2c: */ + /* 17 June 1997: detect recursive I/O and call f__fatal explaining it. */ diff -rcp2N g77-0.5.21/f/runtime/libI77/close.c g77-0.5.22/f/runtime/libI77/close.c *** g77-0.5.21/f/runtime/libI77/close.c Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/runtime/libI77/close.c Mon Dec 22 18:32:51 1997 *************** f_exit(void) *** 76,79 **** --- 76,86 ---- if (! (f__init & 1)) return; /* Not initialized, so no open units. */ + /* I/O no longer in progress. If, during an I/O operation (such + as waiting for the user to enter a line), there is an + interrupt (such as ^C to stop the program on a UNIX system), + f_exit() is called, but there is no longer any I/O in + progress. Without turning off this flag, f_clos() would + think that there is an I/O recursion in this circumstance. */ + f__init &= ~2; if (!xx.cerr) { xx.cerr=1; diff -rcp2N g77-0.5.21/f/runtime/libI77/err.c g77-0.5.22/f/runtime/libI77/err.c *** g77-0.5.21/f/runtime/libI77/err.c Fri Jul 11 00:11:14 1997 --- g77-0.5.22/f/runtime/libI77/err.c Sat Feb 28 20:28:11 1998 *************** flag f__reading; /*1 if reading, 0 if wr *** 28,31 **** --- 28,32 ---- flag f__cplus,f__cblank; char *f__fmtbuf; + int f__fmtlen; flag f__external; /*1 if external io, 0 if internal */ #ifdef KR_headers *************** char *F_err[] = *** 80,84 **** "can't append to file", /* 129 */ "non-positive record number", /* 130 */ ! "I/O started while already doing I/O" /* 131 */ }; #define MAXERR (sizeof(F_err)/sizeof(char *)+100) --- 81,86 ---- "can't append to file", /* 129 */ "non-positive record number", /* 130 */ ! "I/O started while already doing I/O", /* 131 */ ! "Temporary file name (TMPDIR?) too long" /* 132 */ }; #define MAXERR (sizeof(F_err)/sizeof(char *)+100) *************** f__fatal(int n, char *s) *** 168,172 **** fprintf(stderr,"apparent state: internal I/O\n"); if (f__fmtbuf) ! fprintf(stderr,"last format: %s\n",f__fmtbuf); fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing", f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted", --- 170,174 ---- fprintf(stderr,"apparent state: internal I/O\n"); if (f__fmtbuf) ! fprintf(stderr,"last format: %.*s\n",f__fmtlen,f__fmtbuf); fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing", f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted", diff -rcp2N g77-0.5.21/f/runtime/libI77/fio.h g77-0.5.22/f/runtime/libI77/fio.h *** g77-0.5.21/f/runtime/libI77/fio.h Fri Jul 11 00:11:14 1997 --- g77-0.5.22/f/runtime/libI77/fio.h Thu Feb 26 21:23:31 1998 *************** *** 5,8 **** --- 5,11 ---- #include #endif + #ifdef STDC_HEADERS + #include + #endif #ifndef SEEK_SET diff -rcp2N g77-0.5.21/f/runtime/libI77/fmt.c g77-0.5.22/f/runtime/libI77/fmt.c *** g77-0.5.21/f/runtime/libI77/fmt.c Fri Jul 11 00:08:16 1997 --- g77-0.5.22/f/runtime/libI77/fmt.c Tue Sep 30 04:18:24 1997 *************** *** 19,23 **** extern int f__cursor,f__scale; extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/ ! struct syl f__syl[SYLMX]; int f__parenlvl,f__pc,f__revloc; --- 19,23 ---- extern int f__cursor,f__scale; extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/ ! static struct syl f__syl[SYLMX]; int f__parenlvl,f__pc,f__revloc; *************** op_gen(int a, int b, int c, int d) *** 54,59 **** p->op=a; p->p1=b; ! p->p2=c; ! p->p3=d; return(f__pc++); } --- 54,59 ---- p->op=a; p->p1=b; ! p->p2.i[0]=c; ! p->p2.i[1]=d; return(f__pc++); } *************** char *f_s(char *s, int curloc) *** 104,108 **** return(NULL); } - skip(s); return(s); } --- 104,107 ---- *************** ne_d(char *s, char **p) *** 161,165 **** case 'h': sp = &f__syl[op_gen(H,n,0,0)]; ! *(char **)&sp->p2 = s + 1; s+=n; break; --- 160,164 ---- case 'h': sp = &f__syl[op_gen(H,n,0,0)]; ! sp->p2.s = s + 1; s+=n; break; *************** ne_d(char *s, char **p) *** 170,174 **** case '\'': sp = &f__syl[op_gen(APOS,0,0,0)]; ! *(char **)&sp->p2 = s; if((*p = ap_end(s)) == NULL) return(0); --- 169,173 ---- case '\'': sp = &f__syl[op_gen(APOS,0,0,0)]; ! sp->p2.s = s; if((*p = ap_end(s)) == NULL) return(0); *************** pars_f(char *s) *** 366,374 **** #endif { f__parenlvl=f__revloc=f__pc=0; ! if(f_s(s,0) == NULL) { return(-1); } return(0); } --- 365,401 ---- #endif { + char *e; + f__parenlvl=f__revloc=f__pc=0; ! if((e=f_s(s,0)) == NULL) { + /* Try and delimit the format string. Parens within + hollerith and quoted strings have to match for this + to work, but it's probably adequate for most needs. + Note that this is needed because a valid CHARACTER + variable passed for FMT= can contain '(I)garbage', + where `garbage' is billions and billions of junk + characters, and it's up to the run-time library to + know where the format string ends by counting parens. + Meanwhile, still treat NUL byte as "hard stop", since + f2c still appends that at end of FORMAT-statement + strings. */ + + int level=0; + + for (f__fmtlen=0; + ((*s!=')') || (--level > 0)) + && (*s!='\0') + && (f__fmtlen<80); + ++s, ++f__fmtlen) + { + if (*s=='(') + ++level; + } + if (*s==')') + ++f__fmtlen; return(-1); } + f__fmtlen = e - s; return(0); } *************** loop: switch(type_f((p= &f__syl[f__pc])- *** 422,427 **** { default: ! fprintf(stderr,"unknown code in do_fio: %d\n%s\n", ! p->op,f__fmtbuf); err(f__elist->cierr,100,"do_fio"); case NED: --- 449,454 ---- { default: ! fprintf(stderr,"unknown code in do_fio: %d\n%.*s\n", ! p->op,f__fmtlen,f__fmtbuf); err(f__elist->cierr,100,"do_fio"); case NED: diff -rcp2N g77-0.5.21/f/runtime/libI77/fmt.h g77-0.5.22/f/runtime/libI77/fmt.h *** g77-0.5.21/f/runtime/libI77/fmt.h Thu Oct 31 10:37:35 1996 --- g77-0.5.22/f/runtime/libI77/fmt.h Mon Sep 29 20:39:36 1997 *************** *** 1,5 **** struct syl ! { int op,p1,p2,p3; ! }; #define RET1 1 #define REVERT 2 --- 1,7 ---- struct syl ! { int op; ! int p1; ! union { int i[2]; char *s;} p2; ! }; #define RET1 1 #define REVERT 2 *************** struct syl *** 38,42 **** #define Z 35 #define ZM 36 - extern struct syl f__syl[]; extern int f__pc,f__parenlvl,f__revloc; typedef union --- 40,43 ---- *************** extern int wrt_L(Uint*, int, ftnlen); *** 79,82 **** --- 80,84 ---- extern flag f__cblank,f__cplus,f__workdone, f__nonl; extern char *f__fmtbuf; + extern int f__fmtlen; extern int f__scale; #define GET(x) if((x=(*f__getn)())<0) return(x) diff -rcp2N g77-0.5.21/f/runtime/libI77/lread.c g77-0.5.22/f/runtime/libI77/lread.c *** g77-0.5.21/f/runtime/libI77/lread.c Mon Aug 11 23:24:20 1997 --- g77-0.5.22/f/runtime/libI77/lread.c Mon Sep 29 20:46:39 1997 *************** *** 9,12 **** --- 9,13 ---- extern char *f__fmtbuf; + extern int f__fmtlen; #ifdef Allow_TYQUAD *************** c_le(cilist *a) *** 519,522 **** --- 520,524 ---- f__init = 3; f__fmtbuf="list io"; + f__fmtlen=7; if(a->ciunit>=MXUNIT || a->ciunit<0) err(a->cierr,101,"stler"); diff -rcp2N g77-0.5.21/f/runtime/libI77/open.c g77-0.5.22/f/runtime/libI77/open.c *** g77-0.5.21/f/runtime/libI77/open.c Fri Jul 11 00:10:03 1997 --- g77-0.5.22/f/runtime/libI77/open.c Sat Feb 28 20:30:09 1998 *************** integer f_open(olist *a) *** 144,147 **** --- 144,154 ---- case 'S': b->uscrtch=1; + #ifdef HAVE_TEMPNAM /* Allow use of TMPDIR preferentially. */ + s = tempnam (0, buf); + if (strlen (s) >= sizeof (buf)) + err (a->oerr, 132, "open"); + (void) strcpy (buf, s); + free (s); + #else /* ! defined (HAVE_TEMPNAM) */ #ifdef _POSIX_SOURCE tmpnam(buf); *************** integer f_open(olist *a) *** 150,153 **** --- 157,161 ---- (void) mktemp(buf); #endif + #endif /* ! defined (HAVE_TEMPNAM) */ goto replace; case 'n': diff -rcp2N g77-0.5.21/f/runtime/libI77/rdfmt.c g77-0.5.22/f/runtime/libI77/rdfmt.c *** g77-0.5.21/f/runtime/libI77/rdfmt.c Fri Jul 11 00:08:17 1997 --- g77-0.5.22/f/runtime/libI77/rdfmt.c Mon Sep 29 20:23:52 1997 *************** rd_ed(struct syl *p, char *ptr, ftnlen l *** 434,438 **** case G: case GE: ! case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2,len); break; --- 434,438 ---- case G: case GE: ! case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2.i[0],len); break; *************** rd_ned(struct syl *p) *** 461,466 **** sig_die(f__fmtbuf, 1); case APOS: ! return(rd_POS(*(char **)&p->p2)); ! case H: return(rd_H(p->p1,*(char **)&p->p2)); case SLASH: return((*f__donewrec)()); case TR: --- 461,466 ---- sig_die(f__fmtbuf, 1); case APOS: ! return(rd_POS(p->p2.s)); ! case H: return(rd_H(p->p1,p->p2.s)); case SLASH: return((*f__donewrec)()); case TR: diff -rcp2N g77-0.5.21/f/runtime/libI77/wrtfmt.c g77-0.5.22/f/runtime/libI77/wrtfmt.c *** g77-0.5.21/f/runtime/libI77/wrtfmt.c Mon Aug 11 23:24:20 1997 --- g77-0.5.22/f/runtime/libI77/wrtfmt.c Mon Sep 29 20:23:52 1997 *************** w_ed(struct syl *p, char *ptr, ftnlen le *** 327,331 **** case I: return(wrt_I((Uint *)ptr,p->p1,len, 10)); case IM: ! return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,10)); /* O and OM don't work right for character, double, complex, */ --- 327,331 ---- case I: return(wrt_I((Uint *)ptr,p->p1,len, 10)); case IM: ! return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,10)); /* O and OM don't work right for character, double, complex, */ *************** w_ed(struct syl *p, char *ptr, ftnlen le *** 335,339 **** case O: return(wrt_I((Uint *)ptr, p->p1, len, 8)); case OM: ! return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,8)); case L: return(wrt_L((Uint *)ptr,p->p1, len)); case A: return(wrt_A(ptr,len)); --- 335,339 ---- case O: return(wrt_I((Uint *)ptr, p->p1, len, 8)); case OM: ! return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,8)); case L: return(wrt_L((Uint *)ptr,p->p1, len)); case A: return(wrt_A(ptr,len)); *************** w_ed(struct syl *p, char *ptr, ftnlen le *** 343,351 **** case E: case EE: ! return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len)); case G: case GE: ! return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len)); ! case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len)); /* Z and ZM assume 8-bit bytes. */ --- 343,351 ---- case E: case EE: ! return(wrt_E((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); case G: case GE: ! return(wrt_G((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); ! case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2.i[0],len)); /* Z and ZM assume 8-bit bytes. */ *************** w_ed(struct syl *p, char *ptr, ftnlen le *** 353,357 **** case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len)); case ZM: ! return(wrt_Z((Uint *)ptr,p->p1,p->p2,len)); } } --- 353,357 ---- case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len)); case ZM: ! return(wrt_Z((Uint *)ptr,p->p1,p->p2.i[0],len)); } } *************** w_ned(struct syl *p) *** 379,385 **** return(1); case APOS: ! return(wrt_AP(*(char **)&p->p2)); case H: ! return(wrt_H(p->p1,*(char **)&p->p2)); } } --- 379,385 ---- return(1); case APOS: ! return(wrt_AP(p->p2.s)); case H: ! return(wrt_H(p->p1,p->p2.s)); } } diff -rcp2N g77-0.5.21/f/runtime/libU77/Version.c g77-0.5.22/f/runtime/libU77/Version.c *** g77-0.5.21/f/runtime/libU77/Version.c Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/runtime/libU77/Version.c Mon Mar 16 20:42:46 1998 *************** *** 1,5 **** ! static char junk[] = "\n@(#) LIBU77 VERSION 19970609\n"; ! char __G77_LIBU77_VERSION__[] = "0.5.21"; #include --- 1,5 ---- ! static char junk[] = "\n@(#) LIBU77 VERSION 19970919\n"; ! char __G77_LIBU77_VERSION__[] = "0.5.22"; #include diff -rcp2N g77-0.5.21/f/runtime/libU77/chmod_.c g77-0.5.22/f/runtime/libU77/chmod_.c *** g77-0.5.21/f/runtime/libU77/chmod_.c Fri Jul 11 00:08:20 1997 --- g77-0.5.22/f/runtime/libU77/chmod_.c Thu Feb 26 21:24:29 1998 *************** Boston, MA 02111-1307, USA. */ *** 30,34 **** # include #else ! # include /* for NULL */ #endif --- 30,37 ---- # include #else ! # include ! #endif ! #if STDC_HEADERS ! # include #endif *************** integer G77_chmod_0 (/* const */ char *n *** 63,67 **** l = strlen (chmod_path); buff = malloc (Lname+Lmode+l+3+13+1); ! if (buff == NULL) return -1; ii[0] = l; a[0] = chmod_path; ii[1] = 1; a[1] = " "; --- 66,70 ---- l = strlen (chmod_path); buff = malloc (Lname+Lmode+l+3+13+1); ! if (!buff) return -1; ii[0] = l; a[0] = chmod_path; ii[1] = 1; a[1] = " "; diff -rcp2N g77-0.5.21/f/runtime/libU77/dtime_.c g77-0.5.22/f/runtime/libU77/dtime_.c *** g77-0.5.21/f/runtime/libU77/dtime_.c Tue Sep 2 21:25:50 1997 --- g77-0.5.22/f/runtime/libU77/dtime_.c Tue Sep 30 04:52:44 1997 *************** double G77_dtime_0 (real tarray[2]) *** 44,62 **** #endif { - time_t utime, stime; - static time_t old_utime = 0, old_stime = 0; /* The getrusage version is only the default for convenience. */ #ifdef HAVE_GETRUSAGE struct rusage rbuff; if (getrusage (RUSAGE_SELF, &rbuff) != 0) abort (); ! utime = ((float) (rbuff.ru_utime).tv_sec + ! (float) (rbuff.ru_utime).tv_usec/1000000.0); tarray[0] = utime - (float) old_utime; ! stime = ((float) (rbuff.ru_stime).tv_sec + ! (float) (rbuff.ru_stime).tv_usec/1000000.0); tarray[1] = stime - old_stime; #else /* HAVE_GETRUSAGE */ struct tms buffer; --- 44,64 ---- #endif { /* The getrusage version is only the default for convenience. */ #ifdef HAVE_GETRUSAGE + float utime, stime; + static float old_utime = 0.0, old_stime = 0.0; struct rusage rbuff; if (getrusage (RUSAGE_SELF, &rbuff) != 0) abort (); ! utime = (float) (rbuff.ru_utime).tv_sec + ! (float) (rbuff.ru_utime).tv_usec/1000000.0; tarray[0] = utime - (float) old_utime; ! stime = (float) (rbuff.ru_stime).tv_sec + ! (float) (rbuff.ru_stime).tv_usec/1000000.0; tarray[1] = stime - old_stime; #else /* HAVE_GETRUSAGE */ + time_t utime, stime; + static time_t old_utime = 0, old_stime = 0; struct tms buffer; diff -rcp2N g77-0.5.21/f/runtime/readme.netlib g77-0.5.22/f/runtime/readme.netlib *** g77-0.5.21/f/runtime/readme.netlib Tue Sep 2 21:25:51 1997 --- g77-0.5.22/f/runtime/readme.netlib Mon Sep 29 20:23:52 1997 *************** the right number of 0's for zero under G *** 522,528 **** Sat Aug 16 05:45:32 EDT 1997 ! libI77: iio.c: fix bug in internal writes to an array of character strings that sometimes caused one more array element than required by the format to be blank-filled. Example: format(1x). Current timestamps of files in "all from f2c/src", sorted by time, --- 522,537 ---- Sat Aug 16 05:45:32 EDT 1997 ! libi77: iio.c: fix bug in internal writes to an array of character strings that sometimes caused one more array element than required by the format to be blank-filled. Example: format(1x). + + Wed Sep 17 00:39:29 EDT 1997 + libi77: fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines + with 64-bit pointers and 32-bit ints that did not 64-bit align + struct syl (e.g., Linux on the DEC Alpha). This change should be + invisible on other machines. + + Sun Sep 21 22:05:19 EDT 1997 + libf77: [de]time_.c (Unix systems only): change return type to double. Current timestamps of files in "all from f2c/src", sorted by time, diff -rcp2N g77-0.5.21/f/sta.c g77-0.5.22/f/sta.c *** g77-0.5.21/f/sta.c Sun Jul 13 20:42:40 1997 --- g77-0.5.22/f/sta.c Sun Oct 26 02:35:54 1997 *************** ffesta_ffebad_2t (ffebad errnum, ffelexT *** 1793,1799 **** } ! /* ffesta_set_outpooldisp -- Set disposition of statement output pool ! ! ffesta_set_outpooldisp(FFESTA_pooldispPRESERVE); */ void --- 1793,1801 ---- } ! ffestaPooldisp ! ffesta_outpooldisp () ! { ! return ffesta_outpooldisp_; ! } void diff -rcp2N g77-0.5.21/f/sta.h g77-0.5.22/f/sta.h *** g77-0.5.21/f/sta.h Sun Jul 13 20:42:40 1997 --- g77-0.5.22/f/sta.h Sun Oct 26 02:35:11 1997 *************** void ffesta_ffebad_2t (ffebad msg, ffele *** 99,102 **** --- 99,103 ---- ffelexHandler ffesta_zero (ffelexToken t); ffelexHandler ffesta_two (ffelexToken first, ffelexToken second); + ffestaPooldisp ffesta_outpooldisp (void); void ffesta_set_outpooldisp (ffestaPooldisp d); diff -rcp2N g77-0.5.21/f/stb.c g77-0.5.22/f/stb.c *** g77-0.5.21/f/stb.c Tue Sep 2 21:25:53 1997 --- g77-0.5.22/f/stb.c Sun Jan 11 20:07:29 1998 *************** ffestb_R10014_ (ffelexToken t) *** 9213,9217 **** if (ffestb_local_.format.sign) { ! for (i = 0; i < ffelex_token_length (t); ++i) ffestb_local_.format.pre.u.signed_val *= 10; ffestb_local_.format.pre.u.signed_val += strtoul (ffelex_token_text (t), --- 9213,9217 ---- if (ffestb_local_.format.sign) { ! for (i = ffelex_token_length (t) + 1; i > 0; --i) ffestb_local_.format.pre.u.signed_val *= 10; ffestb_local_.format.pre.u.signed_val += strtoul (ffelex_token_text (t), *************** ffestb_R10014_ (ffelexToken t) *** 9220,9224 **** else { ! for (i = 0; i < ffelex_token_length (t); ++i) ffestb_local_.format.pre.u.unsigned_val *= 10; ffestb_local_.format.pre.u.unsigned_val += strtoul (ffelex_token_text (t), --- 9220,9224 ---- else { ! for (i = ffelex_token_length (t) + 1; i > 0; --i) ffestb_local_.format.pre.u.unsigned_val *= 10; ffestb_local_.format.pre.u.unsigned_val += strtoul (ffelex_token_text (t), *************** ffestb_R10016_ (ffelexToken t) *** 10104,10108 **** return (ffelexHandler) ffestb_R10016_; } ! for (i = 0; i < ffelex_token_length (t); ++i) ffestb_local_.format.post.u.unsigned_val *= 10; ffestb_local_.format.post.u.unsigned_val += strtoul (ffelex_token_text (t), --- 10104,10108 ---- return (ffelexHandler) ffestb_R10016_; } ! for (i = ffelex_token_length (t) + 1; i > 0; --i) ffestb_local_.format.post.u.unsigned_val *= 10; ffestb_local_.format.post.u.unsigned_val += strtoul (ffelex_token_text (t), *************** ffestb_R10018_ (ffelexToken t) *** 10204,10208 **** return (ffelexHandler) ffestb_R10018_; } ! for (i = 0; i < ffelex_token_length (t); ++i) ffestb_local_.format.dot.u.unsigned_val *= 10; ffestb_local_.format.dot.u.unsigned_val += strtoul (ffelex_token_text (t), --- 10204,10208 ---- return (ffelexHandler) ffestb_R10018_; } ! for (i = ffelex_token_length (t) + 1; i > 0; --i) ffestb_local_.format.dot.u.unsigned_val *= 10; ffestb_local_.format.dot.u.unsigned_val += strtoul (ffelex_token_text (t), *************** ffestb_R100110_ (ffelexToken t) *** 10331,10335 **** return (ffelexHandler) ffestb_R100110_; } ! for (i = 0; i < ffelex_token_length (t); ++i) ffestb_local_.format.exp.u.unsigned_val *= 10; ffestb_local_.format.exp.u.unsigned_val += strtoul (ffelex_token_text (t), --- 10331,10335 ---- return (ffelexHandler) ffestb_R100110_; } ! for (i = ffelex_token_length (t) + 1; i > 0; --i) ffestb_local_.format.exp.u.unsigned_val *= 10; ffestb_local_.format.exp.u.unsigned_val += strtoul (ffelex_token_text (t), diff -rcp2N g77-0.5.21/f/std.c g77-0.5.22/f/std.c *** g77-0.5.21/f/std.c Wed Feb 5 05:59:53 1997 --- g77-0.5.22/f/std.c Sun Mar 8 21:37:44 1998 *************** *** 1,4 **** /* std.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995, 1996 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* std.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** static void ffestd_R1001dump_1010_5_ (ff *** 547,550 **** --- 547,551 ---- char *string); static void ffestd_R1001error_ (ffesttFormatList f); + static void ffestd_R1001rtexpr_ (ffests s, ffesttFormatList f, ffebld expr); /* Internal macros. */ *************** ffestd_stmt_pass_ () *** 662,668 **** ffestdStmt_ stmt; ffestdExprItem_ expr; /* For traversing lists. */ #if FFECOM_targetCURRENT == FFECOM_targetGCC ! if (ffestd_2pass_entrypoints_ != 0) { tree which = ffecom_which_entrypoint_decl (); --- 663,670 ---- ffestdStmt_ stmt; ffestdExprItem_ expr; /* For traversing lists. */ + bool okay = (TREE_CODE (current_function_decl) != ERROR_MARK); #if FFECOM_targetCURRENT == FFECOM_targetGCC ! if ((ffestd_2pass_entrypoints_ != 0) && okay) { tree which = ffecom_which_entrypoint_decl (); *************** ffestd_stmt_pass_ () *** 718,722 **** case FFESTD_stmtidENDDOLOOP_: ffestd_subr_line_restore_ (stmt); ! ffeste_do (stmt->u.enddoloop.block); ffestw_kill (stmt->u.enddoloop.block); break; --- 720,725 ---- case FFESTD_stmtidENDDOLOOP_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_do (stmt->u.enddoloop.block); ffestw_kill (stmt->u.enddoloop.block); break; *************** ffestd_stmt_pass_ () *** 724,741 **** case FFESTD_stmtidENDLOGIF_: ffestd_subr_line_restore_ (stmt); ! ffeste_end_R807 (); break; case FFESTD_stmtidEXECLABEL_: ! ffeste_labeldef_branch (stmt->u.execlabel.label); break; case FFESTD_stmtidFORMATLABEL_: ! ffeste_labeldef_format (stmt->u.formatlabel.label); break; case FFESTD_stmtidR737A_: ffestd_subr_line_restore_ (stmt); ! ffeste_R737A (stmt->u.R737A.dest, stmt->u.R737A.source); malloc_pool_kill (stmt->u.R737A.pool); break; --- 727,748 ---- case FFESTD_stmtidENDLOGIF_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_end_R807 (); break; case FFESTD_stmtidEXECLABEL_: ! if (okay) ! ffeste_labeldef_branch (stmt->u.execlabel.label); break; case FFESTD_stmtidFORMATLABEL_: ! if (okay) ! ffeste_labeldef_format (stmt->u.formatlabel.label); break; case FFESTD_stmtidR737A_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R737A (stmt->u.R737A.dest, stmt->u.R737A.source); malloc_pool_kill (stmt->u.R737A.pool); break; *************** ffestd_stmt_pass_ () *** 743,747 **** case FFESTD_stmtidR803_: ffestd_subr_line_restore_ (stmt); ! ffeste_R803 (stmt->u.R803.expr); malloc_pool_kill (stmt->u.R803.pool); break; --- 750,755 ---- case FFESTD_stmtidR803_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R803 (stmt->u.R803.expr); malloc_pool_kill (stmt->u.R803.pool); break; *************** ffestd_stmt_pass_ () *** 749,753 **** case FFESTD_stmtidR804_: ffestd_subr_line_restore_ (stmt); ! ffeste_R804 (stmt->u.R804.expr); malloc_pool_kill (stmt->u.R804.pool); break; --- 757,762 ---- case FFESTD_stmtidR804_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R804 (stmt->u.R804.expr); malloc_pool_kill (stmt->u.R804.pool); break; *************** ffestd_stmt_pass_ () *** 755,769 **** case FFESTD_stmtidR805_: ffestd_subr_line_restore_ (stmt); ! ffeste_R805 (); break; case FFESTD_stmtidR806_: ffestd_subr_line_restore_ (stmt); ! ffeste_R806 (); break; case FFESTD_stmtidR807_: ffestd_subr_line_restore_ (stmt); ! ffeste_R807 (stmt->u.R807.expr); malloc_pool_kill (stmt->u.R807.pool); break; --- 764,781 ---- case FFESTD_stmtidR805_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R805 (); break; case FFESTD_stmtidR806_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R806 (); break; case FFESTD_stmtidR807_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R807 (stmt->u.R807.expr); malloc_pool_kill (stmt->u.R807.pool); break; *************** ffestd_stmt_pass_ () *** 771,775 **** case FFESTD_stmtidR809_: ffestd_subr_line_restore_ (stmt); ! ffeste_R809 (stmt->u.R809.block, stmt->u.R809.expr); malloc_pool_kill (stmt->u.R809.pool); break; --- 783,788 ---- case FFESTD_stmtidR809_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R809 (stmt->u.R809.block, stmt->u.R809.expr); malloc_pool_kill (stmt->u.R809.pool); break; *************** ffestd_stmt_pass_ () *** 777,781 **** case FFESTD_stmtidR810_: ffestd_subr_line_restore_ (stmt); ! ffeste_R810 (stmt->u.R810.block, stmt->u.R810.casenum); malloc_pool_kill (stmt->u.R810.pool); break; --- 790,795 ---- case FFESTD_stmtidR810_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R810 (stmt->u.R810.block, stmt->u.R810.casenum); malloc_pool_kill (stmt->u.R810.pool); break; *************** ffestd_stmt_pass_ () *** 783,787 **** case FFESTD_stmtidR811_: ffestd_subr_line_restore_ (stmt); ! ffeste_R811 (stmt->u.R811.block); malloc_pool_kill (ffestw_select (stmt->u.R811.block)->pool); ffestw_kill (stmt->u.R811.block); --- 797,802 ---- case FFESTD_stmtidR811_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R811 (stmt->u.R811.block); malloc_pool_kill (ffestw_select (stmt->u.R811.block)->pool); ffestw_kill (stmt->u.R811.block); *************** ffestd_stmt_pass_ () *** 790,798 **** case FFESTD_stmtidR819A_: ffestd_subr_line_restore_ (stmt); ! ffeste_R819A (stmt->u.R819A.block, stmt->u.R819A.label, ! stmt->u.R819A.var, ! stmt->u.R819A.start, stmt->u.R819A.start_token, ! stmt->u.R819A.end, stmt->u.R819A.end_token, ! stmt->u.R819A.incr, stmt->u.R819A.incr_token); ffelex_token_kill (stmt->u.R819A.start_token); ffelex_token_kill (stmt->u.R819A.end_token); --- 805,814 ---- case FFESTD_stmtidR819A_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R819A (stmt->u.R819A.block, stmt->u.R819A.label, ! stmt->u.R819A.var, ! stmt->u.R819A.start, stmt->u.R819A.start_token, ! stmt->u.R819A.end, stmt->u.R819A.end_token, ! stmt->u.R819A.incr, stmt->u.R819A.incr_token); ffelex_token_kill (stmt->u.R819A.start_token); ffelex_token_kill (stmt->u.R819A.end_token); *************** ffestd_stmt_pass_ () *** 804,809 **** case FFESTD_stmtidR819B_: ffestd_subr_line_restore_ (stmt); ! ffeste_R819B (stmt->u.R819B.block, stmt->u.R819B.label, ! stmt->u.R819B.expr); malloc_pool_kill (stmt->u.R819B.pool); break; --- 820,826 ---- case FFESTD_stmtidR819B_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R819B (stmt->u.R819B.block, stmt->u.R819B.label, ! stmt->u.R819B.expr); malloc_pool_kill (stmt->u.R819B.pool); break; *************** ffestd_stmt_pass_ () *** 811,836 **** case FFESTD_stmtidR825_: ffestd_subr_line_restore_ (stmt); ! ffeste_R825 (); break; case FFESTD_stmtidR834_: ffestd_subr_line_restore_ (stmt); ! ffeste_R834 (stmt->u.R834.block); break; case FFESTD_stmtidR835_: ffestd_subr_line_restore_ (stmt); ! ffeste_R835 (stmt->u.R835.block); break; case FFESTD_stmtidR836_: ffestd_subr_line_restore_ (stmt); ! ffeste_R836 (stmt->u.R836.label); break; case FFESTD_stmtidR837_: ffestd_subr_line_restore_ (stmt); ! ffeste_R837 (stmt->u.R837.labels, stmt->u.R837.count, ! stmt->u.R837.expr); malloc_pool_kill (stmt->u.R837.pool); break; --- 828,858 ---- case FFESTD_stmtidR825_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R825 (); break; case FFESTD_stmtidR834_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R834 (stmt->u.R834.block); break; case FFESTD_stmtidR835_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R835 (stmt->u.R835.block); break; case FFESTD_stmtidR836_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R836 (stmt->u.R836.label); break; case FFESTD_stmtidR837_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R837 (stmt->u.R837.labels, stmt->u.R837.count, ! stmt->u.R837.expr); malloc_pool_kill (stmt->u.R837.pool); break; *************** ffestd_stmt_pass_ () *** 838,842 **** case FFESTD_stmtidR838_: ffestd_subr_line_restore_ (stmt); ! ffeste_R838 (stmt->u.R838.label, stmt->u.R838.target); malloc_pool_kill (stmt->u.R838.pool); break; --- 860,865 ---- case FFESTD_stmtidR838_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R838 (stmt->u.R838.label, stmt->u.R838.target); malloc_pool_kill (stmt->u.R838.pool); break; *************** ffestd_stmt_pass_ () *** 844,848 **** case FFESTD_stmtidR839_: ffestd_subr_line_restore_ (stmt); ! ffeste_R839 (stmt->u.R839.target); malloc_pool_kill (stmt->u.R839.pool); break; --- 867,872 ---- case FFESTD_stmtidR839_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R839 (stmt->u.R839.target); malloc_pool_kill (stmt->u.R839.pool); break; *************** ffestd_stmt_pass_ () *** 850,855 **** case FFESTD_stmtidR840_: ffestd_subr_line_restore_ (stmt); ! ffeste_R840 (stmt->u.R840.expr, stmt->u.R840.neg, stmt->u.R840.zero, ! stmt->u.R840.pos); malloc_pool_kill (stmt->u.R840.pool); break; --- 874,880 ---- case FFESTD_stmtidR840_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R840 (stmt->u.R840.expr, stmt->u.R840.neg, stmt->u.R840.zero, ! stmt->u.R840.pos); malloc_pool_kill (stmt->u.R840.pool); break; *************** ffestd_stmt_pass_ () *** 857,872 **** case FFESTD_stmtidR841_: ffestd_subr_line_restore_ (stmt); ! ffeste_R841 (); break; case FFESTD_stmtidR842_: ffestd_subr_line_restore_ (stmt); ! ffeste_R842 (stmt->u.R842.expr); ! malloc_pool_kill (stmt->u.R842.pool); break; case FFESTD_stmtidR843_: ffestd_subr_line_restore_ (stmt); ! ffeste_R843 (stmt->u.R843.expr); malloc_pool_kill (stmt->u.R843.pool); break; --- 882,901 ---- case FFESTD_stmtidR841_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R841 (); break; case FFESTD_stmtidR842_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R842 (stmt->u.R842.expr); ! if (stmt->u.R842.pool != NULL) ! malloc_pool_kill (stmt->u.R842.pool); break; case FFESTD_stmtidR843_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R843 (stmt->u.R843.expr); malloc_pool_kill (stmt->u.R843.pool); break; *************** ffestd_stmt_pass_ () *** 874,878 **** case FFESTD_stmtidR904_: ffestd_subr_line_restore_ (stmt); ! ffeste_R904 (stmt->u.R904.params); malloc_pool_kill (stmt->u.R904.pool); break; --- 903,908 ---- case FFESTD_stmtidR904_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R904 (stmt->u.R904.params); malloc_pool_kill (stmt->u.R904.pool); break; *************** ffestd_stmt_pass_ () *** 880,884 **** case FFESTD_stmtidR907_: ffestd_subr_line_restore_ (stmt); ! ffeste_R907 (stmt->u.R907.params); malloc_pool_kill (stmt->u.R907.pool); break; --- 910,915 ---- case FFESTD_stmtidR907_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R907 (stmt->u.R907.params); malloc_pool_kill (stmt->u.R907.pool); break; *************** ffestd_stmt_pass_ () *** 886,898 **** case FFESTD_stmtidR909_: ffestd_subr_line_restore_ (stmt); ! ffeste_R909_start (stmt->u.R909.params, stmt->u.R909.only_format, ! stmt->u.R909.unit, stmt->u.R909.format, ! stmt->u.R909.rec, stmt->u.R909.key); for (expr = stmt->u.R909.list; expr != NULL; expr = expr->next) { ! ffeste_R909_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! ffeste_R909_finish (); malloc_pool_kill (stmt->u.R909.pool); break; --- 917,932 ---- case FFESTD_stmtidR909_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R909_start (stmt->u.R909.params, stmt->u.R909.only_format, ! stmt->u.R909.unit, stmt->u.R909.format, ! stmt->u.R909.rec, stmt->u.R909.key); for (expr = stmt->u.R909.list; expr != NULL; expr = expr->next) { ! if (okay) ! ffeste_R909_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! if (okay) ! ffeste_R909_finish (); malloc_pool_kill (stmt->u.R909.pool); break; *************** ffestd_stmt_pass_ () *** 900,911 **** case FFESTD_stmtidR910_: ffestd_subr_line_restore_ (stmt); ! ffeste_R910_start (stmt->u.R910.params, stmt->u.R910.unit, ! stmt->u.R910.format, stmt->u.R910.rec); for (expr = stmt->u.R910.list; expr != NULL; expr = expr->next) { ! ffeste_R910_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! ffeste_R910_finish (); malloc_pool_kill (stmt->u.R910.pool); break; --- 934,948 ---- case FFESTD_stmtidR910_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R910_start (stmt->u.R910.params, stmt->u.R910.unit, ! stmt->u.R910.format, stmt->u.R910.rec); for (expr = stmt->u.R910.list; expr != NULL; expr = expr->next) { ! if (okay) ! ffeste_R910_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! if (okay) ! ffeste_R910_finish (); malloc_pool_kill (stmt->u.R910.pool); break; *************** ffestd_stmt_pass_ () *** 913,923 **** case FFESTD_stmtidR911_: ffestd_subr_line_restore_ (stmt); ! ffeste_R911_start (stmt->u.R911.params, stmt->u.R911.format); for (expr = stmt->u.R911.list; expr != NULL; expr = expr->next) { ! ffeste_R911_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! ffeste_R911_finish (); malloc_pool_kill (stmt->u.R911.pool); break; --- 950,963 ---- case FFESTD_stmtidR911_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R911_start (stmt->u.R911.params, stmt->u.R911.format); for (expr = stmt->u.R911.list; expr != NULL; expr = expr->next) { ! if (okay) ! ffeste_R911_item (expr->expr, expr->token); ffelex_token_kill (expr->token); } ! if (okay) ! ffeste_R911_finish (); malloc_pool_kill (stmt->u.R911.pool); break; *************** ffestd_stmt_pass_ () *** 925,929 **** case FFESTD_stmtidR919_: ffestd_subr_line_restore_ (stmt); ! ffeste_R919 (stmt->u.R919.params); malloc_pool_kill (stmt->u.R919.pool); break; --- 965,970 ---- case FFESTD_stmtidR919_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R919 (stmt->u.R919.params); malloc_pool_kill (stmt->u.R919.pool); break; *************** ffestd_stmt_pass_ () *** 931,935 **** case FFESTD_stmtidR920_: ffestd_subr_line_restore_ (stmt); ! ffeste_R920 (stmt->u.R920.params); malloc_pool_kill (stmt->u.R920.pool); break; --- 972,977 ---- case FFESTD_stmtidR920_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R920 (stmt->u.R920.params); malloc_pool_kill (stmt->u.R920.pool); break; *************** ffestd_stmt_pass_ () *** 937,941 **** case FFESTD_stmtidR921_: ffestd_subr_line_restore_ (stmt); ! ffeste_R921 (stmt->u.R921.params); malloc_pool_kill (stmt->u.R921.pool); break; --- 979,984 ---- case FFESTD_stmtidR921_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R921 (stmt->u.R921.params); malloc_pool_kill (stmt->u.R921.pool); break; *************** ffestd_stmt_pass_ () *** 943,947 **** case FFESTD_stmtidR923A_: ffestd_subr_line_restore_ (stmt); ! ffeste_R923A (stmt->u.R923A.params, stmt->u.R923A.by_file); malloc_pool_kill (stmt->u.R923A.pool); break; --- 986,991 ---- case FFESTD_stmtidR923A_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R923A (stmt->u.R923A.params, stmt->u.R923A.by_file); malloc_pool_kill (stmt->u.R923A.pool); break; *************** ffestd_stmt_pass_ () *** 949,984 **** case FFESTD_stmtidR923B_: ffestd_subr_line_restore_ (stmt); ! ffeste_R923B_start (stmt->u.R923B.params); for (expr = stmt->u.R923B.list; expr != NULL; expr = expr->next) ! ffeste_R923B_item (expr->expr); ! ffeste_R923B_finish (); malloc_pool_kill (stmt->u.R923B.pool); break; case FFESTD_stmtidR1001_: ! ffeste_R1001 (&stmt->u.R1001.str); ffests_kill (&stmt->u.R1001.str); break; case FFESTD_stmtidR1103_: ! ffeste_R1103 (); break; case FFESTD_stmtidR1112_: ! ffeste_R1112 (); break; case FFESTD_stmtidR1212_: ffestd_subr_line_restore_ (stmt); ! ffeste_R1212 (stmt->u.R1212.expr); malloc_pool_kill (stmt->u.R1212.pool); break; case FFESTD_stmtidR1221_: ! ffeste_R1221 (); break; case FFESTD_stmtidR1225_: ! ffeste_R1225 (); break; --- 993,1039 ---- case FFESTD_stmtidR923B_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R923B_start (stmt->u.R923B.params); for (expr = stmt->u.R923B.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_R923B_item (expr->expr); ! } ! if (okay) ! ffeste_R923B_finish (); malloc_pool_kill (stmt->u.R923B.pool); break; case FFESTD_stmtidR1001_: ! if (okay) ! ffeste_R1001 (&stmt->u.R1001.str); ffests_kill (&stmt->u.R1001.str); break; case FFESTD_stmtidR1103_: ! if (okay) ! ffeste_R1103 (); break; case FFESTD_stmtidR1112_: ! if (okay) ! ffeste_R1112 (); break; case FFESTD_stmtidR1212_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R1212 (stmt->u.R1212.expr); malloc_pool_kill (stmt->u.R1212.pool); break; case FFESTD_stmtidR1221_: ! if (okay) ! ffeste_R1221 (); break; case FFESTD_stmtidR1225_: ! if (okay) ! ffeste_R1225 (); break; *************** ffestd_stmt_pass_ () *** 986,995 **** ffestd_subr_line_restore_ (stmt); if (stmt->u.R1226.entry != NULL) ! ffeste_R1226 (stmt->u.R1226.entry); break; case FFESTD_stmtidR1227_: ffestd_subr_line_restore_ (stmt); ! ffeste_R1227 (stmt->u.R1227.block, stmt->u.R1227.expr); malloc_pool_kill (stmt->u.R1227.pool); break; --- 1041,1054 ---- ffestd_subr_line_restore_ (stmt); if (stmt->u.R1226.entry != NULL) ! { ! if (okay) ! ffeste_R1226 (stmt->u.R1226.entry); ! } break; case FFESTD_stmtidR1227_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_R1227 (stmt->u.R1227.block, stmt->u.R1227.expr); malloc_pool_kill (stmt->u.R1227.pool); break; *************** ffestd_stmt_pass_ () *** 998,1005 **** case FFESTD_stmtidV018_: ffestd_subr_line_restore_ (stmt); ! ffeste_V018_start (stmt->u.V018.params, stmt->u.V018.format); for (expr = stmt->u.V018.list; expr != NULL; expr = expr->next) ! ffeste_V018_item (expr->expr); ! ffeste_V018_finish (); malloc_pool_kill (stmt->u.V018.pool); break; --- 1057,1069 ---- case FFESTD_stmtidV018_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V018_start (stmt->u.V018.params, stmt->u.V018.format); for (expr = stmt->u.V018.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_V018_item (expr->expr); ! } ! if (okay) ! ffeste_V018_finish (); malloc_pool_kill (stmt->u.V018.pool); break; *************** ffestd_stmt_pass_ () *** 1007,1014 **** case FFESTD_stmtidV019_: ffestd_subr_line_restore_ (stmt); ! ffeste_V019_start (stmt->u.V019.params, stmt->u.V019.format); for (expr = stmt->u.V019.list; expr != NULL; expr = expr->next) ! ffeste_V019_item (expr->expr); ! ffeste_V019_finish (); malloc_pool_kill (stmt->u.V019.pool); break; --- 1071,1083 ---- case FFESTD_stmtidV019_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V019_start (stmt->u.V019.params, stmt->u.V019.format); for (expr = stmt->u.V019.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_V019_item (expr->expr); ! } ! if (okay) ! ffeste_V019_finish (); malloc_pool_kill (stmt->u.V019.pool); break; *************** ffestd_stmt_pass_ () *** 1017,1024 **** case FFESTD_stmtidV020_: ffestd_subr_line_restore_ (stmt); ! ffeste_V020_start (stmt->u.V020.params, stmt->u.V020.format); for (expr = stmt->u.V020.list; expr != NULL; expr = expr->next) ! ffeste_V020_item (expr->expr); ! ffeste_V020_finish (); malloc_pool_kill (stmt->u.V020.pool); break; --- 1086,1098 ---- case FFESTD_stmtidV020_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V020_start (stmt->u.V020.params, stmt->u.V020.format); for (expr = stmt->u.V020.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_V020_item (expr->expr); ! } ! if (okay) ! ffeste_V020_finish (); malloc_pool_kill (stmt->u.V020.pool); break; *************** ffestd_stmt_pass_ () *** 1027,1031 **** case FFESTD_stmtidV021_: ffestd_subr_line_restore_ (stmt); ! ffeste_V021 (stmt->u.V021.params); malloc_pool_kill (stmt->u.V021.pool); break; --- 1101,1106 ---- case FFESTD_stmtidV021_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V021 (stmt->u.V021.params); malloc_pool_kill (stmt->u.V021.pool); break; *************** ffestd_stmt_pass_ () *** 1033,1040 **** case FFESTD_stmtidV023_: ffestd_subr_line_restore_ (stmt); ! ffeste_V023_start (stmt->u.V023.params); for (expr = stmt->u.V023.list; expr != NULL; expr = expr->next) ! ffeste_V023_item (expr->expr); ! ffeste_V023_finish (); malloc_pool_kill (stmt->u.V023.pool); break; --- 1108,1120 ---- case FFESTD_stmtidV023_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V023_start (stmt->u.V023.params); for (expr = stmt->u.V023.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_V023_item (expr->expr); ! } ! if (okay) ! ffeste_V023_finish (); malloc_pool_kill (stmt->u.V023.pool); break; *************** ffestd_stmt_pass_ () *** 1042,1049 **** case FFESTD_stmtidV024_: ffestd_subr_line_restore_ (stmt); ! ffeste_V024_start (stmt->u.V024.params); for (expr = stmt->u.V024.list; expr != NULL; expr = expr->next) ! ffeste_V024_item (expr->expr); ! ffeste_V024_finish (); malloc_pool_kill (stmt->u.V024.pool); break; --- 1122,1134 ---- case FFESTD_stmtidV024_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V024_start (stmt->u.V024.params); for (expr = stmt->u.V024.list; expr != NULL; expr = expr->next) ! { ! if (okay) ! ffeste_V024_item (expr->expr); ! } ! if (okay) ! ffeste_V024_finish (); malloc_pool_kill (stmt->u.V024.pool); break; *************** ffestd_stmt_pass_ () *** 1051,1064 **** case FFESTD_stmtidV025start_: ffestd_subr_line_restore_ (stmt); ! ffeste_V025_start (); break; case FFESTD_stmtidV025item_: ! ffeste_V025_item (stmt->u.V025item.u, stmt->u.V025item.m, ! stmt->u.V025item.n, stmt->u.V025item.asv); break; case FFESTD_stmtidV025finish_: ! ffeste_V025_finish (); malloc_pool_kill (stmt->u.V025finish.pool); break; --- 1136,1152 ---- case FFESTD_stmtidV025start_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V025_start (); break; case FFESTD_stmtidV025item_: ! if (okay) ! ffeste_V025_item (stmt->u.V025item.u, stmt->u.V025item.m, ! stmt->u.V025item.n, stmt->u.V025item.asv); break; case FFESTD_stmtidV025finish_: ! if (okay) ! ffeste_V025_finish (); malloc_pool_kill (stmt->u.V025finish.pool); break; *************** ffestd_stmt_pass_ () *** 1066,1070 **** case FFESTD_stmtidV026_: ffestd_subr_line_restore_ (stmt); ! ffeste_V026 (stmt->u.V026.params); malloc_pool_kill (stmt->u.V026.pool); break; --- 1154,1159 ---- case FFESTD_stmtidV026_: ffestd_subr_line_restore_ (stmt); ! if (okay) ! ffeste_V026 (stmt->u.V026.params); malloc_pool_kill (stmt->u.V026.pool); break; *************** ffestd_R842 (ffebld expr) *** 3514,3520 **** ffestd_stmt_append_ (stmt); ffestd_subr_line_save_ (stmt); ! stmt->u.R842.pool = ffesta_output_pool; ! stmt->u.R842.expr = expr; ! ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE); } #endif --- 3603,3622 ---- ffestd_stmt_append_ (stmt); ffestd_subr_line_save_ (stmt); ! if (ffesta_outpooldisp () == FFESTA_pooldispPRESERVE) ! { ! /* This is a "spurious" (automatically-generated) STOP ! that follows a previous STOP or other statement. ! Make sure we don't have an expression in the pool, ! and then mark that the pool has already been killed. */ ! assert (expr == NULL); ! stmt->u.R842.pool = NULL; ! stmt->u.R842.expr = NULL; ! } ! else ! { ! stmt->u.R842.pool = ffesta_output_pool; ! stmt->u.R842.expr = expr; ! ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE); ! } } #endif *************** ffestd_R1001dump_ (ffests s, ffesttForma *** 4358,4362 **** if (next->u.R1003D.R1004.present) if (next->u.R1003D.R1004.rtexpr) ! ffestd_R1001error_ (next); else ffests_printf_1U (s, "%lu", --- 4460,4464 ---- if (next->u.R1003D.R1004.present) if (next->u.R1003D.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, next, next->u.R1003D.R1004.u.expr); else ffests_printf_1U (s, "%lu", *************** ffestd_R1001dump_1005_1_ (ffests s, ffes *** 4389,4393 **** if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); --- 4491,4495 ---- if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); *************** ffestd_R1001dump_1005_1_ (ffests s, ffes *** 4397,4401 **** if (f->u.R1005.R1006.present) if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); --- 4499,4503 ---- if (f->u.R1005.R1006.present) if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); *************** ffestd_R1001dump_1005_2_ (ffests s, ffes *** 4418,4422 **** if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); --- 4520,4524 ---- if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); *************** ffestd_R1001dump_1005_2_ (ffests s, ffes *** 4425,4429 **** if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); --- 4527,4531 ---- if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); *************** ffestd_R1001dump_1005_3_ (ffests s, ffes *** 4445,4449 **** if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); --- 4547,4551 ---- if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); *************** ffestd_R1001dump_1005_3_ (ffests s, ffes *** 4452,4456 **** if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); --- 4554,4558 ---- if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); *************** ffestd_R1001dump_1005_3_ (ffests s, ffes *** 4460,4464 **** ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", --- 4562,4566 ---- ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1007_or_R1008.u.expr); else ffests_printf_1U (s, "%lu", *************** ffestd_R1001dump_1005_4_ (ffests s, ffes *** 4483,4487 **** if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); --- 4585,4589 ---- if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); *************** ffestd_R1001dump_1005_4_ (ffests s, ffes *** 4490,4494 **** if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); --- 4592,4596 ---- if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); *************** ffestd_R1001dump_1005_4_ (ffests s, ffes *** 4496,4500 **** ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val); --- 4598,4602 ---- ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1007_or_R1008.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val); *************** ffestd_R1001dump_1005_5_ (ffests s, ffes *** 4516,4520 **** if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); --- 4618,4622 ---- if (f->u.R1005.R1004.present) if (f->u.R1005.R1004.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val); *************** ffestd_R1001dump_1005_5_ (ffests s, ffes *** 4523,4527 **** if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); --- 4625,4629 ---- if (f->u.R1005.R1006.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val); *************** ffestd_R1001dump_1005_5_ (ffests s, ffes *** 4529,4533 **** ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val); --- 4631,4635 ---- ffests_putc (s, '.'); if (f->u.R1005.R1007_or_R1008.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1007_or_R1008.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val); *************** ffestd_R1001dump_1005_5_ (ffests s, ffes *** 4537,4541 **** ffests_putc (s, 'E'); if (f->u.R1005.R1009.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1005.R1009.u.unsigned_val); --- 4639,4643 ---- ffests_putc (s, 'E'); if (f->u.R1005.R1009.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1009.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1005.R1009.u.unsigned_val); *************** ffestd_R1001dump_1010_2_ (ffests s, ffes *** 4570,4574 **** if (f->u.R1010.val.present) if (f->u.R1010.val.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); --- 4672,4676 ---- if (f->u.R1010.val.present) if (f->u.R1010.val.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); *************** ffestd_R1001dump_1010_3_ (ffests s, ffes *** 4590,4594 **** if (f->u.R1010.val.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); --- 4692,4696 ---- if (f->u.R1010.val.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); *************** ffestd_R1001dump_1010_4_ (ffests s, ffes *** 4610,4614 **** if (f->u.R1010.val.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1D (s, "%ld", f->u.R1010.val.u.signed_val); --- 4712,4716 ---- if (f->u.R1010.val.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr); else ffests_printf_1D (s, "%ld", f->u.R1010.val.u.signed_val); *************** ffestd_R1001dump_1010_5_ (ffests s, ffes *** 4632,4636 **** if (f->u.R1010.val.rtexpr) ! ffestd_R1001error_ (f); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); --- 4734,4738 ---- if (f->u.R1010.val.rtexpr) ! ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr); else ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val); *************** ffestd_R1001error_ (ffesttFormatList f) *** 4650,4653 **** --- 4752,4801 ---- ffebad_here (0, ffelex_token_where_line (f->t), ffelex_token_where_column (f->t)); ffebad_finish (); + } + + static void + ffestd_R1001rtexpr_ (ffests s, ffesttFormatList f, ffebld expr) + { + if ((expr == NULL) + || (ffebld_op (expr) != FFEBLD_opCONTER) + || (ffeinfo_basictype (ffebld_info (expr)) != FFEINFO_basictypeINTEGER) + || (ffeinfo_kindtype (ffebld_info (expr)) == FFEINFO_kindtypeINTEGER4)) + { + ffebad_start (FFEBAD_FORMAT_VARIABLE); + ffebad_here (0, ffelex_token_where_line (f->t), ffelex_token_where_column (f->t)); + ffebad_finish (); + } + else + { + int val; + + switch (ffeinfo_kindtype (ffebld_info (expr))) + { + #if FFETARGET_okINTEGER1 + case FFEINFO_kindtypeINTEGER1: + val = ffebld_constant_integer1 (ffebld_conter (expr)); + break; + #endif + + #if FFETARGET_okINTEGER2 + case FFEINFO_kindtypeINTEGER2: + val = ffebld_constant_integer2 (ffebld_conter (expr)); + break; + #endif + + #if FFETARGET_okINTEGER3 + case FFEINFO_kindtypeINTEGER3: + val = ffebld_constant_integer3 (ffebld_conter (expr)); + break; + #endif + + default: + assert ("bad INTEGER constant kind type" == NULL); + /* Fall through. */ + case FFEINFO_kindtypeANY: + return; + } + ffests_printf_1D (s, "%ld", val); + } } diff -rcp2N g77-0.5.21/f/ste.c g77-0.5.22/f/ste.c *** g77-0.5.21/f/ste.c Mon Aug 11 18:53:40 1997 --- g77-0.5.22/f/ste.c Sun Mar 8 21:37:06 1998 *************** *** 1,4 **** /* ste.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995, 1996 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* ste.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** ffeste_begin_iterdo_ (ffestw block, tree *** 396,405 **** /* Do the initial assignment into the DO var. */ ! expr = ffecom_modify (void_type_node, tvar, tstart); ! expand_expr_stmt (expr); expr = ffecom_2 (MINUS_EXPR, TREE_TYPE (tvar), tend, ! TREE_CONSTANT (tstart) ? tstart : tvar); if (!ffe_is_onetrip ()) --- 396,404 ---- /* Do the initial assignment into the DO var. */ ! tstart = ffecom_save_tree (tstart); expr = ffecom_2 (MINUS_EXPR, TREE_TYPE (tvar), tend, ! tstart); if (!ffe_is_onetrip ()) *************** ffeste_begin_iterdo_ (ffestw block, tree *** 440,443 **** --- 439,445 ---- expand_expr_stmt (expr); + expr = ffecom_modify (void_type_node, tvar, tstart); + expand_expr_stmt (expr); + if (block == NULL) expand_start_loop_continue_elsewhere (0); *************** ffeste_io_cilist_ (bool have_err, *** 998,1002 **** tree field; tree inits, initn; - tree ignore; /* We ignore the length of format! */ bool constantp = TRUE; static tree errfield, unitfield, endfield, formatfield, recfield; --- 1000,1003 ---- *************** ffeste_io_cilist_ (bool have_err, *** 1085,1089 **** case FFESTV_formatCHAREXPR: ! formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, &ignore); if (TREE_CONSTANT (formatexp)) { --- 1086,1090 ---- case FFESTV_formatCHAREXPR: ! formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, NULL); if (TREE_CONSTANT (formatexp)) { *************** ffeste_io_icilist_ (bool have_err, *** 1304,1308 **** tree field; tree inits, initn; - tree ignore; /* We ignore the length of format! */ bool constantp = TRUE; static tree errfield, unitfield, endfield, formatfield, unitlenfield, --- 1305,1308 ---- *************** ffeste_io_icilist_ (bool have_err, *** 1408,1412 **** case FFESTV_formatCHAREXPR: ! formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, &ignore); if (TREE_CONSTANT (formatexp)) { --- 1408,1412 ---- case FFESTV_formatCHAREXPR: ! formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, NULL); if (TREE_CONSTANT (formatexp)) { diff -rcp2N g77-0.5.21/f/stu.c g77-0.5.22/f/stu.c *** g77-0.5.21/f/stu.c Tue Sep 9 06:11:37 1997 --- g77-0.5.22/f/stu.c Mon Sep 29 20:42:56 1997 *************** static void *** 925,929 **** ffestu_list_exec_transition_ (ffebld list) { ! static in_progress = FALSE; ffebld item; ffesymbol symbol; --- 925,929 ---- ffestu_list_exec_transition_ (ffebld list) { ! static bool in_progress = FALSE; ffebld item; ffesymbol symbol; *************** static bool *** 1117,1121 **** ffestu_dummies_transition_ (ffesymbol (*symfunc) (), ffebld list) { ! static in_progress = FALSE; ffebld item; ffesymbol symbol; --- 1117,1121 ---- ffestu_dummies_transition_ (ffesymbol (*symfunc) (), ffebld list) { ! static bool in_progress = FALSE; ffebld item; ffesymbol symbol; diff -rcp2N g77-0.5.21/f/target.c g77-0.5.22/f/target.c *** g77-0.5.21/f/target.c Wed Feb 5 06:01:35 1997 --- g77-0.5.22/f/target.c Sun Mar 8 21:36:15 1998 *************** *** 1,4 **** /* target.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1997 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). --- 1,4 ---- /* target.c -- Implementation File (module.c template V1.0) ! Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley (burley@gnu.ai.mit.edu). *************** ffetarget_align (ffetargetAlign *updated *** 281,284 **** --- 281,291 ---- } + /* Always append a null byte to the end, in case this is wanted in + a special case such as passing a string as a FORMAT or %REF. + Done to save a bit of hassle, nothing more, but it's a kludge anyway, + because it isn't a "feature" that is self-documenting. Use the + string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature + in the code. */ + #if FFETARGET_okCHARACTER1 bool *************** ffetarget_character1 (ffetargetCharacter *** 291,296 **** else { ! val->text = malloc_new_kp (pool, "ffetargetCharacter1", val->length); memcpy (val->text, ffelex_token_text (character), val->length); } --- 298,304 ---- else { ! val->text = malloc_new_kp (pool, "ffetargetCharacter1", val->length + 1); memcpy (val->text, ffelex_token_text (character), val->length); + val->text[val->length] = '\0'; } *************** ffetarget_cmp_character1 (ffetargetChara *** 319,323 **** /* ffetarget_concatenate_character1 -- Perform CONCAT op on two constants ! Compare lengths, if equal then use memcmp. */ #if FFETARGET_okCHARACTER1 --- 327,336 ---- /* ffetarget_concatenate_character1 -- Perform CONCAT op on two constants ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ #if FFETARGET_okCHARACTER1 *************** ffetarget_concatenate_character1 (ffetar *** 332,340 **** else { ! res->text = malloc_new_kp (pool, "ffetargetCharacter1(CONCAT)", *len); if (l.length != 0) memcpy (res->text, l.text, l.length); if (r.length != 0) memcpy (res->text + l.length, r.text, r.length); } --- 345,354 ---- else { ! res->text = malloc_new_kp (pool, "ffetargetCharacter1(CONCAT)", *len + 1); if (l.length != 0) memcpy (res->text, l.text, l.length); if (r.length != 0) memcpy (res->text + l.length, r.text, r.length); + res->text[*len] = '\0'; } *************** ffetarget_ne_character1 (bool *res, ffet *** 502,506 **** /* ffetarget_substr_character1 -- Perform SUBSTR op on three constants ! Compare lengths, if equal then use memcmp. */ #if FFETARGET_okCHARACTER1 --- 516,525 ---- /* ffetarget_substr_character1 -- Perform SUBSTR op on three constants ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ #if FFETARGET_okCHARACTER1 *************** ffetarget_substr_character1 (ffetargetCh *** 520,525 **** { res->length = *len = last - first + 1; ! res->text = malloc_new_kp (pool, "ffetargetCharacter1(SUBSTR)", *len); memcpy (res->text, l.text + first - 1, *len); } --- 539,545 ---- { res->length = *len = last - first + 1; ! res->text = malloc_new_kp (pool, "ffetargetCharacter1(SUBSTR)", *len + 1); memcpy (res->text, l.text + first - 1, *len); + res->text[*len] = '\0'; } *************** ffetarget_convert_any_typeless_ (char *r *** 667,670 **** --- 687,697 ---- } + /* Always append a null byte to the end, in case this is wanted in + a special case such as passing a string as a FORMAT or %REF. + Done to save a bit of hassle, nothing more, but it's a kludge anyway, + because it isn't a "feature" that is self-documenting. Use the + string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature + in the code. */ + #if FFETARGET_okCHARACTER1 ffebad *************** ffetarget_convert_character1_character1 *** 679,683 **** else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size); if (size <= l.length) memcpy (res->text, l.text, size); --- 706,710 ---- else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1); if (size <= l.length) memcpy (res->text, l.text, size); *************** ffetarget_convert_character1_character1 *** 687,690 **** --- 714,718 ---- memset (res->text + l.length, ' ', size - l.length); } + res->text[size] = '\0'; } *************** ffetarget_convert_character1_character1 *** 693,696 **** --- 721,732 ---- #endif + + /* Always append a null byte to the end, in case this is wanted in + a special case such as passing a string as a FORMAT or %REF. + Done to save a bit of hassle, nothing more, but it's a kludge anyway, + because it isn't a "feature" that is self-documenting. Use the + string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature + in the code. */ + #if FFETARGET_okCHARACTER1 ffebad *************** ffetarget_convert_character1_hollerith ( *** 704,708 **** else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size); if (size <= l.length) { --- 740,745 ---- else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1); ! res->text[size] = '\0'; if (size <= l.length) { *************** ffetarget_convert_character1_hollerith ( *** 728,732 **** #endif ! /* ffetarget_convert_character1_integer1 -- Raw conversion. */ #if FFETARGET_okCHARACTER1 --- 765,776 ---- #endif ! /* ffetarget_convert_character1_integer4 -- Raw conversion. ! ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ #if FFETARGET_okCHARACTER1 *************** ffetarget_convert_character1_integer4 (f *** 789,793 **** else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size); if (((size_t) size) <= size_of) { --- 833,838 ---- else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1); ! res->text[size] = '\0'; if (((size_t) size) <= size_of) { *************** ffetarget_convert_character1_integer4 (f *** 814,818 **** #endif ! /* ffetarget_convert_character1_logical1 -- Raw conversion. */ #if FFETARGET_okCHARACTER1 --- 859,870 ---- #endif ! /* ffetarget_convert_character1_logical4 -- Raw conversion. ! ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ #if FFETARGET_okCHARACTER1 *************** ffetarget_convert_character1_logical4 (f *** 875,879 **** else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size); if (((size_t) size) <= size_of) { --- 927,932 ---- else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1); ! res->text[size] = '\0'; if (((size_t) size) <= size_of) { *************** ffetarget_convert_character1_logical4 (f *** 900,904 **** #endif ! /* ffetarget_convert_character1_typeless -- Raw conversion. */ #if FFETARGET_okCHARACTER1 --- 953,964 ---- #endif ! /* ffetarget_convert_character1_typeless -- Raw conversion. ! ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ #if FFETARGET_okCHARACTER1 *************** ffetarget_convert_character1_typeless (f *** 961,965 **** else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size); if (((size_t) size) <= size_of) { --- 1021,1026 ---- else { ! res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1); ! res->text[size] = '\0'; if (((size_t) size) <= size_of) { *************** ffetarget_divide_complex2 (ffetargetComp *** 1102,1108 **** /* ffetarget_hollerith -- Convert token to a hollerith constant ! See prototype. ! ! Token use count not affected overall. */ bool --- 1163,1172 ---- /* ffetarget_hollerith -- Convert token to a hollerith constant ! Always append a null byte to the end, in case this is wanted in ! a special case such as passing a string as a FORMAT or %REF. ! Done to save a bit of hassle, nothing more, but it's a kludge anyway, ! because it isn't a "feature" that is self-documenting. Use the ! string "FFETARGET-NULL-KLUDGE" to flag anyplace you use this feature ! in the code. */ bool *************** ffetarget_hollerith (ffetargetHollerith *** 1111,1116 **** { val->length = ffelex_token_length (integer); ! val->text = malloc_new_kp (pool, "ffetargetHollerith", val->length); memcpy (val->text, ffelex_token_text (integer), val->length); return TRUE; --- 1175,1181 ---- { val->length = ffelex_token_length (integer); ! val->text = malloc_new_kp (pool, "ffetargetHollerith", val->length + 1); memcpy (val->text, ffelex_token_text (integer), val->length); + val->text[val->length] = '\0'; return TRUE; diff -rcp2N g77-0.5.21/f/zzz.c g77-0.5.22/f/zzz.c *** g77-0.5.21/f/zzz.c Tue Sep 9 06:10:54 1997 --- g77-0.5.22/f/zzz.c Mon Mar 16 20:42:46 1998 *************** the Free Software Foundation, 59 Temple *** 52,56 **** #endif /* !defined (FFEZZZ_TIME) */ ! char *ffezzz_version_string = "0.5.21"; char *ffezzz_date = FFEZZZ_DATE; char *ffezzz_time = FFEZZZ_TIME; --- 52,56 ---- #endif /* !defined (FFEZZZ_TIME) */ ! char *ffezzz_version_string = "0.5.22"; char *ffezzz_date = FFEZZZ_DATE; char *ffezzz_time = FFEZZZ_TIME;