diff options
author | tron <tron@pkgsrc.org> | 2002-01-03 20:40:37 +0000 |
---|---|---|
committer | tron <tron@pkgsrc.org> | 2002-01-03 20:40:37 +0000 |
commit | 5dc7eaab55abc49fb1f72217bc97e3c8a15e7dc6 (patch) | |
tree | 9dc18b003d982195dcbbd9ada399a486e2fed859 /lang/gcc | |
parent | ee5329b301b8d9e060eaa2939d92e13e764a4081 (diff) | |
download | pkgsrc-5dc7eaab55abc49fb1f72217bc97e3c8a15e7dc6.tar.gz |
Update "gcc" package to version 2.95.3. This is a bug fix release of
version 2.95.2. This package includes all changes to "gcc" from the
new toolchain in NetBSD-current. The only tested (and enabled) platform
is "NetBSD-*-i386" so far.
Diffstat (limited to 'lang/gcc')
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: |