summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lang/gcc/MESSAGE7
-rw-r--r--lang/gcc/Makefile23
-rw-r--r--lang/gcc/PLIST132
-rw-r--r--lang/gcc/distinfo99
-rw-r--r--lang/gcc/files/arm_netbsd-elf.h149
-rw-r--r--lang/gcc/files/gcc.mk4
-rw-r--r--lang/gcc/files/i386_netbsd-elf.h661
-rw-r--r--lang/gcc/files/m68k_netbsd-elf.h591
-rw-r--r--lang/gcc/files/netbsd.ml8
-rw-r--r--lang/gcc/files/netbsdelf.ml10
-rw-r--r--lang/gcc/files/sh_netbsd-elf.h166
-rw-r--r--lang/gcc/files/sparc_netbsd-elf.h42
-rw-r--r--lang/gcc/files/vax_netbsd-elf.h93
-rw-r--r--lang/gcc/files/xm-netbsd.h32
-rw-r--r--lang/gcc/patches/patch-aa10945
-rw-r--r--lang/gcc/patches/patch-ab181
-rw-r--r--lang/gcc/patches/patch-ac49
-rw-r--r--lang/gcc/patches/patch-ad103
-rw-r--r--lang/gcc/patches/patch-ae571
-rw-r--r--lang/gcc/patches/patch-af289
-rw-r--r--lang/gcc/patches/patch-ag120
-rw-r--r--lang/gcc/patches/patch-ah72
-rw-r--r--lang/gcc/patches/patch-ai77
-rw-r--r--lang/gcc/patches/patch-aj91
-rw-r--r--lang/gcc/patches/patch-ak54
-rw-r--r--lang/gcc/patches/patch-al160
-rw-r--r--lang/gcc/patches/patch-am48
-rw-r--r--lang/gcc/patches/patch-an23
-rw-r--r--lang/gcc/patches/patch-ao29
-rw-r--r--lang/gcc/patches/patch-ap48
-rw-r--r--lang/gcc/patches/patch-aq444
-rw-r--r--lang/gcc/patches/patch-ar842
-rw-r--r--lang/gcc/patches/patch-as33
-rw-r--r--lang/gcc/patches/patch-at61
-rw-r--r--lang/gcc/patches/patch-au83
-rw-r--r--lang/gcc/patches/patch-av41
-rw-r--r--lang/gcc/patches/patch-aw134
-rw-r--r--lang/gcc/patches/patch-ax203
-rw-r--r--lang/gcc/patches/patch-ay497
-rw-r--r--lang/gcc/patches/patch-az45
-rw-r--r--lang/gcc/patches/patch-ba95
-rw-r--r--lang/gcc/patches/patch-bb659
-rw-r--r--lang/gcc/patches/patch-bc456
-rw-r--r--lang/gcc/patches/patch-bd1121
-rw-r--r--lang/gcc/patches/patch-be59
-rw-r--r--lang/gcc/patches/patch-bf229
-rw-r--r--lang/gcc/patches/patch-bg20
-rw-r--r--lang/gcc/patches/patch-bh13
-rw-r--r--lang/gcc/patches/patch-bi18
-rw-r--r--lang/gcc/patches/patch-bj443
-rw-r--r--lang/gcc/patches/patch-bk64
-rw-r--r--lang/gcc/patches/patch-bl189
-rw-r--r--lang/gcc/patches/patch-bm44
-rw-r--r--lang/gcc/patches/patch-bn15
-rw-r--r--lang/gcc/patches/patch-bo443
-rw-r--r--lang/gcc/patches/patch-bp128
-rw-r--r--lang/gcc/patches/patch-bq126
-rw-r--r--lang/gcc/patches/patch-br12
-rw-r--r--lang/gcc/patches/patch-bs974
-rw-r--r--lang/gcc/patches/patch-bt215
-rw-r--r--lang/gcc/patches/patch-bu16
-rw-r--r--lang/gcc/patches/patch-bv12
-rw-r--r--lang/gcc/patches/patch-bw20
-rw-r--r--lang/gcc/patches/patch-bx23
-rw-r--r--lang/gcc/patches/patch-by81
-rw-r--r--lang/gcc/patches/patch-bz12
-rw-r--r--lang/gcc/patches/patch-ca21
-rw-r--r--lang/gcc/patches/patch-cb13
-rw-r--r--lang/gcc/patches/patch-cc20
-rw-r--r--lang/gcc/patches/patch-cd14
-rw-r--r--lang/gcc/patches/patch-ce7
-rw-r--r--lang/gcc/patches/patch-cf12
-rw-r--r--lang/gcc/patches/patch-cg13
-rw-r--r--lang/gcc/patches/patch-ch13
-rw-r--r--lang/gcc/patches/patch-ci12
-rw-r--r--lang/gcc/patches/patch-cj15
-rw-r--r--lang/gcc/patches/patch-ck17
-rw-r--r--lang/gcc/patches/patch-cl13
-rw-r--r--lang/gcc/patches/patch-cm13
-rw-r--r--lang/gcc/patches/patch-cn5090
80 files changed, 15095 insertions, 12925 deletions
diff --git a/lang/gcc/MESSAGE b/lang/gcc/MESSAGE
index dbeefee8b04..6e8c27e47e9 100644
--- a/lang/gcc/MESSAGE
+++ b/lang/gcc/MESSAGE
@@ -1,8 +1,7 @@
======================================================================
-$NetBSD: MESSAGE,v 1.1 2001/11/01 00:23:16 zuntum Exp $
+$NetBSD: MESSAGE,v 1.2 2002/01/03 20:40:37 tron Exp $
-To use ${PKGNAME} invoke "${MAKE}" like this:
-
-${MAKE} MAKECONF=${PREFIX}/etc/${PKGNAME}.mk [...]
+To use ${PKGNAME} include "${PREFIX}/etc/${PKGNAME}.mk" in your
+BSD style makefile.
======================================================================
diff --git a/lang/gcc/Makefile b/lang/gcc/Makefile
index 6f65f9bad56..133e9c2b821 100644
--- a/lang/gcc/Makefile
+++ b/lang/gcc/Makefile
@@ -1,7 +1,6 @@
-# $NetBSD: Makefile,v 1.30 2001/12/29 18:33:39 fredb Exp $
+# $NetBSD: Makefile,v 1.31 2002/01/03 20:40:39 tron Exp $
-DISTNAME= gcc-2.95.2
-PKGREVISION= 1
+DISTNAME= gcc-2.95.3
CATEGORIES= lang
MASTER_SITES= ${MASTER_SITE_GNU:=gcc/}
@@ -13,8 +12,7 @@ BUILD_DEPENDS+= bison-[0-9]*:../../devel/bison
# The platforms listed below are the only tested platforms so far.
# If you get gcc working on other platforms, then please add them.
-ONLY_FOR_PLATFORM= NetBSD-*-arm32 NetBSD-*-i386 NetBSD-*-m68k \
- NetBSD-*-sparc SunOS-*-*
+ONLY_FOR_PLATFORM= NetBSD-*-i386
.include "../../mk/bsd.prefs.mk"
@@ -32,10 +30,8 @@ CONFIGURE_ARGS= --host=${MACHINE_GCC_PLATFORM} \
CONFIGURE_SCRIPT= ${SRCDIR}/configure
INFO_FILES= chill.info cpp.info g77.info gcc.info
-GCC_VERSION= ${PKGNAME:C/.*-//:C/nb[1-9]*//}
MESSAGE_SUBST+= MAKE=${MAKE}
-PLIST_SUBST+= GCC_VERSION=${GCC_VERSION} \
- MACHINE_GCC_PLATFORM=${MACHINE_GCC_PLATFORM}
+PLIST_SUBST+= MACHINE_GCC_PLATFORM=${MACHINE_GCC_PLATFORM}
SRCDIR= ${WRKDIR}/${DISTNAME}
WRKSRC= ${WRKDIR}/objdir
@@ -61,7 +57,12 @@ CONFLICTS+= gcc-[0-9]* pgcc-[0-9]*
post-extract:
${MKDIR} ${WRKSRC}
- ${CP} ${FILESDIR}/netbsd*.ml ${WRKSRC}/../${DISTNAME}/libstdc++/config
+ cd ${WRKSRC}/../${DISTNAME}/gcc/config; \
+ ${CP} ${FILESDIR}/xm-netbsd.h .; \
+ for ARCH in arm arm i386 m68k sh sparc vax; do \
+ ${MKDIR} $${ARCH}; \
+ ${CP} ${FILESDIR}/$${ARCH}_netbsd-elf.h $${ARCH}/netbsd-elf.h; \
+ done
post-patch:
${ECHO} "bogus" >${WRKSRC}/../${DISTNAME}/gcc/cstamp-h.in
@@ -81,9 +82,9 @@ pre-install:
.if (${OPSYS} != SunOS)
post-install:
- ${RM} -f ${GCC_PREFIX}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/curses.h ${PREFIX}/${PKGNAME}/bin/cc
+ ${RM} -f ${GCC_PREFIX}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/curses.h ${PREFIX}/${PKGNAME}/bin/cc
${LN} -s gcc ${PREFIX}/${PKGNAME}/bin/cc
- ${RM} -f ${GCC_PREFIX}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/curses.h
+ ${RM} -f ${GCC_PREFIX}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/curses.h
${INSTALL_DATA} ${WRKDIR}/gcc.mk ${PREFIX}/etc/${PKGNAME}.mk
.endif
diff --git a/lang/gcc/PLIST b/lang/gcc/PLIST
index 5b5eb79522a..64d9c3acccd 100644
--- a/lang/gcc/PLIST
+++ b/lang/gcc/PLIST
@@ -1,6 +1,5 @@
-@comment $NetBSD: PLIST,v 1.1 2001/11/01 00:23:17 zuntum Exp $
-${PKGNAME}/${MACHINE_GCC_PLATFORM}/include/_G_config.h
-${PKGNAME}/bin/${MACHINE_GCC_PLATFORM}-gcc
+@comment $NetBSD: PLIST,v 1.2 2002/01/03 20:40:39 tron Exp $
+etc/gcc-2.95.3.mk
${PKGNAME}/bin/c++
${PKGNAME}/bin/c++filt
${PKGNAME}/bin/cc
@@ -12,10 +11,10 @@ ${PKGNAME}/bin/gcc
${PKGNAME}/bin/gcj
${PKGNAME}/bin/gcjh
${PKGNAME}/bin/gcov
+${PKGNAME}/bin/${MACHINE_GCC_PLATFORM}-gcc
${PKGNAME}/bin/jcf-dump
${PKGNAME}/bin/jv-scan
-${PKGNAME}/bin/protoize
-${PKGNAME}/bin/unprotoize
+${PKGNAME}/${MACHINE_GCC_PLATFORM}/include/_G_config.h
${PKGNAME}/include/g++-3/PlotFile.h
${PKGNAME}/include/g++-3/SFile.h
${PKGNAME}/include/g++-3/algo.h
@@ -97,6 +96,7 @@ ${PKGNAME}/include/g++-3/set
${PKGNAME}/include/g++-3/set.h
${PKGNAME}/include/g++-3/slist
${PKGNAME}/include/g++-3/slist.h
+${PKGNAME}/include/g++-3/sstream
${PKGNAME}/include/g++-3/stack
${PKGNAME}/include/g++-3/stack.h
${PKGNAME}/include/g++-3/std/bastring.cc
@@ -164,89 +164,54 @@ ${PKGNAME}/include/g++-3/utility
${PKGNAME}/include/g++-3/valarray
${PKGNAME}/include/g++-3/vector
${PKGNAME}/include/g++-3/vector.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/SYSCALLS.c.X
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/cc1
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/cc1chill
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/cc1obj
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/cc1plus
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/chillrt0.o
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/collect2
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/cpp
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/f771
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/README
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/exception
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/float.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/g2c.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/iso646.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/limits.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/math.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/new
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/new.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/NXConstStr.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/Object.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/Protocol.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/encoding.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/hash.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/objc-api.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/objc-list.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/objc.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/sarray.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/thr.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc/typedstream.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/proto.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/stdarg.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/stdbool.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/stddef.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/syslimits.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/typeinfo
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-alpha.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-arc.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-c4x.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-clipper.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-h8300.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-i860.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-i960.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-m32r.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-m88k.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-mips.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-mn10200.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-mn10300.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-pa.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-ppc.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-pyr.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-sh.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-sparc.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-spur.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/va-v850.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/varargs.h
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/jc1
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/jvgenmain
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libchill.a
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libg2c.a
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libgcc.a
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libobjc.a
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libstdc++.a
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/libstdc++.so
-${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/specs
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/cc1
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/cc1chill
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/cc1obj
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/cc1plus
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/chillrt0.o
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/collect2
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/cpp0
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/f771
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/README
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/exception
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/float.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/g2c.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/limits.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/math.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/new
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/new.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/NXConstStr.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/Object.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/Protocol.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/encoding.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/hash.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/objc-api.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/objc-list.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/objc.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/sarray.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/thr.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc/typedstream.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/syslimits.h
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/typeinfo
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/jc1
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/jvgenmain
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/libchill.a
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/libg2c.a
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/libgcc.a
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/libobjc.a
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/libstdc++.a
+${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/specs
${PKGNAME}/lib/libiberty.a
-${PKGNAME}/lib/libstdc++.a.2.10
-${PKGNAME}/lib/libstdc++.so.2
-${PKGNAME}/lib/libstdc++.so.2.10
+${PKGNAME}/lib/libstdc++.a.2.10.0nb1
${PKGNAME}/man/man1/cccp.1
${PKGNAME}/man/man1/g++.1
${PKGNAME}/man/man1/g77.1
${PKGNAME}/man/man1/gcc.1
-etc/${PKGNAME}.mk
-@unexec install-info --delete --info-dir=%D/info %D/info/chill.info
info/chill.info
-@exec install-info --info-dir=%D/info %D/info/chill.info
-@unexec install-info --delete --info-dir=%D/info %D/info/cpp.info
info/cpp.info
info/cpp.info-1
info/cpp.info-2
info/cpp.info-3
-@exec install-info --info-dir=%D/info %D/info/cpp.info
-@unexec install-info --delete --info-dir=%D/info %D/info/g77.info
info/g77.info
info/g77.info-1
info/g77.info-10
@@ -269,8 +234,6 @@ info/g77.info-6
info/g77.info-7
info/g77.info-8
info/g77.info-9
-@exec install-info --info-dir=%D/info %D/info/g77.info
-@unexec install-info --delete --info-dir=%D/info %D/info/gcc.info
info/gcc.info
info/gcc.info-1
info/gcc.info-10
@@ -302,19 +265,18 @@ info/gcc.info-6
info/gcc.info-7
info/gcc.info-8
info/gcc.info-9
-@exec install-info --info-dir=%D/info %D/info/gcc.info
@dirrm ${PKGNAME}/man/man1
@dirrm ${PKGNAME}/man
-@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include/objc
-@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}/include
-@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${GCC_VERSION}
+@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include/objc
+@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}/include
+@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}/${PKGVERSION}
@dirrm ${PKGNAME}/lib/gcc-lib/${MACHINE_GCC_PLATFORM}
@dirrm ${PKGNAME}/lib/gcc-lib
@dirrm ${PKGNAME}/lib
@dirrm ${PKGNAME}/include/g++-3/std
@dirrm ${PKGNAME}/include/g++-3
@dirrm ${PKGNAME}/include
-@dirrm ${PKGNAME}/bin
@dirrm ${PKGNAME}/${MACHINE_GCC_PLATFORM}/include
@dirrm ${PKGNAME}/${MACHINE_GCC_PLATFORM}
+@dirrm ${PKGNAME}/bin
@dirrm ${PKGNAME}
diff --git a/lang/gcc/distinfo b/lang/gcc/distinfo
index 26ce9292fe0..03c464bf4ab 100644
--- a/lang/gcc/distinfo
+++ b/lang/gcc/distinfo
@@ -1,31 +1,70 @@
-$NetBSD: distinfo,v 1.5 2001/12/29 17:41:46 fredb Exp $
+$NetBSD: distinfo,v 1.6 2002/01/03 20:40:39 tron Exp $
-SHA1 (gcc-2.95.2.tar.gz) = c3da103de3fa97c78ccc1b4fdc29fa25bf26a6c8
-Size (gcc-2.95.2.tar.gz) = 12885815 bytes
-SHA1 (patch-aa) = bae789b2acbcae4cf8876d116c80ec8e4b3da359
-SHA1 (patch-ab) = 8895083742d7a2acedee1d1405a9fe2d44fbb3c3
-SHA1 (patch-ac) = 3dddca70bd3860afdfb066d4b59a144dd7c2a520
-SHA1 (patch-ad) = e09ff41ba073b2fd1cbdd15a555ddc3b99938c92
-SHA1 (patch-ae) = 7e675a8fea9c45169deac34eae5a9e23ec6c1d77
-SHA1 (patch-af) = 8a6b6b9cbd94001523102a788fdfe7f3638309eb
-SHA1 (patch-ag) = 7619a10501280a121da4813e021a33a948e7f7b4
-SHA1 (patch-ah) = fb50a9fe36b00096a2d98c27ad0a9d14dd58db70
-SHA1 (patch-ai) = 6b377f16fcefcf90d34192b10344c75f5a43d848
-SHA1 (patch-aj) = 20ea2627f79292c8127d1ddc317ce75e45506721
-SHA1 (patch-ak) = d92aa879ddb87c100b2168bd58307c32a08ed54b
-SHA1 (patch-al) = 5dc1df948449be6b076be783c44359663c95f0e0
-SHA1 (patch-am) = 575252905cdfa59f814c8b39e9733fa658061f9f
-SHA1 (patch-an) = 98e4a21e5ee1f1c7ce86387278b17bd12cea2c49
-SHA1 (patch-ao) = 8aa4b32592ab491309a0daecd2ea4c08498ce072
-SHA1 (patch-ap) = b86c3ab571f69d5d96bfe770e76f9ad6111b4116
-SHA1 (patch-aq) = 08d9dc73e49a504dd3c74c87f8fee0bd2e0d3e70
-SHA1 (patch-ar) = 07e3e3d4b74518793aed7388d72a57cc70d2fd59
-SHA1 (patch-as) = 7144acf5b568b4487f790ee61c1d510754aa9827
-SHA1 (patch-at) = 3a9aa67b107126ad247352aa5f34bb02fa9ae6a5
-SHA1 (patch-au) = b11c3982d0ee9bcdd42b5ac320033f5772c1933d
-SHA1 (patch-av) = fac14cc43a451671ee825961c24870426991f4c7
-SHA1 (patch-aw) = 6a793c8735e167dbcab1c33248438a6ac8057717
-SHA1 (patch-ax) = 242d5219ba8b0debe038e186deecc980f9bf9a3f
-SHA1 (patch-ay) = eaaf536efdee990fa6970b1281fed4c6f2621c26
-SHA1 (patch-az) = 67d507f29492b3bc7a11551a1344aff3b8bb56fe
-SHA1 (patch-ba) = 3e0b1a3b07d6070ec353eab8963ba785a9d11a85
+SHA1 (gcc-2.95.3.tar.gz) = 535d27038d161c0e7c2662702e11a48aa97ef622
+Size (gcc-2.95.3.tar.gz) = 12911721 bytes
+SHA1 (patch-aa) = 58b0bbe43ec33d869620951adf17f3b3d1d7cae6
+SHA1 (patch-ab) = 6e94571b40a4467a2ec49195eae929578ae385cb
+SHA1 (patch-ac) = 8eb86bb15d80a0c4c1694ac5f5ad9fcb509a23f4
+SHA1 (patch-ad) = 53f6d5b00e54811ae0cba6da0918c7ac33ef47f3
+SHA1 (patch-ae) = 8c258f4645b281e9fb6c463353966d7f99dce293
+SHA1 (patch-af) = 5f1beea05beba940a431b3fedd68c93090497ee2
+SHA1 (patch-ag) = 5a99e0fb14e1102e14eb65142174ab60521897ec
+SHA1 (patch-ah) = e1d0b853cf722e2e4e3ca89e89c598f1dd0a89fc
+SHA1 (patch-ai) = 761942a066722300c6ec6ad24e7720459d059aaf
+SHA1 (patch-aj) = 411dc24f223777549bbcf357e40715b3285f65ec
+SHA1 (patch-ak) = 8fd02ad352f458cf095bf59640241db7fc001d6c
+SHA1 (patch-al) = 521337e7e7cdea057728ce90340554f128efa389
+SHA1 (patch-am) = b4e1ff86321ea0469efb88d8c27e4c81d31f5d31
+SHA1 (patch-an) = 5671a6c3e241e7067dc84cb5ecc35f28c3bf0479
+SHA1 (patch-ao) = d50d4599d43618d826db5ec2bce172bb84d22a04
+SHA1 (patch-ap) = 1afe83fbb457a8bd52af1d7eba8b1e102e14b8bd
+SHA1 (patch-aq) = 3e9dc8f1db71279b3dec60113cda7d606b2cef44
+SHA1 (patch-ar) = 6931f66c7960ccf42f95ecf3eff6f71ab85b9288
+SHA1 (patch-as) = 2d5c8dc13ab3912eef7c176b4270b55de4f90cb2
+SHA1 (patch-at) = 5d1850f722950f8fe5c0c10a837be5b0b219cff0
+SHA1 (patch-au) = 76a58ce7441cfe2cbe34fb4e2df468ab7c73612b
+SHA1 (patch-av) = e29d6c130655960e8cb8813958f54cf79e198f9f
+SHA1 (patch-aw) = 89764d60cab30ccd662225d96c5eed556cd1a828
+SHA1 (patch-ax) = 5b7884595d001e72b29656fd31e67e85a519e9d3
+SHA1 (patch-ay) = 140f0bd4fdb73700df71152a76206807d4371bf0
+SHA1 (patch-az) = 7b21d67e5f2e8fcf6970311ace41d136c5e4570a
+SHA1 (patch-ba) = 26b5d269c13c23b2d0b0021a4824164e291885c3
+SHA1 (patch-bb) = 1b3f0ebc1e05e9e03d6a5727234ee419179904d9
+SHA1 (patch-bc) = 9e6641d255cab3fb96cb16eadc23d18d5d0cc4f2
+SHA1 (patch-bd) = 6f4f008b2477a4470f19baafcad45acb02d4e1a3
+SHA1 (patch-be) = 0d9081117fd2e5bae34a15710d17ab5499d291e6
+SHA1 (patch-bf) = 6f3b5cfe80905d2d10e999fa9fdc1e997eaa84d1
+SHA1 (patch-bg) = 047627fd56f11ce98cefcd707e1e85f605a63d84
+SHA1 (patch-bh) = e68e3079b32e54aeb4fa4cbbd29c35b60b23b470
+SHA1 (patch-bi) = c740a4ca2fe691d81a3572d5671663d10234c8bd
+SHA1 (patch-bj) = 8002b1130cbab87aaeb5e22411f5f3a81b5eccc7
+SHA1 (patch-bk) = f05d7bcf44cf1321a00203d7926d1dcbcc2f715f
+SHA1 (patch-bl) = 5252fa84cf4d149b56935b84e812d1ec6778c0b0
+SHA1 (patch-bm) = 2f809c2a253d7dcf2cecb625a57d869a7408262b
+SHA1 (patch-bn) = 9f7a3f3c2430b1ea4d796661d2bee25a4dc9211e
+SHA1 (patch-bo) = 88f3d4420ed166d36b08d0525bfa32860540e0bf
+SHA1 (patch-bp) = 470b76077a4c1af84418c73408a334fb88aeecfd
+SHA1 (patch-bq) = 586998a819641e3c7f13adb5775ad796061387fd
+SHA1 (patch-br) = 084a7b25a67a9b6790d6cd276c214bbc71b8fed5
+SHA1 (patch-bs) = 642475b0229c8e8304bede44685f2f4b84695da2
+SHA1 (patch-bt) = 936cbebd8bc33ff1aafe32a6b4936e2a11935345
+SHA1 (patch-bu) = 2070a2312874bd372e433b106c2a65dd373c006d
+SHA1 (patch-bv) = 6e730e66a6dbfa5bc5e540957437aff772822379
+SHA1 (patch-bw) = ece2a0010e9424299bfe35ff9d00a6e65e4f619c
+SHA1 (patch-bx) = 6f69f1609ee84f7697b46794bdafda19fc72de5b
+SHA1 (patch-by) = d6bff5f8febc9f1977dbb5b6bd130d080c83e290
+SHA1 (patch-bz) = a86748447b8175c3c6358121c09ea82276cdc9be
+SHA1 (patch-ca) = 82ce840447c02765e3e19934be8a7aad73f1388b
+SHA1 (patch-cb) = a9fb1b8a0e422b85fc400811817367d1b4f2f2ad
+SHA1 (patch-cc) = bcdbc0cadc6d9416d008ca48db61572711cbf368
+SHA1 (patch-cd) = 3f1f3f8381719f555f50badb571d6e440f7e7fe1
+SHA1 (patch-ce) = 405cf1c6c822a37532cc2e4af0e0e076f87751b6
+SHA1 (patch-cf) = 0de67345c249905c5e8c518be645b639106fd354
+SHA1 (patch-cg) = c0b0ce75ce22b63caa49f46fa676afecd9489d1b
+SHA1 (patch-ch) = 76031a61b0dab8cba715e250b82bcb4fd8e4cdac
+SHA1 (patch-ci) = 567509e55a9fdba64e2c62188bd09286a7b004c3
+SHA1 (patch-cj) = c8e7d14703d6546e5989801a6fdffaee5932165d
+SHA1 (patch-ck) = eeada159352f6a957ba8bc10f1e6d074f56aa300
+SHA1 (patch-cl) = 1ebf7761e708ca5327c7b7e0426c1544640712ac
+SHA1 (patch-cm) = 66b86c09726bed590ba80ce4d8d01a5ad71724c8
+SHA1 (patch-cn) = a93bc564137f96d7dff1974a164b44896d675bed
diff --git a/lang/gcc/files/arm_netbsd-elf.h b/lang/gcc/files/arm_netbsd-elf.h
new file mode 100644
index 00000000000..6a5cd45ad40
--- /dev/null
+++ b/lang/gcc/files/arm_netbsd-elf.h
@@ -0,0 +1,149 @@
+/* NetBSD/arm (RiscBSD) version.
+ Copyright (C) 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
+ Contributed by Mark Brinicombe (amb@physig.ph.kcl.ac.uk)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Human-readable target name for version string. */
+#define TARGET_VERSION fputs (" (ARM NetBSD/ELF)", stderr);
+
+/*#undef ASM_DECLARE_FUNCTION_NAME*/
+
+/* ARM6 family default cpu. */
+#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+
+#define TARGET_DEFAULT \
+ (ARM_FLAG_APCS_32 \
+ | ARM_FLAG_SOFT_FLOAT \
+ | ARM_FLAG_ATPCS_STACK_ALIGN \
+ | ARM_FLAG_SHORT_BYTE)
+
+/* APCS-32 is the default for ELF anyway. */
+/* Unsigned chars are the default anyway. */
+
+#include "arm/elf.h"
+
+/* We use VFP format for doubles. */
+/* XXX should be run-time configurable */
+#undef FLOAT_WORDS_BIG_ENDIAN
+#define FLOAT_WORDS_BIG_ENDIAN (TARGET_HARD_FLOAT || TARGET_BIG_END)
+/* This gets redefined in config/netbsd.h. */
+#undef TARGET_MEM_FUNCTIONS
+
+#define NETBSD_ELF
+
+#include <netbsd.h>
+
+/* Override standard NetBSD asm spec. What do they know? */
+#undef ASM_SPEC
+/* Don't bother telling the assembler the CPU type -- assume the compiler
+ won't generate bogus code and anyone using asm() knows what they're
+ doing. */
+#define ASM_SPEC "%{mbig-endian:-EB} \
+ %{mapcs-26:-mapcs-26} %{!mapcs-26:-mapcs-32} \
+ %{mapcs-float:-mapcs-float} \
+ %{mthumb-interwork:-mthumb-interwork} \
+ %{fpic:-k} %{fPIC:-k}"
+
+/* Some defines for CPP. */
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "\
+-Dunix -Darm -D__arm__ -D__NetBSD__ -D__ELF__ \
+-Asystem(unix) -Asystem(NetBSD) -Acpu(arm) -Amachine(arm)"
+
+/* Define _POSIX_SOURCE if necessary. */
+#undef CPP_SPEC
+#define CPP_SPEC "\
+%(cpp_cpu_arch) %(cpp_apcs_pc) %(cpp_float) %(cpp_endian) \
+%{posix:-D_POSIX_SOURCE} \
+"
+
+/* Because TARGET_DEFAULT sets ARM_FLAG_SOFT_FLOAT */
+#undef CPP_FLOAT_DEFAULT_SPEC
+#define CPP_FLOAT_DEFAULT_SPEC "-D__SOFTFP__ -D__VFP_FP__"
+
+/* Because we use VFP-format floats in the soft-float case */
+#undef CPP_FLOAT_SPEC
+#define CPP_FLOAT_SPEC "\
+%{msoft-float:\
+ %{mhard-float:%e-msoft-float and -mhard_float may not be used together} \
+ -D__SOFTFP__ -D__VFP_FP__} \
+%{!mhard-float:%{!msoft-float:%(cpp_float_default)}} \
+"
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_UNSIGNED
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+#define HANDLE_SYSV_PRAGMA
+
+/* We don't have any limit on the length as out debugger is GDB. */
+#undef DBX_CONTIN_LENGTH
+
+/* NetBSD does its profiling differently to the Acorn compiler. We
+ don't need a word following the mcount call; and to skip it
+ requires either an assembly stub or use of fomit-frame-pointer when
+ compiling the profiling functions. */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(STREAM,LABELNO) \
+{ \
+ fprintf(STREAM, "\tmov\t%sip, %slr\n", REGISTER_PREFIX, REGISTER_PREFIX); \
+ fprintf(STREAM, "\tbl\t__mcount\n"); \
+}
+
+/* On the ARM `@' introduces a comment, so we must use something else
+ for .type directives. */
+#undef TYPE_OPERAND_FMT
+#define TYPE_OPERAND_FMT "%%%s"
+
+/* VERY BIG NOTE : Change of structure alignment for RiscBSD.
+ There are consequences you should be aware of...
+
+ Normally GCC/arm uses a structure alignment of 32 for compatibility
+ with armcc. This means that structures are padded to a word
+ boundary. Historically, NetBSD/arm has used an alignment of 8, and ARM
+ seem to be moving that way in their toolchain so we'll keep it.
+
+ This has several side effects that should be considered.
+ 1. Structures will only be aligned to the size of the largest member.
+ i.e. structures containing only bytes will be byte aligned.
+ structures containing shorts will be half word alinged.
+ structures containing ints will be word aligned.
+
+ This means structures should be padded to a word boundary if
+ alignment of 32 is required for byte structures etc.
+
+ 2. A potential performance penalty may exist if strings are no longer
+ word aligned. GCC will not be able to use word load/stores to copy
+ short strings.
+*/
+#undef STRUCTURE_SIZE_BOUNDARY
+#define STRUCTURE_SIZE_BOUNDARY 8
diff --git a/lang/gcc/files/gcc.mk b/lang/gcc/files/gcc.mk
index 04a0320fb5d..3cfd743c309 100644
--- a/lang/gcc/files/gcc.mk
+++ b/lang/gcc/files/gcc.mk
@@ -3,7 +3,3 @@
CC= @@PREFIX@@/@@PKGNAME@@/bin/cc
CPP= @@PREFIX@@/@@PKGNAME@@/bin/cpp
CXX= @@PREFIX@@/@@PKGNAME@@/bin/c++
-
-.if exists(/etc/mk.conf)
-.include "/etc/mk.conf"
-.endif
diff --git a/lang/gcc/files/i386_netbsd-elf.h b/lang/gcc/files/i386_netbsd-elf.h
new file mode 100644
index 00000000000..80eda210ea0
--- /dev/null
+++ b/lang/gcc/files/i386_netbsd-elf.h
@@ -0,0 +1,661 @@
+/* Definitions of target machine for GNU compiler,
+ for i386 NetBSD systems.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* This is used on i386 platforms that use the ELF format.
+ This was taken from the NetBSD/alpha configuration, and modified
+ for NetBSD/i386 by Christos Zoulas <christos@netbsd.org> */
+
+/* Get generic i386 definitions. */
+
+#include <i386/gstabs.h>
+
+/* Get perform_* macros to build libgcc.a. */
+#include <i386/perform.h>
+
+/* Get generic NetBSD ELF definitions. We will override these if necessary. */
+
+#define NETBSD_ELF
+#include <netbsd.h>
+
+#define OBJECT_FORMAT_ELF
+
+/* This goes away when the math-emulator is fixed */
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT \
+ (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387)
+
+/*
+ * DBX stabs definitions. Same as Solaris and other i386 ELF platforms.
+ */
+
+#undef DBX_CONTIN_CHAR
+#define DBX_CONTIN_CHAR '?'
+
+/* When generating stabs debugging, use N_BINCL entries. */
+
+#define DBX_USE_BINCL
+
+/* Make LBRAC and RBRAC addresses relative to the start of the
+ function. The native Solaris stabs debugging format works this
+ way, gdb expects it, and it reduces the number of relocation
+ entries. */
+
+#define DBX_BLOCKS_FUNCTION_RELATIVE 1
+
+/* When using stabs, gcc2_compiled must be a stabs entry, not an
+ ordinary symbol, or gdb won't see it. Furthermore, since gdb reads
+ the input piecemeal, starting with each N_SO, it's a lot easier if
+ the gcc2 flag symbol is *after* the N_SO rather than before it. So
+ we emit an N_OPT stab there. */
+
+#define ASM_IDENTIFY_GCC(FILE) \
+do \
+ { \
+ if (write_symbols != DBX_DEBUG) \
+ fputs ("gcc2_compiled.:\n", FILE); \
+ } \
+while (0)
+
+#define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE) \
+do \
+ { \
+ if (write_symbols == DBX_DEBUG) \
+ fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE); \
+ } \
+while (0)
+
+/* Like block addresses, stabs line numbers are relative to the
+ current function. */
+
+#define ASM_OUTPUT_SOURCE_LINE(file, line) \
+do \
+ { \
+ static int sym_lineno = 1; \
+ fprintf (file, ".stabn 68,0,%d,.LM%d-", \
+ line, sym_lineno); \
+ assemble_name (file, \
+ XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
+ fprintf (file, "\n.LM%d:\n", sym_lineno); \
+ sym_lineno += 1; \
+ } \
+while (0)
+
+/* In order for relative line numbers to work, we must output the
+ stabs entry for the function name first. */
+
+#define DBX_FUNCTION_FIRST
+
+/* Generate a blank trailing N_SO to mark the end of the .o file, since
+ we can't depend upon the linker to mark .o file boundaries with
+ embedded stabs. (XXX do we need this?) */
+
+#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
+do \
+ { \
+ text_section (); \
+ fprintf (FILE, \
+ "\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO); \
+ } \
+while (0)
+
+
+#undef ASM_FINAL_SPEC
+
+/* Names to predefine in the preprocessor for this target machine.
+ XXX NetBSD, by convention, shouldn't do __alpha, but lots of applications
+ expect it because that's what OSF/1 does. */
+
+/* NetBSD Extension to GNU C: __KPRINTF_ATTRIBUTE__ */
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "-D__NetBSD__ -D__ELF__ -Asystem(unix) -Asystem(NetBSD) -Acpu(i386) -Amachine(i386)"
+
+/* Make gcc agree with <machine/ansi.h> */
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_UNSIGNED
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. Under NetBSD/i386, the assembler does
+ nothing special with -pg. */
+
+#undef ASM_APP_ON
+#define ASM_APP_ON "#APP\n"
+
+#undef ASM_APP_OFF
+#define ASM_APP_OFF "#NO_APP\n"
+
+#define bsd4_4
+#undef HAS_INIT_SECTION
+
+#undef ASM_FILE_START
+#define ASM_FILE_START(FILE) \
+{ \
+ output_file_directive (FILE, main_input_filename); \
+ fprintf (FILE, "\t.version\t\"01.01\"\n"); \
+}
+
+/* Provide a LINK_SPEC appropriate for a NetBSD/alpha ELF target. Only
+ the linker emulation is i386-specific. The rest are
+ common to all ELF targets, except for the name of the start function. */
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+ "-m elf_i386 \
+ %{assert*} %{R*} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dc -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
+#undef DEFAULT_VTABLE_THUNKS
+#define DEFAULT_VTABLE_THUNKS 1
+
+/* Attach a special .ident directive to the end of the file to identify
+ the version of GCC which compiled this code. The format of the
+ .ident string is patterned after the ones produced by native svr4
+ C compilers. */
+
+/* Output #ident as a .ident. */
+
+/* This is how to allocate empty space in some section. The .zero
+ pseudo-op is used for this on most svr4 assemblers. */
+#undef SKIP_ASM_OP
+#define SKIP_ASM_OP "\t.zero"
+
+#undef ASM_OUTPUT_SKIP
+#define ASM_OUTPUT_SKIP(FILE,SIZE) \
+ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
+
+/* Output the label which precedes a jumptable. Note that for all svr4
+ systems where we actually generate jumptables (which is to say every
+ svr4 target except i386, where we use casesi instead) we put the jump-
+ tables into the .rodata section and since other stuff could have been
+ put into the .rodata section prior to any given jumptable, we have to
+ make sure that the location counter for the .rodata section gets pro-
+ perly re-aligned prior to the actual beginning of the jump table. */
+
+#define ALIGN_ASM_OP ".align"
+
+#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
+#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
+ ASM_OUTPUT_ALIGN ((FILE), 2);
+#endif
+
+#undef ASM_OUTPUT_CASE_LABEL
+#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
+ do { \
+ ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
+ ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
+ } while (0)
+
+/* The standard SVR4 assembler seems to require that certain builtin
+ library routines (e.g. .udiv) be explicitly declared as .globl
+ in each assembly file where they are referenced. */
+
+#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
+ ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
+
+/* This says how to output assembler code to declare an
+ uninitialized external linkage data object. Under SVR4,
+ the linker seems to want the alignment of data objects
+ to depend on their types. We do exactly that here. */
+
+#define COMMON_ASM_OP ".comm"
+
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
+ if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1 << (LOG))
+
+#undef ASM_OUTPUT_ALIGNED_COMMON
+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
+do { \
+ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
+} while (0)
+
+/* This says how to output assembler code to declare an
+ uninitialized internal linkage data object. Under SVR4,
+ the linker seems to want the alignment of data objects
+ to depend on their types. We do exactly that here. */
+
+#define LOCAL_ASM_OP ".local"
+
+#undef ASM_OUTPUT_ALIGNED_LOCAL
+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
+do { \
+ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), "\n"); \
+ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
+} while (0)
+
+/* This is the pseudo-op used to generate a 32-bit word of data with a
+ specific value in some section. */
+
+#define INT_ASM_OP ".long"
+
+/* This is the pseudo-op used to generate a contiguous sequence of byte
+ values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
+ AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
+
+#undef ASCII_DATA_ASM_OP
+#define ASCII_DATA_ASM_OP ".ascii"
+
+/* Support const sections and the ctors and dtors sections for g++.
+ Note that there appears to be two different ways to support const
+ sections at the moment. You can either #define the symbol
+ READONLY_DATA_SECTION (giving it some code which switches to the
+ readonly data section) or else you can #define the symbols
+ EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
+ SELECT_RTX_SECTION. We do both here just to be on the safe side. */
+
+#define USE_CONST_SECTION 1
+
+#define CONST_SECTION_ASM_OP ".section\t.rodata"
+
+/* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
+
+ Note that we want to give these sections the SHF_WRITE attribute
+ because these sections will actually contain data (i.e. tables of
+ addresses of functions in the current root executable or shared library
+ file) and, in the case of a shared library, the relocatable addresses
+ will have to be properly resolved/relocated (and then written into) by
+ the dynamic linker when it actually attaches the given shared library
+ to the executing process. (Note that on SVR4, you may wish to use the
+ `-z text' option to the ELF linker, when building a shared library, as
+ an additional check that you are doing everything right. But if you do
+ use the `-z text' option when building a shared library, you will get
+ errors unless the .ctors and .dtors sections are marked as writable
+ via the SHF_WRITE attribute.) */
+
+#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
+#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
+
+/* On svr4, we *do* have support for the .init and .fini sections, and we
+ can put stuff in there to be executed before and after `main'. We let
+ crtstuff.c and other files know this by defining the following symbols.
+ The definitions say how to change sections to the .init and .fini
+ sections. This is the same for all known svr4 assemblers. */
+
+#define INIT_SECTION_ASM_OP ".section\t.init"
+#define FINI_SECTION_ASM_OP ".section\t.fini"
+
+/* A default list of other sections which we might be "in" at any given
+ time. For targets that use additional sections (e.g. .tdesc) you
+ should override this definition in the target-specific file which
+ includes this file. */
+
+#undef EXTRA_SECTIONS
+#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
+
+/* A default list of extra section function definitions. For targets
+ that use additional sections (e.g. .tdesc) you should override this
+ definition in the target-specific file which includes this file. */
+
+#undef EXTRA_SECTION_FUNCTIONS
+#define EXTRA_SECTION_FUNCTIONS \
+ CONST_SECTION_FUNCTION \
+ CTORS_SECTION_FUNCTION \
+ DTORS_SECTION_FUNCTION
+
+#undef READONLY_DATA_SECTION
+#define READONLY_DATA_SECTION() const_section ()
+
+extern void text_section ();
+
+#define CONST_SECTION_FUNCTION \
+void \
+const_section () \
+{ \
+ if (!USE_CONST_SECTION) \
+ text_section(); \
+ else if (in_section != in_const) \
+ { \
+ fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
+ in_section = in_const; \
+ } \
+}
+
+#define CTORS_SECTION_FUNCTION \
+void \
+ctors_section () \
+{ \
+ if (in_section != in_ctors) \
+ { \
+ fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
+ in_section = in_ctors; \
+ } \
+}
+
+#define DTORS_SECTION_FUNCTION \
+void \
+dtors_section () \
+{ \
+ if (in_section != in_dtors) \
+ { \
+ fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
+ in_section = in_dtors; \
+ } \
+}
+
+/* Switch into a generic section.
+ This is currently only used to support section attributes.
+
+ We make the section read-only and executable for a function decl,
+ read-only for a const data decl, and writable for a non-const data decl. */
+#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
+ fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
+ (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
+ (DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
+
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global constructors. */
+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
+ do { \
+ ctors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } while (0)
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global destructors. */
+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
+ do { \
+ dtors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } while (0)
+
+/* A C statement or statements to switch to the appropriate
+ section for output of DECL. DECL is either a `VAR_DECL' node
+ or a constant of some sort. RELOC indicates whether forming
+ the initial value of DECL requires link-time relocations. */
+
+#define SELECT_SECTION(DECL,RELOC) \
+{ \
+ if (TREE_CODE (DECL) == STRING_CST) \
+ { \
+ if (! flag_writable_strings) \
+ const_section (); \
+ else \
+ data_section (); \
+ } \
+ else if (TREE_CODE (DECL) == VAR_DECL) \
+ { \
+ if ((flag_pic && RELOC) \
+ || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
+ || !DECL_INITIAL (DECL) \
+ || (DECL_INITIAL (DECL) != error_mark_node \
+ && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
+ data_section (); \
+ else \
+ const_section (); \
+ } \
+ else \
+ const_section (); \
+}
+
+/* A C statement or statements to switch to the appropriate
+ section for output of RTX in mode MODE. RTX is some kind
+ of constant in RTL. The argument MODE is redundant except
+ in the case of a `const_int' rtx. Currently, these always
+ go into the const section. */
+
+#undef SELECT_RTX_SECTION
+#define SELECT_RTX_SECTION(MODE,RTX) const_section()
+
+/* Define the strings used for the special svr4 .type and .size directives.
+ These strings generally do not vary from one system running svr4 to
+ another, but if a given system (e.g. m88k running svr) needs to use
+ different pseudo-op names for these, they may be overridden in the
+ file which includes this one. */
+
+#define TYPE_ASM_OP ".type"
+#define SIZE_ASM_OP ".size"
+
+/* The following macro defines the format used to output the second
+ operand of the .type assembler directive. Different svr4 assemblers
+ expect various different forms for this operand. The one given here
+ is just a default. You may need to override it in your machine-
+ specific tm.h file (depending upon the particulars of your assembler). */
+
+#define TYPE_OPERAND_FMT "@%s"
+
+/* Write the extra assembler code needed to declare a function's result.
+ Most svr4 assemblers don't require any special declaration of the
+ result value, but there are exceptions. */
+
+#ifndef ASM_DECLARE_RESULT
+#define ASM_DECLARE_RESULT(FILE, RESULT)
+#endif
+
+/* These macros generate the special .type and .size directives which
+ are used to set the corresponding fields of the linker symbol table
+ entries in an ELF object file under SVR4. These macros also output
+ the starting labels for the relevant functions/objects. */
+
+/* Write the extra assembler code needed to declare a function properly.
+ Some svr4 assemblers need to also have something extra said about the
+ function's return value. We allow for that here. */
+
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+ do { \
+ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
+ putc ('\n', FILE); \
+ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+ ASM_OUTPUT_LABEL(FILE, NAME); \
+ } while (0)
+
+/* Write the extra assembler code needed to declare an object properly. */
+
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
+ do { \
+ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
+ putc ('\n', FILE); \
+ size_directive_output = 0; \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
+ { \
+ size_directive_output = 1; \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
+ int_size_in_bytes (TREE_TYPE (DECL))); \
+ fputc ('\n', FILE); \
+ } \
+ ASM_OUTPUT_LABEL(FILE, NAME); \
+ } while (0)
+
+/* Output the size directive for a decl in rest_of_decl_compilation
+ in the case where we did not do so before the initializer.
+ Once we find the error_mark_node, we know that the value of
+ size_directive_output was set
+ by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
+
+#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
+do { \
+ char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
+ && ! AT_END && TOP_LEVEL \
+ && DECL_INITIAL (DECL) == error_mark_node \
+ && !size_directive_output) \
+ { \
+ size_directive_output = 1; \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+ assemble_name (FILE, name); \
+ putc (',', FILE); \
+ fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
+ int_size_in_bytes (TREE_TYPE (DECL))); \
+ fputc ('\n', FILE); \
+ } \
+ } while (0)
+
+/* This is how to declare the size of a function. */
+
+#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
+ do { \
+ if (!flag_inhibit_size_directive) \
+ { \
+ char label[256]; \
+ static int labelno; \
+ labelno++; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
+ ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+ assemble_name (FILE, (FNAME)); \
+ fprintf (FILE, ","); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "-"); \
+ assemble_name (FILE, (FNAME)); \
+ putc ('\n', FILE); \
+ } \
+ } while (0)
+
+/* This is how we tell the assembler that two symbols have the same value. */
+
+#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
+ do { assemble_name(FILE, NAME1); \
+ fputs(" = ", FILE); \
+ assemble_name(FILE, NAME2); \
+ fputc('\n', FILE); } while (0)
+
+/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
+ ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
+ corresponds to a particular byte value [0..255]. For any
+ given byte value, if the value in the corresponding table
+ position is zero, the given character can be output directly.
+ If the table value is 1, the byte must be output as a \ooo
+ octal escape. If the tables value is anything else, then the
+ byte value should be output as a \ followed by the value
+ in the table. Note that we can use standard UN*X escape
+ sequences for many control characters, but we don't use
+ \a to represent BEL because some svr4 assemblers (e.g. on
+ the i386) don't know about that. Also, we don't use \v
+ since some versions of gas, such as 2.2 did not accept it. */
+
+#define ESCAPES \
+"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
+\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
+\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
+\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
+\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
+\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
+
+/* Some svr4 assemblers have a limit on the number of characters which
+ can appear in the operand of a .string directive. If your assembler
+ has such a limitation, you should define STRING_LIMIT to reflect that
+ limit. Note that at least some svr4 assemblers have a limit on the
+ actual number of bytes in the double-quoted string, and that they
+ count each character in an escape sequence as one byte. Thus, an
+ escape sequence like \377 would count as four bytes.
+
+ If your target assembler doesn't support the .string directive, you
+ should define this to zero.
+*/
+
+#define STRING_LIMIT ((unsigned) 256)
+
+#define STRING_ASM_OP ".string"
+
+/*
+ * We always use gas here, so we don't worry about ECOFF assembler problems.
+ */
+#undef TARGET_GAS
+#define TARGET_GAS (1)
+
+#if 0
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+#endif
+
+/* The following macros are stolen from i386v4.h */
+/* These have to be defined to get PIC code correct */
+
+/* This is how to output an element of a case-vector that is relative.
+ This is only used for PIC code. See comments by the `casesi' insn in
+ i386.md for an explanation of the expression this outputs. */
+
+#undef ASM_OUTPUT_ADDR_DIFF_ELT
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+ fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
+
+/* Indicate that jump tables go in the text section. This is
+ necessary when compiling PIC code. */
+
+#define JUMP_TABLES_IN_TEXT_SECTION 1
+
+/* Default to pcc-struct-return, because this is the ELF abi and
+ we don't care about compatibility with older gcc versions. */
+#define DEFAULT_PCC_STRUCT_RETURN 1
+
+/* Profiling routines, partially copied from i386/osfrose.h. */
+
+/* Redefine this to use %eax instead of %edx. */
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+{ \
+ if (flag_pic) \
+ { \
+ fprintf (FILE, "\tcall __mcount@PLT\n"); \
+ } \
+ else \
+ { \
+ fprintf (FILE, "\tcall __mcount\n"); \
+ } \
+}
+
+/* Put relocations in the constant pool in the writable data section. */
+#undef SELECT_RTX_SECTION
+#define SELECT_RTX_SECTION(MODE,RTX) \
+{ \
+ if (flag_pic && symbolic_operand (RTX)) \
+ data_section (); \
+ else \
+ readonly_data_section (); \
+}
diff --git a/lang/gcc/files/m68k_netbsd-elf.h b/lang/gcc/files/m68k_netbsd-elf.h
new file mode 100644
index 00000000000..3e3634a4d23
--- /dev/null
+++ b/lang/gcc/files/m68k_netbsd-elf.h
@@ -0,0 +1,591 @@
+/* Definitions of target machine for GNU compiler, for m68k NetBSD platforms
+ using the ELF object format.
+ Largely derived from alpha/netbsd.h, i386/netbsd-elf.h and m68k/linux.h.
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#define MOTOROLA /* Use Motorola syntax */
+#define USE_GAS /* But GAS wants jbsr instead of jsr */
+
+/* Get generic m68k definitions. */
+
+#include <m68k/m68k.h>
+
+/* Get generic NetBSD ELF definitions. We will override if necessary. */
+
+#define NETBSD_ELF
+#include <netbsd.h>
+
+/* 68020 with 68881 */
+#define TARGET_DEFAULT (MASK_BITFIELD|MASK_68881|MASK_68020)
+
+#define bsd4_4
+#undef HAS_INIT_SECTION
+
+#undef CPP_SPEC
+#define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__ -D__HAVE_FPU__} %{posix:-D_POSIX_SOURCE}"
+
+#undef ASM_SPEC
+#define ASM_SPEC " %| %{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
+
+/* Provide a set of pre-definitions and pre-assertions appropriate for
+ the m68k running svr4. */
+
+/* NetBSD extension to GNU C: __KPRINTF_ATTRIBUTE__ */
+
+#define CPP_PREDEFINES "\
+-D__m68k__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ -D__SVR4_ABI__ \
+-D__motorola__ -Asystem(unix) -Asystem(NetBSD) -Acpu(m68k) -Amachine(m68k)"
+
+/* This is BSD, so it wants DBX format. */
+
+#define DBX_DEBUGGING_INFO
+
+/* Make GCC agree with <machine/ansi.h>. */
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_UNSIGNED
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+#undef ASM_APP_ON
+#define ASM_APP_ON "#APP\n"
+
+#undef ASM_APP_OFF
+#define ASM_APP_OFF "#NO_APP\n"
+
+/* Here are four prefixes that are used by asm_fprintf to
+ facilitate customization for alternate assembler syntaxes.
+ Machines with no likelihood of an alternate syntax need not
+ define these and need not use asm_fprintf. */
+
+/* The prefix for register names. Note that REGISTER_NAMES
+ is supposed to include this prefix. Also note that this is NOT an
+ fprintf format string, it is a literal string */
+
+#undef REGISTER_PREFIX
+#define REGISTER_PREFIX "%"
+
+/* The prefix for local (compiler generated) labels.
+ These labels will not appear in the symbol table. */
+
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
+/* The prefix to add to user-visible assembler symbols. */
+
+#undef USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX ""
+
+#define ASM_COMMENT_START "|"
+
+/* How to refer to registers in assembler output.
+ This sequence is indexed by compiler's hard-register-number.
+ Motorola format uses different register names than defined in m68k.h.
+ We also take this chance to convert 'a6' to 'fp' */
+
+#undef REGISTER_NAMES
+
+#ifndef SUPPORT_SUN_FPA
+
+#define REGISTER_NAMES \
+{"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
+ "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
+ "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7" }
+
+#else /* SUPPORTED_SUN_FPA */
+
+#define REGISTER_NAMES \
+{"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
+ "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
+ "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7", \
+ "%fpa0", "%fpa1", "%fpa2", "%fpa3", "%fpa4", "%fpa5", "%fpa6","%fpa7", \
+ "%fpa8", "%fpa9", "%fpa10","%fpa11","%fpa12","%fpa13","%fpa14","%fpa15", \
+ "%fpa16","%fpa17","%fpa18","%fpa19","%fpa20","%fpa21","%fpa22","%fpa23", \
+ "%fpa24","%fpa25","%fpa26","%fpa27","%fpa28","%fpa29","%fpa30","%fpa31" }
+
+#endif /* defined SUPPORT_SUN_FPA */
+
+/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
+ keep switch tables in the text section. */
+
+#define JUMP_TABLES_IN_TEXT_SECTION 1
+
+/* Use the default action for outputting the case label. */
+#undef ASM_OUTPUT_CASE_LABEL
+#define ASM_RETURN_CASE_JUMP \
+ do { \
+ if (TARGET_5200) \
+ return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \
+ else \
+ return "jmp %%pc@(2,%0:w)"; \
+ } while (0)
+
+/* This is how to output an assembler line that says to advance the
+ location counter to a multiple of 2**LOG bytes. */
+
+#undef ALIGN_ASM_OP
+#define ALIGN_ASM_OP ".align"
+
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
+do { \
+ if ((LOG) > 0) \
+ fprintf ((FILE), "\t%s %u\n", ALIGN_ASM_OP, 1 << (LOG)); \
+} while (0)
+
+/* If defined, a C expression whose value is a string containing the
+ assembler operation to identify the following data as uninitialized global
+ data. */
+
+#define BSS_SECTION_ASM_OP ".section\t.bss"
+
+/* A C statement (sans semicolon) to output to the stdio stream
+ FILE the assembler definition of uninitialized global DECL named
+ NAME whose size is SIZE bytes and alignment is ALIGN bytes.
+ Try to use asm_output_aligned_bss to implement this macro. */
+
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+ asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+
+/* Section output setup. */
+
+#define USE_CONST_SECTION 1
+
+#define BSS_SECTION_ASM_OP ".section\t.bss"
+#define CONST_SECTION_ASM_OP ".section\t.rodata"
+#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
+#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
+#define INIT_SECTION_ASM_OP ".section\t.init"
+#define FINI_SECTION_ASM_OP ".section\t.fini"
+
+#undef EXTRA_SECTIONS
+#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
+
+#undef EXTRA_SECTION_FUNCTIONS
+#define EXTRA_SECTION_FUNCTIONS \
+ CONST_SECTION_FUNCTION \
+ CTORS_SECTION_FUNCTION \
+ DTORS_SECTION_FUNCTION
+
+#undef READONLY_DATA_SECTION
+#define READONLY_DATA_SECTION() const_section ()
+
+extern void text_section ();
+
+#define CONST_SECTION_FUNCTION \
+void \
+const_section () \
+{ \
+ if (!USE_CONST_SECTION) \
+ text_section(); \
+ else if (in_section != in_const) \
+ { \
+ fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
+ in_section = in_const; \
+ } \
+}
+
+#define CTORS_SECTION_FUNCTION \
+void \
+ctors_section () \
+{ \
+ if (in_section != in_ctors) \
+ { \
+ fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
+ in_section = in_ctors; \
+ } \
+}
+
+#define DTORS_SECTION_FUNCTION \
+void \
+dtors_section () \
+{ \
+ if (in_section != in_dtors) \
+ { \
+ fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
+ in_section = in_dtors; \
+ } \
+}
+
+/* Switch into a generic section.
+ This is currently only used to support section attributes.
+
+ We make the section read-only and executable for a function decl,
+ read-only for a const data decl, and writable for a non-const data decl. */
+#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
+ fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
+ (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
+ (DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global constructors. */
+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
+ do { \
+ ctors_section (); \
+ fprintf (FILE, "\t.long\t "); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } while (0)
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global destructors. */
+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
+ do { \
+ dtors_section (); \
+ fprintf (FILE, "\t.long\t "); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } while (0)
+
+/* These macros generate the special .type and .size directives which
+ are used to set the corresponding fields of the linker symbol table
+ entries in an ELF object file under SVR4. These macros also output
+ the starting labels for the relevant functions/objects. */
+
+/* Write the extra assembler code needed to declare a function properly.
+ Some svr4 assemblers need to also have something extra said about the
+ function's return value. We allow for that here. */
+
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+ do { \
+ fprintf (FILE, "\t%s\t", TYPE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
+ putc ('\n', FILE); \
+ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+ ASM_OUTPUT_LABEL(FILE, NAME); \
+ } while (0)
+
+/* Write the extra assembler code needed to declare an object properly. */
+
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
+ do { \
+ fprintf (FILE, "\t%s\t", TYPE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
+ putc ('\n', FILE); \
+ size_directive_output = 0; \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
+ { \
+ size_directive_output = 1; \
+ fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ putc (',', FILE); \
+ fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
+ int_size_in_bytes (TREE_TYPE (DECL))); \
+ fputc ('\n', FILE); \
+ } \
+ ASM_OUTPUT_LABEL(FILE, NAME); \
+ } while (0)
+
+/* Output the size directive for a decl in rest_of_decl_compilation
+ in the case where we did not do so before the initializer.
+ Once we find the error_mark_node, we know that the value of
+ size_directive_output was set
+ by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
+
+#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
+do { \
+ char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
+ && ! AT_END && TOP_LEVEL \
+ && DECL_INITIAL (DECL) == error_mark_node \
+ && !size_directive_output) \
+ { \
+ size_directive_output = 1; \
+ fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
+ assemble_name (FILE, name); \
+ putc (',', FILE); \
+ fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
+ int_size_in_bytes (TREE_TYPE (DECL))); \
+ fputc ('\n', FILE); \
+ } \
+ } while (0)
+
+/* This is how to declare the size of a function. */
+
+#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
+ do { \
+ if (!flag_inhibit_size_directive) \
+ { \
+ char label[256]; \
+ static int labelno; \
+ labelno++; \
+ ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
+ ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
+ fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
+ assemble_name (FILE, (FNAME)); \
+ fprintf (FILE, ","); \
+ assemble_name (FILE, label); \
+ fprintf (FILE, "-"); \
+ assemble_name (FILE, (FNAME)); \
+ putc ('\n', FILE); \
+ } \
+ } while (0)
+
+/* This is how we tell the assembler that two symbols have the same value. */
+
+#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
+ do { assemble_name(FILE, NAME1); \
+ fputs(" = ", FILE); \
+ assemble_name(FILE, NAME2); \
+ fputc('\n', FILE); } while (0)
+
+#undef ASM_OUTPUT_COMMON
+#undef ASM_OUTPUT_LOCAL
+#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
+( fputs (".comm ", (FILE)), \
+ assemble_name ((FILE), (NAME)), \
+ fprintf ((FILE), ",%u\n", (SIZE)))
+
+#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
+( fputs (".lcomm ", (FILE)), \
+ assemble_name ((FILE), (NAME)), \
+ fprintf ((FILE), ",%u\n", (SIZE)))
+
+/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
+ keep switch tables in the text section. */
+
+#define JUMP_TABLES_IN_TEXT_SECTION 1
+
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+do { \
+ asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO)); \
+ if (flag_pic) \
+ fprintf (FILE, "\tbsr.l __mcount@PLTPC\n"); \
+ else \
+ fprintf (FILE, "\tjbsr __mcount\n"); \
+} while (0)
+
+/* Register in which address to store a structure value is passed to a
+ function. The default in m68k.h is a1. For m68k/SVR4 it is a0. */
+
+#undef STRUCT_VALUE_REGNUM
+#define STRUCT_VALUE_REGNUM 8
+
+/* Register in which static-chain is passed to a function. The
+ default in m68k.h is a0, but that is already the struct value
+ regnum. Make it a1 instead. */
+
+#undef STATIC_CHAIN_REGNUM
+#define STATIC_CHAIN_REGNUM 9
+
+/* How to renumber registers for dbx and gdb.
+ On the Sun-3, the floating point registers have numbers
+ 18 to 25, not 16 to 23 as they do in the compiler. */
+
+#define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)
+
+/* Do not break .stabs pseudos into continuations. */
+
+#define DBX_CONTIN_LENGTH 0
+
+/* 1 if N is a possible register number for a function value. For
+ m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
+ pointer, or floating types, respectively. Reject fp0 if not using
+ a 68881 coprocessor. */
+
+#undef FUNCTION_VALUE_REGNO_P
+#define FUNCTION_VALUE_REGNO_P(N) \
+ ((N) == 0 || (N) == 8 || (TARGET_68881 && (N) == 16))
+
+/* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
+ more than one register. */
+
+#undef NEEDS_UNTYPED_CALL
+#define NEEDS_UNTYPED_CALL 1
+
+/* Define how to generate (in the callee) the output value of a
+ function and how to find (in the caller) the value returned by a
+ function. VALTYPE is the data type of the value (as a tree). If
+ the precise function being called is known, FUNC is its
+ FUNCTION_DECL; otherwise, FUNC is 0. For m68k/SVR4 generate the
+ result in d0, a0, or fp0 as appropriate. */
+
+#undef FUNCTION_VALUE
+#define FUNCTION_VALUE(VALTYPE, FUNC) \
+ (TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_68881 \
+ ? gen_rtx_REG (TYPE_MODE (VALTYPE), 16) \
+ : (POINTER_TYPE_P (VALTYPE) \
+ ? gen_rtx_REG (TYPE_MODE (VALTYPE), 8) \
+ : gen_rtx_REG (TYPE_MODE (VALTYPE), 0)))
+
+/* For compatibility with the large body of existing code which does
+ not always properly declare external functions returning pointer
+ types, the m68k/SVR4 convention is to copy the value returned for
+ pointer functions from a0 to d0 in the function epilogue, so that
+ callers that have neglected to properly declare the callee can
+ still find the correct return value. */
+
+extern int current_function_returns_pointer;
+#define FUNCTION_EXTRA_EPILOGUE(FILE, SIZE) \
+do { \
+ if ((current_function_returns_pointer) && \
+ ! find_equiv_reg (0, get_last_insn (), 0, 0, 0, 8, Pmode)) \
+ asm_fprintf (FILE, "\tmove.l %Ra0,%Rd0\n"); \
+} while (0);
+
+/* Define how to find the value returned by a library function
+ assuming the value has mode MODE.
+ For m68k/SVR4 look for integer values in d0, pointer values in d0
+ (returned in both d0 and a0), and floating values in fp0. */
+
+#undef LIBCALL_VALUE
+#define LIBCALL_VALUE(MODE) \
+ ((((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode) \
+ && TARGET_68881) \
+ ? gen_rtx_REG (MODE, 16) \
+ : gen_rtx_REG (MODE, 0))
+
+/* Boundary (in *bits*) on which stack pointer should be aligned.
+ The m68k/SVR4 convention is to keep the stack pointer longword aligned. */
+
+#undef STACK_BOUNDARY
+#define STACK_BOUNDARY 32
+
+/* Alignment of field after `int : 0' in a structure.
+ For m68k/SVR4, this is the next longword boundary. */
+
+#undef EMPTY_FIELD_BOUNDARY
+#define EMPTY_FIELD_BOUNDARY 32
+
+/* No data type wants to be aligned rounder than this.
+ For m68k/SVR4, some types (doubles for example) are aligned on 8 byte
+ boundaries */
+
+#undef BIGGEST_ALIGNMENT
+#define BIGGEST_ALIGNMENT 64
+
+/* In m68k svr4, a symbol_ref rtx can be a valid PIC operand if it is
+ an operand of a function call. */
+#undef LEGITIMATE_PIC_OPERAND_P
+#define LEGITIMATE_PIC_OPERAND_P(X) \
+ ((! symbolic_operand (X, VOIDmode) \
+ && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
+ && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM \
+ && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
+ || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)))
+
+/* Turn off function cse if we are doing PIC. We always want function
+ call to be done as `bsr foo@PLTPC', so it will force the assembler
+ to create the PLT entry for `foo'. Doing function cse will cause
+ the address of `foo' to be loaded into a register, which is exactly
+ what we want to avoid when we are doing PIC on svr4 m68k. */
+#undef SUBTARGET_OVERRIDE_OPTIONS
+#define SUBTARGET_OVERRIDE_OPTIONS \
+ if (flag_pic) flag_no_function_cse = 1;
+
+/* For m68k SVR4, structures are returned using the reentrant
+ technique. */
+
+#undef PCC_STATIC_STRUCT_RETURN
+
+/* The svr4 ABI for the m68k says that records and unions are returned
+ in memory. */
+
+#define DEFAULT_PCC_STRUCT_RETURN 1
+
+/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
+ Used for C++ multiple inheritance. */
+#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
+do { \
+ if (DELTA > 0 && DELTA <= 8) \
+ asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA); \
+ else if (DELTA < 0 && DELTA >= -8) \
+ asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA); \
+ else \
+ asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA); \
+ \
+ if (flag_pic) \
+ { \
+ fprintf (FILE, "\tbra.l "); \
+ assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
+ fprintf (FILE, "@PLTPC\n"); \
+ } \
+ else \
+ { \
+ fprintf (FILE, "\tjmp "); \
+ assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
+ fprintf (FILE, "\n"); \
+ } \
+} while (0)
+
+/* Output assembler code for a block containing the constant parts
+ of a trampoline, leaving space for the variable parts. */
+
+/* On m68k svr4, the trampoline is different from the generic version
+ in that we use a1 as the static call chain. */
+
+#undef TRAMPOLINE_TEMPLATE
+#define TRAMPOLINE_TEMPLATE(FILE) \
+{ \
+ ASM_OUTPUT_SHORT (FILE, GEN_INT (0x227a)); \
+ ASM_OUTPUT_SHORT (FILE, GEN_INT (8)); \
+ ASM_OUTPUT_SHORT (FILE, GEN_INT (0x2f3a)); \
+ ASM_OUTPUT_SHORT (FILE, GEN_INT (8)); \
+ ASM_OUTPUT_SHORT (FILE, GEN_INT (0x4e75)); \
+ ASM_OUTPUT_INT (FILE, const0_rtx); \
+ ASM_OUTPUT_INT (FILE, const0_rtx); \
+}
+
+/* Redefine since we are using a different trampoline */
+#undef TRAMPOLINE_SIZE
+#define TRAMPOLINE_SIZE 18
+
+/* Emit RTL insns to initialize the variable parts of a trampoline.
+ FNADDR is an RTX for the address of the function's pure code.
+ CXT is an RTX for the static chain value for the function. */
+
+#undef INITIALIZE_TRAMPOLINE
+#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
+{ \
+ emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 10)), CXT); \
+ emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 14)), FNADDR); \
+}
+
+/* Provide a LINK_SPEC appropriate for a NetBSD ELF target.
+ Differs only in explicit emulation selection. */
+#undef LINK_SPEC
+#define LINK_SPEC \
+ "-m m68kelfnbsd \
+ %{assert*} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dc -dp \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
diff --git a/lang/gcc/files/netbsd.ml b/lang/gcc/files/netbsd.ml
deleted file mode 100644
index 5ff8e1c7511..00000000000
--- a/lang/gcc/files/netbsd.ml
+++ /dev/null
@@ -1,8 +0,0 @@
-# a.out with shared libm, so we can link it into the shared libstdc++.
-
-ARLIB = libstdc++.a.`echo $(VERSION) | sed 's/\([0-9]*[.][0-9]*\).*/\1/'`
-SHLIB = libstdc++.so.`echo $(VERSION) | sed 's/\([0-9]*[.][0-9]*\).*/\1/'`
-
-LIBS = $(ARLIB) $(ARLINK) $(SHLIB)
-SHDEPS = -lm
-DEPLIBS = ../$(SHLIB)
diff --git a/lang/gcc/files/netbsdelf.ml b/lang/gcc/files/netbsdelf.ml
deleted file mode 100644
index 9fab25c3bae..00000000000
--- a/lang/gcc/files/netbsdelf.ml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Elf with shared libm, so we can link it into the shared libstdc++.
-
-ARLIB = libstdc++.a.`echo $(VERSION) | sed 's/\([0-9]*[.][0-9]*\).*/\1/'`
-SHLIB = libstdc++.so.`echo $(VERSION) | sed 's/\([0-9]*[.][0-9]*\).*/\1/'`
-MSHLINK = libstdc++.so.`echo $(VERSION) | sed 's/\([0-9]*\).*/\1/'`
-
-LIBS = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK) mshlink
-SHFLAGS = -Wl,-soname,$(MSHLINK)
-SHDEPS = -lm
-DEPLIBS = ../$(SHLIB)
diff --git a/lang/gcc/files/sh_netbsd-elf.h b/lang/gcc/files/sh_netbsd-elf.h
new file mode 100644
index 00000000000..ae8d550043f
--- /dev/null
+++ b/lang/gcc/files/sh_netbsd-elf.h
@@ -0,0 +1,166 @@
+/* Definitions of target machine for gcc for Hitachi Super-H using ELF.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Contributed by Ian Lance Taylor <ian@cygnus.com>.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Mostly like the regular SH configuration. */
+#include "sh/sh.h"
+
+/* No SDB debugging info. */
+#undef SDB_DEBUGGING_INFO
+
+/* Undefine some macros defined in both sh.h and svr4.h. */
+#undef IDENT_ASM_OP
+#undef ASM_FILE_END
+#undef ASM_OUTPUT_SOURCE_LINE
+#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
+#undef CTORS_SECTION_ASM_OP
+#undef DTORS_SECTION_ASM_OP
+#undef ASM_OUTPUT_SECTION_NAME
+#undef ASM_OUTPUT_CONSTRUCTOR
+#undef ASM_OUTPUT_DESTRUCTOR
+#undef ASM_DECLARE_FUNCTION_NAME
+#undef PREFERRED_DEBUGGING_TYPE
+#undef MAX_OFILE_ALIGNMENT
+
+/* Be ELF-like. */
+#include "svr4.h"
+
+/* Get generic NetBSD ELF definitions. */
+#define NETBSD_ELF
+#include <netbsd.h>
+
+#define OBJECT_FORMAT_ELF
+
+/* NetBSD uses the SVR4 convention for user-visible assembler symbols,
+ not the SH convention. */
+
+#undef LOCAL_LABEL_PREFIX
+#define LOCAL_LABEL_PREFIX "."
+
+#undef ASM_FILE_START
+#define ASM_FILE_START(FILE) do { \
+ output_file_directive ((FILE), main_input_filename); \
+ if (TARGET_LITTLE_ENDIAN) \
+ fprintf ((FILE), "\t.little\n"); \
+} while (0)
+
+#undef CPP_SPEC
+#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} \
+%{ml:-D__LITTLE_ENDIAN__} \
+%{m1:-D__sh1__} \
+%{m2:-D__sh2__} \
+%{m3:-D__sh3__} \
+%{m3e:-D__SH3E__} \
+%{m4-single-only:-D__SH4_SINGLE_ONLY__} \
+%{m4-single:-D__SH4_SINGLE__} \
+%{m4:-D__SH4__} \
+%{!m1:%{!m2:%{!m3:%{!m3e:%{!m4:%{!m4-single:%{!m4-single-only:-D__sh1__}}}}}}} \
+%{mhitachi:-D__HITACHI__}"
+
+/* Let code know that this is ELF. */
+#define CPP_PREDEFINES \
+"-D__sh__ -D__NetBSD__ -D__ELF__ -D__NO_LEADING_UNDERSCORES__ \
+-D__KPRINTF_ATTRIBUTE__ \
+-Asystem(unix) -Asystem(NetBSD) -Acpu(sh) -Amachine(sh)"
+
+/* Pass -ml and -mrelax to the assembler and linker. */
+#undef ASM_SPEC
+#define ASM_SPEC "%{ml:-little} %{mrelax:-relax}"
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+"%{ml:-m elf32shlnbsd} %{mrelax:-relax} \
+ %{assert*} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dc -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
+/* svr4.h undefined DBX_REGISTER_NUMBER, so we need to define it
+ again. */
+#define DBX_REGISTER_NUMBER(REGNO) \
+ (((REGNO) >= 22 && (REGNO) <= 39) ? ((REGNO) + 1) : (REGNO))
+
+#undef ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
+ sprintf ((STRING), "*%s%s%d", LOCAL_LABEL_PREFIX, (PREFIX), (NUM))
+
+#undef ASM_OUTPUT_INTERNAL_LABEL
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
+ asm_fprintf ((FILE), "%L%s%d:\n", (PREFIX), (NUM))
+
+#undef ASM_OUTPUT_SOURCE_LINE
+#define ASM_OUTPUT_SOURCE_LINE(file, line) \
+do \
+ { \
+ static int sym_lineno = 1; \
+ asm_fprintf ((file), ".stabn 68,0,%d,%LLM%d-", \
+ (line), sym_lineno); \
+ assemble_name ((file), \
+ XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
+ asm_fprintf ((file), "\n%LLM%d:\n", sym_lineno); \
+ sym_lineno += 1; \
+ } \
+while (0)
+
+#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
+#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
+do { \
+ text_section (); \
+ fprintf ((FILE), "\t.stabs \"\",%d,0,0,Letext\nLetext:\n", N_SO); \
+} while (0)
+
+/* HANDLE_SYSV_PRAGMA (defined by svr4.h) takes precedence over HANDLE_PRAGMA.
+ We want to use the HANDLE_PRAGMA from sh.h. */
+#undef HANDLE_SYSV_PRAGMA
+
+/* XXX shouldn't use "1f"-style labels */
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(STREAM,LABELNO) \
+{ \
+ fprintf((STREAM), "\tmov.l\t11f,r1\n"); \
+ fprintf((STREAM), "\tmova\t12f,r0\n"); \
+ fprintf((STREAM), "\tjmp\t@r1\n"); \
+ fprintf((STREAM), "\tnop\n"); \
+ fprintf((STREAM), "\t.align\t2\n"); \
+ fprintf((STREAM), "11:\t.long\t__mcount\n"); \
+ fprintf((STREAM), "12:\n"); \
+}
+
+/* Make gcc agree with <machine/ansi.h> */
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#undef WCHAR_UNSIGNED
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
diff --git a/lang/gcc/files/sparc_netbsd-elf.h b/lang/gcc/files/sparc_netbsd-elf.h
new file mode 100644
index 00000000000..dcfa9dece28
--- /dev/null
+++ b/lang/gcc/files/sparc_netbsd-elf.h
@@ -0,0 +1,42 @@
+/* NetBSD/sparc ELF configuration */
+
+/*
+ * Pull in generic SPARC ELF configuration, and then clean up
+ * afterwards
+ */
+#include <sparc/elf.h>
+
+/* Name the target CPU. */
+#ifndef TARGET_CPU_DEFAULT
+#define TARGET_CPU_DEFAULT TARGET_CPU_sparc
+#endif
+
+#undef MULDI3_LIBCALL
+#undef DIVDI3_LIBCALL
+#undef UDIVDI3_LIBCALL
+#undef MODDI3_LIBCALL
+#undef UMODDI3_LIBCALL
+#undef INIT_SUBTARGET_OPTABS
+#define INIT_SUBTARGET_OPTABS
+
+#undef CPP_SUBTARGET_SPEC
+#define CPP_SUBTARGET_SPEC "-D__sparc"
+
+#include <sparc/netbsd-elf-common.h>
+
+#undef LINK_SPEC
+#define LINK_SPEC \
+ "-m elf32_sparc \
+ %{assert*} %{R*} \
+ %{shared:-shared} \
+ %{!shared: \
+ -dy -dc -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
+/* Name the port. */
+#undef TARGET_NAME
+#define TARGET_NAME "sparc-netbsdelf"
diff --git a/lang/gcc/files/vax_netbsd-elf.h b/lang/gcc/files/vax_netbsd-elf.h
new file mode 100644
index 00000000000..d9a25399e80
--- /dev/null
+++ b/lang/gcc/files/vax_netbsd-elf.h
@@ -0,0 +1,93 @@
+/* Definitions of target machine for GNU compiler,
+ for vax NetBSD systems.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* This is used on vax platforms that use the ELF format.
+ This was taken from the NetBSD/alpha configuration, and modified
+ for NetBSD/vax by Matt Thomas <matt@netbsd.org> */
+
+/* Get generic NetBSD ELF definitions. We will override these if necessary. */
+
+#define NETBSD_ELF
+#include "vax/netbsd.h"
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "long unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+/* We always use gas here */
+#undef TARGET_GAS
+#define TARGET_GAS (1)
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT 0
+
+#define TARGET_MEM_FUNCTIONS /* include mem* calls */
+
+#if 1
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+#define DBX_OUTPUT_FUNCTION_END(file,decl) \
+ do \
+ { \
+ if (DECL_SECTION_NAME (decl) == NULL_TREE) \
+ text_section (); \
+ else \
+ named_section (decl, NULL, 1); \
+ } \
+ while (0)
+#endif
+
+#undef DWARF_DEBUGGING_INFO
+#undef DWARF2_DEBUGGING_INFO
+
+/* Profiling routines */
+
+/* Redefine this to use %eax instead of %edx. */
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+ fprintf (FILE, "\tmovab .LP%d,r0\n\tjsb __mcount+2\n", (LABELNO))
+
+/* Use sjlj exceptions. */
+#undef DWARF2_UNWIND_INFO /* just to be safe */
+
+#undef ASM_FINAL_SPEC
+
+/* Names to predefine in the preprocessor for this target machine. */
+
+/* NetBSD Extension to GNU C: __KPRINTF_ATTRIBUTE__ */
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "\
+-D__vax__ -D__NetBSD__ -D__ELF__ \
+-Asystem(unix) -Asystem(NetBSD) -Acpu(vax) -Amachine(vax)"
+
+/* The VAX wants no space between the case instruction and the
+ jump table. */
+#undef ASM_OUTPUT_BEFORE_CASE_LABEL
+#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE)
+
+/* Get the udiv/urem calls out of the user's namespace */
+
+#undef UDIVSI3_LIBCALL
+#define UDIVSI3_LIBCALL "*__udiv"
+#undef UMODSI3_LIBCALL
+#define UMODSI3_LIBCALL "*__urem"
diff --git a/lang/gcc/files/xm-netbsd.h b/lang/gcc/files/xm-netbsd.h
new file mode 100644
index 00000000000..6fa7342ae7a
--- /dev/null
+++ b/lang/gcc/files/xm-netbsd.h
@@ -0,0 +1,32 @@
+/* Configuration for GNU C-compiler for hosts running NetBSD.
+ Copyright (C) 1995 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* This file defines machine-independent things specific to a host
+ running NetBSD. This file should not be specified as $xm_file itself;
+ instead $xm_file should be CPU/xm-netbsd.h, which should include both
+ CPU/xm-CPU.h and this file xm-netbsd.h. */
+
+#undef POSIX
+#define POSIX
+
+/* Ensure we get gnu C's defaults. */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#endif
diff --git a/lang/gcc/patches/patch-aa b/lang/gcc/patches/patch-aa
index 9a39c396235..c60162b20f8 100644
--- a/lang/gcc/patches/patch-aa
+++ b/lang/gcc/patches/patch-aa
@@ -1,10935 +1,12 @@
-$NetBSD: patch-aa,v 1.1 2000/09/15 23:58:47 tron Exp $
+$NetBSD: patch-aa,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/f/intdoc.texi.orig Wed May 12 22:56:21 1999
-+++ ../gcc-2.95.2/gcc/f/intdoc.texi Sat Sep 16 00:17:42 2000
-@@ -1,10930 +0,0 @@
--@c This file is automatically derived from intdoc.c, intdoc.in,
--@c ansify.c, intrin.def, and intrin.h. Edit those files instead.
--@menu
--@ifset familyF2U
--* Abort Intrinsic:: Abort the program.
--@end ifset
--@ifset familyF77
--* Abs Intrinsic:: Absolute value.
--@end ifset
--@ifset familyF2U
--* Access Intrinsic:: Check file accessibility.
--@end ifset
--@ifset familyASC
--* AChar Intrinsic:: ASCII character from code.
--@end ifset
--@ifset familyF77
--* ACos Intrinsic:: Arc cosine.
--@end ifset
--@ifset familyVXT
--* ACosD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* AdjustL Intrinsic:: (Reserved for future use.)
--* AdjustR Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* AImag Intrinsic:: Convert/extract imaginary part of complex.
--@end ifset
--@ifset familyVXT
--* AIMax0 Intrinsic:: (Reserved for future use.)
--* AIMin0 Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* AInt Intrinsic:: Truncate to whole number.
--@end ifset
--@ifset familyVXT
--* AJMax0 Intrinsic:: (Reserved for future use.)
--* AJMin0 Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Alarm Intrinsic:: Execute a routine after a given delay.
--@end ifset
--@ifset familyF90
--* All Intrinsic:: (Reserved for future use.)
--* Allocated Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* ALog Intrinsic:: Natural logarithm (archaic).
--* ALog10 Intrinsic:: Common logarithm (archaic).
--* AMax0 Intrinsic:: Maximum value (archaic).
--* AMax1 Intrinsic:: Maximum value (archaic).
--* AMin0 Intrinsic:: Minimum value (archaic).
--* AMin1 Intrinsic:: Minimum value (archaic).
--* AMod Intrinsic:: Remainder (archaic).
--@end ifset
--@ifset familyF2C
--* And Intrinsic:: Boolean AND.
--@end ifset
--@ifset familyF77
--* ANInt Intrinsic:: Round to nearest whole number.
--@end ifset
--@ifset familyF90
--* Any Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* ASin Intrinsic:: Arc sine.
--@end ifset
--@ifset familyVXT
--* ASinD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Associated Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* ATan Intrinsic:: Arc tangent.
--* ATan2 Intrinsic:: Arc tangent.
--@end ifset
--@ifset familyVXT
--* ATan2D Intrinsic:: (Reserved for future use.)
--* ATanD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* BesJ0 Intrinsic:: Bessel function.
--* BesJ1 Intrinsic:: Bessel function.
--* BesJN Intrinsic:: Bessel function.
--* BesY0 Intrinsic:: Bessel function.
--* BesY1 Intrinsic:: Bessel function.
--* BesYN Intrinsic:: Bessel function.
--@end ifset
--@ifset familyVXT
--* BITest Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Bit_Size Intrinsic:: Number of bits in argument's type.
--@end ifset
--@ifset familyVXT
--* BJTest Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyMIL
--* BTest Intrinsic:: Test bit.
--@end ifset
--@ifset familyF77
--* CAbs Intrinsic:: Absolute value (archaic).
--* CCos Intrinsic:: Cosine (archaic).
--@end ifset
--@ifset familyFVZ
--* CDAbs Intrinsic:: Absolute value (archaic).
--* CDCos Intrinsic:: Cosine (archaic).
--* CDExp Intrinsic:: Exponential (archaic).
--* CDLog Intrinsic:: Natural logarithm (archaic).
--* CDSin Intrinsic:: Sine (archaic).
--* CDSqRt Intrinsic:: Square root (archaic).
--@end ifset
--@ifset familyF90
--* Ceiling Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* CExp Intrinsic:: Exponential (archaic).
--* Char Intrinsic:: Character from code.
--@end ifset
--@ifset familyF2U
--* ChDir Intrinsic (subroutine):: Change directory.
--@end ifset
--@ifset familyBADU77
--* ChDir Intrinsic (function):: Change directory.
--@end ifset
--@ifset familyF2U
--* ChMod Intrinsic (subroutine):: Change file modes.
--@end ifset
--@ifset familyBADU77
--* ChMod Intrinsic (function):: Change file modes.
--@end ifset
--@ifset familyF77
--* CLog Intrinsic:: Natural logarithm (archaic).
--* Cmplx Intrinsic:: Construct @code{COMPLEX(KIND=1)} value.
--@end ifset
--@ifset familyGNU
--* Complex Intrinsic:: Build complex value from real and
-- imaginary parts.
--@end ifset
--@ifset familyF77
--* Conjg Intrinsic:: Complex conjugate.
--* Cos Intrinsic:: Cosine.
--@end ifset
--@ifset familyVXT
--* CosD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* CosH Intrinsic:: Hyperbolic cosine.
--@end ifset
--@ifset familyF90
--* Count Intrinsic:: (Reserved for future use.)
--* CPU_Time Intrinsic:: Get current CPU time.
--* CShift Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* CSin Intrinsic:: Sine (archaic).
--* CSqRt Intrinsic:: Square root (archaic).
--@end ifset
--@ifset familyF2U
--* CTime Intrinsic (subroutine):: Convert time to Day Mon dd hh:mm:ss yyyy.
--* CTime Intrinsic (function):: Convert time to Day Mon dd hh:mm:ss yyyy.
--@end ifset
--@ifset familyF77
--* DAbs Intrinsic:: Absolute value (archaic).
--* DACos Intrinsic:: Arc cosine (archaic).
--@end ifset
--@ifset familyVXT
--* DACosD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DASin Intrinsic:: Arc sine (archaic).
--@end ifset
--@ifset familyVXT
--* DASinD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DATan Intrinsic:: Arc tangent (archaic).
--* DATan2 Intrinsic:: Arc tangent (archaic).
--@end ifset
--@ifset familyVXT
--* DATan2D Intrinsic:: (Reserved for future use.)
--* DATanD Intrinsic:: (Reserved for future use.)
--* Date Intrinsic:: Get current date as dd-Mon-yy.
--@end ifset
--@ifset familyF90
--* Date_and_Time Intrinsic:: Get the current date and time.
--@end ifset
--@ifset familyF2U
--* DbesJ0 Intrinsic:: Bessel function (archaic).
--* DbesJ1 Intrinsic:: Bessel function (archaic).
--* DbesJN Intrinsic:: Bessel function (archaic).
--* DbesY0 Intrinsic:: Bessel function (archaic).
--* DbesY1 Intrinsic:: Bessel function (archaic).
--* DbesYN Intrinsic:: Bessel function (archaic).
--@end ifset
--@ifset familyF77
--* Dble Intrinsic:: Convert to double precision.
--@end ifset
--@ifset familyVXT
--* DbleQ Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyFVZ
--* DCmplx Intrinsic:: Construct @code{COMPLEX(KIND=2)} value.
--* DConjg Intrinsic:: Complex conjugate (archaic).
--@end ifset
--@ifset familyF77
--* DCos Intrinsic:: Cosine (archaic).
--@end ifset
--@ifset familyVXT
--* DCosD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DCosH Intrinsic:: Hyperbolic cosine (archaic).
--* DDiM Intrinsic:: Difference magnitude (archaic).
--@end ifset
--@ifset familyF2U
--* DErF Intrinsic:: Error function (archaic).
--* DErFC Intrinsic:: Complementary error function (archaic).
--@end ifset
--@ifset familyF77
--* DExp Intrinsic:: Exponential (archaic).
--@end ifset
--@ifset familyFVZ
--* DFloat Intrinsic:: Conversion (archaic).
--@end ifset
--@ifset familyVXT
--* DFlotI Intrinsic:: (Reserved for future use.)
--* DFlotJ Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Digits Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DiM Intrinsic:: Difference magnitude (non-negative subtract).
--@end ifset
--@ifset familyFVZ
--* DImag Intrinsic:: Convert/extract imaginary part of complex (archaic).
--@end ifset
--@ifset familyF77
--* DInt Intrinsic:: Truncate to whole number (archaic).
--* DLog Intrinsic:: Natural logarithm (archaic).
--* DLog10 Intrinsic:: Common logarithm (archaic).
--* DMax1 Intrinsic:: Maximum value (archaic).
--* DMin1 Intrinsic:: Minimum value (archaic).
--* DMod Intrinsic:: Remainder (archaic).
--* DNInt Intrinsic:: Round to nearest whole number (archaic).
--@end ifset
--@ifset familyF90
--* Dot_Product Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DProd Intrinsic:: Double-precision product.
--@end ifset
--@ifset familyVXT
--* DReal Intrinsic:: Convert value to type @code{REAL(KIND=2)}.
--@end ifset
--@ifset familyF77
--* DSign Intrinsic:: Apply sign to magnitude (archaic).
--* DSin Intrinsic:: Sine (archaic).
--@end ifset
--@ifset familyVXT
--* DSinD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DSinH Intrinsic:: Hyperbolic sine (archaic).
--* DSqRt Intrinsic:: Square root (archaic).
--* DTan Intrinsic:: Tangent (archaic).
--@end ifset
--@ifset familyVXT
--* DTanD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* DTanH Intrinsic:: Hyperbolic tangent (archaic).
--@end ifset
--@ifset familyF2U
--* DTime Intrinsic (subroutine):: Get elapsed time since last time.
--@end ifset
--@ifset familyBADU77
--* DTime Intrinsic (function):: Get elapsed time since last time.
--@end ifset
--@ifset familyF90
--* EOShift Intrinsic:: (Reserved for future use.)
--* Epsilon Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* ErF Intrinsic:: Error function.
--* ErFC Intrinsic:: Complementary error function.
--* ETime Intrinsic (subroutine):: Get elapsed time for process.
--* ETime Intrinsic (function):: Get elapsed time for process.
--* Exit Intrinsic:: Terminate the program.
--@end ifset
--@ifset familyF77
--* Exp Intrinsic:: Exponential.
--@end ifset
--@ifset familyF90
--* Exponent Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* FDate Intrinsic (subroutine):: Get current time as Day Mon dd hh:mm:ss yyyy.
--* FDate Intrinsic (function):: Get current time as Day Mon dd hh:mm:ss yyyy.
--* FGet Intrinsic (subroutine):: Read a character from unit 5 stream-wise.
--@end ifset
--@ifset familyBADU77
--* FGet Intrinsic (function):: Read a character from unit 5 stream-wise.
--@end ifset
--@ifset familyF2U
--* FGetC Intrinsic (subroutine):: Read a character stream-wise.
--@end ifset
--@ifset familyBADU77
--* FGetC Intrinsic (function):: Read a character stream-wise.
--@end ifset
--@ifset familyF77
--* Float Intrinsic:: Conversion (archaic).
--@end ifset
--@ifset familyVXT
--* FloatI Intrinsic:: (Reserved for future use.)
--* FloatJ Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Floor Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Flush Intrinsic:: Flush buffered output.
--* FNum Intrinsic:: Get file descriptor from Fortran unit number.
--* FPut Intrinsic (subroutine):: Write a character to unit 6 stream-wise.
--@end ifset
--@ifset familyBADU77
--* FPut Intrinsic (function):: Write a character to unit 6 stream-wise.
--@end ifset
--@ifset familyF2U
--* FPutC Intrinsic (subroutine):: Write a character stream-wise.
--@end ifset
--@ifset familyBADU77
--* FPutC Intrinsic (function):: Write a character stream-wise.
--@end ifset
--@ifset familyF90
--* Fraction Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* FSeek Intrinsic:: Position file (low-level).
--* FStat Intrinsic (subroutine):: Get file information.
--* FStat Intrinsic (function):: Get file information.
--* FTell Intrinsic (subroutine):: Get file position (low-level).
--* FTell Intrinsic (function):: Get file position (low-level).
--* GError Intrinsic:: Get error message for last error.
--* GetArg Intrinsic:: Obtain command-line argument.
--* GetCWD Intrinsic (subroutine):: Get current working directory.
--* GetCWD Intrinsic (function):: Get current working directory.
--* GetEnv Intrinsic:: Get environment variable.
--* GetGId Intrinsic:: Get process group id.
--* GetLog Intrinsic:: Get login name.
--* GetPId Intrinsic:: Get process id.
--* GetUId Intrinsic:: Get process user id.
--* GMTime Intrinsic:: Convert time to GMT time info.
--* HostNm Intrinsic (subroutine):: Get host name.
--* HostNm Intrinsic (function):: Get host name.
--@end ifset
--@ifset familyF90
--* Huge Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* IAbs Intrinsic:: Absolute value (archaic).
--@end ifset
--@ifset familyASC
--* IAChar Intrinsic:: ASCII code for character.
--@end ifset
--@ifset familyMIL
--* IAnd Intrinsic:: Boolean AND.
--@end ifset
--@ifset familyF2U
--* IArgC Intrinsic:: Obtain count of command-line arguments.
--@end ifset
--@ifset familyMIL
--* IBClr Intrinsic:: Clear a bit.
--* IBits Intrinsic:: Extract a bit subfield of a variable.
--* IBSet Intrinsic:: Set a bit.
--@end ifset
--@ifset familyF77
--* IChar Intrinsic:: Code for character.
--@end ifset
--@ifset familyF2U
--* IDate Intrinsic (UNIX):: Get local time info.
--@end ifset
--@ifset familyVXT
--* IDate Intrinsic (VXT):: Get local time info (VAX/VMS).
--@end ifset
--@ifset familyF77
--* IDiM Intrinsic:: Difference magnitude (archaic).
--* IDInt Intrinsic:: Convert to @code{INTEGER} value truncated
-- to whole number (archaic).
--* IDNInt Intrinsic:: Convert to @code{INTEGER} value rounded
-- to nearest whole number (archaic).
--@end ifset
--@ifset familyMIL
--* IEOr Intrinsic:: Boolean XOR.
--@end ifset
--@ifset familyF2U
--* IErrNo Intrinsic:: Get error number for last error.
--@end ifset
--@ifset familyF77
--* IFix Intrinsic:: Conversion (archaic).
--@end ifset
--@ifset familyVXT
--* IIAbs Intrinsic:: (Reserved for future use.)
--* IIAnd Intrinsic:: (Reserved for future use.)
--* IIBClr Intrinsic:: (Reserved for future use.)
--* IIBits Intrinsic:: (Reserved for future use.)
--* IIBSet Intrinsic:: (Reserved for future use.)
--* IIDiM Intrinsic:: (Reserved for future use.)
--* IIDInt Intrinsic:: (Reserved for future use.)
--* IIDNnt Intrinsic:: (Reserved for future use.)
--* IIEOr Intrinsic:: (Reserved for future use.)
--* IIFix Intrinsic:: (Reserved for future use.)
--* IInt Intrinsic:: (Reserved for future use.)
--* IIOr Intrinsic:: (Reserved for future use.)
--* IIQint Intrinsic:: (Reserved for future use.)
--* IIQNnt Intrinsic:: (Reserved for future use.)
--* IIShftC Intrinsic:: (Reserved for future use.)
--* IISign Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2C
--* Imag Intrinsic:: Extract imaginary part of complex.
--@end ifset
--@ifset familyGNU
--* ImagPart Intrinsic:: Extract imaginary part of complex.
--@end ifset
--@ifset familyVXT
--* IMax0 Intrinsic:: (Reserved for future use.)
--* IMax1 Intrinsic:: (Reserved for future use.)
--* IMin0 Intrinsic:: (Reserved for future use.)
--* IMin1 Intrinsic:: (Reserved for future use.)
--* IMod Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Index Intrinsic:: Locate a CHARACTER substring.
--@end ifset
--@ifset familyVXT
--* INInt Intrinsic:: (Reserved for future use.)
--* INot Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Int Intrinsic:: Convert to @code{INTEGER} value truncated
-- to whole number.
--@end ifset
--@ifset familyGNU
--* Int2 Intrinsic:: Convert to @code{INTEGER(KIND=6)} value
-- truncated to whole number.
--* Int8 Intrinsic:: Convert to @code{INTEGER(KIND=2)} value
-- truncated to whole number.
--@end ifset
--@ifset familyMIL
--* IOr Intrinsic:: Boolean OR.
--@end ifset
--@ifset familyF2U
--* IRand Intrinsic:: Random number.
--* IsaTty Intrinsic:: Is unit connected to a terminal?
--@end ifset
--@ifset familyMIL
--* IShft Intrinsic:: Logical bit shift.
--* IShftC Intrinsic:: Circular bit shift.
--@end ifset
--@ifset familyF77
--* ISign Intrinsic:: Apply sign to magnitude (archaic).
--@end ifset
--@ifset familyF2U
--* ITime Intrinsic:: Get local time of day.
--@end ifset
--@ifset familyVXT
--* IZExt Intrinsic:: (Reserved for future use.)
--* JIAbs Intrinsic:: (Reserved for future use.)
--* JIAnd Intrinsic:: (Reserved for future use.)
--* JIBClr Intrinsic:: (Reserved for future use.)
--* JIBits Intrinsic:: (Reserved for future use.)
--* JIBSet Intrinsic:: (Reserved for future use.)
--* JIDiM Intrinsic:: (Reserved for future use.)
--* JIDInt Intrinsic:: (Reserved for future use.)
--* JIDNnt Intrinsic:: (Reserved for future use.)
--* JIEOr Intrinsic:: (Reserved for future use.)
--* JIFix Intrinsic:: (Reserved for future use.)
--* JInt Intrinsic:: (Reserved for future use.)
--* JIOr Intrinsic:: (Reserved for future use.)
--* JIQint Intrinsic:: (Reserved for future use.)
--* JIQNnt Intrinsic:: (Reserved for future use.)
--* JIShft Intrinsic:: (Reserved for future use.)
--* JIShftC Intrinsic:: (Reserved for future use.)
--* JISign Intrinsic:: (Reserved for future use.)
--* JMax0 Intrinsic:: (Reserved for future use.)
--* JMax1 Intrinsic:: (Reserved for future use.)
--* JMin0 Intrinsic:: (Reserved for future use.)
--* JMin1 Intrinsic:: (Reserved for future use.)
--* JMod Intrinsic:: (Reserved for future use.)
--* JNInt Intrinsic:: (Reserved for future use.)
--* JNot Intrinsic:: (Reserved for future use.)
--* JZExt Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Kill Intrinsic (subroutine):: Signal a process.
--@end ifset
--@ifset familyBADU77
--* Kill Intrinsic (function):: Signal a process.
--@end ifset
--@ifset familyF90
--* Kind Intrinsic:: (Reserved for future use.)
--* LBound Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Len Intrinsic:: Length of character entity.
--@end ifset
--@ifset familyF90
--* Len_Trim Intrinsic:: Get last non-blank character in string.
--@end ifset
--@ifset familyF77
--* LGe Intrinsic:: Lexically greater than or equal.
--* LGt Intrinsic:: Lexically greater than.
--@end ifset
--@ifset familyF2U
--* Link Intrinsic (subroutine):: Make hard link in file system.
--@end ifset
--@ifset familyBADU77
--* Link Intrinsic (function):: Make hard link in file system.
--@end ifset
--@ifset familyF77
--* LLe Intrinsic:: Lexically less than or equal.
--* LLt Intrinsic:: Lexically less than.
--@end ifset
--@ifset familyF2U
--* LnBlnk Intrinsic:: Get last non-blank character in string.
--* Loc Intrinsic:: Address of entity in core.
--@end ifset
--@ifset familyF77
--* Log Intrinsic:: Natural logarithm.
--* Log10 Intrinsic:: Common logarithm.
--@end ifset
--@ifset familyF90
--* Logical Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Long Intrinsic:: Conversion to @code{INTEGER(KIND=1)} (archaic).
--@end ifset
--@ifset familyF2C
--* LShift Intrinsic:: Left-shift bits.
--@end ifset
--@ifset familyF2U
--* LStat Intrinsic (subroutine):: Get file information.
--* LStat Intrinsic (function):: Get file information.
--* LTime Intrinsic:: Convert time to local time info.
--@end ifset
--@ifset familyF90
--* MatMul Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Max Intrinsic:: Maximum value.
--* Max0 Intrinsic:: Maximum value (archaic).
--* Max1 Intrinsic:: Maximum value (archaic).
--@end ifset
--@ifset familyF90
--* MaxExponent Intrinsic:: (Reserved for future use.)
--* MaxLoc Intrinsic:: (Reserved for future use.)
--* MaxVal Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* MClock Intrinsic:: Get number of clock ticks for process.
--* MClock8 Intrinsic:: Get number of clock ticks for process.
--@end ifset
--@ifset familyF90
--* Merge Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Min Intrinsic:: Minimum value.
--* Min0 Intrinsic:: Minimum value (archaic).
--* Min1 Intrinsic:: Minimum value (archaic).
--@end ifset
--@ifset familyF90
--* MinExponent Intrinsic:: (Reserved for future use.)
--* MinLoc Intrinsic:: (Reserved for future use.)
--* MinVal Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Mod Intrinsic:: Remainder.
--@end ifset
--@ifset familyF90
--* Modulo Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyMIL
--* MvBits Intrinsic:: Moving a bit field.
--@end ifset
--@ifset familyF90
--* Nearest Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* NInt Intrinsic:: Convert to @code{INTEGER} value rounded
-- to nearest whole number.
--@end ifset
--@ifset familyMIL
--* Not Intrinsic:: Boolean NOT.
--@end ifset
--@ifset familyF2C
--* Or Intrinsic:: Boolean OR.
--@end ifset
--@ifset familyF90
--* Pack Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* PError Intrinsic:: Print error message for last error.
--@end ifset
--@ifset familyF90
--* Precision Intrinsic:: (Reserved for future use.)
--* Present Intrinsic:: (Reserved for future use.)
--* Product Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyVXT
--* QAbs Intrinsic:: (Reserved for future use.)
--* QACos Intrinsic:: (Reserved for future use.)
--* QACosD Intrinsic:: (Reserved for future use.)
--* QASin Intrinsic:: (Reserved for future use.)
--* QASinD Intrinsic:: (Reserved for future use.)
--* QATan Intrinsic:: (Reserved for future use.)
--* QATan2 Intrinsic:: (Reserved for future use.)
--* QATan2D Intrinsic:: (Reserved for future use.)
--* QATanD Intrinsic:: (Reserved for future use.)
--* QCos Intrinsic:: (Reserved for future use.)
--* QCosD Intrinsic:: (Reserved for future use.)
--* QCosH Intrinsic:: (Reserved for future use.)
--* QDiM Intrinsic:: (Reserved for future use.)
--* QExp Intrinsic:: (Reserved for future use.)
--* QExt Intrinsic:: (Reserved for future use.)
--* QExtD Intrinsic:: (Reserved for future use.)
--* QFloat Intrinsic:: (Reserved for future use.)
--* QInt Intrinsic:: (Reserved for future use.)
--* QLog Intrinsic:: (Reserved for future use.)
--* QLog10 Intrinsic:: (Reserved for future use.)
--* QMax1 Intrinsic:: (Reserved for future use.)
--* QMin1 Intrinsic:: (Reserved for future use.)
--* QMod Intrinsic:: (Reserved for future use.)
--* QNInt Intrinsic:: (Reserved for future use.)
--* QSin Intrinsic:: (Reserved for future use.)
--* QSinD Intrinsic:: (Reserved for future use.)
--* QSinH Intrinsic:: (Reserved for future use.)
--* QSqRt Intrinsic:: (Reserved for future use.)
--* QTan Intrinsic:: (Reserved for future use.)
--* QTanD Intrinsic:: (Reserved for future use.)
--* QTanH Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Radix Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Rand Intrinsic:: Random number.
--@end ifset
--@ifset familyF90
--* Random_Number Intrinsic:: (Reserved for future use.)
--* Random_Seed Intrinsic:: (Reserved for future use.)
--* Range Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* Real Intrinsic:: Convert value to type @code{REAL(KIND=1)}.
--@end ifset
--@ifset familyGNU
--* RealPart Intrinsic:: Extract real part of complex.
--@end ifset
--@ifset familyF2U
--* Rename Intrinsic (subroutine):: Rename file.
--@end ifset
--@ifset familyBADU77
--* Rename Intrinsic (function):: Rename file.
--@end ifset
--@ifset familyF90
--* Repeat Intrinsic:: (Reserved for future use.)
--* Reshape Intrinsic:: (Reserved for future use.)
--* RRSpacing Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2C
--* RShift Intrinsic:: Right-shift bits.
--@end ifset
--@ifset familyF90
--* Scale Intrinsic:: (Reserved for future use.)
--* Scan Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyVXT
--* Secnds Intrinsic:: Get local time offset since midnight.
--@end ifset
--@ifset familyF2U
--* Second Intrinsic (function):: Get CPU time for process in seconds.
--* Second Intrinsic (subroutine):: Get CPU time for process
-- in seconds.
--@end ifset
--@ifset familyF90
--* Selected_Int_Kind Intrinsic:: (Reserved for future use.)
--* Selected_Real_Kind Intrinsic:: (Reserved for future use.)
--* Set_Exponent Intrinsic:: (Reserved for future use.)
--* Shape Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* Short Intrinsic:: Convert to @code{INTEGER(KIND=6)} value
-- truncated to whole number.
--@end ifset
--@ifset familyF77
--* Sign Intrinsic:: Apply sign to magnitude.
--@end ifset
--@ifset familyF2U
--* Signal Intrinsic (subroutine):: Muck with signal handling.
--@end ifset
--@ifset familyBADU77
--* Signal Intrinsic (function):: Muck with signal handling.
--@end ifset
--@ifset familyF77
--* Sin Intrinsic:: Sine.
--@end ifset
--@ifset familyVXT
--* SinD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* SinH Intrinsic:: Hyperbolic sine.
--@end ifset
--@ifset familyF2U
--* Sleep Intrinsic:: Sleep for a specified time.
--@end ifset
--@ifset familyF77
--* Sngl Intrinsic:: Convert (archaic).
--@end ifset
--@ifset familyVXT
--* SnglQ Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF90
--* Spacing Intrinsic:: (Reserved for future use.)
--* Spread Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* SqRt Intrinsic:: Square root.
--@end ifset
--@ifset familyF2U
--* SRand Intrinsic:: Random seed.
--* Stat Intrinsic (subroutine):: Get file information.
--* Stat Intrinsic (function):: Get file information.
--@end ifset
--@ifset familyF90
--* Sum Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* SymLnk Intrinsic (subroutine):: Make symbolic link in file system.
--@end ifset
--@ifset familyBADU77
--* SymLnk Intrinsic (function):: Make symbolic link in file system.
--@end ifset
--@ifset familyF2U
--* System Intrinsic (subroutine):: Invoke shell (system) command.
--@end ifset
--@ifset familyBADU77
--* System Intrinsic (function):: Invoke shell (system) command.
--@end ifset
--@ifset familyF90
--* System_Clock Intrinsic:: Get current system clock value.
--@end ifset
--@ifset familyF77
--* Tan Intrinsic:: Tangent.
--@end ifset
--@ifset familyVXT
--* TanD Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF77
--* TanH Intrinsic:: Hyperbolic tangent.
--@end ifset
--@ifset familyF2U
--* Time Intrinsic (UNIX):: Get current time as time value.
--@end ifset
--@ifset familyVXT
--* Time Intrinsic (VXT):: Get the time as a character value.
--@end ifset
--@ifset familyF2U
--* Time8 Intrinsic:: Get current time as time value.
--@end ifset
--@ifset familyF90
--* Tiny Intrinsic:: (Reserved for future use.)
--* Transfer Intrinsic:: (Reserved for future use.)
--* Transpose Intrinsic:: (Reserved for future use.)
--* Trim Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* TtyNam Intrinsic (subroutine):: Get name of terminal device for unit.
--* TtyNam Intrinsic (function):: Get name of terminal device for unit.
--@end ifset
--@ifset familyF90
--* UBound Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2U
--* UMask Intrinsic (subroutine):: Set file creation permissions mask.
--@end ifset
--@ifset familyBADU77
--* UMask Intrinsic (function):: Set file creation permissions mask.
--@end ifset
--@ifset familyF2U
--* Unlink Intrinsic (subroutine):: Unlink file.
--@end ifset
--@ifset familyBADU77
--* Unlink Intrinsic (function):: Unlink file.
--@end ifset
--@ifset familyF90
--* Unpack Intrinsic:: (Reserved for future use.)
--* Verify Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2C
--* XOr Intrinsic:: Boolean XOR.
--* ZAbs Intrinsic:: Absolute value (archaic).
--* ZCos Intrinsic:: Cosine (archaic).
--* ZExp Intrinsic:: Exponential (archaic).
--@end ifset
--@ifset familyVXT
--* ZExt Intrinsic:: (Reserved for future use.)
--@end ifset
--@ifset familyF2C
--* ZLog Intrinsic:: Natural logarithm (archaic).
--* ZSin Intrinsic:: Sine (archaic).
--* ZSqRt Intrinsic:: Square root (archaic).
--@end ifset
--@end menu
--
--@ifset familyF2U
--@node Abort Intrinsic
--@subsubsection Abort Intrinsic
--@cindex Abort intrinsic
--@cindex intrinsics, Abort
--
--@noindent
--@example
--CALL Abort()
--@end example
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Prints a message and potentially causes a core dump via @code{abort(3)}.
--
--@end ifset
--@ifset familyF77
--@node Abs Intrinsic
--@subsubsection Abs Intrinsic
--@cindex Abs intrinsic
--@cindex intrinsics, Abs
--
--@noindent
--@example
--Abs(@var{A})
--@end example
--
--@noindent
--Abs: @code{INTEGER} or @code{REAL} function.
--The exact type depends on that of argument @var{A}---if @var{A} is
--@code{COMPLEX}, this function's type is @code{REAL}
--with the same @samp{KIND=} value as the type of @var{A}.
--Otherwise, this function's type is the same as that of @var{A}.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the absolute value of @var{A}.
--
--If @var{A} is type @code{COMPLEX}, the absolute
--value is computed as:
--
--@example
--SQRT(REALPART(@var{A})**2, IMAGPART(@var{A})**2)
--@end example
--
--@noindent
--Otherwise, it is computed by negating the @var{A} if
--it is negative, or returning @var{A}.
--
--@xref{Sign Intrinsic}, for how to explicitly
--compute the positive or negative form of the absolute
--value of an expression.
--
--@end ifset
--@ifset familyF2U
--@node Access Intrinsic
--@subsubsection Access Intrinsic
--@cindex Access intrinsic
--@cindex intrinsics, Access
--
--@noindent
--@example
--Access(@var{Name}, @var{Mode})
--@end example
--
--@noindent
--Access: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Mode}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Checks file @var{Name} for accessibility in the mode specified by @var{Mode} and
--returns 0 if the file is accessible in that mode, otherwise an error
--code if the file is inaccessible or @var{Mode} is invalid.
--See @code{access(2)}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{Name}---otherwise,
--trailing blanks in @var{Name} are ignored.
--@var{Mode} may be a concatenation of any of the following characters:
--
--@table @samp
--@item r
--Read permission
--
--@item w
--Write permission
--
--@item x
--Execute permission
--
--@item @kbd{SPC}
--Existence
--@end table
--
--@end ifset
--@ifset familyASC
--@node AChar Intrinsic
--@subsubsection AChar Intrinsic
--@cindex AChar intrinsic
--@cindex intrinsics, AChar
--
--@noindent
--@example
--AChar(@var{I})
--@end example
--
--@noindent
--AChar: @code{CHARACTER*1} function.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{f90}.
--
--@noindent
--Description:
--
--Returns the ASCII character corresponding to the
--code specified by @var{I}.
--
--@xref{IAChar Intrinsic}, for the inverse of this function.
--
--@xref{Char Intrinsic}, for the function corresponding
--to the system's native character set.
--
--@end ifset
--@ifset familyF77
--@node ACos Intrinsic
--@subsubsection ACos Intrinsic
--@cindex ACos intrinsic
--@cindex intrinsics, ACos
--
--@noindent
--@example
--ACos(@var{X})
--@end example
--
--@noindent
--ACos: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the arc-cosine (inverse cosine) of @var{X}
--in radians.
--
--@xref{Cos Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node ACosD Intrinsic
--@subsubsection ACosD Intrinsic
--@cindex ACosD intrinsic
--@cindex intrinsics, ACosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL ACosD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node AdjustL Intrinsic
--@subsubsection AdjustL Intrinsic
--@cindex AdjustL intrinsic
--@cindex intrinsics, AdjustL
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AdjustL} to use this name for an
--external procedure.
--
--@node AdjustR Intrinsic
--@subsubsection AdjustR Intrinsic
--@cindex AdjustR intrinsic
--@cindex intrinsics, AdjustR
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AdjustR} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node AImag Intrinsic
--@subsubsection AImag Intrinsic
--@cindex AImag intrinsic
--@cindex intrinsics, AImag
--
--@noindent
--@example
--AImag(@var{Z})
--@end example
--
--@noindent
--AImag: @code{REAL} function.
--This intrinsic is valid when argument @var{Z} is
--@code{COMPLEX(KIND=1)}.
--When @var{Z} is any other @code{COMPLEX} type,
--this intrinsic is valid only when used as the argument to
--@code{REAL()}, as explained below.
--
--@noindent
--@var{Z}: @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the (possibly converted) imaginary part of @var{Z}.
--
--Use of @code{AIMAG()} with an argument of a type
--other than @code{COMPLEX(KIND=1)} is restricted to the following case:
--
--@example
--REAL(AIMAG(Z))
--@end example
--
--@noindent
--This expression converts the imaginary part of Z to
--@code{REAL(KIND=1)}.
--
--@xref{REAL() and AIMAG() of Complex}, for more information.
--
--@end ifset
--@ifset familyVXT
--@node AIMax0 Intrinsic
--@subsubsection AIMax0 Intrinsic
--@cindex AIMax0 intrinsic
--@cindex intrinsics, AIMax0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AIMax0} to use this name for an
--external procedure.
--
--@node AIMin0 Intrinsic
--@subsubsection AIMin0 Intrinsic
--@cindex AIMin0 intrinsic
--@cindex intrinsics, AIMin0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AIMin0} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node AInt Intrinsic
--@subsubsection AInt Intrinsic
--@cindex AInt intrinsic
--@cindex intrinsics, AInt
--
--@noindent
--@example
--AInt(@var{A})
--@end example
--
--@noindent
--AInt: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{A}.
--
--@noindent
--@var{A}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude truncated and its sign preserved.
--(Also called ``truncation towards zero''.)
--
--@xref{ANInt Intrinsic}, for how to round to nearest
--whole number.
--
--@xref{Int Intrinsic}, for how to truncate and then convert
--number to @code{INTEGER}.
--
--@end ifset
--@ifset familyVXT
--@node AJMax0 Intrinsic
--@subsubsection AJMax0 Intrinsic
--@cindex AJMax0 intrinsic
--@cindex intrinsics, AJMax0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AJMax0} to use this name for an
--external procedure.
--
--@node AJMin0 Intrinsic
--@subsubsection AJMin0 Intrinsic
--@cindex AJMin0 intrinsic
--@cindex intrinsics, AJMin0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL AJMin0} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Alarm Intrinsic
--@subsubsection Alarm Intrinsic
--@cindex Alarm intrinsic
--@cindex intrinsics, Alarm
--
--@noindent
--@example
--CALL Alarm(@var{Seconds}, @var{Handler}, @var{Status})
--@end example
--
--@noindent
--@var{Seconds}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Handler}: Signal handler (@code{INTEGER FUNCTION} or @code{SUBROUTINE})
--or dummy/global @code{INTEGER(KIND=1)} scalar.
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Causes external subroutine @var{Handler} to be executed after a delay of
--@var{Seconds} seconds by using @code{alarm(1)} to set up a signal and
--@code{signal(2)} to catch it.
--If @var{Status} is supplied, it will be
--returned with the number of seconds remaining until any previously
--scheduled alarm was due to be delivered, or zero if there was no
--previously scheduled alarm.
--@xref{Signal Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node All Intrinsic
--@subsubsection All Intrinsic
--@cindex All intrinsic
--@cindex intrinsics, All
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL All} to use this name for an
--external procedure.
--
--@node Allocated Intrinsic
--@subsubsection Allocated Intrinsic
--@cindex Allocated intrinsic
--@cindex intrinsics, Allocated
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Allocated} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node ALog Intrinsic
--@subsubsection ALog Intrinsic
--@cindex ALog intrinsic
--@cindex intrinsics, ALog
--
--@noindent
--@example
--ALog(@var{X})
--@end example
--
--@noindent
--ALog: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{LOG()} that is specific
--to one type for @var{X}.
--@xref{Log Intrinsic}.
--
--@node ALog10 Intrinsic
--@subsubsection ALog10 Intrinsic
--@cindex ALog10 intrinsic
--@cindex intrinsics, ALog10
--
--@noindent
--@example
--ALog10(@var{X})
--@end example
--
--@noindent
--ALog10: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{LOG10()} that is specific
--to one type for @var{X}.
--@xref{Log10 Intrinsic}.
--
--@node AMax0 Intrinsic
--@subsubsection AMax0 Intrinsic
--@cindex AMax0 intrinsic
--@cindex intrinsics, AMax0
--
--@noindent
--@example
--AMax0(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--AMax0: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MAX()} that is specific
--to one type for @var{A} and a different return type.
--@xref{Max Intrinsic}.
--
--@node AMax1 Intrinsic
--@subsubsection AMax1 Intrinsic
--@cindex AMax1 intrinsic
--@cindex intrinsics, AMax1
--
--@noindent
--@example
--AMax1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--AMax1: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MAX()} that is specific
--to one type for @var{A}.
--@xref{Max Intrinsic}.
--
--@node AMin0 Intrinsic
--@subsubsection AMin0 Intrinsic
--@cindex AMin0 intrinsic
--@cindex intrinsics, AMin0
--
--@noindent
--@example
--AMin0(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--AMin0: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MIN()} that is specific
--to one type for @var{A} and a different return type.
--@xref{Min Intrinsic}.
--
--@node AMin1 Intrinsic
--@subsubsection AMin1 Intrinsic
--@cindex AMin1 intrinsic
--@cindex intrinsics, AMin1
--
--@noindent
--@example
--AMin1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--AMin1: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MIN()} that is specific
--to one type for @var{A}.
--@xref{Min Intrinsic}.
--
--@node AMod Intrinsic
--@subsubsection AMod Intrinsic
--@cindex AMod intrinsic
--@cindex intrinsics, AMod
--
--@noindent
--@example
--AMod(@var{A}, @var{P})
--@end example
--
--@noindent
--AMod: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{P}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MOD()} that is specific
--to one type for @var{A}.
--@xref{Mod Intrinsic}.
--
--@end ifset
--@ifset familyF2C
--@node And Intrinsic
--@subsubsection And Intrinsic
--@cindex And intrinsic
--@cindex intrinsics, And
--
--@noindent
--@example
--And(@var{I}, @var{J})
--@end example
--
--@noindent
--And: @code{INTEGER} or @code{LOGICAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean AND of
--pair of bits in each of @var{I} and @var{J}.
--
--@end ifset
--@ifset familyF77
--@node ANInt Intrinsic
--@subsubsection ANInt Intrinsic
--@cindex ANInt intrinsic
--@cindex intrinsics, ANInt
--
--@noindent
--@example
--ANInt(@var{A})
--@end example
--
--@noindent
--ANInt: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{A}.
--
--@noindent
--@var{A}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude eliminated by rounding to the nearest whole
--number and with its sign preserved.
--
--A fractional portion exactly equal to
--@samp{.5} is rounded to the whole number that
--is larger in magnitude.
--(Also called ``Fortran round''.)
--
--@xref{AInt Intrinsic}, for how to truncate to
--whole number.
--
--@xref{NInt Intrinsic}, for how to round and then convert
--number to @code{INTEGER}.
--
--@end ifset
--@ifset familyF90
--@node Any Intrinsic
--@subsubsection Any Intrinsic
--@cindex Any intrinsic
--@cindex intrinsics, Any
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Any} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node ASin Intrinsic
--@subsubsection ASin Intrinsic
--@cindex ASin intrinsic
--@cindex intrinsics, ASin
--
--@noindent
--@example
--ASin(@var{X})
--@end example
--
--@noindent
--ASin: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the arc-sine (inverse sine) of @var{X}
--in radians.
--
--@xref{Sin Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node ASinD Intrinsic
--@subsubsection ASinD Intrinsic
--@cindex ASinD intrinsic
--@cindex intrinsics, ASinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL ASinD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Associated Intrinsic
--@subsubsection Associated Intrinsic
--@cindex Associated intrinsic
--@cindex intrinsics, Associated
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Associated} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node ATan Intrinsic
--@subsubsection ATan Intrinsic
--@cindex ATan intrinsic
--@cindex intrinsics, ATan
--
--@noindent
--@example
--ATan(@var{X})
--@end example
--
--@noindent
--ATan: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the arc-tangent (inverse tangent) of @var{X}
--in radians.
--
--@xref{Tan Intrinsic}, for the inverse of this function.
--
--@node ATan2 Intrinsic
--@subsubsection ATan2 Intrinsic
--@cindex ATan2 intrinsic
--@cindex intrinsics, ATan2
--
--@noindent
--@example
--ATan2(@var{Y}, @var{X})
--@end example
--
--@noindent
--ATan2: @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{Y}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the arc-tangent (inverse tangent) of the complex
--number (@var{Y}, @var{X}) in radians.
--
--@xref{Tan Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node ATan2D Intrinsic
--@subsubsection ATan2D Intrinsic
--@cindex ATan2D intrinsic
--@cindex intrinsics, ATan2D
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL ATan2D} to use this name for an
--external procedure.
--
--@node ATanD Intrinsic
--@subsubsection ATanD Intrinsic
--@cindex ATanD intrinsic
--@cindex intrinsics, ATanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL ATanD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node BesJ0 Intrinsic
--@subsubsection BesJ0 Intrinsic
--@cindex BesJ0 intrinsic
--@cindex intrinsics, BesJ0
--
--@noindent
--@example
--BesJ0(@var{X})
--@end example
--
--@noindent
--BesJ0: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the first kind of order 0 of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@node BesJ1 Intrinsic
--@subsubsection BesJ1 Intrinsic
--@cindex BesJ1 intrinsic
--@cindex intrinsics, BesJ1
--
--@noindent
--@example
--BesJ1(@var{X})
--@end example
--
--@noindent
--BesJ1: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the first kind of order 1 of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@node BesJN Intrinsic
--@subsubsection BesJN Intrinsic
--@cindex BesJN intrinsic
--@cindex intrinsics, BesJN
--
--@noindent
--@example
--BesJN(@var{N}, @var{X})
--@end example
--
--@noindent
--BesJN: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{N}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the first kind of order @var{N} of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@node BesY0 Intrinsic
--@subsubsection BesY0 Intrinsic
--@cindex BesY0 intrinsic
--@cindex intrinsics, BesY0
--
--@noindent
--@example
--BesY0(@var{X})
--@end example
--
--@noindent
--BesY0: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the second kind of order 0 of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@node BesY1 Intrinsic
--@subsubsection BesY1 Intrinsic
--@cindex BesY1 intrinsic
--@cindex intrinsics, BesY1
--
--@noindent
--@example
--BesY1(@var{X})
--@end example
--
--@noindent
--BesY1: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the second kind of order 1 of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@node BesYN Intrinsic
--@subsubsection BesYN Intrinsic
--@cindex BesYN intrinsic
--@cindex intrinsics, BesYN
--
--@noindent
--@example
--BesYN(@var{N}, @var{X})
--@end example
--
--@noindent
--BesYN: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{N}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Calculates the Bessel function of the second kind of order @var{N} of @var{X}.
--See @code{bessel(3m)}, on whose implementation the function depends.
--@end ifset
--@ifset familyVXT
--@node BITest Intrinsic
--@subsubsection BITest Intrinsic
--@cindex BITest intrinsic
--@cindex intrinsics, BITest
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL BITest} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Bit_Size Intrinsic
--@subsubsection Bit_Size Intrinsic
--@cindex Bit_Size intrinsic
--@cindex intrinsics, Bit_Size
--
--@noindent
--@example
--Bit_Size(@var{I})
--@end example
--
--@noindent
--Bit_Size: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar.
--
--@noindent
--Intrinsic groups: @code{f90}.
--
--@noindent
--Description:
--
--Returns the number of bits (integer precision plus sign bit)
--represented by the type for @var{I}.
--
--@xref{BTest Intrinsic}, for how to test the value of a
--bit in a variable or array.
--
--@xref{IBSet Intrinsic}, for how to set a bit in a variable to 1.
--
--@xref{IBClr Intrinsic}, for how to set a bit in a variable to 0.
--
--
--@end ifset
--@ifset familyVXT
--@node BJTest Intrinsic
--@subsubsection BJTest Intrinsic
--@cindex BJTest intrinsic
--@cindex intrinsics, BJTest
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL BJTest} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyMIL
--@node BTest Intrinsic
--@subsubsection BTest Intrinsic
--@cindex BTest intrinsic
--@cindex intrinsics, BTest
--
--@noindent
--@example
--BTest(@var{I}, @var{Pos})
--@end example
--
--@noindent
--BTest: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns @code{.TRUE.} if bit @var{Pos} in @var{I} is
--1, @code{.FALSE.} otherwise.
--
--(Bit 0 is the low-order (rightmost) bit, adding the value
--@ifinfo
--2**0,
--@end ifinfo
--@iftex
--@tex
--$2^0$,
--@end tex
--@end iftex
--or 1,
--to the number if set to 1;
--bit 1 is the next-higher-order bit, adding
--@ifinfo
--2**1,
--@end ifinfo
--@iftex
--@tex
--$2^1$,
--@end tex
--@end iftex
--or 2;
--bit 2 adds
--@ifinfo
--2**2,
--@end ifinfo
--@iftex
--@tex
--$2^2$,
--@end tex
--@end iftex
--or 4; and so on.)
--
--@xref{Bit_Size Intrinsic}, for how to obtain the number of bits
--in a type.
--The leftmost bit of @var{I} is @samp{BIT_SIZE(@var{I}-1)}.
--
--@end ifset
--@ifset familyF77
--@node CAbs Intrinsic
--@subsubsection CAbs Intrinsic
--@cindex CAbs intrinsic
--@cindex intrinsics, CAbs
--
--@noindent
--@example
--CAbs(@var{A})
--@end example
--
--@noindent
--CAbs: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ABS()} that is specific
--to one type for @var{A}.
--@xref{Abs Intrinsic}.
--
--@node CCos Intrinsic
--@subsubsection CCos Intrinsic
--@cindex CCos intrinsic
--@cindex intrinsics, CCos
--
--@noindent
--@example
--CCos(@var{X})
--@end example
--
--@noindent
--CCos: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{COS()} that is specific
--to one type for @var{X}.
--@xref{Cos Intrinsic}.
--
--@end ifset
--@ifset familyFVZ
--@node CDAbs Intrinsic
--@subsubsection CDAbs Intrinsic
--@cindex CDAbs intrinsic
--@cindex intrinsics, CDAbs
--
--@noindent
--@example
--CDAbs(@var{A})
--@end example
--
--@noindent
--CDAbs: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{ABS()} that is specific
--to one type for @var{A}.
--@xref{Abs Intrinsic}.
--
--@node CDCos Intrinsic
--@subsubsection CDCos Intrinsic
--@cindex CDCos intrinsic
--@cindex intrinsics, CDCos
--
--@noindent
--@example
--CDCos(@var{X})
--@end example
--
--@noindent
--CDCos: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{COS()} that is specific
--to one type for @var{X}.
--@xref{Cos Intrinsic}.
--
--@node CDExp Intrinsic
--@subsubsection CDExp Intrinsic
--@cindex CDExp intrinsic
--@cindex intrinsics, CDExp
--
--@noindent
--@example
--CDExp(@var{X})
--@end example
--
--@noindent
--CDExp: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{EXP()} that is specific
--to one type for @var{X}.
--@xref{Exp Intrinsic}.
--
--@node CDLog Intrinsic
--@subsubsection CDLog Intrinsic
--@cindex CDLog intrinsic
--@cindex intrinsics, CDLog
--
--@noindent
--@example
--CDLog(@var{X})
--@end example
--
--@noindent
--CDLog: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{LOG()} that is specific
--to one type for @var{X}.
--@xref{Log Intrinsic}.
--
--@node CDSin Intrinsic
--@subsubsection CDSin Intrinsic
--@cindex CDSin intrinsic
--@cindex intrinsics, CDSin
--
--@noindent
--@example
--CDSin(@var{X})
--@end example
--
--@noindent
--CDSin: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{SIN()} that is specific
--to one type for @var{X}.
--@xref{Sin Intrinsic}.
--
--@node CDSqRt Intrinsic
--@subsubsection CDSqRt Intrinsic
--@cindex CDSqRt intrinsic
--@cindex intrinsics, CDSqRt
--
--@noindent
--@example
--CDSqRt(@var{X})
--@end example
--
--@noindent
--CDSqRt: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{SQRT()} that is specific
--to one type for @var{X}.
--@xref{SqRt Intrinsic}.
--
--@end ifset
--@ifset familyF90
--@node Ceiling Intrinsic
--@subsubsection Ceiling Intrinsic
--@cindex Ceiling intrinsic
--@cindex intrinsics, Ceiling
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Ceiling} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node CExp Intrinsic
--@subsubsection CExp Intrinsic
--@cindex CExp intrinsic
--@cindex intrinsics, CExp
--
--@noindent
--@example
--CExp(@var{X})
--@end example
--
--@noindent
--CExp: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{EXP()} that is specific
--to one type for @var{X}.
--@xref{Exp Intrinsic}.
--
--@node Char Intrinsic
--@subsubsection Char Intrinsic
--@cindex Char intrinsic
--@cindex intrinsics, Char
--
--@noindent
--@example
--Char(@var{I})
--@end example
--
--@noindent
--Char: @code{CHARACTER*1} function.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the character corresponding to the
--code specified by @var{I}, using the system's
--native character set.
--
--Because the system's native character set is used,
--the correspondence between character and their codes
--is not necessarily the same between GNU Fortran
--implementations.
--
--Note that no intrinsic exists to convert a numerical
--value to a printable character string.
--For example, there is no intrinsic that, given
--an @code{INTEGER} or @code{REAL} argument with the
--value @samp{154}, returns the @code{CHARACTER}
--result @samp{'154'}.
--
--Instead, you can use internal-file I/O to do this kind
--of conversion.
--For example:
--
--@smallexample
--INTEGER VALUE
--CHARACTER*10 STRING
--VALUE = 154
--WRITE (STRING, '(I10)'), VALUE
--PRINT *, STRING
--END
--@end smallexample
--
--The above program, when run, prints:
--
--@smallexample
-- 154
--@end smallexample
--
--@xref{IChar Intrinsic}, for the inverse of the @code{CHAR} function.
--
--@xref{AChar Intrinsic}, for the function corresponding
--to the ASCII character set.
--
--@end ifset
--@ifset familyF2U
--@node ChDir Intrinsic (subroutine)
--@subsubsection ChDir Intrinsic (subroutine)
--@cindex ChDir intrinsic
--@cindex intrinsics, ChDir
--
--@noindent
--@example
--CALL ChDir(@var{Dir}, @var{Status})
--@end example
--
--@noindent
--@var{Dir}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets the current working directory to be @var{Dir}.
--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 might 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.
--
--For information on other intrinsics with the same name:
--@xref{ChDir Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node ChDir Intrinsic (function)
--@subsubsection ChDir Intrinsic (function)
--@cindex ChDir intrinsic
--@cindex intrinsics, ChDir
--
--@noindent
--@example
--ChDir(@var{Dir})
--@end example
--
--@noindent
--ChDir: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Dir}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--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 might reopen files by name.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{ChDir Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF2U
--@node ChMod Intrinsic (subroutine)
--@subsubsection ChMod Intrinsic (subroutine)
--@cindex ChMod intrinsic
--@cindex intrinsics, ChMod
--
--@noindent
--@example
--CALL ChMod(@var{Name}, @var{Mode}, @var{Status})
--@end example
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Mode}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Changes the access mode of file @var{Name} according to the
--specification @var{Mode}, which is given in the format of
--@code{chmod(1)}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{Name}---otherwise,
--trailing blanks in @var{Name} are ignored.
--Currently, @var{Name} must not contain the single quote
--character.
--
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--
--Note that this currently works
--by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
--the library was configured) and so might fail in some circumstances and
--will, anyway, be slow.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{ChMod Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node ChMod Intrinsic (function)
--@subsubsection ChMod Intrinsic (function)
--@cindex ChMod intrinsic
--@cindex intrinsics, ChMod
--
--@noindent
--@example
--ChMod(@var{Name}, @var{Mode})
--@end example
--
--@noindent
--ChMod: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Mode}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Changes the access mode of file @var{Name} according to the
--specification @var{Mode}, which is given in the format of
--@code{chmod(1)}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{Name}---otherwise,
--trailing blanks in @var{Name} are ignored.
--Currently, @var{Name} must not contain the single quote
--character.
--
--Returns 0 on success or a non-zero error code otherwise.
--
--Note that this currently works
--by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
--the library was configured) and so might fail in some circumstances and
--will, anyway, be slow.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{ChMod Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF77
--@node CLog Intrinsic
--@subsubsection CLog Intrinsic
--@cindex CLog intrinsic
--@cindex intrinsics, CLog
--
--@noindent
--@example
--CLog(@var{X})
--@end example
--
--@noindent
--CLog: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{LOG()} that is specific
--to one type for @var{X}.
--@xref{Log Intrinsic}.
--
--@node Cmplx Intrinsic
--@subsubsection Cmplx Intrinsic
--@cindex Cmplx intrinsic
--@cindex intrinsics, Cmplx
--
--@noindent
--@example
--Cmplx(@var{X}, @var{Y})
--@end example
--
--@noindent
--Cmplx: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{INTEGER} or @code{REAL}; OPTIONAL (must be omitted if @var{X} is @code{COMPLEX}); scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--If @var{X} is not type @code{COMPLEX},
--constructs a value of type @code{COMPLEX(KIND=1)} from the
--real and imaginary values specified by @var{X} and
--@var{Y}, respectively.
--If @var{Y} is omitted, @samp{0.} is assumed.
--
--If @var{X} is type @code{COMPLEX},
--converts it to type @code{COMPLEX(KIND=1)}.
--
--@xref{Complex Intrinsic}, for information on easily constructing
--a @code{COMPLEX} value of arbitrary precision from @code{REAL}
--arguments.
--
--@end ifset
--@ifset familyGNU
--@node Complex Intrinsic
--@subsubsection Complex Intrinsic
--@cindex Complex intrinsic
--@cindex intrinsics, Complex
--
--@noindent
--@example
--Complex(@var{Real}, @var{Imag})
--@end example
--
--@noindent
--Complex: @code{COMPLEX} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{Real}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--@var{Imag}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{gnu}.
--
--@noindent
--Description:
--
--Returns a @code{COMPLEX} value that has @samp{Real} and @samp{Imag} as its
--real and imaginary parts, respectively.
--
--If @var{Real} and @var{Imag} are the same type, and that type is not
--@code{INTEGER}, no data conversion is performed, and the type of
--the resulting value has the same kind value as the types
--of @var{Real} and @var{Imag}.
--
--If @var{Real} and @var{Imag} are not the same type, the usual type-promotion
--rules are applied to both, converting either or both to the
--appropriate @code{REAL} type.
--The type of the resulting value has the same kind value as the
--type to which both @var{Real} and @var{Imag} were converted, in this case.
--
--If @var{Real} and @var{Imag} are both @code{INTEGER}, they are both converted
--to @code{REAL(KIND=1)}, and the result of the @code{COMPLEX()}
--invocation is type @code{COMPLEX(KIND=1)}.
--
--@emph{Note:} The way to do this in standard Fortran 90
--is too hairy to describe here, but it is important to
--note that @samp{CMPLX(D1,D2)} returns a @code{COMPLEX(KIND=1)}
--result even if @samp{D1} and @samp{D2} are type @code{REAL(KIND=2)}.
--Hence the availability of @code{COMPLEX()} in GNU Fortran.
--
--@end ifset
--@ifset familyF77
--@node Conjg Intrinsic
--@subsubsection Conjg Intrinsic
--@cindex Conjg intrinsic
--@cindex intrinsics, Conjg
--
--@noindent
--@example
--Conjg(@var{Z})
--@end example
--
--@noindent
--Conjg: @code{COMPLEX} function, the @samp{KIND=} value of the type being that of argument @var{Z}.
--
--@noindent
--@var{Z}: @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the complex conjugate:
--
--@example
--COMPLEX(REALPART(@var{Z}), -IMAGPART(@var{Z}))
--@end example
--
--@node Cos Intrinsic
--@subsubsection Cos Intrinsic
--@cindex Cos intrinsic
--@cindex intrinsics, Cos
--
--@noindent
--@example
--Cos(@var{X})
--@end example
--
--@noindent
--Cos: @code{REAL} or @code{COMPLEX} function, the exact type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL} or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the cosine of @var{X}, an angle measured
--in radians.
--
--@xref{ACos Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node CosD Intrinsic
--@subsubsection CosD Intrinsic
--@cindex CosD intrinsic
--@cindex intrinsics, CosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL CosD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node CosH Intrinsic
--@subsubsection CosH Intrinsic
--@cindex CosH intrinsic
--@cindex intrinsics, CosH
--
--@noindent
--@example
--CosH(@var{X})
--@end example
--
--@noindent
--CosH: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the hyperbolic cosine of @var{X}.
--
--@end ifset
--@ifset familyF90
--@node Count Intrinsic
--@subsubsection Count Intrinsic
--@cindex Count intrinsic
--@cindex intrinsics, Count
--
--This intrinsic is not yet implemented.
--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
--
--@noindent
--@example
--CALL CPU_Time(@var{Seconds})
--@end example
--
--@noindent
--@var{Seconds}: @code{REAL}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{f90}.
--
--@noindent
--Description:
--
--Returns in @var{Seconds} the current value of the system time.
--This implementation of the Fortran 95 intrinsic is just an alias for
--@code{second} @xref{Second Intrinsic (subroutine)}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--@node CShift Intrinsic
--@subsubsection CShift Intrinsic
--@cindex CShift intrinsic
--@cindex intrinsics, CShift
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL CShift} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node CSin Intrinsic
--@subsubsection CSin Intrinsic
--@cindex CSin intrinsic
--@cindex intrinsics, CSin
--
--@noindent
--@example
--CSin(@var{X})
--@end example
--
--@noindent
--CSin: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SIN()} that is specific
--to one type for @var{X}.
--@xref{Sin Intrinsic}.
--
--@node CSqRt Intrinsic
--@subsubsection CSqRt Intrinsic
--@cindex CSqRt intrinsic
--@cindex intrinsics, CSqRt
--
--@noindent
--@example
--CSqRt(@var{X})
--@end example
--
--@noindent
--CSqRt: @code{COMPLEX(KIND=1)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SQRT()} that is specific
--to one type for @var{X}.
--@xref{SqRt Intrinsic}.
--
--@end ifset
--@ifset familyF2U
--@node CTime Intrinsic (subroutine)
--@subsubsection CTime Intrinsic (subroutine)
--@cindex CTime intrinsic
--@cindex intrinsics, CTime
--
--@noindent
--@example
--CALL CTime(@var{STime}, @var{Result})
--@end example
--
--@noindent
--@var{STime}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Result}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Converts @var{STime}, a system time value, such as returned by
--@code{TIME8()}, to a string of the form @samp{Sat Aug 19 18:13:14 1995},
--and returns that string in @var{Result}.
--
--@xref{Time8 Intrinsic}.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{CTime Intrinsic (function)}.
--
--@node CTime Intrinsic (function)
--@subsubsection CTime Intrinsic (function)
--@cindex CTime intrinsic
--@cindex intrinsics, CTime
--
--@noindent
--@example
--CTime(@var{STime})
--@end example
--
--@noindent
--CTime: @code{CHARACTER*(*)} function.
--
--@noindent
--@var{STime}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Converts @var{STime}, a system time value, such as returned by
--@code{TIME8()}, to a string of the form @samp{Sat Aug 19 18:13:14 1995},
--and returns that string as the function value.
--
--@xref{Time8 Intrinsic}.
--
--For information on other intrinsics with the same name:
--@xref{CTime Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF77
--@node DAbs Intrinsic
--@subsubsection DAbs Intrinsic
--@cindex DAbs intrinsic
--@cindex intrinsics, DAbs
--
--@noindent
--@example
--DAbs(@var{A})
--@end example
--
--@noindent
--DAbs: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ABS()} that is specific
--to one type for @var{A}.
--@xref{Abs Intrinsic}.
--
--@node DACos Intrinsic
--@subsubsection DACos Intrinsic
--@cindex DACos intrinsic
--@cindex intrinsics, DACos
--
--@noindent
--@example
--DACos(@var{X})
--@end example
--
--@noindent
--DACos: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ACOS()} that is specific
--to one type for @var{X}.
--@xref{ACos Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DACosD Intrinsic
--@subsubsection DACosD Intrinsic
--@cindex DACosD intrinsic
--@cindex intrinsics, DACosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DACosD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DASin Intrinsic
--@subsubsection DASin Intrinsic
--@cindex DASin intrinsic
--@cindex intrinsics, DASin
--
--@noindent
--@example
--DASin(@var{X})
--@end example
--
--@noindent
--DASin: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ASIN()} that is specific
--to one type for @var{X}.
--@xref{ASin Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DASinD Intrinsic
--@subsubsection DASinD Intrinsic
--@cindex DASinD intrinsic
--@cindex intrinsics, DASinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DASinD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DATan Intrinsic
--@subsubsection DATan Intrinsic
--@cindex DATan intrinsic
--@cindex intrinsics, DATan
--
--@noindent
--@example
--DATan(@var{X})
--@end example
--
--@noindent
--DATan: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ATAN()} that is specific
--to one type for @var{X}.
--@xref{ATan Intrinsic}.
--
--@node DATan2 Intrinsic
--@subsubsection DATan2 Intrinsic
--@cindex DATan2 intrinsic
--@cindex intrinsics, DATan2
--
--@noindent
--@example
--DATan2(@var{Y}, @var{X})
--@end example
--
--@noindent
--DATan2: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{Y}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ATAN2()} that is specific
--to one type for @var{Y} and @var{X}.
--@xref{ATan2 Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DATan2D Intrinsic
--@subsubsection DATan2D Intrinsic
--@cindex DATan2D intrinsic
--@cindex intrinsics, DATan2D
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DATan2D} to use this name for an
--external procedure.
--
--@node DATanD Intrinsic
--@subsubsection DATanD Intrinsic
--@cindex DATanD intrinsic
--@cindex intrinsics, DATanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DATanD} to use this name for an
--external procedure.
--
--@node Date Intrinsic
--@subsubsection Date Intrinsic
--@cindex Date intrinsic
--@cindex intrinsics, Date
--
--@noindent
--@example
--CALL Date(@var{Date})
--@end example
--
--@noindent
--@var{Date}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{vxt}.
--
--@noindent
--Description:
--
--Returns @var{Date} in the form @samp{@var{dd}-@var{mmm}-@var{yy}},
--representing the numeric day of the month @var{dd}, a three-character
--abbreviation of the month name @var{mmm} and the last two digits of
--the year @var{yy}, e.g.@: @samp{25-Nov-96}.
--
--@cindex Y2K compliance
--@cindex Year 2000 compliance
--This intrinsic is not recommended, due to the year 2000 approaching.
--Therefore, programs making use of this intrinsic
--might not be Year 2000 (Y2K) compliant.
--@xref{CTime Intrinsic (subroutine)}, for information on obtaining more digits
--for the current (or any) date.
--
--@end ifset
--@ifset familyF90
--@node Date_and_Time Intrinsic
--@subsubsection Date_and_Time Intrinsic
--@cindex Date_and_Time intrinsic
--@cindex intrinsics, Date_and_Time
--
--@noindent
--@example
--CALL Date_and_Time(@var{Date}, @var{Time}, @var{Zone}, @var{Values})
--@end example
--
--@noindent
--@var{Date}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--@var{Time}: @code{CHARACTER}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--@var{Zone}: @code{CHARACTER}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--@var{Values}: @code{INTEGER(KIND=1)}; OPTIONAL; DIMENSION(8); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{f90}.
--
--@noindent
--Description:
--
--Returns:
--@table @var
--@item Date
--The date in the form @var{ccyymmdd}: century, year, month and day;
--@item Time
--The time in the form @samp{@var{hhmmss.ss}}: hours, minutes, seconds
--and milliseconds;
--@item Zone
--The difference between local time and UTC (GMT) in the form @var{Shhmm}:
--sign, hours and minutes, e.g.@: @samp{-0500} (winter in New York);
--@item Values
--The year, month of the year, day of the month, time difference in
--minutes from UTC, hour of the day, minutes of the hour, seconds
--of the minute, and milliseconds
--of the second in successive values of the array.
--@end table
--
--@cindex Y10K compliance
--@cindex Year 10000 compliance
--@cindex wraparound, Y10K
--@cindex limits, Y10K
--Programs making use of this intrinsic
--might not be Year 10000 (Y10K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 10000.
--
--On systems where a millisecond timer isn't available, the millisecond
--value is returned as zero.
--
--@end ifset
--@ifset familyF2U
--@node DbesJ0 Intrinsic
--@subsubsection DbesJ0 Intrinsic
--@cindex DbesJ0 intrinsic
--@cindex intrinsics, DbesJ0
--
--@noindent
--@example
--DbesJ0(@var{X})
--@end example
--
--@noindent
--DbesJ0: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESJ0()} that is specific
--to one type for @var{X}.
--@xref{BesJ0 Intrinsic}.
--
--@node DbesJ1 Intrinsic
--@subsubsection DbesJ1 Intrinsic
--@cindex DbesJ1 intrinsic
--@cindex intrinsics, DbesJ1
--
--@noindent
--@example
--DbesJ1(@var{X})
--@end example
--
--@noindent
--DbesJ1: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESJ1()} that is specific
--to one type for @var{X}.
--@xref{BesJ1 Intrinsic}.
--
--@node DbesJN Intrinsic
--@subsubsection DbesJN Intrinsic
--@cindex DbesJN intrinsic
--@cindex intrinsics, DbesJN
--
--@noindent
--@example
--DbesJN(@var{N}, @var{X})
--@end example
--
--@noindent
--DbesJN: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{N}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESJN()} that is specific
--to one type for @var{X}.
--@xref{BesJN Intrinsic}.
--
--@node DbesY0 Intrinsic
--@subsubsection DbesY0 Intrinsic
--@cindex DbesY0 intrinsic
--@cindex intrinsics, DbesY0
--
--@noindent
--@example
--DbesY0(@var{X})
--@end example
--
--@noindent
--DbesY0: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESY0()} that is specific
--to one type for @var{X}.
--@xref{BesY0 Intrinsic}.
--
--@node DbesY1 Intrinsic
--@subsubsection DbesY1 Intrinsic
--@cindex DbesY1 intrinsic
--@cindex intrinsics, DbesY1
--
--@noindent
--@example
--DbesY1(@var{X})
--@end example
--
--@noindent
--DbesY1: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESY1()} that is specific
--to one type for @var{X}.
--@xref{BesY1 Intrinsic}.
--
--@node DbesYN Intrinsic
--@subsubsection DbesYN Intrinsic
--@cindex DbesYN intrinsic
--@cindex intrinsics, DbesYN
--
--@noindent
--@example
--DbesYN(@var{N}, @var{X})
--@end example
--
--@noindent
--DbesYN: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{N}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{BESYN()} that is specific
--to one type for @var{X}.
--@xref{BesYN Intrinsic}.
--
--@end ifset
--@ifset familyF77
--@node Dble Intrinsic
--@subsubsection Dble Intrinsic
--@cindex Dble intrinsic
--@cindex intrinsics, Dble
--
--@noindent
--@example
--Dble(@var{A})
--@end example
--
--@noindent
--Dble: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @var{A} converted to double precision
--(@code{REAL(KIND=2)}).
--If @var{A} is @code{COMPLEX}, the real part of
--@var{A} is used for the conversion
--and the imaginary part disregarded.
--
--@xref{Sngl Intrinsic}, for the function that converts
--to single precision.
--
--@xref{Int Intrinsic}, for the function that converts
--to @code{INTEGER}.
--
--@xref{Complex Intrinsic}, for the function that converts
--to @code{COMPLEX}.
--
--@end ifset
--@ifset familyVXT
--@node DbleQ Intrinsic
--@subsubsection DbleQ Intrinsic
--@cindex DbleQ intrinsic
--@cindex intrinsics, DbleQ
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DbleQ} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyFVZ
--@node DCmplx Intrinsic
--@subsubsection DCmplx Intrinsic
--@cindex DCmplx intrinsic
--@cindex intrinsics, DCmplx
--
--@noindent
--@example
--DCmplx(@var{X}, @var{Y})
--@end example
--
--@noindent
--DCmplx: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{INTEGER} or @code{REAL}; OPTIONAL (must be omitted if @var{X} is @code{COMPLEX}); scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--If @var{X} is not type @code{COMPLEX},
--constructs a value of type @code{COMPLEX(KIND=2)} from the
--real and imaginary values specified by @var{X} and
--@var{Y}, respectively.
--If @var{Y} is omitted, @samp{0D0} is assumed.
--
--If @var{X} is type @code{COMPLEX},
--converts it to type @code{COMPLEX(KIND=2)}.
--
--Although this intrinsic is not standard Fortran,
--it is a popular extension offered by many compilers
--that support @code{DOUBLE COMPLEX}, since it offers
--the easiest way to convert to @code{DOUBLE COMPLEX}
--without using Fortran 90 features (such as the @samp{KIND=}
--argument to the @code{CMPLX()} intrinsic).
--
--(@samp{CMPLX(0D0, 0D0)} returns a single-precision
--@code{COMPLEX} result, as required by standard FORTRAN 77.
--That's why so many compilers provide @code{DCMPLX()}, since
--@samp{DCMPLX(0D0, 0D0)} returns a @code{DOUBLE COMPLEX}
--result.
--Still, @code{DCMPLX()} converts even @code{REAL*16} arguments
--to their @code{REAL*8} equivalents in most dialects of
--Fortran, so neither it nor @code{CMPLX()} allow easy
--construction of arbitrary-precision values without
--potentially forcing a conversion involving extending or
--reducing precision.
--GNU Fortran provides such an intrinsic, called @code{COMPLEX()}.)
--
--@xref{Complex Intrinsic}, for information on easily constructing
--a @code{COMPLEX} value of arbitrary precision from @code{REAL}
--arguments.
--
--@node DConjg Intrinsic
--@subsubsection DConjg Intrinsic
--@cindex DConjg intrinsic
--@cindex intrinsics, DConjg
--
--@noindent
--@example
--DConjg(@var{Z})
--@end example
--
--@noindent
--DConjg: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{Z}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{CONJG()} that is specific
--to one type for @var{Z}.
--@xref{Conjg Intrinsic}.
--
--@end ifset
--@ifset familyF77
--@node DCos Intrinsic
--@subsubsection DCos Intrinsic
--@cindex DCos intrinsic
--@cindex intrinsics, DCos
--
--@noindent
--@example
--DCos(@var{X})
--@end example
--
--@noindent
--DCos: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{COS()} that is specific
--to one type for @var{X}.
--@xref{Cos Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DCosD Intrinsic
--@subsubsection DCosD Intrinsic
--@cindex DCosD intrinsic
--@cindex intrinsics, DCosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DCosD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DCosH Intrinsic
--@subsubsection DCosH Intrinsic
--@cindex DCosH intrinsic
--@cindex intrinsics, DCosH
--
--@noindent
--@example
--DCosH(@var{X})
--@end example
--
--@noindent
--DCosH: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{COSH()} that is specific
--to one type for @var{X}.
--@xref{CosH Intrinsic}.
--
--@node DDiM Intrinsic
--@subsubsection DDiM Intrinsic
--@cindex DDiM intrinsic
--@cindex intrinsics, DDiM
--
--@noindent
--@example
--DDiM(@var{X}, @var{Y})
--@end example
--
--@noindent
--DDiM: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{DIM()} that is specific
--to one type for @var{X} and @var{Y}.
--@xref{DiM Intrinsic}.
--
--@end ifset
--@ifset familyF2U
--@node DErF Intrinsic
--@subsubsection DErF Intrinsic
--@cindex DErF intrinsic
--@cindex intrinsics, DErF
--
--@noindent
--@example
--DErF(@var{X})
--@end example
--
--@noindent
--DErF: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{ERF()} that is specific
--to one type for @var{X}.
--@xref{ErF Intrinsic}.
--
--@node DErFC Intrinsic
--@subsubsection DErFC Intrinsic
--@cindex DErFC intrinsic
--@cindex intrinsics, DErFC
--
--@noindent
--@example
--DErFC(@var{X})
--@end example
--
--@noindent
--DErFC: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{ERFC()} that is specific
--to one type for @var{X}.
--@xref{ErFC Intrinsic}.
--
--@end ifset
--@ifset familyF77
--@node DExp Intrinsic
--@subsubsection DExp Intrinsic
--@cindex DExp intrinsic
--@cindex intrinsics, DExp
--
--@noindent
--@example
--DExp(@var{X})
--@end example
--
--@noindent
--DExp: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{EXP()} that is specific
--to one type for @var{X}.
--@xref{Exp Intrinsic}.
--
--@end ifset
--@ifset familyFVZ
--@node DFloat Intrinsic
--@subsubsection DFloat Intrinsic
--@cindex DFloat intrinsic
--@cindex intrinsics, DFloat
--
--@noindent
--@example
--DFloat(@var{A})
--@end example
--
--@noindent
--DFloat: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{REAL()} that is specific
--to one type for @var{A}.
--@xref{Real Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DFlotI Intrinsic
--@subsubsection DFlotI Intrinsic
--@cindex DFlotI intrinsic
--@cindex intrinsics, DFlotI
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DFlotI} to use this name for an
--external procedure.
--
--@node DFlotJ Intrinsic
--@subsubsection DFlotJ Intrinsic
--@cindex DFlotJ intrinsic
--@cindex intrinsics, DFlotJ
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DFlotJ} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Digits Intrinsic
--@subsubsection Digits Intrinsic
--@cindex Digits intrinsic
--@cindex intrinsics, Digits
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Digits} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DiM Intrinsic
--@subsubsection DiM Intrinsic
--@cindex DiM intrinsic
--@cindex intrinsics, DiM
--
--@noindent
--@example
--DiM(@var{X}, @var{Y})
--@end example
--
--@noindent
--DiM: @code{INTEGER} or @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{X}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{@var{X}-@var{Y}} if @var{X} is greater than
--@var{Y}; otherwise returns zero.
--
--@end ifset
--@ifset familyFVZ
--@node DImag Intrinsic
--@subsubsection DImag Intrinsic
--@cindex DImag intrinsic
--@cindex intrinsics, DImag
--
--@noindent
--@example
--DImag(@var{Z})
--@end example
--
--@noindent
--DImag: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{Z}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{vxt}.
--
--@noindent
--Description:
--
--Archaic form of @code{AIMAG()} that is specific
--to one type for @var{Z}.
--@xref{AImag Intrinsic}.
--
--@end ifset
--@ifset familyF77
--@node DInt Intrinsic
--@subsubsection DInt Intrinsic
--@cindex DInt intrinsic
--@cindex intrinsics, DInt
--
--@noindent
--@example
--DInt(@var{A})
--@end example
--
--@noindent
--DInt: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{AINT()} that is specific
--to one type for @var{A}.
--@xref{AInt Intrinsic}.
--
--@node DLog Intrinsic
--@subsubsection DLog Intrinsic
--@cindex DLog intrinsic
--@cindex intrinsics, DLog
--
--@noindent
--@example
--DLog(@var{X})
--@end example
--
--@noindent
--DLog: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{LOG()} that is specific
--to one type for @var{X}.
--@xref{Log Intrinsic}.
--
--@node DLog10 Intrinsic
--@subsubsection DLog10 Intrinsic
--@cindex DLog10 intrinsic
--@cindex intrinsics, DLog10
--
--@noindent
--@example
--DLog10(@var{X})
--@end example
--
--@noindent
--DLog10: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{LOG10()} that is specific
--to one type for @var{X}.
--@xref{Log10 Intrinsic}.
--
--@node DMax1 Intrinsic
--@subsubsection DMax1 Intrinsic
--@cindex DMax1 intrinsic
--@cindex intrinsics, DMax1
--
--@noindent
--@example
--DMax1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--DMax1: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MAX()} that is specific
--to one type for @var{A}.
--@xref{Max Intrinsic}.
--
--@node DMin1 Intrinsic
--@subsubsection DMin1 Intrinsic
--@cindex DMin1 intrinsic
--@cindex intrinsics, DMin1
--
--@noindent
--@example
--DMin1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--DMin1: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MIN()} that is specific
--to one type for @var{A}.
--@xref{Min Intrinsic}.
--
--@node DMod Intrinsic
--@subsubsection DMod Intrinsic
--@cindex DMod intrinsic
--@cindex intrinsics, DMod
--
--@noindent
--@example
--DMod(@var{A}, @var{P})
--@end example
--
--@noindent
--DMod: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--@var{P}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MOD()} that is specific
--to one type for @var{A}.
--@xref{Mod Intrinsic}.
--
--@node DNInt Intrinsic
--@subsubsection DNInt Intrinsic
--@cindex DNInt intrinsic
--@cindex intrinsics, DNInt
--
--@noindent
--@example
--DNInt(@var{A})
--@end example
--
--@noindent
--DNInt: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ANINT()} that is specific
--to one type for @var{A}.
--@xref{ANInt Intrinsic}.
--
--@end ifset
--@ifset familyF90
--@node Dot_Product Intrinsic
--@subsubsection Dot_Product Intrinsic
--@cindex Dot_Product intrinsic
--@cindex intrinsics, Dot_Product
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Dot_Product} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DProd Intrinsic
--@subsubsection DProd Intrinsic
--@cindex DProd intrinsic
--@cindex intrinsics, DProd
--
--@noindent
--@example
--DProd(@var{X}, @var{Y})
--@end example
--
--@noindent
--DProd: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{DBLE(@var{X})*DBLE(@var{Y})}.
--
--@end ifset
--@ifset familyVXT
--@node DReal Intrinsic
--@subsubsection DReal Intrinsic
--@cindex DReal intrinsic
--@cindex intrinsics, DReal
--
--@noindent
--@example
--DReal(@var{A})
--@end example
--
--@noindent
--DReal: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{vxt}.
--
--@noindent
--Description:
--
--Converts @var{A} to @code{REAL(KIND=2)}.
--
--If @var{A} is type @code{COMPLEX}, its real part
--is converted (if necessary) to @code{REAL(KIND=2)},
--and its imaginary part is disregarded.
--
--Although this intrinsic is not standard Fortran,
--it is a popular extension offered by many compilers
--that support @code{DOUBLE COMPLEX}, since it offers
--the easiest way to extract the real part of a @code{DOUBLE COMPLEX}
--value without using the Fortran 90 @code{REAL()} intrinsic
--in a way that produces a return value inconsistent with
--the way many FORTRAN 77 compilers handle @code{REAL()} of
--a @code{DOUBLE COMPLEX} value.
--
--@xref{RealPart Intrinsic}, for information on a GNU Fortran
--intrinsic that avoids these areas of confusion.
--
--@xref{Dble Intrinsic}, for information on the standard FORTRAN 77
--replacement for @code{DREAL()}.
--
--@xref{REAL() and AIMAG() of Complex}, for more information on
--this issue.
--
--@end ifset
--@ifset familyF77
--@node DSign Intrinsic
--@subsubsection DSign Intrinsic
--@cindex DSign intrinsic
--@cindex intrinsics, DSign
--
--@noindent
--@example
--DSign(@var{A}, @var{B})
--@end example
--
--@noindent
--DSign: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--@var{B}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SIGN()} that is specific
--to one type for @var{A} and @var{B}.
--@xref{Sign Intrinsic}.
--
--@node DSin Intrinsic
--@subsubsection DSin Intrinsic
--@cindex DSin intrinsic
--@cindex intrinsics, DSin
--
--@noindent
--@example
--DSin(@var{X})
--@end example
--
--@noindent
--DSin: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SIN()} that is specific
--to one type for @var{X}.
--@xref{Sin Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DSinD Intrinsic
--@subsubsection DSinD Intrinsic
--@cindex DSinD intrinsic
--@cindex intrinsics, DSinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DSinD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DSinH Intrinsic
--@subsubsection DSinH Intrinsic
--@cindex DSinH intrinsic
--@cindex intrinsics, DSinH
--
--@noindent
--@example
--DSinH(@var{X})
--@end example
--
--@noindent
--DSinH: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SINH()} that is specific
--to one type for @var{X}.
--@xref{SinH Intrinsic}.
--
--@node DSqRt Intrinsic
--@subsubsection DSqRt Intrinsic
--@cindex DSqRt intrinsic
--@cindex intrinsics, DSqRt
--
--@noindent
--@example
--DSqRt(@var{X})
--@end example
--
--@noindent
--DSqRt: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SQRT()} that is specific
--to one type for @var{X}.
--@xref{SqRt Intrinsic}.
--
--@node DTan Intrinsic
--@subsubsection DTan Intrinsic
--@cindex DTan intrinsic
--@cindex intrinsics, DTan
--
--@noindent
--@example
--DTan(@var{X})
--@end example
--
--@noindent
--DTan: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{TAN()} that is specific
--to one type for @var{X}.
--@xref{Tan Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node DTanD Intrinsic
--@subsubsection DTanD Intrinsic
--@cindex DTanD intrinsic
--@cindex intrinsics, DTanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL DTanD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node DTanH Intrinsic
--@subsubsection DTanH Intrinsic
--@cindex DTanH intrinsic
--@cindex intrinsics, DTanH
--
--@noindent
--@example
--DTanH(@var{X})
--@end example
--
--@noindent
--DTanH: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{X}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{TANH()} that is specific
--to one type for @var{X}.
--@xref{TanH Intrinsic}.
--
--@end ifset
--@ifset familyF2U
--@node DTime Intrinsic (subroutine)
--@subsubsection DTime Intrinsic (subroutine)
--@cindex DTime intrinsic
--@cindex intrinsics, DTime
--
--@noindent
--@example
--CALL DTime(@var{TArray}, @var{Result})
--@end example
--
--@noindent
--@var{TArray}: @code{REAL(KIND=1)}; DIMENSION(2); INTENT(OUT).
--
--@noindent
--@var{Result}: @code{REAL(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Initially, return the number of seconds of runtime
--since the start of the process's execution
--in @var{Result},
--and the user and system components of this in @samp{@var{TArray}(1)}
--and @samp{@var{TArray}(2)} respectively.
--The value of @var{Result} is equal to @samp{@var{TArray}(1) + @var{TArray}(2)}.
--
--Subsequent invocations of @samp{DTIME()} set values based on accumulations
--since the previous invocation.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{DTime Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node DTime Intrinsic (function)
--@subsubsection DTime Intrinsic (function)
--@cindex DTime intrinsic
--@cindex intrinsics, DTime
--
--@noindent
--@example
--DTime(@var{TArray})
--@end example
--
--@noindent
--DTime: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{TArray}: @code{REAL(KIND=1)}; DIMENSION(2); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Initially, return the number of seconds of runtime
--since the start of the process's execution
--as the function value,
--and the user and system components of this in @samp{@var{TArray}(1)}
--and @samp{@var{TArray}(2)} respectively.
--The functions' value is equal to @samp{@var{TArray}(1) + @var{TArray}(2)}.
--
--Subsequent invocations of @samp{DTIME()} return values accumulated since the
--previous invocation.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{DTime Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node EOShift Intrinsic
--@subsubsection EOShift Intrinsic
--@cindex EOShift intrinsic
--@cindex intrinsics, EOShift
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL EOShift} to use this name for an
--external procedure.
--
--@node Epsilon Intrinsic
--@subsubsection Epsilon Intrinsic
--@cindex Epsilon intrinsic
--@cindex intrinsics, Epsilon
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Epsilon} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node ErF Intrinsic
--@subsubsection ErF Intrinsic
--@cindex ErF intrinsic
--@cindex intrinsics, ErF
--
--@noindent
--@example
--ErF(@var{X})
--@end example
--
--@noindent
--ErF: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the error function of @var{X}.
--See @code{erf(3m)}, which provides the implementation.
--
--@node ErFC Intrinsic
--@subsubsection ErFC Intrinsic
--@cindex ErFC intrinsic
--@cindex intrinsics, ErFC
--
--@noindent
--@example
--ErFC(@var{X})
--@end example
--
--@noindent
--ErFC: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the complementary error function of @var{X}:
--@samp{ERFC(R) = 1 - ERF(R)} (except that the result might be more
--accurate than explicitly evaluating that formulae would give).
--See @code{erfc(3m)}, which provides the implementation.
--
--@node ETime Intrinsic (subroutine)
--@subsubsection ETime Intrinsic (subroutine)
--@cindex ETime intrinsic
--@cindex intrinsics, ETime
--
--@noindent
--@example
--CALL ETime(@var{TArray}, @var{Result})
--@end example
--
--@noindent
--@var{TArray}: @code{REAL(KIND=1)}; DIMENSION(2); INTENT(OUT).
--
--@noindent
--@var{Result}: @code{REAL(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Return the number of seconds of runtime
--since the start of the process's execution
--in @var{Result},
--and the user and system components of this in @samp{@var{TArray}(1)}
--and @samp{@var{TArray}(2)} respectively.
--The value of @var{Result} is equal to @samp{@var{TArray}(1) + @var{TArray}(2)}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{ETime Intrinsic (function)}.
--
--@node ETime Intrinsic (function)
--@subsubsection ETime Intrinsic (function)
--@cindex ETime intrinsic
--@cindex intrinsics, ETime
--
--@noindent
--@example
--ETime(@var{TArray})
--@end example
--
--@noindent
--ETime: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{TArray}: @code{REAL(KIND=1)}; DIMENSION(2); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Return the number of seconds of runtime
--since the start of the process's execution
--as the function value,
--and the user and system components of this in @samp{@var{TArray}(1)}
--and @samp{@var{TArray}(2)} respectively.
--The functions' value is equal to @samp{@var{TArray}(1) + @var{TArray}(2)}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--For information on other intrinsics with the same name:
--@xref{ETime Intrinsic (subroutine)}.
--
--@node Exit Intrinsic
--@subsubsection Exit Intrinsic
--@cindex Exit intrinsic
--@cindex intrinsics, Exit
--
--@noindent
--@example
--CALL Exit(@var{Status})
--@end example
--
--@noindent
--@var{Status}: @code{INTEGER}; OPTIONAL; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Exit the program with status @var{Status} after closing open Fortran
--I/O units and otherwise behaving as @code{exit(2)}.
--If @var{Status} is omitted the canonical `success' value
--will be returned to the system.
--
--@end ifset
--@ifset familyF77
--@node Exp Intrinsic
--@subsubsection Exp Intrinsic
--@cindex Exp intrinsic
--@cindex intrinsics, Exp
--
--@noindent
--@example
--Exp(@var{X})
--@end example
--
--@noindent
--Exp: @code{REAL} or @code{COMPLEX} function, the exact type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL} or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{@var{e}**@var{X}}, where
--@var{e} is approximately 2.7182818.
--
--@xref{Log Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyF90
--@node Exponent Intrinsic
--@subsubsection Exponent Intrinsic
--@cindex Exponent intrinsic
--@cindex intrinsics, Exponent
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Exponent} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node FDate Intrinsic (subroutine)
--@subsubsection FDate Intrinsic (subroutine)
--@cindex FDate intrinsic
--@cindex intrinsics, FDate
--
--@noindent
--@example
--CALL FDate(@var{Date})
--@end example
--
--@noindent
--@var{Date}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current date (using the same format as @code{CTIME()})
--in @var{Date}.
--
--Equivalent to:
--
--@example
--CALL CTIME(@var{Date}, TIME8())
--@end example
--
--@cindex Y10K compliance
--@cindex Year 10000 compliance
--@cindex wraparound, Y10K
--@cindex limits, Y10K
--Programs making use of this intrinsic
--might not be Year 10000 (Y10K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 10000.
--
--@xref{CTime Intrinsic (subroutine)}.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{FDate Intrinsic (function)}.
--
--@node FDate Intrinsic (function)
--@subsubsection FDate Intrinsic (function)
--@cindex FDate intrinsic
--@cindex intrinsics, FDate
--
--@noindent
--@example
--FDate()
--@end example
--
--@noindent
--FDate: @code{CHARACTER*(*)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current date (using the same format as @code{CTIME()}).
--
--Equivalent to:
--
--@example
--CTIME(TIME8())
--@end example
--
--@cindex Y10K compliance
--@cindex Year 10000 compliance
--@cindex wraparound, Y10K
--@cindex limits, Y10K
--Programs making use of this intrinsic
--might not be Year 10000 (Y10K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 10000.
--
--@xref{CTime Intrinsic (function)}.
--
--For information on other intrinsics with the same name:
--@xref{FDate Intrinsic (subroutine)}.
--
--@node FGet Intrinsic (subroutine)
--@subsubsection FGet Intrinsic (subroutine)
--@cindex FGet intrinsic
--@cindex intrinsics, FGet
--
--@noindent
--@example
--CALL FGet(@var{C}, @var{Status})
--@end example
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Reads a single character into @var{C} in stream mode from unit 5
--(by-passing normal formatted output) using @code{getc(3)}.
--Returns in
--@var{Status} 0 on success, @minus{}1 on end-of-file, and the error code
--from @code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FGet Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node FGet Intrinsic (function)
--@subsubsection FGet Intrinsic (function)
--@cindex FGet intrinsic
--@cindex intrinsics, FGet
--
--@noindent
--@example
--FGet(@var{C})
--@end example
--
--@noindent
--FGet: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Reads a single character into @var{C} in stream mode from unit 5
--(by-passing normal formatted input) using @code{getc(3)}.
--Returns 0 on
--success, @minus{}1 on end-of-file, and the error code from
--@code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FGet Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF2U
--@node FGetC Intrinsic (subroutine)
--@subsubsection FGetC Intrinsic (subroutine)
--@cindex FGetC intrinsic
--@cindex intrinsics, FGetC
--
--@noindent
--@example
--CALL FGetC(@var{Unit}, @var{C}, @var{Status})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Reads a single character into @var{C} in stream mode from unit @var{Unit}
--(by-passing normal formatted output) using @code{getc(3)}.
--Returns in
--@var{Status} 0 on success, @minus{}1 on end-of-file, and the error code from
--@code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FGetC Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node FGetC Intrinsic (function)
--@subsubsection FGetC Intrinsic (function)
--@cindex FGetC intrinsic
--@cindex intrinsics, FGetC
--
--@noindent
--@example
--FGetC(@var{Unit}, @var{C})
--@end example
--
--@noindent
--FGetC: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Reads a single character into @var{C} in stream mode from unit @var{Unit}
--(by-passing normal formatted output) using @code{getc(3)}.
--Returns 0 on
--success, @minus{}1 on end-of-file, and the error code from
--@code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FGetC Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF77
--@node Float Intrinsic
--@subsubsection Float Intrinsic
--@cindex Float intrinsic
--@cindex intrinsics, Float
--
--@noindent
--@example
--Float(@var{A})
--@end example
--
--@noindent
--Float: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{REAL()} that is specific
--to one type for @var{A}.
--@xref{Real Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node FloatI Intrinsic
--@subsubsection FloatI Intrinsic
--@cindex FloatI intrinsic
--@cindex intrinsics, FloatI
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL FloatI} to use this name for an
--external procedure.
--
--@node FloatJ Intrinsic
--@subsubsection FloatJ Intrinsic
--@cindex FloatJ intrinsic
--@cindex intrinsics, FloatJ
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL FloatJ} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Floor Intrinsic
--@subsubsection Floor Intrinsic
--@cindex Floor intrinsic
--@cindex intrinsics, Floor
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Floor} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Flush Intrinsic
--@subsubsection Flush Intrinsic
--@cindex Flush intrinsic
--@cindex intrinsics, Flush
--
--@noindent
--@example
--CALL Flush(@var{Unit})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; OPTIONAL; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Flushes Fortran unit(s) currently open for output.
--Without the optional argument, all such units are flushed,
--otherwise just the unit specified by @var{Unit}.
--
--Some non-GNU implementations of Fortran provide this intrinsic
--as a library procedure that might or might not support the
--(optional) @var{Unit} argument.
--
--@node FNum Intrinsic
--@subsubsection FNum Intrinsic
--@cindex FNum intrinsic
--@cindex intrinsics, FNum
--
--@noindent
--@example
--FNum(@var{Unit})
--@end example
--
--@noindent
--FNum: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the Unix file descriptor number corresponding to the open
--Fortran I/O unit @var{Unit}.
--This could be passed to an interface to C I/O routines.
--
--@node FPut Intrinsic (subroutine)
--@subsubsection FPut Intrinsic (subroutine)
--@cindex FPut intrinsic
--@cindex intrinsics, FPut
--
--@noindent
--@example
--CALL FPut(@var{C}, @var{Status})
--@end example
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Writes the single character @var{C} in stream mode to unit 6
--(by-passing normal formatted output) using @code{putc(3)}.
--Returns in
--@var{Status} 0 on success, the error code from @code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FPut Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node FPut Intrinsic (function)
--@subsubsection FPut Intrinsic (function)
--@cindex FPut intrinsic
--@cindex intrinsics, FPut
--
--@noindent
--@example
--FPut(@var{C})
--@end example
--
--@noindent
--FPut: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Writes the single character @var{C} in stream mode to unit 6
--(by-passing normal formatted output) using @code{getc(3)}.
--Returns 0 on
--success, the error code from @code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FPut Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF2U
--@node FPutC Intrinsic (subroutine)
--@subsubsection FPutC Intrinsic (subroutine)
--@cindex FPutC intrinsic
--@cindex intrinsics, FPutC
--
--@noindent
--@example
--CALL FPutC(@var{Unit}, @var{C}, @var{Status})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Writes the single character @var{Unit} in stream mode to unit 6
--(by-passing normal formatted output) using @code{putc(3)}.
--Returns in
--@var{C} 0 on success, the error code from @code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FPutC Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node FPutC Intrinsic (function)
--@subsubsection FPutC Intrinsic (function)
--@cindex FPutC intrinsic
--@cindex intrinsics, FPutC
--
--@noindent
--@example
--FPutC(@var{Unit}, @var{C})
--@end example
--
--@noindent
--FPutC: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Writes the single character @var{C} in stream mode to unit @var{Unit}
--(by-passing normal formatted output) using @code{putc(3)}.
--Returns 0 on
--success, the error code from @code{ferror(3)} otherwise.
--
--Stream I/O should not be mixed with normal record-oriented (formatted or
--unformatted) I/O on the same unit; the results are unpredictable.
--
--For information on other intrinsics with the same name:
--@xref{FPutC Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Fraction Intrinsic
--@subsubsection Fraction Intrinsic
--@cindex Fraction intrinsic
--@cindex intrinsics, Fraction
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Fraction} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node FSeek Intrinsic
--@subsubsection FSeek Intrinsic
--@cindex FSeek intrinsic
--@cindex intrinsics, FSeek
--
--@noindent
--@example
--CALL FSeek(@var{Unit}, @var{Offset}, @var{Whence}, @var{ErrLab})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Offset}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Whence}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{ErrLab}: @samp{*@var{label}}, where @var{label} is the label
--of an executable statement; OPTIONAL.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Attempts to move Fortran unit @var{Unit} to the specified
--@var{Offset}: absolute offset if @var{Whence}=0; relative to the
--current offset if @var{Whence}=1; relative to the end of the file if
--@var{Whence}=2.
--It branches to label @var{ErrLab} if @var{Unit} is
--not open or if the call otherwise fails.
--
--@node FStat Intrinsic (subroutine)
--@subsubsection FStat Intrinsic (subroutine)
--@cindex FStat intrinsic
--@cindex intrinsics, FStat
--
--@noindent
--@example
--CALL FStat(@var{Unit}, @var{SArray}, @var{Status})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the file open on Fortran I/O unit @var{Unit} and
--places them in the array @var{SArray}.
--The values in this array are
--extracted from the @code{stat} structure as returned by
--@code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--Not all these elements are relevant on all systems.
--If an element is not relevant, it is returned as 0.
--
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{FStat Intrinsic (function)}.
--
--@node FStat Intrinsic (function)
--@subsubsection FStat Intrinsic (function)
--@cindex FStat intrinsic
--@cindex intrinsics, FStat
--
--@noindent
--@example
--FStat(@var{Unit}, @var{SArray})
--@end example
--
--@noindent
--FStat: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the file open on Fortran I/O unit @var{Unit} and
--places them in the array @var{SArray}.
--The values in this array are
--extracted from the @code{stat} structure as returned by
--@code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--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:
--@xref{FStat Intrinsic (subroutine)}.
--
--@node FTell Intrinsic (subroutine)
--@subsubsection FTell Intrinsic (subroutine)
--@cindex FTell intrinsic
--@cindex intrinsics, FTell
--
--@noindent
--@example
--CALL FTell(@var{Unit}, @var{Offset})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Offset}: @code{INTEGER(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets @var{Offset} to the current offset of Fortran unit @var{Unit}
--(or to @minus{}1 if @var{Unit} is not open).
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{FTell Intrinsic (function)}.
--
--@node FTell Intrinsic (function)
--@subsubsection FTell Intrinsic (function)
--@cindex FTell intrinsic
--@cindex intrinsics, FTell
--
--@noindent
--@example
--FTell(@var{Unit})
--@end example
--
--@noindent
--FTell: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current offset of Fortran unit @var{Unit}
--(or @minus{}1 if @var{Unit} is not open).
--
--For information on other intrinsics with the same name:
--@xref{FTell Intrinsic (subroutine)}.
--
--@node GError Intrinsic
--@subsubsection GError Intrinsic
--@cindex GError intrinsic
--@cindex intrinsics, GError
--
--@noindent
--@example
--CALL GError(@var{Message})
--@end example
--
--@noindent
--@var{Message}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the system error message corresponding to the last system
--error (C @code{errno}).
--
--@node GetArg Intrinsic
--@subsubsection GetArg Intrinsic
--@cindex GetArg intrinsic
--@cindex intrinsics, GetArg
--
--@noindent
--@example
--CALL GetArg(@var{Pos}, @var{Value})
--@end example
--
--@noindent
--@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Value}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets @var{Value} to the @var{Pos}-th command-line argument (or to all
--blanks if there are fewer than @var{Value} command-line arguments);
--@code{CALL GETARG(0, @var{value})} sets @var{value} to the name of the
--program (on systems that support this feature).
--
--@xref{IArgC Intrinsic}, for information on how to get the number
--of arguments.
--
--@node GetCWD Intrinsic (subroutine)
--@subsubsection GetCWD Intrinsic (subroutine)
--@cindex GetCWD intrinsic
--@cindex intrinsics, GetCWD
--
--@noindent
--@example
--CALL GetCWD(@var{Name}, @var{Status})
--@end example
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Places the current working directory in @var{Name}.
--If the @var{Status} argument is supplied, it contains 0
--success or a non-zero error code upon return
--(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
--or @code{getwd(3)}).
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{GetCWD Intrinsic (function)}.
--
--@node GetCWD Intrinsic (function)
--@subsubsection GetCWD Intrinsic (function)
--@cindex GetCWD intrinsic
--@cindex intrinsics, GetCWD
--
--@noindent
--@example
--GetCWD(@var{Name})
--@end example
--
--@noindent
--GetCWD: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Places the current working directory in @var{Name}.
--Returns 0 on
--success, otherwise a non-zero error code
--(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
--or @code{getwd(3)}).
--
--For information on other intrinsics with the same name:
--@xref{GetCWD Intrinsic (subroutine)}.
--
--@node GetEnv Intrinsic
--@subsubsection GetEnv Intrinsic
--@cindex GetEnv intrinsic
--@cindex intrinsics, GetEnv
--
--@noindent
--@example
--CALL GetEnv(@var{Name}, @var{Value})
--@end example
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Value}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets @var{Value} to the value of environment variable given by the
--value of @var{Name} (@code{$name} in shell terms) or to blanks if
--@code{$name} has not been set.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{Name}---otherwise,
--trailing blanks in @var{Name} are ignored.
--
--@node GetGId Intrinsic
--@subsubsection GetGId Intrinsic
--@cindex GetGId intrinsic
--@cindex intrinsics, GetGId
--
--@noindent
--@example
--GetGId()
--@end example
--
--@noindent
--GetGId: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the group id for the current process.
--
--@node GetLog Intrinsic
--@subsubsection GetLog Intrinsic
--@cindex GetLog intrinsic
--@cindex intrinsics, GetLog
--
--@noindent
--@example
--CALL GetLog(@var{Login})
--@end example
--
--@noindent
--@var{Login}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--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
--@cindex intrinsics, GetPId
--
--@noindent
--@example
--GetPId()
--@end example
--
--@noindent
--GetPId: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the process id for the current process.
--
--@node GetUId Intrinsic
--@subsubsection GetUId Intrinsic
--@cindex GetUId intrinsic
--@cindex intrinsics, GetUId
--
--@noindent
--@example
--GetUId()
--@end example
--
--@noindent
--GetUId: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the user id for the current process.
--
--@node GMTime Intrinsic
--@subsubsection GMTime Intrinsic
--@cindex GMTime intrinsic
--@cindex intrinsics, GMTime
--
--@noindent
--@example
--CALL GMTime(@var{STime}, @var{TArray})
--@end example
--
--@noindent
--@var{STime}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{TArray}: @code{INTEGER(KIND=1)}; DIMENSION(9); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Given a system time value @var{STime}, fills @var{TArray} with values
--extracted from it appropriate to the GMT time zone using
--@code{gmtime(3)}.
--
--The array elements are as follows:
--
--@enumerate
--@item
--Seconds after the minute, range 0--59 or 0--61 to allow for leap
--seconds
--
--@item
--Minutes after the hour, range 0--59
--
--@item
--Hours past midnight, range 0--23
--
--@item
--Day of month, range 0--31
--
--@item
--Number of months since January, range 0--12
--
--@item
--Years since 1900
--
--@item
--Number of days since Sunday, range 0--6
--
--@item
--Days since January 1
--
--@item
--Daylight savings indicator: positive if daylight savings is in effect,
--zero if not, and negative if the information isn't available.
--@end enumerate
--
--@node HostNm Intrinsic (subroutine)
--@subsubsection HostNm Intrinsic (subroutine)
--@cindex HostNm intrinsic
--@cindex intrinsics, HostNm
--
--@noindent
--@example
--CALL HostNm(@var{Name}, @var{Status})
--@end example
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Fills @var{Name} with the system's host name returned by
--@code{gethostname(2)}.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return
--(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
--
--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.
--
--On some systems (specifically SCO) it might be necessary to link the
--``socket'' library if you call this routine.
--Typically this means adding @samp{-lg2c -lsocket -lm}
--to the @code{g77} command line when linking the program.
--
--For information on other intrinsics with the same name:
--@xref{HostNm Intrinsic (function)}.
--
--@node HostNm Intrinsic (function)
--@subsubsection HostNm Intrinsic (function)
--@cindex HostNm intrinsic
--@cindex intrinsics, HostNm
--
--@noindent
--@example
--HostNm(@var{Name})
--@end example
--
--@noindent
--HostNm: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Fills @var{Name} with the system's host name returned by
--@code{gethostname(2)}, returning 0 on success or a non-zero error code
--(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
--
--On some systems (specifically SCO) it might be necessary to link the
--``socket'' library if you call this routine.
--Typically this means adding @samp{-lg2c -lsocket -lm}
--to the @code{g77} command line when linking the program.
--
--For information on other intrinsics with the same name:
--@xref{HostNm Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Huge Intrinsic
--@subsubsection Huge Intrinsic
--@cindex Huge intrinsic
--@cindex intrinsics, Huge
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Huge} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node IAbs Intrinsic
--@subsubsection IAbs Intrinsic
--@cindex IAbs intrinsic
--@cindex intrinsics, IAbs
--
--@noindent
--@example
--IAbs(@var{A})
--@end example
--
--@noindent
--IAbs: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{ABS()} that is specific
--to one type for @var{A}.
--@xref{Abs Intrinsic}.
--
--@end ifset
--@ifset familyASC
--@node IAChar Intrinsic
--@subsubsection IAChar Intrinsic
--@cindex IAChar intrinsic
--@cindex intrinsics, IAChar
--
--@noindent
--@example
--IAChar(@var{C})
--@end example
--
--@noindent
--IAChar: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}, @code{f90}.
--
--@noindent
--Description:
--
--Returns the code for the ASCII character in the
--first character position of @var{C}.
--
--@xref{AChar Intrinsic}, for the inverse of this function.
--
--@xref{IChar Intrinsic}, for the function corresponding
--to the system's native character set.
--
--@end ifset
--@ifset familyMIL
--@node IAnd Intrinsic
--@subsubsection IAnd Intrinsic
--@cindex IAnd intrinsic
--@cindex intrinsics, IAnd
--
--@noindent
--@example
--IAnd(@var{I}, @var{J})
--@end example
--
--@noindent
--IAnd: @code{INTEGER} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean AND of
--pair of bits in each of @var{I} and @var{J}.
--
--@end ifset
--@ifset familyF2U
--@node IArgC Intrinsic
--@subsubsection IArgC Intrinsic
--@cindex IArgC intrinsic
--@cindex intrinsics, IArgC
--
--@noindent
--@example
--IArgC()
--@end example
--
--@noindent
--IArgC: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the number of command-line arguments.
--
--This count does not include the specification of the program
--name itself.
--
--@end ifset
--@ifset familyMIL
--@node IBClr Intrinsic
--@subsubsection IBClr Intrinsic
--@cindex IBClr intrinsic
--@cindex intrinsics, IBClr
--
--@noindent
--@example
--IBClr(@var{I}, @var{Pos})
--@end example
--
--@noindent
--IBClr: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns the value of @var{I} with bit @var{Pos} cleared (set to
--zero).
--@xref{BTest Intrinsic}, for information on bit positions.
--
--@node IBits Intrinsic
--@subsubsection IBits Intrinsic
--@cindex IBits intrinsic
--@cindex intrinsics, IBits
--
--@noindent
--@example
--IBits(@var{I}, @var{Pos}, @var{Len})
--@end example
--
--@noindent
--IBits: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Len}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Extracts a subfield of length @var{Len} from @var{I}, starting from
--bit position @var{Pos} and extending left for @var{Len} bits.
--The result is right-justified and the remaining bits are zeroed.
--The value
--of @samp{@var{Pos}+@var{Len}} must be less than or equal to the value
--@samp{BIT_SIZE(@var{I})}.
--@xref{Bit_Size Intrinsic}.
--
--@node IBSet Intrinsic
--@subsubsection IBSet Intrinsic
--@cindex IBSet intrinsic
--@cindex intrinsics, IBSet
--
--@noindent
--@example
--IBSet(@var{I}, @var{Pos})
--@end example
--
--@noindent
--IBSet: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Pos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns the value of @var{I} with bit @var{Pos} set (to one).
--@xref{BTest Intrinsic}, for information on bit positions.
--
--@end ifset
--@ifset familyF77
--@node IChar Intrinsic
--@subsubsection IChar Intrinsic
--@cindex IChar intrinsic
--@cindex intrinsics, IChar
--
--@noindent
--@example
--IChar(@var{C})
--@end example
--
--@noindent
--IChar: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{C}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the code for the character in the
--first character position of @var{C}.
--
--Because the system's native character set is used,
--the correspondence between character and their codes
--is not necessarily the same between GNU Fortran
--implementations.
--
--Note that no intrinsic exists to convert a printable
--character string to a numerical value.
--For example, there is no intrinsic that, given
--the @code{CHARACTER} value @samp{'154'}, returns an
--@code{INTEGER} or @code{REAL} value with the value @samp{154}.
--
--Instead, you can use internal-file I/O to do this kind
--of conversion.
--For example:
--
--@smallexample
--INTEGER VALUE
--CHARACTER*10 STRING
--STRING = '154'
--READ (STRING, '(I10)'), VALUE
--PRINT *, VALUE
--END
--@end smallexample
--
--The above program, when run, prints:
--
--@smallexample
-- 154
--@end smallexample
--
--@xref{Char Intrinsic}, for the inverse of the @code{ICHAR} function.
--
--@xref{IAChar Intrinsic}, for the function corresponding
--to the ASCII character set.
--
--@end ifset
--@ifset familyF2U
--@node IDate Intrinsic (UNIX)
--@subsubsection IDate Intrinsic (UNIX)
--@cindex IDate intrinsic
--@cindex intrinsics, IDate
--
--@noindent
--@example
--CALL IDate(@var{TArray})
--@end example
--
--@noindent
--@var{TArray}: @code{INTEGER(KIND=1)}; DIMENSION(3); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Fills @var{TArray} with the numerical values at the current local time
--of day, month (in the range 1--12), and year in elements 1, 2, and 3,
--respectively.
--The year has four significant digits.
--
--@cindex Y10K compliance
--@cindex Year 10000 compliance
--@cindex wraparound, Y10K
--@cindex limits, Y10K
--Programs making use of this intrinsic
--might not be Year 10000 (Y10K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 10000.
--
--For information on other intrinsics with the same name:
--@xref{IDate Intrinsic (VXT)}.
--
--@end ifset
--@ifset familyVXT
--@node IDate Intrinsic (VXT)
--@subsubsection IDate Intrinsic (VXT)
--@cindex IDate intrinsic
--@cindex intrinsics, IDate
--
--@noindent
--@example
--CALL IDate(@var{M}, @var{D}, @var{Y})
--@end example
--
--@noindent
--@var{M}: @code{INTEGER(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--@var{D}: @code{INTEGER(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--@var{Y}: @code{INTEGER(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{vxt}.
--
--@noindent
--Description:
--
--Returns the numerical values of the current local time.
--The month (in the range 1--12) is returned in @var{M},
--the day (in the range 1--7) in @var{D},
--and the year in @var{Y} (in the range 0--99).
--
--@cindex Y2K compliance
--@cindex Year 2000 compliance
--@cindex wraparound, Y2K
--@cindex limits, Y2K
--This intrinsic is not recommended, due to the year 2000 approaching.
--Therefore, programs making use of this intrinsic
--might not be Year 2000 (Y2K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 2000.
--
--@xref{IDate Intrinsic (UNIX)}, for information on obtaining more digits
--for the current date.
--
--For information on other intrinsics with the same name:
--@xref{IDate Intrinsic (UNIX)}.
--
--@end ifset
--@ifset familyF77
--@node IDiM Intrinsic
--@subsubsection IDiM Intrinsic
--@cindex IDiM intrinsic
--@cindex intrinsics, IDiM
--
--@noindent
--@example
--IDiM(@var{X}, @var{Y})
--@end example
--
--@noindent
--IDiM: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{X}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{Y}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{DIM()} that is specific
--to one type for @var{X} and @var{Y}.
--@xref{DiM Intrinsic}.
--
--@node IDInt Intrinsic
--@subsubsection IDInt Intrinsic
--@cindex IDInt intrinsic
--@cindex intrinsics, IDInt
--
--@noindent
--@example
--IDInt(@var{A})
--@end example
--
--@noindent
--IDInt: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{INT()} that is specific
--to one type for @var{A}.
--@xref{Int Intrinsic}.
--
--@node IDNInt Intrinsic
--@subsubsection IDNInt Intrinsic
--@cindex IDNInt intrinsic
--@cindex intrinsics, IDNInt
--
--@noindent
--@example
--IDNInt(@var{A})
--@end example
--
--@noindent
--IDNInt: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{NINT()} that is specific
--to one type for @var{A}.
--@xref{NInt Intrinsic}.
--
--@end ifset
--@ifset familyMIL
--@node IEOr Intrinsic
--@subsubsection IEOr Intrinsic
--@cindex IEOr intrinsic
--@cindex intrinsics, IEOr
--
--@noindent
--@example
--IEOr(@var{I}, @var{J})
--@end example
--
--@noindent
--IEOr: @code{INTEGER} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean exclusive-OR of
--pair of bits in each of @var{I} and @var{J}.
--
--@end ifset
--@ifset familyF2U
--@node IErrNo Intrinsic
--@subsubsection IErrNo Intrinsic
--@cindex IErrNo intrinsic
--@cindex intrinsics, IErrNo
--
--@noindent
--@example
--IErrNo()
--@end example
--
--@noindent
--IErrNo: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the last system error number (corresponding to the C
--@code{errno}).
--
--@end ifset
--@ifset familyF77
--@node IFix Intrinsic
--@subsubsection IFix Intrinsic
--@cindex IFix intrinsic
--@cindex intrinsics, IFix
--
--@noindent
--@example
--IFix(@var{A})
--@end example
--
--@noindent
--IFix: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{INT()} that is specific
--to one type for @var{A}.
--@xref{Int Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node IIAbs Intrinsic
--@subsubsection IIAbs Intrinsic
--@cindex IIAbs intrinsic
--@cindex intrinsics, IIAbs
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIAbs} to use this name for an
--external procedure.
--
--@node IIAnd Intrinsic
--@subsubsection IIAnd Intrinsic
--@cindex IIAnd intrinsic
--@cindex intrinsics, IIAnd
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIAnd} to use this name for an
--external procedure.
--
--@node IIBClr Intrinsic
--@subsubsection IIBClr Intrinsic
--@cindex IIBClr intrinsic
--@cindex intrinsics, IIBClr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIBClr} to use this name for an
--external procedure.
--
--@node IIBits Intrinsic
--@subsubsection IIBits Intrinsic
--@cindex IIBits intrinsic
--@cindex intrinsics, IIBits
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIBits} to use this name for an
--external procedure.
--
--@node IIBSet Intrinsic
--@subsubsection IIBSet Intrinsic
--@cindex IIBSet intrinsic
--@cindex intrinsics, IIBSet
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIBSet} to use this name for an
--external procedure.
--
--@node IIDiM Intrinsic
--@subsubsection IIDiM Intrinsic
--@cindex IIDiM intrinsic
--@cindex intrinsics, IIDiM
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIDiM} to use this name for an
--external procedure.
--
--@node IIDInt Intrinsic
--@subsubsection IIDInt Intrinsic
--@cindex IIDInt intrinsic
--@cindex intrinsics, IIDInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIDInt} to use this name for an
--external procedure.
--
--@node IIDNnt Intrinsic
--@subsubsection IIDNnt Intrinsic
--@cindex IIDNnt intrinsic
--@cindex intrinsics, IIDNnt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIDNnt} to use this name for an
--external procedure.
--
--@node IIEOr Intrinsic
--@subsubsection IIEOr Intrinsic
--@cindex IIEOr intrinsic
--@cindex intrinsics, IIEOr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIEOr} to use this name for an
--external procedure.
--
--@node IIFix Intrinsic
--@subsubsection IIFix Intrinsic
--@cindex IIFix intrinsic
--@cindex intrinsics, IIFix
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIFix} to use this name for an
--external procedure.
--
--@node IInt Intrinsic
--@subsubsection IInt Intrinsic
--@cindex IInt intrinsic
--@cindex intrinsics, IInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IInt} to use this name for an
--external procedure.
--
--@node IIOr Intrinsic
--@subsubsection IIOr Intrinsic
--@cindex IIOr intrinsic
--@cindex intrinsics, IIOr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIOr} to use this name for an
--external procedure.
--
--@node IIQint Intrinsic
--@subsubsection IIQint Intrinsic
--@cindex IIQint intrinsic
--@cindex intrinsics, IIQint
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIQint} to use this name for an
--external procedure.
--
--@node IIQNnt Intrinsic
--@subsubsection IIQNnt Intrinsic
--@cindex IIQNnt intrinsic
--@cindex intrinsics, IIQNnt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIQNnt} to use this name for an
--external procedure.
--
--@node IIShftC Intrinsic
--@subsubsection IIShftC Intrinsic
--@cindex IIShftC intrinsic
--@cindex intrinsics, IIShftC
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IIShftC} to use this name for an
--external procedure.
--
--@node IISign Intrinsic
--@subsubsection IISign Intrinsic
--@cindex IISign intrinsic
--@cindex intrinsics, IISign
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IISign} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2C
--@node Imag Intrinsic
--@subsubsection Imag Intrinsic
--@cindex Imag intrinsic
--@cindex intrinsics, Imag
--
--@noindent
--@example
--Imag(@var{Z})
--@end example
--
--@noindent
--Imag: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{Z}.
--
--@noindent
--@var{Z}: @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--The imaginary part of @var{Z} is returned, without conversion.
--
--@emph{Note:} The way to do this in standard Fortran 90
--is @samp{AIMAG(@var{Z})}.
--However, when, for example, @var{Z} is @code{DOUBLE COMPLEX},
--@samp{AIMAG(@var{Z})} means something different for some compilers
--that are not true Fortran 90 compilers but offer some
--extensions standardized by Fortran 90 (such as the
--@code{DOUBLE COMPLEX} type, also known as @code{COMPLEX(KIND=2)}).
--
--The advantage of @code{IMAG()} is that, while not necessarily
--more or less portable than @code{AIMAG()}, it is more likely to
--cause a compiler that doesn't support it to produce a diagnostic
--than generate incorrect code.
--
--@xref{REAL() and AIMAG() of Complex}, for more information.
--
--@end ifset
--@ifset familyGNU
--@node ImagPart Intrinsic
--@subsubsection ImagPart Intrinsic
--@cindex ImagPart intrinsic
--@cindex intrinsics, ImagPart
--
--@noindent
--@example
--ImagPart(@var{Z})
--@end example
--
--@noindent
--ImagPart: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{Z}.
--
--@noindent
--@var{Z}: @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{gnu}.
--
--@noindent
--Description:
--
--The imaginary part of @var{Z} is returned, without conversion.
--
--@emph{Note:} The way to do this in standard Fortran 90
--is @samp{AIMAG(@var{Z})}.
--However, when, for example, @var{Z} is @code{DOUBLE COMPLEX},
--@samp{AIMAG(@var{Z})} means something different for some compilers
--that are not true Fortran 90 compilers but offer some
--extensions standardized by Fortran 90 (such as the
--@code{DOUBLE COMPLEX} type, also known as @code{COMPLEX(KIND=2)}).
--
--The advantage of @code{IMAGPART()} is that, while not necessarily
--more or less portable than @code{AIMAG()}, it is more likely to
--cause a compiler that doesn't support it to produce a diagnostic
--than generate incorrect code.
--
--@xref{REAL() and AIMAG() of Complex}, for more information.
--
--@end ifset
--@ifset familyVXT
--@node IMax0 Intrinsic
--@subsubsection IMax0 Intrinsic
--@cindex IMax0 intrinsic
--@cindex intrinsics, IMax0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IMax0} to use this name for an
--external procedure.
--
--@node IMax1 Intrinsic
--@subsubsection IMax1 Intrinsic
--@cindex IMax1 intrinsic
--@cindex intrinsics, IMax1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IMax1} to use this name for an
--external procedure.
--
--@node IMin0 Intrinsic
--@subsubsection IMin0 Intrinsic
--@cindex IMin0 intrinsic
--@cindex intrinsics, IMin0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IMin0} to use this name for an
--external procedure.
--
--@node IMin1 Intrinsic
--@subsubsection IMin1 Intrinsic
--@cindex IMin1 intrinsic
--@cindex intrinsics, IMin1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IMin1} to use this name for an
--external procedure.
--
--@node IMod Intrinsic
--@subsubsection IMod Intrinsic
--@cindex IMod intrinsic
--@cindex intrinsics, IMod
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IMod} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Index Intrinsic
--@subsubsection Index Intrinsic
--@cindex Index intrinsic
--@cindex intrinsics, Index
--
--@noindent
--@example
--Index(@var{String}, @var{Substring})
--@end example
--
--@noindent
--Index: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{String}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Substring}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the position of the start of the first occurrence of string
--@var{Substring} as a substring in @var{String}, counting from one.
--If @var{Substring} doesn't occur in @var{String}, zero is returned.
--
--@end ifset
--@ifset familyVXT
--@node INInt Intrinsic
--@subsubsection INInt Intrinsic
--@cindex INInt intrinsic
--@cindex intrinsics, INInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL INInt} to use this name for an
--external procedure.
--
--@node INot Intrinsic
--@subsubsection INot Intrinsic
--@cindex INot intrinsic
--@cindex intrinsics, INot
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL INot} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Int Intrinsic
--@subsubsection Int Intrinsic
--@cindex Int intrinsic
--@cindex intrinsics, Int
--
--@noindent
--@example
--Int(@var{A})
--@end example
--
--@noindent
--Int: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude truncated and its sign preserved, converted
--to type @code{INTEGER(KIND=1)}.
--
--If @var{A} is type @code{COMPLEX}, its real part is
--truncated and converted, and its imaginary part is disregarded.
--
--@xref{NInt Intrinsic}, for how to convert, rounded to nearest
--whole number.
--
--@xref{AInt Intrinsic}, for how to truncate to whole number
--without converting.
--
--@end ifset
--@ifset familyGNU
--@node Int2 Intrinsic
--@subsubsection Int2 Intrinsic
--@cindex Int2 intrinsic
--@cindex intrinsics, Int2
--
--@noindent
--@example
--Int2(@var{A})
--@end example
--
--@noindent
--Int2: @code{INTEGER(KIND=6)} function.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{gnu}.
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude truncated and its sign preserved, converted
--to type @code{INTEGER(KIND=6)}.
--
--If @var{A} is type @code{COMPLEX}, its real part
--is truncated and converted, and its imaginary part is disgregarded.
--
--@xref{Int Intrinsic}.
--
--The precise meaning of this intrinsic might change
--in a future version of the GNU Fortran language,
--as more is learned about how it is used.
--
--@node Int8 Intrinsic
--@subsubsection Int8 Intrinsic
--@cindex Int8 intrinsic
--@cindex intrinsics, Int8
--
--@noindent
--@example
--Int8(@var{A})
--@end example
--
--@noindent
--Int8: @code{INTEGER(KIND=2)} function.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{gnu}.
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude truncated and its sign preserved, converted
--to type @code{INTEGER(KIND=2)}.
--
--If @var{A} is type @code{COMPLEX}, its real part
--is truncated and converted, and its imaginary part is disgregarded.
--
--@xref{Int Intrinsic}.
--
--The precise meaning of this intrinsic might change
--in a future version of the GNU Fortran language,
--as more is learned about how it is used.
--
--@end ifset
--@ifset familyMIL
--@node IOr Intrinsic
--@subsubsection IOr Intrinsic
--@cindex IOr intrinsic
--@cindex intrinsics, IOr
--
--@noindent
--@example
--IOr(@var{I}, @var{J})
--@end example
--
--@noindent
--IOr: @code{INTEGER} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean OR of
--pair of bits in each of @var{I} and @var{J}.
--
--@end ifset
--@ifset familyF2U
--@node IRand Intrinsic
--@subsubsection IRand Intrinsic
--@cindex IRand intrinsic
--@cindex intrinsics, IRand
--
--@noindent
--@example
--IRand(@var{Flag})
--@end example
--
--@noindent
--IRand: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Flag}: @code{INTEGER}; OPTIONAL; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns a uniform quasi-random number up to a system-dependent limit.
--If @var{Flag} is 0, the next number in sequence is returned; if
--@var{Flag} is 1, the generator is restarted by calling the UNIX function
--@samp{srand(0)}; if @var{Flag} has any other value,
--it is used as a new seed with @code{srand()}.
--
--@xref{SRand Intrinsic}.
--
--@emph{Note:} As typically implemented (by the routine of the same
--name in the C library), this random number generator is a very poor
--one, though the BSD and GNU libraries provide a much better
--implementation than the `traditional' one.
--On a different system you almost certainly want to use something better.
--
--@node IsaTty Intrinsic
--@subsubsection IsaTty Intrinsic
--@cindex IsaTty intrinsic
--@cindex intrinsics, IsaTty
--
--@noindent
--@example
--IsaTty(@var{Unit})
--@end example
--
--@noindent
--IsaTty: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns @code{.TRUE.} if and only if the Fortran I/O unit
--specified by @var{Unit} is connected
--to a terminal device.
--See @code{isatty(3)}.
--
--@end ifset
--@ifset familyMIL
--@node IShft Intrinsic
--@subsubsection IShft Intrinsic
--@cindex IShft intrinsic
--@cindex intrinsics, IShft
--
--@noindent
--@example
--IShft(@var{I}, @var{Shift})
--@end example
--
--@noindent
--IShft: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Shift}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--All bits representing @var{I} are shifted @var{Shift} places.
--@samp{@var{Shift}.GT.0} indicates a left shift, @samp{@var{Shift}.EQ.0}
--indicates no shift and @samp{@var{Shift}.LT.0} indicates a right shift.
--If the absolute value of the shift count is greater than
--@samp{BIT_SIZE(@var{I})}, the result is undefined.
--Bits shifted out from the left end or the right end are lost.
--Zeros are shifted in from the opposite end.
--
--@xref{IShftC Intrinsic}, for the circular-shift equivalent.
--
--@node IShftC Intrinsic
--@subsubsection IShftC Intrinsic
--@cindex IShftC intrinsic
--@cindex intrinsics, IShftC
--
--@noindent
--@example
--IShftC(@var{I}, @var{Shift}, @var{Size})
--@end example
--
--@noindent
--IShftC: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Shift}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Size}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--The rightmost @var{Size} bits of the argument @var{I}
--are shifted circularly @var{Shift}
--places, i.e.@: the bits shifted out of one end are shifted into
--the opposite end.
--No bits are lost.
--The unshifted bits of the result are the same as
--the unshifted bits of @var{I}.
--The absolute value of the argument @var{Shift}
--must be less than or equal to @var{Size}.
--The value of @var{Size} must be greater than or equal to one and less than
--or equal to @samp{BIT_SIZE(@var{I})}.
--
--@xref{IShft Intrinsic}, for the logical shift equivalent.
--
--@end ifset
--@ifset familyF77
--@node ISign Intrinsic
--@subsubsection ISign Intrinsic
--@cindex ISign intrinsic
--@cindex intrinsics, ISign
--
--@noindent
--@example
--ISign(@var{A}, @var{B})
--@end example
--
--@noindent
--ISign: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{B}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{SIGN()} that is specific
--to one type for @var{A} and @var{B}.
--@xref{Sign Intrinsic}.
--
--@end ifset
--@ifset familyF2U
--@node ITime Intrinsic
--@subsubsection ITime Intrinsic
--@cindex ITime intrinsic
--@cindex intrinsics, ITime
--
--@noindent
--@example
--CALL ITime(@var{TArray})
--@end example
--
--@noindent
--@var{TArray}: @code{INTEGER(KIND=1)}; DIMENSION(3); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current local time hour, minutes, and seconds in elements
--1, 2, and 3 of @var{TArray}, respectively.
--
--@end ifset
--@ifset familyVXT
--@node IZExt Intrinsic
--@subsubsection IZExt Intrinsic
--@cindex IZExt intrinsic
--@cindex intrinsics, IZExt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL IZExt} to use this name for an
--external procedure.
--
--@node JIAbs Intrinsic
--@subsubsection JIAbs Intrinsic
--@cindex JIAbs intrinsic
--@cindex intrinsics, JIAbs
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIAbs} to use this name for an
--external procedure.
--
--@node JIAnd Intrinsic
--@subsubsection JIAnd Intrinsic
--@cindex JIAnd intrinsic
--@cindex intrinsics, JIAnd
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIAnd} to use this name for an
--external procedure.
--
--@node JIBClr Intrinsic
--@subsubsection JIBClr Intrinsic
--@cindex JIBClr intrinsic
--@cindex intrinsics, JIBClr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIBClr} to use this name for an
--external procedure.
--
--@node JIBits Intrinsic
--@subsubsection JIBits Intrinsic
--@cindex JIBits intrinsic
--@cindex intrinsics, JIBits
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIBits} to use this name for an
--external procedure.
--
--@node JIBSet Intrinsic
--@subsubsection JIBSet Intrinsic
--@cindex JIBSet intrinsic
--@cindex intrinsics, JIBSet
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIBSet} to use this name for an
--external procedure.
--
--@node JIDiM Intrinsic
--@subsubsection JIDiM Intrinsic
--@cindex JIDiM intrinsic
--@cindex intrinsics, JIDiM
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIDiM} to use this name for an
--external procedure.
--
--@node JIDInt Intrinsic
--@subsubsection JIDInt Intrinsic
--@cindex JIDInt intrinsic
--@cindex intrinsics, JIDInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIDInt} to use this name for an
--external procedure.
--
--@node JIDNnt Intrinsic
--@subsubsection JIDNnt Intrinsic
--@cindex JIDNnt intrinsic
--@cindex intrinsics, JIDNnt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIDNnt} to use this name for an
--external procedure.
--
--@node JIEOr Intrinsic
--@subsubsection JIEOr Intrinsic
--@cindex JIEOr intrinsic
--@cindex intrinsics, JIEOr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIEOr} to use this name for an
--external procedure.
--
--@node JIFix Intrinsic
--@subsubsection JIFix Intrinsic
--@cindex JIFix intrinsic
--@cindex intrinsics, JIFix
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIFix} to use this name for an
--external procedure.
--
--@node JInt Intrinsic
--@subsubsection JInt Intrinsic
--@cindex JInt intrinsic
--@cindex intrinsics, JInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JInt} to use this name for an
--external procedure.
--
--@node JIOr Intrinsic
--@subsubsection JIOr Intrinsic
--@cindex JIOr intrinsic
--@cindex intrinsics, JIOr
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIOr} to use this name for an
--external procedure.
--
--@node JIQint Intrinsic
--@subsubsection JIQint Intrinsic
--@cindex JIQint intrinsic
--@cindex intrinsics, JIQint
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIQint} to use this name for an
--external procedure.
--
--@node JIQNnt Intrinsic
--@subsubsection JIQNnt Intrinsic
--@cindex JIQNnt intrinsic
--@cindex intrinsics, JIQNnt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIQNnt} to use this name for an
--external procedure.
--
--@node JIShft Intrinsic
--@subsubsection JIShft Intrinsic
--@cindex JIShft intrinsic
--@cindex intrinsics, JIShft
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIShft} to use this name for an
--external procedure.
--
--@node JIShftC Intrinsic
--@subsubsection JIShftC Intrinsic
--@cindex JIShftC intrinsic
--@cindex intrinsics, JIShftC
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JIShftC} to use this name for an
--external procedure.
--
--@node JISign Intrinsic
--@subsubsection JISign Intrinsic
--@cindex JISign intrinsic
--@cindex intrinsics, JISign
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JISign} to use this name for an
--external procedure.
--
--@node JMax0 Intrinsic
--@subsubsection JMax0 Intrinsic
--@cindex JMax0 intrinsic
--@cindex intrinsics, JMax0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JMax0} to use this name for an
--external procedure.
--
--@node JMax1 Intrinsic
--@subsubsection JMax1 Intrinsic
--@cindex JMax1 intrinsic
--@cindex intrinsics, JMax1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JMax1} to use this name for an
--external procedure.
--
--@node JMin0 Intrinsic
--@subsubsection JMin0 Intrinsic
--@cindex JMin0 intrinsic
--@cindex intrinsics, JMin0
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JMin0} to use this name for an
--external procedure.
--
--@node JMin1 Intrinsic
--@subsubsection JMin1 Intrinsic
--@cindex JMin1 intrinsic
--@cindex intrinsics, JMin1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JMin1} to use this name for an
--external procedure.
--
--@node JMod Intrinsic
--@subsubsection JMod Intrinsic
--@cindex JMod intrinsic
--@cindex intrinsics, JMod
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JMod} to use this name for an
--external procedure.
--
--@node JNInt Intrinsic
--@subsubsection JNInt Intrinsic
--@cindex JNInt intrinsic
--@cindex intrinsics, JNInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JNInt} to use this name for an
--external procedure.
--
--@node JNot Intrinsic
--@subsubsection JNot Intrinsic
--@cindex JNot intrinsic
--@cindex intrinsics, JNot
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JNot} to use this name for an
--external procedure.
--
--@node JZExt Intrinsic
--@subsubsection JZExt Intrinsic
--@cindex JZExt intrinsic
--@cindex intrinsics, JZExt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL JZExt} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Kill Intrinsic (subroutine)
--@subsubsection Kill Intrinsic (subroutine)
--@cindex Kill intrinsic
--@cindex intrinsics, Kill
--
--@noindent
--@example
--CALL Kill(@var{Pid}, @var{Signal}, @var{Status})
--@end example
--
--@noindent
--@var{Pid}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Signal}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sends the signal specified by @var{Signal} to the process @var{Pid}.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--See @code{kill(2)}.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{Kill Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node Kill Intrinsic (function)
--@subsubsection Kill Intrinsic (function)
--@cindex Kill intrinsic
--@cindex intrinsics, Kill
--
--@noindent
--@example
--Kill(@var{Pid}, @var{Signal})
--@end example
--
--@noindent
--Kill: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Pid}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Signal}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Sends the signal specified by @var{Signal} to the process @var{Pid}.
--Returns 0 on success or a non-zero error code.
--See @code{kill(2)}.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{Kill Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Kind Intrinsic
--@subsubsection Kind Intrinsic
--@cindex Kind intrinsic
--@cindex intrinsics, Kind
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Kind} to use this name for an
--external procedure.
--
--@node LBound Intrinsic
--@subsubsection LBound Intrinsic
--@cindex LBound intrinsic
--@cindex intrinsics, LBound
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL LBound} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Len Intrinsic
--@subsubsection Len Intrinsic
--@cindex Len intrinsic
--@cindex intrinsics, Len
--
--@noindent
--@example
--Len(@var{String})
--@end example
--
--@noindent
--Len: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{String}: @code{CHARACTER}; scalar.
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the length of @var{String}.
--
--If @var{String} is an array, the length of an element
--of @var{String} is returned.
--
--Note that @var{String} need not be defined when this
--intrinsic is invoked, since only the length, not
--the content, of @var{String} is needed.
--
--@xref{Bit_Size Intrinsic}, for the function that determines
--the size of its argument in bits.
--
--@end ifset
--@ifset familyF90
--@node Len_Trim Intrinsic
--@subsubsection Len_Trim Intrinsic
--@cindex Len_Trim intrinsic
--@cindex intrinsics, Len_Trim
--
--@noindent
--@example
--Len_Trim(@var{String})
--@end example
--
--@noindent
--Len_Trim: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{String}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f90}.
--
--@noindent
--Description:
--
--Returns the index of the last non-blank character in @var{String}.
--@code{LNBLNK} and @code{LEN_TRIM} are equivalent.
--
--@end ifset
--@ifset familyF77
--@node LGe Intrinsic
--@subsubsection LGe Intrinsic
--@cindex LGe intrinsic
--@cindex intrinsics, LGe
--
--@noindent
--@example
--LGe(@var{String_A}, @var{String_B})
--@end example
--
--@noindent
--LGe: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{String_A}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{String_B}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{.TRUE.} if @samp{@var{String_A}.GE.@var{String_B}},
--@samp{.FALSE.} otherwise.
--@var{String_A} and @var{String_B} are interpreted as containing
--ASCII character codes.
--If either value contains a character not in the ASCII
--character set, the result is processor dependent.
--
--If the @var{String_A} and @var{String_B} are not the same length,
--the shorter is compared as if spaces were appended to
--it to form a value that has the same length as the longer.
--
--The lexical comparison intrinsics @code{LGe}, @code{LGt},
--@code{LLe}, and @code{LLt} differ from the corresponding
--intrinsic operators @code{.GE.}, @code{.GT.},
--@code{.LE.}, @code{.LT.}.
--Because the ASCII collating sequence is assumed,
--the following expressions always return @samp{.TRUE.}:
--
--@smallexample
--LGE ('0', ' ')
--LGE ('A', '0')
--LGE ('a', 'A')
--@end smallexample
--
--The following related expressions do @emph{not} always
--return @samp{.TRUE.}, as they are not necessarily evaluated
--assuming the arguments use ASCII encoding:
--
--@smallexample
--'0' .GE. ' '
--'A' .GE. '0'
--'a' .GE. 'A'
--@end smallexample
--
--The same difference exists
--between @code{LGt} and @code{.GT.};
--between @code{LLe} and @code{.LE.}; and
--between @code{LLt} and @code{.LT.}.
--
--@node LGt Intrinsic
--@subsubsection LGt Intrinsic
--@cindex LGt intrinsic
--@cindex intrinsics, LGt
--
--@noindent
--@example
--LGt(@var{String_A}, @var{String_B})
--@end example
--
--@noindent
--LGt: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{String_A}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{String_B}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{.TRUE.} if @samp{@var{String_A}.GT.@var{String_B}},
--@samp{.FALSE.} otherwise.
--@var{String_A} and @var{String_B} are interpreted as containing
--ASCII character codes.
--If either value contains a character not in the ASCII
--character set, the result is processor dependent.
--
--If the @var{String_A} and @var{String_B} are not the same length,
--the shorter is compared as if spaces were appended to
--it to form a value that has the same length as the longer.
--
--@xref{LGe Intrinsic}, for information on the distinction
--between the @code{LGT} intrinsic and the @code{.GT.}
--operator.
--
--@end ifset
--@ifset familyF2U
--@node Link Intrinsic (subroutine)
--@subsubsection Link Intrinsic (subroutine)
--@cindex Link intrinsic
--@cindex intrinsics, Link
--
--@noindent
--@example
--CALL Link(@var{Path1}, @var{Path2}, @var{Status})
--@end example
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Makes a (hard) link from file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--See @code{link(2)}.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{Link Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node Link Intrinsic (function)
--@subsubsection Link Intrinsic (function)
--@cindex Link intrinsic
--@cindex intrinsics, Link
--
--@noindent
--@example
--Link(@var{Path1}, @var{Path2})
--@end example
--
--@noindent
--Link: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Makes a (hard) link from file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--Returns 0 on success or a non-zero error code.
--See @code{link(2)}.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{Link Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF77
--@node LLe Intrinsic
--@subsubsection LLe Intrinsic
--@cindex LLe intrinsic
--@cindex intrinsics, LLe
--
--@noindent
--@example
--LLe(@var{String_A}, @var{String_B})
--@end example
--
--@noindent
--LLe: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{String_A}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{String_B}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{.TRUE.} if @samp{@var{String_A}.LE.@var{String_B}},
--@samp{.FALSE.} otherwise.
--@var{String_A} and @var{String_B} are interpreted as containing
--ASCII character codes.
--If either value contains a character not in the ASCII
--character set, the result is processor dependent.
--
--If the @var{String_A} and @var{String_B} are not the same length,
--the shorter is compared as if spaces were appended to
--it to form a value that has the same length as the longer.
--
--@xref{LGe Intrinsic}, for information on the distinction
--between the @code{LLE} intrinsic and the @code{.LE.}
--operator.
--
--@node LLt Intrinsic
--@subsubsection LLt Intrinsic
--@cindex LLt intrinsic
--@cindex intrinsics, LLt
--
--@noindent
--@example
--LLt(@var{String_A}, @var{String_B})
--@end example
--
--@noindent
--LLt: @code{LOGICAL(KIND=1)} function.
--
--@noindent
--@var{String_A}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{String_B}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{.TRUE.} if @samp{@var{String_A}.LT.@var{String_B}},
--@samp{.FALSE.} otherwise.
--@var{String_A} and @var{String_B} are interpreted as containing
--ASCII character codes.
--If either value contains a character not in the ASCII
--character set, the result is processor dependent.
--
--If the @var{String_A} and @var{String_B} are not the same length,
--the shorter is compared as if spaces were appended to
--it to form a value that has the same length as the longer.
--
--@xref{LGe Intrinsic}, for information on the distinction
--between the @code{LLT} intrinsic and the @code{.LT.}
--operator.
--
--@end ifset
--@ifset familyF2U
--@node LnBlnk Intrinsic
--@subsubsection LnBlnk Intrinsic
--@cindex LnBlnk intrinsic
--@cindex intrinsics, LnBlnk
--
--@noindent
--@example
--LnBlnk(@var{String})
--@end example
--
--@noindent
--LnBlnk: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{String}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the index of the last non-blank character in @var{String}.
--@code{LNBLNK} and @code{LEN_TRIM} are equivalent.
--
--@node Loc Intrinsic
--@subsubsection Loc Intrinsic
--@cindex Loc intrinsic
--@cindex intrinsics, Loc
--
--@noindent
--@example
--Loc(@var{Entity})
--@end example
--
--@noindent
--Loc: @code{INTEGER(KIND=7)} function.
--
--@noindent
--@var{Entity}: Any type; cannot be a constant or expression.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--The @code{LOC()} intrinsic works the
--same way as the @code{%LOC()} construct.
--@xref{%LOC(),,The @code{%LOC()} Construct}, for
--more information.
--
--@end ifset
--@ifset familyF77
--@node Log Intrinsic
--@subsubsection Log Intrinsic
--@cindex Log intrinsic
--@cindex intrinsics, Log
--
--@noindent
--@example
--Log(@var{X})
--@end example
--
--@noindent
--Log: @code{REAL} or @code{COMPLEX} function, the exact type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL} or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the natural logarithm of @var{X}, which must
--be greater than zero or, if type @code{COMPLEX}, must not
--be zero.
--
--@xref{Exp Intrinsic}, for the inverse of this function.
--
--@xref{Log10 Intrinsic}, for the `common' (base-10) logarithm function.
--
--@node Log10 Intrinsic
--@subsubsection Log10 Intrinsic
--@cindex Log10 intrinsic
--@cindex intrinsics, Log10
--
--@noindent
--@example
--Log10(@var{X})
--@end example
--
--@noindent
--Log10: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the common logarithm (base 10) of @var{X}, which must
--be greater than zero.
--
--The inverse of this function is @samp{10. ** LOG10(@var{X})}.
--
--@xref{Log Intrinsic}, for the natural logarithm function.
--
--@end ifset
--@ifset familyF90
--@node Logical Intrinsic
--@subsubsection Logical Intrinsic
--@cindex Logical intrinsic
--@cindex intrinsics, Logical
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Logical} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Long Intrinsic
--@subsubsection Long Intrinsic
--@cindex Long intrinsic
--@cindex intrinsics, Long
--
--@noindent
--@example
--Long(@var{A})
--@end example
--
--@noindent
--Long: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=6)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Archaic form of @code{INT()} that is specific
--to one type for @var{A}.
--@xref{Int Intrinsic}.
--
--The precise meaning of this intrinsic might change
--in a future version of the GNU Fortran language,
--as more is learned about how it is used.
--
--@end ifset
--@ifset familyF2C
--@node LShift Intrinsic
--@subsubsection LShift Intrinsic
--@cindex LShift intrinsic
--@cindex intrinsics, LShift
--
--@noindent
--@example
--LShift(@var{I}, @var{Shift})
--@end example
--
--@noindent
--LShift: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Shift}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Returns @var{I} shifted to the left
--@var{Shift} bits.
--
--Although similar to the expression
--@samp{@var{I}*(2**@var{Shift})}, there
--are important differences.
--For example, the sign of the result is
--not necessarily the same as the sign of
--@var{I}.
--
--Currently this intrinsic is defined assuming
--the underlying representation of @var{I}
--is as a two's-complement integer.
--It is unclear at this point whether that
--definition will apply when a different
--representation is involved.
--
--@xref{LShift Intrinsic}, for the inverse of this function.
--
--@xref{IShft Intrinsic}, for information
--on a more widely available left-shifting
--intrinsic that is also more precisely defined.
--
--@end ifset
--@ifset familyF2U
--@node LStat Intrinsic (subroutine)
--@subsubsection LStat Intrinsic (subroutine)
--@cindex LStat intrinsic
--@cindex intrinsics, LStat
--
--@noindent
--@example
--CALL LStat(@var{File}, @var{SArray}, @var{Status})
--@end example
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the given file @var{File} and places them in the array
--@var{SArray}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--If @var{File} is a symbolic link it returns data on the
--link itself, so the routine is available only on systems that support
--symbolic links.
--The values in this array are extracted from the
--@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--Not all these elements are relevant on all systems.
--If an element is not relevant, it is returned as 0.
--
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return
--(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{LStat Intrinsic (function)}.
--
--@node LStat Intrinsic (function)
--@subsubsection LStat Intrinsic (function)
--@cindex LStat intrinsic
--@cindex intrinsics, LStat
--
--@noindent
--@example
--LStat(@var{File}, @var{SArray})
--@end example
--
--@noindent
--LStat: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the given file @var{File} and places them in the array
--@var{SArray}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--If @var{File} is a symbolic link it returns data on the
--link itself, so the routine is available only on systems that support
--symbolic links.
--The values in this array are extracted from the
--@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--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
--(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
--
--For information on other intrinsics with the same name:
--@xref{LStat Intrinsic (subroutine)}.
--
--@node LTime Intrinsic
--@subsubsection LTime Intrinsic
--@cindex LTime intrinsic
--@cindex intrinsics, LTime
--
--@noindent
--@example
--CALL LTime(@var{STime}, @var{TArray})
--@end example
--
--@noindent
--@var{STime}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--@var{TArray}: @code{INTEGER(KIND=1)}; DIMENSION(9); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Given a system time value @var{STime}, fills @var{TArray} with values
--extracted from it appropriate to the GMT time zone using
--@code{localtime(3)}.
--
--The array elements are as follows:
--
--@enumerate
--@item
--Seconds after the minute, range 0--59 or 0--61 to allow for leap
--seconds
--
--@item
--Minutes after the hour, range 0--59
--
--@item
--Hours past midnight, range 0--23
--
--@item
--Day of month, range 0--31
--
--@item
--Number of months since January, range 0--12
--
--@item
--Years since 1900
--
--@item
--Number of days since Sunday, range 0--6
--
--@item
--Days since January 1
--
--@item
--Daylight savings indicator: positive if daylight savings is in effect,
--zero if not, and negative if the information isn't available.
--@end enumerate
--
--@end ifset
--@ifset familyF90
--@node MatMul Intrinsic
--@subsubsection MatMul Intrinsic
--@cindex MatMul intrinsic
--@cindex intrinsics, MatMul
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MatMul} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Max Intrinsic
--@subsubsection Max Intrinsic
--@cindex Max intrinsic
--@cindex intrinsics, Max
--
--@noindent
--@example
--Max(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Max: @code{INTEGER} or @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{A}: @code{INTEGER} or @code{REAL}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the argument with the largest value.
--
--@xref{Min Intrinsic}, for the opposite function.
--
--@node Max0 Intrinsic
--@subsubsection Max0 Intrinsic
--@cindex Max0 intrinsic
--@cindex intrinsics, Max0
--
--@noindent
--@example
--Max0(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Max0: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MAX()} that is specific
--to one type for @var{A}.
--@xref{Max Intrinsic}.
--
--@node Max1 Intrinsic
--@subsubsection Max1 Intrinsic
--@cindex Max1 intrinsic
--@cindex intrinsics, Max1
--
--@noindent
--@example
--Max1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Max1: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MAX()} that is specific
--to one type for @var{A} and a different return type.
--@xref{Max Intrinsic}.
--
--@end ifset
--@ifset familyF90
--@node MaxExponent Intrinsic
--@subsubsection MaxExponent Intrinsic
--@cindex MaxExponent intrinsic
--@cindex intrinsics, MaxExponent
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MaxExponent} to use this name for an
--external procedure.
--
--@node MaxLoc Intrinsic
--@subsubsection MaxLoc Intrinsic
--@cindex MaxLoc intrinsic
--@cindex intrinsics, MaxLoc
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MaxLoc} to use this name for an
--external procedure.
--
--@node MaxVal Intrinsic
--@subsubsection MaxVal Intrinsic
--@cindex MaxVal intrinsic
--@cindex intrinsics, MaxVal
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MaxVal} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node MClock Intrinsic
--@subsubsection MClock Intrinsic
--@cindex MClock intrinsic
--@cindex intrinsics, MClock
--
--@noindent
--@example
--MClock()
--@end example
--
--@noindent
--MClock: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the number of clock ticks since the start of the process.
--Supported on systems with @code{clock(3)} (q.v.).
--
--@cindex wraparound, timings
--@cindex limits, timings
--This intrinsic is not fully portable, such as to systems
--with 32-bit @code{INTEGER} types but supporting times
--wider than 32 bits.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--@xref{MClock8 Intrinsic}, for information on a
--similar intrinsic that might be portable to more
--GNU Fortran implementations, though to fewer
--Fortran compilers.
--
--If the system does not support @code{clock(3)},
---1 is returned.
--
--@node MClock8 Intrinsic
--@subsubsection MClock8 Intrinsic
--@cindex MClock8 intrinsic
--@cindex intrinsics, MClock8
--
--@noindent
--@example
--MClock8()
--@end example
--
--@noindent
--MClock8: @code{INTEGER(KIND=2)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the number of clock ticks since the start of the process.
--Supported on systems with @code{clock(3)} (q.v.).
--
--@cindex wraparound, timings
--@cindex limits, timings
--@emph{Warning:} this intrinsic does not increase the range
--of the timing values over that returned by @code{clock(3)}.
--On a system with a 32-bit @code{clock(3)},
--@code{MCLOCK8} will return a 32-bit value,
--even though converted to an @samp{INTEGER(KIND=2)} value.
--That means overflows of the 32-bit value can still occur.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--No Fortran implementations other than GNU Fortran are
--known to support this intrinsic at the time of this
--writing.
--@xref{MClock Intrinsic}, for information on a
--similar intrinsic that might be portable to more Fortran
--compilers, though to fewer GNU Fortran implementations.
--
--If the system does not support @code{clock(3)},
---1 is returned.
--
--@end ifset
--@ifset familyF90
--@node Merge Intrinsic
--@subsubsection Merge Intrinsic
--@cindex Merge intrinsic
--@cindex intrinsics, Merge
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Merge} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Min Intrinsic
--@subsubsection Min Intrinsic
--@cindex Min intrinsic
--@cindex intrinsics, Min
--
--@noindent
--@example
--Min(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Min: @code{INTEGER} or @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{A}: @code{INTEGER} or @code{REAL}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the argument with the smallest value.
--
--@xref{Max Intrinsic}, for the opposite function.
--
--@node Min0 Intrinsic
--@subsubsection Min0 Intrinsic
--@cindex Min0 intrinsic
--@cindex intrinsics, Min0
--
--@noindent
--@example
--Min0(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Min0: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{INTEGER(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MIN()} that is specific
--to one type for @var{A}.
--@xref{Min Intrinsic}.
--
--@node Min1 Intrinsic
--@subsubsection Min1 Intrinsic
--@cindex Min1 intrinsic
--@cindex intrinsics, Min1
--
--@noindent
--@example
--Min1(@var{A}-1, @var{A}-2, @dots{}, @var{A}-n)
--@end example
--
--@noindent
--Min1: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=1)}; at least two such arguments must be provided; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{MIN()} that is specific
--to one type for @var{A} and a different return type.
--@xref{Min Intrinsic}.
--
--@end ifset
--@ifset familyF90
--@node MinExponent Intrinsic
--@subsubsection MinExponent Intrinsic
--@cindex MinExponent intrinsic
--@cindex intrinsics, MinExponent
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MinExponent} to use this name for an
--external procedure.
--
--@node MinLoc Intrinsic
--@subsubsection MinLoc Intrinsic
--@cindex MinLoc intrinsic
--@cindex intrinsics, MinLoc
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MinLoc} to use this name for an
--external procedure.
--
--@node MinVal Intrinsic
--@subsubsection MinVal Intrinsic
--@cindex MinVal intrinsic
--@cindex intrinsics, MinVal
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL MinVal} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Mod Intrinsic
--@subsubsection Mod Intrinsic
--@cindex Mod intrinsic
--@cindex intrinsics, Mod
--
--@noindent
--@example
--Mod(@var{A}, @var{P})
--@end example
--
--@noindent
--Mod: @code{INTEGER} or @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{A}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--@var{P}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns remainder calculated as:
--
--@smallexample
--@var{A} - (INT(@var{A} / @var{P}) * @var{P})
--@end smallexample
--
--@var{P} must not be zero.
--
--@end ifset
--@ifset familyF90
--@node Modulo Intrinsic
--@subsubsection Modulo Intrinsic
--@cindex Modulo intrinsic
--@cindex intrinsics, Modulo
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Modulo} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyMIL
--@node MvBits Intrinsic
--@subsubsection MvBits Intrinsic
--@cindex MvBits intrinsic
--@cindex intrinsics, MvBits
--
--@noindent
--@example
--CALL MvBits(@var{From}, @var{FromPos}, @var{Len}, @var{TO}, @var{ToPos})
--@end example
--
--@noindent
--@var{From}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{FromPos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Len}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{TO}: @code{INTEGER} with same @samp{KIND=} value as for @var{From}; scalar; INTENT(INOUT).
--
--@noindent
--@var{ToPos}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Moves @var{Len} bits from positions @var{FromPos} through
--@samp{@var{FromPos}+@var{Len}-1} of @var{From} to positions @var{ToPos} through
--@samp{@var{FromPos}+@var{Len}-1} of @var{TO}. The portion of argument
--@var{TO} not affected by the movement of bits is unchanged. Arguments
--@var{From} and @var{TO} are permitted to be the same numeric storage
--unit. The values of @samp{@var{FromPos}+@var{Len}} and
--@samp{@var{ToPos}+@var{Len}} must be less than or equal to
--@samp{BIT_SIZE(@var{From})}.
--
--@end ifset
--@ifset familyF90
--@node Nearest Intrinsic
--@subsubsection Nearest Intrinsic
--@cindex Nearest intrinsic
--@cindex intrinsics, Nearest
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Nearest} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node NInt Intrinsic
--@subsubsection NInt Intrinsic
--@cindex NInt intrinsic
--@cindex intrinsics, NInt
--
--@noindent
--@example
--NInt(@var{A})
--@end example
--
--@noindent
--NInt: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude eliminated by rounding to the nearest whole
--number and with its sign preserved, converted
--to type @code{INTEGER(KIND=1)}.
--
--If @var{A} is type @code{COMPLEX}, its real part is
--rounded and converted.
--
--A fractional portion exactly equal to
--@samp{.5} is rounded to the whole number that
--is larger in magnitude.
--(Also called ``Fortran round''.)
--
--@xref{Int Intrinsic}, for how to convert, truncate to
--whole number.
--
--@xref{ANInt Intrinsic}, for how to round to nearest whole number
--without converting.
--
--@end ifset
--@ifset familyMIL
--@node Not Intrinsic
--@subsubsection Not Intrinsic
--@cindex Not intrinsic
--@cindex intrinsics, Not
--
--@noindent
--@example
--Not(@var{I})
--@end example
--
--@noindent
--Not: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{mil}, @code{f90}, @code{vxt}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean NOT of each bit
--in @var{I}.
--
--@end ifset
--@ifset familyF2C
--@node Or Intrinsic
--@subsubsection Or Intrinsic
--@cindex Or intrinsic
--@cindex intrinsics, Or
--
--@noindent
--@example
--Or(@var{I}, @var{J})
--@end example
--
--@noindent
--Or: @code{INTEGER} or @code{LOGICAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean OR of
--pair of bits in each of @var{I} and @var{J}.
--
--@end ifset
--@ifset familyF90
--@node Pack Intrinsic
--@subsubsection Pack Intrinsic
--@cindex Pack intrinsic
--@cindex intrinsics, Pack
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Pack} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node PError Intrinsic
--@subsubsection PError Intrinsic
--@cindex PError intrinsic
--@cindex intrinsics, PError
--
--@noindent
--@example
--CALL PError(@var{String})
--@end example
--
--@noindent
--@var{String}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Prints (on the C @code{stderr} stream) a newline-terminated error
--message corresponding to the last system error.
--This is prefixed by @var{String}, a colon and a space.
--See @code{perror(3)}.
--
--@end ifset
--@ifset familyF90
--@node Precision Intrinsic
--@subsubsection Precision Intrinsic
--@cindex Precision intrinsic
--@cindex intrinsics, Precision
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Precision} to use this name for an
--external procedure.
--
--@node Present Intrinsic
--@subsubsection Present Intrinsic
--@cindex Present intrinsic
--@cindex intrinsics, Present
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Present} to use this name for an
--external procedure.
--
--@node Product Intrinsic
--@subsubsection Product Intrinsic
--@cindex Product intrinsic
--@cindex intrinsics, Product
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Product} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyVXT
--@node QAbs Intrinsic
--@subsubsection QAbs Intrinsic
--@cindex QAbs intrinsic
--@cindex intrinsics, QAbs
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QAbs} to use this name for an
--external procedure.
--
--@node QACos Intrinsic
--@subsubsection QACos Intrinsic
--@cindex QACos intrinsic
--@cindex intrinsics, QACos
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QACos} to use this name for an
--external procedure.
--
--@node QACosD Intrinsic
--@subsubsection QACosD Intrinsic
--@cindex QACosD intrinsic
--@cindex intrinsics, QACosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QACosD} to use this name for an
--external procedure.
--
--@node QASin Intrinsic
--@subsubsection QASin Intrinsic
--@cindex QASin intrinsic
--@cindex intrinsics, QASin
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QASin} to use this name for an
--external procedure.
--
--@node QASinD Intrinsic
--@subsubsection QASinD Intrinsic
--@cindex QASinD intrinsic
--@cindex intrinsics, QASinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QASinD} to use this name for an
--external procedure.
--
--@node QATan Intrinsic
--@subsubsection QATan Intrinsic
--@cindex QATan intrinsic
--@cindex intrinsics, QATan
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QATan} to use this name for an
--external procedure.
--
--@node QATan2 Intrinsic
--@subsubsection QATan2 Intrinsic
--@cindex QATan2 intrinsic
--@cindex intrinsics, QATan2
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QATan2} to use this name for an
--external procedure.
--
--@node QATan2D Intrinsic
--@subsubsection QATan2D Intrinsic
--@cindex QATan2D intrinsic
--@cindex intrinsics, QATan2D
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QATan2D} to use this name for an
--external procedure.
--
--@node QATanD Intrinsic
--@subsubsection QATanD Intrinsic
--@cindex QATanD intrinsic
--@cindex intrinsics, QATanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QATanD} to use this name for an
--external procedure.
--
--@node QCos Intrinsic
--@subsubsection QCos Intrinsic
--@cindex QCos intrinsic
--@cindex intrinsics, QCos
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QCos} to use this name for an
--external procedure.
--
--@node QCosD Intrinsic
--@subsubsection QCosD Intrinsic
--@cindex QCosD intrinsic
--@cindex intrinsics, QCosD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QCosD} to use this name for an
--external procedure.
--
--@node QCosH Intrinsic
--@subsubsection QCosH Intrinsic
--@cindex QCosH intrinsic
--@cindex intrinsics, QCosH
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QCosH} to use this name for an
--external procedure.
--
--@node QDiM Intrinsic
--@subsubsection QDiM Intrinsic
--@cindex QDiM intrinsic
--@cindex intrinsics, QDiM
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QDiM} to use this name for an
--external procedure.
--
--@node QExp Intrinsic
--@subsubsection QExp Intrinsic
--@cindex QExp intrinsic
--@cindex intrinsics, QExp
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QExp} to use this name for an
--external procedure.
--
--@node QExt Intrinsic
--@subsubsection QExt Intrinsic
--@cindex QExt intrinsic
--@cindex intrinsics, QExt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QExt} to use this name for an
--external procedure.
--
--@node QExtD Intrinsic
--@subsubsection QExtD Intrinsic
--@cindex QExtD intrinsic
--@cindex intrinsics, QExtD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QExtD} to use this name for an
--external procedure.
--
--@node QFloat Intrinsic
--@subsubsection QFloat Intrinsic
--@cindex QFloat intrinsic
--@cindex intrinsics, QFloat
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QFloat} to use this name for an
--external procedure.
--
--@node QInt Intrinsic
--@subsubsection QInt Intrinsic
--@cindex QInt intrinsic
--@cindex intrinsics, QInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QInt} to use this name for an
--external procedure.
--
--@node QLog Intrinsic
--@subsubsection QLog Intrinsic
--@cindex QLog intrinsic
--@cindex intrinsics, QLog
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QLog} to use this name for an
--external procedure.
--
--@node QLog10 Intrinsic
--@subsubsection QLog10 Intrinsic
--@cindex QLog10 intrinsic
--@cindex intrinsics, QLog10
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QLog10} to use this name for an
--external procedure.
--
--@node QMax1 Intrinsic
--@subsubsection QMax1 Intrinsic
--@cindex QMax1 intrinsic
--@cindex intrinsics, QMax1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QMax1} to use this name for an
--external procedure.
--
--@node QMin1 Intrinsic
--@subsubsection QMin1 Intrinsic
--@cindex QMin1 intrinsic
--@cindex intrinsics, QMin1
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QMin1} to use this name for an
--external procedure.
--
--@node QMod Intrinsic
--@subsubsection QMod Intrinsic
--@cindex QMod intrinsic
--@cindex intrinsics, QMod
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QMod} to use this name for an
--external procedure.
--
--@node QNInt Intrinsic
--@subsubsection QNInt Intrinsic
--@cindex QNInt intrinsic
--@cindex intrinsics, QNInt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QNInt} to use this name for an
--external procedure.
--
--@node QSin Intrinsic
--@subsubsection QSin Intrinsic
--@cindex QSin intrinsic
--@cindex intrinsics, QSin
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QSin} to use this name for an
--external procedure.
--
--@node QSinD Intrinsic
--@subsubsection QSinD Intrinsic
--@cindex QSinD intrinsic
--@cindex intrinsics, QSinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QSinD} to use this name for an
--external procedure.
--
--@node QSinH Intrinsic
--@subsubsection QSinH Intrinsic
--@cindex QSinH intrinsic
--@cindex intrinsics, QSinH
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QSinH} to use this name for an
--external procedure.
--
--@node QSqRt Intrinsic
--@subsubsection QSqRt Intrinsic
--@cindex QSqRt intrinsic
--@cindex intrinsics, QSqRt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QSqRt} to use this name for an
--external procedure.
--
--@node QTan Intrinsic
--@subsubsection QTan Intrinsic
--@cindex QTan intrinsic
--@cindex intrinsics, QTan
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QTan} to use this name for an
--external procedure.
--
--@node QTanD Intrinsic
--@subsubsection QTanD Intrinsic
--@cindex QTanD intrinsic
--@cindex intrinsics, QTanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QTanD} to use this name for an
--external procedure.
--
--@node QTanH Intrinsic
--@subsubsection QTanH Intrinsic
--@cindex QTanH intrinsic
--@cindex intrinsics, QTanH
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL QTanH} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Radix Intrinsic
--@subsubsection Radix Intrinsic
--@cindex Radix intrinsic
--@cindex intrinsics, Radix
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Radix} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Rand Intrinsic
--@subsubsection Rand Intrinsic
--@cindex Rand intrinsic
--@cindex intrinsics, Rand
--
--@noindent
--@example
--Rand(@var{Flag})
--@end example
--
--@noindent
--Rand: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{Flag}: @code{INTEGER}; OPTIONAL; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns a uniform quasi-random number between 0 and 1.
--If @var{Flag} is 0, the next number in sequence is returned; if
--@var{Flag} is 1, the generator is restarted by calling @samp{srand(0)};
--if @var{Flag} has any other value, it is used as a new seed with
--@code{srand}.
--
--@xref{SRand Intrinsic}.
--
--@emph{Note:} As typically implemented (by the routine of the same
--name in the C library), this random number generator is a very poor
--one, though the BSD and GNU libraries provide a much better
--implementation than the `traditional' one.
--On a different system you
--almost certainly want to use something better.
--
--@end ifset
--@ifset familyF90
--@node Random_Number Intrinsic
--@subsubsection Random_Number Intrinsic
--@cindex Random_Number intrinsic
--@cindex intrinsics, Random_Number
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Random_Number} to use this name for an
--external procedure.
--
--@node Random_Seed Intrinsic
--@subsubsection Random_Seed Intrinsic
--@cindex Random_Seed intrinsic
--@cindex intrinsics, Random_Seed
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Random_Seed} to use this name for an
--external procedure.
--
--@node Range Intrinsic
--@subsubsection Range Intrinsic
--@cindex Range intrinsic
--@cindex intrinsics, Range
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Range} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node Real Intrinsic
--@subsubsection Real Intrinsic
--@cindex Real intrinsic
--@cindex intrinsics, Real
--
--@noindent
--@example
--Real(@var{A})
--@end example
--
--@noindent
--Real: @code{REAL} function.
--The exact type is @samp{REAL(KIND=1)} when argument @var{A} is
--any type other than @code{COMPLEX}, or when it is @code{COMPLEX(KIND=1)}.
--When @var{A} is any @code{COMPLEX} type other than @code{COMPLEX(KIND=1)},
--this intrinsic is valid only when used as the argument to
--@code{REAL()}, as explained below.
--
--@noindent
--@var{A}: @code{INTEGER}, @code{REAL}, or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Converts @var{A} to @code{REAL(KIND=1)}.
--
--Use of @code{REAL()} with a @code{COMPLEX} argument
--(other than @code{COMPLEX(KIND=1)}) is restricted to the following case:
--
--@example
--REAL(REAL(A))
--@end example
--
--@noindent
--This expression converts the real part of A to
--@code{REAL(KIND=1)}.
--
--@xref{RealPart Intrinsic}, for information on a GNU Fortran
--intrinsic that extracts the real part of an arbitrary
--@code{COMPLEX} value.
--
--@xref{REAL() and AIMAG() of Complex}, for more information.
--
--@end ifset
--@ifset familyGNU
--@node RealPart Intrinsic
--@subsubsection RealPart Intrinsic
--@cindex RealPart intrinsic
--@cindex intrinsics, RealPart
--
--@noindent
--@example
--RealPart(@var{Z})
--@end example
--
--@noindent
--RealPart: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{Z}.
--
--@noindent
--@var{Z}: @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{gnu}.
--
--@noindent
--Description:
--
--The real part of @var{Z} is returned, without conversion.
--
--@emph{Note:} The way to do this in standard Fortran 90
--is @samp{REAL(@var{Z})}.
--However, when, for example, @var{Z} is @code{COMPLEX(KIND=2)},
--@samp{REAL(@var{Z})} means something different for some compilers
--that are not true Fortran 90 compilers but offer some
--extensions standardized by Fortran 90 (such as the
--@code{DOUBLE COMPLEX} type, also known as @code{COMPLEX(KIND=2)}).
--
--The advantage of @code{REALPART()} is that, while not necessarily
--more or less portable than @code{REAL()}, it is more likely to
--cause a compiler that doesn't support it to produce a diagnostic
--than generate incorrect code.
--
--@xref{REAL() and AIMAG() of Complex}, for more information.
--
--@end ifset
--@ifset familyF2U
--@node Rename Intrinsic (subroutine)
--@subsubsection Rename Intrinsic (subroutine)
--@cindex Rename intrinsic
--@cindex intrinsics, Rename
--
--@noindent
--@example
--CALL Rename(@var{Path1}, @var{Path2}, @var{Status})
--@end example
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Renames the file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--See @code{rename(2)}.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{Rename Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node Rename Intrinsic (function)
--@subsubsection Rename Intrinsic (function)
--@cindex Rename intrinsic
--@cindex intrinsics, Rename
--
--@noindent
--@example
--Rename(@var{Path1}, @var{Path2})
--@end example
--
--@noindent
--Rename: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Renames the file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--See @code{rename(2)}.
--Returns 0 on success or a non-zero error code.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{Rename Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Repeat Intrinsic
--@subsubsection Repeat Intrinsic
--@cindex Repeat intrinsic
--@cindex intrinsics, Repeat
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Repeat} to use this name for an
--external procedure.
--
--@node Reshape Intrinsic
--@subsubsection Reshape Intrinsic
--@cindex Reshape intrinsic
--@cindex intrinsics, Reshape
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Reshape} to use this name for an
--external procedure.
--
--@node RRSpacing Intrinsic
--@subsubsection RRSpacing Intrinsic
--@cindex RRSpacing intrinsic
--@cindex intrinsics, RRSpacing
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL RRSpacing} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2C
--@node RShift Intrinsic
--@subsubsection RShift Intrinsic
--@cindex RShift intrinsic
--@cindex intrinsics, RShift
--
--@noindent
--@example
--RShift(@var{I}, @var{Shift})
--@end example
--
--@noindent
--RShift: @code{INTEGER} function, the @samp{KIND=} value of the type being that of argument @var{I}.
--
--@noindent
--@var{I}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Shift}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Returns @var{I} shifted to the right
--@var{Shift} bits.
--
--Although similar to the expression
--@samp{@var{I}/(2**@var{Shift})}, there
--are important differences.
--For example, the sign of the result is
--undefined.
--
--Currently this intrinsic is defined assuming
--the underlying representation of @var{I}
--is as a two's-complement integer.
--It is unclear at this point whether that
--definition will apply when a different
--representation is involved.
--
--@xref{RShift Intrinsic}, for the inverse of this function.
--
--@xref{IShft Intrinsic}, for information
--on a more widely available right-shifting
--intrinsic that is also more precisely defined.
--
--@end ifset
--@ifset familyF90
--@node Scale Intrinsic
--@subsubsection Scale Intrinsic
--@cindex Scale intrinsic
--@cindex intrinsics, Scale
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Scale} to use this name for an
--external procedure.
--
--@node Scan Intrinsic
--@subsubsection Scan Intrinsic
--@cindex Scan intrinsic
--@cindex intrinsics, Scan
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Scan} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyVXT
--@node Secnds Intrinsic
--@subsubsection Secnds Intrinsic
--@cindex Secnds intrinsic
--@cindex intrinsics, Secnds
--
--@noindent
--@example
--Secnds(@var{T})
--@end example
--
--@noindent
--Secnds: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{T}: @code{REAL(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{vxt}.
--
--@noindent
--Description:
--
--Returns the local time in seconds since midnight minus the value
--@var{T}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--This values returned by this intrinsic
--become numerically less than previous values
--(they wrap around) during a single run of the
--compiler program, under normal circumstances
--(such as running through the midnight hour).
--
--@end ifset
--@ifset familyF2U
--@node Second Intrinsic (function)
--@subsubsection Second Intrinsic (function)
--@cindex Second intrinsic
--@cindex intrinsics, Second
--
--@noindent
--@example
--Second()
--@end example
--
--@noindent
--Second: @code{REAL(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the process's runtime in seconds---the same value as the
--UNIX function @code{etime} returns.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--For information on other intrinsics with the same name:
--@xref{Second Intrinsic (subroutine)}.
--
--@node Second Intrinsic (subroutine)
--@subsubsection Second Intrinsic (subroutine)
--@cindex Second intrinsic
--@cindex intrinsics, Second
--
--@noindent
--@example
--CALL Second(@var{Seconds})
--@end example
--
--@noindent
--@var{Seconds}: @code{REAL}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the process's runtime in seconds in @var{Seconds}---the same value
--as the UNIX function @code{etime} returns.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--This routine is known from Cray Fortran. @xref{CPU_Time Intrinsic},
--for a standard equivalent.
--
--For information on other intrinsics with the same name:
--@xref{Second Intrinsic (function)}.
--
--@end ifset
--@ifset familyF90
--@node Selected_Int_Kind Intrinsic
--@subsubsection Selected_Int_Kind Intrinsic
--@cindex Selected_Int_Kind intrinsic
--@cindex intrinsics, Selected_Int_Kind
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Selected_Int_Kind} to use this name for an
--external procedure.
--
--@node Selected_Real_Kind Intrinsic
--@subsubsection Selected_Real_Kind Intrinsic
--@cindex Selected_Real_Kind intrinsic
--@cindex intrinsics, Selected_Real_Kind
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Selected_Real_Kind} to use this name for an
--external procedure.
--
--@node Set_Exponent Intrinsic
--@subsubsection Set_Exponent Intrinsic
--@cindex Set_Exponent intrinsic
--@cindex intrinsics, Set_Exponent
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Set_Exponent} to use this name for an
--external procedure.
--
--@node Shape Intrinsic
--@subsubsection Shape Intrinsic
--@cindex Shape intrinsic
--@cindex intrinsics, Shape
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Shape} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node Short Intrinsic
--@subsubsection Short Intrinsic
--@cindex Short intrinsic
--@cindex intrinsics, Short
--
--@noindent
--@example
--Short(@var{A})
--@end example
--
--@noindent
--Short: @code{INTEGER(KIND=6)} function.
--
--@noindent
--@var{A}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns @var{A} with the fractional portion of its
--magnitude truncated and its sign preserved, converted
--to type @code{INTEGER(KIND=6)}.
--
--If @var{A} is type @code{COMPLEX}, its real part
--is truncated and converted, and its imaginary part is disgregarded.
--
--@xref{Int Intrinsic}.
--
--The precise meaning of this intrinsic might change
--in a future version of the GNU Fortran language,
--as more is learned about how it is used.
--
--@end ifset
--@ifset familyF77
--@node Sign Intrinsic
--@subsubsection Sign Intrinsic
--@cindex Sign intrinsic
--@cindex intrinsics, Sign
--
--@noindent
--@example
--Sign(@var{A}, @var{B})
--@end example
--
--@noindent
--Sign: @code{INTEGER} or @code{REAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{A}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--@var{B}: @code{INTEGER} or @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns @samp{ABS(@var{A})*@var{s}}, where
--@var{s} is +1 if @samp{@var{B}.GE.0},
---1 otherwise.
--
--@xref{Abs Intrinsic}, for the function that returns
--the magnitude of a value.
--
--@end ifset
--@ifset familyF2U
--@node Signal Intrinsic (subroutine)
--@subsubsection Signal Intrinsic (subroutine)
--@cindex Signal intrinsic
--@cindex intrinsics, Signal
--
--@noindent
--@example
--CALL Signal(@var{Number}, @var{Handler}, @var{Status})
--@end example
--
--@noindent
--@var{Number}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Handler}: Signal handler (@code{INTEGER FUNCTION} or @code{SUBROUTINE})
--or dummy/global @code{INTEGER(KIND=1)} scalar.
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=7)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--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{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 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
--that argument is supplied.
--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{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)}.
--
--@end ifset
--@ifset familyBADU77
--@node Signal Intrinsic (function)
--@subsubsection Signal Intrinsic (function)
--@cindex Signal intrinsic
--@cindex intrinsics, Signal
--
--@noindent
--@example
--Signal(@var{Number}, @var{Handler})
--@end example
--
--@noindent
--Signal: @code{INTEGER(KIND=7)} function.
--
--@noindent
--@var{Number}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Handler}: Signal handler (@code{INTEGER FUNCTION} or @code{SUBROUTINE})
--or dummy/global @code{INTEGER(KIND=1)} scalar.
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--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{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 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)}.
--
--@end ifset
--@ifset familyF77
--@node Sin Intrinsic
--@subsubsection Sin Intrinsic
--@cindex Sin intrinsic
--@cindex intrinsics, Sin
--
--@noindent
--@example
--Sin(@var{X})
--@end example
--
--@noindent
--Sin: @code{REAL} or @code{COMPLEX} function, the exact type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL} or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the sine of @var{X}, an angle measured
--in radians.
--
--@xref{ASin Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node SinD Intrinsic
--@subsubsection SinD Intrinsic
--@cindex SinD intrinsic
--@cindex intrinsics, SinD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL SinD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node SinH Intrinsic
--@subsubsection SinH Intrinsic
--@cindex SinH intrinsic
--@cindex intrinsics, SinH
--
--@noindent
--@example
--SinH(@var{X})
--@end example
--
--@noindent
--SinH: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the hyperbolic sine of @var{X}.
--
--@end ifset
--@ifset familyF2U
--@node Sleep Intrinsic
--@subsubsection Sleep Intrinsic
--@cindex Sleep intrinsic
--@cindex intrinsics, Sleep
--
--@noindent
--@example
--CALL Sleep(@var{Seconds})
--@end example
--
--@noindent
--@var{Seconds}: @code{INTEGER(KIND=1)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Causes the process to pause for @var{Seconds} seconds.
--See @code{sleep(2)}.
--
--@end ifset
--@ifset familyF77
--@node Sngl Intrinsic
--@subsubsection Sngl Intrinsic
--@cindex Sngl intrinsic
--@cindex intrinsics, Sngl
--
--@noindent
--@example
--Sngl(@var{A})
--@end example
--
--@noindent
--Sngl: @code{REAL(KIND=1)} function.
--
--@noindent
--@var{A}: @code{REAL(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Archaic form of @code{REAL()} that is specific
--to one type for @var{A}.
--@xref{Real Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node SnglQ Intrinsic
--@subsubsection SnglQ Intrinsic
--@cindex SnglQ intrinsic
--@cindex intrinsics, SnglQ
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL SnglQ} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF90
--@node Spacing Intrinsic
--@subsubsection Spacing Intrinsic
--@cindex Spacing intrinsic
--@cindex intrinsics, Spacing
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Spacing} to use this name for an
--external procedure.
--
--@node Spread Intrinsic
--@subsubsection Spread Intrinsic
--@cindex Spread intrinsic
--@cindex intrinsics, Spread
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Spread} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node SqRt Intrinsic
--@subsubsection SqRt Intrinsic
--@cindex SqRt intrinsic
--@cindex intrinsics, SqRt
--
--@noindent
--@example
--SqRt(@var{X})
--@end example
--
--@noindent
--SqRt: @code{REAL} or @code{COMPLEX} function, the exact type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL} or @code{COMPLEX}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the square root of @var{X}, which must
--not be negative.
--
--To calculate and represent the square root of a negative
--number, complex arithmetic must be used.
--For example, @samp{SQRT(COMPLEX(@var{X}))}.
--
--The inverse of this function is @samp{SQRT(@var{X}) * SQRT(@var{X})}.
--
--@end ifset
--@ifset familyF2U
--@node SRand Intrinsic
--@subsubsection SRand Intrinsic
--@cindex SRand intrinsic
--@cindex intrinsics, SRand
--
--@noindent
--@example
--CALL SRand(@var{Seed})
--@end example
--
--@noindent
--@var{Seed}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Reinitialises the generator with the seed in @var{Seed}.
--@xref{IRand Intrinsic}.
--@xref{Rand Intrinsic}.
--
--@node Stat Intrinsic (subroutine)
--@subsubsection Stat Intrinsic (subroutine)
--@cindex Stat intrinsic
--@cindex intrinsics, Stat
--
--@noindent
--@example
--CALL Stat(@var{File}, @var{SArray}, @var{Status})
--@end example
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the given file @var{File} and places them in the array
--@var{SArray}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--The values in this array are extracted from the
--@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--Not all these elements are relevant on all systems.
--If an element is not relevant, it is returned as 0.
--
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{Stat Intrinsic (function)}.
--
--@node Stat Intrinsic (function)
--@subsubsection Stat Intrinsic (function)
--@cindex Stat intrinsic
--@cindex intrinsics, Stat
--
--@noindent
--@example
--Stat(@var{File}, @var{SArray})
--@end example
--
--@noindent
--Stat: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{SArray}: @code{INTEGER(KIND=1)}; DIMENSION(13); INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Obtains data about the given file @var{File} and places them in the array
--@var{SArray}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--The values in this array are extracted from the
--@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
--
--@enumerate
--@item
--Device ID
--
--@item
--Inode number
--
--@item
--File mode
--
--@item
--Number of links
--
--@item
--Owner's uid
--
--@item
--Owner's gid
--
--@item
--ID of device containing directory entry for file
--(0 if not available)
--
--@item
--File size (bytes)
--
--@item
--Last access time
--
--@item
--Last modification time
--
--@item
--Last file status change time
--
--@item
--Preferred I/O block size (-1 if not available)
--
--@item
--Number of blocks allocated (-1 if not available)
--@end enumerate
--
--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:
--@xref{Stat Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Sum Intrinsic
--@subsubsection Sum Intrinsic
--@cindex Sum intrinsic
--@cindex intrinsics, Sum
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Sum} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node SymLnk Intrinsic (subroutine)
--@subsubsection SymLnk Intrinsic (subroutine)
--@cindex SymLnk intrinsic
--@cindex intrinsics, SymLnk
--
--@noindent
--@example
--CALL SymLnk(@var{Path1}, @var{Path2}, @var{Status})
--@end example
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Makes a symbolic link from file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return
--(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{SymLnk Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node SymLnk Intrinsic (function)
--@subsubsection SymLnk Intrinsic (function)
--@cindex SymLnk intrinsic
--@cindex intrinsics, SymLnk
--
--@noindent
--@example
--SymLnk(@var{Path1}, @var{Path2})
--@end example
--
--@noindent
--SymLnk: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Path1}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Path2}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Makes a symbolic link from file @var{Path1} to @var{Path2}.
--A null character (@samp{CHAR(0)}) marks the end of
--the names in @var{Path1} and @var{Path2}---otherwise,
--trailing blanks in @var{Path1} and @var{Path2} are ignored.
--Returns 0 on success or a non-zero error code
--(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{SymLnk Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF2U
--@node System Intrinsic (subroutine)
--@subsubsection System Intrinsic (subroutine)
--@cindex System intrinsic
--@cindex intrinsics, System
--
--@noindent
--@example
--CALL System(@var{Command}, @var{Status})
--@end example
--
--@noindent
--@var{Command}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Passes the command @var{Command} to a shell (see @code{system(3)}).
--If argument @var{Status} is present, it contains the value returned by
--@code{system(3)}, presumably 0 if the shell command succeeded.
--Note that which shell is used to invoke the command is system-dependent
--and environment-dependent.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{System Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node System Intrinsic (function)
--@subsubsection System Intrinsic (function)
--@cindex System intrinsic
--@cindex intrinsics, System
--
--@noindent
--@example
--System(@var{Command})
--@end example
--
--@noindent
--System: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Command}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Passes the command @var{Command} to a shell (see @code{system(3)}).
--Returns the value returned by
--@code{system(3)}, presumably 0 if the shell command succeeded.
--Note that which shell is used to invoke the command is system-dependent
--and environment-dependent.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--However, the function form can be valid in cases where the
--actual side effects performed by the call are unimportant to
--the application.
--
--For example, on a UNIX system, @samp{SAME = SYSTEM('cmp a b')}
--does not perform any side effects likely to be important to the
--program, so the programmer would not care if the actual system
--call (and invocation of @code{cmp}) was optimized away in a situation
--where the return value could be determined otherwise, or was not
--actually needed (@samp{SAME} not actually referenced after the
--sample assignment statement).
--
--For information on other intrinsics with the same name:
--@xref{System Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node System_Clock Intrinsic
--@subsubsection System_Clock Intrinsic
--@cindex System_Clock intrinsic
--@cindex intrinsics, System_Clock
--
--@noindent
--@example
--CALL System_Clock(@var{Count}, @var{Rate}, @var{Max})
--@end example
--
--@noindent
--@var{Count}: @code{INTEGER(KIND=1)}; scalar; INTENT(OUT).
--
--@noindent
--@var{Rate}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--@var{Max}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{f90}.
--
--@noindent
--Description:
--
--Returns in @var{Count} the current value of the system clock; this is
--the value returned by the UNIX function @code{times(2)}
--in this implementation, but
--isn't in general.
--@var{Rate} is the number of clock ticks per second and
--@var{Max} is the maximum value this can take, which isn't very useful
--in this implementation since it's just the maximum C @code{unsigned
--int} value.
--
--@cindex wraparound, timings
--@cindex limits, timings
--On some systems, the underlying timings are represented
--using types with sufficiently small limits that overflows
--(wraparounds) are possible, such as 32-bit types.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--@end ifset
--@ifset familyF77
--@node Tan Intrinsic
--@subsubsection Tan Intrinsic
--@cindex Tan intrinsic
--@cindex intrinsics, Tan
--
--@noindent
--@example
--Tan(@var{X})
--@end example
--
--@noindent
--Tan: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the tangent of @var{X}, an angle measured
--in radians.
--
--@xref{ATan Intrinsic}, for the inverse of this function.
--
--@end ifset
--@ifset familyVXT
--@node TanD Intrinsic
--@subsubsection TanD Intrinsic
--@cindex TanD intrinsic
--@cindex intrinsics, TanD
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL TanD} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF77
--@node TanH Intrinsic
--@subsubsection TanH Intrinsic
--@cindex TanH intrinsic
--@cindex intrinsics, TanH
--
--@noindent
--@example
--TanH(@var{X})
--@end example
--
--@noindent
--TanH: @code{REAL} function, the @samp{KIND=} value of the type being that of argument @var{X}.
--
--@noindent
--@var{X}: @code{REAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: (standard FORTRAN 77).
--
--@noindent
--Description:
--
--Returns the hyperbolic tangent of @var{X}.
--
--@end ifset
--@ifset familyF2U
--@node Time Intrinsic (UNIX)
--@subsubsection Time Intrinsic (UNIX)
--@cindex Time intrinsic
--@cindex intrinsics, Time
--
--@noindent
--@example
--Time()
--@end example
--
--@noindent
--Time: @code{INTEGER(KIND=1)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current time encoded as an integer
--(in the manner of the UNIX function @code{time(3)}).
--This value is suitable for passing to @code{CTIME},
--@code{GMTIME}, and @code{LTIME}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--This intrinsic is not fully portable, such as to systems
--with 32-bit @code{INTEGER} types but supporting times
--wider than 32 bits.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--@xref{Time8 Intrinsic}, for information on a
--similar intrinsic that might be portable to more
--GNU Fortran implementations, though to fewer
--Fortran compilers.
--
--For information on other intrinsics with the same name:
--@xref{Time Intrinsic (VXT)}.
--
--@end ifset
--@ifset familyVXT
--@node Time Intrinsic (VXT)
--@subsubsection Time Intrinsic (VXT)
--@cindex Time intrinsic
--@cindex intrinsics, Time
--
--@noindent
--@example
--CALL Time(@var{Time})
--@end example
--
--@noindent
--@var{Time}: @code{CHARACTER*8}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{vxt}.
--
--@noindent
--Description:
--
--Returns in @var{Time} a character representation of the current time as
--obtained from @code{ctime(3)}.
--
--@cindex Y10K compliance
--@cindex Year 10000 compliance
--@cindex wraparound, Y10K
--@cindex limits, Y10K
--Programs making use of this intrinsic
--might not be Year 10000 (Y10K) compliant.
--For example, the date might appear,
--to such programs, to wrap around
--(change from a larger value to a smaller one)
--as of the Year 10000.
--
--@xref{FDate Intrinsic (subroutine)}, for an equivalent routine.
--
--For information on other intrinsics with the same name:
--@xref{Time Intrinsic (UNIX)}.
--
--@end ifset
--@ifset familyF2U
--@node Time8 Intrinsic
--@subsubsection Time8 Intrinsic
--@cindex Time8 intrinsic
--@cindex intrinsics, Time8
--
--@noindent
--@example
--Time8()
--@end example
--
--@noindent
--Time8: @code{INTEGER(KIND=2)} function.
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the current time encoded as a long integer
--(in the manner of the UNIX function @code{time(3)}).
--This value is suitable for passing to @code{CTIME},
--@code{GMTIME}, and @code{LTIME}.
--
--@cindex wraparound, timings
--@cindex limits, timings
--@emph{Warning:} this intrinsic does not increase the range
--of the timing values over that returned by @code{time(3)}.
--On a system with a 32-bit @code{time(3)},
--@code{TIME8} will return a 32-bit value,
--even though converted to an @samp{INTEGER(KIND=2)} value.
--That means overflows of the 32-bit value can still occur.
--Therefore, the values returned by this intrinsic
--might be, or become, negative,
--or numerically less than previous values,
--during a single run of the compiled program.
--
--No Fortran implementations other than GNU Fortran are
--known to support this intrinsic at the time of this
--writing.
--@xref{Time Intrinsic (UNIX)}, for information on a
--similar intrinsic that might be portable to more Fortran
--compilers, though to fewer GNU Fortran implementations.
--
--@end ifset
--@ifset familyF90
--@node Tiny Intrinsic
--@subsubsection Tiny Intrinsic
--@cindex Tiny intrinsic
--@cindex intrinsics, Tiny
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Tiny} to use this name for an
--external procedure.
--
--@node Transfer Intrinsic
--@subsubsection Transfer Intrinsic
--@cindex Transfer intrinsic
--@cindex intrinsics, Transfer
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Transfer} to use this name for an
--external procedure.
--
--@node Transpose Intrinsic
--@subsubsection Transpose Intrinsic
--@cindex Transpose intrinsic
--@cindex intrinsics, Transpose
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Transpose} to use this name for an
--external procedure.
--
--@node Trim Intrinsic
--@subsubsection Trim Intrinsic
--@cindex Trim intrinsic
--@cindex intrinsics, Trim
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Trim} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node TtyNam Intrinsic (subroutine)
--@subsubsection TtyNam Intrinsic (subroutine)
--@cindex TtyNam intrinsic
--@cindex intrinsics, TtyNam
--
--@noindent
--@example
--CALL TtyNam(@var{Unit}, @var{Name})
--@end example
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Name}: @code{CHARACTER}; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets @var{Name} to the name of the terminal device open on logical unit
--@var{Unit} or to a blank string if @var{Unit} is not connected to a
--terminal.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{TtyNam Intrinsic (function)}.
--
--@node TtyNam Intrinsic (function)
--@subsubsection TtyNam Intrinsic (function)
--@cindex TtyNam intrinsic
--@cindex intrinsics, TtyNam
--
--@noindent
--@example
--TtyNam(@var{Unit})
--@end example
--
--@noindent
--TtyNam: @code{CHARACTER*(*)} function.
--
--@noindent
--@var{Unit}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Returns the name of the terminal device open on logical unit
--@var{Unit} or a blank string if @var{Unit} is not connected to a
--terminal.
--
--For information on other intrinsics with the same name:
--@xref{TtyNam Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node UBound Intrinsic
--@subsubsection UBound Intrinsic
--@cindex UBound intrinsic
--@cindex intrinsics, UBound
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL UBound} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2U
--@node UMask Intrinsic (subroutine)
--@subsubsection UMask Intrinsic (subroutine)
--@cindex UMask intrinsic
--@cindex intrinsics, UMask
--
--@noindent
--@example
--CALL UMask(@var{Mask}, @var{Old})
--@end example
--
--@noindent
--@var{Mask}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--@var{Old}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Sets the file creation mask to @var{Mask} and returns the old value in
--argument @var{Old} if it is supplied.
--See @code{umask(2)}.
--
--Some non-GNU implementations of Fortran provide this intrinsic as
--only a function, not as a subroutine.
--
--For information on other intrinsics with the same name:
--@xref{UMask Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node UMask Intrinsic (function)
--@subsubsection UMask Intrinsic (function)
--@cindex UMask intrinsic
--@cindex intrinsics, UMask
--
--@noindent
--@example
--UMask(@var{Mask})
--@end example
--
--@noindent
--UMask: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{Mask}: @code{INTEGER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Sets the file creation mask to @var{Mask} and returns the old value.
--See @code{umask(2)}.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{UMask Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF2U
--@node Unlink Intrinsic (subroutine)
--@subsubsection Unlink Intrinsic (subroutine)
--@cindex Unlink intrinsic
--@cindex intrinsics, Unlink
--
--@noindent
--@example
--CALL Unlink(@var{File}, @var{Status})
--@end example
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--@var{Status}: @code{INTEGER(KIND=1)}; OPTIONAL; scalar; INTENT(OUT).
--
--@noindent
--Intrinsic groups: @code{unix}.
--
--@noindent
--Description:
--
--Unlink the file @var{File}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--If the @var{Status} argument is supplied, it contains
--0 on success or a non-zero error code upon return.
--See @code{unlink(2)}.
--
--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.
--
--For information on other intrinsics with the same name:
--@xref{Unlink Intrinsic (function)}.
--
--@end ifset
--@ifset familyBADU77
--@node Unlink Intrinsic (function)
--@subsubsection Unlink Intrinsic (function)
--@cindex Unlink intrinsic
--@cindex intrinsics, Unlink
--
--@noindent
--@example
--Unlink(@var{File})
--@end example
--
--@noindent
--Unlink: @code{INTEGER(KIND=1)} function.
--
--@noindent
--@var{File}: @code{CHARACTER}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{badu77}.
--
--@noindent
--Description:
--
--Unlink the file @var{File}.
--A null character (@samp{CHAR(0)}) marks the end of
--the name in @var{File}---otherwise,
--trailing blanks in @var{File} are ignored.
--Returns 0 on success or a non-zero error code.
--See @code{unlink(2)}.
--
--Due to the side effects performed by this intrinsic, the function
--form is not recommended.
--
--For information on other intrinsics with the same name:
--@xref{Unlink Intrinsic (subroutine)}.
--
--@end ifset
--@ifset familyF90
--@node Unpack Intrinsic
--@subsubsection Unpack Intrinsic
--@cindex Unpack intrinsic
--@cindex intrinsics, Unpack
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Unpack} to use this name for an
--external procedure.
--
--@node Verify Intrinsic
--@subsubsection Verify Intrinsic
--@cindex Verify intrinsic
--@cindex intrinsics, Verify
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL Verify} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2C
--@node XOr Intrinsic
--@subsubsection XOr Intrinsic
--@cindex XOr intrinsic
--@cindex intrinsics, XOr
--
--@noindent
--@example
--XOr(@var{I}, @var{J})
--@end example
--
--@noindent
--XOr: @code{INTEGER} or @code{LOGICAL} function, the exact type being the result of cross-promoting the
--types of all the arguments.
--
--@noindent
--@var{I}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--@var{J}: @code{INTEGER} or @code{LOGICAL}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Returns value resulting from boolean exclusive-OR of
--pair of bits in each of @var{I} and @var{J}.
--
--@node ZAbs Intrinsic
--@subsubsection ZAbs Intrinsic
--@cindex ZAbs intrinsic
--@cindex intrinsics, ZAbs
--
--@noindent
--@example
--ZAbs(@var{A})
--@end example
--
--@noindent
--ZAbs: @code{REAL(KIND=2)} function.
--
--@noindent
--@var{A}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{ABS()} that is specific
--to one type for @var{A}.
--@xref{Abs Intrinsic}.
--
--@node ZCos Intrinsic
--@subsubsection ZCos Intrinsic
--@cindex ZCos intrinsic
--@cindex intrinsics, ZCos
--
--@noindent
--@example
--ZCos(@var{X})
--@end example
--
--@noindent
--ZCos: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{COS()} that is specific
--to one type for @var{X}.
--@xref{Cos Intrinsic}.
--
--@node ZExp Intrinsic
--@subsubsection ZExp Intrinsic
--@cindex ZExp intrinsic
--@cindex intrinsics, ZExp
--
--@noindent
--@example
--ZExp(@var{X})
--@end example
--
--@noindent
--ZExp: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{EXP()} that is specific
--to one type for @var{X}.
--@xref{Exp Intrinsic}.
--
--@end ifset
--@ifset familyVXT
--@node ZExt Intrinsic
--@subsubsection ZExt Intrinsic
--@cindex ZExt intrinsic
--@cindex intrinsics, ZExt
--
--This intrinsic is not yet implemented.
--The name is, however, reserved as an intrinsic.
--Use @samp{EXTERNAL ZExt} to use this name for an
--external procedure.
--
--@end ifset
--@ifset familyF2C
--@node ZLog Intrinsic
--@subsubsection ZLog Intrinsic
--@cindex ZLog intrinsic
--@cindex intrinsics, ZLog
--
--@noindent
--@example
--ZLog(@var{X})
--@end example
--
--@noindent
--ZLog: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{LOG()} that is specific
--to one type for @var{X}.
--@xref{Log Intrinsic}.
--
--@node ZSin Intrinsic
--@subsubsection ZSin Intrinsic
--@cindex ZSin intrinsic
--@cindex intrinsics, ZSin
--
--@noindent
--@example
--ZSin(@var{X})
--@end example
--
--@noindent
--ZSin: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{SIN()} that is specific
--to one type for @var{X}.
--@xref{Sin Intrinsic}.
--
--@node ZSqRt Intrinsic
--@subsubsection ZSqRt Intrinsic
--@cindex ZSqRt intrinsic
--@cindex intrinsics, ZSqRt
--
--@noindent
--@example
--ZSqRt(@var{X})
--@end example
--
--@noindent
--ZSqRt: @code{COMPLEX(KIND=2)} function.
--
--@noindent
--@var{X}: @code{COMPLEX(KIND=2)}; scalar; INTENT(IN).
--
--@noindent
--Intrinsic groups: @code{f2c}.
--
--@noindent
--Description:
--
--Archaic form of @code{SQRT()} that is specific
--to one type for @var{X}.
--@xref{SqRt Intrinsic}.
--
--@end ifset
+--- ../gcc-2.95.3/gcc/f/g77.1.orig Sun Feb 14 12:42:46 1999
++++ ../gcc-2.95.3/gcc/f/g77.1 Thu Jan 3 20:37:52 2002
+@@ -8,6 +8,7 @@
+ \(**
+ ..
+ .SH NAME
++f77, fort77,
+ g77 \- GNU project Fortran Compiler (v0.5.24)
+ .SH SYNOPSIS
+ .RB g77 " [" \c
diff --git a/lang/gcc/patches/patch-ab b/lang/gcc/patches/patch-ab
index 343df06e3c0..6e5ef1db6f7 100644
--- a/lang/gcc/patches/patch-ab
+++ b/lang/gcc/patches/patch-ab
@@ -1,169 +1,14 @@
-$NetBSD: patch-ab,v 1.2 2001/04/27 10:45:22 skrll Exp $
+$NetBSD: patch-ab,v 1.3 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/i386/netbsd-elf.h.orig Thu Apr 26 11:53:41 2001
-+++ ../gcc-2.95.2/gcc/config/i386/netbsd-elf.h
-@@ -0,0 +1,164 @@
-+/* Definitions of target machine for GNU compiler,
-+ for i386 NetBSD systems.
-+ Copyright (C) 1998 Free Software Foundation, Inc.
-+
-+This file is part of GNU CC.
-+
-+GNU CC is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+GNU CC is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with GNU CC; see the file COPYING. If not, write to
-+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-+
-+/* This is used on i386 platforms that use the ELF format.
-+ This was taken from the NetBSD/alpha configuration, and modified
-+ for NetBSD/i386 by Christos Zoulas <christos@netbsd.org> */
-+
-+/* Get generic i386 definitions. */
-+
-+/* This goes away when the math-emulator is fixed */
-+#define TARGET_CPU_DEFAULT 0400 /* TARGET_NO_FANCY_MATH_387 */
-+
-+#include <i386/gstabs.h>
-+
-+/* Get perform_* macros to build libgcc.a. */
-+#include <i386/perform.h>
-+
-+/* Get generic NetBSD ELF definitions. We will override these if necessary. */
-+
-+#define NETBSD_ELF
-+#include <netbsd.h>
-+
-+#undef ASM_FINAL_SPEC
-+
-+/* Names to predefine in the preprocessor for this target machine. */
-+
-+#undef CPP_PREDEFINES
-+#define CPP_PREDEFINES "\
-+-Dunix -Di386 -D__NetBSD__ -D__ELF__ \
-+-Asystem(unix) -Asystem(NetBSD) -Acpu(i386) -Amachine(i386)"
-+
-+/* Make gcc agree with <machine/ansi.h> */
-+
-+#undef SIZE_TYPE
-+#define SIZE_TYPE "unsigned int"
-+
-+#undef PTRDIFF_TYPE
-+#define PTRDIFF_TYPE "int"
-+
-+#undef WCHAR_TYPE
-+#define WCHAR_TYPE "int"
-+
-+#undef WCHAR_UNSIGNED
-+#define WCHAR_UNSIGNED 0
-+
-+#undef WCHAR_TYPE_SIZE
-+#define WCHAR_TYPE_SIZE 32
-+
-+/* Output assembler code to FILE to increment profiler label # LABELNO
-+ for profiling a function entry. Under NetBSD/i386, the assembler does
-+ nothing special with -pg. */
-+
-+#undef ASM_APP_ON
-+#define ASM_APP_ON "#APP\n"
-+
-+#undef ASM_APP_OFF
-+#define ASM_APP_OFF "#NO_APP\n"
-+
-+#define bsd4_4
-+#undef HAS_INIT_SECTION
-+
-+/* Provide a LINK_SPEC appropriate for a NetBSD/alpha ELF target. Only
-+ the linker emulation is i386-specific. The rest are
-+ common to all ELF targets, except for the name of the start function. */
-+
-+#undef LINK_SPEC
-+#define LINK_SPEC \
-+ "-m elf_i386 \
-+ %{assert*} %{R*} \
-+ %{shared:-shared} \
-+ %{!shared: \
-+ -dc -dp \
-+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
-+ %{!static: \
-+ %{rdynamic:-export-dynamic} \
-+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
-+ %{static:-static}}"
-+
-+#undef DEFAULT_VTABLE_THUNKS
-+#define DEFAULT_VTABLE_THUNKS 1
-+
-+#undef ASM_OUTPUT_ALIGN
-+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
-+ if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1 << (LOG))
-+
-+/* This is how we tell the assembler that two symbols have the same value. */
-+
-+#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
-+ do { assemble_name(FILE, NAME1); \
-+ fputs(" = ", FILE); \
-+ assemble_name(FILE, NAME2); \
-+ fputc('\n', FILE); } while (0)
-+
-+/*
-+ * We always use gas here, so we don't worry about ECOFF assembler problems.
-+ */
-+#undef TARGET_GAS
-+#define TARGET_GAS (1)
-+
-+/* The following macros are stolen from i386v4.h */
-+/* These have to be defined to get PIC code correct */
-+
-+/* This is how to output an element of a case-vector that is relative.
-+ This is only used for PIC code. See comments by the `casesi' insn in
-+ i386.md for an explanation of the expression this outputs. */
-+
-+#undef ASM_OUTPUT_ADDR_DIFF_ELT
-+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
-+ fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
-+
-+/* Indicate that jump tables go in the text section. This is
-+ necessary when compiling PIC code. */
-+
-+#define JUMP_TABLES_IN_TEXT_SECTION 1
-+
-+/* Default to pcc-struct-return, because this is the ELF abi and
-+ we don't care about compatibility with older gcc versions. */
-+#define DEFAULT_PCC_STRUCT_RETURN 1
-+
-+/* Profiling routines, partially copied from i386/osfrose.h. */
-+
-+/* Redefine this to use %eax instead of %edx. */
-+#undef FUNCTION_PROFILER
-+#define FUNCTION_PROFILER(FILE, LABELNO) \
-+{ \
-+ if (flag_pic) \
-+ { \
-+ fprintf (FILE, "\tcall __mcount@PLT\n"); \
-+ } \
-+ else \
-+ { \
-+ fprintf (FILE, "\tcall __mcount\n"); \
-+ } \
-+}
-+
-+/* Put relocations in the constant pool in the writable data section. */
-+#undef SELECT_RTX_SECTION
-+#define SELECT_RTX_SECTION(MODE,RTX) \
-+{ \
-+ if (flag_pic && symbolic_operand (RTX)) \
-+ data_section (); \
-+ else \
-+ readonly_data_section (); \
-+}
-+
-+/* Use sjlj exceptions. */
-+#define DWARF2_UNWIND_INFO 0
+--- ../gcc-2.95.3/gcc/f/proj.h.orig Mon Feb 15 19:17:18 1999
++++ ../gcc-2.95.3/gcc/f/proj.h Thu Jan 3 21:02:06 2002
+@@ -66,7 +66,9 @@
+ Doggone_Trailing_Comma_Dont_Work = 1
+ } bool;
+
++#ifndef ARRAY_SIZE
+ #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
++#endif
+
+ #ifndef UNUSED /* Compile with -DUNUSED= if cc doesn't support this. */
+ #if BUILT_WITH_270
diff --git a/lang/gcc/patches/patch-ac b/lang/gcc/patches/patch-ac
index 141016ca174..e55cff7c3ff 100644
--- a/lang/gcc/patches/patch-ac
+++ b/lang/gcc/patches/patch-ac
@@ -1,28 +1,23 @@
-$NetBSD: patch-ac,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ac,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/i386/xm-netbsd.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/i386/xm-netbsd.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,23 @@
-+/* Configuration file for i386 hosts running NetBSD.
-+ Copyright (C) 1999 Free Software Foundation, Inc.
-+
-+This file is part of GNU CC.
-+
-+GNU CC is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+GNU CC is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with GNU CC; see the file COPYING. If not, write to
-+the Free Software Foundation, 59 Temple Place - Suite 330,
-+Boston, MA 02111-1307, USA. */
-+
-+#include <xm-netbsd.h>
-+#include <i386/xm-i386.h>
-+
+--- ../gcc-2.95.3/gcc/config/alpha/alpha.c.orig Mon Aug 2 21:46:08 1999
++++ ../gcc-2.95.3/gcc/config/alpha/alpha.c Thu Jan 3 20:37:53 2002
+@@ -275,7 +275,7 @@
+ static int const cache_latency[][4] =
+ {
+ { 3, 30, -1 }, /* ev4 -- Bcache is a guess */
+- { 2, 12, 38 }, /* ev5 -- Bcache from PC164 LMbench numbers */
++ { 3, 12, 38 }, /* ev5 -- Bcache from PC164 LMbench numbers */
+ { 3, 13, -1 }, /* ev6 -- Ho hum, doesn't exist yet */
+ };
+
+@@ -3375,7 +3375,8 @@
+ /* Write a version stamp. Don't write anything if we are running as a
+ cross-compiler. Otherwise, use the versions in /usr/include/stamp.h. */
+
+-#ifdef HAVE_STAMP_H
++#if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__linux__) && \
++ !defined(VMS) && !defined(__NetBSD__)
+ #include <stamp.h>
+ #endif
+
diff --git a/lang/gcc/patches/patch-ad b/lang/gcc/patches/patch-ad
index 8e188368554..b010afb2187 100644
--- a/lang/gcc/patches/patch-ad
+++ b/lang/gcc/patches/patch-ad
@@ -1,74 +1,31 @@
-$NetBSD: patch-ad,v 1.2 2001/02/28 23:28:09 hubertf Exp $
+$NetBSD: patch-ad,v 1.3 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/netbsd-elf-common.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/sparc/netbsd-elf-common.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,69 @@
-+/* NetBSD/sparc ELF common 32/64 bit configuration */
-+
-+#define OBJECT_FORMAT_ELF
-+#define NETBSD_ELF
-+#include <netbsd.h>
-+
-+/* Fix up CPP_SPEC. This merges the code from <netbsd.h> and <sparc/sparc.h> */
-+#undef CPP_SPEC
-+#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} \
-+%(cpp_cpu) %(cpp_arch) %(cpp_endian) %(cpp_subtarget)"
-+
-+#undef CPP_PREDEFINES
-+#define CPP_PREDEFINES "-D__sparc__ -D__NetBSD__ -D__ELF__ \
-+-Asystem(unix) -Asystem(NetBSD)"
-+
-+#undef SIZE_TYPE
-+#define SIZE_TYPE "long unsigned int"
-+
-+#undef PTRDIFF_TYPE
-+#define PTRDIFF_TYPE "long int"
-+
-+#undef WCHAR_TYPE
-+#define WCHAR_TYPE "int"
-+
-+#undef WCHAR_TYPE_SIZE
-+#define WCHAR_TYPE_SIZE 32
-+
-+#undef WCHAR_UNSIGNED
-+#define WCHAR_UNSIGNED 0
-+
-+#undef PREFERRED_DEBUGGING_TYPE
-+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-+
-+/* This is the char to use for continuation (in case we need to turn
-+ continuation back on). */
-+#undef DBX_CONTIN_CHAR
-+#define DBX_CONTIN_CHAR '?'
-+
-+#undef DBX_REGISTER_NUMBER
-+#define DBX_REGISTER_NUMBER(REGNO) \
-+ (TARGET_FLAT && REGNO == FRAME_POINTER_REGNUM ? 31 : REGNO)
-+
-+/* This is how to output a definition of an internal numbered label where
-+ PREFIX is the class of label and NUM is the number within the class. */
-+
-+#undef ASM_OUTPUT_INTERNAL_LABEL
-+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
-+ fprintf (FILE, ".L%s%d:\n", PREFIX, NUM)
-+
-+/* This is how to store into the string LABEL
-+ the symbol_ref name of an internal numbered label where
-+ PREFIX is the class of label and NUM is the number within the class.
-+ This is suitable for output with `assemble_name'. */
-+
-+#undef ASM_GENERATE_INTERNAL_LABEL
-+#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
-+ sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))
-+
-+#undef ASM_SPEC
-+#define ASM_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} \
-+%{mlittle-endian:-EL} \
-+%(asm_cpu) %(asm_arch)\
-+"
-+
-+#undef STDC_0_IN_SYSTEM_HEADERS
-+
-+/* XXX Redefine this; <sparc/sparc.h> mucks with it. */
-+#undef TARGET_VERSION
-+#define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME);
+--- ../gcc-2.95.3/gcc/config/alpha/alpha.h.orig Fri Jun 25 07:09:12 1999
++++ ../gcc-2.95.3/gcc/config/alpha/alpha.h Thu Jan 3 20:37:53 2002
+@@ -49,9 +49,6 @@
+ || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
+ || !strcmp (STR, "isystem"))
+
+-/* Print subsidiary information on the compiler version in use. */
+-#define TARGET_VERSION
+-
+ /* Run-time compilation parameters selecting different hardware subsets. */
+
+ /* Which processor to schedule for. The cpu attribute defines a list that
+@@ -493,14 +490,14 @@
+ a bug in DEC's assembler. */
+
+ #define LOOP_ALIGN(LABEL) \
+- (optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0)
++ (!optimize_size && optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0)
+
+ /* This is how to align an instruction for optimal branching. On
+ Alpha we'll get better performance by aligning on an octaword
+ boundary. */
+
+ #define LABEL_ALIGN_AFTER_BARRIER(FILE) \
+- (optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0)
++ (!optimize_size && optimize > 0 && write_symbols != SDB_DEBUG ? 4 : 0)
+
+ /* No data type wants to be aligned rounder than this. */
+ #define BIGGEST_ALIGNMENT 64
diff --git a/lang/gcc/patches/patch-ae b/lang/gcc/patches/patch-ae
index b20bda030f7..57c7cd66c76 100644
--- a/lang/gcc/patches/patch-ae
+++ b/lang/gcc/patches/patch-ae
@@ -1,50 +1,555 @@
-$NetBSD: patch-ae,v 1.2 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-ae,v 1.3 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/netbsd-elf.h.orig Fri Apr 27 10:59:15 2001
-+++ ../gcc-2.95.2/gcc/config/sparc/netbsd-elf.h
-@@ -0,0 +1,45 @@
-+/* NetBSD/sparc ELF configuration */
-+
-+/*
-+ * Pull in generic SPARC ELF configuration, and then clean up
-+ * afterwards
-+ */
-+#include <sparc/elf.h>
-+
-+/* Name the target CPU. */
-+#ifndef TARGET_CPU_DEFAULT
-+#define TARGET_CPU_DEFAULT TARGET_CPU_sparc
-+#endif
+--- ../gcc-2.95.3/gcc/config/alpha/netbsd.h.orig Mon Jan 11 14:33:57 1999
++++ ../gcc-2.95.3/gcc/config/alpha/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -19,21 +19,544 @@
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
++/* This is used on Alpha platforms that use the ELF format.
++ This was taken from the Linux configuration, and modified
++ for NetBSD/alpha by Jason R. Thorpe <thorpej@netbsd.org> */
++
++/* Get generic Alpha definitions. */
++
++#include <alpha/alpha.h>
++
++/* Get generic NetBSD ELF definitions. We will override these if necessary. */
++
++#define NETBSD_ELF
++#include <netbsd.h>
++
++#undef OBJECT_FORMAT_COFF
++#undef EXTENDED_COFF
++#define OBJECT_FORMAT_ELF
+
-+#undef MULDI3_LIBCALL
-+#undef DIVDI3_LIBCALL
-+#undef UDIVDI3_LIBCALL
-+#undef MODDI3_LIBCALL
-+#undef UMODDI3_LIBCALL
-+#undef INIT_SUBTARGET_OPTABS
-+#define INIT_SUBTARGET_OPTABS
++/* This is BSD, so it wants DBX format. */
+
-+#undef CPP_SUBTARGET_SPEC
-+#define CPP_SUBTARGET_SPEC "-D__sparc"
++#define DBX_DEBUGGING_INFO
+
-+#include <sparc/netbsd-elf-common.h>
++/* This is the char to use for continuation (in case we need to turn
++ continuation back on). */
++
++#define DBX_CONTIN_CHAR '?'
++
++#undef ASM_FINAL_SPEC
++
++#undef CC1_SPEC
++#define CC1_SPEC "%{G*}"
++
++#undef ASM_SPEC
++#define ASM_SPEC "%{G*} %{relax:-relax} %{gdwarf*:-no-mdebug}"
++
++/* Provide a LINK_SPEC appropriate for a NetBSD/alpha ELF target. Only
++ the linker emulation and -O options are Alpha-specific. The rest are
++ common to all ELF targets, except for the name of the start function. */
+
+#undef LINK_SPEC
+#define LINK_SPEC \
-+ "-m elf32_sparc \
++ "-m elf64alpha_nbsd \
++ %{O*:-O3} %{!O*:-O1} \
+ %{assert*} %{R*} \
+ %{shared:-shared} \
+ %{!shared: \
-+ -dy -dc -dp \
++ -dc -dp \
+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
+ %{!static: \
+ %{rdynamic:-export-dynamic} \
+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
+ %{static:-static}}"
+
-+/* Name the port. */
-+#undef TARGET_NAME
-+#define TARGET_NAME "sparc-netbsdelf"
++/* Names to predefine in the preprocessor for this target machine.
++ XXX NetBSD, by convention, shouldn't do __alpha, but lots of applications
++ expect it because that's what OSF/1 does. */
++
++/* NetBSD Extension to GNU C: __KPRINTF_ATTRIBUTE__ */
++
+ #undef TARGET_DEFAULT
+ #define TARGET_DEFAULT (MASK_FP | MASK_FPREGS | MASK_GAS)
+
+ #undef CPP_PREDEFINES
+-#define CPP_PREDEFINES "-D_LONGLONG -Dnetbsd -Dunix " SUB_CPP_PREDEFINES
++#define CPP_PREDEFINES "\
++-D__alpha__ -D__alpha -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ \
++-Asystem(unix) -Asystem(NetBSD) -Acpu(alpha) -Amachine(alpha)"
++
++/* Make gcc agree with <machine/ansi.h> */
++
++#undef WCHAR_TYPE
++#define WCHAR_TYPE "int"
+
+-#undef LIB_SPEC
+-#define LIB_SPEC "%{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc}"
++#undef WCHAR_TYPE_SIZE
++#define WCHAR_TYPE_SIZE 32
+
+-/* Generate calls to memcpy, etc., not bcopy, etc. */
+-#define TARGET_MEM_FUNCTIONS
++/* Output assembler code to FILE to increment profiler label # LABELNO
++ for profiling a function entry. Under NetBSD/Alpha, the assembler does
++ nothing special with -pg. */
+
+ #undef FUNCTION_PROFILER
+ #define FUNCTION_PROFILER(FILE, LABELNO) \
+- fputs ("\tlda $28,_mcount\n\tjsr $28,($28),_mcount\n", (FILE))
++ fputs ("\tjsr $28,_mcount\n", (FILE))
+
+ /* Show that we need a GP when profiling. */
+ #define TARGET_PROFILING_NEEDS_GP
++
++#define bsd4_4
++#undef HAS_INIT_SECTION
++
++#undef DEFAULT_VTABLE_THUNKS
++#define DEFAULT_VTABLE_THUNKS 1
++
++/* Output at beginning of assembler file. */
++
++#undef ASM_FILE_START
++#define ASM_FILE_START(FILE) \
++do { \
++ if (write_symbols != DWARF2_DEBUG) \
++ { \
++ alpha_write_verstamp (FILE); \
++ output_file_directive (FILE, main_input_filename); \
++ } \
++ fprintf (FILE, "\t.set noat\n"); \
++ fprintf (FILE, "\t.set noreorder\n"); \
++ if (TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX) \
++ { \
++ fprintf (FILE, "\t.arch %s\n", \
++ (alpha_cpu == PROCESSOR_EV6 ? "ev6" \
++ : TARGET_MAX ? "pca56" : "ev56")); \
++ } \
++} while (0)
++
++#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
++ alpha_output_lineno (STREAM, LINE)
++extern void alpha_output_lineno ();
++
++extern void output_file_directive ();
++
++/* Attach a special .ident directive to the end of the file to identify
++ the version of GCC which compiled this code. The format of the
++ .ident string is patterned after the ones produced by native svr4
++ C compilers. */
++
++#define IDENT_ASM_OP ".ident"
++
++#ifdef IDENTIFY_WITH_IDENT
++#define ASM_IDENTIFY_GCC(FILE) /* nothing */
++#define ASM_IDENTIFY_LANGUAGE(FILE) \
++ fprintf(FILE, "\t%s \"GCC (%s) %s\"\n", IDENT_ASM_OP, \
++ lang_identify(), version_string)
++#else
++#define ASM_FILE_END(FILE) \
++do { \
++ if (!flag_no_ident) \
++ fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \
++ IDENT_ASM_OP, version_string); \
++ } while (0)
++#endif
++
++/* Allow #sccs in preprocessor. */
++
++#define SCCS_DIRECTIVE
++
++/* Output #ident as a .ident. */
++
++#define ASM_OUTPUT_IDENT(FILE, NAME) \
++ fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
++
++/* This is how to allocate empty space in some section. The .zero
++ pseudo-op is used for this on most svr4 assemblers. */
++
++#define SKIP_ASM_OP ".zero"
++
++#undef ASM_OUTPUT_SKIP
++#define ASM_OUTPUT_SKIP(FILE,SIZE) \
++ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
++
++/* Output the label which precedes a jumptable. Note that for all svr4
++ systems where we actually generate jumptables (which is to say every
++ svr4 target except i386, where we use casesi instead) we put the jump-
++ tables into the .rodata section and since other stuff could have been
++ put into the .rodata section prior to any given jumptable, we have to
++ make sure that the location counter for the .rodata section gets pro-
++ perly re-aligned prior to the actual beginning of the jump table. */
++
++#define ALIGN_ASM_OP ".align"
++
++#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
++#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
++ ASM_OUTPUT_ALIGN ((FILE), 2);
++#endif
++
++#undef ASM_OUTPUT_CASE_LABEL
++#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
++ do { \
++ ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
++ ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
++ } while (0)
++
++/* The standard SVR4 assembler seems to require that certain builtin
++ library routines (e.g. .udiv) be explicitly declared as .globl
++ in each assembly file where they are referenced. */
++
++#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
++ ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
++
++/* This says how to output assembler code to declare an
++ uninitialized external linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++
++#define COMMON_ASM_OP ".comm"
++
++#undef ASM_OUTPUT_ALIGNED_COMMON
++#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
++do { \
++ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
++ assemble_name ((FILE), (NAME)); \
++ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
++} while (0)
++
++/* This says how to output assembler code to declare an
++ uninitialized internal linkage data object. Under SVR4,
++ the linker seems to want the alignment of data objects
++ to depend on their types. We do exactly that here. */
++
++#undef ASM_OUTPUT_ALIGNED_LOCAL
++#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
++do { \
++ if ((SIZE) <= g_switch_value) \
++ sbss_section(); \
++ else \
++ bss_section(); \
++ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ putc (',', FILE); \
++ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
++ putc ('\n', FILE); \
++ if (!flag_inhibit_size_directive) \
++ { \
++ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, ",%d\n", (SIZE)); \
++ } \
++ ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
++ ASM_OUTPUT_LABEL(FILE, NAME); \
++ ASM_OUTPUT_SKIP((FILE), (SIZE)); \
++} while (0)
++
++/* This is the pseudo-op used to generate a 64-bit word of data with a
++ specific value in some section. */
++
++#define INT_ASM_OP ".quad"
++
++/* Biggest alignment supported by the object file format of this
++ machine. Use this macro to limit the alignment which can be
++ specified using the `__attribute__ ((aligned (N)))' construct. If
++ not defined, the default value is `BIGGEST_ALIGNMENT'.
++
++ This value is really 2^63. Since gcc figures the alignment in bits,
++ we could only potentially get to 2^60 on suitible hosts. Due to other
++ considerations in varasm, we must restrict this to what fits in an int. */
++
++#define MAX_OFILE_ALIGNMENT \
++ (1 << (HOST_BITS_PER_INT < 64 ? HOST_BITS_PER_INT - 2 : 62))
++
++/* This is the pseudo-op used to generate a contiguous sequence of byte
++ values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
++ AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
++
++#undef ASCII_DATA_ASM_OP
++#define ASCII_DATA_ASM_OP ".ascii"
++
++/* Support const sections and the ctors and dtors sections for g++.
++ Note that there appears to be two different ways to support const
++ sections at the moment. You can either #define the symbol
++ READONLY_DATA_SECTION (giving it some code which switches to the
++ readonly data section) or else you can #define the symbols
++ EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
++ SELECT_RTX_SECTION. We do both here just to be on the safe side. */
++
++#define USE_CONST_SECTION 1
++
++#define CONST_SECTION_ASM_OP ".section\t.rodata"
++
++/* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
++
++ Note that we want to give these sections the SHF_WRITE attribute
++ because these sections will actually contain data (i.e. tables of
++ addresses of functions in the current root executable or shared library
++ file) and, in the case of a shared library, the relocatable addresses
++ will have to be properly resolved/relocated (and then written into) by
++ the dynamic linker when it actually attaches the given shared library
++ to the executing process. (Note that on SVR4, you may wish to use the
++ `-z text' option to the ELF linker, when building a shared library, as
++ an additional check that you are doing everything right. But if you do
++ use the `-z text' option when building a shared library, you will get
++ errors unless the .ctors and .dtors sections are marked as writable
++ via the SHF_WRITE attribute.) */
++
++#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
++#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
++
++/* Handle the small data sections. */
++#define BSS_SECTION_ASM_OP ".section\t.bss"
++#define SBSS_SECTION_ASM_OP ".section\t.sbss,\"aw\""
++#define SDATA_SECTION_ASM_OP ".section\t.sdata,\"aw\""
++
++/* On svr4, we *do* have support for the .init and .fini sections, and we
++ can put stuff in there to be executed before and after `main'. We let
++ crtstuff.c and other files know this by defining the following symbols.
++ The definitions say how to change sections to the .init and .fini
++ sections. This is the same for all known svr4 assemblers. */
++
++#define INIT_SECTION_ASM_OP ".section\t.init"
++#define FINI_SECTION_ASM_OP ".section\t.fini"
++
++/* A default list of other sections which we might be "in" at any given
++ time. For targets that use additional sections (e.g. .tdesc) you
++ should override this definition in the target-specific file which
++ includes this file. */
++
++#undef EXTRA_SECTIONS
++#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_sbss, in_sdata
++
++/* A default list of extra section function definitions. For targets
++ that use additional sections (e.g. .tdesc) you should override this
++ definition in the target-specific file which includes this file. */
++
++#undef EXTRA_SECTION_FUNCTIONS
++#define EXTRA_SECTION_FUNCTIONS \
++ CONST_SECTION_FUNCTION \
++ SECTION_FUNCTION_TEMPLATE(ctors_section, in_ctors, CTORS_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(dtors_section, in_dtors, DTORS_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP)
++
++#undef READONLY_DATA_SECTION
++#define READONLY_DATA_SECTION() const_section ()
++
++extern void text_section ();
++
++#define CONST_SECTION_FUNCTION \
++void \
++const_section () \
++{ \
++ if (!USE_CONST_SECTION) \
++ text_section(); \
++ else if (in_section != in_const) \
++ { \
++ fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
++ in_section = in_const; \
++ } \
++}
++
++#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP) \
++void FN () \
++{ \
++ if (in_section != ENUM) \
++ { \
++ fprintf (asm_out_file, "%s\n", OP); \
++ in_section = ENUM; \
++ } \
++}
++
++
++/* Switch into a generic section.
++ This is currently only used to support section attributes.
++
++ We make the section read-only and executable for a function decl,
++ read-only for a const data decl, and writable for a non-const data decl. */
++#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
++ fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
++ (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
++ (DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
++
++
++/* A C statement (sans semicolon) to output an element in the table of
++ global constructors. */
++#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
++ do { \
++ ctors_section (); \
++ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++/* A C statement (sans semicolon) to output an element in the table of
++ global destructors. */
++#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
++ do { \
++ dtors_section (); \
++ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++/* A C statement or statements to switch to the appropriate
++ section for output of DECL. DECL is either a `VAR_DECL' node
++ or a constant of some sort. RELOC indicates whether forming
++ the initial value of DECL requires link-time relocations. */
++
++#define SELECT_SECTION(DECL,RELOC) \
++{ \
++ if (TREE_CODE (DECL) == STRING_CST) \
++ { \
++ if (! flag_writable_strings) \
++ const_section (); \
++ else \
++ data_section (); \
++ } \
++ else if (TREE_CODE (DECL) == VAR_DECL) \
++ { \
++ if ((flag_pic && RELOC) \
++ || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
++ || !DECL_INITIAL (DECL) \
++ || (DECL_INITIAL (DECL) != error_mark_node \
++ && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
++ { \
++ int size = int_size_in_bytes (TREE_TYPE (DECL)); \
++ if (size >= 0 && size <= g_switch_value) \
++ sdata_section (); \
++ else \
++ data_section (); \
++ } \
++ else \
++ const_section (); \
++ } \
++ else \
++ const_section (); \
++}
++
++/* A C statement or statements to switch to the appropriate
++ section for output of RTX in mode MODE. RTX is some kind
++ of constant in RTL. The argument MODE is redundant except
++ in the case of a `const_int' rtx. Currently, these always
++ go into the const section. */
++
++#undef SELECT_RTX_SECTION
++#define SELECT_RTX_SECTION(MODE,RTX) const_section()
++
++/* Define the strings used for the special svr4 .type and .size directives.
++ These strings generally do not vary from one system running svr4 to
++ another, but if a given system (e.g. m88k running svr) needs to use
++ different pseudo-op names for these, they may be overridden in the
++ file which includes this one. */
++
++#undef TYPE_ASM_OP
++#undef SIZE_ASM_OP
++#undef SET_ASM_OP /* no equivalent */
++#define TYPE_ASM_OP ".type"
++#define SIZE_ASM_OP ".size"
++
++/* This is how we tell the assembler that two symbols have the same value. */
++
++#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
++ do { assemble_name(FILE, NAME1); \
++ fputs(" = ", FILE); \
++ assemble_name(FILE, NAME2); \
++ fputc('\n', FILE); } while (0)
++
++/* These macros generate the special .type and .size directives which
++ are used to set the corresponding fields of the linker symbol table
++ entries in an ELF object file under SVR4. These macros also output
++ the starting labels for the relevant functions/objects. */
++
++/* Write the extra assembler code needed to declare an object properly. */
++
++#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
++ do { \
++ fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ putc (',', FILE); \
++ fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
++ putc ('\n', FILE); \
++ size_directive_output = 0; \
++ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
++ { \
++ size_directive_output = 1; \
++ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
++ } \
++ ASM_OUTPUT_LABEL(FILE, NAME); \
++ } while (0)
++
++/* Output the size directive for a decl in rest_of_decl_compilation
++ in the case where we did not do so before the initializer.
++ Once we find the error_mark_node, we know that the value of
++ size_directive_output was set
++ by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
++
++#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
++do { \
++ char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
++ if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
++ && ! AT_END && TOP_LEVEL \
++ && DECL_INITIAL (DECL) == error_mark_node \
++ && !size_directive_output) \
++ { \
++ size_directive_output = 1; \
++ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
++ assemble_name (FILE, name); \
++ putc (',', FILE); \
++ fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
++ int_size_in_bytes (TREE_TYPE (DECL))); \
++ putc ('\n', FILE); \
++ } \
++} while (0)
++
++/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
++ ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
++ corresponds to a particular byte value [0..255]. For any
++ given byte value, if the value in the corresponding table
++ position is zero, the given character can be output directly.
++ If the table value is 1, the byte must be output as a \ooo
++ octal escape. If the tables value is anything else, then the
++ byte value should be output as a \ followed by the value
++ in the table. Note that we can use standard UN*X escape
++ sequences for many control characters, but we don't use
++ \a to represent BEL because some svr4 assemblers (e.g. on
++ the i386) don't know about that. Also, we don't use \v
++ since some versions of gas, such as 2.2 did not accept it. */
++
++#define ESCAPES \
++"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
++\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
++\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
++\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
++\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
++
++/* Some svr4 assemblers have a limit on the number of characters which
++ can appear in the operand of a .string directive. If your assembler
++ has such a limitation, you should define STRING_LIMIT to reflect that
++ limit. Note that at least some svr4 assemblers have a limit on the
++ actual number of bytes in the double-quoted string, and that they
++ count each character in an escape sequence as one byte. Thus, an
++ escape sequence like \377 would count as four bytes.
++
++ If your target assembler doesn't support the .string directive, you
++ should define this to zero.
++*/
++
++#define STRING_LIMIT ((unsigned) 256)
++
++#define STRING_ASM_OP ".string"
++
++/* GAS is the only Alpha/ELF assembler. */
++#undef TARGET_GAS
++#define TARGET_GAS (1)
++
++#undef PREFERRED_DEBUGGING_TYPE
++#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+
-+/* Use sjlj exceptions. */
-+#define DWARF2_UNWIND_INFO 0
++/* Undo the auto-alignment stuff from alpha.h. ELF has unaligned data
++ pseudos natively. */
++#undef UNALIGNED_SHORT_ASM_OP
++#undef UNALIGNED_INT_ASM_OP
++#undef UNALIGNED_DOUBLE_INT_ASM_OP
diff --git a/lang/gcc/patches/patch-af b/lang/gcc/patches/patch-af
index 4a2c0df1c6a..615afd571cf 100644
--- a/lang/gcc/patches/patch-af
+++ b/lang/gcc/patches/patch-af
@@ -1,177 +1,114 @@
-$NetBSD: patch-af,v 1.2 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-af,v 1.3 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/netbsd64.h.orig Fri Apr 27 10:59:15 2001
-+++ ../gcc-2.95.2/gcc/config/sparc/netbsd64.h
-@@ -0,0 +1,172 @@
-+/* NetBSD/sparc64 ELF configuration */
-+
-+/*
-+ * Pull in generic SPARC64 ELF configuration, and then clean up
-+ * afterwards
-+ */
-+
-+/* Let us output 32 bit code as well */
-+#define SPARC_BI_ARCH
-+
-+/* Name the target CPU. This must be before <sparc/sparc.h>. */
-+#ifndef TARGET_CPU_DEFAULT
-+#define TARGET_CPU_DEFAULT TARGET_CPU_ultrasparc
-+#endif
-+
-+#include <sparc/sp64-elf.h>
-+
-+#include <sparc/netbsd-elf-common.h>
-+
-+#undef CPP_SUBTARGET_SPEC
-+#define CPP_SUBTARGET_SPEC "-D__sparc64__"
-+
-+#undef LINK_SPEC64
-+#define LINK_SPEC64 \
-+ "-m elf64_sparc \
-+ %{assert*} %{R*} \
-+ %{shared:-shared} \
-+ %{!shared: \
-+ -dy -dc -dp \
-+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
-+ %{!static: \
-+ %{rdynamic:-export-dynamic} \
-+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
-+ %{static:-static}}"
-+
-+#undef LINK_SPEC
-+#define LINK_SPEC LINK_SPEC64
-+
-+#ifdef SPARC_BI_ARCH
-+
-+#undef STARTFILE_SPEC64
-+#define STARTFILE_SPEC64 \
-+ "%{!shared: \
-+ %{pg:gcrt0%O%s} \
-+ %{!pg: \
-+ %{p:gcrt0%O%s} \
-+ %{!p:crt0%O%s}}} \
-+ %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}"
-+
-+#undef STARTFILE_SPEC32
-+#define STARTFILE_SPEC32 \
-+ "%{!shared: \
-+ %{pg:/emul/netbsd32/usr/lib/gcrt0%O%s} \
-+ %{!pg: \
-+ %{p:/emul/netbsd32/usr/lib/gcrt0%O%s} \
-+ %{!p:/emul/netbsd32/usr/lib/crt0%O%s}}} \
-+ %{!shared:/emul/netbsd32/usr/lib/crtbegin%O%s} %{shared:/emul/netbsd32/usr/lib/crtbeginS%O%s}"
-+
-+#undef STARTFILE_SPEC
-+#if DEFAULT_ARCH32_P
-+#define STARTFILE_SPEC "\
-+%{m32:" STARTFILE_SPEC32 "} \
-+%{m64:" STARTFILE_SPEC64 "} \
-+%{!m32:%{!m64:" STARTFILE_SPEC32 "}}"
-+#else
-+#define STARTFILE_SPEC "\
-+%{m32:" STARTFILE_SPEC32 "} \
-+%{m64:" STARTFILE_SPEC64 "} \
-+%{!m32:%{!m64:" STARTFILE_SPEC64 "}}"
-+#endif
-+
-+#undef ENDFILE_SPEC64
-+#define ENDFILE_SPEC64 \
-+ "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
-+
-+#undef ENDFILE_SPEC32
-+#define ENDFILE_SPEC32 \
-+ "%{!shared:/emul/netbsd32/usr/lib/crtend%O%s} %{shared:/emul/netbsd32/usr/lib/crtendS%O%s}"
-+
-+#undef ENDFILE_SPEC
-+#if DEFAULT_ARCH32_P
-+#define ENDFILE_SPEC "\
-+%{m32:" ENDFILE_SPEC32 "} \
-+%{m64:" ENDFILE_SPEC64 "} \
-+%{!m32:%{!m64:" ENDFILE_SPEC32 "}}"
-+#else
-+#define ENDFILE_SPEC "\
-+%{m32:" ENDFILE_SPEC32 "} \
-+%{m64:" ENDFILE_SPEC64 "} \
-+%{!m32:%{!m64:" ENDFILE_SPEC64 "}}"
-+#endif
-+
-+#undef SUBTARGET_EXTRA_SPECS
-+#define SUBTARGET_EXTRA_SPECS \
-+ { "link_arch32", LINK_ARCH32_SPEC }, \
-+ { "link_arch64", LINK_ARCH64_SPEC }, \
-+ { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \
-+ { "link_arch", LINK_ARCH_SPEC },
-+
-+#undef LINK_ARCH32_SPEC
-+#define LINK_ARCH32_SPEC \
-+ "-m elf32_sparc \
-+ -Y P,/emul/netbsd32/usr/lib \
-+ %{assert*} %{R*} \
-+ %{shared:-shared} \
-+ %{!shared: \
-+ -dy -dc -dp \
-+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
-+ %{!static: \
-+ %{rdynamic:-export-dynamic} \
-+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
-+ %{static:-static}}"
-+
-+#undef LINK_ARCH64_SPEC
-+#define LINK_ARCH64_SPEC LINK_SPEC64
-+
-+#define LINK_ARCH_SPEC "\
-+%{m32:%(link_arch32)} \
-+%{m64:%(link_arch64)} \
-+%{!m32:%{!m64:%(link_arch_default)}} \
-+"
-+
-+#define LINK_ARCH_DEFAULT_SPEC \
-+(DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC)
-+
-+#undef LINK_SPEC
-+#define LINK_SPEC "\
-+%(link_arch) \
-+%{mlittle-endian:-EL} \
-+"
-+
-+#undef CC1_SPEC
-+#if DEFAULT_ARCH32_P
-+#define CC1_SPEC "\
-+%{sun4:} %{target:} \
-+%{mcypress:-mcpu=cypress} \
-+%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
-+%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
-+%{m64:-mptr64 -mcpu=ultrasparc -mstack-bias} \
-+"
-+#else
-+#define CC1_SPEC "\
-+%{sun4:} %{target:} \
-+%{mcypress:-mcpu=cypress} \
-+%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \
-+%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \
-+%{m32:-mptr32 -mcpu=cypress -mno-stack-bias} \
-+"
-+#endif
-+
-+#if DEFAULT_ARCH32_P
-+#define MULTILIB_DEFAULTS { "m32" }
-+#else
-+#define MULTILIB_DEFAULTS { "m64" }
-+#endif
-+
-+#undef CPP_SUBTARGET_SPEC
-+#define CPP_SUBTARGET_SPEC \
-+(DEFAULT_ARCH32_P ? "\
-+%{m64:-D__sparc64__}%{!m64:-D__sparc} \
-+" : "\
-+%{!m32:-D__sparc64__}%{m32:-D__sparc} \
-+")
-+
-+#endif /* SPARC_BI_ARCH */
-+
-+/* Name the port. */
-+#undef TARGET_NAME
-+#define TARGET_NAME "sparc64-netbsd"
-+
-+/* Use sjlj exceptions. */
-+#define DWARF2_UNWIND_INFO 0
+--- ../gcc-2.95.3/gcc/config/arm/arm.c.orig Thu Jan 25 15:03:24 2001
++++ ../gcc-2.95.3/gcc/config/arm/arm.c Thu Jan 3 20:37:53 2002
+@@ -281,7 +281,7 @@
+
+ if (ptr->string != NULL && ptr->string[0] != '\0')
+ {
+- struct processors * sel;
++ const struct processors * sel;
+
+ for (sel = ptr->processors; sel->name != NULL; sel ++)
+ if (streq (ptr->string, sel->name))
+@@ -566,7 +566,7 @@
+ if (!reload_completed
+ || current_function_pretend_args_size
+ || current_function_anonymous_args
+- || ((get_frame_size () + current_function_outgoing_args_size != 0)
++ || ((arm_get_frame_size () + current_function_outgoing_args_size != 0)
+ && !(TARGET_APCS && frame_pointer_needed)))
+ return 0;
+
+@@ -5397,6 +5397,18 @@
+ return "";
+ }
+
++/* Generate a sequence of insns that will generate the correct return
++ address mask depending on the physical architecture that the program
++ is running on. */
++rtx
++arm_gen_return_addr_mask ()
++{
++ rtx reg = gen_reg_rtx (Pmode);
++
++ emit_insn (gen_return_addr_mask (reg));
++ return reg;
++}
++
+ /* Return nonzero if optimizing and the current function is volatile.
+ Such functions never return, and many memory cycles can be saved
+ by not storing register values that will never be needed again.
+@@ -5828,11 +5840,71 @@
+ emit_insn (par);
+ }
+
++/* Calculate the size of the stack frame, taking into account any
++ padding that is required to ensure stack-alignment. */
++int arm_get_frame_size ()
++{
++ int regno;
++
++ int base_size = (get_frame_size () + 3) & ~3;
++ int entry_size = 0;
++ int live_regs_mask = 0;
++ int volatile_func = (optimize > 0
++ && TREE_THIS_VOLATILE (current_function_decl));
++
++ if (! TARGET_ATPCS_STACK_ALIGN)
++ return base_size;
++
++ /* We know that SP will be word aligned on entry, and we must
++ preserve that condition at any subroutine call. But those are
++ the only constraints. */
++
++ /* Space for variadic functions. */
++ if (current_function_pretend_args_size)
++ entry_size += current_function_pretend_args_size;
++
++ if (! volatile_func)
++ {
++ for (regno = 0; regno <= 10; regno++)
++ if (regs_ever_live[regno] && ! call_used_regs[regno])
++ live_regs_mask |= 1 << regno;
++
++ if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
++ live_regs_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
++
++ if (regs_ever_live[14])
++ live_regs_mask |= 0x4000;
++ }
++
++ if (frame_pointer_needed)
++ live_regs_mask |= 0xD800;
++
++ /* If we have to push any registers, we must also push lr as well. */
++ if (live_regs_mask)
++ live_regs_mask |= 0x4000;
++
++ for (regno = 0; regno < 16; regno++)
++ if (live_regs_mask & (1 << regno))
++ entry_size += 4;
++
++ if (! volatile_func)
++ {
++ for (regno = 23; regno > 15; regno--)
++ if (regs_ever_live[regno] && ! call_used_regs[regno])
++ entry_size += 12;
++ }
++
++ if ((entry_size + base_size + current_function_outgoing_args_size) & 7)
++ base_size += 4;
++
++ return base_size;
++}
++
+ void
+ arm_expand_prologue ()
+ {
+ int reg;
+- rtx amount = GEN_INT (-(get_frame_size ()
++ rtx amount = GEN_INT (-(arm_get_frame_size ()
+ + current_function_outgoing_args_size));
+ int live_regs_mask = 0;
+ int store_arg_regs = 0;
diff --git a/lang/gcc/patches/patch-ag b/lang/gcc/patches/patch-ag
index ce8909f1bc0..2052efa6da2 100644
--- a/lang/gcc/patches/patch-ag
+++ b/lang/gcc/patches/patch-ag
@@ -1,16 +1,106 @@
-$NetBSD: patch-ag,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ag,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/sparc.md.orig Thu Oct 21 07:35:40 1999
-+++ ../gcc-2.95.2/gcc/config/sparc/sparc.md Sat Sep 16 00:17:42 2000
-@@ -3472,10 +3472,7 @@
- (define_split
- [(set (match_operand:TF 0 "register_operand" "")
- (match_operand:TF 1 "register_operand" ""))]
-- "reload_completed
-- && (! TARGET_ARCH64
-- || (TARGET_FPU
-- && ! TARGET_HARD_QUAD))"
-+ "reload_completed"
- [(clobber (const_int 0))]
- "
- {
+--- ../gcc-2.95.3/gcc/config/arm/arm.h.orig Thu Jan 25 15:03:26 2001
++++ ../gcc-2.95.3/gcc/config/arm/arm.h Thu Jan 3 20:37:53 2002
+@@ -199,7 +199,9 @@
+ "
+
+ /* Default is hard float, which doesn't define anything */
++#ifndef CPP_FLOAT_DEFAULT_SPEC
+ #define CPP_FLOAT_DEFAULT_SPEC ""
++#endif
+
+ #define CPP_ENDIAN_SPEC "\
+ %{mbig-endian: \
+@@ -210,7 +212,9 @@
+ "
+
+ /* Default is little endian, which doesn't define anything. */
++#ifndef CPP_ENDIAN_DEFAULT_SPEC
+ #define CPP_ENDIAN_DEFAULT_SPEC ""
++#endif
+
+ #define CC1_SPEC ""
+
+@@ -310,6 +314,10 @@
+ function tries to return. */
+ #define ARM_FLAG_ABORT_NORETURN (0x8000)
+
++/* Nonzero if the stack should be 64-bit aligned at function boundaries,
++ as mandated by the ATPCS. */
++#define ARM_FLAG_ATPCS_STACK_ALIGN (0x10000)
++
+ #define TARGET_APCS (target_flags & ARM_FLAG_APCS_FRAME)
+ #define TARGET_POKE_FUNCTION_NAME (target_flags & ARM_FLAG_POKE)
+ #define TARGET_FPE (target_flags & ARM_FLAG_FPE)
+@@ -332,6 +340,7 @@
+ #define TARGET_LITTLE_WORDS (target_flags & ARM_FLAG_LITTLE_WORDS)
+ #define TARGET_NO_SCHED_PRO (target_flags & ARM_FLAG_NO_SCHED_PRO)
+ #define TARGET_ABORT_NORETURN (target_flags & ARM_FLAG_ABORT_NORETURN)
++#define TARGET_ATPCS_STACK_ALIGN (target_flags & ARM_FLAG_ATPCS_STACK_ALIGN)
+
+ /* SUBTARGET_SWITCHES is used to add flags on a per-config basis.
+ Bit 31 is reserved. See riscix.h. */
+@@ -590,6 +599,8 @@
+
+ #define STACK_BOUNDARY 32
+
++#define PREFERRED_STACK_BOUNDARY (TARGET_ATPCS_STACK_ALIGN ? 64 : 32)
++
+ #define FUNCTION_BOUNDARY 32
+
+ #define EMPTY_FIELD_BOUNDARY 32
+@@ -1252,7 +1263,7 @@
+ else if ((FROM) == FRAME_POINTER_REGNUM \
+ && (TO) == STACK_POINTER_REGNUM) \
+ (OFFSET) = (current_function_outgoing_args_size \
+- + ((get_frame_size () + 3) & ~3)); \
++ + arm_get_frame_size ()); \
+ else \
+ { \
+ int regno; \
+@@ -1281,7 +1292,7 @@
+ && (regs_ever_live[14] || saved_hard_reg)) \
+ offset += 4; \
+ offset += current_function_outgoing_args_size; \
+- (OFFSET) = ((get_frame_size () + 3) & ~3) + offset; \
++ (OFFSET) = arm_get_frame_size () + offset; \
+ } \
+ } \
+ }
+@@ -2113,12 +2124,16 @@
+
+ /* Used to mask out junk bits from the return address, such as
+ processor state, interrupt status, condition codes and the like. */
+-#define MASK_RETURN_ADDR \
++#define MASK_RETURN_ADDR \
+ /* If we are generating code for an ARM2/ARM3 machine or for an ARM6 \
+ in 26 bit mode, the condition codes must be masked out of the \
+ return address. This does not apply to ARM6 and later processors \
+- when running in 32 bit mode. */ \
+- ((!TARGET_APCS_32) ? (GEN_INT (0x03fffffc)) : (GEN_INT (0xffffffff)))
++ when running in 32 bit mode, but if we are not targeting archv4 \
++ or later, assume this may be ARM2/3 running in 32-bit compatible \
++ code mode. */ \
++ ((!TARGET_APCS_32) ? (GEN_INT (0x03fffffc)) \
++ : arm_arch4 ? (GEN_INT (0xffffffff)) \
++ : arm_gen_return_addr_mask ())
+
+ /* The remainder of this file is only needed for building the compiler
+ itself, not for the collateral. */
+@@ -2217,6 +2232,7 @@
+ Rtx gen_rotated_half_load PROTO ((Rtx));
+ Mmode arm_select_cc_mode RTX_CODE_PROTO ((Rcode, Rtx, Rtx));
+ Rtx gen_compare_reg RTX_CODE_PROTO ((Rcode, Rtx, Rtx, int));
++Rtx arm_gen_return_addr_mask PROTO ((void));
+ void arm_reload_in_hi PROTO ((Rtx *));
+ void arm_reload_out_hi PROTO ((Rtx *));
+ void arm_reorg PROTO ((Rtx));
+@@ -2239,6 +2255,7 @@
+ void arm_poke_function_name STDIO_PROTO ((FILE *, char *));
+ void output_func_prologue STDIO_PROTO ((FILE *, int));
+ void output_func_epilogue STDIO_PROTO ((FILE *, int));
++int arm_get_frame_size PROTO ((void));
+ void arm_expand_prologue PROTO ((void));
+ void arm_print_operand STDIO_PROTO ((FILE *, Rtx, int));
+ void arm_final_prescan_insn PROTO ((Rtx));
diff --git a/lang/gcc/patches/patch-ah b/lang/gcc/patches/patch-ah
index 7f3519b0304..be1e5b016ec 100644
--- a/lang/gcc/patches/patch-ah
+++ b/lang/gcc/patches/patch-ah
@@ -1,34 +1,46 @@
-$NetBSD: patch-ah,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ah,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/sysv4.h.orig Mon Jun 21 19:48:53 1999
-+++ ../gcc-2.95.2/gcc/config/sparc/sysv4.h Sat Sep 16 00:17:42 2000
-@@ -210,6 +210,29 @@
- #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
- asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
-
-+/* A C statement (sans semicolon) to output an element in the table of
-+ global constructors. */
-+#undef ASM_OUTPUT_CONSTRUCTOR
-+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
-+ do { \
-+ ctors_section (); \
-+ fprintf (FILE, "\t%s\t ", TARGET_ARCH64 ? ASM_LONGLONG : INT_ASM_OP); \
-+ assemble_name (FILE, NAME); \
-+ fprintf (FILE, "\n"); \
-+ } while (0)
-+
-+/* A C statement (sans semicolon) to output an element in the table of
-+ global destructors. */
-+#undef ASM_OUTPUT_DESTRUCTOR
-+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
-+ do { \
-+ dtors_section (); \
-+ fprintf (FILE, "\t%s\t ", TARGET_ARCH64 ? ASM_LONGLONG : INT_ASM_OP); \
-+ assemble_name (FILE, NAME); \
-+ fprintf (FILE, "\n"); \
-+ } while (0)
+--- ../gcc-2.95.3/gcc/config/arm/arm.md.orig Thu Jan 25 15:03:27 2001
++++ ../gcc-2.95.3/gcc/config/arm/arm.md Thu Jan 3 20:37:53 2002
+@@ -1682,9 +1682,9 @@
+ (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])
+ (match_operand:SI 1 "s_register_operand" "0,?r")]))
+ (clobber (reg:CC 24))]
+- "GET_CODE (operands[1]) != REG
++ "0 && (GET_CODE (operands[1]) != REG
+ || (REGNO(operands[1]) != FRAME_POINTER_REGNUM
+- && REGNO(operands[1]) != ARG_POINTER_REGNUM)"
++ && REGNO(operands[1]) != ARG_POINTER_REGNUM))"
+ "*
+ {
+ enum rtx_code code = GET_CODE (operands[4]);
+@@ -4322,6 +4322,29 @@
+ }"
+ [(set_attr "conds" "use")
+ (set_attr "type" "load")])
+
++(define_expand "return_addr_mask"
++ [(set (match_dup 1)
++ (compare:CC_NOOV (unspec [(const_int 0)] 4)
++ (const_int 0)))
++ (set (match_operand:SI 0 "s_register_operand" "")
++ (if_then_else:SI (eq (match_dup 1) (const_int 0))
++ (const_int -1)
++ (const_int 67108860)))] ; 0x03fffffc
++ ""
++ "
++ operands[1] = gen_rtx_REG (CC_NOOVmode, 24);
++ ")
+
- /* Override the name of the mcount profiling function. */
++(define_insn "*check_arch2"
++ [(set (match_operand:CC_NOOV 0 "cc_register" "")
++ (compare:CC_NOOV (unspec [(const_int 0)] 4)
++ (const_int 0)))]
++ ""
++ "teq\\t%|r0, %|r0\;teq\\t%|pc, %|pc"
++ [(set_attr "length" "8")
++ (set_attr "conds" "set")]
++)
+
+ ;; Call subroutine returning any type.
- #undef MCOUNT_FUNCTION
diff --git a/lang/gcc/patches/patch-ai b/lang/gcc/patches/patch-ai
index db6cae11bd9..c36970da5e0 100644
--- a/lang/gcc/patches/patch-ai
+++ b/lang/gcc/patches/patch-ai
@@ -1,9 +1,72 @@
-$NetBSD: patch-ai,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ai,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/xm-netbsd.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/sparc/xm-netbsd.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,4 @@
-+/* Configuration for GCC for Sun SPARC running NetBSD as host. */
+--- ../gcc-2.95.3/gcc/config/arm/elf.h.orig Mon May 31 10:21:53 1999
++++ ../gcc-2.95.3/gcc/config/arm/elf.h Thu Jan 3 20:37:53 2002
+@@ -163,6 +163,15 @@
+ #define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32)
+ #endif
+
++/* Set CPP macros to reflect TARGET_DEFAULT */
++#ifndef CPP_FLOAT_DEFAULT_SPEC
++#define CPP_FLOAT_DEFAULT_SPEC "-D__SOFTFP__"
++#endif
+
-+#include <sparc/xm-sparc.h>
-+#include <xm-netbsd.h>
++#ifndef CPP_APCS_PC_DEFAULT_SPEC
++#define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
++#endif
++
+ #ifndef MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS { "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
+ #endif
+@@ -350,5 +359,51 @@
+ /* Align output to a power of two. */
+ #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
+ fprintf (STREAM, "\t.align\t%d\n", POWER)
++
++/* following ripped from elfos.h */
++/* Switch into a generic section.
++ This is currently only used to support section attributes. */
++
++#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
++do { \
++ static struct section_info \
++ { \
++ struct section_info *next; \
++ char *name; \
++ enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type; \
++ } *sections; \
++ struct section_info *s; \
++ char *mode; \
++ enum sect_enum type; \
++ \
++ for (s = sections; s; s = s->next) \
++ if (!strcmp (NAME, s->name)) \
++ break; \
++ \
++ if (DECL && TREE_CODE (DECL) == FUNCTION_DECL) \
++ type = SECT_EXEC, mode = "ax"; \
++ else if (DECL && DECL_READONLY_SECTION (DECL, RELOC)) \
++ type = SECT_RO, mode = "a"; \
++ else \
++ type = SECT_RW, mode = "aw"; \
++ \
++ if (s == 0) \
++ { \
++ s = (struct section_info *) xmalloc (sizeof (struct section_info)); \
++ s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME)); \
++ strcpy (s->name, NAME); \
++ s->type = type; \
++ s->next = sections; \
++ sections = s; \
++ fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, mode); \
++ } \
++ else \
++ { \
++ if (DECL && s->type != type) \
++ error_with_decl (DECL, "%s causes a section type conflict"); \
++ \
++ fprintf (FILE, ".section\t%s\n", NAME); \
++ } \
++} while (0)
+
+ #include "arm/aout.h"
diff --git a/lang/gcc/patches/patch-aj b/lang/gcc/patches/patch-aj
index 7c4f566703e..18a1d443d77 100644
--- a/lang/gcc/patches/patch-aj
+++ b/lang/gcc/patches/patch-aj
@@ -1,9 +1,86 @@
-$NetBSD: patch-aj,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-aj,v 1.2 2002/01/03 20:40:42 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/xm-netbsd64.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/sparc/xm-netbsd64.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,4 @@
-+/* Configuration for GCC for Sun SPARC V9 running NetBSD as host. */
+--- ../gcc-2.95.3/gcc/config/arm/netbsd.h.orig Mon Jan 11 14:33:58 1999
++++ ../gcc-2.95.3/gcc/config/arm/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -1,4 +1,4 @@
+-/* NetBSD/arm (RiscBSD) version.
++/* NetBSD/arm32 version.
+ Copyright (C) 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
+ Contributed by Mark Brinicombe (amb@physig.ph.kcl.ac.uk)
+
+@@ -46,24 +46,28 @@
+
+ #include <netbsd.h>
+
++/* NetBSD uses gas so we want to use .ident */
++#undef ASM_OUTPUT_IDENT
++#define ASM_OUTPUT_IDENT(STREAM,STRING) \
++ fprintf (STREAM,"\t.ident \"%s\"\n",STRING)
+
-+#include <xm-netbsd.h>
-+#include <sparc/xm-sp64.h>
++/* On the ARM `@' introduces a comment, so we must use something else
++ for .type directives. Most NetBSD platforms use %, but we use #
++ because of some legacy assemblers. */
++#undef TYPE_OPERAND_FMT
++#define TYPE_OPERAND_FMT "#%s"
++
+ /* Until they use ELF or something that handles dwarf2 unwinds
+ and initialization stuff better. */
+ #undef DWARF2_UNWIND_INFO
+
+-/* Some defines for CPP.
+- arm32 is the NetBSD port name, so we always define arm32 and __arm32__. */
++/* Some defines for CPP. arm32 is the NetBSD port name, so we always (only)
++ define __arm32__ and __NetBSD__, and add __KPRINTF_ATTRIBUTE__ since
++ this compiler is hacked with the NetBSD kprintf attribute mods. */
+ #undef CPP_PREDEFINES
+-#define CPP_PREDEFINES "\
+--Dunix -Driscbsd -Darm32 -D__arm32__ -D__arm__ -D__NetBSD__ \
++#define CPP_PREDEFINES "-D__arm32__ -D__arm__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__ \
+ -Asystem(unix) -Asystem(NetBSD) -Acpu(arm) -Amachine(arm)"
+
+-/* Define _POSIX_SOURCE if necessary. */
+-#undef CPP_SPEC
+-#define CPP_SPEC "\
+-%(cpp_cpu_arch) %(cpp_apcs_pc) %(cpp_float) %(cpp_endian) \
+-%{posix:-D_POSIX_SOURCE} \
+-"
+-
+ /* Because TARGET_DEFAULT sets ARM_FLAG_APCS_32 */
+ #undef CPP_APCS_PC_DEFAULT_SPEC
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+@@ -72,13 +76,6 @@
+ #undef CPP_FLOAT_DEFAULT_SPEC
+ #define CPP_FLOAT_DEFAULT_SPEC "-D__SOFTFP__"
+
+-/* Pass -X to the linker so that it will strip symbols starting with 'L' */
+-#undef LINK_SPEC
+-#define LINK_SPEC "\
+--X %{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} \
+-%{static:-Bstatic} %{assert*} \
+-"
+-
+ #undef SIZE_TYPE
+ #define SIZE_TYPE "unsigned int"
+
+@@ -94,6 +91,9 @@
+ #undef WCHAR_TYPE_SIZE
+ #define WCHAR_TYPE_SIZE 32
+
++#undef MAX_WCHAR_TYPE_SIZE
++#define MAX_WCHAR_TYPE_SIZE 16
++
+ #define HANDLE_SYSV_PRAGMA
+
+ /* We don't have any limit on the length as out debugger is GDB. */
+@@ -111,11 +111,6 @@
+ fprintf(STREAM, "\tmov\t%sip, %slr\n", REGISTER_PREFIX, REGISTER_PREFIX); \
+ fprintf(STREAM, "\tbl\tmcount\n"); \
+ }
+-
+-/* On the ARM `@' introduces a comment, so we must use something else
+- for .type directives. */
+-#undef TYPE_OPERAND_FMT
+-#define TYPE_OPERAND_FMT "%%%s"
+
+ /* NetBSD uses the old PCC style aggregate returning conventions. */
+ #undef DEFAULT_PCC_STRUCT_RETURN
diff --git a/lang/gcc/patches/patch-ak b/lang/gcc/patches/patch-ak
index 30c0514f068..0c04fca6f35 100644
--- a/lang/gcc/patches/patch-ak
+++ b/lang/gcc/patches/patch-ak
@@ -1,49 +1,13 @@
-$NetBSD: patch-ak,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ak,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/elfos.h.orig Fri Mar 26 11:45:26 1999
-+++ ../gcc-2.95.2/gcc/config/elfos.h Sat Sep 16 00:17:42 2000
-@@ -48,6 +48,7 @@
+--- ../gcc-2.95.3/gcc/config/i386/gas.h.orig Fri Apr 9 22:31:32 1999
++++ ../gcc-2.95.3/gcc/config/i386/gas.h Thu Jan 3 20:37:53 2002
+@@ -150,7 +150,7 @@
- /* Output #ident as a .ident. */
-
-+#undef ASM_OUTPUT_IDENT
- #define ASM_OUTPUT_IDENT(FILE, NAME) \
- fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
-
-@@ -92,6 +93,10 @@
- #undef SET_ASM_OP
- #define SET_ASM_OP ".set"
-
-+/* We want local labels to start with period if made with asm_fprintf. */
-+#undef LOCAL_LABEL_PREFIX
-+#define LOCAL_LABEL_PREFIX "."
-+
- /* This is how to begin an assembly language file. Most svr4 assemblers want
- at least a .file directive to come first, and some want to see a .version
- directive come right after that. Here we just establish a default
-@@ -130,7 +135,7 @@
- #undef ASM_OUTPUT_INTERNAL_LABEL
- #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
- do { \
-- fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
-+ fprintf (FILE, "%s%s%d:\n", LOCAL_LABEL_PREFIX, PREFIX, NUM); \
- } while (0)
-
- /* This is how to store into the string LABEL
-@@ -144,7 +149,7 @@
#undef ASM_GENERATE_INTERNAL_LABEL
- #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
- do { \
-- sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
-+ sprintf (LABEL, "*%s%s%d", LOCAL_LABEL_PREFIX, PREFIX, NUM); \
- } while (0)
-
- /* Output the label which precedes a jumptable. Note that for all svr4
-@@ -461,6 +466,7 @@
-
- /* This is how we tell the assembler that a symbol is weak. */
+ #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
+- sprintf ((BUF), ".%s%d", (PREFIX), (NUMBER))
++ sprintf ((BUF), "*.%s%d", (PREFIX), (NUMBER))
-+#undef ASM_WEAKEN_LABEL
- #define ASM_WEAKEN_LABEL(FILE,NAME) \
- do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
- fputc ('\n', FILE); } while (0)
+ /* This is how to output an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
diff --git a/lang/gcc/patches/patch-al b/lang/gcc/patches/patch-al
index 5515369792d..acd8f0f58ac 100644
--- a/lang/gcc/patches/patch-al
+++ b/lang/gcc/patches/patch-al
@@ -1,113 +1,53 @@
-$NetBSD: patch-al,v 1.4 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-al,v 1.5 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/netbsd.h.orig Wed Dec 16 20:59:58 1998
-+++ ../gcc-2.95.2/gcc/config/netbsd.h
-@@ -48,17 +48,38 @@
- #define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k -K}"
+--- ../gcc-2.95.3/gcc/config/i386/i386.h.orig Sun Apr 25 13:43:49 1999
++++ ../gcc-2.95.3/gcc/config/i386/i386.h Thu Jan 3 20:37:53 2002
+@@ -258,15 +258,15 @@
+ option if the fixed part matches. The actual option name is made
+ by appending `-m' to the specified name. */
+ #define TARGET_OPTIONS \
+-{ { "cpu=", &ix86_cpu_string, "Schedule code for given CPU"}, \
+- { "arch=", &ix86_arch_string, "Generate code for given CPU"}, \
+- { "reg-alloc=", &i386_reg_alloc_order, "Control allocation order of integer registers" }, \
+- { "regparm=", &i386_regparm_string, "Number of registers used to pass integer arguments" }, \
+- { "align-loops=", &i386_align_loops_string, "Loop code aligned to this power of 2" }, \
+- { "align-jumps=", &i386_align_jumps_string, "Jump targets are aligned to this power of 2" }, \
+- { "align-functions=", &i386_align_funcs_string, "Function starts are aligned to this power of 2" }, \
+- { "preferred-stack-boundary=", &i386_preferred_stack_boundary_string, "Attempt to keep stack aligned to this power of 2" }, \
+- { "branch-cost=", &i386_branch_cost_string, "Branches are this expensive (1-5, arbitrary units)" }, \
++{ { "cpu=", (const char **)&ix86_cpu_string, "Schedule code for given CPU"}, \
++ { "arch=", (const char **)&ix86_arch_string, "Generate code for given CPU"}, \
++ { "reg-alloc=", (const char **)&i386_reg_alloc_order, "Control allocation order of integer registers" }, \
++ { "regparm=", (const char **)&i386_regparm_string, "Number of registers used to pass integer arguments" }, \
++ { "align-loops=", (const char **)&i386_align_loops_string, "Loop code aligned to this power of 2" }, \
++ { "align-jumps=", (const char **)&i386_align_jumps_string, "Jump targets are aligned to this power of 2" }, \
++ { "align-functions=", (const char **)&i386_align_funcs_string, "Function starts are aligned to this power of 2" }, \
++ { "preferred-stack-boundary=", (const char **)&i386_preferred_stack_boundary_string, "Attempt to keep stack aligned to this power of 2" }, \
++ { "branch-cost=", (const char **)&i386_branch_cost_string, "Branches are this expensive (1-5, arbitrary units)" }, \
+ SUBTARGET_OPTIONS \
+ }
- /* Provide a LIB_SPEC appropriate for NetBSD. Just select the appropriate
-- libc, depending on whether we're doing profiling. */
-+ libc, depending on whether we're doing profiling; if `-posix' is specified,
-+ link against the appropriate libposix first. Don't include libc when
-+ linking a shared library. */
+@@ -2773,15 +2773,15 @@
+ #endif
- #undef LIB_SPEC
--#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
-+#define LIB_SPEC \
-+ "%{posix:%{!p:%{!pg:-lposix}}%{p:-lposix_p}%{pg:-lposix_p}} \
-+ %{!shared:%{!symbolic:%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}}"
-+
-+/* Provide a LIBGCC_SPEC appropriate for NetBSD. We also want to exclude
-+ libgcc when -symbolic. */
-+
-+#undef LIBGCC_SPEC
-+#define LIBGCC_SPEC "%{!shared:%{!symbolic:-lgcc}}"
-+
-+/* #ifdef NETBSD_AOUT */
-+
-+/* Provide a STARTFILE_SPEC appropriate for NetBSD a.out. Here we
-+ provide support for the special GCC option -static. */
-+
-+#undef STARTFILE_SPEC
-+#define STARTFILE_SPEC \
-+ "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:%{!static:crt0%O%s}%{static:scrt0%O%s}}}} %{shared:c++rt0%O%s}"
-
- /* Provide a LINK_SPEC appropriate for NetBSD. Here we provide support
- for the special GCC options -static, -assert, and -nostdlib. */
-
- #undef LINK_SPEC
- #define LINK_SPEC \
-- "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} %{static:-Bstatic} %{assert*}"
-+ "%{nostdlib:-nostdlib} %{!shared:%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{static:-Bstatic}} %{shared:-Bshareable} %{R*} %{assert*}"
-+
-+/* #endif NETBSD_AOUT */
-
- /* This defines which switch letters take arguments. */
- #undef SWITCH_TAKES_ARG
-@@ -127,6 +148,9 @@
- entries in an ELF object file under SVR4. These macros also output
- the starting labels for the relevant functions/objects. */
-
-+/* XXX. This is WRONG for alpha. Needs to be verified on other ELF ports. */
-+#ifndef NETBSD_ELF
-+
- /* Write the extra assembler code needed to declare a function properly.
- Some svr4 assemblers need to also have something extra said about the
- function's return value. We allow for that here. */
-@@ -207,3 +231,56 @@
- putc ('\n', FILE); \
- } \
- } while (0)
-+
-+#endif /* ! NETBSD_ELF */
-+
-+/* NetBSD ELF support begins here. */
-+
-+#ifdef NETBSD_ELF
-+
-+/* Start with generic ELF definitions. */
-+#if !defined(__sparc__)
-+#include "elfos.h"
-+
-+#undef DWARF_DEBUGGING_INFO /* XXX */
-+#undef DWARF2_DEBUGGING_INFO /* XXX */
-+#endif
-+
-+/* Provide a STARTFILE_SPEC appropriate for NetBSD ELF targets. Here we
-+ provide support for the special GCC option -static. On ELF targets,
-+ we also add the crtbegin.o file which provides part of the support
-+ for getting C++ file-scope static objects constructed before entering
-+ `main'. */
-+
-+#undef STARTFILE_SPEC
-+#define STARTFILE_SPEC \
-+ "%{!shared: \
-+ %{pg:gcrt0%O%s} \
-+ %{!pg: \
-+ %{p:gcrt0%O%s} \
-+ %{!p:crt0%O%s}}} \
-+ %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}"
-+
-+/* Provide an ENDFILE_SPEC appropriate for NetBSD ELF targets. Here we
-+ add crtend.o, which provides part of the support for getting C++
-+ file-scope static objects deconstructed after exiting `main'. */
-+
-+#undef ENDFILE_SPEC
-+#define ENDFILE_SPEC \
-+ "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
-+
-+/* Provide a LINK_SPEC appropriate for a NetBSD ELF target. */
-+
-+#undef LINK_SPEC
-+#define LINK_SPEC \
-+ "%{assert*} \
-+ %{shared:-shared} \
-+ %{!shared: \
-+ -dc -dp \
-+ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
-+ %{!static: \
-+ %{rdynamic:-export-dynamic} \
-+ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
-+ %{static:-static}}"
-+
-+#endif /* NETBSD_ELF */
+ /* Variables in i386.c */
+-extern char *ix86_cpu_string; /* for -mcpu=<xxx> */
+-extern char *ix86_arch_string; /* for -march=<xxx> */
+-extern char *i386_reg_alloc_order; /* register allocation order */
+-extern char *i386_regparm_string; /* # registers to use to pass args */
+-extern char *i386_align_loops_string; /* power of two alignment for loops */
+-extern char *i386_align_jumps_string; /* power of two alignment for non-loop jumps */
+-extern char *i386_align_funcs_string; /* power of two alignment for functions */
++extern char *ix86_cpu_string; /* for -mcpu=<xxx> */
++extern char *ix86_arch_string; /* for -march=<xxx> */
++extern char *i386_reg_alloc_order; /* register allocation order */
++extern char *i386_regparm_string; /* # registers to use to pass args */
++extern char *i386_align_loops_string; /* power of two alignment for loops */
++extern char *i386_align_jumps_string; /* power of two alignment for non-loop jumps */
++extern char *i386_align_funcs_string; /* power of two alignment for functions */
+ extern char *i386_preferred_stack_boundary_string;/* power of two alignment for stack boundary */
+-extern char *i386_branch_cost_string; /* values 1-5: see jump.c */
++extern char *i386_branch_cost_string; /* values 1-5: see jump.c */
+ extern int i386_regparm; /* i386_regparm_string as a number */
+ extern int i386_align_loops; /* power of two alignment for loops */
+ extern int i386_align_jumps; /* power of two alignment for non-loop jumps */
diff --git a/lang/gcc/patches/patch-am b/lang/gcc/patches/patch-am
index ff0a4ebd3f9..963b4472ba8 100644
--- a/lang/gcc/patches/patch-am
+++ b/lang/gcc/patches/patch-am
@@ -1,37 +1,13 @@
-$NetBSD: patch-am,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-am,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/xm-netbsd.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/xm-netbsd.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,32 @@
-+/* Configuration for GNU C-compiler for hosts running NetBSD.
-+ Copyright (C) 1995 Free Software Foundation, Inc.
-+
-+This file is part of GNU CC.
-+
-+GNU CC is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+GNU CC is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with GNU CC; see the file COPYING. If not, write to
-+the Free Software Foundation, 59 Temple Place - Suite 330,
-+Boston, MA 02111-1307, USA. */
-+
-+/* This file defines machine-independent things specific to a host
-+ running NetBSD. This file should not be specified as $xm_file itself;
-+ instead $xm_file should be CPU/xm-netbsd.h, which should include both
-+ CPU/xm-CPU.h and this file xm-netbsd.h. */
-+
-+#undef POSIX
-+#define POSIX
-+
-+/* Ensure we get gnu C's defaults. */
-+#ifdef __GNUC__
-+#define alloca __builtin_alloca
-+#endif
+--- ../gcc-2.95.3/gcc/config/i386/netbsd.h.orig Tue Mar 23 22:34:49 1999
++++ ../gcc-2.95.3/gcc/config/i386/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -15,7 +15,7 @@
+ (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387)
+
+ #undef CPP_PREDEFINES
+-#define CPP_PREDEFINES "-Dunix -Di386 -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(i386) -Amachine(i386)"
++#define CPP_PREDEFINES "-D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(i386) -Amachine(i386)"
+
+ #undef SIZE_TYPE
+ #define SIZE_TYPE "unsigned int"
diff --git a/lang/gcc/patches/patch-an b/lang/gcc/patches/patch-an
index ff266bd8c17..364d128a844 100644
--- a/lang/gcc/patches/patch-an
+++ b/lang/gcc/patches/patch-an
@@ -1,11 +1,14 @@
-$NetBSD: patch-an,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-an,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/xm-target64.h.orig Sat Sep 16 00:17:42 2000
-+++ ../gcc-2.95.2/gcc/config/xm-target64.h Sat Sep 16 00:17:42 2000
-@@ -0,0 +1,6 @@
-+/* Hack to extend HOST_WIDE_INT on 64-bit target cross compilers. */
-+
-+#ifdef __GNUC__
-+#define HOST_WIDE_INT long long
-+#define HOST_BITS_PER_WIDE_INT 64
-+#endif
+--- ../gcc-2.95.3/gcc/config/m68k/m68k.c.orig Mon Aug 2 06:51:08 1999
++++ ../gcc-2.95.3/gcc/config/m68k/m68k.c Thu Jan 3 20:37:53 2002
+@@ -462,7 +462,8 @@
+ -cfa_store_offset + n_regs++ * 4);
+ }
+ }
+- if (flag_pic && current_function_uses_pic_offset_table)
++ if (flag_pic && current_function_uses_pic_offset_table &&
++ regs_ever_live[PIC_OFFSET_TABLE_REGNUM])
+ {
+ #ifdef MOTOROLA
+ asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
diff --git a/lang/gcc/patches/patch-ao b/lang/gcc/patches/patch-ao
index 3b29cbd8ad2..aa1fa989f5f 100644
--- a/lang/gcc/patches/patch-ao
+++ b/lang/gcc/patches/patch-ao
@@ -1,18 +1,19 @@
-$NetBSD: patch-ao,v 1.1 2000/09/15 23:58:48 tron Exp $
+$NetBSD: patch-ao,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/objc/objc-act.c.orig Wed Apr 14 22:28:54 1999
-+++ ../gcc-2.95.2/gcc/objc/objc-act.c Sat Sep 16 00:17:43 2000
-@@ -8399,8 +8399,11 @@
- pushdecl (decl);
- rest_of_decl_compilation (decl, 0, 0, 0);
+--- ../gcc-2.95.3/gcc/config/m68k/netbsd.h.orig Wed Dec 16 22:07:06 1998
++++ ../gcc-2.95.3/gcc/config/m68k/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -17,7 +17,7 @@
-- /* Make following constant read-only (why not)? */
-- readonly_data_section ();
-+ /* Make following constant read-only, if not compiling PIC. */
-+ if (flag_pic)
-+ data_section();
-+ else
-+ readonly_data_section ();
+ /* Names to predefine in the preprocessor for this target machine. */
- exp = build1 (ADDR_EXPR, string_type_node, decl);
+-#define CPP_PREDEFINES "-Dunix -Dm68k -Dmc68000 -Dmc68020 -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(m68k) -Amachine(m68k)"
++#define CPP_PREDEFINES "-Dm68k -Dmc68000 -Dmc68020 -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__ -Asystem(unix) -Asystem(NetBSD) -Acpu(m68k) -Amachine(m68k)"
+
+ /* Make gcc agree with <machine/ansi.h> */
+@@ -61,3 +61,5 @@
+ and initialization stuff better. */
+ #define DWARF2_UNWIND_INFO 0
+
++/* NetBSD a.out allows more than 16-bit alignment of elements and data. */
++#define MAX_OFILE_ALIGNMENT 32
diff --git a/lang/gcc/patches/patch-ap b/lang/gcc/patches/patch-ap
index 5c96c29bb10..2e29da4d213 100644
--- a/lang/gcc/patches/patch-ap
+++ b/lang/gcc/patches/patch-ap
@@ -1,12 +1,42 @@
-$NetBSD: patch-ap,v 1.1 2000/09/15 23:58:49 tron Exp $
+$NetBSD: patch-ap,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/collect2.c.orig Tue Oct 12 23:16:52 1999
-+++ ../gcc-2.95.2/gcc/collect2.c Sat Sep 16 00:17:41 2000
-@@ -53,7 +53,6 @@
- #define obstack_chunk_alloc xmalloc
- #define obstack_chunk_free free
+--- ../gcc-2.95.3/gcc/config/mips/mips.c.orig Fri May 7 14:42:03 1999
++++ ../gcc-2.95.3/gcc/config/mips/mips.c Thu Jan 3 20:37:53 2002
+@@ -93,7 +93,7 @@
+ static void block_move_loop PROTO ((rtx, rtx, int, int,
+ rtx, rtx));
+ static void block_move_call PROTO ((rtx, rtx, rtx));
+-static FILE *make_temp_file PROTO ((void));
++static FILE *xmake_temp_file PROTO ((void));
+ static void save_restore_insns PROTO ((int, rtx,
+ long, FILE *));
+ static void mips16_output_gp_offset PROTO ((FILE *, rtx));
+@@ -5076,7 +5076,7 @@
+ #endif
--extern char *make_temp_file PROTO ((char *));
+ static FILE *
+-make_temp_file ()
++xmake_temp_file ()
+ {
+ FILE *stream;
+ const char *base = getenv ("TMPDIR");
+@@ -5295,7 +5295,7 @@
+ if (TARGET_FILE_SWITCHING && ! TARGET_MIPS16)
+ {
+ asm_out_data_file = stream;
+- asm_out_text_file = make_temp_file ();
++ asm_out_text_file = xmake_temp_file ();
+ }
+
+ else
+@@ -6278,8 +6278,10 @@
+ fprintf (file, "\t.cprestore %ld\n", current_frame_info.args_size);
+ }
+
++#ifdef DWARF2_UNWIND_INFO
+ if (dwarf2out_do_frame ())
+ dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, tsize);
++#endif
+ }
+ }
- /* On certain systems, we have code that works by scanning the object file
- directly. But this code uses system-specific header files and library
diff --git a/lang/gcc/patches/patch-aq b/lang/gcc/patches/patch-aq
index 597a15c20ec..25c1381b055 100644
--- a/lang/gcc/patches/patch-aq
+++ b/lang/gcc/patches/patch-aq
@@ -1,64 +1,384 @@
-$NetBSD: patch-aq,v 1.2 2001/02/28 23:28:09 hubertf Exp $
+$NetBSD: patch-aq,v 1.3 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/configure.in.orig Wed Oct 13 09:58:02 1999
-+++ ../gcc-2.95.2/gcc/configure.in Sat Sep 16 01:07:10 2000
-@@ -1156,9 +1156,20 @@
- tmake_file=t-freebsd
- ;;
- changequote(,)dnl
-+ i[34567]86-*-netbsdelf* | \
-+ i[34567]86-*-netbsd1.4[I-Z]* | \
-+ i[34567]86-*-netbsd1.[5-9]* | \
-+ i[34567]86-*-netbsd2*)
-+changequote([,])dnl
-+ tm_file=i386/netbsd-elf.h
-+ xm_file=i386/xm-netbsd.h
-+ tmake_file=t-netbsd
-+ ;;
-+changequote(,)dnl
- i[34567]86-*-netbsd*)
- changequote([,])dnl
- tm_file=i386/netbsd.h
-+ xm_file=i386/xm-netbsd.h
- tmake_file=t-netbsd
- use_collect2=yes
- ;;
-@@ -3021,6 +3032,12 @@
- tmake_file=sparc/t-sparcbare
- tm_file="sparc/aout.h libgloss.h"
- ;;
-+ sparc-*-netbsd*elf*)
-+ tm_file=sparc/netbsd-elf.h
-+ xm_file=sparc/xm-netbsd.h
-+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+ tmake_file="t-netbsd sparc/t-netbsd"
-+ ;;
- sparc-*-netbsd*)
- tm_file=sparc/netbsd.h
- tmake_file=t-netbsd
-@@ -3216,6 +3233,12 @@
- extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
- gnu_ld=yes
- ;;
-+ sparc64-*-netbsd*)
-+ tm_file=sparc/netbsd64.h
-+ xm_file=sparc/xm-netbsd64.h
-+ tmake_file=t-netbsd
-+ use_collect2=yes
-+ ;;
- # This hasn't been upgraded to GCC 2.
- # tahoe-harris-*) # Harris tahoe, using COFF.
- # tm_file=tahoe/harris.h
-@@ -3556,6 +3579,12 @@
- enable_haifa=yes;;
- esac
- fi
-+
-+case $target in
-+ alpha*|sparc64*)
-+ build_xm_file="${build_xm_file} xm-target64.h"
-+ host_xm_file="${host_xm_file} xm-target64.h";;
-+esac
+--- ../gcc-2.95.3/gcc/config/mips/netbsd.h.orig Wed Dec 16 22:09:19 1998
++++ ../gcc-2.95.3/gcc/config/mips/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -18,210 +18,189 @@
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
- # Handle cpp installation.
- if test x$enable_cpp != xno
+-#define DECSTATION
++/* Define default target values. */
+
+-/* Look for the include files in the system-defined places. */
++#ifdef TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT MASK_BIG_ENDIAN
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#endif
+
+-#ifndef CROSS_COMPILE
+-#undef GPLUSPLUS_INCLUDE_DIR
+-#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
+-
+-#undef GCC_INCLUDE_DIR
+-#define GCC_INCLUDE_DIR "/usr/include"
+-
+-#undef INCLUDE_DEFAULTS
+-#define INCLUDE_DEFAULTS \
+- { \
+- { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
+- { GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
+- { 0, 0, 0, 0 } \
+- }
++#ifndef MACHINE_TYPE
++#ifdef TARGET_BIG_ENDIAN_DEFAULT
++#define MACHINE_TYPE "NetBSD ELF/mipseb"
++#else
++#define MACHINE_TYPE "NetBSD ELF/mipsel"
++#endif
++#endif
+
+-/* Under NetBSD, the normal location of the various *crt*.o files is the
+- /usr/lib directory. */
++#define TARGET_MEM_FUNCTIONS
+
+-#undef STANDARD_STARTFILE_PREFIX
+-#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
+-#endif
++#define TARGET_DEFAULT (MASK_GAS|MASK_ABICALLS)
++#undef DWARF2_DEBUGGING_INFO
++#define DBX_DEBUGGING_INFO
++#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+
+-/* Provide a LINK_SPEC appropriate for NetBSD. Here we provide support
+- for the special GCC options -static, -assert, and -nostdlib. */
++/* Include the generic MIPS ELF configuration. */
++#include <mips/elf.h>
+
+-#undef LINK_SPEC
+-#define LINK_SPEC \
+- "%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} \
+- %{!nostartfiles:%{!r*:%{!e*:-e __start}}} -dc -dp %{static:-Bstatic} %{assert*}"
++/* Now clean up after it. */
++#undef OBJECT_FORMAT_COFF
++#undef INVOKE__main
++#undef NAME__MAIN
++#undef SYMBOL__MAIN
++#undef CTOR_LIST_BEGIN
++#undef CTOR_LIST_END
++#undef DTOR_LIST_BEGIN
++#undef DTOR_LIST_END
+
+-/* We have atexit(3). */
++/* Get generic NetBSD definitions. */
+
+-#define HAVE_ATEXIT
++#define NETBSD_ELF
++#include <netbsd.h>
+
+ /* Implicit library calls should use memcpy, not bcopy, etc. */
+
+-#define TARGET_MEM_FUNCTIONS
+-
+ /* Define mips-specific netbsd predefines... */
+-#ifndef CPP_PREDEFINES
+-#define CPP_PREDEFINES "-D__ANSI_COMPAT \
+--DMIPSEL -DR3000 -DSYSTYPE_BSD -D_SYSTYPE_BSD -D__NetBSD__ -Dmips \
+--D__NO_LEADING_UNDERSCORES__ -D__GP_SUPPORT__ \
+--Dunix -D_R3000 \
+--Asystem(unix) -Asystem(NetBSD) -Amachine(mips)"
+-#endif
+-
+-#ifndef SUBTARGET_CPP_SPEC
+-#define SUBTARGET_CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
+-#endif
+
+-#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
+-#define STARTFILE_SPEC ""
+-
+-#ifndef MACHINE_TYPE
+-#define MACHINE_TYPE "NetBSD/pmax"
++#undef CPP_PREDEFINES
++#ifdef TARGET_BIG_ENDIAN_DEFAULT
++#define CPP_PREDEFINES \
++ "-D__ANSI_COMPAT -DMIPSEB -DR3000 -DSYSTYPE_BSD -D_SYSTYPE_BSD \
++ -D__NetBSD__ -D__ELF__ -Dmips -D__NO_LEADING_UNDERSCORES__ -D__GP_SUPPORT__ \
++ -D_R3000 -Asystem(unix) -Asystem(NetBSD) -Amachine(mips)"
++#else
++#define CPP_PREDEFINES \
++ "-D__ANSI_COMPAT -DMIPSEL -DR3000 -DSYSTYPE_BSD -D_SYSTYPE_BSD \
++ -D__NetBSD__ -D__ELF__ -Dmips -D__NO_LEADING_UNDERSCORES__ -D__GP_SUPPORT__ \
++ -D_R3000 -Asystem(unix) -Asystem(NetBSD) -Amachine(mips)"
+ #endif
+
+-#define TARGET_DEFAULT MASK_GAS
+-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+-
+-#include "mips/mips.h"
++#undef ASM_SPEC
++#define ASM_SPEC \
++ "%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{v} \
++ %{noasmopt:-O0} \
++ %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} \
++ %{g} %{g0} %{g1} %{g2} %{g3} \
++ %{ggdb:-g} %{ggdb0:-g0} %{ggdb1:-g1} %{ggdb2:-g2} %{ggdb3:-g3} \
++ %{gstabs:-g} %{gstabs0:-g0} %{gstabs1:-g1} %{gstabs2:-g2} %{gstabs3:-g3} \
++ %{gstabs+:-g} %{gstabs+0:-g0} %{gstabs+1:-g1} %{gstabs+2:-g2} %{gstabs+3:-g3} \
++ %{gcoff:-g} %{gcoff0:-g0} %{gcoff1:-g1} %{gcoff2:-g2} %{gcoff3:-g3} \
++ %{membedded-pic} %{fpic:-k} %{fPIC:-k -K}"
+
+-/*
+- * Some imports from svr4.h in support of shared libraries.
+- * Currently, we need the DECLARE_OBJECT_SIZE stuff.
+- */
+-
+-/* Define the strings used for the special svr4 .type and .size directives.
+- These strings generally do not vary from one system running svr4 to
+- another, but if a given system (e.g. m88k running svr) needs to use
+- different pseudo-op names for these, they may be overridden in the
+- file which includes this one. */
+-
+-#undef TYPE_ASM_OP
+-#undef SIZE_ASM_OP
+-#undef WEAK_ASM_OP
+-#define TYPE_ASM_OP ".type"
+-#define SIZE_ASM_OP ".size"
+-#define WEAK_ASM_OP ".weak"
+-
+-/* The following macro defines the format used to output the second
+- operand of the .type assembler directive. Different svr4 assemblers
+- expect various different forms for this operand. The one given here
+- is just a default. You may need to override it in your machine-
+- specific tm.h file (depending upon the particulars of your assembler). */
+-
+-#undef TYPE_OPERAND_FMT
+-#define TYPE_OPERAND_FMT "@%s"
+-
+-/* Write the extra assembler code needed to declare a function's result.
+- Most svr4 assemblers don't require any special declaration of the
+- result value, but there are exceptions. */
++/* Provide a LINK_SPEC appropriate for a NetBSD ELF target. */
+
+-#ifndef ASM_DECLARE_RESULT
+-#define ASM_DECLARE_RESULT(FILE, RESULT)
+-#endif
+-
+-/* These macros generate the special .type and .size directives which
+- are used to set the corresponding fields of the linker symbol table
+- entries in an ELF object file under SVR4. These macros also output
+- the starting labels for the relevant functions/objects. */
+-
+-/* Write the extra assembler code needed to declare a function properly.
+- Some svr4 assemblers need to also have something extra said about the
+- function's return value. We allow for that here. */
+-
+-#undef ASM_DECLARE_FUNCTION_NAME
+-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+- do { \
+- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- putc (',', FILE); \
+- fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
+- putc ('\n', FILE); \
+- ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+- } while (0)
+-
+-/* Write the extra assembler code needed to declare an object properly. */
+-
+-#undef ASM_DECLARE_OBJECT_NAME
+-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
+- do { \
+- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- putc (',', FILE); \
+- fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
+- putc ('\n', FILE); \
+- size_directive_output = 0; \
+- if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
+- { \
+- size_directive_output = 1; \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+- } \
+- ASM_OUTPUT_LABEL(FILE, NAME); \
+- } while (0)
+-
+-/* Output the size directive for a decl in rest_of_decl_compilation
+- in the case where we did not do so before the initializer.
+- Once we find the error_mark_node, we know that the value of
+- size_directive_output was set
+- by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
+-
+-#undef ASM_FINISH_DECLARE_OBJECT
+-#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
+-do { \
+- char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+- if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
+- && ! AT_END && TOP_LEVEL \
+- && DECL_INITIAL (DECL) == error_mark_node \
+- && !size_directive_output) \
+- { \
+- size_directive_output = 1; \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, name); \
+- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+- } \
+- } while (0)
+-
+-/* This is how to declare the size of a function. */
+-
+-#undef ASM_DECLARE_FUNCTION_SIZE
+-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
+- do { \
+- if (!flag_inhibit_size_directive) \
+- { \
+- char label[256]; \
+- static int labelno; \
+- labelno++; \
+- ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
+- ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, (FNAME)); \
+- fprintf (FILE, ","); \
+- assemble_name (FILE, label); \
+- fprintf (FILE, "-"); \
+- assemble_name (FILE, (FNAME)); \
+- putc ('\n', FILE); \
+- } \
+- } while (0)
+-
+-/*
+- A C statement to output something to the assembler file to switch to section
+- NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
+- NULL_TREE. Some target formats do not support arbitrary sections. Do not
+- define this macro in such cases.
+-*/
+-#define ASM_OUTPUT_SECTION_NAME(F, DECL, NAME, RELOC) \
+-do { \
+- extern FILE *asm_out_text_file; \
+- if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL) \
+- fprintf (asm_out_text_file, "\t.section %s,\"ax\",@progbits\n", (NAME)); \
+- else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC)) \
+- fprintf (F, "\t.section %s,\"a\",@progbits\n", (NAME)); \
+- else \
+- fprintf (F, "\t.section %s,\"aw\",@progbits\n", (NAME)); \
+-} while (0)
+-
+-/* Since gas and gld are standard on NetBSD, we don't need these */
+-#undef ASM_FINAL_SPEC
+-#undef STARTFILE_SPEC
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{assert*} \
++ %{EL:-m elf32lmip} \
++ %{EB:-m elf32bmip} \
++ %{R*} %{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} \
++ %{shared} %{v} \
++ %{bestGnum} %{call_shared} %{no_archive} %{exact_version} \
++ %{!shared: \
++ -dc -dp \
++ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
++ %{static:-static}}"
++
++/* Provide CC1_SPEC appropriate for NetBSD/mips ELF platforms */
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++ "%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
++ %{mips1:-mfp32 -mgp32}%{mips2:-mfp32 -mgp32}\
++ %{mips3:%{!msingle-float:%{!m4650:-mfp64}} -mgp64} \
++ %{mips4:%{!msingle-float:%{!m4650:-mfp64}} -mgp64} \
++ %{mfp64:%{msingle-float:%emay not use both -mfp64 and -msingle-float}} \
++ %{mfp64:%{m4650:%emay not use both -mfp64 and -m4650}} \
++ %{m4650:-mcpu=r4650} \
++ %{G*} %{EB:-meb} %{EL:-mel} %{EB:%{EL:%emay not use both -EB and -EL}} \
++ %{pic-none: -mno-half-pic} \
++ %{pic-lib: -mhalf-pic} \
++ %{pic-extern: -mhalf-pic} \
++ %{pic-calls: -mhalf-pic} \
++ %{save-temps: }"
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++ "%{posix:-D_POSIX_SOURCE} \
++ %{mlong64:-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int} \
++ %{!mlong64:-D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int} \
++ %{mips3:-U__mips -D__mips=3 -D__mips64} \
++ %{mgp32:-U__mips64} %{mgp64:-D__mips64}"
++
++/* Trampoline code for closures should call _cacheflush()
++ to ensure I-cache consistency after writing trampoline code. */
++
++#define MIPS_CACHEFLUSH_FUNC "_cacheflush"
++
++/* Use sjlj exceptions. */
++#define DWARF2_UNWIND_INFO 0
++
++/* Turn off special section processing by default. */
++#undef MIPS_DEFAULT_GVALUE
++#define MIPS_DEFAULT_GVALUE 0
++
++/* This defines which switch letters take arguments. -G is a mips special. */
++#undef SWITCH_TAKES_ARG
++#define SWITCH_TAKES_ARG(CHAR) \
++ (DEFAULT_SWITCH_TAKES_ARG(CHAR) || (CHAR) == 'R' || (CHAR) == 'G')
++
++/* Support const sections and the ctors and dtors sections for g++.
++ Note that there appears to be two different ways to support const
++ sections at the moment. You can either #define the symbol
++ READONLY_DATA_SECTION (giving it some code which switches to the
++ readonly data section) or else you can #define the symbols
++ EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
++ SELECT_RTX_SECTION. We do both here just to be on the safe side. */
++
++#define CONST_SECTION_ASM_OP ".section\t.rodata"
++
++/* On svr4, we *do* have support for the .init and .fini sections, and we
++ can put stuff in there to be executed before and after `main'. We let
++ crtstuff.c and other files know this by defining the following symbols.
++ The definitions say how to change sections to the .init and .fini
++ sections. This is the same for all known svr4 assemblers. */
++
++#define INIT_SECTION_ASM_OP ".section\t.init"
++#define FINI_SECTION_ASM_OP ".section\t.fini"
++
++/* A default list of other sections which we might be "in" at any given
++ time. For targets that use additional sections (e.g. .tdesc) you
++ should override this definition in the target-specific file which
++ includes this file. */
++/* Note that this is to be like the generic ELF EXTRA_SECTIONS, with the
++ MIPS specific in_sdata and in_rdata added. */
++
++#undef EXTRA_SECTIONS
++#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_sdata, in_rdata
++
++/* A default list of extra section function definitions. For targets
++ that use additional sections (e.g. .tdesc) you should override this
++ definition in the target-specific file which includes this file. */
++
++#undef EXTRA_SECTION_FUNCTIONS
++#define EXTRA_SECTION_FUNCTIONS \
++ SECTION_FUNCTION_TEMPLATE(const_section, in_const, CONST_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(ctors_section, in_ctors, CTORS_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(dtors_section, in_dtors, DTORS_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP) \
++ SECTION_FUNCTION_TEMPLATE(rdata_section, in_rdata, RDATA_SECTION_ASM_OP)
++
++#undef READONLY_DATA_SECTION
++#define READONLY_DATA_SECTION() const_section ()
++
++#undef SECTION_FUNCTION_TEMPLATE
++#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP) \
++void \
++FN () \
++{ \
++ if (in_section != ENUM) \
++ { \
++ fprintf (asm_out_file, "%s\n", OP); \
++ in_section = ENUM; \
++ } \
++}
diff --git a/lang/gcc/patches/patch-ar b/lang/gcc/patches/patch-ar
index 58459fd2b6e..8525c719c33 100644
--- a/lang/gcc/patches/patch-ar
+++ b/lang/gcc/patches/patch-ar
@@ -1,832 +1,12 @@
-$NetBSD: patch-ar,v 1.2 2001/02/28 23:28:09 hubertf Exp $
+$NetBSD: patch-ar,v 1.3 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/configure.orig Tue Feb 27 14:32:38 2001
-+++ ../gcc-2.95.2/gcc/configure
-@@ -1310,7 +1310,7 @@
- fi
-
- # Find some useful tools
--for ac_prog in gawk mawk nawk awk
-+for ac_prog in mawk gawk nawk awk
- do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
- set dummy $ac_prog; ac_word=$2
-@@ -3552,8 +3552,17 @@
- tm_file=i386/freebsd.h
- tmake_file=t-freebsd
- ;;
-+ i[34567]86-*-netbsdelf* | \
-+ i[34567]86-*-netbsd1.4[I-Z]* | \
-+ i[34567]86-*-netbsd1.[5-9]* | \
-+ i[34567]86-*-netbsd2*)
-+ tm_file=i386/netbsd-elf.h
-+ xm_file=i386/xm-netbsd.h
-+ tmake_file=t-netbsd
-+ ;;
- i[34567]86-*-netbsd*)
- tm_file=i386/netbsd.h
-+ xm_file=i386/xm-netbsd.h
- tmake_file=t-netbsd
- use_collect2=yes
- ;;
-@@ -5326,6 +5335,12 @@
- tmake_file=sparc/t-sparcbare
- tm_file="sparc/aout.h libgloss.h"
- ;;
-+ sparc-*-netbsd*elf*)
-+ tm_file=sparc/netbsd-elf.h
-+ xm_file=sparc/xm-netbsd.h
-+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+ tmake_file="t-netbsd sparc/t-netbsd"
-+ ;;
- sparc-*-netbsd*)
- tm_file=sparc/netbsd.h
- tmake_file=t-netbsd
-@@ -5415,7 +5430,7 @@
- xmake_file=sparc/x-sysv4
- extra_parts="crt1.o crti.o crtn.o gmon.o crtbegin.o crtend.o"
- case $machine in
-- *-*-solaris2.[0-4])
-+ *-*-solaris2.0-4)
- float_format=i128
- ;;
- *)
-@@ -5519,6 +5534,12 @@
- extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
- gnu_ld=yes
- ;;
-+ sparc64-*-netbsd*)
-+ tm_file=sparc/netbsd64.h
-+ xm_file=sparc/xm-netbsd64.h
-+ tmake_file=t-netbsd
-+ use_collect2=yes
-+ ;;
- # This hasn't been upgraded to GCC 2.
- # tahoe-harris-*) # Harris tahoe, using COFF.
- # tm_file=tahoe/harris.h
-@@ -5860,6 +5881,12 @@
- esac
- fi
-
-+case $target in
-+ alpha*|sparc64*)
-+ build_xm_file="${build_xm_file} xm-target64.h"
-+ host_xm_file="${host_xm_file} xm-target64.h";;
-+esac
-+
- # Handle cpp installation.
- if test x$enable_cpp != xno
- then
-@@ -6049,7 +6076,7 @@
-
-
- echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
--echo "configure:6044: checking for strerror in -lcposix" >&5
-+echo "configure:6080: checking for strerror in -lcposix" >&5
- ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
- if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-@@ -6057,7 +6084,7 @@
- ac_save_LIBS="$LIBS"
- LIBS="-lcposix $LIBS"
- cat > conftest.$ac_ext <<EOF
--#line 6052 "configure"
-+#line 6088 "configure"
- #include "confdefs.h"
- /* Override any gcc2 internal prototype to avoid an error. */
- /* We use char because int might match the return type of a gcc2
-@@ -6068,7 +6095,7 @@
- strerror()
- ; return 0; }
- EOF
--if { (eval echo configure:6063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
- else
-@@ -6091,12 +6118,12 @@
-
-
- echo $ac_n "checking for working const""... $ac_c" 1>&6
--echo "configure:6086: checking for working const" >&5
-+echo "configure:6122: checking for working const" >&5
- if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6091 "configure"
-+#line 6127 "configure"
- #include "confdefs.h"
-
- int main() {
-@@ -6145,7 +6172,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:6140: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-+if { (eval echo configure:6176: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_c_const=yes
- else
-@@ -6166,21 +6193,21 @@
- fi
-
- echo $ac_n "checking for inline""... $ac_c" 1>&6
--echo "configure:6161: checking for inline" >&5
-+echo "configure:6197: checking for inline" >&5
- if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- ac_cv_c_inline=no
- for ac_kw in inline __inline__ __inline; do
- cat > conftest.$ac_ext <<EOF
--#line 6168 "configure"
-+#line 6204 "configure"
- #include "confdefs.h"
-
- int main() {
- } $ac_kw foo() {
- ; return 0; }
- EOF
--if { (eval echo configure:6175: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-+if { (eval echo configure:6211: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_c_inline=$ac_kw; break
- else
-@@ -6206,12 +6233,12 @@
- esac
-
- echo $ac_n "checking for off_t""... $ac_c" 1>&6
--echo "configure:6201: checking for off_t" >&5
-+echo "configure:6237: checking for off_t" >&5
- if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6206 "configure"
-+#line 6242 "configure"
- #include "confdefs.h"
- #include <sys/types.h>
- #if STDC_HEADERS
-@@ -6239,12 +6266,12 @@
- fi
-
- echo $ac_n "checking for size_t""... $ac_c" 1>&6
--echo "configure:6234: checking for size_t" >&5
-+echo "configure:6270: checking for size_t" >&5
- if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6239 "configure"
-+#line 6275 "configure"
- #include "confdefs.h"
- #include <sys/types.h>
- #if STDC_HEADERS
-@@ -6274,19 +6301,19 @@
- # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
- # for constant arguments. Useless!
- echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
--echo "configure:6269: checking for working alloca.h" >&5
-+echo "configure:6305: checking for working alloca.h" >&5
- if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6274 "configure"
-+#line 6310 "configure"
- #include "confdefs.h"
- #include <alloca.h>
- int main() {
- char *p = alloca(2 * sizeof(int));
- ; return 0; }
- EOF
--if { (eval echo configure:6281: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ac_cv_header_alloca_h=yes
- else
-@@ -6307,12 +6334,12 @@
- fi
-
- echo $ac_n "checking for alloca""... $ac_c" 1>&6
--echo "configure:6302: checking for alloca" >&5
-+echo "configure:6338: checking for alloca" >&5
- if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6307 "configure"
-+#line 6343 "configure"
- #include "confdefs.h"
-
- #ifdef __GNUC__
-@@ -6340,7 +6367,7 @@
- char *p = (char *) alloca(1);
- ; return 0; }
- EOF
--if { (eval echo configure:6335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6371: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ac_cv_func_alloca_works=yes
- else
-@@ -6372,12 +6399,12 @@
-
-
- echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
--echo "configure:6367: checking whether alloca needs Cray hooks" >&5
-+echo "configure:6403: checking whether alloca needs Cray hooks" >&5
- if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6372 "configure"
-+#line 6408 "configure"
- #include "confdefs.h"
- #if defined(CRAY) && ! defined(CRAY2)
- webecray
-@@ -6402,12 +6429,12 @@
- if test $ac_cv_os_cray = yes; then
- for ac_func in _getb67 GETB67 getb67; do
- echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--echo "configure:6397: checking for $ac_func" >&5
-+echo "configure:6433: checking for $ac_func" >&5
- if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6402 "configure"
-+#line 6438 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-@@ -6430,7 +6457,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:6425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
- else
-@@ -6457,7 +6484,7 @@
- fi
-
- echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
--echo "configure:6452: checking stack direction for C alloca" >&5
-+echo "configure:6488: checking stack direction for C alloca" >&5
- if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -6465,7 +6492,7 @@
- ac_cv_c_stack_direction=0
- else
- cat > conftest.$ac_ext <<EOF
--#line 6460 "configure"
-+#line 6496 "configure"
- #include "confdefs.h"
- find_stack_direction ()
- {
-@@ -6484,7 +6511,7 @@
- exit (find_stack_direction() < 0);
- }
- EOF
--if { (eval echo configure:6479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-+if { (eval echo configure:6515: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
- then
- ac_cv_c_stack_direction=1
- else
-@@ -6509,17 +6536,17 @@
- do
- ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
- echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
--echo "configure:6504: checking for $ac_hdr" >&5
-+echo "configure:6540: checking for $ac_hdr" >&5
- if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6509 "configure"
-+#line 6545 "configure"
- #include "confdefs.h"
- #include <$ac_hdr>
- EOF
- ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
--{ (eval echo configure:6514: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-+{ (eval echo configure:6550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
- ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
- if test -z "$ac_err"; then
- rm -rf conftest*
-@@ -6548,12 +6575,12 @@
- for ac_func in getpagesize
- do
- echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--echo "configure:6543: checking for $ac_func" >&5
-+echo "configure:6579: checking for $ac_func" >&5
- if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6548 "configure"
-+#line 6584 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-@@ -6576,7 +6603,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:6571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
- else
-@@ -6601,7 +6628,7 @@
- done
-
- echo $ac_n "checking for working mmap""... $ac_c" 1>&6
--echo "configure:6596: checking for working mmap" >&5
-+echo "configure:6632: checking for working mmap" >&5
- if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -6609,7 +6636,7 @@
- ac_cv_func_mmap_fixed_mapped=no
- else
- cat > conftest.$ac_ext <<EOF
--#line 6604 "configure"
-+#line 6640 "configure"
- #include "confdefs.h"
-
- /* Thanks to Mike Haertel and Jim Avera for this test.
-@@ -6749,7 +6776,7 @@
- }
-
- EOF
--if { (eval echo configure:6744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-+if { (eval echo configure:6780: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
- then
- ac_cv_func_mmap_fixed_mapped=yes
- else
-@@ -6777,17 +6804,17 @@
- do
- ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
- echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
--echo "configure:6772: checking for $ac_hdr" >&5
-+echo "configure:6808: checking for $ac_hdr" >&5
- if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6777 "configure"
-+#line 6813 "configure"
- #include "confdefs.h"
- #include <$ac_hdr>
- EOF
- ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
--{ (eval echo configure:6782: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-+{ (eval echo configure:6818: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
- ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
- if test -z "$ac_err"; then
- rm -rf conftest*
-@@ -6817,12 +6844,12 @@
- strdup __argz_count __argz_stringify __argz_next
- do
- echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--echo "configure:6812: checking for $ac_func" >&5
-+echo "configure:6848: checking for $ac_func" >&5
- if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6817 "configure"
-+#line 6853 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-@@ -6845,7 +6872,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:6840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
- else
-@@ -6874,12 +6901,12 @@
- for ac_func in stpcpy
- do
- echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--echo "configure:6869: checking for $ac_func" >&5
-+echo "configure:6905: checking for $ac_func" >&5
- if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6874 "configure"
-+#line 6910 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-@@ -6902,7 +6929,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:6897: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
- else
-@@ -6936,19 +6963,19 @@
-
- if test $ac_cv_header_locale_h = yes; then
- echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
--echo "configure:6931: checking for LC_MESSAGES" >&5
-+echo "configure:6967: checking for LC_MESSAGES" >&5
- if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 6936 "configure"
-+#line 6972 "configure"
- #include "confdefs.h"
- #include <locale.h>
- int main() {
- return LC_MESSAGES
- ; return 0; }
- EOF
--if { (eval echo configure:6943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:6979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- am_cv_val_LC_MESSAGES=yes
- else
-@@ -6969,7 +6996,7 @@
- fi
- fi
- echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
--echo "configure:6964: checking whether NLS is requested" >&5
-+echo "configure:7000: checking whether NLS is requested" >&5
- # Check whether --enable-nls or --disable-nls was given.
- if test "${enable_nls+set}" = set; then
- enableval="$enable_nls"
-@@ -6989,7 +7016,7 @@
- EOF
-
- echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
--echo "configure:6984: checking whether included gettext is requested" >&5
-+echo "configure:7020: checking whether included gettext is requested" >&5
- # Check whether --with-included-gettext or --without-included-gettext was given.
- if test "${with_included_gettext+set}" = set; then
- withval="$with_included_gettext"
-@@ -7008,17 +7035,17 @@
-
- ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
- echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
--echo "configure:7003: checking for libintl.h" >&5
-+echo "configure:7039: checking for libintl.h" >&5
- if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 7008 "configure"
-+#line 7044 "configure"
- #include "confdefs.h"
- #include <libintl.h>
- EOF
- ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
--{ (eval echo configure:7013: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-+{ (eval echo configure:7049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
- ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
- if test -z "$ac_err"; then
- rm -rf conftest*
-@@ -7035,19 +7062,19 @@
- if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
--echo "configure:7030: checking for gettext in libc" >&5
-+echo "configure:7066: checking for gettext in libc" >&5
- if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 7035 "configure"
-+#line 7071 "configure"
- #include "confdefs.h"
- #include <libintl.h>
- int main() {
- return (int) gettext ("")
- ; return 0; }
- EOF
--if { (eval echo configure:7042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- gt_cv_func_gettext_libc=yes
- else
-@@ -7063,7 +7090,7 @@
-
- if test "$gt_cv_func_gettext_libc" != "yes"; then
- echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
--echo "configure:7058: checking for bindtextdomain in -lintl" >&5
-+echo "configure:7094: checking for bindtextdomain in -lintl" >&5
- ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
- if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-@@ -7071,7 +7098,7 @@
- ac_save_LIBS="$LIBS"
- LIBS="-lintl $LIBS"
- cat > conftest.$ac_ext <<EOF
--#line 7066 "configure"
-+#line 7102 "configure"
- #include "confdefs.h"
- /* Override any gcc2 internal prototype to avoid an error. */
- /* We use char because int might match the return type of a gcc2
-@@ -7082,7 +7109,7 @@
- bindtextdomain()
- ; return 0; }
- EOF
--if { (eval echo configure:7077: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7113: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
- else
-@@ -7098,12 +7125,12 @@
- if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
--echo "configure:7093: checking for gettext in libintl" >&5
-+echo "configure:7129: checking for gettext in libintl" >&5
- if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
--echo "configure:7098: checking for gettext in -lintl" >&5
-+echo "configure:7134: checking for gettext in -lintl" >&5
- ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
- if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-@@ -7111,7 +7138,7 @@
- ac_save_LIBS="$LIBS"
- LIBS="-lintl $LIBS"
- cat > conftest.$ac_ext <<EOF
--#line 7106 "configure"
-+#line 7142 "configure"
- #include "confdefs.h"
- /* Override any gcc2 internal prototype to avoid an error. */
- /* We use char because int might match the return type of a gcc2
-@@ -7122,7 +7149,7 @@
- gettext()
- ; return 0; }
- EOF
--if { (eval echo configure:7117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
- else
-@@ -7161,7 +7188,7 @@
- # Extract the first word of "msgfmt", so it can be a program name with args.
- set dummy msgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7156: checking for $ac_word" >&5
-+echo "configure:7192: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7195,12 +7222,12 @@
- for ac_func in dcgettext
- do
- echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--echo "configure:7190: checking for $ac_func" >&5
-+echo "configure:7226: checking for $ac_func" >&5
- if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 7195 "configure"
-+#line 7231 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-@@ -7223,7 +7250,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:7218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
- else
-@@ -7250,7 +7277,7 @@
- # Extract the first word of "gmsgfmt", so it can be a program name with args.
- set dummy gmsgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7245: checking for $ac_word" >&5
-+echo "configure:7281: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7286,7 +7313,7 @@
- # Extract the first word of "xgettext", so it can be a program name with args.
- set dummy xgettext; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7281: checking for $ac_word" >&5
-+echo "configure:7317: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7318,7 +7345,7 @@
- fi
-
- cat > conftest.$ac_ext <<EOF
--#line 7313 "configure"
-+#line 7349 "configure"
- #include "confdefs.h"
-
- int main() {
-@@ -7326,7 +7353,7 @@
- return _nl_msg_cat_cntr
- ; return 0; }
- EOF
--if { (eval echo configure:7321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- CATOBJEXT=.gmo
- DATADIRNAME=share
-@@ -7349,7 +7376,7 @@
-
- if test "$CATOBJEXT" = "NONE"; then
- echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
--echo "configure:7344: checking whether catgets can be used" >&5
-+echo "configure:7380: checking whether catgets can be used" >&5
- # Check whether --with-catgets or --without-catgets was given.
- if test "${with_catgets+set}" = set; then
- withval="$with_catgets"
-@@ -7362,7 +7389,7 @@
-
- if test "$nls_cv_use_catgets" = "yes"; then
- echo $ac_n "checking for main in -li""... $ac_c" 1>&6
--echo "configure:7357: checking for main in -li" >&5
-+echo "configure:7393: checking for main in -li" >&5
- ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
- if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-@@ -7370,14 +7397,14 @@
- ac_save_LIBS="$LIBS"
- LIBS="-li $LIBS"
- cat > conftest.$ac_ext <<EOF
--#line 7365 "configure"
-+#line 7401 "configure"
- #include "confdefs.h"
-
- int main() {
- main()
- ; return 0; }
- EOF
--if { (eval echo configure:7372: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
- else
-@@ -7405,12 +7432,12 @@
- fi
-
- echo $ac_n "checking for catgets""... $ac_c" 1>&6
--echo "configure:7400: checking for catgets" >&5
-+echo "configure:7436: checking for catgets" >&5
- if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 7405 "configure"
-+#line 7441 "configure"
- #include "confdefs.h"
- /* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char catgets(); below. */
-@@ -7433,7 +7460,7 @@
-
- ; return 0; }
- EOF
--if { (eval echo configure:7428: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-+if { (eval echo configure:7464: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_catgets=yes"
- else
-@@ -7455,7 +7482,7 @@
- # Extract the first word of "gencat", so it can be a program name with args.
- set dummy gencat; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7450: checking for $ac_word" >&5
-+echo "configure:7486: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7491,7 +7518,7 @@
- # Extract the first word of "gmsgfmt", so it can be a program name with args.
- set dummy gmsgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7486: checking for $ac_word" >&5
-+echo "configure:7522: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7528,7 +7555,7 @@
- # Extract the first word of "msgfmt", so it can be a program name with args.
- set dummy msgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7523: checking for $ac_word" >&5
-+echo "configure:7559: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7563,7 +7590,7 @@
- # Extract the first word of "xgettext", so it can be a program name with args.
- set dummy xgettext; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7558: checking for $ac_word" >&5
-+echo "configure:7594: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7621,7 +7648,7 @@
- # Extract the first word of "msgfmt", so it can be a program name with args.
- set dummy msgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7616: checking for $ac_word" >&5
-+echo "configure:7652: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7655,7 +7682,7 @@
- # Extract the first word of "gmsgfmt", so it can be a program name with args.
- set dummy gmsgfmt; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7650: checking for $ac_word" >&5
-+echo "configure:7686: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7691,7 +7718,7 @@
- # Extract the first word of "xgettext", so it can be a program name with args.
- set dummy xgettext; ac_word=$2
- echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
--echo "configure:7686: checking for $ac_word" >&5
-+echo "configure:7722: checking for $ac_word" >&5
- if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
-@@ -7784,7 +7811,7 @@
- LINGUAS=
- else
- echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
--echo "configure:7779: checking for catalogs to be installed" >&5
-+echo "configure:7815: checking for catalogs to be installed" >&5
- NEW_LINGUAS=
- for lang in ${LINGUAS=$ALL_LINGUAS}; do
- case "$ALL_LINGUAS" in
-@@ -7812,17 +7839,17 @@
- if test "$CATOBJEXT" = ".cat"; then
- ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
- echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
--echo "configure:7807: checking for linux/version.h" >&5
-+echo "configure:7843: checking for linux/version.h" >&5
- if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
- else
- cat > conftest.$ac_ext <<EOF
--#line 7812 "configure"
-+#line 7848 "configure"
- #include "confdefs.h"
- #include <linux/version.h>
- EOF
- ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
--{ (eval echo configure:7817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-+{ (eval echo configure:7853: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
- ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
- if test -z "$ac_err"; then
- rm -rf conftest*
-@@ -8056,7 +8083,7 @@
-
- # Figure out what assembler alignment features are present.
- echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
--echo "configure:8051: checking assembler alignment features" >&5
-+echo "configure:8087: checking assembler alignment features" >&5
- gcc_cv_as=
- gcc_cv_as_alignment_features=
- gcc_cv_as_gas_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gas
-@@ -8177,7 +8204,7 @@
- echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
-
- echo $ac_n "checking assembler subsection support""... $ac_c" 1>&6
--echo "configure:8172: checking assembler subsection support" >&5
-+echo "configure:8208: checking assembler subsection support" >&5
- gcc_cv_as_subsections=
- if test x$gcc_cv_as != x; then
- # Check if we have .subsection
-@@ -8217,7 +8244,7 @@
- echo "$ac_t""$gcc_cv_as_subsections" 1>&6
-
- echo $ac_n "checking assembler instructions""... $ac_c" 1>&6
--echo "configure:8212: checking assembler instructions" >&5
-+echo "configure:8248: checking assembler instructions" >&5
- gcc_cv_as_instructions=
- if test x$gcc_cv_as != x; then
- set "filds fists" "filds mem; fists mem"
+--- ../gcc-2.95.3/gcc/config/ns32k/xm-ns32k.h.orig Wed Dec 16 22:10:51 1998
++++ ../gcc-2.95.3/gcc/config/ns32k/xm-ns32k.h Thu Jan 3 20:37:53 2002
+@@ -36,7 +36,3 @@
+ /* Arguments to use with `exit'. */
+ #define SUCCESS_EXIT_CODE 0
+ #define FATAL_EXIT_CODE 33
+-
+-#define memcpy(src,dst,len) bcopy ((dst),(src),(len))
+-#define memset gcc_memset
+-#define memcmp(left,right,len) bcmp ((left),(right),(len))
diff --git a/lang/gcc/patches/patch-as b/lang/gcc/patches/patch-as
index 8bf1e95c6d6..9f23ea5793d 100644
--- a/lang/gcc/patches/patch-as
+++ b/lang/gcc/patches/patch-as
@@ -1,20 +1,15 @@
-$NetBSD: patch-as,v 1.1 2000/09/15 23:58:49 tron Exp $
+$NetBSD: patch-as,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/emit-rtl.c.orig Wed Aug 11 09:28:52 1999
-+++ ../gcc-2.95.2/gcc/emit-rtl.c Sat Sep 16 00:17:42 2000
-@@ -1378,6 +1378,15 @@
- val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
- return GEN_INT (val);
- }
-+#if HOST_BITS_PER_WIDE_INT >= 64
-+ else if (BITS_PER_WORD >= 64 && i <= 1)
-+ {
-+ val = k[i*2 + ! WORDS_BIG_ENDIAN];
-+ val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
-+ val |= (HOST_WIDE_INT) k[i*2 + WORDS_BIG_ENDIAN] & 0xffffffff;
-+ return GEN_INT (val);
-+ }
-+#endif
- else
- abort ();
- }
+--- ../gcc-2.95.3/gcc/config/rs6000/rs6000.c.orig Thu Jan 25 15:03:34 2001
++++ ../gcc-2.95.3/gcc/config/rs6000/rs6000.c Thu Jan 3 20:37:53 2002
+@@ -1004,8 +1004,9 @@
+ && CONST_DOUBLE_HIGH (op) == 0
+ && (CONST_DOUBLE_LOW (op) & (~ (HOST_WIDE_INT) 0xffff)) != 0
+ && (CONST_DOUBLE_LOW (op)
+- & (~ (unsigned HOST_WIDE_INT) 0xffff0000u)) != 0));
++ & (~ (unsigned HOST_WIDE_INT) 0xffff0000u)) != 0)
+ #endif
++ );
+ }
+
+ /* Return 1 if C is a constant that can be encoded in a 32-bit mask on the
diff --git a/lang/gcc/patches/patch-at b/lang/gcc/patches/patch-at
index ee97dc65dd3..457926fe2f9 100644
--- a/lang/gcc/patches/patch-at
+++ b/lang/gcc/patches/patch-at
@@ -1,43 +1,24 @@
-$NetBSD: patch-at,v 1.1 2000/10/16 08:56:02 jlam Exp $
+$NetBSD: patch-at,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/ginclude/stddef.h.orig Wed Dec 16 16:19:25 1998
-+++ ../gcc-2.95.2/gcc/ginclude/stddef.h
-@@ -45,6 +45,12 @@
- #define _WCHAR_T
- #endif
- #endif
-+/* On NetBSD, machine/ansi.h defines _BSD_WINT_T_ instead of _WINT_T. */
-+#if !defined(_WINT_T_) && !defined(_BSD_WINT_T_)
-+#ifndef _BSD_WINT_T_
-+#define _WINT_T
-+#endif
-+#endif
- /* Undef _FOO_T_ if we are supposed to define foo_t. */
- #if defined (__need_ptrdiff_t) || defined (_STDDEF_H_)
- #undef _PTRDIFF_T_
-@@ -58,6 +64,10 @@
- #undef _WCHAR_T_
- #undef _BSD_WCHAR_T_
- #endif
-+#if defined (__need_wint_t) || defined (_STDDEF_H_)
-+#undef _WINT_T_
-+#undef _BSD_WINT_T_
-+#endif
- #endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) */
+--- ../gcc-2.95.3/gcc/config/sh/sh.c.orig Mon Aug 2 07:02:55 1999
++++ ../gcc-2.95.3/gcc/config/sh/sh.c Thu Jan 3 20:37:53 2002
+@@ -515,6 +515,7 @@
+ if ((code != EQ && code != NE
+ && (sh_compare_op1 != const0_rtx
+ || code == GTU || code == GEU || code == LTU || code == LEU))
++ || (mode == DImode && sh_compare_op1 != const0_rtx)
+ || TARGET_SH3E && GET_MODE_CLASS (mode) == MODE_FLOAT)
+ sh_compare_op1 = force_reg (mode, sh_compare_op1);
- /* Sequent's header files use _PTRDIFF_T_ in some conflicting way.
-@@ -272,12 +282,14 @@
+@@ -823,9 +824,9 @@
- #if defined (_STDDEF_H) || defined (__need_wint_t)
- #ifndef _WINT_T
-+#ifndef _BSD_WINT_T_
- #define _WINT_T
-
- #ifndef __WINT_TYPE__
- #define __WINT_TYPE__ unsigned int
- #endif
- typedef __WINT_TYPE__ wint_t;
-+#endif
- #endif
- #undef __need_wint_t
- #endif
+ char *
+ output_ieee_ccmpeq (insn, operands)
+- rtx insn, operands;
++ rtx insn, *operands;
+ {
+- output_branchy_insn (NE, "bt\t%l9\\;fcmp/eq\t%1,%0", insn, operands);
++ return output_branchy_insn (NE, "bt\t%l9\\;fcmp/eq\t%1,%0", insn, operands);
+ }
+
+ /* Output to FILE the start of the assembler file. */
diff --git a/lang/gcc/patches/patch-au b/lang/gcc/patches/patch-au
index a7fd62b3c62..cd7f88bd3de 100644
--- a/lang/gcc/patches/patch-au
+++ b/lang/gcc/patches/patch-au
@@ -1,63 +1,32 @@
-$NetBSD: patch-au,v 1.1 2001/02/28 23:28:09 hubertf Exp $
+$NetBSD: patch-au,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/crtstuff.c.orig Tue Feb 27 14:34:52 2001
-+++ ../gcc-2.95.2/gcc/crtstuff.c
-@@ -181,16 +181,16 @@
-
- /* Stick a call to __do_global_dtors_aux into the .fini section. */
-
--static void __attribute__ ((__unused__))
--fini_dummy (void)
-+asm (FINI_SECTION_ASM_OP);
-+void __attribute__ ((__unused__))
-+_fini (void)
- {
-- asm (FINI_SECTION_ASM_OP);
- __do_global_dtors_aux ();
- #ifdef FORCE_FINI_SECTION_ALIGN
- FORCE_FINI_SECTION_ALIGN;
- #endif
-- asm (TEXT_SECTION_ASM_OP);
- }
-+asm (TEXT_SECTION_ASM_OP);
-
- #ifdef EH_FRAME_SECTION_ASM_OP
- /* Stick a call to __register_frame_info into the .init section. For some
-@@ -205,6 +205,21 @@
- __register_frame_info (__EH_FRAME_BEGIN__, &object);
+--- ../gcc-2.95.3/gcc/config/sh/sh.h.orig Mon Aug 2 07:02:55 1999
++++ ../gcc-2.95.3/gcc/config/sh/sh.h Thu Jan 3 20:37:53 2002
+@@ -1681,7 +1681,7 @@
+ it uses this information. Hence, the general register <-> floating point
+ register information here is not used for SFmode. */
+ #define REGISTER_MOVE_COST(SRCCLASS, DSTCLASS) \
+- ((((DSTCLASS) == T_REGS) || ((DSTCLASS) == PR_REG)) ? 10 \
++ ((((DSTCLASS) == T_REGS) || ((DSTCLASS) == PR_REGS)) ? 10 \
+ : ((((DSTCLASS) == FP0_REGS || (DSTCLASS) == FP_REGS || (DSTCLASS) == DF_REGS) \
+ && ((SRCCLASS) == GENERAL_REGS || (SRCCLASS) == R0_REGS)) \
+ || (((DSTCLASS) == GENERAL_REGS || (DSTCLASS) == R0_REGS) \
+@@ -1796,10 +1796,10 @@
}
-+static void
-+__nop (void)
-+{
-+ //asm("unimp 0x42"); // We must not call this function ever. If we happen to
-+ // do it accidently, use the emergency exit.
-+}
-+
-+asm (INIT_SECTION_ASM_OP);
-+void __attribute__ ((__unused__))
-+_init (void)
-+{
-+ asm (TEXT_SECTION_ASM_OP);
-+ __nop();
-+}
-+
- static void __attribute__ ((__unused__))
- init_dummy (void)
- {
-@@ -378,7 +393,6 @@
- #ifdef FORCE_INIT_SECTION_ALIGN
- FORCE_INIT_SECTION_ALIGN;
- #endif
-- asm (TEXT_SECTION_ASM_OP);
+ #define ASM_OUTPUT_REG_PUSH(file, v) \
+- fprintf ((file), "\tmov.l\tr%s,-@r15\n", (v));
++ fprintf ((file), "\tmov.l\tr%d,@-r15\n", (v));
- /* This is a kludge. The i386 GNU/Linux dynamic linker needs ___brk_addr,
- __environ and atexit (). We have to make sure they are in the .dynsym
-@@ -395,6 +409,7 @@
- }
- #endif
- }
-+asm (TEXT_SECTION_ASM_OP);
+ #define ASM_OUTPUT_REG_POP(file, v) \
+- fprintf ((file), "\tmov.l\t@r15+,r%s\n", (v));
++ fprintf ((file), "\tmov.l\t@r15+,r%d\n", (v));
- #else /* OBJECT_FORMAT_ELF */
+ /* The assembler's names for the registers. RFP need not always be used as
+ the Real framepointer; it can also be used as a normal general register.
+@@ -2214,3 +2214,5 @@
+ #define SH_DYNAMIC_SHIFT_COST \
+ (TARGET_HARD_SH4 ? 1 : TARGET_SH3 ? (TARGET_SMALLCODE ? 1 : 2) : 20)
++
++#define DWARF_LINE_MIN_INSTR_LENGTH 2
diff --git a/lang/gcc/patches/patch-av b/lang/gcc/patches/patch-av
index f7245e4bb9d..0758da96718 100644
--- a/lang/gcc/patches/patch-av
+++ b/lang/gcc/patches/patch-av
@@ -1,14 +1,29 @@
-$NetBSD: patch-av,v 1.1 2001/02/28 23:28:09 hubertf Exp $
+$NetBSD: patch-av,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/sparc/t-netbsd.orig Tue Feb 27 14:37:27 2001
-+++ ../gcc-2.95.2/gcc/config/sparc/t-netbsd
-@@ -0,0 +1,9 @@
-+# We have to include libgcc.a also in shared libraries, so
-+# let's compile the code position independent
-+
-+TARGET_LIBGCC2_CFLAGS = -fPIC
-+
-+# Same for crtbeginS.o and crtendS.o . All code that goes into a shared
-+# library has to be PIC
-+
-+CRTSTUFF_T_CFLAGS_S = -fPIC
+--- ../gcc-2.95.3/gcc/config/sparc/netbsd.h.orig Wed Dec 16 22:13:18 1998
++++ ../gcc-2.95.3/gcc/config/sparc/netbsd.h Thu Jan 3 20:37:53 2002
+@@ -7,15 +7,15 @@
+ /* Names to predefine in the preprocessor for this target machine. */
+
+ #undef CPP_PREDEFINES
+-#define CPP_PREDEFINES "-Dunix -Dsparc -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(sparc) -Amachine(sparc)"
++#define CPP_PREDEFINES "-Dsparc -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__ -Asystem(unix) -Asystem(NetBSD) -Acpu(sparc) -Amachine(sparc)"
+
+ /* Make gcc agree with <machine/ansi.h> */
+
+ #undef SIZE_TYPE
+-#define SIZE_TYPE "unsigned int"
++#define SIZE_TYPE "long unsigned int"
+
+ #undef PTRDIFF_TYPE
+-#define PTRDIFF_TYPE "int"
++#define PTRDIFF_TYPE "long int"
+
+ #undef WCHAR_TYPE
+ #define WCHAR_TYPE "int"
+@@ -44,3 +44,5 @@
+ and initialization stuff better. */
+ #define DWARF2_UNWIND_INFO 0
+
++/* Name the default cpu target */
++#define TARGET_CPU_DEFAULT TARGET_CPU_sparc
diff --git a/lang/gcc/patches/patch-aw b/lang/gcc/patches/patch-aw
index 0bbdc9ea550..57c62477123 100644
--- a/lang/gcc/patches/patch-aw
+++ b/lang/gcc/patches/patch-aw
@@ -1,13 +1,127 @@
-$NetBSD: patch-aw,v 1.1 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-aw,v 1.2 2002/01/03 20:40:43 tron Exp $
---- ../gcc-2.95.2/gcc/config/arm/netbsd.h.orig Mon Jan 11 13:33:58 1999
-+++ ../gcc-2.95.2/gcc/config/arm/netbsd.h
-@@ -48,7 +48,7 @@
+--- ../gcc-2.95.3/gcc/config/sparc/sparc.c.orig Thu Jan 25 15:03:37 2001
++++ ../gcc-2.95.3/gcc/config/sparc/sparc.c Thu Jan 3 20:37:53 2002
+@@ -142,6 +142,8 @@
+ int sparc_align_jumps;
+ int sparc_align_funcs;
- /* Until they use ELF or something that handles dwarf2 unwinds
- and initialization stuff better. */
--#undef DWARF2_UNWIND_INFO
-+#define DWARF2_UNWIND_INFO 0
++char sparc_hard_reg_printed[8];
++
+ struct sparc_cpu_select sparc_select[] =
+ {
+ /* switch name, tune arch */
+@@ -213,8 +215,11 @@
+ /* TEMIC sparclet */
+ { "tsc701", PROCESSOR_TSC701, MASK_ISA, MASK_SPARCLET },
+ { "v9", PROCESSOR_V9, MASK_ISA, MASK_V9 },
+- /* TI ultrasparc */
+- { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9 },
++ /* TI ultrasparc I, II, IIi */
++ { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9
++ /* Although insns using %y are deprecated, it is a clear win on current
++ ultrasparcs. */
++ |MASK_DEPRECATED_V8_INSNS },
+ { 0, 0, 0, 0 }
+ };
+ struct cpu_table *cpu;
+@@ -368,7 +373,7 @@
+ sparc_init_modes ();
- /* Some defines for CPP.
- arm32 is the NetBSD port name, so we always define arm32 and __arm32__. */
+ if ((profile_flag || profile_block_flag)
+- && sparc_cmodel != CM_MEDLOW)
++ && sparc_cmodel != CM_32 && sparc_cmodel != CM_MEDLOW)
+ {
+ error ("profiling does not support code models other than medlow");
+ }
+@@ -3108,6 +3113,32 @@
+ }
+ }
+
++/* Output any necessary .register pseudo-ops. */
++void
++sparc_output_scratch_registers (file)
++ FILE *file;
++{
++#ifdef HAVE_AS_REGISTER_PSEUDO_OP
++ int i;
++
++ if (TARGET_ARCH32)
++ return;
++
++ /* Check if %g[2367] were used without
++ .register being printed for them already. */
++ for (i = 2; i < 8; i++)
++ {
++ if (regs_ever_live [i]
++ && ! sparc_hard_reg_printed [i])
++ {
++ sparc_hard_reg_printed [i] = 1;
++ fprintf (file, "\t.register\t%%g%d, #scratch\n", i);
++ }
++ if (i == 3) i = 5;
++ }
++#endif
++}
++
+ /* Output code for the function prologue. */
+
+ void
+@@ -3116,6 +3147,8 @@
+ int size;
+ int leaf_function;
+ {
++ sparc_output_scratch_registers (file);
++
+ /* Need to use actual_fsize, since we are also allocating
+ space for our callee (and our own register save area). */
+ actual_fsize = compute_frame_size (size, leaf_function);
+@@ -3753,6 +3786,14 @@
+ while (intslots > 0);
+ }
+
++/* A subroutine of function_arg_record_value. Traverse the structure
++ recusively and determine how many registers will be required. */
++
++/* A subroutine of function_arg_record_value. Traverse the structure
++ recursively and assign bits to floating point registers. Track which
++ bits in between need integer registers; invoke function_arg_record_value_3
++ to make that happen. */
++
+ static void
+ function_arg_record_value_2 (type, startbitpos, parms)
+ tree type;
+@@ -3812,6 +3853,9 @@
+ }
+ }
+
++/* Used by function_arg and function_value to implement the complex
++ Sparc64 structure calling conventions. */
++
+ static rtx
+ function_arg_record_value (type, mode, slotno, named, regbase)
+ tree type;
+@@ -3834,10 +3878,12 @@
+
+ if (parms.intoffset != -1)
+ {
++ unsigned int startbit, endbit;
+ int intslots, this_slotno;
+
+- intslots = (typesize*BITS_PER_UNIT - parms.intoffset + BITS_PER_WORD - 1)
+- / BITS_PER_WORD;
++ startbit = parms.intoffset & -BITS_PER_WORD;
++ endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
++ intslots = (endbit - startbit) / BITS_PER_WORD;
+ this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
+
+ intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
+@@ -5850,6 +5896,8 @@
+ {
+ char *sp_str = reg_names[STACK_POINTER_REGNUM];
+ unsigned long gmask = current_frame_info.gmask;
++
++ sparc_output_scratch_registers (file);
+
+ /* This is only for the human reader. */
+ fprintf (file, "\t%s#PROLOGUE# 0\n", ASM_COMMENT_START);
diff --git a/lang/gcc/patches/patch-ax b/lang/gcc/patches/patch-ax
index 3351e9b35b6..f13d0ad0386 100644
--- a/lang/gcc/patches/patch-ax
+++ b/lang/gcc/patches/patch-ax
@@ -1,11 +1,194 @@
-$NetBSD: patch-ax,v 1.1 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-ax,v 1.2 2002/01/03 20:40:44 tron Exp $
---- ../gcc-2.95.2/gcc/config/vax/netbsd.h.orig Wed Dec 16 21:14:22 1998
-+++ ../gcc-2.95.2/gcc/config/vax/netbsd.h
-@@ -20,5 +20,4 @@
-
- /* Until they use ELF or something that handles dwarf2 unwinds
- and initialization stuff better. */
--#undef DWARF2_UNWIND_INFO
--
-+#define DWARF2_UNWIND_INFO 0
+--- ../gcc-2.95.3/gcc/config/sparc/sparc.h.orig Mon Jun 21 19:48:49 1999
++++ ../gcc-2.95.3/gcc/config/sparc/sparc.h Thu Jan 3 20:37:53 2002
+@@ -50,11 +50,11 @@
+
+ /* Code model selection.
+ -mcmodel is used to select the v9 code model.
+- Different code models aren't supported for v8 code.
++ Different code models aren't supported for v7/8 code.
+
+ TARGET_CM_32: 32 bit address space, top 32 bits = 0,
+ pointers are 32 bits. Note that this isn't intended
+- to imply a v8 abi.
++ to imply a v7/8 abi.
+
+ TARGET_CM_MEDLOW: 32 bit address space, top 32 bits = 0,
+ avoid generating %uhi and %ulo terms,
+@@ -173,8 +173,8 @@
+ #endif
+
+ #if TARGET_CPU_DEFAULT == TARGET_CPU_sparclite86x
+-#define CPP_CPU32_DEFAULT_SPEC "-D__sparclite86x__ -D__sparc_v8__"
+-#define ASM_CPU32_DEFAULT_SPEC "-Av8"
++#define CPP_CPU32_DEFAULT_SPEC "-D__sparclite86x__"
++#define ASM_CPU32_DEFAULT_SPEC "-Asparclite"
+ #endif
+
+ #endif
+@@ -233,7 +233,7 @@
+ %{mcpu=v8:-D__sparc_v8__} \
+ %{mcpu=supersparc:-D__supersparc__ -D__sparc_v8__} \
+ %{mcpu=hypersparc:-D__hypersparc__ -D__sparc_v8__} \
+-%{mcpu=sparclite86x:-D__sparclite86x__ -D__sparc_v8__} \
++%{mcpu=sparclite86x:-D__sparclite86x__} \
+ %{mcpu=v9:-D__sparc_v9__} \
+ %{mcpu=ultrasparc:-D__sparc_v9__} \
+ %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(cpp_cpu_default)}}}}}}} \
+@@ -297,6 +297,7 @@
+ %{msparclite:-Asparclite} \
+ %{mf930:-Asparclite} %{mf934:-Asparclite} \
+ %{mcpu=sparclite:-Asparclite} \
++%{mcpu=sparclite86x:-Asparclite} \
+ %{mcpu=f930:-Asparclite} %{mcpu=f934:-Asparclite} \
+ %{mv8plus:-Av8plus} \
+ %{mcpu=v9:-Av9} \
+@@ -542,9 +543,8 @@
+ #define TARGET_VIS (target_flags & MASK_VIS)
+
+ /* Compile for Solaris V8+. 32 bit Solaris preserves the high bits of
+- the current out and global registers. Linux saves the high bits on
+- context switches but not signals. */
+-#define MASK_V8PLUS 0x2000000
++ the current out and global registers and Linux 2.2+ as well. */
++#define MASK_V8PLUS 0x2000000
+ #define TARGET_V8PLUS (target_flags & MASK_V8PLUS)
+
+ /* TARGET_HARD_MUL: Use hardware multiply instructions but not %y.
+@@ -555,7 +555,7 @@
+ #define TARGET_HARD_MUL32 \
+ ((TARGET_V8 || TARGET_SPARCLITE \
+ || TARGET_SPARCLET || TARGET_DEPRECATED_V8_INSNS) \
+- && ! TARGET_V8PLUS)
++ && ! TARGET_V8PLUS && TARGET_ARCH32)
+
+ #define TARGET_HARD_MUL \
+ (TARGET_V8 || TARGET_SPARCLITE || TARGET_SPARCLET \
+@@ -1822,6 +1822,31 @@
+ ASM_OUTPUT_LABEL (FILE, NAME); \
+ } while (0)
+
++/* Output the special assembly code needed to tell the assembler some
++ register is used as global register variable. */
++
++#ifdef HAVE_AS_REGISTER_PSEUDO_OP
++#define ASM_DECLARE_REGISTER_GLOBAL(FILE, DECL, REGNO, NAME) \
++do { \
++ if (TARGET_ARCH64) \
++ { \
++ int __end = HARD_REGNO_NREGS ((REGNO), DECL_MODE (decl)) + (REGNO); \
++ int __reg; \
++ extern char sparc_hard_reg_printed[8]; \
++ for (__reg = (REGNO); __reg < 8 && __reg < __end; __reg++) \
++ if ((__reg & ~1) == 2 || (__reg & ~1) == 6) \
++ { \
++ if (__reg == (REGNO)) \
++ fprintf ((FILE), "\t.register\t%%g%d, %s\n", __reg, (NAME)); \
++ else \
++ fprintf ((FILE), "\t.register\t%%g%d, .gnu.part%d.%s\n", \
++ __reg, __reg - (REGNO), (NAME)); \
++ sparc_hard_reg_printed[__reg] = 1; \
++ } \
++ } \
++} while (0)
++#endif
++
+ /* This macro generates the assembly code for function entry.
+ FILE is a stdio stream to output the code to.
+ SIZE is an int: how many units of temporary storage to allocate.
+@@ -2234,6 +2259,14 @@
+ : 0))
+ #endif
+
++/* Should gcc use [%reg+%lo(xx)+offset] addresses? */
++
++#ifdef HAVE_AS_OFFSETABLE_LO10
++#define USE_AS_OFFSETABLE_LO10 1
++#else
++#define USE_AS_OFFSETABLE_LO10 0
++#endif
++
+ /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
+ that is a valid memory address for an instruction.
+ The MODE argument is the machine mode for the MEM expression
+@@ -2258,6 +2291,9 @@
+
+ #define RTX_OK_FOR_OFFSET_P(X) \
+ (GET_CODE (X) == CONST_INT && INTVAL (X) >= -0x1000 && INTVAL (X) < 0x1000)
++
++#define RTX_OK_FOR_OLO10_P(X) \
++ (GET_CODE (X) == CONST_INT && INTVAL (X) >= -0x1000 && INTVAL (X) < 0xc00 - 8)
+
+ #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
+ { if (RTX_OK_FOR_BASE_P (X)) \
+@@ -2309,6 +2345,30 @@
+ || RTX_OK_FOR_OFFSET_P (op0)) \
+ goto ADDR; \
+ } \
++ else if (USE_AS_OFFSETABLE_LO10 \
++ && GET_CODE (op0) == LO_SUM \
++ && TARGET_ARCH64 \
++ && ! TARGET_CM_MEDMID \
++ && RTX_OK_FOR_OLO10_P (op1)) \
++ { \
++ register rtx op00 = XEXP (op0, 0); \
++ register rtx op01 = XEXP (op0, 1); \
++ if (RTX_OK_FOR_BASE_P (op00) \
++ && CONSTANT_P (op01)) \
++ goto ADDR; \
++ } \
++ else if (USE_AS_OFFSETABLE_LO10 \
++ && GET_CODE (op1) == LO_SUM \
++ && TARGET_ARCH64 \
++ && ! TARGET_CM_MEDMID \
++ && RTX_OK_FOR_OLO10_P (op0)) \
++ { \
++ register rtx op10 = XEXP (op1, 0); \
++ register rtx op11 = XEXP (op1, 1); \
++ if (RTX_OK_FOR_BASE_P (op10) \
++ && CONSTANT_P (op11)) \
++ goto ADDR; \
++ } \
+ } \
+ else if (GET_CODE (X) == LO_SUM) \
+ { \
+@@ -3109,15 +3169,29 @@
+ offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);\
+ else \
+ base = XEXP (addr, 0), index = XEXP (addr, 1); \
+- fputs (reg_names[REGNO (base)], FILE); \
+- if (index == 0) \
+- fprintf (FILE, "%+d", offset); \
+- else if (GET_CODE (index) == REG) \
+- fprintf (FILE, "+%s", reg_names[REGNO (index)]); \
+- else if (GET_CODE (index) == SYMBOL_REF \
+- || GET_CODE (index) == CONST) \
+- fputc ('+', FILE), output_addr_const (FILE, index); \
+- else abort (); \
++ if (GET_CODE (base) == LO_SUM) \
++ { \
++ if (! USE_AS_OFFSETABLE_LO10 \
++ || TARGET_ARCH32 \
++ || TARGET_CM_MEDMID) \
++ abort (); \
++ output_operand (XEXP (base, 0), 0); \
++ fputs ("+%lo(", FILE); \
++ output_address (XEXP (base, 1)); \
++ fprintf (FILE, ")+%d", offset); \
++ } \
++ else \
++ { \
++ fputs (reg_names[REGNO (base)], FILE); \
++ if (index == 0) \
++ fprintf (FILE, "%+d", offset); \
++ else if (GET_CODE (index) == REG) \
++ fprintf (FILE, "+%s", reg_names[REGNO (index)]); \
++ else if (GET_CODE (index) == SYMBOL_REF \
++ || GET_CODE (index) == CONST) \
++ fputc ('+', FILE), output_addr_const (FILE, index); \
++ else abort (); \
++ } \
+ } \
+ else if (GET_CODE (addr) == MINUS \
+ && GET_CODE (XEXP (addr, 1)) == LABEL_REF) \
diff --git a/lang/gcc/patches/patch-ay b/lang/gcc/patches/patch-ay
index 3c4b0a8e5e8..c09f8192bdf 100644
--- a/lang/gcc/patches/patch-ay
+++ b/lang/gcc/patches/patch-ay
@@ -1,11 +1,488 @@
-$NetBSD: patch-ay,v 1.1 2001/04/27 10:45:23 skrll Exp $
+$NetBSD: patch-ay,v 1.2 2002/01/03 20:40:44 tron Exp $
---- ../gcc-2.95.2/gcc/config/mips/netbsd.h.orig Wed Dec 16 21:09:19 1998
-+++ ../gcc-2.95.2/gcc/config/mips/netbsd.h
-@@ -225,3 +225,6 @@
- /* Since gas and gld are standard on NetBSD, we don't need these */
- #undef ASM_FINAL_SPEC
- #undef STARTFILE_SPEC
-+
-+/* Use sjlj exceptions. */
-+#define DWARF2_UNWIND_INFO 0
+--- ../gcc-2.95.3/gcc/config/sparc/sparc.md.orig Thu Jan 25 15:03:37 2001
++++ ../gcc-2.95.3/gcc/config/sparc/sparc.md Thu Jan 3 20:37:54 2002
+@@ -2496,7 +2496,7 @@
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (high:DI (match_operand:DI 1 "sp64_medium_pic_operand" "")))]
+ "(TARGET_CM_MEDLOW || TARGET_CM_EMBMEDANY) && check_pic (1)"
+- "sethi\\t%%lo(%a1), %0"
++ "sethi\\t%%hi(%a1), %0"
+ [(set_attr "type" "move")
+ (set_attr "length" "1")])
+
+@@ -3473,10 +3473,7 @@
+ (define_split
+ [(set (match_operand:TF 0 "register_operand" "")
+ (match_operand:TF 1 "register_operand" ""))]
+- "reload_completed
+- && (! TARGET_ARCH64
+- || (TARGET_FPU
+- && ! TARGET_HARD_QUAD))"
++ "reload_completed"
+ [(clobber (const_int 0))]
+ "
+ {
+@@ -5170,9 +5167,8 @@
+
+ ;; Integer Multiply/Divide.
+
+-;; The 32 bit multiply/divide instructions are deprecated on v9 and shouldn't
+-;; we used. We still use them in 32 bit v9 compilers.
+-;; The 64 bit v9 compiler will (/should) widen the args and use muldi3.
++;; The 32 bit multiply/divide instructions are deprecated on v9, but at
++;; least in UltraSPARC I, II and IIi it is a win tick-wise.
+
+ (define_insn "mulsi3"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+@@ -5230,15 +5226,13 @@
+ }"
+ [(set_attr "length" "9,8")])
+
+-;; It is not known whether this will match.
+-
+ (define_insn "*cmp_mul_set"
+- [(set (match_operand:SI 0 "register_operand" "=r")
+- (mult:SI (match_operand:SI 1 "arith_operand" "%r")
+- (match_operand:SI 2 "arith_operand" "rI")))
+- (set (reg:CC_NOOV 100)
+- (compare:CC_NOOV (mult:SI (match_dup 1) (match_dup 2))
+- (const_int 0)))]
++ [(set (reg:CC 100)
++ (compare:CC (mult:SI (match_operand:SI 1 "arith_operand" "%r")
++ (match_operand:SI 2 "arith_operand" "rI"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "register_operand" "=r")
++ (mult:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_V8 || TARGET_SPARCLITE || TARGET_DEPRECATED_V8_INSNS"
+ "smulcc\\t%1, %2, %0"
+ [(set_attr "type" "imul")
+@@ -5254,12 +5248,11 @@
+ if (CONSTANT_P (operands[2]))
+ {
+ if (TARGET_V8PLUS)
+- {
+- emit_insn (gen_const_mulsidi3_v8plus (operands[0], operands[1],
+- operands[2]));
+- DONE;
+- }
+- emit_insn (gen_const_mulsidi3 (operands[0], operands[1], operands[2]));
++ emit_insn (gen_const_mulsidi3_v8plus (operands[0], operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_const_mulsidi3_sp32 (operands[0], operands[1],
++ operands[2]));
+ DONE;
+ }
+ if (TARGET_V8PLUS)
+@@ -5309,14 +5302,22 @@
+ (if_then_else (eq_attr "isa" "sparclet")
+ (const_int 1) (const_int 2)))])
+
++(define_insn "*mulsidi3_sp64"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
++ (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "smul\\t%1, %2, %0"
++ [(set_attr "length" "1")])
++
+ ;; Extra pattern, because sign_extend of a constant isn't valid.
+
+ ;; XXX
+-(define_insn "const_mulsidi3"
++(define_insn "const_mulsidi3_sp32"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (match_operand:SI 2 "small_int" "I")))]
+- "TARGET_HARD_MUL"
++ "TARGET_HARD_MUL32"
+ "*
+ {
+ return TARGET_SPARCLET ? \"smuld\\t%1, %2, %L0\" : \"smul\\t%1, %2, %L0\\n\\trd\\t%%y, %H0\";
+@@ -5325,13 +5326,21 @@
+ (if_then_else (eq_attr "isa" "sparclet")
+ (const_int 1) (const_int 2)))])
+
++(define_insn "const_mulsidi3_sp64"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
++ (match_operand:SI 2 "small_int" "I")))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "smul\\t%1, %2, %0"
++ [(set_attr "length" "1")])
++
+ (define_expand "smulsi3_highpart"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (truncate:SI
+ (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" ""))
+ (sign_extend:DI (match_operand:SI 2 "arith_operand" "")))
+ (const_int 32))))]
+- "TARGET_HARD_MUL"
++ "TARGET_HARD_MUL && TARGET_ARCH32"
+ "
+ {
+ if (CONSTANT_P (operands[2]))
+@@ -5407,8 +5416,7 @@
+ (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (sign_extend:DI (match_operand:SI 2 "register_operand" "r")))
+ (const_int 32))))]
+- "TARGET_HARD_MUL32
+- && ! TARGET_LIVE_G0"
++ "TARGET_HARD_MUL32 && ! TARGET_LIVE_G0"
+ "smul\\t%1, %2, %%g0\\n\\trd\\t%%y, %0"
+ [(set_attr "length" "2")])
+
+@@ -5419,8 +5427,7 @@
+ (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (match_operand:SI 2 "register_operand" "r"))
+ (const_int 32))))]
+- "TARGET_HARD_MUL32
+- && ! TARGET_LIVE_G0"
++ "TARGET_HARD_MUL32 && ! TARGET_LIVE_G0"
+ "smul\\t%1, %2, %%g0\\n\\trd\\t%%y, %0"
+ [(set_attr "length" "2")])
+
+@@ -5434,12 +5441,11 @@
+ if (CONSTANT_P (operands[2]))
+ {
+ if (TARGET_V8PLUS)
+- {
+- emit_insn (gen_const_umulsidi3_v8plus (operands[0], operands[1],
+- operands[2]));
+- DONE;
+- }
+- emit_insn (gen_const_umulsidi3 (operands[0], operands[1], operands[2]));
++ emit_insn (gen_const_umulsidi3_v8plus (operands[0], operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_const_umulsidi3_sp32 (operands[0], operands[1],
++ operands[2]));
+ DONE;
+ }
+ if (TARGET_V8PLUS)
+@@ -5475,10 +5481,18 @@
+ (if_then_else (eq_attr "isa" "sparclet")
+ (const_int 1) (const_int 2)))])
+
++(define_insn "*umulsidi3_sp64"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
++ (zero_extend:DI (match_operand:SI 2 "register_operand" "r"))))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "umul\\t%1, %2, %0"
++ [(set_attr "length" "1")])
++
+ ;; Extra pattern, because sign_extend of a constant isn't valid.
+
+ ;; XXX
+-(define_insn "const_umulsidi3"
++(define_insn "const_umulsidi3_sp32"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (match_operand:SI 2 "uns_small_int" "")))]
+@@ -5491,6 +5505,14 @@
+ (if_then_else (eq_attr "isa" "sparclet")
+ (const_int 1) (const_int 2)))])
+
++(define_insn "const_umulsidi3_sp64"
++ [(set (match_operand:DI 0 "register_operand" "=r")
++ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
++ (match_operand:SI 2 "uns_small_int" "")))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "umul\\t%1, %2, %0"
++ [(set_attr "length" "1")])
++
+ ;; XXX
+ (define_insn "const_umulsidi3_v8plus"
+ [(set (match_operand:DI 0 "register_operand" "=h,r")
+@@ -5509,7 +5531,7 @@
+ (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" ""))
+ (zero_extend:DI (match_operand:SI 2 "uns_arith_operand" "")))
+ (const_int 32))))]
+- "TARGET_HARD_MUL"
++ "TARGET_HARD_MUL && TARGET_ARCH32"
+ "
+ {
+ if (CONSTANT_P (operands[2]))
+@@ -5568,8 +5590,7 @@
+ (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (zero_extend:DI (match_operand:SI 2 "register_operand" "r")))
+ (const_int 32))))]
+- "TARGET_HARD_MUL32
+- && ! TARGET_LIVE_G0"
++ "TARGET_HARD_MUL32 && ! TARGET_LIVE_G0"
+ "umul\\t%1, %2, %%g0\\n\\trd\\t%%y, %0"
+ [(set_attr "length" "2")])
+
+@@ -5580,40 +5601,64 @@
+ (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r"))
+ (match_operand:SI 2 "uns_small_int" ""))
+ (const_int 32))))]
+- "TARGET_HARD_MUL32
+- && ! TARGET_LIVE_G0"
++ "TARGET_HARD_MUL32 && ! TARGET_LIVE_G0"
+ "umul\\t%1, %2, %%g0\\n\\trd\\t%%y, %0"
+ [(set_attr "length" "2")])
+
+ ;; The v8 architecture specifies that there must be 3 instructions between
+ ;; a y register write and a use of it for correct results.
+
+-;; XXX SHEESH
+-(define_insn "divsi3"
++(define_expand "divsi3"
++ [(parallel [(set (match_operand:SI 0 "register_operand" "=r,r")
++ (div:SI (match_operand:SI 1 "register_operand" "r,r")
++ (match_operand:SI 2 "input_operand" "rI,m")))
++ (clobber (match_scratch:SI 3 "=&r,&r"))])]
++ "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS"
++ "
++{
++ if (TARGET_ARCH64)
++ {
++ operands[3] = gen_reg_rtx(SImode);
++ emit_insn (gen_ashrsi3 (operands[3], operands[1], GEN_INT (31)));
++ emit_insn (gen_divsi3_sp64 (operands[0], operands[1], operands[2],
++ operands[3]));
++ DONE;
++ }
++}")
++
++(define_insn "divsi3_sp32"
+ [(set (match_operand:SI 0 "register_operand" "=r,r")
+ (div:SI (match_operand:SI 1 "register_operand" "r,r")
+ (match_operand:SI 2 "input_operand" "rI,m")))
+ (clobber (match_scratch:SI 3 "=&r,&r"))]
+- "(TARGET_V8
+- || TARGET_DEPRECATED_V8_INSNS)
+- && ! TARGET_LIVE_G0"
++ "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS)
++ && TARGET_ARCH32"
+ "*
+ {
+ if (which_alternative == 0)
+- if (TARGET_V9)
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tsdiv\\t%1, %2, %0\";
+- else
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tnop\\n\\tnop\\n\\tnop\\n\\tsdiv\\t%1, %2, %0\";
++ if (TARGET_V9)
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tsdiv\\t%1, %2, %0\";
++ else
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tnop\\n\\tnop\\n\\tnop\\n\\tsdiv\\t%1, %2, %0\";
+ else
+ if (TARGET_V9)
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tld\\t%2, %3\\n\\tsdiv\\t%1, %3, %0\";
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tld\\t%2, %3\\n\\tsdiv\\t%1, %3, %0\";
+ else
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tld\\t%2, %3\\n\\tnop\\n\\tnop\\n\\tsdiv\\t%1, %3, %0\";
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tld\\t%2, %3\\n\\tnop\\n\\tnop\\n\\tsdiv\\t%1, %3, %0\";
+ }"
+ [(set (attr "length")
+ (if_then_else (eq_attr "isa" "v9")
+ (const_int 4) (const_int 7)))])
+
++(define_insn "divsi3_sp64"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (div:SI (match_operand:SI 1 "register_operand" "r")
++ (match_operand:SI 2 "input_operand" "rI")))
++ (use (match_operand:SI 3 "register_operand" "r"))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "wr\\t%%g0, %3, %%y\\n\\tsdiv\\t%1, %2, %0"
++ [(set_attr "length" "2")])
++
+ (define_insn "divdi3"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (div:DI (match_operand:DI 1 "register_operand" "r")
+@@ -5621,47 +5666,47 @@
+ "TARGET_ARCH64"
+ "sdivx\\t%1, %2, %0")
+
+-;; It is not known whether this will match.
+-
+-;; XXX I hope it doesn't fucking match...
+ (define_insn "*cmp_sdiv_cc_set"
+- [(set (match_operand:SI 0 "register_operand" "=r")
+- (div:SI (match_operand:SI 1 "register_operand" "r")
+- (match_operand:SI 2 "arith_operand" "rI")))
+- (set (reg:CC 100)
+- (compare:CC (div:SI (match_dup 1) (match_dup 2))
++ [(set (reg:CC 100)
++ (compare:CC (div:SI (match_operand:SI 1 "register_operand" "r")
++ (match_operand:SI 2 "arith_operand" "rI"))
+ (const_int 0)))
++ (set (match_operand:SI 0 "register_operand" "=r")
++ (div:SI (match_dup 1) (match_dup 2)))
+ (clobber (match_scratch:SI 3 "=&r"))]
+- "(TARGET_V8
+- || TARGET_DEPRECATED_V8_INSNS)
+- && ! TARGET_LIVE_G0"
++ "TARGET_V8 || TARGET_DEPRECATED_V8_INSNS"
+ "*
+ {
+ if (TARGET_V9)
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tsdivcc\\t%1, %2, %0\";
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tsdivcc\\t%1, %2, %0\";
+ else
+- return \"sra\\t%1, 31, %3\\n\\twr\\t%%g0, %3, %%y\\n\\tnop\\n\\tnop\\n\\tnop\\n\\tsdivcc\\t%1, %2, %0\";
++ return \"sra\\t%1, 31, %3\\n\\twr\\t%3, 0, %%y\\n\\tnop\\n\\tnop\\n\\tnop\\n\\tsdivcc\\t%1, %2, %0\";
+ }"
+ [(set (attr "length")
+ (if_then_else (eq_attr "isa" "v9")
+ (const_int 3) (const_int 6)))])
+
+ ;; XXX
+-(define_insn "udivsi3"
++(define_expand "udivsi3"
++ [(set (match_operand:SI 0 "register_operand" "")
++ (udiv:SI (match_operand:SI 1 "reg_or_nonsymb_mem_operand" "")
++ (match_operand:SI 2 "input_operand" "")))]
++ "(TARGET_V8 || TARGET_DEPRECATED_V8_INSNS) && ! TARGET_LIVE_G0"
++ "")
++
++(define_insn "udivsi3_sp32"
+ [(set (match_operand:SI 0 "register_operand" "=r,&r,&r")
+ (udiv:SI (match_operand:SI 1 "reg_or_nonsymb_mem_operand" "r,r,m")
+ (match_operand:SI 2 "input_operand" "rI,m,r")))]
+ "(TARGET_V8
+ || TARGET_DEPRECATED_V8_INSNS)
+- && ! TARGET_LIVE_G0"
++ && TARGET_ARCH32 && ! TARGET_LIVE_G0"
+ "*
+ {
+ output_asm_insn (\"wr\\t%%g0, %%g0, %%y\", operands);
+ switch (which_alternative)
+ {
+ default:
+- if (TARGET_V9)
+- return \"udiv\\t%1, %2, %0\";
+ return \"nop\\n\\tnop\\n\\tnop\\n\\tudiv\\t%1, %2, %0\";
+ case 1:
+ return \"ld\\t%2, %0\\n\\tnop\\n\\tnop\\n\\tudiv\\t%1, %0, %0\";
+@@ -5669,10 +5714,15 @@
+ return \"ld\\t%1, %0\\n\\tnop\\n\\tnop\\n\\tudiv\\t%0, %2, %0\";
+ }
+ }"
+- [(set (attr "length")
+- (if_then_else (and (eq_attr "isa" "v9")
+- (eq_attr "alternative" "0"))
+- (const_int 2) (const_int 5)))])
++ [(set_attr "length" "5")])
++
++(define_insn "udivsi3_sp64"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (udiv:SI (match_operand:SI 1 "reg_or_nonsymb_mem_operand" "r")
++ (match_operand:SI 2 "input_operand" "rI")))]
++ "TARGET_DEPRECATED_V8_INSNS && TARGET_ARCH64"
++ "wr\\t%%g0, 0, %%y\\n\\tudiv\\t%1, %2, %0"
++ [(set_attr "length" "2")])
+
+ (define_insn "udivdi3"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+@@ -5681,16 +5731,13 @@
+ "TARGET_ARCH64"
+ "udivx\\t%1, %2, %0")
+
+-;; It is not known whether this will match.
+-
+-;; XXX I hope it doesn't fucking match...
+ (define_insn "*cmp_udiv_cc_set"
+- [(set (match_operand:SI 0 "register_operand" "=r")
+- (udiv:SI (match_operand:SI 1 "register_operand" "r")
+- (match_operand:SI 2 "arith_operand" "rI")))
+- (set (reg:CC 100)
+- (compare:CC (udiv:SI (match_dup 1) (match_dup 2))
+- (const_int 0)))]
++ [(set (reg:CC 100)
++ (compare:CC (udiv:SI (match_operand:SI 1 "register_operand" "r")
++ (match_operand:SI 2 "arith_operand" "rI"))
++ (const_int 0)))
++ (set (match_operand:SI 0 "register_operand" "=r")
++ (udiv:SI (match_dup 1) (match_dup 2)))]
+ "(TARGET_V8
+ || TARGET_DEPRECATED_V8_INSNS)
+ && ! TARGET_LIVE_G0"
+@@ -7252,6 +7299,84 @@
+ "TARGET_V8PLUS"
+ "*return sparc_v8plus_shift (operands, insn, \"srlx\");"
+ [(set_attr "length" "5,5,6")])
++
++(define_insn ""
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (ashiftrt:SI (subreg:SI (lshiftrt:DI (match_operand:DI 1 "register_operand" "r")
++ (const_int 32)) 0)
++ (match_operand:SI 2 "small_int_or_double" "n")))]
++ "TARGET_ARCH64
++ && ((GET_CODE (operands[2]) == CONST_INT
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 32)
++ || (GET_CODE (operands[2]) == CONST_DOUBLE
++ && !CONST_DOUBLE_HIGH (operands[2])
++ && (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (operands[2]) < 32))"
++ "*
++{
++ operands[2] = GEN_INT (INTVAL (operands[2]) + 32);
++
++ return \"srax\\t%1, %2, %0\";
++}"
++ [(set_attr "type" "shift")
++ (set_attr "length" "1")])
++
++(define_insn ""
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (lshiftrt:SI (subreg:SI (ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
++ (const_int 32)) 0)
++ (match_operand:SI 2 "small_int_or_double" "n")))]
++ "TARGET_ARCH64
++ && ((GET_CODE (operands[2]) == CONST_INT
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) < 32)
++ || (GET_CODE (operands[2]) == CONST_DOUBLE
++ && !CONST_DOUBLE_HIGH (operands[2])
++ && (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (operands[2]) < 32))"
++ "*
++{
++ operands[2] = GEN_INT (INTVAL (operands[2]) + 32);
++
++ return \"srlx\\t%1, %2, %0\";
++}"
++ [(set_attr "type" "shift")
++ (set_attr "length" "1")])
++
++(define_insn ""
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (ashiftrt:SI (subreg:SI (ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
++ (match_operand:SI 2 "small_int_or_double" "n")) 0)
++ (match_operand:SI 3 "small_int_or_double" "n")))]
++ "TARGET_ARCH64
++ && GET_CODE (operands[2]) == CONST_INT && GET_CODE (operands[3]) == CONST_INT
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) >= 32
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[3]) < 32
++ && (unsigned HOST_WIDE_INT) (INTVAL (operands[2]) + INTVAL (operands[3])) < 64"
++ "*
++{
++ operands[2] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[3]));
++
++ return \"srax\\t%1, %2, %0\";
++}"
++ [(set_attr "type" "shift")
++ (set_attr "length" "1")])
++
++(define_insn ""
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (lshiftrt:SI (subreg:SI (lshiftrt:DI (match_operand:DI 1 "register_operand" "r")
++ (match_operand:SI 2 "small_int_or_double" "n")) 0)
++ (match_operand:SI 3 "small_int_or_double" "n")))]
++ "TARGET_ARCH64
++ && GET_CODE (operands[2]) == CONST_INT && GET_CODE (operands[3]) == CONST_INT
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) >= 32
++ && (unsigned HOST_WIDE_INT) INTVAL (operands[3]) < 32
++ && (unsigned HOST_WIDE_INT) (INTVAL (operands[2]) + INTVAL (operands[3])) < 64"
++ "*
++{
++ operands[2] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[3]));
++
++ return \"srlx\\t%1, %2, %0\";
++}"
++ [(set_attr "type" "shift")
++ (set_attr "length" "1")])
+
+ ;; Unconditional and other jump instructions
+ ;; On the Sparc, by setting the annul bit on an unconditional branch, the
diff --git a/lang/gcc/patches/patch-az b/lang/gcc/patches/patch-az
index 387c55f6011..69dff351957 100644
--- a/lang/gcc/patches/patch-az
+++ b/lang/gcc/patches/patch-az
@@ -1,13 +1,34 @@
-$NetBSD: patch-az,v 1.1 2001/05/04 10:15:46 skrll Exp $
+$NetBSD: patch-az,v 1.2 2002/01/03 20:40:44 tron Exp $
---- ../gcc-2.95.2/libstdc++/configure.in.orig Tue Jun 8 00:28:10 1999
-+++ ../gcc-2.95.2/libstdc++/configure.in
-@@ -73,6 +73,8 @@
- *-*-linux*aout*) ;;
- *-*-freebsd2*) ;;
- *-*-freebsd*) frags="${frags} freebsd.ml" ;;
-+ *-*-netbsdelf*) frags="${frags} netbsdelf.ml" ;;
-+ *-*-netbsd*) frags="${frags} netbsd.ml" ;;
- *-*-linux*) frags="${frags} linux.ml" ;;
- *-*-openbsd*) frags="${frags} openbsd.ml" ;;
- *-*-sysv[45]*|*-*-udk*) frags="${frags} elf.ml" ;;
+--- ../gcc-2.95.3/gcc/config/sparc/sysv4.h.orig Mon Jun 21 19:48:53 1999
++++ ../gcc-2.95.3/gcc/config/sparc/sysv4.h Thu Jan 3 20:37:54 2002
+@@ -210,6 +210,29 @@
+ #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+ asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+
++/* A C statement (sans semicolon) to output an element in the table of
++ global constructors. */
++#undef ASM_OUTPUT_CONSTRUCTOR
++#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
++ do { \
++ ctors_section (); \
++ fprintf (FILE, "\t%s\t ", TARGET_ARCH64 ? ASM_LONGLONG : INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++/* A C statement (sans semicolon) to output an element in the table of
++ global destructors. */
++#undef ASM_OUTPUT_DESTRUCTOR
++#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
++ do { \
++ dtors_section (); \
++ fprintf (FILE, "\t%s\t ", TARGET_ARCH64 ? ASM_LONGLONG : INT_ASM_OP); \
++ assemble_name (FILE, NAME); \
++ fprintf (FILE, "\n"); \
++ } while (0)
++
++
+ /* Override the name of the mcount profiling function. */
+
+ #undef MCOUNT_FUNCTION
diff --git a/lang/gcc/patches/patch-ba b/lang/gcc/patches/patch-ba
index e76cd453947..9e5c57a2dff 100644
--- a/lang/gcc/patches/patch-ba
+++ b/lang/gcc/patches/patch-ba
@@ -1,18 +1,83 @@
-$NetBSD: patch-ba,v 1.1 2001/12/29 17:41:47 fredb Exp $
+$NetBSD: patch-ba,v 1.2 2002/01/03 20:40:44 tron Exp $
---- ../gcc-2.95.2/gcc/ch/chill.texi.orig Wed Dec 16 14:59:05 1998
-+++ ../gcc-2.95.2/gcc/ch/chill.texi
-@@ -5,9 +5,10 @@
+--- ../gcc-2.95.3/gcc/config/vax/netbsd.h.orig Wed Dec 16 22:14:22 1998
++++ ../gcc-2.95.3/gcc/config/vax/netbsd.h Thu Jan 3 20:37:54 2002
+@@ -1,5 +1,22 @@
++#include <vax/vax.h>
++#ifdef NETBSD_ELF
++#include <elfos.h>
++#endif
++#include <netbsd.h>
++
+ #undef CPP_PREDEFINES
+-#define CPP_PREDEFINES "-Dunix -Dvax -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(vax) -Amachine(vax)"
++#define CPP_PREDEFINES "-D__vax__ -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(vax) -Amachine(vax)"
++
++#undef CC1_SPEC
++#define CC1_SPEC "\
++ %{!fno-pic: \
++ %{!mno-pic: %{!fpic: %{!fPIC:-fPIC}}} \
++ %{!mindirect: %{!no-mindirect: -mno-indirect}}} \
++ %{mno-pic: -fno-pic -mindirect} \
++ %{fno-pic: \
++ %{!mindirect: %{!no-mindirect: -mindirect}}}"
++
++#define CC1PLUS_SPEC CC1_SPEC
- @ifinfo
- @format
--START-INFO-DIR-ENTRY
--* Chill:: Chill compiler
--END-INFO-DIR-ENTRY
-+@dircategory Programming
-+@direntry
-+* Chill: (chill). Chill compiler
-+@end direntry
- @end format
- @end ifinfo
+ /* Make gcc agree with <machine/ansi.h> */
+
+@@ -21,4 +38,54 @@
+ /* Until they use ELF or something that handles dwarf2 unwinds
+ and initialization stuff better. */
+ #undef DWARF2_UNWIND_INFO
++
++#undef TARGET_DEFAULT
++#define TARGET_DEFAULT 0
++
++/* Function CSE screws up PLT .vs. GOT usage.
++ */
++#define NO_FUNCTION_CSE
++
++/* This makes use of a hook in varasm.c to mark all external functions
++ for us. We use this to make sure that external functions are correctly
++ referenced from the PLT. */
++
++#define NO_EXTERNAL_INDIRECT_ADDRESS
++
++/* Define this macro if references to a symbol must be treated
++ differently depending on something about the variable or
++ function named by the symbol (such as what section it is in).
++
++ On the VAX, if using PIC, mark a SYMBOL_REF for a non-global
++ symbol so that we may use indirect accesses with it. */
++
++#define ENCODE_SECTION_INFO(DECL) \
++do \
++ { \
++ if (flag_pic) \
++ { \
++ rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
++ ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
++ \
++ if (GET_CODE (rtl) == MEM) \
++ { \
++ SYMBOL_REF_FLAG (XEXP (rtl, 0)) \
++ = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
++ || ! TREE_PUBLIC (DECL)); \
++ } \
++ } \
++ } \
++while (0)
++
++/* Put relocations in the constant pool in the writable data section. */
++#undef SELECT_RTX_SECTION
++#define SELECT_RTX_SECTION(MODE,RTX) \
++{ \
++ if (flag_pic && vax_symbolic_operand ((RTX), (MODE))) \
++ data_section (); \
++ else \
++ readonly_data_section (); \
++}
++
++/* Use sjlj exceptions. */
diff --git a/lang/gcc/patches/patch-bb b/lang/gcc/patches/patch-bb
new file mode 100644
index 00000000000..34b63657d90
--- /dev/null
+++ b/lang/gcc/patches/patch-bb
@@ -0,0 +1,659 @@
+$NetBSD: patch-bb,v 1.1 2002/01/03 20:40:44 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/vax/vax.c.orig Wed Dec 16 22:14:24 1998
++++ ../gcc-2.95.3/gcc/config/vax/vax.c Thu Jan 3 20:37:54 2002
+@@ -19,19 +19,24 @@
+ Boston, MA 02111-1307, USA. */
+
+ #include "config.h"
+-#include <stdio.h>
++#include "system.h"
+ #include "rtl.h"
+ #include "regs.h"
+ #include "hard-reg-set.h"
+ #include "real.h"
+ #include "insn-config.h"
++#include "insn-codes.h"
+ #include "conditions.h"
+ #include "insn-flags.h"
++/*#include "function.h"*/
+ #include "output.h"
+ #include "insn-attr.h"
+ #ifdef VMS_TARGET
+ #include "tree.h"
+ #endif
++#include "reload.h"
++#include "recog.h"
++/*#include "tm_p.h"*/
+
+ /* This is like nonimmediate_operand with a restriction on the type of MEM. */
+
+@@ -43,8 +48,9 @@
+ int i;
+ /* Split operands. */
+
+- low[0] = low[1] = low[2] = 0;
+- for (i = 0; i < 3; i++)
++ for (i = 0; i < n; i++)
++ low[i] = 0;
++ for (i = 0; i < n; i++)
+ {
+ if (low[i])
+ /* it's already been figured out */;
+@@ -52,7 +58,7 @@
+ && (GET_CODE (XEXP (operands[i], 0)) == POST_INC))
+ {
+ rtx addr = XEXP (operands[i], 0);
+- operands[i] = low[i] = gen_rtx (MEM, SImode, addr);
++ operands[i] = low[i] = gen_rtx_MEM (SImode, addr);
+ if (which_alternative == 0 && i == 0)
+ {
+ addr = XEXP (operands[i], 0);
+@@ -71,8 +77,24 @@
+ FILE *file;
+ register rtx addr;
+ {
+- register rtx reg1, reg2, breg, ireg;
++ register rtx reg1, breg, ireg;
+ rtx offset;
++ rtx orig_addr = addr;
++
++#if 0
++ if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST)
++ debug_rtx (addr);
++#endif
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ if (flag_pic && GET_CODE (addr) == CONST &&
++ GET_CODE (XEXP (addr, 0)) == PLUS &&
++ GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF &&
++ !SYMBOL_REF_FLAG (XEXP (XEXP (addr, 0), 0)) &&
++ GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
++ {
++ fatal_insn ("Non-PIC operand escaped:\n", addr);
++ }
++#endif
+
+ retry:
+ switch (GET_CODE (addr))
+@@ -83,6 +105,11 @@
+ goto retry;
+
+ case REG:
++ if (REGNO (addr) >= 16)
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ fprintf (file, "(%s)", reg_names[REGNO (addr)]);
+ break;
+
+@@ -139,7 +166,10 @@
+ addr = XEXP (addr, 1);
+ }
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+
+ if (GET_CODE (addr) == REG)
+ {
+@@ -162,7 +192,10 @@
+ else if (GET_CODE (XEXP (addr, 0)) == CONST_INT)
+ offset = plus_constant (offset, INTVAL (XEXP (addr, 0)));
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ }
+ offset = XEXP (addr, 0);
+ }
+@@ -176,11 +209,17 @@
+ else if (GET_CODE (XEXP (addr, 0)) == MULT)
+ {
+ if (ireg)
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ ireg = XEXP (addr, 0);
+ }
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+
+ if (CONSTANT_ADDRESS_P (XEXP (addr, 1))
+ || GET_CODE (XEXP (addr, 1)) == MEM)
+@@ -192,7 +231,10 @@
+ else if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
+ offset = plus_constant (offset, INTVAL (XEXP (addr, 1)));
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ }
+ offset = XEXP (addr, 1);
+ }
+@@ -206,22 +248,49 @@
+ else if (GET_CODE (XEXP (addr, 1)) == MULT)
+ {
+ if (ireg)
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ ireg = XEXP (addr, 1);
+ }
++ else if (GET_CODE (addr) == SYMBOL_REF)
++ {
++ output_addr_const (file, addr);
++ if (offset != 0)
++ {
++ fputc ('+', file);
++ output_address (offset);
++ offset = 0;
++ }
++ }
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ }
+ else
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+
+ /* If REG1 is non-zero, figure out if it is a base or index register. */
+ if (reg1)
+ {
+- if (breg != 0 || (offset && GET_CODE (offset) == MEM))
++ if (breg != 0
++ || GET_CODE (addr) == SYMBOL_REF
++ || (offset
++ && (GET_CODE (offset) == MEM
++ || GET_CODE (offset) == SYMBOL_REF
++ || GET_CODE (offset) == CONST)))
+ {
+ if (ireg)
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ ireg = reg1;
+ }
+ else
+@@ -232,14 +301,24 @@
+ output_address (offset);
+
+ if (breg != 0)
+- fprintf (file, "(%s)", reg_names[REGNO (breg)]);
++ {
++ if (REGNO (breg) >= 16)
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
++ fprintf (file, "(%s)", reg_names[REGNO (breg)]);
++ }
+
+ if (ireg != 0)
+ {
+ if (GET_CODE (ireg) == MULT)
+ ireg = XEXP (ireg, 0);
+ if (GET_CODE (ireg) != REG)
+- abort ();
++ {
++ debug_rtx (orig_addr);
++ abort ();
++ }
+ fprintf (file, "[%s]", reg_names[REGNO (ireg)]);
+ }
+ break;
+@@ -249,7 +328,7 @@
+ }
+ }
+
+-char *
++const char *
+ rev_cond_name (op)
+ rtx op;
+ {
+@@ -286,8 +365,10 @@
+ register rtx c;
+ {
+ register enum machine_mode mode;
++#if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT
+ int i;
+ union {double d; int i[2];} val;
++#endif
+
+ if (GET_CODE (c) != CONST_DOUBLE)
+ return 0;
+@@ -323,7 +404,8 @@
+ 2 - indirect */
+
+
+-int vax_address_cost(addr)
++int
++vax_address_cost (addr)
+ register rtx addr;
+ {
+ int reg = 0, indexed = 0, indir = 0, offset = 0, predec = 0;
+@@ -365,6 +447,8 @@
+ indir = 2; /* 3 on VAX 2 */
+ addr = XEXP (addr, 0);
+ goto restart;
++ default:
++ break;
+ }
+
+ /* Up to 3 things can be added in an address. They are stored in
+@@ -402,7 +486,7 @@
+ enum machine_mode mode = GET_MODE (x);
+ register int c;
+ int i = 0; /* may be modified in switch */
+- char *fmt = GET_RTX_FORMAT (code); /* may be modified in switch */
++ const char *fmt = GET_RTX_FORMAT (code); /* may be modified in switch */
+
+ switch (code)
+ {
+@@ -427,6 +511,8 @@
+ case QImode:
+ c = 10; /* 3-4 on VAX 9000, 20-28 on VAX 2 */
+ break;
++ default:
++ break;
+ }
+ break;
+ case UDIV:
+@@ -582,7 +668,7 @@
+
+ /* Check a `double' value for validity for a particular machine mode. */
+
+-static char *float_strings[] =
++static const char *const float_strings[] =
+ {
+ "1.70141173319264430e+38", /* 2^127 (2^24 - 1) / 2^24 */
+ "-1.70141173319264430e+38",
+@@ -621,7 +707,7 @@
+ if ((mode) == SFmode)
+ {
+ REAL_VALUE_TYPE r;
+- bcopy ((char *) d, (char *) &r, sizeof (REAL_VALUE_TYPE));
++ memcpy (&r, d, sizeof (REAL_VALUE_TYPE));
+ if (REAL_VALUES_LESS (float_values[0], r))
+ {
+ bcopy ((char *) &float_values[0], (char *) d,
+@@ -651,6 +737,338 @@
+ return 0;
+ }
+
++/* Nonzero if X is a hard reg that can be used as an index. */
++#define XREG_OK_FOR_INDEX_P(X, STRICT) (!(STRICT) || REGNO_OK_FOR_INDEX_P (REGNO (X)))
++/* Nonzero if X is a hard reg that can be used as a base reg. */
++#define XREG_OK_FOR_BASE_P(X, STRICT) (!(STRICT) || REGNO_OK_FOR_BASE_P (REGNO (X)))
++
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++
++/* Re-definition of CONSTANT_ADDRESS_P, which is true only when there
++ are no SYMBOL_REFs for external symbols present and allow valid
++ addressing modes. */
++
++#define INDIRECTABLE_CONSTANT_ADDRESS_P(X, INDEXED, INDIRECT) \
++ (GET_CODE (X) == LABEL_REF \
++ || (!INDEXED && GET_CODE (X) == SYMBOL_REF \
++ && (!INDIRECT || SYMBOL_REF_FLAG (X))) \
++ || (!INDEXED && GET_CODE (X) == CONST \
++ && GET_CODE (XEXP ((X), 0)) == PLUS \
++ && GET_CODE (XEXP (XEXP ((X), 0), 0)) == SYMBOL_REF \
++ && ((!INDIRECT && !flag_pic) \
++ || SYMBOL_REF_FLAG (XEXP (XEXP ((X), 0), 0)))) \
++ || GET_CODE (X) == CONST_INT)
++
++/* Non-zero if X is an address which can be indirected. External symbols
++ could be in a sharable image library, so we disallow those. */
++
++#define INDIRECTABLE_ADDRESS_P(X, STRICT, INDEXED, INDIRECT) \
++ (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, INDIRECT) \
++ || (GET_CODE (X) == REG && XREG_OK_FOR_BASE_P (X, STRICT)) \
++ || (GET_CODE (X) == PLUS \
++ && GET_CODE (XEXP (X, 0)) == REG \
++ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
++ && GET_CODE (XEXP (X, 1)) != SYMBOL_REF \
++ && !(GET_CODE (XEXP (X, 1)) == CONST \
++ && GET_CODE (XEXP (XEXP (X, 1), 0)) == PLUS \
++ && GET_CODE (XEXP (XEXP (XEXP (X, 1), 0), 0)) == SYMBOL_REF) \
++ && INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 1), INDEXED, INDIRECT)))
++
++#else /* not NO_EXTERNAL_INDIRECT_ADDRESS */
++
++#define INDIRECTABLE_CONSTANT_ADDRESS_P(X, INDEXED, INDIRECT) \
++ CONSTANT_ADDRESS_P (X)
++
++/* Non-zero if X is an address which can be indirected. */
++#define INDIRECTABLE_ADDRESS_P(X, STRICT, INDEXED, INDIRECT) \
++ (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, INDIRECT) \
++ || (GET_CODE (X) == REG && XREG_OK_FOR_BASE_P (X, STRICT)) \
++ || (GET_CODE (X) == PLUS \
++ && GET_CODE (XEXP (X, 0)) == REG \
++ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
++ && CONSTANT_ADDRESS_P (XEXP (X, 1))))
++
++#endif /* not NO_EXTERNAL_INDIRECT_ADDRESS */
++
++/* Go to ADDR if X is a valid address not using indexing.
++ (This much is the easy part.) */
++#define GO_IF_NONINDEXED_ADDRESS(X, ADDR, STRICT, INDEXED) \
++{ register rtx xfoob = (X); \
++ if (GET_CODE (X) == REG) \
++ { \
++ extern rtx *reg_equiv_mem; \
++ if (! reload_in_progress) \
++ goto ADDR; \
++ if (!STRICT) \
++ { \
++ if ((xfoob = reg_equiv_mem[REGNO (xfoob)]) == 0) \
++ goto ADDR; \
++ } \
++ if (INDIRECTABLE_ADDRESS_P (xfoob, STRICT, INDEXED, 0)) \
++ goto ADDR; \
++ } \
++ if (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, 0)) goto ADDR; \
++ if (INDIRECTABLE_ADDRESS_P (X, STRICT, INDEXED, 0)) goto ADDR; \
++ xfoob = XEXP (X, 0); \
++ if (GET_CODE (X) == MEM \
++ && INDIRECTABLE_ADDRESS_P (xfoob, STRICT, INDEXED, !TARGET_INDIRECT)) \
++ goto ADDR; \
++ if ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_INC) \
++ && GET_CODE (xfoob) == REG \
++ && XREG_OK_FOR_BASE_P (xfoob, STRICT)) \
++ goto ADDR; }
++
++/* 1 if PROD is either a reg times size of mode MODE
++ or just a reg, if MODE is just one byte.
++ This macro's expansion uses the temporary variables xfoo0 and xfoo1
++ that must be declared in the surrounding context. */
++#define INDEX_TERM_P(PROD, MODE, STRICT) \
++(GET_MODE_SIZE (MODE) == 1 \
++ ? (GET_CODE (PROD) == REG && XREG_OK_FOR_BASE_P (PROD, STRICT)) \
++ : (GET_CODE (PROD) == MULT \
++ && \
++ (xfoo0 = XEXP (PROD, 0), xfoo1 = XEXP (PROD, 1), \
++ ((GET_CODE (xfoo0) == CONST_INT \
++ && GET_CODE (xfoo1) == REG \
++ && INTVAL (xfoo0) == (int)GET_MODE_SIZE (MODE) \
++ && XREG_OK_FOR_INDEX_P (xfoo1, STRICT)) \
++ || \
++ (GET_CODE (xfoo1) == CONST_INT \
++ && GET_CODE (xfoo0) == REG \
++ && INTVAL (xfoo1) == (int)GET_MODE_SIZE (MODE) \
++ && XREG_OK_FOR_INDEX_P (xfoo0, STRICT))))))
++
++/* Go to ADDR if X is the sum of a register
++ and a valid index term for mode MODE. */
++#define GO_IF_REG_PLUS_INDEX(X, MODE, ADDR, STRICT) \
++{ register rtx xfooa; \
++ if (GET_CODE (X) == PLUS) \
++ { if (GET_CODE (XEXP (X, 0)) == REG \
++ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
++ && (xfooa = XEXP (X, 1), \
++ INDEX_TERM_P (xfooa, MODE, STRICT))) \
++ goto ADDR; \
++ if (GET_CODE (XEXP (X, 1)) == REG \
++ && XREG_OK_FOR_BASE_P (XEXP (X, 1), STRICT) \
++ && (xfooa = XEXP (X, 0), \
++ INDEX_TERM_P (xfooa, MODE, STRICT))) \
++ goto ADDR; } }
++
++int
++legitimate_pic_operand_p(x, strict)
++ register rtx x;
++ int strict ATTRIBUTE_UNUSED;
++{
++ if (GET_CODE (x) != SYMBOL_REF
++ && !(GET_CODE (x) == CONST
++ && GET_CODE (XEXP (x, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF))
++ {
++ return 1;
++ }
++ return 0;
++}
++
++int
++legitimate_address_p(mode, xbar, strict)
++ enum machine_mode mode;
++ register rtx xbar;
++ int strict;
++{
++ register rtx xfoo, xfoo0, xfoo1;
++ int from = __LINE__;
++ GO_IF_NONINDEXED_ADDRESS (xbar, win, strict, 0);
++ if (GET_CODE (xbar) == PLUS)
++ {
++ /* Handle <address>[index] represented with index-sum outermost */
++ xfoo = XEXP (xbar, 0);
++ if (INDEX_TERM_P (xfoo, mode, strict))
++ {
++ from = __LINE__;
++ GO_IF_NONINDEXED_ADDRESS (XEXP (xbar, 1), win, strict, 0);
++ }
++ xfoo = XEXP (xbar, 1);
++ if (INDEX_TERM_P (xfoo, mode, strict))
++ {
++ from = __LINE__;
++ GO_IF_NONINDEXED_ADDRESS (XEXP (xbar, 0), win, strict, 0);
++ }
++ /* Handle offset(reg)[index] with offset added outermost */
++ if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (xbar, 0), 1, 0))
++ {
++ from = __LINE__;
++ if (GET_CODE (XEXP (xbar, 1)) == REG
++ && XREG_OK_FOR_BASE_P (XEXP (xbar, 1), strict))
++ goto win;
++ from = __LINE__;
++ GO_IF_REG_PLUS_INDEX (XEXP (xbar, 1), mode, win, strict);
++ }
++ if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (xbar, 1), 1, 0))
++ {
++ from = __LINE__;
++ if (GET_CODE (XEXP (xbar, 0)) == REG
++ && XREG_OK_FOR_BASE_P (XEXP (xbar, 0), strict))
++ goto win;
++ from = __LINE__;
++ GO_IF_REG_PLUS_INDEX (XEXP (xbar, 0), mode, win, strict);
++ }
++ }
++ return 0;
++
++ win:
++#if 0
++ if (strict)
++ {
++ fprintf(stderr, "line=%d\n", from);
++ debug_rtx (xbar);
++ }
++#endif
++ if (flag_pic && GET_CODE (xbar) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && !SYMBOL_REF_FLAG (xbar)
++#endif
++ && mode == DImode)
++ return 0;
++ return 1;
++}
++
++int
++vax_symbolic_operand (op, mode)
++ register rtx op;
++ enum machine_mode mode ATTRIBUTE_UNUSED;
++{
++ if (!general_operand(op, mode))
++ return 0;
++ if (GET_CODE (op) == SYMBOL_REF
++ || GET_CODE (op) == LABEL_REF
++ || (GET_CODE (op) == CONST
++ && GET_CODE (XEXP (op, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && (SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0)) || !flag_pic)
++#endif
++ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
++ || (GET_CODE (op) == PLUS
++ && GET_CODE (XEXP (op, 1)) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && (SYMBOL_REF_FLAG (XEXP (op, 1)) || !flag_pic)
++#endif
++ && GET_CODE (XEXP (op, 0)) == CONST_INT)
++ || (GET_CODE (op) == PLUS
++ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && (SYMBOL_REF_FLAG (XEXP (op, 0)) || !flag_pic)
++#endif
++ && GET_CODE (XEXP (op, 1)) == CONST_INT))
++ {
++ return 1;
++ }
++ return 0;
++}
++
++int
++vax_nonsymbolic_operand (op, mode)
++ register rtx op;
++ enum machine_mode mode ATTRIBUTE_UNUSED;
++{
++ if (!general_operand(op, mode))
++ return 0;
++ if (GET_CODE (op) == SYMBOL_REF
++ || GET_CODE (op) == LABEL_REF
++ || (GET_CODE (op) == CONST
++ && GET_CODE (XEXP (op, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF)
++ || (GET_CODE (op) == MEM
++ && GET_CODE (XEXP (op, 0)) == CONST
++ && GET_CODE (XEXP (XEXP (op, 0), 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (XEXP (op, 0), 0), 0)) == SYMBOL_REF)
++ || (GET_CODE (op) == PLUS
++ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
++ && GET_CODE (XEXP (op, 1)) == CONST_INT))
++ return 0;
++#if 0
++ if (GET_CODE (op) == PLUS)
++ debug_rtx (op);
++#endif
++ if (vax_symbolic_operand (op, mode))
++ return 0;
++#if 0
++ if (GET_CODE (op) != CONST_INT && GET_CODE (op) != REG &&
++ GET_CODE (op) != MEM)
++ debug_rtx (op);
++#endif
++ return 1;
++}
++
++int
++vax_lvalue_operand(op, mode)
++ register rtx op;
++ enum machine_mode mode;
++{
++ if (!general_operand(op, mode))
++ return 0;
++ return GET_CODE (op) == REG
++ || GET_CODE (op) == SUBREG
++ || GET_CODE (op) == MEM
++ || GET_CODE (op) == CONCAT
++ || GET_CODE (op) == PARALLEL
++ || GET_CODE (op) == STRICT_LOW_PART;
++}
++
++int
++vax_general_operand(op, mode)
++ register rtx op;
++ enum machine_mode mode;
++{
++ if (!general_operand(op, mode))
++ return 0;
++ if (!flag_pic)
++ return 1;
++ if ((GET_CODE (op) == CONST
++ && GET_CODE (XEXP (op, 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && !SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0))
++#endif
++ ) || (GET_CODE (op) == MEM
++ && GET_CODE (XEXP (op, 0)) == CONST
++ && GET_CODE (XEXP (XEXP (op, 0), 0)) == PLUS
++ && GET_CODE (XEXP (XEXP (XEXP (op, 0), 0), 0)) == SYMBOL_REF
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && !SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0))
++#endif
++ ) || (GET_CODE (op) == PLUS
++ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
++ && GET_CODE (XEXP (op, 1)) == CONST_INT
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ && !SYMBOL_REF_FLAG (XEXP (op, 0))
++#endif
++ ))
++ return 0;
++#if 0
++ debug_rtx (op);
++#endif
++ return 1;
++}
++
++int
++vax_reg_used_p(operand, reg)
++ rtx operand;
++ int reg;
++{
++ if (GET_CODE (operand) == REG && REGNO (operand) == reg)
++ return 1;
++ if (GET_CODE (operand) == MEM ||
++ GET_CODE (operand) == PRE_DEC ||
++ GET_CODE (operand) == POST_DEC)
++ return vax_reg_used_p (XEXP(operand, 0), reg);
++ if (GET_CODE (operand) == PLUS ||
++ GET_CODE (operand) == MULT)
++ return vax_reg_used_p (XEXP(operand, 0), reg) ||
++ vax_reg_used_p (XEXP(operand, 1), reg);
++ return 0;
++}
++
+ #ifdef VMS_TARGET
+ /* Additional support code for VMS target. */
+
+@@ -661,7 +1079,7 @@
+ static
+ struct extern_list {
+ struct extern_list *next; /* next external */
+- char *name; /* name of the external */
++ const char *name; /* name of the external */
+ int size; /* external's actual size */
+ int in_const; /* section type flag */
+ } *extern_head = 0, *pending_head = 0;
+@@ -672,7 +1090,7 @@
+ void
+ vms_check_external (decl, name, pending)
+ tree decl;
+- char *name;
++ const char *name;
+ int pending;
+ {
+ register struct extern_list *p, *p0;
diff --git a/lang/gcc/patches/patch-bc b/lang/gcc/patches/patch-bc
new file mode 100644
index 00000000000..81c99e9faf0
--- /dev/null
+++ b/lang/gcc/patches/patch-bc
@@ -0,0 +1,456 @@
+$NetBSD: patch-bc,v 1.1 2002/01/03 20:40:44 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/vax/vax.h.orig Wed Dec 16 22:14:25 1998
++++ ../gcc-2.95.3/gcc/config/vax/vax.h Thu Jan 3 20:37:54 2002
+@@ -25,7 +25,7 @@
+
+ /* If using g-format floating point, alter math.h. */
+
+-#define CPP_SPEC "%{mg:-DGFLOAT}"
++#define CPP_SPEC "%{mg:%{!ansi:-DGFLOAT} -D__GFLOAT}"
+
+ /* Choose proper libraries depending on float format.
+ Note that there are no profiling libraries for g-format.
+@@ -51,13 +51,20 @@
+ /* Macros used in the machine description to test the flags. */
+
+ /* Nonzero if compiling code that Unix assembler can assemble. */
+-#define TARGET_UNIX_ASM (target_flags & 1)
++#define MASK_UNIX_ASM 1
++#define TARGET_UNIX_ASM (target_flags & MASK_UNIX_ASM)
+
+ /* Nonzero if compiling with VAX-11 "C" style structure alignment */
+-#define TARGET_VAXC_ALIGNMENT (target_flags & 2)
++#define MASK_VAXC_ALIGNMENT 2
++#define TARGET_VAXC_ALIGNMENT (target_flags & MASK_VAXC_ALIGNMENT)
+
+ /* Nonzero if compiling with `G'-format floating point */
+-#define TARGET_G_FLOAT (target_flags & 4)
++#define MASK_G_FLOAT 4
++#define TARGET_G_FLOAT (target_flags & MASK_G_FLOAT)
++
++/* Nonzero if compiling for PIC code */
++#define MASK_INDIRECT 8
++#define TARGET_INDIRECT (target_flags & MASK_INDIRECT)
+
+ /* Macro to define tables used to set the flags.
+ This is a list in braces of pairs in braces,
+@@ -66,19 +73,21 @@
+ An empty string NAME is used to identify the default VALUE. */
+
+ #define TARGET_SWITCHES \
+- { {"unix", 1}, \
+- {"gnu", -1}, \
+- {"vaxc-alignment", 2}, \
+- {"g", 4}, \
+- {"g-float", 4}, \
+- {"d", -4}, \
+- {"d-float", -4}, \
+- { "", TARGET_DEFAULT}}
++ { {"unix", MASK_UNIX_ASM, "Generate code for UNIX assembler"}, \
++ {"gnu", -MASK_UNIX_ASM, "Generate code for GNU assembler (gas)"}, \
++ {"vaxc-alignment", MASK_VAXC_ALIGNMENT, "Use VAXC structure conventions"}, \
++ {"g", MASK_G_FLOAT, "Generate GFLOAT double precision code"}, \
++ {"g-float", MASK_G_FLOAT, "Generate GFLOAT double precision code"}, \
++ {"d", -MASK_G_FLOAT, "Generate DFLOAT double precision code"}, \
++ {"d-float", -MASK_G_FLOAT, "Generate DFLOAT double precision code"}, \
++ {"indirect", MASK_INDIRECT, "Allow indirect memory references in PIC code"}, \
++ {"no-indirect", -MASK_INDIRECT, "Disallow indirect memory references in PIC code"}, \
++ { "", TARGET_DEFAULT, 0}}
+
+ /* Default target_flags if no switches specified. */
+
+ #ifndef TARGET_DEFAULT
+-#define TARGET_DEFAULT 1
++#define TARGET_DEFAULT MASK_UNIX_ASM
+ #endif
+
+ /* Target machine storage layout */
+@@ -258,7 +267,7 @@
+ This is an initializer for a vector of HARD_REG_SET
+ of length N_REG_CLASSES. */
+
+-#define REG_CLASS_CONTENTS {0, 0xffff}
++#define REG_CLASS_CONTENTS {{0}, {0xffff}}
+
+ /* The same information, inverted:
+ Return the class number of the smallest class containing
+@@ -276,16 +285,28 @@
+
+ #define REG_CLASS_FROM_LETTER(C) NO_REGS
+
+-/* The letters I, J, K, L and M in a register constraint string
++/* The letters I, J, K, L, M, N, and O in a register constraint string
+ can be used to stand for particular ranges of immediate operands.
+ This macro defines what the ranges are.
+ C is the letter, and VALUE is a constant value.
+ Return 1 if VALUE is in the range specified by C.
+
+- `I' is the constant zero. */
+-
+-#define CONST_OK_FOR_LETTER_P(VALUE, C) \
+- ((C) == 'I' ? (VALUE) == 0 \
++ `I' is the constant zero.
++ `J' is a value between 0 .. 63 (inclusive) S^#
++ `K' is a value between -128 and 127 (inclusive) B^
++ 'L' is a value between -32768 and 32767 (include) W^
++ `M' is a value between 0 and 255 (inclusive) B^
++ 'N' is a value between 0 and 65535 (inclusive) W^
++ `O' is a value between -63 and -1 (inclusive) */
++
++#define CONST_OK_FOR_LETTER_P(VALUE, C) \
++ ( (C) == 'I' ? (VALUE) == 0 \
++ : (C) == 'J' ? 0 <= (VALUE) && (VALUE) < 64 \
++ : (C) == 'O' ? -63 <= (VALUE) && (VALUE) < 0 \
++ : (C) == 'K' ? -128 <= (VALUE) && (VALUE) < 128 \
++ : (C) == 'M' ? 0 <= (VALUE) && (VALUE) < 256 \
++ : (C) == 'L' ? -32768 <= (VALUE) && (VALUE) < 32768 \
++ : (C) == 'N' ? 0 <= (VALUE) && (VALUE) < 65536 \
+ : 0)
+
+ /* Similar, but for floating constants, and defining letters G and H.
+@@ -347,8 +368,7 @@
+ /* Given an rtx for the address of a frame,
+ return an rtx for the address of the word in the frame
+ that holds the dynamic chain--the previous frame's address. */
+-#define DYNAMIC_CHAIN_ADDRESS(frame) \
+-gen_rtx (PLUS, Pmode, frame, GEN_INT (12))
++#define DYNAMIC_CHAIN_ADDRESS(FRAME) plus_constant ((FRAME), 12)
+
+ /* If we generate an insn to push BYTES bytes,
+ this says how many the stack pointer really advances by.
+@@ -377,14 +397,14 @@
+ /* On the Vax the return value is in R0 regardless. */
+
+ #define FUNCTION_VALUE(VALTYPE, FUNC) \
+- gen_rtx (REG, TYPE_MODE (VALTYPE), 0)
++ gen_rtx_REG (TYPE_MODE (VALTYPE), 0)
+
+ /* Define how to find the value returned by a library function
+ assuming the value has mode MODE. */
+
+ /* On the Vax the return value is in R0 regardless. */
+
+-#define LIBCALL_VALUE(MODE) gen_rtx (REG, MODE, 0)
++#define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, 0)
+
+ /* Define this if PCC uses the nonreentrant convention for returning
+ structure and union values. */
+@@ -533,10 +553,10 @@
+ #define TRAMPOLINE_TEMPLATE(FILE) \
+ { \
+ ASM_OUTPUT_SHORT (FILE, const0_rtx); \
+- ASM_OUTPUT_SHORT (FILE, GEN_INT (0x8fd0)); \
++ ASM_OUTPUT_SHORT (FILE, GEN_INT (0x8fd0)); \
+ ASM_OUTPUT_INT (FILE, const0_rtx); \
+- ASM_OUTPUT_BYTE (FILE, 0x50+STATIC_CHAIN_REGNUM); \
+- ASM_OUTPUT_SHORT (FILE, GEN_INT (0x9f17)); \
++ ASM_OUTPUT_BYTE (FILE, 0x50 + STATIC_CHAIN_REGNUM); \
++ ASM_OUTPUT_SHORT (FILE, GEN_INT (0x9f17)); \
+ ASM_OUTPUT_INT (FILE, const0_rtx); \
+ }
+
+@@ -552,12 +572,12 @@
+ to the start of the trampoline. */
+ #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
+ { \
+- emit_insn (gen_rtx (ASM_INPUT, VOIDmode, \
++ emit_insn (gen_rtx_ASM_INPUT (VOIDmode, \
+ "movpsl -(sp)\n\tpushal 1(pc)\n\trei")); \
+- emit_move_insn (gen_rtx (MEM, HImode, TRAMP), \
+- gen_rtx (MEM, HImode, FNADDR)); \
+- emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 4)), CXT);\
+- emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 11)), \
++ emit_move_insn (gen_rtx_MEM (HImode, TRAMP), \
++ gen_rtx_MEM (HImode, FNADDR)); \
++ emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT);\
++ emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 11)), \
+ plus_constant (FNADDR, 2)); \
+ }
+
+@@ -573,7 +593,7 @@
+
+ #define RETURN_ADDR_RTX(COUNT, FRAME) \
+ ((COUNT == 0) \
+- ? gen_rtx (MEM, Pmode, plus_constant (FRAME, RETURN_ADDRESS_OFFSET)) \
++ ? gen_rtx_MEM (Pmode, plus_constant (FRAME, RETURN_ADDRESS_OFFSET)) \
+ : (rtx) 0)
+
+
+@@ -635,6 +655,9 @@
+ /* Nonzero if X is a hard reg that can be used as a base reg
+ or if it is a pseudo reg. */
+ #define REG_OK_FOR_BASE_P(X) 1
++#define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X, 0)
++#define GO_IF_LEGITIMATE_ADDRESS(ZMODE, XOP, LABEL) \
++ do { if (legitimate_address_p(ZMODE, XOP, 0)) goto LABEL; } while (0)
+
+ #else
+
+@@ -642,144 +665,12 @@
+ #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
+ /* Nonzero if X is a hard reg that can be used as a base reg. */
+ #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
++#define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X, 1)
++#define GO_IF_LEGITIMATE_ADDRESS(ZMODE, XOP, LABEL) \
++ do { if (legitimate_address_p(ZMODE, XOP, 1)) goto LABEL; } while (0)
+
+ #endif
+
+-/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
+- that is a valid memory address for an instruction.
+- The MODE argument is the machine mode for the MEM expression
+- that wants to use this address.
+-
+- The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS,
+- except for CONSTANT_ADDRESS_P which is actually machine-independent. */
+-
+-#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+-
+-/* Zero if this contains a (CONST (PLUS (SYMBOL_REF) (...))) and the
+- symbol in the SYMBOL_REF is an external symbol. */
+-
+-#define INDIRECTABLE_CONSTANT_P(X) \
+- (! (GET_CODE ((X)) == CONST \
+- && GET_CODE (XEXP ((X), 0)) == PLUS \
+- && GET_CODE (XEXP (XEXP ((X), 0), 0)) == SYMBOL_REF \
+- && SYMBOL_REF_FLAG (XEXP (XEXP ((X), 0), 0))))
+-
+-/* Re-definition of CONSTANT_ADDRESS_P, which is true only when there
+- are no SYMBOL_REFs for external symbols present. */
+-
+-#define INDIRECTABLE_CONSTANT_ADDRESS_P(X) \
+- (GET_CODE (X) == LABEL_REF \
+- || (GET_CODE (X) == SYMBOL_REF && !SYMBOL_REF_FLAG (X)) \
+- || (GET_CODE (X) == CONST && INDIRECTABLE_CONSTANT_P(X)) \
+- || GET_CODE (X) == CONST_INT)
+-
+-
+-/* Non-zero if X is an address which can be indirected. External symbols
+- could be in a sharable image library, so we disallow those. */
+-
+-#define INDIRECTABLE_ADDRESS_P(X) \
+- (INDIRECTABLE_CONSTANT_ADDRESS_P (X) \
+- || (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
+- || (GET_CODE (X) == PLUS \
+- && GET_CODE (XEXP (X, 0)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 0)) \
+- && INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 1))))
+-
+-#else /* not NO_EXTERNAL_INDIRECT_ADDRESS */
+-
+-#define INDIRECTABLE_CONSTANT_ADDRESS_P(X) CONSTANT_ADDRESS_P(X)
+-
+-/* Non-zero if X is an address which can be indirected. */
+-#define INDIRECTABLE_ADDRESS_P(X) \
+- (CONSTANT_ADDRESS_P (X) \
+- || (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \
+- || (GET_CODE (X) == PLUS \
+- && GET_CODE (XEXP (X, 0)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 0)) \
+- && CONSTANT_ADDRESS_P (XEXP (X, 1))))
+-
+-#endif /* not NO_EXTERNAL_INDIRECT_ADDRESS */
+-
+-/* Go to ADDR if X is a valid address not using indexing.
+- (This much is the easy part.) */
+-#define GO_IF_NONINDEXED_ADDRESS(X, ADDR) \
+-{ register rtx xfoob = (X); \
+- if (GET_CODE (xfoob) == REG) \
+- { \
+- extern rtx *reg_equiv_mem; \
+- if (! reload_in_progress \
+- || reg_equiv_mem[REGNO (xfoob)] == 0 \
+- || INDIRECTABLE_ADDRESS_P (reg_equiv_mem[REGNO (xfoob)])) \
+- goto ADDR; \
+- } \
+- if (CONSTANT_ADDRESS_P (xfoob)) goto ADDR; \
+- if (INDIRECTABLE_ADDRESS_P (xfoob)) goto ADDR; \
+- xfoob = XEXP (X, 0); \
+- if (GET_CODE (X) == MEM && INDIRECTABLE_ADDRESS_P (xfoob)) \
+- goto ADDR; \
+- if ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_INC) \
+- && GET_CODE (xfoob) == REG && REG_OK_FOR_BASE_P (xfoob)) \
+- goto ADDR; }
+-
+-/* 1 if PROD is either a reg times size of mode MODE
+- or just a reg, if MODE is just one byte.
+- This macro's expansion uses the temporary variables xfoo0 and xfoo1
+- that must be declared in the surrounding context. */
+-#define INDEX_TERM_P(PROD, MODE) \
+-(GET_MODE_SIZE (MODE) == 1 \
+- ? (GET_CODE (PROD) == REG && REG_OK_FOR_BASE_P (PROD)) \
+- : (GET_CODE (PROD) == MULT \
+- && \
+- (xfoo0 = XEXP (PROD, 0), xfoo1 = XEXP (PROD, 1), \
+- ((GET_CODE (xfoo0) == CONST_INT \
+- && INTVAL (xfoo0) == GET_MODE_SIZE (MODE) \
+- && GET_CODE (xfoo1) == REG \
+- && REG_OK_FOR_INDEX_P (xfoo1)) \
+- || \
+- (GET_CODE (xfoo1) == CONST_INT \
+- && INTVAL (xfoo1) == GET_MODE_SIZE (MODE) \
+- && GET_CODE (xfoo0) == REG \
+- && REG_OK_FOR_INDEX_P (xfoo0))))))
+-
+-/* Go to ADDR if X is the sum of a register
+- and a valid index term for mode MODE. */
+-#define GO_IF_REG_PLUS_INDEX(X, MODE, ADDR) \
+-{ register rtx xfooa; \
+- if (GET_CODE (X) == PLUS) \
+- { if (GET_CODE (XEXP (X, 0)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 0)) \
+- && (xfooa = XEXP (X, 1), \
+- INDEX_TERM_P (xfooa, MODE))) \
+- goto ADDR; \
+- if (GET_CODE (XEXP (X, 1)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 1)) \
+- && (xfooa = XEXP (X, 0), \
+- INDEX_TERM_P (xfooa, MODE))) \
+- goto ADDR; } }
+-
+-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
+-{ register rtx xfoo, xfoo0, xfoo1; \
+- GO_IF_NONINDEXED_ADDRESS (X, ADDR); \
+- if (GET_CODE (X) == PLUS) \
+- { /* Handle <address>[index] represented with index-sum outermost */\
+- xfoo = XEXP (X, 0); \
+- if (INDEX_TERM_P (xfoo, MODE)) \
+- { GO_IF_NONINDEXED_ADDRESS (XEXP (X, 1), ADDR); } \
+- xfoo = XEXP (X, 1); \
+- if (INDEX_TERM_P (xfoo, MODE)) \
+- { GO_IF_NONINDEXED_ADDRESS (XEXP (X, 0), ADDR); } \
+- /* Handle offset(reg)[index] with offset added outermost */ \
+- if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 0))) \
+- { if (GET_CODE (XEXP (X, 1)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 1))) \
+- goto ADDR; \
+- GO_IF_REG_PLUS_INDEX (XEXP (X, 1), MODE, ADDR); } \
+- if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 1))) \
+- { if (GET_CODE (XEXP (X, 0)) == REG \
+- && REG_OK_FOR_BASE_P (XEXP (X, 0))) \
+- goto ADDR; \
+- GO_IF_REG_PLUS_INDEX (XEXP (X, 0), MODE, ADDR); } } }
+-
+ /* Try machine-dependent ways of modifying an illegitimate address
+ to be legitimate. If we find one, return the new, valid address.
+ This macro is used in only one place: `memory_address' in explow.c.
+@@ -808,8 +699,10 @@
+ goto LABEL; \
+ if (GET_CODE (ADDR) == PLUS) \
+ { if (CONSTANT_ADDRESS_P (XEXP (ADDR, 0)) \
++ && (!flag_pic || GET_CODE (XEXP (ADDR, 0)) != SYMBOL_REF) \
+ && GET_CODE (XEXP (ADDR, 1)) == REG); \
+ else if (CONSTANT_ADDRESS_P (XEXP (ADDR, 1)) \
++ && (!flag_pic || GET_CODE (XEXP (ADDR, 1)) != SYMBOL_REF) \
+ && GET_CODE (XEXP (ADDR, 0)) == REG); \
+ else goto LABEL; }}
+
+@@ -828,6 +721,10 @@
+ jumps to the default label instead. */
+ #define CASE_DROPS_THROUGH
+
++/* Indicate that jump tables go in the text section. This is
++ necessary when compiling PIC code. */
++#define JUMP_TABLES_IN_TEXT_SECTION 1
++
+ /* Specify the tree operation to be used to convert reals to integers. */
+ #define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
+
+@@ -961,6 +858,36 @@
+ #define MIN_G_FLOAT .556268464626800e-308
+ */
+
++/* Optionally define this if you have added predicates to
++ `MACHINE.c'. This macro is called within an initializer of an
++ array of structures. The first field in the structure is the
++ name of a predicate and the second field is an array of rtl
++ codes. For each predicate, list all rtl codes that can be in
++ expressions matched by the predicate. The list should have a
++ trailing comma. Here is an example of two entries in the list
++ for a typical RISC machine:
++
++ #define PREDICATE_CODES \
++ {"gen_reg_rtx_operand", {SUBREG, REG}}, \
++ {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},
++
++ Defining this macro does not affect the generated code (however,
++ incorrect definitions that omit an rtl code that may be matched
++ by the predicate can cause the compiler to malfunction).
++ Instead, it allows the table built by `genrecog' to be more
++ compact and efficient, thus speeding up the compiler. The most
++ important predicates to include in the list specified by this
++ macro are thoses used in the most insn patterns. */
++
++#define PREDICATE_CODES \
++ {"vax_symbolic_operand", { SYMBOL_REF, LABEL_REF, CONST, PLUS }},\
++ {"vax_lvalue_operand", { REG, SUBREG, MEM, CONCAT, PARALLEL, \
++ STRICT_LOW_PART }}, \
++ {"vax_nonsymbolic_operand", { CONST_INT, CONST_DOUBLE, SUBREG, REG, \
++ MEM }}, \
++ {"vax_general_operand", { CONST_INT, CONST_DOUBLE, SUBREG, REG, \
++ MEM, SYMBOL_REF, LABEL_REF, CONST, PLUS }},
++
+ /* Tell final.c how to eliminate redundant test instructions. */
+
+ /* Here we define machine-dependent flags and fields in cc_status
+@@ -1028,11 +955,11 @@
+
+ /* Output before read-only data. */
+
+-#define TEXT_SECTION_ASM_OP ".text"
++#define TEXT_SECTION_ASM_OP "\t.text"
+
+ /* Output before writable data. */
+
+-#define DATA_SECTION_ASM_OP ".data"
++#define DATA_SECTION_ASM_OP "\t.data"
+
+ /* How to refer to registers in assembler output.
+ This sequence is indexed by compiler's hard-register-number (see above). */
+@@ -1158,13 +1085,32 @@
+ (The Vax does not use such vectors,
+ but we must define this macro anyway.) */
+
+-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
+- fprintf (FILE, "\t.long L%d\n", VALUE)
++#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
++ do \
++ { \
++ char label[256]; \
++ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \
++ fprintf (FILE, "\t.long "); \
++ assemble_name (FILE, label); \
++ fprintf (FILE, "\n"); \
++ } \
++ while (0)
+
+ /* This is how to output an element of a case-vector that is relative. */
+
+-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+- fprintf (FILE, "\t.word L%d-L%d\n", VALUE, REL)
++#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
++ do \
++ { \
++ char label[256]; \
++ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \
++ fprintf (FILE, "\t.word "); \
++ assemble_name (FILE, label); \
++ ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL)); \
++ fprintf (FILE, "-"); \
++ assemble_name (FILE, label); \
++ fprintf (FILE, "\n"); \
++ } \
++ while (0)
+
+ /* This is how to output an assembler line
+ that says to advance the location counter
+@@ -1271,7 +1217,7 @@
+ ((CODE) == '#')
+
+ #define PRINT_OPERAND(FILE, X, CODE) \
+-{ extern char *rev_cond_name (); \
++{ extern const char *rev_cond_name (); \
+ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE); \
+ else if (CODE == 'C') \
+ fputs (rev_cond_name (X), FILE); \
diff --git a/lang/gcc/patches/patch-bd b/lang/gcc/patches/patch-bd
new file mode 100644
index 00000000000..e185fdbc1f3
--- /dev/null
+++ b/lang/gcc/patches/patch-bd
@@ -0,0 +1,1121 @@
+$NetBSD: patch-bd,v 1.1 2002/01/03 20:40:44 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/vax/vax.md.orig Wed Dec 16 22:14:26 1998
++++ ../gcc-2.95.3/gcc/config/vax/vax.md Thu Jan 3 20:37:54 2002
+@@ -135,20 +135,20 @@
+ ;; patterns need to be recognized.
+ ;; -- Ken Raeburn (Raeburn@Watch.COM) 24 August 1991.
+
+-(define_insn "sltu"
+- [(set (match_operand:SI 0 "general_operand" "=ro")
+- (ltu (cc0) (const_int 0)))]
+- ""
+- "clrl %0\;adwc $0,%0")
++;;(define_insn "sltu"
++;; [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
++;; (ltu (cc0) (const_int 0)))]
++;; ""
++;; "clrl %0\;adwc $0,%0")
+
+-(define_insn "sgeu"
+- [(set (match_operand:SI 0 "general_operand" "=ro")
+- (geu (cc0) (const_int 0)))]
+- ""
+- "movl $1,%0\;sbwc $0,%0")
++;;(define_insn "sgeu"
++;; [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
++;; (geu (cc0) (const_int 0)))]
++;; ""
++;; "movl $1,%0\;sbwc $0,%0")
+
+ (define_insn "movdf"
+- [(set (match_operand:DF 0 "general_operand" "=g,g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g")
+ (match_operand:DF 1 "general_operand" "G,gF"))]
+ ""
+ "@
+@@ -156,7 +156,7 @@
+ mov%# %1,%0")
+
+ (define_insn "movsf"
+- [(set (match_operand:SF 0 "general_operand" "=g,g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g")
+ (match_operand:SF 1 "general_operand" "G,gF"))]
+ ""
+ "@
+@@ -171,7 +171,7 @@
+ ;; "movh %1,%0")
+
+ (define_insn "movdi"
+- [(set (match_operand:DI 0 "general_operand" "=g,g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g,g")
+ (match_operand:DI 1 "general_operand" "I,g"))]
+ ""
+ "@
+@@ -195,8 +195,32 @@
+ ;; Loads of constants between 64 and 128 used to be done with
+ ;; "addl3 $63,#,dst" but this is slower than movzbl and takes as much space.
+
+-(define_insn "movsi"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++(define_expand "movsi"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "")
++ (match_operand:SI 1 "general_operand" ""))]
++ ""
++ "
++{
++ if (GET_CODE (operands[1]) == CONST &&
++ GET_CODE (XEXP (operands[1], 0)) == PLUS &&
++ GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == SYMBOL_REF &&
++#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
++ (!flag_pic || !SYMBOL_REF_FLAG (XEXP (XEXP (operands[1], 0), 0))) &&
++#endif
++ GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT)
++ {
++ rtx symbol_ref = XEXP (XEXP (operands[1], 0), 0);
++ rtx const_int = XEXP (XEXP (operands[1], 0), 1);
++ rtx temp = gen_reg_rtx (Pmode);
++ emit_move_insn (temp, symbol_ref);
++ emit_move_insn (operands[0],
++ plus_constant_for_output (temp, INTVAL (const_int)));
++ DONE;
++ }
++}")
++
++(define_insn "movgensi"
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:SI 1 "general_operand" "g"))]
+ ""
+ "*
+@@ -241,7 +265,7 @@
+ }")
+
+ (define_insn "movhi"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (match_operand:HI 1 "general_operand" "g"))]
+ ""
+ "*
+@@ -274,7 +298,7 @@
+ }")
+
+ (define_insn "movstricthi"
+- [(set (strict_low_part (match_operand:HI 0 "register_operand" "=g"))
++ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+g"))
+ (match_operand:HI 1 "general_operand" "g"))]
+ ""
+ "*
+@@ -295,7 +319,7 @@
+ }")
+
+ (define_insn "movqi"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (match_operand:QI 1 "general_operand" "g"))]
+ ""
+ "*
+@@ -324,7 +348,7 @@
+ }")
+
+ (define_insn "movstrictqi"
+- [(set (strict_low_part (match_operand:QI 0 "register_operand" "=g"))
++ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+g"))
+ (match_operand:QI 1 "general_operand" "g"))]
+ ""
+ "*
+@@ -358,8 +382,8 @@
+ ;; that anything generated as this insn will be recognized as one
+ ;; and that it won't successfully combine with anything.
+ (define_insn "movstrhi1"
+- [(set (match_operand:BLK 0 "general_operand" "=g")
+- (match_operand:BLK 1 "general_operand" "g"))
++ [(set (match_operand:BLK 0 "memory_operand" "=m")
++ (match_operand:BLK 1 "memory_operand" "m"))
+ (use (match_operand:HI 2 "general_operand" "g"))
+ (clobber (reg:SI 0))
+ (clobber (reg:SI 1))
+@@ -373,67 +397,67 @@
+ ;; Extension and truncation insns.
+
+ (define_insn "truncsiqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (truncate:QI (match_operand:SI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtlb %1,%0")
+
+ (define_insn "truncsihi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (truncate:HI (match_operand:SI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtlw %1,%0")
+
+ (define_insn "trunchiqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (truncate:QI (match_operand:HI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtwb %1,%0")
+
+ (define_insn "extendhisi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtwl %1,%0")
+
+ (define_insn "extendqihi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtbw %1,%0")
+
+ (define_insn "extendqisi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtbl %1,%0")
+
+ (define_insn "extendsfdf2"
+- [(set (match_operand:DF 0 "general_operand" "=g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
+ (float_extend:DF (match_operand:SF 1 "general_operand" "gF")))]
+ ""
+ "cvtf%# %1,%0")
+
+ (define_insn "truncdfsf2"
+- [(set (match_operand:SF 0 "general_operand" "=g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
+ (float_truncate:SF (match_operand:DF 1 "general_operand" "gF")))]
+ ""
+ "cvt%#f %1,%0")
+
+ (define_insn "zero_extendhisi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "g")))]
+ ""
+ "movzwl %1,%0")
+
+ (define_insn "zero_extendqihi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "movzbw %1,%0")
+
+ (define_insn "zero_extendqisi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "movzbl %1,%0")
+@@ -441,37 +465,37 @@
+ ;; Fix-to-float conversion insns.
+
+ (define_insn "floatsisf2"
+- [(set (match_operand:SF 0 "general_operand" "=g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
+ (float:SF (match_operand:SI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtlf %1,%0")
+
+ (define_insn "floatsidf2"
+- [(set (match_operand:DF 0 "general_operand" "=g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
+ (float:DF (match_operand:SI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtl%# %1,%0")
+
+ (define_insn "floathisf2"
+- [(set (match_operand:SF 0 "general_operand" "=g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
+ (float:SF (match_operand:HI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtwf %1,%0")
+
+ (define_insn "floathidf2"
+- [(set (match_operand:DF 0 "general_operand" "=g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
+ (float:DF (match_operand:HI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtw%# %1,%0")
+
+ (define_insn "floatqisf2"
+- [(set (match_operand:SF 0 "general_operand" "=g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
+ (float:SF (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtbf %1,%0")
+
+ (define_insn "floatqidf2"
+- [(set (match_operand:DF 0 "general_operand" "=g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
+ (float:DF (match_operand:QI 1 "nonimmediate_operand" "g")))]
+ ""
+ "cvtb%# %1,%0")
+@@ -479,37 +503,37 @@
+ ;; Float-to-fix conversion insns.
+
+ (define_insn "fix_truncsfqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
+ ""
+ "cvtfb %1,%0")
+
+ (define_insn "fix_truncsfhi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
+ ""
+ "cvtfw %1,%0")
+
+ (define_insn "fix_truncsfsi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "gF"))))]
+ ""
+ "cvtfl %1,%0")
+
+ (define_insn "fix_truncdfqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
+ ""
+ "cvt%#b %1,%0")
+
+ (define_insn "fix_truncdfhi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
+ ""
+ "cvt%#w %1,%0")
+
+ (define_insn "fix_truncdfsi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "gF"))))]
+ ""
+ "cvt%#l %1,%0")
+@@ -517,7 +541,7 @@
+ ;;- All kinds of add instructions.
+
+ (define_insn "adddf3"
+- [(set (match_operand:DF 0 "general_operand" "=g,g,g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g,g")
+ (plus:DF (match_operand:DF 1 "general_operand" "0,gF,gF")
+ (match_operand:DF 2 "general_operand" "gF,0,gF")))]
+ ""
+@@ -527,7 +551,7 @@
+ add%#3 %1,%2,%0")
+
+ (define_insn "addsf3"
+- [(set (match_operand:SF 0 "general_operand" "=g,g,g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g,g")
+ (plus:SF (match_operand:SF 1 "general_operand" "0,gF,gF")
+ (match_operand:SF 2 "general_operand" "gF,0,gF")))]
+ ""
+@@ -550,7 +574,7 @@
+
+
+ (define_insn "addsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (plus:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ""
+@@ -602,7 +626,7 @@
+ }")
+
+ (define_insn "addhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (plus:HI (match_operand:HI 1 "general_operand" "g")
+ (match_operand:HI 2 "general_operand" "g")))]
+ ""
+@@ -628,7 +652,7 @@
+ }")
+
+ (define_insn "addqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (plus:QI (match_operand:QI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+@@ -655,14 +679,14 @@
+
+ ;; The add-with-carry (adwc) instruction only accepts two operands.
+ (define_insn "adddi3"
+- [(set (match_operand:DI 0 "general_operand" "=ro>,ro>")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=ro>,ro>")
+ (plus:DI (match_operand:DI 1 "general_operand" "%0,ro>")
+ (match_operand:DI 2 "general_operand" "Fro,F")))]
+ ""
+ "*
+ {
+ rtx low[3];
+- char *pattern;
++ const char *pattern;
+ int carry = 1;
+
+ split_quadword_operands (operands, low, 3);
+@@ -700,7 +724,7 @@
+ ;;- All kinds of subtract instructions.
+
+ (define_insn "subdf3"
+- [(set (match_operand:DF 0 "general_operand" "=g,g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g")
+ (minus:DF (match_operand:DF 1 "general_operand" "0,gF")
+ (match_operand:DF 2 "general_operand" "gF,gF")))]
+ ""
+@@ -709,7 +733,7 @@
+ sub%#3 %2,%1,%0")
+
+ (define_insn "subsf3"
+- [(set (match_operand:SF 0 "general_operand" "=g,g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g")
+ (minus:SF (match_operand:SF 1 "general_operand" "0,gF")
+ (match_operand:SF 2 "general_operand" "gF,gF")))]
+ ""
+@@ -718,7 +742,7 @@
+ subf3 %2,%1,%0")
+
+ (define_insn "subsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")
+ (minus:SI (match_operand:SI 1 "general_operand" "0,g")
+ (match_operand:SI 2 "general_operand" "g,g")))]
+ ""
+@@ -727,7 +751,7 @@
+ subl3 %2,%1,%0")
+
+ (define_insn "subhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")
+ (minus:HI (match_operand:HI 1 "general_operand" "0,g")
+ (match_operand:HI 2 "general_operand" "g,g")))]
+ ""
+@@ -736,7 +760,7 @@
+ subw3 %2,%1,%0")
+
+ (define_insn "subqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")
+ (minus:QI (match_operand:QI 1 "general_operand" "0,g")
+ (match_operand:QI 2 "general_operand" "g,g")))]
+ ""
+@@ -746,14 +770,14 @@
+
+ ;; The subtract-with-carry (sbwc) instruction only takes two operands.
+ (define_insn "subdi3"
+- [(set (match_operand:DI 0 "general_operand" "=or>,or>")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=or>,or>")
+ (minus:DI (match_operand:DI 1 "general_operand" "0,or>")
+ (match_operand:DI 2 "general_operand" "For,F")))]
+ ""
+ "*
+ {
+ rtx low[3];
+- char *pattern;
++ const char *pattern;
+ int carry = 1;
+
+ split_quadword_operands (operands, low, 3);
+@@ -791,7 +815,7 @@
+ ;;- Multiply instructions.
+
+ (define_insn "muldf3"
+- [(set (match_operand:DF 0 "general_operand" "=g,g,g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g,g")
+ (mult:DF (match_operand:DF 1 "general_operand" "0,gF,gF")
+ (match_operand:DF 2 "general_operand" "gF,0,gF")))]
+ ""
+@@ -801,7 +825,7 @@
+ mul%#3 %1,%2,%0")
+
+ (define_insn "mulsf3"
+- [(set (match_operand:SF 0 "general_operand" "=g,g,g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g,g")
+ (mult:SF (match_operand:SF 1 "general_operand" "0,gF,gF")
+ (match_operand:SF 2 "general_operand" "gF,0,gF")))]
+ ""
+@@ -811,7 +835,7 @@
+ mulf3 %1,%2,%0")
+
+ (define_insn "mulsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")
+ (mult:SI (match_operand:SI 1 "general_operand" "0,g,g")
+ (match_operand:SI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -821,7 +845,7 @@
+ mull3 %1,%2,%0")
+
+ (define_insn "mulhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g,g,")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,")
+ (mult:HI (match_operand:HI 1 "general_operand" "0,g,g")
+ (match_operand:HI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -831,7 +855,7 @@
+ mulw3 %1,%2,%0")
+
+ (define_insn "mulqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g,g")
+ (mult:QI (match_operand:QI 1 "general_operand" "0,g,g")
+ (match_operand:QI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -841,7 +865,7 @@
+ mulb3 %1,%2,%0")
+
+ (define_insn "mulsidi3"
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (mult:DI (sign_extend:DI
+ (match_operand:SI 1 "nonimmediate_operand" "g"))
+ (sign_extend:DI
+@@ -850,7 +874,7 @@
+ "emul %1,%2,$0,%0")
+
+ (define_insn ""
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (plus:DI
+ (mult:DI (sign_extend:DI
+ (match_operand:SI 1 "nonimmediate_operand" "g"))
+@@ -862,7 +886,7 @@
+
+ ;; 'F' constraint means type CONST_DOUBLE
+ (define_insn ""
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (plus:DI
+ (mult:DI (sign_extend:DI
+ (match_operand:SI 1 "nonimmediate_operand" "g"))
+@@ -881,7 +905,7 @@
+ ;;- Divide instructions.
+
+ (define_insn "divdf3"
+- [(set (match_operand:DF 0 "general_operand" "=g,g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g,g")
+ (div:DF (match_operand:DF 1 "general_operand" "0,gF")
+ (match_operand:DF 2 "general_operand" "gF,gF")))]
+ ""
+@@ -890,7 +914,7 @@
+ div%#3 %2,%1,%0")
+
+ (define_insn "divsf3"
+- [(set (match_operand:SF 0 "general_operand" "=g,g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g,g")
+ (div:SF (match_operand:SF 1 "general_operand" "0,gF")
+ (match_operand:SF 2 "general_operand" "gF,gF")))]
+ ""
+@@ -899,7 +923,7 @@
+ divf3 %2,%1,%0")
+
+ (define_insn "divsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")
+ (div:SI (match_operand:SI 1 "general_operand" "0,g")
+ (match_operand:SI 2 "general_operand" "g,g")))]
+ ""
+@@ -908,7 +932,7 @@
+ divl3 %2,%1,%0")
+
+ (define_insn "divhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")
+ (div:HI (match_operand:HI 1 "general_operand" "0,g")
+ (match_operand:HI 2 "general_operand" "g,g")))]
+ ""
+@@ -917,7 +941,7 @@
+ divw3 %2,%1,%0")
+
+ (define_insn "divqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")
+ (div:QI (match_operand:QI 1 "general_operand" "0,g")
+ (match_operand:QI 2 "general_operand" "g,g")))]
+ ""
+@@ -939,7 +963,7 @@
+
+ ;; Bit-and on the vax is done with a clear-bits insn.
+ (define_expand "andsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (and:SI (not:SI (match_operand:SI 1 "general_operand" "g"))
+ (match_operand:SI 2 "general_operand" "g")))]
+ ""
+@@ -962,7 +986,7 @@
+ }")
+
+ (define_expand "andhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (and:HI (not:HI (match_operand:HI 1 "general_operand" "g"))
+ (match_operand:HI 2 "general_operand" "g")))]
+ ""
+@@ -984,7 +1008,7 @@
+ }")
+
+ (define_expand "andqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (and:QI (not:QI (match_operand:QI 1 "general_operand" "g"))
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+@@ -1006,7 +1030,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")
+ (and:SI (not:SI (match_operand:SI 1 "general_operand" "g,g"))
+ (match_operand:SI 2 "general_operand" "0,g")))]
+ ""
+@@ -1015,7 +1039,7 @@
+ bicl3 %1,%2,%0")
+
+ (define_insn ""
+- [(set (match_operand:HI 0 "general_operand" "=g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")
+ (and:HI (not:HI (match_operand:HI 1 "general_operand" "g,g"))
+ (match_operand:HI 2 "general_operand" "0,g")))]
+ ""
+@@ -1024,7 +1048,7 @@
+ bicw3 %1,%2,%0")
+
+ (define_insn ""
+- [(set (match_operand:QI 0 "general_operand" "=g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")
+ (and:QI (not:QI (match_operand:QI 1 "general_operand" "g,g"))
+ (match_operand:QI 2 "general_operand" "0,g")))]
+ ""
+@@ -1038,7 +1062,7 @@
+ ;; opportunities in combine.c.
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g")
+ (and:SI (match_operand:SI 1 "general_operand" "0,g")
+ (match_operand:SI 2 "const_int_operand" "n,n")))]
+ ""
+@@ -1047,7 +1071,7 @@
+ bicl3 %N2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:HI 0 "general_operand" "=g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g")
+ (and:HI (match_operand:HI 1 "general_operand" "0,g")
+ (match_operand:HI 2 "const_int_operand" "n,n")))]
+ ""
+@@ -1056,7 +1080,7 @@
+ bicw3 %H2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:QI 0 "general_operand" "=g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g")
+ (and:QI (match_operand:QI 1 "general_operand" "0,g")
+ (match_operand:QI 2 "const_int_operand" "n,n")))]
+ ""
+@@ -1067,7 +1091,7 @@
+ ;;- Bit set instructions.
+
+ (define_insn "iorsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")
+ (ior:SI (match_operand:SI 1 "general_operand" "0,g,g")
+ (match_operand:SI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1077,7 +1101,7 @@
+ bisl3 %2,%1,%0")
+
+ (define_insn "iorhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,g")
+ (ior:HI (match_operand:HI 1 "general_operand" "0,g,g")
+ (match_operand:HI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1087,7 +1111,7 @@
+ bisw3 %2,%1,%0")
+
+ (define_insn "iorqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g,g")
+ (ior:QI (match_operand:QI 1 "general_operand" "0,g,g")
+ (match_operand:QI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1099,7 +1123,7 @@
+ ;;- xor instructions.
+
+ (define_insn "xorsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g,g,g")
+ (xor:SI (match_operand:SI 1 "general_operand" "0,g,g")
+ (match_operand:SI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1109,7 +1133,7 @@
+ xorl3 %2,%1,%0")
+
+ (define_insn "xorhi3"
+- [(set (match_operand:HI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g,g,g")
+ (xor:HI (match_operand:HI 1 "general_operand" "0,g,g")
+ (match_operand:HI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1119,7 +1143,7 @@
+ xorw3 %2,%1,%0")
+
+ (define_insn "xorqi3"
+- [(set (match_operand:QI 0 "general_operand" "=g,g,g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g,g,g")
+ (xor:QI (match_operand:QI 1 "general_operand" "0,g,g")
+ (match_operand:QI 2 "general_operand" "g,0,g")))]
+ ""
+@@ -1129,49 +1153,49 @@
+ xorb3 %2,%1,%0")
+
+ (define_insn "negdf2"
+- [(set (match_operand:DF 0 "general_operand" "=g")
++ [(set (match_operand:DF 0 "nonimmediate_operand" "=g")
+ (neg:DF (match_operand:DF 1 "general_operand" "gF")))]
+ ""
+ "mneg%# %1,%0")
+
+ (define_insn "negsf2"
+- [(set (match_operand:SF 0 "general_operand" "=g")
++ [(set (match_operand:SF 0 "nonimmediate_operand" "=g")
+ (neg:SF (match_operand:SF 1 "general_operand" "gF")))]
+ ""
+ "mnegf %1,%0")
+
+ (define_insn "negsi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (neg:SI (match_operand:SI 1 "general_operand" "g")))]
+ ""
+ "mnegl %1,%0")
+
+ (define_insn "neghi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (neg:HI (match_operand:HI 1 "general_operand" "g")))]
+ ""
+ "mnegw %1,%0")
+
+ (define_insn "negqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (neg:QI (match_operand:QI 1 "general_operand" "g")))]
+ ""
+ "mnegb %1,%0")
+
+ (define_insn "one_cmplsi2"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (not:SI (match_operand:SI 1 "general_operand" "g")))]
+ ""
+ "mcoml %1,%0")
+
+ (define_insn "one_cmplhi2"
+- [(set (match_operand:HI 0 "general_operand" "=g")
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=g")
+ (not:HI (match_operand:HI 1 "general_operand" "g")))]
+ ""
+ "mcomw %1,%0")
+
+ (define_insn "one_cmplqi2"
+- [(set (match_operand:QI 0 "general_operand" "=g")
++ [(set (match_operand:QI 0 "nonimmediate_operand" "=g")
+ (not:QI (match_operand:QI 1 "general_operand" "g")))]
+ ""
+ "mcomb %1,%0")
+@@ -1182,32 +1206,32 @@
+ ;; prevents converting shifts to ZERO_EXTRACTs with negative positions,
+ ;; which isn't valid.
+ (define_expand "ashrsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+ "
+ {
+ if (GET_CODE (operands[2]) != CONST_INT)
+- operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
++ operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "const_int_operand" "n")))]
+ ""
+ "ashl $%n2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
+ (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
+ ""
+ "ashl %2,%1,%0")
+
+ (define_insn "ashlsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (ashift:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+@@ -1231,24 +1255,24 @@
+
+ ;; Arithmetic right shift on the vax works by negating the shift count.
+ (define_expand "ashrdi3"
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+ "
+ {
+- operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
++ operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
+ }")
+
+ (define_insn "ashldi3"
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (ashift:DI (match_operand:DI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+ "ashq %2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:DI 0 "general_operand" "=g")
++ [(set (match_operand:DI 0 "nonimmediate_operand" "=g")
+ (ashiftrt:DI (match_operand:DI 1 "general_operand" "g")
+ (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
+ ""
+@@ -1263,7 +1287,7 @@
+ [(set (match_dup 3)
+ (minus:QI (const_int 32)
+ (match_dup 4)))
+- (set (match_operand:SI 0 "general_operand" "=g")
++ (set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (zero_extract:SI (match_operand:SI 1 "register_operand" "r")
+ (match_dup 3)
+ (match_operand:SI 2 "register_operand" "g")))]
+@@ -1276,32 +1300,32 @@
+
+ ;; Rotate right on the vax works by negating the shift count.
+ (define_expand "rotrsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (rotatert:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+ "
+ {
+ if (GET_CODE (operands[2]) != CONST_INT)
+- operands[2] = gen_rtx (NEG, QImode, negate_rtx (QImode, operands[2]));
++ operands[2] = gen_rtx_NEG (QImode, negate_rtx (QImode, operands[2]));
+ }")
+
+ (define_insn "rotlsi3"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (rotate:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "general_operand" "g")))]
+ ""
+ "rotl %2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (rotatert:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "const_int_operand" "n")))]
+ ""
+ "rotl %R2,%1,%0")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (rotatert:SI (match_operand:SI 1 "general_operand" "g")
+ (neg:QI (match_operand:QI 2 "general_operand" "g"))))]
+ ""
+@@ -1309,7 +1333,7 @@
+
+ ;This insn is probably slower than a multiply and an add.
+ ;(define_insn ""
+-; [(set (match_operand:SI 0 "general_operand" "=g")
++; [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ ; (mult:SI (plus:SI (match_operand:SI 1 "general_operand" "g")
+ ; (match_operand:SI 2 "general_operand" "g"))
+ ; (match_operand:SI 3 "general_operand" "g")))]
+@@ -1348,7 +1372,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=&g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=&g")
+ (zero_extract:SI (match_operand:SI 1 "register_operand" "ro")
+ (match_operand:QI 2 "const_int_operand" "n")
+ (match_operand:SI 3 "const_int_operand" "n")))]
+@@ -1373,7 +1397,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (sign_extract:SI (match_operand:SI 1 "register_operand" "ro")
+ (match_operand:QI 2 "const_int_operand" "n")
+ (match_operand:SI 3 "const_int_operand" "n")))]
+@@ -1425,7 +1449,7 @@
+ ;; anyway, we can't allow immediate values for the primary source operand.
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (sign_extract:SI (match_operand:SI 1 "register_operand" "ro")
+ (match_operand:QI 2 "general_operand" "g")
+ (match_operand:SI 3 "general_operand" "g")))]
+@@ -1442,7 +1466,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (zero_extract:SI (match_operand:SI 1 "register_operand" "ro")
+ (match_operand:QI 2 "general_operand" "g")
+ (match_operand:SI 3 "general_operand" "g")))]
+@@ -1488,7 +1512,7 @@
+ "cmpzv %2,%1,%0,%3")
+
+ (define_insn "extv"
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
+ (match_operand:QI 2 "general_operand" "g")
+ (match_operand:SI 3 "general_operand" "g")))]
+@@ -1517,7 +1541,7 @@
+ "")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (zero_extract:SI (match_operand:QI 1 "memory_operand" "m")
+ (match_operand:QI 2 "general_operand" "g")
+ (match_operand:SI 3 "general_operand" "g")))]
+@@ -1840,63 +1864,66 @@
+ ;; It is used in the call instruction as a byte, but in the addl2 as
+ ;; a word. Since the only time we actually use it in the call instruction
+ ;; is when it is a constant, SImode (for addl2) is the proper mode.
+-(define_insn "call_pop"
++(define_expand "call_pop"
++ [(parallel [(call (match_operand:QI 0 "memory_operand" "")
++ (match_operand:SI 1 "const_int_operand" ""))
++ (set (reg:SI 14)
++ (plus:SI (reg:SI 14)
++ (match_operand:SI 3 "immediate_operand" "")))])]
++ ""
++ "
++{
++ if (INTVAL (operands[1]) > 255 * 4)
++ abort ();
++ operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
++}")
++
++(define_insn "*call_pop"
+ [(call (match_operand:QI 0 "memory_operand" "m")
+ (match_operand:SI 1 "const_int_operand" "n"))
+ (set (reg:SI 14) (plus:SI (reg:SI 14)
+- (match_operand:SI 3 "immediate_operand" "i")))]
++ (match_operand:SI 2 "immediate_operand" "i")))]
+ ""
+- "*
+- if (INTVAL (operands[1]) > 255 * 4)
+- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
+- return \"calls $0,%0\;addl2 %1,sp\";
+- operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
+- return \"calls %1,%0\";
+-")
++ "calls %1,%0")
+
+-(define_insn "call_value_pop"
+- [(set (match_operand 0 "" "=g")
++(define_expand "call_value_pop"
++ [(parallel [(set (match_operand 0 "" "")
++ (call (match_operand:QI 1 "memory_operand" "")
++ (match_operand:SI 2 "const_int_operand" "")))
++ (set (reg:SI 14)
++ (plus:SI (reg:SI 14)
++ (match_operand:SI 4 "immediate_operand" "")))])]
++ ""
++ "
++{
++ if (INTVAL (operands[2]) > 255 * 4)
++ abort ();
++ operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
++}")
++
++(define_insn "*call_value_pop"
++ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "memory_operand" "m")
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (set (reg:SI 14) (plus:SI (reg:SI 14)
+- (match_operand:SI 4 "immediate_operand" "i")))]
++ (match_operand:SI 3 "immediate_operand" "i")))]
+ ""
+- "*
+- if (INTVAL (operands[2]) > 255 * 4)
+- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
+- return \"calls $0,%1\;addl2 %2,sp\";
+- operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
+- return \"calls %2,%1\";
+-")
++ "calls %2,%1")
+
+-;; Define another set of these for the case of functions with no
+-;; operands. In that case, combine may simplify the adjustment of sp.
+-(define_insn ""
++;; Define another set of these for the case of functions with no operands.
++;; These will allow the optimizers to do a slightly better job.
++(define_insn "call"
+ [(call (match_operand:QI 0 "memory_operand" "m")
+- (match_operand:SI 1 "const_int_operand" "n"))
+- (set (reg:SI 14) (reg:SI 14))]
++ (const_int 0))]
+ ""
+- "*
+- if (INTVAL (operands[1]) > 255 * 4)
+- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
+- return \"calls $0,%0\;addl2 %1,sp\";
+- operands[1] = GEN_INT ((INTVAL (operands[1]) + 3)/ 4);
+- return \"calls %1,%0\";
+-")
++ "calls $0,%0")
+
+-(define_insn ""
+- [(set (match_operand 0 "" "=g")
++(define_insn "call_value"
++ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "memory_operand" "m")
+- (match_operand:SI 2 "const_int_operand" "n")))
+- (set (reg:SI 14) (reg:SI 14))]
++ (const_int 0)))]
+ ""
+- "*
+- if (INTVAL (operands[2]) > 255 * 4)
+- /* Vax `calls' really uses only one byte of #args, so pop explicitly. */
+- return \"calls $0,%1\;addl2 %2,sp\";
+- operands[2] = GEN_INT ((INTVAL (operands[2]) + 3)/ 4);
+- return \"calls %2,%1\";
+-")
++ "calls $0,%1")
+
+ ;; Call subroutine returning any type.
+
+@@ -1949,7 +1976,7 @@
+ ;; If you are tempted to try `g', please don't--it's not worth
+ ;; the risk we will reopen the same bug.
+ (define_insn "indirect_jump"
+- [(set (pc) (match_operand:SI 0 "general_operand" "r"))]
++ [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
+ ""
+ "jmp (%0)")
+
+@@ -2003,7 +2030,7 @@
+ (mult:SI (minus:SI (match_dup 0)
+ (const_int 0))
+ (const_int 2)))))
+- (label_ref:SI (match_operand 3 "" "")))
++ (label_ref:SI (match_operand 2 "" "")))
+ (pc)))]
+ ""
+ "casel %0,$0,%1")
+@@ -2017,7 +2044,7 @@
+ ;; because < matches any autodecrement, not just a push.
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:QI 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2029,7 +2056,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:HI 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2041,7 +2068,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:SI 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2053,7 +2080,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:DI 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2065,7 +2092,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:SF 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2077,7 +2104,7 @@
+ }")
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=g")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
+ (match_operand:DF 1 "address_operand" "p"))]
+ ""
+ "*
+@@ -2102,7 +2129,7 @@
+ ;; above sequences to before attempting to recognize the new insn.
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=ro")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
+ (and:SI (ashiftrt:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "const_int_operand" "n"))
+ (match_operand:SI 3 "const_int_operand" "n")))]
+@@ -2124,13 +2151,14 @@
+ ;; optimized away.
+
+ (define_insn ""
+- [(set (match_operand:SI 0 "general_operand" "=ro")
++ [(set (match_operand:SI 0 "nonimmediate_operand" "=ro")
+ (and:SI (ashift:SI (match_operand:SI 1 "general_operand" "g")
+ (match_operand:QI 2 "const_int_operand" "n"))
+ (match_operand:SI 3 "const_int_operand" "n")))]
+ ""
+ "*
+ {
+- operands[3] = GEN_INT (INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
++ operands[3]
++ = GEN_INT (INTVAL (operands[3]) & ~((1 << INTVAL (operands[2])) - 1));
+ return \"rotl %2,%1,%0\;bicl2 %N3,%0\";
+ }")
diff --git a/lang/gcc/patches/patch-be b/lang/gcc/patches/patch-be
new file mode 100644
index 00000000000..749844eded1
--- /dev/null
+++ b/lang/gcc/patches/patch-be
@@ -0,0 +1,59 @@
+$NetBSD: patch-be,v 1.1 2002/01/03 20:40:45 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/elfos.h.orig Wed Apr 12 03:22:51 2000
++++ ../gcc-2.95.3/gcc/config/elfos.h Thu Jan 3 20:37:54 2002
+@@ -48,6 +48,7 @@
+
+ /* Output #ident as a .ident. */
+
++#undef ASM_OUTPUT_IDENT
+ #define ASM_OUTPUT_IDENT(FILE, NAME) \
+ fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
+
+@@ -57,7 +58,9 @@
+
+ /* Writing `int' for a bitfield forces int alignment for the structure. */
+
++#ifndef PCC_BITFIELD_TYPE_MATTERS
+ #define PCC_BITFIELD_TYPE_MATTERS 1
++#endif
+
+ /* Implicit library calls should use memcpy, not bcopy, etc. */
+
+@@ -92,6 +95,10 @@
+ #undef SET_ASM_OP
+ #define SET_ASM_OP ".set"
+
++/* We want local labels to start with period if made with asm_fprintf. */
++#undef LOCAL_LABEL_PREFIX
++#define LOCAL_LABEL_PREFIX "."
++
+ /* This is how to begin an assembly language file. Most svr4 assemblers want
+ at least a .file directive to come first, and some want to see a .version
+ directive come right after that. Here we just establish a default
+@@ -130,7 +137,7 @@
+ #undef ASM_OUTPUT_INTERNAL_LABEL
+ #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
+ do { \
+- fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
++ fprintf (FILE, "%s%s%d:\n", LOCAL_LABEL_PREFIX, PREFIX, NUM); \
+ } while (0)
+
+ /* This is how to store into the string LABEL
+@@ -144,7 +151,7 @@
+ #undef ASM_GENERATE_INTERNAL_LABEL
+ #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
+ do { \
+- sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
++ sprintf (LABEL, "*%s%s%d", LOCAL_LABEL_PREFIX, PREFIX, NUM); \
+ } while (0)
+
+ /* Output the label which precedes a jumptable. Note that for all svr4
+@@ -462,6 +469,7 @@
+
+ /* This is how we tell the assembler that a symbol is weak. */
+
++#undef ASM_WEAKEN_LABEL
+ #define ASM_WEAKEN_LABEL(FILE,NAME) \
+ do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
+ fputc ('\n', FILE); } while (0)
diff --git a/lang/gcc/patches/patch-bf b/lang/gcc/patches/patch-bf
new file mode 100644
index 00000000000..e5efca4626a
--- /dev/null
+++ b/lang/gcc/patches/patch-bf
@@ -0,0 +1,229 @@
+$NetBSD: patch-bf,v 1.1 2002/01/03 20:40:45 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/netbsd.h.orig Wed Dec 16 21:59:58 1998
++++ ../gcc-2.95.3/gcc/config/netbsd.h Thu Jan 3 20:37:54 2002
+@@ -9,22 +9,22 @@
+ #undef GPLUSPLUS_INCLUDE_DIR
+ #define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
+
+-#undef GCC_INCLUDE_DIR
+-#define GCC_INCLUDE_DIR "/usr/include"
++#undef STANDARD_INCLUDE_DIR
++#define STANDARD_INCLUDE_DIR "/usr/include"
+
+ #undef INCLUDE_DEFAULTS
+ #define INCLUDE_DEFAULTS \
+ { \
+ { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
+- { GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
++ { STANDARD_INCLUDE_DIR, 0, 0, 0 }, \
+ { 0, 0, 0, 0 } \
+ }
+
+ /* Under NetBSD, the normal location of the compiler back ends is the
+ /usr/libexec directory. */
+
+-#undef STANDARD_EXEC_PREFIX
+-#define STANDARD_EXEC_PREFIX "/usr/libexec/"
++#undef MD_EXEC_PREFIX
++#define MD_EXEC_PREFIX "/usr/libexec/"
+
+ /* Under NetBSD, the normal location of the various *crt*.o files is the
+ /usr/lib directory. */
+@@ -32,14 +32,14 @@
+ #undef STANDARD_STARTFILE_PREFIX
+ #define STANDARD_STARTFILE_PREFIX "/usr/lib/"
+
+-#endif
++#endif /* NETBSD_NATIVE */
+
+
+ /* Provide a CPP_SPEC appropriate for NetBSD. Current we just deal with
+ the GCC option `-posix'. */
+
+ #undef CPP_SPEC
+-#define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
++#define CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE}"
+
+ /* Provide an ASM_SPEC appropriate for NetBSD. Currently we only deal
+ with the options for generating PIC code. */
+@@ -48,17 +48,42 @@
+ #define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k -K}"
+
+ /* Provide a LIB_SPEC appropriate for NetBSD. Just select the appropriate
+- libc, depending on whether we're doing profiling. */
++ libc, depending on whether we're doing profiling; if `-posix' is specified,
++ link against the appropriate libposix first. Don't include libc when
++ linking a shared library. */
+
+ #undef LIB_SPEC
+-#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
++#define LIB_SPEC \
++ "%{posix:%{!p:%{!pg:-lposix}}%{p:-lposix_p}%{pg:-lposix_p}} \
++ %{!shared:%{!symbolic:%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}}"
++
++/* Provide a LIBGCC_SPEC appropriate for NetBSD. We also want to exclude
++ libgcc when -symbolic. */
++
++#undef LIBGCC_SPEC
++#ifdef NETBSD_NATIVE
++#define LIBGCC_SPEC "%{!symbolic:%{!shared:%{!p:%{!pg:-lgcc}}}%{shared:-lgcc_pic}%{p:-lgcc_p}%{pg:-lgcc_p}}"
++#else
++#define LIBGCC_SPEC "%{!shared:%{!symbolic:-lgcc}}"
++#endif
++
++/* #ifdef NETBSD_AOUT */
++
++/* Provide a STARTFILE_SPEC appropriate for NetBSD a.out. Here we
++ provide support for the special GCC option -static. */
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC \
++ "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:%{!static:crt0%O%s}%{static:scrt0%O%s}}}} %{shared:c++rt0%O%s}"
+
+ /* Provide a LINK_SPEC appropriate for NetBSD. Here we provide support
+ for the special GCC options -static, -assert, and -nostdlib. */
+
+ #undef LINK_SPEC
+ #define LINK_SPEC \
+- "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} %{static:-Bstatic} %{assert*}"
++ "%{nostdlib:-nostdlib} %{!shared:%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{static:-Bstatic}} %{shared:-Bshareable} %{R*} %{assert*}"
++
++/* #endif NETBSD_AOUT */
+
+ /* This defines which switch letters take arguments. */
+ #undef SWITCH_TAKES_ARG
+@@ -122,88 +147,48 @@
+ #define ASM_DECLARE_RESULT(FILE, RESULT)
+ #endif
+
+-/* These macros generate the special .type and .size directives which
+- are used to set the corresponding fields of the linker symbol table
+- entries in an ELF object file under SVR4. These macros also output
+- the starting labels for the relevant functions/objects. */
+-
+-/* Write the extra assembler code needed to declare a function properly.
+- Some svr4 assemblers need to also have something extra said about the
+- function's return value. We allow for that here. */
+-
+-#undef ASM_DECLARE_FUNCTION_NAME
+-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+- do { \
+- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- putc (',', FILE); \
+- fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
+- putc ('\n', FILE); \
+- ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+- ASM_OUTPUT_LABEL(FILE, NAME); \
+- } while (0)
+-
+-/* Write the extra assembler code needed to declare an object properly. */
+-
+-#undef ASM_DECLARE_OBJECT_NAME
+-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
+- do { \
+- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- putc (',', FILE); \
+- fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
+- putc ('\n', FILE); \
+- size_directive_output = 0; \
+- if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
+- { \
+- size_directive_output = 1; \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, NAME); \
+- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+- } \
+- ASM_OUTPUT_LABEL(FILE, NAME); \
+- } while (0)
+-
+-/* Output the size directive for a decl in rest_of_decl_compilation
+- in the case where we did not do so before the initializer.
+- Once we find the error_mark_node, we know that the value of
+- size_directive_output was set
+- by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
+-
+-#undef ASM_FINISH_DECLARE_OBJECT
+-#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
+-do { \
+- char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+- if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
+- && ! AT_END && TOP_LEVEL \
+- && DECL_INITIAL (DECL) == error_mark_node \
+- && !size_directive_output) \
+- { \
+- size_directive_output = 1; \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, name); \
+- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+- } \
+- } while (0)
+-
+-/* This is how to declare the size of a function. */
+-
+-#undef ASM_DECLARE_FUNCTION_SIZE
+-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
+- do { \
+- if (!flag_inhibit_size_directive) \
+- { \
+- char label[256]; \
+- static int labelno; \
+- labelno++; \
+- ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
+- ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
+- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+- assemble_name (FILE, (FNAME)); \
+- fprintf (FILE, ","); \
+- assemble_name (FILE, label); \
+- fprintf (FILE, "-"); \
+- assemble_name (FILE, (FNAME)); \
+- putc ('\n', FILE); \
+- } \
+- } while (0)
++/* NetBSD ELF support begins here. */
++
++#ifdef NETBSD_ELF
++
++#undef DWARF_DEBUGGING_INFO /* XXX */
++#undef DWARF2_DEBUGGING_INFO /* XXX */
++
++/* Provide a STARTFILE_SPEC appropriate for NetBSD ELF targets. Here we
++ provide support for the special GCC option -static. On ELF targets,
++ we also add the crtbegin.o file which provides part of the support
++ for getting C++ file-scope static objects constructed before entering
++ `main'. */
++
++#undef STARTFILE_SPEC
++#define STARTFILE_SPEC \
++ "%{!shared: \
++ %{pg:gcrt0%O%s} \
++ %{!pg: \
++ %{p:gcrt0%O%s} \
++ %{!p:crt0%O%s}}} \
++ %{!shared:crtbegin%O%s} %{shared:crtbeginS%O%s}"
++
++/* Provide an ENDFILE_SPEC appropriate for NetBSD ELF targets. Here we
++ add crtend.o, which provides part of the support for getting C++
++ file-scope static objects deconstructed after exiting `main'. */
++
++#undef ENDFILE_SPEC
++#define ENDFILE_SPEC \
++ "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
++
++/* Provide a LINK_SPEC appropriate for a NetBSD ELF target. */
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++ "%{assert*} \
++ %{shared:-shared} \
++ %{!shared: \
++ -dc -dp \
++ %{!nostdlib:%{!r*:%{!e*:-e __start}}} \
++ %{!static: \
++ %{rdynamic:-export-dynamic} \
++ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
++ %{static:-static}}"
++
++#endif /* NETBSD_ELF */
diff --git a/lang/gcc/patches/patch-bg b/lang/gcc/patches/patch-bg
new file mode 100644
index 00000000000..42f83099434
--- /dev/null
+++ b/lang/gcc/patches/patch-bg
@@ -0,0 +1,20 @@
+$NetBSD: patch-bg,v 1.1 2002/01/03 20:40:45 tron Exp $
+
+--- ../gcc-2.95.3/gcc/config/t-netbsd.orig Wed Dec 16 22:00:12 1998
++++ ../gcc-2.95.3/gcc/config/t-netbsd Thu Jan 3 20:37:54 2002
+@@ -1,9 +1,9 @@
+-LIBGCC1=libgcc1.null
+-CROSS_LIBGCC1=libgcc1.null
+-LIBGCC1_TEST=
+-
+-# Don't run fixproto
++# Don't run fixproto.
+ STMP_FIXPROTO =
+
+-# Don't install "assert.h" in gcc. We use the one in glibc.
++# Don't install "assert.h" in gcc. We use the one in NetBSD's libc.
+ INSTALL_ASSERT_H =
++
++# The stdarg, varargs, etc. that comes with NetBSD is already sane.
++# Don't override these with local versions.
++USER_H = $(EXTRA_HEADERS) $(LANG_EXTRA_HEADERS)
diff --git a/lang/gcc/patches/patch-bh b/lang/gcc/patches/patch-bh
new file mode 100644
index 00000000000..6fb4add298c
--- /dev/null
+++ b/lang/gcc/patches/patch-bh
@@ -0,0 +1,13 @@
+$NetBSD: patch-bh,v 1.1 2002/01/03 20:40:45 tron Exp $
+
+--- ../gcc-2.95.3/gcc/ginclude/va-sparc.h.orig Wed Dec 16 22:19:44 1998
++++ ../gcc-2.95.3/gcc/ginclude/va-sparc.h Thu Jan 3 20:37:54 2002
+@@ -5,7 +5,7 @@
+
+ #ifndef __GNUC_VA_LIST
+ #define __GNUC_VA_LIST
+-#if ! defined (__svr4__) && ! defined (__linux__) && ! defined (__arch64__)
++#if ! defined (__svr4__) && ! defined (__linux__) && (defined(__NetBSD__) || ! defined(__arch64__))
+ /* This has to be a char * to be compatible with Sun.
+ i.e., we have to pass a `va_list' to vsprintf. */
+ typedef char * __gnuc_va_list;
diff --git a/lang/gcc/patches/patch-bi b/lang/gcc/patches/patch-bi
new file mode 100644
index 00000000000..c6364e3edec
--- /dev/null
+++ b/lang/gcc/patches/patch-bi
@@ -0,0 +1,18 @@
+$NetBSD: patch-bi,v 1.1 2002/01/03 20:40:46 tron Exp $
+
+--- ../gcc-2.95.3/gcc/objc/objc-act.c.orig Wed Apr 14 22:28:54 1999
++++ ../gcc-2.95.3/gcc/objc/objc-act.c Thu Jan 3 20:37:54 2002
+@@ -8399,8 +8399,11 @@
+ pushdecl (decl);
+ rest_of_decl_compilation (decl, 0, 0, 0);
+
+- /* Make following constant read-only (why not)? */
+- readonly_data_section ();
++ /* Make following constant read-only, if not compiling PIC. */
++ if (flag_pic)
++ data_section();
++ else
++ readonly_data_section ();
+
+ exp = build1 (ADDR_EXPR, string_type_node, decl);
+
diff --git a/lang/gcc/patches/patch-bj b/lang/gcc/patches/patch-bj
new file mode 100644
index 00000000000..f247bc49e35
--- /dev/null
+++ b/lang/gcc/patches/patch-bj
@@ -0,0 +1,443 @@
+$NetBSD: patch-bj,v 1.1 2002/01/03 20:40:46 tron Exp $
+
+--- ../gcc-2.95.3/gcc/objc/objc-parse.c.orig Fri Mar 16 15:13:48 2001
++++ ../gcc-2.95.3/gcc/objc/objc-parse.c Thu Jan 3 20:37:54 2002
+@@ -1,69 +1,68 @@
+
+ /* A Bison parser, made from objc-parse.y
+- by GNU Bison version 1.25
+- */
++ by GNU Bison version 1.28 */
+
+ #define YYBISON 1 /* Identify Bison output. */
+
+-#define IDENTIFIER 258
+-#define TYPENAME 259
+-#define SCSPEC 260
+-#define TYPESPEC 261
+-#define TYPE_QUAL 262
+-#define CONSTANT 263
+-#define STRING 264
+-#define ELLIPSIS 265
+-#define SIZEOF 266
+-#define ENUM 267
+-#define STRUCT 268
+-#define UNION 269
+-#define IF 270
+-#define ELSE 271
+-#define WHILE 272
+-#define DO 273
+-#define FOR 274
+-#define SWITCH 275
+-#define CASE 276
+-#define DEFAULT 277
+-#define BREAK 278
+-#define CONTINUE 279
+-#define RETURN 280
+-#define GOTO 281
+-#define ASM_KEYWORD 282
+-#define TYPEOF 283
+-#define ALIGNOF 284
+-#define ATTRIBUTE 285
+-#define EXTENSION 286
+-#define LABEL 287
+-#define REALPART 288
+-#define IMAGPART 289
+-#define ASSIGN 290
+-#define OROR 291
+-#define ANDAND 292
+-#define EQCOMPARE 293
+-#define ARITHCOMPARE 294
+-#define LSHIFT 295
+-#define RSHIFT 296
+-#define UNARY 297
+-#define PLUSPLUS 298
+-#define MINUSMINUS 299
+-#define HYPERUNARY 300
+-#define POINTSAT 301
+-#define INTERFACE 302
+-#define IMPLEMENTATION 303
+-#define END 304
+-#define SELECTOR 305
+-#define DEFS 306
+-#define ENCODE 307
+-#define CLASSNAME 308
+-#define PUBLIC 309
+-#define PRIVATE 310
+-#define PROTECTED 311
+-#define PROTOCOL 312
+-#define OBJECTNAME 313
+-#define CLASS 314
+-#define ALIAS 315
+-#define OBJC_STRING 316
++#define IDENTIFIER 257
++#define TYPENAME 258
++#define SCSPEC 259
++#define TYPESPEC 260
++#define TYPE_QUAL 261
++#define CONSTANT 262
++#define STRING 263
++#define ELLIPSIS 264
++#define SIZEOF 265
++#define ENUM 266
++#define STRUCT 267
++#define UNION 268
++#define IF 269
++#define ELSE 270
++#define WHILE 271
++#define DO 272
++#define FOR 273
++#define SWITCH 274
++#define CASE 275
++#define DEFAULT 276
++#define BREAK 277
++#define CONTINUE 278
++#define RETURN 279
++#define GOTO 280
++#define ASM_KEYWORD 281
++#define TYPEOF 282
++#define ALIGNOF 283
++#define ATTRIBUTE 284
++#define EXTENSION 285
++#define LABEL 286
++#define REALPART 287
++#define IMAGPART 288
++#define ASSIGN 289
++#define OROR 290
++#define ANDAND 291
++#define EQCOMPARE 292
++#define ARITHCOMPARE 293
++#define LSHIFT 294
++#define RSHIFT 295
++#define UNARY 296
++#define PLUSPLUS 297
++#define MINUSMINUS 298
++#define HYPERUNARY 299
++#define POINTSAT 300
++#define INTERFACE 301
++#define IMPLEMENTATION 302
++#define END 303
++#define SELECTOR 304
++#define DEFS 305
++#define ENCODE 306
++#define CLASSNAME 307
++#define PUBLIC 308
++#define PRIVATE 309
++#define PROTECTED 310
++#define PROTOCOL 311
++#define OBJECTNAME 312
++#define CLASS 313
++#define ALIAS 314
++#define OBJC_STRING 315
+
+ #line 33 "objc-parse.y"
+
+@@ -150,7 +149,7 @@
+ #define YYFLAG -32768
+ #define YYNTBASE 84
+
+-#define YYTRANSLATE(x) ((unsigned)(x) <= 316 ? yytranslate[x] : 311)
++#define YYTRANSLATE(x) ((unsigned)(x) <= 315 ? yytranslate[x] : 311)
+
+ static const char yytranslate[] = { 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+@@ -178,13 +177,13 @@
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
+- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+- 39, 40, 44, 45, 46, 47, 53, 54, 55, 56,
+- 57, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+- 70, 71, 72, 73, 74, 75
++ 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
++ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
++ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 39,
++ 40, 44, 45, 46, 47, 53, 54, 55, 56, 57,
++ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
++ 71, 72, 73, 74, 75
+ };
+
+ #if YYDEBUG != 0
+@@ -1674,7 +1673,8 @@
+ 47, 48, 49, 50, 51, 52
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+-#line 3 "/usr/lib/bison.simple"
++#line 3 "/usr/pkg/share/bison.simple"
++/* This file comes from bison-1.28. */
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+@@ -1691,46 +1691,66 @@
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
++ Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
+
+ /* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+-#ifndef alloca
++/* This is the parser code that is written into each bison parser
++ when the %semantic_parser declaration is not specified in the grammar.
++ It was written by Richard Stallman by simplifying the hairy parser
++ used when %semantic_parser is specified. */
++
++#ifndef YYSTACK_USE_ALLOCA
++#ifdef alloca
++#define YYSTACK_USE_ALLOCA
++#else /* alloca not defined */
+ #ifdef __GNUC__
++#define YYSTACK_USE_ALLOCA
+ #define alloca __builtin_alloca
+ #else /* not GNU C. */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
++#define YYSTACK_USE_ALLOCA
+ #include <alloca.h>
+ #else /* not sparc */
+-#if defined (MSDOS) && !defined (__TURBOC__)
++/* We think this test detects Watcom and Microsoft C. */
++/* This used to test MSDOS, but that is a bad idea
++ since that symbol is in the user namespace. */
++#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
++#if 0 /* No need for malloc.h, which pollutes the namespace;
++ instead, just don't use alloca. */
+ #include <malloc.h>
++#endif
+ #else /* not MSDOS, or __TURBOC__ */
+ #if defined(_AIX)
+-#include <malloc.h>
++/* I don't know what this was needed for, but it pollutes the namespace.
++ So I turned it off. rms, 2 May 1997. */
++/* #include <malloc.h> */
+ #pragma alloca
+-#else /* not MSDOS, __TURBOC__, or _AIX */
+-#ifdef __hpux
+-#ifdef __cplusplus
+-extern "C" {
+-void *alloca (unsigned int);
+-};
+-#else /* not __cplusplus */
+-void *alloca ();
+-#endif /* not __cplusplus */
++#define YYSTACK_USE_ALLOCA
++#else /* not MSDOS, or __TURBOC__, or _AIX */
++#if 0
++#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
++ and on HPUX 10. Eventually we can turn this on. */
++#define YYSTACK_USE_ALLOCA
++#define alloca __builtin_alloca
+ #endif /* __hpux */
++#endif
+ #endif /* not _AIX */
+ #endif /* not MSDOS, or __TURBOC__ */
+-#endif /* not sparc. */
+-#endif /* not GNU C. */
+-#endif /* alloca not defined. */
++#endif /* not sparc */
++#endif /* not GNU C */
++#endif /* alloca not defined */
++#endif /* YYSTACK_USE_ALLOCA not defined */
+
+-/* This is the parser code that is written into each bison parser
+- when the %semantic_parser declaration is not specified in the grammar.
+- It was written by Richard Stallman by simplifying the hairy parser
+- used when %semantic_parser is specified. */
++#ifdef YYSTACK_USE_ALLOCA
++#define YYSTACK_ALLOC alloca
++#else
++#define YYSTACK_ALLOC malloc
++#endif
+
+ /* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+@@ -1740,8 +1760,8 @@
+ #define yyclearin (yychar = YYEMPTY)
+ #define YYEMPTY -2
+ #define YYEOF 0
+-#define YYACCEPT return(0)
+-#define YYABORT return(1)
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
+ #define YYERROR goto yyerrlab1
+ /* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+@@ -1822,12 +1842,12 @@
+ #ifndef YYMAXDEPTH
+ #define YYMAXDEPTH 10000
+ #endif
+-
+-/* Prevent warning if -Wstrict-prototypes. */
+-#ifdef __GNUC__
+-int yyparse (void);
+-#endif
+
++/* Define __yy_memcpy. Note that the size argument
++ should be passed with type unsigned int, because that is what the non-GCC
++ definitions require. With GCC, __builtin_memcpy takes an arg
++ of type size_t, but it can handle unsigned int. */
++
+ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+ #else /* not GNU C or C++ */
+@@ -1839,7 +1859,7 @@
+ __yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+- int count;
++ unsigned int count;
+ {
+ register char *f = from;
+ register char *t = to;
+@@ -1854,10 +1874,10 @@
+ /* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+ static void
+-__yy_memcpy (char *to, char *from, int count)
++__yy_memcpy (char *to, char *from, unsigned int count)
+ {
+- register char *f = from;
+ register char *t = to;
++ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+@@ -1867,7 +1887,7 @@
+ #endif
+ #endif
+
+-#line 196 "/usr/lib/bison.simple"
++#line 217 "/usr/pkg/share/bison.simple"
+
+ /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+@@ -1888,6 +1908,15 @@
+ #define YYPARSE_PARAM_DECL
+ #endif /* not YYPARSE_PARAM */
+
++/* Prevent warning if -Wstrict-prototypes. */
++#ifdef __GNUC__
++#ifdef YYPARSE_PARAM
++int yyparse (void *);
++#else
++int yyparse (void);
++#endif
++#endif
++
+ int
+ yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+@@ -1916,6 +1945,7 @@
+ #endif
+
+ int yystacksize = YYINITDEPTH;
++ int yyfree_stacks = 0;
+
+ #ifdef YYPURE
+ int yychar;
+@@ -2000,18 +2030,32 @@
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+- yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+- __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+- yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+- __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
++#ifndef YYSTACK_USE_ALLOCA
++ yyfree_stacks = 1;
++#endif
++ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
++ __yy_memcpy ((char *)yyss, (char *)yyss1,
++ size * (unsigned int) sizeof (*yyssp));
++ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
++ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
++ size * (unsigned int) sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+- yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+- __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
++ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
++ __yy_memcpy ((char *)yyls, (char *)yyls1,
++ size * (unsigned int) sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+
+@@ -4995,7 +5039,7 @@
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+-#line 498 "/usr/lib/bison.simple"
++#line 543 "/usr/pkg/share/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+@@ -5067,7 +5111,7 @@
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+- x < (sizeof(yytname) / sizeof(char *)); x++)
++ x < (int)(sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+@@ -5079,7 +5123,7 @@
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+- x < (sizeof(yytname) / sizeof(char *)); x++)
++ x < (int)(sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+@@ -5190,6 +5234,30 @@
+
+ yystate = yyn;
+ goto yynewstate;
++
++ yyacceptlab:
++ /* YYACCEPT comes here. */
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 0;
++
++ yyabortlab:
++ /* YYABORT comes here. */
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 1;
+ }
+ #line 3003 "objc-parse.y"
+
diff --git a/lang/gcc/patches/patch-bk b/lang/gcc/patches/patch-bk
new file mode 100644
index 00000000000..a36cb48d8f1
--- /dev/null
+++ b/lang/gcc/patches/patch-bk
@@ -0,0 +1,64 @@
+$NetBSD: patch-bk,v 1.1 2002/01/03 20:40:46 tron Exp $
+
+--- ../gcc-2.95.3/gcc/ChangeLog.orig Fri Mar 16 13:52:02 2001
++++ ../gcc-2.95.3/gcc/ChangeLog Thu Jan 3 20:37:54 2002
+@@ -1,3 +1,59 @@
++2001-01-05 matthew green (mrg@eterna.com.au)
++
++ 1999/08/02 Jakub Jelinek <jj@ultra.linux.cz>
++ * config/sparc/sparc.h (ASM_DECLARE_REGISTER_GLOBAL): New macro.
++ (RTX_OK_FOR_OLO10): Likewise.
++ (GO_IF_LEGITIMATE_ADDRESS): If assembler supports offsetable
++ %lo(), allow it in addresses...
++ (PRINT_OPERAND_ADDRESS): ... and print it appropriately.
++ * config/sparc/sparc.md (sethi_di_medlow_embmedany_pic): sethi %lo()
++ does not make sense.
++ * config/sparc/sparc.c (sparc_hard_reg_printed): New array.
++ (sparc_output_scratch_registers): New function.
++ (output_function_prologue, sparc_flat_output_function_prologue): Use
++ it.
++ * varasm.c (make_decl_rtl): Use ASM_DECLARE_REGISTER_GLOBAL if
++ defined.
++ * tm.texi (ASM_DECLARE_REGISTER_GLOBAL): Document it.
++
++2001-01-05 matthew green (mrg@eterna.com.au)
++
++ 1999/07/30 Jakub Jelinek <jj@ultra.linux.cz>
++ * config/sparc/sparc.md (cmp_mul_set, cmp_udiv_cc_set):
++ Fix patterns so that they actually match.
++ (cmp_sdiv_cc_set): Ditto, also don't require g0 to be zero.
++ (mulsidi3_sp64, const_mulsidi3_sp64): New patterns.
++ (const_mulsidi3_sp32): Renamed from const_mulsidi3, only on
++ TARGET_HARD_MUL32.
++ (mulsidi3): Reflect this in the expand.
++ (smulsi3_highpart): Only on TARGET_ARCH32.
++ (umulsidi3_sp64, const_umulsidi3_sp64): New patterns.
++ (const_umulsidi3_sp32): Renamed from const_umulsidi3.
++ (umulsidi3): Reflect this in the expand.
++ (umulsi3_highpart): Only on TARGET_ARCH32.
++ (divsi3_sp32): Renamed from divsi3, only on TARGET_ARCH32,
++ don't require g0 to be zero.
++ (udivsi3_sp32): Renamed from udivsi3, only on TARGET_ARCH32.
++ ({,u}divsi3): New expands.
++ ({,u}divsi3_sp64): New patterns.
++ (after lshrdi3_v8plus): Four new patterns to help combiner
++ optimizing nested mixed mode shifts.
++
++ * config/sparc/sparc.c (sparc_override_options): Use deprecated
++ v8 instructions if optimizing for UltraSPARC I, II, IIi, as it
++ speed things up. Don't use them by default on plain v9 in 64bit
++ mode, according to what SPAMv9 sais.
++
++ * config/sparc/sparc.h: Fix comments, e.g. Linux already preserves
++ top 32 bits of %[og][0-7] in signal handlers.
++ Also, TARGET_HARD_MUL32 now is only true for TARGET_ARCH32.
++
++2001-01-03 matthew green (mrg@eterna.com.au)
++
++ 1999-12-14 Jakub Jelinek <jakub@redhat.com>
++ * config/sparc/sparc.c (sparc_override_options): Allow block
++ profiling with -m32.
++
+ Fri Mar 16 12:46:19 GMT 2001 Bernd Schmidt (bernds@redhat.com)
+
+ * gcc-2.95.3 Released.
diff --git a/lang/gcc/patches/patch-bl b/lang/gcc/patches/patch-bl
new file mode 100644
index 00000000000..29edfb92b14
--- /dev/null
+++ b/lang/gcc/patches/patch-bl
@@ -0,0 +1,189 @@
+$NetBSD: patch-bl,v 1.1 2002/01/03 20:40:46 tron Exp $
+
+--- ../gcc-2.95.3/gcc/Makefile.in.orig Thu Jan 25 15:02:58 2001
++++ ../gcc-2.95.3/gcc/Makefile.in Thu Jan 3 20:37:54 2002
+@@ -41,7 +41,7 @@
+ # Selection of languages to be made.
+ # This is overridden by configure.
+ CONFIG_LANGUAGES = @all_languages@
+-LANGUAGES = c proto gcov$(exeext) $(CONFIG_LANGUAGES)
++LANGUAGES = c gcov$(exeext) $(CONFIG_LANGUAGES)
+
+ # Languages should create dependencies of $(INTL_TARGETS) on generated
+ # sources in Make-lang.in. Example:
+@@ -802,27 +802,6 @@
+ LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.run
+ rm -f config.run
+
+-$(srcdir)/configure: $(srcdir)/configure.in
+- cd $(srcdir); autoconf
+-
+-# cstamp-h.in controls rebuilding of config.in.
+-# It is named cstamp-h.in and not stamp-h.in so the mostlyclean rule doesn't
+-# delete it. A stamp file is needed as autoheader won't update the file if
+-# nothing has changed.
+-# It remains in the source directory and is part of the distribution.
+-# This follows what is done in shellutils, fileutils, etc.
+-# "echo timestamp" is used instead of touch to be consistent with other
+-# packages that use autoconf (??? perhaps also to avoid problems with patch?).
+-# ??? Newer versions have a maintainer mode that may be useful here.
+-$(srcdir)/config.in: $(srcdir)/cstamp-h.in
+-$(srcdir)/cstamp-h.in: $(srcdir)/configure.in $(srcdir)/acconfig.h
+- cd $(srcdir) && autoheader
+- @rm -f $(srcdir)/cstamp-h.in
+- echo timestamp > $(srcdir)/cstamp-h.in
+-auto-host.h: cstamp-h ; @true
+-cstamp-h: config.in config.status
+- CONFIG_HEADERS=auto-host.h:config.in LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.status
+-
+ # Really, really stupid make features, such as SUN's KEEP_STATE, may force
+ # a target to build even if it is up-to-date. So we must verify that
+ # config.status does not exist before failing.
+@@ -1185,7 +1164,7 @@
+ "$(MULTILIB_MATCHES)" \
+ "$(MULTILIB_EXCEPTIONS)" \
+ "$(MULTILIB_EXTRA_OPTS)" > tmp-mlib.h
+- $(srcdir)/move-if-change tmp-mlib.h multilib.h
++ sh $(srcdir)/move-if-change tmp-mlib.h multilib.h
+ touch s-mlib
+
+ # Build multiple copies of libgcc.a, one for each target switch.
+@@ -1331,12 +1310,12 @@
+ sed -e "/^ifobjc$$/,/^end ifobjc$$/d" \
+ -e "/^ifc$$/d" -e "/^end ifc$$/d" \
+ $(srcdir)/c-parse.in >>tmp-c-parse.y
+- $(srcdir)/move-if-change tmp-c-parse.y $(srcdir)/c-parse.y
++ sh $(srcdir)/move-if-change tmp-c-parse.y $(srcdir)/c-parse.y
+
+ $(srcdir)/c-gperf.h: c-parse.gperf
+ gperf -L C -F ', 0, 0' -p -j1 -i 1 -g -o -t -G -N is_reserved_word \
+ -k1,3,$$ $(srcdir)/c-parse.gperf >tmp-gperf.h
+- $(srcdir)/move-if-change tmp-gperf.h $(srcdir)/c-gperf.h
++ sh $(srcdir)/move-if-change tmp-gperf.h $(srcdir)/c-gperf.h
+
+ c-decl.o : c-decl.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h flags.h \
+ output.h toplev.h
+@@ -1396,7 +1375,7 @@
+ else \
+ echo "int prepends_underscore = 0;" >>tmp-under.c; \
+ fi
+- $(srcdir)/move-if-change tmp-under.c underscore.c
++ sh $(srcdir)/move-if-change tmp-under.c underscore.c
+ -rm -f tmp-dum.c tmp-dum.s
+ touch s-under
+
+@@ -1425,7 +1404,7 @@
+ tree-check.h: s-check ; @true
+ s-check : gencheck $(srcdir)/move-if-change
+ ./gencheck > tmp-check.h
+- $(srcdir)/move-if-change tmp-check.h tree-check.h
++ sh $(srcdir)/move-if-change tmp-check.h tree-check.h
+ touch s-check
+
+ gencheck : gencheck.o $(lang_tree_files) $(HOST_LIBDEPS)
+@@ -1650,19 +1629,19 @@
+ insn-config.h: s-config ; @true
+ s-config : $(md_file) genconfig $(srcdir)/move-if-change
+ ./genconfig $(md_file) > tmp-config.h
+- $(srcdir)/move-if-change tmp-config.h insn-config.h
++ sh $(srcdir)/move-if-change tmp-config.h insn-config.h
+ touch s-config
+
+ insn-flags.h: s-flags ; @true
+ s-flags : $(md_file) genflags $(srcdir)/move-if-change
+ ./genflags $(md_file) > tmp-flags.h
+- $(srcdir)/move-if-change tmp-flags.h insn-flags.h
++ sh $(srcdir)/move-if-change tmp-flags.h insn-flags.h
+ touch s-flags
+
+ insn-codes.h: s-codes ; @true
+ s-codes : $(md_file) gencodes $(srcdir)/move-if-change
+ ./gencodes $(md_file) > tmp-codes.h
+- $(srcdir)/move-if-change tmp-codes.h insn-codes.h
++ sh $(srcdir)/move-if-change tmp-codes.h insn-codes.h
+ touch s-codes
+
+ insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) $(EXPR_H) real.h output.h \
+@@ -1672,7 +1651,7 @@
+ insn-emit.c: s-emit ; @true
+ s-emit : $(md_file) genemit $(srcdir)/move-if-change
+ ./genemit $(md_file) > tmp-emit.c
+- $(srcdir)/move-if-change tmp-emit.c insn-emit.c
++ sh $(srcdir)/move-if-change tmp-emit.c insn-emit.c
+ touch s-emit
+
+ insn-recog.o : insn-recog.c $(CONFIG_H) $(RTL_H) insn-config.h $(RECOG_H) \
+@@ -1682,7 +1661,7 @@
+ insn-recog.c: s-recog ; @true
+ s-recog : $(md_file) genrecog $(srcdir)/move-if-change
+ ./genrecog $(md_file) > tmp-recog.c
+- $(srcdir)/move-if-change tmp-recog.c insn-recog.c
++ sh $(srcdir)/move-if-change tmp-recog.c insn-recog.c
+ touch s-recog
+
+ insn-opinit.o : insn-opinit.c $(CONFIG_H) $(RTL_H) insn-codes.h insn-flags.h \
+@@ -1692,7 +1671,7 @@
+ insn-opinit.c: s-opinit ; @true
+ s-opinit : $(md_file) genopinit $(srcdir)/move-if-change
+ ./genopinit $(md_file) > tmp-opinit.c
+- $(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
++ sh $(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
+ touch s-opinit
+
+ insn-extract.o : insn-extract.c $(CONFIG_H) $(RTL_H) system.h toplev.h \
+@@ -1702,7 +1681,7 @@
+ insn-extract.c: s-extract ; @true
+ s-extract : $(md_file) genextract $(srcdir)/move-if-change
+ ./genextract $(md_file) > tmp-extract.c
+- $(srcdir)/move-if-change tmp-extract.c insn-extract.c
++ sh $(srcdir)/move-if-change tmp-extract.c insn-extract.c
+ touch s-extract
+
+ insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) $(REGS_H) output.h real.h \
+@@ -1712,7 +1691,7 @@
+ insn-peep.c: s-peep ; @true
+ s-peep : $(md_file) genpeep $(srcdir)/move-if-change
+ ./genpeep $(md_file) > tmp-peep.c
+- $(srcdir)/move-if-change tmp-peep.c insn-peep.c
++ sh $(srcdir)/move-if-change tmp-peep.c insn-peep.c
+ touch s-peep
+
+ insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h \
+@@ -1722,7 +1701,7 @@
+ insn-attr.h: s-attr ; @true
+ s-attr : $(md_file) genattr $(srcdir)/move-if-change
+ ./genattr $(md_file) > tmp-attr.h
+- $(srcdir)/move-if-change tmp-attr.h insn-attr.h
++ sh $(srcdir)/move-if-change tmp-attr.h insn-attr.h
+ touch s-attr
+
+ insn-attrtab.c: s-attrtab ; @true
+@@ -1734,7 +1713,7 @@
+ else \
+ ./genattrtab $(md_file) > tmp-attrtab.c; \
+ fi
+- $(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
++ sh $(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
+ touch s-attrtab
+
+ insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) $(REGS_H) real.h conditions.h \
+@@ -1745,7 +1724,7 @@
+ insn-output.c: s-output ; @true
+ s-output : $(md_file) genoutput $(srcdir)/move-if-change
+ ./genoutput $(md_file) > tmp-output.c
+- $(srcdir)/move-if-change tmp-output.c insn-output.c
++ sh $(srcdir)/move-if-change tmp-output.c insn-output.c
+ touch s-output
+
+ genrtl.o : genrtl.c $(CONFIG_H) $(RTL_H) system.h
+@@ -1754,8 +1733,8 @@
+
+ s-genrtl: gengenrtl $(srcdir)/move-if-change $(RTL_BASE_H)
+ ./gengenrtl tmp-genrtl.h tmp-genrtl.c
+- $(srcdir)/move-if-change tmp-genrtl.h genrtl.h
+- $(srcdir)/move-if-change tmp-genrtl.c genrtl.c
++ sh $(srcdir)/move-if-change tmp-genrtl.h genrtl.h
++ sh $(srcdir)/move-if-change tmp-genrtl.c genrtl.c
+ touch s-genrtl
+
+ #
diff --git a/lang/gcc/patches/patch-bm b/lang/gcc/patches/patch-bm
new file mode 100644
index 00000000000..3aee81a23e6
--- /dev/null
+++ b/lang/gcc/patches/patch-bm
@@ -0,0 +1,44 @@
+$NetBSD: patch-bm,v 1.1 2002/01/03 20:40:46 tron Exp $
+
+--- ../gcc-2.95.3/gcc/c-common.c.orig Tue Sep 7 10:11:16 1999
++++ ../gcc-2.95.3/gcc/c-common.c Thu Jan 3 20:37:54 2002
+@@ -1132,7 +1132,7 @@
+ { "D", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "2" },
+ { "g", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "2O-_0w" },
+ { "cx", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "3E" },
+- { "%RTXnrt", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "" },
++ { "%FRTXnrt", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "" },
+ { "P", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "G" },
+ { "HIMSUWdemw", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0Ow" },
+ { "Vju", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0Oow" },
+@@ -1398,7 +1398,8 @@
+
+ if (integer_zerop (format_tree))
+ {
+- warning ("null format string");
++ if (pedantic)
++ warning ("null format string");
+ return;
+ }
+ if (TREE_CODE (format_tree) != ADDR_EXPR)
+@@ -1432,8 +1433,6 @@
+ {
+ if (format_chars - TREE_STRING_POINTER (format_tree) != format_length)
+ warning ("embedded `\\0' in format");
+- if (info->first_arg_num != 0 && params != 0 && ! has_operand_number)
+- warning ("too many arguments for format");
+ return;
+ }
+ if (*format_chars++ != '%')
+@@ -1722,11 +1721,6 @@
+ }
+ if (wide && index (fci->flag_chars, 'w') == 0)
+ warning ("width used with `%c' format", format_char);
+- if (index (fci->flag_chars, '2') != 0)
+- warning ("`%%%c' yields only last 2 digits of year", format_char);
+- else if (index (fci->flag_chars, '3') != 0)
+- warning ("`%%%c' yields only last 2 digits of year in some locales",
+- format_char);
+ if (precise && index (fci->flag_chars, 'p') == 0)
+ warning ("precision used with `%c' format", format_char);
+ if (aflag && index (fci->flag_chars, 'a') == 0)
diff --git a/lang/gcc/patches/patch-bn b/lang/gcc/patches/patch-bn
new file mode 100644
index 00000000000..8e7978924a2
--- /dev/null
+++ b/lang/gcc/patches/patch-bn
@@ -0,0 +1,15 @@
+$NetBSD: patch-bn,v 1.1 2002/01/03 20:40:47 tron Exp $
+
+--- ../gcc-2.95.3/gcc/c-decl.c.orig Thu Jan 25 15:02:59 2001
++++ ../gcc-2.95.3/gcc/c-decl.c Thu Jan 3 20:37:54 2002
+@@ -811,6 +811,10 @@
+ warn_traditional = 0;
+ else if (!strcmp (p, "-Wformat"))
+ warn_format = 1;
++ else if (!strcmp (p, "-Wno-format-y2k"))
++ { /* XXX: NetBSD compatibility until next gcc release */ }
++ else if (!strcmp (p, "-Wno-format-extra-args"))
++ { /* XXX: NetBSD compatibility until next gcc release */ }
+ else if (!strcmp (p, "-Wno-format"))
+ warn_format = 0;
+ else if (!strcmp (p, "-Wchar-subscripts"))
diff --git a/lang/gcc/patches/patch-bo b/lang/gcc/patches/patch-bo
new file mode 100644
index 00000000000..8024968adbb
--- /dev/null
+++ b/lang/gcc/patches/patch-bo
@@ -0,0 +1,443 @@
+$NetBSD: patch-bo,v 1.1 2002/01/03 20:40:47 tron Exp $
+
+--- ../gcc-2.95.3/gcc/c-parse.c.orig Tue Apr 27 00:35:53 1999
++++ ../gcc-2.95.3/gcc/c-parse.c Thu Jan 3 20:37:54 2002
+@@ -1,69 +1,68 @@
+
+ /* A Bison parser, made from c-parse.y
+- by GNU Bison version 1.25
+- */
++ by GNU Bison version 1.28 */
+
+ #define YYBISON 1 /* Identify Bison output. */
+
+-#define IDENTIFIER 258
+-#define TYPENAME 259
+-#define SCSPEC 260
+-#define TYPESPEC 261
+-#define TYPE_QUAL 262
+-#define CONSTANT 263
+-#define STRING 264
+-#define ELLIPSIS 265
+-#define SIZEOF 266
+-#define ENUM 267
+-#define STRUCT 268
+-#define UNION 269
+-#define IF 270
+-#define ELSE 271
+-#define WHILE 272
+-#define DO 273
+-#define FOR 274
+-#define SWITCH 275
+-#define CASE 276
+-#define DEFAULT 277
+-#define BREAK 278
+-#define CONTINUE 279
+-#define RETURN 280
+-#define GOTO 281
+-#define ASM_KEYWORD 282
+-#define TYPEOF 283
+-#define ALIGNOF 284
+-#define ATTRIBUTE 285
+-#define EXTENSION 286
+-#define LABEL 287
+-#define REALPART 288
+-#define IMAGPART 289
+-#define ASSIGN 290
+-#define OROR 291
+-#define ANDAND 292
+-#define EQCOMPARE 293
+-#define ARITHCOMPARE 294
+-#define LSHIFT 295
+-#define RSHIFT 296
+-#define UNARY 297
+-#define PLUSPLUS 298
+-#define MINUSMINUS 299
+-#define HYPERUNARY 300
+-#define POINTSAT 301
+-#define INTERFACE 302
+-#define IMPLEMENTATION 303
+-#define END 304
+-#define SELECTOR 305
+-#define DEFS 306
+-#define ENCODE 307
+-#define CLASSNAME 308
+-#define PUBLIC 309
+-#define PRIVATE 310
+-#define PROTECTED 311
+-#define PROTOCOL 312
+-#define OBJECTNAME 313
+-#define CLASS 314
+-#define ALIAS 315
+-#define OBJC_STRING 316
++#define IDENTIFIER 257
++#define TYPENAME 258
++#define SCSPEC 259
++#define TYPESPEC 260
++#define TYPE_QUAL 261
++#define CONSTANT 262
++#define STRING 263
++#define ELLIPSIS 264
++#define SIZEOF 265
++#define ENUM 266
++#define STRUCT 267
++#define UNION 268
++#define IF 269
++#define ELSE 270
++#define WHILE 271
++#define DO 272
++#define FOR 273
++#define SWITCH 274
++#define CASE 275
++#define DEFAULT 276
++#define BREAK 277
++#define CONTINUE 278
++#define RETURN 279
++#define GOTO 280
++#define ASM_KEYWORD 281
++#define TYPEOF 282
++#define ALIGNOF 283
++#define ATTRIBUTE 284
++#define EXTENSION 285
++#define LABEL 286
++#define REALPART 287
++#define IMAGPART 288
++#define ASSIGN 289
++#define OROR 290
++#define ANDAND 291
++#define EQCOMPARE 292
++#define ARITHCOMPARE 293
++#define LSHIFT 294
++#define RSHIFT 295
++#define UNARY 296
++#define PLUSPLUS 297
++#define MINUSMINUS 298
++#define HYPERUNARY 299
++#define POINTSAT 300
++#define INTERFACE 301
++#define IMPLEMENTATION 302
++#define END 303
++#define SELECTOR 304
++#define DEFS 305
++#define ENCODE 306
++#define CLASSNAME 307
++#define PUBLIC 308
++#define PRIVATE 309
++#define PROTECTED 310
++#define PROTOCOL 311
++#define OBJECTNAME 312
++#define CLASS 313
++#define ALIAS 314
++#define OBJC_STRING 315
+
+ #line 56 "c-parse.y"
+
+@@ -138,7 +137,7 @@
+ #define YYFLAG -32768
+ #define YYNTBASE 84
+
+-#define YYTRANSLATE(x) ((unsigned)(x) <= 316 ? yytranslate[x] : 241)
++#define YYTRANSLATE(x) ((unsigned)(x) <= 315 ? yytranslate[x] : 241)
+
+ static const char yytranslate[] = { 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+@@ -166,13 +165,13 @@
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+- 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
+- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+- 39, 40, 44, 45, 46, 47, 53, 54, 55, 56,
+- 57, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+- 70, 71, 72, 73, 74, 75
++ 2, 2, 2, 2, 2, 1, 3, 4, 5, 6,
++ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
++ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
++ 27, 28, 29, 30, 31, 32, 33, 34, 35, 39,
++ 40, 44, 45, 46, 47, 53, 54, 55, 56, 57,
++ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
++ 71, 72, 73, 74, 75
+ };
+
+ #if YYDEBUG != 0
+@@ -1205,7 +1204,8 @@
+ 50, 51, 52
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+-#line 3 "/usr/lib/bison.simple"
++#line 3 "/usr/pkg/share/bison.simple"
++/* This file comes from bison-1.28. */
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+@@ -1222,46 +1222,66 @@
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
++ Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
+
+ /* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+-#ifndef alloca
++/* This is the parser code that is written into each bison parser
++ when the %semantic_parser declaration is not specified in the grammar.
++ It was written by Richard Stallman by simplifying the hairy parser
++ used when %semantic_parser is specified. */
++
++#ifndef YYSTACK_USE_ALLOCA
++#ifdef alloca
++#define YYSTACK_USE_ALLOCA
++#else /* alloca not defined */
+ #ifdef __GNUC__
++#define YYSTACK_USE_ALLOCA
+ #define alloca __builtin_alloca
+ #else /* not GNU C. */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
++#define YYSTACK_USE_ALLOCA
+ #include <alloca.h>
+ #else /* not sparc */
+-#if defined (MSDOS) && !defined (__TURBOC__)
++/* We think this test detects Watcom and Microsoft C. */
++/* This used to test MSDOS, but that is a bad idea
++ since that symbol is in the user namespace. */
++#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
++#if 0 /* No need for malloc.h, which pollutes the namespace;
++ instead, just don't use alloca. */
+ #include <malloc.h>
++#endif
+ #else /* not MSDOS, or __TURBOC__ */
+ #if defined(_AIX)
+-#include <malloc.h>
++/* I don't know what this was needed for, but it pollutes the namespace.
++ So I turned it off. rms, 2 May 1997. */
++/* #include <malloc.h> */
+ #pragma alloca
+-#else /* not MSDOS, __TURBOC__, or _AIX */
+-#ifdef __hpux
+-#ifdef __cplusplus
+-extern "C" {
+-void *alloca (unsigned int);
+-};
+-#else /* not __cplusplus */
+-void *alloca ();
+-#endif /* not __cplusplus */
++#define YYSTACK_USE_ALLOCA
++#else /* not MSDOS, or __TURBOC__, or _AIX */
++#if 0
++#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
++ and on HPUX 10. Eventually we can turn this on. */
++#define YYSTACK_USE_ALLOCA
++#define alloca __builtin_alloca
+ #endif /* __hpux */
++#endif
+ #endif /* not _AIX */
+ #endif /* not MSDOS, or __TURBOC__ */
+-#endif /* not sparc. */
+-#endif /* not GNU C. */
+-#endif /* alloca not defined. */
++#endif /* not sparc */
++#endif /* not GNU C */
++#endif /* alloca not defined */
++#endif /* YYSTACK_USE_ALLOCA not defined */
+
+-/* This is the parser code that is written into each bison parser
+- when the %semantic_parser declaration is not specified in the grammar.
+- It was written by Richard Stallman by simplifying the hairy parser
+- used when %semantic_parser is specified. */
++#ifdef YYSTACK_USE_ALLOCA
++#define YYSTACK_ALLOC alloca
++#else
++#define YYSTACK_ALLOC malloc
++#endif
+
+ /* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+@@ -1271,8 +1291,8 @@
+ #define yyclearin (yychar = YYEMPTY)
+ #define YYEMPTY -2
+ #define YYEOF 0
+-#define YYACCEPT return(0)
+-#define YYABORT return(1)
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
+ #define YYERROR goto yyerrlab1
+ /* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+@@ -1353,12 +1373,12 @@
+ #ifndef YYMAXDEPTH
+ #define YYMAXDEPTH 10000
+ #endif
+-
+-/* Prevent warning if -Wstrict-prototypes. */
+-#ifdef __GNUC__
+-int yyparse (void);
+-#endif
+
++/* Define __yy_memcpy. Note that the size argument
++ should be passed with type unsigned int, because that is what the non-GCC
++ definitions require. With GCC, __builtin_memcpy takes an arg
++ of type size_t, but it can handle unsigned int. */
++
+ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+ #else /* not GNU C or C++ */
+@@ -1370,7 +1390,7 @@
+ __yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+- int count;
++ unsigned int count;
+ {
+ register char *f = from;
+ register char *t = to;
+@@ -1385,10 +1405,10 @@
+ /* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+ static void
+-__yy_memcpy (char *to, char *from, int count)
++__yy_memcpy (char *to, char *from, unsigned int count)
+ {
+- register char *f = from;
+ register char *t = to;
++ register char *f = from;
+ register int i = count;
+
+ while (i-- > 0)
+@@ -1398,7 +1418,7 @@
+ #endif
+ #endif
+
+-#line 196 "/usr/lib/bison.simple"
++#line 217 "/usr/pkg/share/bison.simple"
+
+ /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+@@ -1419,6 +1439,15 @@
+ #define YYPARSE_PARAM_DECL
+ #endif /* not YYPARSE_PARAM */
+
++/* Prevent warning if -Wstrict-prototypes. */
++#ifdef __GNUC__
++#ifdef YYPARSE_PARAM
++int yyparse (void *);
++#else
++int yyparse (void);
++#endif
++#endif
++
+ int
+ yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+@@ -1447,6 +1476,7 @@
+ #endif
+
+ int yystacksize = YYINITDEPTH;
++ int yyfree_stacks = 0;
+
+ #ifdef YYPURE
+ int yychar;
+@@ -1531,18 +1561,32 @@
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+- yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+- __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+- yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+- __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
++#ifndef YYSTACK_USE_ALLOCA
++ yyfree_stacks = 1;
++#endif
++ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
++ __yy_memcpy ((char *)yyss, (char *)yyss1,
++ size * (unsigned int) sizeof (*yyssp));
++ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
++ __yy_memcpy ((char *)yyvs, (char *)yyvs1,
++ size * (unsigned int) sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+- yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+- __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
++ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
++ __yy_memcpy ((char *)yyls, (char *)yyls1,
++ size * (unsigned int) sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+
+@@ -3745,7 +3789,7 @@
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+-#line 498 "/usr/lib/bison.simple"
++#line 543 "/usr/pkg/share/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+@@ -3817,7 +3861,7 @@
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+- x < (sizeof(yytname) / sizeof(char *)); x++)
++ x < (int)(sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+@@ -3829,7 +3873,7 @@
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+- x < (sizeof(yytname) / sizeof(char *)); x++)
++ x < (int)(sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+@@ -3940,6 +3984,30 @@
+
+ yystate = yyn;
+ goto yynewstate;
++
++ yyacceptlab:
++ /* YYACCEPT comes here. */
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 0;
++
++ yyabortlab:
++ /* YYABORT comes here. */
++ if (yyfree_stacks)
++ {
++ free (yyss);
++ free (yyvs);
++#ifdef YYLSP_NEEDED
++ free (yyls);
++#endif
++ }
++ return 1;
+ }
+ #line 2238 "c-parse.y"
+
diff --git a/lang/gcc/patches/patch-bp b/lang/gcc/patches/patch-bp
new file mode 100644
index 00000000000..9c1538526d8
--- /dev/null
+++ b/lang/gcc/patches/patch-bp
@@ -0,0 +1,128 @@
+$NetBSD: patch-bp,v 1.1 2002/01/03 20:40:47 tron Exp $
+
+--- ../gcc-2.95.3/gcc/c-parse.h.orig Fri Mar 16 15:13:48 2001
++++ ../gcc-2.95.3/gcc/c-parse.h Thu Jan 3 20:37:54 2002
+@@ -1,64 +1,64 @@
+ typedef union {long itype; tree ttype; enum tree_code code;
+ char *filename; int lineno; int ends_in_label; } YYSTYPE;
+-#define IDENTIFIER 258
+-#define TYPENAME 259
+-#define SCSPEC 260
+-#define TYPESPEC 261
+-#define TYPE_QUAL 262
+-#define CONSTANT 263
+-#define STRING 264
+-#define ELLIPSIS 265
+-#define SIZEOF 266
+-#define ENUM 267
+-#define STRUCT 268
+-#define UNION 269
+-#define IF 270
+-#define ELSE 271
+-#define WHILE 272
+-#define DO 273
+-#define FOR 274
+-#define SWITCH 275
+-#define CASE 276
+-#define DEFAULT 277
+-#define BREAK 278
+-#define CONTINUE 279
+-#define RETURN 280
+-#define GOTO 281
+-#define ASM_KEYWORD 282
+-#define TYPEOF 283
+-#define ALIGNOF 284
+-#define ATTRIBUTE 285
+-#define EXTENSION 286
+-#define LABEL 287
+-#define REALPART 288
+-#define IMAGPART 289
+-#define ASSIGN 290
+-#define OROR 291
+-#define ANDAND 292
+-#define EQCOMPARE 293
+-#define ARITHCOMPARE 294
+-#define LSHIFT 295
+-#define RSHIFT 296
+-#define UNARY 297
+-#define PLUSPLUS 298
+-#define MINUSMINUS 299
+-#define HYPERUNARY 300
+-#define POINTSAT 301
+-#define INTERFACE 302
+-#define IMPLEMENTATION 303
+-#define END 304
+-#define SELECTOR 305
+-#define DEFS 306
+-#define ENCODE 307
+-#define CLASSNAME 308
+-#define PUBLIC 309
+-#define PRIVATE 310
+-#define PROTECTED 311
+-#define PROTOCOL 312
+-#define OBJECTNAME 313
+-#define CLASS 314
+-#define ALIAS 315
+-#define OBJC_STRING 316
++#define IDENTIFIER 257
++#define TYPENAME 258
++#define SCSPEC 259
++#define TYPESPEC 260
++#define TYPE_QUAL 261
++#define CONSTANT 262
++#define STRING 263
++#define ELLIPSIS 264
++#define SIZEOF 265
++#define ENUM 266
++#define STRUCT 267
++#define UNION 268
++#define IF 269
++#define ELSE 270
++#define WHILE 271
++#define DO 272
++#define FOR 273
++#define SWITCH 274
++#define CASE 275
++#define DEFAULT 276
++#define BREAK 277
++#define CONTINUE 278
++#define RETURN 279
++#define GOTO 280
++#define ASM_KEYWORD 281
++#define TYPEOF 282
++#define ALIGNOF 283
++#define ATTRIBUTE 284
++#define EXTENSION 285
++#define LABEL 286
++#define REALPART 287
++#define IMAGPART 288
++#define ASSIGN 289
++#define OROR 290
++#define ANDAND 291
++#define EQCOMPARE 292
++#define ARITHCOMPARE 293
++#define LSHIFT 294
++#define RSHIFT 295
++#define UNARY 296
++#define PLUSPLUS 297
++#define MINUSMINUS 298
++#define HYPERUNARY 299
++#define POINTSAT 300
++#define INTERFACE 301
++#define IMPLEMENTATION 302
++#define END 303
++#define SELECTOR 304
++#define DEFS 305
++#define ENCODE 306
++#define CLASSNAME 307
++#define PUBLIC 308
++#define PRIVATE 309
++#define PROTECTED 310
++#define PROTOCOL 311
++#define OBJECTNAME 312
++#define CLASS 313
++#define ALIAS 314
++#define OBJC_STRING 315
+
+
+ extern YYSTYPE yylval;
diff --git a/lang/gcc/patches/patch-bq b/lang/gcc/patches/patch-bq
new file mode 100644
index 00000000000..b41d4b08d85
--- /dev/null
+++ b/lang/gcc/patches/patch-bq
@@ -0,0 +1,126 @@
+$NetBSD: patch-bq,v 1.1 2002/01/03 20:40:47 tron Exp $
+
+--- ../gcc-2.95.3/gcc/cccp.c.orig Thu Jan 25 15:03:00 2001
++++ ../gcc-2.95.3/gcc/cccp.c Thu Jan 3 20:37:54 2002
+@@ -2779,7 +2779,8 @@
+ RECACHE;
+ continue;
+ }
+- if (!traditional) {
++ if (!(traditional || put_out_comments))
++ {
+ error_with_line (line_for_error (start_line),
+ "unterminated string or character constant");
+ if (multiline_string_line) {
+@@ -2797,7 +2798,8 @@
+ ++op->lineno;
+ /* Traditionally, end of line ends a string constant with no error.
+ So exit the loop and record the new line. */
+- if (traditional) {
++ if (traditional || put_out_comments)
++ {
+ beg_of_line = ibp;
+ goto while2end;
+ }
+@@ -2868,7 +2870,7 @@
+ break;
+
+ case '/':
+- if (ip->macro != 0)
++ if (ip->macro != 0 && put_out_comments == 0)
+ goto randomchar;
+ if (*ibp == '\\' && ibp[1] == '\n')
+ newline_fix (ibp);
+@@ -3777,7 +3779,8 @@
+ limit = ip->buf + ip->length;
+ unterminated = 0;
+ already_output = 0;
+- keep_comments = traditional && kt->type == T_DEFINE;
++ keep_comments = kt->type == T_DEFINE && (traditional ||
++ put_out_comments);
+ /* #import is defined only in Objective C, or when on the NeXT. */
+ if (kt->type == T_IMPORT
+ && !(objc || lookup ((U_CHAR *) "__NeXT__", -1, -1)))
+@@ -4025,7 +4028,7 @@
+ while (xp != ip->bufp)
+ *cp++ = *xp++;
+ /* Delete or replace the slash. */
+- else if (traditional)
++ else if (traditional || put_out_comments)
+ cp--;
+ else
+ cp[-1] = ' ';
+@@ -6208,6 +6211,20 @@
+ stringify = p;
+ }
+ break;
++ case '/':
++ if (expected_delimiter != '\0') /* No comments inside strings. */
++ break;
++ if (*p == '*') {
++ while (p < limit) {
++ *exp_p++ = *p++;
++ if (p[0] == '*' && p[1] == '/') {
++ *exp_p++ = *p++;
++ *exp_p++ = *p++;
++ break;
++ }
++ }
++ }
++ break;
+ }
+ } else {
+ /* In -traditional mode, recognize arguments inside strings and
+@@ -6240,11 +6257,22 @@
+ /* If we find a comment that wasn't removed by handle_directive,
+ this must be -traditional. So replace the comment with
+ nothing at all. */
+- exp_p--;
+- while (++p < limit) {
+- if (p[0] == '*' && p[1] == '/') {
+- p += 2;
+- break;
++ if (!put_out_comments) {
++ exp_p--;
++ while (++p < limit) {
++ if (p[0] == '*' && p[1] == '/') {
++ p += 2;
++ break;
++ }
++ }
++ } else {
++ while (p < limit) {
++ *exp_p++ = *p++;
++ if (p[0] == '*' && p[1] == '/') {
++ *exp_p++ = *p++;
++ *exp_p++ = *p++;
++ break;
++ }
+ }
+ }
+ #if 0
+@@ -7243,6 +7271,24 @@
+ pcp_inside_if = 0;
+ delete_macro (save_defined); /* clean up special symbol */
+
++ if (put_out_comments) {
++ char *ptr, *eptr = temp_obuf.buf + temp_obuf.length;
++
++ for (ptr = temp_obuf.buf; ptr < eptr; ptr++) {
++ if (*ptr == '/' && ptr + 1 < eptr && ptr[1] == '*') {
++ *ptr++ = ' ';
++ *ptr++ = ' ';
++ while (ptr < eptr) {
++ if (*ptr == '*' && ptr + 1 < eptr && ptr[1] == '/') {
++ *ptr++ = ' ';
++ *ptr++ = ' ';
++ break;
++ } else
++ *ptr++ = ' ';
++ }
++ }
++ }
++ }
+ temp_obuf.buf[temp_obuf.length] = '\n';
+ value = parse_c_expression ((char *) temp_obuf.buf,
+ warn_undef && !instack[indepth].system_header_p);
diff --git a/lang/gcc/patches/patch-br b/lang/gcc/patches/patch-br
new file mode 100644
index 00000000000..21956d885b8
--- /dev/null
+++ b/lang/gcc/patches/patch-br
@@ -0,0 +1,12 @@
+$NetBSD: patch-br,v 1.1 2002/01/03 20:40:47 tron Exp $
+
+--- ../gcc-2.95.3/gcc/collect2.c.orig Thu Jan 25 15:03:01 2001
++++ ../gcc-2.95.3/gcc/collect2.c Thu Jan 3 20:37:54 2002
+@@ -54,7 +54,6 @@
+ #define obstack_chunk_alloc xmalloc
+ #define obstack_chunk_free free
+
+-extern char *make_temp_file PROTO ((char *));
+
+ /* On certain systems, we have code that works by scanning the object file
+ directly. But this code uses system-specific header files and library
diff --git a/lang/gcc/patches/patch-bs b/lang/gcc/patches/patch-bs
new file mode 100644
index 00000000000..fc31ed5b246
--- /dev/null
+++ b/lang/gcc/patches/patch-bs
@@ -0,0 +1,974 @@
+$NetBSD: patch-bs,v 1.1 2002/01/03 20:40:48 tron Exp $
+
+--- ../gcc-2.95.3/gcc/configure.orig Fri Mar 16 15:13:48 2001
++++ ../gcc-2.95.3/gcc/configure Thu Jan 3 20:37:55 2002
+@@ -1311,7 +1311,7 @@
+ fi
+
+ # Find some useful tools
+-for ac_prog in gawk mawk nawk awk
++for ac_prog in mawk gawk nawk awk
+ do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+ set dummy $ac_prog; ac_word=$2
+@@ -2944,6 +2944,9 @@
+ pyramid-*-*)
+ cpu_type=pyr
+ ;;
++ sh*-*-*)
++ cpu_type=sh
++ ;;
+ sparc*-*-*)
+ cpu_type=sparc
+ ;;
+@@ -2952,11 +2955,20 @@
+ tm_file=${cpu_type}/${cpu_type}.h
+ xm_file=${cpu_type}/xm-${cpu_type}.h
+
+- # Common parts for linux-gnu and openbsd systems
++ # Common parts for some multiplatform systems
+ case $machine in
+ *-*-linux-gnu*)
+ xm_defines="HAVE_ATEXIT POSIX BSTRING"
+ ;;
++ *-*-netbsd*)
++ case $machine in
++ *-*-netbsdelf*) tm_file=${cpu_type}/netbsd-elf.h;;
++ *) tm_file=${cpu_type}/netbsd.h;;
++ esac
++ tmake_file="t-libc-ok t-netbsd"
++ xm_file="${xm_file} xm-netbsd.h"
++ xmake_file=none
++ ;;
+ *-*-openbsd*)
+ tm_file=${cpu_type}/openbsd.h
+ tmake_file="t-libc-ok t-openbsd"
+@@ -3060,20 +3072,15 @@
+ fi
+ ;;
+ alpha*-*-netbsd*)
+- tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h"
+ target_cpu_default="MASK_GAS"
+- tmake_file="alpha/t-crtbe alpha/t-ieee"
+- extra_parts="crtbegin.o crtend.o"
+- xmake_file=none
++ tmake_file="${tmake_file} alpha/t-ieee"
+ gas=yes gnu_ld=yes
+ ;;
+-
+ alpha*-*-openbsd*)
+ # default x-alpha is only appropriate for dec-osf.
+ target_cpu_default="MASK_GAS"
+ tmake_file="alpha/t-ieee"
+ ;;
+-
+ alpha*-dec-osf*)
+ if test x$stabs = xyes
+ then
+@@ -3170,11 +3177,11 @@
+ tm_file=arm/semiaof.h
+ tmake_file=arm/t-semiaof
+ ;;
++ arm*-*-netbsdelf*)
++ gas=yes gnu_ld=yes
++ ;;
+ arm*-*-netbsd*)
+- tm_file=arm/netbsd.h
+- xm_file="arm/xm-netbsd.h ${xm_file}"
+- tmake_file="t-netbsd arm/t-netbsd"
+- use_collect2=yes
++ gas=yes
+ ;;
+ arm*-*-linux-gnuaout*) # ARM GNU/Linux with a.out
+ cpu_type=arm
+@@ -3568,10 +3575,10 @@
+ tm_file=i386/freebsd.h
+ tmake_file=t-freebsd
+ ;;
++ i[34567]86-*-netbsdelf*)
++ gas=yes gnu_ld=yes
++ ;;
+ i[34567]86-*-netbsd*)
+- tm_file=i386/netbsd.h
+- tmake_file=t-netbsd
+- use_collect2=yes
+ ;;
+ i[34567]86-*-openbsd*)
+ # we need collect2 until our bug is fixed...
+@@ -4372,11 +4379,12 @@
+ extra_headers=math-68881.h
+ float_format=m68k
+ ;;
+- m68k*-*-netbsd*)
+- tm_file=m68k/netbsd.h
+- tmake_file=t-netbsd
++ m68*-*-netbsdelf*)
++ float_format=m68k
++ gas=yes gnu_ld=yes
++ ;;
++ m68*-*-netbsd*)
+ float_format=m68k
+- use_collect2=yes
+ ;;
+ m68k*-*-openbsd*)
+ float_format=m68k
+@@ -4691,10 +4699,12 @@
+ use_collect2=yes
+ fi
+ ;;
+- mipsel-*-netbsd* | mips-dec-netbsd*) # Decstation running NetBSD
+- tm_file=mips/netbsd.h
+- # On NetBSD, the headers are already okay, except for math.h.
+- tmake_file=t-netbsd
++ mipseb*-*-netbsd*)
++ tmake_file="${tmake_file} mips/t-mipseb"
++ gas=yes gnu_ld=yes
++ ;;
++ mips*-*-netbsd*)
++ gas=yes gnu_ld=yes
+ ;;
+ mips*-*-linux*) # Linux MIPS, either endian.
+ xmake_file=x-linux
+@@ -5040,11 +5050,6 @@
+ use_collect2=yes
+ ;;
+ ns32k-*-netbsd*)
+- tm_file=ns32k/netbsd.h
+- xm_file="ns32k/xm-netbsd.h ${xm_file}"
+- # On NetBSD, the headers are already okay, except for math.h.
+- tmake_file=t-netbsd
+- use_collect2=yes
+ ;;
+ pdp11-*-bsd)
+ tm_file="${tm_file} pdp11/2bsd.h"
+@@ -5069,6 +5074,10 @@
+ romp-*-openbsd*)
+ # Nothing special
+ ;;
++ powerpc-*-netbsd*)
++ tmake_file="${tmake_file} rs6000/t-rs6000"
++ xm_file="rs6000/xm-sysv4.h xm-netbsd.h"
++ ;;
+ powerpc-*-openbsd*)
+ tmake_file="${tmake_file} rs6000/t-rs6000 rs6000/t-openbsd"
+ ;;
+@@ -5311,6 +5320,13 @@
+ tm_file=sh/elf.h
+ float_format=sh
+ ;;
++ sh-*-netbsdelf*)
++ float_format=sh
++ ;;
++ shle-*-netbsdelf*)
++ tm_file="sh/netbsd-elf.h sh/netbsd-elf-little.h"
++ float_format=sh;
++ ;;
+ sh-*-rtemself*)
+ tmake_file="sh/t-sh t-rtems"
+ tm_file=sh/rtemself.h
+@@ -5339,10 +5355,12 @@
+ tmake_file=sparc/t-sparcbare
+ tm_file="sparc/aout.h libgloss.h"
+ ;;
++ sparc-*-netbsdelf*)
++ tmake_file="${tmake_file} sparc/t-netbsd"
++ gas=yes gnu_ld=yes
++ ;;
+ sparc-*-netbsd*)
+- tm_file=sparc/netbsd.h
+- tmake_file=t-netbsd
+- use_collect2=yes
++ tmake_file="${tmake_file} sparc/t-netbsd"
+ ;;
+ sparc-*-openbsd*)
+ # we need collect2 until our bug is fixed...
+@@ -5532,6 +5550,11 @@
+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ gnu_ld=yes
+ ;;
++ sparc64-*-netbsd*)
++ tm_file=sparc/netbsd64.h
++ xm_file="sparc/xm-sp64.h xm-netbsd.h"
++ gas=yes gnu_ld=yes
++ ;;
+ # This hasn't been upgraded to GCC 2.
+ # tahoe-harris-*) # Harris tahoe, using COFF.
+ # tm_file=tahoe/harris.h
+@@ -5579,10 +5602,8 @@
+ float_format=vax
+ ;;
+ vax-*-netbsd*)
+- tm_file="${tm_file} netbsd.h vax/netbsd.h"
+- tmake_file=t-netbsd
+ float_format=vax
+- use_collect2=yes
++ gas=yes gnu_ld=yes
+ ;;
+ vax-*-openbsd*)
+ tmake_file="${tmake_file} vax/t-openbsd"
+@@ -5873,6 +5894,12 @@
+ esac
+ fi
+
++case $target in
++ alpha*|sparc64*)
++ build_xm_file="${build_xm_file} xm-target64.h"
++ host_xm_file="${host_xm_file} xm-target64.h";;
++esac
++
+ # Handle cpp installation.
+ if test x$enable_cpp != xno
+ then
+@@ -6062,7 +6089,7 @@
+
+
+ echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
+-echo "configure:6066: checking for strerror in -lcposix" >&5
++echo "configure:6102: checking for strerror in -lcposix" >&5
+ ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -6070,7 +6097,7 @@
+ ac_save_LIBS="$LIBS"
+ LIBS="-lcposix $LIBS"
+ cat > conftest.$ac_ext <<EOF
+-#line 6074 "configure"
++#line 6110 "configure"
+ #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error. */
+ /* We use char because int might match the return type of a gcc2
+@@ -6081,7 +6108,7 @@
+ strerror()
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6121: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+@@ -6104,12 +6131,12 @@
+
+
+ echo $ac_n "checking for working const""... $ac_c" 1>&6
+-echo "configure:6108: checking for working const" >&5
++echo "configure:6144: checking for working const" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6113 "configure"
++#line 6149 "configure"
+ #include "confdefs.h"
+
+ int main() {
+@@ -6158,7 +6185,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6162: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:6198: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+ else
+@@ -6179,21 +6206,21 @@
+ fi
+
+ echo $ac_n "checking for inline""... $ac_c" 1>&6
+-echo "configure:6183: checking for inline" >&5
++echo "configure:6219: checking for inline" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ ac_cv_c_inline=no
+ for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+-#line 6190 "configure"
++#line 6226 "configure"
+ #include "confdefs.h"
+
+ int main() {
+ } $ac_kw foo() {
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:6233: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+ else
+@@ -6219,12 +6246,12 @@
+ esac
+
+ echo $ac_n "checking for off_t""... $ac_c" 1>&6
+-echo "configure:6223: checking for off_t" >&5
++echo "configure:6259: checking for off_t" >&5
+ if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6228 "configure"
++#line 6264 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #if STDC_HEADERS
+@@ -6252,12 +6279,12 @@
+ fi
+
+ echo $ac_n "checking for size_t""... $ac_c" 1>&6
+-echo "configure:6256: checking for size_t" >&5
++echo "configure:6292: checking for size_t" >&5
+ if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6261 "configure"
++#line 6297 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #if STDC_HEADERS
+@@ -6287,19 +6314,19 @@
+ # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+ # for constant arguments. Useless!
+ echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+-echo "configure:6291: checking for working alloca.h" >&5
++echo "configure:6327: checking for working alloca.h" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6296 "configure"
++#line 6332 "configure"
+ #include "confdefs.h"
+ #include <alloca.h>
+ int main() {
+ char *p = alloca(2 * sizeof(int));
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+ else
+@@ -6320,12 +6347,12 @@
+ fi
+
+ echo $ac_n "checking for alloca""... $ac_c" 1>&6
+-echo "configure:6324: checking for alloca" >&5
++echo "configure:6360: checking for alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6329 "configure"
++#line 6365 "configure"
+ #include "confdefs.h"
+
+ #ifdef __GNUC__
+@@ -6353,7 +6380,7 @@
+ char *p = (char *) alloca(1);
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+ else
+@@ -6385,12 +6412,12 @@
+
+
+ echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+-echo "configure:6389: checking whether alloca needs Cray hooks" >&5
++echo "configure:6425: checking whether alloca needs Cray hooks" >&5
+ if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6394 "configure"
++#line 6430 "configure"
+ #include "confdefs.h"
+ #if defined(CRAY) && ! defined(CRAY2)
+ webecray
+@@ -6415,12 +6442,12 @@
+ if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:6419: checking for $ac_func" >&5
++echo "configure:6455: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6424 "configure"
++#line 6460 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -6443,7 +6470,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -6470,7 +6497,7 @@
+ fi
+
+ echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+-echo "configure:6474: checking stack direction for C alloca" >&5
++echo "configure:6510: checking stack direction for C alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -6478,7 +6505,7 @@
+ ac_cv_c_stack_direction=0
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6482 "configure"
++#line 6518 "configure"
+ #include "confdefs.h"
+ find_stack_direction ()
+ {
+@@ -6497,7 +6524,7 @@
+ exit (find_stack_direction() < 0);
+ }
+ EOF
+-if { (eval echo configure:6501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:6537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+ ac_cv_c_stack_direction=1
+ else
+@@ -6522,17 +6549,17 @@
+ do
+ ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+ echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+-echo "configure:6526: checking for $ac_hdr" >&5
++echo "configure:6562: checking for $ac_hdr" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6531 "configure"
++#line 6567 "configure"
+ #include "confdefs.h"
+ #include <$ac_hdr>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:6536: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:6572: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ rm -rf conftest*
+@@ -6561,12 +6588,12 @@
+ for ac_func in getpagesize
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:6565: checking for $ac_func" >&5
++echo "configure:6601: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6570 "configure"
++#line 6606 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -6589,7 +6616,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6593: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -6614,7 +6641,7 @@
+ done
+
+ echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+-echo "configure:6618: checking for working mmap" >&5
++echo "configure:6654: checking for working mmap" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -6622,7 +6649,7 @@
+ ac_cv_func_mmap_fixed_mapped=no
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6626 "configure"
++#line 6662 "configure"
+ #include "confdefs.h"
+
+ /* Thanks to Mike Haertel and Jim Avera for this test.
+@@ -6762,7 +6789,7 @@
+ }
+
+ EOF
+-if { (eval echo configure:6766: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:6802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+ ac_cv_func_mmap_fixed_mapped=yes
+ else
+@@ -6790,17 +6817,17 @@
+ do
+ ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+ echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+-echo "configure:6794: checking for $ac_hdr" >&5
++echo "configure:6830: checking for $ac_hdr" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6799 "configure"
++#line 6835 "configure"
+ #include "confdefs.h"
+ #include <$ac_hdr>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:6804: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:6840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ rm -rf conftest*
+@@ -6830,12 +6857,12 @@
+ strdup __argz_count __argz_stringify __argz_next
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:6834: checking for $ac_func" >&5
++echo "configure:6870: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6839 "configure"
++#line 6875 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -6858,7 +6885,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6862: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6898: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -6887,12 +6914,12 @@
+ for ac_func in stpcpy
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:6891: checking for $ac_func" >&5
++echo "configure:6927: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6896 "configure"
++#line 6932 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -6915,7 +6942,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:6955: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -6949,19 +6976,19 @@
+
+ if test $ac_cv_header_locale_h = yes; then
+ echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+-echo "configure:6953: checking for LC_MESSAGES" >&5
++echo "configure:6989: checking for LC_MESSAGES" >&5
+ if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 6958 "configure"
++#line 6994 "configure"
+ #include "confdefs.h"
+ #include <locale.h>
+ int main() {
+ return LC_MESSAGES
+ ; return 0; }
+ EOF
+-if { (eval echo configure:6965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7001: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=yes
+ else
+@@ -6982,7 +7009,7 @@
+ fi
+ fi
+ echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+-echo "configure:6986: checking whether NLS is requested" >&5
++echo "configure:7022: checking whether NLS is requested" >&5
+ # Check whether --enable-nls or --disable-nls was given.
+ if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+@@ -7002,7 +7029,7 @@
+ EOF
+
+ echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+-echo "configure:7006: checking whether included gettext is requested" >&5
++echo "configure:7042: checking whether included gettext is requested" >&5
+ # Check whether --with-included-gettext or --without-included-gettext was given.
+ if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+@@ -7021,17 +7048,17 @@
+
+ ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
+ echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
+-echo "configure:7025: checking for libintl.h" >&5
++echo "configure:7061: checking for libintl.h" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 7030 "configure"
++#line 7066 "configure"
+ #include "confdefs.h"
+ #include <libintl.h>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:7035: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:7071: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ rm -rf conftest*
+@@ -7048,19 +7075,19 @@
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
+-echo "configure:7052: checking for gettext in libc" >&5
++echo "configure:7088: checking for gettext in libc" >&5
+ if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 7057 "configure"
++#line 7093 "configure"
+ #include "confdefs.h"
+ #include <libintl.h>
+ int main() {
+ return (int) gettext ("")
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7064: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ gt_cv_func_gettext_libc=yes
+ else
+@@ -7076,7 +7103,7 @@
+
+ if test "$gt_cv_func_gettext_libc" != "yes"; then
+ echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
+-echo "configure:7080: checking for bindtextdomain in -lintl" >&5
++echo "configure:7116: checking for bindtextdomain in -lintl" >&5
+ ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -7084,7 +7111,7 @@
+ ac_save_LIBS="$LIBS"
+ LIBS="-lintl $LIBS"
+ cat > conftest.$ac_ext <<EOF
+-#line 7088 "configure"
++#line 7124 "configure"
+ #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error. */
+ /* We use char because int might match the return type of a gcc2
+@@ -7095,7 +7122,7 @@
+ bindtextdomain()
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7135: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+@@ -7111,12 +7138,12 @@
+ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
+-echo "configure:7115: checking for gettext in libintl" >&5
++echo "configure:7151: checking for gettext in libintl" >&5
+ if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+-echo "configure:7120: checking for gettext in -lintl" >&5
++echo "configure:7156: checking for gettext in -lintl" >&5
+ ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -7124,7 +7151,7 @@
+ ac_save_LIBS="$LIBS"
+ LIBS="-lintl $LIBS"
+ cat > conftest.$ac_ext <<EOF
+-#line 7128 "configure"
++#line 7164 "configure"
+ #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error. */
+ /* We use char because int might match the return type of a gcc2
+@@ -7135,7 +7162,7 @@
+ gettext()
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7175: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+@@ -7174,7 +7201,7 @@
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+ set dummy msgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7178: checking for $ac_word" >&5
++echo "configure:7214: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7208,12 +7235,12 @@
+ for ac_func in dcgettext
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:7212: checking for $ac_func" >&5
++echo "configure:7248: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 7217 "configure"
++#line 7253 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+@@ -7236,7 +7263,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7240: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -7263,7 +7290,7 @@
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+ set dummy gmsgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7267: checking for $ac_word" >&5
++echo "configure:7303: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7299,7 +7326,7 @@
+ # Extract the first word of "xgettext", so it can be a program name with args.
+ set dummy xgettext; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7303: checking for $ac_word" >&5
++echo "configure:7339: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7331,7 +7358,7 @@
+ fi
+
+ cat > conftest.$ac_ext <<EOF
+-#line 7335 "configure"
++#line 7371 "configure"
+ #include "confdefs.h"
+
+ int main() {
+@@ -7339,7 +7366,7 @@
+ return _nl_msg_cat_cntr
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+@@ -7362,7 +7389,7 @@
+
+ if test "$CATOBJEXT" = "NONE"; then
+ echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
+-echo "configure:7366: checking whether catgets can be used" >&5
++echo "configure:7402: checking whether catgets can be used" >&5
+ # Check whether --with-catgets or --without-catgets was given.
+ if test "${with_catgets+set}" = set; then
+ withval="$with_catgets"
+@@ -7375,7 +7402,7 @@
+
+ if test "$nls_cv_use_catgets" = "yes"; then
+ echo $ac_n "checking for main in -li""... $ac_c" 1>&6
+-echo "configure:7379: checking for main in -li" >&5
++echo "configure:7415: checking for main in -li" >&5
+ ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+@@ -7383,14 +7410,14 @@
+ ac_save_LIBS="$LIBS"
+ LIBS="-li $LIBS"
+ cat > conftest.$ac_ext <<EOF
+-#line 7387 "configure"
++#line 7423 "configure"
+ #include "confdefs.h"
+
+ int main() {
+ main()
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+@@ -7418,12 +7445,12 @@
+ fi
+
+ echo $ac_n "checking for catgets""... $ac_c" 1>&6
+-echo "configure:7422: checking for catgets" >&5
++echo "configure:7458: checking for catgets" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 7427 "configure"
++#line 7463 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char catgets(); below. */
+@@ -7446,7 +7473,7 @@
+
+ ; return 0; }
+ EOF
+-if { (eval echo configure:7450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:7486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_catgets=yes"
+ else
+@@ -7468,7 +7495,7 @@
+ # Extract the first word of "gencat", so it can be a program name with args.
+ set dummy gencat; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7472: checking for $ac_word" >&5
++echo "configure:7508: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7504,7 +7531,7 @@
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+ set dummy gmsgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7508: checking for $ac_word" >&5
++echo "configure:7544: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7541,7 +7568,7 @@
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+ set dummy msgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7545: checking for $ac_word" >&5
++echo "configure:7581: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7576,7 +7603,7 @@
+ # Extract the first word of "xgettext", so it can be a program name with args.
+ set dummy xgettext; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7580: checking for $ac_word" >&5
++echo "configure:7616: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7634,7 +7661,7 @@
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+ set dummy msgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7638: checking for $ac_word" >&5
++echo "configure:7674: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7668,7 +7695,7 @@
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+ set dummy gmsgfmt; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7672: checking for $ac_word" >&5
++echo "configure:7708: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7704,7 +7731,7 @@
+ # Extract the first word of "xgettext", so it can be a program name with args.
+ set dummy xgettext; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:7708: checking for $ac_word" >&5
++echo "configure:7744: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -7797,7 +7824,7 @@
+ LINGUAS=
+ else
+ echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
+-echo "configure:7801: checking for catalogs to be installed" >&5
++echo "configure:7837: checking for catalogs to be installed" >&5
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+@@ -7825,17 +7852,17 @@
+ if test "$CATOBJEXT" = ".cat"; then
+ ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
+ echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
+-echo "configure:7829: checking for linux/version.h" >&5
++echo "configure:7865: checking for linux/version.h" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+ else
+ cat > conftest.$ac_ext <<EOF
+-#line 7834 "configure"
++#line 7870 "configure"
+ #include "confdefs.h"
+ #include <linux/version.h>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:7839: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:7875: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+ rm -rf conftest*
+@@ -8069,7 +8096,7 @@
+
+ # Figure out what assembler alignment features are present.
+ echo $ac_n "checking assembler alignment features""... $ac_c" 1>&6
+-echo "configure:8073: checking assembler alignment features" >&5
++echo "configure:8109: checking assembler alignment features" >&5
+ gcc_cv_as=
+ gcc_cv_as_alignment_features=
+ gcc_cv_as_gas_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/gas
+@@ -8190,7 +8217,7 @@
+ echo "$ac_t""$gcc_cv_as_alignment_features" 1>&6
+
+ echo $ac_n "checking assembler subsection support""... $ac_c" 1>&6
+-echo "configure:8194: checking assembler subsection support" >&5
++echo "configure:8230: checking assembler subsection support" >&5
+ gcc_cv_as_subsections=
+ if test x$gcc_cv_as != x; then
+ # Check if we have .subsection
+@@ -8230,7 +8257,7 @@
+ echo "$ac_t""$gcc_cv_as_subsections" 1>&6
+
+ echo $ac_n "checking assembler instructions""... $ac_c" 1>&6
+-echo "configure:8234: checking assembler instructions" >&5
++echo "configure:8270: checking assembler instructions" >&5
+ gcc_cv_as_instructions=
+ if test x$gcc_cv_as != x; then
+ set "filds fists" "filds mem; fists mem"
diff --git a/lang/gcc/patches/patch-bt b/lang/gcc/patches/patch-bt
new file mode 100644
index 00000000000..e7068c7dd77
--- /dev/null
+++ b/lang/gcc/patches/patch-bt
@@ -0,0 +1,215 @@
+$NetBSD: patch-bt,v 1.1 2002/01/03 20:40:48 tron Exp $
+
+--- ../gcc-2.95.3/gcc/configure.in.orig Thu Jan 25 15:03:02 2001
++++ ../gcc-2.95.3/gcc/configure.in Thu Jan 3 20:37:55 2002
+@@ -510,6 +510,9 @@
+ pyramid-*-*)
+ cpu_type=pyr
+ ;;
++ sh*-*-*)
++ cpu_type=sh
++ ;;
+ sparc*-*-*)
+ cpu_type=sparc
+ ;;
+@@ -518,11 +521,20 @@
+ tm_file=${cpu_type}/${cpu_type}.h
+ xm_file=${cpu_type}/xm-${cpu_type}.h
+
+- # Common parts for linux-gnu and openbsd systems
++ # Common parts for some multiplatform systems
+ case $machine in
+ *-*-linux-gnu*)
+ xm_defines="HAVE_ATEXIT POSIX BSTRING"
+ ;;
++ *-*-netbsd*)
++ case $machine in
++ *-*-netbsdelf*) tm_file=${cpu_type}/netbsd-elf.h;;
++ *) tm_file=${cpu_type}/netbsd.h;;
++ esac
++ tmake_file="t-libc-ok t-netbsd"
++ xm_file="${xm_file} xm-netbsd.h"
++ xmake_file=none
++ ;;
+ *-*-openbsd*)
+ tm_file=${cpu_type}/openbsd.h
+ tmake_file="t-libc-ok t-openbsd"
+@@ -626,20 +638,15 @@
+ fi
+ ;;
+ alpha*-*-netbsd*)
+- tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h"
+ target_cpu_default="MASK_GAS"
+- tmake_file="alpha/t-crtbe alpha/t-ieee"
+- extra_parts="crtbegin.o crtend.o"
+- xmake_file=none
++ tmake_file="${tmake_file} alpha/t-ieee"
+ gas=yes gnu_ld=yes
+ ;;
+-
+ alpha*-*-openbsd*)
+ # default x-alpha is only appropriate for dec-osf.
+ target_cpu_default="MASK_GAS"
+ tmake_file="alpha/t-ieee"
+ ;;
+-
+ alpha*-dec-osf*)
+ if test x$stabs = xyes
+ then
+@@ -742,11 +749,11 @@
+ tm_file=arm/semiaof.h
+ tmake_file=arm/t-semiaof
+ ;;
++ arm*-*-netbsdelf*)
++ gas=yes gnu_ld=yes
++ ;;
+ arm*-*-netbsd*)
+- tm_file=arm/netbsd.h
+- xm_file="arm/xm-netbsd.h ${xm_file}"
+- tmake_file="t-netbsd arm/t-netbsd"
+- use_collect2=yes
++ gas=yes
+ ;;
+ arm*-*-linux-gnuaout*) # ARM GNU/Linux with a.out
+ cpu_type=arm
+@@ -1171,11 +1178,13 @@
+ tmake_file=t-freebsd
+ ;;
+ changequote(,)dnl
++ i[34567]86-*-netbsdelf*)
++changequote([,])dnl
++ gas=yes gnu_ld=yes
++ ;;
++changequote(,)dnl
+ i[34567]86-*-netbsd*)
+ changequote([,])dnl
+- tm_file=i386/netbsd.h
+- tmake_file=t-netbsd
+- use_collect2=yes
+ ;;
+ changequote(,)dnl
+ i[34567]86-*-openbsd*)
+@@ -2044,11 +2053,12 @@
+ extra_headers=math-68881.h
+ float_format=m68k
+ ;;
+- m68k*-*-netbsd*)
+- tm_file=m68k/netbsd.h
+- tmake_file=t-netbsd
++ m68*-*-netbsdelf*)
++ float_format=m68k
++ gas=yes gnu_ld=yes
++ ;;
++ m68*-*-netbsd*)
+ float_format=m68k
+- use_collect2=yes
+ ;;
+ m68k*-*-openbsd*)
+ float_format=m68k
+@@ -2363,10 +2373,12 @@
+ use_collect2=yes
+ fi
+ ;;
+- mipsel-*-netbsd* | mips-dec-netbsd*) # Decstation running NetBSD
+- tm_file=mips/netbsd.h
+- # On NetBSD, the headers are already okay, except for math.h.
+- tmake_file=t-netbsd
++ mipseb*-*-netbsd*)
++ tmake_file="${tmake_file} mips/t-mipseb"
++ gas=yes gnu_ld=yes
++ ;;
++ mips*-*-netbsd*)
++ gas=yes gnu_ld=yes
+ ;;
+ mips*-*-linux*) # Linux MIPS, either endian.
+ xmake_file=x-linux
+@@ -2724,11 +2736,6 @@
+ use_collect2=yes
+ ;;
+ ns32k-*-netbsd*)
+- tm_file=ns32k/netbsd.h
+- xm_file="ns32k/xm-netbsd.h ${xm_file}"
+- # On NetBSD, the headers are already okay, except for math.h.
+- tmake_file=t-netbsd
+- use_collect2=yes
+ ;;
+ pdp11-*-bsd)
+ tm_file="${tm_file} pdp11/2bsd.h"
+@@ -2753,6 +2760,10 @@
+ romp-*-openbsd*)
+ # Nothing special
+ ;;
++ powerpc-*-netbsd*)
++ tmake_file="${tmake_file} rs6000/t-rs6000"
++ xm_file="rs6000/xm-sysv4.h xm-netbsd.h"
++ ;;
+ powerpc-*-openbsd*)
+ tmake_file="${tmake_file} rs6000/t-rs6000 rs6000/t-openbsd"
+ ;;
+@@ -3005,6 +3016,13 @@
+ tm_file=sh/elf.h
+ float_format=sh
+ ;;
++ sh-*-netbsdelf*)
++ float_format=sh
++ ;;
++ shle-*-netbsdelf*)
++ tm_file="sh/netbsd-elf.h sh/netbsd-elf-little.h"
++ float_format=sh;
++ ;;
+ sh-*-rtemself*)
+ tmake_file="sh/t-sh t-rtems"
+ tm_file=sh/rtemself.h
+@@ -3033,10 +3051,12 @@
+ tmake_file=sparc/t-sparcbare
+ tm_file="sparc/aout.h libgloss.h"
+ ;;
++ sparc-*-netbsdelf*)
++ tmake_file="${tmake_file} sparc/t-netbsd"
++ gas=yes gnu_ld=yes
++ ;;
+ sparc-*-netbsd*)
+- tm_file=sparc/netbsd.h
+- tmake_file=t-netbsd
+- use_collect2=yes
++ tmake_file="${tmake_file} sparc/t-netbsd"
+ ;;
+ sparc-*-openbsd*)
+ # we need collect2 until our bug is fixed...
+@@ -3228,6 +3248,11 @@
+ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ gnu_ld=yes
+ ;;
++ sparc64-*-netbsd*)
++ tm_file=sparc/netbsd64.h
++ xm_file="sparc/xm-sp64.h xm-netbsd.h"
++ gas=yes gnu_ld=yes
++ ;;
+ # This hasn't been upgraded to GCC 2.
+ # tahoe-harris-*) # Harris tahoe, using COFF.
+ # tm_file=tahoe/harris.h
+@@ -3275,10 +3300,8 @@
+ float_format=vax
+ ;;
+ vax-*-netbsd*)
+- tm_file="${tm_file} netbsd.h vax/netbsd.h"
+- tmake_file=t-netbsd
+ float_format=vax
+- use_collect2=yes
++ gas=yes gnu_ld=yes
+ ;;
+ vax-*-openbsd*)
+ tmake_file="${tmake_file} vax/t-openbsd"
+@@ -3568,6 +3591,12 @@
+ enable_haifa=yes;;
+ esac
+ fi
++
++case $target in
++ alpha*|sparc64*)
++ build_xm_file="${build_xm_file} xm-target64.h"
++ host_xm_file="${host_xm_file} xm-target64.h";;
++esac
+
+ # Handle cpp installation.
+ if test x$enable_cpp != xno
diff --git a/lang/gcc/patches/patch-bu b/lang/gcc/patches/patch-bu
new file mode 100644
index 00000000000..0002d4bb883
--- /dev/null
+++ b/lang/gcc/patches/patch-bu
@@ -0,0 +1,16 @@
+$NetBSD: patch-bu,v 1.1 2002/01/03 20:40:48 tron Exp $
+
+--- ../gcc-2.95.3/gcc/cppspec.c.orig Tue May 18 01:37:16 1999
++++ ../gcc-2.95.3/gcc/cppspec.c Thu Jan 3 20:37:55 2002
+@@ -85,7 +85,11 @@
+ int need_E = 1;
+
+ /* Do we need to insert -no-gcc? */
++#if 0
+ int need_no_gcc = 1;
++#endif
++ /* XXX - For NetBSD backwards compatibility */
++ int need_no_gcc = 0;
+
+ /* Have we seen an input file? */
+ int seen_input = 0;
diff --git a/lang/gcc/patches/patch-bv b/lang/gcc/patches/patch-bv
new file mode 100644
index 00000000000..9426c44fe21
--- /dev/null
+++ b/lang/gcc/patches/patch-bv
@@ -0,0 +1,12 @@
+$NetBSD: patch-bv,v 1.1 2002/01/03 20:40:48 tron Exp $
+
+--- ../gcc-2.95.3/gcc/dwarf2out.c.orig Thu Jan 25 15:03:03 2001
++++ ../gcc-2.95.3/gcc/dwarf2out.c Thu Jan 3 20:37:55 2002
+@@ -1801,6 +1801,7 @@
+ }
+ fputc ('\n', asm_out_file);
+
++ ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
+ ASM_OUTPUT_DWARF_ADDR (asm_out_file, "__EXCEPTION_TABLE__");
+ if (flag_debug_asm)
+ fprintf (asm_out_file, "\t%s pointer to exception region info",
diff --git a/lang/gcc/patches/patch-bw b/lang/gcc/patches/patch-bw
new file mode 100644
index 00000000000..e3399334427
--- /dev/null
+++ b/lang/gcc/patches/patch-bw
@@ -0,0 +1,20 @@
+$NetBSD: patch-bw,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/emit-rtl.c.orig Thu Jan 25 15:03:06 2001
++++ ../gcc-2.95.3/gcc/emit-rtl.c Thu Jan 3 20:37:55 2002
+@@ -1382,6 +1382,15 @@
+ val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
+ return GEN_INT (val);
+ }
++#if HOST_BITS_PER_WIDE_INT >= 64
++ else if (BITS_PER_WORD >= 64 && i <= 1)
++ {
++ val = k[i*2 + ! WORDS_BIG_ENDIAN];
++ val = (((val & 0xffffffff) ^ 0x80000000) - 0x80000000) << 32;
++ val |= (HOST_WIDE_INT) k[i*2 + WORDS_BIG_ENDIAN] & 0xffffffff;
++ return GEN_INT (val);
++ }
++#endif
+ else
+ abort ();
+ }
diff --git a/lang/gcc/patches/patch-bx b/lang/gcc/patches/patch-bx
new file mode 100644
index 00000000000..e45f3c241f1
--- /dev/null
+++ b/lang/gcc/patches/patch-bx
@@ -0,0 +1,23 @@
+$NetBSD: patch-bx,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/frame.c.orig Thu Jan 25 15:03:15 2001
++++ ../gcc-2.95.3/gcc/frame.c Thu Jan 3 20:37:55 2002
+@@ -40,6 +40,7 @@
+ #ifndef inhibit_libc
+ /* fixproto guarantees these system headers exist. */
+ #include <stdlib.h>
++#include <string.h>
+ #include <unistd.h>
+ #endif
+
+@@ -572,6 +573,10 @@
+
+ if (strcmp (c->augmentation, "eh") == 0)
+ {
++ /* Handle the blank space > 4 byte alignment may have forced. */
++ if (sizeof(void *) > 4)
++ p += (sizeof(void *) - 4);
++
+ c->eh_ptr = read_pointer (p);
+ p += sizeof (void *);
+ }
diff --git a/lang/gcc/patches/patch-by b/lang/gcc/patches/patch-by
new file mode 100644
index 00000000000..c697cc77d77
--- /dev/null
+++ b/lang/gcc/patches/patch-by
@@ -0,0 +1,81 @@
+$NetBSD: patch-by,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/gcc.c.orig Thu Jan 25 15:03:16 2001
++++ ../gcc-2.95.3/gcc/gcc.c Thu Jan 3 20:37:55 2002
+@@ -3057,6 +3057,7 @@
+ (such as cpp) rather than those of the host system. */
+ /* Use 2 as fourth arg meaning try just the machine as a suffix,
+ as well as trying the machine and the version. */
++#ifndef NETBSD_NATIVE
+ #ifndef OS2
+ add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
+ 0, 2, warn_std_ptr);
+@@ -3108,6 +3109,7 @@
+ add_prefix (&startfile_prefixes,
+ concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
+ "BINUTILS", 0, 0, NULL_PTR);
++#endif
+
+ /* More prefixes are enabled in main, after we read the specs file
+ and determine whether this is cross-compilation or not. */
+@@ -4796,9 +4798,11 @@
+
+ /* Read specs from a file if there is one. */
+
++#ifndef NETBSD_NATIVE
+ machine_suffix = concat (spec_machine, dir_separator_str,
+ spec_version, dir_separator_str, NULL_PTR);
+ just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
++#endif
+
+ specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
+ /* Read the specs file unless it is a default one. */
+@@ -4807,6 +4811,7 @@
+ else
+ init_spec ();
+
++#ifndef NETBSD_NATIVE
+ /* We need to check standard_exec_prefix/just_machine_suffix/specs
+ for any override of as, ld and libraries. */
+ specs_file = (char *) alloca (strlen (standard_exec_prefix)
+@@ -4818,14 +4823,17 @@
+ strcat (specs_file, "specs");
+ if (access (specs_file, R_OK) == 0)
+ read_specs (specs_file, TRUE);
++#endif
+
+ /* If not cross-compiling, look for startfiles in the standard places. */
+ if (*cross_compile == '0')
+ {
+ #ifdef MD_EXEC_PREFIX
+ add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
++#ifndef NETBSD_NATIVE
+ add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
+ #endif
++#endif
+
+ #ifdef MD_STARTFILE_PREFIX
+ add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
+@@ -4865,10 +4873,12 @@
+ NULL_PTR, 0, 0, NULL_PTR);
+ }
+
++#ifndef NETBSD_NATIVE
+ add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
+ "BINUTILS", 0, 0, NULL_PTR);
+ add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
+ "BINUTILS", 0, 0, NULL_PTR);
++#endif
+ #if 0 /* Can cause surprises, and one can use -B./ instead. */
+ add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
+ #endif
+@@ -4923,7 +4933,9 @@
+
+ if (print_search_dirs)
+ {
++#ifndef NETBSD_NATIVE
+ printf ("install: %s%s\n", standard_exec_prefix, machine_suffix);
++#endif
+ printf ("programs: %s\n", build_search_list (&exec_prefixes, "", 0));
+ printf ("libraries: %s\n", build_search_list (&startfile_prefixes, "", 0));
+ exit (0);
diff --git a/lang/gcc/patches/patch-bz b/lang/gcc/patches/patch-bz
new file mode 100644
index 00000000000..65a35a9be89
--- /dev/null
+++ b/lang/gcc/patches/patch-bz
@@ -0,0 +1,12 @@
+$NetBSD: patch-bz,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/libgcc2.c.orig Fri Jun 11 05:11:43 1999
++++ ../gcc-2.95.3/gcc/libgcc2.c Thu Jan 3 20:37:55 2002
+@@ -39,6 +39,7 @@
+ #ifndef inhibit_libc
+ /* fixproto guarantees these system headers exist. */
+ #include <stdlib.h>
++#include <string.h>
+ #include <unistd.h>
+ #endif
+
diff --git a/lang/gcc/patches/patch-ca b/lang/gcc/patches/patch-ca
new file mode 100644
index 00000000000..ab715765be7
--- /dev/null
+++ b/lang/gcc/patches/patch-ca
@@ -0,0 +1,21 @@
+$NetBSD: patch-ca,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/loop.c.orig Thu Jan 25 15:03:18 2001
++++ ../gcc-2.95.3/gcc/loop.c Thu Jan 3 20:37:55 2002
+@@ -4103,11 +4103,11 @@
+ in-between when biv_toal_increment returns nonzero both times
+ but we test it here in case some day some real cfg analysis
+ gets used to set always_computable. */
+- && ((loop_insn_first_p (bl2->biv->insn, bl->biv->insn)
+- && no_labels_between_p (bl2->biv->insn, bl->biv->insn))
+- || (! reg_used_between_p (bl->biv->src_reg, bl->biv->insn,
+- bl2->biv->insn)
+- && no_jumps_between_p (bl->biv->insn, bl2->biv->insn)))
++ && (loop_insn_first_p (bl2->biv->insn, bl->biv->insn)
++ ? no_labels_between_p (bl2->biv->insn, bl->biv->insn)
++ : (! reg_used_between_p (bl->biv->src_reg, bl->biv->insn,
++ bl2->biv->insn)
++ && no_jumps_between_p (bl->biv->insn, bl2->biv->insn)))
+ && validate_change (bl->biv->insn,
+ &SET_SRC (single_set (bl->biv->insn)),
+ copy_rtx (src), 0))
diff --git a/lang/gcc/patches/patch-cb b/lang/gcc/patches/patch-cb
new file mode 100644
index 00000000000..356c125e835
--- /dev/null
+++ b/lang/gcc/patches/patch-cb
@@ -0,0 +1,13 @@
+$NetBSD: patch-cb,v 1.1 2002/01/03 20:40:49 tron Exp $
+
+--- ../gcc-2.95.3/gcc/reload1.c.orig Thu Jan 25 15:03:21 2001
++++ ../gcc-2.95.3/gcc/reload1.c Thu Jan 3 20:37:55 2002
+@@ -1277,7 +1277,7 @@
+
+ /* Get the operand values and constraints out of the insn. */
+ decode_asm_operands (pat, recog_operand, recog_operand_loc,
+- constraints, operand_mode);
++ (const char **)constraints, operand_mode);
+
+ /* For every operand, see what registers are allowed. */
+ for (i = 0; i < noperands; i++)
diff --git a/lang/gcc/patches/patch-cc b/lang/gcc/patches/patch-cc
new file mode 100644
index 00000000000..1ae92d06cbe
--- /dev/null
+++ b/lang/gcc/patches/patch-cc
@@ -0,0 +1,20 @@
+$NetBSD: patch-cc,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/gcc/tm.texi.orig Mon May 31 04:56:15 1999
++++ ../gcc-2.95.3/gcc/tm.texi Thu Jan 3 20:37:55 2002
+@@ -5598,6 +5598,15 @@
+ If this macro is not defined, then the variable name is defined in the
+ usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+
++@findex ASM_DECLARE_REGISTER_GLOBAL
++@item ASM_DECLARE_REGISTER_GLOBAL (@var{stream}, @var{decl}, @var{regno}, @var{name})
++A C statement (sans semicolon) to output to the stdio stream
++@var{stream} any text necessary for claiming a register @var{regno}
++for a global variable @var{decl} with name @var{name}.
++
++If you don't define this macro, that is equivalent to defining it to do
++nothing.
++
+ @findex ASM_FINISH_DECLARE_OBJECT
+ @item ASM_FINISH_DECLARE_OBJECT (@var{stream}, @var{decl}, @var{toplevel}, @var{atend})
+ A C statement (sans semicolon) to finish up declaring a variable name
diff --git a/lang/gcc/patches/patch-cd b/lang/gcc/patches/patch-cd
new file mode 100644
index 00000000000..65dc5bb6c6b
--- /dev/null
+++ b/lang/gcc/patches/patch-cd
@@ -0,0 +1,14 @@
+$NetBSD: patch-cd,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/gcc/varasm.c.orig Mon Feb 19 15:02:02 2001
++++ ../gcc-2.95.3/gcc/varasm.c Thu Jan 3 20:37:55 2002
+@@ -706,6 +706,9 @@
+ {
+ /* Make this register global, so not usable for anything
+ else. */
++#ifdef ASM_DECLARE_REGISTER_GLOBAL
++ ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
++#endif
+ nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
+ while (nregs > 0)
+ globalize_reg (reg_number + --nregs);
diff --git a/lang/gcc/patches/patch-ce b/lang/gcc/patches/patch-ce
new file mode 100644
index 00000000000..57dc7d132a2
--- /dev/null
+++ b/lang/gcc/patches/patch-ce
@@ -0,0 +1,7 @@
+$NetBSD: patch-ce,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/gcc/version.c.orig Fri Mar 16 13:52:12 2001
++++ ../gcc-2.95.3/gcc/version.c Thu Jan 3 20:37:55 2002
+@@ -1 +1 @@
+-char *version_string = "2.95.3 20010315 (release)";
++char *version_string = "2.95.3 20010315 (release) (NetBSD nb1)";
diff --git a/lang/gcc/patches/patch-cf b/lang/gcc/patches/patch-cf
new file mode 100644
index 00000000000..9a303c18a4d
--- /dev/null
+++ b/lang/gcc/patches/patch-cf
@@ -0,0 +1,12 @@
+$NetBSD: patch-cf,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/libf2c/libU77/hostnm_.c.orig Mon Apr 27 12:11:57 1998
++++ ../gcc-2.95.3/libf2c/libU77/hostnm_.c Thu Jan 3 20:37:55 2002
+@@ -36,6 +36,7 @@
+
+ #if HAVE_GETHOSTNAME
+ ret = gethostname (name, Lname);
++ name[Lname - 1] = '\0';
+ if (ret==0) {
+ /* Pad with blanks (assuming gethostname will make an error
+ return if it can't fit in the null). */
diff --git a/lang/gcc/patches/patch-cg b/lang/gcc/patches/patch-cg
new file mode 100644
index 00000000000..ba69a9afd9f
--- /dev/null
+++ b/lang/gcc/patches/patch-cg
@@ -0,0 +1,13 @@
+$NetBSD: patch-cg,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/libio/Makefile.in.orig Fri Apr 2 16:17:44 1999
++++ ../gcc-2.95.3/libio/Makefile.in Thu Jan 3 20:37:55 2002
+@@ -17,7 +17,7 @@
+
+ srcdir = .
+
+-VERSION = 2.8.0
++VERSION = 2.8.0nb1
+ # The config file (overriden by Linux).
+ _G_CONFIG_H=_G_config.h
+ tooldir = $(exec_prefix)/$(target)
diff --git a/lang/gcc/patches/patch-ch b/lang/gcc/patches/patch-ch
new file mode 100644
index 00000000000..71af7f9ca07
--- /dev/null
+++ b/lang/gcc/patches/patch-ch
@@ -0,0 +1,13 @@
+$NetBSD: patch-ch,v 1.1 2002/01/03 20:40:50 tron Exp $
+
+--- ../gcc-2.95.3/libio/iopopen.c.orig Mon Apr 12 20:27:50 1999
++++ ../gcc-2.95.3/libio/iopopen.c Thu Jan 3 20:37:55 2002
+@@ -31,7 +31,7 @@
+ #ifdef __STDC__
+ #include <stdlib.h>
+ #endif
+-#ifdef _LIBC
++#if defined(_LIBC) || defined(__NetBSD__)
+ # include <unistd.h>
+ #endif
+ #include <sys/types.h>
diff --git a/lang/gcc/patches/patch-ci b/lang/gcc/patches/patch-ci
new file mode 100644
index 00000000000..456188b59b5
--- /dev/null
+++ b/lang/gcc/patches/patch-ci
@@ -0,0 +1,12 @@
+$NetBSD: patch-ci,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/libobjc/objc/runtime.h.orig Wed Sep 30 10:17:56 1998
++++ ../gcc-2.95.3/libobjc/objc/runtime.h Thu Jan 3 20:37:55 2002
+@@ -29,6 +29,7 @@
+ #include <stdarg.h> /* for varargs and va_list's */
+
+ #include <stdio.h>
++#include <string.h>
+ #include <ctype.h>
+
+ #include <stddef.h> /* so noone else will get system versions */
diff --git a/lang/gcc/patches/patch-cj b/lang/gcc/patches/patch-cj
new file mode 100644
index 00000000000..7cfe579aaca
--- /dev/null
+++ b/lang/gcc/patches/patch-cj
@@ -0,0 +1,15 @@
+$NetBSD: patch-cj,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/libobjc/Object.m.orig Mon Sep 21 03:22:06 1998
++++ ../gcc-2.95.3/libobjc/Object.m Thu Jan 3 20:37:55 2002
+@@ -320,9 +320,8 @@
+ object_get_class_name(self), sel_get_name(aSel)];
+ }
+
+-#ifdef __alpha__
++/* XXX Why not just include <string.h>? */
+ extern size_t strlen(const char*);
+-#endif
+
+ - error:(const char *)aString, ...
+ {
diff --git a/lang/gcc/patches/patch-ck b/lang/gcc/patches/patch-ck
new file mode 100644
index 00000000000..470eea9c84e
--- /dev/null
+++ b/lang/gcc/patches/patch-ck
@@ -0,0 +1,17 @@
+$NetBSD: patch-ck,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/libstdc++/stl/stl_alloc.h.orig Fri May 7 12:13:28 1999
++++ ../gcc-2.95.3/libstdc++/stl/stl_alloc.h Thu Jan 3 20:37:55 2002
+@@ -1050,6 +1050,12 @@
+
+ #undef __PRIVATE
+
++#ifdef __GNUG__
++// instantiated in stlinst.cc
++extern template __malloc_alloc_template<0>;
++extern template __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0>;
++#endif
++
+ #endif /* __SGI_STL_INTERNAL_ALLOC_H */
+
+ // Local Variables:
diff --git a/lang/gcc/patches/patch-cl b/lang/gcc/patches/patch-cl
new file mode 100644
index 00000000000..1f9b76117d7
--- /dev/null
+++ b/lang/gcc/patches/patch-cl
@@ -0,0 +1,13 @@
+$NetBSD: patch-cl,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/libstdc++/Makefile.in.orig Mon Apr 24 19:34:25 2000
++++ ../gcc-2.95.3/libstdc++/Makefile.in Thu Jan 3 20:37:55 2002
+@@ -14,7 +14,7 @@
+ # along with this library; see the file COPYING. If not, write to the Free
+ # Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+-VERSION = 2.10.0
++VERSION = 2.10.0nb1
+ INTERFACE = 3
+
+ gxx_include_dir=${includedir}/g++
diff --git a/lang/gcc/patches/patch-cm b/lang/gcc/patches/patch-cm
new file mode 100644
index 00000000000..c154a251718
--- /dev/null
+++ b/lang/gcc/patches/patch-cm
@@ -0,0 +1,13 @@
+$NetBSD: patch-cm,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/texinfo/configure.orig Fri Mar 16 15:13:47 2001
++++ ../gcc-2.95.3/texinfo/configure Thu Jan 3 20:37:55 2002
+@@ -707,7 +707,7 @@
+
+ PACKAGE=texinfo
+
+-VERSION=3.12
++VERSION=3.12nb1
+
+ if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
diff --git a/lang/gcc/patches/patch-cn b/lang/gcc/patches/patch-cn
new file mode 100644
index 00000000000..1a4be8b8ed3
--- /dev/null
+++ b/lang/gcc/patches/patch-cn
@@ -0,0 +1,5090 @@
+$NetBSD: patch-cn,v 1.1 2002/01/03 20:40:51 tron Exp $
+
+--- ../gcc-2.95.3/texinfo/texinfo.tex.orig Tue Mar 24 19:05:24 1998
++++ ../gcc-2.95.3/texinfo/texinfo.tex Thu Jan 3 20:37:56 2002
+@@ -1,52 +1,72 @@
+-%% TeX macros to handle Texinfo files.
+-%% $Id: patch-cn,v 1.1 2002/01/03 20:40:51 tron 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
+-%modify it under the terms of the GNU General Public License as
+-%published by the Free Software Foundation; either version 2, or (at
+-%your option) any later version.
+-
+-%This texinfo.tex file is distributed in the hope that it will be
+-%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+-%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-%General Public License for more details.
+-
+-%You should have received a copy of the GNU General Public License
+-%along with this 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.
+-
+-
+-%In other words, you are welcome to use, share and improve this program.
+-%You are forbidden to forbid anyone else to use, share and improve
+-%what you give them. Help stamp out software-hoarding!
+-
+-
+-% Send bug reports to bug-texinfo@prep.ai.mit.edu.
+-% Please include a *precise* test case in each bug report.
+-
+-
+-% Make it possible to create a .fmt file just by loading this file:
+-% if the underlying format is not loaded, start by loading it now.
+-% Added by gildea November 1993.
++% texinfo.tex -- TeX macros to handle Texinfo files.
++%
++% Load plain if necessary, i.e., if running under initex.
+ \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
++%
++\def\texinfoversion{2000-05-28.15}
++%
++% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
++% Free Software Foundation, Inc.
++%
++% This texinfo.tex file is free software; you can redistribute it and/or
++% modify it under the terms of the GNU General Public License as
++% published by the Free Software Foundation; either version 2, or (at
++% your option) any later version.
++%
++% This texinfo.tex file is distributed in the hope that it will be
++% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
++% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++% General Public License for more details.
++%
++% You should have received a copy of the GNU General Public License
++% along with this 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.
++%
++% In other words, you are welcome to use, share and improve this program.
++% You are forbidden to forbid anyone else to use, share and improve
++% what you give them. Help stamp out software-hoarding!
++%
++% Please try the latest version of texinfo.tex before submitting bug
++% reports; you can get the latest version from:
++% ftp://ftp.gnu.org/gnu/texinfo.tex
++% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
++% ftp://texinfo.org/tex/texinfo.tex
++% ftp://us.ctan.org/macros/texinfo/texinfo.tex
++% (and all CTAN mirrors, finger ctan@us.ctan.org for a list).
++% /home/gd/gnu/doc/texinfo.tex on the GNU machines.
++% The texinfo.tex in any given Texinfo distribution could well be out
++% of date, so if that's what you're using, please check.
++% Texinfo has a small home page at http://texinfo.org/.
++%
++% Send bug reports to bug-texinfo@gnu.org. Please include including a
++% complete document in each bug report with which we can reproduce the
++% problem. Patches are, of course, greatly appreciated.
++%
++% To process a Texinfo manual with TeX, it's most reliable to use the
++% texi2dvi shell script that comes with the distribution. For a simple
++% manual foo.texi, however, you can get away with this:
++% tex foo.texi
++% texindex foo.??
++% tex foo.texi
++% tex foo.texi
++% dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps.
++% The extra runs of TeX get the cross-reference information correct.
++% Sometimes one run after texindex suffices, and sometimes you need more
++% than two; texi2dvi does it as many times as necessary.
++%
++% It is possible to adapt texinfo.tex for other languages. You can get
++% the existing language-specific files from ftp://ftp.gnu.org/gnu/texinfo/.
+
+-% This automatically updates the version number based on RCS.
+-\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+-\deftexinfoversion$Revision: 1.1 $
+-\message{Loading texinfo package [Version \texinfoversion]:}
++\message{Loading texinfo [version \texinfoversion]:}
+
+ % If in a .fmt file, print the version number
+ % and turn on active characters that we couldn't do earlier because
+ % they might have appeared in the input file name.
+-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}
++\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+ % Save some parts of plain tex whose names we will redefine.
+-
+ \let\ptexb=\b
+ \let\ptexbullet=\bullet
+ \let\ptexc=\c
+@@ -54,25 +74,17 @@
+ \let\ptexdot=\.
+ \let\ptexdots=\dots
+ \let\ptexend=\end
+-\let\ptexequiv = \equiv
++\let\ptexequiv=\equiv
++\let\ptexexclam=\!
+ \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
+-% equivalent to this in @example-like environments. Otherwise, a space
+-% at the beginning of a line will start with \penalty -- and
+-% since \penalty is valid in vertical mode, we'd end up putting the
+-% penalty on the vertical list instead of in the new paragraph.
+-{\catcode`@ = 11
+- % Avoid using \@M directly, because that causes trouble
+- % if the definition is written into an index file.
+- \global\let\tiepenalty = \@M
+- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+-}
+-
++% We never want plain's outer \+ definition in Texinfo.
++% For @tex, we can use \tabalign.
++\let\+ = \relax
+
+ \message{Basics,}
+ \chardef\other=12
+@@ -81,18 +93,47 @@
+ % starts a new line in the output.
+ \newlinechar = `^^J
+
+-% Set up fixed words for English.
+-\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
+-\def\putwordInfo{Info}%
+-\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
+-\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
+-\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
+-\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
+-\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
+-\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
+-\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
+-\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
+-\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
++% Set up fixed words for English if not already set.
++\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
++\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
++\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
++\ifx\putwordin\undefined \gdef\putwordin{in}\fi
++\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
++\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
++\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
++\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
++\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
++\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
++\ifx\putwordof\undefined \gdef\putwordof{of}\fi
++\ifx\putwordon\undefined \gdef\putwordon{on}\fi
++\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
++\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
++\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
++\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
++\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
++\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
++\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
++%
++\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
++\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
++\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
++\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
++\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
++\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
++\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
++\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
++\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
++\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
++\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
++\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
++%
++\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
++\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
++\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
++\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
++\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
++\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
++\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+ % Ignore a token.
+ %
+@@ -113,30 +154,35 @@
+ % since that produces some useless output on the terminal.
+ %
+ \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
++\ifx\eTeXversion\undefined
+ \def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+ }%
++\else
++\def\loggingall{\tracingcommands3 \tracingstats2
++ \tracingpages1 \tracingoutput1 \tracinglostchars1
++ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
++ \tracingscantokens1 \tracingassigns1 \tracingifs1
++ \tracinggroups1 \tracingnesting2
++ \showboxbreadth\maxdimen\showboxdepth\maxdimen
++}%
++\fi
+
+ % 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
+-% Alternative @smallbook page size is 9.25in
+-\outervsize=9.25in
+-\topandbottommargin=.75in
++\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
++\newdimen\cornerlong \cornerlong=1pc
++\newdimen\cornerthick \cornerthick=.3pt
++\newdimen\topandbottommargin \topandbottommargin=.75in
+
+ % Main output routine.
+ \chardef\PAGE = 255
+@@ -168,15 +214,21 @@
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
++ % Do this early so pdf references go to the beginning of the page.
++ \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
++ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+- \line{\ewtop\hfil\ewtop}%
+- \nointerlineskip
+- \line{%
+- \vbox{\moveleft\cornerthick\nstop}%
+- \hfill
+- \vbox{\moveright\cornerthick\nstop}%
+- }%
++ \vskip-\topandbottommargin
++ \vtop to0pt{%
++ \line{\ewtop\hfil\ewtop}%
++ \nointerlineskip
++ \line{%
++ \vbox{\moveleft\cornerthick\nstop}%
++ \hfill
++ \vbox{\moveright\cornerthick\nstop}%
++ }%
++ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+@@ -199,13 +251,15 @@
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+- \line{%
+- \vbox{\moveleft\cornerthick\nsbot}%
+- \hfill
+- \vbox{\moveright\cornerthick\nsbot}%
++ \vbox to0pt{\vss
++ \line{%
++ \vbox{\moveleft\cornerthick\nsbot}%
++ \hfill
++ \vbox{\moveright\cornerthick\nsbot}%
++ }%
++ \nointerlineskip
++ \line{\ewbot\hfil\ewbot}%
+ }%
+- \nointerlineskip
+- \line{\ewbot\hfil\ewbot}%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+@@ -321,11 +375,11 @@
+ %% Call \inENV within environments (after a \begingroup)
+ \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+ \def\ENVcheck{%
+-\ifENV\errmessage{Still within an environment. Type Return to continue.}
++\ifENV\errmessage{Still within an environment; press RETURN to continue}
+ \endgroup\fi} % This is not perfect, but it should reduce lossage
+
+ % @begin foo is the same as @foo, for now.
+-\newhelp\EMsimple{Type <Return> to continue.}
++\newhelp\EMsimple{Press RETURN to continue.}
+
+ \outer\def\begin{\parsearg\beginxxx}
+
+@@ -384,7 +438,7 @@
+
+ % @@ prints an @
+ % Kludge this until the fonts are right (grr).
+-\def\@{{\tt \char '100}}
++\def\@{{\tt\char64}}
+
+ % This is turned off because it was never documented
+ % and you can use @w{...} around a quote to suppress ligatures.
+@@ -394,8 +448,8 @@
+ %\def\'{{'}}
+
+ % Used to generate quoted braces.
+-\def\mylbrace {{\tt \char '173}}
+-\def\myrbrace {{\tt \char '175}}
++\def\mylbrace {{\tt\char123}}
++\def\myrbrace {{\tt\char125}}
+ \let\{=\mylbrace
+ \let\}=\myrbrace
+ \begingroup
+@@ -432,6 +486,18 @@
+ \fi\fi
+ }
+
++% Be sure we're in horizontal mode when doing a tie, since we make space
++% equivalent to this in @example-like environments. Otherwise, a space
++% at the beginning of a line will start with \penalty -- and
++% since \penalty is valid in vertical mode, we'd end up putting the
++% penalty on the vertical list instead of in the new paragraph.
++{\catcode`@ = 11
++ % Avoid using \@M directly, because that causes trouble
++ % if the definition is written into an index file.
++ \global\let\tiepenalty = \@M
++ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
++}
++
+ % @: forces normal size whitespace following.
+ \def\:{\spacefactor=1000 }
+
+@@ -441,14 +507,11 @@
+ % @. is an end-of-sentence period.
+ \def\.{.\spacefactor=3000 }
+
+-% @enddots{} is an end-of-sentence ellipsis.
+-\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
+-
+ % @! is an end-of-sentence bang.
+-\gdef\!{!\spacefactor=3000 }
++\def\!{!\spacefactor=3000 }
+
+ % @? is an end-of-sentence query.
+-\gdef\?{?\spacefactor=3000 }
++\def\?{?\spacefactor=3000 }
+
+ % @w prevents a word break. Without the \leavevmode, @w at the
+ % beginning of a paragraph, when TeX is still in vertical mode, would
+@@ -532,53 +595,81 @@
+ %% This method tries to make TeX break the page naturally
+ %% if the depth of the box does not fit.
+ %{\baselineskip=0pt%
+-%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
++%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+ %\prevdepth=-1000pt
+ %}}
+
+ \def\needx#1{%
+- % Go into vertical mode, so we don't make a big box in the middle of a
++ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+- % Don't add any leading before our big empty box, but allow a page
+- % break, since the best break might be right here.
+- \allowbreak
+- \nointerlineskip
+- \vtop to #1\mil{\vfil}%
+- %
+- % TeX does not even consider page breaks if a penalty added to the
+- % main vertical list is 10000 or more. But in order to see if the
+- % empty box we just added fits on the page, we must make it consider
+- % page breaks. On the other hand, we don't want to actually break the
+- % page after the empty box. So we use a penalty of 9999.
+- %
+- % There is an extremely small chance that TeX will actually break the
+- % page at this \penalty, if there are no other feasible breakpoints in
+- % sight. (If the user is using lots of big @group commands, which
+- % almost-but-not-quite fill up a page, TeX will have a hard time doing
+- % good page breaking, for example.) However, I could not construct an
+- % example where a page broke at this \penalty; if it happens in a real
+- % document, then we can reconsider our strategy.
+- \penalty9999
+- %
+- % Back up by the size of the box, whether we did a page break or not.
+- \kern -#1\mil
+- %
+- % Do not allow a page break right after this kern.
+- \nobreak
++ % If the @need value is less than one line space, it's useless.
++ \dimen0 = #1\mil
++ \dimen2 = \ht\strutbox
++ \advance\dimen2 by \dp\strutbox
++ \ifdim\dimen0 > \dimen2
++ %
++ % Do a \strut just to make the height of this box be normal, so the
++ % normal leading is inserted relative to the preceding line.
++ % And a page break here is fine.
++ \vtop to #1\mil{\strut\vfil}%
++ %
++ % TeX does not even consider page breaks if a penalty added to the
++ % main vertical list is 10000 or more. But in order to see if the
++ % empty box we just added fits on the page, we must make it consider
++ % page breaks. On the other hand, we don't want to actually break the
++ % page after the empty box. So we use a penalty of 9999.
++ %
++ % There is an extremely small chance that TeX will actually break the
++ % page at this \penalty, if there are no other feasible breakpoints in
++ % sight. (If the user is using lots of big @group commands, which
++ % almost-but-not-quite fill up a page, TeX will have a hard time doing
++ % good page breaking, for example.) However, I could not construct an
++ % example where a page broke at this \penalty; if it happens in a real
++ % document, then we can reconsider our strategy.
++ \penalty9999
++ %
++ % Back up by the size of the box, whether we did a page break or not.
++ \kern -#1\mil
++ %
++ % Do not allow a page break right after this kern.
++ \nobreak
++ \fi
+ }
+
+ % @br forces paragraph break
+
+ \let\br = \par
+
+-% @dots{} output some dots
++% @dots{} output an ellipsis using the current font.
++% We do .5em per period so that it has the same spacing in a typewriter
++% font as three actual period characters.
++%
++\def\dots{%
++ \leavevmode
++ \hbox to 1.5em{%
++ \hskip 0pt plus 0.25fil minus 0.25fil
++ .\hss.\hss.%
++ \hskip 0pt plus 0.5fil minus 0.5fil
++ }%
++}
++
++% @enddots{} is an end-of-sentence ellipsis.
++%
++\def\enddots{%
++ \leavevmode
++ \hbox to 2em{%
++ \hskip 0pt plus 0.25fil minus 0.25fil
++ .\hss.\hss.\hss.%
++ \hskip 0pt plus 0.5fil minus 0.5fil
++ }%
++ \spacefactor=3000
++}
+
+-\def\dots{$\ldots$}
+
+ % @page forces the start of a new page
+-
++%
+ \def\page{\par\vfill\supereject}
+
+ % @exdent text....
+@@ -645,420 +736,296 @@
+ % @c is the same as @comment
+ % @ignore ... @end ignore is another way to write a comment
+
+-\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+-\parsearg \commentxxx}
+-
+-\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
++\def\comment{\begingroup \catcode`\^^M=\other%
++\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
++\commentxxx}
++{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+ \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.
+-\def\ignoresections{%
+-\let\chapter=\relax
+-\let\unnumbered=\relax
+-\let\top=\relax
+-\let\unnumberedsec=\relax
+-\let\unnumberedsection=\relax
+-\let\unnumberedsubsec=\relax
+-\let\unnumberedsubsection=\relax
+-\let\unnumberedsubsubsec=\relax
+-\let\unnumberedsubsubsection=\relax
+-\let\section=\relax
+-\let\subsec=\relax
+-\let\subsubsec=\relax
+-\let\subsection=\relax
+-\let\subsubsection=\relax
+-\let\appendix=\relax
+-\let\appendixsec=\relax
+-\let\appendixsection=\relax
+-\let\appendixsubsec=\relax
+-\let\appendixsubsection=\relax
+-\let\appendixsubsubsec=\relax
+-\let\appendixsubsubsection=\relax
+-\let\contents=\relax
+-\let\smallbook=\relax
+-\let\titlepage=\relax
++% @paragraphindent NCHARS
++% We'll use ems for NCHARS, close enough.
++% We cannot implement @paragraphindent asis, though.
++%
++\def\asisword{asis} % no translation, these are keywords
++\def\noneword{none}
++%
++\def\paragraphindent{\parsearg\doparagraphindent}
++\def\doparagraphindent#1{%
++ \def\temp{#1}%
++ \ifx\temp\asisword
++ \else
++ \ifx\temp\noneword
++ \defaultparindent = 0pt
++ \else
++ \defaultparindent = #1em
++ \fi
++ \fi
++ \parindent = \defaultparindent
+ }
+
+-% Used in nested conditionals, where we have to parse the Texinfo source
+-% and so want to turn off most commands, in case they are used
+-% incorrectly.
+-%
+-\def\ignoremorecommands{%
+- \let\defcodeindex = \relax
+- \let\defcv = \relax
+- \let\deffn = \relax
+- \let\deffnx = \relax
+- \let\defindex = \relax
+- \let\defivar = \relax
+- \let\defmac = \relax
+- \let\defmethod = \relax
+- \let\defop = \relax
+- \let\defopt = \relax
+- \let\defspec = \relax
+- \let\deftp = \relax
+- \let\deftypefn = \relax
+- \let\deftypefun = \relax
+- \let\deftypevar = \relax
+- \let\deftypevr = \relax
+- \let\defun = \relax
+- \let\defvar = \relax
+- \let\defvr = \relax
+- \let\ref = \relax
+- \let\xref = \relax
+- \let\printindex = \relax
+- \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
+- \let\down = \relax
+- \let\raisesections = \relax
+- \let\up = \relax
+- \let\set = \relax
+- \let\clear = \relax
+- \let\item = \relax
++% @exampleindent NCHARS
++% We'll use ems for NCHARS like @paragraphindent.
++% It seems @exampleindent asis isn't necessary, but
++% I preserve it to make it similar to @paragraphindent.
++\def\exampleindent{\parsearg\doexampleindent}
++\def\doexampleindent#1{%
++ \def\temp{#1}%
++ \ifx\temp\asisword
++ \else
++ \ifx\temp\noneword
++ \lispnarrowing = 0pt
++ \else
++ \lispnarrowing = #1em
++ \fi
++ \fi
+ }
+
+-% Ignore @ignore ... @end ignore.
++% @asis just yields its argument. Used with @table, for example.
+ %
+-\def\ignore{\doignore{ignore}}
++\def\asis#1{#1}
+
+-% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text.
++% @math means output in math mode.
++% We don't use $'s directly in the definition of \math because control
++% sequences like \math are expanded when the toc file is written. Then,
++% we read the toc file back, the $'s will be normal characters (as they
++% should be, according to the definition of Texinfo). So we must use a
++% control sequence to switch into and out of math mode.
+ %
+-\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
++% This isn't quite enough for @math to work properly in indices, but it
++% seems unlikely it will ever be needed there.
++%
++\let\implicitmath = $
++\def\math#1{\implicitmath #1\implicitmath}
+
++% @bullet and @minus need the same treatment as @math, just above.
++\def\bullet{\implicitmath\ptexbullet\implicitmath}
++\def\minus{\implicitmath-\implicitmath}
+
+-% @dircategory CATEGORY -- specify a category of the dir file
+-% which this file should belong to. Ignore this in TeX.
+-\let\dircategory = \comment
++% @refill is a no-op.
++\let\refill=\relax
+
+-% Ignore text until a line `@end #1'.
++% If working on a large document in chapters, it is convenient to
++% be able to disable indexing, cross-referencing, and contents, for test runs.
++% This is done with @novalidate (before @setfilename).
+ %
+-\def\doignore#1{\begingroup
+- % Don't complain about control sequences we have declared \outer.
+- \ignoresections
+- %
+- % Define a command to swallow text until we reach `@end #1'.
+- \long\def\doignoretext##1\end #1{\enddoignore}%
+- %
+- % Make sure that spaces turn into tokens that match what \doignoretext wants.
+- \catcode32 = 10
+- %
+- % Ignore braces, too, so mismatched braces don't cause trouble.
+- \catcode`\{ = 9
+- \catcode`\} = 9
+- %
+- % And now expand that command.
+- \doignoretext
++\newif\iflinks \linkstrue % by default we want the aux files.
++\let\novalidate = \linksfalse
++
++% @setfilename is done at the beginning of every texinfo file.
++% So open here the files we need to have open while reading the input.
++% This makes it possible to make a .fmt file for texinfo.
++\def\setfilename{%
++ \iflinks
++ \readauxfile
++ \fi % \openindices needs to do some work in any case.
++ \openindices
++ \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.
+ }
+
+-% What we do to finish off ignored text.
++% Called from \setfilename.
+ %
+-\def\enddoignore{\endgroup\ignorespaces}%
++\def\openindices{%
++ \newindex{cp}%
++ \newcodeindex{fn}%
++ \newcodeindex{vr}%
++ \newcodeindex{tp}%
++ \newcodeindex{ky}%
++ \newcodeindex{pg}%
++}
+
+-\newif\ifwarnedobs\warnedobsfalse
+-\def\obstexwarn{%
+- \ifwarnedobs\relax\else
+- % We need to warn folks that they may have trouble with TeX 3.0.
+- % This uses \immediate\write16 rather than \message to get newlines.
+- \immediate\write16{}
+- \immediate\write16{***WARNING*** for users of Unix TeX 3.0!}
+- \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+- \immediate\write16{If you are running another version of TeX, relax.}
+- \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
++% @bye.
++\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
++
++
++\message{pdf,}
++% adobe `portable' document format
++\newcount\tempnum
++\newcount\lnkcount
++\newtoks\filename
++\newcount\filenamelength
++\newcount\pgn
++\newtoks\toksA
++\newtoks\toksB
++\newtoks\toksC
++\newtoks\toksD
++\newbox\boxA
++\newcount\countA
++\newif\ifpdf
++\newif\ifpdfmakepagedest
++
++\ifx\pdfoutput\undefined
++ \pdffalse
++ \let\pdfmkdest = \gobble
++ \let\pdfurl = \gobble
++ \let\endlink = \relax
++ \let\linkcolor = \relax
++ \let\pdfmakeoutlines = \relax
++\else
++ \pdftrue
++ \pdfoutput = 1
++ \input pdfcolor
++ \def\dopdfimage#1#2#3{%
++ \def\imagewidth{#2}%
++ \def\imageheight{#3}%
++ \ifnum\pdftexversion < 14
++ \pdfimage
++ \else
++ \pdfximage
+ \fi
+-}
+-
+-% **In TeX 3.0, setting text in \nullfont hangs tex. For a
+-% workaround (which requires the file ``dummy.tfm'' to be installed),
+-% uncomment the following line:
+-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+-
+-% Ignore text, except that we keep track of conditional commands for
+-% purposes of nesting, up to an `@end #1' command.
+-%
+-\def\nestedignore#1{%
+- \obstexwarn
+- % We must actually expand the ignored text to look for the @end
+- % command, so that nested ignore constructs work. Thus, we put the
+- % text into a \vbox and then do nothing with the result. To minimize
+- % the change of memory overflow, we follow the approach outlined on
+- % page 401 of the TeXbook: make the current font be a dummy font.
+- %
+- \setbox0 = \vbox\bgroup
+- % Don't complain about control sequences we have declared \outer.
+- \ignoresections
+- %
+- % Define `@end #1' to end the box, which will in turn undefine the
+- % @end command again.
+- \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+- %
+- % We are going to be parsing Texinfo commands. Most cause no
+- % trouble when they are used incorrectly, but some commands do
+- % complicated argument parsing or otherwise get confused, so we
+- % undefine them.
+- %
+- % We can't do anything about stray @-signs, unfortunately;
+- % they'll produce `undefined control sequence' errors.
+- \ignoremorecommands
+- %
+- % Set the current font to be \nullfont, a TeX primitive, and define
+- % all the font commands to also use \nullfont. We don't use
+- % dummy.tfm, as suggested in the TeXbook, because not all sites
+- % might have that installed. Therefore, math mode will still
+- % produce output, but that should be an extremely small amount of
+- % stuff compared to the main input.
+- %
+- \nullfont
+- \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont
+- \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont
+- \let\tensf = \nullfont
+- % Similarly for index fonts (mostly for their use in
+- % smallexample)
+- \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
+- \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
+- \let\indsf = \nullfont
+- %
+- % Don't complain when characters are missing from the fonts.
+- \tracinglostchars = 0
+- %
+- % Don't bother to do space factor calculations.
+- \frenchspacing
+- %
+- % Don't report underfull hboxes.
+- \hbadness = 10000
+- %
+- % Do minimal line-breaking.
+- \pretolerance = 10000
+- %
+- % Do not execute instructions in @tex
+- \def\tex{\doignore{tex}}%
+-}
+-
+-% @set VAR sets the variable VAR to an empty value.
+-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+-%
+-% Since we want to separate VAR from REST-OF-LINE (which might be
+-% 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{%
+- \def\temp{#2}%
+- \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+- \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
+-% \next or other control sequences that we've defined might get us into
+-% an infinite loop. Consider `@set foo @cite{bar}'.
+-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+-
+-% @clear VAR clears (i.e., unsets) the variable VAR.
+-%
+-\def\clear{\parsearg\clearxxx}
+-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+-
+-% @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
+-% with @set.
+-%
+-\def\ifset{\parsearg\ifsetxxx}
+-\def\ifsetxxx #1{%
+- \expandafter\ifx\csname SET#1\endcsname\relax
+- \expandafter\ifsetfail
+- \else
+- \expandafter\ifsetsucceed
+- \fi
+-}
+-\def\ifsetsucceed{\conditionalsucceed{ifset}}
+-\def\ifsetfail{\nestedignore{ifset}}
+-\defineunmatchedend{ifset}
+-
+-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+-% defined with @set, or has been undefined with @clear.
+-%
+-\def\ifclear{\parsearg\ifclearxxx}
+-\def\ifclearxxx #1{%
+- \expandafter\ifx\csname SET#1\endcsname\relax
+- \expandafter\ifclearsucceed
+- \else
+- \expandafter\ifclearfail
+- \fi
+-}
+-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+-\def\ifclearfail{\nestedignore{ifclear}}
+-\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
+-% at @end iftex, since then @set commands inside the conditional have no
+-% effect (they'd get reverted at the end of the group). So we must
+-% define \Eiftex to redefine itself to be its previous value. (We can't
+-% just define it to fail again with an ``unmatched end'' error, since
+-% the @ifset might be nested.)
+-%
+-\def\conditionalsucceed#1{%
+- \edef\temp{%
+- % Remember the current value of \E#1.
+- \let\nece{prevE#1} = \nece{E#1}%
+- %
+- % At the `@end #1', redefine \E#1 to be its previous value.
+- \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
+- }%
+- \temp
+-}
+-
+-% We need to expand lots of \csname's, but we don't want to expand the
+-% control sequences after we've constructed them.
+-%
+-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+-
+-% @asis just yields its argument. Used with @table, for example.
+-%
+-\def\asis#1{#1}
+-
+-% @math means output in math mode.
+-% We don't use $'s directly in the definition of \math because control
+-% sequences like \math are expanded when the toc file is written. Then,
+-% we read the toc file back, the $'s will be normal characters (as they
+-% should be, according to the definition of Texinfo). So we must use a
+-% control sequence to switch into and out of math mode.
+-%
+-% This isn't quite enough for @math to work properly in indices, but it
+-% seems unlikely it will ever be needed there.
+-%
+-\let\implicitmath = $
+-\def\math#1{\implicitmath #1\implicitmath}
+-
+-% @bullet and @minus need the same treatment as @math, just above.
+-\def\bullet{\implicitmath\ptexbullet\implicitmath}
+-\def\minus{\implicitmath-\implicitmath}
+-
+-\def\node{\ENVcheck\parsearg\nodezzz}
+-\def\nodezzz#1{\nodexxx [#1,]}
+-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+-\let\nwnode=\node
+-\let\lastnode=\relax
+-
+-\def\donoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-\def\unnumbnoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-\def\appendixnoderef{\ifx\lastnode\relax\else
+-\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+-\global\let\lastnode=\relax}
+-
+-% @refill is a no-op.
+-\let\refill=\relax
+-
+-% @setfilename is done at the beginning of every texinfo file.
+-% So open here the files we need to have open while reading the input.
+-% This makes it possible to make a .fmt file for texinfo.
+-\def\setfilename{%
+- \readauxfile
+- \opencontents
+- \openindices
+- \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{}
++ \ifx\empty\imagewidth\else width \imagewidth \fi
++ \ifx\empty\imageheight\else height \imageheight \fi
++ {#1.pdf}%
++ \ifnum\pdftexversion < 14 \else
++ \pdfrefximage \pdflastximage
++ \fi}
++ \def\pdfmkdest#1{\pdfdest name{#1@} xyz}
++ \def\pdfmkpgn#1{#1@}
++ \let\linkcolor = \Blue % was Cyan, but that seems light?
++ \def\endlink{\Black\pdfendlink}
++ % Adding outlines to PDF; macros for calculating structure of outlines
++ % come from Petr Olsak
++ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
++ \else \csname#1\endcsname \fi}
++ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
++ \advance\tempnum by1
++ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
++ \def\pdfmakeoutlines{{%
++ \openin 1 \jobname.toc
++ \ifeof 1\else\bgroup
++ \closein 1
++ \indexnofonts
++ \def\tt{}
++ \let\_ = \normalunderscore
++ % Thanh's hack / proper braces in bookmarks
++ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
++ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
++ %
++ \def\chapentry ##1##2##3{}
++ \def\unnumbchapentry ##1##2{}
++ \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
++ \def\unnumbsecentry ##1##2{}
++ \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
++ \def\unnumbsubsecentry ##1##2{}
++ \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
++ \def\unnumbsubsubsecentry ##1##2{}
++ \input \jobname.toc
++ \def\chapentry ##1##2##3{%
++ \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
++ \def\unnumbchapentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\secentry ##1##2##3##4{%
++ \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
++ \def\unnumbsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\subsecentry ##1##2##3##4##5{%
++ \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
++ \def\unnumbsubsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \def\subsubsecentry ##1##2##3##4##5##6{%
++ \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
++ \def\unnumbsubsubsecentry ##1##2{%
++ \pdfoutline goto name{\pdfmkpgn{##2}}{##1}}
++ \input \jobname.toc
++ \egroup\fi
++ }}
++ \def\makelinks #1,{%
++ \def\params{#1}\def\E{END}%
++ \ifx\params\E
++ \let\nextmakelinks=\relax
++ \else
++ \let\nextmakelinks=\makelinks
++ \ifnum\lnkcount>0,\fi
++ \picknum{#1}%
++ \startlink attr{/Border [0 0 0]}
++ goto name{\pdfmkpgn{\the\pgn}}%
++ \linkcolor #1%
++ \advance\lnkcount by 1%
++ \endlink
++ \fi
++ \nextmakelinks
++ }
++ \def\picknum#1{\expandafter\pn#1}
++ \def\pn#1{%
++ \def\p{#1}%
++ \ifx\p\lbrace
++ \let\nextpn=\ppn
++ \else
++ \let\nextpn=\ppnn
++ \def\first{#1}
++ \fi
++ \nextpn
++ }
++ \def\ppn#1{\pgn=#1\gobble}
++ \def\ppnn{\pgn=\first}
++ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
++ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
++ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
++ \ifx\PP\D\let\nextsp\relax
++ \else\let\nextsp\skipspaces
++ \ifx\p\space\else\addtokens{\filename}{\PP}%
++ \advance\filenamelength by 1
++ \fi
++ \fi
++ \nextsp}
++ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
++ \ifnum\pdftexversion < 14
++ \let \startlink \pdfannotlink
++ \else
++ \let \startlink \pdfstartlink
++ \fi
++ \def\pdfurl#1{%
++ \begingroup
++ \normalturnoffactive\def\@{@}%
++ \leavevmode\Red
++ \startlink attr{/Border [0 0 0]}%
++ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
++ % #1
++ \endgroup}
++ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
++ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
++ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
++ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
++ \def\maketoks{%
++ \expandafter\poptoks\the\toksA|ENDTOKS|
++ \ifx\first0\adn0
++ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
++ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
++ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
++ \else
++ \ifnum0=\countA\else\makelink\fi
++ \ifx\first.\let\next=\done\else
++ \let\next=\maketoks
++ \addtokens{\toksB}{\the\toksD}
++ \ifx\first,\addtokens{\toksB}{\space}\fi
++ \fi
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
++ \next}
++ \def\makelink{\addtokens{\toksB}%
++ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
++ \def\pdflink#1{%
++ \startlink attr{/Border [0 0 0]} goto name{\mkpgn{#1}}
++ \linkcolor #1\endlink}
++ \def\mkpgn#1{#1@}
++ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
++\fi % \ifx\pdfoutput
+
+
+ \message{fonts,}
+-
+ % Font-change commands.
+
+-% Texinfo supports the sans serif font style, which plain TeX does not.
++% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+ % So we set up a \sf analogous to plain's \rm, etc.
+ \newfam\sffam
+ \def\sf{\fam=\sffam \tensf}
+@@ -1124,22 +1091,17 @@
+ \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 indices, footnotes, small examples (9pt).
++\setfont\smallrm\rmshape{9}{1000}
++\setfont\smalltt\ttshape{9}{1000}
++\setfont\smallbf\bfshape{10}{900}
++\setfont\smallit\itshape{9}{1000}
++\setfont\smallsl\slshape{9}{1000}
++\setfont\smallsf\sfshape{9}{1000}
++\setfont\smallsc\scshape{10}{900}
++\setfont\smallttsl\ttslshape{10}{900}
++\font\smalli=cmmi9
++\font\smallsy=cmsy9
+
+ % Fonts for title page:
+ \setfont\titlerm\rmbshape{12}{\magstep3}
+@@ -1236,7 +1198,7 @@
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+-\def\titlefont#1{{\titlefonts #1}}
++\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
+@@ -1253,16 +1215,21 @@
+ \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}}
++\def\smallfonts{%
++ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
++ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
++ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
++ \let\tenttsl=\smallttsl
++ \resetmathfonts \setleading{11pt}}
+
+ % Set up the default fonts, so we can use them for creating boxes.
+ %
+ \textfonts
+
++% Define these so they can be easily changed for other fonts.
++\def\angleleft{$\langle$}
++\def\angleright{$\rangle$}
++
+ % Count depth in font-changes, for error checks
+ \newcount\fontdepth \fontdepth=0
+
+@@ -1277,13 +1244,14 @@
+ % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+ % unless the following character is such as not to need one.
+ \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+-\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
++\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx}
++\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx}
+
+ \let\i=\smartitalic
+-\let\var=\smartitalic
+-\let\dfn=\smartitalic
++\let\var=\smartslanted
++\let\dfn=\smartslanted
+ \let\emph=\smartitalic
+-\let\cite=\smartitalic
++\let\cite=\smartslanted
+
+ \def\b#1{{\bf #1}}
+ \let\strong=\b
+@@ -1300,20 +1268,22 @@
+ \null
+ }
+ \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{%
++\def\samp#1{`\tclose{#1}'\null}
++\setfont\keyrm\rmshape{8}{1000}
++\font\keysy=cmsy9
++\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
++ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+- \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
++ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+- \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
++ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+ % The old definition, with no lozenge:
+ %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+ \def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
++% @file, @option are the same as @samp.
+ \let\file=\samp
++\let\option=\samp
+
+ % @code is a modification of @t,
+ % which makes spaces the same size as normal in the surrounding text.
+@@ -1348,20 +1318,18 @@
+ % 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
+-% wrap around. It is necessary for - and _ to be active before the index is
+-% 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
+-}
++ \catcode`\-=\active
++ \catcode`\_=\active
++ %
++ \global\def\code{\begingroup
++ \catcode`\-=\active \let-\codedash
++ \catcode`\_=\active \let_\codeunder
++ \codex
++ }
++ %
++ % If we end up with any active - characters when handling the index,
++ % just treat them as a normal -.
++ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+ }
+
+ \def\realdash{-}
+@@ -1402,27 +1370,55 @@
+ \else{\tclose{\kbdfont\look}}\fi
+ \else{\tclose{\kbdfont\look}}\fi}
+
+-% @url. Quotes do not seem necessary, so use \code.
++% For @url, @env, @command quotes seem unnecessary, so use \code.
+ \let\url=\code
++\let\env=\code
++\let\command=\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}%
++% @uref (abbreviation for `urlref') takes an optional (comma-separated)
++% second argument specifying the text to display and an optional third
++% arg as text to display instead of (rather than in addition to) the url
++% itself. First (mandatory) arg is the url. Perhaps eventually put in
++% a hypertex \special here.
++%
++\def\uref#1{\douref #1,,,\finish}
++\def\douref#1,#2,#3,#4\finish{\begingroup
++ \unsepspaces
++ \pdfurl{#1}%
++ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+- \unhbox0\ (\code{#1})%
++ \unhbox0 % third arg given, show only that
+ \else
+- \code{#1}%
++ \setbox0 = \hbox{\ignorespaces #2}%
++ \ifdim\wd0 > 0pt
++ \ifpdf
++ \unhbox0 % PDF: 2nd arg given, show only it
++ \else
++ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
++ \fi
++ \else
++ \code{#1}% only url given, so show it
++ \fi
+ \fi
+-}
++ \endlink
++\endgroup}
+
+-% 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
++% rms does not like angle brackets --karl, 17may97.
++% So now @email is just like @uref, unless we are pdf.
++%
++%\def\email#1{\angleleft{\tt #1}\angleright}
++\ifpdf
++ \def\email#1{\doemail#1,,\finish}
++ \def\doemail#1,#2,#3\finish{\begingroup
++ \unsepspaces
++ \pdfurl{mailto:#1}%
++ \setbox0 = \hbox{\ignorespaces #2}%
++ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
++ \endlink
++ \endgroup}
++\else
++ \let\email=\uref
++\fi
+
+ % Check if we are currently using a typewriter font. Since all the
+ % Computer Modern typewriter fonts have zero interword stretch (and
+@@ -1432,8 +1428,7 @@
+ \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+ % Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+-% argument is to make the input look right: @dmn{pt} instead of
+-% @dmn{}pt.
++% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+ %
+ \def\dmn#1{\thinspace #1}
+
+@@ -1444,11 +1439,14 @@
+ % Polish suppressed-l. --karl, 22sep96.
+ %\def\l#1{{\li #1}\null}
+
++% Explicit font changes: @r, @sc, undocumented @ii.
+ \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
+
++% @acronym downcases the argument and prints in smallcaps.
++\def\acronym#1{{\smallcaps \lowercase{#1}}}
++
+ % @pounds{} is a sterling sign.
+ \def\pounds{{\it\$}}
+
+@@ -1462,15 +1460,20 @@
+ \newif\ifseenauthor
+ \newif\iffinishedtitlepage
+
++% Do an implicit @contents or @shortcontents after @end titlepage if the
++% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
++%
++\newif\ifsetcontentsaftertitlepage
++ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
++\newif\ifsetshortcontentsaftertitlepage
++ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
++
+ \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
+ \let\subtitlerm=\tenrm
+-% I deinstalled the following change because \cmr12 is undefined.
+-% This change was not in the ChangeLog anyway. --rms.
+-% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+@@ -1519,6 +1522,23 @@
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
++ %
++ % If they want short, they certainly want long too.
++ \ifsetshortcontentsaftertitlepage
++ \shortcontents
++ \contents
++ \global\let\shortcontents = \relax
++ \global\let\contents = \relax
++ \fi
++ %
++ \ifsetcontentsaftertitlepage
++ \contents
++ \global\let\contents = \relax
++ \global\let\shortcontents = \relax
++ \fi
++ %
++ \ifpdf \pdfmakepagedesttrue \fi
++ %
+ \HEADINGSon
+ }
+
+@@ -1532,10 +1552,10 @@
+
+ \let\thispage=\folio
+
+-\newtoks \evenheadline % Token sequence for heading line of even pages
+-\newtoks \oddheadline % Token sequence for heading line of odd pages
+-\newtoks \evenfootline % Token sequence for footing line of even pages
+-\newtoks \oddfootline % Token sequence for footing line of odd pages
++\newtoks\evenheadline % headline on even pages
++\newtoks\oddheadline % headline on odd pages
++\newtoks\evenfootline % footline on even pages
++\newtoks\oddfootline % footline on odd pages
+
+ % Now make Tex use those variables
+ \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+@@ -1652,40 +1672,28 @@
+ }
+
+ % Subroutines used in generating headings
+-% Produces Day Month Year style of output.
+-\def\today{\number\day\space
+-\ifcase\month\or
+-January\or February\or March\or April\or May\or June\or
+-July\or August\or September\or October\or November\or December\fi
+-\space\number\year}
+-
+-% Use this if you want the Month Day, Year style of output.
+-%\def\today{\ifcase\month\or
+-%January\or February\or March\or April\or May\or June\or
+-%July\or August\or September\or October\or November\or December\fi
+-%\space\number\day, \number\year}
+-
+-% @settitle line... specifies the title of the document, for headings
+-% It generates no output of its own
++% This produces Day Month Year style of output.
++% Only define if not already defined, in case a txi-??.tex file has set
++% up a different format (e.g., txi-cs.tex does this).
++\ifx\today\undefined
++\def\today{%
++ \number\day\space
++ \ifcase\month
++ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
++ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
++ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
++ \fi
++ \space\number\year}
++\fi
+
+-\def\thistitle{No Title}
++% @settitle line... specifies the title of the document, for headings.
++% It generates no output of its own.
++\def\thistitle{\putwordNoTitle}
+ \def\settitle{\parsearg\settitlezzz}
+ \def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+ \message{tables,}
+-
+-% @tabs -- simple alignment
+-
+-% These don't work. For one thing, \+ is defined as outer.
+-% So these macros cannot even be defined.
+-
+-%\def\tabs{\parsearg\tabszzz}
+-%\def\tabszzz #1{\settabs\+#1\cr}
+-%\def\tabline{\parsearg\tablinezzz}
+-%\def\tablinezzz #1{\+#1\cr}
+-%\def\&{&}
+-
+ % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+ % default indentation of table text
+@@ -1729,11 +1737,6 @@
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+- % Be sure we are not still in the middle of a paragraph.
+- %{\parskip = 0in
+- %\par
+- %}%
+- %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+@@ -1762,13 +1765,17 @@
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+- % following text (if any) will end up on the same line. Since that
+- % text will be indented by \tableindent, we make the item text be in
+- % a zero-width box.
++ % following text (if any) will end up on the same line.
+ \noindent
+- \rlap{\hskip -\tableindent\box0}\ignorespaces%
+- \endgroup%
+- \itemxneedsnegativevskiptrue%
++ % Do this with kerns and \unhbox so that if there is a footnote in
++ % the item text, it can migrate to the main vertical list and
++ % eventually be printed.
++ \nobreak\kern-\tableindent
++ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
++ \unhbox0
++ \nobreak\kern\dimen0
++ \endgroup
++ \itemxneedsnegativevskiptrue
+ \fi
+ }
+
+@@ -1779,9 +1786,10 @@
+ \def\xitem{\errmessage{@xitem while not in a table}}
+ \def\xitemx{\errmessage{@xitemx while not in a table}}
+
+-%% Contains a kludge to get @end[description] to work
++% Contains a kludge to get @end[description] to work.
+ \def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
++% @table, @ftable, @vtable.
+ \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+ {\obeylines\obeyspaces%
+ \gdef\tablex #1^^M{%
+@@ -1841,7 +1849,7 @@
+ \def\itemize{\parsearg\itemizezzz}
+
+ \def\itemizezzz #1{%
+- \begingroup % ended by the @end itemsize
++ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+ }
+
+@@ -2043,10 +2051,7 @@
+ % @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
+@@ -2056,129 +2061,150 @@
+ \multitablecolspace=12pt
+ \multitablelinespace=0pt
+
+-%%%%
+ % Macros used to set up halign preamble:
++%
+ \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}
++% #1 is the part of the @columnfraction before the decimal point, which
++% is presumably either 0 or the empty string (but we don't check, we
++% just throw it away). #2 is the decimal part, which we use as the
++% percent of \hsize for this column.
++\def\pickupwholefraction#1.#2 {%
++ \global\advance\colcount by 1
++ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
++ \setuptable
++}
+
+ \newcount\colcount
+-\def\setuptable#1{\def\firstarg{#1}%
+-\ifx\firstarg\xendsetuptable\let\go\relax%
+-\else
+- \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
++\def\setuptable#1{%
++ \def\firstarg{#1}%
++ \ifx\firstarg\xendsetuptable
++ \let\go = \relax
+ \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.
++ \ifx\firstarg\xcolumnfractions
++ \global\setpercenttrue
++ \else
++ \ifsetpercent
++ \let\go\pickupwholefraction
++ \else
++ \global\advance\colcount by 1
++ \setbox0=\hbox{#1\unskip }% 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
++ % Put the argument back for the \pickupwholefraction call, so
++ % we'll always have a period there to be parsed.
++ \def\go{\pickupwholefraction#1}%
+ \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}%
++ \let\go = \setuptable
+ \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.
++ \fi
++ \go
++}
+
++% This used to have \hskip1sp. But then the space in a template line is
++% not enough. That is bad. So let's go back to just & until we
++% encounter the problem it was intended to solve again.
++% --karl, nathan@acm.org, 20apr99.
++\def\tab{&}
+
+-%%%%
+ % @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
+- % we will use that dimension as the width of the column, and
+- % the \leftskip will keep entries from bumping into each other.
+- % Table will start at left margin and final column will justify at
+- % right margin.
+-\ifnum\colcount=1
+-\else
+- \ifsetpercent
++ \vskip\parskip
++ \let\item\crcr
++ \tolerance=9500
++ \hbadness=9500
++ \setmultitablespacing
++ \parskip=\multitableparskip
++ \parindent=\multitableparindent
++ \overfullrule=0pt
++ \global\colcount=0
++ \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}%
++ %
++ % To parse everything between @multitable and @item:
++ \setuptable#1 \endsetuptable
++ %
++ % \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.
++ \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}}%
++ %
++ % 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 the user has set preamble in terms of percent of \hsize we will
++ % use that dimension as the width of the column, and the \leftskip
++ % will keep entries from bumping into each other. Table will start at
++ % left margin and final column will justify at right margin.
++ %
++ % Make sure we don't inherit \rightskip from the outer environment.
++ \rightskip=0pt
++ \ifnum\colcount=1
++ % The first column will be indented with the surrounding text.
++ \advance\hsize by\leftskip
+ \else
+- % If user has <not> set preamble in terms of percent of \hsize
+- % we will advance \hsize by \multitablecolspace
+- \advance\hsize by \multitablecolspace
++ \ifsetpercent \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
+- % 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}}
++ % 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
+ }
+
+ \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
++\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
++\global\advance\multitablelinespace by-\ht0
+ %% 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
++%% FIXME: what is \box0 supposed to be?
+ \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+ width0pt\relax} \fi
++%% 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.
+ \ifdim\multitableparskip>\multitablelinespace
+ \global\multitableparskip=\multitablelinespace
+ \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+@@ -2191,6 +2217,356 @@
+ \fi}
+
+
++\message{conditionals,}
++% Prevent errors for section commands.
++% Used in @ignore and in failing conditionals.
++\def\ignoresections{%
++ \let\chapter=\relax
++ \let\unnumbered=\relax
++ \let\top=\relax
++ \let\unnumberedsec=\relax
++ \let\unnumberedsection=\relax
++ \let\unnumberedsubsec=\relax
++ \let\unnumberedsubsection=\relax
++ \let\unnumberedsubsubsec=\relax
++ \let\unnumberedsubsubsection=\relax
++ \let\section=\relax
++ \let\subsec=\relax
++ \let\subsubsec=\relax
++ \let\subsection=\relax
++ \let\subsubsection=\relax
++ \let\appendix=\relax
++ \let\appendixsec=\relax
++ \let\appendixsection=\relax
++ \let\appendixsubsec=\relax
++ \let\appendixsubsection=\relax
++ \let\appendixsubsubsec=\relax
++ \let\appendixsubsubsection=\relax
++ \let\contents=\relax
++ \let\smallbook=\relax
++ \let\titlepage=\relax
++}
++
++% Used in nested conditionals, where we have to parse the Texinfo source
++% and so want to turn off most commands, in case they are used
++% incorrectly.
++%
++\def\ignoremorecommands{%
++ \let\defcodeindex = \relax
++ \let\defcv = \relax
++ \let\deffn = \relax
++ \let\deffnx = \relax
++ \let\defindex = \relax
++ \let\defivar = \relax
++ \let\defmac = \relax
++ \let\defmethod = \relax
++ \let\defop = \relax
++ \let\defopt = \relax
++ \let\defspec = \relax
++ \let\deftp = \relax
++ \let\deftypefn = \relax
++ \let\deftypefun = \relax
++ \let\deftypeivar = \relax
++ \let\deftypeop = \relax
++ \let\deftypevar = \relax
++ \let\deftypevr = \relax
++ \let\defun = \relax
++ \let\defvar = \relax
++ \let\defvr = \relax
++ \let\ref = \relax
++ \let\xref = \relax
++ \let\printindex = \relax
++ \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
++ \let\down = \relax
++ \let\raisesections = \relax
++ \let\up = \relax
++ \let\set = \relax
++ \let\clear = \relax
++ \let\item = \relax
++}
++
++% Ignore @ignore ... @end ignore.
++%
++\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}}
++
++% @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'.
++%
++\def\doignore#1{\begingroup
++ % Don't complain about control sequences we have declared \outer.
++ \ignoresections
++ %
++ % Define a command to swallow text until we reach `@end #1'.
++ % This @ is a catcode 12 token (that is the normal catcode of @ in
++ % this texinfo.tex file). We change the catcode of @ below to match.
++ \long\def\doignoretext##1@end #1{\enddoignore}%
++ %
++ % Make sure that spaces turn into tokens that match what \doignoretext wants.
++ \catcode32 = 10
++ %
++ % Ignore braces, too, so mismatched braces don't cause trouble.
++ \catcode`\{ = 9
++ \catcode`\} = 9
++ %
++ % We must not have @c interpreted as a control sequence.
++ \catcode`\@ = 12
++ %
++ % Make the letter c a comment character so that the rest of the line
++ % will be ignored. This way, the document can have (for example)
++ % @c @end ifinfo
++ % and the @end ifinfo will be properly ignored.
++ % (We've just changed @ to catcode 12.)
++ \catcode`\c = 14
++ %
++ % And now expand that command.
++ \doignoretext
++}
++
++% What we do to finish off ignored text.
++%
++\def\enddoignore{\endgroup\ignorespaces}%
++
++\newif\ifwarnedobs\warnedobsfalse
++\def\obstexwarn{%
++ \ifwarnedobs\relax\else
++ % We need to warn folks that they may have trouble with TeX 3.0.
++ % This uses \immediate\write16 rather than \message to get newlines.
++ \immediate\write16{}
++ \immediate\write16{WARNING: for users of Unix TeX 3.0!}
++ \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
++ \immediate\write16{If you are running another version of TeX, relax.}
++ \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.org/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
++}
++
++% **In TeX 3.0, setting text in \nullfont hangs tex. For a
++% workaround (which requires the file ``dummy.tfm'' to be installed),
++% uncomment the following line:
++%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
++
++% Ignore text, except that we keep track of conditional commands for
++% purposes of nesting, up to an `@end #1' command.
++%
++\def\nestedignore#1{%
++ \obstexwarn
++ % We must actually expand the ignored text to look for the @end
++ % command, so that nested ignore constructs work. Thus, we put the
++ % text into a \vbox and then do nothing with the result. To minimize
++ % the change of memory overflow, we follow the approach outlined on
++ % page 401 of the TeXbook: make the current font be a dummy font.
++ %
++ \setbox0 = \vbox\bgroup
++ % Don't complain about control sequences we have declared \outer.
++ \ignoresections
++ %
++ % Define `@end #1' to end the box, which will in turn undefine the
++ % @end command again.
++ \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
++ %
++ % We are going to be parsing Texinfo commands. Most cause no
++ % trouble when they are used incorrectly, but some commands do
++ % complicated argument parsing or otherwise get confused, so we
++ % undefine them.
++ %
++ % We can't do anything about stray @-signs, unfortunately;
++ % they'll produce `undefined control sequence' errors.
++ \ignoremorecommands
++ %
++ % Set the current font to be \nullfont, a TeX primitive, and define
++ % all the font commands to also use \nullfont. We don't use
++ % dummy.tfm, as suggested in the TeXbook, because not all sites
++ % might have that installed. Therefore, math mode will still
++ % produce output, but that should be an extremely small amount of
++ % stuff compared to the main input.
++ %
++ \nullfont
++ \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
++ \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
++ \let\tensf=\nullfont
++ % Similarly for index fonts (mostly for their use in smallexample).
++ \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
++ \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
++ \let\smallsf=\nullfont
++ %
++ % Don't complain when characters are missing from the fonts.
++ \tracinglostchars = 0
++ %
++ % Don't bother to do space factor calculations.
++ \frenchspacing
++ %
++ % Don't report underfull hboxes.
++ \hbadness = 10000
++ %
++ % Do minimal line-breaking.
++ \pretolerance = 10000
++ %
++ % Do not execute instructions in @tex
++ \def\tex{\doignore{tex}}%
++ % Do not execute macro definitions.
++ % `c' is a comment character, so the word `macro' will get cut off.
++ \def\macro{\doignore{ma}}%
++}
++
++% @set VAR sets the variable VAR to an empty value.
++% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
++%
++% Since we want to separate VAR from REST-OF-LINE (which might be
++% 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{%
++ \def\temp{#2}%
++ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
++ \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
++% \next or other control sequences that we've defined might get us into
++% an infinite loop. Consider `@set foo @cite{bar}'.
++\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
++
++% @clear VAR clears (i.e., unsets) the variable VAR.
++%
++\def\clear{\parsearg\clearxxx}
++\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
++
++% @value{foo} gets the text saved in variable foo.
++{
++ \catcode`\_ = \active
++ %
++ % We might end up with active _ or - characters in the argument if
++ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
++ % such active characters to their normal equivalents.
++ \gdef\value{\begingroup
++ \catcode`\-=12 \catcode`\_=12
++ \indexbreaks \let_\normalunderscore
++ \valuexxx}
++}
++\def\valuexxx#1{\expandablevalue{#1}\endgroup}
++
++% We have this subroutine so that we can handle at least some @value's
++% properly in indexes (we \let\value to this in \indexdummies). Ones
++% whose names contain - or _ still won't work, but we can't do anything
++% about that. The command has to be fully expandable, since the result
++% winds up in the index file. This means that if the variable's value
++% contains other Texinfo commands, it's almost certain it will fail
++% (although perhaps we could fix that with sufficient work to do a
++% one-level expansion on the result, instead of complete).
++%
++\def\expandablevalue#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
++% with @set.
++%
++\def\ifset{\parsearg\ifsetxxx}
++\def\ifsetxxx #1{%
++ \expandafter\ifx\csname SET#1\endcsname\relax
++ \expandafter\ifsetfail
++ \else
++ \expandafter\ifsetsucceed
++ \fi
++}
++\def\ifsetsucceed{\conditionalsucceed{ifset}}
++\def\ifsetfail{\nestedignore{ifset}}
++\defineunmatchedend{ifset}
++
++% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
++% defined with @set, or has been undefined with @clear.
++%
++\def\ifclear{\parsearg\ifclearxxx}
++\def\ifclearxxx #1{%
++ \expandafter\ifx\csname SET#1\endcsname\relax
++ \expandafter\ifclearsucceed
++ \else
++ \expandafter\ifclearfail
++ \fi
++}
++\def\ifclearsucceed{\conditionalsucceed{ifclear}}
++\def\ifclearfail{\nestedignore{ifclear}}
++\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
++% at @end iftex, since then @set commands inside the conditional have no
++% effect (they'd get reverted at the end of the group). So we must
++% define \Eiftex to redefine itself to be its previous value. (We can't
++% just define it to fail again with an ``unmatched end'' error, since
++% the @ifset might be nested.)
++%
++\def\conditionalsucceed#1{%
++ \edef\temp{%
++ % Remember the current value of \E#1.
++ \let\nece{prevE#1} = \nece{E#1}%
++ %
++ % At the `@end #1', redefine \E#1 to be its previous value.
++ \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
++ }%
++ \temp
++}
++
++% We need to expand lots of \csname's, but we don't want to expand the
++% control sequences after we've constructed them.
++%
++\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
++
++% @defininfoenclose.
++\let\definfoenclose=\comment
++
++
+ \message{indexing,}
+ % Index generation facilities
+
+@@ -2206,12 +2582,14 @@
+ % 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.
+-
+-\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}}
++%
++\def\newindex#1{%
++ \iflinks
++ \expandafter\newwrite \csname#1indfile\endcsname
++ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
++ \fi
++ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
++ \noexpand\doindex{#1}}
+ }
+
+ % @defindex foo == \newindex{foo}
+@@ -2220,31 +2598,37 @@
+
+ % Define @defcodeindex, like @defindex except put all entries in @code.
+
+-\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}}
++\def\newcodeindex#1{%
++ \iflinks
++ \expandafter\newwrite \csname#1indfile\endcsname
++ \openout \csname#1indfile\endcsname \jobname.#1
++ \fi
++ \expandafter\xdef\csname#1index\endcsname{%
++ \noexpand\docodeindex{#1}}
+ }
+
+ \def\defcodeindex{\parsearg\newcodeindex}
+
+ % @synindex foo bar makes index foo feed into index bar.
+ % Do this instead of @defindex foo if you don't want it as a separate index.
+-\def\synindex #1 #2 {%
+-\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+-\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+-\noexpand\doindex {#2}}%
++% The \closeout helps reduce unnecessary open files; the limit on the
++% Acorn RISC OS is a mere 16 files.
++\def\synindex#1 #2 {%
++ \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
++ \expandafter\closeout\csname#1indfile\endcsname
++ \expandafter\let\csname#1indfile\endcsname=\synindexfoo
++ \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
++ \noexpand\doindex{#2}}%
+ }
+
+ % @syncodeindex foo bar similar, but put all entries made for index foo
+ % inside @code.
+-\def\syncodeindex #1 #2 {%
+-\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+-\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+-\noexpand\docodeindex {#2}}%
++\def\syncodeindex#1 #2 {%
++ \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
++ \expandafter\closeout\csname#1indfile\endcsname
++ \expandafter\let\csname#1indfile\endcsname=\synindexfoo
++ \expandafter\xdef\csname#1index\endcsname{% define \xxxindex
++ \noexpand\docodeindex{#2}}%
+ }
+
+ % Define \doindex, the driver for all \fooindex macros.
+@@ -2265,6 +2649,7 @@
+ \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+ \def\indexdummies{%
++\def\ { }%
+ % Take care of the plain tex accent commands.
+ \def\"{\realbackslash "}%
+ \def\`{\realbackslash `}%
+@@ -2294,8 +2679,11 @@
+ % (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
++% Need these in case \tex is in effect and \{ is a \delimiter again.
++% But can't use \lbracecmd and \rbracecmd because texindex assumes
++% braces and backslashes are used only as delimiters.
++\let\{ = \mylbrace
++\let\} = \myrbrace
+ \def\_{{\realbackslash _}}%
+ \def\w{\realbackslash w }%
+ \def\bf{\realbackslash bf }%
+@@ -2306,7 +2694,6 @@
+ \def\gtr{\realbackslash gtr}%
+ \def\less{\realbackslash less}%
+ \def\hat{\realbackslash hat}%
+-%\def\char{\realbackslash char}%
+ \def\TeX{\realbackslash TeX}%
+ \def\dots{\realbackslash dots }%
+ \def\result{\realbackslash result}%
+@@ -2318,6 +2705,11 @@
+ \def\copyright{\realbackslash copyright}%
+ \def\tclose##1{\realbackslash tclose {##1}}%
+ \def\code##1{\realbackslash code {##1}}%
++\def\uref##1{\realbackslash uref {##1}}%
++\def\url##1{\realbackslash url {##1}}%
++\def\env##1{\realbackslash env {##1}}%
++\def\command##1{\realbackslash command {##1}}%
++\def\option##1{\realbackslash option {##1}}%
+ \def\dotless##1{\realbackslash dotless {##1}}%
+ \def\samp##1{\realbackslash samp {##1}}%
+ \def\,##1{\realbackslash ,{##1}}%
+@@ -2333,8 +2725,16 @@
+ \def\kbd##1{\realbackslash kbd {##1}}%
+ \def\dfn##1{\realbackslash dfn {##1}}%
+ \def\emph##1{\realbackslash emph {##1}}%
+-\def\value##1{\realbackslash value {##1}}%
++\def\acronym##1{\realbackslash acronym {##1}}%
++%
++% Handle some cases of @value -- where the variable name does not
++% contain - or _, and the value does not contain any
++% (non-fully-expandable) commands.
++\let\value = \expandablevalue
++%
+ \unsepspaces
++% Turn off macro expansion
++\turnoffmacros
+ }
+
+ % If an index command is used in an @example environment, any spaces
+@@ -2391,6 +2791,12 @@
+ %\let\tt=\indexdummyfont
+ \let\tclose=\indexdummyfont
+ \let\code=\indexdummyfont
++\let\url=\indexdummyfont
++\let\uref=\indexdummyfont
++\let\env=\indexdummyfont
++\let\acronym=\indexdummyfont
++\let\command=\indexdummyfont
++\let\option=\indexdummyfont
+ \let\file=\indexdummyfont
+ \let\samp=\indexdummyfont
+ \let\kbd=\indexdummyfont
+@@ -2406,14 +2812,24 @@
+ % so we do not become unable to do a definition.
+
+ {\catcode`\@=0 \catcode`\\=\other
+-@gdef@realbackslash{\}}
++ @gdef@realbackslash{\}}
+
+ \let\indexbackslash=0 %overridden during \printindex.
++\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
++
++% For \ifx comparisons.
++\def\emptymacro{\empty}
+
+-\let\SETmarginindex=\relax %initialize!
+-% workhorse for all \fooindexes
+-% #1 is name of index, #2 is stuff to put there
+-\def\doind #1#2{%
++% Most index entries go through here, but \dosubind is the general case.
++%
++\def\doind#1#2{\dosubind{#1}{#2}\empty}
++
++% Workhorse for all \fooindexes.
++% #1 is name of index, #2 is stuff to put there, #3 is subentry --
++% \empty if called from \doind, as we usually are. The main exception
++% is with defuns, which call us directly.
++%
++\def\dosubind#1#2#3{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+@@ -2424,48 +2840,75 @@
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ {%
+- \let\folio=0% We will expand all macros now EXCEPT \folio.
++ \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}}%
++ \def\thirdarg{#3}%
+ %
+- % Now produce the complete index entry, with both the sort key and the
+- % original text, including any font commands.
++ % If third arg is present, precede it with space in sort key.
++ \ifx\thirdarg\emptymacro
++ \let\subentry = \empty
++ \else
++ \def\subentry{ #3}%
++ \fi
++ %
++ % First process the index entry with all font commands turned
++ % off to get the string to sort by.
++ {\indexnofonts \xdef\indexsorttmp{#2\subentry}}%
++ %
++ % Now the real index entry with the fonts.
+ \toks0 = {#2}%
++ %
++ % If third (subentry) arg is present, add it to the index
++ % string. And include a space.
++ \ifx\thirdarg\emptymacro \else
++ \toks0 = \expandafter{\the\toks0 \space #3}%
++ \fi
++ %
++ % Set up the complete index entry, with both the sort key
++ % and the original text, including any font commands. We write
++ % three arguments to \entry to the .?? file, texindex reduces to
++ % two when writing the .??s sorted result.
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+- \temp
++ %
++ % If a skip is the last thing on the list now, preserve it
++ % by backing up by \lastskip, doing the \write, then inserting
++ % the skip again. Otherwise, the whatsit generated by the
++ % \write will make \lastskip zero. The result is that sequences
++ % like this:
++ % @end defun
++ % @tindex whatever
++ % @defun ...
++ % will have extra space inserted, because the \medbreak in the
++ % start of the @defun won't see the skip inserted by the @end of
++ % the previous defun.
++ %
++ % But don't do any of this if we're not in vertical mode. We
++ % don't want to do a \vskip and prematurely end a paragraph.
++ %
++ % Avoid page breaks due to these extra skips, too.
++ %
++ \iflinks
++ \ifvmode
++ \skip0 = \lastskip
++ \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi
++ \fi
++ %
++ \temp % do the write
++ %
++ %
++ \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
++ \fi
+ }%
+ }%
+ \penalty\count255
+ }%
+ }
+
+-\def\dosubind #1#2#3{%
+-{\count10=\lastpenalty %
+-{\indexdummies % Must do this here, since \bf, etc expand at this stage
+-\escapechar=`\\%
+-{\let\folio=0%
+-\def\rawbackslashxx{\indexbackslash}%
+-%
+-% 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 #3}%
+-}%
+-% 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}{#3}}}%
+-\temp }%
+-}\penalty\count10}}
+-
+ % The index entry written in the file actually looks like
+ % \entry {sortstring}{page}{topic}
+ % or
+@@ -2505,18 +2948,23 @@
+ \def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+- \indexfonts \rm
++ \smallfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
++ % Change catcode of @ here so that if the index file contains
++ % \initial {@}
++ % as its first line, TeX doesn't complain about mismatched braces
++ % (because it thinks @} is a control sequence).
++ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+- (Index is nonexistent)
++ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+@@ -2524,14 +2972,13 @@
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+- (Index is empty)
++ \putwordIndexIsEmpty
+ \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
+@@ -2544,21 +2991,35 @@
+ % These macros are used by the sorted index file itself.
+ % Change them to control the appearance of the index.
+
+-% Same as \bigskipamount except no shrink.
+-% \balancecolumns gets confused if there is any shrink.
+-\newskip\initialskipamount \initialskipamount 12pt plus4pt
+-
+-\def\initial #1{%
+-{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+-\ifdim\lastskip<\initialskipamount
+-\removelastskip \penalty-200 \vskip \initialskipamount\fi
+-\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
++\def\initial#1{{%
++ % Some minor font changes for the special characters.
++ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
++ %
++ % Remove any glue we may have, we'll be inserting our own.
++ \removelastskip
++ %
++ % We like breaks before the index initials, so insert a bonus.
++ \penalty -300
++ %
++ % Typeset the initial. Making this add up to a whole number of
++ % baselineskips increases the chance of the dots lining up from column
++ % to column. It still won't often be perfect, because of the stretch
++ % we need before each entry, but it's better.
++ %
++ % No shrink because it confuses \balancecolumns.
++ \vskip 1.67\baselineskip plus .5\baselineskip
++ \leftline{\secbf #1}%
++ \vskip .33\baselineskip plus .1\baselineskip
++ %
++ % Do our best not to break after the initial.
++ \nobreak
++}}
+
+ % This typesets a paragraph consisting of #1, dot leaders, and then #2
+ % flush to the right margin. It is used for index and table of contents
+ % entries. The paragraph is indented by \leftskip.
+ %
+-\def\entry #1#2{\begingroup
++\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+@@ -2581,12 +3042,15 @@
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+- \hangindent=2em
++ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
++ % A bit of stretch before each entry for the benefit of balancing columns.
++ \vskip 0pt plus1pt
++ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+@@ -2611,7 +3075,11 @@
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+- \ #2% The page number ends the paragraph.
++ \ifpdf
++ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
++ \else
++ \ #2% The page number ends the paragraph.
++ \fi
+ \fi%
+ \par
+ \endgroup}
+@@ -2640,24 +3108,26 @@
+
+ \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+- \output = {\global\setbox\partialpage = \vbox{%
+- %
++ \output = {%
++ %
+ % 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
++ % that case we just ship out what is in \partialpage with the normal
++ % output routine. Generally, \partialpage will be empty when this
++ % runs and this will be a no-op. See the indexspread.tex test case.
++ \ifvoid\partialpage \else
++ \onepageout{\pagecontents\partialpage}%
++ \fi
+ %
+- % Unvbox the main output page.
+- \unvbox255
+- \kern-\topskip \kern\baselineskip
+- }}%
+- \eject
++ \global\setbox\partialpage = \vbox{%
++ % Unvbox the main output page.
++ \unvbox\PAGE
++ \kern-\topskip \kern\baselineskip
++ }%
++ }%
++ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+@@ -2685,14 +3155,21 @@
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
++ \advance\vsize by -\ht\partialpage
+ \vsize = 2\vsize
+ }
++
++% The double-column output routine for all double-column pages except
++% the last.
++%
+ \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
++ \dimen@ = \vsize
++ \divide\dimen@ by 2
++ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+@@ -2701,42 +3178,67 @@
+ }
+ \def\pagesofar{%
+ % Re-output the contents of the output page -- any previous material,
+- % followed by the two boxes we just split.
++ % followed by the two boxes we just split, in box0 and box2.
+ \unvbox\partialpage
++ %
+ \hsize = \doublecolumnhsize
+- \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
++ \wd0=\hsize \wd2=\hsize
++ \hbox to\pagewidth{\box0\hfil\box2}%
+ }
+ \def\enddoublecolumns{%
+- \output = {\balancecolumns}\eject % split what we have
++ \output = {%
++ % Split the last of the double-column material. Leave it on the
++ % current page, no automatic page break.
++ \balancecolumns
++ %
++ % If we end up splitting too much material for the current page,
++ % though, there will be another page break right after this \output
++ % invocation ends. Having called \balancecolumns once, we do not
++ % want to call it again. Therefore, reset \output to its normal
++ % definition right away. (We hope \balancecolumns will never be
++ % called on to balance too much material, but if it is, this makes
++ % the output somewhat more palatable.)
++ \global\output = {\onepageout{\pagecontents\PAGE}}%
++ }%
++ \eject
+ \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 was set to the doubled \vsize above, since we restarted
++ % the current page. We're now back to normal single-column
++ % typesetting, so reset \pagegoal to the normal \vsize (after the
++ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+ }
+ \def\balancecolumns{%
+ % Called at the end of the double column material.
+- \setbox0 = \vbox{\unvbox255}%
++ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+- \divide\dimen@ by 2
++ \divide\dimen@ by 2 % target to split to
++ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \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}%
++ {%
++ \vbadness = 10000
++ \loop
++ \global\setbox3 = \copy0
++ \global\setbox1 = \vsplit3 to \dimen@
++ \ifdim\ht3>\dimen@
++ \global\advance\dimen@ by 1pt
++ \repeat
++ }%
++ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
++ %
+ \pagesofar
+ }
+ \catcode`\@ = \other
+
+
+ \message{sectioning,}
+-% Define chapters, sections, etc.
++% Chapters, sections, etc.
+
+ \newcount\chapno
+ \newcount\secno \secno=0
+@@ -2745,58 +3247,48 @@
+
+ % 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 }
++% \def\appendixletter{\char\the\appendixno}
++% We do the following for the sake of pdftex, which needs the actual
++% letter in the expansion, not just typeset.
++\def\appendixletter{%
++ \ifnum\appendixno=`A A%
++ \else\ifnum\appendixno=`B B%
++ \else\ifnum\appendixno=`C C%
++ \else\ifnum\appendixno=`D D%
++ \else\ifnum\appendixno=`E E%
++ \else\ifnum\appendixno=`F F%
++ \else\ifnum\appendixno=`G G%
++ \else\ifnum\appendixno=`H H%
++ \else\ifnum\appendixno=`I I%
++ \else\ifnum\appendixno=`J J%
++ \else\ifnum\appendixno=`K K%
++ \else\ifnum\appendixno=`L L%
++ \else\ifnum\appendixno=`M M%
++ \else\ifnum\appendixno=`N N%
++ \else\ifnum\appendixno=`O O%
++ \else\ifnum\appendixno=`P P%
++ \else\ifnum\appendixno=`Q Q%
++ \else\ifnum\appendixno=`R R%
++ \else\ifnum\appendixno=`S S%
++ \else\ifnum\appendixno=`T T%
++ \else\ifnum\appendixno=`U U%
++ \else\ifnum\appendixno=`V V%
++ \else\ifnum\appendixno=`W W%
++ \else\ifnum\appendixno=`X X%
++ \else\ifnum\appendixno=`Y Y%
++ \else\ifnum\appendixno=`Z Z%
++ % The \the is necessary, despite appearances, because \appendixletter is
++ % expanded while writing the .toc file. \char\appendixno is not
++ % expandable, thus it is written literally, thus all appendixes come out
++ % with the same letter (or @) in the toc without it.
++ \else\char\the\appendixno
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
++ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+ % Each @chapter defines this as the name of the chapter.
+-% page headings and footings can use it. @section does likewise
+-
+-\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}}%
+-}
++% page headings and footings can use it. @section does likewise.
++\def\thischapter{}
++\def\thissection{}
+
+ \newcount\absseclevel % used to calculate proper heading level
+ \newcount\secbase\secbase=0 % @raise/lowersections modify this count
+@@ -2868,59 +3360,59 @@
+ \fi
+ }
+
+-
++% @chapter, @appendix, @unnumbered.
+ \def\thischaptername{No Chapter Title}
+ \outer\def\chapter{\parsearg\chapteryyy}
+ \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+-\def\chapterzzz #1{\seccheck{chapter}%
++\def\chapterzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+-\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
++\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+ \chapmacro {#1}{\the\chapno}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now.
+ \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
++ {\the\chapno}}}%
++\temp
++\donoderef
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+-}}
++}
+
+ \outer\def\appendix{\parsearg\appendixyyy}
+ \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+-\def\appendixzzz #1{\seccheck{appendix}%
++\def\appendixzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+-\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
++\global\advance \appendixno by 1
++\message{\putwordAppendix\space \appendixletter}%
+ \chapmacro {#1}{\putwordAppendix{} \appendixletter}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash chapentry{\the\toks0}%
+- {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}%
++ {\putwordAppendix{} \appendixletter}}}%
++\temp
++\appendixnoderef
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+-}}
++}
+
+ % @centerchap is like @unnumbered, but the heading is centered.
+ \outer\def\centerchap{\parsearg\centerchapyyy}
+ \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
++% @top is like @unnumbered.
+ \outer\def\top{\parsearg\unnumberedyyy}
++
+ \outer\def\unnumbered{\parsearg\unnumberedyyy}
+ \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+-\def\unnumberedzzz #1{\seccheck{unnumbered}%
++\def\unnumberedzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+@@ -2932,155 +3424,139 @@
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+-% simply yielding the contents of the <toks register>.
++% simply yielding the contents of <toks register>. (We also do this for
++% the toc entries.)
+ \toks0 = {#1}\message{(\the\toks0)}%
+ %
+ \unnumbchapmacro {#1}%
+ \gdef\thischapter{#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}%
++\temp
++\unnumbnoderef
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+-}}
++}
+
++% Sections.
+ \outer\def\numberedsec{\parsearg\secyyy}
+ \def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+-\def\seczzz #1{\seccheck{section}%
++\def\seczzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \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 %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
++ {\the\chapno}{\the\secno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsection{\parsearg\appendixsecyyy}
+ \outer\def\appendixsec{\parsearg\appendixsecyyy}
+ \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+-\def\appendixsectionzzz #1{\seccheck{appendixsection}%
++\def\appendixsectionzzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \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 %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}%
++ {\appendixletter}{\the\secno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+ \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+-\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
++\def\unnumberedseczzz #1{%
+ \plainsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
++% Subsections.
+ \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+ \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+-\def\numberedsubseczzz #1{\seccheck{subsection}%
++\def\numberedsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \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 %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
++ {\the\chapno}{\the\secno}{\the\subsecno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+ \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+-\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
++\def\appendixsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \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 %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}%
++ {\appendixletter}{\the\secno}{\the\subsecno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+ \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+-\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
++\def\unnumberedsubseczzz #1{%
+ \plainsubsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry%
++ {\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
++% Subsubsections.
+ \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+ \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+-\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
++\def\numberedsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\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}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\donoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
++ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
++\temp
++\donoderef
++\nobreak
++}
+
+ \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+ \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+-\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
++\def\appendixsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\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}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\appendixnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}%
++ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}%
++\temp
++\appendixnoderef
++\nobreak
++}
+
+ \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+ \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+-\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
++\def\unnumberedsubsubseczzz #1{%
+ \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+-{\chapternofonts%
+ \toks0 = {#1}%
+-\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
+-\escapechar=`\\%
+-\write \contentsfile \temp %
+-\unnumbnoderef %
+-\penalty 10000 %
+-}}
++\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry%
++ {\the\toks0}}}%
++\temp
++\unnumbnoderef
++\nobreak
++}
+
+ % These are variants which are not "outer", so they can appear in @ifinfo.
+ % Actually, they should now be obsolete; ordinary section commands should work.
+@@ -3109,8 +3585,7 @@
+
+ % Define @majorheading, @heading and @subheading
+
+-% NOTE on use of \vbox for chapter headings, section headings, and
+-% such:
++% 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
+@@ -3157,12 +3632,12 @@
+
+ \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+-\def\CHAPPAGoff{
++\def\CHAPPAGoff{%
+ \global\let\contentsalignmacro = \chappager
+ \global\let\pchapsepmacro=\chapbreak
+ \global\let\pagealignmacro=\chappager}
+
+-\def\CHAPPAGon{
++\def\CHAPPAGon{%
+ \global\let\contentsalignmacro = \chappager
+ \global\let\pchapsepmacro=\chappager
+ \global\let\pagealignmacro=\chappager
+@@ -3216,7 +3691,7 @@
+ \def\unnchfopen #1{%
+ \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+- \rm #1\hfill}}\bigskip \par\penalty 10000 %
++ \rm #1\hfill}}\bigskip \par\nobreak
+ }
+
+ \def\chfopen #1#2{\chapoddpage {\chapfonts
+@@ -3227,7 +3702,7 @@
+ \def\centerchfopen #1{%
+ \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+- \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
++ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+ }
+
+ \def\CHAPFopen{
+@@ -3280,24 +3755,45 @@
+ }
+
+
+-\message{toc printing,}
+-% Finish up the main text and prepare to read what we've written
+-% to \contentsfile.
++\message{toc,}
++% Table of contents.
++\newwrite\tocfile
++
++% Write an entry to the toc file, opening it if necessary.
++% Called from @chapter, etc. We supply {\folio} at the end of the
++% argument, which will end up as the last argument to the \...entry macro.
++%
++% We open the .toc file here instead of at @setfilename or any other
++% given time so that @contents can be put in the document anywhere.
++%
++\newif\iftocfileopened
++\def\writetocentry#1{%
++ \iftocfileopened\else
++ \immediate\openout\tocfile = \jobname.toc
++ \global\tocfileopenedtrue
++ \fi
++ \iflinks \write\tocfile{#1{\folio}}\fi
++}
+
+ \newskip\contentsrightmargin \contentsrightmargin=1in
++\newcount\savepageno
++\newcount\lastnegativepageno \lastnegativepageno = -1
++
++% Finish up the main text and prepare to read what we've written
++% to \tocfile.
++%
+ \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
++ \immediate\closeout\tocfile
++ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
++ \savepageno = \pageno
+ \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
+@@ -3305,20 +3801,31 @@
+ %\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.
++ %
++ % Roman numerals for page numbers.
++ \ifnum \pageno>0 \pageno = \lastnegativepageno \fi
+ }
+
+
+ % Normal (long) toc.
+-\outer\def\contents{%
+- \startcontents{\putwordTableofContents}%
+- \input \jobname.toc
++\def\contents{%
++ \startcontents{\putwordTOC}%
++ \openin 1 \jobname.toc
++ \ifeof 1 \else
++ \closein 1
++ \input \jobname.toc
++ \fi
++ \vfill \eject
++ \contentsalignmacro % in case @setchapternewpage odd is in effect
++ \pdfmakeoutlines
+ \endgroup
+- \vfill \eject
++ \lastnegativepageno = \pageno
++ \pageno = \savepageno
+ }
+
+ % And just the chapters.
+-\outer\def\summarycontents{%
+- \startcontents{\putwordShortContents}%
++\def\summarycontents{%
++ \startcontents{\putwordShortTOC}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+@@ -3334,12 +3841,23 @@
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+- \input \jobname.toc
++ \openin 1 \jobname.toc
++ \ifeof 1 \else
++ \closein 1
++ \input \jobname.toc
++ \fi
++ \vfill \eject
++ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+- \vfill \eject
++ \lastnegativepageno = \pageno
++ \pageno = \savepageno
+ }
+ \let\shortcontents = \summarycontents
+
++\ifpdf
++ \pdfcatalog{/PageMode /UseOutlines}%
++\fi
++
+ % These macros generate individual entries in the table of contents.
+ % The first argument is the chapter or section name.
+ % The last argument is the page number.
+@@ -3350,7 +3868,7 @@
+
+ % See comments in \dochapentry re vbox and related settings
+ \def\shortchapentry#1#2#3{%
+- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
++ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+ }
+
+ % Typeset the label for a chapter or appendix for the short contents.
+@@ -3358,10 +3876,14 @@
+ % We could simplify the code here by writing out an \appendixentry
+ % command in the toc file for appendices, instead of using \chapentry
+ % for both, but it doesn't seem worth it.
+-\setbox0 = \hbox{\shortcontrm \putwordAppendix }
+-\newdimen\shortappendixwidth \shortappendixwidth = \wd0
+-
++%
++\newdimen\shortappendixwidth
++%
+ \def\shortchaplabel#1{%
++ % Compute width of word "Appendix", may change with language.
++ \setbox0 = \hbox{\shortcontrm \putwordAppendix}%
++ \shortappendixwidth = \wd0
++ %
+ % We typeset #1 in a box of constant width, regardless of the text of
+ % #1, so the chapter titles will come out aligned.
+ \setbox0 = \hbox{#1}%
+@@ -3376,7 +3898,7 @@
+ }
+
+ \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
++\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}}
+
+ % Sections.
+ \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+@@ -3403,35 +3925,36 @@
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+ }
+
+ \def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ \def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ \def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+- \tocentry{#1}{\dopageno{#2}}%
++ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup}
+
+ % Final typesetting of a toc entry; we use the same \entry macro as for
+ % the index entries, but we want to suppress hyphenation here. (We
+ % can't do that in the \entry macro, since index entries might consist
+ % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+-%
+-% \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}%
++ % Do not use \turnoffactive in these arguments. Since the toc is
++ % typeset in cmr, so characters such as _ would come out wrong; we
++ % have to do the usual translation tricks.
++ \entry{#1}{#2}%
+ \endgroup}
+
+ % Space between chapter (or whatever) number and the title.
+@@ -3447,6 +3970,7 @@
+
+
+ \message{environments,}
++% @foo ... @end foo.
+
+ % Since these characters are used in examples, it should be an even number of
+ % \tt widths. Each \tt character is 1en, so two makes it 1em.
+@@ -3497,30 +4021,36 @@
+ % But \@ or @@ will get a plain tex @ character.
+
+ \def\tex{\begingroup
+-\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+-\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+-\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+-\catcode `\%=14
+-\catcode 43=12 % plus
+-\catcode`\"=12
+-\catcode`\==12
+-\catcode`\|=12
+-\catcode`\<=12
+-\catcode`\>=12
+-\escapechar=`\\
+-%
+-\let\,=\ptexcomma
+-\let\{=\ptexlbrace
+-\let\}=\ptexrbrace
+-\let\.=\ptexdot
+-\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
+-%
++ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
++ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
++ \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
++ \catcode `\%=14
++ \catcode 43=12 % plus
++ \catcode`\"=12
++ \catcode`\==12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \escapechar=`\\
++ %
++ \let\b=\ptexb
++ \let\bullet=\ptexbullet
++ \let\c=\ptexc
++ \let\,=\ptexcomma
++ \let\.=\ptexdot
++ \let\dots=\ptexdots
++ \let\equiv=\ptexequiv
++ \let\!=\ptexexclam
++ \let\i=\ptexi
++ \let\{=\ptexlbrace
++ \let\+=\tabalign
++ \let\}=\ptexrbrace
++ \let\*=\ptexstar
++ \let\t=\ptext
++ %
++ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
++ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
++ \def\@{@}%
+ \let\Etex=\endgroup}
+
+ % Define @lisp ... @endlisp.
+@@ -3565,8 +4095,8 @@
+ % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+ \let\nonarrowing=\relax
+
+-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-% \cartouche: draw rectangle w/rounded corners around argument
++% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
++% environment contents.
+ \font\circle=lcircle10
+ \newdimen\circthick
+ \newdimen\cartouter\newdimen\cartinner
+@@ -3593,9 +4123,9 @@
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+- \advance\cartouter by 18pt % allow for 3pt kerns on either
++ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+-% each corner char
++% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+@@ -3649,49 +4179,52 @@
+ \fi
+ }
+
+-% To ending an @example-like environment, we first end the paragraph
+-% (via \afterenvbreak's vertical glue), and then the group. That way we
+-% keep the zero \parskip that the environments set -- \parskip glue
+-% will be inserted at the beginning of the next paragraph in the
+-% document, after the environment.
++% Define the \E... control sequence only if we are inside the particular
++% environment, so the error checking in \end will work.
+ %
+-\def\nonfillfinish{\afterenvbreak\endgroup}%
++% To end an @example-like environment, we first end the paragraph (via
++% \afterenvbreak's vertical glue), and then the group. That way we keep
++% the zero \parskip that the environments set -- \parskip glue will be
++% inserted at the beginning of the next paragraph in the document, after
++% the environment.
++%
++\def\nonfillfinish{\afterenvbreak\endgroup}
+
++% @lisp: indented, narrowed, typewriter font.
+ \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
++ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
++ \gobble % eat return
+ }
+
+-% Define the \E... control sequence only if we are inside the
+-% environment, so the error checking in \end will work.
+-%
+-% We must call \lisp last in the definition, since it reads the
+-% return following the @example (or whatever) command.
+-%
++% @example: Same as @lisp.
+ \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+-\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
+-\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+
+-% @smallexample and @smalllisp. This is not used unless the @smallbook
+-% command is given. Originally contributed by Pavel@xerox.
+-%
++% @small... is usually equivalent to the non-small (@smallbook
++% redefines). We must call \example (or whatever) last in the
++% definition, since it reads the return following the @example (or
++% whatever) command.
++%
++% This actually allows (for example) @end display inside an
++% @smalldisplay. Too bad, but makeinfo will catch the error anyway.
++%
++\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display}
++\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp}
++\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format}
++\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
++
++% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts.
++% Originally contributed by Pavel@xerox.
+ \def\smalllispx{\begingroup
+- \nonfillstart
+- \let\Esmalllisp = \nonfillfinish
+- \let\Esmallexample = \nonfillfinish
+- %
+- % Smaller fonts for small examples.
+- \indexfonts \tt
+- \rawbackslash % make \ output the \ character from the current font (tt)
+- \gobble
++ \def\Esmalllisp{\nonfillfinish\endgroup}%
++ \def\Esmallexample{\nonfillfinish\endgroup}%
++ \smallfonts
++ \lisp
+ }
+
+-% This is @display; same as @lisp except use roman font.
++% @display: same as @lisp except keep current font.
+ %
+ \def\display{\begingroup
+ \nonfillstart
+@@ -3699,7 +4232,15 @@
+ \gobble
+ }
+
+-% This is @format; same as @display except don't narrow margins.
++% @smalldisplay (when @smallbook): @display plus smaller fonts.
++%
++\def\smalldisplayx{\begingroup
++ \def\Esmalldisplay{\nonfillfinish\endgroup}%
++ \smallfonts \rm
++ \display
++}
++
++% @format: same as @display except don't narrow margins.
+ %
+ \def\format{\begingroup
+ \let\nonarrowing = t
+@@ -3708,20 +4249,27 @@
+ \gobble
+ }
+
+-% @flushleft (same as @format) and @flushright.
++% @smallformat (when @smallbook): @format plus smaller fonts.
+ %
+-\def\flushleft{\begingroup
+- \let\nonarrowing = t
+- \nonfillstart
+- \let\Eflushleft = \nonfillfinish
+- \gobble
++\def\smallformatx{\begingroup
++ \def\Esmallformat{\nonfillfinish\endgroup}%
++ \smallfonts \rm
++ \format
+ }
++
++% @flushleft (same as @format).
++%
++\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
++
++% @flushright.
++%
+ \def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+- \gobble}
++ \gobble
++}
+
+ % @quotation does normal linebreaking (hence we can't use \nonfillstart)
+ % and narrows the margins.
+@@ -3744,9 +4292,11 @@
+ \fi
+ }
+
++
+ \message{defuns,}
+-% Define formatter for defuns
+-% First, allow user to change definition object font (\df) internally
++% @defun etc.
++
++% Allow user to change definition object font (\df) internally
+ \def\setdeffont #1 {\csname DEF#1\endcsname}
+
+ \newskip\defbodyindent \defbodyindent=.4in
+@@ -3800,10 +4350,16 @@
+ %% 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{\&}
++\let\ampnr = \&
+ \def\lbrb{{\bf\char`\[}}
+ \def\rbrb{{\bf\char`\]}}
+
++% Active &'s sneak into the index arguments, so make sure it's defined.
++{
++ \catcode`& = 13
++ \global\let& = \ampnr
++}
++
+ % First, defname, which formats the header line itself.
+ % #1 should be the function name.
+ % #2 should be the type of definition, such as "Function".
+@@ -3813,20 +4369,18 @@
+ % outside the @def...
+ \dimen2=\leftskip
+ \advance\dimen2 by -\defbodyindent
+-\dimen3=\rightskip
+-\advance\dimen3 by -\defbodyindent
+-\noindent %
++\noindent
+ \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+ \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+ \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+-\parshape 2 0in \dimen0 \defargsindent \dimen1 %
++\parshape 2 0in \dimen0 \defargsindent \dimen1
+ % Now output arg 2 ("Function" or some such)
+ % ending at \deftypemargin from the right margin,
+ % but stuck inside a box of width 0 so it does not interfere with linebreaking
+ {% Adjust \hsize to exclude the ambient margins,
+ % so that \rightline will obey them.
+-\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
++\advance \hsize by -\dimen2
++\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}%
+ % Make all lines underfull and no complaints:
+ \tolerance=10000 \hbadness=10000
+ \advance\leftskip by -\defbodyindent
+@@ -3847,23 +4401,62 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup %
+ \catcode 61=\active % 61 is `='
+ \obeylines\activeparens\spacesplit#3}
+
+-\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
++% #1 is the \E... control sequence to end the definition (which we define).
++% #2 is the \...x control sequence for consecutive fns (which we define).
++% #3 is the control sequence to call to resume processing.
++% #4, delimited by the space, is the class name.
++%
++\def\defmethparsebody#1#2#3#4 {\begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
++% Used for @deftypemethod and @deftypeivar.
++% #1 is the \E... control sequence to end the definition (which we define).
++% #2 is the \...x control sequence for consecutive fns (which we define).
++% #3 is the control sequence to call to resume processing.
++% #4, delimited by a space, is the class name.
++% #5 is the method's return type.
++%
++\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV
++ \medbreak
++ \def#1{\endgraf\endgroup\medbreak}%
++ \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}%
++ \parindent=0in
++ \advance\leftskip by \defbodyindent
++ \exdentamount=\defbodyindent
++ \begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}}
++
++% Used for @deftypeop. The change from \deftypemethparsebody is an
++% extra argument at the beginning which is the `category', instead of it
++% being the hardwired string `Method' or `Instance Variable'. We have
++% to account for this both in the \...x definition and in parsing the
++% input at hand. Thus also need a control sequence (passed as #5) for
++% the \E... definition to assign the category name to.
++%
++\def\deftypeopparsebody#1#2#3#4#5 #6 {\begingroup\inENV
++ \medbreak
++ \def#1{\endgraf\endgroup\medbreak}%
++ \def#2##1 ##2 ##3 {%
++ \def#4{##1}%
++ \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}%
++ \parindent=0in
++ \advance\leftskip by \defbodyindent
++ \exdentamount=\defbodyindent
++ \begingroup\obeylines\activeparens\spacesplit{#3{#5}{#6}}}
++
+ \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+@@ -3872,7 +4465,7 @@
+ \def#2##1 ##2 {\def#4{##1}%
+ \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+@@ -3887,7 +4480,7 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2{\begingroup\obeylines\spacesplit#3}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup %
+ \catcode 61=\active %
+@@ -3904,7 +4497,7 @@
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+ \parindent=0in
+- \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines
+ }
+@@ -3949,7 +4542,7 @@
+ \def#2##1 ##2 {\def#4{##1}%
+ \begingroup\obeylines\spacesplit{#3{##2}}}%
+ \parindent=0in
+-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
++\advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines\spacesplit{#3{#5}}}
+
+@@ -3973,16 +4566,17 @@
+ % First, define the processing that is wanted for arguments of \defun
+ % Use this to expand the args and terminate the paragraph they make up
+
+-\def\defunargs #1{\functionparens \sl
++\def\defunargs#1{\functionparens \sl
+ % Expand, preventing hyphenation at `-' chars.
+ % Note that groups don't affect changes in \hyphenchar.
+-\hyphenchar\tensl=0
++% Set the font temporarily and use \font in case \setfont made \tensl a macro.
++{\tensl\hyphenchar\font=0}%
+ #1%
+-\hyphenchar\tensl=45
++{\tensl\hyphenchar\font=45}%
+ \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+ \interlinepenalty=10000
+ \advance\rightskip by 0pt plus 1fil
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
++\endgraf\nobreak\vskip -\parskip\nobreak
+ }
+
+ \def\deftypefunargs #1{%
+@@ -3993,7 +4587,7 @@
+ \tclose{#1}% avoid \code because of side effects on active chars
+ \interlinepenalty=10000
+ \advance\rightskip by 0pt plus 1fil
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
++\endgraf\nobreak\vskip -\parskip\nobreak
+ }
+
+ % Do complete processing of one @defun or @defunx line already parsed.
+@@ -4012,7 +4606,7 @@
+ \def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+ \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Function}%
++\begingroup\defname {#1}{\putwordDeffunc}%
+ \defunargs {#2}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4026,7 +4620,7 @@
+ % #1 is the data type, #2 the name, #3 the args.
+ \def\deftypefunheaderx #1#2 #3\relax{%
+ \doind {fn}{\code{#2}}% Make entry in function index
+-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
++\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypefun}%
+ \deftypefunargs {#3}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4057,7 +4651,7 @@
+ \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+ \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Macro}%
++\begingroup\defname {#1}{\putwordDefmac}%
+ \defunargs {#2}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+@@ -4067,53 +4661,78 @@
+ \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+ \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+-\begingroup\defname {#1}{Special Form}%
++\begingroup\defname {#1}{\putwordDefspec}%
+ \defunargs {#2}\endgroup %
+ \catcode 61=\other % Turn off change made in \defparsebody
+ }
+
+-% This definition is run if you use @defunx
+-% anywhere other than immediately after a @defun or @defunx.
+-
+-\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+-\def\defunx #1 {\errmessage{@defunx in invalid context}}
+-\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+-\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}}
+-
+-% @defmethod, and so on
+-
+-% @defop {Funny Method} foo-class frobnicate argument
+-
++% @defop CATEGORY CLASS OPERATION ARG...
++%
+ \def\defop #1 {\def\defoptype{#1}%
+ \defopparsebody\Edefop\defopx\defopheader\defoptype}
+-
+-\def\defopheader #1#2#3{%
+-\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+-\begingroup\defname {#2}{\defoptype{} on #1}%
++%
++\def\defopheader#1#2#3{%
++\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index
++\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}%
+ \defunargs {#3}\endgroup %
+ }
+
+-% @deftypemethod foo-class return-type foo-method args
++% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
++%
++\def\deftypeop #1 {\def\deftypeopcategory{#1}%
++ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
++ \deftypeopcategory}
++%
++% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
++\def\deftypeopheader#1#2#3#4{%
++ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}
++ {\deftypeopcategory\ \putwordon\ \code{#1}}%
++ \deftypefunargs{#4}%
++ \endgroup
++}
++
++% @deftypemethod CLASS TYPE METHOD ARG...
+ %
+ \def\deftypemethod{%
+- \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
++ \deftypemethparsebody\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
++ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}%
++ \deftypefunargs{#4}%
++ \endgroup
+ }
+
+-% @defmethod == @defop Method
++% @deftypeivar CLASS TYPE VARNAME
++%
++\def\deftypeivar{%
++ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
++%
++% #1 is the class name, #2 the data type, #3 the variable name.
++\def\deftypeivarheader#1#2#3{%
++ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
++ \begingroup
++ \defname{\defheaderxcond#2\relax$$$#3}
++ {\putwordInstanceVariableof\ \code{#1}}%
++ \defvarargs{#3}%
++ \endgroup
++}
+
++% @defmethod == @defop Method
++%
+ \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+-
+-\def\defmethodheader #1#2#3{%
+-\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+-\begingroup\defname {#2}{Method on #1}%
+-\defunargs {#3}\endgroup %
++%
++% #1 is the class name, #2 the method name, #3 the args.
++\def\defmethodheader#1#2#3{%
++ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
++ \begingroup
++ \defname{#2}{\putwordMethodon\ \code{#1}}%
++ \defunargs{#3}%
++ \endgroup
+ }
+
+ % @defcv {Class Option} foo-class foo-flag
+@@ -4122,37 +4741,30 @@
+ \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+ \def\defcvarheader #1#2#3{%
+-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+-\begingroup\defname {#2}{\defcvtype{} of #1}%
++\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index
++\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}%
+ \defvarargs {#3}\endgroup %
+ }
+
+-% @defivar == @defcv {Instance Variable}
+-
++% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
++%
+ \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+-
+-\def\defivarheader #1#2#3{%
+-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+-\begingroup\defname {#2}{Instance Variable of #1}%
+-\defvarargs {#3}\endgroup %
++%
++\def\defivarheader#1#2#3{%
++ \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index
++ \begingroup
++ \defname{#2}{\putwordInstanceVariableof\ #1}%
++ \defvarargs{#3}%
++ \endgroup
+ }
+
+-% These definitions are run if you use @defmethodx, etc.,
+-% anywhere other than immediately after a @defmethod, etc.
+-
+-\def\defopx #1 {\errmessage{@defopx in invalid context}}
+-\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+-\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+-\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+-
+-% Now @defvar
+-
++% @defvar
+ % First, define the processing that is wanted for arguments of @defvar.
+ % This is actually simple: just print them in roman.
+ % This must expand the args and terminate the paragraph they make up
+ \def\defvarargs #1{\normalparens #1%
+ \interlinepenalty=10000
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
++\endgraf\nobreak\vskip -\parskip\nobreak}
+
+ % @defvr Counter foo-count
+
+@@ -4166,7 +4778,7 @@
+ \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+ \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+-\begingroup\defname {#1}{Variable}%
++\begingroup\defname {#1}{\putwordDefvar}%
+ \defvarargs {#2}\endgroup %
+ }
+
+@@ -4175,7 +4787,7 @@
+ \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+ \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+-\begingroup\defname {#1}{User Option}%
++\begingroup\defname {#1}{\putwordDefopt}%
+ \defvarargs {#2}\endgroup %
+ }
+
+@@ -4187,9 +4799,9 @@
+ % 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}%
++\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypevar}%
+ \interlinepenalty=10000
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
++\endgraf\nobreak\vskip -\parskip\nobreak
+ \endgroup}
+ \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+@@ -4200,18 +4812,9 @@
+ \def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+ \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
+ \interlinepenalty=10000
+-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
++\endgraf\nobreak\vskip -\parskip\nobreak
+ \endgroup}
+
+-% This definition is run if you use @defvarx
+-% anywhere other than immediately after a @defvar or @defvarx.
+-
+-\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+-\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+-\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+-\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+-
+ % Now define @deftp
+ % Args are printed in bold, a slight difference from @defvar.
+
+@@ -4224,51 +4827,394 @@
+ \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+ \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+-% This definition is run if you use @deftpx, etc
+-% anywhere other than immediately after a @deftp, etc.
++% These definitions are used if you use @defunx (etc.)
++% anywhere other than immediately after a @defun or @defunx.
++%
++\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
++\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
++\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
++\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
++\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
++\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
++\def\defopx#1 {\errmessage{@defopx in invalid context}}
++\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
++\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
++\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
++\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
++\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
++\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
++\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
++\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
++\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
++\def\defunx#1 {\errmessage{@defunx in invalid context}}
++\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
++\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
++
++
++\message{macros,}
++% @macro.
++
++% To do this right we need a feature of e-TeX, \scantokens,
++% which we arrange to emulate with a temporary file in ordinary TeX.
++\ifx\eTeXversion\undefined
++ \newwrite\macscribble
++ \def\scanmacro#1{%
++ \begingroup \newlinechar`\^^M
++ % Undo catcode changes of \startcontents and \doprintindex
++ \catcode`\@=0 \catcode`\\=12 \escapechar=`\@
++ % Append \endinput to make sure that TeX does not see the ending newline.
++ \toks0={#1\endinput}%
++ \immediate\openout\macscribble=\jobname.tmp
++ \immediate\write\macscribble{\the\toks0}%
++ \immediate\closeout\macscribble
++ \let\xeatspaces\eatspaces
++ \input \jobname.tmp
++ \endgroup
++}
++\else
++\def\scanmacro#1{%
++\begingroup \newlinechar`\^^M
++% Undo catcode changes of \startcontents and \doprintindex
++\catcode`\@=0 \catcode`\\=12 \escapechar=`\@
++\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
++\fi
++
++\newcount\paramno % Count of parameters
++\newtoks\macname % Macro name
++\newif\ifrecursive % Is it recursive?
++\def\macrolist{} % List of all defined macros in the form
++ % \do\macro1\do\macro2...
++
++% Utility routines.
++% Thisdoes \let #1 = #2, except with \csnames.
++\def\cslet#1#2{%
++\expandafter\expandafter
++\expandafter\let
++\expandafter\expandafter
++\csname#1\endcsname
++\csname#2\endcsname}
++
++% Trim leading and trailing spaces off a string.
++% Concepts from aro-bend problem 15 (see CTAN).
++{\catcode`\@=11
++\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
++\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
++\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
++\def\unbrace#1{#1}
++\unbrace{\gdef\trim@@@ #1 } #2@{#1}
++}
++
++% Trim a single trailing ^^M off a string.
++{\catcode`\^^M=12\catcode`\Q=3%
++\gdef\eatcr #1{\eatcra #1Q^^MQ}%
++\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
++\gdef\eatcrb#1Q#2Q{#1}%
++}
++
++% Macro bodies are absorbed as an argument in a context where
++% all characters are catcode 10, 11 or 12, except \ which is active
++% (as in normal texinfo). It is necessary to change the definition of \.
++
++% It's necessary to have hard CRs when the macro is executed. This is
++% done by making ^^M (\endlinechar) catcode 12 when reading the macro
++% body, and then making it the \newlinechar in \scanmacro.
++
++\def\macrobodyctxt{%
++ \catcode`\~=12
++ \catcode`\^=12
++ \catcode`\_=12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \catcode`\+=12
++ \catcode`\{=12
++ \catcode`\}=12
++ \catcode`\@=12
++ \catcode`\^^M=12
++ \usembodybackslash}
++
++\def\macroargctxt{%
++ \catcode`\~=12
++ \catcode`\^=12
++ \catcode`\_=12
++ \catcode`\|=12
++ \catcode`\<=12
++ \catcode`\>=12
++ \catcode`\+=12
++ \catcode`\@=12
++ \catcode`\\=12}
++
++% \mbodybackslash is the definition of \ in @macro bodies.
++% It maps \foo\ => \csname macarg.foo\endcsname => #N
++% where N is the macro parameter number.
++% We define \csname macarg.\endcsname to be \realbackslash, so
++% \\ in macro replacement text gets you a backslash.
++
++{\catcode`@=0 @catcode`@\=@active
++ @gdef@usembodybackslash{@let\=@mbodybackslash}
++ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
++}
++\expandafter\def\csname macarg.\endcsname{\realbackslash}
++
++\def\macro{\recursivefalse\parsearg\macroxxx}
++\def\rmacro{\recursivetrue\parsearg\macroxxx}
++
++\def\macroxxx#1{%
++ \getargs{#1}% now \macname is the macname and \argl the arglist
++ \ifx\argl\empty % no arguments
++ \paramno=0%
++ \else
++ \expandafter\parsemargdef \argl;%
++ \fi
++ \if1\csname ismacro.\the\macname\endcsname
++ \message{Warning: redefining \the\macname}%
++ \else
++ \expandafter\ifx\csname \the\macname\endcsname \relax
++ \else \errmessage{The name \the\macname\space is reserved}\fi
++ \global\cslet{macsave.\the\macname}{\the\macname}%
++ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
++ % Add the macroname to \macrolist
++ \toks0 = \expandafter{\macrolist\do}%
++ \xdef\macrolist{\the\toks0
++ \expandafter\noexpand\csname\the\macname\endcsname}%
++ \fi
++ \begingroup \macrobodyctxt
++ \ifrecursive \expandafter\parsermacbody
++ \else \expandafter\parsemacbody
++ \fi}
++
++\def\unmacro{\parsearg\unmacroxxx}
++\def\unmacroxxx#1{%
++ \if1\csname ismacro.#1\endcsname
++ \global\cslet{#1}{macsave.#1}%
++ \global\expandafter\let \csname ismacro.#1\endcsname=0%
++ % Remove the macro name from \macrolist
++ \begingroup
++ \edef\tempa{\expandafter\noexpand\csname#1\endcsname}%
++ \def\do##1{%
++ \def\tempb{##1}%
++ \ifx\tempa\tempb
++ % remove this
++ \else
++ \toks0 = \expandafter{\newmacrolist\do}%
++ \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}%
++ \fi}%
++ \def\newmacrolist{}%
++ % Execute macro list to define \newmacrolist
++ \macrolist
++ \global\let\macrolist\newmacrolist
++ \endgroup
++ \else
++ \errmessage{Macro #1 not defined}%
++ \fi
++}
++
++% This makes use of the obscure feature that if the last token of a
++% <parameter list> is #, then the preceding argument is delimited by
++% an opening brace, and that opening brace is not consumed.
++\def\getargs#1{\getargsxxx#1{}}
++\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
++\def\getmacname #1 #2\relax{\macname={#1}}
++\def\getmacargs#1{\def\argl{#1}}
++
++% Parse the optional {params} list. Set up \paramno and \paramlist
++% so \defmacro knows what to do. Define \macarg.blah for each blah
++% in the params list, to be ##N where N is the position in that list.
++% That gets used by \mbodybackslash (above).
++
++% We need to get `macro parameter char #' into several definitions.
++% The technique used is stolen from LaTeX: let \hash be something
++% unexpandable, insert that wherever you need a #, and then redefine
++% it to # just before using the token list produced.
++%
++% The same technique is used to protect \eatspaces till just before
++% the macro is used.
++
++\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
++ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
++\def\parsemargdefxxx#1,{%
++ \if#1;\let\next=\relax
++ \else \let\next=\parsemargdefxxx
++ \advance\paramno by 1%
++ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
++ {\xeatspaces{\hash\the\paramno}}%
++ \edef\paramlist{\paramlist\hash\the\paramno,}%
++ \fi\next}
++
++% These two commands read recursive and nonrecursive macro bodies.
++% (They're different since rec and nonrec macros end differently.)
++
++\long\def\parsemacbody#1@end macro%
++{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
++\long\def\parsermacbody#1@end rmacro%
++{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
++
++% This defines the macro itself. There are six cases: recursive and
++% nonrecursive macros of zero, one, and many arguments.
++% Much magic with \expandafter here.
++% \xdef is used so that macro definitions will survive the file
++% they're defined in; @include reads the file inside a group.
++\def\defmacro{%
++ \let\hash=##% convert placeholders to macro parameter chars
++ \ifrecursive
++ \ifcase\paramno
++ % 0
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \noexpand\scanmacro{\temp}}%
++ \or % 1
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\braceorline
++ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
++ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
++ \egroup\noexpand\scanmacro{\temp}}%
++ \else % many
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\csname\the\macname xx\endcsname}%
++ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
++ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
++ \expandafter\expandafter
++ \expandafter\xdef
++ \expandafter\expandafter
++ \csname\the\macname xxx\endcsname
++ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
++ \fi
++ \else
++ \ifcase\paramno
++ % 0
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \or % 1
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \noexpand\braceorline
++ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
++ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
++ \egroup
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \else % many
++ \expandafter\xdef\csname\the\macname\endcsname{%
++ \bgroup\noexpand\macroargctxt
++ \expandafter\noexpand\csname\the\macname xx\endcsname}%
++ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
++ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
++ \expandafter\expandafter
++ \expandafter\xdef
++ \expandafter\expandafter
++ \csname\the\macname xxx\endcsname
++ \paramlist{%
++ \egroup
++ \noexpand\norecurse{\the\macname}%
++ \noexpand\scanmacro{\temp}\egroup}%
++ \fi
++ \fi}
++
++\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
++
++% \braceorline decides whether the next nonwhitespace character is a
++% {. If so it reads up to the closing }, if not, it reads the whole
++% line. Whatever was read is then fed to the next control sequence
++% as an argument (by \parsebrace or \parsearg)
++\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
++\def\braceorlinexxx{%
++ \ifx\nchar\bgroup\else
++ \expandafter\parsearg
++ \fi \next}
++
++% We mant to disable all macros during \shipout so that they are not
++% expanded by \write.
++\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
++ \edef\next{\macrolist}\expandafter\endgroup\next}
++
++
++% @alias.
++% We need some trickery to remove the optional spaces around the equal
++% sign. Just make them active and then expand them all to nothing.
++\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
++\def\aliasxxx #1{\aliasyyy#1\relax}
++\def\aliasyyy #1=#2\relax{\ignoreactivespaces
++\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
++ \expandafter\noexpand\csname#2\endcsname}%
++\expandafter\endgroup\next}
+
+-\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
++\message{cross references,}
++% @xref etc.
+
+-\message{cross reference,}
+-% Define cross-reference macros
+-\newwrite \auxfile
++\newwrite\auxfile
+
+-\newif\ifhavexrefs % True if xref values are known.
++\newif\ifhavexrefs % True if xref values are known.
+ \newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+-% @inforef is simple.
++% @inforef is relatively 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.
++% @node's job is to define \lastnode.
++\def\node{\ENVcheck\parsearg\nodezzz}
++\def\nodezzz#1{\nodexxx [#1,]}
++\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
++\let\nwnode=\node
++\let\lastnode=\relax
++
++% The sectioning commands (@chapter, etc.) call these.
++\def\donoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}%
++ {Ysectionnumberandtype}%
++ \global\let\lastnode=\relax
++ \fi
++}
++\def\unnumbnoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
++ \global\let\lastnode=\relax
++ \fi
++}
++\def\appendixnoderef{%
++ \ifx\lastnode\relax\else
++ \expandafter\expandafter\expandafter\setref{\lastnode}%
++ {Yappendixletterandtype}%
++ \global\let\lastnode=\relax
++ \fi
++}
++
++
++% @anchor{NAME} -- define xref target at arbitrary point.
++%
++\newcount\savesfregister
++\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
++\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
++\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
++
++% \setref{NAME}{SNT} defines a cross-reference point NAME, namely
++% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have
++% to set \indexdummies so commands such as @code in a section title
++% aren't expanded. It would be nicer not to expand the titles in the
++% first place, but there's so many layers that that is hard to do.
++%
++\def\setref#1#2{{%
++ \indexdummies
++ \pdfmkdest{#1}%
++ \dosetq{#1-title}{Ytitle}%
++ \dosetq{#1-pg}{Ypagenumber}%
++ \dosetq{#1-snt}{#2}%
++}}
+
+-\def\setref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Ysectionnumberandtype}}
+-
+-\def\unnumbsetref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Ynothing}}
+-
+-\def\appendixsetref#1{%
+-\dosetq{#1-title}{Ytitle}%
+-\dosetq{#1-pg}{Ypagenumber}%
+-\dosetq{#1-snt}{Yappendixletterandtype}}
+-
+-% \xref, \pxref, and \ref generate cross-references to specified points.
+-% For \xrefX, #1 is the node name, #2 the name of the Info
+-% cross-reference, #3 the printed node name, #4 the name of the Info
+-% file, #5 the name of the printed manual. All but the node name can be
+-% omitted.
++% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
++% the node name, #2 the name of the Info cross-reference, #3 the printed
++% node name, #4 the name of the Info file, #5 the name of the printed
++% manual. All but the node name can be omitted.
+ %
+ \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+ \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+ \def\ref#1{\xrefX[#1,,,,,,,]}
+ \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
++ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+@@ -4281,7 +5227,7 @@
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+- \ifdim \wd1>0pt%
++ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+@@ -4302,27 +5248,54 @@
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
++ \ifpdf
++ \leavevmode
++ \getfilename{#4}%
++ \ifnum\filenamelength>0
++ \startlink attr{/Border [0 0 0]}%
++ goto file{\the\filename.pdf} name{#1@}%
++ \else
++ \startlink attr{/Border [0 0 0]}%
++ goto name{#1@}%
++ \fi
++ \linkcolor
++ \fi
++ %
+ \ifdim \wd1 > 0pt
+- \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
++ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+- {\turnoffactive \refx{#1-snt}{}}%
+- \space [\printednodename],\space
++ {\normalturnoffactive
++ % Only output a following space if the -snt ref is nonempty; for
++ % @unnumbered and @anchor, it won't be.
++ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
++ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
++ }%
++ % [mynode],
++ [\printednodename],\space
++ % page 3
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
++ \endlink
+ \endgroup}
+
+ % \dosetq is the interface for calls from other macros
+
+-% 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}}
++% Use \normalturnoffactive so that punctuation chars such as underscore
++% and backslash work in node names. (\turnoffactive doesn't do \.)
++\def\dosetq#1#2{%
++ {\let\folio=0%
++ \normalturnoffactive
++ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
++ \iflinks
++ \next
++ \fi
++ }%
++}
+
+ % \internalsetq {foo}{page} expands into
+ % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+@@ -4373,13 +5346,15 @@
+ \def\refx#1#2{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+- $\langle$un\-de\-fined$\rangle$%
+- \ifhavexrefs
+- \message{\linenumber Undefined cross reference `#1'.}%
+- \else
+- \ifwarnedxrefs\else
+- \global\warnedxrefstrue
+- \message{Cross reference values unknown; you must run TeX again.}%
++ \angleleft un\-de\-fined\angleright
++ \iflinks
++ \ifhavexrefs
++ \message{\linenumber Undefined cross reference `#1'.}%
++ \else
++ \ifwarnedxrefs\else
++ \global\warnedxrefstrue
++ \message{Cross reference values unknown; you must run TeX again.}%
++ \fi
+ \fi
+ \fi
+ \else
+@@ -4390,10 +5365,13 @@
+ }
+
+ % 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\xrdef#1{\begingroup
++ % Reenable \ as an escape while reading the second argument.
++ \catcode`\\ = 0
++ \afterassignment\endgroup
++ \expandafter\gdef\csname X#1\endcsname
++}
+
+ % Read the last existing aux file, if any. No error if none exists.
+ \def\readauxfile{\begingroup
+@@ -4450,8 +5428,7 @@
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+- % `\+ does not work, so use 43.
+- \catcode43=\other
++ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+@@ -4540,6 +5517,8 @@
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
++ \smallfonts \rm
++ %
+ % Hang the footnote text off the number.
+ \hang
+ \textindent{\thisfootno}%
+@@ -4554,7 +5533,7 @@
+ \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}
++\def\@foot{\strut\par\egroup}
+
+ }%end \catcode `\@=11
+
+@@ -4613,23 +5592,25 @@
+
+ % @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 = xepsf.tex
++\openin 1 = epsf.tex
+ \ifeof 1 \else
+ \closein 1
+- \def\epsfannounce{\toks0 = }% do not bother showing banner
++ % Do not bother showing banner with post-v2.7 epsf.tex (available in
++ % doc/epsf.tex until it shows up on ctan).
++ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+ \fi
+ %
++% We will only complain once about lack of epsf.tex.
+ \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.}
++ it from ftp://tug.org/tex/epsf.tex.}
+ %
+-% Only complain once about lack of epsf.tex.
+ \def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+@@ -4647,42 +5628,79 @@
+ % #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}%
++ \ifpdf
++ \centerline{\dopdfimage{#1}{#2}{#3}}%
++ \else
++ % \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
++ \begingroup
++ \catcode`\^^M = 5 % in case we're inside an example
++ % If the image is by itself, center it.
++ \ifvmode
++ \nobreak\bigskip
++ % Usually we'll have text after the image which will insert
++ % \parskip glue, so insert it here too to equalize the space
++ % above and below.
++ \nobreak\vskip\parskip
++ \nobreak
++ \centerline{\epsfbox{#1.eps}}%
++ \bigbreak
++ \else
++ % In the middle of a paragraph, no extra space.
++ \epsfbox{#1.eps}%
++ \fi
++ \endgroup
++ \fi
+ }
+
+-% End of control word definitions.
+
++\message{localization,}
++% and i18n.
+
+-\message{and turning on texinfo input format.}
+-
+-\def\openindices{%
+- \newindex{cp}%
+- \newcodeindex{fn}%
+- \newcodeindex{vr}%
+- \newcodeindex{tp}%
+- \newcodeindex{ky}%
+- \newcodeindex{pg}%
++% @documentlanguage is usually given very early, just after
++% @setfilename. If done too late, it may not override everything
++% properly. Single argument is the language abbreviation.
++% It would be nice if we could set up a hyphenation file here.
++%
++\def\documentlanguage{\parsearg\dodocumentlanguage}
++\def\dodocumentlanguage#1{%
++ \tex % read txi-??.tex file in plain TeX.
++ % Read the file if it exists.
++ \openin 1 txi-#1.tex
++ \ifeof1
++ \errhelp = \nolanghelp
++ \errmessage{Cannot read language file txi-#1.tex}%
++ \let\temp = \relax
++ \else
++ \def\temp{\input txi-#1.tex }%
++ \fi
++ \temp
++ \endgroup
+ }
++\newhelp\nolanghelp{The given language definition file cannot be found or
++is empty. Maybe you need to install it? In the current directory
++should work if nowhere else does.}
++
+
+-% Set some numeric style parameters, for 8.5 x 11 format.
++% @documentencoding should change something in TeX eventually, most
++% likely, but for now just recognize it.
++\let\documentencoding = \comment
+
+-\hsize = 6in
+-\hoffset = .25in
++
++% Page size parameters.
++%
+ \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
++\vbadness = 10000
++
++% Don't be so finicky about underfull hboxes, either.
++\hbadness = 2000
+
+ % Following George Bush, just get rid of widows and orphans.
+ \widowpenalty=10000
+@@ -4691,101 +5709,125 @@
+ % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+ % using an old version of TeX, don't do anything. We want the amount of
+ % stretch added to depend on the line length, hence the dependence on
+-% \hsize. This makes it come to about 9pt for the 8.5x11 format.
++% \hsize. We call this whenever the paper size is set.
+ %
+-\ifx\emergencystretch\thisisundefined
+- % Allow us to assign to \emergencystretch anyway.
+- \def\emergencystretch{\dimen0}%
+-\else
+- \emergencystretch = \hsize
+- \divide\emergencystretch by 45
+-\fi
+-
+-% 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}
++\def\setemergencystretch{%
++ \ifx\emergencystretch\thisisundefined
++ % Allow us to assign to \emergencystretch anyway.
++ \def\emergencystretch{\dimen0}%
++ \else
++ \emergencystretch = .15\hsize
++ \fi
+ }
+
++% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
++% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can
++% set \parskip and call \setleading for \baselineskip.
++%
++\def\internalpagesizes#1#2#3#4#5#6{%
++ \voffset = #3\relax
++ \topskip = #6\relax
++ \splittopskip = \topskip
++ %
++ \vsize = #1\relax
++ \advance\vsize by \topskip
++ \outervsize = \vsize
++ \advance\outervsize by 2\topandbottommargin
++ \pageheight = \vsize
++ %
++ \hsize = #2\relax
++ \outerhsize = \hsize
++ \advance\outerhsize by 0.5in
++ \pagewidth = \hsize
++ %
++ \normaloffset = #4\relax
++ \bindingoffset = #5\relax
++ %
++ \parindent = \defaultparindent
++ \setemergencystretch
++}
++
++% @letterpaper (the default).
++\def\letterpaper{{\globaldefs = 1
++ \parskip = 3pt plus 2pt minus 1pt
++ \setleading{13.2pt}%
++ %
++ % If page is nothing but text, make it come out even.
++ \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}%
++}}
++
++% Use @smallbook to reset parameters for 7x9.5 (or so) format.
++\def\smallbook{{\globaldefs = 1
++ \parskip = 2pt plus 1pt
++ \setleading{12pt}%
++ %
++ \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}%
++ %
++ \lispnarrowing = 0.3in
++ \tolerance = 700
++ \hfuzz = 1pt
++ \contentsrightmargin = 0pt
++ \deftypemargin = 0pt
++ \defbodyindent = .5cm
++ %
++ \let\smalldisplay = \smalldisplayx
++ \let\smallexample = \smalllispx
++ \let\smallformat = \smallformatx
++ \let\smalllisp = \smalllispx
++}}
++
+ % Use @afourpaper to print on European A4 paper.
+-\def\afourpaper{
+-\global\tolerance=700
+-\global\hfuzz=1pt
+-\setleading{12pt}
+-\global\parskip 15pt plus 1pt
+-
+-\global\vsize= 53\baselineskip
+-\advance\vsize by \topskip
+-%\global\hsize= 5.85in % A4 wide 10pt
+-\global\hsize= 6.5in
+-\global\outerhsize=\hsize
+-\global\advance\outerhsize by 0.5in
+-\global\outervsize=\vsize
+-\global\advance\outervsize by 0.6in
+-
+-\global\pagewidth=\hsize
+-\global\pageheight=\vsize
+-}
+-
+-\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
+- \global\hsize= #2
+- \global\outerhsize=\hsize
+- \global\advance\outerhsize by 0.5in
+- \global\outervsize=\vsize
+- \global\advance\outervsize by 0.6in
+- \global\pagewidth=\hsize
+- \global\pageheight=\vsize
+- \global\normaloffset= #4
+- \global\bindingoffset= #5}
++\def\afourpaper{{\globaldefs = 1
++ \setleading{12pt}%
++ \parskip = 3pt plus 2pt minus 1pt
++ %
++ \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}%
++ %
++ \tolerance = 700
++ \hfuzz = 1pt
++}}
+
+ % 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}
+- }
++\def\afourlatex{{\globaldefs = 1
++ \setleading{13.6pt}%
++ %
++ \afourpaper
++ \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}%
++ %
++ \globaldefs = 0
++}}
+
+ % Use @afourwide to print on European A4 paper in wide format.
+-\def\afourwide{\afourpaper
+-\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
++\def\afourwide{%
++ \afourpaper
++ \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}%
++ %
++ \globaldefs = 0
++}
++
++% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
++% Perhaps we should allow setting the margins, \topskip, \parskip,
++% and/or leading, also. Or perhaps we should compute them somehow.
++%
++\def\pagesizes{\parsearg\pagesizesxxx}
++\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
++\def\pagesizesyyy#1,#2,#3\finish{{%
++ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
++ \globaldefs = 1
++ %
++ \parskip = 3pt plus 2pt minus 1pt
++ \setleading{13.2pt}%
++ %
++ \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}%
++}}
++
++% Set default to letter.
++%
++\letterpaper
++
++
++\message{and turning on texinfo input format.}
+
+ % Define macros to output various characters with catcode for normal text.
+ \catcode`\"=\other
+@@ -4796,6 +5838,7 @@
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
++\catcode`\$=\other
+ \def\normaldoublequote{"}
+ \def\normaltilde{~}
+ \def\normalcaret{^}
+@@ -4804,6 +5847,7 @@
+ \def\normalless{<}
+ \def\normalgreater{>}
+ \def\normalplus{+}
++\def\normaldollar{$}
+
+ % This macro is used to make a character print one way in ttfont
+ % where it can probably just be output, and another way in other fonts,
+@@ -4814,7 +5858,13 @@
+ % interword stretch (and shrink), and it is reasonable to expect all
+ % typewriter fonts to have this, we can check that font parameter.
+ %
+-\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
++\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
++
++% Same as above, but check for italic font. Actually this also catches
++% non-italic slanted fonts since it is impossible to distinguish them from
++% italic fonts. But since this is only used by $ and it uses \sl anyway
++% this is not a problem.
++\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+ % Turn off all special characters except @
+ % (and those which the user can use as if they were ordinary).
+@@ -4822,10 +5872,10 @@
+ % use math or other variants that look better in normal text.
+
+ \catcode`\"=\active
+-\def\activedoublequote{{\tt \char '042}}
++\def\activedoublequote{{\tt\char34}}
+ \let"=\activedoublequote
+ \catcode`\~=\active
+-\def~{{\tt \char '176}}
++\def~{{\tt\char126}}
+ \chardef\hat=`\^
+ \catcode`\^=\active
+ \def^{{\tt \hat}}
+@@ -4836,7 +5886,7 @@
+ \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+ \catcode`\|=\active
+-\def|{{\tt \char '174}}
++\def|{{\tt\char124}}
+ \chardef \less=`\<
+ \catcode`\<=\active
+ \def<{{\tt \less}}
+@@ -4845,6 +5895,8 @@
+ \def>{{\tt \gtr}}
+ \catcode`\+=\active
+ \def+{{\tt \char 43}}
++\catcode`\$=\active
++\def${\ifusingit{{\sl\$}}\normaldollar}
+ %\catcode 27=\active
+ %\def^^[{$\diamondsuit$}
+
+@@ -4875,9 +5927,6 @@
+ % \normalbackslash outputs one backslash in fixed width font.
+ \def\normalbackslash{{\tt\rawbackslashxx}}
+
+-% Say @foo, not \foo, in error messages.
+-\escapechar=`\@
+-
+ % \catcode 17=0 % Define control-q
+ \catcode`\\=\active
+
+@@ -4891,7 +5940,8 @@
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+-@let+=@normalplus}
++@let+=@normalplus
++@let$=@normaldollar}
+
+ @def@normalturnoffactive{@let"=@normaldoublequote
+ @let\=@normalbackslash
+@@ -4901,7 +5951,8 @@
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+-@let+=@normalplus}
++@let+=@normalplus
++@let$=@normaldollar}
+
+ % Make _ and + \other characters, temporarily.
+ % This is canceled by @fixbackslash.
+@@ -4920,16 +5971,29 @@
+ % Also back turn on active characters that might appear in the input
+ % file name, in case not using a pre-dumped format.
+ %
+-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
+- @catcode`+=@active @catcode`@_=@active}
++@gdef@fixbackslash{%
++ @ifx\@eatinput @let\ = @normalbackslash @fi
++ @catcode`+=@active
++ @catcode`@_=@active
++}
++
++% Say @foo, not \foo, in error messages.
++@escapechar = `@@
+
+-%% These look ok in all fonts, so just make them not special. The @rm below
+-%% makes sure that the current font starts out as the newly loaded cmr10
+-@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
++% These look ok in all fonts, so just make them not special.
++@catcode`@& = @other
++@catcode`@# = @other
++@catcode`@% = @other
+
++@c Set initial fonts.
+ @textfonts
+ @rm
+
++
+ @c Local variables:
++@c eval: (add-hook 'write-file-hooks 'time-stamp)
+ @c page-delimiter: "^\\\\message"
++@c time-stamp-start: "def\\\\texinfoversion{"
++@c time-stamp-format: "%:y-%02m-%02d.%02H"
++@c time-stamp-end: "}"
+ @c End: