aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1998-03-22 09:42:52 +0000
committerJeffrey A Law <law@cygnus.com>1998-03-22 09:42:52 +0000
commit4d7a35e7dc36b93d791600714ae65b950415e677 (patch)
tree787019488d96660b351ee853048860678f8c4fa5
parent6cd92199dd9846a9cf91ffdc571ef53dac15f5e9 (diff)
Try to import again.g77_0_0_21_970811
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/g77_0_0_21_970811@18750 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/f/BUGS50
-rw-r--r--gcc/f/ChangeLog243
-rw-r--r--gcc/f/INSTALL140
-rw-r--r--gcc/f/Make-lang.in26
-rw-r--r--gcc/f/Makefile.in2
-rw-r--r--gcc/f/NEWS124
-rw-r--r--gcc/f/bad.def4
-rw-r--r--gcc/f/bugs.texi84
-rw-r--r--gcc/f/com-rt.def8
-rw-r--r--gcc/f/com.c320
-rw-r--r--gcc/f/com.h1
-rw-r--r--gcc/f/expr.c137
-rw-r--r--gcc/f/fini.c2
-rw-r--r--gcc/f/g77.114
-rw-r--r--gcc/f/g77.info1417
-rw-r--r--gcc/f/g77.info-116
-rw-r--r--gcc/f/g77.info-10105
-rw-r--r--gcc/f/g77.info-1177
-rw-r--r--gcc/f/g77.info-12351
-rw-r--r--gcc/f/g77.info-13599
-rw-r--r--gcc/f/g77.info-14584
-rw-r--r--gcc/f/g77.info-15591
-rw-r--r--gcc/f/g77.info-16649
-rw-r--r--gcc/f/g77.info-17424
-rw-r--r--gcc/f/g77.info-18354
-rw-r--r--gcc/f/g77.info-19173
-rw-r--r--gcc/f/g77.info-243
-rw-r--r--gcc/f/g77.info-2051
-rw-r--r--gcc/f/g77.info-36
-rw-r--r--gcc/f/g77.info-4130
-rw-r--r--gcc/f/g77.info-512
-rw-r--r--gcc/f/g77.info-68
-rw-r--r--gcc/f/g77.info-743
-rw-r--r--gcc/f/g77.info-862
-rw-r--r--gcc/f/g77.info-9142
-rw-r--r--gcc/f/g77.texi151
-rw-r--r--gcc/f/gbe/2.7.2.3.diff5882
-rw-r--r--gcc/f/gbe/README11
-rw-r--r--gcc/f/install.texi170
-rw-r--r--gcc/f/intdoc.c16
-rw-r--r--gcc/f/intdoc.in115
-rw-r--r--gcc/f/intdoc.texi141
-rw-r--r--gcc/f/intrin.c88
-rw-r--r--gcc/f/intrin.def124
-rw-r--r--gcc/f/lang-options.h8
-rw-r--r--gcc/f/lex.c2
-rw-r--r--gcc/f/malloc.c2
-rw-r--r--gcc/f/news.texi183
-rw-r--r--gcc/f/sta.c8
-rw-r--r--gcc/f/sta.h1
-rw-r--r--gcc/f/stb.c10
-rw-r--r--gcc/f/std.c364
-rw-r--r--gcc/f/ste.c16
-rw-r--r--gcc/f/stu.c4
-rw-r--r--gcc/f/target.c101
-rw-r--r--gcc/f/zzz.c2
56 files changed, 10110 insertions, 4281 deletions
diff --git a/gcc/f/BUGS b/gcc/f/BUGS
index fcbf9b7bb91..aa6bf3709ea 100644
--- a/gcc/f/BUGS
+++ b/gcc/f/BUGS
@@ -25,27 +25,6 @@ port, build, and install `g77', *Note Problems Installing::.
Until this bug is fixed, use only `-O1' or no optimization.
- * A code-generation bug afflicts Intel x86 targets when `-O2' is
- specified compiling, for example, an old version of the `DNRM2'
- routine. The x87 coprocessor stack is being somewhat mismanaged
- in cases where assigned `GOTO' and `ASSIGN' are involved.
-
- Version 0.5.21 of `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.
-
- * Work is needed on the `SIGNAL()' intrinsic to ensure that pointers
- and integers are properly handled on all targets, including 64-bit
- machines.
-
- * When using `-fugly-comma', `g77' assumes an extra `%VAL(0)'
- argument is to be passed to intrinsics taking no arguments, such
- as `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, `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.
-
* Something about `g77''s straightforward handling of label
references and definitions sometimes prevents the GBE from
unrolling loops. Until this is solved, try inserting or removing
@@ -151,30 +130,6 @@ port, build, and install `g77', *Note Problems Installing::.
potential, with the current setup, for interface differences in
the way such areas are laid out between `g77' and other compilers.
- * 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 `g77''s support for Solaris/x86 systems.
-
- * 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 `gcc-2.7.0' plus
- `g77-0.5.16'. This problem shows up only when compiling the
- Fortran program with `-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 `g77''s support for RS/6000 systems.
-
- * SGI support is known to be a bit buggy. The known problem shows
- up only when compiling the Fortran program with `-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 `g77''s support for SGI systems.
-
* `g77' doesn't work perfectly on 64-bit configurations such as the
Alpha. This problem is expected to be largely resolved as of
version 0.5.20, and further addressed by 0.5.21. Version 0.6
@@ -210,8 +165,7 @@ port, build, and install `g77', *Note Problems Installing::.
general expressions (other than simple variables/arrays), to
procedures when compiling on some systems (such as i386) with
`-fPIC', as in 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
+ 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 *without* the `-O' option.
diff --git a/gcc/f/ChangeLog b/gcc/f/ChangeLog
index a50466e9169..4a87a2ae0c6 100644
--- a/gcc/f/ChangeLog
+++ b/gcc/f/ChangeLog
@@ -1,3 +1,246 @@
+Mon Mar 16 15:38:50 1998 Craig Burley <burley@gnu.org>
+
+ * Version 0.5.22 released.
+
+Mon Mar 16 14:36:02 1998 Craig Burley <burley@gnu.org>
+
+ 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 <burley@gnu.org>
+
+ * intrin.def: Fix spelling of mixed-case form
+ of `CPU_Time' (was `Cpu_Time').
+
+1998-03-09 Dave Love <d.love@dl.ac.uk>
+
+ * 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 <burley@gnu.org>
+
+ * intrin.def: Use tabs instead of blanks more
+ consistently (excepting DEFGEN section for now).
+
+Sat Feb 28 15:24:38 1998 Craig Burley <burley@gnu.org>
+
+ * intrin.def: Make CPU_TIME's arg generic real to be just
+ like SECOND_subr.
+
+Fri Feb 20 12:45:53 1998 Craig Burley <burley@gnu.org>
+
+ * expr.c (ffeexpr_token_arguments_): Make sure
+ outer exprstack isn't null.
+
+1998-02-16 Dave Love <d.love@dl.ac.uk>
+
+ * Makefile.in (f/fini): Don't use -W -Wall with HOST_CC.
+
+Sun Jan 11 02:14:47 1998 Craig Burley <burley@gnu.org>
+
+ 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
+ <bruno@linuix.mathematik.uni-karlsruhe.de>.)
+
+Fri Jan 9 19:09:07 1998 Craig Burley <burley@gnu.org>
+
+ 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 <burley@gnu.org>
+
+ * 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 <burley@gnu.org>
+
+ * intrin.c (ffeintrin_init_0): Remove duplicate
+ check for `!'.
+
+Sun Dec 14 02:49:58 1997 Craig Burley <burley@gnu.org>
+
+ * 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 <rth@cygnus.com>
+
+ * com.c (ffecom_type_vardesc_): Vardesc.dims is a `ftnlen*'.
+
+Mon Dec 1 19:12:36 1997 Craig Burley <burley@gnu.org>
+
+ * intrin.c (ffeintrin_check_): Fix up indentation a bit more.
+
+Mon Dec 1 16:21:08 1997 Craig Burley <burley@gnu.org>
+
+ * 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 <burley@gnu.org>
+
+ * 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 <d.love@dl.ac.uk>
+
+ * 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 <d.love@dl.ac.uk>
+
+ * intrin.def: Allow non-integer args for INT2 and INT8 (per
+ documentation).
+
+Tue Oct 28 02:21:25 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+ * lang-options.h: Add -fgnu-intrinsics-* and
+ -fbadu77-intrinsics-* options.
+
+Sun Oct 26 02:36:21 1997 Craig Burley <burley@gnu.ai.mit.edu>
+
+ * 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 <burley@gnu.ai.mit.edu>
+
+ 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 <burley@gnu.ai.mit.edu>
+
+ * 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 <d.love@dl.ac.uk>
+
+ * 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 <burley@gnu.ai.mit.edu>
+
+ * 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 <burley@gnu.ai.mit.edu>
+
+ * 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 <burley@gnu.ai.mit.edu>
+
+ * 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 <burley@gnu.ai.mit.edu>
* Version 0.5.21 released.
diff --git a/gcc/f/INSTALL b/gcc/f/INSTALL
index d8a1dd89799..db4157af389 100644
--- a/gcc/f/INSTALL
+++ b/gcc/f/INSTALL
@@ -38,8 +38,9 @@ follow the `g77' installation instructions:
available--in fact, a complete GNU UNIX system can be put together
on most systems, if desired.
- The version of GNU `gzip' used to package this release is 1.24.
- (The version of GNU `tar' used to package this release is 1.11.2.)
+ The version of GNU `gzip' used to package this release is
+ 1.2.4. (The version of GNU `tar' used to package this release is
+ 1.12.)
`gcc-2.7.2.3.tar.gz'
You need to have this, or some other applicable, version of `gcc'
@@ -54,7 +55,7 @@ follow the `g77' installation instructions:
Without an applicable `gcc' source tree, you cannot build `g77'.
You can obtain an FSF distribution of `gcc' from the FSF.
-`g77-0.5.21.tar.gz'
+`g77-0.5.22.tar.gz'
You probably have already unpacked this package, or you are
reading an advance copy of these installation instructions, which
are contained in this distribution. The size of this package is
@@ -145,14 +146,16 @@ Enough disk space
In any case, you can apply patches by hand--patch files are
designed for humans to read them.
- The version of GNU `patch' used to develop this release is 2.4.
+ The version of GNU `patch' used to develop this release is
+ 2.5.
`make'
Your system must have `make', and you will probably save yourself
a lot of trouble if it is GNU `make' (sometimes referred to as
`gmake').
- The version of GNU `make' used to develop this release is 3.73.
+ The version of GNU `make' used to develop this release is
+ 3.76.1.
`cc'
Your system must have a working C compiler.
@@ -167,7 +170,8 @@ Enough disk space
distribution. You can obtain `bison' the same way you obtained
`gcc' and `g77'.
- The version of GNU `bison' used to develop this release is 1.25.
+ The version of GNU `bison' used to develop this release is
+ 1.25.
*Note Missing bison?::, for information on how to work around not
having `bison'.
@@ -187,10 +191,10 @@ Enough disk space
All UNIX systems have `sed', but some have a broken version that
cannot handle configuring, building, or installing `gcc' or `g77'.
- The version of GNU `sed' used to develop this release is 2.05.
- (Note that GNU `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
+ The version of GNU `sed' used to develop this release is
+ 2.05. (Note that GNU `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.)
`root' access or equivalent
@@ -338,7 +342,20 @@ corresponding output files.
If the above does not work, definitely start from scratch and avoid
copying the `gcc' using any method that does not reliably preserve
-date-time-modified information, such as the UNIX `cp -r' command.
+date-time-modified information, such as the UNIX `cp -r' command (use
+`cp -pr' instead).
+
+System-specific Problems
+------------------------
+
+ 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 `egcs' instead of versions of `g77' based on versions of
+`gcc' prior to 2.8. `http://www.cygnus.com/egcs' for information on
+`egcs', or obtain a copy from `ftp://egcs.cygnus.com/pub/egcs'.
+
+ If your system is Irix 6, to obtain a working version of `gcc',
+`http://reality.sgi.com/knobi/gcc-2.7.2.x-on-irix-6.2-6.3'.
Cross-compiler Problems
-----------------------
@@ -491,11 +508,12 @@ Floating-point Bit Patterns
The `g77' build will crash if an attempt is made to build it as a
cross-compiler for a target when `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.
-(Currently, `g77' would generate bad code under such circumstances if
-it didn't crash during the build, e.g. when compiling a source file
-that does something like `EQUIVALENCE (I,R)' and `DATA R/9.43578/'.)
+improvements for version 0.6 of `g77' will give it the capabilities it
+needs to not have to crash the build but rather generate correct code
+for the target. (Currently, `g77' would generate bad code under such
+circumstances if it didn't crash during the build, e.g. when compiling
+a source file that does something like `EQUIVALENCE (I,R)' and `DATA
+R/9.43578/'.)
Initialization of Large Aggregate Areas
---------------------------------------
@@ -567,7 +585,7 @@ is assumed that the source distributions themselves already reside in
system:
/usr/FSF/gcc-2.7.2.3.tar.gz
- /usr/FSF/g77-0.5.21.tar.gz
+ /usr/FSF/g77-0.5.22.tar.gz
Users of the following systems should not blindly follow these
quick-start instructions, because of problems their systems have coping
@@ -593,17 +611,17 @@ of some of the steps. These explanations follow this list of steps.
sh[ 2]# gunzip -c < /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
[Might say "Broken pipe"...that is normal on some systems.]
- sh[ 3]# gunzip -c < /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ sh[ 3]# gunzip -c < /usr/FSF/g77-0.5.22.tar.gz | tar xf -
["Broken pipe" again possible.]
sh[ 4]# ln -s gcc-2.7.2.3 gcc
- sh[ 5]# ln -s g77-0.5.21 g77
+ sh[ 5]# ln -s g77-0.5.22 g77
sh[ 6]# mv -i g77/* gcc
[No questions should be asked by mv here; or, you made a mistake.]
- sh[ 7]# patch -p1 -V t -d gcc < gcc/f/gbe/2.7.2.3.diff
+ sh[ 7]# patch -p1 -E -V t -d gcc < gcc/f/gbe/2.7.2.3.diff
[Unless patch complains about rejected patches, this step worked.]
sh[ 8]# cd gcc
@@ -655,17 +673,17 @@ Step 1: `cd /usr/src'
your system knew where to look for the source code for the
installed version of `g77' and `gcc' in any case.
-Step 3: `gunzip -d < /usr/FSF/g77-0.5.21.tar.gz | tar xf -'
+Step 3: `gunzip -d < /usr/FSF/g77-0.5.22.tar.gz | tar xf -'
It is not always necessary to obtain the latest version of `g77'
as a complete `.tar.gz' file if you have a complete, earlier
distribution of `g77'. If appropriate, you can unpack that earlier
version of `g77', and then apply the appropriate patches to
- achieve the same result--a source tree containing version 0.5.21
- of `g77'.
+ achieve the same result--a source tree containing version
+ 0.5.22 of `g77'.
Step 4: `ln -s gcc-2.7.2.3 gcc'
-Step 5: `ln -s g77-0.5.21 g77'
+Step 5: `ln -s g77-0.5.22 g77'
These commands mainly help reduce typing, and help reduce visual
clutter in examples in this manual showing what to type to install
`g77'.
@@ -675,7 +693,7 @@ Step 5: `ln -s g77-0.5.21 g77'
Step 6: `mv -i g77/* gcc'
After doing this, you can, if you like, type `rm g77' and `rmdir
- g77-0.5.21' to remove the empty directory and the symbol link to
+ g77-0.5.22' to remove the empty directory and the symbol link to
it. But, it might be helpful to leave them around as quick
reminders of which version(s) of `g77' are installed on your
system.
@@ -684,10 +702,9 @@ Step 6: `mv -i g77/* gcc'
directory (as merged into the `gcc' directory).
Step 7: `patch -p1 ...'
- This can produce a wide variety of printed output, from `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 you are using GNU `patch' version 2.5 or later, this should
+ produce a list of files patched. (Other versions of `patch' might
+ not work properly.)
If messages about "fuzz", "offset", or especially "reject files"
are printed, it might mean you applied the wrong patch file. If
@@ -701,6 +718,13 @@ Step 7: `patch -p1 ...'
*Note Merging Distributions::, for more information.
+ *Note:* `gcc' versions circa 2.7.2.2 and 2.7.2.3 are known to have
+ slightly differing versions of the `gcc/ChangeLog' file, depending
+ on how they are obtained. You can safely ignore diagnostics
+ `patch' reports when patching this particular file, since it is
+ purely a documentation file for implementors. See
+ `gcc/f/gbe/2.7.2.3.diff' for more information.
+
Step 9: `touch f77-install-ok'
Don't do this if you don't want to overwrite an existing version
of `f77' (such as a native compiler, or a script that invokes
@@ -833,9 +857,9 @@ generally only the documentation is immediately usable.
sh# cd /usr/src
sh# gunzip -c /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
- sh# gunzip -c /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ sh# gunzip -c /usr/FSF/g77-0.5.22.tar.gz | tar xf -
sh# ln -s gcc-2.7.2.3 gcc
- sh# ln -s g77-0.5.21 g77
+ sh# ln -s g77-0.5.22 g77
sh# mv -i g77/* gcc
*Notes:* The commands beginning with `gunzip...' might print `Broken
@@ -947,10 +971,9 @@ changes to the `g77' front end (FFE).
in general, will stabilize sufficiently for the need for hand-patching
to disappear.
- Invoking `patch' as described in `gcc/f/gbe/README' can produce a
-wide variety of printed output, from `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 you are using GNU `patch' version 2.5 or later, this should
+produce a list of files patched. (Other versions of `patch' might not
+work properly.)
If messages about "fuzz", "offset", or especially "reject files" are
printed, it might mean you applied the wrong patch file. If you
@@ -966,6 +989,13 @@ works).
of several files as saved by `patch'. To remove these, after `cd gcc',
type `rm -i *.~*~'.
+ *Note:* `gcc' versions circa 2.7.2.2 and 2.7.2.3 are known to have
+slightly differing versions of the `gcc/ChangeLog' file, depending on
+how they are obtained. You can safely ignore diagnostics `patch'
+reports when patching this particular file, since it is purely a
+documentation file for implementors. See `gcc/f/gbe/2.7.2.3.diff' for
+more information.
+
*Note:* `g77''s configuration file `gcc/f/config-lang.in' ensures
that the source code for the version of `gcc' being configured has at
least one indication of being patched as required specifically by `g77'.
@@ -975,7 +1005,8 @@ explanation. *Please* do not try to disable the check, otherwise `g77'
might well appear to build and install correctly, and even appear to
compile correctly, but could easily produce broken code.
- `diff -rcp2N' is used to create the patch files in `gcc/f/gbe/'.
+ `LC_ALL=C TZ=UTC0 diff -rcp2N' is used to create the patch files in
+`gcc/f/gbe/'.
Installing `f77'
----------------
@@ -1320,46 +1351,46 @@ them when they work:
sh# cd /usr/src/gcc
sh# ./g77 --driver=./xgcc -B./ -v
- g77 version 0.5.21
+ g77 version 0.5.22
./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 ...
Reading specs from ./specs
- gcc version 2.7.2.3.f.1
+ gcc version 2.7.2.3.f.2
./cpp -lang-c -v -isystem ./include -undef ...
- GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ GNU CPP version 2.7.2.3.f.2 (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.2/include
/usr/include
End of search list.
./f771 /tmp/cca18048.i -fset-g77-defaults -quiet -dumpbase ...
- GNU F77 version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
- GNU Fortran Front End version 0.5.21 compiled: ...
+ GNU F77 version 2.7.2.3.f.2 (Linux/Alpha) compiled ...
+ GNU Fortran Front End version 0.5.22 compiled: ...
as -nocpp -o /tmp/cca180481.o /tmp/cca18048.s
ld -G 8 -O1 -o /tmp/gfa18047 /usr/lib/crt0.o -L. ...
- __G77_LIBF77_VERSION__: 0.5.21
+ __G77_LIBF77_VERSION__: 0.5.22
@(#)LIBF77 VERSION 19970404
- __G77_LIBI77_VERSION__: 0.5.21
+ __G77_LIBI77_VERSION__: 0.5.22
@(#) LIBI77 VERSION pjw,dmg-mods 19970816
- __G77_LIBU77_VERSION__: 0.5.21
+ __G77_LIBU77_VERSION__: 0.5.22
@(#) LIBU77 VERSION 19970609
sh# ./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone
Reading specs from ./specs
- gcc version 2.7.2.3.f.1
+ gcc version 2.7.2.3.f.2
./cpp -lang-c -v -isystem ./include -undef ...
- GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ GNU CPP version 2.7.2.3.f.2 (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.2/include
/usr/include
End of search list.
./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version ...
- GNU C version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
+ GNU C version 2.7.2.3.f.2 (Linux/Alpha) compiled ...
as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s
ld -G 8 -O1 -o /tmp/delete-me /usr/lib/crt0.o -L. ...
/usr/lib/crt0.o: In function `__start':
@@ -1605,10 +1636,9 @@ general) are broken, at least for their system.
Finally, *please* ask for bug reports to go to you first, at least
until you're sure your distribution is widely used and has been well
tested. This especially goes for those of you making any changes to
-the `g77' sources to port `g77', e.g. to OS/2.
-<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 user. Once you are quite
-certain a bug report does not involve your efforts, you can forward it
-to us.
+the `g77' sources to port `g77', e.g. to OS/2. <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 user. Once you are quite certain a bug report does not
+involve your efforts, you can forward it to us.
diff --git a/gcc/f/Make-lang.in b/gcc/f/Make-lang.in
index 46714c84a80..c20c408eab2 100644
--- a/gcc/f/Make-lang.in
+++ b/gcc/f/Make-lang.in
@@ -266,6 +266,12 @@ f77-runtime-unsafe:
# configure, not a Cygnus-type one. It needs to be run *after* the
# 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/libF77/Makefile \
@@ -284,18 +290,22 @@ f/runtime/libU77/Makefile: \
top=`pwd`; \
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`" \
- $(F77_FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) \
+ 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`" \
- $(F77_FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) \
+ CONFIG_SITE=no-such-file $(SHELL) \
$${src}/f/runtime/libU77/configure --srcdir=$${src}/f/runtime/libU77
#For now, omit f2c stuff. -- burley
@@ -458,11 +468,13 @@ f77.install-common:
fi ; \
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-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
-if [ -f f771$(exeext) ] ; then \
diff --git a/gcc/f/Makefile.in b/gcc/f/Makefile.in
index dd14447df4e..f8e42ae3eae 100644
--- a/gcc/f/Makefile.in
+++ b/gcc/f/Makefile.in
@@ -501,7 +501,7 @@ f/str-ot.h f/str-ot.j: f/fini f/str-ot.fin
./f/fini `echo $(srcdir)/f/str-ot.fin | sed 's,^\./,,'` f/str-ot.j f/str-ot.h
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
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o f/fini f/fini.o f/proj-h.o
f/fini.o:
$(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
diff --git a/gcc/f/NEWS b/gcc/f/NEWS
index 8be979814f6..143e53e4e94 100644
--- a/gcc/f/NEWS
+++ b/gcc/f/NEWS
@@ -9,11 +9,125 @@ News About GNU Fortran
Changes made to recent versions of GNU Fortran are listed 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.
+ The changes are generally listed in order:
+
+ 1. Code-generation and run-time-library bugs
+
+ 2. Compiler and run-time-library crashes involving valid code
+
+ 3. New features
+
+ 4. Fixes and enhancements to existing features
+
+ 5. New diagnostics
+
+ 6. Internal improvements
+
+ 7. Miscellany
+
+ This order is not strict--for example, some items involve a
+combination of these elements.
+
+In 0.5.22:
+==========
+
+ * Fix code generation for iterative `DO' loops that have one or more
+ references to the iteration variable, or to aliases of it, in
+ their control expressions. For example, `DO 10 J=2,J' now is
+ compiled correctly.
+
+ * Fix a code-generation bug that afflicted Intel x86 targets when
+ `-O2' was specified compiling, for example, an old version of the
+ `DNRM2' routine.
+
+ The x87 coprocessor stack was being mismanaged in cases involving
+ assigned `GOTO' and `ASSIGN'.
+
+ * Fix `DTime' intrinsic so as not to truncate results to integer
+ values (on some systems).
+
+ * Fix `SIGNAL' intrinsic so it offers portable support for 64-bit
+ systems (such as Digital Alphas running GNU/Linux).
+
+ * Fix run-time crash involving `NAMELIST' on 64-bit machines such as
+ Alphas.
+
+ * Fix `g77' version of `libf2c' so it no longer produces a spurious
+ `I/O recursion' diagnostic at run time when an I/O operation (such
+ as `READ *,I') is interrupted in a manner that causes the program
+ to be terminated via the `f_exit' routine (such as via `C-c').
+
+ * Fix `g77' crash triggered by `CASE' statement with an omitted
+ lower or upper bound.
+
+ * Fix `g77' crash compiling references to `CPU_Time' intrinsic.
+
+ * Fix `g77' crash (or apparently infinite run-time) when compiling
+ certain complicated expressions involving `COMPLEX' arithmetic
+ (especially multiplication).
+
+ * Fix `g77' crash on statements such as `PRINT *,
+ (REAL(Z(I)),I=1,2)', where `Z' is `DOUBLE COMPLEX'.
+
+ * Fix a `g++' crash.
+
+ * Support `FORMAT(I<EXPR>)' when EXPR is a compile-time constant
+ `INTEGER' expression.
+
+ * Fix `g77' `-g' option so procedures that use `ENTRY' can be
+ stepped through, line by line, in `gdb'.
+
+ * Fix a profiling-related bug in `gcc' back end for Intel x86
+ architecture.
+
+ * Allow any `REAL' argument to intrinsics `Second' and `CPU_Time'.
+
+ * Allow any numeric argument to intrinsics `Int2' and `Int8'.
+
+ * Use `tempnam', if available, to open scratch files (as in
+ `OPEN(STATUS='SCRATCH')' so that the `TMPDIR' environment variable,
+ if present, is used.
+
+ * Rename the `gcc' keyword `restrict' to `__restrict__', to avoid
+ rejecting valid, existing, C programs. Support for `restrict' is
+ now more like support for `complex'.
+
+ * Fix `-fpedantic' to not reject procedure invocations such as
+ `I=J()' and `CALL FOO()'.
+
+ * Fix `-fugly-comma' to affect invocations of only external
+ procedures. Restore rejection of gratuitous trailing omitted
+ arguments to intrinsics, as in `I=MAX(3,4,,)'.
+
+ * Fix compiler so it accepts `-fgnu-intrinsics-*' and
+ `-fbadu77-intrinsics-*' options.
+
+ * Improve diagnostic messages from `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 `f2c', `g77' did not append a null byte to its compiled
+ form of every format string specified via a `FORMAT' statement.
+ However, `f2c' would exhibit the problem anyway for a statement
+ like `PRINT '(I)garbage', 1' by printing `(I)garbage' as the
+ format string.)
+
+ * 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 `libf2c' for statements
+ like `PRINT '(I1', 42'.
+
+ * Fix various crashes involving code with diagnosed errors.
+
+ * Fix cross-compilation bug when configuring `libf2c'.
+
+ * Improve diagnostics.
+
+ * Improve documentation and indexing.
+
+ * Upgrade to `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).
In 0.5.21:
==========
diff --git a/gcc/f/bad.def b/gcc/f/bad.def
index 507bfed55b0..9a3cf5a323d 100644
--- a/gcc/f/bad.def
+++ b/gcc/f/bad.def
@@ -539,6 +539,8 @@ FFEBAD_MSGS2 (FFEBAD_TOO_MANY_DIMS, FATAL,
"Too many dimensions at %0")
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_TOO_MANY_ARGUMENTS, FATAL,
@@ -547,6 +549,8 @@ FFEBAD_MSGS1 (FFEBAD_ARRAY_AS_SFARG, FATAL,
"Array supplied at %1 for dummy argument `%A' in statement function reference at %0")
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",
"Unsupported OPEN control item at %0")
diff --git a/gcc/f/bugs.texi b/gcc/f/bugs.texi
index f6ad4807ef9..4fb96303c8b 100644
--- a/gcc/f/bugs.texi
+++ b/gcc/f/bugs.texi
@@ -1,11 +1,11 @@
-@c Copyright (C) 1995-1997 Free Software Foundation, Inc.
+@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.
@c The text of this file appears in the file BUGS
@c in the G77 distribution, as well as in the G77 manual.
-@c 1996-09-09
+@c 1998-03-15
@ifclear BUGSONLY
@node Actual Bugs
@@ -40,45 +40,6 @@ in this case, @samp{R} might be initialized to @samp{4.0}.
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
label references and definitions sometimes prevents the GBE
@@ -225,42 +186,6 @@ is the potential, with the current setup, for interface differences
in the way such areas are laid out between @code{g77} and other
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
@item
@@ -312,9 +237,8 @@ general expressions (other than simple variables/arrays), to procedures
when compiling on some systems (such as i386) with @samp{-fPIC}, as in
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
+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 --git a/gcc/f/com-rt.def b/gcc/f/com-rt.def
index 1c1be602cad..f124379c9cf 100644
--- a/gcc/f/com-rt.def
+++ b/gcc/f/com-rt.def
@@ -162,7 +162,7 @@ DEFGFRT (FFECOM_gfrtDLOG10, "d_lg10", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDMOD, "d_mod", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
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_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_gfrtDSQRT, "d_sqrt", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
@@ -203,7 +203,7 @@ DEFGFRT (FFECOM_gfrtIDNINT, "i_dnnt", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtIERRNO, "G77_ierrno_0", FFECOM_rttypeINTEGER_, 0, FALSE, FALSE)
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_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_gfrtKILL, "G77_kill_0", FFECOM_rttypeINTEGER_, "&i&i", FALSE, FALSE)
@@ -224,8 +224,8 @@ DEFGFRT (FFECOM_gfrtRAND, "G77_rand_0", FFECOM_rttypeREAL_F2C_, "&i", FALSE, FAL
DEFGFRT (FFECOM_gfrtRENAME, "G77_rename_0", FFECOM_rttypeINTEGER_, "&a&a", FALSE, FALSE)
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_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)
DEFGFRT (FFECOM_gfrtSLEEP, "G77_sleep_0", FFECOM_rttypeVOID_, "&i", FALSE, FALSE)
diff --git a/gcc/f/com.c b/gcc/f/com.c
index 0ba57ffd34f..930b9c6df04 100644
--- a/gcc/f/com.c
+++ b/gcc/f/com.c
@@ -1,5 +1,5 @@
/* com.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995-1997 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -345,6 +345,7 @@ tree ffecom_f2c_ptr_to_ftnint_type_node;
typedef enum
{
FFECOM_rttypeVOID_,
+ FFECOM_rttypeVOIDSTAR_, /* C's `void *' type. */
FFECOM_rttypeFTNINT_, /* f2c's `ftnint' type. */
FFECOM_rttypeINTEGER_, /* f2c's `integer' type. */
FFECOM_rttypeLONGINT_, /* f2c's `longint' type. */
@@ -419,8 +420,8 @@ static tree ffecom_call_binop_ (tree fn, ffeinfoKindtype kt,
tree dest_tree, ffebld dest,
bool *dest_used, tree callee_commons,
bool scalar_args);
-static void ffecom_char_args_ (tree *xitem, tree *length,
- ffebld expr);
+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 ffecomConcatList_
@@ -652,6 +653,9 @@ static char *ffecom_gfrt_argstring_[FFECOM_gfrt]
#define ffecom_start_compstmt_ bison_rule_pushlevel_
#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.
* Contours include:
@@ -1092,6 +1096,10 @@ ffecom_arglist_expr_ (char *c, ffebld expr)
tree item;
bool ptr = FALSE;
tree wanted = NULL_TREE;
+ static char zed[] = "0";
+
+ if (c == NULL)
+ c = &zed[0];
while (expr != NULL)
{
@@ -1184,6 +1192,39 @@ ffecom_arglist_expr_ (char *c, ffebld expr)
}
}
+ /* 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;
return list;
@@ -1608,36 +1649,46 @@ ffecom_call_binop_ (tree fn, ffeinfoKindtype kt, bool is_f2c_complex,
}
#endif
-/* ffecom_char_args_ -- Return ptr/length args for char subexpression
+/* ffecom_char_args_x_ -- Return ptr/length args for char subexpression
tree ptr_arg;
tree length_arg;
ffebld expr;
- ffecom_char_args_(&ptr_arg,&length_arg,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. */
+ 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_ (tree *xitem, tree *length, ffebld expr)
+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))
{
case FFEBLD_opCONTER:
val = ffebld_constant_character1 (ffebld_conter (expr));
- *length = build_int_2 (ffetarget_length_character1 (val), 0);
+ 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 (ffetarget_length_character1 (val),
- 0);
+ high = build_int_2 (newlen, 0);
TREE_TYPE (high) = ffecom_f2c_ftnlen_type_node;
- item = build_string (ffetarget_length_character1 (val),
+ item = build_string (newlen, /* end FFETARGET-NULL-KLUDGE. */
ffetarget_text_character1 (val));
TREE_TYPE (item)
= build_type_variant
@@ -2311,6 +2362,11 @@ ffecom_do_entry_ (ffesymbol fn, int entrynum)
bool multi; /* Master fn has multiple return types. */
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
return value, but also never calls resume_momentary, when starting an
@@ -2657,6 +2713,9 @@ ffecom_do_entry_ (ffesymbol fn, int entrynum)
finish_function (0);
+ lineno = old_lineno;
+ input_filename = old_input_filename;
+
ffecom_doing_entry_ = FALSE;
}
@@ -6165,8 +6224,8 @@ ffecom_expr_power_integer_ (ffebld left, ffebld right)
r are the "inputs":
({ typeof (r) rtmp = r;
- typeof (l) ltmp = l;
- typeof (l) result;
+ typeof (l) ltmp = l;
+ typeof (l) result;
if (rtmp == 0)
result = 1;
@@ -6583,7 +6642,7 @@ ffecom_finish_global_ (ffeglobal global)
static ffesymbol
ffecom_finish_symbol_transform_ (ffesymbol s)
{
- if (s == NULL)
+ if ((s == NULL) || (TREE_CODE (current_function_decl) == ERROR_MARK))
return s;
/* It's easy to know to transform an untransformed symbol, to make sure
@@ -7423,6 +7482,10 @@ ffecom_make_gfrt_ (ffecomGfrt ix)
ttype = void_type_node;
break;
+ case FFECOM_rttypeVOIDSTAR_:
+ ttype = TREE_TYPE (null_pointer_node); /* `void *'. */
+ break;
+
case FFECOM_rttypeFTNINT_:
ttype = ffecom_f2c_ftnint_type_node;
break;
@@ -7777,9 +7840,12 @@ ffecom_start_progunit_ ()
}
if (altentries)
- id = ffecom_get_invented_identifier ("__g77_masterfun_%s",
- ffesymbol_text (fn),
- 0);
+ {
+ 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)
id = get_identifier (FFETARGET_nameENFORCED_MAIN_NAME);
@@ -7868,7 +7934,8 @@ ffecom_start_progunit_ ()
resume_momentary (yes);
- store_parm_decls (main_program ? 1 : 0);
+ if (TREE_CODE (current_function_decl) != ERROR_MARK)
+ store_parm_decls (main_program ? 1 : 0);
ffecom_start_compstmt_ ();
@@ -9896,7 +9963,7 @@ ffecom_type_vardesc_ ()
addrfield = ffecom_decl_field (type, namefield, "addr",
string_type_node);
dimsfield = ffecom_decl_field (type, addrfield, "dims",
- ffecom_f2c_ftnlen_type_node);
+ ffecom_f2c_ptr_to_ftnlen_type_node);
typefield = ffecom_decl_field (type, dimsfield, "type",
integer_type_node);
@@ -10747,7 +10814,19 @@ ffecom_arg_expr (ffebld expr, tree *length)
returns and sets the length return value to NULL_TREE. Otherwise
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. */
+ 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
tree
@@ -10757,7 +10836,8 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
tree ign_length;
ffecomConcatList_ catlist;
- *length = NULL_TREE;
+ if (length != NULL)
+ *length = NULL_TREE;
if (expr == NULL)
return integer_zero_node;
@@ -10779,8 +10859,11 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
case FFEBLD_opPERCENT_REF:
if (ffeinfo_basictype (ffebld_info (expr)) != FFEINFO_basictypeCHARACTER)
return ffecom_ptr_to_expr (ffebld_left (expr));
- ign_length = NULL_TREE;
- length = &ign_length;
+ if (length != NULL)
+ {
+ ign_length = NULL_TREE;
+ length = &ign_length;
+ }
expr = ffebld_left (expr);
break;
@@ -10806,7 +10889,8 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
}
#ifdef PASS_HOLLERITH_BY_DESCRIPTOR
- if (ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeHOLLERITH)
+ if ((ffeinfo_basictype (ffebld_info (expr)) == FFEINFO_basictypeHOLLERITH)
+ && (length != NULL))
{ /* Pass Hollerith by descriptor. */
ffetargetHollerith h;
@@ -10829,14 +10913,21 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
switch (ffecom_concat_list_count_ (catlist))
{
case 0: /* Shouldn't happen, but in case it does... */
- *length = ffecom_f2c_ftnlen_zero_node;
- TREE_TYPE (*length) = ffecom_f2c_ftnlen_type_node;
+ 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. */
- ffecom_char_args_ (&item, length,
- ffecom_concat_list_expr_ (catlist, 0));
+ 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);
return item;
@@ -10872,8 +10963,13 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
for (i = 0; i < count; ++i)
{
- ffecom_char_args_ (&citem, &clength,
- ffecom_concat_list_expr_ (catlist, 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))
{
@@ -10892,10 +10988,11 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
citem),
items);
clength = ffecom_save_tree (clength);
- known_length
- = ffecom_2 (PLUS_EXPR, ffecom_f2c_ftnlen_type_node,
- known_length,
- 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_modify (void_type_node,
@@ -10944,7 +11041,8 @@ ffecom_arg_ptr_to_expr (ffebld expr, tree *length)
item,
temporary);
- *length = known_length;
+ if (length != NULL)
+ *length = known_length;
}
ffecom_concat_list_kill_ (catlist);
@@ -11603,6 +11701,7 @@ ffecom_gfrt_basictype (ffecomGfrt gfrt)
switch (ffecom_gfrt_type_[gfrt])
{
case FFECOM_rttypeVOID_:
+ case FFECOM_rttypeVOIDSTAR_:
return FFEINFO_basictypeNONE;
case FFECOM_rttypeFTNINT_:
@@ -11649,6 +11748,7 @@ ffecom_gfrt_kindtype (ffecomGfrt gfrt)
switch (ffecom_gfrt_type_[gfrt])
{
case FFECOM_rttypeVOID_:
+ case FFECOM_rttypeVOIDSTAR_:
return FFEINFO_kindtypeNONE;
case FFECOM_rttypeFTNINT_:
@@ -13268,7 +13368,8 @@ ffecom_return_expr (ffebld expr)
/* Do save_expr only if tree is not error_mark_node. */
#if FFECOM_targetCURRENT == FFECOM_targetGCC
-tree ffecom_save_tree (tree t)
+tree
+ffecom_save_tree (tree t)
{
return save_expr (t);
}
@@ -14092,31 +14193,38 @@ finish_function (int nested)
register tree fndecl = current_function_decl;
assert (fndecl != NULL_TREE);
- if (nested)
- assert (DECL_CONTEXT (fndecl) != NULL_TREE);
- else
- assert (DECL_CONTEXT (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;
This caused &foo to be of type ptr-to-const-function
which then got a warning when stored in a ptr-to-function variable. */
poplevel (1, 0, 1);
- BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
- /* Must mark the RESULT_DECL as being in this function. */
+ 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;
+ 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);
+ /* 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;
+ /* 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);
+ /* Run the optimizers and output the assembler code for this function. */
+ rest_of_compilation (fndecl);
+ }
/* Free all the tree nodes making up this function. */
/* Switch back to allocating nodes permanently until we start another
@@ -14124,7 +14232,7 @@ finish_function (int nested)
if (!nested)
permanent_allocation (1);
- if (DECL_SAVED_INSNS (fndecl) == 0 && !nested)
+ if (DECL_SAVED_INSNS (fndecl) == 0 && !nested && (TREE_CODE (fndecl) != ERROR_MARK))
{
/* Stop pointing to the local nodes about to be freed. */
/* But DECL_INITIAL must remain nonzero so we know this was an actual
@@ -14157,6 +14265,8 @@ static char *
lang_printable_name (tree decl, char **kind)
{
*kind = "program unit";
+ if (TREE_CODE (decl) == ERROR_MARK)
+ return "erroneous code";
return IDENTIFIER_POINTER (DECL_NAME (decl));
}
@@ -14168,48 +14278,56 @@ void
lang_print_error_function (file)
char *file;
{
+ static ffeglobal last_g = NULL;
static ffesymbol last_s = NULL;
+ ffeglobal g;
ffesymbol s;
char *kind;
- if (ffecom_primary_entry_ == NULL)
+ if ((ffecom_primary_entry_ == NULL)
+ || (ffesymbol_global (ffecom_primary_entry_) == NULL))
{
+ g = NULL;
s = NULL;
kind = NULL;
}
- else if (ffecom_nested_entry_ == NULL)
+ else
{
- s = ffecom_primary_entry_;
- switch (ffesymbol_kind (s))
+ g = ffesymbol_global (ffecom_primary_entry_);
+ if (ffecom_nested_entry_ == NULL)
{
- case FFEINFO_kindFUNCTION:
- kind = "function";
- break;
+ s = ffecom_primary_entry_;
+ switch (ffesymbol_kind (s))
+ {
+ case FFEINFO_kindFUNCTION:
+ kind = "function";
+ break;
- case FFEINFO_kindSUBROUTINE:
- kind = "subroutine";
- break;
+ case FFEINFO_kindSUBROUTINE:
+ kind = "subroutine";
+ break;
- case FFEINFO_kindPROGRAM:
- kind = "program";
- break;
+ case FFEINFO_kindPROGRAM:
+ kind = "program";
+ break;
- case FFEINFO_kindBLOCKDATA:
- kind = "block-data";
- break;
+ case FFEINFO_kindBLOCKDATA:
+ kind = "block-data";
+ break;
- default:
- kind = ffeinfo_kind_message (ffesymbol_kind (s));
- break;
+ default:
+ kind = ffeinfo_kind_message (ffesymbol_kind (s));
+ break;
+ }
+ }
+ else
+ {
+ s = ffecom_nested_entry_;
+ kind = "statement function";
}
- }
- else
- {
- s = ffecom_nested_entry_;
- kind = "statement function";
}
- if (last_s != s)
+ if ((last_g != g) || (last_s != s))
{
if (file)
fprintf (stderr, "%s: ", file);
@@ -14223,6 +14341,7 @@ lang_print_error_function (file)
fprintf (stderr, "In %s `%s':\n", kind, name);
}
+ last_g = g;
last_s = s;
}
}
@@ -14495,42 +14614,51 @@ start_function (tree name, tree type, int nested, int public)
assert (current_function_decl == NULL_TREE);
}
- 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;
+ 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);
+ 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;
+ /* 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. */
+ /* 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);
+ }
- current_function_decl = pushdecl (decl1);
if (!nested)
ffecom_outer_function_decl_ = current_function_decl;
pushlevel (0);
- make_function_rtl (current_function_decl);
+ 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);
+ restype = TREE_TYPE (TREE_TYPE (current_function_decl));
+ DECL_RESULT (current_function_decl)
+ = build_decl (RESULT_DECL, NULL_TREE, restype);
+ }
if (!nested)
/* Allocate further tree nodes temporarily during compilation of this
function only. */
temporary_allocation ();
- if (!nested)
+ if (!nested && (TREE_CODE (current_function_decl) != ERROR_MARK))
TREE_ADDRESSABLE (current_function_decl) = 1;
immediate_size_expand = old_immediate_size_expand;
diff --git a/gcc/f/com.h b/gcc/f/com.h
index 477e0860f40..946e8a5d006 100644
--- a/gcc/f/com.h
+++ b/gcc/f/com.h
@@ -348,6 +348,7 @@ extern int flag_pedantic_errors;
void emit_nop (void);
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);
void assemble_zeros (int size);
diff --git a/gcc/f/expr.c b/gcc/f/expr.c
index 057293b0eef..4a294ac8a34 100644
--- a/gcc/f/expr.c
+++ b/gcc/f/expr.c
@@ -1,5 +1,5 @@
/* expr.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995-1997 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -7504,15 +7504,17 @@ static ffelexHandler
ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr, ffelexToken t)
{
ffeexprExpr_ e;
- ffeinfoBasictype lty = ffeinfo_basictype (ffebld_info (ffeexpr_stack_->expr));
- ffeinfoBasictype rty = ffeinfo_basictype (ffebld_info (expr));
+ 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;
ffeinfoKindtype nkt;
bool ok = TRUE;
ffebld orig;
- if ((expr == NULL)
+ if ((ffeexpr_stack_->expr == NULL)
|| (ffebld_op (ffeexpr_stack_->expr) != FFEBLD_opCONTER)
|| (((orig = ffebld_conter_orig (ffeexpr_stack_->expr)) != NULL)
&& (((ffebld_op (orig) != FFEBLD_opUMINUS)
@@ -10589,7 +10591,7 @@ ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
&& (lbt != FFEINFO_basictypeCOMPLEX) && (lbt != FFEINFO_basictypeCHARACTER))
{
if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
- && (rbt != FFEINFO_basictypeCOMPLEX) && (lbt != FFEINFO_basictypeCHARACTER))
+ && (rbt != FFEINFO_basictypeCOMPLEX) && (rbt != FFEINFO_basictypeCHARACTER))
{
if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
&& ffebad_start (FFEBAD_EQOP_ARGS_TYPE))
@@ -11206,7 +11208,7 @@ ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op,
&& (lbt != FFEINFO_basictypeCHARACTER))
{
if ((rbt != FFEINFO_basictypeINTEGER) && (rbt != FFEINFO_basictypeREAL)
- && (lbt != FFEINFO_basictypeCHARACTER))
+ && (rbt != FFEINFO_basictypeCHARACTER))
{
if ((lbt != FFEINFO_basictypeANY) && (rbt != FFEINFO_basictypeANY)
&& ffebad_start (FFEBAD_RELOP_ARGS_TYPE))
@@ -12255,8 +12257,7 @@ again: /* :::::::::::::::::::: */
default:
break;
}
- error = ((expr == NULL) && ffe_is_pedantic ())
- || ((expr != NULL) && (ffeinfo_rank (info) != 0));
+ error = (expr != NULL) && (ffeinfo_rank (info) != 0);
break;
case FFEEXPR_contextACTUALARG_:
@@ -18303,80 +18304,95 @@ ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr, ffelexToken t)
procedure = ffeexpr_stack_->exprstack;
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)))
+ /* 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 (ffebad_start (FFEBAD_NULL_ARGUMENT))
+ 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]));
+ 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. */
- }
+ if (expr == NULL)
+ ;
else
{
- if (ffeinfo_rank (ffebld_info (expr)) != 0)
+ 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 (ffebad_start (FFEBAD_ARRAY_AS_SFARG))
+ 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]));
+ 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)))));
+ (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
- {
- 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);
+ }
}
- 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))
{
@@ -18514,6 +18530,7 @@ ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr, ffelexToken t)
only if next token isn't the close-paren for REAL(me). */
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)
&& (ffebld_op (reduced) == FFEBLD_opSYMTER)
diff --git a/gcc/f/fini.c b/gcc/f/fini.c
index 6e324b64602..fdf577b91a2 100644
--- a/gcc/f/fini.c
+++ b/gcc/f/fini.c
@@ -228,7 +228,7 @@ static char *spaces[]
void testname (bool nested, int indent, name first, name last);
void testnames (bool nested, int indent, int len, name first, name last);
-void
+int
main (int argc, char **argv)
{
char buf[MAXNAMELEN];
diff --git a/gcc/f/g77.1 b/gcc/f/g77.1
index fdb83a6d3a1..479e3006ea6 100644
--- a/gcc/f/g77.1
+++ b/gcc/f/g77.1
@@ -1,20 +1,20 @@
.\" Copyright (c) 1995-1997 Free Software Foundation -*-Text-*-
.\" 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"
+.TH G77 1 "1998-03-08" "GNU Tools" "GNU Tools"
.de BP
.sp
.ti \-.2i
\(**
..
.SH NAME
-g77 \- GNU project Fortran Compiler (v0.5.21)
+g77 \- GNU project Fortran Compiler (v0.5.22)
.SH SYNOPSIS
.RB g77 " [" \c
.IR option " | " "filename " ].\|.\|.
.SH WARNING
The information in this man page is an extract from the full
-documentation of the GNU Fortran compiler (version 0.5.21),
+documentation of the GNU Fortran compiler (version 0.5.22),
and is limited to the meaning of some of the options.
.PP
This man page is not up to date, since no volunteers want to
@@ -22,8 +22,8 @@ maintain it. If you find a discrepancy between the man page and the
software, please check the Info file, which is the authoritative
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 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
If we find that the things in this man page that are out of date cause
@@ -37,7 +37,7 @@ For complete and current documentation, refer to the Info file `\|\c
.B g77\c
\&\|' or the manual
.I
-Using and Porting GNU Fortran (for version 0.5.21)\c
+Using and Porting GNU Fortran (for version 0.5.22)\c
\&. Both are made from the Texinfo source file
.BR g77.texi .
.PP
@@ -333,7 +333,7 @@ entries in
\&.
.br
.I
-Using and Porting GNU Fortran (for version 0.5.21)\c
+Using and Porting GNU Fortran (for version 0.5.22)\c
, James Craig Burley;
.I
Using and Porting GNU CC (for version 2.0)\c
diff --git a/gcc/f/g77.info b/gcc/f/g77.info
index b396df3c015..18ae17c3ba9 100644
--- a/gcc/f/g77.info
+++ b/gcc/f/g77.info
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -39,713 +39,714 @@ END-INFO-DIR-ENTRY

Indirect:
-g77.info-1: 1697
-g77.info-2: 51504
-g77.info-3: 86652
-g77.info-4: 102421
-g77.info-5: 148200
-g77.info-6: 198176
-g77.info-7: 240263
-g77.info-8: 290181
-g77.info-9: 339800
-g77.info-10: 389391
-g77.info-11: 437993
-g77.info-12: 487886
-g77.info-13: 537704
-g77.info-14: 586061
-g77.info-15: 635100
-g77.info-16: 684261
-g77.info-17: 734128
-g77.info-18: 773211
-g77.info-19: 822559
-g77.info-20: 833284
+g77.info-1: 1691
+g77.info-2: 51601
+g77.info-3: 87325
+g77.info-4: 103094
+g77.info-5: 152801
+g77.info-6: 202763
+g77.info-7: 244843
+g77.info-8: 294560
+g77.info-9: 343973
+g77.info-10: 393636
+g77.info-11: 442768
+g77.info-12: 492734
+g77.info-13: 534944
+g77.info-14: 583679
+g77.info-15: 630483
+g77.info-16: 679985
+g77.info-17: 729504
+g77.info-18: 774830
+g77.info-19: 824687
+g77.info-20: 841879

Tag Table:
(Indirect)
-Node: Top1697
-Node: Copying3654
-Node: Contributors22836
-Node: Funding25868
-Node: Funding GNU Fortran28371
-Node: Look and Feel31054
-Node: Getting Started31556
-Node: What is GNU Fortran?33874
-Node: G77 and GCC43439
-Node: Invoking G7744790
-Node: Option Summary46941
-Node: Overall Options51504
-Node: Shorthand Options57592
-Node: Fortran Dialect Options60070
-Node: Warning Options70755
-Node: Debugging Options79641
-Node: Optimize Options80714
-Node: Preprocessor Options84159
-Node: Directory Options85340
-Node: Code Gen Options86652
-Node: Environment Variables101963
-Node: News102421
-Node: Changes148200
-Node: Language162250
-Node: Direction of Language Development164190
-Node: Standard Support170429
-Node: No Passing External Assumed-length171150
-Node: No Passing Dummy Assumed-length171627
-Node: No Pathological Implied-DO172142
-Node: No Useless Implied-DO172829
-Node: Conformance173560
-Node: Notation Used175583
-Node: Terms and Concepts179788
-Node: Syntactic Items180300
-Node: Statements Comments Lines180982
-Node: Scope of Names and Labels182847
-Node: Characters Lines Sequence183277
-Node: Character Set183858
-Node: Lines184859
-Node: Continuation Line187335
-Node: Statements188290
-Node: Statement Labels189246
-Node: Order189938
-Node: INCLUDE190823
-Node: Data Types and Constants193566
-Node: Types197087
-Node: Double Notation198176
-Node: Star Notation199248
-Node: Kind Notation202193
-Node: Constants210613
-Node: Integer Type211925
-Node: Character Type212523
-Node: Expressions213287
-Node: %LOC()213703
-Node: Specification Statements216404
-Node: NAMELIST216861
-Node: DOUBLE COMPLEX217143
-Node: Control Statements217397
-Node: DO WHILE217889
-Node: END DO218115
-Node: Construct Names219122
-Node: CYCLE and EXIT219862
-Node: Functions and Subroutines222626
-Node: %VAL()223272
-Node: %REF()224636
-Node: %DESCR()226464
-Node: Generics and Specifics228597
-Node: REAL() and AIMAG() of Complex235792
-Node: CMPLX() of DOUBLE PRECISION237625
-Node: MIL-STD 1753239351
-Node: f77/f2c Intrinsics239693
-Node: Table of Intrinsic Functions240263
-Node: Abort Intrinsic256970
-Node: Abs Intrinsic257234
-Node: Access Intrinsic258102
-Node: AChar Intrinsic258938
-Node: ACos Intrinsic259460
-Node: AdjustL Intrinsic259921
-Node: AdjustR Intrinsic260246
-Node: AImag Intrinsic260572
-Node: AInt Intrinsic261377
-Node: Alarm Intrinsic262005
-Node: All Intrinsic262841
-Node: Allocated Intrinsic263153
-Node: ALog Intrinsic263482
-Node: ALog10 Intrinsic263872
-Node: AMax0 Intrinsic264270
-Node: AMax1 Intrinsic264755
-Node: AMin0 Intrinsic265208
-Node: AMin1 Intrinsic265692
-Node: AMod Intrinsic266144
-Node: And Intrinsic266570
-Node: ANInt Intrinsic267076
-Node: Any Intrinsic267840
-Node: ASin Intrinsic268147
-Node: Associated Intrinsic268605
-Node: ATan Intrinsic268939
-Node: ATan2 Intrinsic269405
-Node: BesJ0 Intrinsic269956
-Node: BesJ1 Intrinsic270417
-Node: BesJN Intrinsic270878
-Node: BesY0 Intrinsic271377
-Node: BesY1 Intrinsic271839
-Node: BesYN Intrinsic272301
-Node: Bit_Size Intrinsic272804
-Node: BTest Intrinsic273463
-Node: CAbs Intrinsic274183
-Node: CCos Intrinsic274570
-Node: Ceiling Intrinsic274962
-Node: CExp Intrinsic275284
-Node: Char Intrinsic275676
-Node: ChDir Intrinsic (subroutine)276930
-Node: ChMod Intrinsic (subroutine)277739
-Node: CLog Intrinsic279008
-Node: Cmplx Intrinsic279412
-Node: Complex Intrinsic280213
-Node: Conjg Intrinsic281659
-Node: Cos Intrinsic282083
-Node: CosH Intrinsic282546
-Node: Count Intrinsic282921
-Node: Cpu_Time Intrinsic283239
-Node: CShift Intrinsic283702
-Node: CSin Intrinsic284024
-Node: CSqRt Intrinsic284416
-Node: CTime Intrinsic (subroutine)284826
-Node: CTime Intrinsic (function)285581
-Node: DAbs Intrinsic286215
-Node: DACos Intrinsic286611
-Node: DASin Intrinsic287002
-Node: DATan Intrinsic287394
-Node: DATan2 Intrinsic287787
-Node: Date_and_Time Intrinsic288242
-Node: DbesJ0 Intrinsic288592
-Node: DbesJ1 Intrinsic288985
-Node: DbesJN Intrinsic289371
-Node: DbesY0 Intrinsic289795
-Node: DbesY1 Intrinsic290181
-Node: DbesYN Intrinsic290567
-Node: Dble Intrinsic290989
-Node: DCos Intrinsic291695
-Node: DCosH Intrinsic292079
-Node: DDiM Intrinsic292469
-Node: DErF Intrinsic292901
-Node: DErFC Intrinsic293270
-Node: DExp Intrinsic293645
-Node: Digits Intrinsic294031
-Node: DiM Intrinsic294348
-Node: DInt Intrinsic294847
-Node: DLog Intrinsic295231
-Node: DLog10 Intrinsic295616
-Node: DMax1 Intrinsic296014
-Node: DMin1 Intrinsic296468
-Node: DMod Intrinsic296920
-Node: DNInt Intrinsic297348
-Node: Dot_Product Intrinsic297747
-Node: DProd Intrinsic298087
-Node: DSign Intrinsic298469
-Node: DSin Intrinsic298908
-Node: DSinH Intrinsic299293
-Node: DSqRt Intrinsic299684
-Node: DTan Intrinsic300075
-Node: DTanH Intrinsic300460
-Node: Dtime Intrinsic (subroutine)300864
-Node: EOShift Intrinsic301799
-Node: Epsilon Intrinsic302138
-Node: ErF Intrinsic302462
-Node: ErFC Intrinsic302868
-Node: ETime Intrinsic (subroutine)303426
-Node: ETime Intrinsic (function)304253
-Node: Exit Intrinsic304957
-Node: Exp Intrinsic305434
-Node: Exponent Intrinsic305896
-Node: Fdate Intrinsic (subroutine)306235
-Node: Fdate Intrinsic (function)306923
-Node: FGet Intrinsic (subroutine)307473
-Node: FGetC Intrinsic (subroutine)308310
-Node: Float Intrinsic309187
-Node: Floor Intrinsic309587
-Node: Flush Intrinsic309903
-Node: FNum Intrinsic310482
-Node: FPut Intrinsic (subroutine)310930
-Node: FPutC Intrinsic (subroutine)311727
-Node: Fraction Intrinsic312574
-Node: FSeek Intrinsic312915
-Node: FStat Intrinsic (subroutine)313640
-Node: FStat Intrinsic (function)315109
-Node: FTell Intrinsic (subroutine)316343
-Node: FTell Intrinsic (function)317016
-Node: GError Intrinsic317533
-Node: GetArg Intrinsic317907
-Node: GetCWD Intrinsic (subroutine)318543
-Node: GetCWD Intrinsic (function)319399
-Node: GetEnv Intrinsic320019
-Node: GetGId Intrinsic320606
-Node: GetLog Intrinsic320912
-Node: GetPId Intrinsic321236
-Node: GetUId Intrinsic321544
-Node: GMTime Intrinsic321849
-Node: HostNm Intrinsic (subroutine)322857
-Node: HostNm Intrinsic (function)323729
-Node: Huge Intrinsic324354
-Node: IAbs Intrinsic324677
-Node: IAChar Intrinsic325068
-Node: IAnd Intrinsic325608
-Node: IArgC Intrinsic326096
-Node: IBClr Intrinsic326472
-Node: IBits Intrinsic326982
-Node: IBSet Intrinsic327696
-Node: IChar Intrinsic328197
-Node: IDate Intrinsic (UNIX)329416
-Node: IDiM Intrinsic329997
-Node: IDInt Intrinsic330446
-Node: IDNInt Intrinsic330839
-Node: IEOr Intrinsic331238
-Node: IErrNo Intrinsic331736
-Node: IFix Intrinsic332063
-Node: Imag Intrinsic332451
-Node: ImagPart Intrinsic333456
-Node: Index Intrinsic334482
-Node: Int Intrinsic335035
-Node: Int2 Intrinsic335750
-Node: Int8 Intrinsic336438
-Node: IOr Intrinsic337126
-Node: IRand Intrinsic337606
-Node: IsaTty Intrinsic338526
-Node: IShft Intrinsic338950
-Node: IShftC Intrinsic339800
-Node: ISign Intrinsic340728
-Node: ITime Intrinsic341178
-Node: Kill Intrinsic (subroutine)341580
-Node: Kind Intrinsic342417
-Node: LBound Intrinsic342742
-Node: Len Intrinsic343059
-Node: Len_Trim Intrinsic343695
-Node: LGe Intrinsic344107
-Node: LGt Intrinsic345520
-Node: Link Intrinsic (subroutine)346426
-Node: LLe Intrinsic347391
-Node: LLt Intrinsic348297
-Node: LnBlnk Intrinsic349192
-Node: Loc Intrinsic349595
-Node: Log Intrinsic350026
-Node: Log10 Intrinsic350606
-Node: Logical Intrinsic351179
-Node: Long Intrinsic351502
-Node: LShift Intrinsic352026
-Node: LStat Intrinsic (subroutine)353062
-Node: LStat Intrinsic (function)354818
-Node: LTime Intrinsic356325
-Node: MatMul Intrinsic357329
-Node: Max Intrinsic357647
-Node: Max0 Intrinsic358198
-Node: Max1 Intrinsic358649
-Node: MaxExponent Intrinsic359133
-Node: MaxLoc Intrinsic359473
-Node: MaxVal Intrinsic359800
-Node: MClock Intrinsic360122
-Node: MClock8 Intrinsic360849
-Node: Merge Intrinsic361567
-Node: Min Intrinsic361883
-Node: Min0 Intrinsic362434
-Node: Min1 Intrinsic362885
-Node: MinExponent Intrinsic363369
-Node: MinLoc Intrinsic363709
-Node: MinVal Intrinsic364036
-Node: Mod Intrinsic364355
-Node: Modulo Intrinsic364878
-Node: MvBits Intrinsic365197
-Node: Nearest Intrinsic366063
-Node: NInt Intrinsic366387
-Node: Not Intrinsic367225
-Node: Or Intrinsic367620
-Node: Pack Intrinsic368118
-Node: PError Intrinsic368428
-Node: Precision Intrinsic368882
-Node: Present Intrinsic369217
-Node: Product Intrinsic369547
-Node: Radix Intrinsic369873
-Node: Rand Intrinsic370190
-Node: Random_Number Intrinsic371077
-Node: Random_Seed Intrinsic371430
-Node: Range Intrinsic371778
-Node: Real Intrinsic372099
-Node: RealPart Intrinsic373105
-Node: Rename Intrinsic (subroutine)374138
-Node: Repeat Intrinsic375110
-Node: Reshape Intrinsic375446
-Node: RRSpacing Intrinsic375775
-Node: RShift Intrinsic376110
-Node: Scale Intrinsic377108
-Node: Scan Intrinsic377424
-Node: Second Intrinsic (function)377748
-Node: Second Intrinsic (subroutine)378288
-Node: Selected_Int_Kind Intrinsic378934
-Node: Selected_Real_Kind Intrinsic379325
-Node: Set_Exponent Intrinsic379712
-Node: Shape Intrinsic380069
-Node: Short Intrinsic380392
-Node: Sign Intrinsic381088
-Node: Signal Intrinsic (subroutine)381688
-Node: Sin Intrinsic382987
-Node: SinH Intrinsic383462
-Node: Sleep Intrinsic383835
-Node: Sngl Intrinsic384177
-Node: Spacing Intrinsic384566
-Node: Spread Intrinsic384890
-Node: SqRt Intrinsic385211
-Node: SRand Intrinsic385815
-Node: Stat Intrinsic (subroutine)386192
-Node: Stat Intrinsic (function)387751
-Node: Sum Intrinsic389059
-Node: SymLnk Intrinsic (subroutine)389391
-Node: System Intrinsic (subroutine)390423
-Node: System_Clock Intrinsic391362
-Node: Tan Intrinsic392130
-Node: TanH Intrinsic392590
-Node: Time Intrinsic (UNIX)392972
-Node: Time8 Intrinsic393786
-Node: Tiny Intrinsic394499
-Node: Transfer Intrinsic394814
-Node: Transpose Intrinsic395145
-Node: Trim Intrinsic395479
-Node: TtyNam Intrinsic (subroutine)395809
-Node: TtyNam Intrinsic (function)396508
-Node: UBound Intrinsic397077
-Node: UMask Intrinsic (subroutine)397422
-Node: Unlink Intrinsic (subroutine)398119
-Node: Unpack Intrinsic399017
-Node: Verify Intrinsic399352
-Node: XOr Intrinsic399671
-Node: ZAbs Intrinsic400187
-Node: ZCos Intrinsic400556
-Node: ZExp Intrinsic400929
-Node: ZLog Intrinsic401302
-Node: ZSin Intrinsic401675
-Node: ZSqRt Intrinsic402049
-Node: Scope and Classes of Names402406
-Node: Underscores in Symbol Names402876
-Node: Other Dialects403123
-Node: Source Form404282
-Node: Carriage Returns405633
-Node: Tabs405962
-Node: Short Lines407671
-Node: Long Lines408645
-Node: Ampersands409256
-Node: Trailing Comment409510
-Node: Debug Line410286
-Node: Dollar Signs410955
-Node: Case Sensitivity411241
-Node: VXT Fortran419857
-Node: Double Quote Meaning421040
-Node: Exclamation Point421968
-Node: Fortran 90423011
-Node: Pedantic Compilation424063
-Node: Distensions428027
-Node: Ugly Implicit Argument Conversion429558
-Node: Ugly Assumed-Size Arrays430172
-Node: Ugly Complex Part Extraction431893
-Node: Ugly Null Arguments433515
-Node: Ugly Conversion of Initializers435120
-Node: Ugly Integer Conversions436885
-Node: Ugly Assigned Labels437993
-Node: Compiler439924
-Node: Compiler Limits440530
-Node: Compiler Types441413
-Node: Compiler Constants446112
-Node: Compiler Intrinsics446971
-Node: Intrinsic Groups447898
-Node: Other Intrinsics451339
-Node: ACosD Intrinsic458937
-Node: AIMax0 Intrinsic459218
-Node: AIMin0 Intrinsic459527
-Node: AJMax0 Intrinsic459837
-Node: AJMin0 Intrinsic460147
-Node: ASinD Intrinsic460456
-Node: ATan2D Intrinsic460762
-Node: ATanD Intrinsic461070
-Node: BITest Intrinsic461376
-Node: BJTest Intrinsic461685
-Node: CDAbs Intrinsic461994
-Node: CDCos Intrinsic462367
-Node: CDExp Intrinsic462742
-Node: CDLog Intrinsic463117
-Node: CDSin Intrinsic463492
-Node: CDSqRt Intrinsic463868
-Node: ChDir Intrinsic (function)464261
-Node: ChMod Intrinsic (function)464895
-Node: CosD Intrinsic466007
-Node: DACosD Intrinsic466319
-Node: DASinD Intrinsic466627
-Node: DATan2D Intrinsic466938
-Node: DATanD Intrinsic467252
-Node: Date Intrinsic467561
-Node: DbleQ Intrinsic468190
-Node: DCmplx Intrinsic468494
-Node: DConjg Intrinsic470125
-Node: DCosD Intrinsic470510
-Node: DFloat Intrinsic470816
-Node: DFlotI Intrinsic471188
-Node: DFlotJ Intrinsic471498
-Node: DImag Intrinsic471807
-Node: DReal Intrinsic472184
-Node: DSinD Intrinsic473331
-Node: DTanD Intrinsic473635
-Node: Dtime Intrinsic (function)473950
-Node: FGet Intrinsic (function)474844
-Node: FGetC Intrinsic (function)475617
-Node: FloatI Intrinsic476433
-Node: FloatJ Intrinsic476753
-Node: FPut Intrinsic (function)477072
-Node: FPutC Intrinsic (function)477808
-Node: IDate Intrinsic (VXT)478601
-Node: IIAbs Intrinsic479320
-Node: IIAnd Intrinsic479630
-Node: IIBClr Intrinsic479935
-Node: IIBits Intrinsic480244
-Node: IIBSet Intrinsic480554
-Node: IIDiM Intrinsic480863
-Node: IIDInt Intrinsic481169
-Node: IIDNnt Intrinsic481478
-Node: IIEOr Intrinsic481787
-Node: IIFix Intrinsic482092
-Node: IInt Intrinsic482395
-Node: IIOr Intrinsic482694
-Node: IIQint Intrinsic482994
-Node: IIQNnt Intrinsic483302
-Node: IIShftC Intrinsic483613
-Node: IISign Intrinsic483927
-Node: IMax0 Intrinsic484237
-Node: IMax1 Intrinsic484542
-Node: IMin0 Intrinsic484846
-Node: IMin1 Intrinsic485150
-Node: IMod Intrinsic485453
-Node: INInt Intrinsic485753
-Node: INot Intrinsic486055
-Node: IZExt Intrinsic486355
-Node: JIAbs Intrinsic486658
-Node: JIAnd Intrinsic486962
-Node: JIBClr Intrinsic487267
-Node: JIBits Intrinsic487576
-Node: JIBSet Intrinsic487886
-Node: JIDiM Intrinsic488195
-Node: JIDInt Intrinsic488501
-Node: JIDNnt Intrinsic488810
-Node: JIEOr Intrinsic489119
-Node: JIFix Intrinsic489424
-Node: JInt Intrinsic489727
-Node: JIOr Intrinsic490026
-Node: JIQint Intrinsic490326
-Node: JIQNnt Intrinsic490634
-Node: JIShft Intrinsic490944
-Node: JIShftC Intrinsic491255
-Node: JISign Intrinsic491569
-Node: JMax0 Intrinsic491879
-Node: JMax1 Intrinsic492184
-Node: JMin0 Intrinsic492488
-Node: JMin1 Intrinsic492792
-Node: JMod Intrinsic493095
-Node: JNInt Intrinsic493395
-Node: JNot Intrinsic493697
-Node: JZExt Intrinsic493997
-Node: Kill Intrinsic (function)494310
-Node: Link Intrinsic (function)494992
-Node: QAbs Intrinsic495804
-Node: QACos Intrinsic496114
-Node: QACosD Intrinsic496418
-Node: QASin Intrinsic496726
-Node: QASinD Intrinsic497032
-Node: QATan Intrinsic497340
-Node: QATan2 Intrinsic497646
-Node: QATan2D Intrinsic497956
-Node: QATanD Intrinsic498270
-Node: QCos Intrinsic498579
-Node: QCosD Intrinsic498880
-Node: QCosH Intrinsic499183
-Node: QDiM Intrinsic499486
-Node: QExp Intrinsic499785
-Node: QExt Intrinsic500083
-Node: QExtD Intrinsic500382
-Node: QFloat Intrinsic500686
-Node: QInt Intrinsic500993
-Node: QLog Intrinsic501293
-Node: QLog10 Intrinsic501593
-Node: QMax1 Intrinsic501900
-Node: QMin1 Intrinsic502205
-Node: QMod Intrinsic502508
-Node: QNInt Intrinsic502808
-Node: QSin Intrinsic503110
-Node: QSinD Intrinsic503410
-Node: QSinH Intrinsic503713
-Node: QSqRt Intrinsic504017
-Node: QTan Intrinsic504320
-Node: QTanD Intrinsic504620
-Node: QTanH Intrinsic504923
-Node: Rename Intrinsic (function)505239
-Node: Secnds Intrinsic506044
-Node: Signal Intrinsic (function)506419
-Node: SinD Intrinsic507530
-Node: SnglQ Intrinsic507842
-Node: SymLnk Intrinsic (function)508157
-Node: System Intrinsic (function)509025
-Node: TanD Intrinsic510352
-Node: Time Intrinsic (VXT)510669
-Node: UMask Intrinsic (function)511200
-Node: Unlink Intrinsic (function)511808
-Node: ZExt Intrinsic512537
-Node: Other Compilers512825
-Node: Dropping f2c Compatibility515205
-Node: Compilers Other Than f2c518031
-Node: Other Languages519830
-Node: Interoperating with C and C++520082
-Node: C Interfacing Tools521115
-Node: C Access to Type Information522043
-Node: f2c Skeletons and Prototypes522730
-Node: C++ Considerations524428
-Node: Startup Code525083
-Node: Installation525994
-Node: Prerequisites527150
-Node: Problems Installing535614
-Node: General Problems536240
-Node: GNU C Required537003
-Node: Patching GNU CC Necessary537704
-Node: Building GNU CC Necessary538554
-Node: Missing strtoul538900
-Node: Object File Differences540314
-Node: Cleanup Kills Stage Directories541011
-Node: Missing gperf?541431
-Node: Cross-compiler Problems542819
-Node: Settings545024
-Node: Larger File Unit Numbers546102
-Node: Always Flush Output547685
-Node: Maximum Stackable Size549545
-Node: Floating-point Bit Patterns550401
-Node: Large Initialization551142
-Node: Alpha Problems Fixed552731
-Node: Quick Start553618
-Node: Complete Installation564031
-Node: Unpacking564611
-Node: Merging Distributions567700
-Node: Installing f77573149
-Node: Installing f2c574494
-Node: Patching GNU Fortran577419
-Node: Where to Install578937
-Node: Configuring gcc582282
-Node: Building gcc584054
-Node: Bootstrap Build586061
-Node: Straight Build587807
-Node: Pre-installation Checks589196
-Node: Installation of Binaries592622
-Node: Updating Documentation593983
-Node: Missing bison?594837
-Node: Missing makeinfo?596183
-Node: Distributing Binaries596708
-Node: Debugging and Interfacing602653
-Node: Main Program Unit605337
-Node: Procedures607834
-Node: Functions610495
-Node: Names612113
-Node: Common Blocks615254
-Node: Local Equivalence Areas617287
-Node: Complex Variables619974
-Node: Arrays621304
-Node: Adjustable Arrays624638
-Node: Alternate Entry Points627497
-Node: Alternate Returns634199
-Node: Assigned Statement Labels635100
-Node: Run-time Library Errors636945
-Node: Collected Fortran Wisdom638897
-Node: Advantages Over f2c640333
-Node: Language Extensions641242
-Node: Compiler Options641749
-Node: Compiler Speed642201
-Node: Program Speed642911
-Node: Ease of Debugging644496
-Node: Character and Hollerith Constants646926
-Node: Block Data and Libraries647720
-Node: Loops651044
-Node: Working Programs656260
-Node: Not My Type656940
-Node: Variables Assumed To Be Zero658871
-Node: Variables Assumed To Be Saved659925
-Node: Unwanted Variables661295
-Node: Unused Arguments662175
-Node: Surprising Interpretations of Code662638
-Node: Aliasing Assumed To Work663484
-Node: Output Assumed To Flush669400
-Node: Large File Unit Numbers670806
-Node: Overly Convenient Options672088
-Node: Faster Programs675698
-Node: Aligned Data676144
-Node: Prefer Automatic Uninitialized Variables679988
-Node: Avoid f2c Compatibility681354
-Node: Use Submodel Options681822
-Node: Trouble682645
-Node: But-bugs684261
-Node: Signal 11 and Friends686035
-Node: Cannot Link Fortran Programs688114
-Node: Large Common Blocks689397
-Node: Debugger Problems689823
-Node: NeXTStep Problems690345
-Node: Stack Overflow692167
-Node: Nothing Happens694180
-Node: Strange Behavior at Run Time695794
-Node: Floating-point Errors698087
-Node: Actual Bugs702664
-Node: Missing Features713415
-Node: Better Source Model715132
-Node: Fortran 90 Support716901
-Node: Intrinsics in PARAMETER Statements718002
-Node: SELECT CASE on CHARACTER Type718888
-Node: RECURSIVE Keyword719186
-Node: Increasing Precision/Range719613
-Node: Popular Non-standard Types721150
-Node: Full Support for Compiler Types721567
-Node: Array Bounds Expressions722239
-Node: POINTER Statements722686
-Node: Sensible Non-standard Constructs723569
-Node: FLUSH Statement725894
-Node: Expressions in FORMAT Statements726280
-Node: Explicit Assembler Code727459
-Node: Q Edit Descriptor727748
-Node: Old-style PARAMETER Statements728252
-Node: TYPE and ACCEPT I/O Statements728986
-Node: STRUCTURE UNION RECORD MAP729552
-Node: OPEN CLOSE and INQUIRE Keywords730038
-Node: ENCODE and DECODE730470
-Node: Suppressing Space Padding731571
-Node: Fortran Preprocessor732797
-Node: Bit Operations on Floating-point Data733370
-Node: POSIX Standard733884
-Node: Floating-point Exception Handling734128
-Node: Nonportable Conversions735170
-Node: Large Automatic Arrays735706
-Node: Support for Threads736113
-Node: Gracefully Handle Sensible Bad Code736538
-Node: Non-standard Conversions737293
-Node: Non-standard Intrinsics737636
-Node: Modifying DO Variable738052
-Node: Better Pedantic Compilation738728
-Node: Warn About Implicit Conversions739356
-Node: Invalid Use of Hollerith Constant739943
-Node: Dummy Array Without Dimensioning Dummy740486
-Node: Invalid FORMAT Specifiers741399
-Node: Ambiguous Dialects741800
-Node: Unused Labels742211
-Node: Informational Messages742433
-Node: Uninitialized Variables at Run Time742836
-Node: Bounds Checking at Run Time743443
-Node: Labels Visible to Debugger743891
-Node: Disappointments744297
-Node: Mangling of Names744935
-Node: Multiple Definitions of External Names745785
-Node: Limitation on Implicit Declarations747148
-Node: Non-bugs747432
-Node: Backslash in Constants748557
-Node: Initializing Before Specifying753446
-Node: Context-Sensitive Intrinsicness754588
-Node: Context-Sensitive Constants756484
-Node: Equivalence Versus Equality759441
-Node: Order of Side Effects761951
-Node: Warnings and Errors763679
-Node: Open Questions765363
-Node: Bugs766511
-Node: Bug Criteria768016
-Node: Bug Lists772439
-Node: Bug Reporting773211
-Node: Sending Patches786658
-Node: Service792142
-Node: Adding Options792610
-Node: Projects796659
-Node: Efficiency797504
-Node: Better Optimization800401
-Node: Simplify Porting803771
-Node: More Extensions805526
-Node: Machine Model808727
-Node: Internals Documentation810013
-Node: Internals Improvements810327
-Node: Better Diagnostics813871
-Node: Diagnostics814788
-Node: CMPAMBIG816085
-Node: EXPIMP822559
-Node: INTGLOB823795
-Node: LEX826039
-Node: GLOBALS831431
-Node: Index833284
+Node: Top1691
+Node: Copying3648
+Node: Contributors22830
+Node: Funding25862
+Node: Funding GNU Fortran28365
+Node: Look and Feel31022
+Node: Getting Started31524
+Node: What is GNU Fortran?33842
+Node: G77 and GCC43407
+Node: Invoking G7744758
+Node: Option Summary46909
+Node: Overall Options51601
+Node: Shorthand Options57689
+Node: Fortran Dialect Options60167
+Node: Warning Options71428
+Node: Debugging Options80314
+Node: Optimize Options81387
+Node: Preprocessor Options84832
+Node: Directory Options86013
+Node: Code Gen Options87325
+Node: Environment Variables102636
+Node: News103094
+Node: Changes152801
+Node: Language166837
+Node: Direction of Language Development168777
+Node: Standard Support175016
+Node: No Passing External Assumed-length175737
+Node: No Passing Dummy Assumed-length176214
+Node: No Pathological Implied-DO176729
+Node: No Useless Implied-DO177416
+Node: Conformance178147
+Node: Notation Used180170
+Node: Terms and Concepts184375
+Node: Syntactic Items184887
+Node: Statements Comments Lines185569
+Node: Scope of Names and Labels187434
+Node: Characters Lines Sequence187864
+Node: Character Set188445
+Node: Lines189446
+Node: Continuation Line191922
+Node: Statements192877
+Node: Statement Labels193833
+Node: Order194525
+Node: INCLUDE195410
+Node: Data Types and Constants198153
+Node: Types201674
+Node: Double Notation202763
+Node: Star Notation203835
+Node: Kind Notation206780
+Node: Constants215200
+Node: Integer Type216512
+Node: Character Type217110
+Node: Expressions217874
+Node: %LOC()218290
+Node: Specification Statements220991
+Node: NAMELIST221448
+Node: DOUBLE COMPLEX221730
+Node: Control Statements221984
+Node: DO WHILE222476
+Node: END DO222702
+Node: Construct Names223709
+Node: CYCLE and EXIT224449
+Node: Functions and Subroutines227213
+Node: %VAL()227859
+Node: %REF()229223
+Node: %DESCR()231051
+Node: Generics and Specifics233184
+Node: REAL() and AIMAG() of Complex240372
+Node: CMPLX() of DOUBLE PRECISION242205
+Node: MIL-STD 1753243931
+Node: f77/f2c Intrinsics244273
+Node: Table of Intrinsic Functions244843
+Node: Abort Intrinsic261550
+Node: Abs Intrinsic261814
+Node: Access Intrinsic262682
+Node: AChar Intrinsic263518
+Node: ACos Intrinsic264040
+Node: AdjustL Intrinsic264501
+Node: AdjustR Intrinsic264826
+Node: AImag Intrinsic265152
+Node: AInt Intrinsic265957
+Node: Alarm Intrinsic266585
+Node: All Intrinsic267421
+Node: Allocated Intrinsic267733
+Node: ALog Intrinsic268062
+Node: ALog10 Intrinsic268452
+Node: AMax0 Intrinsic268850
+Node: AMax1 Intrinsic269335
+Node: AMin0 Intrinsic269788
+Node: AMin1 Intrinsic270272
+Node: AMod Intrinsic270724
+Node: And Intrinsic271150
+Node: ANInt Intrinsic271656
+Node: Any Intrinsic272420
+Node: ASin Intrinsic272727
+Node: Associated Intrinsic273185
+Node: ATan Intrinsic273519
+Node: ATan2 Intrinsic273985
+Node: BesJ0 Intrinsic274536
+Node: BesJ1 Intrinsic274997
+Node: BesJN Intrinsic275458
+Node: BesY0 Intrinsic275957
+Node: BesY1 Intrinsic276419
+Node: BesYN Intrinsic276881
+Node: Bit_Size Intrinsic277384
+Node: BTest Intrinsic278043
+Node: CAbs Intrinsic278763
+Node: CCos Intrinsic279150
+Node: Ceiling Intrinsic279542
+Node: CExp Intrinsic279864
+Node: Char Intrinsic280256
+Node: ChDir Intrinsic (subroutine)281510
+Node: ChMod Intrinsic (subroutine)282512
+Node: CLog Intrinsic283781
+Node: Cmplx Intrinsic284185
+Node: Complex Intrinsic284986
+Node: Conjg Intrinsic286432
+Node: Cos Intrinsic286856
+Node: CosH Intrinsic287319
+Node: Count Intrinsic287694
+Node: CPU_Time Intrinsic288012
+Node: CShift Intrinsic288467
+Node: CSin Intrinsic288789
+Node: CSqRt Intrinsic289181
+Node: CTime Intrinsic (subroutine)289591
+Node: CTime Intrinsic (function)290346
+Node: DAbs Intrinsic290980
+Node: DACos Intrinsic291376
+Node: DASin Intrinsic291767
+Node: DATan Intrinsic292159
+Node: DATan2 Intrinsic292552
+Node: Date_and_Time Intrinsic293007
+Node: DbesJ0 Intrinsic293357
+Node: DbesJ1 Intrinsic293750
+Node: DbesJN Intrinsic294136
+Node: DbesY0 Intrinsic294560
+Node: DbesY1 Intrinsic294946
+Node: DbesYN Intrinsic295332
+Node: Dble Intrinsic295754
+Node: DCos Intrinsic296460
+Node: DCosH Intrinsic296844
+Node: DDiM Intrinsic297234
+Node: DErF Intrinsic297666
+Node: DErFC Intrinsic298035
+Node: DExp Intrinsic298410
+Node: Digits Intrinsic298796
+Node: DiM Intrinsic299113
+Node: DInt Intrinsic299612
+Node: DLog Intrinsic299996
+Node: DLog10 Intrinsic300381
+Node: DMax1 Intrinsic300779
+Node: DMin1 Intrinsic301233
+Node: DMod Intrinsic301685
+Node: DNInt Intrinsic302113
+Node: Dot_Product Intrinsic302512
+Node: DProd Intrinsic302852
+Node: DSign Intrinsic303234
+Node: DSin Intrinsic303673
+Node: DSinH Intrinsic304058
+Node: DSqRt Intrinsic304449
+Node: DTan Intrinsic304840
+Node: DTanH Intrinsic305225
+Node: Dtime Intrinsic (subroutine)305629
+Node: EOShift Intrinsic306564
+Node: Epsilon Intrinsic306903
+Node: ErF Intrinsic307227
+Node: ErFC Intrinsic307633
+Node: ETime Intrinsic (subroutine)308191
+Node: ETime Intrinsic (function)309018
+Node: Exit Intrinsic309722
+Node: Exp Intrinsic310199
+Node: Exponent Intrinsic310661
+Node: Fdate Intrinsic (subroutine)311000
+Node: Fdate Intrinsic (function)311688
+Node: FGet Intrinsic (subroutine)312238
+Node: FGetC Intrinsic (subroutine)313075
+Node: Float Intrinsic313952
+Node: Floor Intrinsic314352
+Node: Flush Intrinsic314668
+Node: FNum Intrinsic315247
+Node: FPut Intrinsic (subroutine)315695
+Node: FPutC Intrinsic (subroutine)316492
+Node: Fraction Intrinsic317339
+Node: FSeek Intrinsic317680
+Node: FStat Intrinsic (subroutine)318405
+Node: FStat Intrinsic (function)319874
+Node: FTell Intrinsic (subroutine)321108
+Node: FTell Intrinsic (function)321781
+Node: GError Intrinsic322298
+Node: GetArg Intrinsic322672
+Node: GetCWD Intrinsic (subroutine)323308
+Node: GetCWD Intrinsic (function)324164
+Node: GetEnv Intrinsic324784
+Node: GetGId Intrinsic325371
+Node: GetLog Intrinsic325677
+Node: GetPId Intrinsic326215
+Node: GetUId Intrinsic326523
+Node: GMTime Intrinsic326828
+Node: HostNm Intrinsic (subroutine)327836
+Node: HostNm Intrinsic (function)328708
+Node: Huge Intrinsic329333
+Node: IAbs Intrinsic329656
+Node: IAChar Intrinsic330047
+Node: IAnd Intrinsic330587
+Node: IArgC Intrinsic331075
+Node: IBClr Intrinsic331451
+Node: IBits Intrinsic331961
+Node: IBSet Intrinsic332675
+Node: IChar Intrinsic333176
+Node: IDate Intrinsic (UNIX)334395
+Node: IDiM Intrinsic334976
+Node: IDInt Intrinsic335425
+Node: IDNInt Intrinsic335818
+Node: IEOr Intrinsic336217
+Node: IErrNo Intrinsic336715
+Node: IFix Intrinsic337042
+Node: Imag Intrinsic337430
+Node: ImagPart Intrinsic338435
+Node: Index Intrinsic339461
+Node: Int Intrinsic340014
+Node: Int2 Intrinsic340729
+Node: Int8 Intrinsic341439
+Node: IOr Intrinsic342149
+Node: IRand Intrinsic342629
+Node: IsaTty Intrinsic343549
+Node: IShft Intrinsic343973
+Node: IShftC Intrinsic344823
+Node: ISign Intrinsic345751
+Node: ITime Intrinsic346201
+Node: Kill Intrinsic (subroutine)346603
+Node: Kind Intrinsic347440
+Node: LBound Intrinsic347765
+Node: Len Intrinsic348082
+Node: Len_Trim Intrinsic348718
+Node: LGe Intrinsic349130
+Node: LGt Intrinsic350543
+Node: Link Intrinsic (subroutine)351449
+Node: LLe Intrinsic352414
+Node: LLt Intrinsic353320
+Node: LnBlnk Intrinsic354215
+Node: Loc Intrinsic354618
+Node: Log Intrinsic355049
+Node: Log10 Intrinsic355629
+Node: Logical Intrinsic356202
+Node: Long Intrinsic356525
+Node: LShift Intrinsic357049
+Node: LStat Intrinsic (subroutine)358085
+Node: LStat Intrinsic (function)359841
+Node: LTime Intrinsic361348
+Node: MatMul Intrinsic362352
+Node: Max Intrinsic362670
+Node: Max0 Intrinsic363221
+Node: Max1 Intrinsic363672
+Node: MaxExponent Intrinsic364156
+Node: MaxLoc Intrinsic364496
+Node: MaxVal Intrinsic364823
+Node: MClock Intrinsic365145
+Node: MClock8 Intrinsic365872
+Node: Merge Intrinsic366590
+Node: Min Intrinsic366906
+Node: Min0 Intrinsic367457
+Node: Min1 Intrinsic367908
+Node: MinExponent Intrinsic368392
+Node: MinLoc Intrinsic368732
+Node: MinVal Intrinsic369059
+Node: Mod Intrinsic369378
+Node: Modulo Intrinsic369901
+Node: MvBits Intrinsic370220
+Node: Nearest Intrinsic371086
+Node: NInt Intrinsic371410
+Node: Not Intrinsic372248
+Node: Or Intrinsic372643
+Node: Pack Intrinsic373141
+Node: PError Intrinsic373451
+Node: Precision Intrinsic373905
+Node: Present Intrinsic374240
+Node: Product Intrinsic374570
+Node: Radix Intrinsic374896
+Node: Rand Intrinsic375213
+Node: Random_Number Intrinsic376100
+Node: Random_Seed Intrinsic376453
+Node: Range Intrinsic376801
+Node: Real Intrinsic377122
+Node: RealPart Intrinsic378128
+Node: Rename Intrinsic (subroutine)379161
+Node: Repeat Intrinsic380133
+Node: Reshape Intrinsic380469
+Node: RRSpacing Intrinsic380798
+Node: RShift Intrinsic381133
+Node: Scale Intrinsic382131
+Node: Scan Intrinsic382447
+Node: Second Intrinsic (function)382771
+Node: Second Intrinsic (subroutine)383266
+Node: Selected_Int_Kind Intrinsic383904
+Node: Selected_Real_Kind Intrinsic384295
+Node: Set_Exponent Intrinsic384682
+Node: Shape Intrinsic385039
+Node: Short Intrinsic385362
+Node: Sign Intrinsic386058
+Node: Signal Intrinsic (subroutine)386658
+Node: Sin Intrinsic388872
+Node: SinH Intrinsic389347
+Node: Sleep Intrinsic389720
+Node: Sngl Intrinsic390062
+Node: Spacing Intrinsic390451
+Node: Spread Intrinsic390775
+Node: SqRt Intrinsic391096
+Node: SRand Intrinsic391700
+Node: Stat Intrinsic (subroutine)392077
+Node: Stat Intrinsic (function)393636
+Node: Sum Intrinsic394944
+Node: SymLnk Intrinsic (subroutine)395276
+Node: System Intrinsic (subroutine)396308
+Node: System_Clock Intrinsic397247
+Node: Tan Intrinsic398015
+Node: TanH Intrinsic398475
+Node: Time Intrinsic (UNIX)398857
+Node: Time8 Intrinsic399671
+Node: Tiny Intrinsic400384
+Node: Transfer Intrinsic400699
+Node: Transpose Intrinsic401030
+Node: Trim Intrinsic401364
+Node: TtyNam Intrinsic (subroutine)401694
+Node: TtyNam Intrinsic (function)402393
+Node: UBound Intrinsic402962
+Node: UMask Intrinsic (subroutine)403307
+Node: Unlink Intrinsic (subroutine)404004
+Node: Unpack Intrinsic404902
+Node: Verify Intrinsic405237
+Node: XOr Intrinsic405556
+Node: ZAbs Intrinsic406072
+Node: ZCos Intrinsic406441
+Node: ZExp Intrinsic406814
+Node: ZLog Intrinsic407187
+Node: ZSin Intrinsic407560
+Node: ZSqRt Intrinsic407934
+Node: Scope and Classes of Names408291
+Node: Underscores in Symbol Names408761
+Node: Other Dialects409008
+Node: Source Form410167
+Node: Carriage Returns411518
+Node: Tabs411847
+Node: Short Lines413556
+Node: Long Lines414530
+Node: Ampersands415141
+Node: Trailing Comment415395
+Node: Debug Line416171
+Node: Dollar Signs416840
+Node: Case Sensitivity417126
+Node: VXT Fortran425742
+Node: Double Quote Meaning426925
+Node: Exclamation Point427853
+Node: Fortran 90428896
+Node: Pedantic Compilation429948
+Node: Distensions433912
+Node: Ugly Implicit Argument Conversion435443
+Node: Ugly Assumed-Size Arrays436057
+Node: Ugly Complex Part Extraction437778
+Node: Ugly Null Arguments439400
+Node: Ugly Conversion of Initializers441003
+Node: Ugly Integer Conversions442768
+Node: Ugly Assigned Labels443876
+Node: Compiler445807
+Node: Compiler Limits446413
+Node: Compiler Types447296
+Node: Compiler Constants451995
+Node: Compiler Intrinsics452854
+Node: Intrinsic Groups453781
+Node: Other Intrinsics457222
+Node: ACosD Intrinsic464820
+Node: AIMax0 Intrinsic465101
+Node: AIMin0 Intrinsic465410
+Node: AJMax0 Intrinsic465720
+Node: AJMin0 Intrinsic466030
+Node: ASinD Intrinsic466339
+Node: ATan2D Intrinsic466645
+Node: ATanD Intrinsic466953
+Node: BITest Intrinsic467259
+Node: BJTest Intrinsic467568
+Node: CDAbs Intrinsic467877
+Node: CDCos Intrinsic468250
+Node: CDExp Intrinsic468625
+Node: CDLog Intrinsic469000
+Node: CDSin Intrinsic469375
+Node: CDSqRt Intrinsic469751
+Node: ChDir Intrinsic (function)470144
+Node: ChMod Intrinsic (function)470971
+Node: CosD Intrinsic472083
+Node: DACosD Intrinsic472395
+Node: DASinD Intrinsic472703
+Node: DATan2D Intrinsic473014
+Node: DATanD Intrinsic473328
+Node: Date Intrinsic473637
+Node: DbleQ Intrinsic474266
+Node: DCmplx Intrinsic474570
+Node: DConjg Intrinsic476201
+Node: DCosD Intrinsic476586
+Node: DFloat Intrinsic476892
+Node: DFlotI Intrinsic477264
+Node: DFlotJ Intrinsic477574
+Node: DImag Intrinsic477883
+Node: DReal Intrinsic478260
+Node: DSinD Intrinsic479407
+Node: DTanD Intrinsic479711
+Node: Dtime Intrinsic (function)480026
+Node: FGet Intrinsic (function)480920
+Node: FGetC Intrinsic (function)481693
+Node: FloatI Intrinsic482509
+Node: FloatJ Intrinsic482829
+Node: FPut Intrinsic (function)483148
+Node: FPutC Intrinsic (function)483884
+Node: IDate Intrinsic (VXT)484677
+Node: IIAbs Intrinsic485396
+Node: IIAnd Intrinsic485706
+Node: IIBClr Intrinsic486011
+Node: IIBits Intrinsic486320
+Node: IIBSet Intrinsic486630
+Node: IIDiM Intrinsic486939
+Node: IIDInt Intrinsic487245
+Node: IIDNnt Intrinsic487554
+Node: IIEOr Intrinsic487863
+Node: IIFix Intrinsic488168
+Node: IInt Intrinsic488471
+Node: IIOr Intrinsic488770
+Node: IIQint Intrinsic489070
+Node: IIQNnt Intrinsic489378
+Node: IIShftC Intrinsic489689
+Node: IISign Intrinsic490003
+Node: IMax0 Intrinsic490313
+Node: IMax1 Intrinsic490618
+Node: IMin0 Intrinsic490922
+Node: IMin1 Intrinsic491226
+Node: IMod Intrinsic491529
+Node: INInt Intrinsic491829
+Node: INot Intrinsic492131
+Node: IZExt Intrinsic492431
+Node: JIAbs Intrinsic492734
+Node: JIAnd Intrinsic493038
+Node: JIBClr Intrinsic493343
+Node: JIBits Intrinsic493652
+Node: JIBSet Intrinsic493962
+Node: JIDiM Intrinsic494271
+Node: JIDInt Intrinsic494577
+Node: JIDNnt Intrinsic494886
+Node: JIEOr Intrinsic495195
+Node: JIFix Intrinsic495500
+Node: JInt Intrinsic495803
+Node: JIOr Intrinsic496102
+Node: JIQint Intrinsic496402
+Node: JIQNnt Intrinsic496710
+Node: JIShft Intrinsic497020
+Node: JIShftC Intrinsic497331
+Node: JISign Intrinsic497645
+Node: JMax0 Intrinsic497955
+Node: JMax1 Intrinsic498260
+Node: JMin0 Intrinsic498564
+Node: JMin1 Intrinsic498868
+Node: JMod Intrinsic499171
+Node: JNInt Intrinsic499471
+Node: JNot Intrinsic499773
+Node: JZExt Intrinsic500073
+Node: Kill Intrinsic (function)500386
+Node: Link Intrinsic (function)501068
+Node: QAbs Intrinsic501880
+Node: QACos Intrinsic502190
+Node: QACosD Intrinsic502494
+Node: QASin Intrinsic502802
+Node: QASinD Intrinsic503108
+Node: QATan Intrinsic503416
+Node: QATan2 Intrinsic503722
+Node: QATan2D Intrinsic504032
+Node: QATanD Intrinsic504346
+Node: QCos Intrinsic504655
+Node: QCosD Intrinsic504956
+Node: QCosH Intrinsic505259
+Node: QDiM Intrinsic505562
+Node: QExp Intrinsic505861
+Node: QExt Intrinsic506159
+Node: QExtD Intrinsic506458
+Node: QFloat Intrinsic506762
+Node: QInt Intrinsic507069
+Node: QLog Intrinsic507369
+Node: QLog10 Intrinsic507669
+Node: QMax1 Intrinsic507976
+Node: QMin1 Intrinsic508281
+Node: QMod Intrinsic508584
+Node: QNInt Intrinsic508884
+Node: QSin Intrinsic509186
+Node: QSinD Intrinsic509486
+Node: QSinH Intrinsic509789
+Node: QSqRt Intrinsic510093
+Node: QTan Intrinsic510396
+Node: QTanD Intrinsic510696
+Node: QTanH Intrinsic510999
+Node: Rename Intrinsic (function)511315
+Node: Secnds Intrinsic512120
+Node: Signal Intrinsic (function)512495
+Node: SinD Intrinsic515324
+Node: SnglQ Intrinsic515636
+Node: SymLnk Intrinsic (function)515951
+Node: System Intrinsic (function)516819
+Node: TanD Intrinsic518146
+Node: Time Intrinsic (VXT)518463
+Node: UMask Intrinsic (function)518994
+Node: Unlink Intrinsic (function)519602
+Node: ZExt Intrinsic520331
+Node: Other Compilers520619
+Node: Dropping f2c Compatibility522999
+Node: Compilers Other Than f2c525825
+Node: Other Languages527624
+Node: Interoperating with C and C++527876
+Node: C Interfacing Tools528909
+Node: C Access to Type Information529837
+Node: f2c Skeletons and Prototypes530524
+Node: C++ Considerations532222
+Node: Startup Code532877
+Node: Installation533788
+Node: Prerequisites534944
+Node: Problems Installing543431
+Node: General Problems544126
+Node: GNU C Required544899
+Node: Patching GNU CC Necessary545600
+Node: Building GNU CC Necessary546450
+Node: Missing strtoul546796
+Node: Object File Differences548210
+Node: Cleanup Kills Stage Directories548907
+Node: Missing gperf?549327
+Node: System-specific Problems550738
+Node: Cross-compiler Problems551391
+Node: Settings553604
+Node: Larger File Unit Numbers554682
+Node: Always Flush Output556265
+Node: Maximum Stackable Size558125
+Node: Floating-point Bit Patterns558981
+Node: Large Initialization559736
+Node: Alpha Problems Fixed561325
+Node: Quick Start562212
+Node: Complete Installation572948
+Node: Unpacking573528
+Node: Merging Distributions576617
+Node: Installing f77582334
+Node: Installing f2c583679
+Node: Patching GNU Fortran586604
+Node: Where to Install588122
+Node: Configuring gcc591467
+Node: Building gcc593239
+Node: Bootstrap Build595246
+Node: Straight Build596992
+Node: Pre-installation Checks598381
+Node: Installation of Binaries601807
+Node: Updating Documentation603168
+Node: Missing bison?604022
+Node: Missing makeinfo?605368
+Node: Distributing Binaries605893
+Node: Debugging and Interfacing611832
+Node: Main Program Unit614516
+Node: Procedures617013
+Node: Functions619674
+Node: Names621292
+Node: Common Blocks624433
+Node: Local Equivalence Areas626466
+Node: Complex Variables629153
+Node: Arrays630483
+Node: Adjustable Arrays633817
+Node: Alternate Entry Points636676
+Node: Alternate Returns643378
+Node: Assigned Statement Labels644279
+Node: Run-time Library Errors646124
+Node: Collected Fortran Wisdom648076
+Node: Advantages Over f2c649512
+Node: Language Extensions650421
+Node: Compiler Options650928
+Node: Compiler Speed651380
+Node: Program Speed652090
+Node: Ease of Debugging653675
+Node: Character and Hollerith Constants656105
+Node: Block Data and Libraries656899
+Node: Loops660223
+Node: Working Programs665439
+Node: Not My Type666119
+Node: Variables Assumed To Be Zero668050
+Node: Variables Assumed To Be Saved669104
+Node: Unwanted Variables670474
+Node: Unused Arguments671354
+Node: Surprising Interpretations of Code671817
+Node: Aliasing Assumed To Work672663
+Node: Output Assumed To Flush678579
+Node: Large File Unit Numbers679985
+Node: Overly Convenient Options681267
+Node: Faster Programs684877
+Node: Aligned Data685323
+Node: Prefer Automatic Uninitialized Variables689167
+Node: Avoid f2c Compatibility690533
+Node: Use Submodel Options691001
+Node: Trouble691824
+Node: But-bugs693433
+Node: Signal 11 and Friends695207
+Node: Cannot Link Fortran Programs697286
+Node: Large Common Blocks698569
+Node: Debugger Problems698995
+Node: NeXTStep Problems699517
+Node: Stack Overflow701339
+Node: Nothing Happens703352
+Node: Strange Behavior at Run Time704966
+Node: Floating-point Errors707259
+Node: Actual Bugs711836
+Node: Missing Features720233
+Node: Better Source Model721950
+Node: Fortran 90 Support723719
+Node: Intrinsics in PARAMETER Statements724820
+Node: SELECT CASE on CHARACTER Type725706
+Node: RECURSIVE Keyword726004
+Node: Increasing Precision/Range726431
+Node: Popular Non-standard Types727968
+Node: Full Support for Compiler Types728385
+Node: Array Bounds Expressions729057
+Node: POINTER Statements729504
+Node: Sensible Non-standard Constructs730387
+Node: FLUSH Statement732712
+Node: Expressions in FORMAT Statements733098
+Node: Explicit Assembler Code734273
+Node: Q Edit Descriptor734562
+Node: Old-style PARAMETER Statements735066
+Node: TYPE and ACCEPT I/O Statements735800
+Node: STRUCTURE UNION RECORD MAP736366
+Node: OPEN CLOSE and INQUIRE Keywords736852
+Node: ENCODE and DECODE737284
+Node: Suppressing Space Padding738385
+Node: Fortran Preprocessor739611
+Node: Bit Operations on Floating-point Data740184
+Node: POSIX Standard740698
+Node: Floating-point Exception Handling740942
+Node: Nonportable Conversions741984
+Node: Large Automatic Arrays742520
+Node: Support for Threads742927
+Node: Gracefully Handle Sensible Bad Code743352
+Node: Non-standard Conversions744107
+Node: Non-standard Intrinsics744450
+Node: Modifying DO Variable744866
+Node: Better Pedantic Compilation745542
+Node: Warn About Implicit Conversions746170
+Node: Invalid Use of Hollerith Constant746757
+Node: Dummy Array Without Dimensioning Dummy747300
+Node: Invalid FORMAT Specifiers748213
+Node: Ambiguous Dialects748614
+Node: Unused Labels749025
+Node: Informational Messages749247
+Node: Uninitialized Variables at Run Time749650
+Node: Bounds Checking at Run Time750257
+Node: Labels Visible to Debugger750705
+Node: Disappointments751111
+Node: Mangling of Names751749
+Node: Multiple Definitions of External Names752599
+Node: Limitation on Implicit Declarations753962
+Node: Non-bugs754246
+Node: Backslash in Constants755371
+Node: Initializing Before Specifying760260
+Node: Context-Sensitive Intrinsicness761402
+Node: Context-Sensitive Constants763298
+Node: Equivalence Versus Equality766255
+Node: Order of Side Effects768765
+Node: Warnings and Errors770493
+Node: Open Questions772177
+Node: Bugs773325
+Node: Bug Criteria774830
+Node: Bug Lists781065
+Node: Bug Reporting781830
+Node: Sending Patches795277
+Node: Service800754
+Node: Adding Options801215
+Node: Projects805264
+Node: Efficiency806109
+Node: Better Optimization809006
+Node: Simplify Porting812376
+Node: More Extensions814131
+Node: Machine Model817332
+Node: Internals Documentation818618
+Node: Internals Improvements818932
+Node: Better Diagnostics822476
+Node: Diagnostics823393
+Node: CMPAMBIG824687
+Node: EXPIMP831154
+Node: INTGLOB832390
+Node: LEX834634
+Node: GLOBALS840026
+Node: Index841879

End Tag Table
diff --git a/gcc/f/g77.info-1 b/gcc/f/g77.info-1
index 87ee3cc70f9..4ae44333286 100644
--- a/gcc/f/g77.info-1
+++ b/gcc/f/g77.info-1
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -589,7 +589,7 @@ Funding GNU Fortran
*******************
Work on GNU Fortran is still being done mostly by its author, James
-Craig Burley (<burley@gnu.ai.mit.edu>), who is a volunteer for, not an
+Craig Burley (<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 needed equipment,
personnel, and so on.
@@ -623,14 +623,14 @@ work on a few occasions. If more people did this, he would be able to
plan on not doing contract work for many months and could thus devote
that time to work on projects (such as the planned changes for 0.6)
that require longer timeframes to complete. For the latest information
-on the status of the author, do `finger -l burley@gate.gnu.ai.mit.edu'
-on a UNIX system (or any system with a command like UNIX `finger').
+on the status of the author, do `finger -l burley@gnu.org' on a UNIX
+system (or any system with a command like UNIX `finger').
Another important way to support work on GNU Fortran is to volunteer
to help out. Work is needed on documentation, testing, porting to
various machines, and in some cases, coding (although major changes
planned for version 0.6 make it difficult to add manpower to this area).
-Email <fortran@gnu.ai.mit.edu> to volunteer for this work.
+Email <fortran@gnu.org> to volunteer for this work.
*Note Funding Free Software: Funding, for more information.
@@ -1003,6 +1003,8 @@ by type. Explanations are in the following sections.
-fcase-initcap -fcase-upper -fcase-lower -fcase-preserve
-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
-fgnu-intrinsics-delete -fgnu-intrinsics-hide
diff --git a/gcc/f/g77.info-10 b/gcc/f/g77.info-10
index 90f79f1fb1d..cdba49bcceb 100644
--- a/gcc/f/g77.info-10
+++ b/gcc/f/g77.info-10
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,74 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Stat Intrinsic (function), Next: Sum Intrinsic, Prev: Stat Intrinsic (subroutine), Up: Table of Intrinsic Functions
+
+Stat Intrinsic (function)
+.........................
+
+ Stat(FILE, SARRAY)
+
+Stat: `INTEGER(KIND=1)' function.
+
+FILE: `CHARACTER'; scalar; INTENT(IN).
+
+SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Obtains data about the given file FILE and places them in the array
+SARRAY. A null character (`CHAR(0)') marks the end of the name in
+FILE--otherwise, trailing blanks in FILE are ignored. The values in
+this array are extracted from the `stat' structure as returned by
+`fstat(2)' q.v., as follows:
+
+ 1. File mode
+
+ 2. Inode number
+
+ 3. ID of device containing directory entry for file
+
+ 4. Device id (if relevant)
+
+ 5. Number of links
+
+ 6. Owner's uid
+
+ 7. Owner's gid
+
+ 8. File size (bytes)
+
+ 9. Last access time
+
+ 10. Last modification time
+
+ 11. Last file status change time
+
+ 12. Preferred I/O block size
+
+ 13. Number of blocks allocated
+
+ Not all these elements are relevant on all systems. If an element
+is not relevant, it is returned as 0.
+
+ Returns 0 on success or a non-zero error code.
+
+ For information on other intrinsics with the same name: *Note Stat
+Intrinsic (subroutine)::.
+
+
+File: g77.info, Node: Sum Intrinsic, Next: SymLnk Intrinsic (subroutine), Prev: Stat Intrinsic (function), Up: Table of Intrinsic Functions
+
+Sum Intrinsic
+.............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL Sum' to use this name for an
+external procedure.
+
+
File: g77.info, Node: SymLnk Intrinsic (subroutine), Next: System Intrinsic (subroutine), Prev: Sum Intrinsic, Up: Table of Intrinsic Functions
SymLnk Intrinsic (subroutine)
@@ -1357,8 +1425,8 @@ Ugly Null Arguments
The `-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".
+arguments to an external procedure, and use of an empty list of
+arguments to such a procedure to mean "pass a single null argument".
(Null arguments often are used in some procedure-calling schemes to
indicate omitted arguments.)
@@ -1433,30 +1501,3 @@ Ugly Conversion of Initializers
code. But, they are widely used in existing Fortran code in ways that
often are quite portable. Therefore, they are enabled by default.
-
-File: g77.info, Node: Ugly Integer Conversions, Next: Ugly Assigned Labels, Prev: Ugly Conversion of Initializers, Up: Distensions
-
-Ugly Integer Conversions
-------------------------
-
- The constructs enabled via `-fugly-logint' are:
-
- * Automatic conversion between `INTEGER' and `LOGICAL' as dictated by
- context (typically implies nonportable dependencies on how a
- particular implementation encodes `.TRUE.' and `.FALSE.').
-
- * Use of a `LOGICAL' variable in `ASSIGN' and assigned-`GOTO'
- statements.
-
- The above constructs are disabled by default because use of them
-tends to lead to non-portable code. Even existing Fortran code that
-uses that often turns out to be non-portable, if not outright buggy.
-
- Some of this is due to differences among implementations as far as
-how `.TRUE.' and `.FALSE.' are encoded as `INTEGER' values--Fortran
-code that assumes a particular coding is likely to use one of the above
-constructs, and is also likely to not work correctly on implementations
-using different encodings.
-
- *Note Equivalence Versus Equality::, for more information.
-
diff --git a/gcc/f/g77.info-11 b/gcc/f/g77.info-11
index b2176a2d92d..0acc6fb619a 100644
--- a/gcc/f/g77.info-11
+++ b/gcc/f/g77.info-11
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,33 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Ugly Integer Conversions, Next: Ugly Assigned Labels, Prev: Ugly Conversion of Initializers, Up: Distensions
+
+Ugly Integer Conversions
+------------------------
+
+ The constructs enabled via `-fugly-logint' are:
+
+ * Automatic conversion between `INTEGER' and `LOGICAL' as dictated by
+ context (typically implies nonportable dependencies on how a
+ particular implementation encodes `.TRUE.' and `.FALSE.').
+
+ * Use of a `LOGICAL' variable in `ASSIGN' and assigned-`GOTO'
+ statements.
+
+ The above constructs are disabled by default because use of them
+tends to lead to non-portable code. Even existing Fortran code that
+uses that often turns out to be non-portable, if not outright buggy.
+
+ Some of this is due to differences among implementations as far as
+how `.TRUE.' and `.FALSE.' are encoded as `INTEGER' values--Fortran
+code that assumes a particular coding is likely to use one of the above
+constructs, and is also likely to not work correctly on implementations
+using different encodings.
+
+ *Note Equivalence Versus Equality::, for more information.
+
+
File: g77.info, Node: Ugly Assigned Labels, Prev: Ugly Integer Conversions, Up: Distensions
Ugly Assigned Labels
@@ -824,6 +851,10 @@ Description:
Sets the current working directory to be DIR. Returns 0 on success
or a non-zero error code. See `chdir(3)'.
+ *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.
@@ -1566,43 +1597,3 @@ IZExt Intrinsic
reserved as an intrinsic. Use `EXTERNAL IZExt' to use this name for an
external procedure.
-
-File: g77.info, Node: JIAbs Intrinsic, Next: JIAnd Intrinsic, Prev: IZExt Intrinsic, Up: Other Intrinsics
-
-JIAbs Intrinsic
-...............
-
- This intrinsic is not yet implemented. The name is, however,
-reserved as an intrinsic. Use `EXTERNAL JIAbs' to use this name for an
-external procedure.
-
-
-File: g77.info, Node: JIAnd Intrinsic, Next: JIBClr Intrinsic, Prev: JIAbs Intrinsic, Up: Other Intrinsics
-
-JIAnd Intrinsic
-...............
-
- This intrinsic is not yet implemented. The name is, however,
-reserved as an intrinsic. Use `EXTERNAL JIAnd' to use this name for an
-external procedure.
-
-
-File: g77.info, Node: JIBClr Intrinsic, Next: JIBits Intrinsic, Prev: JIAnd Intrinsic, Up: Other Intrinsics
-
-JIBClr Intrinsic
-................
-
- This intrinsic is not yet implemented. The name is, however,
-reserved as an intrinsic. Use `EXTERNAL JIBClr' to use this name for an
-external procedure.
-
-
-File: g77.info, Node: JIBits Intrinsic, Next: JIBSet Intrinsic, Prev: JIBClr Intrinsic, Up: Other Intrinsics
-
-JIBits Intrinsic
-................
-
- This intrinsic is not yet implemented. The name is, however,
-reserved as an intrinsic. Use `EXTERNAL JIBits' to use this name for an
-external procedure.
-
diff --git a/gcc/f/g77.info-12 b/gcc/f/g77.info-12
index 3bf2594382b..303263ce6c0 100644
--- a/gcc/f/g77.info-12
+++ b/gcc/f/g77.info-12
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,46 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: JIAbs Intrinsic, Next: JIAnd Intrinsic, Prev: IZExt Intrinsic, Up: Other Intrinsics
+
+JIAbs Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIAbs' to use this name for an
+external procedure.
+
+
+File: g77.info, Node: JIAnd Intrinsic, Next: JIBClr Intrinsic, Prev: JIAbs Intrinsic, Up: Other Intrinsics
+
+JIAnd Intrinsic
+...............
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIAnd' to use this name for an
+external procedure.
+
+
+File: g77.info, Node: JIBClr Intrinsic, Next: JIBits Intrinsic, Prev: JIAnd Intrinsic, Up: Other Intrinsics
+
+JIBClr Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIBClr' to use this name for an
+external procedure.
+
+
+File: g77.info, Node: JIBits Intrinsic, Next: JIBSet Intrinsic, Prev: JIBClr Intrinsic, Up: Other Intrinsics
+
+JIBits Intrinsic
+................
+
+ This intrinsic is not yet implemented. The name is, however,
+reserved as an intrinsic. Use `EXTERNAL JIBits' to use this name for an
+external procedure.
+
+
File: g77.info, Node: JIBSet Intrinsic, Next: JIDiM Intrinsic, Prev: JIBits Intrinsic, Up: Other Intrinsics
JIBSet Intrinsic
@@ -668,7 +708,7 @@ Signal Intrinsic (function)
Signal(NUMBER, HANDLER)
-Signal: `INTEGER(KIND=1)' function.
+Signal: `INTEGER(KIND=7)' function.
NUMBER: `INTEGER'; scalar; INTENT(IN).
@@ -681,18 +721,62 @@ Description:
If HANDLER is a an `EXTERNAL' routine, arranges for it to be invoked
with a single integer argument (of system-dependent length) when signal
-NUMBER occurs. If NUMBER is an integer, it can be used to turn off
-handling of signal HANDLER or revert to its default action. See
+NUMBER occurs. If HANDLER is an integer, it can be used to turn off
+handling of signal NUMBER or revert to its default action. See
`signal(2)'.
- Note that HANDLER will be called using C conventions, so its value in
-Fortran terms is obtained by applying `%LOC()' (or LOC()) to it.
+ Note that HANDLER will be called using C conventions, so the value
+of its argument in Fortran terms is obtained by applying `%LOC()' (or
+LOC()) to it.
The value returned by `signal(2)' is returned.
Due to the side effects performed by this intrinsic, the function
form is not recommended.
+ *Warning:* If the returned value is stored in an `INTEGER(KIND=1)'
+(default `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 `g77' under normal
+circumstances.
+
+ Therefore, the following code fragment might silently fail on some
+systems:
+
+ INTEGER RTN
+ EXTERNAL MYHNDL
+ RTN = SIGNAL(SIGNUM, MYHNDL)
+ ...
+ ! Restore original handler:
+ RTN = SIGNAL(SIGNUM, RTN)
+
+ The reason for the failure is that `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.
+
+ *Warning:* Use of the `libf2c' run-time library function `signal_'
+directly (such as via `EXTERNAL SIGNAL') requires use of the `%VAL()'
+construct to pass an `INTEGER' value (such as `SIG_IGN' or `SIG_DFL')
+for the HANDLER argument.
+
+ However, while `RTN = SIGNAL(SIGNUM, %VAL(SIG_IGN))' works when
+`SIGNAL' is treated as an external procedure (and resolves, at link
+time, to `libf2c''s `signal_' routine), this construct is not valid
+when `SIGNAL' is recognized as the intrinsic of that name.
+
+ Therefore, for maximum portability and reliability, code such
+references to the `SIGNAL' facility as follows:
+
+ INTRINSIC SIGNAL
+ ...
+ RTN = SIGNAL(SIGNUM, SIG_IGN)
+
+ `g77' will compile such a call correctly, while other compilers will
+generally either do so as well or reject the `INTRINSIC SIGNAL'
+statement via a diagnostic, allowing you to take appropriate action.
+
For information on other intrinsics with the same name: *Note Signal
Intrinsic (subroutine)::.
@@ -1190,254 +1274,3 @@ from source and package up as a binary distribution are ongoing.
* Complete Installation:: For experts, or those who want to be: the details.
* Distributing Binaries:: If you plan on distributing your `g77'.
-
-File: g77.info, Node: Prerequisites, Next: Problems Installing, Up: Installation
-
-Prerequisites
-=============
-
- The procedures described to unpack, configure, build, and install
-`g77' assume your system has certain programs already installed.
-
- The following prerequisites should be met by your system before you
-follow the `g77' installation instructions:
-
-`gzip'
- To unpack the `gcc' and `g77' distributions, you'll need the
- `gunzip' utility in the `gzip' distribution. Most UNIX systems
- already have `gzip' installed. If yours doesn't, you can get it
- from the FSF.
-
- Note that you'll need `tar' and other utilities as well, but all
- UNIX systems have these. There are GNU versions of all these
- available--in fact, a complete GNU UNIX system can be put together
- on most systems, if desired.
-
- The version of GNU `gzip' used to package this release is 1.24.
- (The version of GNU `tar' used to package this release is 1.11.2.)
-
-`gcc-2.7.2.3.tar.gz'
- You need to have this, or some other applicable, version of `gcc'
- on your system. The version should be an exact copy of a
- distribution from the FSF. Its size is approximately 7.1MB.
-
- If you've already unpacked `gcc-2.7.2.3.tar.gz' into a directory
- (named `gcc-2.7.2.3') called the "source tree" for `gcc', you can
- delete the distribution itself, but you'll need to remember to
- skip any instructions to unpack this distribution.
-
- Without an applicable `gcc' source tree, you cannot build `g77'.
- You can obtain an FSF distribution of `gcc' from the FSF.
-
-`g77-0.5.21.tar.gz'
- You probably have already unpacked this package, or you are
- reading an advance copy of these installation instructions, which
- are contained in this distribution. The size of this package is
- approximately 1.5MB.
-
- You can obtain an FSF distribution of `g77' from the FSF, the same
- way you obtained `gcc'.
-
-Enough disk space
- The amount of disk space needed to unpack, build, install, and use
- `g77' depends on the type of system you're using, how you build
- `g77', and how much of it you install (primarily, which languages
- you install).
-
- The sizes shown below assume all languages distributed in
- `gcc-2.7.2.3', plus `g77', will be built and installed. These
- sizes are indicative of GNU/Linux systems on Intel x86 running
- COFF and on Digital Alpha (AXP) systems running ELF. These should
- be fairly representative of 32-bit and 64-bit systems,
- respectively.
-
- Note that all sizes are approximate and subject to change without
- notice! They are based on preliminary releases of g77 made shortly
- before the public beta release.
-
- -- `gcc' and `g77' distributions occupy 8.6MB packed, 35MB
- unpacked. These consist of the source code and documentation,
- plus some derived files (mostly documentation), for `gcc' and
- `g77'. Any deviations from these numbers for different kinds
- of systems are likely to be very minor.
-
- -- A "bootstrap" build requires an additional 67.3MB for a
- total of 102MB on an ix86, and an additional 98MB for a total
- of 165MB on an Alpha.
-
- -- Removing `gcc/stage1' after the build recovers 10.7MB for a
- total of 91MB on an ix86, and recovers ??MB for a total of
- ??MB on an Alpha.
-
- After doing this, the integrity of the build can still be
- verified via `make compare', and the `gcc' compiler modified
- and used to build itself for testing fairly quickly, using
- the copy of the compiler kept in `gcc/stage2'.
-
- -- Removing `gcc/stage2' after the build further recovers
- 27.3MB for a total of 64.3MB, and recovers ??MB for a total
- of ??MB on an Alpha.
-
- After doing this, the compiler can still be installed,
- especially if GNU `make' is used to avoid gratuitous rebuilds
- (or, the installation can be done by hand).
-
- -- Installing `gcc' and `g77' copies 14.9MB onto the `--prefix'
- disk for a total of 79.2MB on an ix86, and copies ??MB onto
- the `--prefix' disk for a total of ??MB on an Alpha.
-
- After installation, if no further modifications and builds of
- `gcc' or `g77' are planned, the source and build directory may be
- removed, leaving the total impact on a system's disk storage as
- that of the amount copied during installation.
-
- Systems with the appropriate version of `gcc' installed don't
- require the complete bootstrap build. Doing a "straight build"
- requires about as much space as does a bootstrap build followed by
- removing both the `gcc/stage1' and `gcc/stage2' directories.
-
- Installing `gcc' and `g77' over existing versions might require
- less *new* disk space, but note that, unlike many products, `gcc'
- installs itself in a way that avoids overwriting other installed
- versions of itself, so that other versions may easily be invoked
- (via `gcc -V VERSION').
-
- So, the amount of space saved as a result of having an existing
- version of `gcc' and `g77' already installed is not
- much--typically only the command drivers (`gcc', `g77', `g++', and
- so on, which are small) and the documentation is overwritten by
- the new installation. The rest of the new installation is done
- without replacing existing installed versions (assuming they have
- different version numbers).
-
-`patch'
- Although you can do everything `patch' does yourself, by hand,
- without much trouble, having `patch' installed makes installation
- of new versions of GNU utilities such as `g77' so much easier that
- it is worth getting. You can obtain `patch' the same way you
- obtained `gcc' and `g77'.
-
- In any case, you can apply patches by hand--patch files are
- designed for humans to read them.
-
- The version of GNU `patch' used to develop this release is 2.4.
-
-`make'
- Your system must have `make', and you will probably save yourself
- a lot of trouble if it is GNU `make' (sometimes referred to as
- `gmake').
-
- The version of GNU `make' used to develop this release is 3.73.
-
-`cc'
- Your system must have a working C compiler.
-
- *Note Installing GNU CC: (gcc)Installation, for more information
- on prerequisites for installing `gcc'.
-
-`bison'
- If you do not have `bison' installed, you can usually work around
- any need for it, since `g77' itself does not use it, and `gcc'
- normally includes all files generated by running it in its
- distribution. You can obtain `bison' the same way you obtained
- `gcc' and `g77'.
-
- The version of GNU `bison' used to develop this release is 1.25.
-
- *Note Missing bison?::, for information on how to work around not
- having `bison'.
-
-`makeinfo'
- If you are missing `makeinfo', you can usually work around any
- need for it. You can obtain `makeinfo' the same way you obtained
- `gcc' and `g77'.
-
- The version of GNU `makeinfo' used to develop this release is
- 1.68, from GNU `texinfo' version 3.11.
-
- *Note Missing makeinfo?::, for information on getting around the
- lack of `makeinfo'.
-
-`sed'
- All UNIX systems have `sed', but some have a broken version that
- cannot handle configuring, building, or installing `gcc' or `g77'.
-
- The version of GNU `sed' used to develop this release is 2.05.
- (Note that GNU `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.)
-
-`root' access or equivalent
- To perform the complete installation procedures on a system, you
- need to have `root' access to that system, or equivalent access to
- the `--prefix' directory tree specified on the `configure' command
- line.
-
- Portions of the procedure (such as configuring and building `g77')
- can be performed by any user with enough disk space and virtual
- memory.
-
- However, these instructions are oriented towards less-experienced
- users who want to install `g77' on their own personal systems.
-
- System administrators with more experience will want to determine
- for themselves how they want to modify the procedures described
- below to suit the needs of their installation.
-
-
-File: g77.info, Node: Problems Installing, Next: Settings, Prev: Prerequisites, Up: Installation
-
-Problems Installing
-===================
-
- This is a list of problems (and some apparent problems which don't
-really mean anything is wrong) that show up when configuring, building,
-installing, or porting GNU Fortran.
-
- *Note Installation Problems: (gcc)Installation Problems, for more
-information on installation problems that can afflict either `gcc' or
-`g77'.
-
-* Menu:
-
-* General Problems:: Problems afflicting most or all systems.
-* Cross-compiler Problems:: Problems afflicting cross-compilation setups.
-
-
-File: g77.info, Node: General Problems, Next: Cross-compiler Problems, Up: Problems Installing
-
-General Problems
-----------------
-
- These problems can occur on most or all systems.
-
-* Menu:
-
-* GNU C Required:: Why even ANSI C is not enough.
-* Patching GNU CC Necessary:: Why `gcc' must be patched first.
-* Building GNU CC Necessary:: Why you can't build *just* Fortran.
-* Missing strtoul:: If linking `f771' fails due to an
- unresolved reference to `strtoul'.
-* Object File Differences:: It's okay that `make compare' will
- flag `f/zzz.o'.
-* Cleanup Kills Stage Directories:: A minor nit for `g77' developers.
-* Missing gperf?:: When building requires `gperf'.
-
-
-File: g77.info, Node: GNU C Required, Next: Patching GNU CC Necessary, Up: General Problems
-
-GNU C Required
-..............
-
- Compiling `g77' requires GNU C, not just ANSI C. Fixing this
-wouldn't be very hard (just tedious), but the code using GNU extensions
-to the C language is expected to be rewritten for 0.6 anyway, so there
-are no plans for an interim fix.
-
- This requirement does not mean you must already have `gcc' installed
-to build `g77'. As long as you have a working C compiler, you can use a
-bootstrap build to automate the process of first building `gcc' using
-the working C compiler you have, then building `g77' and rebuilding
-`gcc' using that just-built `gcc', and so on.
-
diff --git a/gcc/f/g77.info-13 b/gcc/f/g77.info-13
index 81479b1aa0e..1b8fd5050ef 100644
--- a/gcc/f/g77.info-13
+++ b/gcc/f/g77.info-13
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,262 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Prerequisites, Next: Problems Installing, Up: Installation
+
+Prerequisites
+=============
+
+ The procedures described to unpack, configure, build, and install
+`g77' assume your system has certain programs already installed.
+
+ The following prerequisites should be met by your system before you
+follow the `g77' installation instructions:
+
+`gzip'
+ To unpack the `gcc' and `g77' distributions, you'll need the
+ `gunzip' utility in the `gzip' distribution. Most UNIX systems
+ already have `gzip' installed. If yours doesn't, you can get it
+ from the FSF.
+
+ Note that you'll need `tar' and other utilities as well, but all
+ UNIX systems have these. There are GNU versions of all these
+ available--in fact, a complete GNU UNIX system can be put together
+ on most systems, if desired.
+
+ The version of GNU `gzip' used to package this release is
+ 1.2.4. (The version of GNU `tar' used to package this release is
+ 1.12.)
+
+`gcc-2.7.2.3.tar.gz'
+ You need to have this, or some other applicable, version of `gcc'
+ on your system. The version should be an exact copy of a
+ distribution from the FSF. Its size is approximately 7.1MB.
+
+ If you've already unpacked `gcc-2.7.2.3.tar.gz' into a directory
+ (named `gcc-2.7.2.3') called the "source tree" for `gcc', you can
+ delete the distribution itself, but you'll need to remember to
+ skip any instructions to unpack this distribution.
+
+ Without an applicable `gcc' source tree, you cannot build `g77'.
+ You can obtain an FSF distribution of `gcc' from the FSF.
+
+`g77-0.5.22.tar.gz'
+ You probably have already unpacked this package, or you are
+ reading an advance copy of these installation instructions, which
+ are contained in this distribution. The size of this package is
+ approximately 1.5MB.
+
+ You can obtain an FSF distribution of `g77' from the FSF, the same
+ way you obtained `gcc'.
+
+Enough disk space
+ The amount of disk space needed to unpack, build, install, and use
+ `g77' depends on the type of system you're using, how you build
+ `g77', and how much of it you install (primarily, which languages
+ you install).
+
+ The sizes shown below assume all languages distributed in
+ `gcc-2.7.2.3', plus `g77', will be built and installed. These
+ sizes are indicative of GNU/Linux systems on Intel x86 running
+ COFF and on Digital Alpha (AXP) systems running ELF. These should
+ be fairly representative of 32-bit and 64-bit systems,
+ respectively.
+
+ Note that all sizes are approximate and subject to change without
+ notice! They are based on preliminary releases of g77 made shortly
+ before the public beta release.
+
+ -- `gcc' and `g77' distributions occupy 8.6MB packed, 35MB
+ unpacked. These consist of the source code and documentation,
+ plus some derived files (mostly documentation), for `gcc' and
+ `g77'. Any deviations from these numbers for different kinds
+ of systems are likely to be very minor.
+
+ -- A "bootstrap" build requires an additional 67.3MB for a
+ total of 102MB on an ix86, and an additional 98MB for a total
+ of 165MB on an Alpha.
+
+ -- Removing `gcc/stage1' after the build recovers 10.7MB for a
+ total of 91MB on an ix86, and recovers ??MB for a total of
+ ??MB on an Alpha.
+
+ After doing this, the integrity of the build can still be
+ verified via `make compare', and the `gcc' compiler modified
+ and used to build itself for testing fairly quickly, using
+ the copy of the compiler kept in `gcc/stage2'.
+
+ -- Removing `gcc/stage2' after the build further recovers
+ 27.3MB for a total of 64.3MB, and recovers ??MB for a total
+ of ??MB on an Alpha.
+
+ After doing this, the compiler can still be installed,
+ especially if GNU `make' is used to avoid gratuitous rebuilds
+ (or, the installation can be done by hand).
+
+ -- Installing `gcc' and `g77' copies 14.9MB onto the `--prefix'
+ disk for a total of 79.2MB on an ix86, and copies ??MB onto
+ the `--prefix' disk for a total of ??MB on an Alpha.
+
+ After installation, if no further modifications and builds of
+ `gcc' or `g77' are planned, the source and build directory may be
+ removed, leaving the total impact on a system's disk storage as
+ that of the amount copied during installation.
+
+ Systems with the appropriate version of `gcc' installed don't
+ require the complete bootstrap build. Doing a "straight build"
+ requires about as much space as does a bootstrap build followed by
+ removing both the `gcc/stage1' and `gcc/stage2' directories.
+
+ Installing `gcc' and `g77' over existing versions might require
+ less *new* disk space, but note that, unlike many products, `gcc'
+ installs itself in a way that avoids overwriting other installed
+ versions of itself, so that other versions may easily be invoked
+ (via `gcc -V VERSION').
+
+ So, the amount of space saved as a result of having an existing
+ version of `gcc' and `g77' already installed is not
+ much--typically only the command drivers (`gcc', `g77', `g++', and
+ so on, which are small) and the documentation is overwritten by
+ the new installation. The rest of the new installation is done
+ without replacing existing installed versions (assuming they have
+ different version numbers).
+
+`patch'
+ Although you can do everything `patch' does yourself, by hand,
+ without much trouble, having `patch' installed makes installation
+ of new versions of GNU utilities such as `g77' so much easier that
+ it is worth getting. You can obtain `patch' the same way you
+ obtained `gcc' and `g77'.
+
+ In any case, you can apply patches by hand--patch files are
+ designed for humans to read them.
+
+ The version of GNU `patch' used to develop this release is
+ 2.5.
+
+`make'
+ Your system must have `make', and you will probably save yourself
+ a lot of trouble if it is GNU `make' (sometimes referred to as
+ `gmake').
+
+ The version of GNU `make' used to develop this release is
+ 3.76.1.
+
+`cc'
+ Your system must have a working C compiler.
+
+ *Note Installing GNU CC: (gcc)Installation, for more information
+ on prerequisites for installing `gcc'.
+
+`bison'
+ If you do not have `bison' installed, you can usually work around
+ any need for it, since `g77' itself does not use it, and `gcc'
+ normally includes all files generated by running it in its
+ distribution. You can obtain `bison' the same way you obtained
+ `gcc' and `g77'.
+
+ The version of GNU `bison' used to develop this release is
+ 1.25.
+
+ *Note Missing bison?::, for information on how to work around not
+ having `bison'.
+
+`makeinfo'
+ If you are missing `makeinfo', you can usually work around any
+ need for it. You can obtain `makeinfo' the same way you obtained
+ `gcc' and `g77'.
+
+ The version of GNU `makeinfo' used to develop this release is
+ 1.68, from GNU `texinfo' version 3.11.
+
+ *Note Missing makeinfo?::, for information on getting around the
+ lack of `makeinfo'.
+
+`sed'
+ All UNIX systems have `sed', but some have a broken version that
+ cannot handle configuring, building, or installing `gcc' or `g77'.
+
+ The version of GNU `sed' used to develop this release is
+ 2.05. (Note that GNU `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.)
+
+`root' access or equivalent
+ To perform the complete installation procedures on a system, you
+ need to have `root' access to that system, or equivalent access to
+ the `--prefix' directory tree specified on the `configure' command
+ line.
+
+ Portions of the procedure (such as configuring and building `g77')
+ can be performed by any user with enough disk space and virtual
+ memory.
+
+ However, these instructions are oriented towards less-experienced
+ users who want to install `g77' on their own personal systems.
+
+ System administrators with more experience will want to determine
+ for themselves how they want to modify the procedures described
+ below to suit the needs of their installation.
+
+
+File: g77.info, Node: Problems Installing, Next: Settings, Prev: Prerequisites, Up: Installation
+
+Problems Installing
+===================
+
+ This is a list of problems (and some apparent problems which don't
+really mean anything is wrong) that show up when configuring, building,
+installing, or porting GNU Fortran.
+
+ *Note Installation Problems: (gcc)Installation Problems, for more
+information on installation problems that can afflict either `gcc' or
+`g77'.
+
+* Menu:
+
+* General Problems:: Problems afflicting most or all systems.
+* System-specific Problems:: Problems afflicting particular systems.
+* Cross-compiler Problems:: Problems afflicting cross-compilation setups.
+
+
+File: g77.info, Node: General Problems, Next: System-specific Problems, Up: Problems Installing
+
+General Problems
+----------------
+
+ These problems can occur on most or all systems.
+
+* Menu:
+
+* GNU C Required:: Why even ANSI C is not enough.
+* Patching GNU CC Necessary:: Why `gcc' must be patched first.
+* Building GNU CC Necessary:: Why you can't build *just* Fortran.
+* Missing strtoul:: If linking `f771' fails due to an
+ unresolved reference to `strtoul'.
+* Object File Differences:: It's okay that `make compare' will
+ flag `f/zzz.o'.
+* Cleanup Kills Stage Directories:: A minor nit for `g77' developers.
+* Missing gperf?:: When building requires `gperf'.
+
+
+File: g77.info, Node: GNU C Required, Next: Patching GNU CC Necessary, Up: General Problems
+
+GNU C Required
+..............
+
+ Compiling `g77' requires GNU C, not just ANSI C. Fixing this
+wouldn't be very hard (just tedious), but the code using GNU extensions
+to the C language is expected to be rewritten for 0.6 anyway, so there
+are no plans for an interim fix.
+
+ This requirement does not mean you must already have `gcc' installed
+to build `g77'. As long as you have a working C compiler, you can use a
+bootstrap build to automate the process of first building `gcc' using
+the working C compiler you have, then building `g77' and rebuilding
+`gcc' using that just-built `gcc', and so on.
+
+
File: g77.info, Node: Patching GNU CC Necessary, Next: Building GNU CC Necessary, Prev: GNU C Required, Up: General Problems
Patching GNU CC Necessary
@@ -153,10 +409,26 @@ corresponding output files.
If the above does not work, definitely start from scratch and avoid
copying the `gcc' using any method that does not reliably preserve
-date-time-modified information, such as the UNIX `cp -r' command.
+date-time-modified information, such as the UNIX `cp -r' command (use
+`cp -pr' instead).
+
+
+File: g77.info, Node: System-specific Problems, Next: Cross-compiler Problems, Prev: General Problems, Up: Problems Installing
+
+System-specific Problems
+------------------------
+
+ 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 `egcs' instead of versions of `g77' based on versions of
+`gcc' prior to 2.8. `http://www.cygnus.com/egcs' for information on
+`egcs', or obtain a copy from `ftp://egcs.cygnus.com/pub/egcs'.
+
+ If your system is Irix 6, to obtain a working version of `gcc',
+`http://reality.sgi.com/knobi/gcc-2.7.2.x-on-irix-6.2-6.3'.

-File: g77.info, Node: Cross-compiler Problems, Prev: General Problems, Up: Problems Installing
+File: g77.info, Node: Cross-compiler Problems, Prev: System-specific Problems, Up: Problems Installing
Cross-compiler Problems
-----------------------
@@ -336,11 +608,12 @@ Floating-point Bit Patterns
The `g77' build will crash if an attempt is made to build it as a
cross-compiler for a target when `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.
-(Currently, `g77' would generate bad code under such circumstances if
-it didn't crash during the build, e.g. when compiling a source file
-that does something like `EQUIVALENCE (I,R)' and `DATA R/9.43578/'.)
+improvements for version 0.6 of `g77' will give it the capabilities it
+needs to not have to crash the build but rather generate correct code
+for the target. (Currently, `g77' would generate bad code under such
+circumstances if it didn't crash during the build, e.g. when compiling
+a source file that does something like `EQUIVALENCE (I,R)' and `DATA
+R/9.43578/'.)

File: g77.info, Node: Large Initialization, Next: Alpha Problems Fixed, Prev: Floating-point Bit Patterns, Up: Settings
@@ -421,7 +694,7 @@ is assumed that the source distributions themselves already reside in
system:
/usr/FSF/gcc-2.7.2.3.tar.gz
- /usr/FSF/g77-0.5.21.tar.gz
+ /usr/FSF/g77-0.5.22.tar.gz
Users of the following systems should not blindly follow these
quick-start instructions, because of problems their systems have coping
@@ -447,17 +720,17 @@ of some of the steps. These explanations follow this list of steps.
sh[ 2]# gunzip -c < /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
[Might say "Broken pipe"...that is normal on some systems.]
- sh[ 3]# gunzip -c < /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ sh[ 3]# gunzip -c < /usr/FSF/g77-0.5.22.tar.gz | tar xf -
["Broken pipe" again possible.]
sh[ 4]# ln -s gcc-2.7.2.3 gcc
- sh[ 5]# ln -s g77-0.5.21 g77
+ sh[ 5]# ln -s g77-0.5.22 g77
sh[ 6]# mv -i g77/* gcc
[No questions should be asked by mv here; or, you made a mistake.]
- sh[ 7]# patch -p1 -V t -d gcc < gcc/f/gbe/2.7.2.3.diff
+ sh[ 7]# patch -p1 -E -V t -d gcc < gcc/f/gbe/2.7.2.3.diff
[Unless patch complains about rejected patches, this step worked.]
sh[ 8]# cd gcc
@@ -509,17 +782,17 @@ Step 1: `cd /usr/src'
your system knew where to look for the source code for the
installed version of `g77' and `gcc' in any case.
-Step 3: `gunzip -d < /usr/FSF/g77-0.5.21.tar.gz | tar xf -'
+Step 3: `gunzip -d < /usr/FSF/g77-0.5.22.tar.gz | tar xf -'
It is not always necessary to obtain the latest version of `g77'
as a complete `.tar.gz' file if you have a complete, earlier
distribution of `g77'. If appropriate, you can unpack that earlier
version of `g77', and then apply the appropriate patches to
- achieve the same result--a source tree containing version 0.5.21
- of `g77'.
+ achieve the same result--a source tree containing version
+ 0.5.22 of `g77'.
Step 4: `ln -s gcc-2.7.2.3 gcc'
-Step 5: `ln -s g77-0.5.21 g77'
+Step 5: `ln -s g77-0.5.22 g77'
These commands mainly help reduce typing, and help reduce visual
clutter in examples in this manual showing what to type to install
`g77'.
@@ -529,7 +802,7 @@ Step 5: `ln -s g77-0.5.21 g77'
Step 6: `mv -i g77/* gcc'
After doing this, you can, if you like, type `rm g77' and `rmdir
- g77-0.5.21' to remove the empty directory and the symbol link to
+ g77-0.5.22' to remove the empty directory and the symbol link to
it. But, it might be helpful to leave them around as quick
reminders of which version(s) of `g77' are installed on your
system.
@@ -538,10 +811,9 @@ Step 6: `mv -i g77/* gcc'
directory (as merged into the `gcc' directory).
Step 7: `patch -p1 ...'
- This can produce a wide variety of printed output, from `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 you are using GNU `patch' version 2.5 or later, this should
+ produce a list of files patched. (Other versions of `patch' might
+ not work properly.)
If messages about "fuzz", "offset", or especially "reject files"
are printed, it might mean you applied the wrong patch file. If
@@ -555,6 +827,13 @@ Step 7: `patch -p1 ...'
*Note Merging Distributions::, for more information.
+ *Note:* `gcc' versions circa 2.7.2.2 and 2.7.2.3 are known to have
+ slightly differing versions of the `gcc/ChangeLog' file, depending
+ on how they are obtained. You can safely ignore diagnostics
+ `patch' reports when patching this particular file, since it is
+ purely a documentation file for implementors. See
+ `gcc/f/gbe/2.7.2.3.diff' for more information.
+
Step 9: `touch f77-install-ok'
Don't do this if you don't want to overwrite an existing version
of `f77' (such as a native compiler, or a script that invokes
@@ -709,9 +988,9 @@ generally only the documentation is immediately usable.
sh# cd /usr/src
sh# gunzip -c /usr/FSF/gcc-2.7.2.3.tar.gz | tar xf -
- sh# gunzip -c /usr/FSF/g77-0.5.21.tar.gz | tar xf -
+ sh# gunzip -c /usr/FSF/g77-0.5.22.tar.gz | tar xf -
sh# ln -s gcc-2.7.2.3 gcc
- sh# ln -s g77-0.5.21 g77
+ sh# ln -s g77-0.5.22 g77
sh# mv -i g77/* gcc
*Notes:* The commands beginning with `gunzip...' might print `Broken
@@ -826,10 +1105,9 @@ changes to the `g77' front end (FFE).
in general, will stabilize sufficiently for the need for hand-patching
to disappear.
- Invoking `patch' as described in `gcc/f/gbe/README' can produce a
-wide variety of printed output, from `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 you are using GNU `patch' version 2.5 or later, this should
+produce a list of files patched. (Other versions of `patch' might not
+work properly.)
If messages about "fuzz", "offset", or especially "reject files" are
printed, it might mean you applied the wrong patch file. If you
@@ -845,6 +1123,13 @@ works).
of several files as saved by `patch'. To remove these, after `cd gcc',
type `rm -i *.~*~'.
+ *Note:* `gcc' versions circa 2.7.2.2 and 2.7.2.3 are known to have
+slightly differing versions of the `gcc/ChangeLog' file, depending on
+how they are obtained. You can safely ignore diagnostics `patch'
+reports when patching this particular file, since it is purely a
+documentation file for implementors. See `gcc/f/gbe/2.7.2.3.diff' for
+more information.
+
*Note:* `g77''s configuration file `gcc/f/config-lang.in' ensures
that the source code for the version of `gcc' being configured has at
least one indication of being patched as required specifically by `g77'.
@@ -854,7 +1139,8 @@ explanation. *Please* do not try to disable the check, otherwise `g77'
might well appear to build and install correctly, and even appear to
compile correctly, but could easily produce broken code.
- `diff -rcp2N' is used to create the patch files in `gcc/f/gbe/'.
+ `LC_ALL=C TZ=UTC0 diff -rcp2N' is used to create the patch files in
+`gcc/f/gbe/'.

File: g77.info, Node: Installing f77, Next: Installing f2c, Prev: Merging Distributions, Up: Complete Installation
@@ -889,256 +1175,3 @@ script) that provides compatibility with any other `f77' programs.
Only the most rudimentary invocations of `f77' will work the same way
with `g77'.
-
-File: g77.info, Node: Installing f2c, Next: Patching GNU Fortran, Prev: Installing f77, Up: Complete Installation
-
-Installing `f2c'
-----------------
-
- Currently, `g77' does not include `f2c' itself in its distribution.
-However, it does include a modified version of the `libf2c'. This
-version is normally compatible with `f2c', but has been modified to
-meet the needs of `g77' in ways that might possibly be incompatible
-with some versions or configurations of `f2c'.
-
- Decide how installation of `g77' should affect any existing
-installation of `f2c' on your system.
-
- If you do not have `f2c' on your system (e.g. no `/usr/bin/f2c', no
-`/usr/include/f2c.h', and no `/usr/lib/libf2c.a', `/usr/lib/libF77.a',
-or `/usr/lib/libI77.a'), you don't need to be concerned with this item.
-
- If you do have `f2c' on your system, you need to decide how users of
-`f2c' will be affected by your installing `g77'. Since `g77' is
-currently designed to be object-code-compatible with `f2c' (with very
-few, clear exceptions), users of `f2c' might want to combine
-`f2c'-compiled object files with `g77'-compiled object files in a
-single executable.
-
- To do this, users of `f2c' should use the same copies of `f2c.h' and
-`libf2c.a' that `g77' uses (and that get built as part of `g77').
-
- If you do nothing here, the `g77' installation process will not
-overwrite the `include/f2c.h' and `lib/libf2c.a' files with its own
-versions, and in fact will not even install `libf2c.a' for use with the
-newly installed versions of `gcc' and `g77' if it sees that
-`lib/libf2c.a' exists--instead, it will print an explanatory message
-and skip this part of the installation.
-
- To install `g77''s versions of `f2c.h' and `libf2c.a' in the
-appropriate places, create the file `f2c-install-ok' (e.g. via the UNIX
-command `touch f2c-install-ok') in the source or build top-level
-directory (the same directory in which the `g77' `f' directory resides,
-not the `f' directory itself), or edit `gcc/f/Make-lang.in' and change
-the definition of the `F2C_INSTALL_FLAG' macro appropriately.
-
- Usually, this means that, after typing `cd gcc', you would type
-`touch f2c-install-ok'.
-
- Make sure that when you enable the overwriting of `f2c.h' and
-`libf2c.a' as used by `f2c', you have a recent and properly configured
-version of `bin/f2c' so that it generates code that is compatible with
-`g77'.
-
- If you don't want installation of `g77' to overwrite `f2c''s existing
-installation, but you do want `g77' installation to proceed with
-installation of its own versions of `f2c.h' and `libf2c.a' in places
-where `g77' will pick them up (even when linking `f2c'-compiled object
-files--which might lead to incompatibilities), create the file
-`f2c-exists-ok' (e.g. via the UNIX command `touch f2c-exists-ok') in
-the source or build top-level directory, or edit `gcc/f/Make-lang.in'
-and change the definition of the `F2CLIBOK' macro appropriately.
-
-
-File: g77.info, Node: Patching GNU Fortran, Next: Where to Install, Prev: Installing f2c, Up: Complete Installation
-
-Patching GNU Fortran
---------------------
-
- If you're using a SunOS4 system, you'll need to make the following
-change to `gcc/f/proj.h': edit the line reading
-
- #define FFEPROJ_STRTOUL 1 ...
-
-by replacing the `1' with `0'. Or, you can avoid editing the source by
-adding
- CFLAGS='-DFFEPROJ_STRTOUL=0 -g -O'
- to the command line for `make' when you invoke it. (`-g' is the
-default for `CFLAGS'.)
-
- This causes a minimal version of `strtoul()' provided as part of the
-`g77' distribution to be compiled and linked into whatever `g77'
-programs need it, since some systems (like SunOS4 with only the bundled
-compiler and its runtime) do not provide this function in their system
-libraries.
-
- Similarly, a minimal version of `bsearch()' is available and can be
-enabled by editing a line similar to the one for `strtoul()' above in
-`gcc/f/proj.h', if your system libraries lack `bsearch()'. The method
-of overriding `X_CFLAGS' may also be used.
-
- These are not problems with `g77', which requires an ANSI C
-environment. You should upgrade your system to one that provides a
-full ANSI C environment, or encourage the maintainers of `gcc' to
-provide one to all `gcc'-based compilers in future `gcc' distributions.
-
- *Note Problems Installing::, for more information on why `strtoul()'
-comes up missing and on approaches to dealing with this problem that
-have already been tried.
-
-
-File: g77.info, Node: Where to Install, Next: Configuring gcc, Prev: Patching GNU Fortran, Up: Complete Installation
-
-Where in the World Does Fortran (and GNU CC) Go?
-------------------------------------------------
-
- Before configuring, you should make sure you know where you want the
-`g77' and `gcc' binaries to be installed after they're built, because
-this information is given to the configuration tool and used during the
-build itself.
-
- A `g77' installation necessarily requires installation of a
-`g77'-aware version of `gcc', so that the `gcc' command recognizes
-Fortran source files and knows how to compile them.
-
- For this to work, the version of `gcc' that you will be building as
-part of `g77' *must* be installed as the "active" version of `gcc' on
-the system.
-
- Sometimes people make the mistake of installing `gcc' as
-`/usr/local/bin/gcc', leaving an older, non-Fortran-aware version in
-`/usr/bin/gcc'. (Or, the opposite happens.) This can result in `g77'
-being unable to compile Fortran source files, because when it calls on
-`gcc' to do the actual compilation, `gcc' complains that it does not
-recognize the language, or the file name suffix.
-
- So, determine whether `gcc' already is installed on your system,
-and, if so, *where* it is installed, and prepare to configure the new
-version of `gcc' you'll be building so that it installs over the
-existing version of `gcc'.
-
- You might want to back up your existing copy of `bin/gcc', and the
-entire `lib/' directory, before you perform the actual installation (as
-described in this manual).
-
- Existing `gcc' installations typically are found in `/usr' or
-`/usr/local'. If you aren't certain where the currently installed
-version of `gcc' and its related programs reside, look at the output of
-this command:
-
- gcc -v -o /tmp/delete-me -xc /dev/null -xnone
-
- All sorts of interesting information on the locations of various
-`gcc'-related programs and data files should be visible in the output
-of the above command. (The output also is likely to include a
-diagnostic from the linker, since there's no `main_()' function.)
-However, you do have to sift through it yourself; `gcc' currently
-provides no easy way to ask it where it is installed and where it looks
-for the various programs and data files it calls on to do its work.
-
- Just *building* `g77' should not overwrite any installed
-programs--but, usually, after you build `g77', you will want to install
-it, so backing up anything it might overwrite is a good idea. (This is
-true for any package, not just `g77', though in this case it is
-intentional that `g77' overwrites `gcc' if it is already installed--it
-is unusual that the installation process for one distribution
-intentionally overwrites a program or file installed by another
-distribution.)
-
- Another reason to back up the existing version first, or make sure
-you can restore it easily, is that it might be an older version on
-which other users have come to depend for certain behaviors. However,
-even the new version of `gcc' you install will offer users the ability
-to specify an older version of the actual compilation programs if
-desired, and these older versions need not include any `g77' components.
-*Note Specifying Target Machine and Compiler Version: (gcc)Target
-Options, for information on the `-V' option of `gcc'.
-
-
-File: g77.info, Node: Configuring gcc, Next: Building gcc, Prev: Where to Install, Up: Complete Installation
-
-Configuring GNU CC
-------------------
-
- `g77' is configured automatically when you configure `gcc'. There
-are two parts of `g77' that are configured in two different
-ways--`g77', which "camps on" to the `gcc' configuration mechanism, and
-`libf2c', which uses a variation of the GNU `autoconf' configuration
-system.
-
- Generally, you shouldn't have to be concerned with either `g77' or
-`libf2c' configuration, unless you're configuring `g77' as a
-cross-compiler. In this case, the `libf2c' configuration, and possibly
-the `g77' and `gcc' configurations as well, might need special
-attention. (This also might be the case if you're porting `gcc' to a
-whole new system--even if it is just a new operating system on an
-existing, supported CPU.)
-
- To configure the system, see *Note Installing GNU CC:
-(gcc)Installation, following the instructions for running `./configure'.
-Pay special attention to the `--prefix=' option, which you almost
-certainly will need to specify.
-
- (Note that `gcc' installation information is provided as a straight
-text file in `gcc/INSTALL'.)
-
- The information printed by the invocation of `./configure' should
-show that the `f' directory (the Fortran language) has been configured.
-If it does not, there is a problem.
-
- *Note:* Configuring with the `--srcdir' argument is known to work
-with GNU `make', but it is not known to work with other variants of
-`make'. Irix5.2 and SunOS4.1 versions of `make' definitely won't work
-outside the source directory at present. `g77''s portion of the
-`configure' script issues a warning message about this when you
-configure for building binaries outside the source directory.
-
-
-File: g77.info, Node: Building gcc, Next: Pre-installation Checks, Prev: Configuring gcc, Up: Complete Installation
-
-Building GNU CC
----------------
-
- Building `g77' requires building enough of `gcc' that these
-instructions assume you're going to build all of `gcc', including
-`g++', `protoize', and so on. You can save a little time and disk
-space by changes the `LANGUAGES' macro definition in `gcc/Makefile.in'
-or `gcc/Makefile', but if you do that, you're on your own. One change
-is almost *certainly* going to cause failures: removing `c' or `f77'
-from the definition of the `LANGUAGES' macro.
-
- After configuring `gcc', which configures `g77' and `libf2c'
-automatically, you're ready to start the actual build by invoking
-`make'.
-
- *Note:* You *must* have run `./configure' before you run `make',
-even if you're using an already existing `gcc' development directory,
-because `./configure' does the work to recognize that you've added
-`g77' to the configuration.
-
- There are two general approaches to building GNU CC from scratch:
-
-"bootstrap"
- This method uses minimal native system facilities to build a
- barebones, unoptimized `gcc', that is then used to compile
- ("bootstrap") the entire system.
-
-"straight"
- This method assumes a more complete native system exists, and uses
- that just once to build the entire system.
-
- On all systems without a recent version of `gcc' already installed,
-the bootstrap method must be used. In particular, `g77' uses
-extensions to the C language offered, apparently, only by `gcc'.
-
- On most systems with a recent version of `gcc' already installed,
-the straight method can be used. This is an advantage, because it
-takes less CPU time and disk space for the build. However, it does
-require that the system have fairly recent versions of many GNU
-programs and other programs, which are not enumerated here.
-
-* Menu:
-
-* Bootstrap Build:: For all systems.
-* Straight Build:: For systems with a recent version of `gcc'.
-
diff --git a/gcc/f/g77.info-14 b/gcc/f/g77.info-14
index 457710ff475..c3aec8a7933 100644
--- a/gcc/f/g77.info-14
+++ b/gcc/f/g77.info-14
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,259 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Installing f2c, Next: Patching GNU Fortran, Prev: Installing f77, Up: Complete Installation
+
+Installing `f2c'
+----------------
+
+ Currently, `g77' does not include `f2c' itself in its distribution.
+However, it does include a modified version of the `libf2c'. This
+version is normally compatible with `f2c', but has been modified to
+meet the needs of `g77' in ways that might possibly be incompatible
+with some versions or configurations of `f2c'.
+
+ Decide how installation of `g77' should affect any existing
+installation of `f2c' on your system.
+
+ If you do not have `f2c' on your system (e.g. no `/usr/bin/f2c', no
+`/usr/include/f2c.h', and no `/usr/lib/libf2c.a', `/usr/lib/libF77.a',
+or `/usr/lib/libI77.a'), you don't need to be concerned with this item.
+
+ If you do have `f2c' on your system, you need to decide how users of
+`f2c' will be affected by your installing `g77'. Since `g77' is
+currently designed to be object-code-compatible with `f2c' (with very
+few, clear exceptions), users of `f2c' might want to combine
+`f2c'-compiled object files with `g77'-compiled object files in a
+single executable.
+
+ To do this, users of `f2c' should use the same copies of `f2c.h' and
+`libf2c.a' that `g77' uses (and that get built as part of `g77').
+
+ If you do nothing here, the `g77' installation process will not
+overwrite the `include/f2c.h' and `lib/libf2c.a' files with its own
+versions, and in fact will not even install `libf2c.a' for use with the
+newly installed versions of `gcc' and `g77' if it sees that
+`lib/libf2c.a' exists--instead, it will print an explanatory message
+and skip this part of the installation.
+
+ To install `g77''s versions of `f2c.h' and `libf2c.a' in the
+appropriate places, create the file `f2c-install-ok' (e.g. via the UNIX
+command `touch f2c-install-ok') in the source or build top-level
+directory (the same directory in which the `g77' `f' directory resides,
+not the `f' directory itself), or edit `gcc/f/Make-lang.in' and change
+the definition of the `F2C_INSTALL_FLAG' macro appropriately.
+
+ Usually, this means that, after typing `cd gcc', you would type
+`touch f2c-install-ok'.
+
+ Make sure that when you enable the overwriting of `f2c.h' and
+`libf2c.a' as used by `f2c', you have a recent and properly configured
+version of `bin/f2c' so that it generates code that is compatible with
+`g77'.
+
+ If you don't want installation of `g77' to overwrite `f2c''s existing
+installation, but you do want `g77' installation to proceed with
+installation of its own versions of `f2c.h' and `libf2c.a' in places
+where `g77' will pick them up (even when linking `f2c'-compiled object
+files--which might lead to incompatibilities), create the file
+`f2c-exists-ok' (e.g. via the UNIX command `touch f2c-exists-ok') in
+the source or build top-level directory, or edit `gcc/f/Make-lang.in'
+and change the definition of the `F2CLIBOK' macro appropriately.
+
+
+File: g77.info, Node: Patching GNU Fortran, Next: Where to Install, Prev: Installing f2c, Up: Complete Installation
+
+Patching GNU Fortran
+--------------------
+
+ If you're using a SunOS4 system, you'll need to make the following
+change to `gcc/f/proj.h': edit the line reading
+
+ #define FFEPROJ_STRTOUL 1 ...
+
+by replacing the `1' with `0'. Or, you can avoid editing the source by
+adding
+ CFLAGS='-DFFEPROJ_STRTOUL=0 -g -O'
+ to the command line for `make' when you invoke it. (`-g' is the
+default for `CFLAGS'.)
+
+ This causes a minimal version of `strtoul()' provided as part of the
+`g77' distribution to be compiled and linked into whatever `g77'
+programs need it, since some systems (like SunOS4 with only the bundled
+compiler and its runtime) do not provide this function in their system
+libraries.
+
+ Similarly, a minimal version of `bsearch()' is available and can be
+enabled by editing a line similar to the one for `strtoul()' above in
+`gcc/f/proj.h', if your system libraries lack `bsearch()'. The method
+of overriding `X_CFLAGS' may also be used.
+
+ These are not problems with `g77', which requires an ANSI C
+environment. You should upgrade your system to one that provides a
+full ANSI C environment, or encourage the maintainers of `gcc' to
+provide one to all `gcc'-based compilers in future `gcc' distributions.
+
+ *Note Problems Installing::, for more information on why `strtoul()'
+comes up missing and on approaches to dealing with this problem that
+have already been tried.
+
+
+File: g77.info, Node: Where to Install, Next: Configuring gcc, Prev: Patching GNU Fortran, Up: Complete Installation
+
+Where in the World Does Fortran (and GNU CC) Go?
+------------------------------------------------
+
+ Before configuring, you should make sure you know where you want the
+`g77' and `gcc' binaries to be installed after they're built, because
+this information is given to the configuration tool and used during the
+build itself.
+
+ A `g77' installation necessarily requires installation of a
+`g77'-aware version of `gcc', so that the `gcc' command recognizes
+Fortran source files and knows how to compile them.
+
+ For this to work, the version of `gcc' that you will be building as
+part of `g77' *must* be installed as the "active" version of `gcc' on
+the system.
+
+ Sometimes people make the mistake of installing `gcc' as
+`/usr/local/bin/gcc', leaving an older, non-Fortran-aware version in
+`/usr/bin/gcc'. (Or, the opposite happens.) This can result in `g77'
+being unable to compile Fortran source files, because when it calls on
+`gcc' to do the actual compilation, `gcc' complains that it does not
+recognize the language, or the file name suffix.
+
+ So, determine whether `gcc' already is installed on your system,
+and, if so, *where* it is installed, and prepare to configure the new
+version of `gcc' you'll be building so that it installs over the
+existing version of `gcc'.
+
+ You might want to back up your existing copy of `bin/gcc', and the
+entire `lib/' directory, before you perform the actual installation (as
+described in this manual).
+
+ Existing `gcc' installations typically are found in `/usr' or
+`/usr/local'. If you aren't certain where the currently installed
+version of `gcc' and its related programs reside, look at the output of
+this command:
+
+ gcc -v -o /tmp/delete-me -xc /dev/null -xnone
+
+ All sorts of interesting information on the locations of various
+`gcc'-related programs and data files should be visible in the output
+of the above command. (The output also is likely to include a
+diagnostic from the linker, since there's no `main_()' function.)
+However, you do have to sift through it yourself; `gcc' currently
+provides no easy way to ask it where it is installed and where it looks
+for the various programs and data files it calls on to do its work.
+
+ Just *building* `g77' should not overwrite any installed
+programs--but, usually, after you build `g77', you will want to install
+it, so backing up anything it might overwrite is a good idea. (This is
+true for any package, not just `g77', though in this case it is
+intentional that `g77' overwrites `gcc' if it is already installed--it
+is unusual that the installation process for one distribution
+intentionally overwrites a program or file installed by another
+distribution.)
+
+ Another reason to back up the existing version first, or make sure
+you can restore it easily, is that it might be an older version on
+which other users have come to depend for certain behaviors. However,
+even the new version of `gcc' you install will offer users the ability
+to specify an older version of the actual compilation programs if
+desired, and these older versions need not include any `g77' components.
+*Note Specifying Target Machine and Compiler Version: (gcc)Target
+Options, for information on the `-V' option of `gcc'.
+
+
+File: g77.info, Node: Configuring gcc, Next: Building gcc, Prev: Where to Install, Up: Complete Installation
+
+Configuring GNU CC
+------------------
+
+ `g77' is configured automatically when you configure `gcc'. There
+are two parts of `g77' that are configured in two different
+ways--`g77', which "camps on" to the `gcc' configuration mechanism, and
+`libf2c', which uses a variation of the GNU `autoconf' configuration
+system.
+
+ Generally, you shouldn't have to be concerned with either `g77' or
+`libf2c' configuration, unless you're configuring `g77' as a
+cross-compiler. In this case, the `libf2c' configuration, and possibly
+the `g77' and `gcc' configurations as well, might need special
+attention. (This also might be the case if you're porting `gcc' to a
+whole new system--even if it is just a new operating system on an
+existing, supported CPU.)
+
+ To configure the system, see *Note Installing GNU CC:
+(gcc)Installation, following the instructions for running `./configure'.
+Pay special attention to the `--prefix=' option, which you almost
+certainly will need to specify.
+
+ (Note that `gcc' installation information is provided as a straight
+text file in `gcc/INSTALL'.)
+
+ The information printed by the invocation of `./configure' should
+show that the `f' directory (the Fortran language) has been configured.
+If it does not, there is a problem.
+
+ *Note:* Configuring with the `--srcdir' argument is known to work
+with GNU `make', but it is not known to work with other variants of
+`make'. Irix5.2 and SunOS4.1 versions of `make' definitely won't work
+outside the source directory at present. `g77''s portion of the
+`configure' script issues a warning message about this when you
+configure for building binaries outside the source directory.
+
+
+File: g77.info, Node: Building gcc, Next: Pre-installation Checks, Prev: Configuring gcc, Up: Complete Installation
+
+Building GNU CC
+---------------
+
+ Building `g77' requires building enough of `gcc' that these
+instructions assume you're going to build all of `gcc', including
+`g++', `protoize', and so on. You can save a little time and disk
+space by changes the `LANGUAGES' macro definition in `gcc/Makefile.in'
+or `gcc/Makefile', but if you do that, you're on your own. One change
+is almost *certainly* going to cause failures: removing `c' or `f77'
+from the definition of the `LANGUAGES' macro.
+
+ After configuring `gcc', which configures `g77' and `libf2c'
+automatically, you're ready to start the actual build by invoking
+`make'.
+
+ *Note:* You *must* have run `./configure' before you run `make',
+even if you're using an already existing `gcc' development directory,
+because `./configure' does the work to recognize that you've added
+`g77' to the configuration.
+
+ There are two general approaches to building GNU CC from scratch:
+
+"bootstrap"
+ This method uses minimal native system facilities to build a
+ barebones, unoptimized `gcc', that is then used to compile
+ ("bootstrap") the entire system.
+
+"straight"
+ This method assumes a more complete native system exists, and uses
+ that just once to build the entire system.
+
+ On all systems without a recent version of `gcc' already installed,
+the bootstrap method must be used. In particular, `g77' uses
+extensions to the C language offered, apparently, only by `gcc'.
+
+ On most systems with a recent version of `gcc' already installed,
+the straight method can be used. This is an advantage, because it
+takes less CPU time and disk space for the build. However, it does
+require that the system have fairly recent versions of many GNU
+programs and other programs, which are not enumerated here.
+
+* Menu:
+
+* Bootstrap Build:: For all systems.
+* Straight Build:: For systems with a recent version of `gcc'.
+
+
File: g77.info, Node: Bootstrap Build, Next: Straight Build, Up: Building gcc
Bootstrap Build
@@ -126,46 +379,46 @@ them when they work:
sh# cd /usr/src/gcc
sh# ./g77 --driver=./xgcc -B./ -v
- g77 version 0.5.21
+ g77 version 0.5.22
./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 ...
Reading specs from ./specs
- gcc version 2.7.2.3.f.1
+ gcc version 2.7.2.3.f.2
./cpp -lang-c -v -isystem ./include -undef ...
- GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ GNU CPP version 2.7.2.3.f.2 (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.2/include
/usr/include
End of search list.
./f771 /tmp/cca18048.i -fset-g77-defaults -quiet -dumpbase ...
- GNU F77 version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
- GNU Fortran Front End version 0.5.21 compiled: ...
+ GNU F77 version 2.7.2.3.f.2 (Linux/Alpha) compiled ...
+ GNU Fortran Front End version 0.5.22 compiled: ...
as -nocpp -o /tmp/cca180481.o /tmp/cca18048.s
ld -G 8 -O1 -o /tmp/gfa18047 /usr/lib/crt0.o -L. ...
- __G77_LIBF77_VERSION__: 0.5.21
+ __G77_LIBF77_VERSION__: 0.5.22
@(#)LIBF77 VERSION 19970404
- __G77_LIBI77_VERSION__: 0.5.21
+ __G77_LIBI77_VERSION__: 0.5.22
@(#) LIBI77 VERSION pjw,dmg-mods 19970816
- __G77_LIBU77_VERSION__: 0.5.21
+ __G77_LIBU77_VERSION__: 0.5.22
@(#) LIBU77 VERSION 19970609
sh# ./xgcc -B./ -v -o /tmp/delete-me -xc /dev/null -xnone
Reading specs from ./specs
- gcc version 2.7.2.3.f.1
+ gcc version 2.7.2.3.f.2
./cpp -lang-c -v -isystem ./include -undef ...
- GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+ GNU CPP version 2.7.2.3.f.2 (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/include
+ /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.2/include
/usr/include
End of search list.
./cc1 /tmp/cca18063.i -quiet -dumpbase null.c -version ...
- GNU C version 2.7.2.3.f.1 (Linux/Alpha) compiled ...
+ GNU C version 2.7.2.3.f.2 (Linux/Alpha) compiled ...
as -nocpp -o /tmp/cca180631.o /tmp/cca18063.s
ld -G 8 -O1 -o /tmp/delete-me /usr/lib/crt0.o -L. ...
/usr/lib/crt0.o: In function `__start':
@@ -426,12 +679,11 @@ general) are broken, at least for their system.
Finally, *please* ask for bug reports to go to you first, at least
until you're sure your distribution is widely used and has been well
tested. This especially goes for those of you making any changes to
-the `g77' sources to port `g77', e.g. to OS/2.
-<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 user. Once you are quite
-certain a bug report does not involve your efforts, you can forward it
-to us.
+the `g77' sources to port `g77', e.g. to OS/2. <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 user. Once you are quite certain a bug report does not
+involve your efforts, you can forward it to us.

File: g77.info, Node: Debugging and Interfacing, Next: Collected Fortran Wisdom, Prev: Installation, Up: Top
@@ -855,291 +1107,3 @@ afterward. (In `gdb', this is accomplished via `set lang c' and either
debugging problem, but is known to cause other problems like compiler
crashes and generation of incorrect code, so it is not recommended.
-
-File: g77.info, Node: Arrays, Next: Adjustable Arrays, Prev: Complex Variables, Up: Debugging and Interfacing
-
-Arrays (DIMENSION)
-==================
-
- Fortran uses "column-major ordering" in its arrays. This differs
-from other languages, such as C, which use "row-major ordering". The
-difference is that, with Fortran, array elements adjacent to each other
-in memory differ in the *first* subscript instead of the last;
-`A(5,10,20)' immediately follows `A(4,10,20)', whereas with row-major
-ordering it would follow `A(5,10,19)'.
-
- This consideration affects not only interfacing with and debugging
-Fortran code, it can greatly affect how code is designed and written,
-especially when code speed and size is a concern.
-
- Fortran also differs from C, a popular language for interfacing and
-to support directly in debuggers, in the way arrays are treated. In C,
-arrays are single-dimensional and have interesting relationships to
-pointers, neither of which is true for Fortran. As a result, dealing
-with Fortran arrays from within an environment limited to C concepts
-can be challenging.
-
- For example, accessing the array element `A(5,10,20)' is easy enough
-in Fortran (use `A(5,10,20)'), but in C some difficult machinations are
-needed. First, C would treat the A array as a single-dimension array.
-Second, C does not understand low bounds for arrays as does Fortran.
-Third, C assumes a low bound of zero (0), while Fortran defaults to a
-low bound of one (1) and can supports an arbitrary low bound.
-Therefore, calculations must be done to determine what the C equivalent
-of `A(5,10,20)' would be, and these calculations require knowing the
-dimensions of `A'.
-
- For `DIMENSION A(2:11,21,0:29)', the calculation of the offset of
-`A(5,10,20)' would be:
-
- (5-2)
- + (10-1)*(11-2+1)
- + (20-0)*(11-2+1)*(21-1+1)
- = 4293
-
-So the C equivalent in this case would be `a[4293]'.
-
- When using a debugger directly on Fortran code, the C equivalent
-might not work, because some debuggers cannot understand the notion of
-low bounds other than zero. However, unlike `f2c', `g77' does inform
-the GBE that a multi-dimensional array (like `A' in the above example)
-is really multi-dimensional, rather than a single-dimensional array, so
-at least the dimensionality of the array is preserved.
-
- Debuggers that understand Fortran should have no trouble with
-non-zero low bounds, but for non-Fortran debuggers, especially C
-debuggers, the above example might have a C equivalent of `a[4305]'.
-This calculation is arrived at by eliminating the subtraction of the
-lower bound in the first parenthesized expression on each line--that
-is, for `(5-2)' substitute `(5)', for `(10-1)' substitute `(10)', and
-for `(20-0)' substitute `(20)'. Actually, the implication of this can
-be that the expression `*(&a[2][1][0] + 4293)' works fine, but that
-`a[20][10][5]' produces the equivalent of `*(&a[0][0][0] + 4305)'
-because of the missing lower bounds.
-
- Come to think of it, perhaps the behavior is due to the debugger
-internally compensating for the lower bounds by offsetting the base
-address of `a', leaving `&a' set lower, in this case, than
-`&a[2][1][0]' (the address of its first element as identified by
-subscripts equal to the corresponding lower bounds).
-
- You know, maybe nobody really needs to use arrays.
-
-
-File: g77.info, Node: Adjustable Arrays, Next: Alternate Entry Points, Prev: Arrays, Up: Debugging and Interfacing
-
-Adjustable Arrays (DIMENSION)
-=============================
-
- Adjustable and automatic arrays in Fortran require the implementation
-(in this case, the `g77' compiler) to "memorize" the expressions that
-dimension the arrays each time the procedure is invoked. This is so
-that subsequent changes to variables used in those expressions, made
-during execution of the procedure, do not have any effect on the
-dimensions of those arrays.
-
- For example:
-
- REAL ARRAY(5)
- DATA ARRAY/5*2/
- CALL X(ARRAY, 5)
- END
- SUBROUTINE X(A, N)
- DIMENSION A(N)
- N = 20
- PRINT *, N, A
- END
-
-Here, the implementation should, when running the program, print
-something like:
-
- 20 2. 2. 2. 2. 2.
-
-Note that this shows that while the value of `N' was successfully
-changed, the size of the `A' array remained at 5 elements.
-
- To support this, `g77' generates code that executes before any user
-code (and before the internally generated computed `GOTO' to handle
-alternate entry points, as described below) that evaluates each
-(nonconstant) expression in the list of subscripts for an array, and
-saves the result of each such evaluation to be used when determining
-the size of the array (instead of re-evaluating the expressions).
-
- So, in the above example, when `X' is first invoked, code is
-executed that copies the value of `N' to a temporary. And that same
-temporary serves as the actual high bound for the single dimension of
-the `A' array (the low bound being the constant 1). Since the user
-program cannot (legitimately) change the value of the temporary during
-execution of the procedure, the size of the array remains constant
-during each invocation.
-
- For alternate entry points, the code `g77' generates takes into
-account the possibility that a dummy adjustable array is not actually
-passed to the actual entry point being invoked at that time. In that
-case, the public procedure implementing the entry point passes to the
-master private procedure implementing all the code for the entry points
-a `NULL' pointer where a pointer to that adjustable array would be
-expected. The `g77'-generated code doesn't attempt to evaluate any of
-the expressions in the subscripts for an array if the pointer to that
-array is `NULL' at run time in such cases. (Don't depend on this
-particular implementation by writing code that purposely passes `NULL'
-pointers where the callee expects adjustable arrays, even if you know
-the callee won't reference the arrays--nor should you pass `NULL'
-pointers for any dummy arguments used in calculating the bounds of such
-arrays or leave undefined any values used for that purpose in
-COMMON--because the way `g77' implements these things might change in
-the future!)
-
-
-File: g77.info, Node: Alternate Entry Points, Next: Alternate Returns, Prev: Adjustable Arrays, Up: Debugging and Interfacing
-
-Alternate Entry Points (ENTRY)
-==============================
-
- The GBE does not understand the general concept of alternate entry
-points as Fortran provides via the ENTRY statement. `g77' gets around
-this by using an approach to compiling procedures having at least one
-`ENTRY' statement that is almost identical to the approach used by
-`f2c'. (An alternate approach could be used that would probably
-generate faster, but larger, code that would also be a bit easier to
-debug.)
-
- Information on how `g77' implements `ENTRY' is provided for those
-trying to debug such code. The choice of implementation seems unlikely
-to affect code (compiled in other languages) that interfaces to such
-code.
-
- `g77' compiles exactly one public procedure for the primary entry
-point of a procedure plus each `ENTRY' point it specifies, as usual.
-That is, in terms of the public interface, there is no difference
-between
-
- SUBROUTINE X
- END
- SUBROUTINE Y
- END
-
-and:
-
- SUBROUTINE X
- ENTRY Y
- END
-
- The difference between the above two cases lies in the code compiled
-for the `X' and `Y' procedures themselves, plus the fact that, for the
-second case, an extra internal procedure is compiled.
-
- For every Fortran procedure with at least one `ENTRY' statement,
-`g77' compiles an extra procedure named `__g77_masterfun_X', where X is
-the name of the primary entry point (which, in the above case, using
-the standard compiler options, would be `x_' in C).
-
- This extra procedure is compiled as a private procedure--that is, a
-procedure not accessible by name to separately compiled modules. It
-contains all the code in the program unit, including the code for the
-primary entry point plus for every entry point. (The code for each
-public procedure is quite short, and explained later.)
-
- The extra procedure has some other interesting characteristics.
-
- The argument list for this procedure is invented by `g77'. It
-contains a single integer argument named `__g77_which_entrypoint',
-passed by value (as in Fortran's `%VAL()' intrinsic), specifying the
-entry point index--0 for the primary entry point, 1 for the first entry
-point (the first `ENTRY' statement encountered), 2 for the second entry
-point, and so on.
-
- It also contains, for functions returning `CHARACTER' and (when
-`-ff2c' is in effect) `COMPLEX' functions, and for functions returning
-different types among the `ENTRY' statements (e.g. `REAL FUNCTION R()'
-containing `ENTRY I()'), an argument named `__g77_result' that is
-expected at run time to contain a pointer to where to store the result
-of the entry point. For `CHARACTER' functions, this storage area is an
-array of the appropriate number of characters; for `COMPLEX' functions,
-it is the appropriate area for the return type; for
-multiple-return-type functions, it is a union of all the supported
-return types (which cannot include `CHARACTER', since combining
-`CHARACTER' and non-`CHARACTER' return types via `ENTRY' in a single
-function is not supported by `g77').
-
- For `CHARACTER' functions, the `__g77_result' argument is followed
-by yet another argument named `__g77_length' that, at run time,
-specifies the caller's expected length of the returned value. Note
-that only `CHARACTER*(*)' functions and entry points actually make use
-of this argument, even though it is always passed by all callers of
-public `CHARACTER' functions (since the caller does not generally know
-whether such a function is `CHARACTER*(*)' or whether there are any
-other callers that don't have that information).
-
- The rest of the argument list is the union of all the arguments
-specified for all the entry points (in their usual forms, e.g.
-`CHARACTER' arguments have extra length arguments, all appended at the
-end of this list). This is considered the "master list" of arguments.
-
- The code for this procedure has, before the code for the first
-executable statement, code much like that for the following Fortran
-statement:
-
- GOTO (100000,100001,100002), __g77_which_entrypoint
- 100000 ...code for primary entry point...
- 100001 ...code immediately following first ENTRY statement...
- 100002 ...code immediately following second ENTRY statement...
-
-(Note that invalid Fortran statement labels and variable names are used
-in the above example to highlight the fact that it represents code
-generated by the `g77' internals, not code to be written by the user.)
-
- It is this code that, when the procedure is called, picks which
-entry point to start executing.
-
- Getting back to the public procedures (`x' and `Y' in the original
-example), those procedures are fairly simple. Their interfaces are
-just like they would be if they were self-contained procedures (without
-`ENTRY'), of course, since that is what the callers expect. Their code
-consists of simply calling the private procedure, described above, with
-the appropriate extra arguments (the entry point index, and perhaps a
-pointer to a multiple-type- return variable, local to the public
-procedure, that contains all the supported returnable non-character
-types). For arguments that are not listed for a given entry point that
-are listed for other entry points, and therefore that are in the
-"master list" for the private procedure, null pointers (in C, the
-`NULL' macro) are passed. Also, for entry points that are part of a
-multiple-type- returning function, code is compiled after the call of
-the private procedure to extract from the multi-type union the
-appropriate result, depending on the type of the entry point in
-question, returning that result to the original caller.
-
- When debugging a procedure containing alternate entry points, you
-can either set a break point on the public procedure itself (e.g. a
-break point on `X' or `Y') or on the private procedure that contains
-most of the pertinent code (e.g. `__g77_masterfun_X'). If you do the
-former, you should use the debugger's command to "step into" the called
-procedure to get to the actual code; with the latter approach, the
-break point leaves you right at the actual code, skipping over the
-public entry point and its call to the private procedure (unless you
-have set a break point there as well, of course).
-
- Further, the list of dummy arguments that is visible when the
-private procedure is active is going to be the expanded version of the
-list for whichever particular entry point is active, as explained
-above, and the way in which return values are handled might well be
-different from how they would be handled for an equivalent single-entry
-function.
-
-
-File: g77.info, Node: Alternate Returns, Next: Assigned Statement Labels, Prev: Alternate Entry Points, Up: Debugging and Interfacing
-
-Alternate Returns (SUBROUTINE and RETURN)
-=========================================
-
- Subroutines with alternate returns (e.g. `SUBROUTINE X(*)' and `CALL
-X(*50)') are implemented by `g77' as functions returning the C `int'
-type. The actual alternate-return arguments are omitted from the
-calling sequence. Instead, the caller uses the return value to do a
-rough equivalent of the Fortran computed-`GOTO' statement, as in `GOTO
-(50), X()' in the example above (where `X' is quietly declared as an
-`INTEGER(KIND=1)' function), and the callee just returns whatever
-integer is specified in the `RETURN' statement for the subroutine For
-example, `RETURN 1' is implemented as `X = 1' followed by `RETURN' in
-C, and `RETURN' by itself is `X = 0' and `RETURN').
-
diff --git a/gcc/f/g77.info-15 b/gcc/f/g77.info-15
index ee5d1a40d21..d020587520c 100644
--- a/gcc/f/g77.info-15
+++ b/gcc/f/g77.info-15
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,294 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Arrays, Next: Adjustable Arrays, Prev: Complex Variables, Up: Debugging and Interfacing
+
+Arrays (DIMENSION)
+==================
+
+ Fortran uses "column-major ordering" in its arrays. This differs
+from other languages, such as C, which use "row-major ordering". The
+difference is that, with Fortran, array elements adjacent to each other
+in memory differ in the *first* subscript instead of the last;
+`A(5,10,20)' immediately follows `A(4,10,20)', whereas with row-major
+ordering it would follow `A(5,10,19)'.
+
+ This consideration affects not only interfacing with and debugging
+Fortran code, it can greatly affect how code is designed and written,
+especially when code speed and size is a concern.
+
+ Fortran also differs from C, a popular language for interfacing and
+to support directly in debuggers, in the way arrays are treated. In C,
+arrays are single-dimensional and have interesting relationships to
+pointers, neither of which is true for Fortran. As a result, dealing
+with Fortran arrays from within an environment limited to C concepts
+can be challenging.
+
+ For example, accessing the array element `A(5,10,20)' is easy enough
+in Fortran (use `A(5,10,20)'), but in C some difficult machinations are
+needed. First, C would treat the A array as a single-dimension array.
+Second, C does not understand low bounds for arrays as does Fortran.
+Third, C assumes a low bound of zero (0), while Fortran defaults to a
+low bound of one (1) and can supports an arbitrary low bound.
+Therefore, calculations must be done to determine what the C equivalent
+of `A(5,10,20)' would be, and these calculations require knowing the
+dimensions of `A'.
+
+ For `DIMENSION A(2:11,21,0:29)', the calculation of the offset of
+`A(5,10,20)' would be:
+
+ (5-2)
+ + (10-1)*(11-2+1)
+ + (20-0)*(11-2+1)*(21-1+1)
+ = 4293
+
+So the C equivalent in this case would be `a[4293]'.
+
+ When using a debugger directly on Fortran code, the C equivalent
+might not work, because some debuggers cannot understand the notion of
+low bounds other than zero. However, unlike `f2c', `g77' does inform
+the GBE that a multi-dimensional array (like `A' in the above example)
+is really multi-dimensional, rather than a single-dimensional array, so
+at least the dimensionality of the array is preserved.
+
+ Debuggers that understand Fortran should have no trouble with
+non-zero low bounds, but for non-Fortran debuggers, especially C
+debuggers, the above example might have a C equivalent of `a[4305]'.
+This calculation is arrived at by eliminating the subtraction of the
+lower bound in the first parenthesized expression on each line--that
+is, for `(5-2)' substitute `(5)', for `(10-1)' substitute `(10)', and
+for `(20-0)' substitute `(20)'. Actually, the implication of this can
+be that the expression `*(&a[2][1][0] + 4293)' works fine, but that
+`a[20][10][5]' produces the equivalent of `*(&a[0][0][0] + 4305)'
+because of the missing lower bounds.
+
+ Come to think of it, perhaps the behavior is due to the debugger
+internally compensating for the lower bounds by offsetting the base
+address of `a', leaving `&a' set lower, in this case, than
+`&a[2][1][0]' (the address of its first element as identified by
+subscripts equal to the corresponding lower bounds).
+
+ You know, maybe nobody really needs to use arrays.
+
+
+File: g77.info, Node: Adjustable Arrays, Next: Alternate Entry Points, Prev: Arrays, Up: Debugging and Interfacing
+
+Adjustable Arrays (DIMENSION)
+=============================
+
+ Adjustable and automatic arrays in Fortran require the implementation
+(in this case, the `g77' compiler) to "memorize" the expressions that
+dimension the arrays each time the procedure is invoked. This is so
+that subsequent changes to variables used in those expressions, made
+during execution of the procedure, do not have any effect on the
+dimensions of those arrays.
+
+ For example:
+
+ REAL ARRAY(5)
+ DATA ARRAY/5*2/
+ CALL X(ARRAY, 5)
+ END
+ SUBROUTINE X(A, N)
+ DIMENSION A(N)
+ N = 20
+ PRINT *, N, A
+ END
+
+Here, the implementation should, when running the program, print
+something like:
+
+ 20 2. 2. 2. 2. 2.
+
+Note that this shows that while the value of `N' was successfully
+changed, the size of the `A' array remained at 5 elements.
+
+ To support this, `g77' generates code that executes before any user
+code (and before the internally generated computed `GOTO' to handle
+alternate entry points, as described below) that evaluates each
+(nonconstant) expression in the list of subscripts for an array, and
+saves the result of each such evaluation to be used when determining
+the size of the array (instead of re-evaluating the expressions).
+
+ So, in the above example, when `X' is first invoked, code is
+executed that copies the value of `N' to a temporary. And that same
+temporary serves as the actual high bound for the single dimension of
+the `A' array (the low bound being the constant 1). Since the user
+program cannot (legitimately) change the value of the temporary during
+execution of the procedure, the size of the array remains constant
+during each invocation.
+
+ For alternate entry points, the code `g77' generates takes into
+account the possibility that a dummy adjustable array is not actually
+passed to the actual entry point being invoked at that time. In that
+case, the public procedure implementing the entry point passes to the
+master private procedure implementing all the code for the entry points
+a `NULL' pointer where a pointer to that adjustable array would be
+expected. The `g77'-generated code doesn't attempt to evaluate any of
+the expressions in the subscripts for an array if the pointer to that
+array is `NULL' at run time in such cases. (Don't depend on this
+particular implementation by writing code that purposely passes `NULL'
+pointers where the callee expects adjustable arrays, even if you know
+the callee won't reference the arrays--nor should you pass `NULL'
+pointers for any dummy arguments used in calculating the bounds of such
+arrays or leave undefined any values used for that purpose in
+COMMON--because the way `g77' implements these things might change in
+the future!)
+
+
+File: g77.info, Node: Alternate Entry Points, Next: Alternate Returns, Prev: Adjustable Arrays, Up: Debugging and Interfacing
+
+Alternate Entry Points (ENTRY)
+==============================
+
+ The GBE does not understand the general concept of alternate entry
+points as Fortran provides via the ENTRY statement. `g77' gets around
+this by using an approach to compiling procedures having at least one
+`ENTRY' statement that is almost identical to the approach used by
+`f2c'. (An alternate approach could be used that would probably
+generate faster, but larger, code that would also be a bit easier to
+debug.)
+
+ Information on how `g77' implements `ENTRY' is provided for those
+trying to debug such code. The choice of implementation seems unlikely
+to affect code (compiled in other languages) that interfaces to such
+code.
+
+ `g77' compiles exactly one public procedure for the primary entry
+point of a procedure plus each `ENTRY' point it specifies, as usual.
+That is, in terms of the public interface, there is no difference
+between
+
+ SUBROUTINE X
+ END
+ SUBROUTINE Y
+ END
+
+and:
+
+ SUBROUTINE X
+ ENTRY Y
+ END
+
+ The difference between the above two cases lies in the code compiled
+for the `X' and `Y' procedures themselves, plus the fact that, for the
+second case, an extra internal procedure is compiled.
+
+ For every Fortran procedure with at least one `ENTRY' statement,
+`g77' compiles an extra procedure named `__g77_masterfun_X', where X is
+the name of the primary entry point (which, in the above case, using
+the standard compiler options, would be `x_' in C).
+
+ This extra procedure is compiled as a private procedure--that is, a
+procedure not accessible by name to separately compiled modules. It
+contains all the code in the program unit, including the code for the
+primary entry point plus for every entry point. (The code for each
+public procedure is quite short, and explained later.)
+
+ The extra procedure has some other interesting characteristics.
+
+ The argument list for this procedure is invented by `g77'. It
+contains a single integer argument named `__g77_which_entrypoint',
+passed by value (as in Fortran's `%VAL()' intrinsic), specifying the
+entry point index--0 for the primary entry point, 1 for the first entry
+point (the first `ENTRY' statement encountered), 2 for the second entry
+point, and so on.
+
+ It also contains, for functions returning `CHARACTER' and (when
+`-ff2c' is in effect) `COMPLEX' functions, and for functions returning
+different types among the `ENTRY' statements (e.g. `REAL FUNCTION R()'
+containing `ENTRY I()'), an argument named `__g77_result' that is
+expected at run time to contain a pointer to where to store the result
+of the entry point. For `CHARACTER' functions, this storage area is an
+array of the appropriate number of characters; for `COMPLEX' functions,
+it is the appropriate area for the return type; for
+multiple-return-type functions, it is a union of all the supported
+return types (which cannot include `CHARACTER', since combining
+`CHARACTER' and non-`CHARACTER' return types via `ENTRY' in a single
+function is not supported by `g77').
+
+ For `CHARACTER' functions, the `__g77_result' argument is followed
+by yet another argument named `__g77_length' that, at run time,
+specifies the caller's expected length of the returned value. Note
+that only `CHARACTER*(*)' functions and entry points actually make use
+of this argument, even though it is always passed by all callers of
+public `CHARACTER' functions (since the caller does not generally know
+whether such a function is `CHARACTER*(*)' or whether there are any
+other callers that don't have that information).
+
+ The rest of the argument list is the union of all the arguments
+specified for all the entry points (in their usual forms, e.g.
+`CHARACTER' arguments have extra length arguments, all appended at the
+end of this list). This is considered the "master list" of arguments.
+
+ The code for this procedure has, before the code for the first
+executable statement, code much like that for the following Fortran
+statement:
+
+ GOTO (100000,100001,100002), __g77_which_entrypoint
+ 100000 ...code for primary entry point...
+ 100001 ...code immediately following first ENTRY statement...
+ 100002 ...code immediately following second ENTRY statement...
+
+(Note that invalid Fortran statement labels and variable names are used
+in the above example to highlight the fact that it represents code
+generated by the `g77' internals, not code to be written by the user.)
+
+ It is this code that, when the procedure is called, picks which
+entry point to start executing.
+
+ Getting back to the public procedures (`x' and `Y' in the original
+example), those procedures are fairly simple. Their interfaces are
+just like they would be if they were self-contained procedures (without
+`ENTRY'), of course, since that is what the callers expect. Their code
+consists of simply calling the private procedure, described above, with
+the appropriate extra arguments (the entry point index, and perhaps a
+pointer to a multiple-type- return variable, local to the public
+procedure, that contains all the supported returnable non-character
+types). For arguments that are not listed for a given entry point that
+are listed for other entry points, and therefore that are in the
+"master list" for the private procedure, null pointers (in C, the
+`NULL' macro) are passed. Also, for entry points that are part of a
+multiple-type- returning function, code is compiled after the call of
+the private procedure to extract from the multi-type union the
+appropriate result, depending on the type of the entry point in
+question, returning that result to the original caller.
+
+ When debugging a procedure containing alternate entry points, you
+can either set a break point on the public procedure itself (e.g. a
+break point on `X' or `Y') or on the private procedure that contains
+most of the pertinent code (e.g. `__g77_masterfun_X'). If you do the
+former, you should use the debugger's command to "step into" the called
+procedure to get to the actual code; with the latter approach, the
+break point leaves you right at the actual code, skipping over the
+public entry point and its call to the private procedure (unless you
+have set a break point there as well, of course).
+
+ Further, the list of dummy arguments that is visible when the
+private procedure is active is going to be the expanded version of the
+list for whichever particular entry point is active, as explained
+above, and the way in which return values are handled might well be
+different from how they would be handled for an equivalent single-entry
+function.
+
+
+File: g77.info, Node: Alternate Returns, Next: Assigned Statement Labels, Prev: Alternate Entry Points, Up: Debugging and Interfacing
+
+Alternate Returns (SUBROUTINE and RETURN)
+=========================================
+
+ Subroutines with alternate returns (e.g. `SUBROUTINE X(*)' and `CALL
+X(*50)') are implemented by `g77' as functions returning the C `int'
+type. The actual alternate-return arguments are omitted from the
+calling sequence. Instead, the caller uses the return value to do a
+rough equivalent of the Fortran computed-`GOTO' statement, as in `GOTO
+(50), X()' in the example above (where `X' is quietly declared as an
+`INTEGER(KIND=1)' function), and the callee just returns whatever
+integer is specified in the `RETURN' statement for the subroutine For
+example, `RETURN 1' is implemented as `X = 1' followed by `RETURN' in
+C, and `RETURN' by itself is `X = 0' and `RETURN').
+
+
File: g77.info, Node: Assigned Statement Labels, Next: Run-time Library Errors, Prev: Alternate Returns, Up: Debugging and Interfacing
Assigned Statement Labels (ASSIGN and GOTO)
@@ -876,300 +1164,3 @@ appropriate calls to flushing or non-flushing library routines.)
`g77' source tree so that a version of `libf2c' can be built and
installed with the `ALWAYS_FLUSH' macro defined.
-
-File: g77.info, Node: Large File Unit Numbers, Prev: Output Assumed To Flush, Up: Working Programs
-
-Large File Unit Numbers
------------------------
-
- If your program crashes at run time with a message including the
-text `illegal unit number', that probably is a message from the
-run-time library, `libf2c', used, and distributed with, `g77'.
-
- The message means that your program has attempted to use a file unit
-number that is out of the range accepted by `libf2c'. Normally, this
-range is 0 through 99, and the high end of the range is controlled by a
-`libf2c' source-file macro named `MXUNIT'.
-
- If you can easily change your program to use unit numbers in the
-range 0 through 99, you should do so.
-
- Otherwise, see *Note Larger File Unit Numbers::, for information on
-how to change `MXUNIT' in `libf2c' so you can build and install a new
-version of `libf2c' that supports the larger unit numbers you need.
-
- *Note:* While `libf2c' places a limit on the range of Fortran
-file-unit numbers, the underlying library and operating system might
-impose different kinds of limits. For example, some systems limit the
-number of files simultaneously open by a running program. Information
-on how to increase these limits should be found in your system's
-documentation.
-
-
-File: g77.info, Node: Overly Convenient Options, Next: Faster Programs, Prev: Working Programs, Up: Collected Fortran Wisdom
-
-Overly Convenient Command-line Options
-======================================
-
- These options should be used only as a quick-and-dirty way to
-determine how well your program will run under different compilation
-models without having to change the source. Some are more problematic
-than others, depending on how portable and maintainable you want the
-program to be (and, of course, whether you are allowed to change it at
-all is crucial).
-
- You should not continue to use these command-line options to compile
-a given program, but rather should make changes to the source code:
-
-`-finit-local-zero'
- (This option specifies that any uninitialized local variables and
- arrays have default initialization to binary zeros.)
-
- Many other compilers do this automatically, which means lots of
- Fortran code developed with those compilers depends on it.
-
- It is safer (and probably would produce a faster program) to find
- the variables and arrays that need such initialization and provide
- it explicitly via `DATA', so that `-finit-local-zero' is not
- needed.
-
- Consider using `-Wuninitialized' (which requires `-O') to find
- likely candidates, but do not specify `-finit-local-zero' or
- `-fno-automatic', or this technique won't work.
-
-`-fno-automatic'
- (This option specifies that all local variables and arrays are to
- be treated as if they were named in `SAVE' statements.)
-
- Many other compilers do this automatically, which means lots of
- Fortran code developed with those compilers depends on it.
-
- The effect of this is that all non-automatic variables and arrays
- are made static, that is, not placed on the stack or in heap
- storage. This might cause a buggy program to appear to work
- better. If so, rather than relying on this command-line option
- (and hoping all compilers provide the equivalent one), add `SAVE'
- statements to some or all program unit sources, as appropriate.
- Consider using `-Wuninitialized' (which requires `-O') to find
- likely candidates, but do not specify `-finit-local-zero' or
- `-fno-automatic', or this technique won't work.
-
- The default is `-fautomatic', which tells `g77' to try and put
- variables and arrays on the stack (or in fast registers) where
- possible and reasonable. This tends to make programs faster.
-
- *Note:* Automatic variables and arrays are not affected by this
- option. These are variables and arrays that are *necessarily*
- automatic, either due to explicit statements, or due to the way
- they are declared. Examples include local variables and arrays
- not given the `SAVE' attribute in procedures declared `RECURSIVE',
- and local arrays declared with non-constant bounds (automatic
- arrays). Currently, `g77' supports only automatic arrays, not
- `RECURSIVE' procedures or other means of explicitly specifying
- that variables or arrays are automatic.
-
-`-fugly'
- Fix the source code so that `-fno-ugly' will work. Note that, for
- many programs, it is difficult to practically avoid using the
- features enabled via `-fugly-init', and these features pose the
- lowest risk of writing nonportable code, among the various "ugly"
- features.
-
-`-fGROUP-intrinsics-hide'
- Change the source code to use `EXTERNAL' for any external procedure
- that might be the name of an intrinsic. It is easy to find these
- using `-fGROUP-intrinsics-disable'.
-
-
-File: g77.info, Node: Faster Programs, Prev: Overly Convenient Options, Up: Collected Fortran Wisdom
-
-Faster Programs
-===============
-
- Aside from the usual `gcc' options, such as `-O', `-ffast-math', and
-so on, consider trying some of the following approaches to speed up
-your program (once you get it working).
-
-* Menu:
-
-* Aligned Data::
-* Prefer Automatic Uninitialized Variables::
-* Avoid f2c Compatibility::
-* Use Submodel Options::
-
-
-File: g77.info, Node: Aligned Data, Next: Prefer Automatic Uninitialized Variables, Up: Faster Programs
-
-Aligned Data
-------------
-
- On some systems, such as those with Pentium Pro CPUs, programs that
-make heavy use of `REAL(KIND=2)' (`DOUBLE PRECISION') might run much
-slower than possible due to the compiler not aligning these 64-bit
-values to 64-bit boundaries in memory. (The effect also is present,
-though to a lesser extent, on the 586 (Pentium) architecture.)
-
- The Intel x86 architecture generally ensures that these programs will
-work on all its implementations, but particular implementations (such
-as Pentium Pro) perform better with more strict alignment. (Such
-behavior isn't unique to the Intel x86 architecture.) Other
-architectures might *demand* 64-bit alignment of 64-bit data.
-
- There are a variety of approaches to use to address this problem:
-
- * Order your `COMMON' and `EQUIVALENCE' areas such that the
- variables and arrays with the widest alignment guidelines come
- first.
-
- For example, on most systems, this would mean placing
- `COMPLEX(KIND=2)', `REAL(KIND=2)', and `INTEGER(KIND=2)' entities
- first, followed by `REAL(KIND=1)', `INTEGER(KIND=1)', and
- `LOGICAL(KIND=1)' entities, then `INTEGER(KIND=6)' entities, and
- finally `CHARACTER' and `INTEGER(KIND=3)' entities.
-
- The reason to use such placement is it makes it more likely that
- your data will be aligned properly, without requiring you to do
- detailed analysis of each aggregate (`COMMON' and `EQUIVALENCE')
- area.
-
- Specifically, on systems where the above guidelines are
- appropriate, placing `CHARACTER' entities before `REAL(KIND=2)'
- entities can work just as well, but only if the number of bytes
- occupied by the `CHARACTER' entities is divisible by the
- recommended alignment for `REAL(KIND=2)'.
-
- By ordering the placement of entities in aggregate areas according
- to the simple guidelines above, you avoid having to carefully
- count the number of bytes occupied by each entity to determine
- whether the actual alignment of each subsequent entity meets the
- alignment guidelines for the type of that entity.
-
- If you don't ensure correct alignment of `COMMON' elements, the
- compiler may be forced by some systems to violate the Fortran
- semantics by adding padding to get `DOUBLE PRECISION' data
- properly aligned. If the unfortunate practice is employed of
- overlaying different types of data in the `COMMON' block, the
- different variants of this block may become misaligned with
- respect to each other. Even if your platform doesn't require
- strict alignment, `COMMON' should be laid out as above for
- portability. (Unfortunately the FORTRAN 77 standard didn't
- anticipate this possible requirement, which is
- compiler-independent on a given platform.)
-
- * Use the (x86-specific) `-malign-double' option when compiling
- programs for the Pentium and Pentium Pro architectures (called 586
- and 686 in the `gcc' configuration subsystem). The warning about
- this in the `gcc' manual isn't generally relevant to Fortran, but
- using it will force `COMMON' to be padded if necessary to align
- `DOUBLE PRECISION' data.
-
- * Ensure that `crt0.o' or `crt1.o' on your system guarantees a 64-bit
- aligned stack for `main()'. The recent one from GNU (`glibc2')
- will do this on x86 systems, but we don't know of any other x86
- setups where it will be right. Read your system's documentation
- to determine if it is appropriate to upgrade to a more recent
- version to obtain the optimal alignment.
-
- Progress is being made on making this work "out of the box" on
-future versions of `g77', `gcc', and some of the relevant operating
-systems (such as GNU/Linux).
-
-
-File: g77.info, Node: Prefer Automatic Uninitialized Variables, Next: Avoid f2c Compatibility, Prev: Aligned Data, Up: Faster Programs
-
-Prefer Automatic Uninitialized Variables
-----------------------------------------
-
- If you're using `-fno-automatic' already, you probably should change
-your code to allow compilation with `-fautomatic' (the default), to
-allow the program to run faster.
-
- Similarly, you should be able to use `-fno-init-local-zero' (the
-default) instead of `-finit-local-zero'. This is because it is rare
-that every variable affected by these options in a given program
-actually needs to be so affected.
-
- For example, `-fno-automatic', which effectively `SAVE's every local
-non-automatic variable and array, affects even things like `DO'
-iteration variables, which rarely need to be `SAVE'd, and this often
-reduces run-time performances. Similarly, `-fno-init-local-zero'
-forces such variables to be initialized to zero--when `SAVE'd (such as
-when `-fno-automatic'), this by itself generally affects only startup
-time for a program, but when not `SAVE'd, it can slow down the
-procedure every time it is called.
-
- *Note Overly Convenient Command-Line Options: Overly Convenient
-Options, for information on the `-fno-automatic' and
-`-finit-local-zero' options and how to convert their use into selective
-changes in your own code.
-
-
-File: g77.info, Node: Avoid f2c Compatibility, Next: Use Submodel Options, Prev: Prefer Automatic Uninitialized Variables, Up: Faster Programs
-
-Avoid f2c Compatibility
------------------------
-
- If you aren't linking with any code compiled using `f2c', try using
-the `-fno-f2c' option when compiling *all* the code in your program.
-(Note that `libf2c' is *not* an example of code that is compiled using
-`f2c'--it is compiled by a C compiler, typically `gcc'.)
-
-
-File: g77.info, Node: Use Submodel Options, Prev: Avoid f2c Compatibility, Up: Faster Programs
-
-Use Submodel Options
---------------------
-
- Using an appropriate `-m' option to generate specific code for your
-CPU may be worthwhile, though it may mean the executable won't run on
-other versions of the CPU that don't support the same instruction set.
-*Note Hardware Models and Configurations: (gcc)Submodel Options.
-
- For recent CPUs that don't have explicit support in the released
-version of `gcc', it may still be possible to get improvements. For
-instance, the flags recommended for 586/686 (Pentium(Pro)) chips for
-building the Linux kernel are:
-
- -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2
- -fomit-frame-pointer
-
-`-fomit-frame-pointer' will, however, inhibit debugging on x86 systems.
-
-
-File: g77.info, Node: Trouble, Next: Open Questions, Prev: Collected Fortran Wisdom, Up: Top
-
-Known Causes of Trouble with GNU Fortran
-****************************************
-
- This section describes known problems that affect users of GNU
-Fortran. Most of these are not GNU Fortran bugs per se--if they were,
-we would fix them. But the result for a user might be like the result
-of a bug.
-
- Some of these problems are due to bugs in other software, some are
-missing features that are too much work to add, and some are places
-where people's opinions differ as to what is best.
-
- Information on bugs that show up when configuring, porting, building,
-or installing `g77' is not provided here. *Note Problems Installing::.
-
- To find out about major bugs discovered in the current release and
-possible workarounds for them, retrieve
-`ftp://alpha.gnu.ai.mit.edu/g77.plan'.
-
- (Note that some of this portion of the manual is lifted directly
-from the `gcc' manual, with minor modifications to tailor it to users
-of `g77'. Anytime a bug seems to have more to do with the `gcc'
-portion of `g77', *Note Known Causes of Trouble with GNU CC:
-(gcc)Trouble.)
-
-* Menu:
-
-* But-bugs:: Bugs really in other programs or elsewhere.
-* Actual Bugs:: Bugs and misfeatures we will fix later.
-* Missing Features:: Features we already know we want to add later.
-* Disappointments:: Regrettable things we can't change.
-* Non-bugs:: Things we think are right, but some others disagree.
-* Warnings and Errors:: Which problems in your code get warnings,
- and which get errors.
-
diff --git a/gcc/f/g77.info-16 b/gcc/f/g77.info-16
index e81f43ab8e7..f77b5e5e7e8 100644
--- a/gcc/f/g77.info-16
+++ b/gcc/f/g77.info-16
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,302 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Large File Unit Numbers, Prev: Output Assumed To Flush, Up: Working Programs
+
+Large File Unit Numbers
+-----------------------
+
+ If your program crashes at run time with a message including the
+text `illegal unit number', that probably is a message from the
+run-time library, `libf2c', used, and distributed with, `g77'.
+
+ The message means that your program has attempted to use a file unit
+number that is out of the range accepted by `libf2c'. Normally, this
+range is 0 through 99, and the high end of the range is controlled by a
+`libf2c' source-file macro named `MXUNIT'.
+
+ If you can easily change your program to use unit numbers in the
+range 0 through 99, you should do so.
+
+ Otherwise, see *Note Larger File Unit Numbers::, for information on
+how to change `MXUNIT' in `libf2c' so you can build and install a new
+version of `libf2c' that supports the larger unit numbers you need.
+
+ *Note:* While `libf2c' places a limit on the range of Fortran
+file-unit numbers, the underlying library and operating system might
+impose different kinds of limits. For example, some systems limit the
+number of files simultaneously open by a running program. Information
+on how to increase these limits should be found in your system's
+documentation.
+
+
+File: g77.info, Node: Overly Convenient Options, Next: Faster Programs, Prev: Working Programs, Up: Collected Fortran Wisdom
+
+Overly Convenient Command-line Options
+======================================
+
+ These options should be used only as a quick-and-dirty way to
+determine how well your program will run under different compilation
+models without having to change the source. Some are more problematic
+than others, depending on how portable and maintainable you want the
+program to be (and, of course, whether you are allowed to change it at
+all is crucial).
+
+ You should not continue to use these command-line options to compile
+a given program, but rather should make changes to the source code:
+
+`-finit-local-zero'
+ (This option specifies that any uninitialized local variables and
+ arrays have default initialization to binary zeros.)
+
+ Many other compilers do this automatically, which means lots of
+ Fortran code developed with those compilers depends on it.
+
+ It is safer (and probably would produce a faster program) to find
+ the variables and arrays that need such initialization and provide
+ it explicitly via `DATA', so that `-finit-local-zero' is not
+ needed.
+
+ Consider using `-Wuninitialized' (which requires `-O') to find
+ likely candidates, but do not specify `-finit-local-zero' or
+ `-fno-automatic', or this technique won't work.
+
+`-fno-automatic'
+ (This option specifies that all local variables and arrays are to
+ be treated as if they were named in `SAVE' statements.)
+
+ Many other compilers do this automatically, which means lots of
+ Fortran code developed with those compilers depends on it.
+
+ The effect of this is that all non-automatic variables and arrays
+ are made static, that is, not placed on the stack or in heap
+ storage. This might cause a buggy program to appear to work
+ better. If so, rather than relying on this command-line option
+ (and hoping all compilers provide the equivalent one), add `SAVE'
+ statements to some or all program unit sources, as appropriate.
+ Consider using `-Wuninitialized' (which requires `-O') to find
+ likely candidates, but do not specify `-finit-local-zero' or
+ `-fno-automatic', or this technique won't work.
+
+ The default is `-fautomatic', which tells `g77' to try and put
+ variables and arrays on the stack (or in fast registers) where
+ possible and reasonable. This tends to make programs faster.
+
+ *Note:* Automatic variables and arrays are not affected by this
+ option. These are variables and arrays that are *necessarily*
+ automatic, either due to explicit statements, or due to the way
+ they are declared. Examples include local variables and arrays
+ not given the `SAVE' attribute in procedures declared `RECURSIVE',
+ and local arrays declared with non-constant bounds (automatic
+ arrays). Currently, `g77' supports only automatic arrays, not
+ `RECURSIVE' procedures or other means of explicitly specifying
+ that variables or arrays are automatic.
+
+`-fugly'
+ Fix the source code so that `-fno-ugly' will work. Note that, for
+ many programs, it is difficult to practically avoid using the
+ features enabled via `-fugly-init', and these features pose the
+ lowest risk of writing nonportable code, among the various "ugly"
+ features.
+
+`-fGROUP-intrinsics-hide'
+ Change the source code to use `EXTERNAL' for any external procedure
+ that might be the name of an intrinsic. It is easy to find these
+ using `-fGROUP-intrinsics-disable'.
+
+
+File: g77.info, Node: Faster Programs, Prev: Overly Convenient Options, Up: Collected Fortran Wisdom
+
+Faster Programs
+===============
+
+ Aside from the usual `gcc' options, such as `-O', `-ffast-math', and
+so on, consider trying some of the following approaches to speed up
+your program (once you get it working).
+
+* Menu:
+
+* Aligned Data::
+* Prefer Automatic Uninitialized Variables::
+* Avoid f2c Compatibility::
+* Use Submodel Options::
+
+
+File: g77.info, Node: Aligned Data, Next: Prefer Automatic Uninitialized Variables, Up: Faster Programs
+
+Aligned Data
+------------
+
+ On some systems, such as those with Pentium Pro CPUs, programs that
+make heavy use of `REAL(KIND=2)' (`DOUBLE PRECISION') might run much
+slower than possible due to the compiler not aligning these 64-bit
+values to 64-bit boundaries in memory. (The effect also is present,
+though to a lesser extent, on the 586 (Pentium) architecture.)
+
+ The Intel x86 architecture generally ensures that these programs will
+work on all its implementations, but particular implementations (such
+as Pentium Pro) perform better with more strict alignment. (Such
+behavior isn't unique to the Intel x86 architecture.) Other
+architectures might *demand* 64-bit alignment of 64-bit data.
+
+ There are a variety of approaches to use to address this problem:
+
+ * Order your `COMMON' and `EQUIVALENCE' areas such that the
+ variables and arrays with the widest alignment guidelines come
+ first.
+
+ For example, on most systems, this would mean placing
+ `COMPLEX(KIND=2)', `REAL(KIND=2)', and `INTEGER(KIND=2)' entities
+ first, followed by `REAL(KIND=1)', `INTEGER(KIND=1)', and
+ `LOGICAL(KIND=1)' entities, then `INTEGER(KIND=6)' entities, and
+ finally `CHARACTER' and `INTEGER(KIND=3)' entities.
+
+ The reason to use such placement is it makes it more likely that
+ your data will be aligned properly, without requiring you to do
+ detailed analysis of each aggregate (`COMMON' and `EQUIVALENCE')
+ area.
+
+ Specifically, on systems where the above guidelines are
+ appropriate, placing `CHARACTER' entities before `REAL(KIND=2)'
+ entities can work just as well, but only if the number of bytes
+ occupied by the `CHARACTER' entities is divisible by the
+ recommended alignment for `REAL(KIND=2)'.
+
+ By ordering the placement of entities in aggregate areas according
+ to the simple guidelines above, you avoid having to carefully
+ count the number of bytes occupied by each entity to determine
+ whether the actual alignment of each subsequent entity meets the
+ alignment guidelines for the type of that entity.
+
+ If you don't ensure correct alignment of `COMMON' elements, the
+ compiler may be forced by some systems to violate the Fortran
+ semantics by adding padding to get `DOUBLE PRECISION' data
+ properly aligned. If the unfortunate practice is employed of
+ overlaying different types of data in the `COMMON' block, the
+ different variants of this block may become misaligned with
+ respect to each other. Even if your platform doesn't require
+ strict alignment, `COMMON' should be laid out as above for
+ portability. (Unfortunately the FORTRAN 77 standard didn't
+ anticipate this possible requirement, which is
+ compiler-independent on a given platform.)
+
+ * Use the (x86-specific) `-malign-double' option when compiling
+ programs for the Pentium and Pentium Pro architectures (called 586
+ and 686 in the `gcc' configuration subsystem). The warning about
+ this in the `gcc' manual isn't generally relevant to Fortran, but
+ using it will force `COMMON' to be padded if necessary to align
+ `DOUBLE PRECISION' data.
+
+ * Ensure that `crt0.o' or `crt1.o' on your system guarantees a 64-bit
+ aligned stack for `main()'. The recent one from GNU (`glibc2')
+ will do this on x86 systems, but we don't know of any other x86
+ setups where it will be right. Read your system's documentation
+ to determine if it is appropriate to upgrade to a more recent
+ version to obtain the optimal alignment.
+
+ Progress is being made on making this work "out of the box" on
+future versions of `g77', `gcc', and some of the relevant operating
+systems (such as GNU/Linux).
+
+
+File: g77.info, Node: Prefer Automatic Uninitialized Variables, Next: Avoid f2c Compatibility, Prev: Aligned Data, Up: Faster Programs
+
+Prefer Automatic Uninitialized Variables
+----------------------------------------
+
+ If you're using `-fno-automatic' already, you probably should change
+your code to allow compilation with `-fautomatic' (the default), to
+allow the program to run faster.
+
+ Similarly, you should be able to use `-fno-init-local-zero' (the
+default) instead of `-finit-local-zero'. This is because it is rare
+that every variable affected by these options in a given program
+actually needs to be so affected.
+
+ For example, `-fno-automatic', which effectively `SAVE's every local
+non-automatic variable and array, affects even things like `DO'
+iteration variables, which rarely need to be `SAVE'd, and this often
+reduces run-time performances. Similarly, `-fno-init-local-zero'
+forces such variables to be initialized to zero--when `SAVE'd (such as
+when `-fno-automatic'), this by itself generally affects only startup
+time for a program, but when not `SAVE'd, it can slow down the
+procedure every time it is called.
+
+ *Note Overly Convenient Command-Line Options: Overly Convenient
+Options, for information on the `-fno-automatic' and
+`-finit-local-zero' options and how to convert their use into selective
+changes in your own code.
+
+
+File: g77.info, Node: Avoid f2c Compatibility, Next: Use Submodel Options, Prev: Prefer Automatic Uninitialized Variables, Up: Faster Programs
+
+Avoid f2c Compatibility
+-----------------------
+
+ If you aren't linking with any code compiled using `f2c', try using
+the `-fno-f2c' option when compiling *all* the code in your program.
+(Note that `libf2c' is *not* an example of code that is compiled using
+`f2c'--it is compiled by a C compiler, typically `gcc'.)
+
+
+File: g77.info, Node: Use Submodel Options, Prev: Avoid f2c Compatibility, Up: Faster Programs
+
+Use Submodel Options
+--------------------
+
+ Using an appropriate `-m' option to generate specific code for your
+CPU may be worthwhile, though it may mean the executable won't run on
+other versions of the CPU that don't support the same instruction set.
+*Note Hardware Models and Configurations: (gcc)Submodel Options.
+
+ For recent CPUs that don't have explicit support in the released
+version of `gcc', it may still be possible to get improvements. For
+instance, the flags recommended for 586/686 (Pentium(Pro)) chips for
+building the Linux kernel are:
+
+ -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2
+ -fomit-frame-pointer
+
+`-fomit-frame-pointer' will, however, inhibit debugging on x86 systems.
+
+
+File: g77.info, Node: Trouble, Next: Open Questions, Prev: Collected Fortran Wisdom, Up: Top
+
+Known Causes of Trouble with GNU Fortran
+****************************************
+
+ This section describes known problems that affect users of GNU
+Fortran. Most of these are not GNU Fortran bugs per se--if they were,
+we would fix them. But the result for a user might be like the result
+of a bug.
+
+ Some of these problems are due to bugs in other software, some are
+missing features that are too much work to add, and some are places
+where people's opinions differ as to what is best.
+
+ Information on bugs that show up when configuring, porting, building,
+or installing `g77' is not provided here. *Note Problems Installing::.
+
+ To find out about major bugs discovered in the current release and
+possible workarounds for them, retrieve `ftp://alpha.gnu.org/g77.plan'.
+
+ (Note that some of this portion of the manual is lifted directly
+from the `gcc' manual, with minor modifications to tailor it to users
+of `g77'. Anytime a bug seems to have more to do with the `gcc'
+portion of `g77', *Note Known Causes of Trouble with GNU CC:
+(gcc)Trouble.)
+
+* Menu:
+
+* But-bugs:: Bugs really in other programs or elsewhere.
+* Actual Bugs:: Bugs and misfeatures we will fix later.
+* Missing Features:: Features we already know we want to add later.
+* Disappointments:: Regrettable things we can't change.
+* Non-bugs:: Things we think are right, but some others disagree.
+* Warnings and Errors:: Which problems in your code get warnings,
+ and which get errors.
+
+
File: g77.info, Node: But-bugs, Next: Actual Bugs, Up: Trouble
Bugs Not In GNU Fortran
@@ -481,27 +777,6 @@ port, build, and install `g77', *Note Problems Installing::.
Until this bug is fixed, use only `-O1' or no optimization.
- * A code-generation bug afflicts Intel x86 targets when `-O2' is
- specified compiling, for example, an old version of the `DNRM2'
- routine. The x87 coprocessor stack is being somewhat mismanaged
- in cases where assigned `GOTO' and `ASSIGN' are involved.
-
- Version 0.5.21 of `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.
-
- * Work is needed on the `SIGNAL()' intrinsic to ensure that pointers
- and integers are properly handled on all targets, including 64-bit
- machines.
-
- * When using `-fugly-comma', `g77' assumes an extra `%VAL(0)'
- argument is to be passed to intrinsics taking no arguments, such
- as `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, `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.
-
* Something about `g77''s straightforward handling of label
references and definitions sometimes prevents the GBE from
unrolling loops. Until this is solved, try inserting or removing
@@ -607,30 +882,6 @@ port, build, and install `g77', *Note Problems Installing::.
potential, with the current setup, for interface differences in
the way such areas are laid out between `g77' and other compilers.
- * 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 `g77''s support for Solaris/x86 systems.
-
- * 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 `gcc-2.7.0' plus
- `g77-0.5.16'. This problem shows up only when compiling the
- Fortran program with `-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 `g77''s support for RS/6000 systems.
-
- * SGI support is known to be a bit buggy. The known problem shows
- up only when compiling the Fortran program with `-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 `g77''s support for SGI systems.
-
* `g77' doesn't work perfectly on 64-bit configurations such as the
Alpha. This problem is expected to be largely resolved as of
version 0.5.20, and further addressed by 0.5.21. Version 0.6
@@ -666,9 +917,8 @@ port, build, and install `g77', *Note Problems Installing::.
general expressions (other than simple variables/arrays), to
procedures when compiling on some systems (such as i386) with
`-fPIC', as in 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
+ 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 *without* the `-O' option.

@@ -911,300 +1161,3 @@ such as array element references, function references, etc.
SUBROUTINE X(M, N)
INTEGER N(10), M(N(2), N(1))
-
-File: g77.info, Node: POINTER Statements, Next: Sensible Non-standard Constructs, Prev: Array Bounds Expressions, Up: Missing Features
-
-POINTER Statements
-------------------
-
- `g77' doesn't support pointers or allocatable objects (other than
-automatic arrays). This set of features is probably considered just
-behind intrinsics in `PARAMETER' statements on the list of large,
-important things to add to `g77'.
-
- In the meantime, consider using the `INTEGER(KIND=7)' declaration to
-specify that a variable must be able to hold a pointer. This construct
-is not portable to other non-GNU compilers, but it is portable to all
-machines GNU Fortran supports when `g77' is used.
-
- *Note Functions and Subroutines::, for information on `%VAL()',
-`%REF()', and `%DESCR()' constructs, which are useful for passing
-pointers to procedures written in languages other than Fortran.
-
-
-File: g77.info, Node: Sensible Non-standard Constructs, Next: FLUSH Statement, Prev: POINTER Statements, Up: Missing Features
-
-Sensible Non-standard Constructs
---------------------------------
-
- `g77' rejects things other compilers accept, like `INTRINSIC
-SQRT,SQRT'. As time permits in the future, some of these things that
-are easy for humans to read and write and unlikely to be intended to
-mean something else will be accepted by `g77' (though `-fpedantic'
-should trigger warnings about such non-standard constructs).
-
- Until `g77' no longer gratuitously rejects sensible code, you might
-as well fix your code to be more standard-conforming and portable.
-
- The kind of case that is important to except from the recommendation
-to change your code is one where following good coding rules would
-force you to write non-standard code that nevertheless has a clear
-meaning.
-
- For example, when writing an `INCLUDE' file that defines a common
-block, it might be appropriate to include a `SAVE' statement for the
-common block (such as `SAVE /CBLOCK/'), so that variables defined in
-the common block retain their values even when all procedures declaring
-the common block become inactive (return to their callers).
-
- However, putting `SAVE' statements in an `INCLUDE' file would
-prevent otherwise standard-conforming code from also specifying the
-`SAVE' statement, by itself, to indicate that all local variables and
-arrays are to have the `SAVE' attribute.
-
- For this reason, `g77' already has been changed to allow this
-combination, because although the general problem of gratuitously
-rejecting unambiguous and "safe" constructs still exists in `g77', this
-particular construct was deemed useful enough that it was worth fixing
-`g77' for just this case.
-
- So, while there is no need to change your code to avoid using this
-particular construct, there might be other, equally appropriate but
-non-standard constructs, that you shouldn't have to stop using just
-because `g77' (or any other compiler) gratuitously rejects it.
-
- Until the general problem is solved, if you have any such construct
-you believe is worthwhile using (e.g. not just an arbitrary, redundant
-specification of an attribute), please submit a bug report with an
-explanation, so we can consider fixing `g77' just for cases like yours.
-
-
-File: g77.info, Node: FLUSH Statement, Next: Expressions in FORMAT Statements, Prev: Sensible Non-standard Constructs, Up: Missing Features
-
-`FLUSH' Statement
------------------
-
- `g77' could perhaps use a `FLUSH' statement that does what `CALL
-FLUSH' does, but that supports `*' as the unit designator (same unit as
-for `PRINT') and accepts `ERR=' and/or `IOSTAT=' specifiers.
-
-
-File: g77.info, Node: Expressions in FORMAT Statements, Next: Explicit Assembler Code, Prev: FLUSH Statement, Up: Missing Features
-
-Expressions in `FORMAT' Statements
-----------------------------------
-
- `g77' doesn't support `FORMAT(I<J>)' and the like. Supporting this
-requires a significant redesign or replacement of `libf2c'.
-
- However, a future version of `g77' might support this construct when
-the expression is constant. For example:
-
- PARAMETER (IWIDTH = 12)
- 10 FORMAT (I<IWIDTH>)
-
- In the meantime, at least for output (`PRINT' and `WRITE'), Fortran
-code making use of this feature can be rewritten to avoid it by
-constructing the `FORMAT' string in a `CHARACTER' variable or array,
-then using that variable or array in place of the `FORMAT' statement
-label to do the original `PRINT' or `WRITE'.
-
- Many uses of this feature on input can be rewritten this way as
-well, but not all can. For example, this can be rewritten:
-
- READ 20, I
- 20 FORMAT (I<J>)
-
- However, this cannot, in general, be rewritten, especially when
-`ERR=' and `END=' constructs are employed:
-
- READ 30, J, I
- 30 FORMAT (I<J>)
-
-
-File: g77.info, Node: Explicit Assembler Code, Next: Q Edit Descriptor, Prev: Expressions in FORMAT Statements, Up: Missing Features
-
-Explicit Assembler Code
------------------------
-
- `g77' needs to provide some way, a la `gcc', for `g77' code to
-specify explicit assembler code.
-
-
-File: g77.info, Node: Q Edit Descriptor, Next: Old-style PARAMETER Statements, Prev: Explicit Assembler Code, Up: Missing Features
-
-Q Edit Descriptor
------------------
-
- The `Q' edit descriptor in `FORMAT's isn't supported. (This is
-meant to get the number of characters remaining in an input record.)
-Supporting this requires a significant redesign or replacement of
-`libf2c'.
-
- A workaround might be using internal I/O or the stream-based
-intrinsics. *Note FGetC Intrinsic (subroutine)::.
-
-
-File: g77.info, Node: Old-style PARAMETER Statements, Next: TYPE and ACCEPT I/O Statements, Prev: Q Edit Descriptor, Up: Missing Features
-
-Old-style PARAMETER Statements
-------------------------------
-
- `g77' doesn't accept `PARAMETER I=1'. Supporting this obsolete form
-of the `PARAMETER' statement would not be particularly hard, as most of
-the parsing code is already in place and working.
-
- Until time/money is spent implementing it, you might as well fix
-your code to use the standard form, `PARAMETER (I=1)' (possibly needing
-`INTEGER I' preceding the `PARAMETER' statement as well, otherwise, in
-the obsolete form of `PARAMETER', the type of the variable is set from
-the type of the constant being assigned to it).
-
-
-File: g77.info, Node: TYPE and ACCEPT I/O Statements, Next: STRUCTURE UNION RECORD MAP, Prev: Old-style PARAMETER Statements, Up: Missing Features
-
-`TYPE' and `ACCEPT' I/O Statements
-----------------------------------
-
- `g77' doesn't support the I/O statements `TYPE' and `ACCEPT'. These
-are common extensions that should be easy to support, but also are
-fairly easy to work around in user code.
-
- Generally, any `TYPE fmt,list' I/O statement can be replaced by
-`PRINT fmt,list'. And, any `ACCEPT fmt,list' statement can be replaced
-by `READ fmt,list'.
-
-
-File: g77.info, Node: STRUCTURE UNION RECORD MAP, Next: OPEN CLOSE and INQUIRE Keywords, Prev: TYPE and ACCEPT I/O Statements, Up: Missing Features
-
-`STRUCTURE', `UNION', `RECORD', `MAP'
--------------------------------------
-
- `g77' doesn't support `STRUCTURE', `UNION', `RECORD', `MAP'. This
-set of extensions is quite a bit lower on the list of large, important
-things to add to `g77', partly because it requires a great deal of work
-either upgrading or replacing `libf2c'.
-
-
-File: g77.info, Node: OPEN CLOSE and INQUIRE Keywords, Next: ENCODE and DECODE, Prev: STRUCTURE UNION RECORD MAP, Up: Missing Features
-
-`OPEN', `CLOSE', and `INQUIRE' Keywords
----------------------------------------
-
- `g77' doesn't have support for keywords such as `DISP='DELETE'' in
-the `OPEN', `CLOSE', and `INQUIRE' statements. These extensions are
-easy to add to `g77' itself, but require much more work on `libf2c'.
-
-
-File: g77.info, Node: ENCODE and DECODE, Next: Suppressing Space Padding, Prev: OPEN CLOSE and INQUIRE Keywords, Up: Missing Features
-
-`ENCODE' and `DECODE'
----------------------
-
- `g77' doesn't support `ENCODE' or `DECODE'.
-
- These statements are best replaced by READ and WRITE statements
-involving internal files (CHARACTER variables and arrays).
-
- For example, replace a code fragment like
-
- INTEGER*1 LINE(80)
- ...
- DECODE (80, 9000, LINE) A, B, C
- ...
- 9000 FORMAT (1X, 3(F10.5))
-
-with:
-
- CHARACTER*80 LINE
- ...
- READ (UNIT=LINE, FMT=9000) A, B, C
- ...
- 9000 FORMAT (1X, 3(F10.5))
-
- Similarly, replace a code fragment like
-
- INTEGER*1 LINE(80)
- ...
- ENCODE (80, 9000, LINE) A, B, C
- ...
- 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
-
-with:
-
- CHARACTER*80 LINE
- ...
- WRITE (UNIT=LINE, FMT=9000) A, B, C
- ...
- 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
-
- It is entirely possible that `ENCODE' and `DECODE' will be supported
-by a future version of `g77'.
-
-
-File: g77.info, Node: Suppressing Space Padding, Next: Fortran Preprocessor, Prev: ENCODE and DECODE, Up: Missing Features
-
-Suppressing Space Padding of Source Lines
------------------------------------------
-
- `g77' should offer VXT-Fortran-style suppression of virtual spaces
-at the end of a source line if an appropriate command-line option is
-specified.
-
- This affects cases where a character constant is continued onto the
-next line in a fixed-form source file, as in the following example:
-
- 10 PRINT *,'HOW MANY
- 1 SPACES?'
-
-`g77', and many other compilers, virtually extend the continued line
-through column 72 with spaces that become part of the character
-constant, but Digital Fortran normally didn't, leaving only one space
-between `MANY' and `SPACES?' in the output of the above statement.
-
- Fairly recently, at least one version of Digital Fortran was
-enhanced to provide the other behavior when a command-line option is
-specified, apparently due to demand from readers of the USENET group
-`comp.lang.fortran' to offer conformance to this widespread practice in
-the industry. `g77' should return the favor by offering conformance to
-Digital's approach to handling the above example.
-
-
-File: g77.info, Node: Fortran Preprocessor, Next: Bit Operations on Floating-point Data, Prev: Suppressing Space Padding, Up: Missing Features
-
-Fortran Preprocessor
---------------------
-
- `g77' should offer a preprocessor designed specifically for Fortran
-to replace `cpp -traditional'. There are several out there worth
-evaluating, at least.
-
- Such a preprocessor would recognize Hollerith constants, properly
-parse comments and character constants, and so on. It might also
-recognize, process, and thus preprocess files included via the
-`INCLUDE' directive.
-
-
-File: g77.info, Node: Bit Operations on Floating-point Data, Next: POSIX Standard, Prev: Fortran Preprocessor, Up: Missing Features
-
-Bit Operations on Floating-point Data
--------------------------------------
-
- `g77' does not allow `REAL' and other non-integral types for
-arguments to intrinsics like `AND', `OR', and `SHIFT'.
-
- For example, this program is rejected by `g77', because the
-intrinsic `IAND' does not accept `REAL' arguments:
-
- DATA A/7.54/, B/9.112/
- PRINT *, IAND(A, B)
- END
-
-
-File: g77.info, Node: POSIX Standard, Next: Floating-point Exception Handling, Prev: Bit Operations on Floating-point Data, Up: Missing Features
-
-`POSIX' Standard
-----------------
-
- `g77' should support the POSIX standard for Fortran.
-
diff --git a/gcc/f/g77.info-17 b/gcc/f/g77.info-17
index b514a9a52f3..8c0b80f787b 100644
--- a/gcc/f/g77.info-17
+++ b/gcc/f/g77.info-17
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,303 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: POINTER Statements, Next: Sensible Non-standard Constructs, Prev: Array Bounds Expressions, Up: Missing Features
+
+POINTER Statements
+------------------
+
+ `g77' doesn't support pointers or allocatable objects (other than
+automatic arrays). This set of features is probably considered just
+behind intrinsics in `PARAMETER' statements on the list of large,
+important things to add to `g77'.
+
+ In the meantime, consider using the `INTEGER(KIND=7)' declaration to
+specify that a variable must be able to hold a pointer. This construct
+is not portable to other non-GNU compilers, but it is portable to all
+machines GNU Fortran supports when `g77' is used.
+
+ *Note Functions and Subroutines::, for information on `%VAL()',
+`%REF()', and `%DESCR()' constructs, which are useful for passing
+pointers to procedures written in languages other than Fortran.
+
+
+File: g77.info, Node: Sensible Non-standard Constructs, Next: FLUSH Statement, Prev: POINTER Statements, Up: Missing Features
+
+Sensible Non-standard Constructs
+--------------------------------
+
+ `g77' rejects things other compilers accept, like `INTRINSIC
+SQRT,SQRT'. As time permits in the future, some of these things that
+are easy for humans to read and write and unlikely to be intended to
+mean something else will be accepted by `g77' (though `-fpedantic'
+should trigger warnings about such non-standard constructs).
+
+ Until `g77' no longer gratuitously rejects sensible code, you might
+as well fix your code to be more standard-conforming and portable.
+
+ The kind of case that is important to except from the recommendation
+to change your code is one where following good coding rules would
+force you to write non-standard code that nevertheless has a clear
+meaning.
+
+ For example, when writing an `INCLUDE' file that defines a common
+block, it might be appropriate to include a `SAVE' statement for the
+common block (such as `SAVE /CBLOCK/'), so that variables defined in
+the common block retain their values even when all procedures declaring
+the common block become inactive (return to their callers).
+
+ However, putting `SAVE' statements in an `INCLUDE' file would
+prevent otherwise standard-conforming code from also specifying the
+`SAVE' statement, by itself, to indicate that all local variables and
+arrays are to have the `SAVE' attribute.
+
+ For this reason, `g77' already has been changed to allow this
+combination, because although the general problem of gratuitously
+rejecting unambiguous and "safe" constructs still exists in `g77', this
+particular construct was deemed useful enough that it was worth fixing
+`g77' for just this case.
+
+ So, while there is no need to change your code to avoid using this
+particular construct, there might be other, equally appropriate but
+non-standard constructs, that you shouldn't have to stop using just
+because `g77' (or any other compiler) gratuitously rejects it.
+
+ Until the general problem is solved, if you have any such construct
+you believe is worthwhile using (e.g. not just an arbitrary, redundant
+specification of an attribute), please submit a bug report with an
+explanation, so we can consider fixing `g77' just for cases like yours.
+
+
+File: g77.info, Node: FLUSH Statement, Next: Expressions in FORMAT Statements, Prev: Sensible Non-standard Constructs, Up: Missing Features
+
+`FLUSH' Statement
+-----------------
+
+ `g77' could perhaps use a `FLUSH' statement that does what `CALL
+FLUSH' does, but that supports `*' as the unit designator (same unit as
+for `PRINT') and accepts `ERR=' and/or `IOSTAT=' specifiers.
+
+
+File: g77.info, Node: Expressions in FORMAT Statements, Next: Explicit Assembler Code, Prev: FLUSH Statement, Up: Missing Features
+
+Expressions in `FORMAT' Statements
+----------------------------------
+
+ `g77' doesn't support `FORMAT(I<J>)' and the like. Supporting this
+requires a significant redesign or replacement of `libf2c'.
+
+ However, `g77' does support this construct when the expression is
+constant (as of version 0.5.22). For example:
+
+ PARAMETER (IWIDTH = 12)
+ 10 FORMAT (I<IWIDTH>)
+
+ Otherwise, at least for output (`PRINT' and `WRITE'), Fortran code
+making use of this feature can be rewritten to avoid it by constructing
+the `FORMAT' string in a `CHARACTER' variable or array, then using that
+variable or array in place of the `FORMAT' statement label to do the
+original `PRINT' or `WRITE'.
+
+ Many uses of this feature on input can be rewritten this way as
+well, but not all can. For example, this can be rewritten:
+
+ READ 20, I
+ 20 FORMAT (I<J>)
+
+ However, this cannot, in general, be rewritten, especially when
+`ERR=' and `END=' constructs are employed:
+
+ READ 30, J, I
+ 30 FORMAT (I<J>)
+
+
+File: g77.info, Node: Explicit Assembler Code, Next: Q Edit Descriptor, Prev: Expressions in FORMAT Statements, Up: Missing Features
+
+Explicit Assembler Code
+-----------------------
+
+ `g77' needs to provide some way, a la `gcc', for `g77' code to
+specify explicit assembler code.
+
+
+File: g77.info, Node: Q Edit Descriptor, Next: Old-style PARAMETER Statements, Prev: Explicit Assembler Code, Up: Missing Features
+
+Q Edit Descriptor
+-----------------
+
+ The `Q' edit descriptor in `FORMAT's isn't supported. (This is
+meant to get the number of characters remaining in an input record.)
+Supporting this requires a significant redesign or replacement of
+`libf2c'.
+
+ A workaround might be using internal I/O or the stream-based
+intrinsics. *Note FGetC Intrinsic (subroutine)::.
+
+
+File: g77.info, Node: Old-style PARAMETER Statements, Next: TYPE and ACCEPT I/O Statements, Prev: Q Edit Descriptor, Up: Missing Features
+
+Old-style PARAMETER Statements
+------------------------------
+
+ `g77' doesn't accept `PARAMETER I=1'. Supporting this obsolete form
+of the `PARAMETER' statement would not be particularly hard, as most of
+the parsing code is already in place and working.
+
+ Until time/money is spent implementing it, you might as well fix
+your code to use the standard form, `PARAMETER (I=1)' (possibly needing
+`INTEGER I' preceding the `PARAMETER' statement as well, otherwise, in
+the obsolete form of `PARAMETER', the type of the variable is set from
+the type of the constant being assigned to it).
+
+
+File: g77.info, Node: TYPE and ACCEPT I/O Statements, Next: STRUCTURE UNION RECORD MAP, Prev: Old-style PARAMETER Statements, Up: Missing Features
+
+`TYPE' and `ACCEPT' I/O Statements
+----------------------------------
+
+ `g77' doesn't support the I/O statements `TYPE' and `ACCEPT'. These
+are common extensions that should be easy to support, but also are
+fairly easy to work around in user code.
+
+ Generally, any `TYPE fmt,list' I/O statement can be replaced by
+`PRINT fmt,list'. And, any `ACCEPT fmt,list' statement can be replaced
+by `READ fmt,list'.
+
+
+File: g77.info, Node: STRUCTURE UNION RECORD MAP, Next: OPEN CLOSE and INQUIRE Keywords, Prev: TYPE and ACCEPT I/O Statements, Up: Missing Features
+
+`STRUCTURE', `UNION', `RECORD', `MAP'
+-------------------------------------
+
+ `g77' doesn't support `STRUCTURE', `UNION', `RECORD', `MAP'. This
+set of extensions is quite a bit lower on the list of large, important
+things to add to `g77', partly because it requires a great deal of work
+either upgrading or replacing `libf2c'.
+
+
+File: g77.info, Node: OPEN CLOSE and INQUIRE Keywords, Next: ENCODE and DECODE, Prev: STRUCTURE UNION RECORD MAP, Up: Missing Features
+
+`OPEN', `CLOSE', and `INQUIRE' Keywords
+---------------------------------------
+
+ `g77' doesn't have support for keywords such as `DISP='DELETE'' in
+the `OPEN', `CLOSE', and `INQUIRE' statements. These extensions are
+easy to add to `g77' itself, but require much more work on `libf2c'.
+
+
+File: g77.info, Node: ENCODE and DECODE, Next: Suppressing Space Padding, Prev: OPEN CLOSE and INQUIRE Keywords, Up: Missing Features
+
+`ENCODE' and `DECODE'
+---------------------
+
+ `g77' doesn't support `ENCODE' or `DECODE'.
+
+ These statements are best replaced by READ and WRITE statements
+involving internal files (CHARACTER variables and arrays).
+
+ For example, replace a code fragment like
+
+ INTEGER*1 LINE(80)
+ ...
+ DECODE (80, 9000, LINE) A, B, C
+ ...
+ 9000 FORMAT (1X, 3(F10.5))
+
+with:
+
+ CHARACTER*80 LINE
+ ...
+ READ (UNIT=LINE, FMT=9000) A, B, C
+ ...
+ 9000 FORMAT (1X, 3(F10.5))
+
+ Similarly, replace a code fragment like
+
+ INTEGER*1 LINE(80)
+ ...
+ ENCODE (80, 9000, LINE) A, B, C
+ ...
+ 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+
+with:
+
+ CHARACTER*80 LINE
+ ...
+ WRITE (UNIT=LINE, FMT=9000) A, B, C
+ ...
+ 9000 FORMAT (1X, 'OUTPUT IS ', 3(F10.5))
+
+ It is entirely possible that `ENCODE' and `DECODE' will be supported
+by a future version of `g77'.
+
+
+File: g77.info, Node: Suppressing Space Padding, Next: Fortran Preprocessor, Prev: ENCODE and DECODE, Up: Missing Features
+
+Suppressing Space Padding of Source Lines
+-----------------------------------------
+
+ `g77' should offer VXT-Fortran-style suppression of virtual spaces
+at the end of a source line if an appropriate command-line option is
+specified.
+
+ This affects cases where a character constant is continued onto the
+next line in a fixed-form source file, as in the following example:
+
+ 10 PRINT *,'HOW MANY
+ 1 SPACES?'
+
+`g77', and many other compilers, virtually extend the continued line
+through column 72 with spaces that become part of the character
+constant, but Digital Fortran normally didn't, leaving only one space
+between `MANY' and `SPACES?' in the output of the above statement.
+
+ Fairly recently, at least one version of Digital Fortran was
+enhanced to provide the other behavior when a command-line option is
+specified, apparently due to demand from readers of the USENET group
+`comp.lang.fortran' to offer conformance to this widespread practice in
+the industry. `g77' should return the favor by offering conformance to
+Digital's approach to handling the above example.
+
+
+File: g77.info, Node: Fortran Preprocessor, Next: Bit Operations on Floating-point Data, Prev: Suppressing Space Padding, Up: Missing Features
+
+Fortran Preprocessor
+--------------------
+
+ `g77' should offer a preprocessor designed specifically for Fortran
+to replace `cpp -traditional'. There are several out there worth
+evaluating, at least.
+
+ Such a preprocessor would recognize Hollerith constants, properly
+parse comments and character constants, and so on. It might also
+recognize, process, and thus preprocess files included via the
+`INCLUDE' directive.
+
+
+File: g77.info, Node: Bit Operations on Floating-point Data, Next: POSIX Standard, Prev: Fortran Preprocessor, Up: Missing Features
+
+Bit Operations on Floating-point Data
+-------------------------------------
+
+ `g77' does not allow `REAL' and other non-integral types for
+arguments to intrinsics like `AND', `OR', and `SHIFT'.
+
+ For example, this program is rejected by `g77', because the
+intrinsic `IAND' does not accept `REAL' arguments:
+
+ DATA A/7.54/, B/9.112/
+ PRINT *, IAND(A, B)
+ END
+
+
+File: g77.info, Node: POSIX Standard, Next: Floating-point Exception Handling, Prev: Bit Operations on Floating-point Data, Up: Missing Features
+
+`POSIX' Standard
+----------------
+
+ `g77' should support the POSIX standard for Fortran.
+
+
File: g77.info, Node: Floating-point Exception Handling, Next: Nonportable Conversions, Prev: POSIX Standard, Up: Missing Features
Floating-point Exception Handling
@@ -845,124 +1142,3 @@ information on problems we already know about.
*Note How To Get Help with GNU Fortran: Service, for information on
where to ask for help.
-
-File: g77.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
-
-Have You Found a Bug?
-=====================
-
- If you are not sure whether you have found a bug, here are some
-guidelines:
-
- * If the compiler gets a fatal signal, for any input whatever, that
- is a compiler bug. Reliable compilers never crash--they just
- remain obsolete.
-
- * If the compiler produces invalid assembly code, for any input
- whatever, that is a compiler bug, unless the compiler reports
- errors (not just warnings) which would ordinarily prevent the
- assembler from being run.
-
- * If the compiler produces valid assembly code that does not
- correctly execute the input source code, that is a compiler bug.
-
- However, you must double-check to make sure, because you might
- have run into an incompatibility between GNU Fortran and
- traditional Fortran. These incompatibilities might be considered
- bugs, but they are inescapable consequences of valuable features.
-
- Or you might have a program whose behavior is undefined, which
- happened by chance to give the desired results with another
- Fortran compiler. It is best to check the relevant Fortran
- standard thoroughly if it is possible that the program indeed does
- something undefined.
-
- After you have localized the error to a single source line, it
- should be easy to check for these things. If your program is
- correct and well defined, you have found a compiler bug.
-
- It might help if, in your submission, you identified the specific
- language in the relevant Fortran standard that specifies the
- desired behavior, if it isn't likely to be obvious and agreed-upon
- by all Fortran users.
-
- * If the compiler produces an error message for valid input, that is
- a compiler bug.
-
- * If the compiler does not produce an error message for invalid
- input, that is a compiler bug. However, you should note that your
- idea of "invalid input" might be someone else's idea of "an
- extension" or "support for traditional practice".
-
- * If you are an experienced user of Fortran compilers, your
- suggestions for improvement of GNU Fortran are welcome in any case.
-
- Many, perhaps most, bug reports against `g77' turn out to be bugs in
-the user's code. While we find such bug reports educational, they
-sometimes take a considerable amount of time to track down or at least
-respond to--time we could be spending making `g77', not some user's
-code, better.
-
- Some steps you can take to verify that the bug is not certainly in
-the code you're compiling with `g77':
-
- * Compile your code using the `g77' options `-W -Wall -O'. These
- options enable many useful warning; the `-O' option enables flow
- analysis that enables the uninitialized-variable warning.
-
- If you investigate the warnings and find evidence of possible bugs
- in your code, fix them first and retry `g77'.
-
- * Compile your code using the `g77' options `-finit-local-zero',
- `-fno-automatic', `-ffloat-store', and various combinations
- thereof.
-
- If your code works with any of these combinations, that is not
- proof that the bug isn't in `g77'--a `g77' bug exposed by your
- code might simply be avoided, or have a different, more subtle
- effect, when different options are used--but it can be a strong
- indicator that your code is making unawarranted assumptions about
- the Fortran dialect and/or underlying machine it is being compiled
- and run on.
-
- *Note Overly Convenient Command-Line Options: Overly Convenient
- Options, for information on the `-fno-automatic' and
- `-finit-local-zero' options and how to convert their use into
- selective changes in your own code.
-
- * Validate your code with `ftnchek' or a similar code-checking tool.
- `ftncheck' can be found at `ftp://ftp.netlib.org/fortran' or
- `ftp://ftp.dsm.fordham.edu'.
-
- * Try your code out using other Fortran compilers, such as `f2c'.
- If it does not work on at least one other compiler (assuming the
- compiler supports the features the code needs), that is a strong
- indicator of a bug in the code.
-
- However, even if your code works on many compilers *except* `g77',
- that does *not* mean the bug is in `g77'. It might mean the bug
- is in your code, and that `g77' simply exposes it more readily
- than other compilers.
-
-
-File: g77.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
-
-Where to Report Bugs
-====================
-
- Send bug reports for GNU Fortran to <fortran@gnu.ai.mit.edu>.
-
- Often people think of posting bug reports to a newsgroup instead of
-mailing them. This sometimes appears to work, but it has one problem
-which can be crucial: a newsgroup posting does not contain a mail path
-back to the sender. Thus, if maintainers need more information, they
-might be unable to reach you. For this reason, you should always send
-bug reports by mail to the proper mailing list.
-
- As a last resort, send bug reports on paper to:
-
- GNU Compiler Bugs
- Free Software Foundation
- 59 Temple Place - Suite 330
- Boston, MA 02111-1307, USA
-
diff --git a/gcc/f/g77.info-18 b/gcc/f/g77.info-18
index 34be0ea71a4..824e6403d68 100644
--- a/gcc/f/g77.info-18
+++ b/gcc/f/g77.info-18
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,179 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
+
+Have You Found a Bug?
+=====================
+
+ If you are not sure whether you have found a bug, here are some
+guidelines:
+
+ * If the compiler gets a fatal signal, for any input whatever, that
+ is a compiler bug. Reliable compilers never crash--they just
+ remain obsolete.
+
+ * If the compiler produces invalid assembly code, for any input
+ whatever, that is a compiler bug, unless the compiler reports
+ errors (not just warnings) which would ordinarily prevent the
+ assembler from being run.
+
+ * If the compiler produces valid assembly code that does not
+ correctly execute the input source code, that is a compiler bug.
+
+ However, you must double-check to make sure, because you might
+ have run into an incompatibility between GNU Fortran and
+ traditional Fortran. These incompatibilities might be considered
+ bugs, but they are inescapable consequences of valuable features.
+
+ Or you might have a program whose behavior is undefined, which
+ happened by chance to give the desired results with another
+ Fortran compiler. It is best to check the relevant Fortran
+ standard thoroughly if it is possible that the program indeed does
+ something undefined.
+
+ After you have localized the error to a single source line, it
+ should be easy to check for these things. If your program is
+ correct and well defined, you have found a compiler bug.
+
+ It might help if, in your submission, you identified the specific
+ language in the relevant Fortran standard that specifies the
+ desired behavior, if it isn't likely to be obvious and agreed-upon
+ by all Fortran users.
+
+ * If the compiler produces an error message for valid input, that is
+ a compiler bug.
+
+ * If the compiler does not produce an error message for invalid
+ input, that is a compiler bug. However, you should note that your
+ idea of "invalid input" might be someone else's idea of "an
+ extension" or "support for traditional practice".
+
+ * If you are an experienced user of Fortran compilers, your
+ suggestions for improvement of GNU Fortran are welcome in any case.
+
+ Many, perhaps most, bug reports against `g77' turn out to be bugs in
+the user's code. While we find such bug reports educational, they
+sometimes take a considerable amount of time to track down or at least
+respond to--time we could be spending making `g77', not some user's
+code, better.
+
+ Some steps you can take to verify that the bug is not certainly in
+the code you're compiling with `g77':
+
+ * Compile your code using the `g77' options `-W -Wall -O'. These
+ options enable many useful warning; the `-O' option enables flow
+ analysis that enables the uninitialized-variable warning.
+
+ If you investigate the warnings and find evidence of possible bugs
+ in your code, fix them first and retry `g77'.
+
+ * Compile your code using the `g77' options `-finit-local-zero',
+ `-fno-automatic', `-ffloat-store', and various combinations
+ thereof.
+
+ If your code works with any of these combinations, that is not
+ proof that the bug isn't in `g77'--a `g77' bug exposed by your
+ code might simply be avoided, or have a different, more subtle
+ effect, when different options are used--but it can be a strong
+ indicator that your code is making unawarranted assumptions about
+ the Fortran dialect and/or underlying machine it is being compiled
+ and run on.
+
+ *Note Overly Convenient Command-Line Options: Overly Convenient
+ Options, for information on the `-fno-automatic' and
+ `-finit-local-zero' options and how to convert their use into
+ selective changes in your own code.
+
+ * Validate your code with `ftnchek' or a similar code-checking tool.
+ `ftncheck' can be found at `ftp://ftp.netlib.org/fortran' or
+ `ftp://ftp.dsm.fordham.edu'.
+
+ Here are some sample `Makefile' rules using `ftnchek' "project"
+ files to do cross-file checking and `sfmakedepend' (from
+ `ftp://ahab.rutgers.edu/pub/perl/sfmakedepend') to maintain
+ dependencies automatically. These assume the use of GNU `make'.
+
+ # 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)
+
+ * Try your code out using other Fortran compilers, such as `f2c'.
+ If it does not work on at least one other compiler (assuming the
+ compiler supports the features the code needs), that is a strong
+ indicator of a bug in the code.
+
+ However, even if your code works on many compilers *except* `g77',
+ that does *not* mean the bug is in `g77'. It might mean the bug
+ is in your code, and that `g77' simply exposes it more readily
+ than other compilers.
+
+
+File: g77.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
+
+Where to Report Bugs
+====================
+
+ Send bug reports for GNU Fortran to <fortran@gnu.org>.
+
+ Often people think of posting bug reports to a newsgroup instead of
+mailing them. This sometimes appears to work, but it has one problem
+which can be crucial: a newsgroup posting does not contain a mail path
+back to the sender. Thus, if maintainers need more information, they
+might be unable to reach you. For this reason, you should always send
+bug reports by mail to the proper mailing list.
+
+ As a last resort, send bug reports on paper to:
+
+ GNU Compiler Bugs
+ Free Software Foundation
+ 59 Temple Place - Suite 330
+ Boston, MA 02111-1307, USA
+
+
File: g77.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Bugs
How to Report Bugs
@@ -317,7 +490,7 @@ Sending Patches for GNU Fortran
If you would like to write bug fixes or improvements for the GNU
Fortran compiler, that is very helpful. Send suggested fixes to the
-bug report mailing list, <fortran@gnu.ai.mit.edu>.
+bug report mailing list, <fortran@gnu.org>.
Please follow these guidelines so we can study your patches
efficiently. If you don't follow these guidelines, your information
@@ -438,7 +611,7 @@ are two ways to find it:
fee. The service directory is found in the file named `SERVICE'
in the GNU CC distribution.
- * Send a message to <fortran@gnu.ai.mit.edu>.
+ * Send a message to <fortran@gnu.org>.

File: g77.info, Node: Adding Options, Next: Projects, Prev: Service, Up: Top
@@ -933,8 +1106,8 @@ that the explanations are given below, and the diagnostics themselves
identify the appropriate explanation.
Identification uses the GNU Info format--specifically, the `info'
-command that displays the explanation is given in within square
-brackets in the diagnostic. For example:
+command that displays the explanation is given within square brackets
+in the diagnostic. For example:
foo.f:5: Invalid statement [info -f g77 M FOOEY]
@@ -956,170 +1129,3 @@ text you're reading now), `FOOEY' is the menu item to select.
* LEX:: Various lexer messages
* GLOBALS:: Disagreements about globals.
-
-File: g77.info, Node: CMPAMBIG, Next: EXPIMP, Up: Diagnostics
-
-`CMPAMBIG'
-==========
-
- Ambiguous use of intrinsic INTRINSIC ...
-
- The type of the argument to the invocation of the INTRINSIC
-intrinsic is a `COMPLEX' type other than `COMPLEX(KIND=1)'. Typically,
-it is `COMPLEX(KIND=2)', also known as `DOUBLE COMPLEX'.
-
- The interpretation of this invocation depends on the particular
-dialect of Fortran for which the code was written. Some dialects
-convert the real part of the argument to `REAL(KIND=1)', thus losing
-precision; other dialects, and Fortran 90, do no such conversion.
-
- So, GNU Fortran rejects such invocations except under certain
-circumstances, to avoid making an incorrect assumption that results in
-generating the wrong code.
-
- To determine the dialect of the program unit, perhaps even whether
-that particular invocation is properly coded, determine how the result
-of the intrinsic is used.
-
- The result of INTRINSIC is expected (by the original programmer) to
-be `REAL(KIND=1)' (the non-Fortran-90 interpretation) if:
-
- * It is passed as an argument to a procedure that explicitly or
- implicitly declares that argument `REAL(KIND=1)'.
-
- For example, a procedure with no `DOUBLE PRECISION' or `IMPLICIT
- DOUBLE PRECISION' statement specifying the dummy argument
- corresponding to an actual argument of `REAL(Z)', where `Z' is
- declared `DOUBLE COMPLEX', strongly suggests that the programmer
- expected `REAL(Z)' to return `REAL(KIND=1)' instead of
- `REAL(KIND=2)'.
-
- * It is used in a context that would otherwise not include any
- `REAL(KIND=2)' but where treating the INTRINSIC invocation as
- `REAL(KIND=2)' would result in unnecessary promotions and
- (typically) more expensive operations on the wider type.
-
- For example:
-
- DOUBLE COMPLEX Z
- ...
- R(1) = T * REAL(Z)
-
- The above example suggests the programmer expected the real part
- of `Z' to be converted to `REAL(KIND=1)' before being multiplied
- by `T' (presumed, along with `R' above, to be type `REAL(KIND=1)').
-
- Otherwise, the conversion would have to be delayed until after the
- multiplication, requiring not only an extra conversion (of `T' to
- `REAL(KIND=2)'), but a (typically) more expensive multiplication
- (a double-precision multiplication instead of a single-precision
- one).
-
- The result of INTRINSIC is expected (by the original programmer) to
-be `REAL(KIND=2)' (the Fortran 90 interpretation) if:
-
- * It is passed as an argument to a procedure that explicitly or
- implicitly declares that argument `REAL(KIND=2)'.
-
- For example, a procedure specifying a `DOUBLE PRECISION' dummy
- argument corresponding to an actual argument of `REAL(Z)', where
- `Z' is declared `DOUBLE COMPLEX', strongly suggests that the
- programmer expected `REAL(Z)' to return `REAL(KIND=2)' instead of
- `REAL(KIND=1)'.
-
- * It is used in an expression context that includes other
- `REAL(KIND=2)' operands, or is assigned to a `REAL(KIND=2)'
- variable or array element.
-
- For example:
-
- DOUBLE COMPLEX Z
- DOUBLE PRECISION R, T
- ...
- R(1) = T * REAL(Z)
-
- The above example suggests the programmer expected the real part
- of `Z' to *not* be converted to `REAL(KIND=1)' by the `REAL()'
- intrinsic.
-
- Otherwise, the conversion would have to be immediately followed by
- a conversion back to `REAL(KIND=2)', losing the original, full
- precision of the real part of `Z', before being multiplied by `T'.
-
- Once you have determined whether a particular invocation of INTRINSIC
-expects the Fortran 90 interpretation, you can:
-
- * Change it to `DBLE(EXPR)' (if INTRINSIC is `REAL') or
- `DIMAG(EXPR)' (if INTRINSIC is `AIMAG') if it expected the Fortran
- 90 interpretation.
-
- This assumes EXPR is `COMPLEX(KIND=2)'--if it is some other type,
- such as `COMPLEX*32', you should use the appropriate intrinsic,
- such as the one to convert to `REAL*16' (perhaps `DBLEQ()' in
- place of `DBLE()', and `QIMAG()' in place of `DIMAG()').
-
- * Change it to `REAL(INTRINSIC(EXPR))', otherwise. This converts to
- `REAL(KIND=1)' in all working Fortran compilers.
-
- If you don't want to change the code, and you are certain that all
-ambiguous invocations of INTRINSIC in the source file have the same
-expectation regarding interpretation, you can:
-
- * Compile with the `g77' option `-ff90', to enable the Fortran 90
- interpretation.
-
- * Compile with the `g77' options `-fno-f90 -fugly-complex', to
- enable the non-Fortran-90 interpretations.
-
- *Note REAL() and AIMAG() of Complex::, for more information on this
-issue.
-
- Note: If the above suggestions don't produce enough evidence as to
-whether a particular program expects the Fortran 90 interpretation of
-this ambiguous invocation of INTRINSIC, there is one more thing you can
-try.
-
- If you have access to most or all the compilers used on the program
-to create successfully tested and deployed executables, read the
-documentation for, and *also* test out, each compiler to determine how
-it treats the INTRINSIC intrinsic in this case. (If all the compilers
-don't agree on an interpretation, there might be lurking bugs in the
-deployed versions of the program.)
-
- The following sample program might help:
-
- PROGRAM JCB003
- 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
- C and AIMAG on DOUBLE COMPLEX operands.
- C
- DOUBLE COMPLEX Z
- REAL R
- Z = (3.3D0, 4.4D0)
- R = Z
- CALL DUMDUM(Z, R)
- R = REAL(Z) - R
- IF (R .NE. 0.) PRINT *, 'REAL() is Fortran 90'
- IF (R .EQ. 0.) PRINT *, 'REAL() is not Fortran 90'
- R = 4.4D0
- CALL DUMDUM(Z, R)
- R = AIMAG(Z) - R
- IF (R .NE. 0.) PRINT *, 'AIMAG() is Fortran 90'
- IF (R .EQ. 0.) PRINT *, 'AIMAG() is not Fortran 90'
- END
- C
- C Just to make sure compiler doesn't use naive flow
- C analysis to optimize away careful work above,
- C which might invalidate results....
- C
- SUBROUTINE DUMDUM(Z, R)
- DOUBLE COMPLEX Z
- REAL R
- END
-
- If the above program prints contradictory results on a particular
-compiler, run away!
-
diff --git a/gcc/f/g77.info-19 b/gcc/f/g77.info-19
index a75f2f2d988..ee40c80f3b0 100644
--- a/gcc/f/g77.info-19
+++ b/gcc/f/g77.info-19
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,173 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: CMPAMBIG, Next: EXPIMP, Up: Diagnostics
+
+`CMPAMBIG'
+==========
+
+ Ambiguous use of intrinsic INTRINSIC ...
+
+ The type of the argument to the invocation of the INTRINSIC
+intrinsic is a `COMPLEX' type other than `COMPLEX(KIND=1)'. Typically,
+it is `COMPLEX(KIND=2)', also known as `DOUBLE COMPLEX'.
+
+ The interpretation of this invocation depends on the particular
+dialect of Fortran for which the code was written. Some dialects
+convert the real part of the argument to `REAL(KIND=1)', thus losing
+precision; other dialects, and Fortran 90, do no such conversion.
+
+ So, GNU Fortran rejects such invocations except under certain
+circumstances, to avoid making an incorrect assumption that results in
+generating the wrong code.
+
+ To determine the dialect of the program unit, perhaps even whether
+that particular invocation is properly coded, determine how the result
+of the intrinsic is used.
+
+ The result of INTRINSIC is expected (by the original programmer) to
+be `REAL(KIND=1)' (the non-Fortran-90 interpretation) if:
+
+ * It is passed as an argument to a procedure that explicitly or
+ implicitly declares that argument `REAL(KIND=1)'.
+
+ For example, a procedure with no `DOUBLE PRECISION' or `IMPLICIT
+ DOUBLE PRECISION' statement specifying the dummy argument
+ corresponding to an actual argument of `REAL(Z)', where `Z' is
+ declared `DOUBLE COMPLEX', strongly suggests that the programmer
+ expected `REAL(Z)' to return `REAL(KIND=1)' instead of
+ `REAL(KIND=2)'.
+
+ * It is used in a context that would otherwise not include any
+ `REAL(KIND=2)' but where treating the INTRINSIC invocation as
+ `REAL(KIND=2)' would result in unnecessary promotions and
+ (typically) more expensive operations on the wider type.
+
+ For example:
+
+ DOUBLE COMPLEX Z
+ ...
+ R(1) = T * REAL(Z)
+
+ The above example suggests the programmer expected the real part
+ of `Z' to be converted to `REAL(KIND=1)' before being multiplied
+ by `T' (presumed, along with `R' above, to be type `REAL(KIND=1)').
+
+ Otherwise, the conversion would have to be delayed until after the
+ multiplication, requiring not only an extra conversion (of `T' to
+ `REAL(KIND=2)'), but a (typically) more expensive multiplication
+ (a double-precision multiplication instead of a single-precision
+ one).
+
+ The result of INTRINSIC is expected (by the original programmer) to
+be `REAL(KIND=2)' (the Fortran 90 interpretation) if:
+
+ * It is passed as an argument to a procedure that explicitly or
+ implicitly declares that argument `REAL(KIND=2)'.
+
+ For example, a procedure specifying a `DOUBLE PRECISION' dummy
+ argument corresponding to an actual argument of `REAL(Z)', where
+ `Z' is declared `DOUBLE COMPLEX', strongly suggests that the
+ programmer expected `REAL(Z)' to return `REAL(KIND=2)' instead of
+ `REAL(KIND=1)'.
+
+ * It is used in an expression context that includes other
+ `REAL(KIND=2)' operands, or is assigned to a `REAL(KIND=2)'
+ variable or array element.
+
+ For example:
+
+ DOUBLE COMPLEX Z
+ DOUBLE PRECISION R, T
+ ...
+ R(1) = T * REAL(Z)
+
+ The above example suggests the programmer expected the real part
+ of `Z' to *not* be converted to `REAL(KIND=1)' by the `REAL()'
+ intrinsic.
+
+ Otherwise, the conversion would have to be immediately followed by
+ a conversion back to `REAL(KIND=2)', losing the original, full
+ precision of the real part of `Z', before being multiplied by `T'.
+
+ Once you have determined whether a particular invocation of INTRINSIC
+expects the Fortran 90 interpretation, you can:
+
+ * Change it to `DBLE(EXPR)' (if INTRINSIC is `REAL') or
+ `DIMAG(EXPR)' (if INTRINSIC is `AIMAG') if it expected the Fortran
+ 90 interpretation.
+
+ This assumes EXPR is `COMPLEX(KIND=2)'--if it is some other type,
+ such as `COMPLEX*32', you should use the appropriate intrinsic,
+ such as the one to convert to `REAL*16' (perhaps `DBLEQ()' in
+ place of `DBLE()', and `QIMAG()' in place of `DIMAG()').
+
+ * Change it to `REAL(INTRINSIC(EXPR))', otherwise. This converts to
+ `REAL(KIND=1)' in all working Fortran compilers.
+
+ If you don't want to change the code, and you are certain that all
+ambiguous invocations of INTRINSIC in the source file have the same
+expectation regarding interpretation, you can:
+
+ * Compile with the `g77' option `-ff90', to enable the Fortran 90
+ interpretation.
+
+ * Compile with the `g77' options `-fno-f90 -fugly-complex', to
+ enable the non-Fortran-90 interpretations.
+
+ *Note REAL() and AIMAG() of Complex::, for more information on this
+issue.
+
+ Note: If the above suggestions don't produce enough evidence as to
+whether a particular program expects the Fortran 90 interpretation of
+this ambiguous invocation of INTRINSIC, there is one more thing you can
+try.
+
+ If you have access to most or all the compilers used on the program
+to create successfully tested and deployed executables, read the
+documentation for, and *also* test out, each compiler to determine how
+it treats the INTRINSIC intrinsic in this case. (If all the compilers
+don't agree on an interpretation, there might be lurking bugs in the
+deployed versions of the program.)
+
+ The following sample program might help:
+
+ PROGRAM JCB003
+ 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
+ C and AIMAG on DOUBLE COMPLEX operands.
+ C
+ DOUBLE COMPLEX Z
+ REAL R
+ Z = (3.3D0, 4.4D0)
+ R = Z
+ CALL DUMDUM(Z, R)
+ R = REAL(Z) - R
+ IF (R .NE. 0.) PRINT *, 'REAL() is Fortran 90'
+ IF (R .EQ. 0.) PRINT *, 'REAL() is not Fortran 90'
+ R = 4.4D0
+ CALL DUMDUM(Z, R)
+ R = AIMAG(Z) - R
+ IF (R .NE. 0.) PRINT *, 'AIMAG() is Fortran 90'
+ IF (R .EQ. 0.) PRINT *, 'AIMAG() is not Fortran 90'
+ END
+ C
+ C Just to make sure compiler doesn't use naive flow
+ C analysis to optimize away careful work above,
+ C which might invalidate results....
+ C
+ SUBROUTINE DUMDUM(Z, R)
+ DOUBLE COMPLEX Z
+ REAL R
+ END
+
+ If the above program prints contradictory results on a particular
+compiler, run away!
+
+
File: g77.info, Node: EXPIMP, Next: INTGLOB, Prev: CMPAMBIG, Up: Diagnostics
`EXPIMP'
diff --git a/gcc/f/g77.info-2 b/gcc/f/g77.info-2
index 191b4c8d0e8..c690eb493ae 100644
--- a/gcc/f/g77.info-2
+++ b/gcc/f/g77.info-2
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -315,9 +315,10 @@ compiler accepts:
*Note Ugly Assumed-Size Arrays::, for more information.
`-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.
+ 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, `CALL FOO(,)' is treated as `CALL FOO(%VAL(0),
%VAL(0))'. That is, *two* null arguments are specified by the
@@ -325,7 +326,8 @@ compiler accepts:
is treated as `F = FUNC(%VAL(0))'.
The default behavior, `-fno-ugly-comma', is to ignore a single
- trailing comma in an argument list.
+ trailing comma in an argument list. So, by default, `CALL
+ FOO(X,)' is treated exactly the same as `CALL FOO(X)'.
*Note Ugly Null Arguments::, for more information.
@@ -473,6 +475,17 @@ compiler accepts:
example, `call Foo(i,I)' would pass two *different* variables
named `i' and `I' to a procedure named `Foo'.)
+`-fbadu77-intrinsics-delete'
+
+`-fbadu77-intrinsics-hide'
+
+`-fbadu77-intrinsics-disable'
+
+`-fbadu77-intrinsics-enable'
+ Specify status of UNIX intrinsics having inappropriate forms.
+ `-fbadu77-intrinsics-enable' is the default. *Note Intrinsic
+ Groups::.
+
`-ff2c-intrinsics-delete'
`-ff2c-intrinsics-hide'
@@ -481,7 +494,8 @@ compiler accepts:
`-ff2c-intrinsics-enable'
Specify status of f2c-specific intrinsics.
- `-ff2c-intrinsics-enable' is the default.
+ `-ff2c-intrinsics-enable' is the default. *Note Intrinsic
+ Groups::.
`-ff90-intrinsics-delete'
@@ -491,7 +505,8 @@ compiler accepts:
`-ff90-intrinsics-enable'
Specify status of F90-specific intrinsics.
- `-ff90-intrinsics-enable' is the default.
+ `-ff90-intrinsics-enable' is the default. *Note Intrinsic
+ Groups::.
`-fgnu-intrinsics-delete'
@@ -501,7 +516,8 @@ compiler accepts:
`-fgnu-intrinsics-enable'
Specify status of Digital's COMPLEX-related intrinsics.
- `-fgnu-intrinsics-enable' is the default.
+ `-fgnu-intrinsics-enable' is the default. *Note Intrinsic
+ Groups::.
`-fmil-intrinsics-delete'
@@ -511,7 +527,8 @@ compiler accepts:
`-fmil-intrinsics-enable'
Specify status of MIL-STD-1753-specific intrinsics.
- `-fmil-intrinsics-enable' is the default.
+ `-fmil-intrinsics-enable' is the default. *Note Intrinsic
+ Groups::.
`-funix-intrinsics-delete'
@@ -521,7 +538,7 @@ compiler accepts:
`-funix-intrinsics-enable'
Specify status of UNIX intrinsics. `-funix-intrinsics-enable' is
- the default.
+ the default. *Note Intrinsic Groups::.
`-fvxt-intrinsics-delete'
@@ -531,7 +548,7 @@ compiler accepts:
`-fvxt-intrinsics-enable'
Specify status of VXT intrinsics. `-fvxt-intrinsics-enable' is
- the default.
+ the default. *Note Intrinsic Groups::.
`-ffixed-line-length-N'
Set column after which characters are ignored in typical fixed-form
diff --git a/gcc/f/g77.info-20 b/gcc/f/g77.info-20
index f824bd51f9b..ccb9f42fbe7 100644
--- a/gcc/f/g77.info-20
+++ b/gcc/f/g77.info-20
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -45,6 +45,7 @@ Index
* Menu:
+* "infinite spaces" printed: Strange Behavior at Run Time.
* #define: Overall Options.
* #if: Overall Options.
* #include: Overall Options.
@@ -64,6 +65,10 @@ Index
* -fargument-alias option: Code Gen Options.
* -fargument-noalias option <1>: Aliasing Assumed To Work.
* -fargument-noalias option: Code Gen Options.
+* -fbadu77-intrinsics-delete option: Fortran Dialect Options.
+* -fbadu77-intrinsics-disable option: Fortran Dialect Options.
+* -fbadu77-intrinsics-enable option: Fortran Dialect Options.
+* -fbadu77-intrinsics-hide option: Fortran Dialect Options.
* -fcaller-saves option: Optimize Options.
* -fcase-initcap option: Fortran Dialect Options.
* -fcase-lower option: Fortran Dialect Options.
@@ -163,7 +168,6 @@ Index
* -fugly option: Shorthand Options.
* -fugly-assign option: Fortran Dialect Options.
* -fugly-assumed option: Fortran Dialect Options.
-* -fugly-comma option <1>: Actual Bugs.
* -fugly-comma option: Fortran Dialect Options.
* -fugly-complex option: Fortran Dialect Options.
* -fugly-logint option: Fortran Dialect Options.
@@ -188,7 +192,8 @@ Index
* -malign-double option: Optimize Options.
* -Nl option: Compiler Limits.
* -Nx option: Compiler Limits.
-* -O2: Actual Bugs.
+* -O2 <1>: Actual Bugs.
+* -O2: News.
* -pedantic option: Warning Options.
* -pedantic-errors option: Warning Options.
* -r8: Increasing Precision/Range.
@@ -223,7 +228,6 @@ Index
* 586/686 CPUs: Use Submodel Options.
* 64-bit systems: Alpha Problems Fixed.
* _strtoul: Missing strtoul.
-* `infinite spaces' printed: Strange Behavior at Run Time.
* Abort intrinsic: Abort Intrinsic.
* Abs intrinsic: Abs Intrinsic.
* ACCEPT statement: TYPE and ACCEPT I/O Statements.
@@ -253,6 +257,7 @@ Index
* ALog intrinsic: ALog Intrinsic.
* ALog10 intrinsic: ALog10 Intrinsic.
* Alpha: Actual Bugs.
+* Alpha, Digital: System-specific Problems.
* Alpha, support <1>: Actual Bugs.
* Alpha, support: Alpha Problems Fixed.
* alternate entry points: Alternate Entry Points.
@@ -308,10 +313,13 @@ Index
* automatic arrays <2>: Stack Overflow.
* automatic arrays <3>: Overly Convenient Options.
* automatic arrays: Adjustable Arrays.
+* AXP: System-specific Problems.
* back end, gcc: What is GNU Fortran?.
* backslash <1>: Backslash in Constants.
* backslash: Fortran Dialect Options.
* backtrace for bug reports: Bug Reporting.
+* badu77 intrinsics: Fortran Dialect Options.
+* badu77 intrinsics group: Intrinsic Groups.
* basic concepts: What is GNU Fortran?.
* beginners: Getting Started.
* BesJ0 intrinsic: BesJ0 Intrinsic.
@@ -495,7 +503,7 @@ Index
* cpp program <2>: Preprocessor Options.
* cpp program <3>: Overall Options.
* cpp program: What is GNU Fortran?.
-* Cpu_Time intrinsic: Cpu_Time Intrinsic.
+* CPU_Time intrinsic: CPU_Time Intrinsic.
* Cray pointers: POINTER Statements.
* creating patch files: Merging Distributions.
* credits: Contributors.
@@ -546,6 +554,7 @@ Index
* debugging: Debugging and Interfacing.
* debugging information options: Debugging Options.
* debugging main source code: Actual Bugs.
+* DEC Alpha: System-specific Problems.
* DECODE statement: ENCODE and DECODE.
* deleted intrinsics: Intrinsic Groups.
* DErF intrinsic: DErF Intrinsic.
@@ -558,6 +567,7 @@ Index
* diagnostics, incorrect: What is GNU Fortran?.
* dialect options: Fortran Dialect Options.
* differences between object files: Object File Differences.
+* Digital Alpha: System-specific Problems.
* Digital Fortran features: Fortran Dialect Options.
* Digits intrinsic: Digits Intrinsic.
* DiM intrinsic: DiM Intrinsic.
@@ -590,7 +600,7 @@ Index
* DMin1 intrinsic: DMin1 Intrinsic.
* DMod intrinsic: DMod Intrinsic.
* DNInt intrinsic: DNInt Intrinsic.
-* DNRM2: Actual Bugs.
+* DNRM2: News.
* DO loops, one-trip: Fortran Dialect Options.
* DO statement <1>: Loops.
* DO statement: Warning Options.
@@ -662,6 +672,7 @@ Index
* f2c compatibility <5>: Shorthand Options.
* f2c compatibility: Overall Options.
* f2c intrinsics: Fortran Dialect Options.
+* f2c intrinsics group: Intrinsic Groups.
* F2C_INSTALL_FLAG: Installing f2c.
* F2CLIBOK: Installing f2c.
* f77 command: Installing f77.
@@ -670,6 +681,7 @@ Index
* f771 program: What is GNU Fortran?.
* f771, linking error for: Missing strtoul.
* F77_INSTALL_FLAG: Installing f77.
+* f90 intrinsics group: Intrinsic Groups.
* fatal signal: Bug Criteria.
* Fdate intrinsic <1>: Fdate Intrinsic (function).
* Fdate intrinsic: Fdate Intrinsic (subroutine).
@@ -782,6 +794,7 @@ Index
* GNU C required: GNU C Required.
* GNU Fortran command options: Invoking G77.
* GNU Fortran Front End (FFE): What is GNU Fortran?.
+* gnu intrinsics group: Intrinsic Groups.
* GNU version numbering: Merging Distributions.
* GOTO statement: Assigned Statement Labels.
* gperf: Missing gperf?.
@@ -924,6 +937,7 @@ Index
* intrinsics, ATan2: ATan2 Intrinsic.
* intrinsics, ATan2D: ATan2D Intrinsic.
* intrinsics, ATanD: ATanD Intrinsic.
+* intrinsics, badu77: Fortran Dialect Options.
* intrinsics, BesJ0: BesJ0 Intrinsic.
* intrinsics, BesJ1: BesJ1 Intrinsic.
* intrinsics, BesJN: BesJN Intrinsic.
@@ -960,7 +974,7 @@ Index
* intrinsics, CosD: CosD Intrinsic.
* intrinsics, CosH: CosH Intrinsic.
* intrinsics, Count: Count Intrinsic.
-* intrinsics, Cpu_Time: Cpu_Time Intrinsic.
+* intrinsics, CPU_Time: CPU_Time Intrinsic.
* intrinsics, CShift: CShift Intrinsic.
* intrinsics, CSin: CSin Intrinsic.
* intrinsics, CSqRt: CSqRt Intrinsic.
@@ -1265,7 +1279,6 @@ Index
* intrinsics, Sign: Sign Intrinsic.
* intrinsics, Signal <1>: Signal Intrinsic (function).
* intrinsics, Signal: Signal Intrinsic (subroutine).
-* intrinsics, SIGNAL(): Actual Bugs.
* intrinsics, Sin: Sin Intrinsic.
* intrinsics, SinD: SinD Intrinsic.
* intrinsics, SinH: SinH Intrinsic.
@@ -1320,12 +1333,13 @@ Index
* IOr intrinsic: IOr Intrinsic.
* IOSTAT=: Run-time Library Errors.
* IRand intrinsic: IRand Intrinsic.
+* Irix 6: System-specific Problems.
* IsaTty intrinsic: IsaTty Intrinsic.
* IShft intrinsic: IShft Intrinsic.
* IShftC intrinsic: IShftC Intrinsic.
* ISign intrinsic: ISign Intrinsic.
* ITime intrinsic: ITime Intrinsic.
-* ix86: Actual Bugs.
+* ix86: News.
* IZExt intrinsic: IZExt Intrinsic.
* JCB002 program: Generics and Specifics.
* JCB003 program: CMPAMBIG.
@@ -1437,6 +1451,7 @@ Index
* MAIN__(): Main Program Unit.
* make clean: Cleanup Kills Stage Directories.
* make compare: Object File Differences.
+* Makefile example: Bug Criteria.
* makeinfo: Missing makeinfo?.
* MAP statement: STRUCTURE UNION RECORD MAP.
* MatMul intrinsic: MatMul Intrinsic.
@@ -1460,6 +1475,7 @@ Index
* messages, run-time: Run-time Library Errors.
* messages, warning: Warning Options.
* messages, warning and error: Warnings and Errors.
+* mil intrinsics group: Intrinsic Groups.
* MIL-STD 1753 <1>: MIL-STD 1753.
* MIL-STD 1753 <2>: END DO.
* MIL-STD 1753 <3>: DO WHILE.
@@ -1531,6 +1547,10 @@ Index
* options, -fargument-alias: Code Gen Options.
* options, -fargument-noalias <1>: Aliasing Assumed To Work.
* options, -fargument-noalias: Code Gen Options.
+* options, -fbadu77-intrinsics-delete: Fortran Dialect Options.
+* options, -fbadu77-intrinsics-disable: Fortran Dialect Options.
+* options, -fbadu77-intrinsics-enable: Fortran Dialect Options.
+* options, -fbadu77-intrinsics-hide: Fortran Dialect Options.
* options, -fcaller-saves: Optimize Options.
* options, -fcase-initcap: Fortran Dialect Options.
* options, -fcase-lower: Fortran Dialect Options.
@@ -1628,7 +1648,6 @@ Index
* options, -fugly: Shorthand Options.
* options, -fugly-assign: Fortran Dialect Options.
* options, -fugly-assumed: Fortran Dialect Options.
-* options, -fugly-comma <1>: Actual Bugs.
* options, -fugly-comma: Fortran Dialect Options.
* options, -fugly-complex: Fortran Dialect Options.
* options, -fugly-logint: Fortran Dialect Options.
@@ -1820,7 +1839,6 @@ Index
* rounding errors: Floating-point Errors.
* row-major ordering: Arrays.
* RRSpacing intrinsic: RRSpacing Intrinsic.
-* RS/6000 support: Actual Bugs.
* RShift intrinsic: RShift Intrinsic.
* run-time library: What is GNU Fortran?.
* run-time options: Code Gen Options.
@@ -1847,7 +1865,7 @@ Index
* separate distributions: Merging Distributions.
* sequence numbers: Better Source Model.
* Set_Exponent intrinsic: Set_Exponent Intrinsic.
-* SGI support: Actual Bugs.
+* SGI: System-specific Problems.
* Shape intrinsic: Shape Intrinsic.
* SHIFT intrinsic: Bit Operations on Floating-point Data.
* Short intrinsic: Short Intrinsic.
@@ -1858,7 +1876,6 @@ Index
* signal 11: Signal 11 and Friends.
* Signal intrinsic <1>: Signal Intrinsic (function).
* Signal intrinsic: Signal Intrinsic (subroutine).
-* SIGNAL() intrinsic: Actual Bugs.
* signature of procedures: Procedures.
* simplify porting: Simplify Porting.
* Sin intrinsic: Sin Intrinsic.
@@ -1898,7 +1915,7 @@ Index
* SRand intrinsic: SRand Intrinsic.
* stack allocation: Maximum Stackable Size.
* stack overflow: Stack Overflow.
-* stack, 387 coprocessor: Actual Bugs.
+* stack, 387 coprocessor: News.
* stack, aligned: Aligned Data.
* stage directories: Cleanup Kills Stage Directories.
* standard support: Standard Support.
@@ -1974,8 +1991,6 @@ Index
* support, f77: Backslash in Constants.
* support, Fortran 90: Fortran 90 Support.
* support, gdb: Debugger Problems.
-* support, RS/6000: Actual Bugs.
-* support, SGI: Actual Bugs.
* suppressing warnings: Warning Options.
* symbol names <1>: Names.
* symbol names: Fortran Dialect Options.
diff --git a/gcc/f/g77.info-3 b/gcc/f/g77.info-3
index c8b772e11c8..15a7de0ea81 100644
--- a/gcc/f/g77.info-3
+++ b/gcc/f/g77.info-3
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
diff --git a/gcc/f/g77.info-4 b/gcc/f/g77.info-4
index ca26588ccdf..4199dfabc76 100644
--- a/gcc/f/g77.info-4
+++ b/gcc/f/g77.info-4
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -46,11 +46,125 @@ News About GNU Fortran
Changes made to recent versions of GNU Fortran are listed 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.
+ The changes are generally listed in order:
+
+ 1. Code-generation and run-time-library bugs
+
+ 2. Compiler and run-time-library crashes involving valid code
+
+ 3. New features
+
+ 4. Fixes and enhancements to existing features
+
+ 5. New diagnostics
+
+ 6. Internal improvements
+
+ 7. Miscellany
+
+ This order is not strict--for example, some items involve a
+combination of these elements.
+
+In 0.5.22:
+==========
+
+ * Fix code generation for iterative `DO' loops that have one or more
+ references to the iteration variable, or to aliases of it, in
+ their control expressions. For example, `DO 10 J=2,J' now is
+ compiled correctly.
+
+ * Fix a code-generation bug that afflicted Intel x86 targets when
+ `-O2' was specified compiling, for example, an old version of the
+ `DNRM2' routine.
+
+ The x87 coprocessor stack was being mismanaged in cases involving
+ assigned `GOTO' and `ASSIGN'.
+
+ * Fix `DTime' intrinsic so as not to truncate results to integer
+ values (on some systems).
+
+ * Fix `SIGNAL' intrinsic so it offers portable support for 64-bit
+ systems (such as Digital Alphas running GNU/Linux).
+
+ * Fix run-time crash involving `NAMELIST' on 64-bit machines such as
+ Alphas.
+
+ * Fix `g77' version of `libf2c' so it no longer produces a spurious
+ `I/O recursion' diagnostic at run time when an I/O operation (such
+ as `READ *,I') is interrupted in a manner that causes the program
+ to be terminated via the `f_exit' routine (such as via `C-c').
+
+ * Fix `g77' crash triggered by `CASE' statement with an omitted
+ lower or upper bound.
+
+ * Fix `g77' crash compiling references to `CPU_Time' intrinsic.
+
+ * Fix `g77' crash (or apparently infinite run-time) when compiling
+ certain complicated expressions involving `COMPLEX' arithmetic
+ (especially multiplication).
+
+ * Fix `g77' crash on statements such as `PRINT *,
+ (REAL(Z(I)),I=1,2)', where `Z' is `DOUBLE COMPLEX'.
+
+ * Fix a `g++' crash.
+
+ * Support `FORMAT(I<EXPR>)' when EXPR is a compile-time constant
+ `INTEGER' expression.
+
+ * Fix `g77' `-g' option so procedures that use `ENTRY' can be
+ stepped through, line by line, in `gdb'.
+
+ * Fix a profiling-related bug in `gcc' back end for Intel x86
+ architecture.
+
+ * Allow any `REAL' argument to intrinsics `Second' and `CPU_Time'.
+
+ * Allow any numeric argument to intrinsics `Int2' and `Int8'.
+
+ * Use `tempnam', if available, to open scratch files (as in
+ `OPEN(STATUS='SCRATCH')' so that the `TMPDIR' environment variable,
+ if present, is used.
+
+ * Rename the `gcc' keyword `restrict' to `__restrict__', to avoid
+ rejecting valid, existing, C programs. Support for `restrict' is
+ now more like support for `complex'.
+
+ * Fix `-fpedantic' to not reject procedure invocations such as
+ `I=J()' and `CALL FOO()'.
+
+ * Fix `-fugly-comma' to affect invocations of only external
+ procedures. Restore rejection of gratuitous trailing omitted
+ arguments to intrinsics, as in `I=MAX(3,4,,)'.
+
+ * Fix compiler so it accepts `-fgnu-intrinsics-*' and
+ `-fbadu77-intrinsics-*' options.
+
+ * Improve diagnostic messages from `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 `f2c', `g77' did not append a null byte to its compiled
+ form of every format string specified via a `FORMAT' statement.
+ However, `f2c' would exhibit the problem anyway for a statement
+ like `PRINT '(I)garbage', 1' by printing `(I)garbage' as the
+ format string.)
+
+ * 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 `libf2c' for statements
+ like `PRINT '(I1', 42'.
+
+ * Fix various crashes involving code with diagnosed errors.
+
+ * Fix cross-compilation bug when configuring `libf2c'.
+
+ * Improve diagnostics.
+
+ * Improve documentation and indexing.
+
+ * Upgrade to `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).
In 0.5.21:
==========
diff --git a/gcc/f/g77.info-5 b/gcc/f/g77.info-5
index 47ecfc37791..ed5ba6fea1b 100644
--- a/gcc/f/g77.info-5
+++ b/gcc/f/g77.info-5
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -51,9 +51,9 @@ likely to affect how users use `g77'. *Note News About GNU Fortran:
News, for information on such changes to `g77'.
To find out about existing bugs and ongoing plans for GNU Fortran,
-retrieve `ftp://alpha.gnu.ai.mit.edu/g77.plan' or, if you cannot do
-that, email <fortran@gnu.ai.mit.edu> asking for a recent copy of the
-GNU Fortran `.plan' file.
+retrieve `ftp://alpha.gnu.org/g77.plan' or, if you cannot do that, email
+<fortran@gnu.org> asking for a recent copy of the GNU Fortran `.plan'
+file.
In 0.5.21:
==========
diff --git a/gcc/f/g77.info-6 b/gcc/f/g77.info-6
index f77f935683e..3d1dce422be 100644
--- a/gcc/f/g77.info-6
+++ b/gcc/f/g77.info-6
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -889,7 +889,7 @@ conform to their stated requirements:
C
C Version 0:
C Written by James Craig Burley 1997-02-20.
- C Contact via Internet email: burley@gnu.ai.mit.edu
+ C Contact via Internet email: burley@gnu.org
C
C Purpose:
C Determine how compilers handle non-standard IDIM
diff --git a/gcc/f/g77.info-7 b/gcc/f/g77.info-7
index 574a40aed03..a8cc9c254af 100644
--- a/gcc/f/g77.info-7
+++ b/gcc/f/g77.info-7
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -180,7 +180,7 @@ worse shape!)
* CosH Intrinsic:: Hyperbolic cosine.
* Count Intrinsic:: (Reserved for future use.)
-* Cpu_Time Intrinsic:: Get current CPU time.
+* CPU_Time Intrinsic:: Get current CPU time.
* CShift Intrinsic:: (Reserved for future use.)
* CSin Intrinsic:: Sine (archaic).
@@ -1360,6 +1360,10 @@ Description:
argument is supplied, it contains 0 on success or a non-zero error code
otherwise upon return. See `chdir(3)'.
+ *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 (optional)
STATUS argument.
@@ -1554,7 +1558,7 @@ Description:
Returns the hyperbolic cosine of X.

-File: g77.info, Node: Count Intrinsic, Next: Cpu_Time Intrinsic, Prev: CosH Intrinsic, Up: Table of Intrinsic Functions
+File: g77.info, Node: Count Intrinsic, Next: CPU_Time Intrinsic, Prev: CosH Intrinsic, Up: Table of Intrinsic Functions
Count Intrinsic
...............
@@ -1564,14 +1568,14 @@ reserved as an intrinsic. Use `EXTERNAL Count' to use this name for an
external procedure.

-File: g77.info, Node: Cpu_Time Intrinsic, Next: CShift Intrinsic, Prev: Count Intrinsic, Up: Table of Intrinsic Functions
+File: g77.info, Node: CPU_Time Intrinsic, Next: CShift Intrinsic, Prev: Count Intrinsic, Up: Table of Intrinsic Functions
-Cpu_Time Intrinsic
+CPU_Time Intrinsic
..................
- CALL Cpu_Time(SECONDS)
+ CALL CPU_Time(SECONDS)
-SECONDS: `REAL(KIND=1)'; scalar; INTENT(OUT).
+SECONDS: `REAL'; scalar; INTENT(OUT).
Intrinsic groups: `f90'.
@@ -1582,7 +1586,7 @@ implementation of the Fortran 95 intrinsic is just an alias for
`second' *Note Second Intrinsic (subroutine)::.

-File: g77.info, Node: CShift Intrinsic, Next: CSin Intrinsic, Prev: Cpu_Time Intrinsic, Up: Table of Intrinsic Functions
+File: g77.info, Node: CShift Intrinsic, Next: CSin Intrinsic, Prev: CPU_Time Intrinsic, Up: Table of Intrinsic Functions
CShift Intrinsic
................
@@ -1848,22 +1852,3 @@ Description:
Archaic form of `BESJN()' that is specific to one type for X. *Note
BesJN Intrinsic::.
-
-File: g77.info, Node: DbesY0 Intrinsic, Next: DbesY1 Intrinsic, Prev: DbesJN Intrinsic, Up: Table of Intrinsic Functions
-
-DbesY0 Intrinsic
-................
-
- DbesY0(X)
-
-DbesY0: `REAL(KIND=2)' function.
-
-X: `REAL(KIND=2)'; scalar; INTENT(IN).
-
-Intrinsic groups: `unix'.
-
-Description:
-
- Archaic form of `BESY0()' that is specific to one type for X. *Note
-BesY0 Intrinsic::.
-
diff --git a/gcc/f/g77.info-8 b/gcc/f/g77.info-8
index 34decb7f4dd..6f9b7de4718 100644
--- a/gcc/f/g77.info-8
+++ b/gcc/f/g77.info-8
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,25 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: DbesY0 Intrinsic, Next: DbesY1 Intrinsic, Prev: DbesJN Intrinsic, Up: Table of Intrinsic Functions
+
+DbesY0 Intrinsic
+................
+
+ DbesY0(X)
+
+DbesY0: `REAL(KIND=2)' function.
+
+X: `REAL(KIND=2)'; scalar; INTENT(IN).
+
+Intrinsic groups: `unix'.
+
+Description:
+
+ Archaic form of `BESY0()' that is specific to one type for X. *Note
+BesY0 Intrinsic::.
+
+
File: g77.info, Node: DbesY1 Intrinsic, Next: DbesYN Intrinsic, Prev: DbesY0 Intrinsic, Up: Table of Intrinsic Functions
DbesY1 Intrinsic
@@ -1311,6 +1330,11 @@ Description:
Returns the login name for the process in LOGIN.
+ *Caution:* On some systems, the `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
+LOGIN.
+

File: g77.info, Node: GetPId Intrinsic, Next: GetUId Intrinsic, Prev: GetLog Intrinsic, Up: Table of Intrinsic Functions
@@ -1909,7 +1933,7 @@ Int2 Intrinsic
Int2: `INTEGER(KIND=6)' function.
-A: `INTEGER'; scalar; INTENT(IN).
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
Intrinsic groups: `gnu'.
@@ -1937,7 +1961,7 @@ Int8 Intrinsic
Int8: `INTEGER(KIND=2)' function.
-A: `INTEGER'; scalar; INTENT(IN).
+A: `INTEGER', `REAL', or `COMPLEX'; scalar; INTENT(IN).
Intrinsic groups: `gnu'.
@@ -2025,31 +2049,3 @@ Description:
Returns `.TRUE.' if and only if the Fortran I/O unit specified by
UNIT is connected to a terminal device. See `isatty(3)'.
-
-File: g77.info, Node: IShft Intrinsic, Next: IShftC Intrinsic, Prev: IsaTty Intrinsic, Up: Table of Intrinsic Functions
-
-IShft Intrinsic
-...............
-
- IShft(I, SHIFT)
-
-IShft: `INTEGER' function, the `KIND=' value of the type being that of
-argument I.
-
-I: `INTEGER'; scalar; INTENT(IN).
-
-SHIFT: `INTEGER'; scalar; INTENT(IN).
-
-Intrinsic groups: `mil', `f90', `vxt'.
-
-Description:
-
- All bits representing I are shifted SHIFT places. `SHIFT.GT.0'
-indicates a left shift, `SHIFT.EQ.0' indicates no shift and
-`SHIFT.LT.0' indicates a right shift. If the absolute value of the
-shift count is greater than `BIT_SIZE(I)', the result is undefined.
-Bits shifted out from the left end or the right end, as the case may be,
-are lost. Zeros are shifted in from the opposite end.
-
- *Note IShftC Intrinsic:: for the circular-shift equivalent.
-
diff --git a/gcc/f/g77.info-9 b/gcc/f/g77.info-9
index bf0102c6b14..4d63fbebcc0 100644
--- a/gcc/f/g77.info-9
+++ b/gcc/f/g77.info-9
@@ -28,9 +28,9 @@ License," "Funding for Free Software," and "Protect Your Freedom--Fight
translations approved by the Free Software Foundation instead of in the
original English.
- Contributed by James Craig Burley (<burley@gnu.ai.mit.edu>).
-Inspired by a first pass at translating `g77-0.5.16/f/DOC' that was
-contributed to Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
+ Contributed by James Craig Burley (<burley@gnu.org>). Inspired by a
+first pass at translating `g77-0.5.16/f/DOC' that was contributed to
+Craig by David Ronis (<ronis@onsager.chem.mcgill.ca>).
INFO-DIR-SECTION Fortran Programming
START-INFO-DIR-ENTRY
@@ -38,6 +38,34 @@ START-INFO-DIR-ENTRY
END-INFO-DIR-ENTRY

+File: g77.info, Node: IShft Intrinsic, Next: IShftC Intrinsic, Prev: IsaTty Intrinsic, Up: Table of Intrinsic Functions
+
+IShft Intrinsic
+...............
+
+ IShft(I, SHIFT)
+
+IShft: `INTEGER' function, the `KIND=' value of the type being that of
+argument I.
+
+I: `INTEGER'; scalar; INTENT(IN).
+
+SHIFT: `INTEGER'; scalar; INTENT(IN).
+
+Intrinsic groups: `mil', `f90', `vxt'.
+
+Description:
+
+ All bits representing I are shifted SHIFT places. `SHIFT.GT.0'
+indicates a left shift, `SHIFT.EQ.0' indicates no shift and
+`SHIFT.LT.0' indicates a right shift. If the absolute value of the
+shift count is greater than `BIT_SIZE(I)', the result is undefined.
+Bits shifted out from the left end or the right end, as the case may be,
+are lost. Zeros are shifted in from the opposite end.
+
+ *Note IShftC Intrinsic:: for the circular-shift equivalent.
+
+
File: g77.info, Node: IShftC Intrinsic, Next: ISign Intrinsic, Prev: IShft Intrinsic, Up: Table of Intrinsic Functions
IShftC Intrinsic
@@ -396,7 +424,7 @@ Loc Intrinsic
Loc(ENTITY)
-Loc: `INTEGER(KIND=0)' function.
+Loc: `INTEGER(KIND=7)' function.
ENTITY: Any type; cannot be a constant or expression.
@@ -1417,8 +1445,6 @@ Description:
Returns the process's runtime in seconds--the same value as the UNIX
function `etime' returns.
- This routine is known from Cray Fortran.
-
For information on other intrinsics with the same name: *Note Second
Intrinsic (subroutine)::.
@@ -1430,7 +1456,7 @@ Second Intrinsic (subroutine)
CALL Second(SECONDS)
-SECONDS: `REAL(KIND=1)'; scalar; INTENT(OUT).
+SECONDS: `REAL'; scalar; INTENT(OUT).
Intrinsic groups: `unix'.
@@ -1439,7 +1465,7 @@ Description:
Returns the process's runtime in seconds in SECONDS--the same value
as the UNIX function `etime' returns.
- This routine is known from Cray Fortran. *Note Cpu_Time Intrinsic::
+ This routine is known from Cray Fortran. *Note CPU_Time Intrinsic::
for a standard equivalent.
For information on other intrinsics with the same name: *Note Second
@@ -1550,7 +1576,7 @@ NUMBER: `INTEGER'; scalar; INTENT(IN).
HANDLER: Signal handler (`INTEGER FUNCTION' or `SUBROUTINE') or
dummy/global `INTEGER(KIND=1)' scalar.
-STATUS: `INTEGER(KIND=1)'; OPTIONAL; scalar; INTENT(OUT).
+STATUS: `INTEGER(KIND=7)'; OPTIONAL; scalar; INTENT(OUT).
Intrinsic groups: `unix'.
@@ -1558,12 +1584,13 @@ Description:
If HANDLER is a an `EXTERNAL' routine, arranges for it to be invoked
with a single integer argument (of system-dependent length) when signal
-NUMBER occurs. If NUMBER is an integer, it can be used to turn off
-handling of signal HANDLER or revert to its default action. See
+NUMBER occurs. If HANDLER is an integer, it can be used to turn off
+handling of signal NUMBER or revert to its default action. See
`signal(2)'.
- Note that HANDLER will be called using C conventions, so its value in
-Fortran terms is obtained by applying `%LOC()' (or LOC()) to it.
+ Note that HANDLER will be called using C conventions, so the value
+of its argument in Fortran terms Fortran terms is obtained by applying
+`%LOC()' (or LOC()) to it.
The value returned by `signal(2)' is written to STATUS, if that
argument is supplied. Otherwise the return value is ignored.
@@ -1572,6 +1599,27 @@ argument is supplied. Otherwise the return value is ignored.
only a function, not as a subroutine, or do not support the (optional)
STATUS argument.
+ *Warning:* Use of the `libf2c' run-time library function `signal_'
+directly (such as via `EXTERNAL SIGNAL') requires use of the `%VAL()'
+construct to pass an `INTEGER' value (such as `SIG_IGN' or `SIG_DFL')
+for the HANDLER argument.
+
+ However, while `CALL SIGNAL(SIGNUM, %VAL(SIG_IGN))' works when
+`SIGNAL' is treated as an external procedure (and resolves, at link
+time, to `libf2c''s `signal_' routine), this construct is not valid
+when `SIGNAL' is recognized as the intrinsic of that name.
+
+ Therefore, for maximum portability and reliability, code such
+references to the `SIGNAL' facility as follows:
+
+ INTRINSIC SIGNAL
+ ...
+ CALL SIGNAL(SIGNUM, SIG_IGN)
+
+ `g77' will compile such a call correctly, while other compilers will
+generally either do so as well or reject the `INTRINSIC SIGNAL'
+statement via a diagnostic, allowing you to take appropriate action.
+
For information on other intrinsics with the same name: *Note Signal
Intrinsic (function)::.
@@ -1774,71 +1822,3 @@ STATUS argument.
For information on other intrinsics with the same name: *Note Stat
Intrinsic (function)::.
-
-File: g77.info, Node: Stat Intrinsic (function), Next: Sum Intrinsic, Prev: Stat Intrinsic (subroutine), Up: Table of Intrinsic Functions
-
-Stat Intrinsic (function)
-.........................
-
- Stat(FILE, SARRAY)
-
-Stat: `INTEGER(KIND=1)' function.
-
-FILE: `CHARACTER'; scalar; INTENT(IN).
-
-SARRAY: `INTEGER(KIND=1)'; DIMENSION(13); INTENT(OUT).
-
-Intrinsic groups: `unix'.
-
-Description:
-
- Obtains data about the given file FILE and places them in the array
-SARRAY. A null character (`CHAR(0)') marks the end of the name in
-FILE--otherwise, trailing blanks in FILE are ignored. The values in
-this array are extracted from the `stat' structure as returned by
-`fstat(2)' q.v., as follows:
-
- 1. File mode
-
- 2. Inode number
-
- 3. ID of device containing directory entry for file
-
- 4. Device id (if relevant)
-
- 5. Number of links
-
- 6. Owner's uid
-
- 7. Owner's gid
-
- 8. File size (bytes)
-
- 9. Last access time
-
- 10. Last modification time
-
- 11. Last file status change time
-
- 12. Preferred I/O block size
-
- 13. Number of blocks allocated
-
- Not all these elements are relevant on all systems. If an element
-is not relevant, it is returned as 0.
-
- Returns 0 on success or a non-zero error code.
-
- For information on other intrinsics with the same name: *Note Stat
-Intrinsic (subroutine)::.
-
-
-File: g77.info, Node: Sum Intrinsic, Next: SymLnk Intrinsic (subroutine), Prev: Stat Intrinsic (function), Up: Table of Intrinsic Functions
-
-Sum Intrinsic
-.............
-
- This intrinsic is not yet implemented. The name is, however,
-reserved as an intrinsic. Use `EXTERNAL Sum' to use this name for an
-external procedure.
-
diff --git a/gcc/f/g77.texi b/gcc/f/g77.texi
index d87340d85d0..31b273aa027 100644
--- a/gcc/f/g77.texi
+++ b/gcc/f/g77.texi
@@ -91,7 +91,7 @@ translations approved by the Free Software Foundation instead of in the
original English.
@end ifinfo
-Contributed by James Craig Burley (@email{burley@@gnu.ai.mit.edu}).
+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}).
@@ -102,7 +102,7 @@ was contributed to Craig by David Ronis (@email{ronis@@onsager.chem.mcgill.ca}).
@sp 2
@center James Craig Burley
@sp 3
-@center Last updated 1997-09-09
+@center Last updated 1998-01-11
@sp 1
@c The version number appears some more times in this file.
@@ -762,7 +762,7 @@ without royalty; alteration is not permitted.
@cindex improvements, funding
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
+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
needed equipment, personnel, and so on.
@@ -801,7 +801,7 @@ would be able to plan on not doing contract work for many months and
could thus devote that time to work on projects (such as the planned
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
+@kbd{finger -l burley@@gnu.org} on a UNIX system
(or any system with a command like UNIX @code{finger}).
Another important way to support work on GNU Fortran is to volunteer
@@ -810,7 +810,7 @@ Work is needed on documentation, testing, porting
to various machines, and in some cases, coding (although major
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.
+Email @email{fortran@@gnu.org} to volunteer for this work.
@xref{Funding,,Funding Free Software}, for more information.
@@ -1345,6 +1345,8 @@ by type. Explanations are in the following sections.
-fcase-initcap -fcase-upper -fcase-lower -fcase-preserve
-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
-fgnu-intrinsics-delete -fgnu-intrinsics-hide
@@ -1827,9 +1829,11 @@ had read @samp{DIMENSION X(*)}.
@cindex -fugly-comma option
@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.
+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
@samp{CALL FOO(%VAL(0), %VAL(0))}.
@@ -1839,6 +1843,8 @@ And @samp{F = FUNC()} is treated as @samp{F = FUNC(%VAL(0))}.
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.
@@ -2046,6 +2052,24 @@ while allowing any-case matching of intrinsics and keywords.
For example, @samp{call Foo(i,I)} would pass two @emph{different}
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
@item -ff2c-intrinsics-delete
@@ -2062,6 +2086,7 @@ variables named @samp{i} and @samp{I} to a procedure named @samp{Foo}.)
@cindex intrinsics, f2c
Specify status of f2c-specific intrinsics.
@samp{-ff2c-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -ff90-intrinsics-delete option
@cindex options, -ff90-intrinsics-delete
@@ -2079,6 +2104,7 @@ Specify status of f2c-specific intrinsics.
@cindex intrinsics, Fortran 90
Specify status of F90-specific intrinsics.
@samp{-ff90-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -fgnu-intrinsics-delete option
@cindex options, -fgnu-intrinsics-delete
@@ -2097,6 +2123,7 @@ Specify status of F90-specific intrinsics.
@cindex intrinsics, COMPLEX
Specify status of Digital's COMPLEX-related intrinsics.
@samp{-fgnu-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -fmil-intrinsics-delete option
@cindex options, -fmil-intrinsics-delete
@@ -2114,6 +2141,7 @@ Specify status of Digital's COMPLEX-related intrinsics.
@cindex intrinsics, MIL-STD 1753
Specify status of MIL-STD-1753-specific intrinsics.
@samp{-fmil-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -funix-intrinsics-delete option
@cindex options, -funix-intrinsics-delete
@@ -2131,6 +2159,7 @@ Specify status of MIL-STD-1753-specific intrinsics.
@cindex intrinsics, UNIX
Specify status of UNIX intrinsics.
@samp{-funix-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -fvxt-intrinsics-delete option
@cindex options, -fvxt-intrinsics-delete
@@ -2148,6 +2177,7 @@ Specify status of UNIX intrinsics.
@cindex intrinsics, VXT
Specify status of VXT intrinsics.
@samp{-fvxt-intrinsics-enable} is the default.
+@xref{Intrinsic Groups}.
@cindex -ffixed-line-length-@var{n} option
@cindex options, -ffixed-line-length-@var{n}
@@ -3251,9 +3281,9 @@ users use @code{g77}.
such changes to @code{g77}.
To find out about existing bugs and ongoing plans for GNU
-Fortran, retrieve @uref{ftp://alpha.gnu.ai.mit.edu/g77.plan}
+Fortran, retrieve @uref{ftp://alpha.gnu.org/g77.plan}
or, if you cannot do that, email
-@email{fortran@@gnu.ai.mit.edu} asking for a recent copy of the
+@email{fortran@@gnu.org} asking for a recent copy of the
GNU Fortran @file{.plan} file.
@heading In 0.5.21:
@@ -5726,7 +5756,7 @@ C INT(I1-I2) as INT(I1)-INT(I2) given INTEGER*2 I1,I2.
C
C Version 0:
C Written by James Craig Burley 1997-02-20.
-C Contact via Internet email: burley@@gnu.ai.mit.edu
+C Contact via Internet email: burley@@gnu.org
C
C Purpose:
C Determine how compilers handle non-standard IDIM
@@ -7060,11 +7090,11 @@ without conversion.
@cindex null arguments
@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''.
+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
@cindex arguments, omitting
@@ -7598,26 +7628,33 @@ The groups are:
@cindex intrinsics, groups of
@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.
@end table
@@ -10164,7 +10201,7 @@ or installing @code{g77} is not provided here.
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}.
+@uref{ftp://alpha.gnu.org/g77.plan}.
(Note that some of this portion of the manual is lifted
directly from the @code{gcc} manual, with minor modifications
@@ -10541,7 +10578,7 @@ In the meantime, finding and fixing the programming
bugs that lead to these behaviors is, ultimately, the user's
responsibility, as difficult as that task can sometimes be.
-@cindex `infinite spaces' printed
+@cindex ``infinite spaces'' printed
@cindex spaces, endless printing of
@cindex libc, non-ANSI or non-default
@cindex C library
@@ -11029,16 +11066,17 @@ specifiers.
Supporting this requires a significant redesign or replacement
of @code{libf2c}.
-However, a future version of @code{g77} might support
-this construct when the expression is constant. For
-example:
+However, @code{g77} does support
+this construct when the expression is constant
+(as of version 0.5.22).
+For example:
@smallexample
PARAMETER (IWIDTH = 12)
10 FORMAT (I<IWIDTH>)
@end smallexample
-In the meantime, at least for output (@code{PRINT} and
+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}
string in a @code{CHARACTER} variable or array, then
@@ -12275,6 +12313,63 @@ tool.
@code{ftncheck} can be found at @uref{ftp://ftp.netlib.org/fortran}
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}.
If it does not work on at least one other compiler (assuming the
@@ -12290,8 +12385,8 @@ exposes it more readily than other compilers.
@node Bug Lists
@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}.
+@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
mailing them.
@@ -12627,7 +12722,7 @@ we should be able to reproduce the crash ourselves.
If you would like to write bug fixes or improvements for the GNU Fortran
compiler, that is very helpful.
Send suggested fixes to the bug report
-mailing list, @email{fortran@@gnu.ai.mit.edu}.
+mailing list, @email{fortran@@gnu.org}.
Please follow these guidelines so we can study your patches efficiently.
If you don't follow these guidelines, your information might still be
@@ -12752,7 +12847,7 @@ The service directory is found in the file named @file{SERVICE} in the
GNU CC distribution.
@item
-Send a message to @email{fortran@@gnu.ai.mit.edu}.
+Send a message to @email{fortran@@gnu.org}.
@end itemize
@end ifset
@@ -13352,7 +13447,7 @@ that the explanations are given below, and the diagnostics themselves
identify the appropriate explanation.
Identification uses the GNU Info format---specifically, the @code{info}
-command that displays the explanation is given in within square
+command that displays the explanation is given within square
brackets in the diagnostic.
For example:
@@ -13556,7 +13651,7 @@ The following sample program might help:
PROGRAM JCB003
C
C Written by James Craig Burley 1997-02-23.
-C Contact via Internet email: burley@@gnu.ai.mit.edu
+C Contact via Internet email: burley@@gnu.org
C
C Determine how compilers handle non-standard REAL
C and AIMAG on DOUBLE COMPLEX operands.
diff --git a/gcc/f/gbe/2.7.2.3.diff b/gcc/f/gbe/2.7.2.3.diff
index d064bd8d642..d4ebb5a5bdf 100644
--- a/gcc/f/gbe/2.7.2.3.diff
+++ b/gcc/f/gbe/2.7.2.3.diff
@@ -33,12 +33,87 @@ In any case, don't worry; the contents of gcc/ChangeLog aren't
really important to non-developers of gcc.
-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
+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,36 ----
+--- 1,111 ----
++ Sun Mar 1 01:11:48 1998 Craig Burley <burley@gnu.org>
++
++ * genattrtab.c (pc_rtx): Define global here, so linking works.
++
++ Sun Mar 1 01:10:16 1998 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
++
++ * 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 <burley@gnu.org>
++
++ * emit-rtl.c (gen_lowpart_common): Install fix from
++ <chris@lslsun.epfl.ch> to get right subword.
++
++ Fri Feb 13 08:41:49 1998 Robert Lipe <robertl@dgii.com>
++
++ * rtlanal.c (computed_jump_p): Remove unused variable 'computed_jump'.
++
++ Thu Dec 4 06:34:40 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
++
++ * stmt.c (pushcase_range): Clean up handling of "infinite" values.
++
++ Mon Oct 6 18:27:12 1997 Richard Henderson <rth@cygnus.com>
++
++ * alpha.h (FLOAT_STORE_FLAG_VALUE): It's 2.0 not 0.5.
++
++ Mon Sep 29 16:12:38 1997 Craig Burley <burley@gnu.ai.mit.edu>
++
++ * 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 <rth@cygnus.com>
++
++ * 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 <burley@gnu.ai.mit.edu>
++
++ * 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 <wilson@cygnus.com>
+
+ * alias.c (true_dependence): Address with AND can alias scalars.
@@ -85,7 +160,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
! instead of tstl when testing address registers on the 68000.
Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
---- 56,81 ----
+--- 131,156 ----
(FINALIZE_TRAMPOLINE, CLEAR_INSN_CACHE): New.
! Sun Aug 10 22:23:10 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
@@ -114,7 +189,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
*************** Fri Aug 8 08:15:55 1997 H.J. Lu (hjl@
*** 38,41 ****
---- 86,143 ----
+--- 161,218 ----
* install1.texi: New.
+ Mon Aug 4 17:49:14 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
@@ -175,7 +250,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Mon Jul 21 22:47:13 1997 H.J. Lu (hjl@
*** 43,46 ****
---- 145,213 ----
+--- 220,288 ----
for Linux.
+ Mon Jul 21 00:00:24 1997 Craig Burley <burley@gnu.ai.mit.edu>
@@ -271,7 +346,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
! note_mem_written, not before.
Tue Jan 29 02:47:13 1997 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
---- 236,433 ----
+--- 311,512 ----
to biv_count for reduced givs.
! Sat Jun 21 12:09:00 1997 Craig Burley <burley@gnu.ai.mit.edu>
@@ -320,6 +395,10 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
! * rs6000.md (movdi): Emit a CLOBBER before the two movsi insns
! in constant case.
!
+! Thu May 29 15:42:59 1997 Stan Cox <coxs@dg-rtp.dg.com>
+!
+! * i386.h (ASM_OUTPUT_REG_{PUSH,POP}): add %% before register name.
+!
! Sun May 18 21:18:48 1997 Craig Burley <burley@gnu.ai.mit.edu>
!
! * fold-const.c (fold): Clarify why TRUNC_DIV_EXPR
@@ -472,7 +551,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
Tue Jan 29 02:47:13 1997 Richard Stallman <rms@psilocin.gnu.ai.mit.edu>
*************** Tue Jan 29 02:47:13 1997 Richard Stallm
*** 109,112 ****
---- 450,532 ----
+--- 529,616 ----
[! LIBC_VERSION_1] (LIB_SPEC): New override definition.
+ Tue Jan 21 16:09:37 1997 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
@@ -554,11 +633,16 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
+ * stor-layout.c (layout_record): Correct overflow test for 0 sized
+ fields.
+
++ Tue Jul 23 23:11:57 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
++
++ * tree.h (struct tree_int_cst): Add field for TREE_CST_RTL.
++ * varasm.c (decode_addr_const, output_constant_def): Allow INTEGER_CST.
++
Sat Jun 29 12:33:39 1996 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
*************** Tue Jun 11 20:18:03 1996 Per Bothner <b
*** 118,121 ****
---- 538,551 ----
+--- 622,635 ----
* alpha.h (FIXPROTO_INIT): Define new macro.
+ Thu Jun 6 18:24:39 1996 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
@@ -575,7 +659,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Wed Apr 17 17:53:23 1996 Michael Meissn
*** 136,139 ****
---- 566,597 ----
+--- 650,681 ----
bits.
+ Tue Apr 16 16:59:49 1996 Richard Henderson <rth@tamu.edu>
@@ -610,7 +694,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Mon Feb 19 07:35:07 1996 Torbjorn Granl
*** 176,179 ****
---- 634,642 ----
+--- 718,726 ----
* rs6000.md (not:SI with assign and compare): Fix typo.
+ Tue Feb 13 17:43:46 1996 Jim Wilson <wilson@cygnus.com>
@@ -622,7 +706,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Tue Jan 16 06:01:28 1996 Thomas Graiche
*** 191,198 ****
---- 654,686 ----
+--- 738,770 ----
* i386/freebsd.h (ASM_WEAKEN_LABEL): Deleted; not supported.
+ Mon Jan 15 07:22:59 1996 Michel Delval (mfd@ccv.fr)
@@ -658,7 +742,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Mon Dec 18 18:40:34 1995 Jim Wilson <w
*** 209,212 ****
---- 697,705 ----
+--- 781,789 ----
above.
+ Sun Dec 17 06:37:00 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
@@ -670,7 +754,7 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
*************** Sat Dec 9 18:05:03 1995 Jim Wilson <w
*** 223,226 ****
---- 716,724 ----
+--- 800,808 ----
* expr.c (expand_expr, case INDIRECT_REF): Correct typo in May 8
change.
+
@@ -680,9 +764,9 @@ diff -rcp2N gcc-2.7.2.3/ChangeLog gcc-2.7.2.3.f.1/ChangeLog
+ just integers that fit in 1 instruction.
Sun Nov 26 14:47:42 1995 Richard Kenner <kenner@mole.gnu.ai.mit.edu>
-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
+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 ****
####cross overrides
@@ -952,12 +1036,12 @@ diff -rcp2N gcc-2.7.2.3/Makefile.in gcc-2.7.2.3.f.1/Makefile.in
! #
# These exist for maintenance purposes.
-diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+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.1/alias.c Tue Sep 9 04:23:32 1997
+--- gcc-2.7.2.3.f.2/alias.c Thu Feb 26 21:15:44 1998
***************
*** 0 ****
---- 1,1004 ----
+--- 1,1022 ----
+ /* Alias analysis for GNU C, by John Carr (jfc@mit.edu).
+ Derived in part from sched.c */
+ #include "config.h"
@@ -1437,10 +1521,17 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ return 1;
+
+ /* The base addresses of the read and write are different
-+ expressions. If they are both symbols there is no
-+ conflict. */
++ 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 0;
++ {
++ return GET_CODE (x) == AND || GET_CODE (y) == AND;
++ }
+
+ /* If one address is a stack reference there can be no alias:
+ stack references using different base registers do not alias,
@@ -1470,6 +1561,10 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ referenced (the reference was BLKmode), so make the most pessimistic
+ 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:
+
+ (1) addresses involving the frame pointer cannot conflict
@@ -1501,7 +1596,7 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+
+ if (rtx_equal_for_memref_p (x, y))
+ {
-+ if (xsize == 0 || ysize == 0)
++ if (xsize <= 0 || ysize <= 0)
+ return 1;
+ if (c >= 0 && xsize > c)
+ return 1;
@@ -1533,7 +1628,7 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ && GET_CODE (y1) == CONST_INT)
+ {
+ c += INTVAL (y1);
-+ return (xsize == 0 || ysize == 0
++ return (xsize <= 0 || ysize <= 0
+ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+ }
+
@@ -1631,16 +1726,22 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ /* Treat an access through an AND (e.g. a subword access on an Alpha)
+ 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);
++ return memrefs_conflict_p (-1, 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);
++ {
++ /* 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))
+ {
+ if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
+ {
+ c += (INTVAL (y) - INTVAL (x));
-+ return (xsize == 0 || ysize == 0
++ return (xsize <= 0 || ysize <= 0
+ || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+ }
+
@@ -1658,9 +1759,10 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ canon_rtx (XEXP (y, 0)), c);
+
+ 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 (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;
+ }
@@ -1962,9 +2064,24 @@ diff -rcp2N gcc-2.7.2.3/alias.c gcc-2.7.2.3.f.1/alias.c
+ reg_base_value = 0;
+ 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
+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.1/c-decl.c Sun Aug 10 22:46:24 1997
+--- gcc-2.7.2.3.f.2/c-decl.c Tue Sep 9 07:01:13 1997
*************** init_decl_processing ()
*** 3207,3210 ****
--- 3207,3223 ----
@@ -2071,327 +2188,9 @@ diff -rcp2N gcc-2.7.2.3/c-decl.c gcc-2.7.2.3.f.1/c-decl.c
! if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
/* 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
+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.1/c-lex.c Sun Aug 10 22:46:49 1997
+--- gcc-2.7.2.3.f.2/c-lex.c Mon Sep 29 19:55:33 1997
*************** init_lex ()
*** 173,176 ****
--- 173,177 ----
@@ -2446,9 +2245,9 @@ diff -rcp2N gcc-2.7.2.3/c-lex.c gcc-2.7.2.3.f.1/c-lex.c
! 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
+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.1/c-lex.h Sun Aug 10 22:10:55 1997
+--- gcc-2.7.2.3.f.2/c-lex.h Tue Sep 9 07:01:13 1997
*************** enum rid
*** 43,47 ****
RID_VOLATILE,
@@ -2462,28 +2261,21 @@ diff -rcp2N gcc-2.7.2.3/c-lex.h gcc-2.7.2.3.f.1/c-lex.h
! 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
+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.1/c-parse.gperf Sun Aug 10 22:10:55 1997
+--- gcc-2.7.2.3.f.2/c-parse.gperf Mon Sep 29 19:49:21 1997
*************** __label__, LABEL, NORID
*** 36,39 ****
---- 36,40 ----
+--- 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
-*************** 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
+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.1/c-typeck.c Sun Aug 10 22:46:29 1997
+--- 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. */
@@ -2501,9 +2293,9 @@ diff -rcp2N gcc-2.7.2.3/c-typeck.c gcc-2.7.2.3.f.1/c-typeck.c
! 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
+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.1/calls.c Fri Aug 29 07:52:07 1997
+--- 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 ----
@@ -2632,9 +2424,9 @@ diff -rcp2N gcc-2.7.2.3/calls.c gcc-2.7.2.3.f.1/calls.c
+ valreg = temp;
}
-diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2.3.f.1/cccp.c
+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.1/cccp.c Sun Aug 10 22:45:53 1997
+--- gcc-2.7.2.3.f.2/cccp.c Tue Sep 9 07:01:15 1997
*************** initialize_builtins (inp, outp)
*** 9626,9629 ****
--- 9626,9630 ----
@@ -2643,9 +2435,9 @@ diff -rcp2N gcc-2.7.2.3/cccp.c gcc-2.7.2.3.f.1/cccp.c
+ install ((U_CHAR *) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST, "1", -1);
if (debug_output)
-diff -rcp2N gcc-2.7.2.3/combine.c gcc-2.7.2.3.f.1/combine.c
+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.1/combine.c Fri Aug 29 07:52:16 1997
+--- gcc-2.7.2.3.f.2/combine.c Tue Sep 9 07:01:17 1997
*************** try_combine (i3, i2, i1)
*** 2011,2016 ****
XVECEXP (newpat, 0, 1)))
@@ -2789,9 +2581,9 @@ diff -rcp2N gcc-2.7.2.3/combine.c gcc-2.7.2.3.f.1/combine.c
+ case REG_NOALIAS:
/* 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
+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.1/config/alpha/alpha.c Fri Aug 29 07:51:37 1997
+--- 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 ****
--- 64,69 ----
@@ -2871,9 +2663,9 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.c gcc-2.7.2.3.f.1/config/alpha/alpha.
+ #endif
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
+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.1/config/alpha/alpha.h Fri Aug 29 07:52:06 1997
+--- gcc-2.7.2.3.f.2/config/alpha/alpha.h Thu Feb 26 21:16:59 1998
*************** extern int target_flags;
*** 112,116 ****
--- 112,118 ----
@@ -2895,18 +2687,31 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.h gcc-2.7.2.3.f.1/config/alpha/alpha.
/* Make strings word-aligned so strcpy from constants will be faster. */
#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. */
+*** 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
-diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.md gcc-2.7.2.3.f.1/config/alpha/alpha.md
+ 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.1/config/alpha/alpha.md Fri Jul 11 00:08:48 1997
+--- gcc-2.7.2.3.f.2/config/alpha/alpha.md Tue Sep 9 07:01:17 1997
***************
*** 1746,1752 ****
(if_then_else:DF
@@ -2924,9 +2729,9 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/alpha.md gcc-2.7.2.3.f.1/config/alpha/alpha
! (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG,0"))
(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
+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.1/config/alpha/elf.h Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/alpha/elf.h Tue Sep 9 07:01:18 1997
***************
*** 0 ****
--- 1,522 ----
@@ -3452,9 +3257,9 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/elf.h gcc-2.7.2.3.f.1/config/alpha/elf.h
+ #undef ENDFILE_SPEC
+ #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
+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.1/config/alpha/linux.h Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/alpha/linux.h Tue Sep 9 07:01:18 1997
***************
*** 0 ****
--- 1,72 ----
@@ -3530,25 +3335,25 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/linux.h gcc-2.7.2.3.f.1/config/alpha/linux.
+
+ /* 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
+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.1/config/alpha/t-linux Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/alpha/t-linux Tue Sep 9 07:01:18 1997
***************
*** 0 ****
--- 1,3 ----
+ # Our header files are supposed to be correct, nein?
+ 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
+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.1/config/alpha/x-linux Fri Jul 11 00:08:49 1997
+--- 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.1/config/alpha/xm-alpha.h
+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.1/config/alpha/xm-alpha.h Fri Jul 11 00:08:49 1997
+--- 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 ****
--- 46,53 ----
@@ -3570,9 +3375,9 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/xm-alpha.h gcc-2.7.2.3.f.1/config/alpha/xm-
+ #endif
/* 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
+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.1/config/alpha/xm-linux.h Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/alpha/xm-linux.h Tue Sep 9 07:01:18 1997
***************
*** 0 ****
--- 1,10 ----
@@ -3586,9 +3391,9 @@ diff -rcp2N gcc-2.7.2.3/config/alpha/xm-linux.h gcc-2.7.2.3.f.1/config/alpha/xm-
+ #define DONT_DECLARE_SYS_SIGLIST
+ #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
+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.1/config/i386/i386.c Sun Aug 10 22:46:09 1997
+--- 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 ****
set_float_handler (handler);
@@ -3602,9 +3407,9 @@ diff -rcp2N gcc-2.7.2.3/config/i386/i386.c gcc-2.7.2.3.f.1/config/i386/i386.c
! is0 = REAL_VALUES_EQUAL (d, dconst0) && !REAL_VALUE_MINUS_ZERO (d);
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
+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.1/config/i386/i386.h Sun Aug 24 10:33:50 1997
+--- gcc-2.7.2.3.f.2/config/i386/i386.h Tue Mar 3 18:04:35 1998
*************** extern int target_flags;
*** 245,249 ****
@@ -3618,9 +3423,35 @@ diff -rcp2N gcc-2.7.2.3/config/i386/i386.h gcc-2.7.2.3.f.1/config/i386/i386.h
! #define STACK_BOUNDARY BIGGEST_ALIGNMENT
/* 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
+*************** 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 ****
(match_operand:DI 0 "nonimmediate_operand" "d"))
@@ -3647,9 +3478,9 @@ diff -rcp2N gcc-2.7.2.3/config/m68k/m68k.md gcc-2.7.2.3.f.1/config/m68k/m68k.md
! "0"
"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
+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.1/config/mips/mips.c Sun Aug 10 22:45:43 1997
+--- gcc-2.7.2.3.f.2/config/mips/mips.c Tue Sep 9 07:01:20 1997
*************** expand_block_move (operands)
*** 2360,2365 ****
@@ -3667,9 +3498,9 @@ diff -rcp2N gcc-2.7.2.3/config/mips/mips.c gcc-2.7.2.3.f.1/config/mips/mips.c
! src_reg),
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
+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.1/config/mips/mips.h Sun Aug 10 22:46:44 1997
+--- gcc-2.7.2.3.f.2/config/mips/mips.h Tue Sep 9 07:01:21 1997
*************** typedef struct mips_args {
*** 2160,2170 ****
} \
@@ -3709,9 +3540,9 @@ diff -rcp2N gcc-2.7.2.3/config/mips/mips.h gcc-2.7.2.3.f.1/config/mips/mips.h
! && (ABI_64BIT || GET_CODE (XEXP (X, 0)) == MINUS)))
/* 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
+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.1/config/mips/sni-gas.h Sun Aug 10 22:46:33 1997
+--- gcc-2.7.2.3.f.2/config/mips/sni-gas.h Tue Sep 9 07:01:21 1997
***************
*** 0 ****
--- 1,43 ----
@@ -3758,9 +3589,9 @@ diff -rcp2N gcc-2.7.2.3/config/mips/sni-gas.h gcc-2.7.2.3.f.1/config/mips/sni-ga
+
+
+
-diff -rcp2N gcc-2.7.2.3/config/mips/sni-svr4.h gcc-2.7.2.3.f.1/config/mips/sni-svr4.h
+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.1/config/mips/sni-svr4.h Sun Aug 10 22:46:33 1997
+--- gcc-2.7.2.3.f.2/config/mips/sni-svr4.h Tue Sep 9 07:01:21 1997
***************
*** 0 ****
--- 1,103 ----
@@ -3867,9 +3698,9 @@ diff -rcp2N gcc-2.7.2.3/config/mips/sni-svr4.h gcc-2.7.2.3.f.1/config/mips/sni-s
+ #undef DBX_DEBUGGING_INFO
+ #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
+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.1/config/mips/x-sni-svr4 Sun Aug 10 22:46:33 1997
+--- gcc-2.7.2.3.f.2/config/mips/x-sni-svr4 Tue Sep 9 07:01:21 1997
***************
*** 0 ****
--- 1,18 ----
@@ -3891,9 +3722,9 @@ diff -rcp2N gcc-2.7.2.3/config/mips/x-sni-svr4 gcc-2.7.2.3.f.1/config/mips/x-sni
+ # The SVR3 configurations have it, but the SVR4 configurations don't.
+ # 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
+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.1/config/msdos/configur.bat Sun Aug 10 23:08:05 1997
+--- 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 ****
--- 18,27 ----
@@ -3907,9 +3738,9 @@ diff -rcp2N gcc-2.7.2.3/config/msdos/configur.bat gcc-2.7.2.3.f.1/config/msdos/c
+
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
+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.1/config/pa/pa.c Sun Aug 10 22:45:44 1997
+--- gcc-2.7.2.3.f.2/config/pa/pa.c Tue Sep 9 07:01:22 1997
*************** output_move_double (operands)
*** 1344,1369 ****
do them in the other order.
@@ -3973,9 +3804,9 @@ diff -rcp2N gcc-2.7.2.3/config/pa/pa.c gcc-2.7.2.3.f.1/config/pa/pa.c
+ /* Now handle register -> register case. */
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
+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.1/config/pa/pa.md Sun Aug 10 22:45:45 1997
+--- gcc-2.7.2.3.f.2/config/pa/pa.md Tue Sep 9 07:01:22 1997
***************
*** 1828,1832 ****
(define_insn ""
@@ -4028,9 +3859,9 @@ diff -rcp2N gcc-2.7.2.3/config/pa/pa.md gcc-2.7.2.3.f.1/config/pa/pa.md
! "=r,o,Q,r,r,r")
(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
+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.1/config/rs6000/rs6000.c Fri Aug 29 07:51:51 1997
+--- gcc-2.7.2.3.f.2/config/rs6000/rs6000.c Tue Sep 9 07:01:23 1997
*************** input_operand (op, mode)
*** 724,730 ****
return 1;
@@ -4196,9 +4027,9 @@ diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.c gcc-2.7.2.3.f.1/config/rs6000/rs6
! rs6000_output_load_toc_table (file);
}
-diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.md gcc-2.7.2.3.f.1/config/rs6000/rs6000.md
+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.1/config/rs6000/rs6000.md Fri Aug 29 07:52:00 1997
+--- gcc-2.7.2.3.f.2/config/rs6000/rs6000.md Tue Sep 9 07:01:23 1997
***************
*** 4420,4423 ****
--- 4420,4424 ----
@@ -4226,9 +4057,9 @@ diff -rcp2N gcc-2.7.2.3/config/rs6000/rs6000.md gcc-2.7.2.3.f.1/config/rs6000/rs
+ [(set_attr "type" "load")])
;; 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
+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.1/config/sparc/sol2.h Sun Aug 10 22:45:53 1997
+--- gcc-2.7.2.3.f.2/config/sparc/sol2.h Tue Sep 9 07:01:23 1997
*************** do { \
*** 166,168 ****
/* Define for support of TFmode long double and REAL_ARITHMETIC.
@@ -4238,9 +4069,9 @@ diff -rcp2N gcc-2.7.2.3/config/sparc/sol2.h gcc-2.7.2.3.f.1/config/sparc/sol2.h
/* Define for support of TFmode long double and REAL_ARITHMETIC.
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
+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.1/config/sparc/sparc.c Sun Aug 10 22:46:03 1997
+--- 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 ****
/* 1 if the caller has placed an "unimp" insn immediately after the call.
@@ -4263,9 +4094,9 @@ diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.c gcc-2.7.2.3.f.1/config/sparc/sparc.
! == INTEGER_CST))
/* 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
+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.1/config/sparc/sparc.h Sun Aug 10 22:46:13 1997
+--- gcc-2.7.2.3.f.2/config/sparc/sparc.h Tue Sep 9 07:01:25 1997
*************** extern int leaf_function;
*** 1526,1533 ****
@@ -4301,9 +4132,9 @@ diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.h gcc-2.7.2.3.f.1/config/sparc/sparc.
+ fputs ("\tld [%fp-4],%g2\n", FILE); \
} while (0)
-diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.md gcc-2.7.2.3.f.1/config/sparc/sparc.md
+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.1/config/sparc/sparc.md Sun Aug 10 22:46:27 1997
+--- gcc-2.7.2.3.f.2/config/sparc/sparc.md Tue Sep 9 07:01:26 1997
***************
*** 4799,4803 ****
abort ();
@@ -4484,9 +4315,9 @@ diff -rcp2N gcc-2.7.2.3/config/sparc/sparc.md gcc-2.7.2.3.f.1/config/sparc/sparc
+ { operands[0] = frame_pointer_rtx; }")
;; 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
+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.1/config/x-linux Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/x-linux Tue Sep 9 07:01:26 1997
*************** BOOT_CFLAGS = -O $(CFLAGS) -Iinclude
*** 13,14 ****
--- 13,17 ----
@@ -4495,9 +4326,9 @@ diff -rcp2N gcc-2.7.2.3/config/x-linux gcc-2.7.2.3.f.1/config/x-linux
+
+ # 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
+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.1/config/x-linux-aout Fri Jul 11 00:08:49 1997
+--- gcc-2.7.2.3.f.2/config/x-linux-aout Tue Sep 9 07:01:26 1997
***************
*** 0 ****
--- 1,14 ----
@@ -4515,9 +4346,9 @@ diff -rcp2N gcc-2.7.2.3/config/x-linux-aout gcc-2.7.2.3.f.1/config/x-linux-aout
+
+ # 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
+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 ****
@@ -4736,9 +4567,9 @@ diff -rcp2N gcc-2.7.2.3/config.guess gcc-2.7.2.3.f.1/config.guess
! printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
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
+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 ****
--- 82,86 ----
@@ -4847,9 +4678,43 @@ diff -rcp2N gcc-2.7.2.3/configure gcc-2.7.2.3.f.1/configure
! echo "s|^target=.*$|target=${canon_target}|" >> Makefile.sed
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
+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 <burley@gnu.ai.mit.edu>
++
++ * 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 ****
static int constant_pool_entries_cost;
@@ -5776,9 +5641,9 @@ diff -rcp2N gcc-2.7.2.3/cse.c gcc-2.7.2.3.f.1/cse.c
+ }
/* 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
+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.1/dwarfout.c Sun Aug 10 22:47:19 1997
+--- gcc-2.7.2.3.f.2/dwarfout.c Tue Sep 9 07:01:28 1997
*************** output_bound_representation (bound, dim_
*** 1629,1705 ****
{
@@ -5964,9 +5829,9 @@ diff -rcp2N gcc-2.7.2.3/dwarfout.c gcc-2.7.2.3.f.1/dwarfout.c
+ type = TREE_TYPE (type), code = TREE_CODE (type);
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
+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.1/emit-rtl.c Fri Aug 29 07:51:46 1997
+--- gcc-2.7.2.3.f.2/emit-rtl.c Thu Feb 26 21:12:55 1998
*************** max_label_num ()
*** 545,548 ****
--- 545,565 ----
@@ -5991,6 +5856,19 @@ diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2.7.2.3.f.1/emit-rtl.c
+
/* 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 ****
--- 992,997 ----
@@ -6010,9 +5888,9 @@ diff -rcp2N gcc-2.7.2.3/emit-rtl.c gcc-2.7.2.3.f.1/emit-rtl.c
+
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
+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.1/explow.c Fri Aug 29 07:52:03 1997
+--- gcc-2.7.2.3.f.2/explow.c Tue Sep 9 07:01:28 1997
*************** Boston, MA 02111-1307, USA. */
*** 32,36 ****
@@ -6235,9 +6113,9 @@ diff -rcp2N gcc-2.7.2.3/explow.c gcc-2.7.2.3.f.1/explow.c
+ }
}
-diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7.2.3.f.1/expmed.c
+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.1/expmed.c Sun Aug 10 22:46:23 1997
+--- 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 ****
--- 399,403 ----
@@ -6377,9 +6255,9 @@ diff -rcp2N gcc-2.7.2.3/expmed.c gcc-2.7.2.3.f.1/expmed.c
+
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
+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.1/expr.c Fri Aug 29 08:01:24 1997
+--- gcc-2.7.2.3.f.2/expr.c Mon Sep 15 21:47:09 1997
*************** Boston, MA 02111-1307, USA. */
*** 27,30 ****
--- 27,31 ----
@@ -6936,7 +6814,7 @@ diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2.3.f.1/expr.c
+ where it is so we can turn it back in the top-level safe_from_p()
+ when we're done. */
+
-+ if (safe_from_p_count > safe_from_p_size)
++ 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;
+ TREE_SET_CODE (exp, ERROR_MARK);
@@ -7733,9 +7611,9 @@ diff -rcp2N gcc-2.7.2.3/expr.c gcc-2.7.2.3.f.1/expr.c
! &alignment);
type = type_for_size (bitsize, unsignedp);
-diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2.3.f.1/expr.h
+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.1/expr.h Fri Aug 29 07:52:02 1997
+--- gcc-2.7.2.3.f.2/expr.h Tue Sep 9 07:01:31 1997
*************** enum direction {none, upward, downward};
*** 229,232 ****
--- 229,272 ----
@@ -7797,9 +7675,9 @@ diff -rcp2N gcc-2.7.2.3/expr.h gcc-2.7.2.3.f.1/expr.h
+ extern void probe_stack_range PROTO((HOST_WIDE_INT, rtx));
/* 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
+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.1/final.c Fri Jul 11 00:11:16 1997
+--- gcc-2.7.2.3.f.2/final.c Tue Sep 9 07:01:32 1997
*************** profile_function (file)
*** 983,991 ****
text_section ();
@@ -7890,9 +7768,9 @@ diff -rcp2N gcc-2.7.2.3/final.c gcc-2.7.2.3.f.1/final.c
! #if defined(STRUCT_VALUE_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
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
+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.1/flags.h Fri Aug 29 08:40:01 1997
+--- gcc-2.7.2.3.f.2/flags.h Sun Mar 1 03:29:49 1998
*************** extern int flag_unroll_loops;
*** 204,207 ****
--- 204,221 ----
@@ -7938,126 +7816,162 @@ diff -rcp2N gcc-2.7.2.3/flags.h gcc-2.7.2.3.f.1/flags.h
+ extern int flag_argument_noalias;
/* 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
+*************** 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.1/flow.c Wed Aug 27 11:46:36 1997
+--- 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));
---- 288,292 ----
- /* Forward declarations */
- static void find_basic_blocks PROTO((rtx, rtx));
-! static int jmp_uses_reg_or_mem PROTO((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
-*** 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;
-
+*** 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
-*** 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;
+*** 534,574 ****
-! switch (code)
-! {
-! case CONST:
-! case LABEL_REF:
-! case PC:
-! return 0;
-!
-! case REG:
-! return 1;
+ for (insn = f; insn; insn = NEXT_INSN (insn))
+! if (GET_CODE (insn) == JUMP_INSN)
+ {
+! rtx pat = PATTERN (insn);
+! int computed_jump = 0;
!
-! case MEM:
-! return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
-! && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
+! if (GET_CODE (pat) == PARALLEL)
+ {
+! int len = XVECLEN (pat, 0);
+! int has_use_labelref = 0;
!
-! case IF_THEN_ELSE:
-! return (jmp_uses_reg_or_mem (XEXP (x, 1))
-! || jmp_uses_reg_or_mem (XEXP (x, 2)));
+! 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;
!
-! case PLUS: case MINUS: case MULT:
-! return (jmp_uses_reg_or_mem (XEXP (x, 0))
-! || jmp_uses_reg_or_mem (XEXP (x, 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);
- 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;
+! for (x = forced_labels; x; x = XEXP (x, 1))
+! mark_label_ref (gen_rtx (LABEL_REF, VOIDmode, XEXP (x, 0)),
+! insn, 0);
+ }
+ }
+--- 541,561 ----
- 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;
+ 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);
+ }
- if (fmt[i] == 'E')
- for (j = 0; j < XVECLEN (x, i); j++)
-! if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
- return 1;
- }
+! 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 ****
@@ -8070,7 +7984,7 @@ diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2.3.f.1/flow.c
! if (call_used_regs[i] && ! global_regs[i])
dead[i / REGSET_ELT_BITS]
|= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS));
---- 1623,1633 ----
+--- 1560,1570 ----
/* Each call clobbers all call-clobbered regs that are not
! global or fixed. Note that the function-value reg is a
@@ -8082,9 +7996,9 @@ diff -rcp2N gcc-2.7.2.3/flow.c gcc-2.7.2.3.f.1/flow.c
! && ! fixed_regs[i])
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
+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.1/fold-const.c Fri Aug 29 07:52:10 1997
+--- 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 ****
--- 80,84 ----
@@ -8738,12 +8652,26 @@ diff -rcp2N gcc-2.7.2.3/fold-const.c gcc-2.7.2.3.f.1/fold-const.c
! return build_complex (type, arg0, arg1);
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
+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 ****
---- 917,925 ----
+--- 924,932 ----
p->keep = keep;
}
+
@@ -8761,7 +8689,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! || p->address == x)
return p;
---- 999,1004 ----
+--- 1006,1011 ----
if (! p->in_use)
continue;
! else if (rtx_equal_p (XEXP (p->slot, 0), x)
@@ -8770,7 +8698,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
*************** free_temps_for_rtl_expr (t)
*** 1184,1187 ****
---- 1189,1207 ----
+--- 1196,1214 ----
}
+ /* Mark all temporaries ever allocated in this functon as not suitable
@@ -8792,7 +8720,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
*************** pop_temp_slots ()
*** 1208,1211 ****
---- 1228,1242 ----
+--- 1235,1249 ----
temp_slot_level--;
}
+
@@ -8815,7 +8743,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! handled by our scan of regno_reg_rtx. The only special handling we
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 ----
+--- 2876,2880 ----
case MEM:
/* Most cases of MEM that convert to valid addresses have already been
! handled by our scan of decls. The only special handling we
@@ -8828,7 +8756,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! doesn't seem very likely, though. */
if (instantiate_virtual_regs_1 (&XEXP (x, 0),
---- 2927,2933 ----
+--- 2934,2940 ----
has less restrictions on an address that some other insn.
In that case, we will modify the shared address. This case
! doesn't seem very likely, though. One case where this could
@@ -8844,10 +8772,10 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
- case CLOBBER:
case SUBREG:
case STRICT_LOW_PART:
---- 2942,2945 ----
+--- 2949,2952 ----
*************** instantiate_virtual_regs_1 (loc, object,
*** 2927,2930 ****
---- 2958,2978 ----
+--- 2965,2985 ----
goto restart;
+ case USE:
@@ -8877,7 +8805,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
MEM_IN_STRUCT_P (stack_parm) = aggregate;
}
---- 3452,3459 ----
+--- 3459,3466 ----
/* If this is a memory ref that contains aggregate components,
! mark it as such for cse and loop optimize. Likewise if it
@@ -8893,7 +8821,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! REG_USERVAR_P (parmreg) = 1;
/* If this was an item that we received a pointer to, set DECL_RTL
---- 3677,3681 ----
+--- 3684,3688 ----
parmreg = gen_reg_rtx (promoted_nominal_mode);
! mark_user_reg (parmreg);
@@ -8906,7 +8834,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! REG_USERVAR_P (parmreg) = 1;
emit_move_insn (parmreg, DECL_RTL (parm));
DECL_RTL (parm) = parmreg;
---- 3745,3749 ----
+--- 3752,3756 ----
Pmode above. We must use the actual mode of the parm. */
parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
! mark_user_reg (parmreg);
@@ -8922,7 +8850,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
! target_temp_slot_level = 0;
/* Within function body, compute a type's size as soon it is laid out. */
---- 4864,4869 ----
+--- 4871,4876 ----
rtl_expr_chain = 0;
! /* Set up to allocate temporaries. */
@@ -8931,7 +8859,7 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
/* Within function body, compute a type's size as soon it is laid out. */
*************** expand_function_end (filename, line, end
*** 5295,5298 ****
---- 5343,5366 ----
+--- 5350,5373 ----
/* Put those insns at entry to the containing function (this one). */
emit_insns_before (seq, tail_recursion_reentry);
+ }
@@ -8956,9 +8884,9 @@ diff -rcp2N gcc-2.7.2.3/function.c gcc-2.7.2.3.f.1/function.c
+ }
}
-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
+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 ****
static void validate_switches PROTO((char *));
@@ -9120,9 +9048,9 @@ diff -rcp2N gcc-2.7.2.3/gcc.c gcc-2.7.2.3.f.1/gcc.c
+ do_spec_1 (" ", 0, NULL_PTR);
switches[switchnum].valid = 1;
}
-diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7.2.3.f.1/gcc.texi
+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.1/gcc.texi Fri Jul 11 00:08:58 1997
+--- gcc-2.7.2.3.f.2/gcc.texi Tue Sep 9 07:01:35 1997
*************** original English.
*** 149,152 ****
--- 149,153 ----
@@ -9131,9 +9059,25 @@ diff -rcp2N gcc-2.7.2.3/gcc.texi gcc-2.7.2.3.f.1/gcc.texi
+ @center (Revised for GNU Fortran 1997-01-10)
@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
+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.1/glimits.h Fri Jul 11 00:08:58 1997
+--- gcc-2.7.2.3.f.2/glimits.h Tue Sep 9 07:01:35 1997
***************
*** 64,68 ****
(Same as `int'). */
@@ -9151,9 +9095,28 @@ diff -rcp2N gcc-2.7.2.3/glimits.h gcc-2.7.2.3.f.1/glimits.h
! # endif /* __alpha__ */
#endif
#undef LONG_MIN
-diff -rcp2N gcc-2.7.2.3/integrate.c gcc-2.7.2.3.f.1/integrate.c
+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.1/integrate.c Sun Aug 10 22:46:31 1997
+--- 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 ****
--- 67,71 ----
@@ -9222,9 +9185,9 @@ diff -rcp2N gcc-2.7.2.3/integrate.c gcc-2.7.2.3.f.1/integrate.c
+ save_constants_in_decl_trees (t);
}
-diff -rcp2N gcc-2.7.2.3/invoke.texi gcc-2.7.2.3.f.1/invoke.texi
+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.1/invoke.texi Fri Aug 29 07:52:17 1997
+--- gcc-2.7.2.3.f.2/invoke.texi Tue Sep 9 07:01:36 1997
***************
*** 1,3 ****
! @c Copyright (C) 1988, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
@@ -9454,9 +9417,9 @@ diff -rcp2N gcc-2.7.2.3/invoke.texi gcc-2.7.2.3.f.1/invoke.texi
+ of @code{g77}.
@end table
-diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2.7.2.3.f.1/libgcc2.c
+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.1/libgcc2.c Sun Aug 10 22:46:07 1997
+--- gcc-2.7.2.3.f.2/libgcc2.c Tue Sep 9 07:01:36 1997
*************** __gcc_bcmp (s1, s2, size)
*** 1193,1196 ****
--- 1193,1201 ----
@@ -9469,9 +9432,9 @@ diff -rcp2N gcc-2.7.2.3/libgcc2.c gcc-2.7.2.3.f.1/libgcc2.c
+
#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
+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.1/local-alloc.c Sun Aug 10 22:46:10 1997
+--- gcc-2.7.2.3.f.2/local-alloc.c Tue Sep 9 07:01:37 1997
*************** static int this_insn_number;
*** 243,246 ****
--- 243,250 ----
@@ -9582,9 +9545,9 @@ diff -rcp2N gcc-2.7.2.3/local-alloc.c gcc-2.7.2.3.f.1/local-alloc.c
+ reg_equiv_replacement = (rtx *) alloca (max_regno * sizeof (rtx *));
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
+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.1/loop.c Sun Aug 10 22:46:43 1997
+--- gcc-2.7.2.3.f.2/loop.c Tue Sep 9 07:01:37 1997
*************** int *loop_number_exit_count;
*** 111,116 ****
unsigned HOST_WIDE_INT loop_n_iterations;
@@ -9712,9 +9675,9 @@ diff -rcp2N gcc-2.7.2.3/loop.c gcc-2.7.2.3.f.1/loop.c
+ record_base_value (REGNO (reg), b);
}
-diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2.3.f.1/loop.h
+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.1/loop.h Fri Jul 11 00:09:03 1997
+--- gcc-2.7.2.3.f.2/loop.h Tue Sep 9 07:01:38 1997
*************** struct induction
*** 89,92 ****
--- 89,95 ----
@@ -9725,9 +9688,9 @@ diff -rcp2N gcc-2.7.2.3/loop.h gcc-2.7.2.3.f.1/loop.h
+ unsigned shared : 1;
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
+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.1/md.texi Fri Aug 29 07:52:18 1997
+--- gcc-2.7.2.3.f.2/md.texi Tue Sep 9 07:01:38 1997
*************** Some machines require other operations s
*** 2334,2337 ****
--- 2334,2347 ----
@@ -9745,9 +9708,9 @@ diff -rcp2N gcc-2.7.2.3/md.texi gcc-2.7.2.3.f.1/md.texi
+ limit from a global or thread-specific variable or register.
@end table
-diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7.2.3.f.1/optabs.c
+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.1/optabs.c Fri Aug 29 07:51:36 1997
+--- gcc-2.7.2.3.f.2/optabs.c Tue Sep 9 07:01:39 1997
*************** expand_fix (to, from, unsignedp)
*** 3878,3885 ****
}
@@ -9770,9 +9733,9 @@ diff -rcp2N gcc-2.7.2.3/optabs.c gcc-2.7.2.3.f.1/optabs.c
! }
}
-diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2.3.f.1/real.c
+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.1/real.c Fri Jul 11 00:09:04 1997
+--- gcc-2.7.2.3.f.2/real.c Tue Sep 9 07:01:39 1997
*************** make_nan (nan, sign, mode)
*** 5625,5633 ****
}
@@ -9875,9 +9838,9 @@ diff -rcp2N gcc-2.7.2.3/real.c gcc-2.7.2.3.f.1/real.c
! for these are different.
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
+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.1/real.h Fri Jul 11 00:09:05 1997
+--- 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 ****
--- 152,157 ----
@@ -9900,9 +9863,9 @@ diff -rcp2N gcc-2.7.2.3/real.h gcc-2.7.2.3.f.1/real.h
+ #define REAL_VALUE_UNTO_TARGET_SINGLE(f) (ereal_unto_float (f))
/* 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
+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.1/recog.c Sun Aug 10 22:46:55 1997
+--- gcc-2.7.2.3.f.2/recog.c Tue Sep 9 07:01:40 1997
*************** register_operand (op, mode)
*** 872,876 ****
REGNO (SUBREG_REG (op)))
@@ -9918,61 +9881,103 @@ diff -rcp2N gcc-2.7.2.3/recog.c gcc-2.7.2.3.f.1/recog.c
! && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_FLOAT)
return 0;
#endif
-diff -rcp2N gcc-2.7.2.3/reg-stack.c gcc-2.7.2.3.f.1/reg-stack.c
+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.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;
+--- 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;
-*************** 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 (computed_jump_p (insn))
+ {
+ for (x = label_value_list; x; x = XEXP (x, 1))
+*************** find_blocks (first)
+*** 1367,1402 ****
+ }
- /* 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
+- /* 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.1/reload.c Sat Aug 30 20:42:37 1997
+--- gcc-2.7.2.3.f.2/reload.c Tue Sep 9 07:01:41 1997
***************
*** 1,4 ****
/* Search an insn for pseudo regs that must be in hard regs and are not.
@@ -10636,9 +10641,9 @@ diff -rcp2N gcc-2.7.2.3/reload.c gcc-2.7.2.3.f.1/reload.c
! fprintf (stderr, ", can't combine %d", reload_nocombine[r]);
if (reload_secondary_p[r])
-diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2.7.2.3.f.1/reload1.c
+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.1/reload1.c Fri Aug 29 07:52:04 1997
+--- gcc-2.7.2.3.f.2/reload1.c Tue Sep 9 07:01:42 1997
*************** reload (first, global, dumpfile)
*** 542,546 ****
Also find all paradoxical subregs and find largest such for each pseudo.
@@ -10793,9 +10798,9 @@ diff -rcp2N gcc-2.7.2.3/reload1.c gcc-2.7.2.3.f.1/reload1.c
! gen_reload (out, loc, opnum, type);
}
#endif
-diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7.2.3.f.1/reorg.c
+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.1/reorg.c Fri Aug 29 07:52:00 1997
+--- gcc-2.7.2.3.f.2/reorg.c Tue Sep 9 07:01:43 1997
*************** redundant_insn (insn, target, delay_list
*** 1961,1964 ****
--- 1961,1969 ----
@@ -10836,9 +10841,9 @@ diff -rcp2N gcc-2.7.2.3/reorg.c gcc-2.7.2.3.f.1/reorg.c
! && ! find_reg_note (trial, REG_UNUSED, NULL_RTX))
break;
}
-diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2.3.f.1/rtl.c
+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.1/rtl.c Fri Jul 11 00:09:06 1997
+--- gcc-2.7.2.3.f.2/rtl.c Tue Sep 9 07:01:43 1997
*************** char *reg_note_name[] = { "", "REG_DEAD"
*** 179,183 ****
"REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
@@ -10852,9 +10857,9 @@ diff -rcp2N gcc-2.7.2.3/rtl.c gcc-2.7.2.3.f.1/rtl.c
! "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_NOALIAS" };
/* 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
+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.1/rtl.h Fri Jul 11 00:09:07 1997
+--- 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 ****
REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
@@ -10886,7 +10891,7 @@ diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.1/rtl.h
/* 1 in a SYMBOL_REF if it addresses this function's constants pool. */
*************** extern rtx eliminate_constant_term PROTO
*** 817,820 ****
---- 817,830 ----
+--- 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));
+ extern int rtx_varies_p PROTO((rtx));
@@ -10898,12 +10903,13 @@ diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.1/rtl.h
+ extern void note_stores PROTO((rtx, void (*)()));
+ 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));
+
/* Maximum number of parallel sets and clobbers in any insn in this fn.
*************** extern rtx *regno_reg_rtx;
*** 967,968 ****
---- 977,987 ----
+--- 978,988 ----
extern int rtx_to_tree_code PROTO((enum rtx_code));
+
@@ -10915,9 +10921,121 @@ diff -rcp2N gcc-2.7.2.3/rtl.h gcc-2.7.2.3.f.1/rtl.h
+ extern void end_alias_analysis PROTO((void));
+ 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
+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.1/sched.c Sun Aug 10 22:46:13 1997
+--- gcc-2.7.2.3.f.2/sched.c Tue Sep 9 07:01:44 1997
*************** Boston, MA 02111-1307, USA. */
*** 126,129 ****
--- 126,132 ----
@@ -11776,9 +11894,9 @@ diff -rcp2N gcc-2.7.2.3/sched.c gcc-2.7.2.3.f.1/sched.c
+
if (write_symbols != NO_DEBUG)
-diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7.2.3.f.1/sdbout.c
+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.1/sdbout.c Mon Aug 11 05:42:22 1997
+--- gcc-2.7.2.3.f.2/sdbout.c Tue Sep 9 07:01:44 1997
*************** plain_type_1 (type, level)
*** 539,543 ****
sdb_dims[sdb_n_dims++]
@@ -11795,9 +11913,9 @@ diff -rcp2N gcc-2.7.2.3/sdbout.c gcc-2.7.2.3.f.1/sdbout.c
! - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1)
: 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
+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.1/stmt.c Fri Aug 29 07:52:05 1997
+--- gcc-2.7.2.3.f.2/stmt.c Tue Dec 23 19:52:10 1997
*************** fixup_gotos (thisblock, stack_level, cle
*** 1244,1249 ****
poplevel (1, 0, 0);
@@ -11904,41 +12022,48 @@ diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2.3.f.1/stmt.c
! TYPE_ALIGN (TREE_TYPE (decl)));
/* Reference the variable indirect through that rtx. */
-*************** pushcase_range (value1, value2, converte
-*** 4155,4158 ****
---- 4152,4159 ----
- return 1;
+*************** pushcase (value, converter, label, dupli
+*** 4133,4141 ****
+ }
-+ /* 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)
+! /* 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
-*** 4189,4197 ****
- /* Convert VALUEs to type in which the comparisons are nominally done. */
- if (value1 == 0) /* Negative infinity. */
+*** 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);
+! value1 = (*converter) (nominal_type, value1);
- if (value2 == 0) /* Positive infinity. */
+! 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);
+ /* Fail if these values are out of range. */
+! if (! int_fits_type_p (value1, index_type))
+ return 3;
-*************** pushcase_range (value1, value2, converte
-*** 4202,4209 ****
- if (! int_fits_type_p (value2, index_type))
+! if (! int_fits_type_p (value2, index_type))
return 3;
-
- /* Fail if the range is empty. */
@@ -11946,10 +12071,37 @@ diff -rcp2N gcc-2.7.2.3/stmt.c gcc-2.7.2.3.f.1/stmt.c
- return 4;
/* 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
+--- 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.1/stor-layout.c Mon Aug 11 10:47:50 1997
+--- gcc-2.7.2.3.f.2/stor-layout.c Tue Sep 9 07:01:46 1997
*************** layout_decl (decl, known_align)
*** 255,259 ****
if (maximum_field_alignment != 0)
@@ -12060,9 +12212,9 @@ diff -rcp2N gcc-2.7.2.3/stor-layout.c gcc-2.7.2.3.f.1/stor-layout.c
+ }
/* 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
+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.1/stupid.c Sun Aug 10 22:46:01 1997
+--- gcc-2.7.2.3.f.2/stupid.c Sun Mar 1 03:40:50 1998
*************** static int *uid_suid;
*** 66,69 ****
--- 66,74 ----
@@ -12087,8 +12239,17 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
/* 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 ****
---- 158,162 ----
+--- 160,164 ----
last_call_suid = i + 1;
+ last_setjmp_suid = i + 1;
@@ -12096,7 +12257,7 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
*************** stupid_life_analysis (f, nregs, file)
*** 167,170 ****
---- 177,183 ----
+--- 179,185 ----
bzero ((char *) regs_change_size, nregs * sizeof (char));
+ regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char));
@@ -12106,7 +12267,7 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
*************** stupid_life_analysis (f, nregs, file)
*** 216,219 ****
---- 229,236 ----
+--- 231,238 ----
stupid_mark_refs (PATTERN (insn), insn);
+ if (GET_CODE (insn) == NOTE
@@ -12116,6 +12277,17 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
/* 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];
@@ -12123,7 +12295,7 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
! if (regno_reg_rtx[r] == 0)
continue;
---- 271,277 ----
+--- 277,283 ----
register int r = reg_order[i];
! /* Some regnos disappear from the rtl. Ignore them to avoid crash.
@@ -12139,7 +12311,7 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
! 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 ----
+--- 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
@@ -12148,7 +12320,7 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
Return -1 if such a block cannot be found.
*************** stupid_find_reg (call_preserved, class,
*** 338,341 ****
---- 356,366 ----
+--- 362,372 ----
#endif
+ /* If this register's life is more than 5,000 insns, we probably
@@ -12160,9 +12332,22 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
+
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 ****
---- 513,519 ----
+--- 525,531 ----
if (last_call_suid < reg_where_dead[regno])
reg_n_calls_crossed[regno] += 1;
+
@@ -12170,9 +12355,3893 @@ diff -rcp2N gcc-2.7.2.3/stupid.c gcc-2.7.2.3.f.1/stupid.c
+ regs_crosses_setjmp[regno] = 1;
}
}
-diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7.2.3.f.1/tm.texi
+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 <not> 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 <not> 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 <tege@matematik.su.se>
+! \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\&#1}\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\&#1}\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.1/tm.texi Fri Aug 29 07:52:19 1997
+--- 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 ****
--- 1951,1955 ----
@@ -12270,9 +16339,9 @@ diff -rcp2N gcc-2.7.2.3/tm.texi gcc-2.7.2.3.f.1/tm.texi
+ normally not need to override that default.
@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
+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.1/toplev.c Fri Aug 29 09:13:14 1997
+--- gcc-2.7.2.3.f.2/toplev.c Tue Sep 9 07:01:47 1997
*************** int flag_unroll_loops;
*** 388,391 ****
--- 388,405 ----
@@ -12418,9 +16487,9 @@ diff -rcp2N gcc-2.7.2.3/toplev.c gcc-2.7.2.3.f.1/toplev.c
+ flag_alias_check = 1;
}
-diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2.3.f.1/tree.c
+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.1/tree.c Fri Aug 29 08:15:03 1997
+--- gcc-2.7.2.3.f.2/tree.c Tue Sep 9 07:01:48 1997
*************** build_string (len, str)
*** 1428,1436 ****
/* Return a newly constructed COMPLEX_CST node whose value is
@@ -12974,9 +17043,9 @@ diff -rcp2N gcc-2.7.2.3/tree.c gcc-2.7.2.3.f.1/tree.c
! && DECL_SIZE (TREE_OPERAND (op, 1)) != 0)
{
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
+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.1/tree.h Sun Aug 10 22:47:08 1997
+--- gcc-2.7.2.3.f.2/tree.h Mon Oct 27 07:40:49 1997
*************** enum built_in_function
*** 98,101 ****
--- 98,103 ----
@@ -13046,9 +17115,9 @@ diff -rcp2N gcc-2.7.2.3/tree.h gcc-2.7.2.3.f.1/tree.h
! int *, int *));
/* 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
+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 ****
structure of the function. This can happen as a result of the
@@ -13331,9 +17400,9 @@ diff -rcp2N gcc-2.7.2.3/unroll.c gcc-2.7.2.3.f.1/unroll.c
+ record_base_value (REGNO (tem), bl->biv->add_val);
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
+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 ****
--- 1067,1072 ----
@@ -13482,11 +17551,346 @@ diff -rcp2N gcc-2.7.2.3/varasm.c gcc-2.7.2.3.f.1/varasm.c
! || 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
+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.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 --git a/gcc/f/gbe/README b/gcc/f/gbe/README
index c30f5d7e6b8..4258a4cc496 100644
--- a/gcc/f/gbe/README
+++ b/gcc/f/gbe/README
@@ -1,4 +1,4 @@
-970909
+1997-12-23
This directory contains .diff files for various GNU CC distributions
supported by this version of GNU Fortran.
@@ -6,6 +6,11 @@ supported by this version of GNU Fortran.
The name of a file includes which gcc version to which it applies.
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
after merging into it the g77 source distribution, which would be
@@ -39,7 +44,7 @@ patch might work on gcc-2.7.3 or gcc-2.7.4 if these were
released. On the other hand, it probably wouldn't work for
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 <fortran@gnu.ai.mit.edu> for it -- it is certainly
+asking <fortran@gnu.org> for it -- it is certainly
being worked on. In the meantime, watch our progress at
-<ftp://alpha.gnu.ai.mit.edu/g77.plan> for information on support
+<ftp://alpha.gnu.org/g77.plan> for information on support
for the recent versions of gcc.
diff --git a/gcc/f/install.texi b/gcc/f/install.texi
index 3271eeabc82..4702bf54b4c 100644
--- a/gcc/f/install.texi
+++ b/gcc/f/install.texi
@@ -5,7 +5,19 @@
@c The text of this file appears in the file INSTALL
@c in the G77 distribution, as well as in the G77 manual.
-@c 1997-09-09
+@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
@node Installation
@@ -62,19 +74,19 @@ a complete GNU UNIX system can be put together on
most systems, if desired.
The version of GNU @code{gzip} used to package this release
-is 1.24.
+is @value{version-gzip}.
(The version of GNU @code{tar} used to package this release
-is 1.11.2.)
+is @value{version-tar}.)
-@item @file{gcc-2.7.2.3.tar.gz}
+@item @file{gcc-@value{version-gcc}.tar.gz}
You need to have this, or some other applicable, version
of @code{gcc} on your system.
The version should be an exact copy of a distribution
from the FSF.
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}
+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
this distribution.
@@ -83,7 +95,7 @@ Without an applicable @code{gcc} source tree, you cannot
build @code{g77}.
You can obtain an FSF distribution of @code{gcc} from the FSF.
-@item @file{g77-0.5.21.tar.gz}
+@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,
which are contained in this distribution.
@@ -99,7 +111,7 @@ using, how you build @code{g77}, and how much of it you
install (primarily, which languages you install).
The sizes shown below assume all languages distributed
-in @code{gcc-2.7.2.3}, plus @code{g77}, will be built
+in @code{gcc-@value{version-gcc}}, plus @code{g77}, will be built
and installed.
These sizes are indicative of GNU/Linux systems on
Intel x86 running COFF and on Digital Alpha (AXP) systems
@@ -198,7 +210,7 @@ In any case, you can apply patches by hand---patch files
are designed for humans to read them.
The version of GNU @code{patch} used to develop this release
-is 2.4.
+is @value{version-patch}.
@item @code{make}
Your system must have @code{make}, and you will probably save
@@ -206,7 +218,7 @@ yourself a lot of trouble if it is GNU @code{make} (sometimes
referred to as @code{gmake}).
The version of GNU @code{make} used to develop this release
-is 3.73.
+is @value{version-make}.
@item @code{cc}
Your system must have a working C compiler.
@@ -223,7 +235,7 @@ You can obtain @code{bison} the same way you obtained
@code{gcc} and @code{g77}.
The version of GNU @code{bison} used to develop this release
-is 1.25.
+is @value{version-bison}.
@xref{Missing bison?},
for information on how to work around not having @code{bison}.
@@ -235,7 +247,8 @@ You can obtain @code{makeinfo} the same way you obtained
@code{gcc} and @code{g77}.
The version of GNU @code{makeinfo} used to develop this release
-is 1.68, from GNU @code{texinfo} version 3.11.
+is @value{version-makeinfo}, from
+GNU @code{texinfo} version @value{version-texinfo}.
@xref{Missing makeinfo?},
for information on getting around the lack of @code{makeinfo}.
@@ -246,10 +259,10 @@ version that cannot handle configuring, building, or
installing @code{gcc} or @code{g77}.
The version of GNU @code{sed} used to develop this release
-is 2.05.
+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 2.05 immediately.
+it with version @value{version-sed} immediately.
See a GNU distribution site for further explanation.)
@item @code{root} access or equivalent
@@ -287,6 +300,7 @@ either @code{gcc} or @code{g77}.
@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
@@ -296,10 +310,10 @@ either @code{gcc} or @code{g77}.
These problems can occur on most or all systems.
@menu
-* GNU C Required:: Why even ANSI C is not enough.
+* 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
+* 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
flag @file{f/zzz.o}.
@@ -464,7 +478,26 @@ than the corresponding output files.
If the above does not work, definitely start from scratch
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.
+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
@subsection Cross-compiler Problems
@@ -679,7 +712,7 @@ The @code{g77} build will crash if an attempt is made to build
it as a cross-compiler
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
+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.
(Currently, @code{g77}
@@ -781,8 +814,8 @@ already reside in @file{/usr/FSF}, a naming convention
used by the author of @code{g77} on his own system:
@example
-/usr/FSF/gcc-2.7.2.3.tar.gz
-/usr/FSF/g77-0.5.21.tar.gz
+/usr/FSF/gcc-@value{version-gcc}.tar.gz
+/usr/FSF/g77-@value{version-g77}.tar.gz
@end example
@c (You can use @file{gcc-2.7.2.1.tar.gz} instead, or
@@ -823,20 +856,20 @@ These explanations follow this list of steps.
@example
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 -}
+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-0.5.21.tar.gz | tar xf -}
+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-2.7.2.3 gcc}
+sh[ 4]# @kbd{ln -s gcc-@value{version-gcc} gcc}
@set link-gcc 4
-sh[ 5]# @kbd{ln -s g77-0.5.21 g77}
+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 -V t -d gcc < gcc/f/gbe/2.7.2.3.diff}
+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
sh[ 8]# @kbd{cd gcc}
@@ -898,17 +931,17 @@ installed version of @code{g77} and @code{gcc} in any case.
@c instead, or apply @file{gcc-2.7.2-2.7.2.1.diff.gz} to achieve
@c similar results.
-@item Step @value{unpack-g77}: @kbd{gunzip -d < /usr/FSF/g77-0.5.21.tar.gz | tar xf -}
+@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
a complete, earlier distribution of @code{g77}.
If appropriate, you can unpack that earlier
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}.
+@value{version-g77} 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}
+@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
in this manual showing what to type to install @code{g77}.
@@ -922,7 +955,7 @@ other than the FSF.
@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
+@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
quick reminders of which version(s) of @code{g77} are
@@ -935,10 +968,11 @@ into the @file{gcc} directory).
@item Step @value{apply-patch}: @kbd{patch -p1 @dots{}}
@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 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
especially ``reject files'' are printed, it might
@@ -954,6 +988,15 @@ To remove these, after @kbd{cd gcc}, type @kbd{rm -i *.~*~}.
@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
version of @code{f77} (such as a native compiler, or a
@@ -1130,10 +1173,10 @@ and @code{g77} is:
@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{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
@@ -1158,7 +1201,7 @@ g77/f
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}).
+as it appears in the FSF distributions---e.g. @file{gcc-@value{version-gcc}}).
@file{g77/f} is the subdirectory containing all of the
code, documentation, and other information that is specific
@@ -1288,11 +1331,11 @@ It is hoped that the GBE interface, and the @code{gcc} and
@code{g77} products in general, will stabilize sufficiently
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 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
especially ``reject files'' are printed, it might
@@ -1311,6 +1354,15 @@ After @code{patch} finishes, the @code{gcc} directory might
have old versions of several files as saved by @code{patch}.
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}
ensures that the source code for the version of @code{gcc}
@@ -1327,7 +1379,7 @@ but could easily produce broken code.
@cindex creating patch files
@cindex patch files, creating
@pindex gcc/f/gbe/
-@samp{diff -rcp2N} is used to create the patch files
+@samp{LC_ALL=C TZ=UTC0 diff -rcp2N} is used to create the patch files
in @file{gcc/f/gbe/}.
@node Installing f77
@@ -1778,46 +1830,46 @@ printed by them when they work:
@example
sh# @kbd{cd /usr/src/gcc}
sh# @kbd{./g77 --driver=./xgcc -B./ -v}
-g77 version 0.5.21
+g77 version @value{version-g77}
./xgcc -B./ -v -fnull-version -o /tmp/gfa18047 @dots{}
Reading specs from ./specs
-gcc version 2.7.2.3.f.1
+gcc version @value{version-gcc-patched}
./cpp -lang-c -v -isystem ./include -undef @dots{}
-GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+GNU CPP version @value{version-gcc-patched} (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/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 2.7.2.3.f.1 (Linux/Alpha) compiled @dots{}
-GNU Fortran Front End version 0.5.21 compiled: @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__: 0.5.21
+__G77_LIBF77_VERSION__: @value{version-g77}
@@(#)LIBF77 VERSION 19970404
-__G77_LIBI77_VERSION__: 0.5.21
+__G77_LIBI77_VERSION__: @value{version-g77}
@@(#) LIBI77 VERSION pjw,dmg-mods 19970816
-__G77_LIBU77_VERSION__: 0.5.21
+__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 2.7.2.3.f.1
+gcc version @value{version-gcc-patched}
./cpp -lang-c -v -isystem ./include -undef @dots{}
-GNU CPP version 2.7.2.3.f.1 (Linux/Alpha)
+GNU CPP version @value{version-gcc-patched} (Linux/Alpha)
#include "..." search starts here:
#include <...> search starts here:
./include
/usr/local/include
/usr/alpha-unknown-linux/include
- /usr/lib/gcc-lib/alpha-unknown-linux/2.7.2.3.f.1/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 2.7.2.3.f.1 (Linux/Alpha) compiled @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{}
/usr/lib/crt0.o: In function `__start':
@@ -2137,7 +2189,7 @@ until you're sure your distribution is widely used and has been
well tested.
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
+@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
user.
diff --git a/gcc/f/intdoc.c b/gcc/f/intdoc.c
index a302a7be358..d505382b433 100644
--- a/gcc/f/intdoc.c
+++ b/gcc/f/intdoc.c
@@ -494,7 +494,7 @@ external procedure.\n\
if ((argi[0] == '*')
|| (argi[0] == 'n')
|| (argi[0] == '+')
- || (argi[0] == 'p'))
+ || (argi[0] == 'p'))
printf ("-1, @var{%s}-2, @dots{}, @var{%s}-n",
argc, argc);
}
@@ -559,7 +559,7 @@ this intrinsic is valid only when used as the argument to\n\
}
#if 0
else if ((c[0] == 'I')
- && (c[1] == 'p'))
+ && (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");
#endif
@@ -730,10 +730,6 @@ types of all the arguments.\n\n");
argument_name_string (imp, 0));
break;
- case 'p':
- printf ("@code{INTEGER} wide enough to hold a pointer");
- break;
-
default:
assert ("Ia" == NULL);
break;
@@ -848,7 +844,7 @@ types of all the arguments.\n\n");
break;
default:
- assert ("N1" == NULL);
+ assert ("E1" == NULL);
break;
}
break;
@@ -1209,10 +1205,6 @@ print_type_string (char *c)
printf ("@code{INTEGER(KIND=%d)}", (kind - '0'));
break;
- case 'p':
- printf ("@code{INTEGER(KIND=0)}");
- break;
-
default:
assert ("Ia" == NULL);
break;
@@ -1336,7 +1328,7 @@ print_type_string (char *c)
break;
default:
- assert ("arg type?" == NULL);
+ assert ("type?" == NULL);
break;
}
}
diff --git a/gcc/f/intdoc.in b/gcc/f/intdoc.in
index eabb2e7e4e6..f8c9b8261df 100644
--- a/gcc/f/intdoc.in
+++ b/gcc/f/intdoc.in
@@ -1282,15 +1282,13 @@ Returns the local time in seconds since midnight minus the value
DEFDOC (SECOND_func, "Get CPU time for process in seconds.", "\
Returns the process's runtime in seconds---the same value as the
UNIX function @code{etime} returns.
-
-This routine is known from Cray Fortran.
")
DEFDOC (SECOND_subr, "Get CPU time for process@99@in seconds.", "\
Returns the process's runtime in seconds in @var{@1@}---the same value
as the UNIX function @code{etime} returns.
-This routine is known from Cray Fortran. @xref{Cpu_Time Intrinsic}
+This routine is known from Cray Fortran. @xref{CPU_Time Intrinsic}
for a standard equivalent.
")
@@ -1445,6 +1443,10 @@ If the @var{@2@} argument is supplied, it contains 0
on success or a non-zero error code otherwise upon return.
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
(optional) @var{@2@} argument.
@@ -1455,6 +1457,10 @@ Sets the current working directory to be @var{@1@}.
Returns 0 on success or a non-zero error code.
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.
")
@@ -2039,6 +2045,12 @@ trailing blanks in @var{@1@} are ignored.
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@}.
")
DEFDOC (HOSTNM_func, "Get host name.", "\
@@ -2190,12 +2202,13 @@ DEFDOC (SIGNAL_subr, "Muck with signal handling.", "\
If @var{@2@} is a an @code{EXTERNAL} routine, arranges for it to be
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
+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 its value in
+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.
The value returned by @code{signal(2)} is written to @var{@3@}, if
@@ -2205,24 +2218,106 @@ Otherwise the return value is ignored.
Some non-GNU implementations of Fortran provide this intrinsic as
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.
")
DEFDOC (SIGNAL_func, "Muck with signal handling.", "\
If @var{@2@} is a an @code{EXTERNAL} routine, arranges for it to be
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
+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 its value in
-Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it.
+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.
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.
")
DEFDOC (KILL_func, "Signal a process.", "\
diff --git a/gcc/f/intdoc.texi b/gcc/f/intdoc.texi
index c0093d1912a..cf48c4b9914 100644
--- a/gcc/f/intdoc.texi
+++ b/gcc/f/intdoc.texi
@@ -150,7 +150,7 @@
@end ifset
@ifset familyF90
* Count Intrinsic:: (Reserved for future use.)
-* Cpu_Time Intrinsic:: Get current CPU time.
+* CPU_Time Intrinsic:: Get current CPU time.
* CShift Intrinsic:: (Reserved for future use.)
@end ifset
@ifset familyF77
@@ -2229,6 +2229,10 @@ If the @var{Status} argument is supplied, it contains 0
on success or a non-zero error code otherwise upon return.
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
(optional) @var{Status} argument.
@@ -2264,6 +2268,10 @@ Sets the current working directory to be @var{Dir}.
Returns 0 on success or a non-zero error code.
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.
@@ -2595,18 +2603,18 @@ The name is, however, reserved as an intrinsic.
Use @samp{EXTERNAL Count} to use this name for an
external procedure.
-@node Cpu_Time Intrinsic
-@subsubsection Cpu_Time Intrinsic
-@cindex Cpu_Time intrinsic
-@cindex intrinsics, Cpu_Time
+@node CPU_Time Intrinsic
+@subsubsection CPU_Time Intrinsic
+@cindex CPU_Time intrinsic
+@cindex intrinsics, CPU_Time
@noindent
@example
-CALL Cpu_Time(@var{Seconds})
+CALL CPU_Time(@var{Seconds})
@end example
@noindent
-@var{Seconds}: @code{REAL(KIND=1)}; scalar; INTENT(OUT).
+@var{Seconds}: @code{REAL}; scalar; INTENT(OUT).
@noindent
Intrinsic groups: @code{f90}.
@@ -5270,6 +5278,12 @@ Description:
Returns the login name for the process in @var{Login}.
+@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{Login}.
+
@node GetPId Intrinsic
@subsubsection GetPId Intrinsic
@cindex GetPId intrinsic
@@ -6355,7 +6369,7 @@ Int2(@var{A})
Int2: @code{INTEGER(KIND=6)} function.
@noindent
-@var{A}: @code{INTEGER}; scalar; INTENT(IN).
+@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
@noindent
Intrinsic groups: @code{gnu}.
@@ -6390,7 +6404,7 @@ Int8(@var{A})
Int8: @code{INTEGER(KIND=2)} function.
@noindent
-@var{A}: @code{INTEGER}; scalar; INTENT(IN).
+@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
@noindent
Intrinsic groups: @code{gnu}.
@@ -7373,7 +7387,7 @@ Loc(@var{Entity})
@end example
@noindent
-Loc: @code{INTEGER(KIND=0)} function.
+Loc: @code{INTEGER(KIND=7)} function.
@noindent
@var{Entity}: Any type; cannot be a constant or expression.
@@ -9093,8 +9107,6 @@ Description:
Returns the process's runtime in seconds---the same value as the
UNIX function @code{etime} returns.
-This routine is known from Cray Fortran.
-
For information on other intrinsics with the same name:
@xref{Second Intrinsic (subroutine)}.
@@ -9109,7 +9121,7 @@ CALL Second(@var{Seconds})
@end example
@noindent
-@var{Seconds}: @code{REAL(KIND=1)}; scalar; INTENT(OUT).
+@var{Seconds}: @code{REAL}; scalar; INTENT(OUT).
@noindent
Intrinsic groups: @code{unix}.
@@ -9120,7 +9132,7 @@ Description:
Returns the process's runtime in seconds in @var{Seconds}---the same value
as the UNIX function @code{etime} returns.
-This routine is known from Cray Fortran. @xref{Cpu_Time Intrinsic}
+This routine is known from Cray Fortran. @xref{CPU_Time Intrinsic}
for a standard equivalent.
For information on other intrinsics with the same name:
@@ -9260,7 +9272,7 @@ CALL Signal(@var{Number}, @var{Handler}, @var{Status})
or dummy/global @code{INTEGER(KIND=1)} scalar.
@noindent
-@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
+@var{Status}: @code{INTEGER(KIND=7)}; OPTIONAL; scalar; INTENT(OUT).
@noindent
Intrinsic groups: @code{unix}.
@@ -9271,12 +9283,13 @@ Description:
If @var{Handler} is a an @code{EXTERNAL} routine, arranges for it to be
invoked with a single integer argument (of system-dependent length)
when signal @var{Number} occurs.
-If @var{Number} is an integer, it can be
-used to turn off handling of signal @var{Handler} or revert to its default
+If @var{Handler} is an integer, it can be
+used to turn off handling of signal @var{Number} or revert to its default
action.
See @code{signal(2)}.
-Note that @var{Handler} will be called using C conventions, so its value in
+Note that @var{Handler} 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.
The value returned by @code{signal(2)} is written to @var{Status}, if
@@ -9287,6 +9300,34 @@ Some non-GNU implementations of Fortran provide this intrinsic as
only a function, not as a subroutine, or do not support the
(optional) @var{Status} 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{Handler} 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.
+
For information on other intrinsics with the same name:
@xref{Signal Intrinsic (function)}.
@@ -9303,7 +9344,7 @@ Signal(@var{Number}, @var{Handler})
@end example
@noindent
-Signal: @code{INTEGER(KIND=1)} function.
+Signal: @code{INTEGER(KIND=7)} function.
@noindent
@var{Number}: @code{INTEGER}; scalar; INTENT(IN).
@@ -9321,19 +9362,73 @@ Description:
If @var{Handler} is a an @code{EXTERNAL} routine, arranges for it to be
invoked with a single integer argument (of system-dependent length)
when signal @var{Number} occurs.
-If @var{Number} is an integer, it can be
-used to turn off handling of signal @var{Handler} or revert to its default
+If @var{Handler} is an integer, it can be
+used to turn off handling of signal @var{Number} or revert to its default
action.
See @code{signal(2)}.
-Note that @var{Handler} will be called using C conventions, so its value in
-Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it.
+Note that @var{Handler} 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.
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{Handler} 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.
+
For information on other intrinsics with the same name:
@xref{Signal Intrinsic (subroutine)}.
diff --git a/gcc/f/intrin.c b/gcc/f/intrin.c
index 16f36fbdb3c..5ab530be809 100644
--- a/gcc/f/intrin.c
+++ b/gcc/f/intrin.c
@@ -1,5 +1,5 @@
/* intrin.c -- Recognize references to intrinsics
- Copyright (C) 1995-1997 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -398,6 +398,10 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
case 6:
akt = 3;
break;
+
+ case 7:
+ akt = ffecom_pointer_kind ();
+ break;
}
}
okay &= anynum || (ffeinfo_kindtype (i) == akt);
@@ -519,11 +523,6 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
} while (TRUE);
}
- /* Ignore explicit trailing omitted args. */
-
- while ((arg != NULL) && (ffebld_head (arg) == NULL))
- arg = ffebld_trail (arg);
-
if (arg != NULL)
return FFEBAD_INTRINSIC_TOOMANY;
@@ -593,6 +592,10 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
case 6:
kt = 3;
break;
+
+ case 7:
+ kt = ffecom_pointer_kind ();
+ break;
}
}
break;
@@ -603,10 +606,6 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
kt = 1;
break;
- case 'p':
- kt = ffecom_pointer_kind ();
- break;
-
case '=':
need_col = TRUE;
/* Fall through. */
@@ -991,6 +990,10 @@ ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
case 6:
akt = 3;
break;
+
+ case 7:
+ akt = ffecom_pointer_kind ();
+ break;
}
}
okay &= anynum || (ffeinfo_kindtype (i) == akt);
@@ -1363,7 +1366,8 @@ ffeintrin_fulfill_generic (ffebld *expr, ffeinfo *info, ffelexToken t)
if ((ffesymbol_attrs (ffebld_symter (symter)) & FFESYMBOL_attrsTYPE)
&& (((bt != ffesymbol_basictype (ffebld_symter (symter)))
|| (kt != ffesymbol_kindtype (ffebld_symter (symter)))
- || (sz != ffesymbol_size (ffebld_symter (symter))))))
+ || ((sz != FFETARGET_charactersizeNONE)
+ && (sz != ffesymbol_size (ffebld_symter (symter)))))))
{
ffebad_start (FFEBAD_INTRINSIC_TYPE);
ffebad_here (0, ffelex_token_where_line (t),
@@ -1569,14 +1573,14 @@ ffeintrin_init_0 ()
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'))
+ && (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_imps_[i].name);
@@ -1584,10 +1588,9 @@ ffeintrin_init_0 ()
}
if ((c[1] != '-')
&& (c[1] != '=')
- && ((c[1] < '1')
- || (c[1] > '9'))
- && (c[1] != 'C')
- && (c[1] != 'p'))
+ && ((c[1] < '1')
+ || (c[1] > '9'))
+ && (c[1] != 'C'))
{
fprintf (stderr, "%s: bad return-kind-type\n",
ffeintrin_imps_[i].name);
@@ -1613,8 +1616,8 @@ ffeintrin_init_0 ()
}
if ((c[colon + 1] != '-')
&& (c[colon + 1] != '*')
- && ((c[colon + 1] < '0')
- || (c[colon + 1] > '9')))
+ && ((c[colon + 1] < '0')
+ || (c[colon + 1] > '9')))
{
fprintf (stderr, "%s: bad COL-spec\n",
ffeintrin_imps_[i].name);
@@ -1625,7 +1628,7 @@ ffeintrin_init_0 ()
{
while ((c[0] != '=')
&& (c[0] != ',')
- && (c[0] != '\0'))
+ && (c[0] != '\0'))
++c;
if (c[0] != '=')
{
@@ -1635,28 +1638,27 @@ ffeintrin_init_0 ()
}
if ((c[1] == '?')
|| (c[1] == '!')
- || (c[1] == '!')
|| (c[1] == '+')
- || (c[1] == '*')
+ || (c[1] == '*')
|| (c[1] == 'n')
- || (c[1] == 'p'))
+ || (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[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')))
+ && (c[2] != 'A')))
{
fprintf (stderr, "%s: bad arg-type\n",
ffeintrin_imps_[i].name);
@@ -1693,13 +1695,13 @@ ffeintrin_init_0 ()
++c;
if ((c[3] == '&')
|| (c[3] == 'i')
- || (c[3] == 'w')
- || (c[3] == 'x'))
+ || (c[3] == 'w')
+ || (c[3] == 'x'))
++c;
if (c[3] == ',')
{
c += 4;
- break;
+ continue;
}
if (c[3] != '\0')
{
diff --git a/gcc/f/intrin.def b/gcc/f/intrin.def
index 66ca3c0a215..29766543c8f 100644
--- a/gcc/f/intrin.def
+++ b/gcc/f/intrin.def
@@ -25,7 +25,7 @@ DEFNAME ("AIMIN0", "aimin0", "AIMin0", genNONE, specAIMIN0) /* VXT */
DEFNAME ("AINT", "aint", "AInt", genNONE, specAINT)
DEFNAME ("AJMAX0", "ajmax0", "AJMax0", genNONE, specAJMAX0) /* VXT */
DEFNAME ("AJMIN0", "ajmin0", "AJMin0", genNONE, specAJMIN0) /* VXT */
-DEFNAME ("ALARM", "alarm", "Alarm", genNONE, specALARM) /* UNIX */
+DEFNAME ("ALARM", "alarm", "Alarm", genNONE, specALARM) /* UNIX */
DEFNAME ("ALL", "all", "All", genNONE, specALL) /* F90 */
DEFNAME ("ALLOCATED", "allocated", "Allocated", genNONE, specALLOCATED) /* F90 */
DEFNAME ("ALOG", "alog", "ALog", genNONE, specALOG)
@@ -76,7 +76,7 @@ DEFNAME ("COS", "cos", "Cos", genNONE, specCOS)
DEFNAME ("COSD", "cosd", "CosD", genNONE, specCOSD) /* VXT */
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 ("CPU_TIME", "cpu_time", "CPU_Time", genNONE, specCPU_TIME) /* F95 */
DEFNAME ("CSHIFT", "cshift", "CShift", genNONE, specCSHIFT) /* F90 */
DEFNAME ("CSIN", "csin", "CSin", genNONE, specCSIN)
DEFNAME ("CSQRT", "csqrt", "CSqRt", genNONE, specCSQRT)
@@ -3038,8 +3038,8 @@ DEFSPEC (NONE,
3 (Same size as CHARACTER*1)
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
- p ffecom_pointer_kind_
<return-modifier> is:
@@ -3206,7 +3206,7 @@ DEFIMP (TAN, "TAN", L_TAN,TAN,, "R=:0:X=R*")
DEFIMP (TANH, "TANH", L_TANH,TANH,, "R=:0:X=R*")
DEFIMP (ABORT, "ABORT", ABORT,,, "--:-:")
-DEFIMP (ACCESS, "ACCESS", ACCESS,,, "I1:-:Name=A1,Mode=A1")
+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 (AND, "AND", ,,, "B=:*:I=B*,J=B*")
@@ -3229,10 +3229,10 @@ DEFIMP (CHDIR_subr, "CHDIR_subr", CHDIR,,, "--:-:Dir=A1,Status=?I1w")
DEFIMP (CHMOD_func, "CHMOD_func", CHMOD,,, "I1:-:Name=A1,Mode=A1")
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 (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 (DBESJN, "DBESJN", L_BESJN,,, "R2:-:N=I*,X=R2")
@@ -3245,28 +3245,28 @@ DEFIMP (DERFC, "DERFC", L_ERFC,DERFC,, "R2:-:X=R2")
DEFIMP (DFLOAT, "DFLOAT", ,,, "R2:-:A=I*")
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 (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 (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 (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 (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 (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 (GERROR, "GERROR", GERROR,,, "--:-:Message=A1w")
@@ -3278,7 +3278,7 @@ DEFIMP (GETLOG, "GETLOG", GETLOG,,, "--:-:Login=A1w")
DEFIMP (GETPID, "GETPID", GETPID,,, "I1:-:")
DEFIMP (GETUID, "GETUID", GETUID,,, "I1:-:")
DEFIMP (GETENV, "GETENV", GETENV,,, "--:-:Name=A1,Value=A1w")
-DEFIMP (GMTIME, "GMTIME", GMTIME,,, "--:-:STime=I1,TArray=I1(9)w")
+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 (IACHAR, "IACHAR", ,,, "I1:-:C=A*")
@@ -3287,63 +3287,63 @@ DEFIMP (IARGC, "IARGC", IARGC,,, "I1:-:")
DEFIMP (IBCLR, "IBCLR", ,,, "I=:0:I=I*,Pos=I*")
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 (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 (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 (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 (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 (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 (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 (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 (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 (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,,, "I1:-:Number=I*,Handler=s*")
-DEFIMP (SIGNAL_subr, "SIGNAL_subr", L_SIGNAL,,, "--:-:Number=I*,Handler=s*,Status=?I1w")
+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 (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 (SYSTEM_CLOCK, "SYSTEM_CLOCK", SYSTEM_CLOCK,,, "--:-:Count=I1w,Rate=I1w,Max=I1w")
DEFIMP (TIME8, "TIME8", TIME,,, "I2:-:")
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 (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")
DEFIMP (XOR, "XOR", ,,, "B=:*:I=B*,J=B*")
diff --git a/gcc/f/lang-options.h b/gcc/f/lang-options.h
index a0e5c80596d..51082fb837f 100644
--- a/gcc/f/lang-options.h
+++ b/gcc/f/lang-options.h
@@ -103,6 +103,10 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
"-fcase-upper",
"-fcase-lower",
"-fcase-preserve",
+ "-fbadu77-intrinsics-delete",
+ "-fbadu77-intrinsics-hide",
+ "-fbadu77-intrinsics-disable",
+ "-fbadu77-intrinsics-enable",
"-fdcp-intrinsics-delete",
"-fdcp-intrinsics-hide",
"-fdcp-intrinsics-disable",
@@ -115,6 +119,10 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
"-ff90-intrinsics-hide",
"-ff90-intrinsics-disable",
"-ff90-intrinsics-enable",
+ "-fgnu-intrinsics-delete",
+ "-fgnu-intrinsics-hide",
+ "-fgnu-intrinsics-disable",
+ "-fgnu-intrinsics-enable",
"-fmil-intrinsics-delete",
"-fmil-intrinsics-hide",
"-fmil-intrinsics-disable",
diff --git a/gcc/f/lex.c b/gcc/f/lex.c
index acb439157af..dbf79dd4b06 100644
--- a/gcc/f/lex.c
+++ b/gcc/f/lex.c
@@ -230,7 +230,7 @@ ffelex_append_to_token_ (char c)
}
#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
+please contact fortran@gnu.org if you wish to fund work to
port g77 to non-ASCII machines.
#endif
ffelex_token_->text[ffelex_token_->length++] = c;
diff --git a/gcc/f/malloc.c b/gcc/f/malloc.c
index 1cbaf0399ca..4a553e92084 100644
--- a/gcc/f/malloc.c
+++ b/gcc/f/malloc.c
@@ -51,7 +51,7 @@ struct _malloc_root_ malloc_root_
(mallocArea_) &malloc_root_.malloc_pool_image_.first,
0,
#if MALLOC_DEBUG
- 0, 0, 0, 0, 0, 0, 0, '/'
+ 0, 0, 0, 0, 0, 0, 0, { '/' }
#endif
},
};
diff --git a/gcc/f/news.texi b/gcc/f/news.texi
index b9f01423eac..00c7c5cea7c 100644
--- a/gcc/f/news.texi
+++ b/gcc/f/news.texi
@@ -5,7 +5,7 @@
@c The text of this file appears in the file BUGS
@c in the G77 distribution, as well as in the G77 manual.
-@c 1997-09-09
+@c 1998-03-16
@ifclear NEWSONLY
@node News
@@ -17,13 +17,186 @@
Changes made to recent versions of GNU Fortran are listed
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.
+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:
@itemize @bullet
@item
diff --git a/gcc/f/sta.c b/gcc/f/sta.c
index 328bfd0f662..281ca936133 100644
--- a/gcc/f/sta.c
+++ b/gcc/f/sta.c
@@ -1792,9 +1792,11 @@ ffesta_ffebad_2t (ffebad errnum, ffelexToken t1, ffelexToken t2)
}
}
-/* ffesta_set_outpooldisp -- Set disposition of statement output pool
-
- ffesta_set_outpooldisp(FFESTA_pooldispPRESERVE); */
+ffestaPooldisp
+ffesta_outpooldisp ()
+{
+ return ffesta_outpooldisp_;
+}
void
ffesta_set_outpooldisp (ffestaPooldisp d)
diff --git a/gcc/f/sta.h b/gcc/f/sta.h
index 132d0e84d4b..26e78c412ce 100644
--- a/gcc/f/sta.h
+++ b/gcc/f/sta.h
@@ -98,6 +98,7 @@ void ffesta_ffebad_2st (ffebad msg, char *s, ffelexToken t1, ffelexToken t2);
void ffesta_ffebad_2t (ffebad msg, ffelexToken t1, ffelexToken t2);
ffelexHandler ffesta_zero (ffelexToken t);
ffelexHandler ffesta_two (ffelexToken first, ffelexToken second);
+ffestaPooldisp ffesta_outpooldisp (void);
void ffesta_set_outpooldisp (ffestaPooldisp d);
/* Define macros. */
diff --git a/gcc/f/stb.c b/gcc/f/stb.c
index 2bee98a9fa5..4d7fbd7645f 100644
--- a/gcc/f/stb.c
+++ b/gcc/f/stb.c
@@ -9212,14 +9212,14 @@ ffestb_R10014_ (ffelexToken t)
}
if (ffestb_local_.format.sign)
{
- for (i = 0; i < ffelex_token_length (t); ++i)
+ 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),
NULL, 10);
}
else
{
- for (i = 0; i < ffelex_token_length (t); ++i)
+ 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),
NULL, 10);
@@ -10103,7 +10103,7 @@ ffestb_R10016_ (ffelexToken t)
ffebad_finish ();
return (ffelexHandler) ffestb_R10016_;
}
- for (i = 0; i < ffelex_token_length (t); ++i)
+ 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),
NULL, 10);
@@ -10203,7 +10203,7 @@ ffestb_R10018_ (ffelexToken t)
ffebad_finish ();
return (ffelexHandler) ffestb_R10018_;
}
- for (i = 0; i < ffelex_token_length (t); ++i)
+ 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),
NULL, 10);
@@ -10330,7 +10330,7 @@ ffestb_R100110_ (ffelexToken t)
ffebad_finish ();
return (ffelexHandler) ffestb_R100110_;
}
- for (i = 0; i < ffelex_token_length (t); ++i)
+ 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),
NULL, 10);
diff --git a/gcc/f/std.c b/gcc/f/std.c
index ea497425d9c..400b3b98401 100644
--- a/gcc/f/std.c
+++ b/gcc/f/std.c
@@ -1,5 +1,5 @@
/* std.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -546,6 +546,7 @@ static void ffestd_R1001dump_1010_4_ (ffests s, ffesttFormatList f,
static void ffestd_R1001dump_1010_5_ (ffests s, ffesttFormatList f,
char *string);
static void ffestd_R1001error_ (ffesttFormatList f);
+static void ffestd_R1001rtexpr_ (ffests s, ffesttFormatList f, ffebld expr);
/* Internal macros. */
@@ -661,9 +662,10 @@ ffestd_stmt_pass_ ()
{
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)
+ if ((ffestd_2pass_entrypoints_ != 0) && okay)
{
tree which = ffecom_which_entrypoint_decl ();
tree value;
@@ -717,83 +719,97 @@ ffestd_stmt_pass_ ()
{
case FFESTD_stmtidENDDOLOOP_:
ffestd_subr_line_restore_ (stmt);
- ffeste_do (stmt->u.enddoloop.block);
+ if (okay)
+ ffeste_do (stmt->u.enddoloop.block);
ffestw_kill (stmt->u.enddoloop.block);
break;
case FFESTD_stmtidENDLOGIF_:
ffestd_subr_line_restore_ (stmt);
- ffeste_end_R807 ();
+ if (okay)
+ ffeste_end_R807 ();
break;
case FFESTD_stmtidEXECLABEL_:
- ffeste_labeldef_branch (stmt->u.execlabel.label);
+ if (okay)
+ ffeste_labeldef_branch (stmt->u.execlabel.label);
break;
case FFESTD_stmtidFORMATLABEL_:
- ffeste_labeldef_format (stmt->u.formatlabel.label);
+ if (okay)
+ 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);
+ if (okay)
+ ffeste_R737A (stmt->u.R737A.dest, stmt->u.R737A.source);
malloc_pool_kill (stmt->u.R737A.pool);
break;
case FFESTD_stmtidR803_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R803 (stmt->u.R803.expr);
+ if (okay)
+ ffeste_R803 (stmt->u.R803.expr);
malloc_pool_kill (stmt->u.R803.pool);
break;
case FFESTD_stmtidR804_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R804 (stmt->u.R804.expr);
+ if (okay)
+ ffeste_R804 (stmt->u.R804.expr);
malloc_pool_kill (stmt->u.R804.pool);
break;
case FFESTD_stmtidR805_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R805 ();
+ if (okay)
+ ffeste_R805 ();
break;
case FFESTD_stmtidR806_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R806 ();
+ if (okay)
+ ffeste_R806 ();
break;
case FFESTD_stmtidR807_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R807 (stmt->u.R807.expr);
+ if (okay)
+ ffeste_R807 (stmt->u.R807.expr);
malloc_pool_kill (stmt->u.R807.pool);
break;
case FFESTD_stmtidR809_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R809 (stmt->u.R809.block, stmt->u.R809.expr);
+ if (okay)
+ ffeste_R809 (stmt->u.R809.block, stmt->u.R809.expr);
malloc_pool_kill (stmt->u.R809.pool);
break;
case FFESTD_stmtidR810_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R810 (stmt->u.R810.block, stmt->u.R810.casenum);
+ if (okay)
+ ffeste_R810 (stmt->u.R810.block, stmt->u.R810.casenum);
malloc_pool_kill (stmt->u.R810.pool);
break;
case FFESTD_stmtidR811_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R811 (stmt->u.R811.block);
+ if (okay)
+ ffeste_R811 (stmt->u.R811.block);
malloc_pool_kill (ffestw_select (stmt->u.R811.block)->pool);
ffestw_kill (stmt->u.R811.block);
break;
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);
+ 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);
if (stmt->u.R819A.incr_token != NULL)
@@ -803,269 +819,342 @@ ffestd_stmt_pass_ ()
case FFESTD_stmtidR819B_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R819B (stmt->u.R819B.block, stmt->u.R819B.label,
- stmt->u.R819B.expr);
+ if (okay)
+ ffeste_R819B (stmt->u.R819B.block, stmt->u.R819B.label,
+ stmt->u.R819B.expr);
malloc_pool_kill (stmt->u.R819B.pool);
break;
case FFESTD_stmtidR825_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R825 ();
+ if (okay)
+ ffeste_R825 ();
break;
case FFESTD_stmtidR834_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R834 (stmt->u.R834.block);
+ if (okay)
+ ffeste_R834 (stmt->u.R834.block);
break;
case FFESTD_stmtidR835_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R835 (stmt->u.R835.block);
+ if (okay)
+ ffeste_R835 (stmt->u.R835.block);
break;
case FFESTD_stmtidR836_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R836 (stmt->u.R836.label);
+ if (okay)
+ 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);
+ if (okay)
+ ffeste_R837 (stmt->u.R837.labels, stmt->u.R837.count,
+ stmt->u.R837.expr);
malloc_pool_kill (stmt->u.R837.pool);
break;
case FFESTD_stmtidR838_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R838 (stmt->u.R838.label, stmt->u.R838.target);
+ if (okay)
+ ffeste_R838 (stmt->u.R838.label, stmt->u.R838.target);
malloc_pool_kill (stmt->u.R838.pool);
break;
case FFESTD_stmtidR839_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R839 (stmt->u.R839.target);
+ if (okay)
+ ffeste_R839 (stmt->u.R839.target);
malloc_pool_kill (stmt->u.R839.pool);
break;
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);
+ 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;
case FFESTD_stmtidR841_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R841 ();
+ if (okay)
+ ffeste_R841 ();
break;
case FFESTD_stmtidR842_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R842 (stmt->u.R842.expr);
- malloc_pool_kill (stmt->u.R842.pool);
+ 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);
- ffeste_R843 (stmt->u.R843.expr);
+ if (okay)
+ ffeste_R843 (stmt->u.R843.expr);
malloc_pool_kill (stmt->u.R843.pool);
break;
case FFESTD_stmtidR904_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R904 (stmt->u.R904.params);
+ if (okay)
+ ffeste_R904 (stmt->u.R904.params);
malloc_pool_kill (stmt->u.R904.pool);
break;
case FFESTD_stmtidR907_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R907 (stmt->u.R907.params);
+ if (okay)
+ ffeste_R907 (stmt->u.R907.params);
malloc_pool_kill (stmt->u.R907.pool);
break;
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);
+ 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)
{
- ffeste_R909_item (expr->expr, expr->token);
+ if (okay)
+ ffeste_R909_item (expr->expr, expr->token);
ffelex_token_kill (expr->token);
}
- ffeste_R909_finish ();
+ if (okay)
+ ffeste_R909_finish ();
malloc_pool_kill (stmt->u.R909.pool);
break;
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);
+ 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)
{
- ffeste_R910_item (expr->expr, expr->token);
+ if (okay)
+ ffeste_R910_item (expr->expr, expr->token);
ffelex_token_kill (expr->token);
}
- ffeste_R910_finish ();
+ if (okay)
+ ffeste_R910_finish ();
malloc_pool_kill (stmt->u.R910.pool);
break;
case FFESTD_stmtidR911_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R911_start (stmt->u.R911.params, stmt->u.R911.format);
+ if (okay)
+ 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);
+ if (okay)
+ ffeste_R911_item (expr->expr, expr->token);
ffelex_token_kill (expr->token);
}
- ffeste_R911_finish ();
+ if (okay)
+ ffeste_R911_finish ();
malloc_pool_kill (stmt->u.R911.pool);
break;
case FFESTD_stmtidR919_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R919 (stmt->u.R919.params);
+ if (okay)
+ ffeste_R919 (stmt->u.R919.params);
malloc_pool_kill (stmt->u.R919.pool);
break;
case FFESTD_stmtidR920_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R920 (stmt->u.R920.params);
+ if (okay)
+ ffeste_R920 (stmt->u.R920.params);
malloc_pool_kill (stmt->u.R920.pool);
break;
case FFESTD_stmtidR921_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R921 (stmt->u.R921.params);
+ if (okay)
+ ffeste_R921 (stmt->u.R921.params);
malloc_pool_kill (stmt->u.R921.pool);
break;
case FFESTD_stmtidR923A_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R923A (stmt->u.R923A.params, stmt->u.R923A.by_file);
+ if (okay)
+ ffeste_R923A (stmt->u.R923A.params, stmt->u.R923A.by_file);
malloc_pool_kill (stmt->u.R923A.pool);
break;
case FFESTD_stmtidR923B_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R923B_start (stmt->u.R923B.params);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_R923B_item (expr->expr);
+ }
+ if (okay)
+ ffeste_R923B_finish ();
malloc_pool_kill (stmt->u.R923B.pool);
break;
case FFESTD_stmtidR1001_:
- ffeste_R1001 (&stmt->u.R1001.str);
+ if (okay)
+ ffeste_R1001 (&stmt->u.R1001.str);
ffests_kill (&stmt->u.R1001.str);
break;
case FFESTD_stmtidR1103_:
- ffeste_R1103 ();
+ if (okay)
+ ffeste_R1103 ();
break;
case FFESTD_stmtidR1112_:
- ffeste_R1112 ();
+ if (okay)
+ ffeste_R1112 ();
break;
case FFESTD_stmtidR1212_:
ffestd_subr_line_restore_ (stmt);
- ffeste_R1212 (stmt->u.R1212.expr);
+ if (okay)
+ ffeste_R1212 (stmt->u.R1212.expr);
malloc_pool_kill (stmt->u.R1212.pool);
break;
case FFESTD_stmtidR1221_:
- ffeste_R1221 ();
+ if (okay)
+ ffeste_R1221 ();
break;
case FFESTD_stmtidR1225_:
- ffeste_R1225 ();
+ if (okay)
+ ffeste_R1225 ();
break;
case FFESTD_stmtidR1226_:
ffestd_subr_line_restore_ (stmt);
if (stmt->u.R1226.entry != NULL)
- ffeste_R1226 (stmt->u.R1226.entry);
+ {
+ if (okay)
+ 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);
+ if (okay)
+ ffeste_R1227 (stmt->u.R1227.block, stmt->u.R1227.expr);
malloc_pool_kill (stmt->u.R1227.pool);
break;
#if FFESTR_VXT
case FFESTD_stmtidV018_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V018_start (stmt->u.V018.params, stmt->u.V018.format);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_V018_item (expr->expr);
+ }
+ if (okay)
+ ffeste_V018_finish ();
malloc_pool_kill (stmt->u.V018.pool);
break;
case FFESTD_stmtidV019_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V019_start (stmt->u.V019.params, stmt->u.V019.format);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_V019_item (expr->expr);
+ }
+ if (okay)
+ ffeste_V019_finish ();
malloc_pool_kill (stmt->u.V019.pool);
break;
#endif
case FFESTD_stmtidV020_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V020_start (stmt->u.V020.params, stmt->u.V020.format);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_V020_item (expr->expr);
+ }
+ if (okay)
+ ffeste_V020_finish ();
malloc_pool_kill (stmt->u.V020.pool);
break;
#if FFESTR_VXT
case FFESTD_stmtidV021_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V021 (stmt->u.V021.params);
+ if (okay)
+ ffeste_V021 (stmt->u.V021.params);
malloc_pool_kill (stmt->u.V021.pool);
break;
case FFESTD_stmtidV023_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V023_start (stmt->u.V023.params);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_V023_item (expr->expr);
+ }
+ if (okay)
+ ffeste_V023_finish ();
malloc_pool_kill (stmt->u.V023.pool);
break;
case FFESTD_stmtidV024_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V024_start (stmt->u.V024.params);
+ if (okay)
+ 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 ();
+ {
+ if (okay)
+ ffeste_V024_item (expr->expr);
+ }
+ if (okay)
+ ffeste_V024_finish ();
malloc_pool_kill (stmt->u.V024.pool);
break;
case FFESTD_stmtidV025start_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V025_start ();
+ if (okay)
+ 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);
+ 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_:
- ffeste_V025_finish ();
+ if (okay)
+ ffeste_V025_finish ();
malloc_pool_kill (stmt->u.V025finish.pool);
break;
case FFESTD_stmtidV026_:
ffestd_subr_line_restore_ (stmt);
- ffeste_V026 (stmt->u.V026.params);
+ if (okay)
+ ffeste_V026 (stmt->u.V026.params);
malloc_pool_kill (stmt->u.V026.pool);
break;
#endif
@@ -3513,9 +3602,22 @@ ffestd_R842 (ffebld expr)
stmt = ffestd_stmt_new_ (FFESTD_stmtidR842_);
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);
+ 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
@@ -4357,7 +4459,7 @@ ffestd_R1001dump_ (ffests s, ffesttFormatList list)
case FFESTP_formattypeFORMAT:
if (next->u.R1003D.R1004.present)
if (next->u.R1003D.R1004.rtexpr)
- ffestd_R1001error_ (next);
+ ffestd_R1001rtexpr_ (s, next, next->u.R1003D.R1004.u.expr);
else
ffests_printf_1U (s, "%lu",
next->u.R1003D.R1004.u.unsigned_val);
@@ -4388,7 +4490,7 @@ ffestd_R1001dump_1005_1_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1004.present)
if (f->u.R1005.R1004.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
@@ -4396,7 +4498,7 @@ ffestd_R1001dump_1005_1_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1006.present)
if (f->u.R1005.R1006.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
}
@@ -4417,14 +4519,14 @@ ffestd_R1001dump_1005_2_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1004.present)
if (f->u.R1005.R1004.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
ffests_puts (s, string);
if (f->u.R1005.R1006.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
}
@@ -4444,14 +4546,14 @@ ffestd_R1001dump_1005_3_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1004.present)
if (f->u.R1005.R1004.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
ffests_puts (s, string);
if (f->u.R1005.R1006.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
@@ -4459,7 +4561,7 @@ ffestd_R1001dump_1005_3_ (ffests s, ffesttFormatList f, char *string)
{
ffests_putc (s, '.');
if (f->u.R1005.R1007_or_R1008.rtexpr)
- ffestd_R1001error_ (f);
+ 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);
@@ -4482,20 +4584,20 @@ ffestd_R1001dump_1005_4_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1004.present)
if (f->u.R1005.R1004.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
ffests_puts (s, string);
if (f->u.R1005.R1006.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
ffests_putc (s, '.');
if (f->u.R1005.R1007_or_R1008.rtexpr)
- ffestd_R1001error_ (f);
+ 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);
}
@@ -4515,20 +4617,20 @@ ffestd_R1001dump_1005_5_ (ffests s, ffesttFormatList f, char *string)
if (f->u.R1005.R1004.present)
if (f->u.R1005.R1004.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1004.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
ffests_puts (s, string);
if (f->u.R1005.R1006.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1006.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
ffests_putc (s, '.');
if (f->u.R1005.R1007_or_R1008.rtexpr)
- ffestd_R1001error_ (f);
+ 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);
@@ -4536,7 +4638,7 @@ ffestd_R1001dump_1005_5_ (ffests s, ffesttFormatList f, char *string)
{
ffests_putc (s, 'E');
if (f->u.R1005.R1009.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1005.R1009.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1005.R1009.u.unsigned_val);
}
@@ -4569,7 +4671,7 @@ ffestd_R1001dump_1010_2_ (ffests s, ffesttFormatList f, char *string)
{
if (f->u.R1010.val.present)
if (f->u.R1010.val.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
@@ -4589,7 +4691,7 @@ ffestd_R1001dump_1010_3_ (ffests s, ffesttFormatList f, char *string)
assert (f->u.R1010.val.present);
if (f->u.R1010.val.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
@@ -4609,7 +4711,7 @@ ffestd_R1001dump_1010_4_ (ffests s, ffesttFormatList f, char *string)
assert (f->u.R1010.val.present);
if (f->u.R1010.val.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr);
else
ffests_printf_1D (s, "%ld", f->u.R1010.val.u.signed_val);
@@ -4631,7 +4733,7 @@ ffestd_R1001dump_1010_5_ (ffests s, ffesttFormatList f, char *string)
ffests_puts (s, string);
if (f->u.R1010.val.rtexpr)
- ffestd_R1001error_ (f);
+ ffestd_R1001rtexpr_ (s, f, f->u.R1010.val.u.expr);
else
ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
}
@@ -4651,6 +4753,52 @@ ffestd_R1001error_ (ffesttFormatList f)
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);
+ }
+}
+
/* ffestd_R1102 -- PROGRAM statement
ffestd_R1102(name_token);
diff --git a/gcc/f/ste.c b/gcc/f/ste.c
index a5e9757cca3..5a016de393a 100644
--- a/gcc/f/ste.c
+++ b/gcc/f/ste.c
@@ -1,5 +1,5 @@
/* ste.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -395,12 +395,11 @@ ffeste_begin_iterdo_ (ffestw block, tree *xtvar, tree *xtincr,
/* Do the initial assignment into the DO var. */
- expr = ffecom_modify (void_type_node, tvar, tstart);
- expand_expr_stmt (expr);
+ tstart = ffecom_save_tree (tstart);
expr = ffecom_2 (MINUS_EXPR, TREE_TYPE (tvar),
tend,
- TREE_CONSTANT (tstart) ? tstart : tvar);
+ tstart);
if (!ffe_is_onetrip ())
{
@@ -439,6 +438,9 @@ ffeste_begin_iterdo_ (ffestw block, tree *xtvar, tree *xtincr,
expr = ffecom_modify (void_type_node, niters, expr);
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);
else
@@ -997,7 +999,6 @@ ffeste_io_cilist_ (bool have_err,
int yes;
tree field;
tree inits, initn;
- tree ignore; /* We ignore the length of format! */
bool constantp = TRUE;
static tree errfield, unitfield, endfield, formatfield, recfield;
tree errinit, unitinit, endinit, formatinit, recinit;
@@ -1084,7 +1085,7 @@ ffeste_io_cilist_ (bool have_err,
break;
case FFESTV_formatCHAREXPR:
- formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, &ignore);
+ formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, NULL);
if (TREE_CONSTANT (formatexp))
{
formatinit = formatexp;
@@ -1303,7 +1304,6 @@ ffeste_io_icilist_ (bool have_err,
int yes;
tree field;
tree inits, initn;
- tree ignore; /* We ignore the length of format! */
bool constantp = TRUE;
static tree errfield, unitfield, endfield, formatfield, unitlenfield,
unitnumfield;
@@ -1407,7 +1407,7 @@ ffeste_io_icilist_ (bool have_err,
break;
case FFESTV_formatCHAREXPR:
- formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, &ignore);
+ formatexp = ffecom_arg_ptr_to_expr (format_spec->u.expr, NULL);
if (TREE_CONSTANT (formatexp))
{
formatinit = formatexp;
diff --git a/gcc/f/stu.c b/gcc/f/stu.c
index 239456c0d0b..a11f00c9cd2 100644
--- a/gcc/f/stu.c
+++ b/gcc/f/stu.c
@@ -924,7 +924,7 @@ ffestu_sym_exec_transition (ffesymbol s)
static void
ffestu_list_exec_transition_ (ffebld list)
{
- static in_progress = FALSE;
+ static bool in_progress = FALSE;
ffebld item;
ffesymbol symbol;
@@ -1116,7 +1116,7 @@ tail: /* :::::::::::::::::::: */
static bool
ffestu_dummies_transition_ (ffesymbol (*symfunc) (), ffebld list)
{
- static in_progress = FALSE;
+ static bool in_progress = FALSE;
ffebld item;
ffesymbol symbol;
bool uncertain = FALSE;
diff --git a/gcc/f/target.c b/gcc/f/target.c
index 828e7adcf75..b1dc7d954cd 100644
--- a/gcc/f/target.c
+++ b/gcc/f/target.c
@@ -1,5 +1,5 @@
/* target.c -- Implementation File (module.c template V1.0)
- Copyright (C) 1995-1997 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998 Free Software Foundation, Inc.
Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
This file is part of GNU Fortran.
@@ -280,6 +280,13 @@ ffetarget_align (ffetargetAlign *updated_alignment,
return min_pad;
}
+/* 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 (ffetargetCharacter1 *val, ffelexToken character,
@@ -290,8 +297,9 @@ ffetarget_character1 (ffetargetCharacter1 *val, ffelexToken character,
val->text = NULL;
else
{
- val->text = malloc_new_kp (pool, "ffetargetCharacter1", val->length);
+ val->text = malloc_new_kp (pool, "ffetargetCharacter1", val->length + 1);
memcpy (val->text, ffelex_token_text (character), val->length);
+ val->text[val->length] = '\0';
}
return TRUE;
@@ -318,7 +326,12 @@ ffetarget_cmp_character1 (ffetargetCharacter1 l, ffetargetCharacter1 r)
#endif
/* ffetarget_concatenate_character1 -- Perform CONCAT op on two constants
- Compare lengths, if equal then use memcmp. */
+ 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
@@ -331,11 +344,12 @@ ffetarget_concatenate_character1 (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "ffetargetCharacter1(CONCAT)", *len);
+ 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';
}
return FFEBAD;
@@ -501,7 +515,12 @@ ffetarget_ne_character1 (bool *res, ffetargetCharacter1 l,
#endif
/* ffetarget_substr_character1 -- Perform SUBSTR op on three constants
- Compare lengths, if equal then use memcmp. */
+ 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
@@ -519,8 +538,9 @@ ffetarget_substr_character1 (ffetargetCharacter1 *res,
else
{
res->length = *len = last - first + 1;
- res->text = malloc_new_kp (pool, "ffetargetCharacter1(SUBSTR)", *len);
+ res->text = malloc_new_kp (pool, "ffetargetCharacter1(SUBSTR)", *len + 1);
memcpy (res->text, l.text + first - 1, *len);
+ res->text[*len] = '\0';
}
return FFEBAD;
@@ -666,6 +686,13 @@ ffetarget_convert_any_typeless_ (char *res, size_t size,
return FFEBAD;
}
+/* 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 (ffetargetCharacter1 *res,
@@ -678,7 +705,7 @@ ffetarget_convert_character1_character1 (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size);
+ res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1);
if (size <= l.length)
memcpy (res->text, l.text, size);
else
@@ -686,12 +713,21 @@ ffetarget_convert_character1_character1 (ffetargetCharacter1 *res,
memcpy (res->text, l.text, l.length);
memset (res->text + l.length, ' ', size - l.length);
}
+ res->text[size] = '\0';
}
return FFEBAD;
}
#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 (ffetargetCharacter1 *res,
@@ -703,7 +739,8 @@ ffetarget_convert_character1_hollerith (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size);
+ res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1);
+ res->text[size] = '\0';
if (size <= l.length)
{
char *p;
@@ -727,7 +764,14 @@ ffetarget_convert_character1_hollerith (ffetargetCharacter1 *res,
}
#endif
-/* ffetarget_convert_character1_integer1 -- Raw conversion. */
+/* 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
ffebad
@@ -788,7 +832,8 @@ ffetarget_convert_character1_integer4 (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size);
+ res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1);
+ res->text[size] = '\0';
if (((size_t) size) <= size_of)
{
int i = size_of - size;
@@ -813,7 +858,14 @@ ffetarget_convert_character1_integer4 (ffetargetCharacter1 *res,
}
#endif
-/* ffetarget_convert_character1_logical1 -- Raw conversion. */
+/* 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
ffebad
@@ -874,7 +926,8 @@ ffetarget_convert_character1_logical4 (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size);
+ res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1);
+ res->text[size] = '\0';
if (((size_t) size) <= size_of)
{
int i = size_of - size;
@@ -899,7 +952,14 @@ ffetarget_convert_character1_logical4 (ffetargetCharacter1 *res,
}
#endif
-/* ffetarget_convert_character1_typeless -- Raw conversion. */
+/* 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
ffebad
@@ -960,7 +1020,8 @@ ffetarget_convert_character1_typeless (ffetargetCharacter1 *res,
res->text = NULL;
else
{
- res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size);
+ res->text = malloc_new_kp (pool, "FFETARGET cvt char1", size + 1);
+ res->text[size] = '\0';
if (((size_t) size) <= size_of)
{
int i = size_of - size;
@@ -1101,17 +1162,21 @@ ffetarget_divide_complex2 (ffetargetComplex2 *res, ffetargetComplex2 l,
#endif
/* ffetarget_hollerith -- Convert token to a hollerith constant
- See prototype.
-
- Token use count not affected overall. */
+ 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 *val, ffelexToken integer,
mallocPool pool)
{
val->length = ffelex_token_length (integer);
- val->text = malloc_new_kp (pool, "ffetargetHollerith", val->length);
+ 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 --git a/gcc/f/zzz.c b/gcc/f/zzz.c
index 6ac6a1123d0..ac80eb32f0e 100644
--- a/gcc/f/zzz.c
+++ b/gcc/f/zzz.c
@@ -51,6 +51,6 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#endif /* !defined (__TIME__) */
#endif /* !defined (FFEZZZ_TIME) */
-char *ffezzz_version_string = "0.5.21";
+char *ffezzz_version_string = "0.5.22";
char *ffezzz_date = FFEZZZ_DATE;
char *ffezzz_time = FFEZZZ_TIME;